From 644a4a8bd46261759215f9e38e8d7ec2e2d12610 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 12:25:26 -0800 Subject: [PATCH 01/49] test: remove low-value RPC recording scenarios and goldens (#42120) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../aivault-history-scan-fulfilled.json | 165 - .../aivault-history-scan-unsupported.json | 108 - .../aivault-history-screen-listed.json | 345 -- .../aivault-history-screen-worktrees.json | 273 -- .../aivault-resume-launch-create-refused.json | 82 - .../aivault-resume-prepare-refused.json | 82 - .../aivault-resume-prepare-skipped.json | 47 - .../goldens/browser-keyboard-input.json | 135 - .../browser-pointer-click-accepted.json | 90 - .../goldens/browser-wheel-scrolled.json | 129 - ...-image-attachment-blocked-before-send.json | 167 - ...board-image-attachment-upload-refused.json | 85 - .../clipboard-image-upload-chunked.json | 155 - .../goldens/codex-reset-credit-consumed.json | 272 -- .../goldens/components-setup-ask.json | 143 - .../goldens/components-target-local.json | 138 - .../goldens/components-target-ssh.json | 260 -- .../goldens/file-tap-open-refused.json | 137 - .../file-tap-previews-absolute-artifact.json | 113 - .../goldens/file-tap-resolve-miss.json | 84 - .../goldens/file-tap-resolve-refused.json | 84 - .../goldens/files-explorer-readdir.json | 160 - .../goldens/files-ownership-local.json | 118 - .../goldens/files-ownership-ssh.json | 214 -- .../files-preview-artifact-direct.json | 89 - .../files-preview-artifact-image-read.json | 86 - .../goldens/files-preview-artifact-image.json | 86 - .../files-preview-worktree-image-read.json | 85 - .../goldens/files-preview-worktree-image.json | 85 - .../files-preview-worktree-text-read.json | 88 - .../goldens/files-preview-worktree.json | 88 - .../goldens/files-save-blind.json | 80 - .../goldens/files-save-verified.json | 170 - .../goldens/files-tab-doc-shapes.json | 229 -- .../goldens/host-view-settings-sync.json | 506 --- ...host-worktree-actions-pin-open-delete.json | 468 --- .../goldens/host-worktree-delete-refused.json | 328 -- .../goldens/linear-select-workspace.json | 129 - .../mobile-web-bundle-manifest-read.json | 126 - .../mobile-web-bundle-unavailable.json | 81 - .../sc-commit-message-cancel-rejected.json | 75 - .../goldens/sc-commit-message-generated.json | 125 - .../goldens/sc-history-loaded.json | 175 - .../goldens/sc-pr-link-set.json | 126 - ...es-settings-resume-metadata-fulfilled.json | 909 ----- .../settings-bot-overrides-refused.json | 112 - ...ettings-bot-overrides-transport-error.json | 109 - .../goldens/settings-new-tab-refused.json | 225 -- .../settings-new-tab-transport-error.json | 222 -- ...ngs-resume-metadata-refuse-after-data.json | 771 ---- ...ngs-workspace-context-transport-error.json | 408 -- .../structured-agent-session-created.json | 132 - .../goldens/structured-launch-created.json | 132 - .../structured-launch-definitive-refusal.json | 133 - .../structured-launch-support-refused.json | 79 - .../structured-launch-unsupported.json | 81 - .../terminal-query-reply-accepted.json | 82 - .../terminal-query-reply-unsubscribed.json | 34 - .../goldens/terminal-raw-input-refused.json | 81 - .../goldens/terminal-raw-input-reported.json | 81 - .../terminal-viewport-refit-applied.json | 104 - ...erminal-viewport-refit-legacy-desktop.json | 110 - ...ty-probe-non-string-capabilities-drop.json | 99 - .../transport-capability-probe-publishes.json | 75 - ...-status-gates-drop-keeps-capabilities.json | 98 - .../transport-host-status-gates-ready.json | 85 - ...rt-host-status-gates-refused-degrades.json | 84 - ...t-pairing-race-direct-completes-first.json | 117 - .../goldens/tw-capabilities-advertised.json | 99 - .../tw-capabilities-legacy-idempotency.json | 95 - .../tw-create-retry-agent-launched.json | 154 - ...e-retry-ambiguous-without-idempotency.json | 76 - .../goldens/tw-create-retry-created.json | 84 - .../tw-create-retry-unretryable-refusal.json | 80 - .../goldens/tw-create-retry-warning-kept.json | 86 - .../goldens/tw-hosted-base-resolved.json | 154 - mobile/rpc-foundation/pilot-scenarios.json | 3374 ----------------- .../rpc-recording/derived-goldens.ts | 1 - 78 files changed, 15377 deletions(-) delete mode 100644 mobile/rpc-foundation/goldens/aivault-history-scan-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/aivault-history-scan-unsupported.json delete mode 100644 mobile/rpc-foundation/goldens/aivault-history-screen-listed.json delete mode 100644 mobile/rpc-foundation/goldens/aivault-history-screen-worktrees.json delete mode 100644 mobile/rpc-foundation/goldens/aivault-resume-launch-create-refused.json delete mode 100644 mobile/rpc-foundation/goldens/aivault-resume-prepare-refused.json delete mode 100644 mobile/rpc-foundation/goldens/aivault-resume-prepare-skipped.json delete mode 100644 mobile/rpc-foundation/goldens/browser-keyboard-input.json delete mode 100644 mobile/rpc-foundation/goldens/browser-pointer-click-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/browser-wheel-scrolled.json delete mode 100644 mobile/rpc-foundation/goldens/clipboard-image-attachment-blocked-before-send.json delete mode 100644 mobile/rpc-foundation/goldens/clipboard-image-attachment-upload-refused.json delete mode 100644 mobile/rpc-foundation/goldens/clipboard-image-upload-chunked.json delete mode 100644 mobile/rpc-foundation/goldens/codex-reset-credit-consumed.json delete mode 100644 mobile/rpc-foundation/goldens/components-setup-ask.json delete mode 100644 mobile/rpc-foundation/goldens/components-target-local.json delete mode 100644 mobile/rpc-foundation/goldens/components-target-ssh.json delete mode 100644 mobile/rpc-foundation/goldens/file-tap-open-refused.json delete mode 100644 mobile/rpc-foundation/goldens/file-tap-previews-absolute-artifact.json delete mode 100644 mobile/rpc-foundation/goldens/file-tap-resolve-miss.json delete mode 100644 mobile/rpc-foundation/goldens/file-tap-resolve-refused.json delete mode 100644 mobile/rpc-foundation/goldens/files-explorer-readdir.json delete mode 100644 mobile/rpc-foundation/goldens/files-ownership-local.json delete mode 100644 mobile/rpc-foundation/goldens/files-ownership-ssh.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-artifact-direct.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-artifact-image-read.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-artifact-image.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-worktree-image-read.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-worktree-image.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-worktree-text-read.json delete mode 100644 mobile/rpc-foundation/goldens/files-preview-worktree.json delete mode 100644 mobile/rpc-foundation/goldens/files-save-blind.json delete mode 100644 mobile/rpc-foundation/goldens/files-save-verified.json delete mode 100644 mobile/rpc-foundation/goldens/files-tab-doc-shapes.json delete mode 100644 mobile/rpc-foundation/goldens/host-view-settings-sync.json delete mode 100644 mobile/rpc-foundation/goldens/host-worktree-actions-pin-open-delete.json delete mode 100644 mobile/rpc-foundation/goldens/host-worktree-delete-refused.json delete mode 100644 mobile/rpc-foundation/goldens/linear-select-workspace.json delete mode 100644 mobile/rpc-foundation/goldens/mobile-web-bundle-manifest-read.json delete mode 100644 mobile/rpc-foundation/goldens/mobile-web-bundle-unavailable.json delete mode 100644 mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json delete mode 100644 mobile/rpc-foundation/goldens/sc-commit-message-generated.json delete mode 100644 mobile/rpc-foundation/goldens/sc-history-loaded.json delete mode 100644 mobile/rpc-foundation/goldens/sc-pr-link-set.json delete mode 100644 mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json delete mode 100644 mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json delete mode 100644 mobile/rpc-foundation/goldens/settings-new-tab-refused.json delete mode 100644 mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json delete mode 100644 mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json delete mode 100644 mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json delete mode 100644 mobile/rpc-foundation/goldens/structured-agent-session-created.json delete mode 100644 mobile/rpc-foundation/goldens/structured-launch-created.json delete mode 100644 mobile/rpc-foundation/goldens/structured-launch-definitive-refusal.json delete mode 100644 mobile/rpc-foundation/goldens/structured-launch-support-refused.json delete mode 100644 mobile/rpc-foundation/goldens/structured-launch-unsupported.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-query-reply-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-query-reply-unsubscribed.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-raw-input-refused.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-raw-input-reported.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-viewport-refit-applied.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-viewport-refit-legacy-desktop.json delete mode 100644 mobile/rpc-foundation/goldens/transport-capability-probe-non-string-capabilities-drop.json delete mode 100644 mobile/rpc-foundation/goldens/transport-capability-probe-publishes.json delete mode 100644 mobile/rpc-foundation/goldens/transport-host-status-gates-drop-keeps-capabilities.json delete mode 100644 mobile/rpc-foundation/goldens/transport-host-status-gates-ready.json delete mode 100644 mobile/rpc-foundation/goldens/transport-host-status-gates-refused-degrades.json delete mode 100644 mobile/rpc-foundation/goldens/transport-pairing-race-direct-completes-first.json delete mode 100644 mobile/rpc-foundation/goldens/tw-capabilities-advertised.json delete mode 100644 mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json delete mode 100644 mobile/rpc-foundation/goldens/tw-create-retry-agent-launched.json delete mode 100644 mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json delete mode 100644 mobile/rpc-foundation/goldens/tw-create-retry-created.json delete mode 100644 mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json delete mode 100644 mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json delete mode 100644 mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json diff --git a/mobile/rpc-foundation/goldens/aivault-history-scan-fulfilled.json b/mobile/rpc-foundation/goldens/aivault-history-scan-fulfilled.json deleted file mode 100644 index e67716ea050..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-history-scan-fulfilled.json +++ /dev/null @@ -1,165 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.history-scan", - "family": "aiVault.history", - "namedDeltas": [], - "values": { - "03fd6edde488": { - "name": "aiVault.listSessions#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "aiVault.listSessions" - }, - { - "name": "params", - "value": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "issues": [], - "sessions": [ - { - "agent": "claude", - "cwd": "/repo/feature", - "id": "s1" - } - ] - } - } - } - }, - "2182656920b3": { - "name": "aiVault.listSessions#1", - "ordinal": 5, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"],\"scopeOnly\":true}}" - }, - "44a27dbf05e2": { - "name": "status.get#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "758b3fde1948": { - "name": "streams-registered-at-teardown", - "ordinal": 6, - "value": [ - { - "cancelled": false, - "method": "agentSession.subscribeStatus", - "payload": "agentSession.subscribeStatus#1" - } - ] - }, - "9aa0df31dc4d": { - "activeWorktreePath": "/repo/feature", - "refreshing": false, - "scope": "workspace", - "screenState": { - "issues": [], - "kind": "ready", - "sessions": [ - { - "agent": "claude", - "cwd": "/repo/feature", - "id": "s1" - } - ] - } - }, - "daf52dc85a58": { - "name": "status.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "capabilities": ["aiVault.v1"] - } - } - } - }, - "e28c488ce6b2": { - "name": "agentSession.subscribeStatus#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.subscribeStatus\",\"params\":{}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "aivault-history-scan-fulfilled", - "checkpoints": [ - { - "id": "ready", - "observation": { - "sender": ["daf52dc85a58", "03fd6edde488"], - "payloads": ["e28c488ce6b2", "44a27dbf05e2", "2182656920b3"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9aa0df31dc4d", - "effects": [] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["daf52dc85a58", "03fd6edde488"], - "payloads": ["e28c488ce6b2", "44a27dbf05e2", "2182656920b3"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9aa0df31dc4d", - "effects": ["758b3fde1948"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/aivault-history-scan-unsupported.json b/mobile/rpc-foundation/goldens/aivault-history-scan-unsupported.json deleted file mode 100644 index 39257c5d67e..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-history-scan-unsupported.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.history-scan", - "family": "aiVault.history", - "namedDeltas": [], - "values": { - "111e9a5009ba": { - "name": "streams-registered-at-teardown", - "ordinal": 4, - "value": [ - { - "cancelled": false, - "method": "agentSession.subscribeStatus", - "payload": "agentSession.subscribeStatus#1" - } - ] - }, - "213a998b248c": { - "activeWorktreePath": "/repo/feature", - "refreshing": false, - "scope": "workspace", - "screenState": { - "kind": "unsupported" - } - }, - "44a27dbf05e2": { - "name": "status.get#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "c2c3c4a599ef": { - "name": "status.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1"] - } - } - } - }, - "e28c488ce6b2": { - "name": "agentSession.subscribeStatus#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.subscribeStatus\",\"params\":{}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "aivault-history-scan-unsupported", - "checkpoints": [ - { - "id": "unsupported", - "observation": { - "sender": ["c2c3c4a599ef"], - "payloads": ["e28c488ce6b2", "44a27dbf05e2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "213a998b248c", - "effects": [] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["c2c3c4a599ef"], - "payloads": ["e28c488ce6b2", "44a27dbf05e2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "213a998b248c", - "effects": ["111e9a5009ba"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/aivault-history-screen-listed.json b/mobile/rpc-foundation/goldens/aivault-history-screen-listed.json deleted file mode 100644 index f6035ae55c3..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-history-screen-listed.json +++ /dev/null @@ -1,345 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.history-screen", - "family": "aiVault.history-screen", - "namedDeltas": [], - "values": { - "0562fd9175d5": { - "name": "worktree.ps#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "27ef7c5c6263": { - "name": "aiVault.listSessions#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "aiVault.listSessions" - }, - { - "name": "params", - "value": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "7623e8b568b1": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ActivityIndicator": 1, - "ChevronLeft": 1, - "Pressable": 2, - "RefreshCw": 1, - "SafeAreaView": 1, - "Text": 3, - "View": 8 - }, - "labels": ["Back", "Refresh agent sessions"], - "text": ["Agent Session History", "orca-history", "Loading agent sessions…"] - }, - "7c48e0564605": { - "name": "status.get#1", - "ordinal": 5, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "7e8b2964ad63": { - "name": "streams-registered-at-teardown", - "ordinal": 8, - "value": [ - { - "cancelled": false, - "method": "agentSession.subscribeStatus", - "payload": "agentSession.subscribeStatus#1" - } - ] - }, - "a03eeea51ba8": { - "name": "aiVault.listSessions#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "aiVault.listSessions" - }, - { - "name": "params", - "value": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "issues": [], - "sessions": [ - { - "agent": "claude", - "branch": "feature", - "codexHome": { - "$rpc": "null" - }, - "createdAt": "2025-12-31T23:00:00.000Z", - "cwd": "/repo/feature", - "executionHostId": "local", - "filePath": "/repo/feature/.claude/sess-1.jsonl", - "id": "s1", - "messageCount": 4, - "model": "opus", - "modifiedAt": "2025-12-31T23:30:00.000Z", - "previewMessages": [ - { - "role": "user", - "text": "fix it", - "timestamp": "2025-12-31T23:00:00.000Z" - } - ], - "sessionId": "sess-1", - "title": "Fix the explorer", - "totalTokens": 1200, - "updatedAt": "2025-12-31T23:30:00.000Z" - } - ] - } - } - } - }, - "b7a7af14c8a5": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ChevronLeft": 1, - "Defs": 1, - "LinearGradient": 1, - "Pressable": 5, - "Rect": 1, - "RefreshCw": 1, - "SafeAreaView": 1, - "Search": 1, - "SectionList": 1, - "Stop": 2, - "Svg": 1, - "Text": 5, - "TextInput": 1, - "View": 14 - }, - "labels": [ - "Back", - "Refresh agent sessions", - "Workspace", - "Project", - "All", - "Search sessions, repo:, path:" - ], - "text": ["Agent Session History", "orca-history", "Workspace", "Project", "All"] - }, - "d126597611a2": { - "name": "worktree.ps#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "dffc0668b556": { - "name": "aiVault.listSessions#1", - "ordinal": 7, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"],\"scopeOnly\":true}}" - }, - "e28c488ce6b2": { - "name": "agentSession.subscribeStatus#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.subscribeStatus\",\"params\":{}}" - }, - "e881d7dabb25": { - "name": "status.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "capabilities": ["aiVault.v1"] - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ebc8d9683b5e": { - "name": "worktree.ps#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktrees": [ - { - "path": "/repo/feature", - "repoId": "repo-1", - "worktreeId": "wt-history" - }, - { - "path": "/repo/sibling", - "repoId": "repo-1", - "worktreeId": "wt-2" - } - ] - } - } - } - } - }, - "recording": { - "scenario": "aivault-history-screen-listed", - "checkpoints": [ - { - "id": "worktrees-pending", - "observation": { - "sender": ["0562fd9175d5"], - "payloads": ["e28c488ce6b2", "d126597611a2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "7623e8b568b1", - "effects": [] - } - }, - { - "id": "worktrees-listed", - "observation": { - "sender": ["ebc8d9683b5e", "e881d7dabb25", "27ef7c5c6263"], - "payloads": ["e28c488ce6b2", "d126597611a2", "7c48e0564605", "dffc0668b556"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "7623e8b568b1", - "effects": [] - } - }, - { - "id": "ready", - "observation": { - "sender": ["ebc8d9683b5e", "e881d7dabb25", "a03eeea51ba8"], - "payloads": ["e28c488ce6b2", "d126597611a2", "7c48e0564605", "dffc0668b556"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "b7a7af14c8a5", - "effects": [] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["ebc8d9683b5e", "e881d7dabb25", "a03eeea51ba8"], - "payloads": ["e28c488ce6b2", "d126597611a2", "7c48e0564605", "dffc0668b556"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "b7a7af14c8a5", - "effects": ["7e8b2964ad63"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/aivault-history-screen-worktrees.json b/mobile/rpc-foundation/goldens/aivault-history-screen-worktrees.json deleted file mode 100644 index 9b794c5f0fb..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-history-screen-worktrees.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.history-screen", - "family": "aiVault.history-screen", - "namedDeltas": [], - "values": { - "0562fd9175d5": { - "name": "worktree.ps#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "27ef7c5c6263": { - "name": "aiVault.listSessions#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "aiVault.listSessions" - }, - { - "name": "params", - "value": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "7623e8b568b1": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ActivityIndicator": 1, - "ChevronLeft": 1, - "Pressable": 2, - "RefreshCw": 1, - "SafeAreaView": 1, - "Text": 3, - "View": 8 - }, - "labels": ["Back", "Refresh agent sessions"], - "text": ["Agent Session History", "orca-history", "Loading agent sessions…"] - }, - "7c48e0564605": { - "name": "status.get#1", - "ordinal": 5, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "7e8b2964ad63": { - "name": "streams-registered-at-teardown", - "ordinal": 8, - "value": [ - { - "cancelled": false, - "method": "agentSession.subscribeStatus", - "payload": "agentSession.subscribeStatus#1" - } - ] - }, - "a0b80301d553": { - "name": "aiVault.listSessions#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "aiVault.listSessions" - }, - { - "name": "params", - "value": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - }, - "d126597611a2": { - "name": "worktree.ps#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "dffc0668b556": { - "name": "aiVault.listSessions#1", - "ordinal": 7, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"],\"scopeOnly\":true}}" - }, - "e28c488ce6b2": { - "name": "agentSession.subscribeStatus#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.subscribeStatus\",\"params\":{}}" - }, - "e881d7dabb25": { - "name": "status.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "capabilities": ["aiVault.v1"] - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ebc8d9683b5e": { - "name": "worktree.ps#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktrees": [ - { - "path": "/repo/feature", - "repoId": "repo-1", - "worktreeId": "wt-history" - }, - { - "path": "/repo/sibling", - "repoId": "repo-1", - "worktreeId": "wt-2" - } - ] - } - } - } - } - }, - "recording": { - "scenario": "aivault-history-screen-worktrees", - "checkpoints": [ - { - "id": "worktrees-pending", - "observation": { - "sender": ["0562fd9175d5"], - "payloads": ["e28c488ce6b2", "d126597611a2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "7623e8b568b1", - "effects": [] - } - }, - { - "id": "worktrees-listed", - "observation": { - "sender": ["ebc8d9683b5e", "e881d7dabb25", "27ef7c5c6263"], - "payloads": ["e28c488ce6b2", "d126597611a2", "7c48e0564605", "dffc0668b556"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "7623e8b568b1", - "effects": [] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["ebc8d9683b5e", "e881d7dabb25", "a0b80301d553"], - "payloads": ["e28c488ce6b2", "d126597611a2", "7c48e0564605", "dffc0668b556"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "7623e8b568b1", - "effects": ["7e8b2964ad63"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/aivault-resume-launch-create-refused.json b/mobile/rpc-foundation/goldens/aivault-resume-launch-create-refused.json deleted file mode 100644 index 48e3025c985..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-resume-launch-create-refused.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.resume-launch", - "family": "aiVault.resume-launch", - "namedDeltas": [], - "values": { - "3e6273f4fe55": { - "name": "session.tabs.createTerminal#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.createTerminal" - }, - { - "name": "params", - "value": { - "activate": false, - "navigation": "caller", - "select": true, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "worktree_busy", - "message": "Workspace is busy" - }, - "id": "frame-1", - "ok": false - } - } - }, - "62643ed38326": { - "failure": "Workspace is busy", - "launched": "unlaunched" - }, - "6e913cd7b306": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Workspace is busy", - "isRpcDeliveryUnknown": false - } - }, - "88cd0d2b1302": { - "name": "session.tabs.createTerminal#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.createTerminal\",\"params\":{\"worktree\":\"id:workspace-1\",\"activate\":false,\"select\":true,\"navigation\":\"caller\"}}" - } - }, - "recording": { - "scenario": "aivault-resume-launch-create-refused", - "checkpoints": [ - { - "id": "create-refused", - "observation": { - "sender": ["3e6273f4fe55"], - "payloads": ["88cd0d2b1302"], - "settlements": { - "bare": "6e913cd7b306" - }, - "state": "62643ed38326", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/aivault-resume-prepare-refused.json b/mobile/rpc-foundation/goldens/aivault-resume-prepare-refused.json deleted file mode 100644 index 60057c22721..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-resume-prepare-refused.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.resume-preparation", - "family": "aiVault.resume-preparation", - "namedDeltas": [], - "values": { - "1c21b98bedb1": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "codex home is locked", - "isRpcDeliveryUnknown": false - } - }, - "6f601b6d009a": { - "name": "aiVault.prepareSessionResume#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "aiVault.prepareSessionResume" - }, - { - "name": "params", - "value": { - "agent": "codex", - "codexHome": "/hosts/codex-runtime-home/home", - "executionHostId": "local", - "filePath": "/sessions/rollout.jsonl" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "internal", - "message": "codex home is locked" - }, - "id": "frame-1", - "ok": false - } - } - }, - "7e4864f4412b": { - "failure": "codex home is locked", - "prepared": "unprepared" - }, - "88c8bb20eb6f": { - "name": "aiVault.prepareSessionResume#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.prepareSessionResume\",\"params\":{\"agent\":\"codex\",\"filePath\":\"/sessions/rollout.jsonl\",\"codexHome\":\"/hosts/codex-runtime-home/home\",\"executionHostId\":\"local\"}}" - } - }, - "recording": { - "scenario": "aivault-resume-prepare-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["6f601b6d009a"], - "payloads": ["88c8bb20eb6f"], - "settlements": { - "prepare": "1c21b98bedb1" - }, - "state": "7e4864f4412b", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/aivault-resume-prepare-skipped.json b/mobile/rpc-foundation/goldens/aivault-resume-prepare-skipped.json deleted file mode 100644 index ef03d4498d0..00000000000 --- a/mobile/rpc-foundation/goldens/aivault-resume-prepare-skipped.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "aiVault.resume-preparation", - "family": "aiVault.resume-preparation", - "namedDeltas": [], - "values": { - "5d9b438a0a47": { - "failure": { - "$rpc": "null" - }, - "prepared": { - "agent": "claude", - "codexHome": "/hosts/codex-runtime-home/home", - "executionHostId": "local", - "filePath": "/sessions/rollout.jsonl" - } - }, - "fd5226716450": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "agent": "claude", - "codexHome": "/hosts/codex-runtime-home/home", - "executionHostId": "local", - "filePath": "/sessions/rollout.jsonl" - } - } - }, - "recording": { - "scenario": "aivault-resume-prepare-skipped", - "checkpoints": [ - { - "id": "no-wire", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "claude": "fd5226716450" - }, - "state": "5d9b438a0a47", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/browser-keyboard-input.json b/mobile/rpc-foundation/goldens/browser-keyboard-input.json deleted file mode 100644 index 48384c64427..00000000000 --- a/mobile/rpc-foundation/goldens/browser-keyboard-input.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "browser.page-commands", - "family": "browser.keyboard", - "namedDeltas": [], - "values": { - "6104536ec606": { - "name": "browser.keypress#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"browser.keypress\",\"params\":{\"worktree\":\"id:worktree-1\",\"page\":\"page-1\",\"key\":\"Enter\"}}" - }, - "8160e8872519": { - "busy": false, - "dialog": { - "$rpc": "null" - }, - "error": { - "$rpc": "null" - }, - "keyboardValue": "", - "pointerModifiers": [] - }, - "86b725378b3b": { - "name": "browser.keyboardInsertText#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.keyboardInsertText\",\"params\":{\"worktree\":\"id:worktree-1\",\"page\":\"page-1\",\"text\":\"hello\"}}" - }, - "a5e12fd12d8a": { - "name": "toast", - "ordinal": 3, - "value": { - "message": "Sent" - } - }, - "d1075b8afeb6": { - "name": "browser.keyboardInsertText#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "browser.keyboardInsertText" - }, - { - "name": "params", - "value": { - "page": "page-1", - "text": "hello", - "worktree": "id:worktree-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "inserted": true - } - } - } - }, - "e6c97e728698": { - "name": "browser.keypress#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "browser.keypress" - }, - { - "name": "params", - "value": { - "key": "Enter", - "page": "page-1", - "worktree": "id:worktree-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "pressed": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "browser-keyboard-input", - "checkpoints": [ - { - "id": "typed", - "observation": { - "sender": ["d1075b8afeb6", "e6c97e728698"], - "payloads": ["86b725378b3b", "6104536ec606"], - "settlements": { - "mount": "eb79a9b3682a", - "text": "eb79a9b3682a", - "keypress": "eb79a9b3682a" - }, - "state": "8160e8872519", - "effects": ["a5e12fd12d8a"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/browser-pointer-click-accepted.json b/mobile/rpc-foundation/goldens/browser-pointer-click-accepted.json deleted file mode 100644 index f6d5b09f049..00000000000 --- a/mobile/rpc-foundation/goldens/browser-pointer-click-accepted.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "browser.page-commands", - "family": "browser.pointer-click", - "namedDeltas": [], - "values": { - "002a5bcbde42": { - "name": "browser.mouseClick#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.mouseClick\",\"params\":{\"worktree\":\"id:worktree-1\",\"page\":\"page-1\",\"x\":40,\"y\":80,\"button\":\"left\",\"modifiers\":[],\"radius\":14}}" - }, - "9855d4ec3415": { - "busy": false, - "dialog": { - "$rpc": "null" - }, - "error": { - "$rpc": "null" - }, - "keyboardValue": "hello", - "pointerModifiers": [] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f14b569391f9": { - "name": "browser.mouseClick#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "browser.mouseClick" - }, - { - "name": "params", - "value": { - "button": "left", - "modifiers": [], - "page": "page-1", - "radius": 14, - "worktree": "id:worktree-1", - "x": 40, - "y": 80 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 5000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "clicked": true - } - } - } - } - }, - "recording": { - "scenario": "browser-pointer-click-accepted", - "checkpoints": [ - { - "id": "clicked", - "observation": { - "sender": ["f14b569391f9"], - "payloads": ["002a5bcbde42"], - "settlements": { - "mount": "eb79a9b3682a", - "click": "eb79a9b3682a" - }, - "state": "9855d4ec3415", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/browser-wheel-scrolled.json b/mobile/rpc-foundation/goldens/browser-wheel-scrolled.json deleted file mode 100644 index c9ed33e13e9..00000000000 --- a/mobile/rpc-foundation/goldens/browser-wheel-scrolled.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "browser.page-commands", - "family": "browser.wheel", - "namedDeltas": [], - "values": { - "0ea51271b822": { - "name": "browser.mouseWheel#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"browser.mouseWheel\",\"params\":{\"worktree\":\"id:worktree-1\",\"page\":\"page-1\",\"dx\":0,\"dy\":-120}}" - }, - "4ee27ce5e118": { - "name": "browser.mouseWheel#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "browser.mouseWheel" - }, - { - "name": "params", - "value": { - "dx": 0, - "dy": -120, - "page": "page-1", - "worktree": "id:worktree-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "scrolled": true - } - } - } - }, - "5099a516ef10": { - "name": "browser.mouseMove#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.mouseMove\",\"params\":{\"worktree\":\"id:worktree-1\",\"page\":\"page-1\",\"x\":40,\"y\":80}}" - }, - "5972986e0d80": { - "name": "browser.mouseMove#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "browser.mouseMove" - }, - { - "name": "params", - "value": { - "page": "page-1", - "worktree": "id:worktree-1", - "x": 40, - "y": 80 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "moved": true - } - } - } - }, - "9855d4ec3415": { - "busy": false, - "dialog": { - "$rpc": "null" - }, - "error": { - "$rpc": "null" - }, - "keyboardValue": "hello", - "pointerModifiers": [] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "browser-wheel-scrolled", - "checkpoints": [ - { - "id": "scrolled", - "observation": { - "sender": ["5972986e0d80", "4ee27ce5e118"], - "payloads": ["5099a516ef10", "0ea51271b822"], - "settlements": { - "mount": "eb79a9b3682a", - "wheel": "eb79a9b3682a" - }, - "state": "9855d4ec3415", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/clipboard-image-attachment-blocked-before-send.json b/mobile/rpc-foundation/goldens/clipboard-image-attachment-blocked-before-send.json deleted file mode 100644 index 6fd39276a28..00000000000 --- a/mobile/rpc-foundation/goldens/clipboard-image-attachment-blocked-before-send.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "clipboard.image-terminal-attachment", - "family": "clipboard.image-attachment", - "namedDeltas": [], - "values": { - "08a3a6323626": { - "name": "before-terminal-send", - "ordinal": 8, - "value": { - "terminal": "terminal-1" - } - }, - "6696a47819e1": { - "name": "clipboard.startImageUpload#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.startImageUpload\",\"params\":{\"expectedBase64Length\":32,\"connectionId\":\"connection-1\"}}" - }, - "7c2e3ea286aa": { - "name": "clipboard.startImageUpload#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "clipboard.startImageUpload" - }, - { - "name": "params", - "value": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "uploadId": "upload-1" - } - } - } - }, - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "814ccd56a769": { - "name": "clipboard.appendImageUploadChunk#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.appendImageUploadChunk\",\"params\":{\"uploadId\":\"upload-1\",\"offset\":0,\"contentBase64\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}}" - }, - "8452698ac11a": { - "name": "clipboard.commitImageUpload#1", - "ordinal": 7, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.commitImageUpload\",\"params\":{\"uploadId\":\"upload-1\"}}" - }, - "8aa742456efd": { - "attached": false, - "failure": { - "$rpc": "null" - } - }, - "994fccf9b305": { - "name": "upload-start", - "ordinal": 1, - "value": {} - }, - "b50d2ec23283": { - "name": "clipboard.commitImageUpload#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "clipboard.commitImageUpload" - }, - { - "name": "params", - "value": { - "uploadId": "upload-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": "/tmp/img.png" - } - } - }, - "f05e4695ffa3": { - "name": "clipboard.appendImageUploadChunk#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "clipboard.appendImageUploadChunk" - }, - { - "name": "params", - "value": { - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "offset": 0, - "uploadId": "upload-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "received": 32 - } - } - } - } - }, - "recording": { - "scenario": "clipboard-image-attachment-blocked-before-send", - "checkpoints": [ - { - "id": "blocked", - "observation": { - "sender": ["7c2e3ea286aa", "f05e4695ffa3", "b50d2ec23283"], - "payloads": ["6696a47819e1", "814ccd56a769", "8452698ac11a"], - "settlements": { - "blocked": "7ed3d39f0607" - }, - "state": "8aa742456efd", - "effects": ["994fccf9b305", "08a3a6323626"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/clipboard-image-attachment-upload-refused.json b/mobile/rpc-foundation/goldens/clipboard-image-attachment-upload-refused.json deleted file mode 100644 index caaeb657cf0..00000000000 --- a/mobile/rpc-foundation/goldens/clipboard-image-attachment-upload-refused.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "clipboard.image-terminal-attachment", - "family": "clipboard.image-attachment", - "namedDeltas": [], - "values": { - "3c402c915494": { - "name": "clipboard.startImageUpload#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "clipboard.startImageUpload" - }, - { - "name": "params", - "value": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "too_large", - "message": "Image is too large" - }, - "id": "frame-1", - "ok": false - } - } - }, - "6696a47819e1": { - "name": "clipboard.startImageUpload#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.startImageUpload\",\"params\":{\"expectedBase64Length\":32,\"connectionId\":\"connection-1\"}}" - }, - "765ab192e1a5": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Image is too large", - "isRpcDeliveryUnknown": false - } - }, - "994fccf9b305": { - "name": "upload-start", - "ordinal": 1, - "value": {} - }, - "cc325ad637ea": { - "attached": "unattached", - "failure": "Image is too large" - } - }, - "recording": { - "scenario": "clipboard-image-attachment-upload-refused", - "checkpoints": [ - { - "id": "upload-refused", - "observation": { - "sender": ["3c402c915494"], - "payloads": ["6696a47819e1"], - "settlements": { - "normal": "765ab192e1a5" - }, - "state": "cc325ad637ea", - "effects": ["994fccf9b305"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/clipboard-image-upload-chunked.json b/mobile/rpc-foundation/goldens/clipboard-image-upload-chunked.json deleted file mode 100644 index 2cd9d763783..00000000000 --- a/mobile/rpc-foundation/goldens/clipboard-image-upload-chunked.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "clipboard.image-upload", - "family": "clipboard.image-upload", - "namedDeltas": [], - "values": { - "261840506035": { - "name": "clipboard.appendImageUploadChunk#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "clipboard.appendImageUploadChunk" - }, - { - "name": "params", - "value": { - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "offset": 0, - "uploadId": "upload-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "received": 32 - } - } - } - }, - "28e38d6e1608": { - "name": "clipboard.appendImageUploadChunk#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.appendImageUploadChunk\",\"params\":{\"uploadId\":\"upload-1\",\"offset\":0,\"contentBase64\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}}" - }, - "7442a814fa13": { - "name": "clipboard.commitImageUpload#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "clipboard.commitImageUpload" - }, - { - "name": "params", - "value": { - "uploadId": "upload-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": "/tmp/img.png" - } - } - }, - "7ab518750e0f": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "/tmp/img.png" - }, - "7bc2e4227914": { - "name": "clipboard.startImageUpload#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.startImageUpload\",\"params\":{\"expectedBase64Length\":32,\"connectionId\":\"connection-1\"}}" - }, - "a13ad28e242d": { - "name": "clipboard.commitImageUpload#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.commitImageUpload\",\"params\":{\"uploadId\":\"upload-1\"}}" - }, - "a77b999a5f7c": { - "failure": { - "$rpc": "null" - }, - "path": "/tmp/img.png" - }, - "d2a1a0e3d100": { - "name": "clipboard.startImageUpload#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "clipboard.startImageUpload" - }, - { - "name": "params", - "value": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "uploadId": "upload-1" - } - } - } - } - }, - "recording": { - "scenario": "clipboard-image-upload-chunked", - "checkpoints": [ - { - "id": "uploaded", - "observation": { - "sender": ["d2a1a0e3d100", "261840506035", "7442a814fa13"], - "payloads": ["7bc2e4227914", "28e38d6e1608", "a13ad28e242d"], - "settlements": { - "remote": "7ab518750e0f" - }, - "state": "a77b999a5f7c", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/codex-reset-credit-consumed.json b/mobile/rpc-foundation/goldens/codex-reset-credit-consumed.json deleted file mode 100644 index d42255e6f7c..00000000000 --- a/mobile/rpc-foundation/goldens/codex-reset-credit-consumed.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "accounts.codex-reset-credit", - "family": "components.codex-reset-credit", - "namedDeltas": [], - "values": { - "055241a84f48": { - "settled": { - "outcome": "reset" - } - }, - "0a07efb53f1e": { - "settled": { - "$rpc": "null" - } - }, - "52d5e56d067b": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "outcome": "reset", - "scope": { - "accountId": "codex-1", - "accountRevision": 1700000000000, - "offerRevision": "v1:[1,null,null,[],null,null,1700000000000]", - "target": { - "runtime": "host", - "wslDistro": { - "$rpc": "null" - } - } - }, - "snapshot": { - "claude": { - "accounts": [], - "activeAccountId": { - "$rpc": "null" - } - }, - "codex": { - "accounts": [ - { - "email": "codex@example.test", - "id": "codex-1", - "updatedAt": 1700000000000 - } - ], - "activeAccountId": "codex-1", - "activeAccountIdsByRuntime": { - "host": "codex-1", - "wsl": {} - } - }, - "rateLimits": { - "claude": { - "$rpc": "null" - }, - "claudeTarget": { - "runtime": "host", - "wslDistro": { - "$rpc": "null" - } - }, - "codex": { - "error": { - "$rpc": "null" - }, - "provider": "codex", - "rateLimitResetCredits": { - "availableCount": 1 - }, - "session": { - "$rpc": "null" - }, - "status": "ok", - "updatedAt": 1700000000000, - "weekly": { - "$rpc": "null" - } - }, - "codexTarget": { - "runtime": "host", - "wslDistro": { - "$rpc": "null" - } - }, - "inactiveClaudeAccounts": [], - "inactiveCodexAccounts": [] - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "944a34b7acd6": { - "name": "accounts.consumeCodexResetCredit#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"accounts.consumeCodexResetCredit\",\"params\":{\"idempotencyKey\":\"00000000-0000-4000-8000-000000000001\",\"expectedScope\":{\"target\":{\"runtime\":\"host\",\"wslDistro\":null},\"accountId\":\"codex-1\",\"accountRevision\":1700000000000,\"offerRevision\":\"v1:[1,null,null,[],null,null,1700000000000]\"}}}" - }, - "b88c06607a7c": { - "name": "accounts.consumeCodexResetCredit#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "accounts.consumeCodexResetCredit" - }, - { - "name": "params", - "value": { - "expectedScope": { - "accountId": "codex-1", - "accountRevision": 1700000000000, - "offerRevision": "v1:[1,null,null,[],null,null,1700000000000]", - "target": { - "runtime": "host", - "wslDistro": { - "$rpc": "null" - } - } - }, - "idempotencyKey": "00000000-0000-4000-8000-000000000001" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 90000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "outcome": "reset", - "scope": { - "accountId": "codex-1", - "accountRevision": 1700000000000, - "offerRevision": "v1:[1,null,null,[],null,null,1700000000000]", - "target": { - "runtime": "host", - "wslDistro": { - "$rpc": "null" - } - } - }, - "snapshot": { - "claude": { - "accounts": [], - "activeAccountId": { - "$rpc": "null" - } - }, - "codex": { - "accounts": [ - { - "email": "codex@example.test", - "id": "codex-1", - "updatedAt": 1700000000000 - } - ], - "activeAccountId": "codex-1", - "activeAccountIdsByRuntime": { - "host": "codex-1", - "wsl": {} - } - }, - "rateLimits": { - "claude": { - "$rpc": "null" - }, - "codex": { - "error": { - "$rpc": "null" - }, - "provider": "codex", - "rateLimitResetCredits": { - "availableCount": 1 - }, - "session": { - "$rpc": "null" - }, - "status": "ok", - "updatedAt": 1700000000000, - "weekly": { - "$rpc": "null" - } - }, - "inactiveClaudeAccounts": [], - "inactiveCodexAccounts": [] - } - } - } - } - } - }, - "de0c9a811224": { - "name": "accounts.consumeCodexResetCredit#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "accounts.consumeCodexResetCredit" - }, - { - "name": "params", - "value": { - "expectedScope": { - "accountId": "codex-1", - "accountRevision": 1700000000000, - "offerRevision": "v1:[1,null,null,[],null,null,1700000000000]", - "target": { - "runtime": "host", - "wslDistro": { - "$rpc": "null" - } - } - }, - "idempotencyKey": "00000000-0000-4000-8000-000000000001" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 90000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - } - }, - "recording": { - "scenario": "codex-reset-credit-consumed", - "checkpoints": [ - { - "id": "requested", - "observation": { - "sender": ["de0c9a811224"], - "payloads": ["944a34b7acd6"], - "settlements": { - "confirm": "9270aeb7d9c6" - }, - "state": "0a07efb53f1e", - "effects": [] - } - }, - { - "id": "consumed", - "observation": { - "sender": ["b88c06607a7c"], - "payloads": ["944a34b7acd6"], - "settlements": { - "confirm": "52d5e56d067b" - }, - "state": "055241a84f48", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/components-setup-ask.json b/mobile/rpc-foundation/goldens/components-setup-ask.json deleted file mode 100644 index 23e6387b654..00000000000 --- a/mobile/rpc-foundation/goldens/components-setup-ask.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "components.setup-script", - "family": "components.setup-script", - "namedDeltas": [], - "values": { - "2bf6d40fe6a5": { - "name": "repo.hooks#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "5d1cf72f4e12": { - "advanced": true, - "command": "pnpm install", - "run": true, - "runPolicy": "ask", - "source": "repo", - "trust": { - "$rpc": "null" - } - }, - "79deedc9f2ed": { - "name": "repo.hooks#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "80cf8444e458": { - "advanced": false, - "command": { - "$rpc": "null" - }, - "run": true, - "runPolicy": "run-by-default", - "source": { - "$rpc": "null" - }, - "trust": { - "$rpc": "null" - } - }, - "a4e4636264db": { - "name": "repo.hooks#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "hooks": { - "scripts": { - "setup": "pnpm install" - } - }, - "setupRunPolicy": "ask", - "setupTrust": { - "$rpc": "null" - }, - "source": "repo" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "components-setup-ask", - "checkpoints": [ - { - "id": "hooks-pending", - "observation": { - "sender": ["2bf6d40fe6a5"], - "payloads": ["79deedc9f2ed"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "80cf8444e458", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["a4e4636264db"], - "payloads": ["79deedc9f2ed"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "5d1cf72f4e12", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/components-target-local.json b/mobile/rpc-foundation/goldens/components-target-local.json deleted file mode 100644 index 584ee706c82..00000000000 --- a/mobile/rpc-foundation/goldens/components-target-local.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "components.execution-target-local", - "family": "components.execution-target-local", - "namedDeltas": [], - "values": { - "5779e5e854f7": { - "detected": { - "$rpc": "null" - }, - "gate": { - "connectInProgress": true, - "error": { - "$rpc": "null" - }, - "needsDesktopServerRecovery": false, - "requiresConnection": false, - "status": { - "$rpc": "null" - } - } - }, - "9b8ae0c8eec5": { - "name": "preflight.detectAgents#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectAgents\"}" - }, - "a4fe12488bc4": { - "name": "preflight.detectAgents#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.detectAgents" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "d3a709c13f9d": { - "detected": ["claude"], - "gate": { - "connectInProgress": true, - "error": { - "$rpc": "null" - }, - "needsDesktopServerRecovery": false, - "requiresConnection": false, - "status": { - "$rpc": "null" - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f15d8f54be02": { - "name": "preflight.detectAgents#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.detectAgents" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": ["claude"] - } - } - } - }, - "recording": { - "scenario": "components-target-local", - "checkpoints": [ - { - "id": "detect-pending", - "observation": { - "sender": ["a4fe12488bc4"], - "payloads": ["9b8ae0c8eec5"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "5779e5e854f7", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["f15d8f54be02"], - "payloads": ["9b8ae0c8eec5"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "d3a709c13f9d", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/components-target-ssh.json b/mobile/rpc-foundation/goldens/components-target-ssh.json deleted file mode 100644 index faa4a3ed665..00000000000 --- a/mobile/rpc-foundation/goldens/components-target-ssh.json +++ /dev/null @@ -1,260 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "components.execution-target", - "family": "components.execution-target", - "namedDeltas": [], - "values": { - "0355054e5e71": { - "name": "ssh.connect#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ssh.connect" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 120000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "state": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - } - } - } - }, - "10b5ec5ae537": { - "name": "preflight.detectRemoteAgents#2", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "12098dde49de": { - "name": "ssh.connect#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "1212a28487d8": { - "detected": ["codex"], - "gate": { - "connectInProgress": false, - "error": { - "$rpc": "null" - }, - "needsDesktopServerRecovery": false, - "requiresConnection": false, - "status": "connected" - } - }, - "4aa26501c485": { - "name": "preflight.detectRemoteAgents#2", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "70b1e8fb528a": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": ["codex"] - } - } - }, - "8265ec539d5a": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "a11809a84754": { - "name": "ssh.getState#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "b53739a58194": { - "name": "ssh.getState#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ssh.getState" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "state": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - } - } - } - }, - "b6835adccf60": { - "name": "ssh.getState#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ssh.getState" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "fe6c500525e6": { - "detected": { - "$rpc": "null" - }, - "gate": { - "connectInProgress": false, - "error": { - "$rpc": "null" - }, - "needsDesktopServerRecovery": false, - "requiresConnection": true, - "status": { - "$rpc": "null" - } - } - } - }, - "recording": { - "scenario": "components-target-ssh", - "checkpoints": [ - { - "id": "state-pending", - "observation": { - "sender": ["b6835adccf60"], - "payloads": ["a11809a84754"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "fe6c500525e6", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["b53739a58194", "70b1e8fb528a", "0355054e5e71", "10b5ec5ae537"], - "payloads": ["a11809a84754", "8265ec539d5a", "12098dde49de", "4aa26501c485"], - "settlements": { - "mount": "eb79a9b3682a", - "connect": "eb79a9b3682a" - }, - "state": "1212a28487d8", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/file-tap-open-refused.json b/mobile/rpc-foundation/goldens/file-tap-open-refused.json deleted file mode 100644 index 44d9c50bb19..00000000000 --- a/mobile/rpc-foundation/goldens/file-tap-open-refused.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "namedDeltas": [], - "values": { - "0358eb8770a0": { - "name": "files.resolveTerminalPath#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.resolveTerminalPath" - }, - { - "name": "params", - "value": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 10000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "exists": true, - "isDirectory": false, - "openTarget": { - "absolutePath": "/repo/src/app.ts", - "kind": "worktree-file", - "provider": "ssh", - "relativePath": "src/app.ts" - }, - "relativePath": "src/app.ts" - } - } - } - }, - "47a3b40d1640": { - "name": "files.open#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"files.open\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"src/app.ts\"}}" - }, - "561f3fedeb78": { - "name": "files.resolveTerminalPath#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.resolveTerminalPath\",\"params\":{\"worktree\":\"id:workspace-1\",\"pathText\":\"src/app.ts\",\"crossWorkspace\":true,\"terminal\":\"terminal-1\",\"cwd\":\"/repo\"}}" - }, - "591c78d805ec": { - "name": "files.open#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "files.open" - }, - { - "name": "params", - "value": { - "relativePath": "src/app.ts", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "file_locked", - "message": "File is locked" - }, - "id": "frame-2", - "ok": false - } - } - }, - "c0978ed13409": { - "name": "open-feedback", - "ordinal": 3, - "value": {} - }, - "c7ce9c8dc60e": { - "activeSessionTabId": "tab-source", - "failed": 1, - "switched": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "file-tap-open-refused", - "checkpoints": [ - { - "id": "open-refused", - "observation": { - "sender": ["0358eb8770a0", "591c78d805ec"], - "payloads": ["561f3fedeb78", "47a3b40d1640"], - "settlements": { - "tap": "eb79a9b3682a" - }, - "state": "c7ce9c8dc60e", - "effects": ["c0978ed13409"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/file-tap-previews-absolute-artifact.json b/mobile/rpc-foundation/goldens/file-tap-previews-absolute-artifact.json deleted file mode 100644 index 42f0fbceaf8..00000000000 --- a/mobile/rpc-foundation/goldens/file-tap-previews-absolute-artifact.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "namedDeltas": [], - "values": { - "220e44211af6": { - "name": "files.resolveTerminalPath#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.resolveTerminalPath" - }, - { - "name": "params", - "value": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 10000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "exists": true, - "isDirectory": false, - "openTarget": { - "absolutePath": "/logs/run.txt", - "grantId": "grant-1", - "kind": "absolute-file" - } - } - } - } - }, - "53fb9b1f36f9": { - "activeSessionTabId": "tab-source", - "failed": 0, - "switched": { - "$rpc": "null" - } - }, - "561f3fedeb78": { - "name": "files.resolveTerminalPath#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.resolveTerminalPath\",\"params\":{\"worktree\":\"id:workspace-1\",\"pathText\":\"src/app.ts\",\"crossWorkspace\":true,\"terminal\":\"terminal-1\",\"cwd\":\"/repo\"}}" - }, - "a4f3b56d5a81": { - "name": "push-preview-route", - "ordinal": 4, - "value": { - "params": { - "absolutePath": "/logs/run.txt", - "cwd": "/repo", - "grantId": "grant-1", - "hostId": "host-1", - "name": "run.txt", - "pathText": "src/app.ts", - "source": "terminalArtifact", - "terminal": "terminal-1", - "worktreeId": "workspace-1", - "worktreeName": "workspace" - }, - "pathname": "/h/[hostId]/files/preview/[worktreeId]" - } - }, - "c0978ed13409": { - "name": "open-feedback", - "ordinal": 3, - "value": {} - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "file-tap-previews-absolute-artifact", - "checkpoints": [ - { - "id": "previewed", - "observation": { - "sender": ["220e44211af6"], - "payloads": ["561f3fedeb78"], - "settlements": { - "tap": "eb79a9b3682a" - }, - "state": "53fb9b1f36f9", - "effects": ["c0978ed13409", "a4f3b56d5a81"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/file-tap-resolve-miss.json b/mobile/rpc-foundation/goldens/file-tap-resolve-miss.json deleted file mode 100644 index 637e736c23e..00000000000 --- a/mobile/rpc-foundation/goldens/file-tap-resolve-miss.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "namedDeltas": [], - "values": { - "3445711170ff": { - "name": "files.resolveTerminalPath#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.resolveTerminalPath" - }, - { - "name": "params", - "value": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 10000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "exists": false, - "isDirectory": false - } - } - } - }, - "561f3fedeb78": { - "name": "files.resolveTerminalPath#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.resolveTerminalPath\",\"params\":{\"worktree\":\"id:workspace-1\",\"pathText\":\"src/app.ts\",\"crossWorkspace\":true,\"terminal\":\"terminal-1\",\"cwd\":\"/repo\"}}" - }, - "c7ce9c8dc60e": { - "activeSessionTabId": "tab-source", - "failed": 1, - "switched": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "file-tap-resolve-miss", - "checkpoints": [ - { - "id": "missed", - "observation": { - "sender": ["3445711170ff"], - "payloads": ["561f3fedeb78"], - "settlements": { - "tap": "eb79a9b3682a" - }, - "state": "c7ce9c8dc60e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/file-tap-resolve-refused.json b/mobile/rpc-foundation/goldens/file-tap-resolve-refused.json deleted file mode 100644 index 6dfff417c56..00000000000 --- a/mobile/rpc-foundation/goldens/file-tap-resolve-refused.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "namedDeltas": [], - "values": { - "279749a84cb2": { - "name": "files.resolveTerminalPath#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.resolveTerminalPath" - }, - { - "name": "params", - "value": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 10000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "worktree_not_found", - "message": "No such workspace" - }, - "id": "frame-1", - "ok": false - } - } - }, - "561f3fedeb78": { - "name": "files.resolveTerminalPath#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.resolveTerminalPath\",\"params\":{\"worktree\":\"id:workspace-1\",\"pathText\":\"src/app.ts\",\"crossWorkspace\":true,\"terminal\":\"terminal-1\",\"cwd\":\"/repo\"}}" - }, - "c7ce9c8dc60e": { - "activeSessionTabId": "tab-source", - "failed": 1, - "switched": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "file-tap-resolve-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["279749a84cb2"], - "payloads": ["561f3fedeb78"], - "settlements": { - "tap": "eb79a9b3682a" - }, - "state": "c7ce9c8dc60e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-explorer-readdir.json b/mobile/rpc-foundation/goldens/files-explorer-readdir.json deleted file mode 100644 index fa03d4ddf49..00000000000 --- a/mobile/rpc-foundation/goldens/files-explorer-readdir.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.explorer-screen", - "family": "files.explorer-screen", - "namedDeltas": [], - "values": { - "34bd55d6f194": { - "name": "files.readDir#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readDir\",\"params\":{\"worktree\":\"id:wt-files\",\"relativePath\":\"\",\"limit\":500}}" - }, - "9f1a5ca359ab": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ChevronLeft": 1, - "Defs": 1, - "FlatList": 1, - "LinearGradient": 1, - "Pressable": 1, - "Rect": 1, - "SafeAreaView": 1, - "Search": 1, - "Stop": 2, - "Svg": 1, - "Text": 2, - "TextInput": 1, - "View": 11 - }, - "labels": ["Back to session", "Filter files"], - "rows": ["dir:src", "file:README.md"], - "text": ["Files", "orca-files"] - }, - "c60ce6016166": { - "name": "files.readDir#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readDir" - }, - { - "name": "params", - "value": { - "limit": 500, - "relativePath": "", - "worktree": "id:wt-files" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": [ - { - "isDirectory": true, - "name": "src" - }, - { - "isDirectory": false, - "name": "README.md" - } - ] - } - } - }, - "c721e7f4a5c5": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ActivityIndicator": 1, - "ChevronLeft": 1, - "Pressable": 1, - "SafeAreaView": 1, - "Text": 3, - "View": 7 - }, - "labels": ["Back to session"], - "rows": [], - "text": ["Files", "orca-files", "Loading files…"] - }, - "ca13345ac236": { - "name": "files.readDir#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readDir" - }, - { - "name": "params", - "value": { - "limit": 500, - "relativePath": "", - "worktree": "id:wt-files" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "files-explorer-readdir", - "checkpoints": [ - { - "id": "loading", - "observation": { - "sender": ["ca13345ac236"], - "payloads": ["34bd55d6f194"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c721e7f4a5c5", - "effects": [] - } - }, - { - "id": "listed", - "observation": { - "sender": ["c60ce6016166"], - "payloads": ["34bd55d6f194"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9f1a5ca359ab", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-ownership-local.json b/mobile/rpc-foundation/goldens/files-ownership-local.json deleted file mode 100644 index 3eea99312b2..00000000000 --- a/mobile/rpc-foundation/goldens/files-ownership-local.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.mutation-ownership", - "family": "files.mutation-ownership", - "namedDeltas": [], - "values": { - "4e53935c13ac": { - "name": "worktree.show#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktree": { - "hostId": "local" - } - } - } - } - }, - "548f05412e41": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "expectedExecutionHostId": "local" - } - }, - "bab8756fa040": { - "ownership": { - "expectedExecutionHostId": "local" - } - }, - "c924e7a5a7da": { - "name": "worktree.show#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "e81d3a627ac2": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["files.mutation-ownership.v1"] - } - } - } - } - }, - "recording": { - "scenario": "files-ownership-local", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["e81d3a627ac2", "4e53935c13ac"], - "payloads": ["d08f74d65ee6", "c924e7a5a7da"], - "settlements": { - "capture": "548f05412e41" - }, - "state": "bab8756fa040", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-ownership-ssh.json b/mobile/rpc-foundation/goldens/files-ownership-ssh.json deleted file mode 100644 index 855dae1641a..00000000000 --- a/mobile/rpc-foundation/goldens/files-ownership-ssh.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.mutation-ownership", - "family": "files.mutation-ownership", - "namedDeltas": [], - "values": { - "088efd8ff3f7": { - "name": "ssh.getState#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"target-1\"}}" - }, - "29bfbe94cca9": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "expectedExecutionHostId": "ssh:target-1", - "expectedSshConnectionGeneration": 3, - "expectedSshTargetId": "target-1" - } - }, - "3cf4416a7928": { - "name": "worktree.show#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktree": { - "hostId": "ssh:target-1" - } - } - } - } - }, - "518ec57c381a": { - "ownership": "uncaptured" - }, - "83e4ac78046a": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "b6e8ae2b152e": { - "name": "ssh.getState#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ssh.getState" - }, - { - "name": "params", - "value": { - "targetId": "target-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "state": { - "connectionGeneration": 3, - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "target-1" - } - } - } - } - }, - "bd84dadd27c7": { - "ownership": { - "expectedExecutionHostId": "ssh:target-1", - "expectedSshConnectionGeneration": 3, - "expectedSshTargetId": "target-1" - } - }, - "c924e7a5a7da": { - "name": "worktree.show#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "e81d3a627ac2": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["files.mutation-ownership.v1"] - } - } - } - } - }, - "recording": { - "scenario": "files-ownership-ssh", - "checkpoints": [ - { - "id": "status-pending", - "observation": { - "sender": ["83e4ac78046a"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "capture": "9270aeb7d9c6" - }, - "state": "518ec57c381a", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["e81d3a627ac2", "3cf4416a7928", "b6e8ae2b152e"], - "payloads": ["d08f74d65ee6", "c924e7a5a7da", "088efd8ff3f7"], - "settlements": { - "capture": "29bfbe94cca9" - }, - "state": "bd84dadd27c7", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-artifact-direct.json b/mobile/rpc-foundation/goldens/files-preview-artifact-direct.json deleted file mode 100644 index 75cf78728ca..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-artifact-direct.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-load", - "namedDeltas": [], - "values": { - "500d95d47092": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "byteLength": 5, - "content": "hello", - "kind": "text", - "status": "ready", - "truncated": false - } - }, - "5beb3ae90517": { - "name": "files.readTerminalArtifact#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readTerminalArtifact\",\"params\":{\"worktree\":\"id:workspace-1\",\"absolutePath\":\"/logs/run.txt\",\"grantId\":\"grant-1\"}}" - }, - "784ea351e5b2": { - "preview": { - "byteLength": 5, - "content": "hello", - "kind": "text", - "status": "ready", - "truncated": false - } - }, - "b3fa0f7828ce": { - "name": "files.readTerminalArtifact#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readTerminalArtifact" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/run.txt", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "byteLength": 5, - "content": "hello", - "truncated": false - } - } - } - } - }, - "recording": { - "scenario": "files-preview-artifact-direct", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["b3fa0f7828ce"], - "payloads": ["5beb3ae90517"], - "settlements": { - "load": "500d95d47092" - }, - "state": "784ea351e5b2", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-artifact-image-read.json b/mobile/rpc-foundation/goldens/files-preview-artifact-image-read.json deleted file mode 100644 index a909fc1ce45..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-artifact-image-read.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-artifact-image", - "namedDeltas": [], - "values": { - "7659b8b575da": { - "preview": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - }, - "b5608d3d00c8": { - "name": "files.readTerminalArtifactPreview#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readTerminalArtifactPreview\",\"params\":{\"worktree\":\"id:workspace-1\",\"absolutePath\":\"/logs/shot.png\",\"grantId\":\"grant-1\"}}" - }, - "ce511c0ab8ac": { - "name": "files.readTerminalArtifactPreview#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readTerminalArtifactPreview" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/shot.png", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - } - }, - "eee847a9d90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - } - }, - "recording": { - "scenario": "files-preview-artifact-image-read", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["ce511c0ab8ac"], - "payloads": ["b5608d3d00c8"], - "settlements": { - "load": "eee847a9d90d" - }, - "state": "7659b8b575da", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-artifact-image.json b/mobile/rpc-foundation/goldens/files-preview-artifact-image.json deleted file mode 100644 index 466d1a54ba9..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-artifact-image.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-load", - "namedDeltas": [], - "values": { - "7659b8b575da": { - "preview": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - }, - "b5608d3d00c8": { - "name": "files.readTerminalArtifactPreview#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readTerminalArtifactPreview\",\"params\":{\"worktree\":\"id:workspace-1\",\"absolutePath\":\"/logs/shot.png\",\"grantId\":\"grant-1\"}}" - }, - "ce511c0ab8ac": { - "name": "files.readTerminalArtifactPreview#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readTerminalArtifactPreview" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/shot.png", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - } - }, - "eee847a9d90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - } - }, - "recording": { - "scenario": "files-preview-artifact-image", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["ce511c0ab8ac"], - "payloads": ["b5608d3d00c8"], - "settlements": { - "load": "eee847a9d90d" - }, - "state": "7659b8b575da", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-worktree-image-read.json b/mobile/rpc-foundation/goldens/files-preview-worktree-image-read.json deleted file mode 100644 index a65b9babfb7..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-worktree-image-read.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-worktree-image", - "namedDeltas": [], - "values": { - "70f782fa6ef2": { - "name": "files.readPreview#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readPreview\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/logo.png\"}}" - }, - "7659b8b575da": { - "preview": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - }, - "a568af21f540": { - "name": "files.readPreview#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readPreview" - }, - { - "name": "params", - "value": { - "relativePath": "docs/logo.png", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - } - }, - "eee847a9d90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - } - }, - "recording": { - "scenario": "files-preview-worktree-image-read", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["a568af21f540"], - "payloads": ["70f782fa6ef2"], - "settlements": { - "load": "eee847a9d90d" - }, - "state": "7659b8b575da", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-worktree-image.json b/mobile/rpc-foundation/goldens/files-preview-worktree-image.json deleted file mode 100644 index 66bc880db9d..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-worktree-image.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-load", - "namedDeltas": [], - "values": { - "70f782fa6ef2": { - "name": "files.readPreview#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readPreview\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/logo.png\"}}" - }, - "7659b8b575da": { - "preview": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - }, - "a568af21f540": { - "name": "files.readPreview#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readPreview" - }, - { - "name": "params", - "value": { - "relativePath": "docs/logo.png", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - } - }, - "eee847a9d90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - } - }, - "recording": { - "scenario": "files-preview-worktree-image", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["a568af21f540"], - "payloads": ["70f782fa6ef2"], - "settlements": { - "load": "eee847a9d90d" - }, - "state": "7659b8b575da", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-worktree-text-read.json b/mobile/rpc-foundation/goldens/files-preview-worktree-text-read.json deleted file mode 100644 index ce3b4efe91f..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-worktree-text-read.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-worktree-text", - "namedDeltas": [], - "values": { - "1cf4496bc8c0": { - "name": "files.read#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.read" - }, - { - "name": "params", - "value": { - "relativePath": "docs/readme.md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "byteLength": 8, - "content": "# readme", - "truncated": false - } - } - } - }, - "3f8bf3069e3d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "byteLength": 8, - "content": "# readme", - "kind": "markdown", - "status": "ready", - "truncated": false - } - }, - "47ef2e397e18": { - "preview": { - "byteLength": 8, - "content": "# readme", - "kind": "markdown", - "status": "ready", - "truncated": false - } - }, - "8423ff93fda2": { - "name": "files.read#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.read\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/readme.md\"}}" - } - }, - "recording": { - "scenario": "files-preview-worktree-text-read", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["1cf4496bc8c0"], - "payloads": ["8423ff93fda2"], - "settlements": { - "load": "3f8bf3069e3d" - }, - "state": "47ef2e397e18", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-preview-worktree.json b/mobile/rpc-foundation/goldens/files-preview-worktree.json deleted file mode 100644 index e6472887b63..00000000000 --- a/mobile/rpc-foundation/goldens/files-preview-worktree.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-load", - "family": "files.preview-load", - "namedDeltas": [], - "values": { - "1cf4496bc8c0": { - "name": "files.read#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.read" - }, - { - "name": "params", - "value": { - "relativePath": "docs/readme.md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "byteLength": 8, - "content": "# readme", - "truncated": false - } - } - } - }, - "3f8bf3069e3d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "byteLength": 8, - "content": "# readme", - "kind": "markdown", - "status": "ready", - "truncated": false - } - }, - "47ef2e397e18": { - "preview": { - "byteLength": 8, - "content": "# readme", - "kind": "markdown", - "status": "ready", - "truncated": false - } - }, - "8423ff93fda2": { - "name": "files.read#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.read\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/readme.md\"}}" - } - }, - "recording": { - "scenario": "files-preview-worktree", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["1cf4496bc8c0"], - "payloads": ["8423ff93fda2"], - "settlements": { - "load": "3f8bf3069e3d" - }, - "state": "47ef2e397e18", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-save-blind.json b/mobile/rpc-foundation/goldens/files-save-blind.json deleted file mode 100644 index cfb69cb7ad4..00000000000 --- a/mobile/rpc-foundation/goldens/files-save-blind.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-save", - "family": "files.preview-save", - "namedDeltas": [], - "values": { - "300dad960cb6": { - "name": "files.writeTerminalArtifact#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.writeTerminalArtifact\",\"params\":{\"worktree\":\"id:workspace-1\",\"absolutePath\":\"/logs/run.txt\",\"grantId\":\"grant-1\",\"content\":\"next\"}}" - }, - "54a6055a16b5": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "status": "saved" - } - }, - "7c239dddee09": { - "name": "files.writeTerminalArtifact#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.writeTerminalArtifact" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/run.txt", - "content": "next", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "b3f873eb7d0c": { - "saved": { - "status": "saved" - } - } - }, - "recording": { - "scenario": "files-save-blind", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["7c239dddee09"], - "payloads": ["300dad960cb6"], - "settlements": { - "save": "54a6055a16b5" - }, - "state": "b3f873eb7d0c", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-save-verified.json b/mobile/rpc-foundation/goldens/files-save-verified.json deleted file mode 100644 index 005f2fd5ce3..00000000000 --- a/mobile/rpc-foundation/goldens/files-save-verified.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.preview-save", - "family": "files.preview-save", - "namedDeltas": [], - "values": { - "24ffb7059792": { - "name": "files.readTerminalArtifact#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readTerminalArtifact" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/run.txt", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "byteLength": 4, - "content": "base", - "truncated": false - } - } - } - }, - "54a6055a16b5": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "status": "saved" - } - }, - "5beb3ae90517": { - "name": "files.readTerminalArtifact#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.readTerminalArtifact\",\"params\":{\"worktree\":\"id:workspace-1\",\"absolutePath\":\"/logs/run.txt\",\"grantId\":\"grant-1\"}}" - }, - "74f3d3f1e1a0": { - "name": "files.writeTerminalArtifact#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"files.writeTerminalArtifact\",\"params\":{\"worktree\":\"id:workspace-1\",\"absolutePath\":\"/logs/run.txt\",\"grantId\":\"grant-1\",\"content\":\"next\"}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "935100df69e4": { - "saved": "unsaved" - }, - "b3f873eb7d0c": { - "saved": { - "status": "saved" - } - }, - "cce1b55470fd": { - "name": "files.writeTerminalArtifact#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "files.writeTerminalArtifact" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/run.txt", - "content": "next", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "d9e395f8cbf2": { - "name": "files.readTerminalArtifact#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.readTerminalArtifact" - }, - { - "name": "params", - "value": { - "absolutePath": "/logs/run.txt", - "grantId": "grant-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - } - }, - "recording": { - "scenario": "files-save-verified", - "checkpoints": [ - { - "id": "verify-pending", - "observation": { - "sender": ["d9e395f8cbf2"], - "payloads": ["5beb3ae90517"], - "settlements": { - "save": "9270aeb7d9c6" - }, - "state": "935100df69e4", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["24ffb7059792", "cce1b55470fd"], - "payloads": ["5beb3ae90517", "74f3d3f1e1a0"], - "settlements": { - "save": "54a6055a16b5" - }, - "state": "b3f873eb7d0c", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/files-tab-doc-shapes.json b/mobile/rpc-foundation/goldens/files-tab-doc-shapes.json deleted file mode 100644 index de9da6f85b4..00000000000 --- a/mobile/rpc-foundation/goldens/files-tab-doc-shapes.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "files.tab-doc", - "family": "files.tab-doc", - "namedDeltas": [], - "values": { - "096b0c48dd10": { - "name": "git.diff#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "docs/readme.md", - "staged": true, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "kind": "text", - "modifiedContent": "b\n", - "originalContent": "a\n" - } - } - } - }, - "1cf4496bc8c0": { - "name": "files.read#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.read" - }, - { - "name": "params", - "value": { - "relativePath": "docs/readme.md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "byteLength": 8, - "content": "# readme", - "truncated": false - } - } - } - }, - "1f1a0d8f6723": { - "name": "files.readPreview#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"files.readPreview\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/logo.png\"}}" - }, - "8423ff93fda2": { - "name": "files.read#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.read\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/readme.md\"}}" - }, - "96b863d005b1": { - "name": "files.readPreview#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "files.readPreview" - }, - { - "name": "params", - "value": { - "relativePath": "docs/logo.png", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "content": "aGk=", - "isImage": true, - "mimeType": "image/png" - } - } - } - }, - "b5c68b76c498": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "byteLength": 8, - "content": "# readme", - "kind": "file", - "status": "ready", - "truncated": false - } - }, - "ca069263339b": { - "name": "git.diff#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:workspace-1\",\"filePath\":\"docs/readme.md\",\"staged\":true}}" - }, - "ed33ecdb4e8e": { - "diff": { - "kind": "diff", - "lines": [ - { - "kind": "delete", - "oldLineNumber": 1, - "text": "a" - }, - { - "kind": "add", - "newLineNumber": 1, - "text": "b" - } - ], - "status": "ready", - "truncated": false - }, - "image": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - }, - "text": { - "byteLength": 8, - "content": "# readme", - "kind": "file", - "status": "ready", - "truncated": false - } - }, - "eee847a9d90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "dataUri": "data:image/png;base64,aGk=", - "kind": "image", - "status": "ready" - } - }, - "ffe1c534d459": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "diff", - "lines": [ - { - "kind": "delete", - "oldLineNumber": 1, - "text": "a" - }, - { - "kind": "add", - "newLineNumber": 1, - "text": "b" - } - ], - "status": "ready", - "truncated": false - } - } - }, - "recording": { - "scenario": "files-tab-doc-shapes", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["1cf4496bc8c0", "96b863d005b1", "096b0c48dd10"], - "payloads": ["8423ff93fda2", "1f1a0d8f6723", "ca069263339b"], - "settlements": { - "text": "b5c68b76c498", - "image": "eee847a9d90d", - "diff": "ffe1c534d459" - }, - "state": "ed33ecdb4e8e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/host-view-settings-sync.json b/mobile/rpc-foundation/goldens/host-view-settings-sync.json deleted file mode 100644 index a898a5bae94..00000000000 --- a/mobile/rpc-foundation/goldens/host-view-settings-sync.json +++ /dev/null @@ -1,506 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "host.view-settings", - "family": "host.view-settings", - "namedDeltas": [], - "values": { - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "424e4d52d6fa": { - "view": { - "agentActivityDisplayMode": "compact", - "collapsedGroups": [], - "compactWorktreeCards": true, - "filters": { - "alwaysShowDefaultBranchWorkspace": true, - "filterRepoIds": [], - "hideAutomationGeneratedWorkspaces": false, - "hideCliCreatedWorkspaces": false, - "hideDefaultBranchWorkspace": false, - "hideDetachedHeadWorkspaces": false, - "hideSleepingWorkspaces": true, - "hideWorkspacesFromOtherDevices": false, - "visibleHostIds": { - "$rpc": "null" - } - }, - "groupBy": "repo", - "newCardStyle": false, - "projectOrderBy": { - "$rpc": "null" - }, - "sharesOtherClientFilter": false, - "sortBy": "name", - "workspaceStatuses": [ - { - "color": "neutral", - "icon": "circle", - "id": "todo", - "label": "Todo" - }, - { - "color": "conductor-progress", - "icon": "conductor-progress", - "id": "in-progress", - "label": "In progress" - }, - { - "color": "conductor-review", - "icon": "conductor-review", - "id": "in-review", - "label": "In review" - }, - { - "color": "conductor-done", - "icon": "conductor-done", - "id": "completed", - "label": "Done" - } - ], - "worktreeCardProperties": [ - "status", - "unread", - "issue", - "linear-issue", - "jira-issue", - "pr", - "automation", - "cli", - "comment", - "ports", - "inline-agents", - "host" - ] - } - }, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "651e8014c9ff": { - "name": "ui.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ui": { - "groupBy": "repo", - "hideSleepingWorkspaces": true, - "sortBy": "name" - } - } - } - } - }, - "6bab186637b0": { - "name": "showPinnedInGroups", - "ordinal": 5, - "value": false - }, - "8369a6f35fda": { - "name": "view", - "ordinal": 6, - "value": { - "agentActivityDisplayMode": "compact", - "collapsedGroups": [], - "compactWorktreeCards": true, - "filters": { - "alwaysShowDefaultBranchWorkspace": true, - "filterRepoIds": [], - "hideAutomationGeneratedWorkspaces": false, - "hideCliCreatedWorkspaces": false, - "hideDefaultBranchWorkspace": false, - "hideDetachedHeadWorkspaces": false, - "hideSleepingWorkspaces": true, - "hideWorkspacesFromOtherDevices": false, - "visibleHostIds": { - "$rpc": "null" - } - }, - "groupBy": "repo", - "newCardStyle": false, - "projectOrderBy": { - "$rpc": "null" - }, - "sharesOtherClientFilter": false, - "sortBy": "name", - "workspaceStatuses": [ - { - "color": "neutral", - "icon": "circle", - "id": "todo", - "label": "Todo" - }, - { - "color": "conductor-progress", - "icon": "conductor-progress", - "id": "in-progress", - "label": "In progress" - }, - { - "color": "conductor-review", - "icon": "conductor-review", - "id": "in-review", - "label": "In review" - }, - { - "color": "conductor-done", - "icon": "conductor-done", - "id": "completed", - "label": "Done" - } - ], - "worktreeCardProperties": [ - "status", - "unread", - "issue", - "linear-issue", - "jira-issue", - "pr", - "automation", - "cli", - "comment", - "ports", - "inline-agents", - "host" - ] - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "985caf5772e9": { - "name": "ui.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c49dcad120d2": { - "name": "view", - "ordinal": 7, - "value": { - "agentActivityDisplayMode": "compact", - "collapsedGroups": [], - "compactWorktreeCards": true, - "filters": { - "alwaysShowDefaultBranchWorkspace": true, - "filterRepoIds": [], - "hideAutomationGeneratedWorkspaces": false, - "hideCliCreatedWorkspaces": false, - "hideDefaultBranchWorkspace": false, - "hideDetachedHeadWorkspaces": false, - "hideSleepingWorkspaces": true, - "hideWorkspacesFromOtherDevices": false, - "visibleHostIds": { - "$rpc": "null" - } - }, - "groupBy": "repo", - "newCardStyle": false, - "projectOrderBy": { - "$rpc": "null" - }, - "sharesOtherClientFilter": false, - "sortBy": "name", - "workspaceStatuses": [ - { - "color": "neutral", - "icon": "circle", - "id": "todo", - "label": "Todo" - }, - { - "color": "conductor-progress", - "icon": "conductor-progress", - "id": "in-progress", - "label": "In progress" - }, - { - "color": "conductor-review", - "icon": "conductor-review", - "id": "in-review", - "label": "In review" - }, - { - "color": "conductor-done", - "icon": "conductor-done", - "id": "completed", - "label": "Done" - } - ], - "worktreeCardProperties": [ - "status", - "unread", - "issue", - "linear-issue", - "jira-issue", - "pr", - "automation", - "cli", - "comment", - "ports", - "inline-agents", - "host" - ] - } - }, - "cd9c5de9f2aa": { - "name": "ui.set#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"sortBy\":\"name\"}}" - }, - "dc007face350": { - "view": { - "agentActivityDisplayMode": "compact", - "collapsedGroups": [], - "compactWorktreeCards": false, - "filters": { - "alwaysShowDefaultBranchWorkspace": true, - "filterRepoIds": [], - "hideAutomationGeneratedWorkspaces": false, - "hideCliCreatedWorkspaces": false, - "hideDefaultBranchWorkspace": false, - "hideDetachedHeadWorkspaces": false, - "hideSleepingWorkspaces": false, - "hideWorkspacesFromOtherDevices": false, - "visibleHostIds": { - "$rpc": "null" - } - }, - "groupBy": "repo", - "newCardStyle": false, - "projectOrderBy": { - "$rpc": "null" - }, - "sharesOtherClientFilter": { - "$rpc": "null" - }, - "sortBy": "recent", - "workspaceStatuses": [ - { - "color": "neutral", - "icon": "circle", - "id": "todo", - "label": "Todo" - }, - { - "color": "conductor-progress", - "icon": "conductor-progress", - "id": "in-progress", - "label": "In progress" - }, - { - "color": "conductor-review", - "icon": "conductor-review", - "id": "in-review", - "label": "In review" - }, - { - "color": "conductor-done", - "icon": "conductor-done", - "id": "completed", - "label": "Done" - } - ], - "worktreeCardProperties": [ - "status", - "unread", - "issue", - "linear-issue", - "jira-issue", - "pr", - "automation", - "cli", - "comment", - "ports", - "inline-agents", - "host" - ] - } - }, - "e55533c6e358": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "settings": { - "compactWorktreeCards": true - } - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ec336f23ef91": { - "name": "ui.get#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.get\"}" - }, - "f56221cb03b8": { - "name": "ui.set#1", - "ordinal": 8, - "args": [ - { - "name": "method", - "value": "ui.set" - }, - { - "name": "params", - "value": { - "sortBy": "name" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - } - }, - "recording": { - "scenario": "host-view-settings-sync", - "checkpoints": [ - { - "id": "ui-pending", - "observation": { - "sender": ["985caf5772e9", "51d4cb56be85"], - "payloads": ["ec336f23ef91", "1c2564f1daca"], - "settlements": { - "mount": "eb79a9b3682a", - "sync": "9270aeb7d9c6" - }, - "state": "dc007face350", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["651e8014c9ff", "e55533c6e358", "f56221cb03b8"], - "payloads": ["ec336f23ef91", "1c2564f1daca", "cd9c5de9f2aa"], - "settlements": { - "mount": "eb79a9b3682a", - "sync": "eb79a9b3682a", - "sort": "eb79a9b3682a" - }, - "state": "424e4d52d6fa", - "effects": ["6bab186637b0", "8369a6f35fda", "c49dcad120d2"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/host-worktree-actions-pin-open-delete.json b/mobile/rpc-foundation/goldens/host-worktree-actions-pin-open-delete.json deleted file mode 100644 index b59bd47d3b0..00000000000 --- a/mobile/rpc-foundation/goldens/host-worktree-actions-pin-open-delete.json +++ /dev/null @@ -1,468 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "host.worktree-actions", - "family": "host.worktree-actions", - "namedDeltas": [], - "values": { - "047f5e4dfc2b": { - "name": "optimisticActiveWorktreeIdentity", - "ordinal": 6, - "value": "|wt-1" - }, - "04adcc2c4239": { - "name": "lastKnownWorktrees", - "ordinal": 10, - "value": [] - }, - "0f6c13387a7c": { - "name": "repo.hooks#1", - "ordinal": 12, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "13f823f8ea62": { - "name": "worktree.rm#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "worktree.rm" - }, - { - "name": "params", - "value": { - "force": true, - "runHooks": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 180000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "14ce9f03298e": { - "name": "pinnedIds", - "ordinal": 3, - "value": ["wt-1"] - }, - "1c5bb0f1882e": { - "name": "worktree.set#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "isPinned": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "40f6e6f5e2cd": { - "name": "worktree.activate#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "47602c8e53e9": { - "name": "worktree.activate#1", - "ordinal": 8, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.activate\",\"params\":{\"worktree\":\"id:wt-1\",\"notifyClients\":false,\"navigation\":\"caller\"}}" - }, - "4eb480a35154": { - "actionError": "", - "archiveHookFailure": { - "$rpc": "null" - }, - "archiveTrustPrompt": { - "$rpc": "null" - }, - "confirmRemoveHost": false, - "desktopRepos": [ - { - "id": "repo-1" - } - ], - "lastKnownWorktrees": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": true, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ], - "optimisticActiveWorktreeIdentity": { - "$rpc": "null" - }, - "pinnedIds": ["wt-1"], - "serverWorkspaces": { - "hosts": [], - "worktrees": [] - }, - "worktrees": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": true, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ] - }, - "7e51cde4c88e": { - "name": "repo.hooks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "hasHooksFile": false, - "hooks": { - "$rpc": "null" - }, - "setupConfig": { - "$rpc": "null" - }, - "setupRunPolicy": "run-by-default", - "source": { - "$rpc": "null" - } - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "989153283864": { - "name": "worktrees", - "ordinal": 9, - "value": [] - }, - "9a2d39ba928f": { - "name": "worktree.set#1", - "ordinal": 5, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.set\",\"params\":{\"worktree\":\"id:wt-1\",\"isPinned\":true}}" - }, - "a02f744ea7c4": { - "name": "lastKnownWorktrees", - "ordinal": 14, - "value": [] - }, - "ab935dad4cfb": { - "name": "worktree.set#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "isPinned": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c43b880ad7ff": { - "name": "worktree.rm#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "worktree.rm" - }, - { - "name": "params", - "value": { - "force": true, - "runHooks": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 180000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "c6732725aaa2": { - "name": "worktrees", - "ordinal": 13, - "value": [] - }, - "ca91c555e48e": { - "name": "worktrees", - "ordinal": 1, - "value": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": true, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ] - }, - "cb818cac752a": { - "actionError": "", - "archiveHookFailure": { - "$rpc": "null" - }, - "archiveTrustPrompt": { - "$rpc": "null" - }, - "confirmRemoveHost": false, - "desktopRepos": [ - { - "id": "repo-1" - } - ], - "lastKnownWorktrees": [], - "optimisticActiveWorktreeIdentity": "|wt-1", - "pinnedIds": ["wt-1"], - "serverWorkspaces": { - "hosts": [], - "worktrees": [] - }, - "worktrees": [] - }, - "da6c9e1a507d": { - "name": "lastKnownWorktrees", - "ordinal": 2, - "value": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": true, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ] - }, - "e11327b1da17": { - "name": "worktree.rm#1", - "ordinal": 16, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.rm\",\"params\":{\"worktree\":\"id:wt-1\",\"force\":true,\"runHooks\":false}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "host-worktree-actions-pin-open-delete", - "checkpoints": [ - { - "id": "pin-optimistic", - "observation": { - "sender": ["ab935dad4cfb"], - "payloads": ["9a2d39ba928f"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle-pin": "eb79a9b3682a" - }, - "state": "4eb480a35154", - "effects": ["ca91c555e48e", "da6c9e1a507d", "14ce9f03298e"] - } - }, - { - "id": "delete-optimistic", - "observation": { - "sender": ["1c5bb0f1882e", "40f6e6f5e2cd", "7e51cde4c88e", "13f823f8ea62"], - "payloads": ["9a2d39ba928f", "47602c8e53e9", "0f6c13387a7c", "e11327b1da17"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle-pin": "eb79a9b3682a", - "open-session": "eb79a9b3682a", - "delete": "9270aeb7d9c6" - }, - "state": "cb818cac752a", - "effects": [ - "ca91c555e48e", - "da6c9e1a507d", - "14ce9f03298e", - "047f5e4dfc2b", - "989153283864", - "04adcc2c4239", - "c6732725aaa2", - "a02f744ea7c4" - ] - } - }, - { - "id": "settled", - "observation": { - "sender": ["1c5bb0f1882e", "40f6e6f5e2cd", "7e51cde4c88e", "c43b880ad7ff"], - "payloads": ["9a2d39ba928f", "47602c8e53e9", "0f6c13387a7c", "e11327b1da17"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle-pin": "eb79a9b3682a", - "open-session": "eb79a9b3682a", - "delete": "eb79a9b3682a" - }, - "state": "cb818cac752a", - "effects": [ - "ca91c555e48e", - "da6c9e1a507d", - "14ce9f03298e", - "047f5e4dfc2b", - "989153283864", - "04adcc2c4239", - "c6732725aaa2", - "a02f744ea7c4" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/host-worktree-delete-refused.json b/mobile/rpc-foundation/goldens/host-worktree-delete-refused.json deleted file mode 100644 index a07eae9b0cf..00000000000 --- a/mobile/rpc-foundation/goldens/host-worktree-delete-refused.json +++ /dev/null @@ -1,328 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "host.worktree-actions", - "family": "host.worktree-actions", - "namedDeltas": [], - "values": { - "18996856522a": { - "name": "lastKnownWorktrees", - "ordinal": 6, - "value": [] - }, - "369bd9771b51": { - "name": "lastKnownWorktrees", - "ordinal": 10, - "value": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": false, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ] - }, - "464cf0ce3697": { - "name": "repo.hooks#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "archiveTrust": { - "$rpc": "null" - }, - "hasHooksFile": false, - "hooks": { - "$rpc": "null" - }, - "setupConfig": { - "$rpc": "null" - }, - "setupRunPolicy": "run-by-default", - "source": { - "$rpc": "null" - } - } - } - } - }, - "569eb8f7aee5": { - "name": "worktree.rm#1", - "ordinal": 8, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.rm\",\"params\":{\"worktree\":\"id:wt-1\",\"force\":true,\"runHooks\":true}}" - }, - "7a68c6ea2c44": { - "name": "lastKnownWorktrees", - "ordinal": 2, - "value": [] - }, - "83e3e0d1a554": { - "name": "worktrees", - "ordinal": 5, - "value": [] - }, - "8f27c443230b": { - "name": "worktrees", - "ordinal": 1, - "value": [] - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "960e985c770d": { - "name": "worktrees", - "ordinal": 9, - "value": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": false, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ] - }, - "b8a1fe46c55b": { - "actionError": "", - "archiveHookFailure": { - "$rpc": "null" - }, - "archiveTrustPrompt": { - "$rpc": "null" - }, - "confirmRemoveHost": false, - "desktopRepos": [ - { - "id": "repo-1" - } - ], - "lastKnownWorktrees": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": false, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ], - "optimisticActiveWorktreeIdentity": { - "$rpc": "null" - }, - "pinnedIds": [], - "serverWorkspaces": { - "hosts": [], - "worktrees": [] - }, - "worktrees": [ - { - "branch": "feature/pin", - "displayName": "marlin", - "hasAttachedPty": false, - "isPinned": false, - "linkedPR": { - "$rpc": "null" - }, - "liveTerminalCount": 0, - "path": "/repos/marlin/wt-1", - "preview": "", - "repo": "marlin", - "repoId": "repo-1", - "unread": false, - "worktreeId": "wt-1" - } - ] - }, - "ba1352a3c9a2": { - "name": "worktree.rm#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "worktree.rm" - }, - { - "name": "params", - "value": { - "force": true, - "runHooks": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 300000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "bbc069d0d206": { - "actionError": "", - "archiveHookFailure": { - "$rpc": "null" - }, - "archiveTrustPrompt": { - "$rpc": "null" - }, - "confirmRemoveHost": false, - "desktopRepos": [ - { - "id": "repo-1" - } - ], - "lastKnownWorktrees": [], - "optimisticActiveWorktreeIdentity": { - "$rpc": "null" - }, - "pinnedIds": [], - "serverWorkspaces": { - "hosts": [], - "worktrees": [] - }, - "worktrees": [] - }, - "e0a8dfe3ec89": { - "name": "worktree.rm#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "worktree.rm" - }, - { - "name": "params", - "value": { - "force": true, - "runHooks": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 300000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "worktree_busy", - "message": "Worktree is busy" - }, - "id": "frame-2", - "ok": false - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f95f2f51091a": { - "name": "repo.hooks#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" - } - }, - "recording": { - "scenario": "host-worktree-delete-refused", - "checkpoints": [ - { - "id": "delete-optimistic", - "observation": { - "sender": ["464cf0ce3697", "ba1352a3c9a2"], - "payloads": ["f95f2f51091a", "569eb8f7aee5"], - "settlements": { - "mount": "eb79a9b3682a", - "delete": "9270aeb7d9c6" - }, - "state": "bbc069d0d206", - "effects": ["8f27c443230b", "7a68c6ea2c44", "83e3e0d1a554", "18996856522a"] - } - }, - { - "id": "restored", - "observation": { - "sender": ["464cf0ce3697", "e0a8dfe3ec89"], - "payloads": ["f95f2f51091a", "569eb8f7aee5"], - "settlements": { - "mount": "eb79a9b3682a", - "delete": "eb79a9b3682a" - }, - "state": "b8a1fe46c55b", - "effects": [ - "8f27c443230b", - "7a68c6ea2c44", - "83e3e0d1a554", - "18996856522a", - "960e985c770d", - "369bd9771b51" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/linear-select-workspace.json b/mobile/rpc-foundation/goldens/linear-select-workspace.json deleted file mode 100644 index ad7897dd382..00000000000 --- a/mobile/rpc-foundation/goldens/linear-select-workspace.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "linear.select-workspace-picker", - "family": "linear.select-workspace-picker", - "namedDeltas": [], - "values": { - "2a8d45397a3b": { - "name": "linear.selectWorkspace#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "linear.selectWorkspace" - }, - { - "name": "params", - "value": { - "workspaceId": "workspace-b" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "36c0bdbc5f9b": { - "contextLoads": 0, - "error": "", - "selectedWorkspaceId": "workspace-b", - "teamCount": 0 - }, - "5100209812a4": { - "name": "linear.context-reloaded", - "ordinal": 3, - "value": { - "contextLoads": 1 - } - }, - "87e48df4867a": { - "name": "linear.selectWorkspace#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.selectWorkspace\",\"params\":{\"workspaceId\":\"workspace-b\"}}" - }, - "d2ade472a8ba": { - "contextLoads": 1, - "error": "", - "selectedWorkspaceId": "workspace-b", - "teamCount": 0 - }, - "dc6af816d203": { - "name": "linear.selectWorkspace#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "linear.selectWorkspace" - }, - { - "name": "params", - "value": { - "workspaceId": "workspace-b" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "linear-select-workspace", - "checkpoints": [ - { - "id": "selected", - "observation": { - "sender": ["dc6af816d203"], - "payloads": ["87e48df4867a"], - "settlements": { - "select-b": "eb79a9b3682a" - }, - "state": "36c0bdbc5f9b", - "effects": [] - } - }, - { - "id": "switched", - "observation": { - "sender": ["2a8d45397a3b"], - "payloads": ["87e48df4867a"], - "settlements": { - "select-b": "eb79a9b3682a" - }, - "state": "d2ade472a8ba", - "effects": ["5100209812a4"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/mobile-web-bundle-manifest-read.json b/mobile/rpc-foundation/goldens/mobile-web-bundle-manifest-read.json deleted file mode 100644 index 40a4769d629..00000000000 --- a/mobile/rpc-foundation/goldens/mobile-web-bundle-manifest-read.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "mobileWeb.bundle-manifest", - "family": "mobileWeb.bundle-manifest", - "namedDeltas": [], - "values": { - "23871e324a00": { - "name": "mobileWeb.bundle.manifest#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "mobileWeb.bundle.manifest" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "$rpc": "undefined" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "chunkBytes": 16, - "manifest": { - "assets": [ - { - "byteLength": 11, - "contentType": "text/javascript; charset=utf-8", - "path": "assets/app.js", - "sha256": "e99170780c392398db81fbb3dcaebc1a2c8264d4d8a9cd5932887e9c7206dc3d" - }, - { - "byteLength": 26, - "contentType": "text/html; charset=utf-8", - "path": "index.html", - "sha256": "483f915496f213c851665840f49b69e05b7a6bf70ec9d6939a831b15d298f31e" - } - ], - "buildId": "973c008f6baf56072d8d3d41f451e005257b59026401473543ce96e81c5aa177", - "desktopVersion": "1.4.201", - "entrypoint": "index.html", - "minCompatibleRuntimeProtocolVersion": 2, - "runtimeProtocolVersion": 2, - "schemaVersion": 1, - "totalBytes": 37 - } - } - } - } - }, - "775bfa42070b": { - "name": "mobileWeb.bundle.manifest#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"mobileWeb.bundle.manifest\",\"params\":null}" - }, - "9ca9b2d0fc07": { - "outcome": { - "buildId": "973c008f6baf56072d8d3d41f451e005257b59026401473543ce96e81c5aa177", - "chunkBytes": 16, - "entrypoint": "index.html", - "paths": ["assets/app.js", "index.html"] - } - }, - "9d87b3b6bd74": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "chunkBytes": 16, - "manifest": { - "assets": [ - { - "byteLength": 11, - "contentType": "text/javascript; charset=utf-8", - "path": "assets/app.js", - "sha256": "e99170780c392398db81fbb3dcaebc1a2c8264d4d8a9cd5932887e9c7206dc3d" - }, - { - "byteLength": 26, - "contentType": "text/html; charset=utf-8", - "path": "index.html", - "sha256": "483f915496f213c851665840f49b69e05b7a6bf70ec9d6939a831b15d298f31e" - } - ], - "buildId": "973c008f6baf56072d8d3d41f451e005257b59026401473543ce96e81c5aa177", - "desktopVersion": "1.4.201", - "entrypoint": "index.html", - "minCompatibleRuntimeProtocolVersion": 2, - "runtimeProtocolVersion": 2, - "schemaVersion": 1, - "totalBytes": 37 - } - } - } - }, - "recording": { - "scenario": "mobile-web-bundle-manifest-read", - "checkpoints": [ - { - "id": "manifest-read", - "observation": { - "sender": ["23871e324a00"], - "payloads": ["775bfa42070b"], - "settlements": { - "read": "9d87b3b6bd74" - }, - "state": "9ca9b2d0fc07", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/mobile-web-bundle-unavailable.json b/mobile/rpc-foundation/goldens/mobile-web-bundle-unavailable.json deleted file mode 100644 index 6c5510181dc..00000000000 --- a/mobile/rpc-foundation/goldens/mobile-web-bundle-unavailable.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "mobileWeb.bundle-fetch", - "family": "mobileWeb.bundle-fetch", - "namedDeltas": [], - "values": { - "6858fdcae414": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "invalid_argument: mobile_web_bundle_unavailable", - "isRpcDeliveryUnknown": false - } - }, - "775bfa42070b": { - "name": "mobileWeb.bundle.manifest#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"mobileWeb.bundle.manifest\",\"params\":null}" - }, - "8ea0c6a90560": { - "assets": { - "$rpc": "null" - }, - "outcome": "refused: mobile_web_bundle_unavailable" - }, - "fe8605eb5d5d": { - "name": "mobileWeb.bundle.manifest#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "mobileWeb.bundle.manifest" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "$rpc": "undefined" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "invalid_argument", - "message": "mobile_web_bundle_unavailable" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "mobile-web-bundle-unavailable", - "checkpoints": [ - { - "id": "bundle-unavailable", - "observation": { - "sender": ["fe8605eb5d5d"], - "payloads": ["775bfa42070b"], - "settlements": { - "fetch": "6858fdcae414" - }, - "state": "8ea0c6a90560", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json b/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json deleted file mode 100644 index 51c6db4ae6e..00000000000 --- a/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.commit-message", - "family": "git.commit-message-ai", - "namedDeltas": [], - "values": { - "25b63dbb4c58": { - "name": "git.cancelGenerateCommitMessage#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.cancelGenerateCommitMessage\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "a947768bc0ed": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "transport failure", - "isRpcDeliveryUnknown": true - } - }, - "adb40821f3e2": { - "generated": "ungenerated" - }, - "d7e067c96156": { - "name": "git.cancelGenerateCommitMessage#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.cancelGenerateCommitMessage" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "transport failure", - "isRpcDeliveryUnknown": true - } - } - } - }, - "recording": { - "scenario": "sc-commit-message-cancel-rejected", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["d7e067c96156"], - "payloads": ["25b63dbb4c58"], - "settlements": { - "cancel": "a947768bc0ed" - }, - "state": "adb40821f3e2", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-commit-message-generated.json b/mobile/rpc-foundation/goldens/sc-commit-message-generated.json deleted file mode 100644 index 0ce50bb2681..00000000000 --- a/mobile/rpc-foundation/goldens/sc-commit-message-generated.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.commit-message", - "family": "git.commit-message-ai", - "namedDeltas": [], - "values": { - "1290c04bc26c": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "message": "feat: recorded", - "success": true - } - }, - "3ef8a5f65bc8": { - "generated": { - "message": "feat: recorded", - "success": true - } - }, - "5be6b62a713f": { - "name": "git.generateCommitMessage#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.generateCommitMessage\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "7f1f9740a3b3": { - "name": "git.generateCommitMessage#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.generateCommitMessage" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "adb40821f3e2": { - "generated": "ungenerated" - }, - "b4da9398fc8e": { - "name": "git.generateCommitMessage#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.generateCommitMessage" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "message": "feat: recorded", - "success": true - } - } - } - } - }, - "recording": { - "scenario": "sc-commit-message-generated", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["7f1f9740a3b3"], - "payloads": ["5be6b62a713f"], - "settlements": { - "generate": "9270aeb7d9c6" - }, - "state": "adb40821f3e2", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["b4da9398fc8e"], - "payloads": ["5be6b62a713f"], - "settlements": { - "generate": "1290c04bc26c" - }, - "state": "3ef8a5f65bc8", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-history-loaded.json b/mobile/rpc-foundation/goldens/sc-history-loaded.json deleted file mode 100644 index 3ecbce4e6f7..00000000000 --- a/mobile/rpc-foundation/goldens/sc-history-loaded.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.git-history", - "family": "git.history-read", - "namedDeltas": [], - "values": { - "0e92a08f8380": { - "name": "git.history#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.history\",\"params\":{\"worktree\":\"id:repo42::/p\",\"limit\":50}}" - }, - "437d7f38d098": { - "rows": [ - { - "author": "dev", - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "parentId": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "relativeTime": "1h", - "shortId": "aaaaaaa", - "subject": "first" - }, - { - "author": "", - "id": "cccccccccccccccccccccccccccccccccccccccc", - "parentId": { - "$rpc": "null" - }, - "relativeTime": "", - "shortId": "ccccccc", - "subject": "(no commit message)" - } - ] - }, - "5d7a655deafc": { - "name": "git.history#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.history" - }, - { - "name": "params", - "value": { - "limit": 50, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "7d520ecb92ad": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "author": "dev", - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "parentId": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "relativeTime": "1h", - "shortId": "aaaaaaa", - "subject": "first" - }, - { - "author": "", - "id": "cccccccccccccccccccccccccccccccccccccccc", - "parentId": { - "$rpc": "null" - }, - "relativeTime": "", - "shortId": "ccccccc", - "subject": "(no commit message)" - } - ] - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "9631f908d769": { - "name": "git.history#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.history" - }, - { - "name": "params", - "value": { - "limit": 50, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "items": [ - { - "author": "dev", - "displayId": "aaaaaaa", - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "parentIds": ["bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"], - "subject": "first", - "timestamp": 1767222000000 - }, - { - "id": "cccccccccccccccccccccccccccccccccccccccc", - "parentIds": [], - "subject": "", - "timestamp": { - "$rpc": "null" - } - } - ] - } - } - } - }, - "ef169a494b41": { - "rows": "unloaded" - } - }, - "recording": { - "scenario": "sc-history-loaded", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["5d7a655deafc"], - "payloads": ["0e92a08f8380"], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "ef169a494b41", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["9631f908d769"], - "payloads": ["0e92a08f8380"], - "settlements": { - "load": "7d520ecb92ad" - }, - "state": "437d7f38d098", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-pr-link-set.json b/mobile/rpc-foundation/goldens/sc-pr-link-set.json deleted file mode 100644 index 4f5a1f0bf3c..00000000000 --- a/mobile/rpc-foundation/goldens/sc-pr-link-set.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.pr-link", - "family": "worktree.review-link", - "namedDeltas": [], - "values": { - "1852c739af4f": { - "linkedPR": "unread", - "outcome": { - "ok": true - } - }, - "41bdce9de379": { - "linkedPR": "unread", - "outcome": "unlinked" - }, - "4b458696422e": { - "name": "worktree.set#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.set\",\"params\":{\"worktree\":\"id:repo42::/p\",\"linkedPR\":12}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "f50799b307b6": { - "name": "worktree.set#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "linkedPR": 12, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "fbc51b3438c8": { - "name": "worktree.set#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "linkedPR": 12, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - } - }, - "recording": { - "scenario": "sc-pr-link-set", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["f50799b307b6"], - "payloads": ["4b458696422e"], - "settlements": { - "link": "9270aeb7d9c6" - }, - "state": "41bdce9de379", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["fbc51b3438c8"], - "payloads": ["4b458696422e"], - "settlements": { - "link": "fbc958e4d46e" - }, - "state": "1852c739af4f", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json deleted file mode 100644 index 555373f888f..00000000000 --- a/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json +++ /dev/null @@ -1,909 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.resume-metadata", - "family": "settings.resume-metadata", - "namedDeltas": [], - "values": { - "03251bdb225e": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - } - } - } - }, - "1bfeba989b20": { - "name": "worktree.ps#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "20ff2d8b6392": { - "name": "folderWorkspace.list#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"folderWorkspace.list\"}" - }, - "3c70da5d6d8e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "folderWorkspaces": [], - "projectGroups": [], - "repos": [], - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - }, - "worktrees": [] - } - }, - "44136fa355b3": {}, - "4b3691552a21": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [] - } - } - } - }, - "54e61c6035f4": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "5ade9b5872e1": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "5f7f820e4ca2": { - "name": "projectGroup.list#1", - "ordinal": 8, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"projectGroup.list\"}" - }, - "6af91c1da122": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "worktrees": [] - } - } - } - }, - "6d1553471555": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "77912b6e2cc6": { - "name": "folderWorkspace.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "folderWorkspace.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "folderWorkspaces": [] - } - } - } - }, - "82132b79b8f7": { - "name": "settings.get#1", - "ordinal": 9, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "8805a8a4242e": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "94630b81cabd": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "worktree.ps#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "ad9181fc35f4": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: worktree.ps", - "isRpcDeliveryUnknown": true - } - } - }, - "b5f966ccb50c": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 30000, - "value": { - "folderWorkspaces": [], - "projectGroups": [], - "repos": [], - "settings": { - "$rpc": "null" - }, - "worktrees": { - "$rpc": "null" - } - } - }, - "c6a65a3fe7ef": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "cabca99619ed": { - "name": "repo.list#1", - "ordinal": 6, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "d1d9a1ad6fcf": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "folderWorkspaces": [], - "projectGroups": [], - "repos": [], - "settings": { - "$rpc": "null" - }, - "worktrees": { - "$rpc": "null" - } - } - }, - "d3a239332600": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "eb0dfe06bed8": { - "name": "projectGroup.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "projectGroup.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "groups": [] - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ee1f972879d9": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - } - }, - "ef738f88d4c0": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - } - }, - "recording": { - "scenario": "schedules-settings-resume-metadata-fulfilled", - "checkpoints": [ - { - "id": "settings-resume-metadata-fulfilled.forward:sibling-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6d1553471555" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.forward:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6af91c1da122" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "3c70da5d6d8e" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.reverse:sibling-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "8805a8a4242e", - "6af91c1da122" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.reverse:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6af91c1da122" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "3c70da5d6d8e" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.both-reject-forward:sibling-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "54e61c6035f4", - "6d1553471555" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.both-reject-forward:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "54e61c6035f4", - "94630b81cabd" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "d1d9a1ad6fcf" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.both-reject-reverse:sibling-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "8805a8a4242e", - "94630b81cabd" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.both-reject-reverse:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "54e61c6035f4", - "94630b81cabd" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "d1d9a1ad6fcf" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.reject-peer-pending:sibling-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "54e61c6035f4", - "6d1553471555" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.reject-peer-pending:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "54e61c6035f4", - "6d1553471555" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.timeout:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "ee1f972879d9", - "ad9181fc35f4" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "b5f966ccb50c" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.disconnect:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "c6a65a3fe7ef", - "5ade9b5872e1" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "d1d9a1ad6fcf", - "disconnect": "eb79a9b3682a" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-resume-metadata-fulfilled.client-cutover:settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "d3a239332600", - "ef738f88d4c0" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "d1d9a1ad6fcf", - "cutover": "eb79a9b3682a" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json b/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json deleted file mode 100644 index 5e9886a0db9..00000000000 --- a/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.bot-overrides", - "family": "settings.bot-overrides", - "namedDeltas": [], - "values": { - "4f53cda18c2b": [], - "b45a49bc8209": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-1", - "ok": false - } - } - }, - "c8c77ac17e0a": { - "name": "settings.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "e3973bb12da1": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "settings-bot-overrides-refused", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["e3973bb12da1"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["b45a49bc8209"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json b/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json deleted file mode 100644 index eae00e2ae56..00000000000 --- a/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.bot-overrides", - "family": "settings.bot-overrides", - "namedDeltas": [], - "values": { - "32b35430e320": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - } - }, - "4f53cda18c2b": [], - "c8c77ac17e0a": { - "name": "settings.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "e3973bb12da1": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "settings-bot-overrides-transport-error", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["e3973bb12da1"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["32b35430e320"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-new-tab-refused.json b/mobile/rpc-foundation/goldens/settings-new-tab-refused.json deleted file mode 100644 index db0553d122d..00000000000 --- a/mobile/rpc-foundation/goldens/settings-new-tab-refused.json +++ /dev/null @@ -1,225 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.new-tab-agents", - "family": "settings-agent-read", - "namedDeltas": [], - "values": { - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "35f85fe3b71c": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "44136fa355b3": {}, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "59575239faa8": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-2", - "ok": false - } - } - }, - "7023dde78391": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "connectionId": "ssh-1", - "id": "repo-1" - } - ] - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "95a3d59bc187": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": ["codex", "claude"] - } - } - }, - "a05ac6b15c2d": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "b5553341aa32": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings refused", - "isRpcDeliveryUnknown": false - } - }, - "e0eef7c9fafe": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - } - }, - "recording": { - "scenario": "settings-new-tab-refused", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["35f85fe3b71c", "51d4cb56be85"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca"], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["7023dde78391", "59575239faa8", "95a3d59bc187"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "b5553341aa32" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json b/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json deleted file mode 100644 index 70858dc1625..00000000000 --- a/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.new-tab-agents", - "family": "settings-agent-read", - "namedDeltas": [], - "values": { - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "35f85fe3b71c": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "44136fa355b3": {}, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "618234017ab2": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - }, - "7023dde78391": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "connectionId": "ssh-1", - "id": "repo-1" - } - ] - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "95a3d59bc187": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": ["codex", "claude"] - } - } - }, - "a05ac6b15c2d": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "e0eef7c9fafe": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "f4c218ff736f": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - } - } - }, - "recording": { - "scenario": "settings-new-tab-transport-error", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["35f85fe3b71c", "51d4cb56be85"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca"], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["7023dde78391", "f4c218ff736f", "95a3d59bc187"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "618234017ab2" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json deleted file mode 100644 index e024407d2c9..00000000000 --- a/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json +++ /dev/null @@ -1,771 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.resume-metadata", - "family": "settings.resume-metadata", - "namedDeltas": [], - "values": { - "03251bdb225e": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - } - } - } - }, - "0aed97438698": { - "name": "projectGroup.list#2", - "ordinal": 18, - "json": "{\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"projectGroup.list\"}" - }, - "122459f7e4fa": { - "name": "worktree.ps#2", - "ordinal": 20, - "json": "{\"id\":\"frame-10\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "133e883fa667": { - "name": "folderWorkspace.list#2", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "folderWorkspace.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "15e95e5e31fc": { - "name": "repo.list#2", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "repos": [] - } - } - } - }, - "17fcad0b45c7": { - "name": "folderWorkspace.list#2", - "ordinal": 17, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"folderWorkspace.list\"}" - }, - "1bfeba989b20": { - "name": "worktree.ps#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "20ff2d8b6392": { - "name": "folderWorkspace.list#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"folderWorkspace.list\"}" - }, - "3c70da5d6d8e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "folderWorkspaces": [], - "projectGroups": [], - "repos": [], - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - }, - "worktrees": [] - } - }, - "44136fa355b3": {}, - "4b3691552a21": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [] - } - } - } - }, - "5f7f820e4ca2": { - "name": "projectGroup.list#1", - "ordinal": 8, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"projectGroup.list\"}" - }, - "60227e762a73": { - "name": "settings.get#2", - "ordinal": 19, - "json": "{\"id\":\"frame-9\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "68a28bcc9249": { - "name": "worktree.ps#2", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-10", - "ok": true, - "result": { - "worktrees": [] - } - } - } - }, - "6af91c1da122": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "worktrees": [] - } - } - } - }, - "6d1553471555": { - "name": "worktree.ps#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "6f216e913887": { - "name": "projectGroup.list#2", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "projectGroup.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-8", - "ok": true, - "result": { - "groups": [] - } - } - } - }, - "77912b6e2cc6": { - "name": "folderWorkspace.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "folderWorkspace.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "folderWorkspaces": [] - } - } - } - }, - "7b661312de13": { - "name": "settings.get#2", - "ordinal": 14, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-9", - "ok": false - } - } - }, - "82132b79b8f7": { - "name": "settings.get#1", - "ordinal": 9, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "8805a8a4242e": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "96a4e3ee1ba2": { - "name": "repo.list#2", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "b7a7e6aff6a6": { - "name": "settings.get#2", - "ordinal": 14, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "bef8ec25072d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "folderWorkspaces": [], - "projectGroups": [], - "repos": [], - "settings": { - "$rpc": "null" - }, - "worktrees": [] - } - }, - "c7dd9651931f": { - "name": "repo.list#2", - "ordinal": 16, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "cabca99619ed": { - "name": "repo.list#1", - "ordinal": 6, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "cfe00353a015": { - "name": "projectGroup.list#2", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "projectGroup.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "dcfe88bf02cb": { - "name": "worktree.ps#2", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb0dfe06bed8": { - "name": "projectGroup.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "projectGroup.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "groups": [] - } - } - } - }, - "fae6f14f653f": { - "name": "folderWorkspace.list#2", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "folderWorkspace.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "folderWorkspaces": [] - } - } - } - } - }, - "recording": { - "scenario": "settings-resume-metadata-refuse-after-data", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "8805a8a4242e", - "6d1553471555" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6af91c1da122" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "3c70da5d6d8e" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "data-present", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6af91c1da122" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20" - ], - "settlements": { - "load": "3c70da5d6d8e" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "refresh-pending", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6af91c1da122", - "96a4e3ee1ba2", - "133e883fa667", - "cfe00353a015", - "b7a7e6aff6a6", - "dcfe88bf02cb" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20", - "c7dd9651931f", - "17fcad0b45c7", - "0aed97438698", - "60227e762a73", - "122459f7e4fa" - ], - "settlements": { - "load": "3c70da5d6d8e", - "reload": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "refused-after-data", - "observation": { - "sender": [ - "4b3691552a21", - "77912b6e2cc6", - "eb0dfe06bed8", - "03251bdb225e", - "6af91c1da122", - "15e95e5e31fc", - "fae6f14f653f", - "6f216e913887", - "7b661312de13", - "68a28bcc9249" - ], - "payloads": [ - "cabca99619ed", - "20ff2d8b6392", - "5f7f820e4ca2", - "82132b79b8f7", - "1bfeba989b20", - "c7dd9651931f", - "17fcad0b45c7", - "0aed97438698", - "60227e762a73", - "122459f7e4fa" - ], - "settlements": { - "load": "3c70da5d6d8e", - "reload": "bef8ec25072d" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json b/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json deleted file mode 100644 index d9aff172d4b..00000000000 --- a/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json +++ /dev/null @@ -1,408 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.workspace-context", - "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], - "values": { - "1e7f9a45facb": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "3d249e57942b": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "65e027dec060": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "ui": {} - } - } - } - }, - "7c5e5635081d": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "82132b79b8f7": { - "name": "settings.get#1", - "ordinal": 9, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "83e12a6721ec": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "8566e2463d90": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "903ba5a79900": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "glab": { - "installed": false - } - } - } - } - }, - "9523a5ec7949": { - "providers": ["github", "jira"], - "settings": { - "$rpc": "null" - }, - "trust": {} - }, - "9cf8484d8b20": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "a2fd5d449008": { - "name": "jira.status#1", - "ordinal": 8, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"jira.status\"}" - }, - "ab92af857792": { - "name": "linear.status#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.status\"}" - }, - "b69f454508d6": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "cc61428a1b82": { - "name": "preflight.check#1", - "ordinal": 6, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.check\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "edb8f0fe6906": { - "name": "ui.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"ui.get\"}" - }, - "ef1c6ea901db": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - } - }, - "f6a09f8c5b85": { - "providers": [], - "settings": { - "$rpc": "null" - }, - "trust": {} - } - }, - "recording": { - "scenario": "settings-workspace-context-transport-error", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": [ - "b69f454508d6", - "1e7f9a45facb", - "83e12a6721ec", - "7c5e5635081d", - "3d249e57942b" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": [ - "903ba5a79900", - "9cf8484d8b20", - "8566e2463d90", - "ef1c6ea901db", - "65e027dec060" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9523a5ec7949", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/structured-agent-session-created.json b/mobile/rpc-foundation/goldens/structured-agent-session-created.json deleted file mode 100644 index c341f2230c2..00000000000 --- a/mobile/rpc-foundation/goldens/structured-agent-session-created.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-create", - "namedDeltas": [], - "values": { - "568aa5cfc6b5": { - "name": "agentSession.createSupport#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.createSupport\",\"params\":{\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "6d6669cd1a85": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "created", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - }, - "91f56e5d551d": { - "name": "agentSession.create#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.create\",\"params\":{\"envelope\":{\"sessionId\":\"claude_00000000_0000_4000_8000_000000000001\",\"clientOperationId\":\"1767225600000-00000000000040008000000000000002\",\"expectedRuntimeFence\":null,\"payloadFingerprint\":\"ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605\"},\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "a75955abbbbc": { - "name": "agentSession.createSupport#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agentSession.createSupport" - }, - { - "name": "params", - "value": { - "agent": "claude", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "supported": true - } - } - } - }, - "b5f7cf9d778d": { - "name": "agentSession.create#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "agentSession.create" - }, - { - "name": "params", - "value": { - "agent": "claude", - "envelope": { - "clientOperationId": "1767225600000-00000000000040008000000000000002", - "expectedRuntimeFence": { - "$rpc": "null" - }, - "payloadFingerprint": "ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - }, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true, - "value": { - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - } - } - } - }, - "d00057b53c3e": { - "launched": { - "kind": "created", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - } - }, - "recording": { - "scenario": "structured-agent-session-created", - "checkpoints": [ - { - "id": "created", - "observation": { - "sender": ["a75955abbbbc", "b5f7cf9d778d"], - "payloads": ["568aa5cfc6b5", "91f56e5d551d"], - "settlements": { - "claude": "6d6669cd1a85" - }, - "state": "d00057b53c3e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/structured-launch-created.json b/mobile/rpc-foundation/goldens/structured-launch-created.json deleted file mode 100644 index 27835a48c8e..00000000000 --- a/mobile/rpc-foundation/goldens/structured-launch-created.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "namedDeltas": [], - "values": { - "568aa5cfc6b5": { - "name": "agentSession.createSupport#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.createSupport\",\"params\":{\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "6d6669cd1a85": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "created", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - }, - "91f56e5d551d": { - "name": "agentSession.create#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.create\",\"params\":{\"envelope\":{\"sessionId\":\"claude_00000000_0000_4000_8000_000000000001\",\"clientOperationId\":\"1767225600000-00000000000040008000000000000002\",\"expectedRuntimeFence\":null,\"payloadFingerprint\":\"ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605\"},\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "a75955abbbbc": { - "name": "agentSession.createSupport#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agentSession.createSupport" - }, - { - "name": "params", - "value": { - "agent": "claude", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "supported": true - } - } - } - }, - "b5f7cf9d778d": { - "name": "agentSession.create#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "agentSession.create" - }, - { - "name": "params", - "value": { - "agent": "claude", - "envelope": { - "clientOperationId": "1767225600000-00000000000040008000000000000002", - "expectedRuntimeFence": { - "$rpc": "null" - }, - "payloadFingerprint": "ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - }, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true, - "value": { - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - } - } - } - }, - "d00057b53c3e": { - "launched": { - "kind": "created", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - } - }, - "recording": { - "scenario": "structured-launch-created", - "checkpoints": [ - { - "id": "created", - "observation": { - "sender": ["a75955abbbbc", "b5f7cf9d778d"], - "payloads": ["568aa5cfc6b5", "91f56e5d551d"], - "settlements": { - "claude": "6d6669cd1a85" - }, - "state": "d00057b53c3e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/structured-launch-definitive-refusal.json b/mobile/rpc-foundation/goldens/structured-launch-definitive-refusal.json deleted file mode 100644 index 3590e29b1fe..00000000000 --- a/mobile/rpc-foundation/goldens/structured-launch-definitive-refusal.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "namedDeltas": [], - "values": { - "1cd1542a5d9c": { - "name": "agentSession.create#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "agentSession.create" - }, - { - "name": "params", - "value": { - "agent": "claude", - "envelope": { - "clientOperationId": "1767225600000-00000000000040008000000000000002", - "expectedRuntimeFence": { - "$rpc": "null" - }, - "payloadFingerprint": "ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - }, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": false, - "refusal": { - "code": "agent_session_unsupported", - "message": "No agent" - } - } - } - } - }, - "568aa5cfc6b5": { - "name": "agentSession.createSupport#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.createSupport\",\"params\":{\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "57068cb6a8b6": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "unknown", - "message": "No agent" - } - }, - "91f56e5d551d": { - "name": "agentSession.create#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.create\",\"params\":{\"envelope\":{\"sessionId\":\"claude_00000000_0000_4000_8000_000000000001\",\"clientOperationId\":\"1767225600000-00000000000040008000000000000002\",\"expectedRuntimeFence\":null,\"payloadFingerprint\":\"ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605\"},\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "a75955abbbbc": { - "name": "agentSession.createSupport#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agentSession.createSupport" - }, - { - "name": "params", - "value": { - "agent": "claude", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "supported": true - } - } - } - }, - "cddfb66db4f3": { - "launched": { - "kind": "unknown", - "message": "No agent" - } - } - }, - "recording": { - "scenario": "structured-launch-definitive-refusal", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["a75955abbbbc", "1cd1542a5d9c"], - "payloads": ["568aa5cfc6b5", "91f56e5d551d"], - "settlements": { - "claude": "57068cb6a8b6" - }, - "state": "cddfb66db4f3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/structured-launch-support-refused.json b/mobile/rpc-foundation/goldens/structured-launch-support-refused.json deleted file mode 100644 index f2bf93c40cd..00000000000 --- a/mobile/rpc-foundation/goldens/structured-launch-support-refused.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "namedDeltas": [], - "values": { - "2c227fd1941f": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "unsupported" - } - }, - "568aa5cfc6b5": { - "name": "agentSession.createSupport#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.createSupport\",\"params\":{\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "efee3e1e1620": { - "name": "agentSession.createSupport#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agentSession.createSupport" - }, - { - "name": "params", - "value": { - "agent": "claude", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - }, - "f40adca316f9": { - "launched": { - "kind": "unsupported" - } - } - }, - "recording": { - "scenario": "structured-launch-support-refused", - "checkpoints": [ - { - "id": "unsupported", - "observation": { - "sender": ["efee3e1e1620"], - "payloads": ["568aa5cfc6b5"], - "settlements": { - "claude": "2c227fd1941f" - }, - "state": "f40adca316f9", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/structured-launch-unsupported.json b/mobile/rpc-foundation/goldens/structured-launch-unsupported.json deleted file mode 100644 index 6cbff36c24b..00000000000 --- a/mobile/rpc-foundation/goldens/structured-launch-unsupported.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "namedDeltas": [], - "values": { - "551313dcc738": { - "launched": { - "kind": "unsupported", - "reason": "remote" - } - }, - "568aa5cfc6b5": { - "name": "agentSession.createSupport#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.createSupport\",\"params\":{\"worktree\":\"id:workspace-1\",\"agent\":\"claude\"}}" - }, - "57e0653db3e3": { - "name": "agentSession.createSupport#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agentSession.createSupport" - }, - { - "name": "params", - "value": { - "agent": "claude", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "reason": "remote", - "supported": false - } - } - } - }, - "dd51c5566f19": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "unsupported", - "reason": "remote" - } - } - }, - "recording": { - "scenario": "structured-launch-unsupported", - "checkpoints": [ - { - "id": "unsupported", - "observation": { - "sender": ["57e0653db3e3"], - "payloads": ["568aa5cfc6b5"], - "settlements": { - "claude": "dd51c5566f19" - }, - "state": "551313dcc738", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-query-reply-accepted.json b/mobile/rpc-foundation/goldens/terminal-query-reply-accepted.json deleted file mode 100644 index 0b3d1473c04..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-query-reply-accepted.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "terminal.query-reply", - "family": "terminal.query-reply", - "namedDeltas": [], - "values": { - "11a49f853eb8": { - "accepted": true - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "ccb884e12d95": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b[0n\",\"enter\":false,\"inputKind\":\"query-reply\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "cd7cf7b1f566": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "inputKind": "query-reply", - "terminal": "terminal-1", - "text": "\u001b[0n" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - } - }, - "recording": { - "scenario": "terminal-query-reply-accepted", - "checkpoints": [ - { - "id": "accepted", - "observation": { - "sender": ["cd7cf7b1f566"], - "payloads": ["ccb884e12d95"], - "settlements": { - "send": "84e5ca07cb7a" - }, - "state": "11a49f853eb8", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-query-reply-unsubscribed.json b/mobile/rpc-foundation/goldens/terminal-query-reply-unsubscribed.json deleted file mode 100644 index 48e4baf831b..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-query-reply-unsubscribed.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "terminal.query-reply", - "family": "terminal.query-reply", - "namedDeltas": [], - "values": { - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "f043bb99cc1d": { - "accepted": false - } - }, - "recording": { - "scenario": "terminal-query-reply-unsubscribed", - "checkpoints": [ - { - "id": "dropped", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "send": "7ed3d39f0607" - }, - "state": "f043bb99cc1d", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-raw-input-refused.json b/mobile/rpc-foundation/goldens/terminal-raw-input-refused.json deleted file mode 100644 index dc54132fff8..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-raw-input-refused.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "terminal.accessory-raw-send", - "family": "terminal.raw-input", - "namedDeltas": [], - "values": { - "48932570bb0e": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "ls" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - } - }, - "727ebf3d264d": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"ls\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "f043bb99cc1d": { - "accepted": false - } - }, - "recording": { - "scenario": "terminal-raw-input-refused", - "checkpoints": [ - { - "id": "not-reported", - "observation": { - "sender": ["48932570bb0e"], - "payloads": ["727ebf3d264d"], - "settlements": { - "send": "7ed3d39f0607" - }, - "state": "f043bb99cc1d", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-raw-input-reported.json b/mobile/rpc-foundation/goldens/terminal-raw-input-reported.json deleted file mode 100644 index 2939df9ce48..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-raw-input-reported.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "terminal.accessory-raw-send", - "family": "terminal.raw-input", - "namedDeltas": [], - "values": { - "11a49f853eb8": { - "accepted": true - }, - "49c62bc1232e": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "ls" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "727ebf3d264d": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"ls\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - } - }, - "recording": { - "scenario": "terminal-raw-input-reported", - "checkpoints": [ - { - "id": "reported", - "observation": { - "sender": ["49c62bc1232e"], - "payloads": ["727ebf3d264d"], - "settlements": { - "send": "84e5ca07cb7a" - }, - "state": "11a49f853eb8", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-viewport-refit-applied.json b/mobile/rpc-foundation/goldens/terminal-viewport-refit-applied.json deleted file mode 100644 index 83af7725d25..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-viewport-refit-applied.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "terminal.viewport-refit", - "family": "terminal.viewport-refit", - "namedDeltas": [], - "values": { - "685125182eef": { - "name": "reflow", - "ordinal": 4, - "value": { - "cols": 100, - "rows": 30 - } - }, - "7e0619ad636f": { - "measured": true, - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "8ee930d6bf0e": { - "name": "terminal.updateViewport#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.updateViewport\",\"params\":{\"terminal\":\"terminal-1\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"},\"viewport\":{\"cols\":100,\"rows\":30}}}" - }, - "a47f5afd190d": { - "name": "terminal.updateViewport#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.updateViewport" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 150, - "settledAt": 150, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "applied": true, - "updated": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f199e923e51c": { - "name": "measure-fit", - "ordinal": 1, - "value": { - "frameHeight": 600 - } - } - }, - "recording": { - "scenario": "terminal-viewport-refit-applied", - "checkpoints": [ - { - "id": "reflowed", - "observation": { - "sender": ["a47f5afd190d"], - "payloads": ["8ee930d6bf0e"], - "settlements": { - "mount": "eb79a9b3682a", - "height": "eb79a9b3682a" - }, - "state": "7e0619ad636f", - "effects": ["f199e923e51c", "685125182eef"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-viewport-refit-legacy-desktop.json b/mobile/rpc-foundation/goldens/terminal-viewport-refit-legacy-desktop.json deleted file mode 100644 index a1120a9c099..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-viewport-refit-legacy-desktop.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "terminal.viewport-refit", - "family": "terminal.viewport-refit", - "namedDeltas": [], - "values": { - "7e0619ad636f": { - "measured": true, - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "890d1937dd65": { - "name": "unsubscribe-terminal", - "ordinal": 4, - "value": { - "handle": "terminal-1" - } - }, - "8ee930d6bf0e": { - "name": "terminal.updateViewport#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.updateViewport\",\"params\":{\"terminal\":\"terminal-1\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"},\"viewport\":{\"cols\":100,\"rows\":30}}}" - }, - "c13357779299": { - "name": "subscribe-terminal", - "ordinal": 5, - "value": { - "handle": "terminal-1" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eea51f832fca": { - "name": "terminal.updateViewport#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.updateViewport" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 150, - "settledAt": 150, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method: terminal.updateViewport" - }, - "id": "frame-1", - "ok": false - } - } - }, - "f199e923e51c": { - "name": "measure-fit", - "ordinal": 1, - "value": { - "frameHeight": 600 - } - } - }, - "recording": { - "scenario": "terminal-viewport-refit-legacy-desktop", - "checkpoints": [ - { - "id": "resubscribed", - "observation": { - "sender": ["eea51f832fca"], - "payloads": ["8ee930d6bf0e"], - "settlements": { - "mount": "eb79a9b3682a", - "height": "eb79a9b3682a" - }, - "state": "7e0619ad636f", - "effects": ["f199e923e51c", "890d1937dd65", "c13357779299"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/transport-capability-probe-non-string-capabilities-drop.json b/mobile/rpc-foundation/goldens/transport-capability-probe-non-string-capabilities-drop.json deleted file mode 100644 index da4a77f4da8..00000000000 --- a/mobile/rpc-foundation/goldens/transport-capability-probe-non-string-capabilities-drop.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "transport.capability-probe", - "family": "transport.capability-probe", - "namedDeltas": [], - "values": { - "5b39cca91cc4": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["push.v1", 7] - } - } - } - }, - "79ff3831c445": { - "name": "reply-salvage", - "ordinal": 3, - "value": { - "droppedCount": 1, - "droppedPaths": ["capabilities"], - "method": "status.get", - "operation": "status.transport-probe-or-skip", - "variant": "host-status" - } - }, - "cc97c2cd21f1": { - "published": [[]] - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "transport-capability-probe-non-string-capabilities-drop", - "checkpoints": [ - { - "id": "capabilities-rejected", - "observation": { - "sender": ["5b39cca91cc4"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "cc97c2cd21f1", - "effects": ["79ff3831c445"] - } - }, - { - "id": "stopped", - "observation": { - "sender": ["5b39cca91cc4"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "start": "eb79a9b3682a", - "stop": "eb79a9b3682a" - }, - "state": "cc97c2cd21f1", - "effects": ["79ff3831c445"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/transport-capability-probe-publishes.json b/mobile/rpc-foundation/goldens/transport-capability-probe-publishes.json deleted file mode 100644 index 88d224f8b6d..00000000000 --- a/mobile/rpc-foundation/goldens/transport-capability-probe-publishes.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "transport.capability-probe", - "family": "transport.capability-probe", - "namedDeltas": [], - "values": { - "8a814e9e8488": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["push.v1", "codex.reset-credit"] - } - } - } - }, - "bd96613904d8": { - "published": [["push.v1", "codex.reset-credit"]] - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "transport-capability-probe-publishes", - "checkpoints": [ - { - "id": "capabilities-published", - "observation": { - "sender": ["8a814e9e8488"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "bd96613904d8", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/transport-host-status-gates-drop-keeps-capabilities.json b/mobile/rpc-foundation/goldens/transport-host-status-gates-drop-keeps-capabilities.json deleted file mode 100644 index 18199c952fb..00000000000 --- a/mobile/rpc-foundation/goldens/transport-host-status-gates-drop-keeps-capabilities.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "transport.host-status-gates", - "family": "transport.host-status-gates", - "namedDeltas": [], - "values": { - "36d81979cef2": { - "appVersion": "1.4.200", - "capabilities": ["mobile.tasks.v1", "push.v1"], - "floatingWorkspace": true, - "pending": false, - "verdict": { - "kind": "ok" - } - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f2be9b1b6c7a": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "appVersion": "1.4.200", - "capabilities": ["mobile.tasks.v1", "push.v1"], - "floatingWorkspaceEnabled": true, - "minCompatibleMobileVersion": 1, - "protocolVersion": 5 - } - } - } - } - }, - "recording": { - "scenario": "transport-host-status-gates-drop-keeps-capabilities", - "checkpoints": [ - { - "id": "gates-proven", - "observation": { - "sender": ["f2be9b1b6c7a"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "36d81979cef2", - "effects": [] - } - }, - { - "id": "gates-unverified", - "observation": { - "sender": ["f2be9b1b6c7a"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "mount": "eb79a9b3682a", - "drop": "eb79a9b3682a" - }, - "state": "36d81979cef2", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/transport-host-status-gates-ready.json b/mobile/rpc-foundation/goldens/transport-host-status-gates-ready.json deleted file mode 100644 index 9fe474da90c..00000000000 --- a/mobile/rpc-foundation/goldens/transport-host-status-gates-ready.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "transport.host-status-gates", - "family": "transport.host-status-gates", - "namedDeltas": [], - "values": { - "36d81979cef2": { - "appVersion": "1.4.200", - "capabilities": ["mobile.tasks.v1", "push.v1"], - "floatingWorkspace": true, - "pending": false, - "verdict": { - "kind": "ok" - } - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f2be9b1b6c7a": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "appVersion": "1.4.200", - "capabilities": ["mobile.tasks.v1", "push.v1"], - "floatingWorkspaceEnabled": true, - "minCompatibleMobileVersion": 1, - "protocolVersion": 5 - } - } - } - } - }, - "recording": { - "scenario": "transport-host-status-gates-ready", - "checkpoints": [ - { - "id": "gates-proven", - "observation": { - "sender": ["f2be9b1b6c7a"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "36d81979cef2", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/transport-host-status-gates-refused-degrades.json b/mobile/rpc-foundation/goldens/transport-host-status-gates-refused-degrades.json deleted file mode 100644 index 352242e1b05..00000000000 --- a/mobile/rpc-foundation/goldens/transport-host-status-gates-refused-degrades.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "transport.host-status-gates", - "family": "transport.host-status-gates", - "namedDeltas": [], - "values": { - "905661513589": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "status_unavailable", - "message": "no status" - }, - "id": "frame-1", - "ok": false - } - } - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "df2c10616b5e": { - "appVersion": { - "$rpc": "null" - }, - "capabilities": [], - "floatingWorkspace": false, - "pending": false, - "verdict": { - "kind": "ok" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "transport-host-status-gates-refused-degrades", - "checkpoints": [ - { - "id": "gates-degraded", - "observation": { - "sender": ["905661513589"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "df2c10616b5e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/transport-pairing-race-direct-completes-first.json b/mobile/rpc-foundation/goldens/transport-pairing-race-direct-completes-first.json deleted file mode 100644 index 34f78503e13..00000000000 --- a/mobile/rpc-foundation/goldens/transport-pairing-race-direct-completes-first.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "transport.pairing-race", - "family": "transport.pairing-race", - "namedDeltas": [], - "values": { - "61a4715b43bf": { - "name": "status.get#2", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "capabilities": [] - } - } - } - }, - "93edac3a1c3e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "direct" - }, - "a1e33b5bf8ef": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": [] - } - } - } - }, - "ca99f593a4a0": { - "name": "candidate-closed", - "ordinal": 5, - "value": "relay" - }, - "d9b301beff12": { - "outcome": "direct" - }, - "e7b5d7d57a61": { - "name": "status.get#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "f1834177e593": { - "name": "status.get#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - } - }, - "recording": { - "scenario": "transport-pairing-race-direct-completes-first", - "checkpoints": [ - { - "id": "direct-wins-when-it-completes-first", - "observation": { - "sender": ["a1e33b5bf8ef", "61a4715b43bf"], - "payloads": ["e7b5d7d57a61", "f1834177e593"], - "settlements": { - "race": "93edac3a1c3e" - }, - "state": "d9b301beff12", - "effects": ["ca99f593a4a0"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-capabilities-advertised.json b/mobile/rpc-foundation/goldens/tw-capabilities-advertised.json deleted file mode 100644 index 76ab3e03a1e..00000000000 --- a/mobile/rpc-foundation/goldens/tw-capabilities-advertised.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-capabilities", - "family": "worktree.runtime-capabilities", - "namedDeltas": [], - "values": { - "216adda2100c": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1", "worktree.create-idempotency.v1"], - "platform": "linux", - "worktreeCreateIdempotency": { - "dedupeTtlMs": 45000 - } - } - } - } - }, - "456a1f9383e3": { - "capabilities": { - "agentLaunch": false, - "branchIntentV2": false, - "branchIntentV2Request": false, - "hostPlatform": { - "$rpc": "null" - }, - "tasksSupported": true, - "worktreeCreateIdempotency": { - "dedupeTtlMs": 45000 - } - } - }, - "b62568733b13": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "agentLaunch": false, - "branchIntentV2": false, - "branchIntentV2Request": false, - "hostPlatform": { - "$rpc": "null" - }, - "tasksSupported": true, - "worktreeCreateIdempotency": { - "dedupeTtlMs": 45000 - } - } - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - } - }, - "recording": { - "scenario": "tw-capabilities-advertised", - "checkpoints": [ - { - "id": "probed", - "observation": { - "sender": ["216adda2100c"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "probe": "b62568733b13" - }, - "state": "456a1f9383e3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json b/mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json deleted file mode 100644 index 7ead5211d8b..00000000000 --- a/mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-capabilities", - "family": "worktree.runtime-capabilities", - "namedDeltas": [], - "values": { - "d07813454621": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "agentLaunch": false, - "branchIntentV2": false, - "branchIntentV2Request": false, - "hostPlatform": { - "$rpc": "null" - }, - "tasksSupported": false, - "worktreeCreateIdempotency": { - "dedupeTtlMs": 60000 - } - } - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eaed1eb137b5": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["worktree.create-idempotency.v1"] - } - } - } - }, - "f8024fca8c7d": { - "capabilities": { - "agentLaunch": false, - "branchIntentV2": false, - "branchIntentV2Request": false, - "hostPlatform": { - "$rpc": "null" - }, - "tasksSupported": false, - "worktreeCreateIdempotency": { - "dedupeTtlMs": 60000 - } - } - } - }, - "recording": { - "scenario": "tw-capabilities-legacy-idempotency", - "checkpoints": [ - { - "id": "legacy-host-window", - "observation": { - "sender": ["eaed1eb137b5"], - "payloads": ["d08f74d65ee6"], - "settlements": { - "probe": "d07813454621" - }, - "state": "f8024fca8c7d", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-agent-launched.json b/mobile/rpc-foundation/goldens/tw-create-retry-agent-launched.json deleted file mode 100644 index bfb9e56cb0a..00000000000 --- a/mobile/rpc-foundation/goldens/tw-create-retry-agent-launched.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-create-retry", - "family": "worktree.agent-launch-create", - "namedDeltas": [], - "values": { - "3f946ad0279c": { - "outcome": "uncreated" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "97555d579c32": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "name": "kestrel", - "warning": "startup terminal failed", - "worktreeId": "repo-1::/w" - } - }, - "a19446c94e4f": { - "name": "agent.launch#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agent.launch\",\"params\":{\"agent\":\"codex\",\"target\":{\"kind\":\"create-worktree\",\"create\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}}}" - }, - "f02b3d4d2928": { - "name": "agent.launch#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agent.launch" - }, - { - "name": "params", - "value": { - "agent": "codex", - "target": { - "create": { - "clientMutationId": "mutation-1", - "name": "kestrel", - "repo": "id:repo-1" - }, - "kind": "create-worktree" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "f53a3cfe8aa9": { - "name": "agent.launch#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "agent.launch" - }, - { - "name": "params", - "value": { - "agent": "codex", - "target": { - "create": { - "clientMutationId": "mutation-1", - "name": "kestrel", - "repo": "id:repo-1" - }, - "kind": "create-worktree" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "outcome": { - "handle": "t-1", - "kind": "structured", - "sessionId": "sess-1" - }, - "receipt": { - "detail": "Structured session created.", - "mode": "structured", - "preferred": "structured", - "reason": "user_default" - }, - "warning": " startup terminal failed ", - "worktreeId": "repo-1::/w" - } - } - } - }, - "f800fc04633e": { - "outcome": { - "name": "kestrel", - "warning": "startup terminal failed", - "worktreeId": "repo-1::/w" - } - } - }, - "recording": { - "scenario": "tw-create-retry-agent-launched", - "checkpoints": [ - { - "id": "sent", - "observation": { - "sender": ["f02b3d4d2928"], - "payloads": ["a19446c94e4f"], - "settlements": { - "create": "9270aeb7d9c6" - }, - "state": "3f946ad0279c", - "effects": [] - } - }, - { - "id": "launched", - "observation": { - "sender": ["f53a3cfe8aa9"], - "payloads": ["a19446c94e4f"], - "settlements": { - "create": "97555d579c32" - }, - "state": "f800fc04633e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json deleted file mode 100644 index 0ba2fe92c0d..00000000000 --- a/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "namedDeltas": [], - "values": { - "0de4a94be472": { - "name": "worktree.create#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\"}}" - }, - "3f946ad0279c": { - "outcome": "uncreated" - }, - "6d0209806267": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - }, - "d69f3c59fb67": { - "name": "worktree.create#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.create" - }, - { - "name": "params", - "value": { - "name": "kestrel", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - } - }, - "recording": { - "scenario": "tw-create-retry-ambiguous-without-idempotency", - "checkpoints": [ - { - "id": "unstamped-create-is-not-replayed", - "observation": { - "sender": ["d69f3c59fb67"], - "payloads": ["0de4a94be472"], - "settlements": { - "create": "6d0209806267" - }, - "state": "3f946ad0279c", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-created.json b/mobile/rpc-foundation/goldens/tw-create-retry-created.json deleted file mode 100644 index 3516f9f166e..00000000000 --- a/mobile/rpc-foundation/goldens/tw-create-retry-created.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "namedDeltas": [], - "values": { - "06b14e4985de": { - "name": "worktree.create#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" - }, - "60da9621493e": { - "name": "worktree.create#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.create" - }, - { - "name": "params", - "value": { - "clientMutationId": "mutation-1", - "name": "kestrel", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "worktree": { - "displayName": "kestrel", - "id": "repo-1::/w" - } - } - } - } - }, - "b32227fdb10b": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "name": "kestrel", - "worktreeId": "repo-1::/w" - } - }, - "df162b95f465": { - "outcome": { - "name": "kestrel", - "worktreeId": "repo-1::/w" - } - } - }, - "recording": { - "scenario": "tw-create-retry-created", - "checkpoints": [ - { - "id": "created", - "observation": { - "sender": ["60da9621493e"], - "payloads": ["06b14e4985de"], - "settlements": { - "create": "b32227fdb10b" - }, - "state": "df162b95f465", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json b/mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json deleted file mode 100644 index bf63ebfe2b9..00000000000 --- a/mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "namedDeltas": [], - "values": { - "06b14e4985de": { - "name": "worktree.create#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" - }, - "240b0b1c72b2": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "" - } - }, - "7d651cae8837": { - "outcome": { - "error": "" - } - }, - "95255fcdbc28": { - "name": "worktree.create#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.create" - }, - { - "name": "params", - "value": { - "clientMutationId": "mutation-1", - "name": "kestrel", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "internal", - "message": "" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "tw-create-retry-unretryable-refusal", - "checkpoints": [ - { - "id": "refused-empty-message", - "observation": { - "sender": ["95255fcdbc28"], - "payloads": ["06b14e4985de"], - "settlements": { - "create": "240b0b1c72b2" - }, - "state": "7d651cae8837", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json b/mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json deleted file mode 100644 index 60c70e2429b..00000000000 --- a/mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "namedDeltas": [], - "values": { - "06b14e4985de": { - "name": "worktree.create#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" - }, - "2aba590f1f10": { - "name": "worktree.create#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.create" - }, - { - "name": "params", - "value": { - "clientMutationId": "mutation-1", - "name": "kestrel", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "warning": " startup terminal failed ", - "worktree": { - "id": "repo-1::/w" - } - } - } - } - }, - "97555d579c32": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "name": "kestrel", - "warning": "startup terminal failed", - "worktreeId": "repo-1::/w" - } - }, - "f800fc04633e": { - "outcome": { - "name": "kestrel", - "warning": "startup terminal failed", - "worktreeId": "repo-1::/w" - } - } - }, - "recording": { - "scenario": "tw-create-retry-warning-kept", - "checkpoints": [ - { - "id": "created-with-warning", - "observation": { - "sender": ["2aba590f1f10"], - "payloads": ["06b14e4985de"], - "settlements": { - "create": "97555d579c32" - }, - "state": "f800fc04633e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json b/mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json deleted file mode 100644 index 8d1e3e6d60f..00000000000 --- a/mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.composer-hosted-base", - "family": "worktree.hosted-base", - "namedDeltas": [], - "values": { - "1788fb968913": { - "name": "worktree.resolvePrBase#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.resolvePrBase" - }, - { - "name": "params", - "value": { - "headRefName": "feature", - "prNumber": 12, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "baseBranch": "main", - "compareBaseRef": "origin/main" - } - } - } - }, - "236529aa012d": { - "mrBase": "unresolved", - "prBase": { - "baseBranch": "main", - "compareBaseRef": "origin/main" - } - }, - "3cca8119f144": { - "mrBase": { - "baseBranch": "develop" - }, - "prBase": { - "baseBranch": "main", - "compareBaseRef": "origin/main" - } - }, - "5428de0f5130": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "baseBranch": "main", - "compareBaseRef": "origin/main" - } - }, - "92df85b51d0c": { - "name": "worktree.resolveMrBase#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolveMrBase\",\"params\":{\"repo\":\"id:repo-1\",\"mrIid\":7,\"sourceBranch\":\"feature\"}}" - }, - "aafcb4cd89c9": { - "name": "worktree.resolvePrBase#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolvePrBase\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"headRefName\":\"feature\"}}" - }, - "d29aaf6d46d3": { - "name": "worktree.resolveMrBase#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "worktree.resolveMrBase" - }, - { - "name": "params", - "value": { - "mrIid": 7, - "repo": "id:repo-1", - "sourceBranch": "feature" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "baseBranch": "develop" - } - } - } - }, - "fd552ecb03da": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "baseBranch": "develop" - } - } - }, - "recording": { - "scenario": "tw-hosted-base-resolved", - "checkpoints": [ - { - "id": "pr-base-resolved", - "observation": { - "sender": ["1788fb968913"], - "payloads": ["aafcb4cd89c9"], - "settlements": { - "pr": "5428de0f5130" - }, - "state": "236529aa012d", - "effects": [] - } - }, - { - "id": "mr-base-resolved", - "observation": { - "sender": ["1788fb968913", "d29aaf6d46d3"], - "payloads": ["aafcb4cd89c9", "92df85b51d0c"], - "settlements": { - "pr": "5428de0f5130", - "mr": "fd552ecb03da" - }, - "state": "3cca8119f144", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/pilot-scenarios.json b/mobile/rpc-foundation/pilot-scenarios.json index 799c77e0b99..1f18b79c407 100644 --- a/mobile/rpc-foundation/pilot-scenarios.json +++ b/mobile/rpc-foundation/pilot-scenarios.json @@ -369,67 +369,6 @@ } ] }, - { - "id": "settings-bot-overrides-refused", - "operation": "settings.bot-overrides", - "family": "settings.bot-overrides", - "sites": ["mobile/src/source-control/review/use-pr-bot-author-overrides.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-bot-overrides-transport-error", - "operation": "settings.bot-overrides", - "family": "settings.bot-overrides", - "sites": ["mobile/src/source-control/review/use-pr-bot-author-overrides.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reject": { - "message": "settings disconnected", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "settings-workspace-context-fulfilled", "operation": "settings.workspace-context", @@ -601,86 +540,6 @@ ], "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"] }, - { - "id": "settings-workspace-context-transport-error", - "operation": "settings.workspace-context", - "family": "settings.workspace-context", - "sites": ["mobile/src/components/use-new-workspace-runtime-context.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reject": { - "message": "settings disconnected", - "deliveryUnknown": true - } - }, - { - "complete": "ui.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "ui": {} - } - } - }, - { - "complete": "preflight.check#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "glab": { - "installed": false - } - } - } - }, - { - "complete": "linear.status#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "connected": false - } - } - }, - { - "complete": "jira.status#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "connected": false - } - } - }, - { - "checkpoint": "settled" - } - ], - "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"] - }, { "id": "settings-resume-metadata-fulfilled", "operation": "settings.resume-metadata", @@ -1982,121 +1841,6 @@ } ] }, - { - "id": "settings-new-tab-refused", - "operation": "settings.new-tab-agents", - "family": "settings-agent-read", - "sites": ["mobile/src/session/agent-launch/mobile-new-tab-agent-loader.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "load", - "id": "load" - }, - { - "checkpoint": "pending" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "connectionId": "ssh-1" - } - ] - } - } - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "complete": "preflight.detectRemoteAgents#1", - "params": { - "connectionId": "ssh-1" - }, - "reply": { - "ok": true, - "result": ["codex", "claude"] - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-new-tab-transport-error", - "operation": "settings.new-tab-agents", - "family": "settings-agent-read", - "sites": ["mobile/src/session/agent-launch/mobile-new-tab-agent-loader.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "load", - "id": "load" - }, - { - "checkpoint": "pending" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "connectionId": "ssh-1" - } - ] - } - } - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reject": { - "message": "settings disconnected", - "deliveryUnknown": true - } - }, - { - "complete": "preflight.detectRemoteAgents#1", - "params": { - "connectionId": "ssh-1" - }, - "reply": { - "ok": true, - "result": ["codex", "claude"] - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "settings-repo-cache-expiry", "operation": "settings.repo-metadata", @@ -2690,167 +2434,6 @@ } ] }, - { - "id": "settings-resume-metadata-refuse-after-data", - "operation": "settings.resume-metadata", - "family": "settings.resume-metadata", - "sites": ["mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx"], - "schedules": ["success-then-refused"], - "steps": [ - { - "action": "load", - "id": "load" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [] - } - } - }, - { - "complete": "folderWorkspace.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "folderWorkspaces": [] - } - } - }, - { - "complete": "projectGroup.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "groups": [] - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "disabledTuiAgents": ["claude"], - "defaultTuiAgent": "codex", - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"], - "hostSettingOverrides": {} - } - } - } - }, - { - "complete": "worktree.ps#1", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true - }, - "reply": { - "ok": true, - "result": { - "worktrees": [] - } - } - }, - { - "checkpoint": "settled" - }, - { - "checkpoint": "data-present" - }, - { - "action": "load", - "id": "reload" - }, - { - "checkpoint": "refresh-pending" - }, - { - "complete": "repo.list#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [] - } - } - }, - { - "complete": "folderWorkspace.list#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "folderWorkspaces": [] - } - } - }, - { - "complete": "projectGroup.list#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "groups": [] - } - } - }, - { - "complete": "settings.get#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "complete": "worktree.ps#2", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true - }, - "reply": { - "ok": true, - "result": { - "worktrees": [] - } - } - }, - { - "checkpoint": "refused-after-data" - } - ] - }, { "id": "settings-repo-metadata-refuse-after-data", "operation": "settings.repo-metadata", @@ -3647,85 +3230,6 @@ } ] }, - { - "id": "sc-history-loaded", - "operation": "source-control.git-history", - "family": "git.history-read", - "sites": ["mobile/src/source-control/history/mobile-git-history.ts"], - "schedules": [], - "steps": [ - { - "action": "load", - "id": "load" - }, - { - "checkpoint": "pending" - }, - { - "complete": "git.history#1", - "params": { - "worktree": "id:repo42::/p", - "limit": 50 - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "displayId": "aaaaaaa", - "subject": "first", - "author": "dev", - "parentIds": ["bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"], - "timestamp": 1767222000000 - }, - { - "id": "cccccccccccccccccccccccccccccccccccccccc", - "subject": "", - "parentIds": [], - "timestamp": null - } - ] - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-commit-message-generated", - "operation": "source-control.commit-message", - "family": "git.commit-message-ai", - "sites": ["mobile/src/source-control/commits/mobile-commit-message-ai.ts"], - "schedules": [], - "steps": [ - { - "action": "generate", - "id": "generate" - }, - { - "checkpoint": "pending" - }, - { - "complete": "git.generateCommitMessage#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "success": true, - "message": "feat: recorded" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-commit-message-canceled", "operation": "source-control.commit-message", @@ -3776,64 +3280,6 @@ } ] }, - { - "id": "sc-commit-message-cancel-rejected", - "operation": "source-control.commit-message", - "family": "git.commit-message-ai", - "sites": ["mobile/src/source-control/commits/mobile-commit-message-ai.ts"], - "schedules": [], - "steps": [ - { - "action": "cancel", - "id": "cancel" - }, - { - "complete": "git.cancelGenerateCommitMessage#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reject": { - "message": "transport failure", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-pr-link-set", - "operation": "source-control.pr-link", - "family": "worktree.review-link", - "sites": ["mobile/src/source-control/review/mobile-pr-link.ts"], - "schedules": [], - "steps": [ - { - "action": "link", - "id": "link" - }, - { - "checkpoint": "pending" - }, - { - "complete": "worktree.set#1", - "params": { - "worktree": "id:repo42::/p", - "linkedPR": 12 - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-pr-link-hosted-review", "operation": "source-control.pr-link", @@ -5250,72 +4696,6 @@ } ] }, - { - "id": "tw-create-retry-created", - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "sites": ["mobile/src/new-workspace/creation/worktree-create-retry.ts"], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create" - }, - { - "complete": "worktree.create#1", - "params": { - "repo": "id:repo-1", - "name": "kestrel", - "clientMutationId": "mutation-1" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "id": "repo-1::/w", - "displayName": "kestrel" - } - } - } - }, - { - "checkpoint": "created" - } - ] - }, - { - "id": "tw-create-retry-warning-kept", - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "sites": ["mobile/src/new-workspace/creation/worktree-create-retry.ts"], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create" - }, - { - "complete": "worktree.create#1", - "params": { - "repo": "id:repo-1", - "name": "kestrel", - "clientMutationId": "mutation-1" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "id": "repo-1::/w" - }, - "warning": " startup terminal failed " - } - } - }, - { - "checkpoint": "created-with-warning" - } - ] - }, { "id": "tw-create-retry-name-collision", "operation": "tasks.worktree-create-retry", @@ -5367,37 +4747,6 @@ } ] }, - { - "id": "tw-create-retry-unretryable-refusal", - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "sites": ["mobile/src/new-workspace/creation/worktree-create-retry.ts"], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create" - }, - { - "complete": "worktree.create#1", - "params": { - "repo": "id:repo-1", - "name": "kestrel", - "clientMutationId": "mutation-1" - }, - "reply": { - "ok": false, - "error": { - "code": "internal", - "message": "" - } - } - }, - { - "checkpoint": "refused-empty-message" - } - ] - }, { "id": "tw-create-retry-ambiguous-while-connected", "operation": "tasks.worktree-create-retry", @@ -5452,153 +4801,6 @@ } ] }, - { - "id": "tw-create-retry-ambiguous-without-idempotency", - "operation": "tasks.worktree-create-retry", - "family": "worktree.create-retry", - "sites": ["mobile/src/new-workspace/creation/worktree-create-retry.ts"], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create", - "args": { - "idempotency": false - } - }, - { - "complete": "worktree.create#1", - "params": { - "repo": "id:repo-1", - "name": "kestrel" - }, - "reject": { - "message": "Connection lost", - "deliveryUnknown": true - } - }, - { - "checkpoint": "unstamped-create-is-not-replayed" - } - ] - }, - { - "id": "tw-create-retry-agent-launched", - "operation": "tasks.worktree-create-retry", - "family": "worktree.agent-launch-create", - "sites": [ - "mobile/src/new-workspace/creation/worktree-create-retry.ts", - "mobile/src/session/agent-launch/agent-launch-request.ts" - ], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create", - "args": { - "agentLaunch": true - } - }, - { - "checkpoint": "sent" - }, - { - "complete": "agent.launch#1", - "params": { - "agent": "codex", - "target": { - "kind": "create-worktree", - "create": { - "repo": "id:repo-1", - "name": "kestrel", - "clientMutationId": "mutation-1" - } - } - }, - "reply": { - "ok": true, - "result": { - "outcome": { - "kind": "structured", - "sessionId": "sess-1", - "handle": "t-1" - }, - "worktreeId": "repo-1::/w", - "warning": " startup terminal failed ", - "receipt": { - "mode": "structured", - "preferred": "structured", - "reason": "user_default", - "detail": "Structured session created." - } - } - } - }, - { - "checkpoint": "launched" - } - ] - }, - { - "id": "tw-capabilities-advertised", - "operation": "tasks.worktree-capabilities", - "family": "worktree.runtime-capabilities", - "sites": ["mobile/src/new-workspace/creation/worktree-create-capability.ts"], - "schedules": [], - "steps": [ - { - "action": "probe", - "id": "probe" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1", "worktree.create-idempotency.v1"], - "worktreeCreateIdempotency": { - "dedupeTtlMs": 45000 - }, - "platform": "linux" - } - } - }, - { - "checkpoint": "probed" - } - ] - }, - { - "id": "tw-capabilities-legacy-idempotency", - "operation": "tasks.worktree-capabilities", - "family": "worktree.runtime-capabilities", - "sites": ["mobile/src/new-workspace/creation/worktree-create-capability.ts"], - "schedules": [], - "steps": [ - { - "action": "probe", - "id": "probe" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["worktree.create-idempotency.v1"] - } - } - }, - { - "checkpoint": "legacy-host-window" - } - ] - }, { "id": "tw-capabilities-cutover-retried", "operation": "tasks.worktree-capabilities", @@ -5641,58 +4843,6 @@ } ] }, - { - "id": "tw-hosted-base-resolved", - "operation": "tasks.composer-hosted-base", - "family": "worktree.hosted-base", - "sites": ["mobile/src/new-workspace/source-selection/composer-source-base-resolve.ts"], - "schedules": [], - "steps": [ - { - "action": "pr-base", - "id": "pr" - }, - { - "complete": "worktree.resolvePrBase#1", - "params": { - "repo": "id:repo-1", - "prNumber": 12, - "headRefName": "feature" - }, - "reply": { - "ok": true, - "result": { - "baseBranch": "main", - "compareBaseRef": "origin/main" - } - } - }, - { - "checkpoint": "pr-base-resolved" - }, - { - "action": "mr-base", - "id": "mr" - }, - { - "complete": "worktree.resolveMrBase#1", - "params": { - "repo": "id:repo-1", - "mrIid": 7, - "sourceBranch": "feature" - }, - "reply": { - "ok": true, - "result": { - "baseBranch": "develop" - } - } - }, - { - "checkpoint": "mr-base-resolved" - } - ] - }, { "id": "tw-hosted-base-soft-error", "operation": "tasks.composer-hosted-base", @@ -6825,111 +5975,6 @@ } ] }, - { - "id": "files-ownership-ssh", - "operation": "files.mutation-ownership", - "family": "files.mutation-ownership", - "sites": ["mobile/src/files/mutation-ownership/mobile-file-mutation-ownership.ts"], - "schedules": [], - "steps": [ - { - "action": "capture", - "id": "capture" - }, - { - "checkpoint": "status-pending" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["files.mutation-ownership.v1"] - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "hostId": "ssh:target-1" - } - } - } - }, - { - "complete": "ssh.getState#1", - "params": { - "targetId": "target-1" - }, - "reply": { - "ok": true, - "result": { - "state": { - "targetId": "target-1", - "status": "connected", - "error": null, - "reconnectAttempt": 0, - "connectionGeneration": 3 - } - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-ownership-local", - "operation": "files.mutation-ownership", - "family": "files.mutation-ownership", - "sites": ["mobile/src/files/mutation-ownership/mobile-file-mutation-ownership.ts"], - "schedules": [], - "steps": [ - { - "action": "capture", - "id": "capture" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["files.mutation-ownership.v1"] - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "hostId": "local" - } - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "files-preview-grant-refresh", "operation": "files.preview-load", @@ -7004,503 +6049,6 @@ } ] }, - { - "id": "files-preview-artifact-direct", - "operation": "files.preview-load", - "family": "files.preview-load", - "sites": [ - "mobile/src/files/preview/mobile-file-preview-request.ts", - "mobile/src/files/terminal-artifacts/mobile-terminal-artifact-grant-refresh.ts" - ], - "schedules": [], - "steps": [ - { - "action": "artifact", - "id": "load" - }, - { - "complete": "files.readTerminalArtifact#1", - "params": { - "worktree": "id:workspace-1", - "absolutePath": "/logs/run.txt", - "grantId": "grant-1" - }, - "reply": { - "ok": true, - "result": { - "content": "hello", - "truncated": false, - "byteLength": 5 - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-preview-worktree", - "operation": "files.preview-load", - "family": "files.preview-load", - "sites": ["mobile/src/files/preview/mobile-file-preview-request.ts"], - "schedules": [], - "steps": [ - { - "action": "worktree", - "id": "load" - }, - { - "complete": "files.read#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "docs/readme.md" - }, - "reply": { - "ok": true, - "result": { - "content": "# readme", - "truncated": false, - "byteLength": 8 - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-preview-worktree-image", - "operation": "files.preview-load", - "family": "files.preview-load", - "sites": ["mobile/src/files/preview/mobile-file-preview-request.ts"], - "schedules": [], - "steps": [ - { - "action": "worktree", - "id": "load", - "args": { - "path": "docs/logo.png" - } - }, - { - "complete": "files.readPreview#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "docs/logo.png" - }, - "reply": { - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-preview-artifact-image", - "operation": "files.preview-load", - "family": "files.preview-load", - "sites": ["mobile/src/files/preview/mobile-file-preview-request.ts"], - "schedules": [], - "steps": [ - { - "action": "artifact", - "id": "load", - "args": { - "path": "/logs/shot.png" - } - }, - { - "complete": "files.readTerminalArtifactPreview#1", - "params": { - "worktree": "id:workspace-1", - "absolutePath": "/logs/shot.png", - "grantId": "grant-1" - }, - "reply": { - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-save-verified", - "operation": "files.preview-save", - "family": "files.preview-save", - "sites": [ - "mobile/src/files/preview/mobile-file-preview-request.ts", - "mobile/src/files/terminal-artifacts/mobile-terminal-artifact-grant-refresh.ts" - ], - "schedules": [], - "steps": [ - { - "action": "verified", - "id": "save" - }, - { - "checkpoint": "verify-pending" - }, - { - "complete": "files.readTerminalArtifact#1", - "params": { - "worktree": "id:workspace-1", - "absolutePath": "/logs/run.txt", - "grantId": "grant-1" - }, - "reply": { - "ok": true, - "result": { - "content": "base", - "truncated": false, - "byteLength": 4 - } - } - }, - { - "complete": "files.writeTerminalArtifact#1", - "params": { - "worktree": "id:workspace-1", - "absolutePath": "/logs/run.txt", - "grantId": "grant-1", - "content": "next" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-save-blind", - "operation": "files.preview-save", - "family": "files.preview-save", - "sites": [ - "mobile/src/files/preview/mobile-file-preview-request.ts", - "mobile/src/files/terminal-artifacts/mobile-terminal-artifact-grant-refresh.ts" - ], - "schedules": [], - "steps": [ - { - "action": "blind", - "id": "save" - }, - { - "complete": "files.writeTerminalArtifact#1", - "params": { - "worktree": "id:workspace-1", - "absolutePath": "/logs/run.txt", - "grantId": "grant-1", - "content": "next" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-tab-doc-shapes", - "operation": "files.tab-doc", - "family": "files.tab-doc", - "sites": ["mobile/src/files/session-documents/mobile-file-tab-doc.ts"], - "schedules": [], - "steps": [ - { - "action": "text", - "id": "text" - }, - { - "complete": "files.read#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "docs/readme.md" - }, - "reply": { - "ok": true, - "result": { - "content": "# readme", - "truncated": false, - "byteLength": 8 - } - } - }, - { - "action": "image", - "id": "image" - }, - { - "complete": "files.readPreview#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "docs/logo.png" - }, - "reply": { - "ok": true, - "result": { - "content": "aGk=", - "isImage": true, - "mimeType": "image/png" - } - } - }, - { - "action": "diff", - "id": "diff" - }, - { - "complete": "git.diff#1", - "params": { - "worktree": "id:workspace-1", - "filePath": "docs/readme.md", - "staged": true - }, - "reply": { - "ok": true, - "result": { - "kind": "text", - "originalContent": "a\n", - "modifiedContent": "b\n" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "components-target-ssh", - "operation": "components.execution-target", - "family": "components.execution-target", - "sites": ["mobile/src/components/use-new-workspace-execution-target.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "state-pending" - }, - { - "complete": "ssh.getState#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": true, - "result": { - "state": { - "targetId": "ssh-1", - "status": "connected", - "error": null, - "reconnectAttempt": 0 - } - } - } - }, - { - "complete": "preflight.detectRemoteAgents#1", - "params": { - "connectionId": "ssh-1" - }, - "reply": { - "ok": true, - "result": ["codex"] - } - }, - { - "action": "connect", - "id": "connect" - }, - { - "complete": "ssh.connect#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": true, - "result": { - "state": { - "targetId": "ssh-1", - "status": "connected", - "error": null, - "reconnectAttempt": 0 - } - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "components-target-local", - "operation": "components.execution-target-local", - "family": "components.execution-target-local", - "sites": ["mobile/src/components/use-new-workspace-execution-target.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "detect-pending" - }, - { - "complete": "preflight.detectAgents#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": ["claude"] - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "components-setup-ask", - "operation": "components.setup-script", - "family": "components.setup-script", - "sites": ["mobile/src/components/use-new-workspace-setup-script.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "hooks-pending" - }, - { - "complete": "repo.hooks#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "hooks": { - "scripts": { - "setup": "pnpm install" - } - }, - "source": "repo", - "setupRunPolicy": "ask", - "setupTrust": null - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "host-view-settings-sync", - "operation": "host.view-settings", - "family": "host.view-settings", - "sites": ["mobile/src/host-screen/view-settings/use-host-view-settings.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "sync", - "id": "sync" - }, - { - "checkpoint": "ui-pending" - }, - { - "complete": "ui.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "ui": { - "sortBy": "name", - "groupBy": "repo", - "hideSleepingWorkspaces": true - } - } - } - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "compactWorktreeCards": true - } - } - } - }, - { - "action": "sort", - "id": "sort" - }, - { - "complete": "ui.set#1", - "params": { - "sortBy": "name" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "worktree-home-catalog", "operation": "worktree.home-catalog", @@ -7656,152 +6204,6 @@ } ] }, - { - "id": "host-worktree-actions-pin-open-delete", - "operation": "host.worktree-actions", - "family": "host.worktree-actions", - "sites": ["mobile/src/host-screen/workspace-actions/use-host-worktree-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "toggle-pin", - "id": "toggle-pin" - }, - { - "checkpoint": "pin-optimistic" - }, - { - "complete": "worktree.set#1", - "params": { - "worktree": "id:wt-1", - "isPinned": true - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "action": "open-session", - "id": "open-session" - }, - { - "complete": "worktree.activate#1", - "params": { - "worktree": "id:wt-1", - "notifyClients": false, - "navigation": "caller" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "action": "delete", - "id": "delete" - }, - { - "complete": "repo.hooks#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "hasHooksFile": false, - "hooks": null, - "setupRunPolicy": "run-by-default", - "source": null, - "setupConfig": null - } - } - }, - { - "checkpoint": "delete-optimistic" - }, - { - "complete": "worktree.rm#1", - "params": { - "worktree": "id:wt-1", - "force": true, - "runHooks": false - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "host-worktree-delete-refused", - "operation": "host.worktree-actions", - "family": "host.worktree-actions", - "sites": ["mobile/src/host-screen/workspace-actions/use-host-worktree-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "delete", - "id": "delete" - }, - { - "complete": "repo.hooks#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "hasHooksFile": false, - "hooks": null, - "setupRunPolicy": "run-by-default", - "source": null, - "setupConfig": null, - "archiveTrust": null - } - } - }, - { - "checkpoint": "delete-optimistic" - }, - { - "complete": "worktree.rm#1", - "params": { - "worktree": "id:wt-1", - "force": true, - "runHooks": true - }, - "reply": { - "ok": false, - "error": { - "code": "worktree_busy", - "message": "Worktree is busy" - } - } - }, - { - "checkpoint": "restored" - } - ] - }, { "id": "host-worktree-delete-archive-hook-failed", "operation": "host.worktree-actions", @@ -11267,137 +9669,6 @@ } ] }, - { - "id": "transport-host-status-gates-ready", - "operation": "transport.host-status-gates", - "family": "transport.host-status-gates", - "sites": ["mobile/src/transport/connection/host-status-gates.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "protocolVersion": 5, - "minCompatibleMobileVersion": 1, - "appVersion": "1.4.200", - "capabilities": ["mobile.tasks.v1", "push.v1"], - "floatingWorkspaceEnabled": true - } - } - }, - { - "checkpoint": "gates-proven" - } - ] - }, - { - "id": "transport-host-status-gates-refused-degrades", - "operation": "transport.host-status-gates", - "family": "transport.host-status-gates", - "sites": ["mobile/src/transport/connection/host-status-gates.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "status_unavailable", - "message": "no status" - } - } - }, - { - "checkpoint": "gates-degraded" - } - ] - }, - { - "id": "transport-host-status-gates-drop-keeps-capabilities", - "operation": "transport.host-status-gates", - "family": "transport.host-status-gates", - "sites": ["mobile/src/transport/connection/host-status-gates.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "protocolVersion": 5, - "minCompatibleMobileVersion": 1, - "appVersion": "1.4.200", - "capabilities": ["mobile.tasks.v1", "push.v1"], - "floatingWorkspaceEnabled": true - } - } - }, - { - "checkpoint": "gates-proven" - }, - { - "action": "state", - "id": "drop", - "args": { - "connState": "connecting" - } - }, - { - "checkpoint": "gates-unverified" - } - ] - }, - { - "id": "transport-capability-probe-publishes", - "operation": "transport.capability-probe", - "family": "transport.capability-probe", - "sites": ["mobile/src/transport/connection/runtime-capability-probe.ts"], - "schedules": [], - "steps": [ - { - "action": "start", - "id": "start" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["push.v1", "codex.reset-credit"] - } - } - }, - { - "checkpoint": "capabilities-published" - } - ] - }, { "id": "transport-capability-probe-refused-backs-off", "operation": "transport.capability-probe", @@ -11445,41 +9716,6 @@ } ] }, - { - "id": "transport-capability-probe-non-string-capabilities-drop", - "operation": "transport.capability-probe", - "family": "transport.capability-probe", - "sites": ["mobile/src/transport/connection/runtime-capability-probe.ts"], - "schedules": [], - "steps": [ - { - "action": "start", - "id": "start" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["push.v1", 7] - } - } - }, - { - "checkpoint": "capabilities-rejected" - }, - { - "action": "stop", - "id": "stop" - }, - { - "checkpoint": "stopped" - } - ] - }, { "id": "transport-pairing-race-relay-completes-first", "operation": "transport.pairing-race", @@ -11534,60 +9770,6 @@ } ] }, - { - "id": "transport-pairing-race-direct-completes-first", - "operation": "transport.pairing-race", - "family": "transport.pairing-race", - "sites": ["mobile/src/pairing/pairing-candidate-race.ts"], - "schedules": [], - "steps": [ - { - "action": "race", - "id": "race" - }, - { - "bind": "direct-status", - "request": "status.get#1", - "params": { - "$undefined": true - } - }, - { - "bind": "relay-status", - "request": "status.get#2", - "params": { - "$undefined": true - } - }, - { - "complete": "direct-status", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": [] - } - } - }, - { - "complete": "relay-status", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": [] - } - } - }, - { - "checkpoint": "direct-wins-when-it-completes-first" - } - ] - }, { "id": "transport-pairing-race-relay-wins-when-direct-refused", "operation": "transport.pairing-race", @@ -15981,84 +14163,6 @@ } ] }, - { - "id": "aivault-history-scan-fulfilled", - "operation": "aiVault.history-scan", - "family": "aiVault.history", - "sites": ["mobile/src/agent-history/use-mobile-agent-history-state.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["aiVault.v1"] - } - } - }, - { - "complete": "aiVault.listSessions#1", - "params": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - }, - "reply": { - "ok": true, - "result": { - "sessions": [ - { - "id": "s1", - "agent": "claude", - "cwd": "/repo/feature" - } - ], - "issues": [] - } - } - }, - { - "checkpoint": "ready" - } - ] - }, - { - "id": "aivault-history-scan-unsupported", - "operation": "aiVault.history-scan", - "family": "aiVault.history", - "sites": ["mobile/src/agent-history/use-mobile-agent-history-state.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1"] - } - } - }, - { - "checkpoint": "unsupported" - } - ] - }, { "id": "aivault-history-scan-worktrees-late", "operation": "aiVault.history-scan", @@ -16397,222 +14501,6 @@ } ] }, - { - "id": "terminal-query-reply-accepted", - "operation": "terminal.query-reply", - "family": "terminal.query-reply", - "sites": ["mobile/src/terminal/host-operations/mobile-terminal-query-reply.ts"], - "schedules": [], - "steps": [ - { - "action": "send", - "id": "send" - }, - { - "complete": "terminal.send#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "inputKind": "query-reply", - "terminal": "terminal-1", - "text": "\u001b[0n" - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "accepted" - } - ] - }, - { - "id": "terminal-query-reply-unsubscribed", - "operation": "terminal.query-reply", - "family": "terminal.query-reply", - "sites": ["mobile/src/terminal/host-operations/mobile-terminal-query-reply.ts"], - "schedules": [], - "steps": [ - { - "action": "send", - "id": "send", - "args": { - "handle": "terminal-9" - } - }, - { - "checkpoint": "dropped" - } - ] - }, - { - "id": "terminal-raw-input-reported", - "operation": "terminal.accessory-raw-send", - "family": "terminal.raw-input", - "sites": ["mobile/src/terminal/live-input/terminal-live-accessory-raw-send.ts"], - "schedules": [], - "steps": [ - { - "action": "send", - "id": "send" - }, - { - "complete": "terminal.send#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "ls" - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "reported" - } - ] - }, - { - "id": "terminal-raw-input-refused", - "operation": "terminal.accessory-raw-send", - "family": "terminal.raw-input", - "sites": ["mobile/src/terminal/live-input/terminal-live-accessory-raw-send.ts"], - "schedules": [], - "steps": [ - { - "action": "send", - "id": "send" - }, - { - "complete": "terminal.send#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "ls" - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - }, - { - "checkpoint": "not-reported" - } - ] - }, - { - "id": "terminal-viewport-refit-applied", - "operation": "terminal.viewport-refit", - "family": "terminal.viewport-refit", - "sites": ["mobile/src/terminal/viewport/terminal-viewport-refit.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "height", - "id": "height" - }, - { - "advance": 150 - }, - { - "complete": "terminal.updateViewport#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "reply": { - "ok": true, - "result": { - "updated": true, - "applied": true - } - } - }, - { - "checkpoint": "reflowed" - } - ] - }, - { - "id": "terminal-viewport-refit-legacy-desktop", - "operation": "terminal.viewport-refit", - "family": "terminal.viewport-refit", - "sites": ["mobile/src/terminal/viewport/terminal-viewport-refit.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "height", - "id": "height" - }, - { - "advance": 150 - }, - { - "complete": "terminal.updateViewport#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method: terminal.updateViewport" - } - } - }, - { - "checkpoint": "resubscribed" - } - ] - }, { "id": "browser-pointer-click-fallback", "operation": "browser.page-commands", @@ -16698,155 +14586,6 @@ } ] }, - { - "id": "browser-pointer-click-accepted", - "operation": "browser.page-commands", - "family": "browser.pointer-click", - "sites": [ - "mobile/src/browser/page-interaction/use-mobile-browser-request.ts", - "mobile/src/browser/page-interaction/use-mobile-browser-commands.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "click", - "id": "click" - }, - { - "complete": "browser.mouseClick#1", - "params": { - "page": "page-1", - "worktree": "id:worktree-1", - "button": "left", - "modifiers": [], - "radius": 14, - "x": 40, - "y": 80 - }, - "reply": { - "ok": true, - "result": { - "clicked": true - } - } - }, - { - "checkpoint": "clicked" - } - ] - }, - { - "id": "browser-wheel-scrolled", - "operation": "browser.page-commands", - "family": "browser.wheel", - "sites": [ - "mobile/src/browser/page-interaction/use-mobile-browser-request.ts", - "mobile/src/browser/page-interaction/use-mobile-browser-commands.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "wheel", - "id": "wheel" - }, - { - "complete": "browser.mouseMove#1", - "params": { - "page": "page-1", - "worktree": "id:worktree-1", - "x": 40, - "y": 80 - }, - "reply": { - "ok": true, - "result": { - "moved": true - } - } - }, - { - "complete": "browser.mouseWheel#1", - "params": { - "page": "page-1", - "worktree": "id:worktree-1", - "dx": 0, - "dy": -120 - }, - "reply": { - "ok": true, - "result": { - "scrolled": true - } - } - }, - { - "checkpoint": "scrolled" - } - ] - }, - { - "id": "browser-keyboard-input", - "operation": "browser.page-commands", - "family": "browser.keyboard", - "sites": [ - "mobile/src/browser/page-interaction/use-mobile-browser-request.ts", - "mobile/src/browser/page-interaction/use-mobile-browser-commands.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "keyboard-text", - "id": "text" - }, - { - "complete": "browser.keyboardInsertText#1", - "params": { - "page": "page-1", - "worktree": "id:worktree-1", - "text": "hello" - }, - "reply": { - "ok": true, - "result": { - "inserted": true - } - } - }, - { - "action": "keypress", - "id": "keypress" - }, - { - "complete": "browser.keypress#1", - "params": { - "page": "page-1", - "worktree": "id:worktree-1", - "key": "Enter" - }, - "reply": { - "ok": true, - "result": { - "pressed": true - } - } - }, - { - "checkpoint": "typed" - } - ] - }, { "id": "aivault-resume-prepare-repin", "operation": "aiVault.resume-preparation", @@ -16911,54 +14650,6 @@ } ] }, - { - "id": "aivault-resume-prepare-refused", - "operation": "aiVault.resume-preparation", - "family": "aiVault.resume-preparation", - "sites": ["mobile/src/agent-history/ai-vault-resume-preparation.ts"], - "schedules": [], - "steps": [ - { - "action": "prepare", - "id": "prepare" - }, - { - "complete": "aiVault.prepareSessionResume#1", - "params": { - "agent": "codex", - "codexHome": "/hosts/codex-runtime-home/home", - "executionHostId": "local", - "filePath": "/sessions/rollout.jsonl" - }, - "reply": { - "ok": false, - "error": { - "code": "internal", - "message": "codex home is locked" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "aivault-resume-prepare-skipped", - "operation": "aiVault.resume-preparation", - "family": "aiVault.resume-preparation", - "sites": ["mobile/src/agent-history/ai-vault-resume-preparation.ts"], - "schedules": [], - "steps": [ - { - "action": "claude", - "id": "claude" - }, - { - "checkpoint": "no-wire" - } - ] - }, { "id": "aivault-resume-launch-sent", "operation": "aiVault.resume-launch", @@ -17075,38 +14766,6 @@ } ] }, - { - "id": "aivault-resume-launch-create-refused", - "operation": "aiVault.resume-launch", - "family": "aiVault.resume-launch", - "sites": ["mobile/src/agent-history/ai-vault-resume-launch.ts"], - "schedules": [], - "steps": [ - { - "action": "bare", - "id": "bare" - }, - { - "complete": "session.tabs.createTerminal#1", - "params": { - "activate": false, - "navigation": "caller", - "select": true, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "worktree_busy", - "message": "Workspace is busy" - } - } - }, - { - "checkpoint": "create-refused" - } - ] - }, { "id": "aivault-resume-launch-invalid-tab", "operation": "aiVault.resume-launch", @@ -17187,59 +14846,6 @@ } ] }, - { - "id": "clipboard-image-upload-chunked", - "operation": "clipboard.image-upload", - "family": "clipboard.image-upload", - "sites": ["mobile/src/files/attachments/mobile-clipboard-image.ts"], - "schedules": [], - "steps": [ - { - "action": "remote", - "id": "remote" - }, - { - "complete": "clipboard.startImageUpload#1", - "params": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - }, - "reply": { - "ok": true, - "result": { - "uploadId": "upload-1" - } - } - }, - { - "complete": "clipboard.appendImageUploadChunk#1", - "params": { - "uploadId": "upload-1", - "offset": 0, - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - }, - "reply": { - "ok": true, - "result": { - "received": 32 - } - } - }, - { - "complete": "clipboard.commitImageUpload#1", - "params": { - "uploadId": "upload-1" - }, - "reply": { - "ok": true, - "result": "/tmp/img.png" - } - }, - { - "checkpoint": "uploaded" - } - ] - }, { "id": "clipboard-image-upload-aborts-on-chunk-failure", "operation": "clipboard.image-upload", @@ -17296,39 +14902,6 @@ } ] }, - { - "id": "clipboard-image-attachment-upload-refused", - "operation": "clipboard.image-terminal-attachment", - "family": "clipboard.image-attachment", - "sites": [ - "mobile/src/files/attachments/mobile-image-attachment.ts", - "mobile/src/files/attachments/mobile-clipboard-image.ts" - ], - "schedules": [], - "steps": [ - { - "action": "normal", - "id": "normal" - }, - { - "complete": "clipboard.startImageUpload#1", - "params": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - }, - "reply": { - "ok": false, - "error": { - "code": "too_large", - "message": "Image is too large" - } - } - }, - { - "checkpoint": "upload-refused" - } - ] - }, { "id": "clipboard-image-attachment-pasted", "operation": "clipboard.image-terminal-attachment", @@ -17405,62 +14978,6 @@ } ] }, - { - "id": "clipboard-image-attachment-blocked-before-send", - "operation": "clipboard.image-terminal-attachment", - "family": "clipboard.image-attachment", - "sites": [ - "mobile/src/files/attachments/mobile-image-attachment.ts", - "mobile/src/files/attachments/mobile-clipboard-image.ts" - ], - "schedules": [], - "steps": [ - { - "action": "blocked", - "id": "blocked" - }, - { - "complete": "clipboard.startImageUpload#1", - "params": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - }, - "reply": { - "ok": true, - "result": { - "uploadId": "upload-1" - } - } - }, - { - "complete": "clipboard.appendImageUploadChunk#1", - "params": { - "uploadId": "upload-1", - "offset": 0, - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - }, - "reply": { - "ok": true, - "result": { - "received": 32 - } - } - }, - { - "complete": "clipboard.commitImageUpload#1", - "params": { - "uploadId": "upload-1" - }, - "reply": { - "ok": true, - "result": "/tmp/img.png" - } - }, - { - "checkpoint": "blocked" - } - ] - }, { "id": "native-chat-image-paste-single", "operation": "nativeChat.image-paste", @@ -18344,335 +15861,6 @@ } ] }, - { - "id": "file-tap-resolve-miss", - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "sites": ["mobile/src/files/session-documents/mobile-file-tap-open.ts"], - "schedules": [], - "steps": [ - { - "action": "tap", - "id": "tap" - }, - { - "complete": "files.resolveTerminalPath#1", - "params": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "exists": false, - "isDirectory": false - } - } - }, - { - "checkpoint": "missed" - } - ] - }, - { - "id": "file-tap-resolve-refused", - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "sites": ["mobile/src/files/session-documents/mobile-file-tap-open.ts"], - "schedules": [], - "steps": [ - { - "action": "tap", - "id": "tap" - }, - { - "complete": "files.resolveTerminalPath#1", - "params": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "worktree_not_found", - "message": "No such workspace" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "file-tap-open-refused", - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "sites": ["mobile/src/files/session-documents/mobile-file-tap-open.ts"], - "schedules": [], - "steps": [ - { - "action": "tap", - "id": "tap" - }, - { - "complete": "files.resolveTerminalPath#1", - "params": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "exists": true, - "isDirectory": false, - "relativePath": "src/app.ts", - "openTarget": { - "kind": "worktree-file", - "relativePath": "src/app.ts", - "absolutePath": "/repo/src/app.ts", - "provider": "ssh" - } - } - } - }, - { - "complete": "files.open#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "src/app.ts" - }, - "reply": { - "ok": false, - "error": { - "code": "file_locked", - "message": "File is locked" - } - } - }, - { - "checkpoint": "open-refused" - } - ] - }, - { - "id": "file-tap-previews-absolute-artifact", - "operation": "files.terminal-path-tap", - "family": "files.terminal-path-tap", - "sites": ["mobile/src/files/session-documents/mobile-file-tap-open.ts"], - "schedules": [], - "steps": [ - { - "action": "tap", - "id": "tap" - }, - { - "complete": "files.resolveTerminalPath#1", - "params": { - "crossWorkspace": true, - "cwd": "/repo", - "pathText": "src/app.ts", - "terminal": "terminal-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "exists": true, - "isDirectory": false, - "openTarget": { - "kind": "absolute-file", - "absolutePath": "/logs/run.txt", - "grantId": "grant-1" - } - } - } - }, - { - "checkpoint": "previewed" - } - ] - }, - { - "id": "structured-launch-unsupported", - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "sites": [ - "mobile/src/session/native-chat/agent-session/mobile-structured-agent-session-launch.ts" - ], - "schedules": [], - "steps": [ - { - "action": "claude", - "id": "claude" - }, - { - "complete": "agentSession.createSupport#1", - "params": { - "agent": "claude", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "supported": false, - "reason": "remote" - } - } - }, - { - "checkpoint": "unsupported" - } - ] - }, - { - "id": "structured-launch-support-refused", - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "sites": [ - "mobile/src/session/native-chat/agent-session/mobile-structured-agent-session-launch.ts" - ], - "schedules": [], - "steps": [ - { - "action": "claude", - "id": "claude" - }, - { - "complete": "agentSession.createSupport#1", - "params": { - "agent": "claude", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method" - } - } - }, - { - "checkpoint": "unsupported" - } - ] - }, - { - "id": "structured-launch-created", - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "sites": [ - "mobile/src/session/native-chat/agent-session/mobile-structured-agent-session-launch.ts" - ], - "schedules": [], - "steps": [ - { - "action": "claude", - "id": "claude" - }, - { - "complete": "agentSession.createSupport#1", - "params": { - "agent": "claude", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "supported": true - } - } - }, - { - "complete": "agentSession.create#1", - "params": { - "agent": "claude", - "envelope": { - "clientOperationId": "1767225600000-00000000000040008000000000000002", - "expectedRuntimeFence": null, - "payloadFingerprint": "ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - }, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "value": { - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - } - } - }, - { - "checkpoint": "created" - } - ] - }, - { - "id": "structured-launch-definitive-refusal", - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-launch", - "sites": [ - "mobile/src/session/native-chat/agent-session/mobile-structured-agent-session-launch.ts" - ], - "schedules": [], - "steps": [ - { - "action": "claude", - "id": "claude" - }, - { - "complete": "agentSession.createSupport#1", - "params": { - "agent": "claude", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "supported": true - } - } - }, - { - "complete": "agentSession.create#1", - "params": { - "agent": "claude", - "envelope": { - "clientOperationId": "1767225600000-00000000000040008000000000000002", - "expectedRuntimeFence": null, - "payloadFingerprint": "ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - }, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "ok": false, - "refusal": { - "code": "agent_session_unsupported", - "message": "No agent" - } - } - } - }, - { - "checkpoint": "refused" - } - ] - }, { "id": "structured-launch-replays-dropped-create", "operation": "agentSession.structured-launch", @@ -20293,46 +17481,6 @@ } ] }, - { - "id": "files-explorer-readdir", - "operation": "files.explorer-screen", - "family": "files.explorer-screen", - "sites": ["mobile/src/files/explorer/MobileFileExplorerPanel.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "loading" - }, - { - "complete": "files.readDir#1", - "params": { - "worktree": "id:wt-files", - "relativePath": "", - "limit": 500 - }, - "reply": { - "ok": true, - "result": [ - { - "name": "src", - "isDirectory": true - }, - { - "name": "README.md", - "isDirectory": false - } - ] - } - }, - { - "checkpoint": "listed" - } - ] - }, { "id": "new-workspace-repositories-fulfilled", "operation": "workspace.repositories", @@ -20378,92 +17526,6 @@ } ] }, - { - "id": "codex-reset-credit-consumed", - "operation": "accounts.codex-reset-credit", - "family": "components.codex-reset-credit", - "sites": ["mobile/src/accounts/usage/codex-reset-credit.ts"], - "schedules": [], - "deviceStore": {}, - "steps": [ - { - "action": "confirm", - "id": "confirm" - }, - { - "checkpoint": "requested" - }, - { - "complete": "accounts.consumeCodexResetCredit#1", - "params": { - "idempotencyKey": "00000000-0000-4000-8000-000000000001", - "expectedScope": { - "target": { - "runtime": "host", - "wslDistro": null - }, - "accountId": "codex-1", - "accountRevision": 1700000000000, - "offerRevision": "v1:[1,null,null,[],null,null,1700000000000]" - } - }, - "reply": { - "ok": true, - "result": { - "outcome": "reset", - "scope": { - "target": { - "runtime": "host", - "wslDistro": null - }, - "accountId": "codex-1", - "accountRevision": 1700000000000, - "offerRevision": "v1:[1,null,null,[],null,null,1700000000000]" - }, - "snapshot": { - "claude": { - "accounts": [], - "activeAccountId": null - }, - "codex": { - "accounts": [ - { - "id": "codex-1", - "email": "codex@example.test", - "updatedAt": 1700000000000 - } - ], - "activeAccountId": "codex-1", - "activeAccountIdsByRuntime": { - "host": "codex-1", - "wsl": {} - } - }, - "rateLimits": { - "claude": null, - "codex": { - "provider": "codex", - "session": null, - "weekly": null, - "rateLimitResetCredits": { - "availableCount": 1 - }, - "updatedAt": 1700000000000, - "error": null, - "status": "ok" - }, - "inactiveClaudeAccounts": [], - "inactiveCodexAccounts": [] - } - } - } - } - }, - { - "checkpoint": "consumed" - } - ] - }, { "id": "terminal-paste-accepted", "operation": "session.terminal-clipboard", @@ -20797,174 +17859,6 @@ } ] }, - { - "id": "aivault-history-screen-worktrees", - "operation": "aiVault.history-screen", - "family": "aiVault.history-screen", - "sites": ["mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "worktrees-pending" - }, - { - "complete": "worktree.ps#1", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true - }, - "reply": { - "ok": true, - "result": { - "worktrees": [ - { - "worktreeId": "wt-history", - "path": "/repo/feature", - "repoId": "repo-1" - }, - { - "worktreeId": "wt-2", - "path": "/repo/sibling", - "repoId": "repo-1" - } - ] - } - } - }, - { - "bind": "platform-status", - "request": "status.get#1", - "params": { - "$undefined": true - } - }, - { - "complete": "platform-status", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["aiVault.v1"] - } - } - }, - { - "checkpoint": "worktrees-listed" - } - ] - }, - { - "id": "aivault-history-screen-listed", - "operation": "aiVault.history-screen", - "family": "aiVault.history-screen", - "sites": ["mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "worktrees-pending" - }, - { - "complete": "worktree.ps#1", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true - }, - "reply": { - "ok": true, - "result": { - "worktrees": [ - { - "worktreeId": "wt-history", - "path": "/repo/feature", - "repoId": "repo-1" - }, - { - "worktreeId": "wt-2", - "path": "/repo/sibling", - "repoId": "repo-1" - } - ] - } - } - }, - { - "bind": "platform-status", - "request": "status.get#1", - "params": { - "$undefined": true - } - }, - { - "complete": "platform-status", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["aiVault.v1"] - } - } - }, - { - "checkpoint": "worktrees-listed" - }, - { - "complete": "aiVault.listSessions#1", - "params": { - "force": false, - "limit": 500, - "scopeOnly": true, - "scopePaths": ["/repo/feature"] - }, - "reply": { - "ok": true, - "result": { - "sessions": [ - { - "id": "s1", - "executionHostId": "local", - "agent": "claude", - "sessionId": "sess-1", - "title": "Fix the explorer", - "cwd": "/repo/feature", - "branch": "feature", - "model": "opus", - "filePath": "/repo/feature/.claude/sess-1.jsonl", - "codexHome": null, - "createdAt": "2025-12-31T23:00:00.000Z", - "updatedAt": "2025-12-31T23:30:00.000Z", - "modifiedAt": "2025-12-31T23:30:00.000Z", - "messageCount": 4, - "totalTokens": 1200, - "previewMessages": [ - { - "role": "user", - "text": "fix it", - "timestamp": "2025-12-31T23:00:00.000Z" - } - ] - } - ], - "issues": [] - } - } - }, - { - "checkpoint": "ready" - } - ] - }, { "id": "tasks-route-repo-list", "operation": "tasks.route-repo-list", @@ -21012,40 +17906,6 @@ } ] }, - { - "id": "linear-select-workspace", - "operation": "linear.select-workspace-picker", - "family": "linear.select-workspace-picker", - "sites": ["mobile/src/tasks/screen/mobile-tasks-filter-pickers.tsx"], - "schedules": [], - "steps": [ - { - "action": "select-workspace", - "id": "select-b", - "args": { - "workspace": "workspace-b" - } - }, - { - "checkpoint": "selected" - }, - { - "complete": "linear.selectWorkspace#1", - "params": { - "workspaceId": "workspace-b" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "switched" - } - ] - }, { "id": "live-worktree-name-stream", "operation": "session.live-worktree-name", @@ -23686,59 +20546,6 @@ } ] }, - { - "id": "structured-agent-session-created", - "operation": "agentSession.structured-launch", - "family": "agentSession.structured-create", - "sites": [ - "mobile/src/session/native-chat/agent-session/mobile-structured-agent-session-launch.ts" - ], - "schedules": [], - "steps": [ - { - "action": "claude", - "id": "claude" - }, - { - "complete": "agentSession.createSupport#1", - "params": { - "agent": "claude", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "supported": true - } - } - }, - { - "complete": "agentSession.create#1", - "params": { - "agent": "claude", - "envelope": { - "clientOperationId": "1767225600000-00000000000040008000000000000002", - "expectedRuntimeFence": null, - "payloadFingerprint": "ce04a6ad4f07079b36cb0b4e9b1bcfd95481b5cb2428fbe93b3c0cf995ef8605", - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - }, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "value": { - "sessionId": "claude_00000000_0000_4000_8000_000000000001" - } - } - } - }, - { - "checkpoint": "created" - } - ] - }, { "id": "new-tab-local-agents", "operation": "settings.new-tab-agents", @@ -23800,157 +20607,6 @@ } ] }, - { - "id": "files-preview-worktree-text-read", - "operation": "files.preview-load", - "family": "files.preview-worktree-text", - "sites": ["mobile/src/files/preview/mobile-file-preview-request.ts"], - "schedules": [], - "steps": [ - { - "action": "worktree", - "id": "load" - }, - { - "complete": "files.read#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "docs/readme.md" - }, - "reply": { - "ok": true, - "result": { - "content": "# readme", - "truncated": false, - "byteLength": 8 - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-preview-worktree-image-read", - "operation": "files.preview-load", - "family": "files.preview-worktree-image", - "sites": ["mobile/src/files/preview/mobile-file-preview-request.ts"], - "schedules": [], - "steps": [ - { - "action": "worktree", - "id": "load", - "args": { - "path": "docs/logo.png" - } - }, - { - "complete": "files.readPreview#1", - "params": { - "worktree": "id:workspace-1", - "relativePath": "docs/logo.png" - }, - "reply": { - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "files-preview-artifact-image-read", - "operation": "files.preview-load", - "family": "files.preview-artifact-image", - "sites": ["mobile/src/files/preview/mobile-file-preview-request.ts"], - "schedules": [], - "steps": [ - { - "action": "artifact", - "id": "load", - "args": { - "path": "/logs/shot.png" - } - }, - { - "complete": "files.readTerminalArtifactPreview#1", - "params": { - "worktree": "id:workspace-1", - "absolutePath": "/logs/shot.png", - "grantId": "grant-1" - }, - "reply": { - "ok": true, - "result": { - "content": "aGk=", - "isBinary": true, - "isImage": true, - "mimeType": "image/png" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "mobile-web-bundle-manifest-read", - "operation": "mobileWeb.bundle-manifest", - "family": "mobileWeb.bundle-manifest", - "sites": ["mobile/src/transport/web-bundle/mobile-web-bundle-operations.ts"], - "schedules": [], - "steps": [ - { - "action": "read", - "id": "read" - }, - { - "complete": "mobileWeb.bundle.manifest#1", - "params": null, - "reply": { - "ok": true, - "result": { - "manifest": { - "schemaVersion": 1, - "buildId": "973c008f6baf56072d8d3d41f451e005257b59026401473543ce96e81c5aa177", - "desktopVersion": "1.4.201", - "minCompatibleRuntimeProtocolVersion": 2, - "runtimeProtocolVersion": 2, - "entrypoint": "index.html", - "totalBytes": 37, - "assets": [ - { - "path": "assets/app.js", - "sha256": "e99170780c392398db81fbb3dcaebc1a2c8264d4d8a9cd5932887e9c7206dc3d", - "byteLength": 11, - "contentType": "text/javascript; charset=utf-8" - }, - { - "path": "index.html", - "sha256": "483f915496f213c851665840f49b69e05b7a6bf70ec9d6939a831b15d298f31e", - "byteLength": 26, - "contentType": "text/html; charset=utf-8" - } - ] - }, - "chunkBytes": 16 - } - } - }, - { - "checkpoint": "manifest-read" - } - ] - }, { "id": "mobile-web-bundle-fetch-paged", "operation": "mobileWeb.bundle-fetch", @@ -24090,36 +20746,6 @@ } ] }, - { - "id": "mobile-web-bundle-unavailable", - "operation": "mobileWeb.bundle-fetch", - "family": "mobileWeb.bundle-fetch", - "sites": [ - "mobile/src/transport/web-bundle/mobile-web-bundle-fetch.ts", - "mobile/src/diagnostics/use-mobile-web-bundle-probe.ts" - ], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "complete": "mobileWeb.bundle.manifest#1", - "params": null, - "reply": { - "ok": false, - "error": { - "code": "invalid_argument", - "message": "mobile_web_bundle_unavailable" - } - } - }, - { - "checkpoint": "bundle-unavailable" - } - ] - }, { "id": "mobile-web-bundle-build-changed", "operation": "mobileWeb.bundle-fetch", diff --git a/mobile/src/test-support/rpc-recording/derived-goldens.ts b/mobile/src/test-support/rpc-recording/derived-goldens.ts index 9af29766d0f..ca5748330c5 100644 --- a/mobile/src/test-support/rpc-recording/derived-goldens.ts +++ b/mobile/src/test-support/rpc-recording/derived-goldens.ts @@ -22,7 +22,6 @@ const SIBLING_SCHEDULE_BASES = [ 'b3', 'settings-new-tab-ssh', 'settings-workspace-context-fulfilled', - 'settings-resume-metadata-fulfilled', 'settings-task-hydration-fulfilled', 'settings-repo-metadata-fulfilled' ] From 2c97e41cc6daa46b665f2a6b03c07cfd1e90a26c Mon Sep 17 00:00:00 2001 From: Jinjing <6427696+AmethystLiang@users.noreply.github.com> Date: Fri, 13 Nov 2026 12:27:19 -0800 Subject: [PATCH 02/49] fix(worktree-delete): cancel local at-risk ignored-file scans when the delete preview closes (STA-15114) (#41835) * fix(worktree-delete): cancel local at-risk ignored-file scans when the preview closes (STA-15114) The delete preview aborts its controller on close/retarget, but the local branch of getRuntimeWorktreeAtRiskLocalFiles dropped the signal and the git:atRiskLocalFiles IPC had no cancel channel, so main kept running queued/active git ls-files and file comparisons for obsolete previews. Mirror git:status cancellation: a per-request token plus git:cancelAtRiskLocalFiles aborts the sender-scoped controller whose signal now reaches readWorktreeAtRiskLocalFiles (admission, git child, compares). The web shim registers its controller before the worktree lookup and keeps the typed RuntimeRpcCallError unwrap for old-host fallback. * fix(worktree-delete): bound abortable web scan responses --- ...m-git-at-risk-local-files-handlers.test.ts | 126 ++++++++++++++++++ ...system-git-at-risk-local-files-handlers.ts | 51 +++++++ .../filesystem-git-status-handlers.ts | 27 +--- src/preload/api/source-control/git-bridge.ts | 3 + .../api/source-control/git-inspection-api.ts | 3 + .../git/runtime-git-client.test.ts | 51 ++++++- .../git/runtime-git-status-client.ts | 39 +++++- .../src/web/preload-api/web-git-api.ts | 8 +- .../web-git-at-risk-local-files-api.test.ts | 84 ++++++++++++ .../web-git-at-risk-local-files-api.ts | 62 +++++++++ 10 files changed, 416 insertions(+), 38 deletions(-) create mode 100644 src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.test.ts create mode 100644 src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.ts create mode 100644 src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.test.ts create mode 100644 src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.ts diff --git a/src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.test.ts b/src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.test.ts new file mode 100644 index 00000000000..ef107966f07 --- /dev/null +++ b/src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.test.ts @@ -0,0 +1,126 @@ +import { EventEmitter } from 'node:events' +import type { IpcMainInvokeEvent } from 'electron' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { createSenderScopedRequestCancellations } from '../sender-scoped-request-cancellation' +import type { FilesystemHandlerContext } from './filesystem-handler-context' + +const { handlers, readAtRiskMock } = vi.hoisted(() => ({ + handlers: new Map unknown>(), + readAtRiskMock: vi.fn() +})) + +vi.mock('electron', () => ({ + ipcMain: { + handle: (channel: string, handler: (event: IpcMainInvokeEvent, args: unknown) => unknown) => { + handlers.set(channel, handler) + } + } +})) +vi.mock('../../providers/execution-host-provider-dispatch', () => ({ + requireReachableGitRoute: vi.fn() +})) +vi.mock('./wsl-gated-worktree-git-read', () => ({ + readWorktreeGitUnlessWslStopped: ( + _store: unknown, + worktreePath: string, + _wake: unknown, + read: (path: string, gitOptions: { wslDistro?: string }) => Promise + ) => read(worktreePath, { wslDistro: undefined }) +})) +vi.mock('../local-worktree-runtime-options', () => ({ + getLocalRepoForRegisteredWorktree: vi.fn(() => ({ path: '/repo' })) +})) +vi.mock('../../git/worktrees/removal/worktree-at-risk-local-files', () => ({ + readWorktreeAtRiskLocalFiles: readAtRiskMock +})) + +import { registerFilesystemGitAtRiskLocalFilesHandlers } from './filesystem-git-at-risk-local-files-handlers' + +function requestEvent(id = 1): IpcMainInvokeEvent { + const sender = Object.assign(new EventEmitter(), { id }) + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the cancellation registry only reads sender.id and its EventEmitter lifetime methods. + return { sender } as unknown as IpcMainInvokeEvent +} + +function invoke(channel: string, event: IpcMainInvokeEvent, args: unknown): unknown { + const handler = handlers.get(channel) + if (!handler) { + throw new Error(`no handler for ${channel}`) + } + return handler(event, args) +} + +describe('git:atRiskLocalFiles cancellation', () => { + beforeEach(() => { + handlers.clear() + readAtRiskMock.mockReset() + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: these handlers only read store and the git status cancellation registry. + const context = { + store: {}, + gitStatusCancellations: createSenderScopedRequestCancellations() + } as unknown as FilesystemHandlerContext + registerFilesystemGitAtRiskLocalFilesHandlers(context) + }) + + it('aborts the scan when the renderer cancels its request token', async () => { + let scanSignal: AbortSignal | undefined + readAtRiskMock.mockImplementation( + (args: { gitOptions?: { signal?: AbortSignal } }) => + new Promise((_resolve, reject) => { + scanSignal = args.gitOptions?.signal + scanSignal?.addEventListener('abort', () => reject(new Error('aborted')), { once: true }) + }) + ) + const event = requestEvent() + + const scan = invoke('git:atRiskLocalFiles', event, { + worktreePath: '/repo-feature', + requestToken: 'at-risk-1' + }) + await vi.waitFor(() => expect(readAtRiskMock).toHaveBeenCalled()) + expect(scanSignal?.aborted).toBe(false) + + await invoke('git:cancelAtRiskLocalFiles', event, { + requestToken: 'at-risk-1' + }) + + expect(scanSignal?.aborted).toBe(true) + await expect(scan).rejects.toThrow('aborted') + }) + + it('does not let another window cancel the scan', async () => { + let scanSignal: AbortSignal | undefined + let startScan!: () => void + const scanStarted = new Promise((resolve) => { + startScan = resolve + }) + readAtRiskMock.mockImplementation( + (args: { gitOptions?: { signal?: AbortSignal } }) => + new Promise((_resolve, reject) => { + scanSignal = args.gitOptions?.signal + scanSignal?.addEventListener('abort', () => reject(new Error('aborted')), { once: true }) + startScan() + }) + ) + const owner = requestEvent(1) + + const scan = invoke('git:atRiskLocalFiles', owner, { + worktreePath: '/repo-feature', + requestToken: 'at-risk-1' + }) + const cancelled = expect(scan).rejects.toThrow('aborted') + await scanStarted + await invoke('git:cancelAtRiskLocalFiles', requestEvent(2), { + requestToken: 'at-risk-1' + }) + + const abortedByOtherWindow = scanSignal?.aborted + await invoke('git:cancelAtRiskLocalFiles', owner, { + requestToken: 'at-risk-1' + }) + + expect(scanSignal?.aborted).toBe(true) + await cancelled + expect(abortedByOtherWindow).toBe(false) + }) +}) diff --git a/src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.ts b/src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.ts new file mode 100644 index 00000000000..d239eccb004 --- /dev/null +++ b/src/main/ipc/filesystem/filesystem-git-at-risk-local-files-handlers.ts @@ -0,0 +1,51 @@ +import { ipcMain } from 'electron' +import { readWorktreeAtRiskLocalFiles } from '../../git/worktrees/removal/worktree-at-risk-local-files' +import type { WorktreeAtRiskLocalFiles } from '../../../shared/worktree/removal/at-risk-local-files' +import { getLocalRepoForRegisteredWorktree } from '../local-worktree-runtime-options' +import { requireReachableGitRoute } from '../../providers/execution-host-provider-dispatch' +import { getConnectionExecutionHostId } from '../../../shared/execution-host' +import type { FilesystemHandlerContext } from './filesystem-handler-context' +import { readWorktreeGitUnlessWslStopped } from './wsl-gated-worktree-git-read' + +/** Delete-preview ignored-file scans; a closed or retargeted preview cancels its queued or running scan. */ +export function registerFilesystemGitAtRiskLocalFilesHandlers( + context: FilesystemHandlerContext +): void { + // Request tokens are unique per scan, so these share the sender-scoped status registry. + const { store, gitStatusCancellations: cancellations } = context + ipcMain.handle( + 'git:atRiskLocalFiles', + async ( + event, + args: { + worktreePath: string + connectionId?: string + requestToken?: string + } + ): Promise => { + const controller = cancellations.begin(event, args.requestToken) + try { + requireReachableGitRoute(getConnectionExecutionHostId(args.connectionId)) + return await readWorktreeGitUnlessWslStopped( + store, + args.worktreePath, + false, + (worktreePath, gitOptions) => + readWorktreeAtRiskLocalFiles({ + worktreePath, + mainCheckoutPath: + getLocalRepoForRegisteredWorktree(store, args.worktreePath, worktreePath)?.path ?? + null, + gitOptions: controller ? { ...gitOptions, signal: controller.signal } : gitOptions + }) + ) + } finally { + cancellations.finish(event, args.requestToken, controller) + } + } + ) + + ipcMain.handle('git:cancelAtRiskLocalFiles', (event, args: { requestToken: string }): void => { + cancellations.cancel(event, args.requestToken) + }) +} diff --git a/src/main/ipc/filesystem/filesystem-git-status-handlers.ts b/src/main/ipc/filesystem/filesystem-git-status-handlers.ts index 81779a5a33b..495556f449b 100644 --- a/src/main/ipc/filesystem/filesystem-git-status-handlers.ts +++ b/src/main/ipc/filesystem/filesystem-git-status-handlers.ts @@ -16,11 +16,10 @@ import { } from '../../git/source-control/mutations/git-conflict-operation' import { getDiff } from '../../git/source-control/diffs/file-diff' import { registerFilesystemGitHistoryHandlers } from './filesystem-git-history-handlers' +import { registerFilesystemGitAtRiskLocalFilesHandlers } from './filesystem-git-at-risk-local-files-handlers' import { isGitWorktreeMutationInFlight } from '../../git/command-runner/git-worktree-mutation-state' import type { GitMutationInFlight } from '../../../shared/git/commands/git-mutation-in-flight' import { checkIgnoredPaths } from '../../git/source-control/ignores/check-ignored-paths' -import { readWorktreeAtRiskLocalFiles } from '../../git/worktrees/removal/worktree-at-risk-local-files' -import type { WorktreeAtRiskLocalFiles } from '../../../shared/worktree/removal/at-risk-local-files' import { appendFolderToGitignore, findKnownHugeFolderPathsToIgnore @@ -48,6 +47,7 @@ import { export function registerFilesystemGitStatusHandlers(context: FilesystemHandlerContext): void { const { store, gitStatusCancellations } = context registerFilesystemGitHistoryHandlers(context) + registerFilesystemGitAtRiskLocalFilesHandlers(context) ipcMain.handle( 'git:status', async ( @@ -173,29 +173,6 @@ export function registerFilesystemGitStatusHandlers(context: FilesystemHandlerCo } ) - ipcMain.handle( - 'git:atRiskLocalFiles', - async ( - _event, - args: { worktreePath: string; connectionId?: string } - ): Promise => { - requireReachableGitRoute(getConnectionExecutionHostId(args.connectionId)) - return readWorktreeGitUnlessWslStopped( - store, - args.worktreePath, - false, - (worktreePath, gitOptions) => - readWorktreeAtRiskLocalFiles({ - worktreePath, - mainCheckoutPath: - getLocalRepoForRegisteredWorktree(store, args.worktreePath, worktreePath)?.path ?? - null, - gitOptions - }) - ) - } - ) - ipcMain.handle( 'git:findHugeFoldersToIgnore', async (_event, args: { worktreePath: string }): Promise => diff --git a/src/preload/api/source-control/git-bridge.ts b/src/preload/api/source-control/git-bridge.ts index f3cd0546596..a421e77b9ee 100644 --- a/src/preload/api/source-control/git-bridge.ts +++ b/src/preload/api/source-control/git-bridge.ts @@ -54,7 +54,10 @@ export const gitApi = { atRiskLocalFiles: (args: { worktreePath: string connectionId?: string + requestToken?: string }): Promise => ipcRenderer.invoke('git:atRiskLocalFiles', args), + cancelAtRiskLocalFiles: (args: { requestToken: string }): Promise => + ipcRenderer.invoke('git:cancelAtRiskLocalFiles', args), findHugeFoldersToIgnore: (args: { worktreePath: string }): Promise => ipcRenderer.invoke('git:findHugeFoldersToIgnore', args), appendGitignore: (args: { worktreePath: string; folderName: string }): Promise => diff --git a/src/preload/api/source-control/git-inspection-api.ts b/src/preload/api/source-control/git-inspection-api.ts index 32fefdd910b..dbe0e49f0d3 100644 --- a/src/preload/api/source-control/git-inspection-api.ts +++ b/src/preload/api/source-control/git-inspection-api.ts @@ -60,7 +60,10 @@ export type GitInspectionApi = { atRiskLocalFiles: (args: { worktreePath: string connectionId?: string + /** Lets cancelAtRiskLocalFiles stop the scan once its preview closes. */ + requestToken?: string }) => Promise + cancelAtRiskLocalFiles: (args: { requestToken: string }) => Promise findHugeFoldersToIgnore: (args: { worktreePath: string }) => Promise refs: (args: { worktreePath: string diff --git a/src/renderer/src/runtime/source-control/git/runtime-git-client.test.ts b/src/renderer/src/runtime/source-control/git/runtime-git-client.test.ts index 36f2a88eaff..ee745b3a160 100644 --- a/src/renderer/src/runtime/source-control/git/runtime-git-client.test.ts +++ b/src/renderer/src/runtime/source-control/git/runtime-git-client.test.ts @@ -1,5 +1,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import { getRuntimeGitStatus } from './runtime-git-status-client' +import { + getRuntimeGitStatus, + getRuntimeWorktreeAtRiskLocalFiles +} from './runtime-git-status-client' import { createCompatibleRuntimeStatusResponseIfNeeded, type RuntimeEnvironmentCallRequest @@ -9,6 +12,8 @@ import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTest const gitStatus = vi.fn() const gitCancelStatus = vi.fn() const gitCheckIgnored = vi.fn() +const gitAtRiskLocalFiles = vi.fn() +const gitCancelAtRiskLocalFiles = vi.fn() const gitSubmoduleStatus = vi.fn() const gitDiff = vi.fn() const gitBranchCompare = vi.fn() @@ -34,6 +39,9 @@ beforeEach(() => { gitCancelStatus.mockReset() gitCancelStatus.mockResolvedValue(undefined) gitCheckIgnored.mockReset() + gitAtRiskLocalFiles.mockReset() + gitCancelAtRiskLocalFiles.mockReset() + gitCancelAtRiskLocalFiles.mockResolvedValue(undefined) gitSubmoduleStatus.mockReset() gitDiff.mockReset() gitBranchCompare.mockReset() @@ -61,6 +69,8 @@ beforeEach(() => { status: gitStatus, cancelStatus: gitCancelStatus, checkIgnored: gitCheckIgnored, + atRiskLocalFiles: gitAtRiskLocalFiles, + cancelAtRiskLocalFiles: gitCancelAtRiskLocalFiles, submoduleStatus: gitSubmoduleStatus, diff: gitDiff, branchCompare: gitBranchCompare, @@ -108,4 +118,43 @@ describe('runtime git client', () => { // Best-effort main cancellation may still resolve status; aborted calls must reject rather than publish fresh results. await expect(request).rejects.toMatchObject({ name: 'AbortError' }) }) + + it('cancels a local at-risk file scan in main when its signal aborts', async () => { + const controller = new AbortController() + let resolveScan!: (value: { count: number; samplePaths: string[]; complete: boolean }) => void + gitAtRiskLocalFiles.mockImplementation( + () => + new Promise((resolve) => { + resolveScan = resolve + }) + ) + + const request = getRuntimeWorktreeAtRiskLocalFiles( + { target: { kind: 'local' as const }, worktreeId: 'wt-1', worktreePath: '/repo-feature' }, + controller.signal + ) + await vi.waitFor(() => expect(gitAtRiskLocalFiles).toHaveBeenCalled()) + const requestToken = gitAtRiskLocalFiles.mock.calls[0]?.[0]?.requestToken + expect(requestToken).toEqual(expect.any(String)) + expect(gitCancelAtRiskLocalFiles).not.toHaveBeenCalled() + + controller.abort() + + expect(gitCancelAtRiskLocalFiles).toHaveBeenCalledWith({ requestToken }) + resolveScan({ count: 1, samplePaths: ['.env'], complete: true }) + await expect(request).rejects.toMatchObject({ name: 'AbortError' }) + }) + + it('does not start a local at-risk file scan for an already aborted signal', async () => { + const controller = new AbortController() + controller.abort() + + await expect( + getRuntimeWorktreeAtRiskLocalFiles( + { target: { kind: 'local' as const }, worktreeId: 'wt-1', worktreePath: '/repo-feature' }, + controller.signal + ) + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(gitAtRiskLocalFiles).not.toHaveBeenCalled() + }) }) diff --git a/src/renderer/src/runtime/source-control/git/runtime-git-status-client.ts b/src/renderer/src/runtime/source-control/git/runtime-git-status-client.ts index d50c29f00f6..8d6aff40daf 100644 --- a/src/renderer/src/runtime/source-control/git/runtime-git-status-client.ts +++ b/src/renderer/src/runtime/source-control/git/runtime-git-status-client.ts @@ -96,8 +96,8 @@ export async function setRuntimeGitStatusUpstreamRefWatch( let nextGitStatusRequestToken = 0 -function createGitStatusAbortError(): Error { - const error = new Error('Git status request aborted') +function createGitRequestAbortError(): Error { + const error = new Error('Git request aborted') error.name = 'AbortError' return error } @@ -110,7 +110,7 @@ async function callLocalGitStatus( return window.api.git.status(args) } if (signal.aborted) { - throw createGitStatusAbortError() + throw createGitRequestAbortError() } const requestToken = `git-status-${Date.now()}-${++nextGitStatusRequestToken}` const cancel = (): void => { @@ -121,7 +121,7 @@ async function callLocalGitStatus( const status = await window.api.git.status({ ...args, requestToken }) // Why: best-effort cancellation must not publish a late result as fresh. if (signal.aborted) { - throw createGitStatusAbortError() + throw createGitRequestAbortError() } return status } finally { @@ -179,10 +179,11 @@ export async function getRuntimeWorktreeAtRiskLocalFiles( signal?: AbortSignal ): Promise { if (context.target.kind === 'local' || !context.worktreeId) { - return window.api.git.atRiskLocalFiles({ + const args = { worktreePath: resolveLocalWorktreePath(context), connectionId: context.connectionId - }) + } + return signal ? callLocalAtRiskLocalFiles(args, signal) : window.api.git.atRiskLocalFiles(args) } return callRuntimeRpc( context.target, @@ -192,6 +193,32 @@ export async function getRuntimeWorktreeAtRiskLocalFiles( ) } +let nextAtRiskLocalFilesRequestToken = 0 + +async function callLocalAtRiskLocalFiles( + args: { worktreePath: string; connectionId?: string }, + signal: AbortSignal +): Promise { + if (signal.aborted) { + throw createGitRequestAbortError() + } + const requestToken = `git-at-risk-${Date.now()}-${++nextAtRiskLocalFilesRequestToken}` + // Why: a closed preview must stop main's queued git ls-files and file comparisons, not just drop the result. + const cancel = (): void => { + void window.api.git.cancelAtRiskLocalFiles({ requestToken }).catch(() => {}) + } + signal.addEventListener('abort', cancel, { once: true }) + try { + const files = await window.api.git.atRiskLocalFiles({ ...args, requestToken }) + if (signal.aborted) { + throw createGitRequestAbortError() + } + return files + } finally { + signal.removeEventListener('abort', cancel) + } +} + export async function getRuntimeGitRefs( context: RuntimeGitContext, query?: string diff --git a/src/renderer/src/web/preload-api/web-git-api.ts b/src/renderer/src/web/preload-api/web-git-api.ts index 7e9a5b5c5e6..3c859670d9b 100644 --- a/src/renderer/src/web/preload-api/web-git-api.ts +++ b/src/renderer/src/web/preload-api/web-git-api.ts @@ -5,6 +5,7 @@ import { callAbortableRuntimeEnvironment } from '../../runtime/rpc/calls/abortab import { toRuntimeWorktreeSelector } from '../../runtime/rpc/targets/runtime-worktree-selector' import { translate } from '@/i18n/i18n' import { callRuntimeResult } from './web-runtime-calls' +import { createWebGitAtRiskLocalFilesApi } from './web-git-at-risk-local-files-api' import { mutateGitPath, mutateGitPaths, resolveGitConflict } from './web-git-mutations' import { requireGitStageWorktreeScopeReceipt } from '../../../../shared/git/paths/git-stage-worktree-scope' import { requireActiveEnvironment, updateEnvironmentFromResponse } from './web-runtime-session' @@ -88,12 +89,7 @@ export function createGitApi(): NonNullable['git']> { paths }) }, - atRiskLocalFiles: async ({ worktreePath }) => { - const worktree = await resolveRuntimeWorktreeByPath(worktreePath) - return callRuntimeResult('git.atRiskLocalFiles', { - worktree: toRuntimeWorktreeSelector(worktree.id) - }) - }, + ...createWebGitAtRiskLocalFilesApi(), // Why: the "add huge folder to .gitignore" flow is desktop-only; the web runtime makes no offer, so return no candidates. findHugeFoldersToIgnore: async () => [], appendGitignore: async () => false, diff --git a/src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.test.ts b/src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.test.ts new file mode 100644 index 00000000000..b3580dd18e0 --- /dev/null +++ b/src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.test.ts @@ -0,0 +1,84 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { RuntimeRpcCallError } from '../../runtime/rpc/calls/runtime-rpc-result' + +const { resolveWorktreeMock, abortableCallMock } = vi.hoisted(() => ({ + resolveWorktreeMock: vi.fn(), + abortableCallMock: vi.fn() +})) + +vi.mock('./web-runtime-worktree-catalog', () => ({ + resolveRuntimeWorktreeByPath: resolveWorktreeMock, + resolveRuntimeFilePath: vi.fn() +})) +vi.mock('./web-runtime-session', () => ({ + requireActiveEnvironment: () => ({ id: 'env-1' }), + updateEnvironmentFromResponse: vi.fn() +})) +vi.mock('../../runtime/rpc/calls/abortable-runtime-environment-call', async (importOriginal) => ({ + ...(await importOriginal>()), + callAbortableRuntimeEnvironment: abortableCallMock +})) + +import { createWebGitAtRiskLocalFilesApi } from './web-git-at-risk-local-files-api' + +describe('web git atRiskLocalFiles', () => { + beforeEach(() => { + resolveWorktreeMock.mockReset() + abortableCallMock.mockReset() + }) + + it('keeps a cancel that lands during the worktree lookup', async () => { + const api = createWebGitAtRiskLocalFilesApi() + let resolveWorktree!: (worktree: { id: string }) => void + resolveWorktreeMock.mockReturnValue( + new Promise((resolve) => { + resolveWorktree = resolve + }) + ) + let dispatchedSignal: AbortSignal | undefined + abortableCallMock.mockImplementation( + (_env: string, _method: string, _params: unknown, _timeout: unknown, signal: AbortSignal) => { + dispatchedSignal = signal + return signal.aborted + ? Promise.reject(Object.assign(new Error('aborted'), { name: 'AbortError' })) + : Promise.resolve({ + id: '1', + ok: true, + result: { count: 0, samplePaths: [], complete: true } + }) + } + ) + + const scan = api.atRiskLocalFiles({ + worktreePath: '/repo-feature', + requestToken: 'at-risk-1' + }) + await api.cancelAtRiskLocalFiles({ requestToken: 'at-risk-1' }) + resolveWorktree({ id: 'wt-1' }) + + await expect(scan).rejects.toMatchObject({ name: 'AbortError' }) + // The real call rejects an aborted signal before dispatching any RPC. + expect(dispatchedSignal?.aborted ?? true).toBe(true) + }) + + it('keeps method_not_found typed so older hosts fall back', async () => { + const api = createWebGitAtRiskLocalFilesApi() + resolveWorktreeMock.mockResolvedValue({ id: 'wt-1' }) + abortableCallMock.mockResolvedValue({ + id: '1', + ok: false, + error: { + code: 'method_not_found', + message: 'Unknown method: git.atRiskLocalFiles' + } + }) + + const scan = api.atRiskLocalFiles({ + worktreePath: '/repo-feature', + requestToken: 'at-risk-2' + }) + + await expect(scan).rejects.toBeInstanceOf(RuntimeRpcCallError) + await expect(scan).rejects.toMatchObject({ code: 'method_not_found' }) + }) +}) diff --git a/src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.ts b/src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.ts new file mode 100644 index 00000000000..17f8aea15d6 --- /dev/null +++ b/src/renderer/src/web/preload-api/web-git-at-risk-local-files-api.ts @@ -0,0 +1,62 @@ +import type { PreloadApi } from '../../../../preload/api-types' +import type { WorktreeAtRiskLocalFiles } from '../../../../shared/worktree/removal/at-risk-local-files' +import { callAbortableRuntimeEnvironment } from '../../runtime/rpc/calls/abortable-runtime-environment-call' +import { unwrapRuntimeRpcResult } from '../../runtime/rpc/calls/runtime-rpc-result' +import { toRuntimeWorktreeSelector } from '../../runtime/rpc/targets/runtime-worktree-selector' +import { callRuntimeResult } from './web-runtime-calls' +import { requireActiveEnvironment, updateEnvironmentFromResponse } from './web-runtime-session' +import { resolveRuntimeWorktreeByPath } from './web-runtime-worktree-catalog' + +type WebGitAtRiskLocalFilesApi = Pick< + PreloadApi['git'], + 'atRiskLocalFiles' | 'cancelAtRiskLocalFiles' +> + +const abortControllers = new Map() + +async function callAbortableAtRiskLocalFiles( + requestToken: string, + worktreePath: string +): Promise { + abortControllers.get(requestToken)?.abort() + // Registered before the worktree lookup so a cancel that lands during it still stops the scan. + const controller = new AbortController() + abortControllers.set(requestToken, controller) + try { + const worktree = await resolveRuntimeWorktreeByPath(worktreePath) + const environment = requireActiveEnvironment() + // Rejects without dispatching once aborted; unsubscribing closes the host request context. + const response = await callAbortableRuntimeEnvironment( + environment.id, + 'git.atRiskLocalFiles', + { worktree: toRuntimeWorktreeSelector(worktree.id) }, + 30_000, + controller.signal + ) + updateEnvironmentFromResponse(environment, response) + // Typed unwrap keeps method_not_found, which the delete dialog treats as an older host. + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: git.atRiskLocalFiles resolves WorktreeAtRiskLocalFiles; the callRuntimeResult path trusts the same contract. + return unwrapRuntimeRpcResult(response) as WorktreeAtRiskLocalFiles + } finally { + if (abortControllers.get(requestToken) === controller) { + abortControllers.delete(requestToken) + } + } +} + +export function createWebGitAtRiskLocalFilesApi(): WebGitAtRiskLocalFilesApi { + return { + atRiskLocalFiles: async ({ worktreePath, requestToken }) => { + if (requestToken) { + return callAbortableAtRiskLocalFiles(requestToken, worktreePath) + } + const worktree = await resolveRuntimeWorktreeByPath(worktreePath) + return callRuntimeResult('git.atRiskLocalFiles', { + worktree: toRuntimeWorktreeSelector(worktree.id) + }) + }, + cancelAtRiskLocalFiles: async ({ requestToken }) => { + abortControllers.get(requestToken)?.abort() + } + } +} From c12e63619bc1e929ab4519d8429ae0dccec1b55a Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 12:35:50 -0800 Subject: [PATCH 03/49] test: remove low-value RPC recording scenarios (#42123) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- mobile/rpc-foundation/goldens/b2.json | 171 - .../goldens/host-worktree-refresh-stream.json | 182 - .../native-chat-image-paste-single.json | 175 - ...ative-chat-image-upload-start-refused.json | 85 - .../goldens/native-chat-image-upload-two.json | 326 - ...native-chat-session-option-pick-empty.json | 36 - ...tive-chat-session-option-pick-refused.json | 84 - ...tive-chat-session-option-pick-written.json | 83 - .../goldens/native-chat-write-accepted.json | 82 - .../goldens/native-chat-write-clear-line.json | 82 - .../goldens/native-chat-write-rejected.json | 82 - .../native-chat-write-typed-command.json | 226 - .../new-workspace-repositories-fulfilled.json | 139 - .../goldens/notifications-desktop-stream.json | 236 - .../notifications-display-test-accepted.json | 182 - ...re-profile-direct-wins-and-provisions.json | 270 - .../pairing-pre-profile-times-out.json | 132 - .../goldens/quick-commands-load-refused.json | 80 - .../goldens/relay-direct-upgrade-commits.json | 229 - ...ect-upgrade-unsupported-host-declines.json | 84 - ...lay-pairing-recovery-resume-committed.json | 130 - .../relay-rotation-installs-and-commits.json | 243 - .../goldens/session-browser-tab-created.json | 93 - .../session-create-browser-refused.json | 88 - .../goldens/session-create-browser-tab.json | 93 - .../goldens/session-create-markdown-note.json | 207 - .../session-create-terminal-refused.json | 159 - .../session-create-terminal-with-prompt.json | 305 - .../goldens/settings-repo-metadata-icons.json | 509 -- ...tings-repo-metadata-refuse-after-data.json | 829 --- .../settings-repo-metadata-refused.json | 420 -- ...ettings-repo-metadata-transport-error.json | 417 -- .../settings-task-hydration-refused.json | 846 --- .../goldens/settings-task-write.json | 118 - .../goldens/tasks-route-repo-list.json | 176 - .../goldens/tk-create-github.json | 240 - .../goldens/tk-create-gitlab.json | 170 - .../goldens/tk-create-linear.json | 187 - .../goldens/tk-item-metadata-gitlab-mr.json | 315 - .../goldens/tk-item-reply-merge.json | 1013 --- .../goldens/tk-item-review-github.json | 881 --- .../goldens/tk-item-status-gitlab-mr.json | 233 - .../goldens/tk-item-status-gitlab.json | 498 -- .../goldens/tk-linear-connect.json | 129 - .../goldens/tk-linear-team-context.json | 270 - .../goldens/tk-list-gitlab-items.json | 190 - .../goldens/tk-list-gitlab-todos.json | 178 - .../goldens/tk-list-linear.json | 420 -- .../goldens/tk-project-board-load.json | 630 -- .../goldens/tk-project-repo-slugs.json | 100 - .../tk-project-row-comments-issue.json | 678 --- .../goldens/tk-project-row-comments-pr.json | 237 - .../goldens/tk-project-row-fields.json | 817 --- .../goldens/tk-project-row-files-merge.json | 895 --- .../goldens/tk-project-row-metadata-load.json | 289 - .../goldens/tk-project-row-review-checks.json | 843 --- .../goldens/tk-project-row-threads.json | 712 --- .../goldens/tk-provider-load.json | 444 -- .../goldens/tw-paste-lookup-resolved.json | 466 -- .../goldens/tw-paste-lookup-slug-refused.json | 131 - .../tw-paste-lookup-slug-unsupported.json | 127 - .../goldens/tw-setup-hook-trust-always.json | 88 - .../goldens/tw-setup-hook-trust-approved.json | 94 - .../tw-smart-search-all-providers.json | 727 --- ...tw-smart-search-gitlab-provider-error.json | 161 - .../tw-smart-search-linear-listed.json | 138 - .../tw-workspace-source-presets-refused.json | 149 - .../goldens/tw-workspace-source-presets.json | 272 - .../tw-workspace-sparse-missing-preset.json | 160 - .../goldens/tw-workspace-sparse-saved.json | 233 - .../tw-workspace-ssh-connect-refused.json | 283 - .../goldens/tw-workspace-ssh-connected.json | 325 - .../tw-workspace-ssh-local-agents.json | 101 - .../goldens/tw-workspace-ssh-not-ready.json | 271 - .../worktree-catalog-snapshot-unreadable.json | 126 - .../goldens/worktree-catalog-snapshot.json | 181 - .../goldens/worktree-home-catalog.json | 158 - .../goldens/worktree-retired-names.json | 127 - mobile/rpc-foundation/pilot-scenarios.json | 5421 ----------------- 79 files changed, 27707 deletions(-) delete mode 100644 mobile/rpc-foundation/goldens/b2.json delete mode 100644 mobile/rpc-foundation/goldens/host-worktree-refresh-stream.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-image-paste-single.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-image-upload-start-refused.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-image-upload-two.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-session-option-pick-empty.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-session-option-pick-refused.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-session-option-pick-written.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-write-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-write-clear-line.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-write-rejected.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-write-typed-command.json delete mode 100644 mobile/rpc-foundation/goldens/new-workspace-repositories-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/notifications-desktop-stream.json delete mode 100644 mobile/rpc-foundation/goldens/notifications-display-test-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/pairing-pre-profile-direct-wins-and-provisions.json delete mode 100644 mobile/rpc-foundation/goldens/pairing-pre-profile-times-out.json delete mode 100644 mobile/rpc-foundation/goldens/quick-commands-load-refused.json delete mode 100644 mobile/rpc-foundation/goldens/relay-direct-upgrade-commits.json delete mode 100644 mobile/rpc-foundation/goldens/relay-direct-upgrade-unsupported-host-declines.json delete mode 100644 mobile/rpc-foundation/goldens/relay-pairing-recovery-resume-committed.json delete mode 100644 mobile/rpc-foundation/goldens/relay-rotation-installs-and-commits.json delete mode 100644 mobile/rpc-foundation/goldens/session-browser-tab-created.json delete mode 100644 mobile/rpc-foundation/goldens/session-create-browser-refused.json delete mode 100644 mobile/rpc-foundation/goldens/session-create-browser-tab.json delete mode 100644 mobile/rpc-foundation/goldens/session-create-markdown-note.json delete mode 100644 mobile/rpc-foundation/goldens/session-create-terminal-refused.json delete mode 100644 mobile/rpc-foundation/goldens/session-create-terminal-with-prompt.json delete mode 100644 mobile/rpc-foundation/goldens/settings-repo-metadata-icons.json delete mode 100644 mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json delete mode 100644 mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json delete mode 100644 mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json delete mode 100644 mobile/rpc-foundation/goldens/settings-task-hydration-refused.json delete mode 100644 mobile/rpc-foundation/goldens/settings-task-write.json delete mode 100644 mobile/rpc-foundation/goldens/tasks-route-repo-list.json delete mode 100644 mobile/rpc-foundation/goldens/tk-create-github.json delete mode 100644 mobile/rpc-foundation/goldens/tk-create-gitlab.json delete mode 100644 mobile/rpc-foundation/goldens/tk-create-linear.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-metadata-gitlab-mr.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-reply-merge.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-review-github.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-status-gitlab-mr.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-status-gitlab.json delete mode 100644 mobile/rpc-foundation/goldens/tk-linear-connect.json delete mode 100644 mobile/rpc-foundation/goldens/tk-linear-team-context.json delete mode 100644 mobile/rpc-foundation/goldens/tk-list-gitlab-items.json delete mode 100644 mobile/rpc-foundation/goldens/tk-list-gitlab-todos.json delete mode 100644 mobile/rpc-foundation/goldens/tk-list-linear.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-board-load.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-repo-slugs.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-comments-issue.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-comments-pr.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-fields.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-files-merge.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-metadata-load.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-review-checks.json delete mode 100644 mobile/rpc-foundation/goldens/tk-project-row-threads.json delete mode 100644 mobile/rpc-foundation/goldens/tk-provider-load.json delete mode 100644 mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json delete mode 100644 mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json delete mode 100644 mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json delete mode 100644 mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json delete mode 100644 mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json delete mode 100644 mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json delete mode 100644 mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json delete mode 100644 mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-source-presets.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json delete mode 100644 mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json delete mode 100644 mobile/rpc-foundation/goldens/worktree-catalog-snapshot-unreadable.json delete mode 100644 mobile/rpc-foundation/goldens/worktree-catalog-snapshot.json delete mode 100644 mobile/rpc-foundation/goldens/worktree-home-catalog.json delete mode 100644 mobile/rpc-foundation/goldens/worktree-retired-names.json diff --git a/mobile/rpc-foundation/goldens/b2.json b/mobile/rpc-foundation/goldens/b2.json deleted file mode 100644 index 42b19181b12..00000000000 --- a/mobile/rpc-foundation/goldens/b2.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "project.update-metadata", - "family": "project-explicit-false", - "namedDeltas": [], - "values": { - "0c4dced3e005": { - "error": "", - "mutating": true, - "row": { - "content": { - "assignees": [], - "labels": [], - "number": 1, - "repository": "owner/repo" - }, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "1158580f696d": { - "name": "github.project.updateIssueBySlug#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "github.project.updateIssueBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "number": 1, - "owner": "owner", - "repo": "repo", - "updates": { - "addLabels": ["recorded"] - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "$rpc": "null" - } - } - } - }, - "5d32aa29303c": { - "name": "projectMutating", - "ordinal": 1, - "value": true - }, - "7ecf3a14081d": { - "name": "github.project.updateIssueBySlug#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "github.project.updateIssueBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "number": 1, - "owner": "owner", - "repo": "repo", - "updates": { - "addLabels": ["recorded"] - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "87a06aebc58e": { - "error": "The host sent a reply this app could not read (github.project.updateIssueBySlug)", - "mutating": false, - "row": { - "content": { - "assignees": [], - "labels": [], - "number": 1, - "repository": "owner/repo" - }, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "c4a308482e58": { - "name": "github.project.updateIssueBySlug#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updateIssueBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"number\":1,\"updates\":{\"addLabels\":[\"recorded\"]}}}" - }, - "cee96a551fcd": { - "name": "projectRowDetailError", - "ordinal": 4, - "value": "The host sent a reply this app could not read (github.project.updateIssueBySlug)" - }, - "e9296dde8e41": { - "name": "projectMutating", - "ordinal": 5, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "b2", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["7ecf3a14081d"], - "payloads": ["c4a308482e58"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "9270aeb7d9c6" - }, - "state": "0c4dced3e005", - "effects": ["5d32aa29303c"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["1158580f696d"], - "payloads": ["c4a308482e58"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "eb79a9b3682a" - }, - "state": "87a06aebc58e", - "effects": ["5d32aa29303c", "cee96a551fcd", "e9296dde8e41"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/host-worktree-refresh-stream.json b/mobile/rpc-foundation/goldens/host-worktree-refresh-stream.json deleted file mode 100644 index c03d48f7bea..00000000000 --- a/mobile/rpc-foundation/goldens/host-worktree-refresh-stream.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "worktree.host-refresh", - "family": "host-worktree-refresh", - "namedDeltas": [], - "values": { - "322d549d1882": { - "refreshWorktrees": 0, - "running": true, - "syncViewSettings": 2 - }, - "354b03a10a5d": { - "name": "syncViewSettings", - "ordinal": 5, - "value": { - "options": { - "resend": true - } - } - }, - "6ab454a38bb0": { - "name": "runtime.clientEvents.unsubscribe#2", - "ordinal": 6, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.unsubscribe\",\"params\":{\"subscriptionId\":\"sub-2\"}}" - }, - "85612713e3f0": { - "name": "runtime.clientEvents.unsubscribe#1", - "ordinal": 4, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.unsubscribe\",\"params\":{\"subscriptionId\":\"sub-1\"}}" - }, - "85ed79b276e4": { - "refreshWorktrees": 0, - "running": true, - "syncViewSettings": 1 - }, - "a507a5cf0d43": { - "name": "syncViewSettings", - "ordinal": 2, - "value": { - "options": { - "resend": true - } - } - }, - "cc261d80eae0": { - "name": "runtime.clientEvents.subscribe#2", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "e3e3030326f0": { - "refreshWorktrees": 0, - "running": false, - "syncViewSettings": 2 - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "f2af146a9f12": { - "status": "fulfilled", - "startedAt": 3000, - "settledAt": 3000, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "host-worktree-refresh-stream", - "checkpoints": [ - { - "id": "started", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "85ed79b276e4", - "effects": ["a507a5cf0d43"] - } - }, - { - "id": "ready", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "85ed79b276e4", - "effects": ["a507a5cf0d43"] - } - }, - { - "id": "worktrees-changed", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "85ed79b276e4", - "effects": ["a507a5cf0d43"] - } - }, - { - "id": "polled", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "85ed79b276e4", - "effects": ["a507a5cf0d43"] - } - }, - { - "id": "repos-changed", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "85ed79b276e4", - "effects": ["a507a5cf0d43"] - } - }, - { - "id": "re-subscribed", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773", "cc261d80eae0", "85612713e3f0"], - "settlements": { - "start": "eb79a9b3682a", - "cutover": "f2af146a9f12" - }, - "state": "85ed79b276e4", - "effects": ["a507a5cf0d43"] - } - }, - { - "id": "replayed", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773", "cc261d80eae0", "85612713e3f0"], - "settlements": { - "start": "eb79a9b3682a", - "cutover": "f2af146a9f12" - }, - "state": "322d549d1882", - "effects": ["a507a5cf0d43", "354b03a10a5d"] - } - }, - { - "id": "stopped", - "observation": { - "sender": [], - "payloads": ["eef1ee3c2773", "cc261d80eae0", "85612713e3f0", "6ab454a38bb0"], - "settlements": { - "start": "eb79a9b3682a", - "cutover": "f2af146a9f12", - "stop": "f2af146a9f12" - }, - "state": "e3e3030326f0", - "effects": ["a507a5cf0d43", "354b03a10a5d"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-image-paste-single.json b/mobile/rpc-foundation/goldens/native-chat-image-paste-single.json deleted file mode 100644 index d0da2bf95c9..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-image-paste-single.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.image-paste", - "family": "nativeChat.image-paste", - "namedDeltas": [], - "values": { - "0f02c1a90f93": { - "name": "terminal.send#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "15a9fbee07a2": { - "name": "terminal.read#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.read" - }, - { - "name": "params", - "value": { - "limit": 1, - "screen": true, - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 2000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "terminal": {} - } - } - } - }, - "40c4c5738c96": { - "name": "terminal.send#2", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b[200~@/tmp/a.png\\u001b[201~ \",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "47a22f9d0047": { - "failure": { - "$rpc": "null" - }, - "pasted": true - }, - "703c117d5bca": { - "name": "terminal.send#2", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u001b[200~@/tmp/a.png\u001b[201~ " - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "a3e305c984c6": { - "name": "terminal.send#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "abebd0f45ba2": { - "name": "terminal.read#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.read\",\"params\":{\"terminal\":\"terminal-1\",\"screen\":true,\"limit\":1}}" - } - }, - "recording": { - "scenario": "native-chat-image-paste-single", - "checkpoints": [ - { - "id": "pasted", - "observation": { - "sender": ["15a9fbee07a2", "a3e305c984c6", "703c117d5bca"], - "payloads": ["abebd0f45ba2", "0f02c1a90f93", "40c4c5738c96"], - "settlements": { - "one": "84e5ca07cb7a" - }, - "state": "47a22f9d0047", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-image-upload-start-refused.json b/mobile/rpc-foundation/goldens/native-chat-image-upload-start-refused.json deleted file mode 100644 index 4c23ed09fc1..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-image-upload-start-refused.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.image-upload", - "family": "nativeChat.image-upload", - "namedDeltas": [], - "values": { - "3c402c915494": { - "name": "clipboard.startImageUpload#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "clipboard.startImageUpload" - }, - { - "name": "params", - "value": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "too_large", - "message": "Image is too large" - }, - "id": "frame-1", - "ok": false - } - } - }, - "6696a47819e1": { - "name": "clipboard.startImageUpload#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.startImageUpload\",\"params\":{\"expectedBase64Length\":32,\"connectionId\":\"connection-1\"}}" - }, - "765ab192e1a5": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Image is too large", - "isRpcDeliveryUnknown": false - } - }, - "994fccf9b305": { - "name": "upload-start", - "ordinal": 1, - "value": {} - }, - "b2b1a4389f58": { - "failure": "Image is too large", - "uploaded": "unuploaded" - } - }, - "recording": { - "scenario": "native-chat-image-upload-start-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["3c402c915494"], - "payloads": ["6696a47819e1"], - "settlements": { - "normal": "765ab192e1a5" - }, - "state": "b2b1a4389f58", - "effects": ["994fccf9b305"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-image-upload-two.json b/mobile/rpc-foundation/goldens/native-chat-image-upload-two.json deleted file mode 100644 index 3581f44ea22..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-image-upload-two.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.image-upload", - "family": "nativeChat.image-upload", - "namedDeltas": [], - "values": { - "31f4965e4ed4": { - "name": "image-uploaded", - "ordinal": 8, - "value": { - "path": "/tmp/img-1.png", - "previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - } - }, - "5c19acb9611e": { - "name": "clipboard.commitImageUpload#2", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "clipboard.commitImageUpload" - }, - { - "name": "params", - "value": { - "uploadId": "upload-2" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": "/tmp/img-2.png" - } - } - }, - "6696a47819e1": { - "name": "clipboard.startImageUpload#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.startImageUpload\",\"params\":{\"expectedBase64Length\":32,\"connectionId\":\"connection-1\"}}" - }, - "7c2e3ea286aa": { - "name": "clipboard.startImageUpload#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "clipboard.startImageUpload" - }, - { - "name": "params", - "value": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "uploadId": "upload-1" - } - } - } - }, - "814ccd56a769": { - "name": "clipboard.appendImageUploadChunk#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.appendImageUploadChunk\",\"params\":{\"uploadId\":\"upload-1\",\"offset\":0,\"contentBase64\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}}" - }, - "8452698ac11a": { - "name": "clipboard.commitImageUpload#1", - "ordinal": 7, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.commitImageUpload\",\"params\":{\"uploadId\":\"upload-1\"}}" - }, - "87c17cf78a60": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "path": "/tmp/img-1.png", - "previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - }, - { - "path": "/tmp/img-2.png", - "previewUri": "file:///b.png" - } - ] - }, - "994fccf9b305": { - "name": "upload-start", - "ordinal": 1, - "value": {} - }, - "a77c2409e01f": { - "name": "clipboard.commitImageUpload#2", - "ordinal": 14, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.commitImageUpload\",\"params\":{\"uploadId\":\"upload-2\"}}" - }, - "ae523d108575": { - "name": "clipboard.appendImageUploadChunk#2", - "ordinal": 12, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.appendImageUploadChunk\",\"params\":{\"uploadId\":\"upload-2\",\"offset\":0,\"contentBase64\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}}" - }, - "b437cd69b0bf": { - "name": "clipboard.startImageUpload#2", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "clipboard.startImageUpload" - }, - { - "name": "params", - "value": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "uploadId": "upload-2" - } - } - } - }, - "d7c8ee357003": { - "name": "clipboard.appendImageUploadChunk#2", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "clipboard.appendImageUploadChunk" - }, - { - "name": "params", - "value": { - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "offset": 0, - "uploadId": "upload-2" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "received": 32 - } - } - } - }, - "d7dc1460b465": { - "name": "image-uploaded", - "ordinal": 15, - "value": { - "path": "/tmp/img-2.png", - "previewUri": "file:///b.png" - } - }, - "e74ddb684ed1": { - "name": "clipboard.startImageUpload#2", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.startImageUpload\",\"params\":{\"expectedBase64Length\":32,\"connectionId\":\"connection-1\"}}" - }, - "ec8f73d25f26": { - "name": "clipboard.commitImageUpload#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "clipboard.commitImageUpload" - }, - { - "name": "params", - "value": { - "uploadId": "upload-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": "/tmp/img-1.png" - } - } - }, - "f05e4695ffa3": { - "name": "clipboard.appendImageUploadChunk#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "clipboard.appendImageUploadChunk" - }, - { - "name": "params", - "value": { - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "offset": 0, - "uploadId": "upload-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "received": 32 - } - } - } - }, - "f6cdfabc3790": { - "failure": { - "$rpc": "null" - }, - "uploaded": [ - { - "path": "/tmp/img-1.png", - "previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - }, - { - "path": "/tmp/img-2.png", - "previewUri": "file:///b.png" - } - ] - } - }, - "recording": { - "scenario": "native-chat-image-upload-two", - "checkpoints": [ - { - "id": "uploaded-both", - "observation": { - "sender": [ - "7c2e3ea286aa", - "f05e4695ffa3", - "ec8f73d25f26", - "b437cd69b0bf", - "d7c8ee357003", - "5c19acb9611e" - ], - "payloads": [ - "6696a47819e1", - "814ccd56a769", - "8452698ac11a", - "e74ddb684ed1", - "ae523d108575", - "a77c2409e01f" - ], - "settlements": { - "two": "87c17cf78a60" - }, - "state": "f6cdfabc3790", - "effects": ["994fccf9b305", "31f4965e4ed4", "d7dc1460b465"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-session-option-pick-empty.json b/mobile/rpc-foundation/goldens/native-chat-session-option-pick-empty.json deleted file mode 100644 index c8c9d6adac4..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-session-option-pick-empty.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.session-option-pick", - "family": "nativeChat.session-option-pick", - "namedDeltas": [], - "values": { - "0aa1124bf746": { - "settled": "settled" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "native-chat-session-option-pick-empty", - "checkpoints": [ - { - "id": "no-wire", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "empty": "eb79a9b3682a" - }, - "state": "0aa1124bf746", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-session-option-pick-refused.json b/mobile/rpc-foundation/goldens/native-chat-session-option-pick-refused.json deleted file mode 100644 index 8f61c9059ce..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-session-option-pick-refused.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.session-option-pick", - "family": "nativeChat.session-option-pick", - "namedDeltas": [], - "values": { - "0aa1124bf746": { - "settled": "settled" - }, - "23f8f4ed8c86": { - "name": "settings.mutateNativeChatSessionOptions#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.mutateNativeChatSessionOptions" - }, - { - "name": "params", - "value": { - "agent": "claude", - "picks": [ - { - "modelId": "opus", - "optionId": "model", - "value": "opus" - } - ], - "type": "apply-picks" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - }, - "3284376ef9b6": { - "name": "settings.mutateNativeChatSessionOptions#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.mutateNativeChatSessionOptions\",\"params\":{\"type\":\"apply-picks\",\"agent\":\"claude\",\"picks\":[{\"modelId\":\"opus\",\"optionId\":\"model\",\"value\":\"opus\"}]}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "native-chat-session-option-pick-refused", - "checkpoints": [ - { - "id": "refusal-swallowed", - "observation": { - "sender": ["23f8f4ed8c86"], - "payloads": ["3284376ef9b6"], - "settlements": { - "pick": "eb79a9b3682a" - }, - "state": "0aa1124bf746", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-session-option-pick-written.json b/mobile/rpc-foundation/goldens/native-chat-session-option-pick-written.json deleted file mode 100644 index 5a50b473371..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-session-option-pick-written.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.session-option-pick", - "family": "nativeChat.session-option-pick", - "namedDeltas": [], - "values": { - "0aa1124bf746": { - "settled": "settled" - }, - "3284376ef9b6": { - "name": "settings.mutateNativeChatSessionOptions#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.mutateNativeChatSessionOptions\",\"params\":{\"type\":\"apply-picks\",\"agent\":\"claude\",\"picks\":[{\"modelId\":\"opus\",\"optionId\":\"model\",\"value\":\"opus\"}]}}" - }, - "baf33df29104": { - "name": "settings.mutateNativeChatSessionOptions#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.mutateNativeChatSessionOptions" - }, - { - "name": "params", - "value": { - "agent": "claude", - "picks": [ - { - "modelId": "opus", - "optionId": "model", - "value": "opus" - } - ], - "type": "apply-picks" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "applied": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "native-chat-session-option-pick-written", - "checkpoints": [ - { - "id": "written", - "observation": { - "sender": ["baf33df29104"], - "payloads": ["3284376ef9b6"], - "settlements": { - "pick": "eb79a9b3682a" - }, - "state": "0aa1124bf746", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-write-accepted.json b/mobile/rpc-foundation/goldens/native-chat-write-accepted.json deleted file mode 100644 index d82a2b86690..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-write-accepted.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "namedDeltas": [], - "values": { - "0c75127e9c76": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": true, - "terminal": "terminal-1", - "text": "hello" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "37750614a050": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"hello\",\"enter\":true,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "46771288e046": { - "body": "accepted" - }, - "7291a73df186": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "accepted" - } - }, - "recording": { - "scenario": "native-chat-write-accepted", - "checkpoints": [ - { - "id": "accepted", - "observation": { - "sender": ["0c75127e9c76"], - "payloads": ["37750614a050"], - "settlements": { - "body": "7291a73df186" - }, - "state": "46771288e046", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-write-clear-line.json b/mobile/rpc-foundation/goldens/native-chat-write-clear-line.json deleted file mode 100644 index f4dd70c5d1e..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-write-clear-line.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "namedDeltas": [], - "values": { - "098c51e345e3": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u0015\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "7e7356ce5972": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u0015" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "e8cd309e2293": { - "clear": true - } - }, - "recording": { - "scenario": "native-chat-write-clear-line", - "checkpoints": [ - { - "id": "cleared", - "observation": { - "sender": ["7e7356ce5972"], - "payloads": ["098c51e345e3"], - "settlements": { - "clear": "84e5ca07cb7a" - }, - "state": "e8cd309e2293", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-write-rejected.json b/mobile/rpc-foundation/goldens/native-chat-write-rejected.json deleted file mode 100644 index 59ee5986ccf..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-write-rejected.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "namedDeltas": [], - "values": { - "0143e6e129bc": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": true, - "terminal": "terminal-1", - "text": "hello" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - } - }, - "19f53fb21e4e": { - "body": "rejected" - }, - "37750614a050": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"hello\",\"enter\":true,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "9bd3ea1ff2bb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "rejected" - } - }, - "recording": { - "scenario": "native-chat-write-rejected", - "checkpoints": [ - { - "id": "rejected", - "observation": { - "sender": ["0143e6e129bc"], - "payloads": ["37750614a050"], - "settlements": { - "body": "9bd3ea1ff2bb" - }, - "state": "19f53fb21e4e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-write-typed-command.json b/mobile/rpc-foundation/goldens/native-chat-write-typed-command.json deleted file mode 100644 index b3279cf792c..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-write-typed-command.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "namedDeltas": [], - "values": { - "098c51e345e3": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u0015\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "1c80024cfa2c": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 48, - "value": "accepted" - }, - "1fc08660fafb": { - "name": "terminal.send#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"o\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "6da4938e6ef2": { - "name": "terminal.send#3", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "k" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 32, - "settledAt": 32, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "75e0554b8621": { - "name": "terminal.send#3", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"k\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "7e7356ce5972": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u0015" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "9c7eabe1bc26": { - "name": "terminal.send#4", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\r" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 48, - "settledAt": 48, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "a8df21337a5a": { - "name": "terminal.send#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "o" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 16, - "settledAt": 16, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "bf797abab699": { - "command": "accepted" - }, - "dcda79a6c159": { - "name": "terminal.send#4", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\r\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - } - }, - "recording": { - "scenario": "native-chat-write-typed-command", - "checkpoints": [ - { - "id": "typed", - "observation": { - "sender": ["7e7356ce5972", "a8df21337a5a", "6da4938e6ef2", "9c7eabe1bc26"], - "payloads": ["098c51e345e3", "1fc08660fafb", "75e0554b8621", "dcda79a6c159"], - "settlements": { - "command": "1c80024cfa2c" - }, - "state": "bf797abab699", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/new-workspace-repositories-fulfilled.json b/mobile/rpc-foundation/goldens/new-workspace-repositories-fulfilled.json deleted file mode 100644 index 70b4a9ba4ca..00000000000 --- a/mobile/rpc-foundation/goldens/new-workspace-repositories-fulfilled.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "workspace.repositories", - "family": "components.new-workspace-repositories", - "namedDeltas": [], - "values": { - "19b2979d7fc2": { - "name": "repo.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "35f85fe3b71c": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "413e29f6e78e": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "displayName": "alpha", - "id": "repo-a", - "path": "/tmp/repo-a" - }, - { - "displayName": "beta", - "id": "repo-b", - "path": "/tmp/repo-b" - } - ] - } - } - } - }, - "4e8b4e3e814f": { - "crash": { - "$rpc": "null" - }, - "loading": true, - "repos": [], - "selected": { - "$rpc": "null" - } - }, - "eac6e56c2d2c": { - "crash": { - "$rpc": "null" - }, - "loading": false, - "repos": ["repo-a", "repo-b"], - "selected": "repo-b" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "new-workspace-repositories-fulfilled", - "checkpoints": [ - { - "id": "loading", - "observation": { - "sender": ["35f85fe3b71c"], - "payloads": ["19b2979d7fc2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4e8b4e3e814f", - "effects": [] - } - }, - { - "id": "selected", - "observation": { - "sender": ["413e29f6e78e"], - "payloads": ["19b2979d7fc2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "eac6e56c2d2c", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/notifications-desktop-stream.json b/mobile/rpc-foundation/goldens/notifications-desktop-stream.json deleted file mode 100644 index 591a0c1926b..00000000000 --- a/mobile/rpc-foundation/goldens/notifications-desktop-stream.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "notifications.desktop-stream", - "family": "notifications.desktop-stream", - "namedDeltas": [], - "values": { - "18a100fb6bae": { - "name": "notifications.getMissedSince#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "notifications.getMissedSince" - }, - { - "name": "params", - "value": { - "deliveredPushes": [ - { - "notificationEpoch": "epoch-1", - "notificationId": "note-1", - "notificationSeq": 7 - }, - { - "notificationEpoch": "epoch-1", - "notificationId": "note-2", - "notificationSeq": 8 - } - ], - "lastSeenSeq": 9007199254740991 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "dismissedPushes": [ - { - "notificationEpoch": "epoch-1", - "notificationId": "note-1", - "notificationSeq": 7 - } - ] - } - } - } - }, - "2637263140a2": { - "name": "notifications.unsubscribe#1", - "ordinal": 8, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"notifications.unsubscribe\",\"params\":{\"subscriptionId\":\"sub-1\"}}" - }, - "45aca32cac62": { - "name": "notification-tray.dismiss", - "ordinal": 7, - "value": { - "identifier": "tray-2" - } - }, - "4924583cde9d": { - "name": "device-store.setItem", - "ordinal": 6, - "value": { - "key": "orca:pushDismissalWatermarks:v1", - "value": "[{\"key\":\"[\\\"Yw3NKWbEM2aRElRI\\\",\\\"epoch-1\\\",\\\"note-2\\\"]\",\"seq\":8,\"expiresAt\":1767312000000}]" - } - }, - "5359579cc62d": { - "running": true - }, - "67485a6a910e": { - "name": "notifications.getMissedSince#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "notifications.getMissedSince" - }, - { - "name": "params", - "value": { - "deliveredPushes": [ - { - "notificationEpoch": "epoch-1", - "notificationId": "note-1", - "notificationSeq": 7 - }, - { - "notificationEpoch": "epoch-1", - "notificationId": "note-2", - "notificationSeq": 8 - } - ], - "lastSeenSeq": 9007199254740991 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "a0b2bcfcde77": { - "running": false - }, - "e074c0b6fa0a": { - "name": "notifications.getMissedSince#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"notifications.getMissedSince\",\"params\":{\"lastSeenSeq\":9007199254740991,\"deliveredPushes\":[{\"notificationId\":\"note-1\",\"notificationEpoch\":\"epoch-1\",\"notificationSeq\":7},{\"notificationId\":\"note-2\",\"notificationEpoch\":\"epoch-1\",\"notificationSeq\":8}]}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f552b5040ec7": { - "name": "notifications.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"notifications.subscribe\",\"params\":{\"includeDesktopSuppressed\":true}}" - }, - "f79cc42f0819": { - "name": "notification-tray.dismiss", - "ordinal": 5, - "value": { - "identifier": "tray-1" - } - }, - "ff11f542ada5": { - "name": "device-store.setItem", - "ordinal": 4, - "value": { - "key": "orca:pushDismissalWatermarks:v1", - "value": "[{\"key\":\"[\\\"Yw3NKWbEM2aRElRI\\\",\\\"epoch-1\\\",\\\"note-1\\\"]\",\"seq\":7,\"expiresAt\":1767312000000}]" - } - } - }, - "recording": { - "scenario": "notifications-desktop-stream", - "checkpoints": [ - { - "id": "subscribed", - "observation": { - "sender": [], - "payloads": ["f552b5040ec7"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "5359579cc62d", - "effects": [] - } - }, - { - "id": "ready", - "observation": { - "sender": ["67485a6a910e"], - "payloads": ["f552b5040ec7", "e074c0b6fa0a"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "5359579cc62d", - "effects": [] - } - }, - { - "id": "caught-up", - "observation": { - "sender": ["18a100fb6bae"], - "payloads": ["f552b5040ec7", "e074c0b6fa0a"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "5359579cc62d", - "effects": ["ff11f542ada5", "f79cc42f0819"] - } - }, - { - "id": "dismissed", - "observation": { - "sender": ["18a100fb6bae"], - "payloads": ["f552b5040ec7", "e074c0b6fa0a"], - "settlements": { - "start": "eb79a9b3682a" - }, - "state": "5359579cc62d", - "effects": ["ff11f542ada5", "f79cc42f0819", "4924583cde9d", "45aca32cac62"] - } - }, - { - "id": "unsubscribing", - "observation": { - "sender": ["18a100fb6bae"], - "payloads": ["f552b5040ec7", "e074c0b6fa0a", "2637263140a2"], - "settlements": { - "start": "eb79a9b3682a", - "stop": "eb79a9b3682a" - }, - "state": "a0b2bcfcde77", - "effects": ["ff11f542ada5", "f79cc42f0819", "4924583cde9d", "45aca32cac62"] - } - }, - { - "id": "stopped", - "observation": { - "sender": ["18a100fb6bae"], - "payloads": ["f552b5040ec7", "e074c0b6fa0a", "2637263140a2"], - "settlements": { - "start": "eb79a9b3682a", - "stop": "eb79a9b3682a" - }, - "state": "a0b2bcfcde77", - "effects": ["ff11f542ada5", "f79cc42f0819", "4924583cde9d", "45aca32cac62"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/notifications-display-test-accepted.json b/mobile/rpc-foundation/goldens/notifications-display-test-accepted.json deleted file mode 100644 index a8723e17b02..00000000000 --- a/mobile/rpc-foundation/goldens/notifications-display-test-accepted.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "notifications.display-test-screen", - "family": "notifications.display-test-screen", - "namedDeltas": [], - "values": { - "0bfc5a373e4d": { - "name": "notifications.testPush#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "notifications.testPush" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true, - "timeoutMs": 20000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "649d12c8eb9b": { - "name": "notifications.testPush#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "notifications.testPush" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true, - "timeoutMs": 20000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "accepted": true - } - } - } - }, - "6b7fba36efde": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ChevronRight": 1, - "Pressable": 2, - "Text": 5, - "View": 7 - }, - "labels": ["Send test notification", "Troubleshooting"], - "text": [ - "Having trouble receiving alerts?", - "Send test notification", - "Troubleshooting", - "Test push delivery, or a local notification when push is unavailable.", - "Accepted by Orca’s push service. Check for the notification." - ] - }, - "8a172d4948a9": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ChevronRight": 1, - "Pressable": 2, - "Text": 4, - "View": 7 - }, - "labels": ["Send test notification", "Troubleshooting"], - "text": [ - "Having trouble receiving alerts?", - "Send test notification", - "Troubleshooting", - "Test push delivery, or a local notification when push is unavailable." - ] - }, - "9585b40ac04d": { - "crash": { - "$rpc": "null" - }, - "elements": { - "ChevronRight": 1, - "Pressable": 2, - "Text": 5, - "View": 7 - }, - "labels": ["Sending…", "Troubleshooting"], - "text": [ - "Having trouble receiving alerts?", - "Send test notification", - "Sending…", - "Troubleshooting", - "Test push delivery, or a local notification when push is unavailable." - ] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f68b017d64bd": { - "name": "notifications.testPush#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"notifications.testPush\",\"params\":null}" - } - }, - "recording": { - "scenario": "notifications-display-test-accepted", - "checkpoints": [ - { - "id": "mounted", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "8a172d4948a9", - "effects": [] - } - }, - { - "id": "sending", - "observation": { - "sender": ["0bfc5a373e4d"], - "payloads": ["f68b017d64bd"], - "settlements": { - "mount": "eb79a9b3682a", - "press": "eb79a9b3682a" - }, - "state": "9585b40ac04d", - "effects": [] - } - }, - { - "id": "accepted", - "observation": { - "sender": ["649d12c8eb9b"], - "payloads": ["f68b017d64bd"], - "settlements": { - "mount": "eb79a9b3682a", - "press": "eb79a9b3682a" - }, - "state": "6b7fba36efde", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pairing-pre-profile-direct-wins-and-provisions.json b/mobile/rpc-foundation/goldens/pairing-pre-profile-direct-wins-and-provisions.json deleted file mode 100644 index 4f4eeef3c4b..00000000000 --- a/mobile/rpc-foundation/goldens/pairing-pre-profile-direct-wins-and-provisions.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "pairing.pre-profile", - "family": "pairing.pre-profile", - "namedDeltas": [], - "values": { - "061b247f2805": { - "name": "host-saved", - "ordinal": 13, - "value": "relay-host-0001x" - }, - "077b94702eb7": { - "name": "candidate-closed", - "ordinal": 15, - "value": "direct" - }, - "1f647ffe77b0": { - "name": "pairing.getEndpoints#1", - "ordinal": 11, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"install-l99UBPM71AZiC1ghz2glnA\"}}" - }, - "28a5fc6036c5": { - "name": "pairing.provisionRelay#1", - "ordinal": 8, - "args": [ - { - "name": "method", - "value": "pairing.provisionRelay" - }, - { - "name": "params", - "value": { - "newResumeTokenHash": "yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU", - "reqId": "install-l99UBPM71AZiC1ghz2glnA" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "resumeExpiresAt": 1767830400000, - "v": 1 - } - } - } - }, - "33c6a36cc4b6": { - "name": "journal-cleared", - "ordinal": 14, - "value": "pair-fixture-1" - }, - "406c8ab0b9b6": { - "name": "journal-saved", - "ordinal": 1, - "value": "pair-fixture-1" - }, - "6995d6b0bd4c": { - "name": "status.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": [] - } - } - } - }, - "6d04596c636d": { - "name": "status.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "8bf25ca8d4ae": { - "name": "bundle-written", - "ordinal": 12, - "value": { - "version": 4 - } - }, - "8e378786864c": { - "name": "candidate-closed", - "ordinal": 6, - "value": "relay" - }, - "9b50435fa2f8": { - "outcome": "host-1", - "savedHost": "relay-host-0001x", - "timedOut": false - }, - "c86730581187": { - "name": "status.get#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "capabilities": [] - } - } - } - }, - "d1b2eddf66f4": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "hostId": "host-1" - } - }, - "e29d4c104dd3": { - "name": "journal-updated", - "ordinal": 7, - "value": "pair-fixture-1" - }, - "ea163bb1f5e0": { - "name": "pairing.getEndpoints#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "install-l99UBPM71AZiC1ghz2glnA" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "installStatus": { - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "result": { - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "resumeExpiresAt": 1767830400000, - "v": 1 - }, - "state": "committed", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - }, - "v": 1 - } - } - } - }, - "edde120654bf": { - "name": "status.get#2", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "f49423f836f9": { - "name": "pairing.provisionRelay#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.provisionRelay\",\"params\":{\"reqId\":\"install-l99UBPM71AZiC1ghz2glnA\",\"newResumeTokenHash\":\"yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU\"}}" - }, - "f6b99510eefb": { - "name": "candidate-closed", - "ordinal": 16, - "value": "relay" - } - }, - "recording": { - "scenario": "pairing-pre-profile-direct-wins-and-provisions", - "checkpoints": [ - { - "id": "paired-over-direct", - "observation": { - "sender": ["6995d6b0bd4c", "c86730581187", "28a5fc6036c5", "ea163bb1f5e0"], - "payloads": ["6d04596c636d", "edde120654bf", "f49423f836f9", "1f647ffe77b0"], - "settlements": { - "pair": "d1b2eddf66f4" - }, - "state": "9b50435fa2f8", - "effects": [ - "406c8ab0b9b6", - "8e378786864c", - "e29d4c104dd3", - "8bf25ca8d4ae", - "061b247f2805", - "33c6a36cc4b6", - "077b94702eb7", - "f6b99510eefb" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pairing-pre-profile-times-out.json b/mobile/rpc-foundation/goldens/pairing-pre-profile-times-out.json deleted file mode 100644 index 5493980f25a..00000000000 --- a/mobile/rpc-foundation/goldens/pairing-pre-profile-times-out.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "pairing.pre-profile", - "family": "pairing.pre-profile", - "namedDeltas": [], - "values": { - "03106dceb986": { - "name": "status.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "406c8ab0b9b6": { - "name": "journal-saved", - "ordinal": 1, - "value": "pair-fixture-1" - }, - "6d04596c636d": { - "name": "status.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "6fd2524785ca": { - "name": "candidate-closed", - "ordinal": 7, - "value": "relay" - }, - "76572b132647": { - "name": "candidate-closed", - "ordinal": 6, - "value": "direct" - }, - "86d361a0bf7c": { - "outcome": "unpaired", - "savedHost": { - "$rpc": "null" - }, - "timedOut": false - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "ccefc12fda27": { - "outcome": "unpaired", - "savedHost": { - "$rpc": "null" - }, - "timedOut": true - }, - "edde120654bf": { - "name": "status.get#2", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "f6d9975e7a13": { - "name": "status.get#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - } - }, - "recording": { - "scenario": "pairing-pre-profile-times-out", - "checkpoints": [ - { - "id": "racing", - "observation": { - "sender": ["03106dceb986", "f6d9975e7a13"], - "payloads": ["6d04596c636d", "edde120654bf"], - "settlements": { - "pair": "9270aeb7d9c6" - }, - "state": "86d361a0bf7c", - "effects": ["406c8ab0b9b6"] - } - }, - { - "id": "timed-out", - "observation": { - "sender": ["03106dceb986", "f6d9975e7a13"], - "payloads": ["6d04596c636d", "edde120654bf"], - "settlements": { - "pair": "9270aeb7d9c6" - }, - "state": "ccefc12fda27", - "effects": ["406c8ab0b9b6", "76572b132647", "6fd2524785ca"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/quick-commands-load-refused.json b/mobile/rpc-foundation/goldens/quick-commands-load-refused.json deleted file mode 100644 index b37cb742fa8..00000000000 --- a/mobile/rpc-foundation/goldens/quick-commands-load-refused.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.quick-commands", - "family": "settings.quick-commands", - "namedDeltas": [], - "values": { - "3a752c2955e2": { - "name": "settings.getTerminalQuickCommands#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.getTerminalQuickCommands\"}" - }, - "990fb5428d1f": { - "commands": [], - "error": "Unknown method", - "loading": false, - "persisted": [], - "ready": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f7798a9d2071": { - "name": "settings.getTerminalQuickCommands#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.getTerminalQuickCommands" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "quick-commands-load-refused", - "checkpoints": [ - { - "id": "errored", - "observation": { - "sender": ["f7798a9d2071"], - "payloads": ["3a752c2955e2"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "990fb5428d1f", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/relay-direct-upgrade-commits.json b/mobile/rpc-foundation/goldens/relay-direct-upgrade-commits.json deleted file mode 100644 index ed4dbd617e4..00000000000 --- a/mobile/rpc-foundation/goldens/relay-direct-upgrade-commits.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "relay.direct-upgrade", - "family": "relay.direct-upgrade", - "namedDeltas": [], - "values": { - "10098087f961": { - "name": "pairing.getEndpoints#2", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"install-fixture-1\"}}" - }, - "161baaed4df3": { - "name": "host-saved", - "ordinal": 8, - "value": "host-1" - }, - "232ca274f695": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "bundle": { - "current": { - "expiresAt": 1767830400000, - "hash": "7ehR_WuQWkxwOFJdkHfI5jEg4DeVYWImtDuip60LHK4", - "token": "pending00000000000000000000000000000000001x", - "version": 4 - }, - "deviceToken": "device-token-1", - "hostId": "host-1", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - } - } - }, - "240d8ec7e573": { - "name": "pairing.getEndpoints#2", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "install-fixture-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "installStatus": { - "reqId": "install-fixture-1", - "result": { - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "reqId": "install-fixture-1", - "resumeExpiresAt": 1767830400000, - "v": 1 - }, - "state": "committed", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - }, - "v": 1 - } - } - } - }, - "2fce658b56a1": { - "name": "pairing.provisionRelay#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "pairing.provisionRelay" - }, - { - "name": "params", - "value": { - "newResumeTokenHash": "7ehR_WuQWkxwOFJdkHfI5jEg4DeVYWImtDuip60LHK4", - "reqId": "install-fixture-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "reqId": "install-fixture-1", - "resumeExpiresAt": 1767830400000, - "v": 1 - } - } - } - }, - "691df8767d71": { - "name": "journal-cleared", - "ordinal": 9, - "value": "upgrade" - }, - "6e14239ef339": { - "name": "pairing.getEndpoints#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "install-fixture-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "installStatus": { - "reqId": "install-fixture-1", - "state": "not-found", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - }, - "v": 1 - } - } - } - }, - "980bbba0b617": { - "journal": { - "$rpc": "null" - }, - "outcome": "relay-host-0001x" - }, - "aaef09eec3f3": { - "name": "bundle-written", - "ordinal": 7, - "value": { - "version": 4 - } - }, - "c5d28dd067e4": { - "name": "pairing.getEndpoints#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"install-fixture-1\"}}" - }, - "f41ffc93936f": { - "name": "pairing.provisionRelay#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.provisionRelay\",\"params\":{\"reqId\":\"install-fixture-1\",\"newResumeTokenHash\":\"7ehR_WuQWkxwOFJdkHfI5jEg4DeVYWImtDuip60LHK4\"}}" - } - }, - "recording": { - "scenario": "relay-direct-upgrade-commits", - "checkpoints": [ - { - "id": "direct-upgrade-committed", - "observation": { - "sender": ["6e14239ef339", "2fce658b56a1", "240d8ec7e573"], - "payloads": ["c5d28dd067e4", "f41ffc93936f", "10098087f961"], - "settlements": { - "upgrade": "232ca274f695" - }, - "state": "980bbba0b617", - "effects": ["aaef09eec3f3", "161baaed4df3", "691df8767d71"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/relay-direct-upgrade-unsupported-host-declines.json b/mobile/rpc-foundation/goldens/relay-direct-upgrade-unsupported-host-declines.json deleted file mode 100644 index 9a69be444e6..00000000000 --- a/mobile/rpc-foundation/goldens/relay-direct-upgrade-unsupported-host-declines.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "relay.direct-upgrade", - "family": "relay.direct-upgrade", - "namedDeltas": [], - "values": { - "6c43da669636": { - "journal": { - "$rpc": "null" - }, - "outcome": "declined" - }, - "72fb9f223ba7": { - "name": "journal-cleared", - "ordinal": 3, - "value": "upgrade" - }, - "baacb3770d4b": { - "name": "pairing.getEndpoints#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "install-fixture-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - }, - "c5d28dd067e4": { - "name": "pairing.getEndpoints#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"install-fixture-1\"}}" - }, - "ee20a1dc39e7": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "relay-direct-upgrade-unsupported-host-declines", - "checkpoints": [ - { - "id": "upgrade-declined", - "observation": { - "sender": ["baacb3770d4b"], - "payloads": ["c5d28dd067e4"], - "settlements": { - "upgrade": "ee20a1dc39e7" - }, - "state": "6c43da669636", - "effects": ["72fb9f223ba7"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/relay-pairing-recovery-resume-committed.json b/mobile/rpc-foundation/goldens/relay-pairing-recovery-resume-committed.json deleted file mode 100644 index 399e8582ffd..00000000000 --- a/mobile/rpc-foundation/goldens/relay-pairing-recovery-resume-committed.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "relay.pairing-recovery", - "family": "relay.pairing-recovery", - "namedDeltas": [], - "values": { - "1020838fc104": { - "name": "pairing.getEndpoints#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"install-fixture-1\",\"resumeConfirmReqId\":\"confirm-fixture-1\"}}" - }, - "4b87f8374959": { - "name": "bundle-written", - "ordinal": 4, - "value": { - "version": 4 - } - }, - "6fd2524785ca": { - "name": "candidate-closed", - "ordinal": 7, - "value": "relay" - }, - "792cb678f228": { - "name": "host-saved", - "ordinal": 5, - "value": "host-1" - }, - "7a3e4e5413b5": { - "outcome": "recovered", - "winner": { - "$rpc": "null" - } - }, - "87db1a2d2066": { - "name": "journal-cleared", - "ordinal": 6, - "value": "recovery" - }, - "a0ee987f0809": { - "name": "pairing.getEndpoints#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "install-fixture-1", - "resumeConfirmReqId": "confirm-fixture-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "installStatus": { - "reqId": "install-fixture-1", - "result": { - "authorizationMode": "relay-basis", - "currentVersion": 4, - "reqId": "install-fixture-1", - "resumeExpiresAt": 1767830400000, - "v": 1 - }, - "state": "committed", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - }, - "v": 1 - } - } - } - }, - "c7269155f70c": { - "name": "journal-updated", - "ordinal": 3, - "value": "relay-basis" - }, - "f0723ea3ab16": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "recovered" - } - }, - "recording": { - "scenario": "relay-pairing-recovery-resume-committed", - "checkpoints": [ - { - "id": "recovered-on-resume", - "observation": { - "sender": ["a0ee987f0809"], - "payloads": ["1020838fc104"], - "settlements": { - "recover": "f0723ea3ab16" - }, - "state": "7a3e4e5413b5", - "effects": [ - "c7269155f70c", - "4b87f8374959", - "792cb678f228", - "87db1a2d2066", - "6fd2524785ca" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/relay-rotation-installs-and-commits.json b/mobile/rpc-foundation/goldens/relay-rotation-installs-and-commits.json deleted file mode 100644 index b37e1d21bdc..00000000000 --- a/mobile/rpc-foundation/goldens/relay-rotation-installs-and-commits.json +++ /dev/null @@ -1,243 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "relay.credential-rotation", - "family": "relay.credential-rotation", - "namedDeltas": [], - "values": { - "1d5e608b0cda": { - "name": "pairing.provisionRelay#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.provisionRelay\",\"params\":{\"reqId\":\"rotate-VftjjHf-4Lb1-Sdfryl-LA\",\"newResumeTokenHash\":\"yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU\",\"expectedCurrentHash\":\"r_9byaBlTZTXS3aLLlWTKwss-nmx4vGRrjKskxWyP30\"}}" - }, - "63d099cfe6d6": { - "name": "pairing.getEndpoints#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"rotate-VftjjHf-4Lb1-Sdfryl-LA\"}}" - }, - "9f5831bc9cdf": { - "name": "bundle-written", - "ordinal": 8, - "value": { - "grace": { - "$rpc": "null" - }, - "pending": false, - "version": 4 - } - }, - "d5e189e21a0a": { - "name": "pairing.getEndpoints#2", - "ordinal": 7, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"pairing.getEndpoints\",\"params\":{\"installReqId\":\"rotate-VftjjHf-4Lb1-Sdfryl-LA\"}}" - }, - "df4532078f99": { - "name": "bundle-written", - "ordinal": 1, - "value": { - "grace": { - "$rpc": "null" - }, - "pending": true, - "version": 3 - } - }, - "ed1dba77fd44": { - "name": "pairing.getEndpoints#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "installStatus": { - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "state": "not-found", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - }, - "v": 1 - } - } - } - }, - "ed53b3008cb7": { - "name": "pairing.getEndpoints#2", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "pairing.getEndpoints" - }, - { - "name": "params", - "value": { - "installReqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "installStatus": { - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "result": { - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "resumeExpiresAt": 1767830400000, - "v": 1 - }, - "state": "committed", - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - }, - "v": 1 - } - } - } - }, - "f2c843a9b548": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "bundle": { - "current": { - "expiresAt": 1767830400000, - "hash": "yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU", - "token": "PF6BtAxexo4Eo0Bsl9Y8-9xTrog3GhJRIbWVYUPA7i0", - "version": 4 - }, - "deviceToken": "device-token-1", - "grace": { - "$rpc": "undefined" - }, - "hostId": "host-1", - "pending": { - "$rpc": "undefined" - }, - "v": 1 - }, - "relay": { - "assignmentEpoch": 1, - "cellUrl": "https://cell.example", - "directorUrl": "https://director.example", - "e2eeFraming": 2, - "relayHostId": "relay-host-0001x", - "v": 1 - } - } - }, - "fdf764b375ae": { - "outcome": { - "relayHostId": "relay-host-0001x", - "version": 4 - }, - "pending": false, - "version": 4 - }, - "fe8f0a52315d": { - "name": "pairing.provisionRelay#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "pairing.provisionRelay" - }, - { - "name": "params", - "value": { - "expectedCurrentHash": "r_9byaBlTZTXS3aLLlWTKwss-nmx4vGRrjKskxWyP30", - "newResumeTokenHash": "yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU", - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "resumeExpiresAt": 1767830400000, - "v": 1 - } - } - } - } - }, - "recording": { - "scenario": "relay-rotation-installs-and-commits", - "checkpoints": [ - { - "id": "credential-rotated", - "observation": { - "sender": ["ed1dba77fd44", "fe8f0a52315d", "ed53b3008cb7"], - "payloads": ["63d099cfe6d6", "1d5e608b0cda", "d5e189e21a0a"], - "settlements": { - "rotate": "f2c843a9b548" - }, - "state": "fdf764b375ae", - "effects": ["df4532078f99", "9f5831bc9cdf"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-browser-tab-created.json b/mobile/rpc-foundation/goldens/session-browser-tab-created.json deleted file mode 100644 index af938d0716e..00000000000 --- a/mobile/rpc-foundation/goldens/session-browser-tab-created.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.content-create", - "family": "session.browser-tab-create", - "namedDeltas": [], - "values": { - "4a842fa3c9c1": { - "name": "browser.tabCreate#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "browser.tabCreate" - }, - { - "name": "params", - "value": { - "activate": true, - "url": "https://example.com/", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "browserPageId": "page-1" - } - } - } - }, - "6248a3dd0710": { - "name": "fetch-session-tabs", - "ordinal": 3, - "value": {} - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "d9a882adde26": { - "name": "browser.tabCreate#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.tabCreate\",\"params\":{\"worktree\":\"id:workspace-1\",\"url\":\"https://example.com/\",\"activate\":true}}" - }, - "dfb723df461a": { - "name": "fetch-pending-browser-tabs", - "ordinal": 5, - "value": {} - }, - "eda7d625e4b6": { - "name": "fetch-pending-browser-tabs", - "ordinal": 4, - "value": {} - }, - "f1e12d7f04c7": { - "createError": "", - "creatingBrowser": false, - "creatingMarkdown": false, - "pendingBrowserFocusPageId": "page-1" - } - }, - "recording": { - "scenario": "session-browser-tab-created", - "checkpoints": [ - { - "id": "created", - "observation": { - "sender": ["4a842fa3c9c1"], - "payloads": ["d9a882adde26"], - "settlements": { - "browser": "84e5ca07cb7a" - }, - "state": "f1e12d7f04c7", - "effects": ["6248a3dd0710", "eda7d625e4b6", "dfb723df461a"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-create-browser-refused.json b/mobile/rpc-foundation/goldens/session-create-browser-refused.json deleted file mode 100644 index 185d964db1d..00000000000 --- a/mobile/rpc-foundation/goldens/session-create-browser-refused.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.content-create", - "family": "session.content-create", - "namedDeltas": [], - "values": { - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "7f4ea6e4256c": { - "name": "toast", - "ordinal": 3, - "value": { - "message": "Browser unavailable" - } - }, - "d9a882adde26": { - "name": "browser.tabCreate#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.tabCreate\",\"params\":{\"worktree\":\"id:workspace-1\",\"url\":\"https://example.com/\",\"activate\":true}}" - }, - "dd0b5e7b9130": { - "createError": "Browser unavailable", - "creatingBrowser": false, - "creatingMarkdown": false, - "pendingBrowserFocusPageId": { - "$rpc": "null" - } - }, - "eb4b8e1128bd": { - "name": "browser.tabCreate#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "browser.tabCreate" - }, - { - "name": "params", - "value": { - "activate": true, - "url": "https://example.com/", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "browser_unavailable", - "message": "Browser unavailable" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "session-create-browser-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["eb4b8e1128bd"], - "payloads": ["d9a882adde26"], - "settlements": { - "browser": "7ed3d39f0607" - }, - "state": "dd0b5e7b9130", - "effects": ["7f4ea6e4256c"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-create-browser-tab.json b/mobile/rpc-foundation/goldens/session-create-browser-tab.json deleted file mode 100644 index 12284d67ec1..00000000000 --- a/mobile/rpc-foundation/goldens/session-create-browser-tab.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.content-create", - "family": "session.content-create", - "namedDeltas": [], - "values": { - "4a842fa3c9c1": { - "name": "browser.tabCreate#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "browser.tabCreate" - }, - { - "name": "params", - "value": { - "activate": true, - "url": "https://example.com/", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "browserPageId": "page-1" - } - } - } - }, - "6248a3dd0710": { - "name": "fetch-session-tabs", - "ordinal": 3, - "value": {} - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "d9a882adde26": { - "name": "browser.tabCreate#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.tabCreate\",\"params\":{\"worktree\":\"id:workspace-1\",\"url\":\"https://example.com/\",\"activate\":true}}" - }, - "dfb723df461a": { - "name": "fetch-pending-browser-tabs", - "ordinal": 5, - "value": {} - }, - "eda7d625e4b6": { - "name": "fetch-pending-browser-tabs", - "ordinal": 4, - "value": {} - }, - "f1e12d7f04c7": { - "createError": "", - "creatingBrowser": false, - "creatingMarkdown": false, - "pendingBrowserFocusPageId": "page-1" - } - }, - "recording": { - "scenario": "session-create-browser-tab", - "checkpoints": [ - { - "id": "created", - "observation": { - "sender": ["4a842fa3c9c1"], - "payloads": ["d9a882adde26"], - "settlements": { - "browser": "84e5ca07cb7a" - }, - "state": "f1e12d7f04c7", - "effects": ["6248a3dd0710", "eda7d625e4b6", "dfb723df461a"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-create-markdown-note.json b/mobile/rpc-foundation/goldens/session-create-markdown-note.json deleted file mode 100644 index 3ec9eb75252..00000000000 --- a/mobile/rpc-foundation/goldens/session-create-markdown-note.json +++ /dev/null @@ -1,207 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.content-create", - "family": "session.content-create", - "namedDeltas": [], - "values": { - "3e7bfd4c59c3": { - "name": "files.open#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "files.open" - }, - { - "name": "params", - "value": { - "relativePath": "untitled.md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "opened": true - } - } - } - }, - "4e53935c13ac": { - "name": "worktree.show#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktree": { - "hostId": "local" - } - } - } - } - }, - "4e9c5ab0de1c": { - "name": "files.open#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"files.open\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"untitled.md\"}}" - }, - "a4f53f7fb1d7": { - "name": "fetch-session-tabs", - "ordinal": 9, - "value": {} - }, - "b5ae4bb70d31": { - "name": "files.createFile#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "files.createFile" - }, - { - "name": "params", - "value": { - "expectedExecutionHostId": "local", - "relativePath": "untitled.md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "created": true - } - } - } - }, - "c924e7a5a7da": { - "name": "worktree.show#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "d08f74d65ee6": { - "name": "status.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "d574cdcd4bef": { - "createError": "", - "creatingBrowser": false, - "creatingMarkdown": false, - "pendingBrowserFocusPageId": { - "$rpc": "null" - } - }, - "e81d3a627ac2": { - "name": "status.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["files.mutation-ownership.v1"] - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f1279bf9f173": { - "name": "files.createFile#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"files.createFile\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"untitled.md\",\"expectedExecutionHostId\":\"local\"}}" - } - }, - "recording": { - "scenario": "session-create-markdown-note", - "checkpoints": [ - { - "id": "created", - "observation": { - "sender": ["e81d3a627ac2", "4e53935c13ac", "b5ae4bb70d31", "3e7bfd4c59c3"], - "payloads": ["d08f74d65ee6", "c924e7a5a7da", "f1279bf9f173", "4e9c5ab0de1c"], - "settlements": { - "markdown": "eb79a9b3682a" - }, - "state": "d574cdcd4bef", - "effects": ["a4f53f7fb1d7"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-create-terminal-refused.json b/mobile/rpc-foundation/goldens/session-create-terminal-refused.json deleted file mode 100644 index f874d7b5119..00000000000 --- a/mobile/rpc-foundation/goldens/session-create-terminal-refused.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.create-terminal", - "family": "session.create-terminal", - "namedDeltas": [], - "values": { - "023a38d473d3": { - "name": "session.tabs.createTerminal#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.createTerminal" - }, - { - "name": "params", - "value": { - "activate": false, - "afterTabId": "tab-0", - "clientMutationId": "mobile-create:mjuohs00-8ig2hens", - "navigation": "caller", - "select": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "pty_exhausted", - "message": "No pty slots left on the host" - }, - "id": "frame-1", - "ok": false - } - } - }, - "6275ace50da2": { - "activeHandle": "terminal-0", - "activeSessionTabId": "tab-0", - "createError": "", - "creating": true, - "initializedHandles": ["terminal-0"], - "pendingSelection": { - "$rpc": "null" - }, - "sessionTabs": [], - "terminals": [] - }, - "7853d5a23971": { - "activeHandle": "terminal-0", - "activeSessionTabId": "tab-0", - "createError": "No pty slots left on the host", - "creating": false, - "initializedHandles": ["terminal-0"], - "pendingSelection": { - "$rpc": "null" - }, - "sessionTabs": [], - "terminals": [] - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "b1d637072fc8": { - "name": "session.tabs.createTerminal#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.createTerminal" - }, - { - "name": "params", - "value": { - "activate": false, - "afterTabId": "tab-0", - "clientMutationId": "mobile-create:mjuohs00-8ig2hens", - "navigation": "caller", - "select": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "bacf357ed220": { - "name": "toast", - "ordinal": 3, - "value": { - "durationMs": 1800, - "message": "No pty slots left on the host" - } - }, - "cce8a731064a": { - "name": "session.tabs.createTerminal#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.createTerminal\",\"params\":{\"worktree\":\"id:wt-1\",\"afterTabId\":\"tab-0\",\"clientMutationId\":\"mobile-create:mjuohs00-8ig2hens\",\"activate\":false,\"select\":true,\"navigation\":\"caller\"}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-create-terminal-refused", - "checkpoints": [ - { - "id": "creating", - "observation": { - "sender": ["b1d637072fc8"], - "payloads": ["cce8a731064a"], - "settlements": { - "mount": "eb79a9b3682a", - "create": "9270aeb7d9c6" - }, - "state": "6275ace50da2", - "effects": [] - } - }, - { - "id": "refused", - "observation": { - "sender": ["023a38d473d3"], - "payloads": ["cce8a731064a"], - "settlements": { - "mount": "eb79a9b3682a", - "create": "eb79a9b3682a" - }, - "state": "7853d5a23971", - "effects": ["bacf357ed220"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-create-terminal-with-prompt.json b/mobile/rpc-foundation/goldens/session-create-terminal-with-prompt.json deleted file mode 100644 index edd0cfc4cde..00000000000 --- a/mobile/rpc-foundation/goldens/session-create-terminal-with-prompt.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.create-terminal", - "family": "session.create-terminal", - "namedDeltas": [], - "values": { - "2977cbddd89f": { - "name": "session.tabs.createTerminal#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.createTerminal" - }, - { - "name": "params", - "value": { - "activate": false, - "afterTabId": "tab-0", - "clientMutationId": "mobile-create:mjuohs00-8ig2hens", - "navigation": "caller", - "select": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "tab": { - "id": "tab-1", - "isActive": true, - "terminal": "terminal-1", - "title": "zsh", - "type": "terminal" - } - } - } - } - }, - "4d318de3b635": { - "name": "unsubscribe-terminal", - "ordinal": 3, - "value": { - "handle": "terminal-0" - } - }, - "4e377b1c4bf7": { - "activeHandle": "terminal-1", - "activeSessionTabId": "tab-1", - "createError": "", - "creating": false, - "initializedHandles": [], - "pendingSelection": { - "handle": "terminal-1", - "kind": "terminal", - "tabId": "tab-1" - }, - "sessionTabs": ["tab-1"], - "terminals": ["terminal-1"] - }, - "579afe83429e": { - "name": "terminal.send#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"review these notes\",\"enter\":true,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "6275ace50da2": { - "activeHandle": "terminal-0", - "activeSessionTabId": "tab-0", - "createError": "", - "creating": true, - "initializedHandles": ["terminal-0"], - "pendingSelection": { - "$rpc": "null" - }, - "sessionTabs": [], - "terminals": [] - }, - "8b5144e3301d": { - "name": "schedule-delayed-action", - "ordinal": 6, - "value": { - "delayMs": 500 - } - }, - "8c66ae259b06": { - "name": "terminal.send#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": true, - "terminal": "terminal-1", - "text": "review these notes" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "a4f53f7fb1d7": { - "name": "fetch-session-tabs", - "ordinal": 9, - "value": {} - }, - "b1d637072fc8": { - "name": "session.tabs.createTerminal#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.createTerminal" - }, - { - "name": "params", - "value": { - "activate": false, - "afterTabId": "tab-0", - "clientMutationId": "mobile-create:mjuohs00-8ig2hens", - "navigation": "caller", - "select": true, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c9f8d8917777": { - "name": "subscribe-terminal", - "ordinal": 4, - "value": { - "handle": "terminal-1" - } - }, - "cc673665ea16": { - "name": "terminal.send#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": true, - "terminal": "terminal-1", - "text": "review these notes" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "cce8a731064a": { - "name": "session.tabs.createTerminal#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.createTerminal\",\"params\":{\"worktree\":\"id:wt-1\",\"afterTabId\":\"tab-0\",\"clientMutationId\":\"mobile-create:mjuohs00-8ig2hens\",\"activate\":false,\"select\":true,\"navigation\":\"caller\"}}" - }, - "cf7e2c3136b3": { - "name": "toast", - "ordinal": 8, - "value": { - "durationMs": { - "$rpc": "null" - }, - "message": "Notes sent" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-create-terminal-with-prompt", - "checkpoints": [ - { - "id": "creating", - "observation": { - "sender": ["b1d637072fc8"], - "payloads": ["cce8a731064a"], - "settlements": { - "mount": "eb79a9b3682a", - "create": "9270aeb7d9c6" - }, - "state": "6275ace50da2", - "effects": [] - } - }, - { - "id": "created", - "observation": { - "sender": ["2977cbddd89f", "8c66ae259b06"], - "payloads": ["cce8a731064a", "579afe83429e"], - "settlements": { - "mount": "eb79a9b3682a", - "create": "eb79a9b3682a" - }, - "state": "4e377b1c4bf7", - "effects": ["4d318de3b635", "c9f8d8917777", "8b5144e3301d"] - } - }, - { - "id": "prompt-sent", - "observation": { - "sender": ["2977cbddd89f", "cc673665ea16"], - "payloads": ["cce8a731064a", "579afe83429e"], - "settlements": { - "mount": "eb79a9b3682a", - "create": "eb79a9b3682a" - }, - "state": "4e377b1c4bf7", - "effects": ["4d318de3b635", "c9f8d8917777", "8b5144e3301d", "cf7e2c3136b3"] - } - }, - { - "id": "tabs-refreshed", - "observation": { - "sender": ["2977cbddd89f", "cc673665ea16"], - "payloads": ["cce8a731064a", "579afe83429e"], - "settlements": { - "mount": "eb79a9b3682a", - "create": "eb79a9b3682a" - }, - "state": "4e377b1c4bf7", - "effects": [ - "4d318de3b635", - "c9f8d8917777", - "8b5144e3301d", - "cf7e2c3136b3", - "a4f53f7fb1d7" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-icons.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-icons.json deleted file mode 100644 index 0613f83a363..00000000000 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-icons.json +++ /dev/null @@ -1,509 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "namedDeltas": [], - "values": { - "091af476e5cc": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.listTargetSummaries\"}" - }, - "0fd72e1aba93": { - "desktopRepos": [ - { - "badgeColor": "#123456", - "displayName": "Lucide", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1", - "repoIcon": { - "name": "Rocket", - "type": "lucide" - } - }, - { - "displayName": "Emoji", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2", - "repoIcon": { - "emoji": "🐳", - "type": "emoji" - } - }, - { - "displayName": "Avatar", - "executionHostId": "ssh:ssh-1", - "id": "repo-3", - "path": "repo-3", - "repoIcon": { - "label": "acme/orca", - "source": "github", - "src": "https://github.com/acme.png?size=64", - "type": "image" - } - } - ], - "hostHealthById": [], - "hostLabelById": [["ssh:ssh-1", "SSH"]], - "hostPlatform": "darwin", - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"], - ["repo-3", "ssh:ssh-1"] - ] - }, - "12ba3f41d4db": { - "name": "hostPlatform", - "ordinal": 14, - "value": "darwin" - }, - "13397c3d4e28": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [], - "hostSettingOverrides": {} - } - } - } - } - }, - "21069b5e026b": { - "name": "streams-registered-at-teardown", - "ordinal": 15, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "2864022c20ef": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "platform": "darwin" - } - } - } - }, - "353f0cb8ea69": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "51f04c7a4983": { - "name": "desktopRepos", - "ordinal": 7, - "value": [ - { - "badgeColor": "#123456", - "displayName": "Lucide", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1", - "repoIcon": { - "name": "Rocket", - "type": "lucide" - } - }, - { - "displayName": "Emoji", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2", - "repoIcon": { - "emoji": "🐳", - "type": "emoji" - } - }, - { - "displayName": "Avatar", - "executionHostId": "ssh:ssh-1", - "id": "repo-3", - "path": "repo-3", - "repoIcon": { - "label": "acme/orca", - "source": "github", - "src": "https://github.com/acme.png?size=64", - "type": "image" - } - } - ] - }, - "564f54c8d902": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "56ab81cb67dc": { - "name": "hostLabelById", - "ordinal": 13, - "value": [["ssh:ssh-1", "SSH"]] - }, - "7999924c608c": { - "name": "settings.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "80e40a970f99": { - "name": "host.platform#1", - "ordinal": 11, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"host.platform\"}" - }, - "84c1dde54c62": { - "name": "hostHealthById", - "ordinal": 12, - "value": [] - }, - "910617d262f4": { - "desktopRepos": [ - { - "badgeColor": "#123456", - "displayName": "Lucide", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1", - "repoIcon": { - "name": "Rocket", - "type": "lucide" - } - }, - { - "displayName": "Emoji", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2", - "repoIcon": { - "emoji": "🐳", - "type": "emoji" - } - }, - { - "displayName": "Avatar", - "executionHostId": "ssh:ssh-1", - "id": "repo-3", - "path": "repo-3", - "repoIcon": { - "label": "acme/orca", - "source": "github", - "src": "https://github.com/acme.png?size=64", - "type": "image" - } - } - ], - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"], - ["repo-3", "ssh:ssh-1"] - ] - }, - "913d2a349d4d": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - } - }, - "beb4ddf549da": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\",\"params\":{\"afterSnapshotId\":null}}" - }, - "c042445bb597": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "badgeColor": "#123456", - "connectionId": { - "$rpc": "null" - }, - "displayName": "Lucide", - "id": "repo-1", - "repoIcon": { - "name": "Rocket", - "type": "lucide" - } - }, - { - "connectionId": "ssh-1", - "displayName": "Emoji", - "id": "repo-2", - "repoIcon": { - "emoji": "🐳", - "type": "emoji" - } - }, - { - "displayName": "Avatar", - "executionHostId": "ssh:ssh-1", - "id": "repo-3", - "repoIcon": { - "label": "acme/orca", - "source": "github", - "src": "https://github.com/acme.png?size=64", - "type": "image" - } - } - ] - } - } - } - }, - "d4ee33c46b05": { - "name": "repoHostIdByRepoId", - "ordinal": 8, - "value": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"], - ["repo-3", "ssh:ssh-1"] - ] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - } - }, - "recording": { - "scenario": "settings-repo-metadata-icons", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["c042445bb597", "913d2a349d4d", "353f0cb8ea69", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "910617d262f4", - "effects": ["51f04c7a4983", "d4ee33c46b05"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["c042445bb597", "913d2a349d4d", "13397c3d4e28", "2864022c20ef"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "0fd72e1aba93", - "effects": [ - "51f04c7a4983", - "d4ee33c46b05", - "84c1dde54c62", - "56ab81cb67dc", - "12ba3f41d4db" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["c042445bb597", "913d2a349d4d", "13397c3d4e28", "2864022c20ef"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "0fd72e1aba93", - "effects": [ - "51f04c7a4983", - "d4ee33c46b05", - "84c1dde54c62", - "56ab81cb67dc", - "12ba3f41d4db", - "21069b5e026b" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json deleted file mode 100644 index 1ccd86c7a3e..00000000000 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json +++ /dev/null @@ -1,829 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "namedDeltas": [], - "values": { - "04278f519cb2": { - "name": "host.platform#2", - "ordinal": 18, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "091af476e5cc": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.listTargetSummaries\"}" - }, - "20200b8feac4": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "platform": "linux" - } - } - } - }, - "353f0cb8ea69": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "44eb39507b75": { - "name": "streams-registered-at-teardown", - "ordinal": 23, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "564f54c8d902": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "56ab81cb67dc": { - "name": "hostLabelById", - "ordinal": 13, - "value": [["ssh:ssh-1", "SSH"]] - }, - "6770aa1912e4": { - "name": "repo.list#2", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "repos": [ - { - "connectionId": { - "$rpc": "null" - }, - "displayName": "Local", - "id": "repo-1" - }, - { - "connectionId": "ssh-1", - "displayName": "Remote", - "id": "repo-2" - } - ] - } - } - } - }, - "68916f125c3c": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "689e19c40847": { - "name": "ssh.listTargetSummaries#2", - "ordinal": 16, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "6c56b8af9ea2": { - "name": "host.platform#2", - "ordinal": 22, - "json": "{\"id\":\"frame-9\",\"deviceToken\":\"recording-device\",\"method\":\"host.platform\"}" - }, - "6d43117882f3": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "hostHealthById": [], - "hostLabelById": [["ssh:ssh-1", "SSH"]], - "hostPlatform": "linux", - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "7999924c608c": { - "name": "settings.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "80e40a970f99": { - "name": "host.platform#1", - "ordinal": 11, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"host.platform\"}" - }, - "84c1dde54c62": { - "name": "hostHealthById", - "ordinal": 12, - "value": [] - }, - "8509974080e2": { - "name": "settings.get#2", - "ordinal": 21, - "json": "{\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "8cfdd18c5fe6": { - "name": "repoHostIdByRepoId", - "ordinal": 8, - "value": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "8e05de8d7963": { - "name": "settings.get#2", - "ordinal": 17, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-8", - "ok": false - } - } - }, - "8e76374272ce": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - } - } - } - }, - "913d2a349d4d": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "b2746491ac07": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "connectionId": { - "$rpc": "null" - }, - "displayName": "Local", - "id": "repo-1" - }, - { - "connectionId": "ssh-1", - "displayName": "Remote", - "id": "repo-2" - } - ] - } - } - } - }, - "bb0a00f148b2": { - "name": "ssh.listTargetSummaries#2", - "ordinal": 20, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.listTargetSummaries\"}" - }, - "beb4ddf549da": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\",\"params\":{\"afterSnapshotId\":null}}" - }, - "c1bc3351532b": { - "name": "repo.list#2", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c54bb879da19": { - "name": "ssh.listTargetSummaries#2", - "ordinal": 16, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - } - }, - "d9a8f70590a3": { - "name": "repo.list#2", - "ordinal": 19, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\",\"params\":{\"afterSnapshotId\":null}}" - }, - "dada2e9c7660": { - "name": "host.platform#2", - "ordinal": 18, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-9", - "ok": true, - "result": { - "platform": "linux" - } - } - } - }, - "e7b605a67b1f": { - "name": "desktopRepos", - "ordinal": 7, - "value": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ] - }, - "e9522d7085ef": { - "name": "settings.get#2", - "ordinal": 17, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "f9193cae5824": { - "name": "hostPlatform", - "ordinal": 14, - "value": "linux" - } - }, - "recording": { - "scenario": "settings-repo-metadata-refuse-after-data", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "353f0cb8ea69", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "data-present", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "refresh-pending", - "observation": { - "sender": [ - "b2746491ac07", - "913d2a349d4d", - "8e76374272ce", - "20200b8feac4", - "c1bc3351532b", - "689e19c40847", - "e9522d7085ef", - "04278f519cb2" - ], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99", - "d9a8f70590a3", - "bb0a00f148b2", - "8509974080e2", - "6c56b8af9ea2" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "reload": "9270aeb7d9c6" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "refused-after-data", - "observation": { - "sender": [ - "b2746491ac07", - "913d2a349d4d", - "8e76374272ce", - "20200b8feac4", - "6770aa1912e4", - "c54bb879da19", - "8e05de8d7963", - "dada2e9c7660" - ], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99", - "d9a8f70590a3", - "bb0a00f148b2", - "8509974080e2", - "6c56b8af9ea2" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "reload": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": [ - "b2746491ac07", - "913d2a349d4d", - "8e76374272ce", - "20200b8feac4", - "6770aa1912e4", - "c54bb879da19", - "8e05de8d7963", - "dada2e9c7660" - ], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99", - "d9a8f70590a3", - "bb0a00f148b2", - "8509974080e2", - "6c56b8af9ea2" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "reload": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824", - "44eb39507b75" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json deleted file mode 100644 index d8b27190089..00000000000 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "namedDeltas": [], - "values": { - "091af476e5cc": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.listTargetSummaries\"}" - }, - "20200b8feac4": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "platform": "linux" - } - } - } - }, - "21069b5e026b": { - "name": "streams-registered-at-teardown", - "ordinal": 15, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "353f0cb8ea69": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "564f54c8d902": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "56ab81cb67dc": { - "name": "hostLabelById", - "ordinal": 13, - "value": [["ssh:ssh-1", "SSH"]] - }, - "68916f125c3c": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "6d43117882f3": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "hostHealthById": [], - "hostLabelById": [["ssh:ssh-1", "SSH"]], - "hostPlatform": "linux", - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "7999924c608c": { - "name": "settings.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "80e40a970f99": { - "name": "host.platform#1", - "ordinal": 11, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"host.platform\"}" - }, - "84c1dde54c62": { - "name": "hostHealthById", - "ordinal": 12, - "value": [] - }, - "8cfdd18c5fe6": { - "name": "repoHostIdByRepoId", - "ordinal": 8, - "value": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "913d2a349d4d": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - } - }, - "b2746491ac07": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "connectionId": { - "$rpc": "null" - }, - "displayName": "Local", - "id": "repo-1" - }, - { - "connectionId": "ssh-1", - "displayName": "Remote", - "id": "repo-2" - } - ] - } - } - } - }, - "beb4ddf549da": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\",\"params\":{\"afterSnapshotId\":null}}" - }, - "d2b9a3a50f2e": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-4", - "ok": false - } - } - }, - "e7b605a67b1f": { - "name": "desktopRepos", - "ordinal": 7, - "value": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "f9193cae5824": { - "name": "hostPlatform", - "ordinal": 14, - "value": "linux" - } - }, - "recording": { - "scenario": "settings-repo-metadata-refused", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "353f0cb8ea69", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "d2b9a3a50f2e", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "d2b9a3a50f2e", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824", - "21069b5e026b" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json deleted file mode 100644 index ab358646c4d..00000000000 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json +++ /dev/null @@ -1,417 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "namedDeltas": [], - "values": { - "091af476e5cc": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.listTargetSummaries\"}" - }, - "20200b8feac4": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "platform": "linux" - } - } - } - }, - "21069b5e026b": { - "name": "streams-registered-at-teardown", - "ordinal": 15, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "353f0cb8ea69": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "564f54c8d902": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "56ab81cb67dc": { - "name": "hostLabelById", - "ordinal": 13, - "value": [["ssh:ssh-1", "SSH"]] - }, - "68916f125c3c": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "6d43117882f3": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "hostHealthById": [], - "hostLabelById": [["ssh:ssh-1", "SSH"]], - "hostPlatform": "linux", - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "7999924c608c": { - "name": "settings.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "80e40a970f99": { - "name": "host.platform#1", - "ordinal": 11, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"host.platform\"}" - }, - "84c1dde54c62": { - "name": "hostHealthById", - "ordinal": 12, - "value": [] - }, - "8cfdd18c5fe6": { - "name": "repoHostIdByRepoId", - "ordinal": 8, - "value": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "913d2a349d4d": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - } - }, - "b2746491ac07": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "connectionId": { - "$rpc": "null" - }, - "displayName": "Local", - "id": "repo-1" - }, - { - "connectionId": "ssh-1", - "displayName": "Remote", - "id": "repo-2" - } - ] - } - } - } - }, - "beb4ddf549da": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\",\"params\":{\"afterSnapshotId\":null}}" - }, - "e7b605a67b1f": { - "name": "desktopRepos", - "ordinal": 7, - "value": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "ef11a2e4f9d5": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - } - }, - "f9193cae5824": { - "name": "hostPlatform", - "ordinal": 14, - "value": "linux" - } - }, - "recording": { - "scenario": "settings-repo-metadata-transport-error", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "353f0cb8ea69", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "ef11a2e4f9d5", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "ef11a2e4f9d5", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824", - "21069b5e026b" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json b/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json deleted file mode 100644 index 67e9dbe7c20..00000000000 --- a/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json +++ /dev/null @@ -1,846 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.task-hydration", - "family": "settings.task-hydration", - "namedDeltas": [], - "values": { - "05ccd79ba4af": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "0ebb7f0660a0": { - "name": "showLinearTeamPicker", - "ordinal": 4, - "value": false - }, - "15cdb7759e6b": { - "name": "ui.get#1", - "ordinal": 41, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"ui.get\"}" - }, - "1833d0fa5f1d": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "19505460d94b": { - "name": "githubMode", - "ordinal": 55, - "value": "items" - }, - "1a1091da11b2": { - "name": "githubProjectSettings", - "ordinal": 61, - "value": { - "activeProject": { - "$rpc": "null" - }, - "lastViewByProject": {}, - "pinned": [], - "recent": [] - } - }, - "1dfcd3f6163d": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "22b355deb2df": { - "name": "provider", - "ordinal": 54, - "value": "github" - }, - "26ece795530e": { - "name": "showGitHubIssueSourcePicker", - "ordinal": 14, - "value": false - }, - "276a60ed41a5": { - "name": "mergeMethodTaskItem", - "ordinal": 28, - "value": { - "$rpc": "null" - } - }, - "2aad05f979a9": { - "name": "selectedRepoIds", - "ordinal": 52, - "value": [] - }, - "2b39b469a001": { - "name": "pendingGitHubProjectViewSelection", - "ordinal": 19, - "value": { - "$rpc": "null" - } - }, - "2bf05835527f": { - "name": "showLinearFilterPicker", - "ordinal": 11, - "value": false - }, - "2c3706d59dd5": { - "name": "linearTeams", - "ordinal": 49, - "value": [] - }, - "2d9ce55cc13a": { - "name": "query", - "ordinal": 62, - "value": "is:issue is:open" - }, - "301bdbdf1dec": { - "name": "taskStateHydrated", - "ordinal": 1, - "value": false - }, - "3082bf4965fa": { - "name": "selectedLinearWorkspaceId", - "ordinal": 51, - "value": { - "$rpc": "null" - } - }, - "354e99da4ba4": { - "name": "pendingHostedStateChange", - "ordinal": 27, - "value": { - "$rpc": "null" - } - }, - "394fb5675266": { - "name": "mergeMethodProjectRow", - "ordinal": 29, - "value": { - "$rpc": "null" - } - }, - "3a03e162efd9": { - "name": "selectedLinearTeamIds", - "ordinal": 50, - "value": [] - }, - "3a94dcc00915": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "3c66c971fe96": { - "name": "showGitHubProjectViewPicker", - "ordinal": 17, - "value": false - }, - "3ff235330cbe": { - "name": "jiraFilter", - "ordinal": 60, - "value": "assigned" - }, - "40f00017ad77": { - "name": "linearWorkspaces", - "ordinal": 48, - "value": [] - }, - "430c28cba43c": { - "name": "taskStateHydrated", - "ordinal": 64, - "value": true - }, - "45cfb5ee97ea": { - "name": "pendingHostedMerge", - "ordinal": 25, - "value": { - "$rpc": "null" - } - }, - "45e466d86a07": { - "name": "showLinearWorkspacePicker", - "ordinal": 3, - "value": false - }, - "4cbaceb42c08": { - "name": "detailPayload", - "ordinal": 21, - "value": { - "$rpc": "null" - } - }, - "5729b7cdb4ba": { - "name": "showFilterSheet", - "ordinal": 12, - "value": false - }, - "57568fbaf4f7": { - "name": "linearConnected", - "ordinal": 47, - "value": false - }, - "5886b76643d9": { - "name": "appliedQuery", - "ordinal": 63, - "value": "is:issue is:open" - }, - "5c7f665de6c4": { - "name": "githubPreset", - "ordinal": 57, - "value": "issues" - }, - "600862ad27b3": { - "name": "githubProjectHiddenFieldIdsByView", - "ordinal": 46, - "value": {} - }, - "688fe01c6196": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "714d4b3547ff": { - "name": "projectRepoNotInOrca", - "ordinal": 20, - "value": { - "$rpc": "null" - } - }, - "71bedad13169": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "756c11d6e5bc": { - "name": "settings.get#1", - "ordinal": 40, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "7b0ad7b958dd": { - "name": "tasksSupportState", - "ordinal": 2, - "value": { - "client": "logical-client", - "kind": "unknown" - } - }, - "800b1afcceea": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "glab": { - "installed": false - } - } - } - } - }, - "8015a69c7774": { - "name": "showGitLabFilterPicker", - "ordinal": 10, - "value": false - }, - "82daca007272": { - "name": "jiraConnection", - "ordinal": 65, - "value": { - "connected": false, - "credentialError": { - "$rpc": "null" - }, - "selection": { - "$rpc": "null" - }, - "sites": [], - "unavailableReason": { - "$rpc": "null" - } - } - }, - "82fb15a0f7e3": { - "name": "runtimeTaskSettings", - "ordinal": 44, - "value": {} - }, - "87bd323da79d": { - "name": "trustedOrcaHooks", - "ordinal": 45, - "value": {} - }, - "8c4056edb811": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "8db7a6a7d531": { - "name": "status.get#1", - "ordinal": 30, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1"] - } - } - } - }, - "931e8e15095d": { - "name": "showGitHubProjectPicker", - "ordinal": 16, - "value": false - }, - "93acc26335bc": { - "name": "githubKind", - "ordinal": 58, - "value": "issues" - }, - "963a91c532c8": { - "hydrated": true, - "settings": {} - }, - "98281d0e8b13": { - "name": "projectRowDetail", - "ordinal": 22, - "value": { - "$rpc": "null" - } - }, - "9b2188f8d6b7": { - "name": "showGitHubPagePicker", - "ordinal": 15, - "value": false - }, - "9d27c74981a1": { - "name": "error", - "ordinal": 33, - "value": "" - }, - "9f545b97e888": { - "name": "showCreateTargetPicker", - "ordinal": 23, - "value": false - }, - "a1d4e4be5356": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-3", - "ok": false - } - } - }, - "a5addaab38bf": { - "name": "linearFilter", - "ordinal": 59, - "value": "all" - }, - "aa9af10b3812": { - "name": "preflight.check#1", - "ordinal": 42, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.check\"}" - }, - "ab4a6032b0e4": { - "name": "jira.status#1", - "ordinal": 39, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"jira.status\"}" - }, - "b7cc1194ed29": { - "name": "visibleProviders", - "ordinal": 53, - "value": ["github", "jira", "linear"] - }, - "bbce658fe3f5": { - "name": "showRepoPicker", - "ordinal": 13, - "value": false - }, - "c11fe123ce70": { - "name": "showGitHubProjectFieldsPicker", - "ordinal": 18, - "value": false - }, - "c1630da260c7": { - "name": "showLinearDisplayPicker", - "ordinal": 5, - "value": false - }, - "c37873342ba8": { - "name": "linearStatusPickerItem", - "ordinal": 24, - "value": { - "$rpc": "null" - } - }, - "c6178e6a0f4e": { - "hydrated": false, - "settings": {} - }, - "c87109595a65": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "ui": {} - } - } - } - }, - "d100b9546c3d": { - "name": "showGitHubKindPicker", - "ordinal": 7, - "value": false - }, - "d1af3771ebfa": { - "name": "status.get#1", - "ordinal": 31, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "d208e8015339": { - "name": "showGitHubPresetPicker", - "ordinal": 8, - "value": false - }, - "d50362207233": { - "name": "tasksSupportState", - "ordinal": 32, - "value": { - "client": "logical-client", - "kind": "supported" - } - }, - "dd6fb20daf67": { - "name": "linear.status#1", - "ordinal": 43, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"linear.status\"}" - }, - "e033cf17e121": { - "name": "showGitLabViewPicker", - "ordinal": 9, - "value": false - }, - "e61de5a1b27e": { - "name": "defaultGitHubPreset", - "ordinal": 56, - "value": "issues" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f164de325151": { - "name": "pendingProjectGitHubMerge", - "ordinal": 26, - "value": { - "$rpc": "null" - } - }, - "fdb0bbb8aa59": { - "name": "showLinearConnect", - "ordinal": 6, - "value": false - } - }, - "recording": { - "scenario": "settings-task-hydration-refused", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": [ - "8db7a6a7d531", - "1833d0fa5f1d", - "3a94dcc00915", - "71bedad13169", - "1dfcd3f6163d", - "05ccd79ba4af" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1" - ] - } - }, - { - "id": "settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "688fe01c6196", - "a1d4e4be5356", - "c87109595a65", - "800b1afcceea", - "8c4056edb811" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "963a91c532c8", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "82fb15a0f7e3", - "87bd323da79d", - "600862ad27b3", - "57568fbaf4f7", - "40f00017ad77", - "2c3706d59dd5", - "3a03e162efd9", - "3082bf4965fa", - "2aad05f979a9", - "b7cc1194ed29", - "22b355deb2df", - "19505460d94b", - "e61de5a1b27e", - "5c7f665de6c4", - "93acc26335bc", - "a5addaab38bf", - "3ff235330cbe", - "1a1091da11b2", - "2d9ce55cc13a", - "5886b76643d9", - "430c28cba43c", - "82daca007272" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-task-write.json b/mobile/rpc-foundation/goldens/settings-task-write.json deleted file mode 100644 index 43023fce813..00000000000 --- a/mobile/rpc-foundation/goldens/settings-task-write.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.task-preferences", - "family": "settings-best-effort", - "namedDeltas": [], - "values": { - "03d1fef54a8c": { - "name": "settings.update#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.update\",\"params\":{\"defaultTaskViewPreset\":\"my-issues\"}}" - }, - "38f60ac30222": { - "preset": "my-issues" - }, - "687f86875a7f": { - "name": "settings.update#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.update" - }, - { - "name": "params", - "value": { - "defaultTaskViewPreset": "my-issues" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "write disconnected", - "isRpcDeliveryUnknown": true - } - } - }, - "a10aec8208b3": { - "name": "defaultGitHubPreset", - "ordinal": 1, - "value": "my-issues" - }, - "b6c9da6aafa0": { - "name": "settings.update#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.update" - }, - { - "name": "params", - "value": { - "defaultTaskViewPreset": "my-issues" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "settings-task-write", - "checkpoints": [ - { - "id": "optimistic", - "observation": { - "sender": ["b6c9da6aafa0"], - "payloads": ["03d1fef54a8c"], - "settlements": { - "mount": "eb79a9b3682a", - "write": "eb79a9b3682a" - }, - "state": "38f60ac30222", - "effects": ["a10aec8208b3"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["687f86875a7f"], - "payloads": ["03d1fef54a8c"], - "settlements": { - "mount": "eb79a9b3682a", - "write": "eb79a9b3682a" - }, - "state": "38f60ac30222", - "effects": ["a10aec8208b3"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tasks-route-repo-list.json b/mobile/rpc-foundation/goldens/tasks-route-repo-list.json deleted file mode 100644 index ee7dc80804a..00000000000 --- a/mobile/rpc-foundation/goldens/tasks-route-repo-list.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.route-repo-list", - "family": "tasks.route-repo-list", - "namedDeltas": [], - "values": { - "19b2979d7fc2": { - "name": "repo.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "35f85fe3b71c": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "7d0fa424be7c": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "name": "orca" - }, - { - "id": "repo-2", - "name": "relay" - } - ] - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "afa949a66032": { - "crash": { - "$rpc": "null" - }, - "repoListError": "", - "repoListStatus": "idle", - "repos": [] - }, - "b15e86f79919": { - "crash": { - "$rpc": "null" - }, - "repoListError": "", - "repoListStatus": "loading", - "repos": [] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f5484d90b3f7": { - "crash": { - "$rpc": "null" - }, - "repoListError": "", - "repoListStatus": "loaded", - "repos": ["repo-1", "repo-2"] - }, - "fcd8faa86ca8": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "id": "repo-1", - "name": "orca" - }, - { - "id": "repo-2", - "name": "relay" - } - ] - } - }, - "recording": { - "scenario": "tasks-route-repo-list", - "checkpoints": [ - { - "id": "idle", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "afa949a66032", - "effects": [] - } - }, - { - "id": "repos-pending", - "observation": { - "sender": ["35f85fe3b71c"], - "payloads": ["19b2979d7fc2"], - "settlements": { - "mount": "eb79a9b3682a", - "ensure": "9270aeb7d9c6" - }, - "state": "b15e86f79919", - "effects": [] - } - }, - { - "id": "repos-loaded", - "observation": { - "sender": ["7d0fa424be7c"], - "payloads": ["19b2979d7fc2"], - "settlements": { - "mount": "eb79a9b3682a", - "ensure": "fcd8faa86ca8" - }, - "state": "f5484d90b3f7", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-create-github.json b/mobile/rpc-foundation/goldens/tk-create-github.json deleted file mode 100644 index 39f6c96b51e..00000000000 --- a/mobile/rpc-foundation/goldens/tk-create-github.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.task-create-github", - "family": "tasks.task-create-github", - "namedDeltas": [], - "values": { - "0fef9dc7845d": { - "name": "createTitle", - "ordinal": 7, - "value": "" - }, - "13b1e9c092d4": { - "name": "createBody", - "ordinal": 8, - "value": "" - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "4e4bdca5791a": { - "name": "github.createIssue#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.createIssue\",\"params\":{\"repo\":\"id:repo-1\",\"title\":\"A new task\",\"body\":\"a body\"}}" - }, - "5294116e0f90": { - "name": "creatingTask", - "ordinal": 1, - "value": true - }, - "5ab5b62983be": { - "composer": false, - "creating": false, - "error": "", - "item": { - "key": "github:repo-1:issue:11", - "provider": "github", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:11", - "labels": [], - "number": 11, - "repoId": "repo-1", - "repoName": "Repo", - "state": "open", - "title": "A new task", - "type": "issue", - "updatedAt": "2026-01-01T00:00:00.000Z", - "url": "https://github.com/owner/repo/issues/11" - }, - "status": "Open", - "subtitle": "Repo #11", - "title": "A new task", - "updatedAt": "2026-01-01T00:00:00.000Z" - } - }, - "6608b7892446": { - "name": "actionItem", - "ordinal": 5, - "value": { - "key": "github:repo-1:issue:11", - "provider": "github", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:11", - "labels": [], - "number": 11, - "repoId": "repo-1", - "repoName": "Repo", - "state": "open", - "title": "A new task", - "type": "issue", - "updatedAt": "2026-01-01T00:00:00.000Z", - "url": "https://github.com/owner/repo/issues/11" - }, - "status": "Open", - "subtitle": "Repo #11", - "title": "A new task", - "updatedAt": "2026-01-01T00:00:00.000Z" - } - }, - "8a05070aeca4": { - "name": "github.createIssue#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.createIssue" - }, - { - "name": "params", - "value": { - "body": "a body", - "repo": "id:repo-1", - "title": "A new task" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "number": 11, - "ok": true, - "url": "https://github.com/owner/repo/issues/11" - } - } - } - }, - "91dfb0399568": { - "name": "repo.update#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "repo.update" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1", - "updates": { - "issueSourcePreference": "upstream" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "a0dc5663c500": { - "name": "repo.update#1", - "ordinal": 12, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.update\",\"params\":{\"repo\":\"id:repo-1\",\"updates\":{\"issueSourcePreference\":\"upstream\"}}}" - }, - "b1504689c2b3": { - "name": "creatingTask", - "ordinal": 9, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed3a7d6bc894": { - "name": "error", - "ordinal": 2, - "value": "" - }, - "fa467ac4ab12": { - "name": "showCreateTask", - "ordinal": 6, - "value": false - } - }, - "recording": { - "scenario": "tk-create-github", - "checkpoints": [ - { - "id": "create-settled", - "observation": { - "sender": ["8a05070aeca4"], - "payloads": ["4e4bdca5791a"], - "settlements": { - "mount": "eb79a9b3682a", - "create-0": "eb79a9b3682a" - }, - "state": "5ab5b62983be", - "effects": [ - "5294116e0f90", - "ed3a7d6bc894", - "6608b7892446", - "fa467ac4ab12", - "0fef9dc7845d", - "13b1e9c092d4", - "b1504689c2b3" - ] - } - }, - { - "id": "issue-source-settled", - "observation": { - "sender": ["8a05070aeca4", "91dfb0399568"], - "payloads": ["4e4bdca5791a", "a0dc5663c500"], - "settlements": { - "mount": "eb79a9b3682a", - "create-0": "eb79a9b3682a", - "issue-source-1": "eb79a9b3682a" - }, - "state": "5ab5b62983be", - "effects": [ - "5294116e0f90", - "ed3a7d6bc894", - "6608b7892446", - "fa467ac4ab12", - "0fef9dc7845d", - "13b1e9c092d4", - "b1504689c2b3", - "3aefb3006914" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-create-gitlab.json b/mobile/rpc-foundation/goldens/tk-create-gitlab.json deleted file mode 100644 index cfe3ffd7b23..00000000000 --- a/mobile/rpc-foundation/goldens/tk-create-gitlab.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.task-create-gitlab", - "family": "tasks.task-create-gitlab", - "namedDeltas": [], - "values": { - "0fef9dc7845d": { - "name": "createTitle", - "ordinal": 7, - "value": "" - }, - "13b1e9c092d4": { - "name": "createBody", - "ordinal": 8, - "value": "" - }, - "2b5235cc87a9": { - "name": "actionItem", - "ordinal": 5, - "value": { - "key": "gitlab:repo-1:issue:6", - "provider": "gitlab", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:6", - "labels": [], - "number": 6, - "repoId": "repo-1", - "repoName": "Repo", - "state": "opened", - "title": "A new task", - "type": "issue", - "updatedAt": "2026-01-01T00:00:00.000Z", - "url": "https://gitlab.com/group/project/-/issues/6" - }, - "status": "Open", - "subtitle": "Repo #6", - "title": "A new task", - "updatedAt": "2026-01-01T00:00:00.000Z" - } - }, - "5294116e0f90": { - "name": "creatingTask", - "ordinal": 1, - "value": true - }, - "556994c67572": { - "name": "gitlab.createIssue#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.createIssue\",\"params\":{\"repo\":\"id:repo-1\",\"title\":\"A new task\",\"body\":\"a body\"}}" - }, - "580f3724d37b": { - "composer": false, - "creating": false, - "error": "", - "item": { - "key": "gitlab:repo-1:issue:6", - "provider": "gitlab", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:6", - "labels": [], - "number": 6, - "repoId": "repo-1", - "repoName": "Repo", - "state": "opened", - "title": "A new task", - "type": "issue", - "updatedAt": "2026-01-01T00:00:00.000Z", - "url": "https://gitlab.com/group/project/-/issues/6" - }, - "status": "Open", - "subtitle": "Repo #6", - "title": "A new task", - "updatedAt": "2026-01-01T00:00:00.000Z" - } - }, - "ac13fff3e6e2": { - "name": "gitlab.createIssue#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "gitlab.createIssue" - }, - { - "name": "params", - "value": { - "body": "a body", - "repo": "id:repo-1", - "title": "A new task" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "number": 6, - "ok": true, - "url": "https://gitlab.com/group/project/-/issues/6" - } - } - } - }, - "b1504689c2b3": { - "name": "creatingTask", - "ordinal": 9, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed3a7d6bc894": { - "name": "error", - "ordinal": 2, - "value": "" - }, - "fa467ac4ab12": { - "name": "showCreateTask", - "ordinal": 6, - "value": false - } - }, - "recording": { - "scenario": "tk-create-gitlab", - "checkpoints": [ - { - "id": "create-settled", - "observation": { - "sender": ["ac13fff3e6e2"], - "payloads": ["556994c67572"], - "settlements": { - "mount": "eb79a9b3682a", - "create-0": "eb79a9b3682a" - }, - "state": "580f3724d37b", - "effects": [ - "5294116e0f90", - "ed3a7d6bc894", - "2b5235cc87a9", - "fa467ac4ab12", - "0fef9dc7845d", - "13b1e9c092d4", - "b1504689c2b3" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-create-linear.json b/mobile/rpc-foundation/goldens/tk-create-linear.json deleted file mode 100644 index da5a1b847aa..00000000000 --- a/mobile/rpc-foundation/goldens/tk-create-linear.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.task-create-linear", - "family": "tasks.task-create-linear", - "namedDeltas": [], - "values": { - "0fef9dc7845d": { - "name": "createTitle", - "ordinal": 7, - "value": "" - }, - "13b1e9c092d4": { - "name": "createBody", - "ordinal": 8, - "value": "" - }, - "29d4d3d3640c": { - "composer": false, - "creating": false, - "error": "", - "item": { - "key": "linear:linear-workspace:issue-3", - "provider": "linear", - "source": { - "description": "a body", - "id": "issue-3", - "identifier": "ENG-3", - "labels": [], - "priority": 0, - "state": { - "color": "#3276f2", - "name": "Open", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "workspaceId": "linear-workspace", - "workspaceName": "Workspace" - }, - "title": "A sub-issue", - "updatedAt": "2026-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace", - "workspaceName": "Workspace" - }, - "status": "Open", - "subtitle": "ENG-3 · undefined", - "title": "A sub-issue", - "updatedAt": "2026-01-01T00:00:00.000Z" - } - }, - "3c76066eb236": { - "name": "linear.createIssue#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "linear.createIssue" - }, - { - "name": "params", - "value": { - "description": "a body", - "teamId": "team-1", - "title": "A new task", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "id": "issue-3", - "identifier": "ENG-3", - "ok": true, - "title": "A sub-issue", - "url": "" - } - } - } - }, - "5294116e0f90": { - "name": "creatingTask", - "ordinal": 1, - "value": true - }, - "b1504689c2b3": { - "name": "creatingTask", - "ordinal": 9, - "value": false - }, - "ce67fb8d9d58": { - "name": "linear.createIssue#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.createIssue\",\"params\":{\"teamId\":\"team-1\",\"title\":\"A new task\",\"description\":\"a body\",\"workspaceId\":\"linear-workspace\"}}" - }, - "e20c41f15d23": { - "name": "actionItem", - "ordinal": 5, - "value": { - "key": "linear:linear-workspace:issue-3", - "provider": "linear", - "source": { - "description": "a body", - "id": "issue-3", - "identifier": "ENG-3", - "labels": [], - "priority": 0, - "state": { - "color": "#3276f2", - "name": "Open", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "workspaceId": "linear-workspace", - "workspaceName": "Workspace" - }, - "title": "A sub-issue", - "updatedAt": "2026-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace", - "workspaceName": "Workspace" - }, - "status": "Open", - "subtitle": "ENG-3 · undefined", - "title": "A sub-issue", - "updatedAt": "2026-01-01T00:00:00.000Z" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed3a7d6bc894": { - "name": "error", - "ordinal": 2, - "value": "" - }, - "fa467ac4ab12": { - "name": "showCreateTask", - "ordinal": 6, - "value": false - } - }, - "recording": { - "scenario": "tk-create-linear", - "checkpoints": [ - { - "id": "create-settled", - "observation": { - "sender": ["3c76066eb236"], - "payloads": ["ce67fb8d9d58"], - "settlements": { - "mount": "eb79a9b3682a", - "create-0": "eb79a9b3682a" - }, - "state": "29d4d3d3640c", - "effects": [ - "5294116e0f90", - "ed3a7d6bc894", - "e20c41f15d23", - "fa467ac4ab12", - "0fef9dc7845d", - "13b1e9c092d4", - "b1504689c2b3" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-metadata-gitlab-mr.json b/mobile/rpc-foundation/goldens/tk-item-metadata-gitlab-mr.json deleted file mode 100644 index 03e5f944c85..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-metadata-gitlab-mr.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-metadata-gitlab-mr", - "family": "tasks.item-metadata-gitlab-mr", - "namedDeltas": [], - "values": { - "14949c71727e": { - "name": "mutatingStatus", - "ordinal": 7, - "value": false - }, - "23ede8191c86": { - "name": "detailPayload", - "ordinal": 9, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "266686bfdeec": { - "error": "", - "item": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": ["bug", "triage"], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "title": "Renamed", - "type": "mr" - }, - "title": "Renamed" - }, - "items": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": ["bug", "triage"], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "title": "Renamed", - "type": "mr" - }, - "title": "Renamed" - } - ], - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug", "triage"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "3af513ef8a7e": { - "name": "items", - "ordinal": 14, - "value": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": ["bug", "triage"], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "title": "Renamed", - "type": "mr" - }, - "title": "Renamed" - } - ] - }, - "62e92e71cb1f": { - "name": "mutatingStatus", - "ordinal": 17, - "value": false - }, - "806d212f3150": { - "name": "actionItem", - "ordinal": 15, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": ["bug", "triage"], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "title": "Renamed", - "type": "mr" - }, - "title": "Renamed" - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "98fe08e442ec": { - "name": "itemRemoveAssigneesDraft", - "ordinal": 5, - "value": "" - }, - "9e46e6e7c627": { - "name": "detailPayload", - "ordinal": 16, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug", "triage"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "a4c82b4992bd": { - "name": "actionItem", - "ordinal": 8, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - } - }, - "a80ee9a342f1": { - "name": "itemAddAssigneesDraft", - "ordinal": 3, - "value": "" - }, - "b93b4f6d74db": { - "name": "itemAddLabelsDraft", - "ordinal": 4, - "value": "" - }, - "c41542d48b3c": { - "name": "gitlab.updateMR#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "gitlab.updateMR" - }, - { - "name": "params", - "value": { - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "updates": { - "addLabels": ["triage"], - "body": { - "$rpc": "undefined" - }, - "removeLabels": { - "$rpc": "undefined" - }, - "title": "Renamed" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "c79fe0d83267": { - "name": "itemRemoveLabelsDraft", - "ordinal": 6, - "value": "" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "daa0db125085": { - "name": "gitlab.updateMR#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.updateMR\",\"params\":{\"repo\":\"id:repo-1\",\"iid\":7,\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"},\"updates\":{\"title\":\"Renamed\",\"addLabels\":[\"triage\"]}}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-metadata-gitlab-mr", - "checkpoints": [ - { - "id": "update-gitlab-settled", - "observation": { - "sender": ["c41542d48b3c"], - "payloads": ["daa0db125085"], - "settlements": { - "mount": "eb79a9b3682a", - "update-gitlab-0": "eb79a9b3682a" - }, - "state": "266686bfdeec", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "a80ee9a342f1", - "b93b4f6d74db", - "98fe08e442ec", - "c79fe0d83267", - "14949c71727e", - "a4c82b4992bd", - "23ede8191c86", - "3aefb3006914", - "886c60a7e62e", - "3af513ef8a7e", - "806d212f3150", - "9e46e6e7c627", - "62e92e71cb1f" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-reply-merge.json b/mobile/rpc-foundation/goldens/tk-item-reply-merge.json deleted file mode 100644 index 0e26bbd1538..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-reply-merge.json +++ /dev/null @@ -1,1013 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-reply-merge-github", - "family": "tasks.item-reply-merge", - "namedDeltas": [], - "values": { - "104bf14d3af8": { - "name": "error", - "ordinal": 8, - "value": "" - }, - "11b6302399f9": { - "name": "mutatingStatus", - "ordinal": 10, - "value": true - }, - "29cadc65bcbb": { - "name": "error", - "ordinal": 15, - "value": "" - }, - "29ed7524dd3c": { - "name": "error", - "ordinal": 22, - "value": "" - }, - "387fc47e347f": { - "name": "github.addIssueComment#1", - "ordinal": 18, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.addIssueComment\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12,\"body\":\"@octocat a reply\",\"type\":\"pr\",\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"}}}" - }, - "3e0fed9df072": { - "error": "", - "item": { - "$rpc": "null" - }, - "items": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ], - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "42be1ca2bc40": { - "name": "mutatingStatus", - "ordinal": 4, - "value": false - }, - "4683a2e1b3f8": { - "name": "actionItem", - "ordinal": 5, - "value": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - }, - "484e5b3de56e": { - "name": "error", - "ordinal": 28, - "value": "" - }, - "4dd9211bea32": { - "name": "mutatingStatus", - "ordinal": 17, - "value": true - }, - "5b1644d4f9fa": { - "name": "github.mergePR#1", - "ordinal": 25, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.mergePR\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"},\"method\":\"squash\"}}" - }, - "6075f27a5a9a": { - "name": "linear.updateIssue#1", - "ordinal": 29, - "args": [ - { - "name": "method", - "value": "linear.updateIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "updates": { - "stateId": "state-2" - }, - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "68003f9dae22": { - "name": "mutatingStatus", - "ordinal": 24, - "value": true - }, - "804aa0239615": { - "name": "items", - "ordinal": 32, - "value": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ] - }, - "81282764182b": { - "name": "itemReplyDrafts", - "ordinal": 7, - "value": { - "501": "a reply", - "comment-2": "a reply" - } - }, - "82be5a1db7df": { - "name": "mutatingStatus", - "ordinal": 33, - "value": false - }, - "8427fd4151f1": { - "name": "mutatingStatus", - "ordinal": 14, - "value": false - }, - "869e1e2e047d": { - "name": "detailPayload", - "ordinal": 19, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "86fa3f6d565f": { - "error": "", - "item": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - }, - "items": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ], - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "98eb36f15c01": { - "name": "itemReplyDrafts", - "ordinal": 13, - "value": { - "comment-2": "a reply" - } - }, - "aa01ca6020fb": { - "name": "itemReplyDrafts", - "ordinal": 3, - "value": {} - }, - "c16a0a7d376f": { - "name": "detailPayload", - "ordinal": 12, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "ce2c6bf47801": { - "name": "github.addPRReviewCommentReply#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.addPRReviewCommentReply" - }, - { - "name": "params", - "value": { - "body": "a reply", - "commentId": 501, - "line": 12, - "path": "src/index.ts", - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - "ok": true - } - } - } - }, - "d1230c20846f": { - "name": "linear.updateIssue#1", - "ordinal": 31, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"linear.updateIssue\",\"params\":{\"id\":\"issue-1\",\"workspaceId\":\"linear-workspace\",\"updates\":{\"stateId\":\"state-2\"}}}" - }, - "dc686891aa6e": { - "name": "github.addIssueComment#1", - "ordinal": 16, - "args": [ - { - "name": "method", - "value": "github.addIssueComment" - }, - { - "name": "params", - "value": { - "body": "@octocat a reply", - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - }, - "ok": true - } - } - } - }, - "e66062a7229b": { - "name": "actionItem", - "ordinal": 26, - "value": { - "$rpc": "null" - } - }, - "e7c30d615df8": { - "error": "", - "item": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - }, - "items": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ], - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "e99d4c89211e": { - "name": "github.mergePR#1", - "ordinal": 23, - "args": [ - { - "name": "method", - "value": "github.mergePR" - }, - { - "name": "params", - "value": { - "method": "squash", - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 60000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed47309ce73e": { - "name": "github.addPRReviewCommentReply#1", - "ordinal": 11, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.addPRReviewCommentReply\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"},\"commentId\":501,\"body\":\"a reply\",\"threadId\":\"thread-1\",\"path\":\"src/index.ts\",\"line\":12}}" - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "ee46c3c5fe81": { - "name": "mutatingStatus", - "ordinal": 30, - "value": true - }, - "f756dcb64e9c": { - "name": "itemReplyDrafts", - "ordinal": 20, - "value": {} - }, - "f9f88a1b1096": { - "name": "detailPayload", - "ordinal": 6, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "fa2f2de4dfe7": { - "name": "mutatingStatus", - "ordinal": 27, - "value": false - }, - "fc98c233b124": { - "name": "mutatingStatus", - "ordinal": 21, - "value": false - } - }, - "recording": { - "scenario": "tk-item-reply-merge", - "checkpoints": [ - { - "id": "review-reply-settled", - "observation": { - "sender": ["ce2c6bf47801"], - "payloads": ["ed47309ce73e"], - "settlements": { - "mount": "eb79a9b3682a", - "review-reply-0": "eb79a9b3682a" - }, - "state": "e7c30d615df8", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "aa01ca6020fb", - "42be1ca2bc40", - "4683a2e1b3f8", - "f9f88a1b1096", - "81282764182b", - "104bf14d3af8", - "11b6302399f9", - "c16a0a7d376f", - "98eb36f15c01", - "8427fd4151f1" - ] - } - }, - { - "id": "issue-reply-settled", - "observation": { - "sender": ["ce2c6bf47801", "dc686891aa6e"], - "payloads": ["ed47309ce73e", "387fc47e347f"], - "settlements": { - "mount": "eb79a9b3682a", - "review-reply-0": "eb79a9b3682a", - "issue-reply-1": "eb79a9b3682a" - }, - "state": "86fa3f6d565f", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "aa01ca6020fb", - "42be1ca2bc40", - "4683a2e1b3f8", - "f9f88a1b1096", - "81282764182b", - "104bf14d3af8", - "11b6302399f9", - "c16a0a7d376f", - "98eb36f15c01", - "8427fd4151f1", - "29cadc65bcbb", - "4dd9211bea32", - "869e1e2e047d", - "f756dcb64e9c", - "fc98c233b124" - ] - } - }, - { - "id": "merge-settled", - "observation": { - "sender": ["ce2c6bf47801", "dc686891aa6e", "e99d4c89211e"], - "payloads": ["ed47309ce73e", "387fc47e347f", "5b1644d4f9fa"], - "settlements": { - "mount": "eb79a9b3682a", - "review-reply-0": "eb79a9b3682a", - "issue-reply-1": "eb79a9b3682a", - "merge-2": "eb79a9b3682a" - }, - "state": "3e0fed9df072", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "aa01ca6020fb", - "42be1ca2bc40", - "4683a2e1b3f8", - "f9f88a1b1096", - "81282764182b", - "104bf14d3af8", - "11b6302399f9", - "c16a0a7d376f", - "98eb36f15c01", - "8427fd4151f1", - "29cadc65bcbb", - "4dd9211bea32", - "869e1e2e047d", - "f756dcb64e9c", - "fc98c233b124", - "29ed7524dd3c", - "68003f9dae22", - "e66062a7229b", - "fa2f2de4dfe7" - ] - } - }, - { - "id": "linear-status-settled", - "observation": { - "sender": ["ce2c6bf47801", "dc686891aa6e", "e99d4c89211e", "6075f27a5a9a"], - "payloads": ["ed47309ce73e", "387fc47e347f", "5b1644d4f9fa", "d1230c20846f"], - "settlements": { - "mount": "eb79a9b3682a", - "review-reply-0": "eb79a9b3682a", - "issue-reply-1": "eb79a9b3682a", - "merge-2": "eb79a9b3682a", - "linear-status-3": "eb79a9b3682a" - }, - "state": "3e0fed9df072", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "aa01ca6020fb", - "42be1ca2bc40", - "4683a2e1b3f8", - "f9f88a1b1096", - "81282764182b", - "104bf14d3af8", - "11b6302399f9", - "c16a0a7d376f", - "98eb36f15c01", - "8427fd4151f1", - "29cadc65bcbb", - "4dd9211bea32", - "869e1e2e047d", - "f756dcb64e9c", - "fc98c233b124", - "29ed7524dd3c", - "68003f9dae22", - "e66062a7229b", - "fa2f2de4dfe7", - "484e5b3de56e", - "ee46c3c5fe81", - "804aa0239615", - "82be5a1db7df" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-review-github.json b/mobile/rpc-foundation/goldens/tk-item-review-github.json deleted file mode 100644 index 82a001bcefa..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-review-github.json +++ /dev/null @@ -1,881 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-review-github", - "family": "tasks.item-review-github", - "namedDeltas": [], - "values": { - "04f768fb79f6": { - "name": "actionItem", - "ordinal": 6, - "value": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - }, - "0928f51c9dae": { - "name": "detailPayload", - "ordinal": 16, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "1c3b130f9436": { - "name": "actionItem", - "ordinal": 26, - "value": { - "provider": "github", - "source": { - "checksSummary": { - "failed": 0, - "neutral": 0, - "passed": 1, - "pending": 0, - "state": "success", - "total": 1 - }, - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - }, - "22b1e4293201": { - "name": "mutatingStatus", - "ordinal": 28, - "value": false - }, - "26f442c9e2e5": { - "name": "detailPayload", - "ordinal": 7, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "2d8d5e501a0d": { - "name": "mutatingStatus", - "ordinal": 21, - "value": true - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "4031bf455f49": { - "name": "mutatingStatus", - "ordinal": 5, - "value": false - }, - "4a6545173dbd": { - "draft": "a comment", - "error": "", - "item": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - }, - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "53506297367b": { - "name": "itemCommentDraft", - "ordinal": 3, - "value": "" - }, - "593c53b594c5": { - "draft": "a comment", - "error": "", - "item": { - "provider": "github", - "source": { - "checksSummary": { - "failed": 0, - "neutral": 0, - "passed": 1, - "pending": 0, - "state": "success", - "total": 1 - }, - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - }, - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "5a6043d5c7cc": { - "name": "actionItem", - "ordinal": 15, - "value": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - }, - "69b4fb187f59": { - "name": "detailPayload", - "ordinal": 27, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "6f47b9866251": { - "name": "github.prChecks#1", - "ordinal": 23, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha", - "noCache": true, - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ] - } - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "9331fbfa07e4": { - "name": "itemCommentDraft", - "ordinal": 9, - "value": "a comment" - }, - "94caa29bceef": { - "name": "error", - "ordinal": 19, - "value": "" - }, - "a17cf032d1cb": { - "name": "mutatingStatus", - "ordinal": 18, - "value": false - }, - "ac15f5699a77": { - "name": "itemReviewersDraft", - "ordinal": 8, - "value": "octocat" - }, - "baa2764f836f": { - "name": "github.prChecks#1", - "ordinal": 24, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"},\"headSha\":\"head-sha\",\"noCache\":true}}" - }, - "c29314fc4896": { - "name": "items", - "ordinal": 14, - "value": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ] - }, - "c448fcc040ee": { - "name": "status.get#1", - "ordinal": 22, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "c650cf641414": { - "name": "itemReviewersDraft", - "ordinal": 4, - "value": "" - }, - "c9e35d56c303": { - "name": "itemReviewersDraft", - "ordinal": 17, - "value": "" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "cf975363479a": { - "name": "github.requestPRReviewers#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.requestPRReviewers" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "reviewers": ["octocat"] - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "d8e1fd46cd19": { - "name": "github.requestPRReviewers#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.requestPRReviewers\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"},\"reviewers\":[\"octocat\"]}}" - }, - "e38e4b18b697": { - "name": "items", - "ordinal": 25, - "value": [ - { - "provider": "github", - "source": { - "checksSummary": { - "failed": 0, - "neutral": 0, - "passed": 1, - "pending": 0, - "state": "success", - "total": 1 - }, - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ] - }, - "e6b60387dab2": { - "name": "status.get#1", - "ordinal": 20, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "capabilities": ["github.exact-work-item-target.v1"], - "hostDescriptor": { - "installationId": "recorded" - }, - "runtimeId": "recorded" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-review-github", - "checkpoints": [ - { - "id": "reviewers-settled", - "observation": { - "sender": ["cf975363479a"], - "payloads": ["d8e1fd46cd19"], - "settlements": { - "mount": "eb79a9b3682a", - "reviewers-0": "eb79a9b3682a" - }, - "state": "4a6545173dbd", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "53506297367b", - "c650cf641414", - "4031bf455f49", - "04f768fb79f6", - "26f442c9e2e5", - "ac15f5699a77", - "9331fbfa07e4", - "3aefb3006914", - "886c60a7e62e", - "c29314fc4896", - "5a6043d5c7cc", - "0928f51c9dae", - "c9e35d56c303", - "a17cf032d1cb" - ] - } - }, - { - "id": "checks-settled", - "observation": { - "sender": ["cf975363479a", "e6b60387dab2", "6f47b9866251"], - "payloads": ["d8e1fd46cd19", "c448fcc040ee", "baa2764f836f"], - "settlements": { - "mount": "eb79a9b3682a", - "reviewers-0": "eb79a9b3682a", - "checks-1": "eb79a9b3682a" - }, - "state": "593c53b594c5", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "53506297367b", - "c650cf641414", - "4031bf455f49", - "04f768fb79f6", - "26f442c9e2e5", - "ac15f5699a77", - "9331fbfa07e4", - "3aefb3006914", - "886c60a7e62e", - "c29314fc4896", - "5a6043d5c7cc", - "0928f51c9dae", - "c9e35d56c303", - "a17cf032d1cb", - "94caa29bceef", - "2d8d5e501a0d", - "e38e4b18b697", - "1c3b130f9436", - "69b4fb187f59", - "22b1e4293201" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-status-gitlab-mr.json b/mobile/rpc-foundation/goldens/tk-item-status-gitlab-mr.json deleted file mode 100644 index 7fcd63a2c5f..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-status-gitlab-mr.json +++ /dev/null @@ -1,233 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-status-gitlab-mr", - "family": "tasks.item-status-gitlab-mr", - "namedDeltas": [], - "values": { - "14949c71727e": { - "name": "mutatingStatus", - "ordinal": 7, - "value": false - }, - "1586a62c0b50": { - "name": "gitlab.updateMRState#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.updateMRState\",\"params\":{\"repo\":\"id:repo-1\",\"iid\":7,\"state\":\"closed\",\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}" - }, - "23ede8191c86": { - "name": "detailPayload", - "ordinal": 9, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "5737a7806a0c": { - "name": "mutatingStatus", - "ordinal": 15, - "value": false - }, - "589373883844": { - "error": "", - "item": { - "$rpc": "null" - }, - "items": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - } - ], - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "6f52cc0afcf0": { - "name": "gitlab.updateMRState#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "gitlab.updateMRState" - }, - { - "name": "params", - "value": { - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "state": "closed" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "91e56b4fbd5b": { - "name": "actionItem", - "ordinal": 14, - "value": { - "$rpc": "null" - } - }, - "98fe08e442ec": { - "name": "itemRemoveAssigneesDraft", - "ordinal": 5, - "value": "" - }, - "a4c82b4992bd": { - "name": "actionItem", - "ordinal": 8, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - } - }, - "a80ee9a342f1": { - "name": "itemAddAssigneesDraft", - "ordinal": 3, - "value": "" - }, - "b93b4f6d74db": { - "name": "itemAddLabelsDraft", - "ordinal": 4, - "value": "" - }, - "c79fe0d83267": { - "name": "itemRemoveLabelsDraft", - "ordinal": 6, - "value": "" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-status-gitlab-mr", - "checkpoints": [ - { - "id": "gitlab-status-settled", - "observation": { - "sender": ["6f52cc0afcf0"], - "payloads": ["1586a62c0b50"], - "settlements": { - "mount": "eb79a9b3682a", - "gitlab-status-0": "eb79a9b3682a" - }, - "state": "589373883844", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "a80ee9a342f1", - "b93b4f6d74db", - "98fe08e442ec", - "c79fe0d83267", - "14949c71727e", - "a4c82b4992bd", - "23ede8191c86", - "3aefb3006914", - "886c60a7e62e", - "91e56b4fbd5b", - "5737a7806a0c" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-status-gitlab.json b/mobile/rpc-foundation/goldens/tk-item-status-gitlab.json deleted file mode 100644 index bce8bd8c120..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-status-gitlab.json +++ /dev/null @@ -1,498 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-status-gitlab", - "family": "tasks.item-status-gitlab", - "namedDeltas": [], - "values": { - "05df5d49a11c": { - "error": "", - "item": { - "$rpc": "null" - }, - "items": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue" - }, - "title": "A GitLab issue" - } - ], - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "14949c71727e": { - "name": "mutatingStatus", - "ordinal": 7, - "value": false - }, - "1d07085d77f7": { - "error": "", - "item": { - "provider": "github", - "source": { - "id": "github:issue:9", - "labels": ["triage"], - "number": 9, - "repoId": "repo-1", - "reviewRequests": [], - "state": "open", - "title": "Renamed", - "type": "issue", - "url": "https://github.com/owner/repo/issues/9" - }, - "title": "Renamed" - }, - "items": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue" - }, - "title": "A GitLab issue" - } - ], - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "23ede8191c86": { - "name": "detailPayload", - "ordinal": 9, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "38e625888db0": { - "name": "mutatingStatus", - "ordinal": 25, - "value": false - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "5737a7806a0c": { - "name": "mutatingStatus", - "ordinal": 15, - "value": false - }, - "5a062aaf1adc": { - "name": "actionItem", - "ordinal": 18, - "value": { - "provider": "github", - "source": { - "id": "github:issue:9", - "labels": ["bug"], - "number": 9, - "repoId": "repo-1", - "reviewRequests": [], - "state": "open", - "type": "issue", - "url": "https://github.com/owner/repo/issues/9" - }, - "title": "An issue" - } - }, - "5d27fa679339": { - "name": "github.updateIssue#1", - "ordinal": 22, - "json": "{\"expectedRuntimeSource\":{\"sourceId\":\"recorded\",\"runtimeId\":\"recorded\"},\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.updateIssue\",\"params\":{\"repo\":\"id:repo-1\",\"number\":9,\"updates\":{\"title\":\"Renamed\",\"addLabels\":[\"triage\"],\"removeLabels\":[\"bug\"]},\"ownerRepo\":{\"host\":\"github.com\",\"owner\":\"owner\",\"repo\":\"repo\"}}}" - }, - "66a7662321ab": { - "name": "gitlab.updateIssue#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.updateIssue\",\"params\":{\"repo\":\"id:repo-1\",\"number\":4,\"updates\":{\"state\":\"closed\"},\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}" - }, - "69c27ef617a1": { - "name": "items", - "ordinal": 23, - "value": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue" - }, - "title": "A GitLab issue" - } - ] - }, - "87cd6a741359": { - "name": "status.get#1", - "ordinal": 17, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "capabilities": ["github.exact-work-item-target.v1"], - "hostDescriptor": { - "installationId": "recorded" - }, - "runtimeId": "recorded" - } - } - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "91e56b4fbd5b": { - "name": "actionItem", - "ordinal": 14, - "value": { - "$rpc": "null" - } - }, - "98fe08e442ec": { - "name": "itemRemoveAssigneesDraft", - "ordinal": 5, - "value": "" - }, - "99e035739729": { - "name": "gitlab.updateIssue#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "gitlab.updateIssue" - }, - { - "name": "params", - "value": { - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "updates": { - "state": "closed" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "9d1f08a6e600": { - "name": "error", - "ordinal": 16, - "value": "" - }, - "a80ee9a342f1": { - "name": "itemAddAssigneesDraft", - "ordinal": 3, - "value": "" - }, - "b26dc20548a8": { - "name": "actionItem", - "ordinal": 8, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue" - }, - "title": "A GitLab issue" - } - }, - "b93b4f6d74db": { - "name": "itemAddLabelsDraft", - "ordinal": 4, - "value": "" - }, - "c2fc779dad42": { - "name": "actionItem", - "ordinal": 24, - "value": { - "provider": "github", - "source": { - "id": "github:issue:9", - "labels": ["triage"], - "number": 9, - "repoId": "repo-1", - "reviewRequests": [], - "state": "open", - "title": "Renamed", - "type": "issue", - "url": "https://github.com/owner/repo/issues/9" - }, - "title": "Renamed" - } - }, - "c5b803a7c562": { - "name": "github.updateIssue#1", - "ordinal": 21, - "args": [ - { - "name": "method", - "value": "github.updateIssue" - }, - { - "name": "params", - "value": { - "number": 9, - "ownerRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "updates": { - "addLabels": ["triage"], - "removeLabels": ["bug"], - "title": "Renamed" - } - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "envelope": { - "expectedRuntimeSource": { - "runtimeId": "recorded", - "sourceId": "recorded" - } - }, - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "c79fe0d83267": { - "name": "itemRemoveLabelsDraft", - "ordinal": 6, - "value": "" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "e0bebf1cd037": { - "name": "status.get#1", - "ordinal": 20, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "f3640f6ae8be": { - "name": "mutatingStatus", - "ordinal": 19, - "value": true - } - }, - "recording": { - "scenario": "tk-item-status-gitlab", - "checkpoints": [ - { - "id": "gitlab-status-settled", - "observation": { - "sender": ["99e035739729"], - "payloads": ["66a7662321ab"], - "settlements": { - "mount": "eb79a9b3682a", - "gitlab-status-0": "eb79a9b3682a" - }, - "state": "05df5d49a11c", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "a80ee9a342f1", - "b93b4f6d74db", - "98fe08e442ec", - "c79fe0d83267", - "14949c71727e", - "b26dc20548a8", - "23ede8191c86", - "3aefb3006914", - "886c60a7e62e", - "91e56b4fbd5b", - "5737a7806a0c" - ] - } - }, - { - "id": "github-metadata-settled", - "observation": { - "sender": ["99e035739729", "87cd6a741359", "c5b803a7c562"], - "payloads": ["66a7662321ab", "e0bebf1cd037", "5d27fa679339"], - "settlements": { - "mount": "eb79a9b3682a", - "gitlab-status-0": "eb79a9b3682a", - "github-metadata-1": "eb79a9b3682a" - }, - "state": "1d07085d77f7", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "a80ee9a342f1", - "b93b4f6d74db", - "98fe08e442ec", - "c79fe0d83267", - "14949c71727e", - "b26dc20548a8", - "23ede8191c86", - "3aefb3006914", - "886c60a7e62e", - "91e56b4fbd5b", - "5737a7806a0c", - "9d1f08a6e600", - "5a062aaf1adc", - "f3640f6ae8be", - "69c27ef617a1", - "c2fc779dad42", - "38e625888db0" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-linear-connect.json b/mobile/rpc-foundation/goldens/tk-linear-connect.json deleted file mode 100644 index 106d07abd39..00000000000 --- a/mobile/rpc-foundation/goldens/tk-linear-connect.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.linear-connect", - "family": "tasks.linear-connect", - "namedDeltas": [], - "values": { - "0d5ee6814ade": { - "name": "linearConnectState", - "ordinal": 6, - "value": "idle" - }, - "0eb2b134d2a8": { - "name": "linearApiKeyDraft", - "ordinal": 5, - "value": "" - }, - "2f8d5603d8c0": { - "connected": true, - "error": "", - "provider": "linear", - "providers": ["github", "linear"], - "state": "idle" - }, - "419764f3b217": { - "name": "linearConnectState", - "ordinal": 1, - "value": "connecting" - }, - "7b027170ab7f": { - "name": "linearConnected", - "ordinal": 8, - "value": true - }, - "7cc9b174cc9e": { - "name": "linearConnectError", - "ordinal": 2, - "value": "" - }, - "90675c627fb4": { - "name": "linear.connect#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "linear.connect" - }, - { - "name": "params", - "value": { - "apiKey": "lin_api_key" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "b59099af6718": { - "name": "linear.connect#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.connect\",\"params\":{\"apiKey\":\"lin_api_key\"}}" - }, - "c78daa2d0ec8": { - "name": "showLinearConnect", - "ordinal": 7, - "value": false - }, - "d35d1934b202": { - "name": "provider", - "ordinal": 10, - "value": "linear" - }, - "dd595ae96cc8": { - "name": "visibleProviders", - "ordinal": 9, - "value": ["github", "linear"] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tk-linear-connect", - "checkpoints": [ - { - "id": "connect-settled", - "observation": { - "sender": ["90675c627fb4"], - "payloads": ["b59099af6718"], - "settlements": { - "mount": "eb79a9b3682a", - "connect-0": "eb79a9b3682a" - }, - "state": "2f8d5603d8c0", - "effects": [ - "419764f3b217", - "7cc9b174cc9e", - "0eb2b134d2a8", - "0d5ee6814ade", - "c78daa2d0ec8", - "7b027170ab7f", - "dd595ae96cc8", - "d35d1934b202" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-linear-team-context.json b/mobile/rpc-foundation/goldens/tk-linear-team-context.json deleted file mode 100644 index 81ba10022ae..00000000000 --- a/mobile/rpc-foundation/goldens/tk-linear-team-context.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.linear-team-context", - "family": "tasks.linear-team-context", - "namedDeltas": [], - "values": { - "031c50459130": { - "name": "createTeamId", - "ordinal": 10, - "value": "team-1" - }, - "2afc4b1311c1": { - "createTeamId": "team-1", - "states": [], - "statesLoading": false, - "teams": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - }, - "38ed617d559f": { - "name": "linearTeams", - "ordinal": 9, - "value": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - }, - "3abc893d377b": { - "name": "mutatingStatus", - "ordinal": 3, - "value": false - }, - "4fcc46dfeb77": { - "name": "linear.listTeams#1", - "ordinal": 8, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listTeams\"}" - }, - "5dcdc7fd7492": { - "name": "linearSubIssueTitle", - "ordinal": 4, - "value": "" - }, - "74335ecb4cd2": { - "name": "linearStatesLoading", - "ordinal": 16, - "value": false - }, - "74505ce2789a": { - "name": "linearStates", - "ordinal": 5, - "value": [] - }, - "77a7eff4a3cc": { - "name": "linearStatesLoading", - "ordinal": 11, - "value": true - }, - "82b36eab5101": { - "name": "creatingTask", - "ordinal": 6, - "value": false - }, - "a14f6c361136": { - "name": "linearStates", - "ordinal": 15, - "value": [ - { - "color": "#000000", - "id": "state-1", - "name": "Todo", - "type": "unstarted" - } - ] - }, - "b5ba6f00c4fb": { - "name": "linear.teamStates#1", - "ordinal": 14, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.teamStates\",\"params\":{\"teamId\":\"team-1\",\"workspaceId\":\"linear-workspace\"}}" - }, - "b6bf81e9e237": { - "createTeamId": "team-1", - "states": [ - { - "color": "#000000", - "id": "state-1", - "name": "Todo", - "type": "unstarted" - } - ], - "statesLoading": false, - "teams": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - }, - "c88d134e7a42": { - "name": "linear.teamStates#1", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "linear.teamStates" - }, - { - "name": "params", - "value": { - "teamId": "team-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": [ - { - "color": "#000000", - "id": "state-1", - "name": "Todo", - "type": "unstarted" - } - ] - } - } - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "db66582f88a9": { - "name": "linearStatesError", - "ordinal": 12, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "ee01f277ffc4": { - "name": "linear.listTeams#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "linear.listTeams" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - } - } - } - }, - "recording": { - "scenario": "tk-linear-team-context", - "checkpoints": [ - { - "id": "open-composer-settled", - "observation": { - "sender": ["ee01f277ffc4"], - "payloads": ["4fcc46dfeb77"], - "settlements": { - "mount": "eb79a9b3682a", - "open-composer-0": "eb79a9b3682a" - }, - "state": "2afc4b1311c1", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "3abc893d377b", - "5dcdc7fd7492", - "74505ce2789a", - "82b36eab5101", - "38ed617d559f", - "031c50459130" - ] - } - }, - { - "id": "select-metadata-item-settled", - "observation": { - "sender": ["ee01f277ffc4", "c88d134e7a42"], - "payloads": ["4fcc46dfeb77", "b5ba6f00c4fb"], - "settlements": { - "mount": "eb79a9b3682a", - "open-composer-0": "eb79a9b3682a", - "select-metadata-item-1": "eb79a9b3682a" - }, - "state": "b6bf81e9e237", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "3abc893d377b", - "5dcdc7fd7492", - "74505ce2789a", - "82b36eab5101", - "38ed617d559f", - "031c50459130", - "77a7eff4a3cc", - "db66582f88a9", - "a14f6c361136", - "74335ecb4cd2" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-list-gitlab-items.json b/mobile/rpc-foundation/goldens/tk-list-gitlab-items.json deleted file mode 100644 index a35e4a9731c..00000000000 --- a/mobile/rpc-foundation/goldens/tk-list-gitlab-items.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.task-list-gitlab-items", - "family": "tasks.task-list-gitlab-items", - "namedDeltas": [], - "values": { - "2af5bdc42011": { - "error": "", - "items": [ - { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:4", - "labels": [], - "number": 4, - "repoId": "repo-1", - "repoName": "Repo", - "state": "opened", - "title": "A GitLab issue", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "status": "Open", - "subtitle": "Repo #4", - "title": "A GitLab issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ], - "loading": false, - "refreshing": false - }, - "341101aedcbe": { - "name": "gitlab.listWorkItems#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50}}" - }, - "341ebd23fc0b": { - "name": "gitlab.listWorkItems#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "gitlab.listWorkItems" - }, - { - "name": "params", - "value": { - "page": 1, - "perPage": 50, - "query": { - "$rpc": "undefined" - }, - "repo": "id:repo-1", - "state": "opened" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "items": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:4", - "labels": [], - "number": 4, - "state": "opened", - "title": "A GitLab issue", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - } - } - } - }, - "39f99cf479f0": { - "name": "error", - "ordinal": 1, - "value": "" - }, - "411aee2eccd9": { - "name": "refreshing", - "ordinal": 8, - "value": false - }, - "5ac1816a09df": { - "name": "loading", - "ordinal": 7, - "value": false - }, - "609f32a21704": { - "name": "loading", - "ordinal": 2, - "value": true - }, - "a2f93be0d571": { - "name": "items", - "ordinal": 5, - "value": [ - { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:4", - "labels": [], - "number": 4, - "repoId": "repo-1", - "repoName": "Repo", - "state": "opened", - "title": "A GitLab issue", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "status": "Open", - "subtitle": "Repo #4", - "title": "A GitLab issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ] - }, - "ba411b67de4b": { - "name": "taskListSettled", - "ordinal": 9, - "value": true - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f1dcb0c02c92": { - "name": "error", - "ordinal": 6, - "value": "" - } - }, - "recording": { - "scenario": "tk-list-gitlab-items", - "checkpoints": [ - { - "id": "load-settled", - "observation": { - "sender": ["341ebd23fc0b"], - "payloads": ["341101aedcbe"], - "settlements": { - "mount": "eb79a9b3682a", - "load-0": "eb79a9b3682a" - }, - "state": "2af5bdc42011", - "effects": [ - "39f99cf479f0", - "609f32a21704", - "a2f93be0d571", - "f1dcb0c02c92", - "5ac1816a09df", - "411aee2eccd9", - "ba411b67de4b" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-list-gitlab-todos.json b/mobile/rpc-foundation/goldens/tk-list-gitlab-todos.json deleted file mode 100644 index 3bbc9fd4964..00000000000 --- a/mobile/rpc-foundation/goldens/tk-list-gitlab-todos.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.task-list-gitlab-todos", - "family": "tasks.task-list-gitlab-todos", - "namedDeltas": [], - "values": { - "038bb64a38ce": { - "name": "gitlab.todos#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.todos\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "2ee5e836afb7": { - "name": "items", - "ordinal": 5, - "value": [ - { - "key": "gitlab-todo:1", - "provider": "gitlabTodo", - "source": { - "actionName": "review_requested", - "authorAvatarUrl": "", - "authorUsername": "octocat", - "id": 1, - "projectPath": "group/project", - "state": "pending", - "targetIid": 4, - "targetTitle": "A GitLab todo", - "targetType": "Issue", - "targetUrl": "https://gitlab.example.com/group/project/-/issues/4", - "updatedAt": "2020-01-01T00:00:00.000Z" - }, - "status": "review requested", - "subtitle": "group/project #4", - "title": "A GitLab todo", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ] - }, - "39f99cf479f0": { - "name": "error", - "ordinal": 1, - "value": "" - }, - "411aee2eccd9": { - "name": "refreshing", - "ordinal": 8, - "value": false - }, - "5ac1816a09df": { - "name": "loading", - "ordinal": 7, - "value": false - }, - "609f32a21704": { - "name": "loading", - "ordinal": 2, - "value": true - }, - "8511d41d7490": { - "name": "gitlab.todos#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "gitlab.todos" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": [ - { - "actionName": "review_requested", - "authorAvatarUrl": "", - "authorUsername": "octocat", - "id": 1, - "projectPath": "group/project", - "state": "pending", - "targetIid": 4, - "targetTitle": "A GitLab todo", - "targetType": "Issue", - "targetUrl": "https://gitlab.example.com/group/project/-/issues/4", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ] - } - } - }, - "ba411b67de4b": { - "name": "taskListSettled", - "ordinal": 9, - "value": true - }, - "d57ec76a49a3": { - "error": "", - "items": [ - { - "key": "gitlab-todo:1", - "provider": "gitlabTodo", - "source": { - "actionName": "review_requested", - "authorAvatarUrl": "", - "authorUsername": "octocat", - "id": 1, - "projectPath": "group/project", - "state": "pending", - "targetIid": 4, - "targetTitle": "A GitLab todo", - "targetType": "Issue", - "targetUrl": "https://gitlab.example.com/group/project/-/issues/4", - "updatedAt": "2020-01-01T00:00:00.000Z" - }, - "status": "review requested", - "subtitle": "group/project #4", - "title": "A GitLab todo", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ], - "loading": false, - "refreshing": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f1dcb0c02c92": { - "name": "error", - "ordinal": 6, - "value": "" - } - }, - "recording": { - "scenario": "tk-list-gitlab-todos", - "checkpoints": [ - { - "id": "load-settled", - "observation": { - "sender": ["8511d41d7490"], - "payloads": ["038bb64a38ce"], - "settlements": { - "mount": "eb79a9b3682a", - "load-0": "eb79a9b3682a" - }, - "state": "d57ec76a49a3", - "effects": [ - "39f99cf479f0", - "609f32a21704", - "2ee5e836afb7", - "f1dcb0c02c92", - "5ac1816a09df", - "411aee2eccd9", - "ba411b67de4b" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-list-linear.json b/mobile/rpc-foundation/goldens/tk-list-linear.json deleted file mode 100644 index 708c5585bc6..00000000000 --- a/mobile/rpc-foundation/goldens/tk-list-linear.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.task-list-linear", - "family": "tasks.task-list-linear", - "namedDeltas": [], - "values": { - "0a23a5e47479": { - "name": "loading", - "ordinal": 16, - "value": false - }, - "19d7ea49485f": { - "name": "linear.searchIssues#1", - "ordinal": 13, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" - }, - "29cadc65bcbb": { - "name": "error", - "ordinal": 15, - "value": "" - }, - "39f99cf479f0": { - "name": "error", - "ordinal": 1, - "value": "" - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "3e58b6085f7d": { - "name": "items", - "ordinal": 14, - "value": [ - { - "key": "linear:linear-workspace:issue-2", - "provider": "linear", - "source": { - "description": "", - "id": "issue-2", - "identifier": "ENG-2", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A found issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - }, - "status": "Todo", - "subtitle": "ENG-2 · Engineering", - "title": "A found issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ] - }, - "3edde845aed1": { - "error": "", - "items": [ - { - "key": "linear:linear-workspace:issue-2", - "provider": "linear", - "source": { - "description": "", - "id": "issue-2", - "identifier": "ENG-2", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A found issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - }, - "status": "Todo", - "subtitle": "ENG-2 · Engineering", - "title": "A found issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ], - "loading": false, - "refreshing": false - }, - "411aee2eccd9": { - "name": "refreshing", - "ordinal": 8, - "value": false - }, - "52e364aee6ba": { - "name": "loading", - "ordinal": 11, - "value": true - }, - "5ac1816a09df": { - "name": "loading", - "ordinal": 7, - "value": false - }, - "609f32a21704": { - "name": "loading", - "ordinal": 2, - "value": true - }, - "7b6df16c2cf0": { - "name": "linear.listIssues#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"all\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" - }, - "837199f7c720": { - "name": "linear.searchIssues#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "linear.searchIssues" - }, - { - "name": "params", - "value": { - "limit": 50, - "query": "bug", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": [ - { - "description": "", - "id": "issue-2", - "identifier": "ENG-2", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A found issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - } - } - }, - "94f44b229d7d": { - "error": "", - "items": [ - { - "key": "linear:linear-workspace:issue-1", - "provider": "linear", - "source": { - "description": "", - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A Linear issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - }, - "status": "Todo", - "subtitle": "ENG-1 · Engineering", - "title": "A Linear issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ], - "loading": false, - "refreshing": false - }, - "b25e7c116f7e": { - "name": "items", - "ordinal": 5, - "value": [ - { - "key": "linear:linear-workspace:issue-1", - "provider": "linear", - "source": { - "description": "", - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A Linear issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - }, - "status": "Todo", - "subtitle": "ENG-1 · Engineering", - "title": "A Linear issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ] - }, - "ba411b67de4b": { - "name": "taskListSettled", - "ordinal": 9, - "value": true - }, - "c6d55e6b8844": { - "name": "linear.listIssues#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "linear.listIssues" - }, - { - "name": "params", - "value": { - "filter": "all", - "limit": 50, - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "items": [ - { - "description": "", - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A Linear issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - } - } - } - }, - "cbe48ad190bf": { - "name": "taskListSettled", - "ordinal": 18, - "value": true - }, - "e8ba61988aec": { - "name": "refreshing", - "ordinal": 17, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f1dcb0c02c92": { - "name": "error", - "ordinal": 6, - "value": "" - } - }, - "recording": { - "scenario": "tk-list-linear", - "checkpoints": [ - { - "id": "load-settled", - "observation": { - "sender": ["c6d55e6b8844"], - "payloads": ["7b6df16c2cf0"], - "settlements": { - "mount": "eb79a9b3682a", - "load-0": "eb79a9b3682a" - }, - "state": "94f44b229d7d", - "effects": [ - "39f99cf479f0", - "609f32a21704", - "b25e7c116f7e", - "f1dcb0c02c92", - "5ac1816a09df", - "411aee2eccd9", - "ba411b67de4b" - ] - } - }, - { - "id": "set-query-done", - "observation": { - "sender": ["c6d55e6b8844"], - "payloads": ["7b6df16c2cf0"], - "settlements": { - "mount": "eb79a9b3682a", - "load-0": "eb79a9b3682a", - "set-query-1": "eb79a9b3682a" - }, - "state": "94f44b229d7d", - "effects": [ - "39f99cf479f0", - "609f32a21704", - "b25e7c116f7e", - "f1dcb0c02c92", - "5ac1816a09df", - "411aee2eccd9", - "ba411b67de4b" - ] - } - }, - { - "id": "load-settled", - "observation": { - "sender": ["c6d55e6b8844", "837199f7c720"], - "payloads": ["7b6df16c2cf0", "19d7ea49485f"], - "settlements": { - "mount": "eb79a9b3682a", - "load-0": "eb79a9b3682a", - "set-query-1": "eb79a9b3682a", - "load-2": "eb79a9b3682a" - }, - "state": "3edde845aed1", - "effects": [ - "39f99cf479f0", - "609f32a21704", - "b25e7c116f7e", - "f1dcb0c02c92", - "5ac1816a09df", - "411aee2eccd9", - "ba411b67de4b", - "3aefb3006914", - "52e364aee6ba", - "3e58b6085f7d", - "29cadc65bcbb", - "0a23a5e47479", - "e8ba61988aec", - "cbe48ad190bf" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-board-load.json b/mobile/rpc-foundation/goldens/tk-project-board-load.json deleted file mode 100644 index d0d996e81c1..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-board-load.json +++ /dev/null @@ -1,630 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-board-load", - "family": "tasks.project-board-load", - "namedDeltas": [], - "values": { - "0056704adc0b": { - "name": "githubProjectTable", - "ordinal": 31, - "value": { - "$rpc": "null" - } - }, - "060dcedb3fdb": { - "name": "githubProjectError", - "ordinal": 10, - "value": "" - }, - "0af48d475813": { - "name": "appliedGithubProjectSearch", - "ordinal": 29, - "value": { - "$rpc": "undefined" - } - }, - "0f1aa264f581": { - "name": "github.project.viewTable#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.project.viewTable" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "owner": "owner", - "ownerType": "organization", - "projectNumber": 3, - "viewId": "view-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 60000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "data": { - "fields": [], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [], - "selectedView": { - "filter": "is:open", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - }, - "ok": true - } - } - } - }, - "15cb97c93333": { - "name": "github.project.listViews#1", - "ordinal": 8, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.listViews\",\"params\":{\"owner\":\"owner\",\"host\":\"github.enterprise.test\",\"ownerType\":\"organization\",\"projectNumber\":3}}" - }, - "170fad8cb36b": { - "name": "githubProjectPartialFailures", - "ordinal": 6, - "value": [] - }, - "1b3350f71e56": { - "name": "githubProjectError", - "ordinal": 19, - "value": "" - }, - "2085118de92f": { - "name": "githubProjectError", - "ordinal": 1, - "value": "" - }, - "26921f3a7c09": { - "name": "githubProjectPasteError", - "ordinal": 18, - "value": "" - }, - "2ab1b35ff194": { - "error": "", - "loading": false, - "pasteError": "", - "projects": [ - { - "host": "github.com", - "number": 3, - "owner": "owner", - "ownerType": "organization", - "title": "Board" - } - ], - "table": { - "fields": [], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [], - "selectedView": { - "filter": "is:open", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - }, - "views": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - }, - "2f290fa2acf5": { - "name": "githubProjectLoading", - "ordinal": 9, - "value": true - }, - "3493818a7239": { - "name": "githubProjectPasteBusy", - "ordinal": 33, - "value": false - }, - "376c9e8bd72a": { - "error": "", - "loading": false, - "pasteError": "", - "projects": [ - { - "host": "github.com", - "number": 3, - "owner": "owner", - "ownerType": "organization", - "title": "Board" - } - ], - "table": { - "$rpc": "null" - }, - "views": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - }, - "3985399034a2": { - "name": "githubProjectPasteBusy", - "ordinal": 17, - "value": true - }, - "3a8617cc8fd8": { - "name": "githubProjectSearch", - "ordinal": 14, - "value": "is:open" - }, - "4809ea7ad5b0": { - "name": "github.project.viewTable#1", - "ordinal": 12, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.viewTable\",\"params\":{\"owner\":\"owner\",\"host\":\"github.enterprise.test\",\"ownerType\":\"organization\",\"projectNumber\":3,\"viewId\":\"view-1\"}}" - }, - "4c9b1e4ad1f5": { - "name": "githubProjectViews", - "ordinal": 28, - "value": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - }, - "685bc2bda05d": { - "name": "githubProjects", - "ordinal": 5, - "value": [ - { - "host": "github.com", - "number": 3, - "owner": "owner", - "ownerType": "organization", - "title": "Board" - } - ] - }, - "6b03ace1146a": { - "name": "githubProjectError", - "ordinal": 25, - "value": "" - }, - "7d488eda1d1c": { - "name": "githubProjectViews", - "ordinal": 15, - "value": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - }, - "842c950ee7cc": { - "name": "githubProjectLoading", - "ordinal": 16, - "value": false - }, - "8a0577280bad": { - "name": "showGitHubProjectPicker", - "ordinal": 23, - "value": false - }, - "97bc7dc12b92": { - "name": "githubProjectLoading", - "ordinal": 32, - "value": false - }, - "9f9a21ac7b9e": { - "name": "github.project.listViews#2", - "ordinal": 27, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.listViews\",\"params\":{\"owner\":\"owner\",\"host\":\"github.com\",\"ownerType\":\"organization\",\"projectNumber\":3}}" - }, - "a5a3530ec11c": { - "name": "githubProjectPartialFailures", - "ordinal": 2, - "value": [] - }, - "ab1b10183665": { - "name": "githubProjectLoading", - "ordinal": 24, - "value": true - }, - "ae89e058b351": { - "name": "github.project.listViews#2", - "ordinal": 26, - "args": [ - { - "name": "method", - "value": "github.project.listViews" - }, - { - "name": "params", - "value": { - "host": "github.com", - "owner": "owner", - "ownerType": "organization", - "projectNumber": 3 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "ok": true, - "views": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - } - } - } - }, - "b42c8edc0d53": { - "name": "github.project.listAccessible#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.listAccessible\",\"params\":{\"host\":\"github.com\"}}" - }, - "be0da5b53ffb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - }, - "be93253869e6": { - "name": "github.project.resolveRef#1", - "ordinal": 21, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.resolveRef\",\"params\":{\"input\":\"https://github.com/orgs/owner/projects/3\",\"host\":\"github.com\"}}" - }, - "c5c018cf9a70": { - "name": "githubProjectTable", - "ordinal": 13, - "value": { - "fields": [], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [], - "selectedView": { - "filter": "is:open", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "d254913957c1": { - "name": "github.project.listViews#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "github.project.listViews" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "owner": "owner", - "ownerType": "organization", - "projectNumber": 3 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true, - "views": [ - { - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - ] - } - } - } - }, - "dc8dd7739c49": { - "name": "githubProjectPasteInput", - "ordinal": 22, - "value": "" - }, - "dfe16215433b": { - "name": "github.project.listAccessible#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.project.listAccessible" - }, - { - "name": "params", - "value": { - "host": "github.com" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true, - "partialFailures": [], - "projects": [ - { - "host": "github.com", - "number": 3, - "owner": "owner", - "ownerType": "organization", - "title": "Board" - } - ] - } - } - } - }, - "e87bea4bcd3c": { - "name": "githubProjectSearch", - "ordinal": 30, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f6003aed2098": { - "name": "github.project.resolveRef#1", - "ordinal": 20, - "args": [ - { - "name": "method", - "value": "github.project.resolveRef" - }, - { - "name": "params", - "value": { - "host": "github.com", - "input": "https://github.com/orgs/owner/projects/3" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "host": "github.com", - "number": 3, - "ok": true, - "owner": "owner", - "ownerType": "organization", - "title": "Board", - "viewNumber": 1 - } - } - } - }, - "ff43b5ec92a9": { - "error": "", - "loading": false, - "pasteError": "", - "projects": [ - { - "host": "github.com", - "number": 3, - "owner": "owner", - "ownerType": "organization", - "title": "Board" - } - ], - "table": { - "$rpc": "null" - }, - "views": [] - } - }, - "recording": { - "scenario": "tk-project-board-load", - "checkpoints": [ - { - "id": "projects-settled", - "observation": { - "sender": ["dfe16215433b"], - "payloads": ["b42c8edc0d53"], - "settlements": { - "mount": "eb79a9b3682a", - "projects-0": "eb79a9b3682a" - }, - "state": "ff43b5ec92a9", - "effects": ["2085118de92f", "a5a3530ec11c", "685bc2bda05d", "170fad8cb36b"] - } - }, - { - "id": "views-settled", - "observation": { - "sender": ["dfe16215433b", "d254913957c1"], - "payloads": ["b42c8edc0d53", "15cb97c93333"], - "settlements": { - "mount": "eb79a9b3682a", - "projects-0": "eb79a9b3682a", - "views-1": "be0da5b53ffb" - }, - "state": "ff43b5ec92a9", - "effects": ["2085118de92f", "a5a3530ec11c", "685bc2bda05d", "170fad8cb36b"] - } - }, - { - "id": "table-settled", - "observation": { - "sender": ["dfe16215433b", "d254913957c1", "0f1aa264f581"], - "payloads": ["b42c8edc0d53", "15cb97c93333", "4809ea7ad5b0"], - "settlements": { - "mount": "eb79a9b3682a", - "projects-0": "eb79a9b3682a", - "views-1": "be0da5b53ffb", - "table-2": "eb79a9b3682a" - }, - "state": "2ab1b35ff194", - "effects": [ - "2085118de92f", - "a5a3530ec11c", - "685bc2bda05d", - "170fad8cb36b", - "2f290fa2acf5", - "060dcedb3fdb", - "c5c018cf9a70", - "3a8617cc8fd8", - "7d488eda1d1c", - "842c950ee7cc" - ] - } - }, - { - "id": "paste-settled", - "observation": { - "sender": [ - "dfe16215433b", - "d254913957c1", - "0f1aa264f581", - "f6003aed2098", - "ae89e058b351" - ], - "payloads": [ - "b42c8edc0d53", - "15cb97c93333", - "4809ea7ad5b0", - "be93253869e6", - "9f9a21ac7b9e" - ], - "settlements": { - "mount": "eb79a9b3682a", - "projects-0": "eb79a9b3682a", - "views-1": "be0da5b53ffb", - "table-2": "eb79a9b3682a", - "paste-3": "eb79a9b3682a" - }, - "state": "376c9e8bd72a", - "effects": [ - "2085118de92f", - "a5a3530ec11c", - "685bc2bda05d", - "170fad8cb36b", - "2f290fa2acf5", - "060dcedb3fdb", - "c5c018cf9a70", - "3a8617cc8fd8", - "7d488eda1d1c", - "842c950ee7cc", - "3985399034a2", - "26921f3a7c09", - "1b3350f71e56", - "dc8dd7739c49", - "8a0577280bad", - "ab1b10183665", - "6b03ace1146a", - "4c9b1e4ad1f5", - "0af48d475813", - "e87bea4bcd3c", - "0056704adc0b", - "97bc7dc12b92", - "3493818a7239" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-repo-slugs.json b/mobile/rpc-foundation/goldens/tk-project-repo-slugs.json deleted file mode 100644 index f43e31c9757..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-repo-slugs.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-repo-slugs", - "family": "tasks.project-repo-slugs", - "namedDeltas": [], - "values": { - "3df58008cdfa": { - "name": "githubRepoSlugCache", - "ordinal": 3, - "value": { - "repo-1": { - "path": "/repo", - "repository": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - } - } - }, - "49d6f5f60c9c": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "60d253ed9645": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - } - } - }, - "bdec8bbb3c04": { - "cache": { - "repo-1": { - "path": "/repo", - "repository": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tk-project-repo-slugs", - "checkpoints": [ - { - "id": "mounted", - "observation": { - "sender": ["60d253ed9645"], - "payloads": ["49d6f5f60c9c"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "bdec8bbb3c04", - "effects": ["3df58008cdfa"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-comments-issue.json b/mobile/rpc-foundation/goldens/tk-project-row-comments-issue.json deleted file mode 100644 index 72963ec0353..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-comments-issue.json +++ /dev/null @@ -1,678 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-comments-issue", - "family": "tasks.project-row-comments-issue", - "namedDeltas": [], - "values": { - "1bf0937a02b9": { - "name": "projectMutating", - "ordinal": 20, - "value": false - }, - "21dd73202dc8": { - "name": "projectEditingCommentDraft", - "ordinal": 19, - "value": "" - }, - "3d64c0aecd5d": { - "name": "projectRowDetail", - "ordinal": 17, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "an edited comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a project comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 906 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "47fae979383a": { - "name": "github.project.updateIssueBySlug#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "github.project.updateIssueBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "number": 1, - "owner": "owner", - "repo": "repo", - "updates": { - "title": "Renamed" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "503675a0f449": { - "name": "projectRowItem", - "ordinal": 4, - "value": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "5198e17de9b3": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a project comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 906 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "527330ed2103": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "an edited comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a project comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 906 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "5c30b4794b57": { - "name": "projectRowDetailError", - "ordinal": 14, - "value": "" - }, - "5d32aa29303c": { - "name": "projectMutating", - "ordinal": 1, - "value": true - }, - "62af4d257032": { - "name": "github.project.updateIssueBySlug#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updateIssueBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"number\":1,\"updates\":{\"title\":\"Renamed\"}}}" - }, - "72332e237f1f": { - "name": "projectMutating", - "ordinal": 6, - "value": false - }, - "777239b1f74f": { - "name": "github.project.addIssueCommentBySlug#1", - "ordinal": 8, - "args": [ - { - "name": "method", - "value": "github.project.addIssueCommentBySlug" - }, - { - "name": "params", - "value": { - "body": "a project comment", - "host": "github.enterprise.test", - "number": 1, - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a project comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 906 - }, - "ok": true - } - } - } - }, - "8633b6c5dd75": { - "name": "github.project.updateIssueCommentBySlug#1", - "ordinal": 16, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updateIssueCommentBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"commentId\":501,\"body\":\"an edited comment\"}}" - }, - "9188c83ef653": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "a7a04016f46a": { - "name": "projectRowDetail", - "ordinal": 11, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a project comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 906 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "a8ff11b6adce": { - "name": "projectMutating", - "ordinal": 13, - "value": true - }, - "b2d2c9f55277": { - "name": "githubProjectTable", - "ordinal": 5, - "value": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "name": "Status", - "options": [] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "ce1f6d47985f": { - "name": "projectMutating", - "ordinal": 12, - "value": false - }, - "e52eb58ab49e": { - "name": "projectCommentDraft", - "ordinal": 10, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f39ed9ab521e": { - "name": "projectMutating", - "ordinal": 7, - "value": true - }, - "f3c022b108d0": { - "name": "github.project.updateIssueCommentBySlug#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.project.updateIssueCommentBySlug" - }, - { - "name": "params", - "value": { - "body": "an edited comment", - "commentId": 501, - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "fc8440fdfe7f": { - "name": "projectEditingCommentId", - "ordinal": 18, - "value": { - "$rpc": "null" - } - }, - "ffd6af1b42e1": { - "name": "github.project.addIssueCommentBySlug#1", - "ordinal": 9, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.addIssueCommentBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"number\":1,\"body\":\"a project comment\"}}" - } - }, - "recording": { - "scenario": "tk-project-row-comments-issue", - "checkpoints": [ - { - "id": "update-item-settled", - "observation": { - "sender": ["47fae979383a"], - "payloads": ["62af4d257032"], - "settlements": { - "mount": "eb79a9b3682a", - "update-item-0": "eb79a9b3682a" - }, - "state": "9188c83ef653", - "effects": ["5d32aa29303c", "503675a0f449", "b2d2c9f55277", "72332e237f1f"] - } - }, - { - "id": "add-comment-settled", - "observation": { - "sender": ["47fae979383a", "777239b1f74f"], - "payloads": ["62af4d257032", "ffd6af1b42e1"], - "settlements": { - "mount": "eb79a9b3682a", - "update-item-0": "eb79a9b3682a", - "add-comment-1": "eb79a9b3682a" - }, - "state": "5198e17de9b3", - "effects": [ - "5d32aa29303c", - "503675a0f449", - "b2d2c9f55277", - "72332e237f1f", - "f39ed9ab521e", - "e52eb58ab49e", - "a7a04016f46a", - "ce1f6d47985f" - ] - } - }, - { - "id": "update-comment-settled", - "observation": { - "sender": ["47fae979383a", "777239b1f74f", "f3c022b108d0"], - "payloads": ["62af4d257032", "ffd6af1b42e1", "8633b6c5dd75"], - "settlements": { - "mount": "eb79a9b3682a", - "update-item-0": "eb79a9b3682a", - "add-comment-1": "eb79a9b3682a", - "update-comment-2": "eb79a9b3682a" - }, - "state": "527330ed2103", - "effects": [ - "5d32aa29303c", - "503675a0f449", - "b2d2c9f55277", - "72332e237f1f", - "f39ed9ab521e", - "e52eb58ab49e", - "a7a04016f46a", - "ce1f6d47985f", - "a8ff11b6adce", - "5c30b4794b57", - "3d64c0aecd5d", - "fc8440fdfe7f", - "21dd73202dc8", - "1bf0937a02b9" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-comments-pr.json b/mobile/rpc-foundation/goldens/tk-project-row-comments-pr.json deleted file mode 100644 index bf8fd791c85..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-comments-pr.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-comments-pr", - "family": "tasks.project-row-comments-pr", - "namedDeltas": [], - "values": { - "25607177ea9a": { - "name": "github.project.updatePullRequestBySlug#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updatePullRequestBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"number\":2,\"updates\":{\"title\":\"Renamed\"}}}" - }, - "2d1e8ede1fcf": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - }, - "5d32aa29303c": { - "name": "projectMutating", - "ordinal": 1, - "value": true - }, - "72332e237f1f": { - "name": "projectMutating", - "ordinal": 6, - "value": false - }, - "9332b39405f1": { - "name": "projectRowItem", - "ordinal": 4, - "value": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - }, - "aa2ef79d4298": { - "name": "githubProjectTable", - "ordinal": 5, - "value": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "name": "Status", - "options": [] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "title": "Renamed", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "acc111809814": { - "name": "github.project.updatePullRequestBySlug#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "github.project.updatePullRequestBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "number": 2, - "owner": "owner", - "repo": "repo", - "updates": { - "title": "Renamed" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tk-project-row-comments-pr", - "checkpoints": [ - { - "id": "update-item-settled", - "observation": { - "sender": ["acc111809814"], - "payloads": ["25607177ea9a"], - "settlements": { - "mount": "eb79a9b3682a", - "update-item-0": "eb79a9b3682a" - }, - "state": "2d1e8ede1fcf", - "effects": ["5d32aa29303c", "9332b39405f1", "aa2ef79d4298", "72332e237f1f"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-fields.json b/mobile/rpc-foundation/goldens/tk-project-row-fields.json deleted file mode 100644 index 7c0833d6161..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-fields.json +++ /dev/null @@ -1,817 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-fields", - "family": "tasks.project-row-fields", - "namedDeltas": [], - "values": { - "093815ac28fb": { - "name": "github.project.clearItemField#1", - "ordinal": 9, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.clearItemField\",\"params\":{\"projectId\":\"project-1\",\"host\":\"github.enterprise.test\",\"itemId\":\"item-1\",\"fieldId\":\"field-1\"}}" - }, - "40dc9d5e44c9": { - "name": "projectRowItem", - "ordinal": 10, - "value": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "4123bc693ce4": { - "name": "projectMutating", - "ordinal": 14, - "value": true - }, - "424e9a1ae7ed": { - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": { - "field-1": { - "color": "YELLOW", - "fieldId": "field-1", - "kind": "single-select", - "name": "In progress", - "optionId": "option-1" - } - }, - "id": "item-1", - "itemType": "ISSUE" - }, - "table": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "kind": "single-select", - "name": "Status", - "options": [ - { - "color": "YELLOW", - "id": "option-1", - "name": "In progress" - } - ] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": { - "field-1": { - "color": "YELLOW", - "fieldId": "field-1", - "kind": "single-select", - "name": "In progress", - "optionId": "option-1" - } - }, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "491a53ca1f35": { - "name": "github.project.updateIssueTypeBySlug#1", - "ordinal": 16, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updateIssueTypeBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"number\":1,\"issueTypeId\":\"type-1\"}}" - }, - "5d32aa29303c": { - "name": "projectMutating", - "ordinal": 1, - "value": true - }, - "6623e063706c": { - "name": "github.project.clearItemField#1", - "ordinal": 8, - "args": [ - { - "name": "method", - "value": "github.project.clearItemField" - }, - { - "name": "params", - "value": { - "fieldId": "field-1", - "host": "github.enterprise.test", - "itemId": "item-1", - "projectId": "project-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "68296a29ee63": { - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - "table": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "kind": "single-select", - "name": "Status", - "options": [ - { - "color": "YELLOW", - "id": "option-1", - "name": "In progress" - } - ] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "72332e237f1f": { - "name": "projectMutating", - "ordinal": 6, - "value": false - }, - "73039dc59899": { - "name": "github.project.updateItemField#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "github.project.updateItemField" - }, - { - "name": "params", - "value": { - "fieldId": "field-1", - "host": "github.enterprise.test", - "itemId": "item-1", - "projectId": "project-1", - "value": { - "kind": "single-select", - "optionId": "option-1" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "7440f0f1bab9": { - "name": "projectMutating", - "ordinal": 19, - "value": false - }, - "a1dab467956d": { - "name": "githubProjectTable", - "ordinal": 11, - "value": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "kind": "single-select", - "name": "Status", - "options": [ - { - "color": "YELLOW", - "id": "option-1", - "name": "In progress" - } - ] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "b849b5f1de35": { - "name": "github.project.updateItemField#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updateItemField\",\"params\":{\"projectId\":\"project-1\",\"host\":\"github.enterprise.test\",\"itemId\":\"item-1\",\"fieldId\":\"field-1\",\"value\":{\"kind\":\"single-select\",\"optionId\":\"option-1\"}}}" - }, - "c0f6974a198e": { - "name": "githubProjectTable", - "ordinal": 18, - "value": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "kind": "single-select", - "name": "Status", - "options": [ - { - "color": "YELLOW", - "id": "option-1", - "name": "In progress" - } - ] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "color": "RED", - "description": { - "$rpc": "null" - }, - "id": "type-1", - "name": "Bug" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "d0617c2f5659": { - "name": "projectRowItem", - "ordinal": 4, - "value": { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": { - "field-1": { - "color": "YELLOW", - "fieldId": "field-1", - "kind": "single-select", - "name": "In progress", - "optionId": "option-1" - } - }, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "de29905548eb": { - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "issueType": { - "color": "RED", - "description": { - "$rpc": "null" - }, - "id": "type-1", - "name": "Bug" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - "table": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "kind": "single-select", - "name": "Status", - "options": [ - { - "color": "YELLOW", - "id": "option-1", - "name": "In progress" - } - ] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "color": "RED", - "description": { - "$rpc": "null" - }, - "id": "type-1", - "name": "Bug" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "e09e2ac8124b": { - "name": "projectFieldDrafts", - "ordinal": 12, - "value": { - "field-1": "" - } - }, - "e3180bc6526a": { - "name": "projectMutating", - "ordinal": 13, - "value": false - }, - "e6e6a29e5419": { - "name": "github.project.updateIssueTypeBySlug#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.project.updateIssueTypeBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "issueTypeId": "type-1", - "number": 1, - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "e969afb182da": { - "name": "githubProjectTable", - "ordinal": 5, - "value": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "kind": "single-select", - "name": "Status", - "options": [ - { - "color": "YELLOW", - "id": "option-1", - "name": "In progress" - } - ] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": { - "field-1": { - "color": "YELLOW", - "fieldId": "field-1", - "kind": "single-select", - "name": "In progress", - "optionId": "option-1" - } - }, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ef5a2c4ee0b4": { - "name": "projectRowItem", - "ordinal": 17, - "value": { - "content": { - "assignees": [], - "issueType": { - "color": "RED", - "description": { - "$rpc": "null" - }, - "id": "type-1", - "name": "Bug" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "url": "https://github.com/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - } - }, - "f39ed9ab521e": { - "name": "projectMutating", - "ordinal": 7, - "value": true - } - }, - "recording": { - "scenario": "tk-project-row-fields", - "checkpoints": [ - { - "id": "set-field-settled", - "observation": { - "sender": ["73039dc59899"], - "payloads": ["b849b5f1de35"], - "settlements": { - "mount": "eb79a9b3682a", - "set-field-0": "eb79a9b3682a" - }, - "state": "424e9a1ae7ed", - "effects": ["5d32aa29303c", "d0617c2f5659", "e969afb182da", "72332e237f1f"] - } - }, - { - "id": "clear-field-settled", - "observation": { - "sender": ["73039dc59899", "6623e063706c"], - "payloads": ["b849b5f1de35", "093815ac28fb"], - "settlements": { - "mount": "eb79a9b3682a", - "set-field-0": "eb79a9b3682a", - "clear-field-1": "eb79a9b3682a" - }, - "state": "68296a29ee63", - "effects": [ - "5d32aa29303c", - "d0617c2f5659", - "e969afb182da", - "72332e237f1f", - "f39ed9ab521e", - "40dc9d5e44c9", - "a1dab467956d", - "e09e2ac8124b", - "e3180bc6526a" - ] - } - }, - { - "id": "issue-type-settled", - "observation": { - "sender": ["73039dc59899", "6623e063706c", "e6e6a29e5419"], - "payloads": ["b849b5f1de35", "093815ac28fb", "491a53ca1f35"], - "settlements": { - "mount": "eb79a9b3682a", - "set-field-0": "eb79a9b3682a", - "clear-field-1": "eb79a9b3682a", - "issue-type-2": "eb79a9b3682a" - }, - "state": "de29905548eb", - "effects": [ - "5d32aa29303c", - "d0617c2f5659", - "e969afb182da", - "72332e237f1f", - "f39ed9ab521e", - "40dc9d5e44c9", - "a1dab467956d", - "e09e2ac8124b", - "e3180bc6526a", - "4123bc693ce4", - "ef5a2c4ee0b4", - "c0f6974a198e", - "7440f0f1bab9" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-files-merge.json b/mobile/rpc-foundation/goldens/tk-project-row-files-merge.json deleted file mode 100644 index a4736f00996..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-files-merge.json +++ /dev/null @@ -1,895 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-files-merge", - "family": "tasks.project-row-files-merge", - "namedDeltas": [], - "values": { - "033080c46df7": { - "contents": { - "src/index.ts": { - "modified": "b", - "modifiedIsBinary": false, - "original": "a", - "originalIsBinary": false - } - }, - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "body": "Project pull request body", - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "OPEN", - "title": "Project pull request", - "url": "https://github.enterprise.test/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - }, - "1bef2a9b13a1": { - "contents": { - "src/index.ts": { - "modified": "b", - "modifiedIsBinary": false, - "original": "a", - "originalIsBinary": false - } - }, - "error": "", - "mutating": false, - "row": { - "content": { - "assignees": [], - "body": "Project pull request body", - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "MERGED", - "title": "Project pull request", - "url": "https://github.enterprise.test/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - }, - "2141fc3d6fbb": { - "name": "error", - "ordinal": 37, - "value": "" - }, - "39ae33a4e8d3": { - "name": "github.updatePRState#1", - "ordinal": 40, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePRState\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"},\"updates\":{\"state\":\"closed\"}}}" - }, - "3e0c86d3ff78": { - "name": "prFileLoadingPath", - "ordinal": 15, - "value": { - "$rpc": "null" - } - }, - "3f9768efc421": { - "name": "githubProjectTable", - "ordinal": 28, - "value": { - "fields": [ - { - "dataType": "SINGLE_SELECT", - "id": "field-1", - "name": "Status", - "options": [] - } - ], - "project": { - "id": "project-1", - "number": 3, - "title": "Board" - }, - "rows": [ - { - "content": { - "assignees": [], - "body": "Project issue body", - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 1, - "repository": "owner/repo", - "state": "OPEN", - "title": "Project issue", - "url": "https://github.enterprise.test/owner/repo/issues/1" - }, - "fieldValuesByFieldId": {}, - "id": "item-1", - "itemType": "ISSUE" - }, - { - "content": { - "assignees": [], - "body": "Project pull request body", - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "MERGED", - "title": "Project pull request", - "url": "https://github.enterprise.test/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - ], - "selectedView": { - "filter": "", - "id": "view-1", - "layout": "TABLE_LAYOUT", - "name": "Table", - "number": 1 - } - } - }, - "42be1ca2bc40": { - "name": "mutatingStatus", - "ordinal": 4, - "value": false - }, - "44c2e6541ebd": { - "name": "projectRowDetailError", - "ordinal": 9, - "value": "" - }, - "4fe8ef09de5f": { - "name": "projectRowDetail", - "ordinal": 20, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "line": 12, - "path": "src/index.ts" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "60e8d2f72874": { - "name": "mutatingStatus", - "ordinal": 39, - "value": true - }, - "658dac7df662": { - "name": "expandedPrFilePath", - "ordinal": 3, - "value": { - "$rpc": "null" - } - }, - "662cbccd78cb": { - "name": "prFileLoadingPath", - "ordinal": 7, - "value": { - "$rpc": "null" - } - }, - "77324937aa89": { - "name": "github.updateIssue#1", - "ordinal": 35, - "json": "{\"expectedRuntimeSource\":{\"sourceId\":\"recorded\",\"runtimeId\":\"recorded\"},\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.updateIssue\",\"params\":{\"repo\":\"id:repo-1\",\"number\":9,\"updates\":{\"state\":\"closed\"},\"ownerRepo\":{\"host\":\"github.com\",\"owner\":\"owner\",\"repo\":\"repo\"}}}" - }, - "7d33c355aeac": { - "name": "prFileContents", - "ordinal": 14, - "value": { - "src/index.ts": { - "modified": "b", - "modifiedIsBinary": false, - "original": "a", - "originalIsBinary": false - } - } - }, - "8862f0950552": { - "name": "error", - "ordinal": 30, - "value": "" - }, - "8989e41d1c1e": { - "name": "github.mergePR#1", - "ordinal": 25, - "args": [ - { - "name": "method", - "value": "github.mergePR" - }, - { - "name": "params", - "value": { - "method": "squash", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 60000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "899dc22eb082": { - "name": "github.addPRReviewComment#1", - "ordinal": 19, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.addPRReviewComment\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"commitId\":\"head-sha\",\"path\":\"src/index.ts\",\"line\":12,\"body\":\"a review comment\"}}" - }, - "8bb07f5e4ddb": { - "name": "projectMutating", - "ordinal": 16, - "value": true - }, - "8d4edaf085d8": { - "name": "mutatingStatus", - "ordinal": 41, - "value": false - }, - "8d7ac6f2573d": { - "name": "github.prFileContents#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "github.prFileContents" - }, - { - "name": "params", - "value": { - "baseSha": "base-sha", - "headSha": "head-sha", - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "status": "modified" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "modified": "b", - "modifiedIsBinary": false, - "original": "a", - "originalIsBinary": false - } - } - } - }, - "942210205c5d": { - "name": "prFileCommentDrafts", - "ordinal": 22, - "value": {} - }, - "9f963399c2ce": { - "name": "mutatingStatus", - "ordinal": 36, - "value": false - }, - "a6f1fd854afa": { - "name": "prFileContents", - "ordinal": 6, - "value": {} - }, - "a7480d9dd9a2": { - "name": "github.updatePRState#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "github.updatePRState" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "updates": { - "state": "closed" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "aba945c58a7f": { - "name": "projectMutating", - "ordinal": 21, - "value": false - }, - "ad362e2aebe2": { - "name": "status.get#1", - "ordinal": 31, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "capabilities": ["github.exact-work-item-target.v1"], - "hostDescriptor": { - "installationId": "recorded" - }, - "runtimeId": "recorded" - } - } - } - }, - "b3ac1e3114bf": { - "name": "projectRowDetailError", - "ordinal": 24, - "value": "" - }, - "b3ff73919780": { - "name": "status.get#1", - "ordinal": 33, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "bff535848bcf": { - "name": "projectRowDetailError", - "ordinal": 17, - "value": "" - }, - "c0f0a440afe3": { - "name": "mutatingStatus", - "ordinal": 32, - "value": true - }, - "c2ebef7f076f": { - "name": "projectMutating", - "ordinal": 29, - "value": false - }, - "c3341bcbbaa3": { - "name": "projectRowItem", - "ordinal": 27, - "value": { - "content": { - "assignees": [], - "body": "Project pull request body", - "issueType": { - "$rpc": "null" - }, - "labels": [], - "number": 2, - "repository": "owner/repo", - "state": "MERGED", - "title": "Project pull request", - "url": "https://github.enterprise.test/owner/repo/pull/2" - }, - "fieldValuesByFieldId": {}, - "id": "item-2", - "itemType": "PULL_REQUEST" - } - }, - "c6b185002fec": { - "name": "github.prFileContents#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.prFileContents\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"path\":\"src/index.ts\",\"status\":\"modified\",\"headSha\":\"head-sha\",\"baseSha\":\"base-sha\"}}" - }, - "c858cb8b4846": { - "name": "prFileCommentDrafts", - "ordinal": 5, - "value": {} - }, - "ca024c503a01": { - "name": "github.updateIssue#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "github.updateIssue" - }, - { - "name": "params", - "value": { - "number": 9, - "ownerRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "updates": { - "state": "closed" - } - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "envelope": { - "expectedRuntimeSource": { - "runtimeId": "recorded", - "sourceId": "recorded" - } - }, - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "d4a23b3fe28b": { - "name": "prFileCommentDrafts", - "ordinal": 8, - "value": { - "src/index.ts:12": "a review comment" - } - }, - "dda49aeb3971": { - "name": "projectMutating", - "ordinal": 23, - "value": true - }, - "e3de0d18d0dc": { - "name": "github.addPRReviewComment#1", - "ordinal": 18, - "args": [ - { - "name": "method", - "value": "github.addPRReviewComment" - }, - { - "name": "params", - "value": { - "body": "a review comment", - "commitId": "head-sha", - "line": 12, - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "line": 12, - "path": "src/index.ts" - }, - "ok": true - } - } - } - }, - "e85ac5bc1e52": { - "name": "prFileLoadingPath", - "ordinal": 12, - "value": "src/index.ts" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "f5c29abaf308": { - "name": "github.mergePR#1", - "ordinal": 26, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.mergePR\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"method\":\"squash\"}}" - }, - "fa860899f47a": { - "name": "expandedPrFilePath", - "ordinal": 11, - "value": "src/index.ts" - } - }, - "recording": { - "scenario": "tk-project-row-files-merge", - "checkpoints": [ - { - "id": "expand-settled", - "observation": { - "sender": ["8d7ac6f2573d"], - "payloads": ["c6b185002fec"], - "settlements": { - "mount": "eb79a9b3682a", - "expand-0": "eb79a9b3682a" - }, - "state": "033080c46df7", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "658dac7df662", - "42be1ca2bc40", - "c858cb8b4846", - "a6f1fd854afa", - "662cbccd78cb", - "d4a23b3fe28b", - "44c2e6541ebd", - "fa860899f47a", - "e85ac5bc1e52", - "7d33c355aeac", - "3e0c86d3ff78" - ] - } - }, - { - "id": "file-comment-settled", - "observation": { - "sender": ["8d7ac6f2573d", "e3de0d18d0dc"], - "payloads": ["c6b185002fec", "899dc22eb082"], - "settlements": { - "mount": "eb79a9b3682a", - "expand-0": "eb79a9b3682a", - "file-comment-1": "eb79a9b3682a" - }, - "state": "033080c46df7", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "658dac7df662", - "42be1ca2bc40", - "c858cb8b4846", - "a6f1fd854afa", - "662cbccd78cb", - "d4a23b3fe28b", - "44c2e6541ebd", - "fa860899f47a", - "e85ac5bc1e52", - "7d33c355aeac", - "3e0c86d3ff78", - "8bb07f5e4ddb", - "bff535848bcf", - "4fe8ef09de5f", - "aba945c58a7f", - "942210205c5d" - ] - } - }, - { - "id": "merge-settled", - "observation": { - "sender": ["8d7ac6f2573d", "e3de0d18d0dc", "8989e41d1c1e"], - "payloads": ["c6b185002fec", "899dc22eb082", "f5c29abaf308"], - "settlements": { - "mount": "eb79a9b3682a", - "expand-0": "eb79a9b3682a", - "file-comment-1": "eb79a9b3682a", - "merge-2": "eb79a9b3682a" - }, - "state": "1bef2a9b13a1", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "658dac7df662", - "42be1ca2bc40", - "c858cb8b4846", - "a6f1fd854afa", - "662cbccd78cb", - "d4a23b3fe28b", - "44c2e6541ebd", - "fa860899f47a", - "e85ac5bc1e52", - "7d33c355aeac", - "3e0c86d3ff78", - "8bb07f5e4ddb", - "bff535848bcf", - "4fe8ef09de5f", - "aba945c58a7f", - "942210205c5d", - "dda49aeb3971", - "b3ac1e3114bf", - "c3341bcbbaa3", - "3f9768efc421", - "c2ebef7f076f" - ] - } - }, - { - "id": "issue-state-settled", - "observation": { - "sender": [ - "8d7ac6f2573d", - "e3de0d18d0dc", - "8989e41d1c1e", - "ad362e2aebe2", - "ca024c503a01" - ], - "payloads": [ - "c6b185002fec", - "899dc22eb082", - "f5c29abaf308", - "b3ff73919780", - "77324937aa89" - ], - "settlements": { - "mount": "eb79a9b3682a", - "expand-0": "eb79a9b3682a", - "file-comment-1": "eb79a9b3682a", - "merge-2": "eb79a9b3682a", - "issue-state-3": "eb79a9b3682a" - }, - "state": "1bef2a9b13a1", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "658dac7df662", - "42be1ca2bc40", - "c858cb8b4846", - "a6f1fd854afa", - "662cbccd78cb", - "d4a23b3fe28b", - "44c2e6541ebd", - "fa860899f47a", - "e85ac5bc1e52", - "7d33c355aeac", - "3e0c86d3ff78", - "8bb07f5e4ddb", - "bff535848bcf", - "4fe8ef09de5f", - "aba945c58a7f", - "942210205c5d", - "dda49aeb3971", - "b3ac1e3114bf", - "c3341bcbbaa3", - "3f9768efc421", - "c2ebef7f076f", - "8862f0950552", - "c0f0a440afe3", - "9f963399c2ce" - ] - } - }, - { - "id": "pr-state-settled", - "observation": { - "sender": [ - "8d7ac6f2573d", - "e3de0d18d0dc", - "8989e41d1c1e", - "ad362e2aebe2", - "ca024c503a01", - "a7480d9dd9a2" - ], - "payloads": [ - "c6b185002fec", - "899dc22eb082", - "f5c29abaf308", - "b3ff73919780", - "77324937aa89", - "39ae33a4e8d3" - ], - "settlements": { - "mount": "eb79a9b3682a", - "expand-0": "eb79a9b3682a", - "file-comment-1": "eb79a9b3682a", - "merge-2": "eb79a9b3682a", - "issue-state-3": "eb79a9b3682a", - "pr-state-4": "eb79a9b3682a" - }, - "state": "1bef2a9b13a1", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "658dac7df662", - "42be1ca2bc40", - "c858cb8b4846", - "a6f1fd854afa", - "662cbccd78cb", - "d4a23b3fe28b", - "44c2e6541ebd", - "fa860899f47a", - "e85ac5bc1e52", - "7d33c355aeac", - "3e0c86d3ff78", - "8bb07f5e4ddb", - "bff535848bcf", - "4fe8ef09de5f", - "aba945c58a7f", - "942210205c5d", - "dda49aeb3971", - "b3ac1e3114bf", - "c3341bcbbaa3", - "3f9768efc421", - "c2ebef7f076f", - "8862f0950552", - "c0f0a440afe3", - "9f963399c2ce", - "2141fc3d6fbb", - "60e8d2f72874", - "8d4edaf085d8" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-metadata-load.json b/mobile/rpc-foundation/goldens/tk-project-row-metadata-load.json deleted file mode 100644 index 45516d05450..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-metadata-load.json +++ /dev/null @@ -1,289 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-metadata-load", - "family": "tasks.project-row-metadata-load", - "namedDeltas": [], - "values": { - "21ea4fab050f": { - "name": "projectAssignableUsers", - "ordinal": 18, - "value": [ - { - "login": "octocat", - "name": "Octo" - } - ] - }, - "24d2fb22914c": { - "name": "github.project.listAssignableUsersBySlug#1", - "ordinal": 8, - "args": [ - { - "name": "method", - "value": "github.project.listAssignableUsersBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo", - "seedLogins": ["octocat"] - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true, - "users": [ - { - "login": "octocat", - "name": "Octo" - } - ] - } - } - } - }, - "25899527b47b": { - "name": "projectAssignableUsersLoading", - "ordinal": 19, - "value": false - }, - "2ff3fe127fb9": { - "name": "projectAssignableUsers", - "ordinal": 5, - "value": [] - }, - "3902ea43121b": { - "name": "projectAssignableUsersLoading", - "ordinal": 7, - "value": true - }, - "4171776f506e": { - "name": "github.project.listLabelsBySlug#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "github.project.listLabelsBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "labels": ["bug"], - "ok": true - } - } - } - }, - "4b33e1366553": { - "name": "projectIssueTypesLoading", - "ordinal": 21, - "value": false - }, - "55fc5237a996": { - "name": "github.project.listIssueTypesBySlug#1", - "ordinal": 15, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.listIssueTypesBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"}}" - }, - "5dd15ec04d86": { - "name": "projectAvailableLabels", - "ordinal": 1, - "value": [] - }, - "61e9a9d3f2b6": { - "name": "projectAvailableLabels", - "ordinal": 16, - "value": ["bug"] - }, - "6d2454f3b7b9": { - "name": "projectLabelsLoading", - "ordinal": 3, - "value": true - }, - "9912fbdd457c": { - "name": "projectIssueTypesLoading", - "ordinal": 11, - "value": true - }, - "9f8ede7fd42e": { - "name": "github.project.listIssueTypesBySlug#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "github.project.listIssueTypesBySlug" - }, - { - "name": "params", - "value": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true, - "types": [ - { - "id": "type-1", - "name": "Bug" - } - ] - } - } - } - }, - "bee3fb4d48da": { - "name": "projectIssueTypes", - "ordinal": 9, - "value": [] - }, - "cfcd8b229efe": { - "name": "github.project.listLabelsBySlug#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.listLabelsBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"}}" - }, - "d36a9b596499": { - "name": "projectLabelsError", - "ordinal": 2, - "value": "" - }, - "d5d91d8a5bac": { - "labels": ["bug"], - "labelsError": "", - "types": [ - { - "id": "type-1", - "name": "Bug" - } - ], - "typesError": "", - "users": [ - { - "login": "octocat", - "name": "Octo" - } - ], - "usersError": "" - }, - "e004f7afb559": { - "name": "projectLabelsLoading", - "ordinal": 17, - "value": false - }, - "e8838734c6bb": { - "name": "github.project.listAssignableUsersBySlug#1", - "ordinal": 14, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.listAssignableUsersBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"seedLogins\":[\"octocat\"]}}" - }, - "e918604a4f49": { - "name": "projectIssueTypesError", - "ordinal": 10, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f3677b2e5ed9": { - "name": "projectIssueTypes", - "ordinal": 20, - "value": [ - { - "id": "type-1", - "name": "Bug" - } - ] - }, - "f3849a7f0dff": { - "name": "projectAssignableUsersError", - "ordinal": 6, - "value": "" - } - }, - "recording": { - "scenario": "tk-project-row-metadata-load", - "checkpoints": [ - { - "id": "mounted", - "observation": { - "sender": ["4171776f506e", "24d2fb22914c", "9f8ede7fd42e"], - "payloads": ["cfcd8b229efe", "e8838734c6bb", "55fc5237a996"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "d5d91d8a5bac", - "effects": [ - "5dd15ec04d86", - "d36a9b596499", - "6d2454f3b7b9", - "2ff3fe127fb9", - "f3849a7f0dff", - "3902ea43121b", - "bee3fb4d48da", - "e918604a4f49", - "9912fbdd457c", - "61e9a9d3f2b6", - "e004f7afb559", - "21ea4fab050f", - "25899527b47b", - "f3677b2e5ed9", - "4b33e1366553" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-review-checks.json b/mobile/rpc-foundation/goldens/tk-project-row-review-checks.json deleted file mode 100644 index c964d1bdaf2..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-review-checks.json +++ /dev/null @@ -1,843 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-review-checks", - "family": "tasks.project-row-review-checks", - "namedDeltas": [], - "values": { - "0af1de3f1c7b": { - "name": "github.setPRFileViewed#1", - "ordinal": 23, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.setPRFileViewed\",\"params\":{\"repo\":\"id:repo-1\",\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"pullRequestId\":\"PR_kwDO\",\"path\":\"src/index.ts\",\"viewed\":true}}" - }, - "146b5bb967d4": { - "name": "projectRowDetail", - "ordinal": 5, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - } - }, - "16338db99b3b": { - "name": "github.rerunPRChecks#1", - "ordinal": 17, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.rerunPRChecks\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"headSha\":\"head-sha\",\"failedOnly\":true}}" - }, - "19346a719903": { - "name": "projectRowDetailError", - "ordinal": 2, - "value": "" - }, - "22ffca652b36": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - }, - "draft": "", - "error": "", - "mutating": false, - "refreshSeq": 0 - }, - "29943274d7ef": { - "name": "github.prChecks#1", - "ordinal": 11, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"headSha\":\"head-sha\",\"noCache\":true}}" - }, - "2b956bbf980c": { - "name": "projectRowDetailRefreshSeq", - "ordinal": 18, - "value": 1 - }, - "2cd85ef93c74": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - }, - "draft": "", - "error": "", - "mutating": false, - "refreshSeq": 0 - }, - "3a4324d7f4c0": { - "name": "github.requestPRReviewers#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.requestPRReviewers" - }, - { - "name": "params", - "value": { - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "reviewers": ["octocat"] - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "4123bc693ce4": { - "name": "projectMutating", - "ordinal": 14, - "value": true - }, - "44c2e6541ebd": { - "name": "projectRowDetailError", - "ordinal": 9, - "value": "" - }, - "4ad8bb2f6308": { - "name": "projectReviewersDraft", - "ordinal": 6, - "value": "" - }, - "5cdba004ba6c": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "VIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - }, - "draft": "", - "error": "", - "mutating": false, - "refreshSeq": 1 - }, - "5d32aa29303c": { - "name": "projectMutating", - "ordinal": 1, - "value": true - }, - "62edc52051d6": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - }, - "draft": "", - "error": "", - "mutating": false, - "refreshSeq": 1 - }, - "7440f0f1bab9": { - "name": "projectMutating", - "ordinal": 19, - "value": false - }, - "7ff05eadbd07": { - "name": "github.requestPRReviewers#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.requestPRReviewers\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"reviewers\":[\"octocat\"]}}" - }, - "83680a8503ad": { - "name": "github.rerunPRChecks#1", - "ordinal": 16, - "args": [ - { - "name": "method", - "value": "github.rerunPRChecks" - }, - { - "name": "params", - "value": { - "failedOnly": true, - "headSha": "head-sha", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 60000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "8edd2cc5d098": { - "name": "github.setPRFileViewed#1", - "ordinal": 22, - "args": [ - { - "name": "method", - "value": "github.setPRFileViewed" - }, - { - "name": "params", - "value": { - "path": "src/index.ts", - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "pullRequestId": "PR_kwDO", - "repo": "id:repo-1", - "viewed": true - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": true - } - } - }, - "a089b6b569cc": { - "name": "projectRowDetail", - "ordinal": 24, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "VIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - } - }, - "a1762a31897f": { - "name": "github.prChecks#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha", - "noCache": true, - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ] - } - } - }, - "a735fd6aee5f": { - "name": "projectMutating", - "ordinal": 7, - "value": false - }, - "b0f2d0edec6a": { - "name": "projectMutating", - "ordinal": 8, - "value": true - }, - "d09c526ea284": { - "name": "projectRowDetailError", - "ordinal": 15, - "value": "" - }, - "e3180bc6526a": { - "name": "projectMutating", - "ordinal": 13, - "value": false - }, - "eb2a575f353a": { - "name": "projectRowDetail", - "ordinal": 12, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [ - { - "conclusion": "SUCCESS", - "name": "build", - "status": "COMPLETED", - "url": "" - } - ], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": { - "$rpc": "null" - } - } - ] - } - }, - "eb4a625e2236": { - "name": "projectMutating", - "ordinal": 25, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ecb02d3e0977": { - "name": "projectMutating", - "ordinal": 20, - "value": true - }, - "fb41e38e331b": { - "name": "projectRowDetailError", - "ordinal": 21, - "value": "" - } - }, - "recording": { - "scenario": "tk-project-row-review-checks", - "checkpoints": [ - { - "id": "reviewers-settled", - "observation": { - "sender": ["3a4324d7f4c0"], - "payloads": ["7ff05eadbd07"], - "settlements": { - "mount": "eb79a9b3682a", - "reviewers-0": "eb79a9b3682a" - }, - "state": "2cd85ef93c74", - "effects": [ - "5d32aa29303c", - "19346a719903", - "146b5bb967d4", - "4ad8bb2f6308", - "a735fd6aee5f" - ] - } - }, - { - "id": "checks-settled", - "observation": { - "sender": ["3a4324d7f4c0", "a1762a31897f"], - "payloads": ["7ff05eadbd07", "29943274d7ef"], - "settlements": { - "mount": "eb79a9b3682a", - "reviewers-0": "eb79a9b3682a", - "checks-1": "eb79a9b3682a" - }, - "state": "22ffca652b36", - "effects": [ - "5d32aa29303c", - "19346a719903", - "146b5bb967d4", - "4ad8bb2f6308", - "a735fd6aee5f", - "b0f2d0edec6a", - "44c2e6541ebd", - "eb2a575f353a", - "e3180bc6526a" - ] - } - }, - { - "id": "rerun-settled", - "observation": { - "sender": ["3a4324d7f4c0", "a1762a31897f", "83680a8503ad"], - "payloads": ["7ff05eadbd07", "29943274d7ef", "16338db99b3b"], - "settlements": { - "mount": "eb79a9b3682a", - "reviewers-0": "eb79a9b3682a", - "checks-1": "eb79a9b3682a", - "rerun-2": "eb79a9b3682a" - }, - "state": "62edc52051d6", - "effects": [ - "5d32aa29303c", - "19346a719903", - "146b5bb967d4", - "4ad8bb2f6308", - "a735fd6aee5f", - "b0f2d0edec6a", - "44c2e6541ebd", - "eb2a575f353a", - "e3180bc6526a", - "4123bc693ce4", - "d09c526ea284", - "2b956bbf980c", - "7440f0f1bab9" - ] - } - }, - { - "id": "viewed-settled", - "observation": { - "sender": ["3a4324d7f4c0", "a1762a31897f", "83680a8503ad", "8edd2cc5d098"], - "payloads": ["7ff05eadbd07", "29943274d7ef", "16338db99b3b", "0af1de3f1c7b"], - "settlements": { - "mount": "eb79a9b3682a", - "reviewers-0": "eb79a9b3682a", - "checks-1": "eb79a9b3682a", - "rerun-2": "eb79a9b3682a", - "viewed-3": "eb79a9b3682a" - }, - "state": "5cdba004ba6c", - "effects": [ - "5d32aa29303c", - "19346a719903", - "146b5bb967d4", - "4ad8bb2f6308", - "a735fd6aee5f", - "b0f2d0edec6a", - "44c2e6541ebd", - "eb2a575f353a", - "e3180bc6526a", - "4123bc693ce4", - "d09c526ea284", - "2b956bbf980c", - "7440f0f1bab9", - "ecb02d3e0977", - "fb41e38e331b", - "a089b6b569cc", - "eb4a625e2236" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-project-row-threads.json b/mobile/rpc-foundation/goldens/tk-project-row-threads.json deleted file mode 100644 index f2fc0c1bc96..00000000000 --- a/mobile/rpc-foundation/goldens/tk-project-row-threads.json +++ /dev/null @@ -1,712 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.project-row-threads", - "family": "tasks.project-row-threads", - "namedDeltas": [], - "values": { - "09c572b1820f": { - "name": "github.addPRReviewCommentReply#1", - "ordinal": 16, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.addPRReviewCommentReply\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"commentId\":501,\"body\":\"a reply\",\"threadId\":\"thread-1\",\"path\":\"src/index.ts\",\"line\":12}}" - }, - "19346a719903": { - "name": "projectRowDetailError", - "ordinal": 2, - "value": "" - }, - "1eb94321f034": { - "name": "github.resolveReviewThread#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.resolveReviewThread" - }, - { - "name": "params", - "value": { - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "resolve": true, - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": true - } - } - }, - "403b13184ce0": { - "name": "itemReplyDrafts", - "ordinal": 17, - "value": { - "comment-2": "a reply" - } - }, - "510db4658728": { - "name": "projectRowDetailError", - "ordinal": 8, - "value": "" - }, - "5ba91867e6b3": { - "name": "projectRowDetail", - "ordinal": 11, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "5c30b4794b57": { - "name": "projectRowDetailError", - "ordinal": 14, - "value": "" - }, - "5d32aa29303c": { - "name": "projectMutating", - "ordinal": 1, - "value": true - }, - "647143f4a02b": { - "name": "github.project.deleteIssueCommentBySlug#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.deleteIssueCommentBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\",\"commentId\":501}}" - }, - "72332e237f1f": { - "name": "projectMutating", - "ordinal": 6, - "value": false - }, - "7440f0f1bab9": { - "name": "projectMutating", - "ordinal": 19, - "value": false - }, - "7f87c5800a4e": { - "name": "projectRowDetail", - "ordinal": 18, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "86f1d86b2ef1": { - "name": "github.addPRReviewCommentReply#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.addPRReviewCommentReply" - }, - { - "name": "params", - "value": { - "body": "a reply", - "commentId": 501, - "line": 12, - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - "ok": true - } - } - } - }, - "874009380ba6": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false - }, - "8baca63d6578": { - "name": "github.resolveReviewThread#1", - "ordinal": 10, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.resolveReviewThread\",\"params\":{\"repo\":\"id:repo-1\",\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"threadId\":\"thread-1\",\"resolve\":true}}" - }, - "99542210ddd6": { - "name": "projectRowDetail", - "ordinal": 5, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "a8ff11b6adce": { - "name": "projectMutating", - "ordinal": 13, - "value": true - }, - "abdc42e00721": { - "name": "projectMutating", - "ordinal": 26, - "value": false - }, - "b145ac6005a6": { - "name": "itemReplyDrafts", - "ordinal": 24, - "value": {} - }, - "b6b9452c2348": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false - }, - "bb6b127da045": { - "name": "github.project.deleteIssueCommentBySlug#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.project.deleteIssueCommentBySlug" - }, - { - "name": "params", - "value": { - "commentId": 501, - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "c1bd400fb401": { - "name": "projectRowDetail", - "ordinal": 25, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - } - }, - "c2f0cb5f4fe2": { - "name": "github.addIssueComment#1", - "ordinal": 22, - "args": [ - { - "name": "method", - "value": "github.addIssueComment" - }, - { - "name": "params", - "value": { - "body": "@octocat a reply", - "number": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - }, - "ok": true - } - } - } - }, - "cca2fbdc89cd": { - "name": "github.addIssueComment#1", - "ordinal": 23, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.addIssueComment\",\"params\":{\"repo\":\"id:repo-1\",\"number\":2,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.enterprise.test\"},\"body\":\"@octocat a reply\",\"type\":\"pr\"}}" - }, - "ce1f6d47985f": { - "name": "projectMutating", - "ordinal": 12, - "value": false - }, - "e76d5520ec18": { - "detail": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 903, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [] - }, - "error": "", - "mutating": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ecb02d3e0977": { - "name": "projectMutating", - "ordinal": 20, - "value": true - }, - "f39ed9ab521e": { - "name": "projectMutating", - "ordinal": 7, - "value": true - }, - "fb41e38e331b": { - "name": "projectRowDetailError", - "ordinal": 21, - "value": "" - } - }, - "recording": { - "scenario": "tk-project-row-threads", - "checkpoints": [ - { - "id": "delete-comment-settled", - "observation": { - "sender": ["bb6b127da045"], - "payloads": ["647143f4a02b"], - "settlements": { - "mount": "eb79a9b3682a", - "delete-comment-0": "eb79a9b3682a" - }, - "state": "b6b9452c2348", - "effects": ["5d32aa29303c", "19346a719903", "99542210ddd6", "72332e237f1f"] - } - }, - { - "id": "thread-settled", - "observation": { - "sender": ["bb6b127da045", "1eb94321f034"], - "payloads": ["647143f4a02b", "8baca63d6578"], - "settlements": { - "mount": "eb79a9b3682a", - "delete-comment-0": "eb79a9b3682a", - "thread-1": "eb79a9b3682a" - }, - "state": "b6b9452c2348", - "effects": [ - "5d32aa29303c", - "19346a719903", - "99542210ddd6", - "72332e237f1f", - "f39ed9ab521e", - "510db4658728", - "5ba91867e6b3", - "ce1f6d47985f" - ] - } - }, - { - "id": "review-reply-settled", - "observation": { - "sender": ["bb6b127da045", "1eb94321f034", "86f1d86b2ef1"], - "payloads": ["647143f4a02b", "8baca63d6578", "09c572b1820f"], - "settlements": { - "mount": "eb79a9b3682a", - "delete-comment-0": "eb79a9b3682a", - "thread-1": "eb79a9b3682a", - "review-reply-2": "eb79a9b3682a" - }, - "state": "e76d5520ec18", - "effects": [ - "5d32aa29303c", - "19346a719903", - "99542210ddd6", - "72332e237f1f", - "f39ed9ab521e", - "510db4658728", - "5ba91867e6b3", - "ce1f6d47985f", - "a8ff11b6adce", - "5c30b4794b57", - "403b13184ce0", - "7f87c5800a4e", - "7440f0f1bab9" - ] - } - }, - { - "id": "issue-reply-settled", - "observation": { - "sender": ["bb6b127da045", "1eb94321f034", "86f1d86b2ef1", "c2f0cb5f4fe2"], - "payloads": ["647143f4a02b", "8baca63d6578", "09c572b1820f", "cca2fbdc89cd"], - "settlements": { - "mount": "eb79a9b3682a", - "delete-comment-0": "eb79a9b3682a", - "thread-1": "eb79a9b3682a", - "review-reply-2": "eb79a9b3682a", - "issue-reply-3": "eb79a9b3682a" - }, - "state": "874009380ba6", - "effects": [ - "5d32aa29303c", - "19346a719903", - "99542210ddd6", - "72332e237f1f", - "f39ed9ab521e", - "510db4658728", - "5ba91867e6b3", - "ce1f6d47985f", - "a8ff11b6adce", - "5c30b4794b57", - "403b13184ce0", - "7f87c5800a4e", - "7440f0f1bab9", - "ecb02d3e0977", - "fb41e38e331b", - "b145ac6005a6", - "c1bd400fb401", - "abdc42e00721" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-provider-load.json b/mobile/rpc-foundation/goldens/tk-provider-load.json deleted file mode 100644 index 968191a3149..00000000000 --- a/mobile/rpc-foundation/goldens/tk-provider-load.json +++ /dev/null @@ -1,444 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.provider-load", - "family": "tasks.provider-load", - "namedDeltas": [], - "values": { - "084da53ea1e3": { - "name": "linear.status#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.status\"}" - }, - "0d5034d2e543": { - "name": "linearTeams", - "ordinal": 8, - "value": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - }, - "3eec4c7c7f4f": { - "name": "github.listWorkItems#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "github.listWorkItems" - }, - { - "name": "params", - "value": { - "limit": 36, - "page": 1, - "query": "is:issue bug", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "items": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:9", - "labels": [], - "number": 9, - "state": "open", - "title": "An issue", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "sources": { - "issues": "upstream" - } - } - } - } - }, - "470893ebd4a7": { - "name": "linearWorkspaces", - "ordinal": 4, - "value": [ - { - "id": "linear-workspace", - "name": "Workspace" - } - ] - }, - "5e1882223b41": { - "name": "linear.listTeams#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listTeams\",\"params\":{\"workspaceId\":\"linear-workspace\"}}" - }, - "5efa1426d38f": { - "name": "selectedLinearWorkspaceId", - "ordinal": 5, - "value": "linear-workspace" - }, - "67b5ebc67646": { - "connected": true, - "selectedTeams": ["team-1"], - "teams": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ], - "workspaceId": "linear-workspace", - "workspaces": [ - { - "id": "linear-workspace", - "name": "Workspace" - } - ] - }, - "823a0f3cec86": { - "name": "github.listWorkItems#1", - "ordinal": 13, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"is:issue bug\",\"page\":1}}" - }, - "9050cedbf1cf": { - "name": "github.countWorkItems#1", - "ordinal": 15, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.countWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"is:issue bug\"}}" - }, - "91220356fb85": { - "name": "selectedLinearTeamIds", - "ordinal": 9, - "value": ["team-1"] - }, - "93695401e4f8": { - "name": "linear.listTeams#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "linear.listTeams" - }, - { - "name": "params", - "value": { - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - } - } - }, - "a3b6191b3861": { - "name": "settings.update#1", - "ordinal": 11, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"settings.update\",\"params\":{\"defaultLinearTeamSelection\":[\"team-1\"]}}" - }, - "adcbf91f89c3": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": 1 - }, - "b972a52a94fe": { - "name": "linear.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "connected": true, - "selectedWorkspaceId": "linear-workspace", - "workspaces": [ - { - "id": "linear-workspace", - "name": "Workspace" - } - ] - } - } - } - }, - "bd4e7772cf07": { - "name": "settings.update#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "settings.update" - }, - { - "name": "params", - "value": { - "defaultLinearTeamSelection": ["team-1"] - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "d0a974f0c6a1": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "errorTypes": [], - "failedCount": 0, - "items": [ - { - "key": "github:repo-1:issue:9", - "provider": "github", - "source": { - "author": { - "$rpc": "null" - }, - "id": "issue:9", - "labels": [], - "number": 9, - "repoId": "repo-1", - "repoName": "Repo", - "state": "open", - "title": "An issue", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "status": "Open", - "subtitle": "Repo #9", - "title": "An issue", - "updatedAt": "2020-01-01T00:00:00.000Z" - } - ], - "sourceErrors": [], - "sourceFallbacks": [], - "sourcesByRepoId": { - "repo-1": { - "issues": "upstream" - } - } - } - }, - "de7bfe07e04b": { - "name": "github.countWorkItems#1", - "ordinal": 14, - "args": [ - { - "name": "method", - "value": "github.countWorkItems" - }, - { - "name": "params", - "value": { - "query": "is:issue bug", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": 4 - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f57b6504f168": { - "name": "linearConnected", - "ordinal": 3, - "value": true - } - }, - "recording": { - "scenario": "tk-provider-load", - "checkpoints": [ - { - "id": "linear-context-settled", - "observation": { - "sender": ["b972a52a94fe", "93695401e4f8"], - "payloads": ["084da53ea1e3", "5e1882223b41"], - "settlements": { - "mount": "eb79a9b3682a", - "linear-context-0": "eb79a9b3682a" - }, - "state": "67b5ebc67646", - "effects": [ - "f57b6504f168", - "470893ebd4a7", - "5efa1426d38f", - "0d5034d2e543", - "91220356fb85" - ] - } - }, - { - "id": "persist-teams-settled", - "observation": { - "sender": ["b972a52a94fe", "93695401e4f8", "bd4e7772cf07"], - "payloads": ["084da53ea1e3", "5e1882223b41", "a3b6191b3861"], - "settlements": { - "mount": "eb79a9b3682a", - "linear-context-0": "eb79a9b3682a", - "persist-teams-1": "eb79a9b3682a" - }, - "state": "67b5ebc67646", - "effects": [ - "f57b6504f168", - "470893ebd4a7", - "5efa1426d38f", - "0d5034d2e543", - "91220356fb85" - ] - } - }, - { - "id": "github-page-settled", - "observation": { - "sender": ["b972a52a94fe", "93695401e4f8", "bd4e7772cf07", "3eec4c7c7f4f"], - "payloads": ["084da53ea1e3", "5e1882223b41", "a3b6191b3861", "823a0f3cec86"], - "settlements": { - "mount": "eb79a9b3682a", - "linear-context-0": "eb79a9b3682a", - "persist-teams-1": "eb79a9b3682a", - "github-page-2": "d0a974f0c6a1" - }, - "state": "67b5ebc67646", - "effects": [ - "f57b6504f168", - "470893ebd4a7", - "5efa1426d38f", - "0d5034d2e543", - "91220356fb85" - ] - } - }, - { - "id": "github-count-settled", - "observation": { - "sender": [ - "b972a52a94fe", - "93695401e4f8", - "bd4e7772cf07", - "3eec4c7c7f4f", - "de7bfe07e04b" - ], - "payloads": [ - "084da53ea1e3", - "5e1882223b41", - "a3b6191b3861", - "823a0f3cec86", - "9050cedbf1cf" - ], - "settlements": { - "mount": "eb79a9b3682a", - "linear-context-0": "eb79a9b3682a", - "persist-teams-1": "eb79a9b3682a", - "github-page-2": "d0a974f0c6a1", - "github-count-3": "adcbf91f89c3" - }, - "state": "67b5ebc67646", - "effects": [ - "f57b6504f168", - "470893ebd4a7", - "5efa1426d38f", - "0d5034d2e543", - "91220356fb85" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json b/mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json deleted file mode 100644 index fc98869224c..00000000000 --- a/mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json +++ /dev/null @@ -1,466 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.paste-lookup", - "family": "tasks.paste-lookup", - "namedDeltas": [], - "values": { - "088b54714e03": { - "by-number": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "cache": [] - }, - "0e9d6525a582": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "displayName": "Repo", - "id": "repo-1", - "slug": { - "$rpc": "null" - } - } - }, - "1ffa5b08cd27": { - "by-number": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "by-slug": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "cache": [], - "gitlab-path": { - "author": { - "$rpc": "null" - }, - "id": "issue:7", - "labels": [], - "number": 7, - "repoId": "repo-1", - "state": "opened", - "title": "seven", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - }, - "2689e3903f7b": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "author": { - "$rpc": "null" - }, - "id": "issue:7", - "labels": [], - "number": 7, - "repoId": "repo-1", - "state": "opened", - "title": "seven", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - }, - "467d1db5ad39": { - "name": "github.workItem#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItem\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12}}" - }, - "4a91480c91b6": { - "name": "github.workItemByOwnerRepo#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.workItemByOwnerRepo" - }, - { - "name": "params", - "value": { - "number": 12, - "owner": "owner", - "ownerRepo": "repo", - "repo": "id:repo-1", - "type": "issue" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - } - } - }, - "53a164add69c": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - }, - "64b4674b65a8": { - "name": "github.workItemByOwnerRepo#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemByOwnerRepo\",\"params\":{\"repo\":\"id:repo-1\",\"owner\":\"owner\",\"ownerRepo\":\"repo\",\"number\":12,\"type\":\"issue\"}}" - }, - "72a59aa8bee1": { - "name": "github.repoSlug#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "97bec1f98b89": { - "by-number": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "by-slug": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "cache": [ - [ - "repo-1", - { - "owner": "owner", - "repo": "repo" - } - ] - ], - "gitlab-path": { - "author": { - "$rpc": "null" - }, - "id": "issue:7", - "labels": [], - "number": 7, - "repoId": "repo-1", - "state": "opened", - "title": "seven", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "repo-slug": { - "displayName": "Repo", - "id": "repo-1", - "slug": { - "$rpc": "null" - } - } - }, - "c8c091106ead": { - "by-number": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "by-slug": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "repoId": "repo-1", - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - }, - "cache": [] - }, - "db48adb41100": { - "name": "github.repoSlug#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - } - }, - "f4d2080c6e99": { - "name": "gitlab.workItemByPath#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemByPath\",\"params\":{\"repo\":\"id:repo-1\",\"host\":\"gitlab.com\",\"path\":\"group/project\",\"iid\":7,\"type\":\"issue\"}}" - }, - "f849aeca5336": { - "name": "gitlab.workItemByPath#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "gitlab.workItemByPath" - }, - { - "name": "params", - "value": { - "host": "gitlab.com", - "iid": 7, - "path": "group/project", - "repo": "id:repo-1", - "type": "issue" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "author": { - "$rpc": "null" - }, - "id": "issue:7", - "labels": [], - "number": 7, - "state": "opened", - "title": "seven", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - } - } - }, - "fa6ca8899e53": { - "name": "github.workItem#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.workItem" - }, - { - "name": "params", - "value": { - "number": 12, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "author": { - "$rpc": "null" - }, - "id": "issue:12", - "labels": [], - "number": 12, - "state": "open", - "title": "twelve", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - } - } - } - }, - "recording": { - "scenario": "tw-paste-lookup-resolved", - "checkpoints": [ - { - "id": "by-number", - "observation": { - "sender": ["fa6ca8899e53"], - "payloads": ["467d1db5ad39"], - "settlements": { - "by-number": "53a164add69c" - }, - "state": "088b54714e03", - "effects": [] - } - }, - { - "id": "by-slug", - "observation": { - "sender": ["fa6ca8899e53", "4a91480c91b6"], - "payloads": ["467d1db5ad39", "64b4674b65a8"], - "settlements": { - "by-number": "53a164add69c", - "by-slug": "53a164add69c" - }, - "state": "c8c091106ead", - "effects": [] - } - }, - { - "id": "gitlab-path", - "observation": { - "sender": ["fa6ca8899e53", "4a91480c91b6", "f849aeca5336"], - "payloads": ["467d1db5ad39", "64b4674b65a8", "f4d2080c6e99"], - "settlements": { - "by-number": "53a164add69c", - "by-slug": "53a164add69c", - "gitlab-path": "2689e3903f7b" - }, - "state": "1ffa5b08cd27", - "effects": [] - } - }, - { - "id": "repo-slug-matched", - "observation": { - "sender": ["fa6ca8899e53", "4a91480c91b6", "f849aeca5336", "db48adb41100"], - "payloads": ["467d1db5ad39", "64b4674b65a8", "f4d2080c6e99", "72a59aa8bee1"], - "settlements": { - "by-number": "53a164add69c", - "by-slug": "53a164add69c", - "gitlab-path": "2689e3903f7b", - "repo-slug": "0e9d6525a582" - }, - "state": "97bec1f98b89", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json b/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json deleted file mode 100644 index c139e38f777..00000000000 --- a/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.paste-lookup", - "family": "tasks.paste-lookup", - "namedDeltas": [], - "values": { - "35f3e39a1c50": { - "cache": [ - [ - "repo-1", - { - "$rpc": "null" - } - ], - [ - "repo-2", - { - "$rpc": "null" - } - ] - ], - "repo-slug": { - "$rpc": "null" - } - }, - "49d6f5f60c9c": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "62def01d7611": { - "name": "github.repoSlug#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-2\"}}" - }, - "72fe3852457b": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "no access" - }, - "id": "frame-1", - "ok": false - } - } - }, - "8d505f40e367": { - "name": "github.repoSlug#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-2" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "$rpc": "null" - } - } - } - }, - "ee20a1dc39e7": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tw-paste-lookup-slug-refused", - "checkpoints": [ - { - "id": "refusal-is-per-repo", - "observation": { - "sender": ["72fe3852457b", "8d505f40e367"], - "payloads": ["49d6f5f60c9c", "62def01d7611"], - "settlements": { - "repo-slug": "ee20a1dc39e7" - }, - "state": "35f3e39a1c50", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json b/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json deleted file mode 100644 index fb6cef2cd6f..00000000000 --- a/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.paste-lookup", - "family": "tasks.paste-lookup", - "namedDeltas": [], - "values": { - "176039835400": { - "cache": [ - [ - "repo-1", - { - "$rpc": "null" - } - ], - [ - "repo-2", - { - "$rpc": "null" - } - ] - ], - "repo-slug": { - "$rpc": "null" - }, - "repo-slug-again": { - "$rpc": "null" - } - }, - "35f3e39a1c50": { - "cache": [ - [ - "repo-1", - { - "$rpc": "null" - } - ], - [ - "repo-2", - { - "$rpc": "null" - } - ] - ], - "repo-slug": { - "$rpc": "null" - } - }, - "49d6f5f60c9c": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "5f7814cedf54": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - }, - "ee20a1dc39e7": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tw-paste-lookup-slug-unsupported", - "checkpoints": [ - { - "id": "host-wide-probe-cached", - "observation": { - "sender": ["5f7814cedf54"], - "payloads": ["49d6f5f60c9c"], - "settlements": { - "repo-slug": "ee20a1dc39e7" - }, - "state": "35f3e39a1c50", - "effects": [] - } - }, - { - "id": "no-second-probe", - "observation": { - "sender": ["5f7814cedf54"], - "payloads": ["49d6f5f60c9c"], - "settlements": { - "repo-slug": "ee20a1dc39e7", - "repo-slug-again": "ee20a1dc39e7" - }, - "state": "176039835400", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json b/mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json deleted file mode 100644 index b212f84739f..00000000000 --- a/mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.setup-hook-trust", - "family": "worktree.setup-hook-trust", - "namedDeltas": [], - "values": { - "227b8a130a49": { - "name": "ui.set#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"trustedOrcaHooks\":{\"repo-1\":{\"setup\":{\"contentHash\":\"hash-1\",\"approvedAt\":1767225600000},\"all\":{\"approvedAt\":1767225600000}}}}}" - }, - "229c35d1a4ba": { - "trust": "unapproved" - }, - "f3b516f62081": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "", - "isRpcDeliveryUnknown": false - } - }, - "fed440092fe8": { - "name": "ui.set#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ui.set" - }, - { - "name": "params", - "value": { - "trustedOrcaHooks": { - "repo-1": { - "all": { - "approvedAt": 1767225600000 - }, - "setup": { - "approvedAt": 1767225600000, - "contentHash": "hash-1" - } - } - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "tw-setup-hook-trust-always", - "checkpoints": [ - { - "id": "refused-empty-message", - "observation": { - "sender": ["fed440092fe8"], - "payloads": ["227b8a130a49"], - "settlements": { - "approve": "f3b516f62081" - }, - "state": "229c35d1a4ba", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json b/mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json deleted file mode 100644 index 32c6c80eb2c..00000000000 --- a/mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.setup-hook-trust", - "family": "worktree.setup-hook-trust", - "namedDeltas": [], - "values": { - "86d0d8f71257": { - "name": "ui.set#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"trustedOrcaHooks\":{\"repo-1\":{\"setup\":{\"contentHash\":\"hash-1\",\"approvedAt\":1767225600000}}}}}" - }, - "a406b068aeca": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "repo-1": { - "setup": { - "approvedAt": 1767225600000, - "contentHash": "hash-1" - } - } - } - }, - "b2aa9ff12623": { - "trust": { - "repo-1": { - "setup": { - "approvedAt": 1767225600000, - "contentHash": "hash-1" - } - } - } - }, - "e2089203d4dd": { - "name": "ui.set#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ui.set" - }, - { - "name": "params", - "value": { - "trustedOrcaHooks": { - "repo-1": { - "setup": { - "approvedAt": 1767225600000, - "contentHash": "hash-1" - } - } - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - } - }, - "recording": { - "scenario": "tw-setup-hook-trust-approved", - "checkpoints": [ - { - "id": "approved", - "observation": { - "sender": ["e2089203d4dd"], - "payloads": ["86d0d8f71257"], - "settlements": { - "approve": "a406b068aeca" - }, - "state": "b2aa9ff12623", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json b/mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json deleted file mode 100644 index fb78d291682..00000000000 --- a/mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json +++ /dev/null @@ -1,727 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.smart-source-search", - "family": "tasks.smart-source-search", - "namedDeltas": [], - "values": { - "005749a0bd75": { - "name": "github.listWorkItems#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.listWorkItems" - }, - { - "name": "params", - "value": { - "limit": 36, - "query": "bug", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "items": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - } - } - } - }, - "017731afa453": { - "name": "repo.searchRefs#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" - }, - "2868ae2bd70e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:2", - "labels": [], - "number": 2, - "repoId": "repo-1", - "state": "opened", - "title": "two", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - }, - "2d9caaaffaed": { - "name": "github.listWorkItems#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" - }, - "40d2922bb77c": { - "name": "linear.searchIssues#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.searchIssues" - }, - { - "name": "params", - "value": { - "limit": 50, - "query": "bug", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "items": [ - { - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A searched issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - } - } - } - }, - "4d156675db06": { - "branches": [ - { - "localBranchName": "main", - "refName": "main" - }, - { - "localBranchName": "release", - "refName": "release" - } - ], - "github": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "repoId": "repo-1", - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "gitlab": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:2", - "labels": [], - "number": 2, - "repoId": "repo-1", - "state": "opened", - "title": "two", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "linear": [ - { - "id": "issue-3", - "identifier": "ENG-3", - "labels": [], - "priority": 2, - "state": { - "color": "#111", - "name": "In Progress", - "type": "started" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "An assigned issue", - "updatedAt": "2020-01-02T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "6a6dbfc00478": { - "github": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "repoId": "repo-1", - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "gitlab": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:2", - "labels": [], - "number": 2, - "repoId": "repo-1", - "state": "opened", - "title": "two", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "linear": [ - { - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A searched issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "9c65a9888b9c": { - "branches": [ - { - "localBranchName": "main", - "refName": "main" - }, - { - "localBranchName": "release", - "refName": "release" - } - ], - "github": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "repoId": "repo-1", - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "gitlab": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:2", - "labels": [], - "number": 2, - "repoId": "repo-1", - "state": "opened", - "title": "two", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "linear": [ - { - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A searched issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "9ca31589d6b9": { - "name": "gitlab.listWorkItems#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "gitlab.listWorkItems" - }, - { - "name": "params", - "value": { - "page": 1, - "perPage": 50, - "query": "bug", - "repo": "id:repo-1", - "state": "opened" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "error": { - "message": "missing", - "type": "not_found" - }, - "items": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:2", - "labels": [], - "number": 2, - "state": "opened", - "title": "two", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - } - } - } - }, - "9e3a28140ba7": { - "name": "gitlab.listWorkItems#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" - }, - "aa71e896eae4": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "repoId": "repo-1", - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - }, - "b015aaf3a53a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "localBranchName": "main", - "refName": "main" - }, - { - "localBranchName": "release", - "refName": "release" - } - ] - }, - "b4056bfa00e3": { - "github": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "repoId": "repo-1", - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ], - "gitlab": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:2", - "labels": [], - "number": 2, - "repoId": "repo-1", - "state": "opened", - "title": "two", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - }, - "bb2ecdf1f3da": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "id": "issue-3", - "identifier": "ENG-3", - "labels": [], - "priority": 2, - "state": { - "color": "#111", - "name": "In Progress", - "type": "started" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "An assigned issue", - "updatedAt": "2020-01-02T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "c6df6f81c539": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "id": "issue-1", - "identifier": "ENG-1", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "A searched issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "df9cac7fb20b": { - "name": "linear.searchIssues#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" - }, - "eae99168231b": { - "name": "repo.searchRefs#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "repo.searchRefs" - }, - { - "name": "params", - "value": { - "limit": 20, - "query": "bug", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "refs": ["main", "release"] - } - } - } - }, - "ef18db5bf24a": { - "name": "linear.listIssues#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" - }, - "f0fd94109299": { - "github": [ - { - "author": { - "$rpc": "null" - }, - "id": "issue:1", - "labels": [], - "number": 1, - "repoId": "repo-1", - "state": "open", - "title": "one", - "type": "issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "" - } - ] - }, - "f1d5de4d4483": { - "name": "linear.listIssues#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "linear.listIssues" - }, - { - "name": "params", - "value": { - "filter": "assigned", - "limit": 50, - "workspaceId": { - "$rpc": "undefined" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": [ - { - "id": "issue-3", - "identifier": "ENG-3", - "labels": [], - "priority": 2, - "state": { - "color": "#111", - "name": "In Progress", - "type": "started" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "An assigned issue", - "updatedAt": "2020-01-02T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - } - } - } - }, - "recording": { - "scenario": "tw-smart-search-all-providers", - "checkpoints": [ - { - "id": "github-items", - "observation": { - "sender": ["005749a0bd75"], - "payloads": ["2d9caaaffaed"], - "settlements": { - "github": "aa71e896eae4" - }, - "state": "f0fd94109299", - "effects": [] - } - }, - { - "id": "gitlab-items", - "observation": { - "sender": ["005749a0bd75", "9ca31589d6b9"], - "payloads": ["2d9caaaffaed", "9e3a28140ba7"], - "settlements": { - "github": "aa71e896eae4", - "gitlab": "2868ae2bd70e" - }, - "state": "b4056bfa00e3", - "effects": [] - } - }, - { - "id": "linear-search", - "observation": { - "sender": ["005749a0bd75", "9ca31589d6b9", "40d2922bb77c"], - "payloads": ["2d9caaaffaed", "9e3a28140ba7", "df9cac7fb20b"], - "settlements": { - "github": "aa71e896eae4", - "gitlab": "2868ae2bd70e", - "linear": "c6df6f81c539" - }, - "state": "6a6dbfc00478", - "effects": [] - } - }, - { - "id": "branch-refs", - "observation": { - "sender": ["005749a0bd75", "9ca31589d6b9", "40d2922bb77c", "eae99168231b"], - "payloads": ["2d9caaaffaed", "9e3a28140ba7", "df9cac7fb20b", "017731afa453"], - "settlements": { - "github": "aa71e896eae4", - "gitlab": "2868ae2bd70e", - "linear": "c6df6f81c539", - "branches": "b015aaf3a53a" - }, - "state": "9c65a9888b9c", - "effects": [] - } - }, - { - "id": "linear-assigned-listed", - "observation": { - "sender": [ - "005749a0bd75", - "9ca31589d6b9", - "40d2922bb77c", - "eae99168231b", - "f1d5de4d4483" - ], - "payloads": [ - "2d9caaaffaed", - "9e3a28140ba7", - "df9cac7fb20b", - "017731afa453", - "ef18db5bf24a" - ], - "settlements": { - "github": "aa71e896eae4", - "gitlab": "2868ae2bd70e", - "linear": "c6df6f81c539", - "branches": "b015aaf3a53a", - "linear-assigned": "bb2ecdf1f3da" - }, - "state": "4d156675db06", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json b/mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json deleted file mode 100644 index 165d36f167f..00000000000 --- a/mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.smart-source-search", - "family": "tasks.smart-source-search", - "namedDeltas": [], - "values": { - "2978f9aceb1e": { - "name": "repo.searchRefs#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "repo.searchRefs" - }, - { - "name": "params", - "value": { - "limit": 20, - "query": "main", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "refDetails": [ - { - "localBranchName": "main", - "refName": "origin/main" - } - ] - } - } - } - }, - "44136fa355b3": {}, - "51e012c25ebf": { - "branches": [ - { - "localBranchName": "main", - "refName": "origin/main" - } - ] - }, - "791f6fc629fc": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "localBranchName": "main", - "refName": "origin/main" - } - ] - }, - "ab2b1da8d0e9": { - "name": "repo.searchRefs#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"main\",\"limit\":20}}" - }, - "bf7ab976b200": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "rate limited", - "isRpcDeliveryUnknown": false - } - }, - "cc32ff7ae122": { - "name": "gitlab.listWorkItems#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" - }, - "f87417f689e2": { - "name": "gitlab.listWorkItems#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "gitlab.listWorkItems" - }, - { - "name": "params", - "value": { - "page": 1, - "perPage": 50, - "query": "bug", - "repo": "id:repo-1", - "state": "opened" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "error": { - "message": "rate limited", - "type": "quota" - }, - "items": [] - } - } - } - } - }, - "recording": { - "scenario": "tw-smart-search-gitlab-provider-error", - "checkpoints": [ - { - "id": "in-band-provider-error", - "observation": { - "sender": ["f87417f689e2"], - "payloads": ["cc32ff7ae122"], - "settlements": { - "gitlab": "bf7ab976b200" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "branch-ref-details", - "observation": { - "sender": ["f87417f689e2", "2978f9aceb1e"], - "payloads": ["cc32ff7ae122", "ab2b1da8d0e9"], - "settlements": { - "gitlab": "bf7ab976b200", - "branches": "791f6fc629fc" - }, - "state": "51e012c25ebf", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json b/mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json deleted file mode 100644 index 0e827d36891..00000000000 --- a/mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.smart-source-search", - "family": "tasks.smart-source-search", - "namedDeltas": [], - "values": { - "15d6e85f9f78": { - "name": "linear.listIssues#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "linear.listIssues" - }, - { - "name": "params", - "value": { - "filter": "assigned", - "limit": 50, - "workspaceId": { - "$rpc": "undefined" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": [ - { - "id": "issue-2", - "identifier": "ENG-2", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "An assigned issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - } - } - }, - "5ada0ba09955": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "id": "issue-2", - "identifier": "ENG-2", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "An assigned issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "68e656392151": { - "linear": [ - { - "id": "issue-2", - "identifier": "ENG-2", - "labels": [], - "priority": 0, - "state": { - "color": "#000", - "name": "Todo", - "type": "unstarted" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "title": "An assigned issue", - "updatedAt": "2020-01-01T00:00:00.000Z", - "url": "", - "workspaceId": "linear-workspace" - } - ] - }, - "b272a4494870": { - "name": "linear.listIssues#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" - } - }, - "recording": { - "scenario": "tw-smart-search-linear-listed", - "checkpoints": [ - { - "id": "linear-assigned", - "observation": { - "sender": ["15d6e85f9f78"], - "payloads": ["b272a4494870"], - "settlements": { - "linear": "5ada0ba09955" - }, - "state": "68e656392151", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json b/mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json deleted file mode 100644 index b72186c22d7..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-source", - "family": "tasks.workspace-source", - "namedDeltas": [], - "values": { - "02e24a49522e": { - "name": "repo.sparsePresets#1", - "ordinal": 8, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.sparsePresets\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "22b30d5c0550": { - "name": "workspaceSparsePresetId", - "ordinal": 11, - "value": { - "$rpc": "null" - } - }, - "4efabea114c4": { - "name": "workspaceSparsePresetsError", - "ordinal": 3, - "value": "" - }, - "62bc28c39ffc": { - "branchError": "", - "branches": [], - "presets": [], - "presetsError": "", - "presetsLoaded": false - }, - "666bd27e7019": { - "name": "workspaceSparsePresetsLoaded", - "ordinal": 2, - "value": false - }, - "802594b0307e": { - "name": "workspaceBaseBranchLoading", - "ordinal": 6, - "value": false - }, - "8aa6d1392eee": { - "name": "workspaceSparsePresetsLoading", - "ordinal": 13, - "value": false - }, - "985b44577ba8": { - "name": "workspaceSparsePresets", - "ordinal": 9, - "value": [] - }, - "a4ad08dfe36b": { - "name": "repo.sparsePresets#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "repo.sparsePresets" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "" - }, - "id": "frame-1", - "ok": false - } - } - }, - "b2d70a96a17a": { - "name": "workspaceBaseBranchResults", - "ordinal": 5, - "value": [] - }, - "bb6152049822": { - "name": "workspaceSparsePresetsError", - "ordinal": 12, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f7ab22c990a5": { - "name": "workspaceBaseBranchError", - "ordinal": 7, - "value": "" - }, - "faf6e6083f43": { - "name": "workspaceSparsePresetsLoading", - "ordinal": 1, - "value": true - }, - "fe3395a9e94f": { - "name": "workspaceSparsePresetsLoaded", - "ordinal": 10, - "value": false - } - }, - "recording": { - "scenario": "tw-workspace-source-presets-refused", - "checkpoints": [ - { - "id": "presets-refused-empty-message", - "observation": { - "sender": ["a4ad08dfe36b"], - "payloads": ["02e24a49522e"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "62bc28c39ffc", - "effects": [ - "faf6e6083f43", - "666bd27e7019", - "4efabea114c4", - "b2d70a96a17a", - "802594b0307e", - "f7ab22c990a5", - "985b44577ba8", - "fe3395a9e94f", - "22b30d5c0550", - "bb6152049822", - "8aa6d1392eee" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-source-presets.json b/mobile/rpc-foundation/goldens/tw-workspace-source-presets.json deleted file mode 100644 index 760d6e2fdd4..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-source-presets.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-source", - "family": "tasks.workspace-source", - "namedDeltas": [], - "values": { - "02e24a49522e": { - "name": "repo.sparsePresets#1", - "ordinal": 8, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.sparsePresets\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "215f6b1d86cd": { - "name": "workspaceBaseBranchLoading", - "ordinal": 13, - "value": true - }, - "2198c28257cb": { - "name": "repo.searchRefs#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "repo.searchRefs" - }, - { - "name": "params", - "value": { - "limit": 20, - "query": "main", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "refs": ["main"] - } - } - } - }, - "22b30d5c0550": { - "name": "workspaceSparsePresetId", - "ordinal": 11, - "value": { - "$rpc": "null" - } - }, - "329626b87ebb": { - "name": "workspaceBaseBranchLoading", - "ordinal": 18, - "value": false - }, - "395b11d2530a": { - "name": "workspaceSparsePresetsLoading", - "ordinal": 12, - "value": false - }, - "4efabea114c4": { - "name": "workspaceSparsePresetsError", - "ordinal": 3, - "value": "" - }, - "57f06e6e349e": { - "branchError": "", - "branches": [], - "presets": [ - { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - ], - "presetsError": "", - "presetsLoaded": true - }, - "653409308f6c": { - "name": "workspaceSparsePresetsLoaded", - "ordinal": 10, - "value": true - }, - "666bd27e7019": { - "name": "workspaceSparsePresetsLoaded", - "ordinal": 2, - "value": false - }, - "802594b0307e": { - "name": "workspaceBaseBranchLoading", - "ordinal": 6, - "value": false - }, - "826410120272": { - "name": "workspaceSparsePresets", - "ordinal": 9, - "value": [ - { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - ] - }, - "94be039bc034": { - "name": "repo.searchRefs#1", - "ordinal": 16, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"main\",\"limit\":20}}" - }, - "a135d4b358aa": { - "name": "workspaceBaseBranchResults", - "ordinal": 17, - "value": [ - { - "localBranchName": "main", - "refName": "main" - } - ] - }, - "b2d70a96a17a": { - "name": "workspaceBaseBranchResults", - "ordinal": 5, - "value": [] - }, - "b78bcf7ca596": { - "branchError": "", - "branches": [ - { - "localBranchName": "main", - "refName": "main" - } - ], - "presets": [ - { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - ], - "presetsError": "", - "presetsLoaded": true - }, - "b7cb2292ffa2": { - "name": "repo.sparsePresets#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "repo.sparsePresets" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "presets": [ - { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - ] - } - } - } - }, - "d8718329d555": { - "name": "workspaceBaseBranchError", - "ordinal": 14, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f7ab22c990a5": { - "name": "workspaceBaseBranchError", - "ordinal": 7, - "value": "" - }, - "faf6e6083f43": { - "name": "workspaceSparsePresetsLoading", - "ordinal": 1, - "value": true - } - }, - "recording": { - "scenario": "tw-workspace-source-presets", - "checkpoints": [ - { - "id": "presets-loaded", - "observation": { - "sender": ["b7cb2292ffa2"], - "payloads": ["02e24a49522e"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "57f06e6e349e", - "effects": [ - "faf6e6083f43", - "666bd27e7019", - "4efabea114c4", - "b2d70a96a17a", - "802594b0307e", - "f7ab22c990a5", - "826410120272", - "653409308f6c", - "22b30d5c0550", - "395b11d2530a" - ] - } - }, - { - "id": "branches-loaded", - "observation": { - "sender": ["b7cb2292ffa2", "2198c28257cb"], - "payloads": ["02e24a49522e", "94be039bc034"], - "settlements": { - "mount": "eb79a9b3682a", - "branch-query": "eb79a9b3682a" - }, - "state": "b78bcf7ca596", - "effects": [ - "faf6e6083f43", - "666bd27e7019", - "4efabea114c4", - "b2d70a96a17a", - "802594b0307e", - "f7ab22c990a5", - "826410120272", - "653409308f6c", - "22b30d5c0550", - "395b11d2530a", - "215f6b1d86cd", - "d8718329d555", - "a135d4b358aa", - "329626b87ebb" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json b/mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json deleted file mode 100644 index 6a3ce4642a2..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-sparse", - "family": "tasks.workspace-sparse", - "namedDeltas": [], - "values": { - "02daf4600c50": { - "name": "repo.saveSparsePreset#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.saveSparsePreset\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"docs\",\"directories\":[\"docs\"]}}" - }, - "0df082978757": { - "name": "workspaceSparsePresetsError", - "ordinal": 8, - "value": "Failed to save sparse preset." - }, - "137e0fd71a21": { - "name": "repo.saveSparsePreset#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "repo.saveSparsePreset" - }, - { - "name": "params", - "value": { - "directories": ["docs"], - "name": "docs", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": {} - } - } - }, - "193c0bc3cf2a": { - "presets": [], - "presetsError": "Failed to save sparse preset.", - "saving": false, - "ssh": { - "error": "", - "reconnectAttempt": 0, - "status": "error", - "targetId": "ssh-1" - } - }, - "37c5cc533ab4": { - "name": "workspaceSparseSaving", - "ordinal": 9, - "value": false - }, - "4e16f40bd113": { - "name": "ssh.getState#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ssh.getState" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "" - }, - "id": "frame-1", - "ok": false - } - } - }, - "973f31a4e64b": { - "name": "workspaceSparsePresetsError", - "ordinal": 5, - "value": "" - }, - "a11809a84754": { - "name": "ssh.getState#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "a71abdbfefa8": { - "name": "workspaceSshState", - "ordinal": 3, - "value": { - "error": "", - "reconnectAttempt": 0, - "status": "error", - "targetId": "ssh-1" - } - }, - "ea6e5bf810d9": { - "name": "workspaceSparseSaving", - "ordinal": 4, - "value": true - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tw-workspace-sparse-missing-preset", - "checkpoints": [ - { - "id": "saved-without-preset", - "observation": { - "sender": ["4e16f40bd113", "137e0fd71a21"], - "payloads": ["a11809a84754", "02daf4600c50"], - "settlements": { - "mount": "eb79a9b3682a", - "save": "eb79a9b3682a" - }, - "state": "193c0bc3cf2a", - "effects": [ - "a71abdbfefa8", - "ea6e5bf810d9", - "973f31a4e64b", - "0df082978757", - "37c5cc533ab4" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json b/mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json deleted file mode 100644 index 6a2548ac2df..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json +++ /dev/null @@ -1,233 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-sparse", - "family": "tasks.workspace-sparse", - "namedDeltas": [], - "values": { - "02daf4600c50": { - "name": "repo.saveSparsePreset#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.saveSparsePreset\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"docs\",\"directories\":[\"docs\"]}}" - }, - "1bc7cf6bcbaf": { - "name": "workspaceSparsePresets", - "ordinal": 8, - "value": [ - { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - ] - }, - "3f5e10171cd3": { - "name": "workspaceSparsePresetId", - "ordinal": 10, - "value": "p1" - }, - "404305aa2e3a": { - "presets": [ - { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - ], - "presetsError": "", - "saving": false, - "ssh": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - }, - "4b7e30ea1543": { - "name": "repo.saveSparsePreset#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "repo.saveSparsePreset" - }, - { - "name": "params", - "value": { - "directories": ["docs"], - "name": "docs", - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "preset": { - "directories": ["docs"], - "id": "p1", - "name": "docs" - } - } - } - } - }, - "973f31a4e64b": { - "name": "workspaceSparsePresetsError", - "ordinal": 5, - "value": "" - }, - "a11809a84754": { - "name": "ssh.getState#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "b53739a58194": { - "name": "ssh.getState#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "ssh.getState" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "state": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - } - } - } - }, - "c1ae182c7519": { - "name": "workspaceSparseSaving", - "ordinal": 12, - "value": false - }, - "c88e803973a6": { - "name": "workspaceSparsePresetsLoaded", - "ordinal": 9, - "value": true - }, - "de95b19c6158": { - "name": "workspaceSshState", - "ordinal": 3, - "value": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - }, - "ea6e5bf810d9": { - "name": "workspaceSparseSaving", - "ordinal": 4, - "value": true - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ee3a941d5e9c": { - "presets": [], - "presetsError": "", - "saving": false, - "ssh": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - }, - "f54b3364071f": { - "name": "workspaceSparseDraft", - "ordinal": 11, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tw-workspace-sparse-saved", - "checkpoints": [ - { - "id": "ssh-state-read", - "observation": { - "sender": ["b53739a58194"], - "payloads": ["a11809a84754"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "ee3a941d5e9c", - "effects": ["de95b19c6158"] - } - }, - { - "id": "preset-saved", - "observation": { - "sender": ["b53739a58194", "4b7e30ea1543"], - "payloads": ["a11809a84754", "02daf4600c50"], - "settlements": { - "mount": "eb79a9b3682a", - "save": "eb79a9b3682a" - }, - "state": "404305aa2e3a", - "effects": [ - "de95b19c6158", - "ea6e5bf810d9", - "973f31a4e64b", - "1bc7cf6bcbaf", - "c88e803973a6", - "3f5e10171cd3", - "f54b3364071f", - "c1ae182c7519" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json deleted file mode 100644 index 51a217e723f..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-ssh", - "family": "tasks.workspace-ssh", - "namedDeltas": [], - "values": { - "11405363c62d": { - "name": "workspaceAgent", - "ordinal": 1, - "value": "claude" - }, - "263b165043b0": { - "name": "workspaceSshState", - "ordinal": 11, - "value": { - "error": "", - "reconnectAttempt": 0, - "status": "error", - "targetId": "ssh-1" - } - }, - "2d313c57ddf7": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "decision": "skip", - "kind": "decision", - "setupTrust": { - "$rpc": "undefined" - } - } - }, - "38ce16e16515": { - "name": "ssh.connect#1", - "ordinal": 10, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "55904d40a00f": { - "agent": "claude", - "connecting": false, - "detected": [], - "setup": { - "decision": "skip", - "kind": "decision", - "setupTrust": { - "$rpc": "undefined" - } - }, - "ssh": { - "error": "", - "reconnectAttempt": 0, - "status": "error", - "targetId": "ssh-1" - } - }, - "5d9791d21090": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "630e2f27face": { - "name": "workspaceDetectedAgentIds", - "ordinal": 6, - "value": [] - }, - "84149cfb1467": { - "name": "workspaceSshState", - "ordinal": 8, - "value": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connecting", - "targetId": "ssh-1" - } - }, - "8509334ad6ae": { - "agent": "claude", - "connecting": false, - "detected": [], - "setup": "unresolved", - "ssh": { - "error": "", - "reconnectAttempt": 0, - "status": "error", - "targetId": "ssh-1" - } - }, - "9637248df9cb": { - "name": "workspaceDetectedAgentIds", - "ordinal": 3, - "value": { - "$rpc": "null" - } - }, - "a9ec92743b9e": { - "name": "workspaceAgentOverridden", - "ordinal": 2, - "value": false - }, - "aeb25e836f49": { - "name": "ssh.connect#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "ssh.connect" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 120000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "ssh_failed", - "message": "" - }, - "id": "frame-2", - "ok": false - } - } - }, - "bf0c0c00caf9": { - "name": "repo.hooks#1", - "ordinal": 14, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "d68ba9a6772a": { - "name": "workspaceSshConnecting", - "ordinal": 7, - "value": true - }, - "d760f20b60ad": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "e44d3b580ab0": { - "name": "workspaceSshConnecting", - "ordinal": 12, - "value": false - }, - "e588920b23e8": { - "name": "repo.hooks#1", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "hooks": { - "scripts": { - "setup": "pnpm i" - } - }, - "setupRunPolicy": "never" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tw-workspace-ssh-connect-refused", - "checkpoints": [ - { - "id": "connect-refused-empty-message", - "observation": { - "sender": ["5d9791d21090", "aeb25e836f49"], - "payloads": ["d760f20b60ad", "38ce16e16515"], - "settlements": { - "mount": "eb79a9b3682a", - "connect": "eb79a9b3682a" - }, - "state": "8509334ad6ae", - "effects": [ - "11405363c62d", - "a9ec92743b9e", - "9637248df9cb", - "630e2f27face", - "d68ba9a6772a", - "84149cfb1467", - "263b165043b0", - "e44d3b580ab0" - ] - } - }, - { - "id": "setup-skipped", - "observation": { - "sender": ["5d9791d21090", "aeb25e836f49", "e588920b23e8"], - "payloads": ["d760f20b60ad", "38ce16e16515", "bf0c0c00caf9"], - "settlements": { - "mount": "eb79a9b3682a", - "connect": "eb79a9b3682a", - "setup": "2d313c57ddf7" - }, - "state": "55904d40a00f", - "effects": [ - "11405363c62d", - "a9ec92743b9e", - "9637248df9cb", - "630e2f27face", - "d68ba9a6772a", - "84149cfb1467", - "263b165043b0", - "e44d3b580ab0" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json deleted file mode 100644 index 8adacf14c7c..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json +++ /dev/null @@ -1,325 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-ssh", - "family": "tasks.workspace-ssh", - "namedDeltas": [], - "values": { - "0ba2cee4b538": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "command": "pnpm install", - "kind": "prompt", - "setupTrust": { - "contentHash": "hash-1", - "scriptContent": "pnpm install" - }, - "source": "repo" - } - }, - "11405363c62d": { - "name": "workspaceAgent", - "ordinal": 1, - "value": "claude" - }, - "13e6d0c47ca4": { - "name": "workspaceDetectedAgentIds", - "ordinal": 6, - "value": ["codex"] - }, - "18e6a3ac6471": { - "agent": "claude", - "connecting": false, - "detected": ["codex"], - "setup": "unresolved", - "ssh": { - "$rpc": "null" - } - }, - "2bdbcded5f9b": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": ["codex"] - } - } - }, - "38ce16e16515": { - "name": "ssh.connect#1", - "ordinal": 10, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "43ead075ce12": { - "agent": "claude", - "connecting": false, - "detected": ["codex"], - "setup": { - "command": "pnpm install", - "kind": "prompt", - "setupTrust": { - "contentHash": "hash-1", - "scriptContent": "pnpm install" - }, - "source": "repo" - }, - "ssh": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - }, - "80ffce5fa2b3": { - "name": "workspaceSshState", - "ordinal": 11, - "value": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - }, - "84149cfb1467": { - "name": "workspaceSshState", - "ordinal": 8, - "value": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connecting", - "targetId": "ssh-1" - } - }, - "9637248df9cb": { - "name": "workspaceDetectedAgentIds", - "ordinal": 3, - "value": { - "$rpc": "null" - } - }, - "a1f755a38636": { - "agent": "claude", - "connecting": false, - "detected": ["codex"], - "setup": "unresolved", - "ssh": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - }, - "a9ec92743b9e": { - "name": "workspaceAgentOverridden", - "ordinal": 2, - "value": false - }, - "bf0c0c00caf9": { - "name": "repo.hooks#1", - "ordinal": 14, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "d68ba9a6772a": { - "name": "workspaceSshConnecting", - "ordinal": 7, - "value": true - }, - "d760f20b60ad": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "e44d3b580ab0": { - "name": "workspaceSshConnecting", - "ordinal": 12, - "value": false - }, - "e65f26fdbe1a": { - "name": "repo.hooks#1", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "hooks": { - "scripts": { - "setup": " pnpm install " - } - }, - "setupRunPolicy": "ask", - "setupTrust": { - "contentHash": "hash-1", - "scriptContent": "pnpm install" - }, - "source": "repo" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "edf7372929cd": { - "name": "ssh.connect#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "ssh.connect" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 120000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "state": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "connected", - "targetId": "ssh-1" - } - } - } - } - } - }, - "recording": { - "scenario": "tw-workspace-ssh-connected", - "checkpoints": [ - { - "id": "agents-detected", - "observation": { - "sender": ["2bdbcded5f9b"], - "payloads": ["d760f20b60ad"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "18e6a3ac6471", - "effects": ["11405363c62d", "a9ec92743b9e", "9637248df9cb", "13e6d0c47ca4"] - } - }, - { - "id": "connected", - "observation": { - "sender": ["2bdbcded5f9b", "edf7372929cd"], - "payloads": ["d760f20b60ad", "38ce16e16515"], - "settlements": { - "mount": "eb79a9b3682a", - "connect": "eb79a9b3682a" - }, - "state": "a1f755a38636", - "effects": [ - "11405363c62d", - "a9ec92743b9e", - "9637248df9cb", - "13e6d0c47ca4", - "d68ba9a6772a", - "84149cfb1467", - "80ffce5fa2b3", - "e44d3b580ab0" - ] - } - }, - { - "id": "setup-prompted", - "observation": { - "sender": ["2bdbcded5f9b", "edf7372929cd", "e65f26fdbe1a"], - "payloads": ["d760f20b60ad", "38ce16e16515", "bf0c0c00caf9"], - "settlements": { - "mount": "eb79a9b3682a", - "connect": "eb79a9b3682a", - "setup": "0ba2cee4b538" - }, - "state": "43ead075ce12", - "effects": [ - "11405363c62d", - "a9ec92743b9e", - "9637248df9cb", - "13e6d0c47ca4", - "d68ba9a6772a", - "84149cfb1467", - "80ffce5fa2b3", - "e44d3b580ab0" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json deleted file mode 100644 index aac4dd49c3c..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-ssh-local", - "family": "tasks.workspace-ssh-local", - "namedDeltas": [], - "values": { - "057cfe2200b5": { - "name": "preflight.detectAgents#1", - "ordinal": 5, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectAgents\",\"params\":{\"repoId\":\"repo-1\"}}" - }, - "11405363c62d": { - "name": "workspaceAgent", - "ordinal": 1, - "value": "claude" - }, - "7400f4eebe66": { - "agent": "claude", - "connecting": false, - "detected": ["codex", "claude"], - "setup": "unresolved", - "ssh": { - "$rpc": "null" - } - }, - "9637248df9cb": { - "name": "workspaceDetectedAgentIds", - "ordinal": 3, - "value": { - "$rpc": "null" - } - }, - "a9ec92743b9e": { - "name": "workspaceAgentOverridden", - "ordinal": 2, - "value": false - }, - "d68cba3b57e1": { - "name": "workspaceDetectedAgentIds", - "ordinal": 6, - "value": ["codex", "claude"] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ebcf6c6d8d86": { - "name": "preflight.detectAgents#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "preflight.detectAgents" - }, - { - "name": "params", - "value": { - "repoId": "repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": ["codex", "claude"] - } - } - } - }, - "recording": { - "scenario": "tw-workspace-ssh-local-agents", - "checkpoints": [ - { - "id": "local-agents-detected", - "observation": { - "sender": ["ebcf6c6d8d86"], - "payloads": ["057cfe2200b5"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "7400f4eebe66", - "effects": ["11405363c62d", "a9ec92743b9e", "9637248df9cb", "d68cba3b57e1"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json deleted file mode 100644 index 0c68932630e..00000000000 --- a/mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.workspace-ssh", - "family": "tasks.workspace-ssh", - "namedDeltas": [], - "values": { - "0f1cf505ed63": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connect Repo before creating a workspace.", - "isRpcDeliveryUnknown": false - } - }, - "11405363c62d": { - "name": "workspaceAgent", - "ordinal": 1, - "value": "claude" - }, - "15c8b71a45de": { - "name": "ssh.getState#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "ssh.getState" - }, - { - "name": "params", - "value": { - "targetId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "state": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "disconnected", - "targetId": "ssh-1" - } - } - } - } - }, - "1712c415bebf": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "decision": "inherit", - "kind": "decision" - } - }, - "2b24e6370376": { - "name": "workspaceSshState", - "ordinal": 9, - "value": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "disconnected", - "targetId": "ssh-1" - } - }, - "630e2f27face": { - "name": "workspaceDetectedAgentIds", - "ordinal": 6, - "value": [] - }, - "891e3f4b7bc9": { - "name": "ssh.getState#1", - "ordinal": 8, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" - }, - "904676884ccd": { - "name": "repo.hooks#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "repo.hooks" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "hooks": { - "scripts": {} - } - } - } - } - }, - "9637248df9cb": { - "name": "workspaceDetectedAgentIds", - "ordinal": 3, - "value": { - "$rpc": "null" - } - }, - "9a9cd2877569": { - "agent": "claude", - "connecting": false, - "detected": [], - "setup": { - "decision": "inherit", - "kind": "decision" - }, - "ssh": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "disconnected", - "targetId": "ssh-1" - } - }, - "9cc26a1c5918": { - "name": "repo.hooks#1", - "ordinal": 11, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "a9ec92743b9e": { - "name": "workspaceAgentOverridden", - "ordinal": 2, - "value": false - }, - "bdabc93667d6": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "no access" - }, - "id": "frame-1", - "ok": false - } - } - }, - "d3698fc526a8": { - "agent": "claude", - "connecting": false, - "detected": [], - "setup": "unresolved", - "ssh": { - "error": { - "$rpc": "null" - }, - "reconnectAttempt": 0, - "status": "disconnected", - "targetId": "ssh-1" - } - }, - "d760f20b60ad": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tw-workspace-ssh-not-ready", - "checkpoints": [ - { - "id": "ensure-rejected", - "observation": { - "sender": ["bdabc93667d6", "15c8b71a45de"], - "payloads": ["d760f20b60ad", "891e3f4b7bc9"], - "settlements": { - "mount": "eb79a9b3682a", - "ensure": "0f1cf505ed63" - }, - "state": "d3698fc526a8", - "effects": [ - "11405363c62d", - "a9ec92743b9e", - "9637248df9cb", - "630e2f27face", - "2b24e6370376" - ] - } - }, - { - "id": "no-setup-script", - "observation": { - "sender": ["bdabc93667d6", "15c8b71a45de", "904676884ccd"], - "payloads": ["d760f20b60ad", "891e3f4b7bc9", "9cc26a1c5918"], - "settlements": { - "mount": "eb79a9b3682a", - "ensure": "0f1cf505ed63", - "setup": "1712c415bebf" - }, - "state": "9a9cd2877569", - "effects": [ - "11405363c62d", - "a9ec92743b9e", - "9637248df9cb", - "630e2f27face", - "2b24e6370376" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/worktree-catalog-snapshot-unreadable.json b/mobile/rpc-foundation/goldens/worktree-catalog-snapshot-unreadable.json deleted file mode 100644 index f3fa98ebc4c..00000000000 --- a/mobile/rpc-foundation/goldens/worktree-catalog-snapshot-unreadable.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "worktree.catalog-snapshot", - "family": "worktree.catalog-snapshot", - "namedDeltas": [], - "values": { - "253b98015b8d": { - "admitted": "unadmitted", - "fetched": "unfetched" - }, - "34fb08d01b03": { - "name": "worktree.ps#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "acceptRowDelta": true, - "afterSnapshotId": { - "$rpc": "null" - }, - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "7fb1c6f9f3ae": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "RpcIncompatibleReplyError", - "message": "The host sent a reply this app could not read (worktree.ps)", - "isRpcDeliveryUnknown": false, - "code": "incompatible_reply" - } - }, - "817623c64ce1": { - "name": "worktree.ps#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "acceptRowDelta": true, - "afterSnapshotId": { - "$rpc": "null" - }, - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true - } - } - }, - "922cb68379ac": { - "name": "worktree.ps#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"afterSnapshotId\":null,\"acceptRowDelta\":true,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - } - }, - "recording": { - "scenario": "worktree-catalog-snapshot-unreadable", - "checkpoints": [ - { - "id": "catalog-pending", - "observation": { - "sender": ["34fb08d01b03"], - "payloads": ["922cb68379ac"], - "settlements": { - "fetch": "9270aeb7d9c6" - }, - "state": "253b98015b8d", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["817623c64ce1"], - "payloads": ["922cb68379ac"], - "settlements": { - "fetch": "7fb1c6f9f3ae" - }, - "state": "253b98015b8d", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/worktree-catalog-snapshot.json b/mobile/rpc-foundation/goldens/worktree-catalog-snapshot.json deleted file mode 100644 index 57a3e0f2b19..00000000000 --- a/mobile/rpc-foundation/goldens/worktree-catalog-snapshot.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "worktree.catalog-snapshot", - "family": "worktree.catalog-snapshot", - "namedDeltas": [], - "values": { - "253b98015b8d": { - "admitted": "unadmitted", - "fetched": "unfetched" - }, - "34fb08d01b03": { - "name": "worktree.ps#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "acceptRowDelta": true, - "afterSnapshotId": { - "$rpc": "null" - }, - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "922cb68379ac": { - "name": "worktree.ps#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"afterSnapshotId\":null,\"acceptRowDelta\":true,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "976f56339476": { - "name": "worktree.ps#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "acceptRowDelta": true, - "afterSnapshotId": { - "$rpc": "null" - }, - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "snapshotId": "snapshot-1", - "worktrees": [ - { - "displayName": "One", - "repo": "Repo", - "worktreeId": "w-1" - } - ] - } - } - } - }, - "b0a047ec8551": { - "admitted": [ - { - "displayName": "One", - "repo": "Repo", - "worktreeId": "w-1" - } - ], - "fetched": { - "kind": "response", - "pending": { - "admission": { - "kind": "full", - "snapshotId": "snapshot-1", - "worktrees": [ - { - "displayName": "One", - "repo": "Repo", - "worktreeId": "w-1" - } - ] - }, - "client": "logical-client", - "hostId": "host-1", - "requestedSnapshotId": { - "$rpc": "null" - } - } - } - }, - "e160b2089696": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "kind": "response", - "pending": { - "admission": { - "kind": "full", - "snapshotId": "snapshot-1", - "worktrees": [ - { - "displayName": "One", - "repo": "Repo", - "worktreeId": "w-1" - } - ] - }, - "client": "logical-client", - "hostId": "host-1", - "requestedSnapshotId": { - "$rpc": "null" - } - } - } - } - }, - "recording": { - "scenario": "worktree-catalog-snapshot", - "checkpoints": [ - { - "id": "catalog-pending", - "observation": { - "sender": ["34fb08d01b03"], - "payloads": ["922cb68379ac"], - "settlements": { - "fetch": "9270aeb7d9c6" - }, - "state": "253b98015b8d", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["976f56339476"], - "payloads": ["922cb68379ac"], - "settlements": { - "fetch": "e160b2089696" - }, - "state": "b0a047ec8551", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/worktree-home-catalog.json b/mobile/rpc-foundation/goldens/worktree-home-catalog.json deleted file mode 100644 index 13a7dde432f..00000000000 --- a/mobile/rpc-foundation/goldens/worktree-home-catalog.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "worktree.home-catalog", - "family": "worktree.home-catalog", - "namedDeltas": [], - "values": { - "34fb08d01b03": { - "name": "worktree.ps#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "acceptRowDelta": true, - "afterSnapshotId": { - "$rpc": "null" - }, - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "44136fa355b3": {}, - "800962c868e7": { - "host-1": { - "activeCount": 2, - "agents": [], - "countsProvenAt": 1767225600000, - "hostId": "host-1", - "totalWorktrees": 2 - } - }, - "89066e878348": { - "name": "info", - "ordinal": 3, - "value": { - "host-1": { - "activeCount": 2, - "agents": [], - "countsProvenAt": 1767225600000, - "hostId": "host-1", - "totalWorktrees": 2 - } - } - }, - "922cb68379ac": { - "name": "worktree.ps#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.ps\",\"params\":{\"limit\":10000,\"afterSnapshotId\":null,\"acceptRowDelta\":true,\"supportsWorktreeVisibilitySourceDefaults\":true}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "e36f43e93321": { - "name": "worktree.ps#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.ps" - }, - { - "name": "params", - "value": { - "acceptRowDelta": true, - "afterSnapshotId": { - "$rpc": "null" - }, - "limit": 10000 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "worktrees": [ - { - "displayName": "One", - "repo": "Repo", - "status": "working", - "worktreeId": "w-1" - }, - { - "displayName": "Two", - "repo": "Repo", - "status": "idle", - "worktreeId": "w-2" - } - ] - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "worktree-home-catalog", - "checkpoints": [ - { - "id": "catalog-pending", - "observation": { - "sender": ["34fb08d01b03"], - "payloads": ["922cb68379ac"], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["e36f43e93321"], - "payloads": ["922cb68379ac"], - "settlements": { - "load": "eb79a9b3682a" - }, - "state": "800962c868e7", - "effects": ["89066e878348"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/worktree-retired-names.json b/mobile/rpc-foundation/goldens/worktree-retired-names.json deleted file mode 100644 index 98d6e137968..00000000000 --- a/mobile/rpc-foundation/goldens/worktree-retired-names.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "worktree.retired-names", - "family": "worktree.retired-names", - "namedDeltas": [], - "values": { - "3a6762b141aa": { - "name": "worktree.listRetiredNames#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.listRetiredNames\",\"params\":{\"repo\":\"id:repo-1\"}}" - }, - "840eaac5b440": { - "name": "worktree.listRetiredNames#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.listRetiredNames" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "85d826c606ff": { - "registry": { - "exhaustedTiers": 2, - "names": ["marlin", "orca"] - } - }, - "97b3650e7890": { - "name": "worktree.listRetiredNames#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.listRetiredNames" - }, - { - "name": "params", - "value": { - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "retiredNameTiersByRepo": { - "repo-1": 2 - }, - "retiredNamesByRepo": { - "repo-1": ["marlin", "orca"] - } - } - } - } - }, - "cb76d0017b96": { - "registry": { - "exhaustedTiers": 0, - "names": [] - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "worktree-retired-names", - "checkpoints": [ - { - "id": "names-pending", - "observation": { - "sender": ["840eaac5b440"], - "payloads": ["3a6762b141aa"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "cb76d0017b96", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["97b3650e7890"], - "payloads": ["3a6762b141aa"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "85d826c606ff", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/pilot-scenarios.json b/mobile/rpc-foundation/pilot-scenarios.json index 1f18b79c407..a6f94aa4050 100644 --- a/mobile/rpc-foundation/pilot-scenarios.json +++ b/mobile/rpc-foundation/pilot-scenarios.json @@ -149,45 +149,6 @@ } ] }, - { - "id": "b2", - "operation": "project.update-metadata", - "family": "project-explicit-false", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-metadata-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "submit", - "id": "submit" - }, - { - "checkpoint": "pending" - }, - { - "complete": "github.project.updateIssueBySlug#1", - "params": { - "owner": "owner", - "repo": "repo", - "host": "github.enterprise.test", - "number": 1, - "updates": { - "addLabels": ["recorded"] - } - }, - "reply": { - "ok": true, - "result": null - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "b3", "operation": "linear.issue-detail", @@ -296,42 +257,6 @@ } ] }, - { - "id": "settings-task-write", - "operation": "settings.task-preferences", - "family": "settings-best-effort", - "sites": ["mobile/src/tasks/screen-state/use-mobile-tasks-client-settings-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "write", - "id": "write", - "args": { - "preset": "my-issues" - } - }, - { - "checkpoint": "optimistic" - }, - { - "complete": "settings.update#1", - "params": { - "defaultTaskViewPreset": "my-issues" - }, - "reject": { - "message": "write disconnected", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "settings-bot-overrides-fulfilled", "operation": "settings.bot-overrides", @@ -878,290 +803,6 @@ } ] }, - { - "id": "settings-repo-metadata-icons", - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "sites": ["mobile/src/host-screen/catalog/use-host-repo-metadata.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load" - }, - { - "complete": "repo.list#1", - "params": { - "afterSnapshotId": null - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "displayName": "Lucide", - "badgeColor": "#123456", - "repoIcon": { - "type": "lucide", - "name": "Rocket" - }, - "connectionId": null - }, - { - "id": "repo-2", - "displayName": "Emoji", - "repoIcon": { - "type": "emoji", - "emoji": "🐳" - }, - "connectionId": "ssh-1" - }, - { - "id": "repo-3", - "displayName": "Avatar", - "repoIcon": { - "type": "image", - "src": "https://github.com/acme.png?size=64", - "source": "github", - "label": "acme/orca" - }, - "executionHostId": "ssh:ssh-1" - } - ] - } - } - }, - { - "complete": "ssh.listTargetSummaries#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [], - "hostSettingOverrides": {} - } - } - } - }, - { - "complete": "host.platform#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "platform": "darwin" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-repo-metadata-refused", - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "sites": ["mobile/src/host-screen/catalog/use-host-repo-metadata.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load" - }, - { - "complete": "repo.list#1", - "params": { - "afterSnapshotId": null - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "displayName": "Local", - "connectionId": null - }, - { - "id": "repo-2", - "displayName": "Remote", - "connectionId": "ssh-1" - } - ] - } - } - }, - { - "complete": "ssh.listTargetSummaries#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "complete": "host.platform#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "platform": "linux" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-repo-metadata-transport-error", - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "sites": ["mobile/src/host-screen/catalog/use-host-repo-metadata.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load" - }, - { - "complete": "repo.list#1", - "params": { - "afterSnapshotId": null - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "displayName": "Local", - "connectionId": null - }, - { - "id": "repo-2", - "displayName": "Remote", - "connectionId": "ssh-1" - } - ] - } - } - }, - { - "complete": "ssh.listTargetSummaries#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reject": { - "message": "settings disconnected", - "deliveryUnknown": true - } - }, - { - "complete": "host.platform#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "platform": "linux" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "settings-task-hydration-fulfilled", "operation": "settings.task-hydration", @@ -1261,100 +902,6 @@ } ] }, - { - "id": "settings-task-hydration-refused", - "operation": "settings.task-hydration", - "family": "settings.task-hydration", - "sites": ["mobile/src/tasks/screen-state/use-mobile-tasks-runtime-hydration.tsx"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1"] - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "complete": "ui.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "ui": {} - } - } - }, - { - "complete": "preflight.check#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "glab": { - "installed": false - } - } - } - }, - { - "complete": "linear.status#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "connected": false - } - } - }, - { - "complete": "jira.status#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "connected": false - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "settings-task-hydration-transport-error", "operation": "settings.task-hydration", @@ -2434,177 +1981,6 @@ } ] }, - { - "id": "settings-repo-metadata-refuse-after-data", - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "sites": ["mobile/src/host-screen/catalog/use-host-repo-metadata.ts"], - "schedules": ["success-then-refused"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load" - }, - { - "complete": "repo.list#1", - "params": { - "afterSnapshotId": null - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "displayName": "Local", - "connectionId": null - }, - { - "id": "repo-2", - "displayName": "Remote", - "connectionId": "ssh-1" - } - ] - } - } - }, - { - "complete": "ssh.listTargetSummaries#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "disabledTuiAgents": ["claude"], - "defaultTuiAgent": "codex", - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"], - "hostSettingOverrides": {} - } - } - } - }, - { - "complete": "host.platform#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "platform": "linux" - } - } - }, - { - "checkpoint": "settled" - }, - { - "checkpoint": "data-present" - }, - { - "action": "load", - "id": "reload" - }, - { - "checkpoint": "refresh-pending" - }, - { - "complete": "repo.list#2", - "params": { - "afterSnapshotId": null - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "displayName": "Local", - "connectionId": null - }, - { - "id": "repo-2", - "displayName": "Remote", - "connectionId": "ssh-1" - } - ] - } - } - }, - { - "complete": "ssh.listTargetSummaries#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - }, - { - "complete": "settings.get#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "complete": "host.platform#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "platform": "linux" - } - } - }, - { - "checkpoint": "refused-after-data" - } - ] - }, { "id": "settings-task-hydration-refuse-after-data", "operation": "settings.task-hydration", @@ -4894,1025 +4270,6 @@ } ] }, - { - "id": "tw-setup-hook-trust-approved", - "operation": "tasks.setup-hook-trust", - "family": "worktree.setup-hook-trust", - "sites": ["mobile/src/new-workspace/creation/setup-hook-trust.ts"], - "schedules": [], - "steps": [ - { - "action": "approve", - "id": "approve" - }, - { - "complete": "ui.set#1", - "params": { - "trustedOrcaHooks": { - "repo-1": { - "setup": { - "contentHash": "hash-1", - "approvedAt": 1767225600000 - } - } - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "approved" - } - ] - }, - { - "id": "tw-setup-hook-trust-always", - "operation": "tasks.setup-hook-trust", - "family": "worktree.setup-hook-trust", - "sites": ["mobile/src/new-workspace/creation/setup-hook-trust.ts"], - "schedules": [], - "steps": [ - { - "action": "approve", - "id": "approve", - "args": { - "always": true - } - }, - { - "complete": "ui.set#1", - "params": { - "trustedOrcaHooks": { - "repo-1": { - "setup": { - "contentHash": "hash-1", - "approvedAt": 1767225600000 - }, - "all": { - "approvedAt": 1767225600000 - } - } - } - }, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "" - } - } - }, - { - "checkpoint": "refused-empty-message" - } - ] - }, - { - "id": "tw-smart-search-all-providers", - "operation": "tasks.smart-source-search", - "family": "tasks.smart-source-search", - "sites": ["mobile/src/new-workspace/source-selection/smart-source-search-requests.ts"], - "schedules": [], - "steps": [ - { - "action": "github", - "id": "github" - }, - { - "complete": "github.listWorkItems#1", - "params": { - "repo": "id:repo-1", - "limit": 36, - "query": "bug" - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "issue:1", - "type": "issue", - "number": 1, - "title": "one", - "state": "open", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - ] - } - } - }, - { - "checkpoint": "github-items" - }, - { - "action": "gitlab", - "id": "gitlab" - }, - { - "complete": "gitlab.listWorkItems#1", - "params": { - "repo": "id:repo-1", - "state": "opened", - "page": 1, - "perPage": 50, - "query": "bug" - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "issue:2", - "type": "issue", - "number": 2, - "title": "two", - "state": "opened", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - ], - "error": { - "type": "not_found", - "message": "missing" - } - } - } - }, - { - "checkpoint": "gitlab-items" - }, - { - "action": "linear", - "id": "linear" - }, - { - "complete": "linear.searchIssues#1", - "params": { - "query": "bug", - "limit": 50, - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "issue-1", - "identifier": "ENG-1", - "title": "A searched issue", - "url": "", - "state": { - "name": "Todo", - "type": "unstarted", - "color": "#000" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "labels": [], - "priority": 0, - "updatedAt": "2020-01-01T00:00:00.000Z", - "workspaceId": "linear-workspace" - } - ] - } - } - }, - { - "checkpoint": "linear-search" - }, - { - "action": "branches", - "id": "branches" - }, - { - "complete": "repo.searchRefs#1", - "params": { - "repo": "id:repo-1", - "query": "bug", - "limit": 20 - }, - "reply": { - "ok": true, - "result": { - "refs": ["main", "release"] - } - } - }, - { - "checkpoint": "branch-refs" - }, - { - "action": "linear", - "id": "linear-assigned", - "args": { - "query": " ", - "workspace": null - } - }, - { - "complete": "linear.listIssues#1", - "params": { - "filter": "assigned", - "limit": 50, - "workspaceId": { - "$undefined": true - } - }, - "reply": { - "ok": true, - "result": [ - { - "id": "issue-3", - "identifier": "ENG-3", - "title": "An assigned issue", - "url": "", - "state": { - "name": "In Progress", - "type": "started", - "color": "#111" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "labels": [], - "priority": 2, - "updatedAt": "2020-01-02T00:00:00.000Z", - "workspaceId": "linear-workspace" - } - ] - } - }, - { - "checkpoint": "linear-assigned-listed" - } - ] - }, - { - "id": "tw-smart-search-linear-listed", - "operation": "tasks.smart-source-search", - "family": "tasks.smart-source-search", - "sites": ["mobile/src/new-workspace/source-selection/smart-source-search-requests.ts"], - "schedules": [], - "steps": [ - { - "action": "linear", - "id": "linear", - "args": { - "query": " ", - "workspace": null - } - }, - { - "complete": "linear.listIssues#1", - "params": { - "filter": "assigned", - "limit": 50, - "workspaceId": { - "$undefined": true - } - }, - "reply": { - "ok": true, - "result": [ - { - "id": "issue-2", - "identifier": "ENG-2", - "title": "An assigned issue", - "url": "", - "state": { - "name": "Todo", - "type": "unstarted", - "color": "#000" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "labels": [], - "priority": 0, - "updatedAt": "2020-01-01T00:00:00.000Z", - "workspaceId": "linear-workspace" - } - ] - } - }, - { - "checkpoint": "linear-assigned" - } - ] - }, - { - "id": "tw-smart-search-gitlab-provider-error", - "operation": "tasks.smart-source-search", - "family": "tasks.smart-source-search", - "sites": ["mobile/src/new-workspace/source-selection/smart-source-search-requests.ts"], - "schedules": [], - "steps": [ - { - "action": "gitlab", - "id": "gitlab" - }, - { - "complete": "gitlab.listWorkItems#1", - "params": { - "repo": "id:repo-1", - "state": "opened", - "page": 1, - "perPage": 50, - "query": "bug" - }, - "reply": { - "ok": true, - "result": { - "items": [], - "error": { - "type": "quota", - "message": "rate limited" - } - } - } - }, - { - "checkpoint": "in-band-provider-error" - }, - { - "action": "branches", - "id": "branches", - "args": { - "query": " main " - } - }, - { - "complete": "repo.searchRefs#1", - "params": { - "repo": "id:repo-1", - "query": "main", - "limit": 20 - }, - "reply": { - "ok": true, - "result": { - "refDetails": [ - { - "refName": "origin/main", - "localBranchName": "main" - } - ] - } - } - }, - { - "checkpoint": "branch-ref-details" - } - ] - }, - { - "id": "tw-paste-lookup-resolved", - "operation": "tasks.paste-lookup", - "family": "tasks.paste-lookup", - "sites": ["mobile/src/new-workspace/source-selection/smart-source-paste-intent.ts"], - "schedules": [], - "steps": [ - { - "action": "by-number", - "id": "by-number" - }, - { - "complete": "github.workItem#1", - "params": { - "repo": "id:repo-1", - "number": 12 - }, - "reply": { - "ok": true, - "result": { - "id": "issue:12", - "type": "issue", - "number": 12, - "title": "twelve", - "state": "open", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - } - }, - { - "checkpoint": "by-number" - }, - { - "action": "by-slug", - "id": "by-slug" - }, - { - "complete": "github.workItemByOwnerRepo#1", - "params": { - "repo": "id:repo-1", - "owner": "owner", - "ownerRepo": "repo", - "number": 12, - "type": "issue" - }, - "reply": { - "ok": true, - "result": { - "id": "issue:12", - "type": "issue", - "number": 12, - "title": "twelve", - "state": "open", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - } - }, - { - "checkpoint": "by-slug" - }, - { - "action": "gitlab-path", - "id": "gitlab-path" - }, - { - "complete": "gitlab.workItemByPath#1", - "params": { - "repo": "id:repo-1", - "host": "gitlab.com", - "path": "group/project", - "iid": 7, - "type": "issue" - }, - "reply": { - "ok": true, - "result": { - "id": "issue:7", - "type": "issue", - "number": 7, - "title": "seven", - "state": "opened", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - } - }, - { - "checkpoint": "gitlab-path" - }, - { - "action": "repo-slug", - "id": "repo-slug" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - }, - { - "checkpoint": "repo-slug-matched" - } - ] - }, - { - "id": "tw-paste-lookup-slug-unsupported", - "operation": "tasks.paste-lookup", - "family": "tasks.paste-lookup", - "sites": ["mobile/src/new-workspace/source-selection/smart-source-paste-intent.ts"], - "schedules": [], - "steps": [ - { - "action": "repo-slug", - "id": "repo-slug" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method" - } - } - }, - { - "checkpoint": "host-wide-probe-cached" - }, - { - "action": "repo-slug-again", - "id": "repo-slug-again" - }, - { - "checkpoint": "no-second-probe" - } - ] - }, - { - "id": "tw-paste-lookup-slug-refused", - "operation": "tasks.paste-lookup", - "family": "tasks.paste-lookup", - "sites": ["mobile/src/new-workspace/source-selection/smart-source-paste-intent.ts"], - "schedules": [], - "steps": [ - { - "action": "repo-slug", - "id": "repo-slug" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "no access" - } - } - }, - { - "complete": "github.repoSlug#2", - "params": { - "repo": "id:repo-2" - }, - "reply": { - "ok": true, - "result": null - } - }, - { - "checkpoint": "refusal-is-per-repo" - } - ] - }, - { - "id": "tw-workspace-source-presets", - "operation": "tasks.workspace-source", - "family": "tasks.workspace-source", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-source-effects.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "repo.sparsePresets#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "presets": [ - { - "id": "p1", - "name": "docs", - "directories": ["docs"] - } - ] - } - } - }, - { - "checkpoint": "presets-loaded" - }, - { - "action": "branch-query", - "id": "branch-query" - }, - { - "complete": "repo.searchRefs#1", - "params": { - "repo": "id:repo-1", - "query": "main", - "limit": 20 - }, - "reply": { - "ok": true, - "result": { - "refs": ["main"] - } - } - }, - { - "checkpoint": "branches-loaded" - } - ] - }, - { - "id": "tw-workspace-source-presets-refused", - "operation": "tasks.workspace-source", - "family": "tasks.workspace-source", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-source-effects.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "repo.sparsePresets#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "" - } - } - }, - { - "checkpoint": "presets-refused-empty-message" - } - ] - }, - { - "id": "tw-workspace-sparse-saved", - "operation": "tasks.workspace-sparse", - "family": "tasks.workspace-sparse", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-sparse-actions.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "ssh.getState#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": true, - "result": { - "state": { - "targetId": "ssh-1", - "status": "connected", - "error": null, - "reconnectAttempt": 0 - } - } - } - }, - { - "checkpoint": "ssh-state-read" - }, - { - "action": "save-preset", - "id": "save" - }, - { - "complete": "repo.saveSparsePreset#1", - "params": { - "repo": "id:repo-1", - "name": "docs", - "directories": ["docs"] - }, - "reply": { - "ok": true, - "result": { - "preset": { - "id": "p1", - "name": "docs", - "directories": ["docs"] - } - } - } - }, - { - "checkpoint": "preset-saved" - } - ] - }, - { - "id": "tw-workspace-sparse-missing-preset", - "operation": "tasks.workspace-sparse", - "family": "tasks.workspace-sparse", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-sparse-actions.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "ssh.getState#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "" - } - } - }, - { - "action": "save-preset", - "id": "save" - }, - { - "complete": "repo.saveSparsePreset#1", - "params": { - "repo": "id:repo-1", - "name": "docs", - "directories": ["docs"] - }, - "reply": { - "ok": true, - "result": {} - } - }, - { - "checkpoint": "saved-without-preset" - } - ] - }, - { - "id": "tw-workspace-ssh-connected", - "operation": "tasks.workspace-ssh", - "family": "tasks.workspace-ssh", - "sites": ["mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-ssh-state.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "preflight.detectRemoteAgents#1", - "params": { - "connectionId": "ssh-1" - }, - "reply": { - "ok": true, - "result": ["codex"] - } - }, - { - "checkpoint": "agents-detected" - }, - { - "action": "connect", - "id": "connect" - }, - { - "complete": "ssh.connect#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": true, - "result": { - "state": { - "targetId": "ssh-1", - "status": "connected", - "error": null, - "reconnectAttempt": 0 - } - } - } - }, - { - "checkpoint": "connected" - }, - { - "action": "resolve-setup", - "id": "setup" - }, - { - "complete": "repo.hooks#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "hooks": { - "scripts": { - "setup": " pnpm install " - } - }, - "setupRunPolicy": "ask", - "source": "repo", - "setupTrust": { - "contentHash": "hash-1", - "scriptContent": "pnpm install" - } - } - } - }, - { - "checkpoint": "setup-prompted" - } - ] - }, - { - "id": "tw-workspace-ssh-not-ready", - "operation": "tasks.workspace-ssh", - "family": "tasks.workspace-ssh", - "sites": ["mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-ssh-state.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "preflight.detectRemoteAgents#1", - "params": { - "connectionId": "ssh-1" - }, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "no access" - } - } - }, - { - "action": "ensure-ready", - "id": "ensure" - }, - { - "complete": "ssh.getState#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": true, - "result": { - "state": { - "targetId": "ssh-1", - "status": "disconnected", - "error": null, - "reconnectAttempt": 0 - } - } - } - }, - { - "checkpoint": "ensure-rejected" - }, - { - "action": "resolve-setup", - "id": "setup" - }, - { - "complete": "repo.hooks#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "hooks": { - "scripts": {} - } - } - } - }, - { - "checkpoint": "no-setup-script" - } - ] - }, - { - "id": "tw-workspace-ssh-connect-refused", - "operation": "tasks.workspace-ssh", - "family": "tasks.workspace-ssh", - "sites": ["mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-ssh-state.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "preflight.detectRemoteAgents#1", - "params": { - "connectionId": "ssh-1" - }, - "reject": { - "message": "Connection lost", - "deliveryUnknown": true - } - }, - { - "action": "connect", - "id": "connect" - }, - { - "complete": "ssh.connect#1", - "params": { - "targetId": "ssh-1" - }, - "reply": { - "ok": false, - "error": { - "code": "ssh_failed", - "message": "" - } - } - }, - { - "checkpoint": "connect-refused-empty-message" - }, - { - "action": "resolve-setup", - "id": "setup" - }, - { - "complete": "repo.hooks#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "hooks": { - "scripts": { - "setup": "pnpm i" - } - }, - "setupRunPolicy": "never" - } - } - }, - { - "checkpoint": "setup-skipped" - } - ] - }, - { - "id": "tw-workspace-ssh-local-agents", - "operation": "tasks.workspace-ssh-local", - "family": "tasks.workspace-ssh-local", - "sites": ["mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-ssh-state.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "preflight.detectAgents#1", - "params": { - "repoId": "repo-1" - }, - "reply": { - "ok": true, - "result": ["codex", "claude"] - } - }, - { - "checkpoint": "local-agents-detected" - } - ] - }, { "id": "tw-task-preferences-resume-write", "operation": "settings.task-preferences", @@ -6049,161 +4406,6 @@ } ] }, - { - "id": "worktree-home-catalog", - "operation": "worktree.home-catalog", - "family": "worktree.home-catalog", - "sites": ["mobile/src/worktree/home-host-worktree-fetch.ts"], - "schedules": [], - "steps": [ - { - "action": "load", - "id": "load" - }, - { - "checkpoint": "catalog-pending" - }, - { - "complete": "worktree.ps#1", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true, - "afterSnapshotId": null, - "acceptRowDelta": true - }, - "reply": { - "ok": true, - "result": { - "worktrees": [ - { - "worktreeId": "w-1", - "displayName": "One", - "repo": "Repo", - "status": "working" - }, - { - "worktreeId": "w-2", - "displayName": "Two", - "repo": "Repo", - "status": "idle" - } - ] - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "worktree-catalog-snapshot", - "operation": "worktree.catalog-snapshot", - "family": "worktree.catalog-snapshot", - "sites": ["mobile/src/worktree/worktree-catalog-snapshot-client.ts"], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "checkpoint": "catalog-pending" - }, - { - "complete": "worktree.ps#1", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true, - "afterSnapshotId": null, - "acceptRowDelta": true - }, - "reply": { - "ok": true, - "result": { - "snapshotId": "snapshot-1", - "worktrees": [ - { - "worktreeId": "w-1", - "displayName": "One", - "repo": "Repo" - } - ] - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "worktree-catalog-snapshot-unreadable", - "operation": "worktree.catalog-snapshot", - "family": "worktree.catalog-snapshot", - "sites": ["mobile/src/worktree/worktree-catalog-snapshot-client.ts"], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "checkpoint": "catalog-pending" - }, - { - "complete": "worktree.ps#1", - "params": { - "limit": 10000, - "supportsWorktreeVisibilitySourceDefaults": true, - "afterSnapshotId": null, - "acceptRowDelta": true - }, - "reply": { - "ok": true - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "worktree-retired-names", - "operation": "worktree.retired-names", - "family": "worktree.retired-names", - "sites": ["mobile/src/worktree/use-retired-worktree-names.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "names-pending" - }, - { - "complete": "worktree.listRetiredNames#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "retiredNamesByRepo": { - "repo-1": ["marlin", "orca"] - }, - "retiredNameTiersByRepo": { - "repo-1": 2 - } - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "host-worktree-delete-archive-hook-failed", "operation": "host.worktree-actions", @@ -9881,97 +8083,6 @@ } ] }, - { - "id": "relay-rotation-installs-and-commits", - "operation": "relay.credential-rotation", - "family": "relay.credential-rotation", - "sites": ["mobile/src/transport/relay/mobile-relay-credential-rotation.ts"], - "schedules": [], - "steps": [ - { - "action": "rotate", - "id": "rotate" - }, - { - "complete": "pairing.getEndpoints#1", - "params": { - "installReqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "relay": { - "v": 1, - "directorUrl": "https://director.example", - "cellUrl": "https://cell.example", - "assignmentEpoch": 1, - "relayHostId": "relay-host-0001x", - "e2eeFraming": 2 - }, - "installStatus": { - "v": 1, - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "state": "not-found" - } - } - } - }, - { - "complete": "pairing.provisionRelay#1", - "params": { - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "newResumeTokenHash": "yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU", - "expectedCurrentHash": "r_9byaBlTZTXS3aLLlWTKwss-nmx4vGRrjKskxWyP30" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - }, - { - "complete": "pairing.getEndpoints#2", - "params": { - "installReqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "relay": { - "v": 1, - "directorUrl": "https://director.example", - "cellUrl": "https://cell.example", - "assignmentEpoch": 1, - "relayHostId": "relay-host-0001x", - "e2eeFraming": 2 - }, - "installStatus": { - "v": 1, - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "state": "committed", - "result": { - "v": 1, - "reqId": "rotate-VftjjHf-4Lb1-Sdfryl-LA", - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - } - } - }, - { - "checkpoint": "credential-rotated" - } - ] - }, { "id": "relay-rotation-resumes-committed-pending", "operation": "relay.credential-rotation", @@ -10024,180 +8135,6 @@ } ] }, - { - "id": "relay-direct-upgrade-commits", - "operation": "relay.direct-upgrade", - "family": "relay.direct-upgrade", - "sites": ["mobile/src/transport/relay/mobile-relay-direct-upgrade.ts"], - "schedules": [], - "steps": [ - { - "action": "upgrade", - "id": "upgrade", - "args": { - "journal": true - } - }, - { - "complete": "pairing.getEndpoints#1", - "params": { - "installReqId": "install-fixture-1" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "relay": { - "v": 1, - "directorUrl": "https://director.example", - "cellUrl": "https://cell.example", - "assignmentEpoch": 1, - "relayHostId": "relay-host-0001x", - "e2eeFraming": 2 - }, - "installStatus": { - "v": 1, - "reqId": "install-fixture-1", - "state": "not-found" - } - } - } - }, - { - "complete": "pairing.provisionRelay#1", - "params": { - "reqId": "install-fixture-1", - "newResumeTokenHash": "7ehR_WuQWkxwOFJdkHfI5jEg4DeVYWImtDuip60LHK4" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "reqId": "install-fixture-1", - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - }, - { - "complete": "pairing.getEndpoints#2", - "params": { - "installReqId": "install-fixture-1" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "relay": { - "v": 1, - "directorUrl": "https://director.example", - "cellUrl": "https://cell.example", - "assignmentEpoch": 1, - "relayHostId": "relay-host-0001x", - "e2eeFraming": 2 - }, - "installStatus": { - "v": 1, - "reqId": "install-fixture-1", - "state": "committed", - "result": { - "v": 1, - "reqId": "install-fixture-1", - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - } - } - }, - { - "checkpoint": "direct-upgrade-committed" - } - ] - }, - { - "id": "relay-direct-upgrade-unsupported-host-declines", - "operation": "relay.direct-upgrade", - "family": "relay.direct-upgrade", - "sites": ["mobile/src/transport/relay/mobile-relay-direct-upgrade.ts"], - "schedules": [], - "steps": [ - { - "action": "upgrade", - "id": "upgrade", - "args": { - "journal": true - } - }, - { - "complete": "pairing.getEndpoints#1", - "params": { - "installReqId": "install-fixture-1" - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method" - } - } - }, - { - "checkpoint": "upgrade-declined" - } - ] - }, - { - "id": "relay-pairing-recovery-resume-committed", - "operation": "relay.pairing-recovery", - "family": "relay.pairing-recovery", - "sites": ["mobile/src/pairing/mobile-relay-pairing-recovery.ts"], - "schedules": [], - "steps": [ - { - "action": "recover", - "id": "recover" - }, - { - "complete": "pairing.getEndpoints#1", - "params": { - "installReqId": "install-fixture-1", - "resumeConfirmReqId": "confirm-fixture-1" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "relay": { - "v": 1, - "directorUrl": "https://director.example", - "cellUrl": "https://cell.example", - "assignmentEpoch": 1, - "relayHostId": "relay-host-0001x", - "e2eeFraming": 2 - }, - "installStatus": { - "v": 1, - "reqId": "install-fixture-1", - "state": "committed", - "result": { - "v": 1, - "reqId": "install-fixture-1", - "authorizationMode": "relay-basis", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - } - } - }, - { - "checkpoint": "recovered-on-resume" - } - ] - }, { "id": "relay-pairing-recovery-invite-authorizes", "operation": "relay.pairing-recovery", @@ -10314,112 +8251,6 @@ } ] }, - { - "id": "pairing-pre-profile-direct-wins-and-provisions", - "operation": "pairing.pre-profile", - "family": "pairing.pre-profile", - "sites": [ - "mobile/src/pairing/pre-profile-pairing-coordinator.ts", - "mobile/src/pairing/pairing-candidate-race.ts" - ], - "schedules": [], - "steps": [ - { - "action": "pair", - "id": "pair" - }, - { - "bind": "direct-status", - "request": "status.get#1", - "params": { - "$undefined": true - } - }, - { - "bind": "relay-status", - "request": "status.get#2", - "params": { - "$undefined": true - } - }, - { - "complete": "direct-status", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": [] - } - } - }, - { - "complete": "relay-status", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": [] - } - } - }, - { - "complete": "pairing.provisionRelay#1", - "params": { - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "newResumeTokenHash": "yrnYzw4B0YZ_R6Tcm4arO3oysaG7lsPjvyp4uWmdBtU" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - }, - { - "complete": "pairing.getEndpoints#1", - "params": { - "installReqId": "install-l99UBPM71AZiC1ghz2glnA" - }, - "reply": { - "ok": true, - "result": { - "v": 1, - "relay": { - "v": 1, - "directorUrl": "https://director.example", - "cellUrl": "https://cell.example", - "assignmentEpoch": 1, - "relayHostId": "relay-host-0001x", - "e2eeFraming": 2 - }, - "installStatus": { - "v": 1, - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "state": "committed", - "result": { - "v": 1, - "reqId": "install-l99UBPM71AZiC1ghz2glnA", - "authorizationMode": "authenticated-direct", - "currentVersion": 4, - "resumeExpiresAt": 1767830400000 - } - } - } - } - }, - { - "checkpoint": "paired-over-direct" - } - ] - }, { "id": "pairing-pre-profile-provision-unsupported-saves-direct-host", "operation": "pairing.pre-profile", @@ -10491,34 +8322,6 @@ } ] }, - { - "id": "pairing-pre-profile-times-out", - "operation": "pairing.pre-profile", - "family": "pairing.pre-profile", - "sites": [ - "mobile/src/pairing/pre-profile-pairing-coordinator.ts", - "mobile/src/pairing/pairing-candidate-race.ts" - ], - "schedules": [], - "steps": [ - { - "action": "pair", - "id": "pair", - "args": { - "timeoutMs": 5000 - } - }, - { - "checkpoint": "racing" - }, - { - "advance": 5000 - }, - { - "checkpoint": "timed-out" - } - ] - }, { "id": "transport-capability-probe-cutover-reasks-fast", "operation": "transport.capability-probe", @@ -11015,399 +8818,6 @@ } ] }, - { - "id": "tk-linear-team-context", - "operation": "tasks.linear-team-context", - "family": "tasks.linear-team-context", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-list-and-detail-effects.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "open-composer", - "id": "open-composer-0" - }, - { - "complete": "linear.listTeams#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - } - }, - { - "checkpoint": "open-composer-settled" - }, - { - "action": "select-metadata-item", - "id": "select-metadata-item-1" - }, - { - "complete": "linear.teamStates#1", - "params": { - "teamId": "team-1", - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": [ - { - "id": "state-1", - "name": "Todo", - "type": "unstarted", - "color": "#000000" - } - ] - } - }, - { - "checkpoint": "select-metadata-item-settled" - } - ] - }, - { - "id": "tk-provider-load", - "operation": "tasks.provider-load", - "family": "tasks.provider-load", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-provider-load-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "linear-context", - "id": "linear-context-0" - }, - { - "complete": "linear.status#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "connected": true, - "workspaces": [ - { - "id": "linear-workspace", - "name": "Workspace" - } - ], - "selectedWorkspaceId": "linear-workspace" - } - } - }, - { - "complete": "linear.listTeams#1", - "params": { - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": [ - { - "id": "team-1", - "key": "ENG", - "name": "Engineering", - "workspaceId": "linear-workspace" - } - ] - } - }, - { - "checkpoint": "linear-context-settled" - }, - { - "action": "persist-teams", - "id": "persist-teams-1" - }, - { - "complete": "settings.update#1", - "params": { - "defaultLinearTeamSelection": ["team-1"] - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "persist-teams-settled" - }, - { - "action": "github-page", - "id": "github-page-2" - }, - { - "complete": "github.listWorkItems#1", - "params": { - "limit": 36, - "page": 1, - "query": "is:issue bug", - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "issue:9", - "type": "issue", - "number": 9, - "title": "An issue", - "state": "open", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - ], - "sources": { - "issues": "upstream" - } - } - } - }, - { - "checkpoint": "github-page-settled" - }, - { - "action": "github-count", - "id": "github-count-3" - }, - { - "complete": "github.countWorkItems#1", - "params": { - "query": "is:issue bug", - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": 4 - } - }, - { - "checkpoint": "github-count-settled" - } - ] - }, - { - "id": "tk-list-gitlab-todos", - "operation": "tasks.task-list-gitlab-todos", - "family": "tasks.task-list-gitlab-todos", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-list-loading.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load-0" - }, - { - "complete": "gitlab.todos#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": [ - { - "id": 1, - "actionName": "review_requested", - "targetType": "Issue", - "targetIid": 4, - "targetTitle": "A GitLab todo", - "targetUrl": "https://gitlab.example.com/group/project/-/issues/4", - "projectPath": "group/project", - "authorUsername": "octocat", - "authorAvatarUrl": "", - "updatedAt": "2020-01-01T00:00:00.000Z", - "state": "pending" - } - ] - } - }, - { - "checkpoint": "load-settled" - } - ] - }, - { - "id": "tk-list-gitlab-items", - "operation": "tasks.task-list-gitlab-items", - "family": "tasks.task-list-gitlab-items", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-list-loading.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load-0" - }, - { - "complete": "gitlab.listWorkItems#1", - "params": { - "page": 1, - "perPage": 50, - "query": { - "$undefined": true - }, - "repo": "id:repo-1", - "state": "opened" - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "issue:4", - "type": "issue", - "number": 4, - "title": "A GitLab issue", - "state": "opened", - "url": "", - "labels": [], - "updatedAt": "2020-01-01T00:00:00.000Z", - "author": null - } - ] - } - } - }, - { - "checkpoint": "load-settled" - } - ] - }, - { - "id": "tk-list-linear", - "operation": "tasks.task-list-linear", - "family": "tasks.task-list-linear", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-list-loading.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "load", - "id": "load-0" - }, - { - "complete": "linear.listIssues#1", - "params": { - "filter": "all", - "limit": 50, - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "issue-1", - "identifier": "ENG-1", - "title": "A Linear issue", - "url": "", - "description": "", - "state": { - "name": "Todo", - "type": "unstarted", - "color": "#000" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "labels": [], - "priority": 0, - "updatedAt": "2020-01-01T00:00:00.000Z", - "workspaceId": "linear-workspace" - } - ] - } - } - }, - { - "checkpoint": "load-settled" - }, - { - "action": "set-query", - "id": "set-query-1", - "args": { - "query": "bug" - } - }, - { - "checkpoint": "set-query-done" - }, - { - "action": "load", - "id": "load-2" - }, - { - "complete": "linear.searchIssues#1", - "params": { - "limit": 50, - "query": "bug", - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": [ - { - "id": "issue-2", - "identifier": "ENG-2", - "title": "A found issue", - "url": "", - "description": "", - "state": { - "name": "Todo", - "type": "unstarted", - "color": "#000" - }, - "team": { - "id": "team-1", - "key": "ENG", - "name": "Engineering" - }, - "labels": [], - "priority": 0, - "updatedAt": "2020-01-01T00:00:00.000Z", - "workspaceId": "linear-workspace" - } - ] - } - }, - { - "checkpoint": "load-settled" - } - ] - }, { "id": "tk-list-linear-switch-back", "operation": "tasks.task-list-linear", @@ -11568,171 +8978,6 @@ } ] }, - { - "id": "tk-linear-connect", - "operation": "tasks.linear-connect", - "family": "tasks.linear-connect", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-pagination-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "connect", - "id": "connect-0" - }, - { - "complete": "linear.connect#1", - "params": { - "apiKey": "lin_api_key" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "connect-settled" - } - ] - }, - { - "id": "tk-create-github", - "operation": "tasks.task-create-github", - "family": "tasks.task-create-github", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-create-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "create", - "id": "create-0" - }, - { - "complete": "github.createIssue#1", - "params": { - "body": "a body", - "repo": "id:repo-1", - "title": "A new task" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "number": 11, - "url": "https://github.com/owner/repo/issues/11" - } - } - }, - { - "checkpoint": "create-settled" - }, - { - "action": "issue-source", - "id": "issue-source-1" - }, - { - "complete": "repo.update#1", - "params": { - "repo": "id:repo-1", - "updates": { - "issueSourcePreference": "upstream" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "issue-source-settled" - } - ] - }, - { - "id": "tk-create-gitlab", - "operation": "tasks.task-create-gitlab", - "family": "tasks.task-create-gitlab", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-create-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "create", - "id": "create-0" - }, - { - "complete": "gitlab.createIssue#1", - "params": { - "body": "a body", - "repo": "id:repo-1", - "title": "A new task" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "number": 6, - "url": "https://gitlab.com/group/project/-/issues/6" - } - } - }, - { - "checkpoint": "create-settled" - } - ] - }, - { - "id": "tk-create-linear", - "operation": "tasks.task-create-linear", - "family": "tasks.task-create-linear", - "sites": ["mobile/src/tasks/task-list/use-mobile-tasks-task-create-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "create", - "id": "create-0" - }, - { - "complete": "linear.createIssue#1", - "params": { - "description": "a body", - "teamId": "team-1", - "title": "A new task", - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "id": "issue-3", - "identifier": "ENG-3", - "title": "A sub-issue", - "url": "" - } - } - }, - { - "checkpoint": "create-settled" - } - ] - }, { "id": "tk-item-comment-github", "operation": "tasks.item-comment-github", @@ -11779,94 +9024,6 @@ } ] }, - { - "id": "tk-item-review-github", - "operation": "tasks.item-review-github", - "family": "tasks.item-review-github", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-hosted-comment-review-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "reviewers", - "id": "reviewers-0" - }, - { - "complete": "github.requestPRReviewers#1", - "params": { - "prNumber": 12, - "repo": "id:repo-1", - "reviewers": ["octocat"], - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "reviewers-settled" - }, - { - "action": "checks", - "id": "checks-1" - }, - { - "complete": "github.prChecks#1", - "params": { - "headSha": "head-sha", - "noCache": true, - "prNumber": 12, - "repo": "id:repo-1", - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "COMPLETED", - "conclusion": "SUCCESS", - "url": "" - } - ] - } - }, - { - "complete": "status.get#1", - "site": "pr-check-discovery", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded", - "hostDescriptor": { - "installationId": "recorded" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "checkpoint": "checks-settled" - } - ] - }, { "id": "tk-item-comment-gitlab", "operation": "tasks.item-comment-gitlab", @@ -12144,140 +9301,6 @@ } ] }, - { - "id": "tk-item-reply-merge", - "operation": "tasks.item-reply-merge-github", - "family": "tasks.item-reply-merge", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-github-reply-merge-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "review-reply", - "id": "review-reply-0" - }, - { - "complete": "github.addPRReviewCommentReply#1", - "params": { - "body": "a reply", - "commentId": 501, - "line": 12, - "path": "src/index.ts", - "prNumber": 12, - "repo": "id:repo-1", - "threadId": "thread-1", - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 903, - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "path": "src/index.ts", - "line": 12, - "threadId": "thread-1" - } - } - } - }, - { - "checkpoint": "review-reply-settled" - }, - { - "action": "issue-reply", - "id": "issue-reply-1" - }, - { - "complete": "github.addIssueComment#1", - "params": { - "body": "@octocat a reply", - "number": 12, - "repo": "id:repo-1", - "type": "pr", - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 902, - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z" - } - } - } - }, - { - "checkpoint": "issue-reply-settled" - }, - { - "action": "merge", - "id": "merge-2" - }, - { - "complete": "github.mergePR#1", - "params": { - "method": "squash", - "prNumber": 12, - "repo": "id:repo-1", - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "merge-settled" - }, - { - "action": "linear-status", - "id": "linear-status-3" - }, - { - "complete": "linear.updateIssue#1", - "params": { - "id": "issue-1", - "updates": { - "stateId": "state-2" - }, - "workspaceId": "linear-workspace" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "linear-status-settled" - } - ] - }, { "id": "tk-item-merge-gitlab", "operation": "tasks.item-merge-gitlab", @@ -12316,183 +9339,6 @@ } ] }, - { - "id": "tk-item-status-gitlab", - "operation": "tasks.item-status-gitlab", - "family": "tasks.item-status-gitlab", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-gitlab-github-status-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "gitlab-status", - "id": "gitlab-status-0" - }, - { - "complete": "gitlab.updateIssue#1", - "params": { - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "updates": { - "state": "closed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "gitlab-status-settled" - }, - { - "action": "github-metadata", - "id": "github-metadata-1" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded", - "hostDescriptor": { - "installationId": "recorded" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "complete": "github.updateIssue#1", - "params": { - "repo": "id:repo-1", - "number": 9, - "updates": { - "title": "Renamed", - "addLabels": ["triage"], - "removeLabels": ["bug"] - }, - "ownerRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - }, - "transport": "native", - "site": "github.updateIssue#1" - }, - { - "transport": "bridge", - "complete": "github.updateIssue#1.native-1", - "site": "github.updateIssue#1.native-1", - "bridgeSite": true, - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "shell-runtime", - "hostDescriptor": { - "installationId": "shell-desktop" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "complete": "github.updateIssue#1.native-2", - "params": { - "repo": "id:repo-1", - "number": 9, - "updates": { - "title": "Renamed", - "addLabels": ["triage"], - "removeLabels": ["bug"] - }, - "ownerRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - }, - "transport": "bridge", - "site": "github.updateIssue#1" - }, - { - "checkpoint": "github-metadata-settled" - } - ], - "bridgeOperations": [ - { - "request": "github.updateIssue#1", - "probeSite": "github.updateIssue#1.native-1", - "methods": ["status.get", "github.updateIssue"] - } - ] - }, - { - "id": "tk-item-status-gitlab-mr", - "operation": "tasks.item-status-gitlab-mr", - "family": "tasks.item-status-gitlab-mr", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-gitlab-github-status-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "gitlab-status", - "id": "gitlab-status-0" - }, - { - "complete": "gitlab.updateMRState#1", - "params": { - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "state": "closed" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "gitlab-status-settled" - } - ] - }, { "id": "tk-item-metadata-github", "operation": "tasks.item-metadata-github", @@ -12576,77 +9422,6 @@ } ] }, - { - "id": "tk-item-metadata-gitlab-mr", - "operation": "tasks.item-metadata-gitlab-mr", - "family": "tasks.item-metadata-gitlab-mr", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-hosted-metadata-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "update-gitlab", - "id": "update-gitlab-0" - }, - { - "complete": "gitlab.updateMR#1", - "params": { - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "updates": { - "addLabels": ["triage"], - "body": { - "$undefined": true - }, - "removeLabels": { - "$undefined": true - }, - "title": "Renamed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - }, - "transport": "native" - }, - { - "complete": "gitlab.updateMR#1.native-1", - "params": { - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "updates": { - "addLabels": ["triage"], - "title": "Renamed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - }, - "site": "gitlab.updateMR#1", - "transport": "bridge" - }, - { - "checkpoint": "update-gitlab-settled" - } - ] - }, { "id": "tk-linear-item", "operation": "tasks.linear-item-actions", @@ -12748,198 +9523,6 @@ } ] }, - { - "id": "tk-project-repo-slugs", - "operation": "tasks.project-repo-slugs", - "family": "tasks.project-repo-slugs", - "sites": [ - "mobile/src/tasks/project-board/use-mobile-tasks-project-repository-resolution.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - } - }, - { - "checkpoint": "mounted" - } - ] - }, - { - "id": "tk-project-board-load", - "operation": "tasks.project-board-load", - "family": "tasks.project-board-load", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-loading-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "projects", - "id": "projects-0" - }, - { - "complete": "github.project.listAccessible#1", - "params": { - "host": "github.com" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "projects": [ - { - "owner": "owner", - "ownerType": "organization", - "number": 3, - "title": "Board", - "host": "github.com" - } - ], - "partialFailures": [] - } - } - }, - { - "checkpoint": "projects-settled" - }, - { - "action": "views", - "id": "views-1" - }, - { - "complete": "github.project.listViews#1", - "params": { - "host": "github.enterprise.test", - "owner": "owner", - "ownerType": "organization", - "projectNumber": 3 - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "views": [ - { - "id": "view-1", - "number": 1, - "name": "Table", - "layout": "TABLE_LAYOUT" - } - ] - } - } - }, - { - "checkpoint": "views-settled" - }, - { - "action": "table", - "id": "table-2" - }, - { - "complete": "github.project.viewTable#1", - "params": { - "host": "github.enterprise.test", - "owner": "owner", - "ownerType": "organization", - "projectNumber": 3, - "viewId": "view-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "data": { - "project": { - "id": "project-1", - "title": "Board", - "number": 3 - }, - "selectedView": { - "id": "view-1", - "number": 1, - "name": "Table", - "filter": "is:open", - "layout": "TABLE_LAYOUT" - }, - "fields": [], - "rows": [] - } - } - } - }, - { - "checkpoint": "table-settled" - }, - { - "action": "paste", - "id": "paste-3" - }, - { - "complete": "github.project.resolveRef#1", - "params": { - "host": "github.com", - "input": "https://github.com/orgs/owner/projects/3" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "owner": "owner", - "ownerType": "organization", - "number": 3, - "title": "Board", - "host": "github.com", - "viewNumber": 1 - } - } - }, - { - "complete": "github.project.listViews#2", - "params": { - "host": "github.com", - "owner": "owner", - "ownerType": "organization", - "projectNumber": 3 - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "views": [ - { - "id": "view-1", - "number": 1, - "name": "Table", - "layout": "TABLE_LAYOUT" - } - ] - } - } - }, - { - "checkpoint": "paste-settled" - } - ] - }, { "id": "tk-project-row-detail", "operation": "tasks.project-row-detail", @@ -12993,810 +9576,6 @@ } ] }, - { - "id": "tk-project-row-metadata-load", - "operation": "tasks.project-row-metadata-load", - "family": "tasks.project-row-metadata-load", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-metadata-loading.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "github.project.listLabelsBySlug#1", - "params": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "labels": ["bug"] - } - } - }, - { - "complete": "github.project.listAssignableUsersBySlug#1", - "params": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo", - "seedLogins": ["octocat"] - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "users": [ - { - "login": "octocat", - "name": "Octo" - } - ] - } - } - }, - { - "complete": "github.project.listIssueTypesBySlug#1", - "params": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "types": [ - { - "id": "type-1", - "name": "Bug" - } - ] - } - } - }, - { - "checkpoint": "mounted" - } - ] - }, - { - "id": "tk-project-row-fields", - "operation": "tasks.project-row-fields", - "family": "tasks.project-row-fields", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-metadata-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "set-field", - "id": "set-field-0" - }, - { - "complete": "github.project.updateItemField#1", - "params": { - "fieldId": "field-1", - "host": "github.enterprise.test", - "itemId": "item-1", - "projectId": "project-1", - "value": { - "kind": "single-select", - "optionId": "option-1" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "set-field-settled" - }, - { - "action": "clear-field", - "id": "clear-field-1" - }, - { - "complete": "github.project.clearItemField#1", - "params": { - "fieldId": "field-1", - "host": "github.enterprise.test", - "itemId": "item-1", - "projectId": "project-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "clear-field-settled" - }, - { - "action": "issue-type", - "id": "issue-type-2" - }, - { - "complete": "github.project.updateIssueTypeBySlug#1", - "params": { - "host": "github.enterprise.test", - "issueTypeId": "type-1", - "number": 1, - "owner": "owner", - "repo": "repo" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "issue-type-settled" - } - ] - }, - { - "id": "tk-project-row-review-checks", - "operation": "tasks.project-row-review-checks", - "family": "tasks.project-row-review-checks", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-review-check-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "reviewers", - "id": "reviewers-0" - }, - { - "complete": "github.requestPRReviewers#1", - "params": { - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "reviewers": ["octocat"] - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "reviewers-settled" - }, - { - "action": "checks", - "id": "checks-1" - }, - { - "complete": "github.prChecks#1", - "params": { - "headSha": "head-sha", - "noCache": true, - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "COMPLETED", - "conclusion": "SUCCESS", - "url": "" - } - ] - } - }, - { - "checkpoint": "checks-settled" - }, - { - "action": "rerun", - "id": "rerun-2" - }, - { - "complete": "github.rerunPRChecks#1", - "params": { - "failedOnly": true, - "headSha": "head-sha", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "rerun-settled" - }, - { - "action": "viewed", - "id": "viewed-3" - }, - { - "complete": "github.setPRFileViewed#1", - "params": { - "path": "src/index.ts", - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "pullRequestId": "PR_kwDO", - "repo": "id:repo-1", - "viewed": true - }, - "reply": { - "ok": true, - "result": true - } - }, - { - "checkpoint": "viewed-settled" - } - ] - }, - { - "id": "tk-project-row-threads", - "operation": "tasks.project-row-threads", - "family": "tasks.project-row-threads", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-thread-reply-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "delete-comment", - "id": "delete-comment-0" - }, - { - "complete": "github.project.deleteIssueCommentBySlug#1", - "params": { - "commentId": 501, - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "delete-comment-settled" - }, - { - "action": "thread", - "id": "thread-1" - }, - { - "complete": "github.resolveReviewThread#1", - "params": { - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "resolve": true, - "threadId": "thread-1" - }, - "reply": { - "ok": true, - "result": true - } - }, - { - "checkpoint": "thread-settled" - }, - { - "action": "review-reply", - "id": "review-reply-2" - }, - { - "complete": "github.addPRReviewCommentReply#1", - "params": { - "body": "a reply", - "commentId": 501, - "line": 12, - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "threadId": "thread-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 903, - "author": "You", - "body": "a reply", - "createdAt": "2020-01-01T00:00:00.000Z", - "path": "src/index.ts", - "line": 12, - "threadId": "thread-1" - } - } - } - }, - { - "checkpoint": "review-reply-settled" - }, - { - "action": "issue-reply", - "id": "issue-reply-3" - }, - { - "complete": "github.addIssueComment#1", - "params": { - "body": "@octocat a reply", - "number": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "type": "pr" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 902, - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z" - } - } - } - }, - { - "checkpoint": "issue-reply-settled" - } - ] - }, - { - "id": "tk-project-row-comments-issue", - "operation": "tasks.project-row-comments-issue", - "family": "tasks.project-row-comments-issue", - "sites": [ - "mobile/src/tasks/project-board/use-mobile-tasks-project-workspace-comment-actions.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "update-item", - "id": "update-item-0" - }, - { - "complete": "github.project.updateIssueBySlug#1", - "params": { - "host": "github.enterprise.test", - "number": 1, - "owner": "owner", - "repo": "repo", - "updates": { - "title": "Renamed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "update-item-settled" - }, - { - "action": "add-comment", - "id": "add-comment-1" - }, - { - "complete": "github.project.addIssueCommentBySlug#1", - "params": { - "body": "a project comment", - "host": "github.enterprise.test", - "number": 1, - "owner": "owner", - "repo": "repo" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 906, - "author": "You", - "body": "a project comment", - "createdAt": "2020-01-01T00:00:00.000Z" - } - } - } - }, - { - "checkpoint": "add-comment-settled" - }, - { - "action": "update-comment", - "id": "update-comment-2" - }, - { - "complete": "github.project.updateIssueCommentBySlug#1", - "params": { - "body": "an edited comment", - "commentId": 501, - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "update-comment-settled" - } - ] - }, - { - "id": "tk-project-row-comments-pr", - "operation": "tasks.project-row-comments-pr", - "family": "tasks.project-row-comments-pr", - "sites": [ - "mobile/src/tasks/project-board/use-mobile-tasks-project-workspace-comment-actions.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "update-item", - "id": "update-item-0" - }, - { - "complete": "github.project.updatePullRequestBySlug#1", - "params": { - "host": "github.enterprise.test", - "number": 2, - "owner": "owner", - "repo": "repo", - "updates": { - "title": "Renamed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "update-item-settled" - } - ] - }, - { - "id": "tk-project-row-files-merge", - "operation": "tasks.project-row-files-merge", - "family": "tasks.project-row-files-merge", - "sites": ["mobile/src/tasks/project-board/use-mobile-tasks-project-file-merge-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "expand", - "id": "expand-0" - }, - { - "complete": "github.prFileContents#1", - "params": { - "baseSha": "base-sha", - "headSha": "head-sha", - "oldPath": { - "$undefined": true - }, - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "status": "modified" - }, - "reply": { - "ok": true, - "result": { - "original": "a", - "modified": "b", - "originalIsBinary": false, - "modifiedIsBinary": false - } - }, - "transport": "native" - }, - { - "complete": "github.prFileContents#1.native-1", - "params": { - "baseSha": "base-sha", - "headSha": "head-sha", - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "status": "modified" - }, - "reply": { - "ok": true, - "result": { - "original": "a", - "modified": "b", - "originalIsBinary": false, - "modifiedIsBinary": false - } - }, - "site": "github.prFileContents#1", - "transport": "bridge" - }, - { - "checkpoint": "expand-settled" - }, - { - "action": "file-comment", - "id": "file-comment-1" - }, - { - "complete": "github.addPRReviewComment#1", - "params": { - "body": "a review comment", - "commitId": "head-sha", - "line": 12, - "path": "src/index.ts", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 901, - "author": "You", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "path": "src/index.ts", - "line": 12 - } - } - } - }, - { - "checkpoint": "file-comment-settled" - }, - { - "action": "merge", - "id": "merge-2" - }, - { - "complete": "github.mergePR#1", - "params": { - "method": "squash", - "prNumber": 2, - "prRepo": { - "host": "github.enterprise.test", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "merge-settled" - }, - { - "action": "issue-state", - "id": "issue-state-3" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded", - "hostDescriptor": { - "installationId": "recorded" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "complete": "github.updateIssue#1", - "params": { - "repo": "id:repo-1", - "number": 9, - "updates": { - "state": "closed" - }, - "ownerRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - }, - "transport": "native", - "site": "github.updateIssue#1" - }, - { - "transport": "bridge", - "complete": "github.updateIssue#1.native-1", - "site": "github.updateIssue#1.native-1", - "bridgeSite": true, - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "shell-runtime", - "hostDescriptor": { - "installationId": "shell-desktop" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "complete": "github.updateIssue#1.native-2", - "params": { - "repo": "id:repo-1", - "number": 9, - "updates": { - "state": "closed" - }, - "ownerRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - }, - "transport": "bridge", - "site": "github.updateIssue#1" - }, - { - "checkpoint": "issue-state-settled" - }, - { - "action": "pr-state", - "id": "pr-state-4" - }, - { - "complete": "github.updatePRState#1", - "params": { - "prNumber": 12, - "repo": "id:repo-1", - "updates": { - "state": "closed" - }, - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "pr-state-settled" - } - ], - "bridgeOperations": [ - { - "request": "github.updateIssue#1", - "probeSite": "github.updateIssue#1.native-1", - "methods": ["status.get", "github.updateIssue"] - } - ] - }, { "id": "speech-setup-sheet-fulfilled", "operation": "speech.setup-sheet", @@ -14978,76 +10757,6 @@ } ] }, - { - "id": "native-chat-image-paste-single", - "operation": "nativeChat.image-paste", - "family": "nativeChat.image-paste", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-image-send.ts"], - "schedules": [], - "steps": [ - { - "action": "one", - "id": "one" - }, - { - "complete": "terminal.read#1", - "params": { - "terminal": "terminal-1", - "screen": true, - "limit": 1 - }, - "reply": { - "ok": true, - "result": { - "terminal": {} - } - } - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "complete": "terminal.send#2", - "params": { - "terminal": "terminal-1", - "text": "\u001b[200~@/tmp/a.png\u001b[201~ ", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "pasted" - } - ] - }, { "id": "native-chat-image-paste-two-images", "operation": "nativeChat.image-paste", @@ -15208,78 +10917,6 @@ } ] }, - { - "id": "native-chat-write-accepted", - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-send.ts"], - "schedules": [], - "steps": [ - { - "action": "body", - "id": "body" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "hello", - "enter": true, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "accepted" - } - ] - }, - { - "id": "native-chat-write-rejected", - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-send.ts"], - "schedules": [], - "steps": [ - { - "action": "body", - "id": "body" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "hello", - "enter": true, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - }, - { - "checkpoint": "rejected" - } - ] - }, { "id": "native-chat-write-delivery-unknown", "operation": "nativeChat.terminal-write", @@ -15312,242 +10949,6 @@ } ] }, - { - "id": "native-chat-write-clear-line", - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-send.ts"], - "schedules": [], - "steps": [ - { - "action": "clear", - "id": "clear" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "\u0015", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "cleared" - } - ] - }, - { - "id": "native-chat-write-typed-command", - "operation": "nativeChat.terminal-write", - "family": "nativeChat.terminal-write", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-send.ts"], - "schedules": [], - "steps": [ - { - "action": "command", - "id": "command" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "\u0015", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "advance": 16 - }, - { - "complete": "terminal.send#2", - "params": { - "terminal": "terminal-1", - "text": "o", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "advance": 16 - }, - { - "complete": "terminal.send#3", - "params": { - "terminal": "terminal-1", - "text": "k", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "advance": 16 - }, - { - "complete": "terminal.send#4", - "params": { - "terminal": "terminal-1", - "text": "\r", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "typed" - } - ] - }, - { - "id": "native-chat-session-option-pick-written", - "operation": "nativeChat.session-option-pick", - "family": "nativeChat.session-option-pick", - "sites": [ - "mobile/src/session/native-chat/input/mobile-native-chat-session-option-persistence.ts" - ], - "schedules": [], - "steps": [ - { - "action": "pick", - "id": "pick" - }, - { - "complete": "settings.mutateNativeChatSessionOptions#1", - "params": { - "type": "apply-picks", - "agent": "claude", - "picks": [ - { - "modelId": "opus", - "optionId": "model", - "value": "opus" - } - ] - }, - "reply": { - "ok": true, - "result": { - "applied": true - } - } - }, - { - "checkpoint": "written" - } - ] - }, - { - "id": "native-chat-session-option-pick-refused", - "operation": "nativeChat.session-option-pick", - "family": "nativeChat.session-option-pick", - "sites": [ - "mobile/src/session/native-chat/input/mobile-native-chat-session-option-persistence.ts" - ], - "schedules": [], - "steps": [ - { - "action": "pick", - "id": "pick" - }, - { - "complete": "settings.mutateNativeChatSessionOptions#1", - "params": { - "type": "apply-picks", - "agent": "claude", - "picks": [ - { - "modelId": "opus", - "optionId": "model", - "value": "opus" - } - ] - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method" - } - } - }, - { - "checkpoint": "refusal-swallowed" - } - ] - }, - { - "id": "native-chat-session-option-pick-empty", - "operation": "nativeChat.session-option-pick", - "family": "nativeChat.session-option-pick", - "sites": [ - "mobile/src/session/native-chat/input/mobile-native-chat-session-option-persistence.ts" - ], - "schedules": [], - "steps": [ - { - "action": "empty", - "id": "empty" - }, - { - "checkpoint": "no-wire" - } - ] - }, { "id": "session-tab-activation-focus-and-activate", "operation": "session.tab-activation", @@ -16284,78 +11685,6 @@ } ] }, - { - "id": "session-create-markdown-note", - "operation": "session.content-create", - "family": "session.content-create", - "sites": ["mobile/src/session/use-mobile-session-content-create-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "markdown", - "id": "markdown" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "capabilities": ["files.mutation-ownership.v1"] - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "hostId": "local" - } - } - } - }, - { - "complete": "files.createFile#1", - "params": { - "expectedExecutionHostId": "local", - "relativePath": "untitled.md", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "created": true - } - } - }, - { - "complete": "files.open#1", - "params": { - "relativePath": "untitled.md", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "opened": true - } - } - }, - { - "advance": 300 - }, - { - "checkpoint": "created" - } - ] - }, { "id": "session-create-markdown-name-collision", "operation": "session.content-create", @@ -16443,70 +11772,6 @@ } ] }, - { - "id": "session-create-browser-tab", - "operation": "session.content-create", - "family": "session.content-create", - "sites": ["mobile/src/session/use-mobile-session-content-create-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "browser", - "id": "browser" - }, - { - "complete": "browser.tabCreate#1", - "params": { - "activate": true, - "url": "https://example.com/", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "browserPageId": "page-1" - } - } - }, - { - "advance": 1200 - }, - { - "checkpoint": "created" - } - ] - }, - { - "id": "session-create-browser-refused", - "operation": "session.content-create", - "family": "session.content-create", - "sites": ["mobile/src/session/use-mobile-session-content-create-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "browser", - "id": "browser" - }, - { - "complete": "browser.tabCreate#1", - "params": { - "activate": true, - "url": "https://example.com/", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "browser_unavailable", - "message": "Browser unavailable" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, { "id": "session-tab-close-terminal", "operation": "session.tab-close", @@ -17206,155 +12471,6 @@ } ] }, - { - "id": "quick-commands-load-refused", - "operation": "settings.quick-commands", - "family": "settings.quick-commands", - "sites": ["mobile/src/terminal/quick-commands/use-quick-commands.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "settings.getTerminalQuickCommands#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method" - } - } - }, - { - "checkpoint": "errored" - } - ] - }, - { - "id": "native-chat-image-upload-start-refused", - "operation": "nativeChat.image-upload", - "family": "nativeChat.image-upload", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-image-attachment.ts"], - "schedules": [], - "steps": [ - { - "action": "normal", - "id": "normal" - }, - { - "complete": "clipboard.startImageUpload#1", - "params": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - }, - "reply": { - "ok": false, - "error": { - "code": "too_large", - "message": "Image is too large" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "native-chat-image-upload-two", - "operation": "nativeChat.image-upload", - "family": "nativeChat.image-upload", - "sites": ["mobile/src/session/native-chat/composer/mobile-native-chat-image-attachment.ts"], - "schedules": [], - "steps": [ - { - "action": "two", - "id": "two" - }, - { - "complete": "clipboard.startImageUpload#1", - "params": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - }, - "reply": { - "ok": true, - "result": { - "uploadId": "upload-1" - } - } - }, - { - "complete": "clipboard.appendImageUploadChunk#1", - "params": { - "uploadId": "upload-1", - "offset": 0, - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - }, - "reply": { - "ok": true, - "result": { - "received": 32 - } - } - }, - { - "complete": "clipboard.commitImageUpload#1", - "params": { - "uploadId": "upload-1" - }, - "reply": { - "ok": true, - "result": "/tmp/img-1.png" - } - }, - { - "complete": "clipboard.startImageUpload#2", - "params": { - "connectionId": "connection-1", - "expectedBase64Length": 32 - }, - "reply": { - "ok": true, - "result": { - "uploadId": "upload-2" - } - } - }, - { - "complete": "clipboard.appendImageUploadChunk#2", - "params": { - "uploadId": "upload-2", - "offset": 0, - "contentBase64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - }, - "reply": { - "ok": true, - "result": { - "received": 32 - } - } - }, - { - "complete": "clipboard.commitImageUpload#2", - "params": { - "uploadId": "upload-2" - }, - "reply": { - "ok": true, - "result": "/tmp/img-2.png" - } - }, - { - "checkpoint": "uploaded-both" - } - ] - }, { "id": "native-chat-image-upload-second-fails", "operation": "nativeChat.image-upload", @@ -17481,51 +12597,6 @@ } ] }, - { - "id": "new-workspace-repositories-fulfilled", - "operation": "workspace.repositories", - "family": "components.new-workspace-repositories", - "sites": ["mobile/src/components/use-new-workspace-repositories.ts"], - "schedules": [], - "deviceStore": { - "orca:last-visited-worktree": "{\"hostId\":\"host-1\",\"worktreeId\":\"repo-b::/tmp/repo-b\"}" - }, - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "loading" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-a", - "displayName": "alpha", - "path": "/tmp/repo-a" - }, - { - "id": "repo-b", - "displayName": "beta", - "path": "/tmp/repo-b" - } - ] - } - } - }, - { - "checkpoint": "selected" - } - ] - }, { "id": "terminal-paste-accepted", "operation": "session.terminal-clipboard", @@ -17758,56 +12829,6 @@ } ] }, - { - "id": "notifications-display-test-accepted", - "operation": "notifications.display-test-screen", - "family": "notifications.display-test-screen", - "sites": ["mobile/src/settings/notification-display-test.tsx"], - "schedules": [], - "deviceStore": { - "orca:pushServiceNotificationsEnabled": "true", - "orca:hosts": "[{\"id\":\"host-1\",\"name\":\"Desk\",\"endpoint\":\"ws://desk.local:7777\",\"publicKeyB64\":\"AAAA\",\"lastConnected\":1700000000000}]" - }, - "deviceState": { - "notificationPermissions": { - "status": "granted", - "canAskAgain": true - }, - "pushToken": { - "type": "ios", - "data": "fixture-apns-token" - } - }, - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "mounted" - }, - { - "action": "send-test", - "id": "press" - }, - { - "checkpoint": "sending" - }, - { - "complete": "notifications.testPush#1", - "params": null, - "reply": { - "ok": true, - "result": { - "accepted": true - } - } - }, - { - "checkpoint": "accepted" - } - ] - }, { "id": "notifications-display-test-not-registered", "operation": "notifications.display-test-screen", @@ -17859,53 +12880,6 @@ } ] }, - { - "id": "tasks-route-repo-list", - "operation": "tasks.route-repo-list", - "family": "tasks.route-repo-list", - "sites": ["mobile/src/tasks/screen-state/use-mobile-tasks-route-and-item-state.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "idle" - }, - { - "action": "ensure-repos", - "id": "ensure" - }, - { - "checkpoint": "repos-pending" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-1", - "name": "orca" - }, - { - "id": "repo-2", - "name": "relay" - } - ] - } - } - }, - { - "checkpoint": "repos-loaded" - } - ] - }, { "id": "live-worktree-name-stream", "operation": "session.live-worktree-name", @@ -18029,101 +13003,6 @@ } ] }, - { - "id": "host-worktree-refresh-stream", - "operation": "worktree.host-refresh", - "family": "host-worktree-refresh", - "sites": ["mobile/src/worktree/host-worktree-refresh.ts"], - "schedules": [], - "steps": [ - { - "action": "start", - "id": "start" - }, - { - "checkpoint": "started" - }, - { - "frame": "runtime.clientEvents.subscribe#1", - "params": null, - "reply": { - "ok": true, - "streaming": true, - "result": { - "type": "ready", - "subscriptionId": "sub-1" - } - } - }, - { - "checkpoint": "ready" - }, - { - "frame": "runtime.clientEvents.subscribe#1", - "params": null, - "reply": { - "ok": true, - "streaming": true, - "result": { - "type": "worktreesChanged", - "repoId": "repo-1" - } - } - }, - { - "checkpoint": "worktrees-changed" - }, - { - "advance": 3000 - }, - { - "checkpoint": "polled" - }, - { - "frame": "runtime.clientEvents.subscribe#1", - "params": null, - "reply": { - "ok": true, - "streaming": true, - "result": { - "type": "reposChanged" - } - } - }, - { - "checkpoint": "repos-changed" - }, - { - "action": "cutover", - "id": "cutover" - }, - { - "checkpoint": "re-subscribed" - }, - { - "frame": "runtime.clientEvents.subscribe#2", - "params": null, - "reply": { - "ok": true, - "streaming": true, - "result": { - "type": "ready", - "subscriptionId": "sub-2" - } - } - }, - { - "checkpoint": "replayed" - }, - { - "action": "stop", - "id": "stop" - }, - { - "checkpoint": "stopped" - } - ] - }, { "id": "event-router-failed-read-floor", "operation": "query.event-router-catalog", @@ -18785,136 +13664,6 @@ } ] }, - { - "id": "notifications-desktop-stream", - "operation": "notifications.desktop-stream", - "family": "notifications.desktop-stream", - "sites": ["mobile/src/notifications/mobile-notifications.ts"], - "schedules": [], - "deviceStore": { - "orca:hosts": "[{\"id\":\"host-1\",\"name\":\"Desk\",\"endpoint\":\"wss://desk.test\",\"publicKeyB64\":\"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=\",\"lastConnected\":1700000000000}]" - }, - "deviceState": { - "notificationTray": [ - { - "request": { - "identifier": "tray-1", - "content": { - "data": { - "hostFingerprint": "Yw3NKWbEM2aRElRI", - "kind": "alert", - "notificationId": "note-1", - "notificationEpoch": "epoch-1", - "notificationSeq": 7 - } - } - } - }, - { - "request": { - "identifier": "tray-2", - "content": { - "data": { - "hostFingerprint": "Yw3NKWbEM2aRElRI", - "kind": "alert", - "notificationId": "note-2", - "notificationEpoch": "epoch-1", - "notificationSeq": 8 - } - } - } - } - ] - }, - "steps": [ - { - "action": "start", - "id": "start" - }, - { - "checkpoint": "subscribed" - }, - { - "frame": "notifications.subscribe#1", - "params": { - "includeDesktopSuppressed": true - }, - "reply": { - "ok": true, - "streaming": true, - "result": { - "type": "ready", - "subscriptionId": "sub-1" - } - } - }, - { - "checkpoint": "ready" - }, - { - "complete": "notifications.getMissedSince#1", - "params": { - "lastSeenSeq": 9007199254740991, - "deliveredPushes": [ - { - "notificationId": "note-1", - "notificationEpoch": "epoch-1", - "notificationSeq": 7 - }, - { - "notificationId": "note-2", - "notificationEpoch": "epoch-1", - "notificationSeq": 8 - } - ] - }, - "reply": { - "ok": true, - "result": { - "dismissedPushes": [ - { - "notificationId": "note-1", - "notificationEpoch": "epoch-1", - "notificationSeq": 7 - } - ] - } - } - }, - { - "checkpoint": "caught-up" - }, - { - "frame": "notifications.subscribe#1", - "params": { - "includeDesktopSuppressed": true - }, - "reply": { - "ok": true, - "streaming": true, - "result": { - "type": "dismiss", - "notificationId": "note-2", - "notificationEpoch": "epoch-1", - "notificationSeq": 8 - } - } - }, - { - "checkpoint": "dismissed" - }, - { - "action": "stop", - "id": "stop" - }, - { - "checkpoint": "unsubscribing" - }, - { - "checkpoint": "stopped" - } - ] - }, { "id": "notifications-desktop-stream-replayed", "operation": "notifications.desktop-stream", @@ -19621,143 +14370,6 @@ } ] }, - { - "id": "session-create-terminal-with-prompt", - "operation": "session.create-terminal", - "family": "session.create-terminal", - "sites": [ - "mobile/src/terminal/session/creation/use-mobile-session-terminal-create-actions.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "worktreeId": "wt-1", - "activeSessionTabId": "tab-0", - "deviceToken": "device-token-1" - } - }, - { - "action": "create", - "id": "create", - "args": { - "initialPrompt": "review these notes", - "successToast": "Notes sent", - "errorToast": "Couldn't run Notes" - } - }, - { - "checkpoint": "creating" - }, - { - "complete": "session.tabs.createTerminal#1", - "params": { - "worktree": "id:wt-1", - "afterTabId": "tab-0", - "clientMutationId": "mobile-create:mjuohs00-8ig2hens", - "activate": false, - "select": true, - "navigation": "caller" - }, - "reply": { - "ok": true, - "result": { - "tab": { - "type": "terminal", - "id": "tab-1", - "title": "zsh", - "terminal": "terminal-1", - "isActive": true - } - } - } - }, - { - "checkpoint": "created" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "review these notes", - "enter": true, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "prompt-sent" - }, - { - "advance": 500 - }, - { - "checkpoint": "tabs-refreshed" - } - ] - }, - { - "id": "session-create-terminal-refused", - "operation": "session.create-terminal", - "family": "session.create-terminal", - "sites": [ - "mobile/src/terminal/session/creation/use-mobile-session-terminal-create-actions.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "worktreeId": "wt-1", - "activeSessionTabId": "tab-0" - } - }, - { - "action": "create", - "id": "create", - "args": { - "errorToast": "Couldn't run Notes" - } - }, - { - "checkpoint": "creating" - }, - { - "complete": "session.tabs.createTerminal#1", - "params": { - "worktree": "id:wt-1", - "afterTabId": "tab-0", - "clientMutationId": "mobile-create:mjuohs00-8ig2hens", - "activate": false, - "select": true, - "navigation": "caller" - }, - "reply": { - "ok": false, - "error": { - "code": "pty_exhausted", - "message": "No pty slots left on the host" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, { "id": "session-create-terminal-without-handle", "operation": "session.create-terminal", @@ -20513,39 +15125,6 @@ } ] }, - { - "id": "session-browser-tab-created", - "operation": "session.content-create", - "family": "session.browser-tab-create", - "sites": ["mobile/src/session/use-mobile-session-content-create-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "browser", - "id": "browser" - }, - { - "complete": "browser.tabCreate#1", - "params": { - "activate": true, - "url": "https://example.com/", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "browserPageId": "page-1" - } - } - }, - { - "advance": 1200 - }, - { - "checkpoint": "created" - } - ] - }, { "id": "new-tab-local-agents", "operation": "settings.new-tab-agents", From 87d105b6101c57e05cce1794f90a84d16213de57 Mon Sep 17 00:00:00 2001 From: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com> Date: Fri, 13 Nov 2026 20:35:58 +0000 Subject: [PATCH 04/49] fix(github): read a project's GitHub repo when origin is a local path (#42121) The project catalog keys a repo by its first network remote (upstream, origin, then the rest), but GitHub issue and PR lookups only read the remotes named origin and upstream. A repo whose origin is a local bare repo and whose GitHub remote has another name showed as GitHub-backed yet Tasks said no GitHub source was detected. Origin's role now falls to the same remote the project identity picks. Fixes #42102 --- .../git/remotes/origin-stand-in-remote.ts | 41 ++++++++++++++++ ...epository-origin-stand-in-real-git.test.ts | 47 +++++++++++++++++++ .../github-api-repository-remote-probe.ts | 9 +++- .../github-api-repository.test.ts | 3 +- .../repositories/github-api-repository.ts | 29 +++--------- src/shared/git/remotes/git-remote-identity.ts | 15 ++++-- 6 files changed, 115 insertions(+), 29 deletions(-) create mode 100644 src/main/git/remotes/origin-stand-in-remote.ts create mode 100644 src/main/github/repositories/github-api-repository-origin-stand-in-real-git.test.ts diff --git a/src/main/git/remotes/origin-stand-in-remote.ts b/src/main/git/remotes/origin-stand-in-remote.ts new file mode 100644 index 00000000000..605c58ac6a5 --- /dev/null +++ b/src/main/git/remotes/origin-stand-in-remote.ts @@ -0,0 +1,41 @@ +import { deriveOriginStandInRemoteName } from '../../../shared/git/remotes/git-remote-identity' +import { gitExecFileAsync } from '../command-runner/git-exec-file' +import { listCachedRemoteNames, type RemoteNameListingGitOptions } from './remote-name-listing' +import { REMOTE_URL_PROBE_TIMEOUT_MS } from './remote-url-probe' + +async function readOriginStandInRemoteName( + repoPath: string, + connectionId: string | null | undefined, + localGitOptions: RemoteNameListingGitOptions +): Promise { + const names = await listCachedRemoteNames(repoPath, connectionId, localGitOptions) + if (!names?.some((name) => name !== 'origin' && name !== 'upstream')) { + return null + } + try { + const { stdout } = await gitExecFileAsync(['remote', '-v'], { + cwd: repoPath, + timeout: REMOTE_URL_PROBE_TIMEOUT_MS, + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) + }) + return deriveOriginStandInRemoteName(stdout) + } catch { + return null + } +} + +/** Origin's GitHub role falls to the remote project identity reads when origin is missing or a local path. */ +export async function resolveOriginWithStandIn( + repoPath: string, + connectionId: string | null | undefined, + localGitOptions: RemoteNameListingGitOptions, + resolveRemote: (remoteName: string) => Promise +): Promise { + const origin = await resolveRemote('origin') + if (origin !== null) { + return origin + } + const standIn = await readOriginStandInRemoteName(repoPath, connectionId, localGitOptions) + return standIn ? resolveRemote(standIn) : null +} diff --git a/src/main/github/repositories/github-api-repository-origin-stand-in-real-git.test.ts b/src/main/github/repositories/github-api-repository-origin-stand-in-real-git.test.ts new file mode 100644 index 00000000000..c5f43c181c7 --- /dev/null +++ b/src/main/github/repositories/github-api-repository-origin-stand-in-real-git.test.ts @@ -0,0 +1,47 @@ +import { mkdtemp, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { runProcess } from '@orca/process-host' +import { afterEach, expect, it } from 'vitest' +import { resolveIssueGitHubApiRepositorySource } from './github-api-repository' +import { resolvePrWorkItemSource } from '../client/list/work-item-list-request' +import { installRealWorkerThreadChildProcesses } from '../../worker-thread-child-process/worker-thread-child-process-real.test-fixtures' + +let directory: string | null = null + +afterEach(async () => { + if (directory) { + await rm(directory, { recursive: true, force: true }) + directory = null + } +}) + +async function createRepo(remotes: [name: string, url: (repo: string) => string][]) { + const repo = await mkdtemp(join(tmpdir(), 'orca-origin-stand-in-')) + directory = repo + const git = async (args: string[]) => { + const result = await runProcess({ program: 'git', args, cwd: repo }) + if (result.code !== 0) { + throw new Error(result.stderr) + } + } + await git(['init', '-q']) + await git(['init', '--bare', '-q', join(repo, 'mirror.git')]) + for (const [name, url] of remotes) { + await git(['remote', 'add', name, url(repo)]) + } + return repo +} + +it('reads GitHub from the remote standing in for an origin that is a local path (#42102)', async () => { + const repo = await createRepo([ + ['origin', (root) => join(root, 'mirror.git')], + ['github', () => 'https://github.com/acme/widgets.git'] + ]) + const expected = { owner: 'acme', repo: 'widgets', host: 'github.com' } + + expect((await resolveIssueGitHubApiRepositorySource(repo, undefined)).source).toEqual(expected) + expect((await resolvePrWorkItemSource(repo, undefined)).source).toEqual(expected) +}) + +installRealWorkerThreadChildProcesses() diff --git a/src/main/github/repositories/github-api-repository-remote-probe.ts b/src/main/github/repositories/github-api-repository-remote-probe.ts index 0ebec3d2603..da1bae27754 100644 --- a/src/main/github/repositories/github-api-repository-remote-probe.ts +++ b/src/main/github/repositories/github-api-repository-remote-probe.ts @@ -6,6 +6,7 @@ import { } from './github-repository-identity' import type { GitHubRepositoryIdentity as GitHubApiRepository } from '../../../shared/github/repositories/repository-identity' import { shouldProbeGitRemote } from '../../git/remotes/remote-name-listing' +import { resolveOriginWithStandIn } from '../../git/remotes/origin-stand-in-remote' import { getEnterpriseGitHubRepoSlug, @@ -128,10 +129,14 @@ export async function getGitHubApiRepositoryForRemote( }) } +/** The repo origin names; a project whose origin is missing or a local path reads its stand-in remote. */ export async function getOriginGitHubApiRepository( repoPath: string, connectionId?: string | null, - localGitOptions: LocalGitExecOptions = {} + localGitOptions: LocalGitExecOptions = {}, + probeOptions: GitHubRemoteIdentityProbeOptions = {} ): Promise { - return getGitHubApiRepositoryForRemote(repoPath, 'origin', connectionId, localGitOptions) + return resolveOriginWithStandIn(repoPath, connectionId, localGitOptions, (name) => + getGitHubApiRepositoryForRemote(repoPath, name, connectionId, localGitOptions, probeOptions) + ) } diff --git a/src/main/github/repositories/github-api-repository.test.ts b/src/main/github/repositories/github-api-repository.test.ts index 023ff616841..851e18cedd6 100644 --- a/src/main/github/repositories/github-api-repository.test.ts +++ b/src/main/github/repositories/github-api-repository.test.ts @@ -34,7 +34,8 @@ vi.mock('./github-enterprise-repository', async (importOriginal) => ({ })) vi.mock('../../git/remotes/remote-name-listing', () => ({ - shouldProbeGitRemote: shouldProbeGitRemoteMock + shouldProbeGitRemote: shouldProbeGitRemoteMock, + listCachedRemoteNames: async () => null })) import { _resetOriginGitHubApiRepositoryCache, diff --git a/src/main/github/repositories/github-api-repository.ts b/src/main/github/repositories/github-api-repository.ts index 7e33081061f..b2f34c8b75b 100644 --- a/src/main/github/repositories/github-api-repository.ts +++ b/src/main/github/repositories/github-api-repository.ts @@ -41,9 +41,8 @@ export async function getIssueGitHubApiRepository( localGitOptions: LocalGitExecOptions = {} ): Promise { return withGitHubRepoExecution(repoPath, connectionId, localGitOptions, async () => { - const originPromise = getGitHubApiRepositoryForRemote( + const originPromise = getOriginGitHubApiRepository( repoPath, - 'origin', connectionId, localGitOptions ).then( @@ -81,15 +80,9 @@ export async function resolveGitHubApiRepositoryCandidates( localGitOptions: LocalGitExecOptions = {} ): Promise { return withGitHubRepoExecution(repoPath, connectionId, localGitOptions, async () => { - const originPromise = getGitHubApiRepositoryForRemote( - repoPath, - 'origin', - connectionId, - localGitOptions, - { - requireVerifiedSshProbe: true - } - ).then( + const originPromise = getOriginGitHubApiRepository(repoPath, connectionId, localGitOptions, { + requireVerifiedSshProbe: true + }).then( (value) => ({ status: 'fulfilled' as const, value }), (reason: unknown) => ({ status: 'rejected' as const, reason }) ) @@ -151,22 +144,12 @@ export async function resolveIssueGitHubApiRepositorySource( if (upstream) { return { source: upstream, fellBack: false } } - const origin = await getGitHubApiRepositoryForRemote( - repoPath, - 'origin', - connectionId, - localGitOptions - ) + const origin = await getOriginGitHubApiRepository(repoPath, connectionId, localGitOptions) return { source: origin, fellBack: origin !== null } } if (preference === 'origin') { return { - source: await getGitHubApiRepositoryForRemote( - repoPath, - 'origin', - connectionId, - localGitOptions - ), + source: await getOriginGitHubApiRepository(repoPath, connectionId, localGitOptions), fellBack: false } } diff --git a/src/shared/git/remotes/git-remote-identity.ts b/src/shared/git/remotes/git-remote-identity.ts index 036ebde7f6e..0ac99f8906c 100644 --- a/src/shared/git/remotes/git-remote-identity.ts +++ b/src/shared/git/remotes/git-remote-identity.ts @@ -116,8 +116,8 @@ function primaryRemoteSortKey(entry: GitRemoteEntry): number { return 2 } -export function deriveGitRemoteIdentity(stdout: string): GitRemoteIdentity | null { - const entries = parseGitRemoteVerboseOutput(stdout) +function networkRemotesInPrimaryOrder(stdout: string) { + return parseGitRemoteVerboseOutput(stdout) .map((entry) => ({ ...entry, canonicalKey: normalizeGitRemoteUrl(entry.url) @@ -127,7 +127,10 @@ export function deriveGitRemoteIdentity(stdout: string): GitRemoteIdentity | nul const priority = primaryRemoteSortKey(left) - primaryRemoteSortKey(right) return priority === 0 ? left.name.localeCompare(right.name, 'en') : priority }) - const selected = entries[0] +} + +export function deriveGitRemoteIdentity(stdout: string): GitRemoteIdentity | null { + const selected = networkRemotesInPrimaryOrder(stdout)[0] return selected ? { canonicalKey: selected.canonicalKey, @@ -136,3 +139,9 @@ export function deriveGitRemoteIdentity(stdout: string): GitRemoteIdentity | nul } : null } + +/** The remote that plays origin's role when origin is missing or a local path, picked as project identity picks it. */ +export function deriveOriginStandInRemoteName(stdout: string): string | null { + const selected = networkRemotesInPrimaryOrder(stdout).find((entry) => entry.name !== 'upstream') + return selected && selected.name !== 'origin' ? selected.name : null +} From 3cfdf07402cbb6285548319bbcbf05be358749e4 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 12:43:50 -0800 Subject: [PATCH 05/49] test: remove low-value recording families and PR snapshots (#42125) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../goldens/diff-review-branch-compare.json | 346 -- .../goldens/diff-review-branch-file-diff.json | 111 - .../goldens/diff-review-commit-file-diff.json | 301 -- .../diff-review-refused-file-diff.json | 222 -- .../goldens/diff-review-snapshot.json | 537 --- .../diff-review-status-unavailable.json | 136 - .../diff-review-worktree-file-diff.json | 222 -- .../interruptions-inventory-lifecycle.json | 262 -- ...ions-settings-bot-overrides-fulfilled.json | 242 -- .../goldens/native-chat-stop-accepted.json | 149 - .../native-chat-stop-both-rejected.json | 133 - .../goldens/pr-branch-identity.json | 427 -- .../goldens/pr-branch-repo-context.json | 80 - .../goldens/pr-comment-mutation.json | 384 -- .../goldens/pr-comment-posted-in-place.json | 877 ----- .../pr-comment-resolve-unconfirmed.json | 145 - .../pr-line-comment-and-file-viewed.json | 219 -- .../goldens/pr-mutation-in-band-failure.json | 320 -- .../goldens/pr-mutation-status.json | 469 --- .../goldens/pr-read-fork-routing.json | 337 -- .../goldens/pr-read-surface.json | 1716 -------- .../goldens/pr-read-upstream-error.json | 254 -- .../goldens/pr-sidebar-checks-refused.json | 616 --- .../goldens/pr-sidebar-load.json | 623 --- .../goldens/pr-title-mutation.json | 77 - .../goldens/pr-title-unconfirmed.json | 149 - .../goldens/review-branch-diff-shapes.json | 111 - .../goldens/review-create-agent-refused.json | 240 -- .../goldens/review-file-diff-shapes.json | 222 -- .../goldens/review-git-mutations-run.json | 169 - .../review-mark-reviewed-persists.json | 167 - .../goldens/review-open-in-session.json | 114 - .../review-send-notes-heals-stale-input.json | 190 - .../review-send-sheet-lists-terminals.json | 137 - .../goldens/review-stage-file.json | 111 - .../goldens/review-stage-refused.json | 105 - .../goldens/sc-changes-loaded.json | 548 --- .../goldens/sc-history-branch-commits.json | 329 -- .../rpc-foundation/goldens/schedules-b3.json | 759 ---- .../schedules-settings-new-tab-ssh.json | 695 ---- ...ules-settings-repo-metadata-fulfilled.json | 1230 ------ ...les-settings-task-hydration-fulfilled.json | 2210 ----------- ...-settings-workspace-context-fulfilled.json | 1262 ------ .../session-markdown-save-conflict.json | 91 - .../goldens/session-markdown-saved.json | 97 - ...settings-task-workspace-create-linear.json | 246 -- .../settings-task-workspace-refused.json | 172 - ...ttings-task-workspace-transport-error.json | 169 - .../settings-workspace-submit-refused.json | 154 - ...ings-workspace-submit-transport-error.json | 151 - mobile/rpc-foundation/pilot-scenarios.json | 3472 ----------------- .../bridged-parity/divergence-classes.ts | 99 - .../rpc-recording/changed-bridge-outcomes.ts | 171 - .../rpc-recording/derived-goldens.ts | 47 +- 54 files changed, 1 insertion(+), 22821 deletions(-) delete mode 100644 mobile/rpc-foundation/goldens/diff-review-branch-compare.json delete mode 100644 mobile/rpc-foundation/goldens/diff-review-branch-file-diff.json delete mode 100644 mobile/rpc-foundation/goldens/diff-review-commit-file-diff.json delete mode 100644 mobile/rpc-foundation/goldens/diff-review-refused-file-diff.json delete mode 100644 mobile/rpc-foundation/goldens/diff-review-snapshot.json delete mode 100644 mobile/rpc-foundation/goldens/diff-review-status-unavailable.json delete mode 100644 mobile/rpc-foundation/goldens/diff-review-worktree-file-diff.json delete mode 100644 mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json delete mode 100644 mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-stop-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/native-chat-stop-both-rejected.json delete mode 100644 mobile/rpc-foundation/goldens/pr-branch-identity.json delete mode 100644 mobile/rpc-foundation/goldens/pr-branch-repo-context.json delete mode 100644 mobile/rpc-foundation/goldens/pr-comment-mutation.json delete mode 100644 mobile/rpc-foundation/goldens/pr-comment-posted-in-place.json delete mode 100644 mobile/rpc-foundation/goldens/pr-comment-resolve-unconfirmed.json delete mode 100644 mobile/rpc-foundation/goldens/pr-line-comment-and-file-viewed.json delete mode 100644 mobile/rpc-foundation/goldens/pr-mutation-in-band-failure.json delete mode 100644 mobile/rpc-foundation/goldens/pr-mutation-status.json delete mode 100644 mobile/rpc-foundation/goldens/pr-read-fork-routing.json delete mode 100644 mobile/rpc-foundation/goldens/pr-read-surface.json delete mode 100644 mobile/rpc-foundation/goldens/pr-read-upstream-error.json delete mode 100644 mobile/rpc-foundation/goldens/pr-sidebar-checks-refused.json delete mode 100644 mobile/rpc-foundation/goldens/pr-sidebar-load.json delete mode 100644 mobile/rpc-foundation/goldens/pr-title-mutation.json delete mode 100644 mobile/rpc-foundation/goldens/pr-title-unconfirmed.json delete mode 100644 mobile/rpc-foundation/goldens/review-branch-diff-shapes.json delete mode 100644 mobile/rpc-foundation/goldens/review-create-agent-refused.json delete mode 100644 mobile/rpc-foundation/goldens/review-file-diff-shapes.json delete mode 100644 mobile/rpc-foundation/goldens/review-git-mutations-run.json delete mode 100644 mobile/rpc-foundation/goldens/review-mark-reviewed-persists.json delete mode 100644 mobile/rpc-foundation/goldens/review-open-in-session.json delete mode 100644 mobile/rpc-foundation/goldens/review-send-notes-heals-stale-input.json delete mode 100644 mobile/rpc-foundation/goldens/review-send-sheet-lists-terminals.json delete mode 100644 mobile/rpc-foundation/goldens/review-stage-file.json delete mode 100644 mobile/rpc-foundation/goldens/review-stage-refused.json delete mode 100644 mobile/rpc-foundation/goldens/sc-changes-loaded.json delete mode 100644 mobile/rpc-foundation/goldens/sc-history-branch-commits.json delete mode 100644 mobile/rpc-foundation/goldens/schedules-b3.json delete mode 100644 mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json delete mode 100644 mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/session-markdown-save-conflict.json delete mode 100644 mobile/rpc-foundation/goldens/session-markdown-saved.json delete mode 100644 mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json delete mode 100644 mobile/rpc-foundation/goldens/settings-task-workspace-refused.json delete mode 100644 mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json delete mode 100644 mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json delete mode 100644 mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json diff --git a/mobile/rpc-foundation/goldens/diff-review-branch-compare.json b/mobile/rpc-foundation/goldens/diff-review-branch-compare.json deleted file mode 100644 index 1b35ff75735..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-branch-compare.json +++ /dev/null @@ -1,346 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "284ce622e74a": { - "name": "worktree.show#2", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12 - } - } - } - } - }, - "347ad3543d28": { - "branchCompare": { - "error": "The host sent a reply this app could not read (git.branchCompare)", - "result": { - "$rpc": "null" - } - }, - "diff": "unloaded", - "snapshot": "unloaded" - }, - "412402e093cc": { - "name": "git.branchCompare#2", - "ordinal": 12, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchCompare\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"baseRef\":\"origin/main\"}}" - }, - "4b4f2d7405b8": { - "name": "repo.list#2", - "ordinal": 8, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - } - }, - "4e6543b26313": { - "name": "git.branchCompare#2", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "git.branchCompare" - }, - { - "name": "params", - "value": { - "baseRef": "origin/main", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "entries": [], - "summary": {} - } - } - } - }, - "5b296b205440": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - } - }, - "75328af2b182": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "The host sent a reply this app could not read (git.branchCompare)", - "result": { - "$rpc": "null" - } - } - }, - "80d0ff3c81e8": { - "name": "worktree.show#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "94cc9c5a329b": { - "name": "worktree.show#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12 - } - } - } - } - }, - "9f5d0ac26269": { - "branchCompare": { - "result": { - "$rpc": "null" - } - }, - "diff": "unloaded", - "snapshot": "unloaded" - }, - "ca8f7f7c9891": { - "name": "repo.list#2", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "cf9290001484": { - "name": "git.branchCompare#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.branchCompare" - }, - { - "name": "params", - "value": { - "baseRef": "origin/main", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "git is not available" - }, - "id": "frame-3", - "ok": false - } - } - }, - "d64700b9de3b": { - "name": "repo.list#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "ee6fc162c326": { - "name": "worktree.show#2", - "ordinal": 9, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "ef9013648cfb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "result": { - "$rpc": "null" - } - } - }, - "fb450de97b86": { - "name": "git.branchCompare#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchCompare\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"baseRef\":\"origin/main\"}}" - } - }, - "recording": { - "scenario": "diff-review-branch-compare", - "checkpoints": [ - { - "id": "unavailable", - "observation": { - "sender": ["94cc9c5a329b", "5b296b205440", "cf9290001484"], - "payloads": ["80d0ff3c81e8", "d64700b9de3b", "fb450de97b86"], - "settlements": { - "unavailable": "ef9013648cfb" - }, - "state": "9f5d0ac26269", - "effects": [] - } - }, - { - "id": "invalid", - "observation": { - "sender": [ - "94cc9c5a329b", - "5b296b205440", - "cf9290001484", - "284ce622e74a", - "4b4f2d7405b8", - "4e6543b26313" - ], - "payloads": [ - "80d0ff3c81e8", - "d64700b9de3b", - "fb450de97b86", - "ee6fc162c326", - "ca8f7f7c9891", - "412402e093cc" - ], - "settlements": { - "unavailable": "ef9013648cfb", - "invalid": "75328af2b182" - }, - "state": "347ad3543d28", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/diff-review-branch-file-diff.json b/mobile/rpc-foundation/goldens/diff-review-branch-file-diff.json deleted file mode 100644 index 7271a34bd62..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-branch-file-diff.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "365c17523d76": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "branch:src/app.ts", - "kind": "binary" - } - }, - "38fb361f406c": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Committed diff is unavailable", - "isRpcDeliveryUnknown": false - } - }, - "534cf7badcbc": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "branch:src/app.ts", - "kind": "binary" - }, - "snapshot": "unloaded" - }, - "ce804facf021": { - "name": "git.branchDiff#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchDiff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"compare\":{\"baseRef\":\"origin/main\",\"baseOid\":\"a1b2c3d4e5f60718293a4b5c6d7e8f9012345678\",\"headOid\":\"f0e1d2c3b4a5968778695a4b3c2d1e0f98765432\",\"mergeBase\":\"0123456789abcdef0123456789abcdef01234567\"}}}" - }, - "d24ea9d9187c": { - "name": "git.branchDiff#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.branchDiff" - }, - { - "name": "params", - "value": { - "compare": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/main", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567" - }, - "filePath": "src/app.ts", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "kind": "binary" - } - } - } - } - }, - "recording": { - "scenario": "diff-review-branch-file-diff", - "checkpoints": [ - { - "id": "branch", - "observation": { - "sender": ["d24ea9d9187c"], - "payloads": ["ce804facf021"], - "settlements": { - "branch": "365c17523d76" - }, - "state": "534cf7badcbc", - "effects": [] - } - }, - { - "id": "no-compare", - "observation": { - "sender": ["d24ea9d9187c"], - "payloads": ["ce804facf021"], - "settlements": { - "branch": "365c17523d76", - "no-compare": "38fb361f406c" - }, - "state": "534cf7badcbc", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/diff-review-commit-file-diff.json b/mobile/rpc-foundation/goldens/diff-review-commit-file-diff.json deleted file mode 100644 index 2c347ca999c..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-commit-file-diff.json +++ /dev/null @@ -1,301 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "5dc9494ad121": { - "name": "git.commitDiff#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.commitDiff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"commitOid\":\"c0ffee0123456789abcdef0123456789abcdef01\",\"parentOid\":\"beef0123456789abcdef0123456789abcdef0123\"}}" - }, - "61b51593919d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [], - "commit": { - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "entries": [ - { - "added": 2, - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "parentOid": "beef0123456789abcdef0123456789abcdef0123" - }, - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "conflictOperation": "unknown", - "entries": [] - } - } - }, - "731c50dc5312": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "commit:src/app.ts", - "kind": "ready", - "lines": [ - { - "highlighted": true, - "kind": "context", - "newLineNumber": 1, - "oldLineNumber": 1, - "segments": [ - { - "kind": "plain", - "text": "a" - } - ], - "text": "a" - }, - { - "highlighted": true, - "kind": "add", - "newLineNumber": 2, - "segments": [ - { - "kind": "plain", - "text": "b" - } - ], - "text": "b" - } - ], - "truncated": false - }, - "snapshot": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [], - "commit": { - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "entries": [ - { - "added": 2, - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "parentOid": "beef0123456789abcdef0123456789abcdef0123" - }, - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "conflictOperation": "unknown", - "entries": [] - } - } - }, - "73a10d522a32": { - "branchCompare": "unloaded", - "diff": "unloaded", - "snapshot": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [], - "commit": { - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "entries": [ - { - "added": 2, - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "parentOid": "beef0123456789abcdef0123456789abcdef0123" - }, - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "conflictOperation": "unknown", - "entries": [] - } - } - }, - "78129084c077": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "commit:src/app.ts", - "kind": "ready", - "lines": [ - { - "highlighted": true, - "kind": "context", - "newLineNumber": 1, - "oldLineNumber": 1, - "segments": [ - { - "kind": "plain", - "text": "a" - } - ], - "text": "a" - }, - { - "highlighted": true, - "kind": "add", - "newLineNumber": 2, - "segments": [ - { - "kind": "plain", - "text": "b" - } - ], - "text": "b" - } - ], - "truncated": false - } - }, - "8c562385dc94": { - "name": "git.commitDiff#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "git.commitDiff" - }, - { - "name": "params", - "value": { - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "filePath": "src/app.ts", - "parentOid": "beef0123456789abcdef0123456789abcdef0123", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "kind": "text", - "modifiedContent": "a\nb\n", - "modifiedIsBinary": false, - "originalContent": "a\n", - "originalIsBinary": false - } - } - } - }, - "9d48143d94db": { - "name": "git.commitCompare#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.commitCompare\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"commitId\":\"c0ffee0123456789abcdef0123456789abcdef01\"}}" - }, - "f9d60d9b8a69": { - "name": "git.commitCompare#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.commitCompare" - }, - { - "name": "params", - "value": { - "commitId": "c0ffee0123456789abcdef0123456789abcdef01", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "entries": [ - { - "added": 2, - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "summary": { - "baseRef": "beef012", - "changedFiles": 1, - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "compareRef": "c0ffee0", - "parentOid": "beef0123456789abcdef0123456789abcdef0123", - "status": "ready" - } - } - } - } - } - }, - "recording": { - "scenario": "diff-review-commit-file-diff", - "checkpoints": [ - { - "id": "commit", - "observation": { - "sender": ["f9d60d9b8a69"], - "payloads": ["9d48143d94db"], - "settlements": { - "commit": "61b51593919d" - }, - "state": "73a10d522a32", - "effects": [] - } - }, - { - "id": "commit-file", - "observation": { - "sender": ["f9d60d9b8a69", "8c562385dc94"], - "payloads": ["9d48143d94db", "5dc9494ad121"], - "settlements": { - "commit": "61b51593919d", - "commit-file": "78129084c077" - }, - "state": "731c50dc5312", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/diff-review-refused-file-diff.json b/mobile/rpc-foundation/goldens/diff-review-refused-file-diff.json deleted file mode 100644 index becc31b4f3a..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-refused-file-diff.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "0698901154de": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "unstaged:src/app.ts", - "kind": "too-large" - } - }, - "18072d796980": { - "name": "git.diff#3", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "2ecd0366533c": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "unstaged:src/app.ts", - "kind": "deleted" - } - }, - "33908d1938b7": { - "name": "git.diff#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "481bd3924019": { - "name": "git.diff#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "5768cc374e1d": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "unstaged:src/app.ts", - "kind": "too-large" - }, - "snapshot": "unloaded" - }, - "67daf7391fee": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Unable to load diff", - "isRpcDeliveryUnknown": false - } - }, - "a71fa2bf76b8": { - "name": "git.diff#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "diff_too_large", - "message": "Diff exceeds the limit" - }, - "id": "frame-1", - "ok": false - } - } - }, - "abf08f796be3": { - "name": "git.diff#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "internal", - "message": "boom" - }, - "id": "frame-2", - "ok": false - } - } - }, - "b9d9c7cacbea": { - "name": "git.diff#3", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "internal", - "message": "" - }, - "id": "frame-3", - "ok": false - } - } - }, - "f10ae0495f82": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "unstaged:src/app.ts", - "kind": "deleted" - }, - "snapshot": "unloaded" - } - }, - "recording": { - "scenario": "diff-review-refused-file-diff", - "checkpoints": [ - { - "id": "diff-too-large", - "observation": { - "sender": ["a71fa2bf76b8"], - "payloads": ["481bd3924019"], - "settlements": { - "diff-too-large": "0698901154de" - }, - "state": "5768cc374e1d", - "effects": [] - } - }, - { - "id": "deleted", - "observation": { - "sender": ["a71fa2bf76b8", "abf08f796be3"], - "payloads": ["481bd3924019", "33908d1938b7"], - "settlements": { - "diff-too-large": "0698901154de", - "deleted": "2ecd0366533c" - }, - "state": "f10ae0495f82", - "effects": [] - } - }, - { - "id": "refused", - "observation": { - "sender": ["a71fa2bf76b8", "abf08f796be3", "b9d9c7cacbea"], - "payloads": ["481bd3924019", "33908d1938b7", "18072d796980"], - "settlements": { - "diff-too-large": "0698901154de", - "deleted": "2ecd0366533c", - "refused": "67daf7391fee" - }, - "state": "f10ae0495f82", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/diff-review-snapshot.json b/mobile/rpc-foundation/goldens/diff-review-snapshot.json deleted file mode 100644 index 94055347fae..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-snapshot.json +++ /dev/null @@ -1,537 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "11e9ea6be860": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "1f10fad6906c": { - "name": "worktree.show#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "3374ccf2bc9a": { - "name": "repo.list#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "411c662db736": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "branchCompare": { - "entries": [ - { - "added": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/old.ts", - "removed": 0, - "status": "modified" - } - ], - "summary": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/main", - "changedFiles": 1, - "commitsAhead": { - "$rpc": "undefined" - }, - "compareRef": "feature", - "errorMessage": { - "$rpc": "undefined" - }, - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "status": "ready" - } - }, - "branchError": { - "$rpc": "undefined" - }, - "comments": [], - "kind": "ready", - "reviewState": { - "completedAt": { - "$rpc": "undefined" - }, - "files": { - "branch\u0000branch\u0000\u0000src/old.ts": { - "filePath": "src/old.ts", - "key": "branch\u0000branch\u0000\u0000src/old.ts", - "lastOpenedAt": { - "$rpc": "undefined" - }, - "lastSeenDiffIdentity": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "reviewDiffIdentity": { - "$rpc": "undefined" - }, - "reviewedAt": { - "$rpc": "undefined" - }, - "scope": "branch" - }, - "unstaged\u0000unstaged\u0000\u0000src/app.ts": { - "filePath": "src/app.ts", - "key": "unstaged\u0000unstaged\u0000\u0000src/app.ts", - "lastOpenedAt": { - "$rpc": "undefined" - }, - "lastSeenDiffIdentity": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "reviewDiffIdentity": { - "$rpc": "undefined" - }, - "reviewedAt": { - "$rpc": "undefined" - }, - "scope": "unstaged" - } - }, - "updatedAt": 1767225600000, - "version": 1 - }, - "status": { - "branch": "feature", - "entries": [ - { - "added": 3, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "head": "head-sha-1", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - }, - "5abf3b2ba503": { - "branchCompare": "unloaded", - "diff": "unloaded", - "snapshot": { - "branchCompare": { - "entries": [ - { - "added": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/old.ts", - "removed": 0, - "status": "modified" - } - ], - "summary": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/main", - "changedFiles": 1, - "commitsAhead": { - "$rpc": "undefined" - }, - "compareRef": "feature", - "errorMessage": { - "$rpc": "undefined" - }, - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "status": "ready" - } - }, - "branchError": { - "$rpc": "undefined" - }, - "comments": [], - "kind": "ready", - "reviewState": { - "completedAt": { - "$rpc": "undefined" - }, - "files": { - "branch\u0000branch\u0000\u0000src/old.ts": { - "filePath": "src/old.ts", - "key": "branch\u0000branch\u0000\u0000src/old.ts", - "lastOpenedAt": { - "$rpc": "undefined" - }, - "lastSeenDiffIdentity": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "reviewDiffIdentity": { - "$rpc": "undefined" - }, - "reviewedAt": { - "$rpc": "undefined" - }, - "scope": "branch" - }, - "unstaged\u0000unstaged\u0000\u0000src/app.ts": { - "filePath": "src/app.ts", - "key": "unstaged\u0000unstaged\u0000\u0000src/app.ts", - "lastOpenedAt": { - "$rpc": "undefined" - }, - "lastSeenDiffIdentity": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "reviewDiffIdentity": { - "$rpc": "undefined" - }, - "reviewedAt": { - "$rpc": "undefined" - }, - "scope": "unstaged" - } - }, - "updatedAt": 1767225600000, - "version": 1 - }, - "status": { - "branch": "feature", - "entries": [ - { - "added": 3, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "head": "head-sha-1", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - }, - "5dbd52d6a1c7": { - "name": "worktree.show#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "5dd74fdeb001": { - "name": "worktree.show#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "diffComments": [], - "linkedPR": 12, - "mobileDiffReview": { - "files": [] - } - } - } - } - } - }, - "622e5aadb43d": { - "name": "git.branchCompare#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchCompare\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"baseRef\":\"origin/main\"}}" - }, - "648638103acb": { - "name": "repo.list#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "8db27b0778a5": { - "name": "git.status#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "9affac551982": { - "name": "repo.list#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - } - }, - "c0f7fd87f4a5": { - "name": "git.branchCompare#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "git.branchCompare" - }, - { - "name": "params", - "value": { - "baseRef": "origin/main", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "entries": [ - { - "added": 1, - "path": "src/old.ts", - "removed": 0, - "status": "modified" - } - ], - "summary": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/main", - "changedFiles": 1, - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "status": "ready" - } - } - } - } - }, - "d0e28a73dae6": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "branch": "feature", - "entries": [ - { - "added": 3, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "head": "head-sha-1", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "e39817462870": { - "branchCompare": "unloaded", - "diff": "unloaded", - "snapshot": "unloaded" - } - }, - "recording": { - "scenario": "diff-review-snapshot", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["11e9ea6be860", "1f10fad6906c", "3374ccf2bc9a"], - "payloads": ["8db27b0778a5", "5dbd52d6a1c7", "648638103acb"], - "settlements": { - "snapshot": "9270aeb7d9c6" - }, - "state": "e39817462870", - "effects": [] - } - }, - { - "id": "snapshot", - "observation": { - "sender": ["d0e28a73dae6", "5dd74fdeb001", "9affac551982", "c0f7fd87f4a5"], - "payloads": ["8db27b0778a5", "5dbd52d6a1c7", "648638103acb", "622e5aadb43d"], - "settlements": { - "snapshot": "411c662db736" - }, - "state": "5abf3b2ba503", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/diff-review-status-unavailable.json b/mobile/rpc-foundation/goldens/diff-review-status-unavailable.json deleted file mode 100644 index e2932cf1785..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-status-unavailable.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "1f10fad6906c": { - "name": "worktree.show#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "3374ccf2bc9a": { - "name": "repo.list#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "45d1ea7c0b42": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - }, - "5dbd52d6a1c7": { - "name": "worktree.show#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "648638103acb": { - "name": "repo.list#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "8db27b0778a5": { - "name": "git.status#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "e39817462870": { - "branchCompare": "unloaded", - "diff": "unloaded", - "snapshot": "unloaded" - } - }, - "recording": { - "scenario": "diff-review-status-unavailable", - "checkpoints": [ - { - "id": "unavailable", - "observation": { - "sender": ["45d1ea7c0b42", "1f10fad6906c", "3374ccf2bc9a"], - "payloads": ["8db27b0778a5", "5dbd52d6a1c7", "648638103acb"], - "settlements": { - "unavailable": "9270aeb7d9c6" - }, - "state": "e39817462870", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/diff-review-worktree-file-diff.json b/mobile/rpc-foundation/goldens/diff-review-worktree-file-diff.json deleted file mode 100644 index c712ae8a777..00000000000 --- a/mobile/rpc-foundation/goldens/diff-review-worktree-file-diff.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.diff-review", - "namedDeltas": [], - "values": { - "168eeea61142": { - "name": "git.diff#3", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "kind": "unknown" - } - } - } - }, - "18072d796980": { - "name": "git.diff#3", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "481bd3924019": { - "name": "git.diff#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "50bd7426ef76": { - "name": "git.diff#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "kind": "binary" - } - } - } - }, - "5135c435b058": { - "name": "git.diff#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": true, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "byteLength": 2048, - "kind": "too-large" - } - } - } - }, - "717bd1fbc163": { - "branchCompare": "unloaded", - "diff": { - "byteLength": 2048, - "itemKey": "staged:src/app.ts", - "kind": "too-large" - }, - "snapshot": "unloaded" - }, - "7753343578da": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "The host sent a reply this app could not read (git.diff)", - "isRpcDeliveryUnknown": false - } - }, - "84090dfad90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "unstaged:src/app.ts", - "kind": "binary" - } - }, - "8675e0f40158": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "byteLength": 2048, - "itemKey": "staged:src/app.ts", - "kind": "too-large" - } - }, - "ea98fa53e2cc": { - "name": "git.diff#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":true}}" - }, - "f68945ffc2ea": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "unstaged:src/app.ts", - "kind": "binary" - }, - "snapshot": "unloaded" - } - }, - "recording": { - "scenario": "diff-review-worktree-file-diff", - "checkpoints": [ - { - "id": "binary", - "observation": { - "sender": ["50bd7426ef76"], - "payloads": ["481bd3924019"], - "settlements": { - "binary": "84090dfad90d" - }, - "state": "f68945ffc2ea", - "effects": [] - } - }, - { - "id": "too-large", - "observation": { - "sender": ["50bd7426ef76", "5135c435b058"], - "payloads": ["481bd3924019", "ea98fa53e2cc"], - "settlements": { - "binary": "84090dfad90d", - "too-large": "8675e0f40158" - }, - "state": "717bd1fbc163", - "effects": [] - } - }, - { - "id": "invalid", - "observation": { - "sender": ["50bd7426ef76", "5135c435b058", "168eeea61142"], - "payloads": ["481bd3924019", "ea98fa53e2cc", "18072d796980"], - "settlements": { - "binary": "84090dfad90d", - "too-large": "8675e0f40158", - "invalid": "7753343578da" - }, - "state": "717bd1fbc163", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json b/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json deleted file mode 100644 index d2c3253735a..00000000000 --- a/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json +++ /dev/null @@ -1,262 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "workspace.file-inventory", - "family": "legacy-inventory", - "namedDeltas": [], - "values": { - "13ef648b37c5": { - "name": "files.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "files.list" - }, - { - "name": "params", - "value": { - "worktree": "id:A" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 120, - "settledAt": 120, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "32c9018052ba": { - "name": "files.searchPaths#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.searchPaths" - }, - { - "name": "params", - "value": { - "limit": 16, - "query": "old", - "worktree": "id:A" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 120, - "settledAt": 120, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method" - }, - "id": "frame-1", - "ok": false - } - } - }, - "4d27427720e9": { - "name": "files.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "files.list" - }, - { - "name": "params", - "value": { - "worktree": "id:A" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 120, - "settledAt": 30120, - "error": { - "category": "Error", - "message": "Request timed out: files.list", - "isRpcDeliveryUnknown": true - } - } - }, - "602e35a92eec": { - "files": [] - }, - "8db0d1234c94": { - "name": "files.searchPaths#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.searchPaths\",\"params\":{\"worktree\":\"id:A\",\"query\":\"old\",\"limit\":16}}" - }, - "c9b9d7a9b388": { - "name": "files.list#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"files.list\",\"params\":{\"worktree\":\"id:A\"}}" - }, - "d2ad71e601c4": { - "status": "fulfilled", - "startedAt": 120, - "settledAt": 120, - "value": { - "$rpc": "undefined" - } - }, - "d831c788243a": { - "name": "files.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "files.list" - }, - { - "name": "params", - "value": { - "worktree": "id:A" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 120, - "settledAt": 120, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "interruptions-inventory-lifecycle", - "checkpoints": [ - { - "id": "inventory-lifecycle.timeout:interrupted", - "observation": { - "sender": ["32c9018052ba", "4d27427720e9"], - "payloads": ["8db0d1234c94", "c9b9d7a9b388"], - "settlements": { - "mount": "eb79a9b3682a", - "old": "eb79a9b3682a" - }, - "state": "602e35a92eec", - "effects": [] - } - }, - { - "id": "inventory-lifecycle.timeout:settled", - "observation": { - "sender": ["32c9018052ba", "4d27427720e9"], - "payloads": ["8db0d1234c94", "c9b9d7a9b388"], - "settlements": { - "mount": "eb79a9b3682a", - "old": "eb79a9b3682a" - }, - "state": "602e35a92eec", - "effects": [] - } - }, - { - "id": "inventory-lifecycle.disconnect:interrupted", - "observation": { - "sender": ["32c9018052ba", "13ef648b37c5"], - "payloads": ["8db0d1234c94", "c9b9d7a9b388"], - "settlements": { - "mount": "eb79a9b3682a", - "old": "eb79a9b3682a", - "disconnect": "d2ad71e601c4" - }, - "state": "602e35a92eec", - "effects": [] - } - }, - { - "id": "inventory-lifecycle.disconnect:settled", - "observation": { - "sender": ["32c9018052ba", "13ef648b37c5"], - "payloads": ["8db0d1234c94", "c9b9d7a9b388"], - "settlements": { - "mount": "eb79a9b3682a", - "old": "eb79a9b3682a", - "disconnect": "d2ad71e601c4" - }, - "state": "602e35a92eec", - "effects": [] - } - }, - { - "id": "inventory-lifecycle.cutover:interrupted", - "observation": { - "sender": ["32c9018052ba", "d831c788243a"], - "payloads": ["8db0d1234c94", "c9b9d7a9b388"], - "settlements": { - "mount": "eb79a9b3682a", - "old": "eb79a9b3682a", - "cutover": "d2ad71e601c4" - }, - "state": "602e35a92eec", - "effects": [] - } - }, - { - "id": "inventory-lifecycle.cutover:settled", - "observation": { - "sender": ["32c9018052ba", "d831c788243a"], - "payloads": ["8db0d1234c94", "c9b9d7a9b388"], - "settlements": { - "mount": "eb79a9b3682a", - "old": "eb79a9b3682a", - "cutover": "d2ad71e601c4" - }, - "state": "602e35a92eec", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json b/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json deleted file mode 100644 index a81d89d082d..00000000000 --- a/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.bot-overrides", - "family": "settings.bot-overrides", - "namedDeltas": [], - "values": { - "1a10a74b4157": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - } - }, - "1e38f5df2fc6": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "4f53cda18c2b": [], - "b6a74921f3bd": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "c8c77ac17e0a": { - "name": "settings.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "e3973bb12da1": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "interruptions-settings-bot-overrides-fulfilled", - "checkpoints": [ - { - "id": "settings-bot-overrides-fulfilled.prelude:settings-pending", - "observation": { - "sender": ["e3973bb12da1"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settings-bot-overrides-fulfilled.timeout:interrupted", - "observation": { - "sender": ["1a10a74b4157"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settings-bot-overrides-fulfilled.timeout:settled", - "observation": { - "sender": ["1a10a74b4157"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settings-bot-overrides-fulfilled.disconnect:interrupted", - "observation": { - "sender": ["b6a74921f3bd"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settings-bot-overrides-fulfilled.disconnect:settled", - "observation": { - "sender": ["b6a74921f3bd"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settings-bot-overrides-fulfilled.cutover:interrupted", - "observation": { - "sender": ["1e38f5df2fc6"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - }, - { - "id": "settings-bot-overrides-fulfilled.cutover:settled", - "observation": { - "sender": ["1e38f5df2fc6"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "4f53cda18c2b", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-stop-accepted.json b/mobile/rpc-foundation/goldens/native-chat-stop-accepted.json deleted file mode 100644 index e7505c4462a..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-stop-accepted.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.native-chat-stop", - "family": "session.native-chat-stop", - "namedDeltas": [], - "values": { - "3e2d28f3728b": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 1000, - "value": true - }, - "5cd1d4a9aed5": { - "name": "terminal.send#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "75263c07c807": { - "name": "cancel-pending", - "ordinal": 1, - "value": {} - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "ab0f3d65723e": { - "name": "terminal.send#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "d5972c43f562": { - "name": "terminal.send#2", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "da95ce195845": { - "name": "terminal.send#2", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 14000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 1000, - "settledAt": 1000, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "debf84af8d66": { - "errors": [] - } - }, - "recording": { - "scenario": "native-chat-stop-accepted", - "checkpoints": [ - { - "id": "first-accepted", - "observation": { - "sender": ["ab0f3d65723e"], - "payloads": ["5cd1d4a9aed5"], - "settlements": { - "stop": "9270aeb7d9c6" - }, - "state": "debf84af8d66", - "effects": ["75263c07c807"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["ab0f3d65723e", "da95ce195845"], - "payloads": ["5cd1d4a9aed5", "d5972c43f562"], - "settlements": { - "stop": "3e2d28f3728b" - }, - "state": "debf84af8d66", - "effects": ["75263c07c807"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/native-chat-stop-both-rejected.json b/mobile/rpc-foundation/goldens/native-chat-stop-both-rejected.json deleted file mode 100644 index a0195d1297b..00000000000 --- a/mobile/rpc-foundation/goldens/native-chat-stop-both-rejected.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.native-chat-stop", - "family": "session.native-chat-stop", - "namedDeltas": [], - "values": { - "5cd1d4a9aed5": { - "name": "terminal.send#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "6b21adc16f94": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 1000, - "value": false - }, - "75263c07c807": { - "name": "cancel-pending", - "ordinal": 1, - "value": {} - }, - "81225cffe7a1": { - "name": "terminal.send#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - } - }, - "d5972c43f562": { - "name": "terminal.send#2", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "db139841535a": { - "name": "terminal.send#2", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 14000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 1000, - "settledAt": 1000, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - } - }, - "e6e087b39540": { - "errors": ["Stop not sent"] - } - }, - "recording": { - "scenario": "native-chat-stop-both-rejected", - "checkpoints": [ - { - "id": "reported", - "observation": { - "sender": ["81225cffe7a1", "db139841535a"], - "payloads": ["5cd1d4a9aed5", "d5972c43f562"], - "settlements": { - "stop": "6b21adc16f94" - }, - "state": "e6e087b39540", - "effects": ["75263c07c807"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-branch-identity.json b/mobile/rpc-foundation/goldens/pr-branch-identity.json deleted file mode 100644 index 42765d4ae19..00000000000 --- a/mobile/rpc-foundation/goldens/pr-branch-identity.json +++ /dev/null @@ -1,427 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-branch-context", - "family": "session.pr-branch-context", - "namedDeltas": [], - "values": { - "064ec5d09de8": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "branch": "feature", - "headSha": "head-sha-1", - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [ - { - "added": 3, - "area": "unstaged", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/app.ts", - "removed": 1, - "status": "modified", - "submodule": { - "$rpc": "undefined" - }, - "submoduleRoot": { - "$rpc": "undefined" - } - } - ], - "head": "head-sha-1", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - } - } - }, - "0fc11d9bf2a5": { - "name": "worktree.show#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12 - } - } - } - } - }, - "11e9ea6be860": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "189a62313626": { - "name": "repo.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - } - }, - "1f10fad6906c": { - "name": "worktree.show#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "622e5aadb43d": { - "name": "git.branchCompare#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchCompare\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"baseRef\":\"origin/main\"}}" - }, - "648638103acb": { - "name": "repo.list#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "6da1f95af186": { - "identity": "unread", - "repoContext": "unread" - }, - "738aa9f40ba9": { - "name": "repo.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "c0f7fd87f4a5": { - "name": "git.branchCompare#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "git.branchCompare" - }, - { - "name": "params", - "value": { - "baseRef": "origin/main", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "entries": [ - { - "added": 1, - "path": "src/old.ts", - "removed": 0, - "status": "modified" - } - ], - "summary": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/main", - "changedFiles": 1, - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "status": "ready" - } - } - } - } - }, - "d0e28a73dae6": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "branch": "feature", - "entries": [ - { - "added": 3, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "head": "head-sha-1", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "d45add7a8589": { - "name": "git.status#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "ea4c904bfb5f": { - "name": "worktree.show#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "eddcdff704c3": { - "identity": { - "branch": "feature", - "headSha": "head-sha-1", - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [ - { - "added": 3, - "area": "unstaged", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/app.ts", - "removed": 1, - "status": "modified", - "submodule": { - "$rpc": "undefined" - }, - "submoduleRoot": { - "$rpc": "undefined" - } - } - ], - "head": "head-sha-1", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - } - }, - "repoContext": "unread" - } - }, - "recording": { - "scenario": "pr-branch-identity", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["11e9ea6be860", "1f10fad6906c", "738aa9f40ba9"], - "payloads": ["d45add7a8589", "ea4c904bfb5f", "648638103acb"], - "settlements": { - "identity": "9270aeb7d9c6" - }, - "state": "6da1f95af186", - "effects": [] - } - }, - { - "id": "identity", - "observation": { - "sender": ["d0e28a73dae6", "0fc11d9bf2a5", "189a62313626", "c0f7fd87f4a5"], - "payloads": ["d45add7a8589", "ea4c904bfb5f", "648638103acb", "622e5aadb43d"], - "settlements": { - "identity": "064ec5d09de8" - }, - "state": "eddcdff704c3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-branch-repo-context.json b/mobile/rpc-foundation/goldens/pr-branch-repo-context.json deleted file mode 100644 index e574fdd4b11..00000000000 --- a/mobile/rpc-foundation/goldens/pr-branch-repo-context.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-branch-context", - "family": "session.pr-branch-context", - "namedDeltas": [], - "values": { - "191e3c96ad53": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - } - } - }, - "1f5765918736": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-9\"}}" - }, - "364d823c309f": { - "identity": "unread", - "repoContext": { - "isGithubRepo": true - } - }, - "79c69a644fe2": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "isGithubRepo": true - } - } - }, - "recording": { - "scenario": "pr-branch-repo-context", - "checkpoints": [ - { - "id": "repo-context", - "observation": { - "sender": ["191e3c96ad53"], - "payloads": ["1f5765918736"], - "settlements": { - "repo-context": "79c69a644fe2" - }, - "state": "364d823c309f", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-comment-mutation.json b/mobile/rpc-foundation/goldens/pr-comment-mutation.json deleted file mode 100644 index ade0b135294..00000000000 --- a/mobile/rpc-foundation/goldens/pr-comment-mutation.json +++ /dev/null @@ -1,384 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-comment-mutation", - "namedDeltas": [], - "values": { - "14120b04af8e": { - "name": "github.project.updateIssueCommentBySlug#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "github.project.updateIssueCommentBySlug" - }, - { - "name": "params", - "value": { - "body": "edited", - "commentId": 55, - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "2dd1ced3c6e3": { - "edit-comment": { - "ok": true - }, - "reply": { - "ok": true - }, - "resolve-thread": { - "ok": true - }, - "root-comment": { - "ok": true - } - }, - "44136fa355b3": {}, - "58627406aba1": { - "name": "github.addPRReviewCommentReply#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.addPRReviewCommentReply\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"commentId\":55,\"body\":\"recorded reply\",\"threadId\":\"thread-1\",\"path\":\"src/app.ts\",\"line\":3}}" - }, - "6053fd8b5f02": { - "name": "github.resolveReviewThread#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.resolveReviewThread\",\"params\":{\"repo\":\"id:repo-9\",\"threadId\":\"thread-1\",\"resolve\":true}}" - }, - "720507281e9c": { - "reply": { - "ok": true - }, - "resolve-thread": { - "ok": true - }, - "root-comment": { - "ok": true - } - }, - "a03244774599": { - "reply": { - "ok": true - }, - "root-comment": { - "ok": true - } - }, - "a07493bedc8a": { - "name": "github.project.deleteIssueCommentBySlug#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.project.deleteIssueCommentBySlug" - }, - { - "name": "params", - "value": { - "commentId": 55, - "owner": "owner", - "repo": "repo" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "a76ab6b460fe": { - "name": "github.addIssueComment#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.addIssueComment\",\"params\":{\"repo\":\"id:repo-9\",\"number\":12,\"body\":\"recorded comment\",\"type\":\"pr\"}}" - }, - "a780f3a81230": { - "name": "github.addIssueComment#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.addIssueComment" - }, - { - "name": "params", - "value": { - "body": "recorded comment", - "number": 12, - "repo": "id:repo-9", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "comment": { - "id": 57 - }, - "ok": true - } - } - } - }, - "a80b00127a67": { - "name": "github.resolveReviewThread#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.resolveReviewThread" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9", - "resolve": true, - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": true - } - } - }, - "aaea0ed8039c": { - "name": "github.project.updateIssueCommentBySlug#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.updateIssueCommentBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"commentId\":55,\"body\":\"edited\"}}" - }, - "b038a4dffade": { - "name": "github.project.deleteIssueCommentBySlug#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.project.deleteIssueCommentBySlug\",\"params\":{\"owner\":\"owner\",\"repo\":\"repo\",\"commentId\":55}}" - }, - "b9fd8579bf37": { - "name": "github.addPRReviewCommentReply#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.addPRReviewCommentReply" - }, - { - "name": "params", - "value": { - "body": "recorded reply", - "commentId": 55, - "line": 3, - "path": "src/app.ts", - "prNumber": 12, - "repo": "id:repo-9", - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "comment": { - "id": 56 - }, - "ok": true - } - } - } - }, - "d65744cb322a": { - "delete-comment": { - "ok": true - }, - "edit-comment": { - "ok": true - }, - "reply": { - "ok": true - }, - "resolve-thread": { - "ok": true - }, - "root-comment": { - "ok": true - } - }, - "d7020c20297f": { - "reply": { - "ok": true - } - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - } - }, - "recording": { - "scenario": "pr-comment-mutation", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": [], - "payloads": [], - "settlements": {}, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "reply", - "observation": { - "sender": ["b9fd8579bf37"], - "payloads": ["58627406aba1"], - "settlements": { - "reply": "fbc958e4d46e" - }, - "state": "d7020c20297f", - "effects": [] - } - }, - { - "id": "root-comment", - "observation": { - "sender": ["b9fd8579bf37", "a780f3a81230"], - "payloads": ["58627406aba1", "a76ab6b460fe"], - "settlements": { - "reply": "fbc958e4d46e", - "root-comment": "fbc958e4d46e" - }, - "state": "a03244774599", - "effects": [] - } - }, - { - "id": "resolve-thread", - "observation": { - "sender": ["b9fd8579bf37", "a780f3a81230", "a80b00127a67"], - "payloads": ["58627406aba1", "a76ab6b460fe", "6053fd8b5f02"], - "settlements": { - "reply": "fbc958e4d46e", - "root-comment": "fbc958e4d46e", - "resolve-thread": "fbc958e4d46e" - }, - "state": "720507281e9c", - "effects": [] - } - }, - { - "id": "edit-comment", - "observation": { - "sender": ["b9fd8579bf37", "a780f3a81230", "a80b00127a67", "14120b04af8e"], - "payloads": ["58627406aba1", "a76ab6b460fe", "6053fd8b5f02", "aaea0ed8039c"], - "settlements": { - "reply": "fbc958e4d46e", - "root-comment": "fbc958e4d46e", - "resolve-thread": "fbc958e4d46e", - "edit-comment": "fbc958e4d46e" - }, - "state": "2dd1ced3c6e3", - "effects": [] - } - }, - { - "id": "delete-comment", - "observation": { - "sender": [ - "b9fd8579bf37", - "a780f3a81230", - "a80b00127a67", - "14120b04af8e", - "a07493bedc8a" - ], - "payloads": [ - "58627406aba1", - "a76ab6b460fe", - "6053fd8b5f02", - "aaea0ed8039c", - "b038a4dffade" - ], - "settlements": { - "reply": "fbc958e4d46e", - "root-comment": "fbc958e4d46e", - "resolve-thread": "fbc958e4d46e", - "edit-comment": "fbc958e4d46e", - "delete-comment": "fbc958e4d46e" - }, - "state": "d65744cb322a", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-comment-posted-in-place.json b/mobile/rpc-foundation/goldens/pr-comment-posted-in-place.json deleted file mode 100644 index ebd3e2354a8..00000000000 --- a/mobile/rpc-foundation/goldens/pr-comment-posted-in-place.json +++ /dev/null @@ -1,877 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-sidebar", - "family": "session.pr-sidebar", - "namedDeltas": [], - "values": { - "0730389db3e9": { - "name": "hostedReview.forBranch#1", - "ordinal": 7, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.forBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedGitHubPR\":null,\"active\":true}}" - }, - "0d9f7988ff86": { - "name": "github.prChecks#1", - "ordinal": 13, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"headSha\":\"head-sha-1\"}}" - }, - "1287167eaf56": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - } - }, - "1e1163c70eba": { - "name": "github.prComments#1", - "ordinal": 19, - "args": [ - { - "name": "method", - "value": "github.prComments" - }, - { - "name": "params", - "value": { - "noCache": true, - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "1f5765918736": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-9\"}}" - }, - "2dc2ca47b4e7": { - "name": "github.prForBranch#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "acceptMergedFallbackPR": true, - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": 12, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "35045fa5a752": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "kind": "loading" - } - }, - "357f9b7862e3": { - "name": "worktree.show#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "3a8e6b13f380": { - "name": "github.prForBranch#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":12,\"acceptMergedFallbackPR\":true,\"currentHeadOid\":null}}" - }, - "3b2df6b54829": { - "name": "github.addIssueComment#1", - "ordinal": 17, - "args": [ - { - "name": "method", - "value": "github.addIssueComment" - }, - { - "name": "params", - "value": { - "body": "recorded comment", - "number": 12, - "repo": "id:repo-9", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-9", - "ok": true, - "result": { - "comment": { - "id": 57 - }, - "ok": true - } - } - } - }, - "3ecc2d44a209": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "4da7ea39401b": { - "name": "worktree.show#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "worktree": { - "linkedPR": { - "$rpc": "null" - } - } - } - } - } - }, - "5d309fcf43a7": { - "name": "github.workItemDetails#1", - "ordinal": 16, - "json": "{\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-9\",\"number\":12,\"type\":\"pr\"}}" - }, - "75885386f005": { - "name": "hostedReview.forBranch#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "hostedReview.forBranch" - }, - { - "name": "params", - "value": { - "active": true, - "branch": "feature", - "linkedGitHubPR": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - }, - "7881ab1fb5d1": { - "name": "github.addIssueComment#1", - "ordinal": 18, - "json": "{\"id\":\"frame-9\",\"deviceToken\":\"recording-device\",\"method\":\"github.addIssueComment\",\"params\":{\"repo\":\"id:repo-9\",\"number\":12,\"body\":\"recorded comment\",\"type\":\"pr\"}}" - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "861c8796ae1f": { - "name": "github.prChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "status": "completed" - } - ] - } - } - }, - "870c2b9bacd0": { - "name": "status.get#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "8b7e690466d7": { - "name": "status.get#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "runtimeId": "recorded" - } - } - } - }, - "8f35f3a8538e": { - "name": "github.prComments#1", - "ordinal": 20, - "json": "{\"id\":\"frame-10\",\"deviceToken\":\"recording-device\",\"method\":\"github.prComments\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"noCache\":true,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"}}}" - }, - "9091d133c3b0": { - "name": "reply-salvage", - "ordinal": 8, - "value": { - "droppedCount": 1, - "droppedPaths": ["linkedPR"], - "method": "worktree.show", - "operation": "worktree.summary-or-skip", - "variant": "worktree-summary" - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "9be162e088f2": { - "name": "streams-registered-at-teardown", - "ordinal": 21, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "a55c83eeaeea": { - "name": "github.prForBranch#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "acceptMergedFallbackPR": true, - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": 12, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "fetchedAt": 0, - "kind": "found", - "pr": { - "headSha": "head-sha-1", - "mergeable": "MERGEABLE", - "number": 12, - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - } - }, - "a7e609fcb031": { - "name": "github.prChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "bfedf583a747": { - "name": "github.workItemDetails#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.workItemDetails" - }, - { - "name": "params", - "value": { - "number": 12, - "repo": "id:repo-9", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-8", - "ok": true, - "result": { - "body": "body", - "comments": [ - { - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "id": 55, - "isResolved": false, - "line": 3, - "path": "src/app.ts", - "threadId": "thread-1", - "url": "https://github.com/owner/repo/pull/12#discussion_r55" - } - ], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "id": "PR_1", - "labels": [], - "number": 12, - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - } - }, - "d39b1bf1038a": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "checks": ["build:success"], - "checksError": { - "$rpc": "null" - }, - "comments": [ - { - "body": "please fix", - "id": 55, - "resolved": false - }, - { - "body": "recorded comment", - "id": 57, - "resolved": false - } - ], - "kind": "ready", - "pr": { - "headSha": "head-sha-1", - "number": 12, - "title": "Recorded" - }, - "refreshFailed": false - } - }, - "e0a11d8a1005": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "checks": ["build:success"], - "checksError": { - "$rpc": "null" - }, - "comments": [ - { - "body": "please fix", - "id": 55, - "resolved": false - } - ], - "kind": "ready", - "pr": { - "headSha": "head-sha-1", - "number": 12, - "title": "Recorded" - }, - "refreshFailed": false - } - }, - "e10925fa98de": { - "name": "status.get#1", - "ordinal": 14, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "e40828b3dc78": { - "name": "github.prComments#1", - "ordinal": 19, - "args": [ - { - "name": "method", - "value": "github.prComments" - }, - { - "name": "params", - "value": { - "noCache": true, - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-10", - "ok": true, - "result": [ - { - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "id": 55, - "isResolved": false, - "line": 3, - "path": "src/app.ts", - "threadId": "thread-1", - "url": "https://github.com/owner/repo/pull/12#discussion_r55" - }, - { - "author": "me", - "body": "recorded comment", - "createdAt": "2026-01-01T00:01:00Z", - "id": 57, - "url": "https://github.com/owner/repo/pull/12#issuecomment-57" - } - ] - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "pr-comment-posted-in-place", - "checkpoints": [ - { - "id": "branch-hint", - "observation": { - "sender": ["1287167eaf56", "4da7ea39401b", "75885386f005", "2dc2ca47b4e7"], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "35045fa5a752", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "pr", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "a7e609fcb031", - "870c2b9bacd0" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "35045fa5a752", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "loaded", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "861c8796ae1f", - "8b7e690466d7", - "bfedf583a747" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "e0a11d8a1005", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "comment-sent", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "861c8796ae1f", - "8b7e690466d7", - "bfedf583a747", - "3b2df6b54829", - "1e1163c70eba" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7", - "7881ab1fb5d1", - "8f35f3a8538e" - ], - "settlements": { - "mount": "eb79a9b3682a", - "post-comment": "9270aeb7d9c6" - }, - "state": "e0a11d8a1005", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "comment-shown", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "861c8796ae1f", - "8b7e690466d7", - "bfedf583a747", - "3b2df6b54829", - "e40828b3dc78" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7", - "7881ab1fb5d1", - "8f35f3a8538e" - ], - "settlements": { - "mount": "eb79a9b3682a", - "post-comment": "84e5ca07cb7a" - }, - "state": "d39b1bf1038a", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "cleanup", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "861c8796ae1f", - "8b7e690466d7", - "bfedf583a747", - "3b2df6b54829", - "e40828b3dc78" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7", - "7881ab1fb5d1", - "8f35f3a8538e" - ], - "settlements": { - "mount": "eb79a9b3682a", - "post-comment": "84e5ca07cb7a" - }, - "state": "d39b1bf1038a", - "effects": ["9091d133c3b0", "9be162e088f2"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-comment-resolve-unconfirmed.json b/mobile/rpc-foundation/goldens/pr-comment-resolve-unconfirmed.json deleted file mode 100644 index 838a2347ca0..00000000000 --- a/mobile/rpc-foundation/goldens/pr-comment-resolve-unconfirmed.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-comment-mutation", - "namedDeltas": [], - "values": { - "0e0226959068": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "The host sent a reply this app could not read (github.resolveReviewThread)", - "ok": false - } - }, - "1165af07b50f": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Failed to update review thread.", - "ok": false - } - }, - "2b8d60101912": { - "name": "github.resolveReviewThread#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.resolveReviewThread\",\"params\":{\"repo\":\"id:repo-9\",\"threadId\":\"thread-1\",\"resolve\":true}}" - }, - "38f037a31b80": { - "name": "github.resolveReviewThread#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.resolveReviewThread" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9", - "resolve": true, - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true - } - } - }, - "483de03b566e": { - "name": "github.resolveReviewThread#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.resolveReviewThread\",\"params\":{\"repo\":\"id:repo-9\",\"threadId\":\"thread-1\",\"resolve\":true}}" - }, - "5603f79b1c06": { - "resolve-thread": { - "error": "Failed to update review thread.", - "ok": false - } - }, - "699651595413": { - "resolve-thread": { - "error": "The host sent a reply this app could not read (github.resolveReviewThread)", - "ok": false - } - }, - "8b60835c8142": { - "name": "github.resolveReviewThread#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.resolveReviewThread" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9", - "resolve": true, - "threadId": "thread-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": false - } - } - } - }, - "recording": { - "scenario": "pr-comment-resolve-unconfirmed", - "checkpoints": [ - { - "id": "explicit-false", - "observation": { - "sender": ["8b60835c8142"], - "payloads": ["2b8d60101912"], - "settlements": { - "explicit-false": "1165af07b50f" - }, - "state": "5603f79b1c06", - "effects": [] - } - }, - { - "id": "absent-result", - "observation": { - "sender": ["8b60835c8142", "38f037a31b80"], - "payloads": ["2b8d60101912", "483de03b566e"], - "settlements": { - "explicit-false": "1165af07b50f", - "absent-result": "0e0226959068" - }, - "state": "699651595413", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-line-comment-and-file-viewed.json b/mobile/rpc-foundation/goldens/pr-line-comment-and-file-viewed.json deleted file mode 100644 index 628fa51a1d0..00000000000 --- a/mobile/rpc-foundation/goldens/pr-line-comment-and-file-viewed.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-comment-mutation", - "namedDeltas": [], - "values": { - "00e36cc2e1a3": { - "file-viewed": { - "ok": true - }, - "line-comment": { - "ok": true - } - }, - "0632a06c33cb": { - "name": "github.addPRReviewComment#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.addPRReviewComment\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"commitId\":\"head-sha-1\",\"path\":\"src/app.ts\",\"line\":5,\"body\":\"recorded line comment\",\"startLine\":3}}" - }, - "1da2b9026f18": { - "name": "github.setPRFileViewed#2", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.setPRFileViewed" - }, - { - "name": "params", - "value": { - "path": "src/app.ts", - "pullRequestId": "PR_kwDO", - "repo": "id:repo-9", - "viewed": true - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": false - } - } - }, - "29a4002b51d7": { - "file-viewed": { - "error": "Failed to update viewed state.", - "ok": false - }, - "line-comment": { - "ok": true - } - }, - "5af21c5f4fe0": { - "name": "github.setPRFileViewed#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.setPRFileViewed" - }, - { - "name": "params", - "value": { - "path": "src/app.ts", - "pullRequestId": "PR_kwDO", - "repo": "id:repo-9", - "viewed": true - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": true - } - } - }, - "65a217bed712": { - "line-comment": { - "ok": true - } - }, - "94ed6c684a96": { - "name": "github.setPRFileViewed#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.setPRFileViewed\",\"params\":{\"repo\":\"id:repo-9\",\"pullRequestId\":\"PR_kwDO\",\"path\":\"src/app.ts\",\"viewed\":true}}" - }, - "afe0045df4a7": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Failed to update viewed state.", - "ok": false - } - }, - "c655a2fc8c3a": { - "name": "github.addPRReviewComment#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.addPRReviewComment" - }, - { - "name": "params", - "value": { - "body": "recorded line comment", - "commitId": "head-sha-1", - "line": 5, - "path": "src/app.ts", - "prNumber": 12, - "repo": "id:repo-9", - "startLine": 3 - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "comment": { - "id": 57 - }, - "ok": true - } - } - } - }, - "de607d31ed8c": { - "name": "github.setPRFileViewed#2", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.setPRFileViewed\",\"params\":{\"repo\":\"id:repo-9\",\"pullRequestId\":\"PR_kwDO\",\"path\":\"src/app.ts\",\"viewed\":true}}" - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - } - }, - "recording": { - "scenario": "pr-line-comment-and-file-viewed", - "checkpoints": [ - { - "id": "line-comment", - "observation": { - "sender": ["c655a2fc8c3a"], - "payloads": ["0632a06c33cb"], - "settlements": { - "line-comment": "fbc958e4d46e" - }, - "state": "65a217bed712", - "effects": [] - } - }, - { - "id": "viewed", - "observation": { - "sender": ["c655a2fc8c3a", "5af21c5f4fe0"], - "payloads": ["0632a06c33cb", "94ed6c684a96"], - "settlements": { - "line-comment": "fbc958e4d46e", - "viewed": "fbc958e4d46e" - }, - "state": "00e36cc2e1a3", - "effects": [] - } - }, - { - "id": "refused", - "observation": { - "sender": ["c655a2fc8c3a", "5af21c5f4fe0", "1da2b9026f18"], - "payloads": ["0632a06c33cb", "94ed6c684a96", "de607d31ed8c"], - "settlements": { - "line-comment": "fbc958e4d46e", - "viewed": "fbc958e4d46e", - "refused": "afe0045df4a7" - }, - "state": "29a4002b51d7", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-mutation-in-band-failure.json b/mobile/rpc-foundation/goldens/pr-mutation-in-band-failure.json deleted file mode 100644 index aa03c1179ca..00000000000 --- a/mobile/rpc-foundation/goldens/pr-mutation-in-band-failure.json +++ /dev/null @@ -1,320 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-mutation", - "namedDeltas": [], - "values": { - "0724cf7c0f6d": { - "name": "github.updatePRState#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.updatePRState" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "updates": { - "state": "closed" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "error": { - "message": "Branch is protected" - }, - "ok": false - } - } - } - }, - "18863a025ec7": { - "auto-merge": { - "ok": true - }, - "close": { - "error": "Branch is protected", - "ok": false - }, - "merge": { - "error": "Pull request is not mergeable", - "ok": false - }, - "rerun-checks": { - "error": "Request failed: github.rerunPRChecks", - "ok": false - } - }, - "1dbd11ea2634": { - "merge": { - "error": "Pull request is not mergeable", - "ok": false - } - }, - "323e40d512cb": { - "name": "github.setPRAutoMerge#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.setPRAutoMerge" - }, - { - "name": "params", - "value": { - "enabled": true, - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": true - } - } - }, - "3cc9fca74bf6": { - "name": "github.rerunPRChecks#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.rerunPRChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"failedOnly\":true,\"headSha\":\"head-sha-1\"}}" - }, - "5b819e88a0c1": { - "close": { - "error": "Branch is protected", - "ok": false - }, - "merge": { - "error": "Pull request is not mergeable", - "ok": false - } - }, - "75b6d425bd33": { - "name": "github.setPRAutoMerge#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.setPRAutoMerge\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"enabled\":true}}" - }, - "7fe97d8036c2": { - "name": "github.mergePR#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.mergePR" - }, - { - "name": "params", - "value": { - "method": "squash", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "error": "Pull request is not mergeable", - "ok": false - } - } - } - }, - "8aaaf574bb6f": { - "auto-merge": { - "ok": true - }, - "close": { - "error": "Branch is protected", - "ok": false - }, - "merge": { - "error": "Pull request is not mergeable", - "ok": false - } - }, - "8be705a6533e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Request failed: github.rerunPRChecks", - "ok": false - } - }, - "beaae579e18a": { - "name": "github.updatePRState#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePRState\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"updates\":{\"state\":\"closed\"}}}" - }, - "c6cd1f9aeefc": { - "name": "github.mergePR#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.mergePR\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"method\":\"squash\"}}" - }, - "e847c3eef6b5": { - "name": "github.rerunPRChecks#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "github.rerunPRChecks" - }, - { - "name": "params", - "value": { - "failedOnly": true, - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "error": { - "message": "" - }, - "ok": false - } - } - } - }, - "f2d0a4251252": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Branch is protected", - "ok": false - } - }, - "f8ef6dd619cb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Pull request is not mergeable", - "ok": false - } - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - } - }, - "recording": { - "scenario": "pr-mutation-in-band-failure", - "checkpoints": [ - { - "id": "string-error", - "observation": { - "sender": ["7fe97d8036c2"], - "payloads": ["c6cd1f9aeefc"], - "settlements": { - "string-error": "f8ef6dd619cb" - }, - "state": "1dbd11ea2634", - "effects": [] - } - }, - { - "id": "object-error", - "observation": { - "sender": ["7fe97d8036c2", "0724cf7c0f6d"], - "payloads": ["c6cd1f9aeefc", "beaae579e18a"], - "settlements": { - "string-error": "f8ef6dd619cb", - "object-error": "f2d0a4251252" - }, - "state": "5b819e88a0c1", - "effects": [] - } - }, - { - "id": "unstructured", - "observation": { - "sender": ["7fe97d8036c2", "0724cf7c0f6d", "323e40d512cb"], - "payloads": ["c6cd1f9aeefc", "beaae579e18a", "75b6d425bd33"], - "settlements": { - "string-error": "f8ef6dd619cb", - "object-error": "f2d0a4251252", - "unstructured": "fbc958e4d46e" - }, - "state": "8aaaf574bb6f", - "effects": [] - } - }, - { - "id": "empty-object-error", - "observation": { - "sender": ["7fe97d8036c2", "0724cf7c0f6d", "323e40d512cb", "e847c3eef6b5"], - "payloads": ["c6cd1f9aeefc", "beaae579e18a", "75b6d425bd33", "3cc9fca74bf6"], - "settlements": { - "string-error": "f8ef6dd619cb", - "object-error": "f2d0a4251252", - "unstructured": "fbc958e4d46e", - "empty-object-error": "8be705a6533e" - }, - "state": "18863a025ec7", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-mutation-status.json b/mobile/rpc-foundation/goldens/pr-mutation-status.json deleted file mode 100644 index e6948b4e1dd..00000000000 --- a/mobile/rpc-foundation/goldens/pr-mutation-status.json +++ /dev/null @@ -1,469 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-mutation", - "namedDeltas": [], - "values": { - "053eb7126f9a": { - "auto-merge": { - "ok": true - }, - "close": { - "ok": true - }, - "merge": { - "ok": true - } - }, - "0e14bd119328": { - "merge": { - "ok": true - } - }, - "217757a427ce": { - "auto-merge": { - "ok": true - }, - "merge": { - "ok": true - } - }, - "258eb619fcbb": { - "auto-merge": { - "ok": true - }, - "close": { - "ok": true - }, - "merge": { - "ok": true - }, - "request-reviewers": { - "ok": true - } - }, - "2b56dde57d4f": { - "name": "github.mergePR#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.mergePR" - }, - { - "name": "params", - "value": { - "method": "squash", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "3e98a51bf209": { - "name": "github.setPRAutoMerge#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.setPRAutoMerge" - }, - { - "name": "params", - "value": { - "enabled": true, - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "44136fa355b3": {}, - "5145e99589f6": { - "name": "github.requestPRReviewers#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.requestPRReviewers\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"reviewers\":[\"octocat\"]}}" - }, - "5a3a15468816": { - "name": "github.removePRReviewers#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.removePRReviewers\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"reviewers\":[\"octocat\"]}}" - }, - "6e912bd10baa": { - "name": "github.updatePRState#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.updatePRState" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "updates": { - "state": "closed" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "89a20acf05d3": { - "name": "github.updatePRState#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePRState\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"updates\":{\"state\":\"closed\"}}}" - }, - "91638fa7c927": { - "name": "github.rerunPRChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.rerunPRChecks" - }, - { - "name": "params", - "value": { - "failedOnly": true, - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "948fde384959": { - "name": "github.requestPRReviewers#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "github.requestPRReviewers" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "reviewers": ["octocat"] - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "98a9268b04e2": { - "auto-merge": { - "ok": true - }, - "close": { - "ok": true - }, - "merge": { - "ok": true - }, - "remove-reviewers": { - "ok": true - }, - "request-reviewers": { - "ok": true - } - }, - "c6cd1f9aeefc": { - "name": "github.mergePR#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.mergePR\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"method\":\"squash\"}}" - }, - "d026cfa35ea0": { - "auto-merge": { - "ok": true - }, - "close": { - "ok": true - }, - "merge": { - "ok": true - }, - "remove-reviewers": { - "ok": true - }, - "request-reviewers": { - "ok": true - }, - "rerun-checks": { - "ok": true - } - }, - "e5820e16ca2c": { - "name": "github.rerunPRChecks#1", - "ordinal": 12, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"github.rerunPRChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"failedOnly\":true,\"headSha\":\"head-sha-1\"}}" - }, - "e70f88fb717a": { - "name": "github.setPRAutoMerge#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.setPRAutoMerge\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"enabled\":true}}" - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - }, - "ff463b2bc96b": { - "name": "github.removePRReviewers#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.removePRReviewers" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "reviewers": ["octocat"] - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "ok": true - } - } - } - } - }, - "recording": { - "scenario": "pr-mutation-status", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": [], - "payloads": [], - "settlements": {}, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "merge", - "observation": { - "sender": ["2b56dde57d4f"], - "payloads": ["c6cd1f9aeefc"], - "settlements": { - "merge": "fbc958e4d46e" - }, - "state": "0e14bd119328", - "effects": [] - } - }, - { - "id": "auto-merge", - "observation": { - "sender": ["2b56dde57d4f", "3e98a51bf209"], - "payloads": ["c6cd1f9aeefc", "e70f88fb717a"], - "settlements": { - "merge": "fbc958e4d46e", - "auto-merge": "fbc958e4d46e" - }, - "state": "217757a427ce", - "effects": [] - } - }, - { - "id": "close", - "observation": { - "sender": ["2b56dde57d4f", "3e98a51bf209", "6e912bd10baa"], - "payloads": ["c6cd1f9aeefc", "e70f88fb717a", "89a20acf05d3"], - "settlements": { - "merge": "fbc958e4d46e", - "auto-merge": "fbc958e4d46e", - "close": "fbc958e4d46e" - }, - "state": "053eb7126f9a", - "effects": [] - } - }, - { - "id": "request-reviewers", - "observation": { - "sender": ["2b56dde57d4f", "3e98a51bf209", "6e912bd10baa", "948fde384959"], - "payloads": ["c6cd1f9aeefc", "e70f88fb717a", "89a20acf05d3", "5145e99589f6"], - "settlements": { - "merge": "fbc958e4d46e", - "auto-merge": "fbc958e4d46e", - "close": "fbc958e4d46e", - "request-reviewers": "fbc958e4d46e" - }, - "state": "258eb619fcbb", - "effects": [] - } - }, - { - "id": "remove-reviewers", - "observation": { - "sender": [ - "2b56dde57d4f", - "3e98a51bf209", - "6e912bd10baa", - "948fde384959", - "ff463b2bc96b" - ], - "payloads": [ - "c6cd1f9aeefc", - "e70f88fb717a", - "89a20acf05d3", - "5145e99589f6", - "5a3a15468816" - ], - "settlements": { - "merge": "fbc958e4d46e", - "auto-merge": "fbc958e4d46e", - "close": "fbc958e4d46e", - "request-reviewers": "fbc958e4d46e", - "remove-reviewers": "fbc958e4d46e" - }, - "state": "98a9268b04e2", - "effects": [] - } - }, - { - "id": "rerun-checks", - "observation": { - "sender": [ - "2b56dde57d4f", - "3e98a51bf209", - "6e912bd10baa", - "948fde384959", - "ff463b2bc96b", - "91638fa7c927" - ], - "payloads": [ - "c6cd1f9aeefc", - "e70f88fb717a", - "89a20acf05d3", - "5145e99589f6", - "5a3a15468816", - "e5820e16ca2c" - ], - "settlements": { - "merge": "fbc958e4d46e", - "auto-merge": "fbc958e4d46e", - "close": "fbc958e4d46e", - "request-reviewers": "fbc958e4d46e", - "remove-reviewers": "fbc958e4d46e", - "rerun-checks": "fbc958e4d46e" - }, - "state": "d026cfa35ea0", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-read-fork-routing.json b/mobile/rpc-foundation/goldens/pr-read-fork-routing.json deleted file mode 100644 index 49ddb40ee0d..00000000000 --- a/mobile/rpc-foundation/goldens/pr-read-fork-routing.json +++ /dev/null @@ -1,337 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-reads", - "family": "github.pr-read", - "namedDeltas": [], - "values": { - "08e5cc0c504e": { - "name": "github.prChecks#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"prRepo\":{\"owner\":\"fork-owner\",\"repo\":\"fork-repo\",\"host\":\"github.enterprise.test\"},\"headSha\":\"head-sha-1\"}}" - }, - "1c88fe396b45": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "annotations": [], - "completedAt": { - "$rpc": "null" - }, - "conclusion": "success", - "detailsUrl": { - "$rpc": "null" - }, - "jobs": [], - "name": "build", - "startedAt": { - "$rpc": "null" - }, - "status": "completed", - "summary": { - "$rpc": "null" - }, - "text": { - "$rpc": "null" - }, - "title": { - "$rpc": "null" - }, - "url": { - "$rpc": "null" - } - } - } - }, - "3d3e04f5c1cb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - } - }, - "88a456608739": { - "name": "github.prChecks#2", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "status": "completed" - } - ] - } - } - }, - "997e2aac6183": { - "name": "github.prCheckDetails#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.prCheckDetails" - }, - { - "name": "params", - "value": { - "checkName": "build", - "checkRunId": 7, - "prRepo": { - "host": "github.enterprise.test", - "owner": "fork-owner", - "repo": "fork-repo" - }, - "repo": "id:repo-9", - "url": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "annotations": [], - "conclusion": "success", - "jobs": [], - "name": "build", - "status": "completed" - } - } - } - }, - "9ad46f0a24c7": { - "checks": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - } - }, - "c0db062cb341": { - "name": "github.prChecks#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "prRepo": { - "host": "github.enterprise.test", - "owner": "fork-owner", - "repo": "fork-repo" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "status": "completed" - } - ] - } - } - }, - "d982d58879cb": { - "name": "github.prCheckDetails#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.prCheckDetails\",\"params\":{\"repo\":\"id:repo-9\",\"checkRunId\":7,\"checkName\":\"build\",\"url\":null,\"prRepo\":{\"owner\":\"fork-owner\",\"repo\":\"fork-repo\",\"host\":\"github.enterprise.test\"}}}" - }, - "dd2205e9f2fb": { - "name": "github.prChecks#2", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12}}" - }, - "ff556464fa8e": { - "check-details": { - "ok": true, - "result": { - "annotations": [], - "completedAt": { - "$rpc": "null" - }, - "conclusion": "success", - "detailsUrl": { - "$rpc": "null" - }, - "jobs": [], - "name": "build", - "startedAt": { - "$rpc": "null" - }, - "status": "completed", - "summary": { - "$rpc": "null" - }, - "text": { - "$rpc": "null" - }, - "title": { - "$rpc": "null" - }, - "url": { - "$rpc": "null" - } - } - }, - "checks": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - } - } - }, - "recording": { - "scenario": "pr-read-fork-routing", - "checkpoints": [ - { - "id": "fork-checks", - "observation": { - "sender": ["c0db062cb341"], - "payloads": ["08e5cc0c504e"], - "settlements": { - "fork-checks": "3d3e04f5c1cb" - }, - "state": "9ad46f0a24c7", - "effects": [] - } - }, - { - "id": "fork-check-details", - "observation": { - "sender": ["c0db062cb341", "997e2aac6183"], - "payloads": ["08e5cc0c504e", "d982d58879cb"], - "settlements": { - "fork-checks": "3d3e04f5c1cb", - "fork-check-details": "1c88fe396b45" - }, - "state": "ff556464fa8e", - "effects": [] - } - }, - { - "id": "no-head-sha", - "observation": { - "sender": ["c0db062cb341", "997e2aac6183", "88a456608739"], - "payloads": ["08e5cc0c504e", "d982d58879cb", "dd2205e9f2fb"], - "settlements": { - "fork-checks": "3d3e04f5c1cb", - "fork-check-details": "1c88fe396b45", - "no-head-sha": "3d3e04f5c1cb" - }, - "state": "ff556464fa8e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-read-surface.json b/mobile/rpc-foundation/goldens/pr-read-surface.json deleted file mode 100644 index c0b3ed424c7..00000000000 --- a/mobile/rpc-foundation/goldens/pr-read-surface.json +++ /dev/null @@ -1,1716 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-reads", - "family": "github.pr-read", - "namedDeltas": [], - "values": { - "026ad16c841b": { - "checks": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - }, - "hosted-review": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - }, - "pr-for-branch": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksStatus": "pending", - "checksSummary": { - "$rpc": "undefined" - }, - "confirmedContainedHeadOid": { - "$rpc": "undefined" - }, - "headDivergedFromMergedPRAtOid": { - "$rpc": "undefined" - }, - "headRefName": { - "$rpc": "undefined" - }, - "headSha": "head-sha-1", - "mergeMethodSettings": { - "$rpc": "undefined" - }, - "mergeQueueRequired": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "stack": { - "$rpc": "undefined" - }, - "state": "open", - "title": "Recorded", - "updatedAt": "", - "url": "https://x/12" - } - }, - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - }, - "work-item": { - "ok": true, - "result": { - "assignees": { - "$rpc": "undefined" - }, - "baseSha": { - "$rpc": "undefined" - }, - "body": "body", - "checks": [], - "comments": [], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "author": { - "$rpc": "null" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "baseRefName": { - "$rpc": "undefined" - }, - "branchName": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "id": "PR_1", - "labels": [], - "latestReviews": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": { - "$rpc": "undefined" - }, - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "reviewRequests": [], - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "", - "url": "" - }, - "participants": [], - "pullRequestId": { - "$rpc": "undefined" - } - } - } - }, - "0644012ff2a3": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - } - }, - "0a9f2ff19df4": { - "name": "github.workItemDetails#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-9\",\"number\":12,\"type\":\"pr\"}}" - }, - "0c83b4de61f4": { - "name": "reply-salvage", - "ordinal": 17, - "value": { - "droppedCount": 1, - "droppedPaths": ["0.avatarUrl"], - "method": "github.listAssignableUsers", - "operation": "github.pr-assignable-users", - "variant": "pr-assignable-users" - } - }, - "1554c8f6753b": { - "name": "github.prForBranch#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":null,\"currentHeadOid\":null}}" - }, - "191e3c96ad53": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - } - } - }, - "1c88fe396b45": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "annotations": [], - "completedAt": { - "$rpc": "null" - }, - "conclusion": "success", - "detailsUrl": { - "$rpc": "null" - }, - "jobs": [], - "name": "build", - "startedAt": { - "$rpc": "null" - }, - "status": "completed", - "summary": { - "$rpc": "null" - }, - "text": { - "$rpc": "null" - }, - "title": { - "$rpc": "null" - }, - "url": { - "$rpc": "null" - } - } - } - }, - "1f5765918736": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-9\"}}" - }, - "2709bde96386": { - "check-details": { - "ok": true, - "result": { - "annotations": [], - "completedAt": { - "$rpc": "null" - }, - "conclusion": "success", - "detailsUrl": { - "$rpc": "null" - }, - "jobs": [], - "name": "build", - "startedAt": { - "$rpc": "null" - }, - "status": "completed", - "summary": { - "$rpc": "null" - }, - "text": { - "$rpc": "null" - }, - "title": { - "$rpc": "null" - }, - "url": { - "$rpc": "null" - } - } - }, - "checks": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - }, - "hosted-review": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - }, - "pr-for-branch": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksStatus": "pending", - "checksSummary": { - "$rpc": "undefined" - }, - "confirmedContainedHeadOid": { - "$rpc": "undefined" - }, - "headDivergedFromMergedPRAtOid": { - "$rpc": "undefined" - }, - "headRefName": { - "$rpc": "undefined" - }, - "headSha": "head-sha-1", - "mergeMethodSettings": { - "$rpc": "undefined" - }, - "mergeQueueRequired": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "stack": { - "$rpc": "undefined" - }, - "state": "open", - "title": "Recorded", - "updatedAt": "", - "url": "https://x/12" - } - }, - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - }, - "work-item": { - "ok": true, - "result": { - "assignees": { - "$rpc": "undefined" - }, - "baseSha": { - "$rpc": "undefined" - }, - "body": "body", - "checks": [], - "comments": [], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "author": { - "$rpc": "null" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "baseRefName": { - "$rpc": "undefined" - }, - "branchName": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "id": "PR_1", - "labels": [], - "latestReviews": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": { - "$rpc": "undefined" - }, - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "reviewRequests": [], - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "", - "url": "" - }, - "participants": [], - "pullRequestId": { - "$rpc": "undefined" - } - } - } - }, - "3d3e04f5c1cb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - } - }, - "41113a109089": { - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - } - }, - "44136fa355b3": {}, - "471a75cee137": { - "name": "github.workItemDetails#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "github.workItemDetails" - }, - { - "name": "params", - "value": { - "number": 12, - "repo": "id:repo-9", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "body": "body", - "headSha": "head-sha-1", - "item": { - "assignees": [], - "id": "PR_1", - "labels": [], - "number": 12, - "state": "open", - "title": "Recorded", - "type": "pr" - } - } - } - } - }, - "4bf8f27dd319": { - "name": "hostedReview.forBranch#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "hostedReview.forBranch" - }, - { - "name": "params", - "value": { - "active": true, - "branch": "feature", - "linkedGitHubPR": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - } - } - }, - "52504eafec78": { - "name": "github.prChecks#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"headSha\":\"head-sha-1\"}}" - }, - "53bcb749e0ed": { - "hosted-review": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - }, - "pr-for-branch": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksStatus": "pending", - "checksSummary": { - "$rpc": "undefined" - }, - "confirmedContainedHeadOid": { - "$rpc": "undefined" - }, - "headDivergedFromMergedPRAtOid": { - "$rpc": "undefined" - }, - "headRefName": { - "$rpc": "undefined" - }, - "headSha": "head-sha-1", - "mergeMethodSettings": { - "$rpc": "undefined" - }, - "mergeQueueRequired": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "stack": { - "$rpc": "undefined" - }, - "state": "open", - "title": "Recorded", - "updatedAt": "", - "url": "https://x/12" - } - }, - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - } - }, - "5b33c8cfd938": { - "name": "status.get#1", - "ordinal": 13, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "capabilities": ["github.exact-work-item-target.v1"], - "hostDescriptor": { - "installationId": "recorded" - }, - "runtimeId": "recorded" - } - } - } - }, - "6a3f611aad80": { - "name": "github.prCheckDetails#1", - "ordinal": 12, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"github.prCheckDetails\",\"params\":{\"repo\":\"id:repo-9\",\"checkRunId\":7,\"checkName\":\"build\",\"url\":null}}" - }, - "9a87ba2ee54f": { - "hosted-review": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - }, - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - } - }, - "9bb9d9b8c502": { - "assignable": { - "ok": true, - "result": [ - { - "avatarUrl": "", - "login": "octocat", - "name": "Octo Cat" - } - ] - }, - "check-details": { - "ok": true, - "result": { - "annotations": [], - "completedAt": { - "$rpc": "null" - }, - "conclusion": "success", - "detailsUrl": { - "$rpc": "null" - }, - "jobs": [], - "name": "build", - "startedAt": { - "$rpc": "null" - }, - "status": "completed", - "summary": { - "$rpc": "null" - }, - "text": { - "$rpc": "null" - }, - "title": { - "$rpc": "null" - }, - "url": { - "$rpc": "null" - } - } - }, - "checks": { - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "observedHeadSha": { - "$rpc": "undefined" - }, - "status": "completed", - "url": { - "$rpc": "null" - }, - "workflowRunId": { - "$rpc": "undefined" - } - } - ] - }, - "hosted-review": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - }, - "pr-for-branch": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksStatus": "pending", - "checksSummary": { - "$rpc": "undefined" - }, - "confirmedContainedHeadOid": { - "$rpc": "undefined" - }, - "headDivergedFromMergedPRAtOid": { - "$rpc": "undefined" - }, - "headRefName": { - "$rpc": "undefined" - }, - "headSha": "head-sha-1", - "mergeMethodSettings": { - "$rpc": "undefined" - }, - "mergeQueueRequired": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "stack": { - "$rpc": "undefined" - }, - "state": "open", - "title": "Recorded", - "updatedAt": "", - "url": "https://x/12" - } - }, - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - }, - "work-item": { - "ok": true, - "result": { - "assignees": { - "$rpc": "undefined" - }, - "baseSha": { - "$rpc": "undefined" - }, - "body": "body", - "checks": [], - "comments": [], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "author": { - "$rpc": "null" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "baseRefName": { - "$rpc": "undefined" - }, - "branchName": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "id": "PR_1", - "labels": [], - "latestReviews": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": { - "$rpc": "undefined" - }, - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "reviewRequests": [], - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "", - "url": "" - }, - "participants": [], - "pullRequestId": { - "$rpc": "undefined" - } - } - } - }, - "a20f0d944ba5": { - "name": "github.prForBranch#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": { - "$rpc": "null" - }, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "fetchedAt": 0, - "kind": "found", - "pr": { - "headSha": "head-sha-1", - "mergeable": "MERGEABLE", - "number": 12, - "state": "open", - "title": "Recorded", - "url": "https://x/12" - } - } - } - } - }, - "a3e588709bde": { - "hosted-review": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "reviewDecision": { - "$rpc": "undefined" - }, - "state": "open", - "status": "pending", - "title": "Recorded", - "updatedAt": "2026-01-01", - "url": "https://x/12" - } - }, - "pr-for-branch": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksStatus": "pending", - "checksSummary": { - "$rpc": "undefined" - }, - "confirmedContainedHeadOid": { - "$rpc": "undefined" - }, - "headDivergedFromMergedPRAtOid": { - "$rpc": "undefined" - }, - "headRefName": { - "$rpc": "undefined" - }, - "headSha": "head-sha-1", - "mergeMethodSettings": { - "$rpc": "undefined" - }, - "mergeQueueRequired": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "stack": { - "$rpc": "undefined" - }, - "state": "open", - "title": "Recorded", - "updatedAt": "", - "url": "https://x/12" - } - }, - "repo-slug": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - }, - "work-item": { - "ok": true, - "result": { - "assignees": { - "$rpc": "undefined" - }, - "baseSha": { - "$rpc": "undefined" - }, - "body": "body", - "checks": [], - "comments": [], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "author": { - "$rpc": "null" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "baseRefName": { - "$rpc": "undefined" - }, - "branchName": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "id": "PR_1", - "labels": [], - "latestReviews": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": { - "$rpc": "undefined" - }, - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "reviewRequests": [], - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "", - "url": "" - }, - "participants": [], - "pullRequestId": { - "$rpc": "undefined" - } - } - } - }, - "a93bcc7122e8": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": [ - { - "avatarUrl": "", - "login": "octocat", - "name": "Octo Cat" - } - ] - } - }, - "cdbefce64e00": { - "name": "hostedReview.forBranch#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.forBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedGitHubPR\":12,\"active\":true}}" - }, - "d01444e13d4c": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "autoMergeAllowed": { - "$rpc": "undefined" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "checksStatus": "pending", - "checksSummary": { - "$rpc": "undefined" - }, - "confirmedContainedHeadOid": { - "$rpc": "undefined" - }, - "headDivergedFromMergedPRAtOid": { - "$rpc": "undefined" - }, - "headRefName": { - "$rpc": "undefined" - }, - "headSha": "head-sha-1", - "mergeMethodSettings": { - "$rpc": "undefined" - }, - "mergeQueueRequired": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": "MERGEABLE", - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "stack": { - "$rpc": "undefined" - }, - "state": "open", - "title": "Recorded", - "updatedAt": "", - "url": "https://x/12" - } - } - }, - "d036e2bdda12": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "assignees": { - "$rpc": "undefined" - }, - "baseSha": { - "$rpc": "undefined" - }, - "body": "body", - "checks": [], - "comments": [], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "author": { - "$rpc": "null" - }, - "autoMergeEnabled": { - "$rpc": "undefined" - }, - "baseRefName": { - "$rpc": "undefined" - }, - "branchName": { - "$rpc": "undefined" - }, - "checksSummary": { - "$rpc": "undefined" - }, - "headSha": { - "$rpc": "undefined" - }, - "id": "PR_1", - "labels": [], - "latestReviews": { - "$rpc": "undefined" - }, - "mergeStateStatus": { - "$rpc": "undefined" - }, - "mergeable": { - "$rpc": "undefined" - }, - "number": 12, - "prRepo": { - "$rpc": "undefined" - }, - "reviewDecision": { - "$rpc": "undefined" - }, - "reviewRequests": [], - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "", - "url": "" - }, - "participants": [], - "pullRequestId": { - "$rpc": "undefined" - } - } - } - }, - "d89e7b8ce2a0": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "host": "github.com", - "owner": "orca", - "repo": "orca" - } - } - }, - "df34e36b0fb7": { - "name": "github.listAssignableUsers#1", - "ordinal": 16, - "json": "{\"expectedRuntimeSource\":{\"sourceId\":\"recorded\",\"runtimeId\":\"recorded\"},\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"github.listAssignableUsers\",\"params\":{\"repo\":\"id:repo-9\",\"ownerRepo\":{\"owner\":\"fork-owner\",\"repo\":\"fork-repo\",\"host\":\"github.enterprise.test\"}}}" - }, - "e10925fa98de": { - "name": "status.get#1", - "ordinal": 14, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "e97a125cdb88": { - "name": "github.prCheckDetails#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prCheckDetails" - }, - { - "name": "params", - "value": { - "checkName": "build", - "checkRunId": 7, - "repo": "id:repo-9", - "url": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "annotations": [], - "conclusion": "success", - "jobs": [], - "name": "build", - "status": "completed" - } - } - } - }, - "f79c91454bac": { - "name": "github.listAssignableUsers#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.listAssignableUsers" - }, - { - "name": "params", - "value": { - "ownerRepo": { - "host": "github.enterprise.test", - "owner": "fork-owner", - "repo": "fork-repo" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "envelope": { - "expectedRuntimeSource": { - "runtimeId": "recorded", - "sourceId": "recorded" - } - }, - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-8", - "ok": true, - "result": [ - { - "avatarUrl": { - "$rpc": "null" - }, - "login": "octocat", - "name": "Octo Cat" - } - ] - } - } - }, - "fa4bf991415d": { - "name": "github.prChecks#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "status": "completed" - } - ] - } - } - } - }, - "recording": { - "scenario": "pr-read-surface", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": [], - "payloads": [], - "settlements": {}, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "repo-slug", - "observation": { - "sender": ["191e3c96ad53"], - "payloads": ["1f5765918736"], - "settlements": { - "repo-slug": "d89e7b8ce2a0" - }, - "state": "41113a109089", - "effects": [] - } - }, - { - "id": "hosted-review", - "observation": { - "sender": ["191e3c96ad53", "4bf8f27dd319"], - "payloads": ["1f5765918736", "cdbefce64e00"], - "settlements": { - "repo-slug": "d89e7b8ce2a0", - "hosted-review": "0644012ff2a3" - }, - "state": "9a87ba2ee54f", - "effects": [] - } - }, - { - "id": "pr-for-branch", - "observation": { - "sender": ["191e3c96ad53", "4bf8f27dd319", "a20f0d944ba5"], - "payloads": ["1f5765918736", "cdbefce64e00", "1554c8f6753b"], - "settlements": { - "repo-slug": "d89e7b8ce2a0", - "hosted-review": "0644012ff2a3", - "pr-for-branch": "d01444e13d4c" - }, - "state": "53bcb749e0ed", - "effects": [] - } - }, - { - "id": "work-item", - "observation": { - "sender": ["191e3c96ad53", "4bf8f27dd319", "a20f0d944ba5", "471a75cee137"], - "payloads": ["1f5765918736", "cdbefce64e00", "1554c8f6753b", "0a9f2ff19df4"], - "settlements": { - "repo-slug": "d89e7b8ce2a0", - "hosted-review": "0644012ff2a3", - "pr-for-branch": "d01444e13d4c", - "work-item": "d036e2bdda12" - }, - "state": "a3e588709bde", - "effects": [] - } - }, - { - "id": "checks", - "observation": { - "sender": [ - "191e3c96ad53", - "4bf8f27dd319", - "a20f0d944ba5", - "471a75cee137", - "fa4bf991415d" - ], - "payloads": [ - "1f5765918736", - "cdbefce64e00", - "1554c8f6753b", - "0a9f2ff19df4", - "52504eafec78" - ], - "settlements": { - "repo-slug": "d89e7b8ce2a0", - "hosted-review": "0644012ff2a3", - "pr-for-branch": "d01444e13d4c", - "work-item": "d036e2bdda12", - "checks": "3d3e04f5c1cb" - }, - "state": "026ad16c841b", - "effects": [] - } - }, - { - "id": "check-details", - "observation": { - "sender": [ - "191e3c96ad53", - "4bf8f27dd319", - "a20f0d944ba5", - "471a75cee137", - "fa4bf991415d", - "e97a125cdb88" - ], - "payloads": [ - "1f5765918736", - "cdbefce64e00", - "1554c8f6753b", - "0a9f2ff19df4", - "52504eafec78", - "6a3f611aad80" - ], - "settlements": { - "repo-slug": "d89e7b8ce2a0", - "hosted-review": "0644012ff2a3", - "pr-for-branch": "d01444e13d4c", - "work-item": "d036e2bdda12", - "checks": "3d3e04f5c1cb", - "check-details": "1c88fe396b45" - }, - "state": "2709bde96386", - "effects": [] - } - }, - { - "id": "assignable", - "observation": { - "sender": [ - "191e3c96ad53", - "4bf8f27dd319", - "a20f0d944ba5", - "471a75cee137", - "fa4bf991415d", - "e97a125cdb88", - "5b33c8cfd938", - "f79c91454bac" - ], - "payloads": [ - "1f5765918736", - "cdbefce64e00", - "1554c8f6753b", - "0a9f2ff19df4", - "52504eafec78", - "6a3f611aad80", - "e10925fa98de", - "df34e36b0fb7" - ], - "settlements": { - "repo-slug": "d89e7b8ce2a0", - "hosted-review": "0644012ff2a3", - "pr-for-branch": "d01444e13d4c", - "work-item": "d036e2bdda12", - "checks": "3d3e04f5c1cb", - "check-details": "1c88fe396b45", - "assignable": "a93bcc7122e8" - }, - "state": "9bb9d9b8c502", - "effects": ["0c83b4de61f4"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-read-upstream-error.json b/mobile/rpc-foundation/goldens/pr-read-upstream-error.json deleted file mode 100644 index 04645a816a7..00000000000 --- a/mobile/rpc-foundation/goldens/pr-read-upstream-error.json +++ /dev/null @@ -1,254 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-reads", - "family": "github.pr-read", - "namedDeltas": [], - "values": { - "0159703ebadf": { - "name": "github.prForBranch#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": { - "$rpc": "null" - }, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "fetchedAt": 0, - "kind": "found", - "pr": { - "state": "open" - } - } - } - } - }, - "04c85ffba34f": { - "pr-for-branch": { - "error": "The host sent a reply this app could not read (github.prForBranch)", - "ok": false - } - }, - "0a56183795de": { - "pr-for-branch": { - "ok": true, - "result": { - "$rpc": "null" - } - } - }, - "0bd591f1a6ca": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "The host sent a reply this app could not read (github.prForBranch)", - "ok": false - } - }, - "1a108e871484": { - "name": "github.prForBranch#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":null,\"currentHeadOid\":null}}" - }, - "213941c6e0b6": { - "name": "github.prForBranch#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":null,\"currentHeadOid\":null}}" - }, - "2df5868d46c4": { - "name": "github.prForBranch#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": { - "$rpc": "null" - }, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "fetchedAt": 0, - "kind": "upstream-error", - "message": "GitHub API rate limit exceeded" - } - } - } - }, - "331d7e1af815": { - "pr-for-branch": { - "error": "GitHub API rate limit exceeded", - "ok": false - } - }, - "6ecd2f6475ab": { - "name": "github.prForBranch#3", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": { - "$rpc": "null" - }, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "$rpc": "null" - } - } - } - }, - "7c6cc446e5da": { - "name": "github.prForBranch#3", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":null,\"currentHeadOid\":null}}" - }, - "8a5cb8b66303": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "result": { - "$rpc": "null" - } - } - }, - "fe9c1046b91d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "GitHub API rate limit exceeded", - "ok": false - } - } - }, - "recording": { - "scenario": "pr-read-upstream-error", - "checkpoints": [ - { - "id": "upstream", - "observation": { - "sender": ["2df5868d46c4"], - "payloads": ["1a108e871484"], - "settlements": { - "upstream": "fe9c1046b91d" - }, - "state": "331d7e1af815", - "effects": [] - } - }, - { - "id": "malformed", - "observation": { - "sender": ["2df5868d46c4", "0159703ebadf"], - "payloads": ["1a108e871484", "213941c6e0b6"], - "settlements": { - "upstream": "fe9c1046b91d", - "malformed": "0bd591f1a6ca" - }, - "state": "04c85ffba34f", - "effects": [] - } - }, - { - "id": "no-pr", - "observation": { - "sender": ["2df5868d46c4", "0159703ebadf", "6ecd2f6475ab"], - "payloads": ["1a108e871484", "213941c6e0b6", "7c6cc446e5da"], - "settlements": { - "upstream": "fe9c1046b91d", - "malformed": "0bd591f1a6ca", - "no-pr": "8a5cb8b66303" - }, - "state": "0a56183795de", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-sidebar-checks-refused.json b/mobile/rpc-foundation/goldens/pr-sidebar-checks-refused.json deleted file mode 100644 index e1266f43f0b..00000000000 --- a/mobile/rpc-foundation/goldens/pr-sidebar-checks-refused.json +++ /dev/null @@ -1,616 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-sidebar", - "family": "session.pr-sidebar", - "namedDeltas": [], - "values": { - "0730389db3e9": { - "name": "hostedReview.forBranch#1", - "ordinal": 7, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.forBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedGitHubPR\":null,\"active\":true}}" - }, - "0d9f7988ff86": { - "name": "github.prChecks#1", - "ordinal": 13, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"headSha\":\"head-sha-1\"}}" - }, - "1287167eaf56": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - } - }, - "1f5765918736": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-9\"}}" - }, - "2dc2ca47b4e7": { - "name": "github.prForBranch#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "acceptMergedFallbackPR": true, - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": 12, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "341c71d5f61d": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "checks": [], - "checksError": "The host sent a reply this app could not read (github.prChecks)", - "comments": [ - { - "body": "please fix", - "id": 55, - "resolved": false - } - ], - "kind": "ready", - "pr": { - "headSha": "head-sha-1", - "number": 12, - "title": "Recorded" - }, - "refreshFailed": false - } - }, - "35045fa5a752": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "kind": "loading" - } - }, - "357f9b7862e3": { - "name": "worktree.show#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "3a8e6b13f380": { - "name": "github.prForBranch#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":12,\"acceptMergedFallbackPR\":true,\"currentHeadOid\":null}}" - }, - "3ecc2d44a209": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "4da7ea39401b": { - "name": "worktree.show#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "worktree": { - "linkedPR": { - "$rpc": "null" - } - } - } - } - } - }, - "5d309fcf43a7": { - "name": "github.workItemDetails#1", - "ordinal": 16, - "json": "{\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-9\",\"number\":12,\"type\":\"pr\"}}" - }, - "75885386f005": { - "name": "hostedReview.forBranch#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "hostedReview.forBranch" - }, - { - "name": "params", - "value": { - "active": true, - "branch": "feature", - "linkedGitHubPR": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - }, - "870c2b9bacd0": { - "name": "status.get#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "8b7e690466d7": { - "name": "status.get#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "runtimeId": "recorded" - } - } - } - }, - "9091d133c3b0": { - "name": "reply-salvage", - "ordinal": 8, - "value": { - "droppedCount": 1, - "droppedPaths": ["linkedPR"], - "method": "worktree.show", - "operation": "worktree.summary-or-skip", - "variant": "worktree-summary" - } - }, - "98eb9b836539": { - "name": "github.prChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "checks": [] - } - } - } - }, - "a55c83eeaeea": { - "name": "github.prForBranch#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "acceptMergedFallbackPR": true, - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": 12, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "fetchedAt": 0, - "kind": "found", - "pr": { - "headSha": "head-sha-1", - "mergeable": "MERGEABLE", - "number": 12, - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - } - }, - "a7e609fcb031": { - "name": "github.prChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "bfedf583a747": { - "name": "github.workItemDetails#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.workItemDetails" - }, - { - "name": "params", - "value": { - "number": 12, - "repo": "id:repo-9", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-8", - "ok": true, - "result": { - "body": "body", - "comments": [ - { - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "id": 55, - "isResolved": false, - "line": 3, - "path": "src/app.ts", - "threadId": "thread-1", - "url": "https://github.com/owner/repo/pull/12#discussion_r55" - } - ], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "id": "PR_1", - "labels": [], - "number": 12, - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - } - }, - "c70e6fd19823": { - "name": "streams-registered-at-teardown", - "ordinal": 17, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "e10925fa98de": { - "name": "status.get#1", - "ordinal": 14, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "pr-sidebar-checks-refused", - "checkpoints": [ - { - "id": "branch-hint", - "observation": { - "sender": ["1287167eaf56", "4da7ea39401b", "75885386f005", "2dc2ca47b4e7"], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "35045fa5a752", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "pr", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "a7e609fcb031", - "870c2b9bacd0" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "35045fa5a752", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "checks-refused", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "98eb9b836539", - "8b7e690466d7", - "bfedf583a747" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "341c71d5f61d", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "cleanup", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "98eb9b836539", - "8b7e690466d7", - "bfedf583a747" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "341c71d5f61d", - "effects": ["9091d133c3b0", "c70e6fd19823"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-sidebar-load.json b/mobile/rpc-foundation/goldens/pr-sidebar-load.json deleted file mode 100644 index 66f4cd67b65..00000000000 --- a/mobile/rpc-foundation/goldens/pr-sidebar-load.json +++ /dev/null @@ -1,623 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-sidebar", - "family": "session.pr-sidebar", - "namedDeltas": [], - "values": { - "0730389db3e9": { - "name": "hostedReview.forBranch#1", - "ordinal": 7, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.forBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedGitHubPR\":null,\"active\":true}}" - }, - "0d9f7988ff86": { - "name": "github.prChecks#1", - "ordinal": 13, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"github.prChecks\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"headSha\":\"head-sha-1\"}}" - }, - "1287167eaf56": { - "name": "github.repoSlug#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.repoSlug" - }, - { - "name": "params", - "value": { - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - } - }, - "1f5765918736": { - "name": "github.repoSlug#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-9\"}}" - }, - "2dc2ca47b4e7": { - "name": "github.prForBranch#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "acceptMergedFallbackPR": true, - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": 12, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "35045fa5a752": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "kind": "loading" - } - }, - "357f9b7862e3": { - "name": "worktree.show#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo-9::/w\"}}" - }, - "3a8e6b13f380": { - "name": "github.prForBranch#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.prForBranch\",\"params\":{\"repo\":\"id:repo-9\",\"branch\":\"feature\",\"linkedPRNumber\":null,\"fallbackPRNumber\":12,\"acceptMergedFallbackPR\":true,\"currentHeadOid\":null}}" - }, - "3ecc2d44a209": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "4da7ea39401b": { - "name": "worktree.show#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "worktree": { - "linkedPR": { - "$rpc": "null" - } - } - } - } - } - }, - "5d309fcf43a7": { - "name": "github.workItemDetails#1", - "ordinal": 16, - "json": "{\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-9\",\"number\":12,\"type\":\"pr\"}}" - }, - "75885386f005": { - "name": "hostedReview.forBranch#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "hostedReview.forBranch" - }, - { - "name": "params", - "value": { - "active": true, - "branch": "feature", - "linkedGitHubPR": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "mergeable": "MERGEABLE", - "number": 12, - "provider": "github", - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - }, - "861c8796ae1f": { - "name": "github.prChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": [ - { - "checkRunId": 7, - "conclusion": "success", - "name": "build", - "status": "completed" - } - ] - } - } - }, - "870c2b9bacd0": { - "name": "status.get#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "8b7e690466d7": { - "name": "status.get#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "runtimeId": "recorded" - } - } - } - }, - "9091d133c3b0": { - "name": "reply-salvage", - "ordinal": 8, - "value": { - "droppedCount": 1, - "droppedPaths": ["linkedPR"], - "method": "worktree.show", - "operation": "worktree.summary-or-skip", - "variant": "worktree-summary" - } - }, - "a55c83eeaeea": { - "name": "github.prForBranch#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "github.prForBranch" - }, - { - "name": "params", - "value": { - "acceptMergedFallbackPR": true, - "branch": "feature", - "currentHeadOid": { - "$rpc": "null" - }, - "fallbackPRNumber": 12, - "linkedPRNumber": { - "$rpc": "null" - }, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "fetchedAt": 0, - "kind": "found", - "pr": { - "headSha": "head-sha-1", - "mergeable": "MERGEABLE", - "number": 12, - "state": "open", - "title": "Recorded", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - } - }, - "a7e609fcb031": { - "name": "github.prChecks#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.prChecks" - }, - { - "name": "params", - "value": { - "headSha": "head-sha-1", - "prNumber": 12, - "repo": "id:repo-9" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "bfedf583a747": { - "name": "github.workItemDetails#1", - "ordinal": 15, - "args": [ - { - "name": "method", - "value": "github.workItemDetails" - }, - { - "name": "params", - "value": { - "number": 12, - "repo": "id:repo-9", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-8", - "ok": true, - "result": { - "body": "body", - "comments": [ - { - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "id": 55, - "isResolved": false, - "line": 3, - "path": "src/app.ts", - "threadId": "thread-1", - "url": "https://github.com/owner/repo/pull/12#discussion_r55" - } - ], - "headSha": "head-sha-1", - "item": { - "assignees": [], - "id": "PR_1", - "labels": [], - "number": 12, - "state": "open", - "title": "Recorded", - "type": "pr", - "updatedAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - } - } - } - } - }, - "c70e6fd19823": { - "name": "streams-registered-at-teardown", - "ordinal": 17, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "e0a11d8a1005": { - "commentError": { - "$rpc": "null" - }, - "pr": { - "checks": ["build:success"], - "checksError": { - "$rpc": "null" - }, - "comments": [ - { - "body": "please fix", - "id": 55, - "resolved": false - } - ], - "kind": "ready", - "pr": { - "headSha": "head-sha-1", - "number": 12, - "title": "Recorded" - }, - "refreshFailed": false - } - }, - "e10925fa98de": { - "name": "status.get#1", - "ordinal": 14, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "pr-sidebar-load", - "checkpoints": [ - { - "id": "branch-hint", - "observation": { - "sender": ["1287167eaf56", "4da7ea39401b", "75885386f005", "2dc2ca47b4e7"], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "35045fa5a752", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "pr", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "a7e609fcb031", - "870c2b9bacd0" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "35045fa5a752", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "loaded", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "861c8796ae1f", - "8b7e690466d7", - "bfedf583a747" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "e0a11d8a1005", - "effects": ["9091d133c3b0"] - } - }, - { - "id": "cleanup", - "observation": { - "sender": [ - "1287167eaf56", - "4da7ea39401b", - "75885386f005", - "a55c83eeaeea", - "861c8796ae1f", - "8b7e690466d7", - "bfedf583a747" - ], - "payloads": [ - "1f5765918736", - "3ecc2d44a209", - "357f9b7862e3", - "0730389db3e9", - "3a8e6b13f380", - "0d9f7988ff86", - "e10925fa98de", - "5d309fcf43a7" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "e0a11d8a1005", - "effects": ["9091d133c3b0", "c70e6fd19823"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-title-mutation.json b/mobile/rpc-foundation/goldens/pr-title-mutation.json deleted file mode 100644 index 6362d519aa0..00000000000 --- a/mobile/rpc-foundation/goldens/pr-title-mutation.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-title-mutation", - "namedDeltas": [], - "values": { - "55b590476b96": { - "name": "github.updatePRTitle#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePRTitle\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"title\":\"Recorded title\"}}" - }, - "578bc8950993": { - "title": { - "ok": true - } - }, - "a53dd29bf747": { - "name": "github.updatePRTitle#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.updatePRTitle" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "title": "Recorded title" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": true - } - } - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - } - }, - "recording": { - "scenario": "pr-title-mutation", - "checkpoints": [ - { - "id": "title", - "observation": { - "sender": ["a53dd29bf747"], - "payloads": ["55b590476b96"], - "settlements": { - "title": "fbc958e4d46e" - }, - "state": "578bc8950993", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/pr-title-unconfirmed.json b/mobile/rpc-foundation/goldens/pr-title-unconfirmed.json deleted file mode 100644 index 4a655d48dbe..00000000000 --- a/mobile/rpc-foundation/goldens/pr-title-unconfirmed.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-mutations", - "family": "github.pr-title-mutation", - "namedDeltas": [], - "values": { - "0400bbb4177c": { - "title": { - "error": "Request failed: github.updatePRTitle", - "ok": false - } - }, - "2b545b6c1aca": { - "name": "github.updatePRTitle#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePRTitle\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"title\":\"Recorded title\"}}" - }, - "2b6d48d3739e": { - "name": "github.updatePRTitle#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "github.updatePRTitle" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "title": "Recorded title" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "" - }, - "id": "frame-2", - "ok": false - } - } - }, - "55b590476b96": { - "name": "github.updatePRTitle#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePRTitle\",\"params\":{\"repo\":\"id:repo-9\",\"prNumber\":12,\"title\":\"Recorded title\"}}" - }, - "5ff779cd8c84": { - "title": { - "error": "Failed to update title.", - "ok": false - } - }, - "6e9fb05124f5": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Failed to update title.", - "ok": false - } - }, - "73a201bf0d92": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Request failed: github.updatePRTitle", - "ok": false - } - }, - "c62a75c4c092": { - "name": "github.updatePRTitle#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "github.updatePRTitle" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "repo": "id:repo-9", - "title": "Recorded title" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": false - } - } - } - }, - "recording": { - "scenario": "pr-title-unconfirmed", - "checkpoints": [ - { - "id": "explicit-false", - "observation": { - "sender": ["c62a75c4c092"], - "payloads": ["55b590476b96"], - "settlements": { - "explicit-false": "6e9fb05124f5" - }, - "state": "5ff779cd8c84", - "effects": [] - } - }, - { - "id": "refused", - "observation": { - "sender": ["c62a75c4c092", "2b6d48d3739e"], - "payloads": ["55b590476b96", "2b545b6c1aca"], - "settlements": { - "explicit-false": "6e9fb05124f5", - "refused": "73a201bf0d92" - }, - "state": "0400bbb4177c", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-branch-diff-shapes.json b/mobile/rpc-foundation/goldens/review-branch-diff-shapes.json deleted file mode 100644 index 94c2b4e2ece..00000000000 --- a/mobile/rpc-foundation/goldens/review-branch-diff-shapes.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.review-branch-diff", - "namedDeltas": [], - "values": { - "365c17523d76": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "branch:src/app.ts", - "kind": "binary" - } - }, - "38fb361f406c": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Committed diff is unavailable", - "isRpcDeliveryUnknown": false - } - }, - "534cf7badcbc": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "branch:src/app.ts", - "kind": "binary" - }, - "snapshot": "unloaded" - }, - "ce804facf021": { - "name": "git.branchDiff#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchDiff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"compare\":{\"baseRef\":\"origin/main\",\"baseOid\":\"a1b2c3d4e5f60718293a4b5c6d7e8f9012345678\",\"headOid\":\"f0e1d2c3b4a5968778695a4b3c2d1e0f98765432\",\"mergeBase\":\"0123456789abcdef0123456789abcdef01234567\"}}}" - }, - "d24ea9d9187c": { - "name": "git.branchDiff#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.branchDiff" - }, - { - "name": "params", - "value": { - "compare": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/main", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567" - }, - "filePath": "src/app.ts", - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "kind": "binary" - } - } - } - } - }, - "recording": { - "scenario": "review-branch-diff-shapes", - "checkpoints": [ - { - "id": "branch", - "observation": { - "sender": ["d24ea9d9187c"], - "payloads": ["ce804facf021"], - "settlements": { - "branch": "365c17523d76" - }, - "state": "534cf7badcbc", - "effects": [] - } - }, - { - "id": "no-compare", - "observation": { - "sender": ["d24ea9d9187c"], - "payloads": ["ce804facf021"], - "settlements": { - "branch": "365c17523d76", - "no-compare": "38fb361f406c" - }, - "state": "534cf7badcbc", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-create-agent-refused.json b/mobile/rpc-foundation/goldens/review-create-agent-refused.json deleted file mode 100644 index 087db686266..00000000000 --- a/mobile/rpc-foundation/goldens/review-create-agent-refused.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "namedDeltas": [], - "values": { - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "2398eeb5ec74": { - "name": "preflight.detectAgents#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectAgents\",\"params\":{\"worktreeId\":\"workspace-1\"}}" - }, - "3dc53a43cb5e": { - "name": "agent.launchReplay#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"agent.launchReplay\",\"params\":{\"agent\":\"claude\",\"operationId\":\"1767225600000-00000000000040008000000000000001\",\"target\":{\"kind\":\"existing\",\"worktree\":\"id:workspace-1\"},\"prompt\":{\"text\":\"File: src/app.ts\\nLine: 4\\nUser comment: \\\"needs a test\\\"\",\"delivery\":\"submit\"},\"launchSource\":\"notes_send\"}}" - }, - "85b2d08ce134": { - "name": "agent.launchReplay#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "agent.launchReplay" - }, - { - "name": "params", - "value": { - "agent": "claude", - "launchSource": "notes_send", - "operationId": "1767225600000-00000000000040008000000000000001", - "prompt": { - "delivery": "submit", - "text": "File: src/app.ts\nLine: 4\nUser comment: \"needs a test\"" - }, - "target": { - "kind": "existing", - "worktree": "id:workspace-1" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 90000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "selector_not_found", - "message": "Workspace not found" - }, - "id": "frame-4", - "ok": false - } - } - }, - "9239a4f232b8": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "id": "workspace-1" - } - ] - } - } - } - }, - "96a9a954e28f": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": { - "$rpc": "null" - }, - "disabledTuiAgents": [] - } - } - } - } - }, - "bca41ddb4705": { - "name": "preflight.detectAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectAgents" - }, - { - "name": "params", - "value": { - "worktreeId": "workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": ["claude"] - } - } - }, - "e0eef7c9fafe": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "fc1691a7deca": { - "actionError": "Workspace not found", - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "review-create-agent-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["9239a4f232b8", "96a9a954e28f", "bca41ddb4705", "85b2d08ce134"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "2398eeb5ec74", "3dc53a43cb5e"], - "settlements": { - "create-and-send": "eb79a9b3682a" - }, - "state": "fc1691a7deca", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-file-diff-shapes.json b/mobile/rpc-foundation/goldens/review-file-diff-shapes.json deleted file mode 100644 index d8e9ed98991..00000000000 --- a/mobile/rpc-foundation/goldens/review-file-diff-shapes.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-load", - "family": "session.review-file-diff", - "namedDeltas": [], - "values": { - "168eeea61142": { - "name": "git.diff#3", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "kind": "unknown" - } - } - } - }, - "18072d796980": { - "name": "git.diff#3", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "481bd3924019": { - "name": "git.diff#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":false}}" - }, - "50bd7426ef76": { - "name": "git.diff#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": false, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "kind": "binary" - } - } - } - }, - "5135c435b058": { - "name": "git.diff#2", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "git.diff" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "staged": true, - "worktree": "id:repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "byteLength": 2048, - "kind": "too-large" - } - } - } - }, - "717bd1fbc163": { - "branchCompare": "unloaded", - "diff": { - "byteLength": 2048, - "itemKey": "staged:src/app.ts", - "kind": "too-large" - }, - "snapshot": "unloaded" - }, - "7753343578da": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "The host sent a reply this app could not read (git.diff)", - "isRpcDeliveryUnknown": false - } - }, - "84090dfad90d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "itemKey": "unstaged:src/app.ts", - "kind": "binary" - } - }, - "8675e0f40158": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "byteLength": 2048, - "itemKey": "staged:src/app.ts", - "kind": "too-large" - } - }, - "ea98fa53e2cc": { - "name": "git.diff#2", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.diff\",\"params\":{\"worktree\":\"id:repo-9::/w\",\"filePath\":\"src/app.ts\",\"staged\":true}}" - }, - "f68945ffc2ea": { - "branchCompare": "unloaded", - "diff": { - "itemKey": "unstaged:src/app.ts", - "kind": "binary" - }, - "snapshot": "unloaded" - } - }, - "recording": { - "scenario": "review-file-diff-shapes", - "checkpoints": [ - { - "id": "binary", - "observation": { - "sender": ["50bd7426ef76"], - "payloads": ["481bd3924019"], - "settlements": { - "binary": "84090dfad90d" - }, - "state": "f68945ffc2ea", - "effects": [] - } - }, - { - "id": "too-large", - "observation": { - "sender": ["50bd7426ef76", "5135c435b058"], - "payloads": ["481bd3924019", "ea98fa53e2cc"], - "settlements": { - "binary": "84090dfad90d", - "too-large": "8675e0f40158" - }, - "state": "717bd1fbc163", - "effects": [] - } - }, - { - "id": "invalid", - "observation": { - "sender": ["50bd7426ef76", "5135c435b058", "168eeea61142"], - "payloads": ["481bd3924019", "ea98fa53e2cc", "18072d796980"], - "settlements": { - "binary": "84090dfad90d", - "too-large": "8675e0f40158", - "invalid": "7753343578da" - }, - "state": "717bd1fbc163", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-git-mutations-run.json b/mobile/rpc-foundation/goldens/review-git-mutations-run.json deleted file mode 100644 index c986486de4a..00000000000 --- a/mobile/rpc-foundation/goldens/review-git-mutations-run.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.review-git-mutations", - "namedDeltas": [], - "values": { - "2fc890e4b748": { - "actionError": { - "$rpc": "null" - }, - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - }, - "53b792409cec": { - "name": "load-review-data", - "ordinal": 3, - "value": {} - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "a0c4d58800db": { - "name": "load-review-data", - "ordinal": 6, - "value": {} - }, - "aa50219ebe9a": { - "name": "git.discard#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.discard\",\"params\":{\"worktree\":\"id:workspace-1\",\"filePath\":\"src/app.ts\"}}" - }, - "d1de63d44a74": { - "name": "git.discard#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "git.discard" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "discarded": true - } - } - } - }, - "f39122ee30fc": { - "name": "git.stage#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.stage\",\"params\":{\"worktree\":\"id:workspace-1\",\"filePath\":\"src/app.ts\"}}" - }, - "fd1322e39fc5": { - "name": "git.stage#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.stage" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "staged": true - } - } - } - } - }, - "recording": { - "scenario": "review-git-mutations-run", - "checkpoints": [ - { - "id": "staged", - "observation": { - "sender": ["fd1322e39fc5"], - "payloads": ["f39122ee30fc"], - "settlements": { - "stage": "84e5ca07cb7a" - }, - "state": "2fc890e4b748", - "effects": ["53b792409cec"] - } - }, - { - "id": "discarded", - "observation": { - "sender": ["fd1322e39fc5", "d1de63d44a74"], - "payloads": ["f39122ee30fc", "aa50219ebe9a"], - "settlements": { - "stage": "84e5ca07cb7a", - "discard": "84e5ca07cb7a" - }, - "state": "2fc890e4b748", - "effects": ["53b792409cec", "a0c4d58800db"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-mark-reviewed-persists.json b/mobile/rpc-foundation/goldens/review-mark-reviewed-persists.json deleted file mode 100644 index bee98a71364..00000000000 --- a/mobile/rpc-foundation/goldens/review-mark-reviewed-persists.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "namedDeltas": [], - "values": { - "02c4a9358dee": { - "actionError": { - "$rpc": "null" - }, - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "completedAt": 1767225600000, - "files": { - "unstaged:src/app.ts": { - "filePath": "src/app.ts", - "key": "unstaged:src/app.ts", - "lastOpenedAt": { - "$rpc": "undefined" - }, - "lastSeenDiffIdentity": "identity-1", - "oldPath": { - "$rpc": "undefined" - }, - "reviewDiffIdentity": "identity-1", - "reviewedAt": 1767225600000, - "scope": "unstaged" - } - }, - "updatedAt": 1767225600000, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - }, - "81c9edeaad86": { - "name": "worktree.set#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.set\",\"params\":{\"worktree\":\"id:workspace-1\",\"diffComments\":[{\"side\":\"modified\",\"id\":\"note-1\",\"worktreeId\":\"workspace-1\",\"filePath\":\"src/app.ts\",\"lineNumber\":4,\"body\":\"needs a test\",\"createdAt\":0}],\"diffCommentsBase\":[{\"side\":\"modified\",\"id\":\"note-1\",\"worktreeId\":\"workspace-1\",\"filePath\":\"src/app.ts\",\"lineNumber\":4,\"body\":\"needs a test\",\"createdAt\":0}],\"mobileDiffReview\":{\"version\":1,\"files\":{\"unstaged:src/app.ts\":{\"key\":\"unstaged:src/app.ts\",\"filePath\":\"src/app.ts\",\"scope\":\"unstaged\",\"lastSeenDiffIdentity\":\"identity-1\",\"reviewedAt\":1767225600000,\"reviewDiffIdentity\":\"identity-1\"}},\"updatedAt\":1767225600000,\"completedAt\":1767225600000}}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ebfe5f82347b": { - "name": "worktree.set#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "diffComments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "diffCommentsBase": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "mobileDiffReview": { - "completedAt": 1767225600000, - "files": { - "unstaged:src/app.ts": { - "filePath": "src/app.ts", - "key": "unstaged:src/app.ts", - "lastOpenedAt": { - "$rpc": "undefined" - }, - "lastSeenDiffIdentity": "identity-1", - "oldPath": { - "$rpc": "undefined" - }, - "reviewDiffIdentity": "identity-1", - "reviewedAt": 1767225600000, - "scope": "unstaged" - } - }, - "updatedAt": 1767225600000, - "version": 1 - }, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "updated": true - } - } - } - } - }, - "recording": { - "scenario": "review-mark-reviewed-persists", - "checkpoints": [ - { - "id": "persisted", - "observation": { - "sender": ["ebfe5f82347b"], - "payloads": ["81c9edeaad86"], - "settlements": { - "mark-reviewed": "eb79a9b3682a" - }, - "state": "02c4a9358dee", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-open-in-session.json b/mobile/rpc-foundation/goldens/review-open-in-session.json deleted file mode 100644 index e52844e2ae3..00000000000 --- a/mobile/rpc-foundation/goldens/review-open-in-session.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "namedDeltas": [], - "values": { - "1e2ced5a5f5a": { - "name": "files.openDiff#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"files.openDiff\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"src/app.ts\",\"staged\":false}}" - }, - "2fc890e4b748": { - "actionError": { - "$rpc": "null" - }, - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - }, - "4353ae13dc10": { - "name": "open-session", - "ordinal": 3, - "value": {} - }, - "ab27560e03f6": { - "name": "files.openDiff#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "files.openDiff" - }, - { - "name": "params", - "value": { - "relativePath": "src/app.ts", - "staged": false, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "opened": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "review-open-in-session", - "checkpoints": [ - { - "id": "opened", - "observation": { - "sender": ["ab27560e03f6"], - "payloads": ["1e2ced5a5f5a"], - "settlements": { - "open-in-session": "eb79a9b3682a" - }, - "state": "2fc890e4b748", - "effects": ["4353ae13dc10"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-send-notes-heals-stale-input.json b/mobile/rpc-foundation/goldens/review-send-notes-heals-stale-input.json deleted file mode 100644 index e855c4f34c2..00000000000 --- a/mobile/rpc-foundation/goldens/review-send-notes-heals-stale-input.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "namedDeltas": [], - "values": { - "0db3b6958ec7": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "terminal-1" - }, - "15a9fbee07a2": { - "name": "terminal.read#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.read" - }, - { - "name": "params", - "value": { - "limit": 1, - "screen": true, - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 2000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "terminal": {} - } - } - } - }, - "2fc890e4b748": { - "actionError": { - "$rpc": "null" - }, - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - }, - "8a39711b3244": { - "name": "terminal.send#2", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"File: src/app.ts\\nLine: 4\\nUser comment: \\\"needs a test\\\"\",\"enter\":true}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "96246abc8742": { - "name": "terminal.send#2", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "enter": true, - "terminal": "terminal-1", - "text": "File: src/app.ts\nLine: 4\nUser comment: \"needs a test\"" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "abebd0f45ba2": { - "name": "terminal.read#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.read\",\"params\":{\"terminal\":\"terminal-1\",\"screen\":true,\"limit\":1}}" - }, - "eac83a42a48c": { - "name": "terminal.send#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u0015\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\\u000b\",\"enter\":false}}" - }, - "f56bee9b4829": { - "name": "terminal.send#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "enter": false, - "terminal": "terminal-1", - "text": "\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b" - } - }, - { - "name": "options", - "value": { - "budgetSpansConnect": true, - "timeoutMs": 15000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - } - }, - "recording": { - "scenario": "review-send-notes-heals-stale-input", - "checkpoints": [ - { - "id": "healed", - "observation": { - "sender": ["15a9fbee07a2", "f56bee9b4829", "96246abc8742"], - "payloads": ["abebd0f45ba2", "eac83a42a48c", "8a39711b3244"], - "settlements": { - "mark-stale": "0db3b6958ec7", - "send-notes": "9270aeb7d9c6" - }, - "state": "2fc890e4b748", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-send-sheet-lists-terminals.json b/mobile/rpc-foundation/goldens/review-send-sheet-lists-terminals.json deleted file mode 100644 index d97ef0a7628..00000000000 --- a/mobile/rpc-foundation/goldens/review-send-sheet-lists-terminals.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.review-send-sheet", - "namedDeltas": [], - "values": { - "697177595a0a": { - "actionError": { - "$rpc": "null" - }, - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "kind": "ready", - "terminals": [ - { - "id": "tab-1", - "terminal": "terminal-1", - "title": "codex" - } - ] - } - }, - "6eb439bad25e": { - "name": "reply-salvage", - "ordinal": 3, - "value": { - "droppedCount": 1, - "droppedPaths": ["1"], - "method": "session.tabs.list", - "operation": "session.review-terminal-list", - "variant": "review-terminal-tabs" - } - }, - "9a3dbd49ee14": { - "name": "session.tabs.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.list" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "tabs": [ - { - "id": "tab-1", - "terminal": "terminal-1", - "title": "codex", - "type": "terminal" - }, - { - "id": "tab-2", - "title": "notes.md", - "type": "markdown" - } - ] - } - } - } - }, - "acb5ae38e750": { - "name": "session.tabs.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.list\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "review-send-sheet-lists-terminals", - "checkpoints": [ - { - "id": "listed", - "observation": { - "sender": ["9a3dbd49ee14"], - "payloads": ["acb5ae38e750"], - "settlements": { - "open": "eb79a9b3682a" - }, - "state": "697177595a0a", - "effects": ["6eb439bad25e"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-stage-file.json b/mobile/rpc-foundation/goldens/review-stage-file.json deleted file mode 100644 index 8b0bef297bd..00000000000 --- a/mobile/rpc-foundation/goldens/review-stage-file.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "namedDeltas": [], - "values": { - "2fc890e4b748": { - "actionError": { - "$rpc": "null" - }, - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - }, - "53b792409cec": { - "name": "load-review-data", - "ordinal": 3, - "value": {} - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "f39122ee30fc": { - "name": "git.stage#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.stage\",\"params\":{\"worktree\":\"id:workspace-1\",\"filePath\":\"src/app.ts\"}}" - }, - "fd1322e39fc5": { - "name": "git.stage#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.stage" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "staged": true - } - } - } - } - }, - "recording": { - "scenario": "review-stage-file", - "checkpoints": [ - { - "id": "staged", - "observation": { - "sender": ["fd1322e39fc5"], - "payloads": ["f39122ee30fc"], - "settlements": { - "stage": "84e5ca07cb7a" - }, - "state": "2fc890e4b748", - "effects": ["53b792409cec"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/review-stage-refused.json b/mobile/rpc-foundation/goldens/review-stage-refused.json deleted file mode 100644 index ea85877d000..00000000000 --- a/mobile/rpc-foundation/goldens/review-stage-refused.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "namedDeltas": [], - "values": { - "36787858f78b": { - "actionError": "Cannot discard during a merge", - "busyAction": { - "$rpc": "null" - }, - "screenState": { - "branchCompare": { - "$rpc": "null" - }, - "comments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "side": "modified", - "worktreeId": "workspace-1" - } - ], - "kind": "ready", - "reviewState": { - "files": {}, - "version": 1 - }, - "status": { - "entries": [] - } - }, - "sendSheet": { - "$rpc": "null" - } - }, - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "ccba3a78ab93": { - "name": "git.discard#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.discard\",\"params\":{\"worktree\":\"id:workspace-1\",\"filePath\":\"src/app.ts\"}}" - }, - "f4ea7cb3a3d2": { - "name": "git.discard#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.discard" - }, - { - "name": "params", - "value": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "git_conflict", - "message": "Cannot discard during a merge" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "review-stage-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["f4ea7cb3a3d2"], - "payloads": ["ccba3a78ab93"], - "settlements": { - "discard": "7ed3d39f0607" - }, - "state": "36787858f78b", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-changes-loaded.json b/mobile/rpc-foundation/goldens/sc-changes-loaded.json deleted file mode 100644 index ed045bdb30b..00000000000 --- a/mobile/rpc-foundation/goldens/sc-changes-loaded.json +++ /dev/null @@ -1,548 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.changes-load", - "family": "git.changes-load", - "namedDeltas": [], - "values": { - "1934c215114a": { - "name": "repo.list#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "1d461278a0ae": { - "branchCompareState": { - "kind": "ready", - "result": { - "entries": [ - { - "added": 2, - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "summary": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/dev", - "changedFiles": 1, - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "status": "ready" - } - } - }, - "screenState": { - "kind": "ready", - "status": { - "branch": "feature", - "entries": [ - { - "added": 4, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - }, - { - "area": "staged", - "oldPath": "src/older.ts", - "path": "src/old.ts", - "status": "renamed" - } - ], - "head": "head-oid", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true, - "upstreamName": "origin/feature" - } - } - } - }, - "2ab4c978da8d": { - "name": "git.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "2ca33da4d135": { - "name": "repo.list#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "repos": [] - } - } - } - }, - "3088889ce80e": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - }, - "5d30d477f0d5": { - "name": "git.branchCompare#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "git.branchCompare" - }, - { - "name": "params", - "value": { - "baseRef": "origin/dev", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "entries": [ - { - "added": 2, - "path": "src/app.ts", - "removed": 1, - "status": "modified" - } - ], - "summary": { - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "baseRef": "origin/dev", - "changedFiles": 1, - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "status": "ready" - } - } - } - } - }, - "5e74c6d574e1": { - "name": "git.branchCompare#1", - "ordinal": 11, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"git.branchCompare\",\"params\":{\"worktree\":\"id:repo42::/p\",\"baseRef\":\"origin/dev\"}}" - }, - "6f4a5d6a5a86": { - "name": "worktree.show#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "71f3760dfea1": { - "name": "repo.list#1", - "ordinal": 9, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "74d102469d68": { - "name": "worktree.show#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/dev" - } - } - } - } - }, - "76c784c63522": { - "name": "streams-registered-at-teardown", - "ordinal": 12, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "8fda864c66d6": { - "branchCompareState": { - "kind": "loading" - }, - "screenState": { - "kind": "ready", - "status": { - "branch": "feature", - "entries": [ - { - "added": 4, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - }, - { - "area": "staged", - "oldPath": "src/older.ts", - "path": "src/old.ts", - "status": "renamed" - } - ], - "head": "head-oid", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true, - "upstreamName": "origin/feature" - } - } - } - }, - "92a577a15fcc": { - "name": "git.status#1", - "ordinal": 5, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "962f91336a50": { - "name": "git.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "branch": "feature", - "entries": [ - { - "added": 4, - "area": "unstaged", - "path": "src/app.ts", - "removed": 1, - "status": "modified" - }, - { - "area": "staged", - "oldPath": "src/older.ts", - "path": "src/old.ts", - "status": "renamed" - } - ], - "head": "head-oid", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true, - "upstreamName": "origin/feature" - } - } - } - } - }, - "a0e527bdf205": { - "branchCompareState": { - "kind": "idle" - }, - "screenState": { - "kind": "loading" - } - }, - "b823fdc0d205": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "cb462f8b50a3": { - "name": "worktree.show#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - } - }, - "recording": { - "scenario": "sc-changes-loaded", - "checkpoints": [ - { - "id": "status-pending", - "observation": { - "sender": ["b823fdc0d205", "2ab4c978da8d"], - "payloads": ["eef1ee3c2773", "1c2564f1daca", "92a577a15fcc"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "a0e527bdf205", - "effects": [] - } - }, - { - "id": "compare-pending", - "observation": { - "sender": ["b823fdc0d205", "962f91336a50", "6f4a5d6a5a86", "1934c215114a"], - "payloads": [ - "eef1ee3c2773", - "1c2564f1daca", - "92a577a15fcc", - "cb462f8b50a3", - "71f3760dfea1" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "8fda864c66d6", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": [ - "b823fdc0d205", - "962f91336a50", - "74d102469d68", - "2ca33da4d135", - "5d30d477f0d5" - ], - "payloads": [ - "eef1ee3c2773", - "1c2564f1daca", - "92a577a15fcc", - "cb462f8b50a3", - "71f3760dfea1", - "5e74c6d574e1" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "1d461278a0ae", - "effects": [] - } - }, - { - "id": "cleanup", - "observation": { - "sender": [ - "3088889ce80e", - "962f91336a50", - "74d102469d68", - "2ca33da4d135", - "5d30d477f0d5" - ], - "payloads": [ - "eef1ee3c2773", - "1c2564f1daca", - "92a577a15fcc", - "cb462f8b50a3", - "71f3760dfea1", - "5e74c6d574e1" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "1d461278a0ae", - "effects": ["76c784c63522"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-history-branch-commits.json b/mobile/rpc-foundation/goldens/sc-history-branch-commits.json deleted file mode 100644 index 4f3d446327f..00000000000 --- a/mobile/rpc-foundation/goldens/sc-history-branch-commits.json +++ /dev/null @@ -1,329 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.history-branch-commits", - "family": "git.history-branch-commits", - "namedDeltas": [], - "values": { - "006a91b993e0": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "2325497ad5bc": { - "commitRow": ["first", "aaaaaaa · dev · 1h"], - "crash": { - "$rpc": "null" - }, - "elements": { - "FlatList": 1, - "View": 1 - }, - "labels": [], - "text": [] - }, - "337dba1b9080": { - "name": "git.history#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.history" - }, - { - "name": "params", - "value": { - "baseRef": "origin/main", - "branchOnly": true, - "limit": 50, - "skip": 0, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "branch": { - "ahead": 1, - "baseRef": { - "id": "refs/remotes/origin/main", - "name": "origin/main" - }, - "behind": 2, - "unpushed": 1 - }, - "hasMore": false, - "items": [ - { - "author": "dev", - "displayId": "aaaaaaa", - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "message": "first\n\nExplains the change.\n\nCo-authored-by: Pair ", - "parentIds": ["bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"], - "pushed": false, - "statistics": { - "deletions": 1, - "files": 2, - "insertions": 13 - }, - "subject": "first", - "timestamp": 1767222000000 - } - ], - "skip": 0 - } - } - } - }, - "3b589774484d": { - "name": "worktree.show#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main" - } - } - } - } - }, - "5ad8bfe89483": { - "commitRow": "unrendered", - "crash": { - "$rpc": "null" - }, - "elements": { - "ActivityIndicator": 1, - "Text": 1, - "View": 2 - }, - "labels": [], - "text": ["Loading commits…"] - }, - "5ff1385fce3c": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "id": "repo42", - "worktreeBaseRef": { - "$rpc": "null" - } - } - ] - } - } - } - }, - "62fe63a20a07": { - "name": "worktree.show#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "worktree.show" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "b1d31f6bf592": { - "name": "git.history#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.history\",\"params\":{\"worktree\":\"id:repo42::/p\",\"limit\":50,\"skip\":0,\"baseRef\":\"origin/main\",\"branchOnly\":true}}" - }, - "c2424f466a69": { - "name": "git.history#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "git.history" - }, - { - "name": "params", - "value": { - "baseRef": "origin/main", - "branchOnly": true, - "limit": 50, - "skip": 0, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "d45289c61d23": { - "name": "history.open-commit", - "ordinal": 7, - "value": { - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - } - }, - "d64700b9de3b": { - "name": "repo.list#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "dfcd2e1792cb": { - "name": "worktree.show#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.show\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "sc-history-branch-commits", - "checkpoints": [ - { - "id": "base-pending", - "observation": { - "sender": ["62fe63a20a07", "006a91b993e0"], - "payloads": ["dfcd2e1792cb", "d64700b9de3b"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "5ad8bfe89483", - "effects": [] - } - }, - { - "id": "history-pending", - "observation": { - "sender": ["3b589774484d", "5ff1385fce3c", "c2424f466a69"], - "payloads": ["dfcd2e1792cb", "d64700b9de3b", "b1d31f6bf592"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "5ad8bfe89483", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["3b589774484d", "5ff1385fce3c", "337dba1b9080"], - "payloads": ["dfcd2e1792cb", "d64700b9de3b", "b1d31f6bf592"], - "settlements": { - "mount": "eb79a9b3682a", - "open": "eb79a9b3682a" - }, - "state": "2325497ad5bc", - "effects": ["d45289c61d23"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/schedules-b3.json b/mobile/rpc-foundation/goldens/schedules-b3.json deleted file mode 100644 index 3d84cdf4f0b..00000000000 --- a/mobile/rpc-foundation/goldens/schedules-b3.json +++ /dev/null @@ -1,759 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "linear.issue-detail", - "family": "linear-detail-barrier", - "namedDeltas": [], - "values": { - "0056f47b204a": { - "name": "linear.getIssue#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "linear.getIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "1127f274b58c": { - "name": "linear.getIssue#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "linear.getIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: linear.getIssue", - "isRpcDeliveryUnknown": true - } - } - }, - "1d3774209877": { - "name": "linear.issueComments#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.issueComments" - }, - { - "name": "params", - "value": { - "issueId": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "comments transport error", - "isRpcDeliveryUnknown": true - } - } - }, - "1eaad537f925": { - "name": "linear.getIssue#1", - "ordinal": 6, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.getIssue\",\"params\":{\"id\":\"issue-1\",\"workspaceId\":\"linear-workspace\"}}" - }, - "24f3de063dfd": { - "error": "linear.issueComments#1 rejected", - "loading": false, - "payload": { - "$rpc": "null" - } - }, - "264010756b38": { - "name": "detailLoading", - "ordinal": 3, - "value": true - }, - "325dc4e1af5c": { - "name": "linear.issueComments#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.issueComments" - }, - { - "name": "params", - "value": { - "issueId": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "33614c90b6eb": { - "name": "detailPayload", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "42903545f0f8": { - "error": "comments transport error", - "loading": false, - "payload": { - "$rpc": "null" - } - }, - "44556e4bd91e": { - "name": "linear.issueComments#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.issueComments" - }, - { - "name": "params", - "value": { - "issueId": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "linear.issueComments#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "485053bffe22": { - "name": "linear.getIssue#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "linear.getIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "51ea77da7dbd": { - "name": "detailError", - "ordinal": 8, - "value": "comments transport error" - }, - "5f9cfa2482e9": { - "name": "detailError", - "ordinal": 8, - "value": "linear.issueComments#1 rejected" - }, - "780aaf1d97be": { - "error": "", - "loading": true, - "payload": { - "$rpc": "null" - } - }, - "7d8d46d494ff": { - "name": "linear.issueComments#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.issueComments\",\"params\":{\"issueId\":\"issue-1\",\"workspaceId\":\"linear-workspace\"}}" - }, - "881cdeb6ce57": { - "name": "detailError", - "ordinal": 8, - "value": "RPC interrupted by connection migration" - }, - "88573133f7d5": { - "error": "RPC interrupted by connection migration", - "loading": false, - "payload": { - "$rpc": "null" - } - }, - "8aacae6d3ab3": { - "name": "detailError", - "ordinal": 8, - "value": "Request timed out: linear.getIssue" - }, - "8ccd4fa759a5": { - "name": "detailLoading", - "ordinal": 9, - "value": false - }, - "a4f1a8696a24": { - "name": "detailError", - "ordinal": 2, - "value": "" - }, - "a778223fed77": { - "error": "linear.getIssue#1 rejected", - "loading": false, - "payload": { - "$rpc": "null" - } - }, - "b1228a23df33": { - "name": "linear.getIssue#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "linear.getIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "b6399147a999": { - "name": "linear.getIssue#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "linear.getIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "linear.getIssue#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "c834373cd824": { - "name": "detailError", - "ordinal": 8, - "value": "Connection lost" - }, - "d3dc79e5717b": { - "name": "linear.getIssue#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "linear.getIssue" - }, - { - "name": "params", - "value": { - "id": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "issue refused" - }, - "id": "frame-1", - "ok": false - } - } - }, - "d40dd5c93d21": { - "error": "Connection lost", - "loading": false, - "payload": { - "$rpc": "null" - } - }, - "de8da0e14206": { - "name": "linear.issueComments#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.issueComments" - }, - { - "name": "params", - "value": { - "issueId": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "dfab6810321b": { - "name": "linear.issueComments#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.issueComments" - }, - { - "name": "params", - "value": { - "issueId": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: linear.issueComments", - "isRpcDeliveryUnknown": true - } - } - }, - "ea4a4f6523e7": { - "name": "linear.issueComments#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "linear.issueComments" - }, - { - "name": "params", - "value": { - "issueId": "issue-1", - "workspaceId": "linear-workspace" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f2c4f4180915": { - "name": "detailError", - "ordinal": 8, - "value": "linear.getIssue#1 rejected" - }, - "fc6d55bc97ed": { - "error": "Request timed out: linear.getIssue", - "loading": false, - "payload": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "schedules-b3", - "checkpoints": [ - { - "id": "b3.forward:sibling-pending", - "observation": { - "sender": ["d3dc79e5717b", "ea4a4f6523e7"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "780aaf1d97be", - "effects": ["33614c90b6eb", "a4f1a8696a24", "264010756b38"] - } - }, - { - "id": "b3.forward:settled", - "observation": { - "sender": ["d3dc79e5717b", "1d3774209877"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "42903545f0f8", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "51ea77da7dbd", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.reverse:sibling-pending", - "observation": { - "sender": ["0056f47b204a", "1d3774209877"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "42903545f0f8", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "51ea77da7dbd", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.reverse:settled", - "observation": { - "sender": ["d3dc79e5717b", "1d3774209877"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "42903545f0f8", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "51ea77da7dbd", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.both-reject-forward:sibling-pending", - "observation": { - "sender": ["b6399147a999", "ea4a4f6523e7"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "a778223fed77", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "f2c4f4180915", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.both-reject-forward:settled", - "observation": { - "sender": ["b6399147a999", "44556e4bd91e"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "a778223fed77", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "f2c4f4180915", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.both-reject-reverse:sibling-pending", - "observation": { - "sender": ["0056f47b204a", "44556e4bd91e"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "24f3de063dfd", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "5f9cfa2482e9", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.both-reject-reverse:settled", - "observation": { - "sender": ["b6399147a999", "44556e4bd91e"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "24f3de063dfd", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "5f9cfa2482e9", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.reject-peer-pending:sibling-pending", - "observation": { - "sender": ["b6399147a999", "ea4a4f6523e7"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "a778223fed77", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "f2c4f4180915", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.reject-peer-pending:settled", - "observation": { - "sender": ["b6399147a999", "ea4a4f6523e7"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "a778223fed77", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "f2c4f4180915", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.timeout:settled", - "observation": { - "sender": ["1127f274b58c", "dfab6810321b"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "fc6d55bc97ed", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "8aacae6d3ab3", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.disconnect:settled", - "observation": { - "sender": ["485053bffe22", "325dc4e1af5c"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "d40dd5c93d21", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "c834373cd824", - "8ccd4fa759a5" - ] - } - }, - { - "id": "b3.client-cutover:settled", - "observation": { - "sender": ["b1228a23df33", "de8da0e14206"], - "payloads": ["1eaad537f925", "7d8d46d494ff"], - "settlements": { - "mount": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "88573133f7d5", - "effects": [ - "33614c90b6eb", - "a4f1a8696a24", - "264010756b38", - "881cdeb6ce57", - "8ccd4fa759a5" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json b/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json deleted file mode 100644 index 1937c9e6229..00000000000 --- a/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json +++ /dev/null @@ -1,695 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.new-tab-agents", - "family": "settings-agent-read", - "namedDeltas": [], - "values": { - "02188f091419": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [] - } - } - } - } - }, - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "3cac466cd7ee": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "44136fa355b3": {}, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "6d0209806267": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - }, - "7023dde78391": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "connectionId": "ssh-1", - "id": "repo-1" - } - ] - } - } - } - }, - "7e9a4c0e6082": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings.get#1 rejected", - "isRpcDeliveryUnknown": true - } - }, - "7e9eedbb267f": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "8277c8a13a15": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - }, - "9058971b9337": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: preflight.detectRemoteAgents", - "isRpcDeliveryUnknown": true - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "95a3d59bc187": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": ["codex", "claude"] - } - } - }, - "a05ac6b15c2d": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" - }, - "adabd410f1bc": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "b27c85677730": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "agent": "codex", - "label": "Codex" - }, - { - "agent": "claude", - "label": "Claude" - } - ] - }, - "be0c6d8ba1f9": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c5b670e82bb4": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "d58a51553d50": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - }, - "e0eef7c9fafe": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "e465a7e0746d": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "preflight.detectRemoteAgents#1 rejected", - "isRpcDeliveryUnknown": true - } - }, - "e56f41c68af0": { - "name": "preflight.detectRemoteAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectRemoteAgents" - }, - { - "name": "params", - "value": { - "connectionId": "ssh-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "preflight.detectRemoteAgents#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f6928aa5b0ba": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - } - }, - "fdf6a3099c89": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - } - }, - "recording": { - "scenario": "schedules-settings-new-tab-ssh", - "checkpoints": [ - { - "id": "settings-new-tab-ssh.forward:sibling-pending", - "observation": { - "sender": ["7023dde78391", "02188f091419", "be0c6d8ba1f9"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.forward:settled", - "observation": { - "sender": ["7023dde78391", "02188f091419", "95a3d59bc187"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "b27c85677730" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.reverse:sibling-pending", - "observation": { - "sender": ["7023dde78391", "51d4cb56be85", "95a3d59bc187"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "9270aeb7d9c6" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.reverse:settled", - "observation": { - "sender": ["7023dde78391", "02188f091419", "95a3d59bc187"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "b27c85677730" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.both-reject-forward:sibling-pending", - "observation": { - "sender": ["7023dde78391", "adabd410f1bc", "be0c6d8ba1f9"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "7e9a4c0e6082" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.both-reject-forward:settled", - "observation": { - "sender": ["7023dde78391", "adabd410f1bc", "e56f41c68af0"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "7e9a4c0e6082" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.both-reject-reverse:sibling-pending", - "observation": { - "sender": ["7023dde78391", "51d4cb56be85", "e56f41c68af0"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "e465a7e0746d" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.both-reject-reverse:settled", - "observation": { - "sender": ["7023dde78391", "adabd410f1bc", "e56f41c68af0"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "e465a7e0746d" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.reject-peer-pending:sibling-pending", - "observation": { - "sender": ["7023dde78391", "adabd410f1bc", "be0c6d8ba1f9"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "7e9a4c0e6082" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.reject-peer-pending:settled", - "observation": { - "sender": ["7023dde78391", "adabd410f1bc", "be0c6d8ba1f9"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "7e9a4c0e6082" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.timeout:settled", - "observation": { - "sender": ["7023dde78391", "f6928aa5b0ba", "9058971b9337"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "8277c8a13a15" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.disconnect:settled", - "observation": { - "sender": ["7023dde78391", "c5b670e82bb4", "3cac466cd7ee"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "6d0209806267", - "disconnect": "eb79a9b3682a" - }, - "state": "44136fa355b3", - "effects": [] - } - }, - { - "id": "settings-new-tab-ssh.client-cutover:settled", - "observation": { - "sender": ["7023dde78391", "fdf6a3099c89", "7e9eedbb267f"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "a05ac6b15c2d"], - "settlements": { - "load": "d58a51553d50", - "cutover": "eb79a9b3682a" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json deleted file mode 100644 index 8b602d23024..00000000000 --- a/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json +++ /dev/null @@ -1,1230 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.repo-metadata", - "family": "settings.repo-metadata", - "namedDeltas": [], - "values": { - "08124c6d14ec": { - "name": "streams-registered-at-teardown", - "ordinal": 16, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - }, - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#2" - } - ] - }, - "091af476e5cc": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 9, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.listTargetSummaries\"}" - }, - "20200b8feac4": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "platform": "linux" - } - } - } - }, - "21069b5e026b": { - "name": "streams-registered-at-teardown", - "ordinal": 15, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "353f0cb8ea69": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "37521eb2eef2": { - "name": "runtime.clientEvents.subscribe#2", - "ordinal": 12, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "455c68e82d1a": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - }, - "4578d91f2dd3": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "host.platform#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "564f54c8d902": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "56ab81cb67dc": { - "name": "hostLabelById", - "ordinal": 13, - "value": [["ssh:ssh-1", "SSH"]] - }, - "5e0ee4c76136": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "6063e534d9db": { - "name": "hostHealthById", - "ordinal": 13, - "value": [] - }, - "68916f125c3c": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "6d43117882f3": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "hostHealthById": [], - "hostLabelById": [["ssh:ssh-1", "SSH"]], - "hostPlatform": "linux", - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "76c784c63522": { - "name": "streams-registered-at-teardown", - "ordinal": 12, - "value": [ - { - "cancelled": true, - "method": "runtime.clientEvents.subscribe", - "payload": "runtime.clientEvents.subscribe#1" - } - ] - }, - "7999924c608c": { - "name": "settings.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "80e40a970f99": { - "name": "host.platform#1", - "ordinal": 11, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"host.platform\"}" - }, - "84c1dde54c62": { - "name": "hostHealthById", - "ordinal": 12, - "value": [] - }, - "8cfdd18c5fe6": { - "name": "repoHostIdByRepoId", - "ordinal": 8, - "value": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "8e76374272ce": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - } - } - } - }, - "8ee028bc34fd": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - } - }, - "913d2a349d4d": { - "name": "ssh.listTargetSummaries#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "ssh.listTargetSummaries" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "targets": [ - { - "id": "ssh-1", - "label": "SSH" - } - ] - } - } - } - }, - "9d20695fdb34": { - "name": "hostPlatform", - "ordinal": 15, - "value": { - "$rpc": "null" - } - }, - "b2746491ac07": { - "name": "repo.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "afterSnapshotId": { - "$rpc": "null" - } - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "connectionId": { - "$rpc": "null" - }, - "displayName": "Local", - "id": "repo-1" - }, - { - "connectionId": "ssh-1", - "displayName": "Remote", - "id": "repo-2" - } - ] - } - } - } - }, - "bb52caf215f6": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "bea13a4a2e87": { - "name": "hostLabelById", - "ordinal": 14, - "value": [["ssh:ssh-1", "SSH"]] - }, - "beb4ddf549da": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\",\"params\":{\"afterSnapshotId\":null}}" - }, - "d2692bd43ef0": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "d88cba4e044f": { - "desktopRepos": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ], - "hostHealthById": [], - "hostLabelById": [["ssh:ssh-1", "SSH"]], - "hostPlatform": { - "$rpc": "null" - }, - "repoHostIdByRepoId": [ - ["repo-1", "local"], - ["repo-2", "ssh:ssh-1"] - ] - }, - "d983dca3bcc1": { - "name": "host.platform#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "host.platform" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: host.platform", - "isRpcDeliveryUnknown": true - } - } - }, - "e4b24d9ceb7b": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "e7b605a67b1f": { - "name": "desktopRepos", - "ordinal": 7, - "value": [ - { - "displayName": "Local", - "executionHostId": "local", - "id": "repo-1", - "path": "repo-1" - }, - { - "displayName": "Remote", - "executionHostId": "ssh:ssh-1", - "id": "repo-2", - "path": "repo-2" - } - ] - }, - "e9480602a4c6": { - "name": "hostPlatform", - "ordinal": 14, - "value": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eeecd54446b9": { - "name": "settings.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "eef1ee3c2773": { - "name": "runtime.clientEvents.subscribe#1", - "ordinal": 1, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"runtime.clientEvents.subscribe\",\"params\":null}" - }, - "f9193cae5824": { - "name": "hostPlatform", - "ordinal": 14, - "value": "linux" - } - }, - "recording": { - "scenario": "schedules-settings-repo-metadata-fulfilled", - "checkpoints": [ - { - "id": "settings-repo-metadata-fulfilled.forward:sibling-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.forward:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.forward:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824", - "21069b5e026b" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.reverse:sibling-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "353f0cb8ea69", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.reverse:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.reverse:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8e76374272ce", "20200b8feac4"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "6d43117882f3", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "f9193cae5824", - "21069b5e026b" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.both-reject-forward:sibling-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.both-reject-forward:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "4578d91f2dd3"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.both-reject-forward:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "4578d91f2dd3"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6", - "21069b5e026b" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.both-reject-reverse:sibling-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "353f0cb8ea69", "4578d91f2dd3"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.both-reject-reverse:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "4578d91f2dd3"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.both-reject-reverse:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "4578d91f2dd3"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6", - "21069b5e026b" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.reject-peer-pending:sibling-pending", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.reject-peer-pending:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "564f54c8d902"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.reject-peer-pending:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "eeecd54446b9", "455c68e82d1a"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "68916f125c3c", - "effects": ["e7b605a67b1f", "8cfdd18c5fe6", "76c784c63522"] - } - }, - { - "id": "settings-repo-metadata-fulfilled.timeout:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8ee028bc34fd", "d983dca3bcc1"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.timeout:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "8ee028bc34fd", "d983dca3bcc1"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6", - "21069b5e026b" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.disconnect:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "e4b24d9ceb7b", "5e0ee4c76136"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.disconnect:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "e4b24d9ceb7b", "5e0ee4c76136"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "84c1dde54c62", - "56ab81cb67dc", - "e9480602a4c6", - "21069b5e026b" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.client-cutover:settled", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "d2692bd43ef0", "bb52caf215f6"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99", - "37521eb2eef2" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "6063e534d9db", - "bea13a4a2e87", - "9d20695fdb34" - ] - } - }, - { - "id": "settings-repo-metadata-fulfilled.client-cutover:cleanup", - "observation": { - "sender": ["b2746491ac07", "913d2a349d4d", "d2692bd43ef0", "bb52caf215f6"], - "payloads": [ - "eef1ee3c2773", - "beb4ddf549da", - "091af476e5cc", - "7999924c608c", - "80e40a970f99", - "37521eb2eef2" - ], - "settlements": { - "mount": "eb79a9b3682a", - "load": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "d88cba4e044f", - "effects": [ - "e7b605a67b1f", - "8cfdd18c5fe6", - "6063e534d9db", - "bea13a4a2e87", - "9d20695fdb34", - "08124c6d14ec" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json deleted file mode 100644 index c3f48169024..00000000000 --- a/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json +++ /dev/null @@ -1,2210 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.task-hydration", - "family": "settings.task-hydration", - "namedDeltas": [], - "values": { - "05ccd79ba4af": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "0919c52e10c6": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "0ebb7f0660a0": { - "name": "showLinearTeamPicker", - "ordinal": 4, - "value": false - }, - "1305e04da46a": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "15cdb7759e6b": { - "name": "ui.get#1", - "ordinal": 41, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"ui.get\"}" - }, - "1833d0fa5f1d": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "19505460d94b": { - "name": "githubMode", - "ordinal": 55, - "value": "items" - }, - "1a1091da11b2": { - "name": "githubProjectSettings", - "ordinal": 61, - "value": { - "activeProject": { - "$rpc": "null" - }, - "lastViewByProject": {}, - "pinned": [], - "recent": [] - } - }, - "1dfcd3f6163d": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "1f343058c9bd": { - "name": "tasksSupportState", - "ordinal": 45, - "value": { - "client": "logical-client", - "kind": "unknown" - } - }, - "20ef49331589": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: ui.get", - "isRpcDeliveryUnknown": true - } - } - }, - "22b355deb2df": { - "name": "provider", - "ordinal": 54, - "value": "github" - }, - "26ece795530e": { - "name": "showGitHubIssueSourcePicker", - "ordinal": 14, - "value": false - }, - "276a60ed41a5": { - "name": "mergeMethodTaskItem", - "ordinal": 28, - "value": { - "$rpc": "null" - } - }, - "2aad05f979a9": { - "name": "selectedRepoIds", - "ordinal": 52, - "value": [] - }, - "2b39b469a001": { - "name": "pendingGitHubProjectViewSelection", - "ordinal": 19, - "value": { - "$rpc": "null" - } - }, - "2bf05835527f": { - "name": "showLinearFilterPicker", - "ordinal": 11, - "value": false - }, - "2c3706d59dd5": { - "name": "linearTeams", - "ordinal": 49, - "value": [] - }, - "2d9ce55cc13a": { - "name": "query", - "ordinal": 62, - "value": "is:issue is:open" - }, - "301bdbdf1dec": { - "name": "taskStateHydrated", - "ordinal": 1, - "value": false - }, - "302df5159005": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: jira.status", - "isRpcDeliveryUnknown": true - } - } - }, - "3082bf4965fa": { - "name": "selectedLinearWorkspaceId", - "ordinal": 51, - "value": { - "$rpc": "null" - } - }, - "32b1c27f9f78": { - "name": "taskStateHydrated", - "ordinal": 47, - "value": false - }, - "330e27e080b0": { - "name": "error", - "ordinal": 44, - "value": "settings.get#1 rejected" - }, - "354e99da4ba4": { - "name": "pendingHostedStateChange", - "ordinal": 27, - "value": { - "$rpc": "null" - } - }, - "37e9eb7f2e21": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "394fb5675266": { - "name": "mergeMethodProjectRow", - "ordinal": 29, - "value": { - "$rpc": "null" - } - }, - "3a03e162efd9": { - "name": "selectedLinearTeamIds", - "ordinal": 50, - "value": [] - }, - "3a94dcc00915": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "3c66c971fe96": { - "name": "showGitHubProjectViewPicker", - "ordinal": 17, - "value": false - }, - "3d31b2fc3a47": { - "name": "jiraConnection", - "ordinal": 47, - "value": { - "connected": false, - "credentialError": { - "$rpc": "null" - }, - "selection": { - "$rpc": "null" - }, - "sites": [], - "unavailableReason": { - "$rpc": "null" - } - } - }, - "3ff235330cbe": { - "name": "jiraFilter", - "ordinal": 60, - "value": "assigned" - }, - "4075b6316e30": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "ui.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "40f00017ad77": { - "name": "linearWorkspaces", - "ordinal": 48, - "value": [] - }, - "42c4d0584b72": { - "name": "error", - "ordinal": 45, - "value": "Connection lost" - }, - "430c28cba43c": { - "name": "taskStateHydrated", - "ordinal": 64, - "value": true - }, - "43f5e0efb7d5": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "4526d5d74acb": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "45cfb5ee97ea": { - "name": "pendingHostedMerge", - "ordinal": 25, - "value": { - "$rpc": "null" - } - }, - "45e466d86a07": { - "name": "showLinearWorkspacePicker", - "ordinal": 3, - "value": false - }, - "4a0377b4ac3c": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "4cbaceb42c08": { - "name": "detailPayload", - "ordinal": 21, - "value": { - "$rpc": "null" - } - }, - "4fe7877fc963": { - "name": "error", - "ordinal": 45, - "value": "RPC interrupted by connection migration" - }, - "525789d7c3fa": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "57087f926eaf": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: preflight.check", - "isRpcDeliveryUnknown": true - } - } - }, - "5729b7cdb4ba": { - "name": "showFilterSheet", - "ordinal": 12, - "value": false - }, - "57568fbaf4f7": { - "name": "linearConnected", - "ordinal": 47, - "value": false - }, - "5886b76643d9": { - "name": "appliedQuery", - "ordinal": 63, - "value": "is:issue is:open" - }, - "58c52d8b7c76": { - "hydrated": true, - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - }, - "5c7f665de6c4": { - "name": "githubPreset", - "ordinal": 57, - "value": "issues" - }, - "600862ad27b3": { - "name": "githubProjectHiddenFieldIdsByView", - "ordinal": 46, - "value": {} - }, - "688fe01c6196": { - "name": "jira.status#1", - "ordinal": 34, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "714d4b3547ff": { - "name": "projectRepoNotInOrca", - "ordinal": 20, - "value": { - "$rpc": "null" - } - }, - "71bedad13169": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "74d8785ba556": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: linear.status", - "isRpcDeliveryUnknown": true - } - } - }, - "756c11d6e5bc": { - "name": "settings.get#1", - "ordinal": 40, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "7b0ad7b958dd": { - "name": "tasksSupportState", - "ordinal": 2, - "value": { - "client": "logical-client", - "kind": "unknown" - } - }, - "800b1afcceea": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "glab": { - "installed": false - } - } - } - } - }, - "8015a69c7774": { - "name": "showGitLabFilterPicker", - "ordinal": 10, - "value": false - }, - "82daca007272": { - "name": "jiraConnection", - "ordinal": 65, - "value": { - "connected": false, - "credentialError": { - "$rpc": "null" - }, - "selection": { - "$rpc": "null" - }, - "sites": [], - "unavailableReason": { - "$rpc": "null" - } - } - }, - "87bd323da79d": { - "name": "trustedOrcaHooks", - "ordinal": 45, - "value": {} - }, - "8a053731b837": { - "name": "visibleProviders", - "ordinal": 53, - "value": ["github", "linear"] - }, - "8c4056edb811": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "8db7a6a7d531": { - "name": "status.get#1", - "ordinal": 30, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "capabilities": ["mobile.tasks.v1"] - } - } - } - }, - "931e8e15095d": { - "name": "showGitHubProjectPicker", - "ordinal": 16, - "value": false - }, - "93acc26335bc": { - "name": "githubKind", - "ordinal": 58, - "value": "issues" - }, - "95d5a2a2f417": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "965996579b8a": { - "name": "preflight.check#1", - "ordinal": 37, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "98281d0e8b13": { - "name": "projectRowDetail", - "ordinal": 22, - "value": { - "$rpc": "null" - } - }, - "9b2188f8d6b7": { - "name": "showGitHubPagePicker", - "ordinal": 15, - "value": false - }, - "9d27c74981a1": { - "name": "error", - "ordinal": 33, - "value": "" - }, - "9f545b97e888": { - "name": "showCreateTargetPicker", - "ordinal": 23, - "value": false - }, - "a103fa2e507b": { - "name": "error", - "ordinal": 44, - "value": "ui.get#1 rejected" - }, - "a20a93879807": { - "name": "jiraConnection", - "ordinal": 44, - "value": { - "connected": false, - "credentialError": { - "$rpc": "null" - }, - "selection": { - "$rpc": "null" - }, - "sites": [], - "unavailableReason": "Update Orca desktop to browse Jira on mobile." - } - }, - "a4b7901e0372": { - "name": "linear.status#1", - "ordinal": 38, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "a5addaab38bf": { - "name": "linearFilter", - "ordinal": 59, - "value": "all" - }, - "aa9af10b3812": { - "name": "preflight.check#1", - "ordinal": 42, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.check\"}" - }, - "ab4a6032b0e4": { - "name": "jira.status#1", - "ordinal": 39, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"jira.status\"}" - }, - "ad03aa751af2": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - } - }, - "ba788c58e435": { - "name": "runtimeTaskSettings", - "ordinal": 44, - "value": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - }, - "bbce658fe3f5": { - "name": "showRepoPicker", - "ordinal": 13, - "value": false - }, - "c11fe123ce70": { - "name": "showGitHubProjectFieldsPicker", - "ordinal": 18, - "value": false - }, - "c1630da260c7": { - "name": "showLinearDisplayPicker", - "ordinal": 5, - "value": false - }, - "c32aa6b83185": { - "name": "tasksSupportState", - "ordinal": 46, - "value": { - "client": "logical-client", - "kind": "unknown" - } - }, - "c37873342ba8": { - "name": "linearStatusPickerItem", - "ordinal": 24, - "value": { - "$rpc": "null" - } - }, - "c6178e6a0f4e": { - "hydrated": false, - "settings": {} - }, - "c87109595a65": { - "name": "ui.get#1", - "ordinal": 36, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "ui": {} - } - } - } - }, - "ccf853380b13": { - "name": "taskStateHydrated", - "ordinal": 46, - "value": false - }, - "d100b9546c3d": { - "name": "showGitHubKindPicker", - "ordinal": 7, - "value": false - }, - "d1af3771ebfa": { - "name": "status.get#1", - "ordinal": 31, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "d208e8015339": { - "name": "showGitHubPresetPicker", - "ordinal": 8, - "value": false - }, - "d50362207233": { - "name": "tasksSupportState", - "ordinal": 32, - "value": { - "client": "logical-client", - "kind": "supported" - } - }, - "d53e8fa810a5": { - "name": "error", - "ordinal": 45, - "value": "Request timed out: settings.get" - }, - "dd6fb20daf67": { - "name": "linear.status#1", - "ordinal": 43, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"linear.status\"}" - }, - "e033cf17e121": { - "name": "showGitLabViewPicker", - "ordinal": 9, - "value": false - }, - "e44e17349036": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "e61de5a1b27e": { - "name": "defaultGitHubPreset", - "ordinal": 56, - "value": "issues" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f164de325151": { - "name": "pendingProjectGitHubMerge", - "ordinal": 26, - "value": { - "$rpc": "null" - } - }, - "fdb0bbb8aa59": { - "name": "showLinearConnect", - "ordinal": 6, - "value": false - }, - "ffc5c47817a5": { - "name": "settings.get#1", - "ordinal": 35, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - } - } - } - } - }, - "recording": { - "scenario": "schedules-settings-task-hydration-fulfilled", - "checkpoints": [ - { - "id": "settings-task-hydration-fulfilled.forward:sibling-pending", - "observation": { - "sender": [ - "8db7a6a7d531", - "1833d0fa5f1d", - "ffc5c47817a5", - "71bedad13169", - "1dfcd3f6163d", - "05ccd79ba4af" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.forward:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "688fe01c6196", - "ffc5c47817a5", - "c87109595a65", - "800b1afcceea", - "8c4056edb811" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "58c52d8b7c76", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "ba788c58e435", - "87bd323da79d", - "600862ad27b3", - "57568fbaf4f7", - "40f00017ad77", - "2c3706d59dd5", - "3a03e162efd9", - "3082bf4965fa", - "2aad05f979a9", - "8a053731b837", - "22b355deb2df", - "19505460d94b", - "e61de5a1b27e", - "5c7f665de6c4", - "93acc26335bc", - "a5addaab38bf", - "3ff235330cbe", - "1a1091da11b2", - "2d9ce55cc13a", - "5886b76643d9", - "430c28cba43c", - "82daca007272" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.reverse:sibling-pending", - "observation": { - "sender": [ - "8db7a6a7d531", - "1833d0fa5f1d", - "3a94dcc00915", - "c87109595a65", - "1dfcd3f6163d", - "05ccd79ba4af" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.reverse:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "688fe01c6196", - "ffc5c47817a5", - "c87109595a65", - "800b1afcceea", - "8c4056edb811" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "58c52d8b7c76", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "ba788c58e435", - "87bd323da79d", - "600862ad27b3", - "57568fbaf4f7", - "40f00017ad77", - "2c3706d59dd5", - "3a03e162efd9", - "3082bf4965fa", - "2aad05f979a9", - "8a053731b837", - "22b355deb2df", - "19505460d94b", - "e61de5a1b27e", - "5c7f665de6c4", - "93acc26335bc", - "a5addaab38bf", - "3ff235330cbe", - "1a1091da11b2", - "2d9ce55cc13a", - "5886b76643d9", - "430c28cba43c", - "82daca007272" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.both-reject-forward:sibling-pending", - "observation": { - "sender": [ - "8db7a6a7d531", - "1833d0fa5f1d", - "4526d5d74acb", - "71bedad13169", - "1dfcd3f6163d", - "05ccd79ba4af" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "330e27e080b0", - "1f343058c9bd", - "ccf853380b13" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.both-reject-forward:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "688fe01c6196", - "4526d5d74acb", - "4075b6316e30", - "800b1afcceea", - "8c4056edb811" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "330e27e080b0", - "1f343058c9bd", - "ccf853380b13", - "3d31b2fc3a47" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.both-reject-reverse:sibling-pending", - "observation": { - "sender": [ - "8db7a6a7d531", - "1833d0fa5f1d", - "3a94dcc00915", - "4075b6316e30", - "1dfcd3f6163d", - "05ccd79ba4af" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "a103fa2e507b", - "1f343058c9bd", - "ccf853380b13" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.both-reject-reverse:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "688fe01c6196", - "4526d5d74acb", - "4075b6316e30", - "800b1afcceea", - "8c4056edb811" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "a103fa2e507b", - "1f343058c9bd", - "ccf853380b13", - "3d31b2fc3a47" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.reject-peer-pending:sibling-pending", - "observation": { - "sender": [ - "8db7a6a7d531", - "1833d0fa5f1d", - "4526d5d74acb", - "71bedad13169", - "1dfcd3f6163d", - "05ccd79ba4af" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "330e27e080b0", - "1f343058c9bd", - "ccf853380b13" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.reject-peer-pending:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "688fe01c6196", - "4526d5d74acb", - "71bedad13169", - "800b1afcceea", - "8c4056edb811" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "330e27e080b0", - "1f343058c9bd", - "ccf853380b13", - "3d31b2fc3a47" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.timeout:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "302df5159005", - "ad03aa751af2", - "20ef49331589", - "57087f926eaf", - "74d8785ba556" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "a20a93879807", - "d53e8fa810a5", - "c32aa6b83185", - "32b1c27f9f78" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.disconnect:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "4a0377b4ac3c", - "e44e17349036", - "95d5a2a2f417", - "37e9eb7f2e21", - "525789d7c3fa" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "a20a93879807", - "42c4d0584b72", - "c32aa6b83185", - "32b1c27f9f78" - ] - } - }, - { - "id": "settings-task-hydration-fulfilled.client-cutover:settled", - "observation": { - "sender": [ - "8db7a6a7d531", - "43f5e0efb7d5", - "1305e04da46a", - "0919c52e10c6", - "965996579b8a", - "a4b7901e0372" - ], - "payloads": [ - "d1af3771ebfa", - "ab4a6032b0e4", - "756c11d6e5bc", - "15cdb7759e6b", - "aa9af10b3812", - "dd6fb20daf67" - ], - "settlements": { - "mount": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "c6178e6a0f4e", - "effects": [ - "301bdbdf1dec", - "7b0ad7b958dd", - "45e466d86a07", - "0ebb7f0660a0", - "c1630da260c7", - "fdb0bbb8aa59", - "d100b9546c3d", - "d208e8015339", - "e033cf17e121", - "8015a69c7774", - "2bf05835527f", - "5729b7cdb4ba", - "bbce658fe3f5", - "26ece795530e", - "9b2188f8d6b7", - "931e8e15095d", - "3c66c971fe96", - "c11fe123ce70", - "2b39b469a001", - "714d4b3547ff", - "4cbaceb42c08", - "98281d0e8b13", - "9f545b97e888", - "c37873342ba8", - "45cfb5ee97ea", - "f164de325151", - "354e99da4ba4", - "276a60ed41a5", - "394fb5675266", - "d50362207233", - "9d27c74981a1", - "a20a93879807", - "4fe7877fc963", - "c32aa6b83185", - "32b1c27f9f78" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json deleted file mode 100644 index d07a6665540..00000000000 --- a/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json +++ /dev/null @@ -1,1262 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.workspace-context", - "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], - "values": { - "1e7f9a45facb": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "21ac0fbb969f": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: jira.status", - "isRpcDeliveryUnknown": true - } - } - }, - "21b939d94e15": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "232e57d66a75": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: settings.get", - "isRpcDeliveryUnknown": true - } - } - }, - "2703952e1ca3": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "ui.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "273d1f7fd962": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: preflight.check", - "isRpcDeliveryUnknown": true - } - } - }, - "28d96d1b6f24": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "2a7485a88169": { - "providers": ["github"], - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - }, - "trust": {} - }, - "37c4e321f6ed": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings.get#1 rejected", - "isRpcDeliveryUnknown": true - } - } - }, - "3d249e57942b": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "527c048244cc": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "5f38435ef2d3": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: ui.get", - "isRpcDeliveryUnknown": true - } - } - }, - "65e027dec060": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "ui": {} - } - } - } - }, - "7c5e5635081d": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "82132b79b8f7": { - "name": "settings.get#1", - "ordinal": 9, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "83e12a6721ec": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "84863e6a7119": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "8566e2463d90": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "8bec70b5cc2c": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "903ba5a79900": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "glab": { - "installed": false - } - } - } - } - }, - "9523a5ec7949": { - "providers": ["github", "jira"], - "settings": { - "$rpc": "null" - }, - "trust": {} - }, - "9cf8484d8b20": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "connected": false - } - } - } - }, - "a2fd5d449008": { - "name": "jira.status#1", - "ordinal": 8, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"jira.status\"}" - }, - "aa5197e9af84": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "ab92af857792": { - "name": "linear.status#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.status\"}" - }, - "ad559d2e55ab": { - "name": "jira.status#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "jira.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "b69f454508d6": { - "name": "preflight.check#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "preflight.check" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c02caa4460cf": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "c46f950058f0": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "cc61428a1b82": { - "name": "preflight.check#1", - "ordinal": 6, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.check\"}" - }, - "d13ca77439fc": { - "name": "settings.get#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - } - } - } - } - }, - "e3468ef861b0": { - "name": "ui.get#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "ui.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "LogicalClientCutoverError", - "message": "RPC interrupted by connection migration", - "isRpcDeliveryUnknown": true, - "cause": { - "category": "Error", - "message": "Connection closed", - "isRpcDeliveryUnknown": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda20c48bd66": { - "name": "linear.status#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "linear.status" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 30000, - "error": { - "category": "Error", - "message": "Request timed out: linear.status", - "isRpcDeliveryUnknown": true - } - } - }, - "edb8f0fe6906": { - "name": "ui.get#1", - "ordinal": 10, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"ui.get\"}" - }, - "f6a09f8c5b85": { - "providers": [], - "settings": { - "$rpc": "null" - }, - "trust": {} - } - }, - "recording": { - "scenario": "schedules-settings-workspace-context-fulfilled", - "checkpoints": [ - { - "id": "settings-workspace-context-fulfilled.forward:sibling-pending", - "observation": { - "sender": [ - "b69f454508d6", - "1e7f9a45facb", - "83e12a6721ec", - "d13ca77439fc", - "3d249e57942b" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.forward:settled", - "observation": { - "sender": [ - "903ba5a79900", - "9cf8484d8b20", - "8566e2463d90", - "d13ca77439fc", - "65e027dec060" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "2a7485a88169", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.reverse:sibling-pending", - "observation": { - "sender": [ - "b69f454508d6", - "1e7f9a45facb", - "83e12a6721ec", - "7c5e5635081d", - "65e027dec060" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.reverse:settled", - "observation": { - "sender": [ - "903ba5a79900", - "9cf8484d8b20", - "8566e2463d90", - "d13ca77439fc", - "65e027dec060" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "2a7485a88169", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.both-reject-forward:sibling-pending", - "observation": { - "sender": [ - "b69f454508d6", - "1e7f9a45facb", - "83e12a6721ec", - "37c4e321f6ed", - "3d249e57942b" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.both-reject-forward:settled", - "observation": { - "sender": [ - "903ba5a79900", - "9cf8484d8b20", - "8566e2463d90", - "37c4e321f6ed", - "2703952e1ca3" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9523a5ec7949", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.both-reject-reverse:sibling-pending", - "observation": { - "sender": [ - "b69f454508d6", - "1e7f9a45facb", - "83e12a6721ec", - "7c5e5635081d", - "2703952e1ca3" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.both-reject-reverse:settled", - "observation": { - "sender": [ - "903ba5a79900", - "9cf8484d8b20", - "8566e2463d90", - "37c4e321f6ed", - "2703952e1ca3" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9523a5ec7949", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.reject-peer-pending:sibling-pending", - "observation": { - "sender": [ - "b69f454508d6", - "1e7f9a45facb", - "83e12a6721ec", - "37c4e321f6ed", - "3d249e57942b" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.reject-peer-pending:settled", - "observation": { - "sender": [ - "903ba5a79900", - "9cf8484d8b20", - "8566e2463d90", - "37c4e321f6ed", - "3d249e57942b" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "f6a09f8c5b85", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.timeout:settled", - "observation": { - "sender": [ - "273d1f7fd962", - "eda20c48bd66", - "21ac0fbb969f", - "232e57d66a75", - "5f38435ef2d3" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "9523a5ec7949", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.disconnect:settled", - "observation": { - "sender": [ - "8bec70b5cc2c", - "28d96d1b6f24", - "aa5197e9af84", - "c46f950058f0", - "527c048244cc" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a", - "disconnect": "eb79a9b3682a" - }, - "state": "9523a5ec7949", - "effects": [] - } - }, - { - "id": "settings-workspace-context-fulfilled.client-cutover:settled", - "observation": { - "sender": [ - "21b939d94e15", - "c02caa4460cf", - "ad559d2e55ab", - "84863e6a7119", - "e3468ef861b0" - ], - "payloads": [ - "cc61428a1b82", - "ab92af857792", - "a2fd5d449008", - "82132b79b8f7", - "edb8f0fe6906" - ], - "settlements": { - "mount": "eb79a9b3682a", - "cutover": "eb79a9b3682a" - }, - "state": "9523a5ec7949", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-markdown-save-conflict.json b/mobile/rpc-foundation/goldens/session-markdown-save-conflict.json deleted file mode 100644 index 337d36239af..00000000000 --- a/mobile/rpc-foundation/goldens/session-markdown-save-conflict.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.markdown-save", - "family": "session.markdown-save", - "namedDeltas": [], - "values": { - "48e7060a8031": { - "name": "markdown.saveTab#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"markdown.saveTab\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-md\",\"baseVersion\":\"v1\",\"content\":\"# b\"}}" - }, - "52c1632d410d": { - "name": "markdown.saveTab#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "markdown.saveTab" - }, - { - "name": "params", - "value": { - "baseVersion": "v1", - "content": "# b", - "tabId": "tab-md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "version_conflict", - "message": "Document changed on disk" - }, - "id": "frame-1", - "ok": false - } - } - }, - "d31fbfc2b21a": { - "markdown": { - "tab-md": { - "baseVersion": "v1", - "content": "# a", - "editable": true, - "isDirty": true, - "localContent": "# b", - "localRevision": 2, - "saveError": "Document changed on disk", - "saving": false, - "status": "ready" - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-markdown-save-conflict", - "checkpoints": [ - { - "id": "conflicted", - "observation": { - "sender": ["52c1632d410d"], - "payloads": ["48e7060a8031"], - "settlements": { - "save": "eb79a9b3682a" - }, - "state": "d31fbfc2b21a", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-markdown-saved.json b/mobile/rpc-foundation/goldens/session-markdown-saved.json deleted file mode 100644 index f91dfbd691b..00000000000 --- a/mobile/rpc-foundation/goldens/session-markdown-saved.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.markdown-save", - "family": "session.markdown-save", - "namedDeltas": [], - "values": { - "48e7060a8031": { - "name": "markdown.saveTab#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"markdown.saveTab\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-md\",\"baseVersion\":\"v1\",\"content\":\"# b\"}}" - }, - "7fadfe6b63b6": { - "markdown": { - "tab-md": { - "baseVersion": "v2", - "content": "# b", - "editable": true, - "isDirty": false, - "localContent": "# b", - "localRevision": 2, - "status": "ready" - } - } - }, - "807e68f28cfd": { - "name": "toast", - "ordinal": 3, - "value": { - "message": "Saved" - } - }, - "b60a4c682490": { - "name": "markdown.saveTab#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "markdown.saveTab" - }, - { - "name": "params", - "value": { - "baseVersion": "v1", - "content": "# b", - "tabId": "tab-md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "content": "# b", - "isDirty": false, - "version": "v2" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-markdown-saved", - "checkpoints": [ - { - "id": "saved", - "observation": { - "sender": ["b60a4c682490"], - "payloads": ["48e7060a8031"], - "settlements": { - "save": "eb79a9b3682a" - }, - "state": "7fadfe6b63b6", - "effects": ["807e68f28cfd"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json b/mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json deleted file mode 100644 index 4eb99fdf724..00000000000 --- a/mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.task-workspace-create", - "family": "settings.task-workspace-create", - "namedDeltas": [], - "values": { - "0e0c27425410": { - "name": "navigation", - "ordinal": 11, - "value": "/h/host-1/session/wt-1?name=ORC-1+Recorded+issue&created=1" - }, - "15a350feeedb": { - "name": "creatingKey", - "ordinal": 12, - "value": { - "$rpc": "null" - } - }, - "2142af96648c": { - "name": "worktree.create#1", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "worktree.create" - }, - { - "name": "params", - "value": { - "activate": true, - "createdWithAgent": "claude", - "displayName": "ORC-1 Recorded issue", - "displayNameKind": "generated", - "linkedLinearIssue": "ORC-1", - "name": "orc-1", - "repo": "id:repo-1", - "setupDecision": "inherit", - "startupDraft": "https://linear.app/orca/issue/ORC-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 600000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "worktree": { - "displayName": "ORC-1 Recorded issue", - "id": "wt-1" - } - } - } - } - }, - "33e3b949d4c5": { - "creating": { - "$rpc": "null" - }, - "error": "", - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [] - } - }, - "41a2214deb19": { - "name": "settings.get#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "7abdfe20af50": { - "creating": "linear:1", - "error": "", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "85b99a2ca439": { - "name": "workspaceCreateDraft", - "ordinal": 9, - "value": { - "$rpc": "null" - } - }, - "8ac371cf7234": { - "name": "settings.get#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [] - } - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "975f2ff9a730": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "ce455f0c9a54": { - "name": "actionItem", - "ordinal": 8, - "value": { - "$rpc": "null" - } - }, - "e0423a9e6995": { - "name": "worktree.create#1", - "ordinal": 7, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"orc-1\",\"displayName\":\"ORC-1 Recorded issue\",\"displayNameKind\":\"generated\",\"linkedLinearIssue\":\"ORC-1\",\"setupDecision\":\"inherit\",\"activate\":true,\"startupDraft\":\"https://linear.app/orca/issue/ORC-1\",\"createdWithAgent\":\"claude\"}}" - }, - "e0a8ee1f3c00": { - "name": "creatingKey", - "ordinal": 1, - "value": "linear:1" - }, - "e445683fd6a5": { - "name": "runtimeTaskSettings", - "ordinal": 5, - "value": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [] - } - }, - "e969ced16929": { - "name": "setupPrompt", - "ordinal": 10, - "value": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed3a7d6bc894": { - "name": "error", - "ordinal": 2, - "value": "" - } - }, - "recording": { - "scenario": "settings-task-workspace-create-linear", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["41a2214deb19"], - "payloads": ["975f2ff9a730"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "9270aeb7d9c6" - }, - "state": "7abdfe20af50", - "effects": ["e0a8ee1f3c00", "ed3a7d6bc894"] - } - }, - { - "id": "created", - "observation": { - "sender": ["8ac371cf7234", "2142af96648c"], - "payloads": ["975f2ff9a730", "e0423a9e6995"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "eb79a9b3682a" - }, - "state": "33e3b949d4c5", - "effects": [ - "e0a8ee1f3c00", - "ed3a7d6bc894", - "e445683fd6a5", - "ce455f0c9a54", - "85b99a2ca439", - "e969ced16929", - "0e0c27425410", - "15a350feeedb" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json b/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json deleted file mode 100644 index ee6d6a8339b..00000000000 --- a/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.task-workspace", - "family": "settings.task-workspace", - "namedDeltas": [], - "values": { - "1a4a4adee14f": { - "name": "creatingKey", - "ordinal": 8, - "value": { - "$rpc": "null" - } - }, - "2c83b2000f2a": { - "name": "settings.get#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-1", - "ok": false - } - } - }, - "41a2214deb19": { - "name": "settings.get#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "483b4c51c982": { - "name": "error", - "ordinal": 7, - "value": "Selected agent is disabled. Choose an enabled agent before creating." - }, - "626f3cf8fc2d": { - "name": "workspaceAgentOverridden", - "ordinal": 6, - "value": false - }, - "7abdfe20af50": { - "creating": "linear:1", - "error": "", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "975f2ff9a730": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "d1777904aa15": { - "name": "workspaceAgent", - "ordinal": 5, - "value": "codex" - }, - "d5df3f6b123a": { - "creating": { - "$rpc": "null" - }, - "error": "Selected agent is disabled. Choose an enabled agent before creating.", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "e0a8ee1f3c00": { - "name": "creatingKey", - "ordinal": 1, - "value": "linear:1" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed3a7d6bc894": { - "name": "error", - "ordinal": 2, - "value": "" - } - }, - "recording": { - "scenario": "settings-task-workspace-refused", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["41a2214deb19"], - "payloads": ["975f2ff9a730"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "9270aeb7d9c6" - }, - "state": "7abdfe20af50", - "effects": ["e0a8ee1f3c00", "ed3a7d6bc894"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["2c83b2000f2a"], - "payloads": ["975f2ff9a730"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "eb79a9b3682a" - }, - "state": "d5df3f6b123a", - "effects": [ - "e0a8ee1f3c00", - "ed3a7d6bc894", - "d1777904aa15", - "626f3cf8fc2d", - "483b4c51c982", - "1a4a4adee14f" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json b/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json deleted file mode 100644 index 62bceef74bc..00000000000 --- a/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.task-workspace", - "family": "settings.task-workspace", - "namedDeltas": [], - "values": { - "1a4a4adee14f": { - "name": "creatingKey", - "ordinal": 8, - "value": { - "$rpc": "null" - } - }, - "41a2214deb19": { - "name": "settings.get#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "483b4c51c982": { - "name": "error", - "ordinal": 7, - "value": "Selected agent is disabled. Choose an enabled agent before creating." - }, - "5deea0bbb564": { - "name": "settings.get#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - } - }, - "626f3cf8fc2d": { - "name": "workspaceAgentOverridden", - "ordinal": 6, - "value": false - }, - "7abdfe20af50": { - "creating": "linear:1", - "error": "", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "975f2ff9a730": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "d1777904aa15": { - "name": "workspaceAgent", - "ordinal": 5, - "value": "codex" - }, - "d5df3f6b123a": { - "creating": { - "$rpc": "null" - }, - "error": "Selected agent is disabled. Choose an enabled agent before creating.", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "e0a8ee1f3c00": { - "name": "creatingKey", - "ordinal": 1, - "value": "linear:1" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed3a7d6bc894": { - "name": "error", - "ordinal": 2, - "value": "" - } - }, - "recording": { - "scenario": "settings-task-workspace-transport-error", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["41a2214deb19"], - "payloads": ["975f2ff9a730"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "9270aeb7d9c6" - }, - "state": "7abdfe20af50", - "effects": ["e0a8ee1f3c00", "ed3a7d6bc894"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["5deea0bbb564"], - "payloads": ["975f2ff9a730"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "eb79a9b3682a" - }, - "state": "d5df3f6b123a", - "effects": [ - "e0a8ee1f3c00", - "ed3a7d6bc894", - "d1777904aa15", - "626f3cf8fc2d", - "483b4c51c982", - "1a4a4adee14f" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json b/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json deleted file mode 100644 index f5459aab8ed..00000000000 --- a/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.workspace-submit", - "family": "settings.workspace-submit", - "namedDeltas": [], - "values": { - "13c996e4ec2b": { - "creating": true, - "error": "", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "2e8e352c8dd1": { - "creating": false, - "error": "Selected agent is disabled. Choose an enabled agent before creating.", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "39f99cf479f0": { - "name": "error", - "ordinal": 1, - "value": "" - }, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "5940cb6d5fdf": { - "name": "error", - "ordinal": 6, - "value": "Selected agent is disabled. Choose an enabled agent before creating." - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "94ddc6962cd6": { - "name": "selectedAgent", - "ordinal": 4, - "value": { - "id": "codex", - "label": "Codex" - } - }, - "bc0a5f0f4956": { - "name": "agentOverridden", - "ordinal": 5, - "value": false - }, - "d942c8ef3642": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "refused", - "message": "settings refused" - }, - "id": "frame-1", - "ok": false - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f648b042d810": { - "name": "settings.get#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - } - }, - "recording": { - "scenario": "settings-workspace-submit-refused", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["51d4cb56be85"], - "payloads": ["f648b042d810"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "9270aeb7d9c6" - }, - "state": "13c996e4ec2b", - "effects": ["39f99cf479f0"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["d942c8ef3642"], - "payloads": ["f648b042d810"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "eb79a9b3682a" - }, - "state": "2e8e352c8dd1", - "effects": ["39f99cf479f0", "94ddc6962cd6", "bc0a5f0f4956", "5940cb6d5fdf"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json b/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json deleted file mode 100644 index 20fec5784e9..00000000000 --- a/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json +++ /dev/null @@ -1,151 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "settings.workspace-submit", - "family": "settings.workspace-submit", - "namedDeltas": [], - "values": { - "13c996e4ec2b": { - "creating": true, - "error": "", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "2e8e352c8dd1": { - "creating": false, - "error": "Selected agent is disabled. Choose an enabled agent before creating.", - "settings": { - "disabledTuiAgents": ["claude"] - } - }, - "39f99cf479f0": { - "name": "error", - "ordinal": 1, - "value": "" - }, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "5940cb6d5fdf": { - "name": "error", - "ordinal": 6, - "value": "Selected agent is disabled. Choose an enabled agent before creating." - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "94ddc6962cd6": { - "name": "selectedAgent", - "ordinal": 4, - "value": { - "id": "codex", - "label": "Codex" - } - }, - "bc0a5f0f4956": { - "name": "agentOverridden", - "ordinal": 5, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f4c218ff736f": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "settings disconnected", - "isRpcDeliveryUnknown": true - } - } - }, - "f648b042d810": { - "name": "settings.get#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - } - }, - "recording": { - "scenario": "settings-workspace-submit-transport-error", - "checkpoints": [ - { - "id": "settings-pending", - "observation": { - "sender": ["51d4cb56be85"], - "payloads": ["f648b042d810"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "9270aeb7d9c6" - }, - "state": "13c996e4ec2b", - "effects": ["39f99cf479f0"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["f4c218ff736f"], - "payloads": ["f648b042d810"], - "settlements": { - "mount": "eb79a9b3682a", - "submit": "eb79a9b3682a" - }, - "state": "2e8e352c8dd1", - "effects": ["39f99cf479f0", "94ddc6962cd6", "bc0a5f0f4956", "5940cb6d5fdf"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/pilot-scenarios.json b/mobile/rpc-foundation/pilot-scenarios.json index a6f94aa4050..0266dd49296 100644 --- a/mobile/rpc-foundation/pilot-scenarios.json +++ b/mobile/rpc-foundation/pilot-scenarios.json @@ -1034,75 +1034,6 @@ } ] }, - { - "id": "settings-workspace-submit-refused", - "operation": "settings.workspace-submit", - "family": "settings.workspace-submit", - "sites": ["mobile/src/components/use-new-workspace-create-submit.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "submit", - "id": "submit" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-workspace-submit-transport-error", - "operation": "settings.workspace-submit", - "family": "settings.workspace-submit", - "sites": ["mobile/src/components/use-new-workspace-create-submit.ts"], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "submit", - "id": "submit" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reject": { - "message": "settings disconnected", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "settings-task-workspace-fulfilled", "operation": "settings.task-workspace", @@ -1146,154 +1077,6 @@ } ] }, - { - "id": "settings-task-workspace-refused", - "operation": "settings.task-workspace", - "family": "settings.task-workspace", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-create-actions.tsx" - ], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "submit", - "id": "submit" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "settings refused" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-task-workspace-transport-error", - "operation": "settings.task-workspace", - "family": "settings.task-workspace", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-create-actions.tsx" - ], - "schedules": ["settings-first"], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "submit", - "id": "submit" - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reject": { - "message": "settings disconnected", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "settings-task-workspace-create-linear", - "operation": "settings.task-workspace-create", - "family": "settings.task-workspace-create", - "sites": [ - "mobile/src/tasks/workspace-creation/use-mobile-tasks-workspace-create-actions.tsx" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "submit", - "id": "submit", - "args": { - "item": { - "key": "linear:1", - "provider": "linear", - "title": "Recorded issue", - "source": { - "identifier": "ORC-1", - "title": "Recorded issue", - "url": "https://linear.app/orca/issue/ORC-1" - } - } - } - }, - { - "checkpoint": "settings-pending" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "disabledTuiAgents": [], - "defaultTuiAgent": "codex" - } - } - } - }, - { - "complete": "worktree.create#1", - "params": { - "repo": "id:repo-1", - "name": "orc-1", - "displayName": "ORC-1 Recorded issue", - "displayNameKind": "generated", - "linkedLinearIssue": "ORC-1", - "setupDecision": "inherit", - "activate": true, - "startupDraft": "https://linear.app/orca/issue/ORC-1", - "createdWithAgent": "claude" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "id": "wt-1", - "displayName": "ORC-1 Recorded issue" - } - } - } - }, - { - "checkpoint": "created" - } - ] - }, { "id": "settings-task-workspace-create-pr-start-point", "operation": "settings.task-workspace-create", @@ -4581,640 +4364,6 @@ } ] }, - { - "id": "pr-read-surface", - "operation": "session.pr-reads", - "family": "github.pr-read", - "sites": ["mobile/src/source-control/review/github-pr-rpc.ts"], - "schedules": [], - "steps": [ - { - "checkpoint": "pending" - }, - { - "action": "repo-slug", - "id": "repo-slug" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-9" - }, - "reply": { - "ok": true, - "result": { - "owner": "orca", - "repo": "orca", - "host": "github.com" - } - } - }, - { - "checkpoint": "repo-slug" - }, - { - "action": "hosted-review", - "id": "hosted-review" - }, - { - "complete": "hostedReview.forBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedGitHubPR": 12, - "active": true - }, - "reply": { - "ok": true, - "result": { - "provider": "github", - "number": 12, - "title": "Recorded", - "state": "open", - "url": "https://x/12", - "updatedAt": "2026-01-01", - "mergeable": "MERGEABLE" - } - } - }, - { - "checkpoint": "hosted-review" - }, - { - "action": "pr-for-branch", - "id": "pr-for-branch" - }, - { - "complete": "github.prForBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": null, - "currentHeadOid": null - }, - "reply": { - "ok": true, - "result": { - "kind": "found", - "pr": { - "number": 12, - "state": "open", - "title": "Recorded", - "url": "https://x/12", - "headSha": "head-sha-1", - "mergeable": "MERGEABLE" - }, - "fetchedAt": 0 - } - } - }, - { - "checkpoint": "pr-for-branch" - }, - { - "action": "work-item", - "id": "work-item" - }, - { - "complete": "github.workItemDetails#1", - "params": { - "repo": "id:repo-9", - "number": 12, - "type": "pr" - }, - "reply": { - "ok": true, - "result": { - "item": { - "id": "PR_1", - "number": 12, - "type": "pr", - "state": "open", - "title": "Recorded", - "labels": [], - "assignees": [] - }, - "body": "body", - "headSha": "head-sha-1" - } - } - }, - { - "checkpoint": "work-item" - }, - { - "action": "checks", - "id": "checks" - }, - { - "complete": "github.prChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "headSha": "head-sha-1" - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "completed", - "conclusion": "success", - "checkRunId": 7 - } - ] - } - }, - { - "checkpoint": "checks" - }, - { - "action": "check-details", - "id": "check-details" - }, - { - "complete": "github.prCheckDetails#1", - "params": { - "repo": "id:repo-9", - "checkRunId": 7, - "checkName": "build", - "url": null - }, - "reply": { - "ok": true, - "result": { - "name": "build", - "status": "completed", - "conclusion": "success", - "annotations": [], - "jobs": [] - } - } - }, - { - "checkpoint": "check-details" - }, - { - "action": "assignable", - "id": "assignable", - "args": { - "fork": true - } - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded", - "hostDescriptor": { - "installationId": "recorded" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "complete": "github.listAssignableUsers#1", - "params": { - "repo": "id:repo-9", - "ownerRepo": { - "owner": "fork-owner", - "repo": "fork-repo", - "host": "github.enterprise.test" - } - }, - "reply": { - "ok": true, - "result": [ - { - "login": "octocat", - "name": "Octo Cat", - "avatarUrl": null - } - ] - }, - "transport": "native", - "site": "github.listAssignableUsers#1" - }, - { - "transport": "bridge", - "complete": "github.listAssignableUsers#1.native-1", - "site": "github.listAssignableUsers#1.native-1", - "bridgeSite": true, - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "shell-runtime", - "hostDescriptor": { - "installationId": "shell-desktop" - }, - "capabilities": ["github.exact-work-item-target.v1"] - } - } - }, - { - "complete": "github.listAssignableUsers#1.native-2", - "params": { - "repo": "id:repo-9", - "ownerRepo": { - "owner": "fork-owner", - "repo": "fork-repo", - "host": "github.enterprise.test" - } - }, - "reply": { - "ok": true, - "result": [ - { - "login": "octocat", - "name": "Octo Cat", - "avatarUrl": null - } - ] - }, - "transport": "bridge", - "site": "github.listAssignableUsers#1" - }, - { - "checkpoint": "assignable" - } - ], - "bridgeOperations": [ - { - "request": "github.listAssignableUsers#1", - "probeSite": "github.listAssignableUsers#1.native-1", - "methods": ["status.get", "github.listAssignableUsers"] - } - ] - }, - { - "id": "pr-read-fork-routing", - "operation": "session.pr-reads", - "family": "github.pr-read", - "sites": ["mobile/src/source-control/review/github-pr-rpc.ts"], - "schedules": [], - "steps": [ - { - "action": "checks", - "id": "fork-checks", - "args": { - "fork": true - } - }, - { - "complete": "github.prChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "headSha": "head-sha-1", - "prRepo": { - "owner": "fork-owner", - "repo": "fork-repo", - "host": "github.enterprise.test" - } - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "completed", - "conclusion": "success", - "checkRunId": 7 - } - ] - } - }, - { - "checkpoint": "fork-checks" - }, - { - "action": "check-details", - "id": "fork-check-details", - "args": { - "fork": true - } - }, - { - "complete": "github.prCheckDetails#1", - "params": { - "repo": "id:repo-9", - "checkRunId": 7, - "checkName": "build", - "url": null, - "prRepo": { - "owner": "fork-owner", - "repo": "fork-repo", - "host": "github.enterprise.test" - } - }, - "reply": { - "ok": true, - "result": { - "name": "build", - "status": "completed", - "conclusion": "success", - "annotations": [], - "jobs": [] - } - } - }, - { - "checkpoint": "fork-check-details" - }, - { - "action": "checks", - "id": "no-head-sha", - "args": { - "headSha": null - } - }, - { - "complete": "github.prChecks#2", - "params": { - "repo": "id:repo-9", - "prNumber": 12 - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "completed", - "conclusion": "success", - "checkRunId": 7 - } - ] - } - }, - { - "checkpoint": "no-head-sha" - } - ] - }, - { - "id": "pr-read-upstream-error", - "operation": "session.pr-reads", - "family": "github.pr-read", - "sites": ["mobile/src/source-control/review/github-pr-rpc.ts"], - "schedules": [], - "steps": [ - { - "action": "pr-for-branch", - "id": "upstream" - }, - { - "complete": "github.prForBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": null, - "currentHeadOid": null - }, - "reply": { - "ok": true, - "result": { - "kind": "upstream-error", - "message": "GitHub API rate limit exceeded", - "fetchedAt": 0 - } - } - }, - { - "checkpoint": "upstream" - }, - { - "action": "pr-for-branch", - "id": "malformed" - }, - { - "complete": "github.prForBranch#2", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": null, - "currentHeadOid": null - }, - "reply": { - "ok": true, - "result": { - "kind": "found", - "pr": { - "state": "open" - }, - "fetchedAt": 0 - } - } - }, - { - "checkpoint": "malformed" - }, - { - "action": "pr-for-branch", - "id": "no-pr" - }, - { - "complete": "github.prForBranch#3", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": null, - "currentHeadOid": null - }, - "reply": { - "ok": true, - "result": null - } - }, - { - "checkpoint": "no-pr" - } - ] - }, - { - "id": "pr-sidebar-load", - "operation": "session.pr-sidebar", - "family": "session.pr-sidebar", - "sites": [ - "mobile/src/source-control/review/use-mobile-pr-sidebar-controller.ts", - "mobile/src/source-control/review/mobile-pr-queries.ts", - "mobile/src/source-control/review/mobile-pr-sidebar-state.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-9" - }, - "reply": { - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - }, - { - "complete": "hostedReview.forBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedGitHubPR": null, - "active": true - }, - "reply": { - "ok": true, - "result": { - "provider": "github", - "number": 12, - "title": "Recorded", - "state": "open", - "url": "https://github.com/owner/repo/pull/12", - "updatedAt": "2026-01-01T00:00:00Z", - "mergeable": "MERGEABLE" - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "linkedPR": null - } - } - } - }, - { - "checkpoint": "branch-hint" - }, - { - "complete": "github.prForBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": 12, - "acceptMergedFallbackPR": true, - "currentHeadOid": null - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "kind": "found", - "pr": { - "number": 12, - "state": "open", - "title": "Recorded", - "url": "https://github.com/owner/repo/pull/12", - "headSha": "head-sha-1", - "updatedAt": "2026-01-01T00:00:00Z", - "mergeable": "MERGEABLE" - }, - "fetchedAt": 0 - } - } - }, - { - "checkpoint": "pr" - }, - { - "complete": "github.prChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "headSha": "head-sha-1" - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "completed", - "conclusion": "success", - "checkRunId": 7 - } - ] - } - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded" - } - } - }, - { - "complete": "github.workItemDetails#1", - "params": { - "repo": "id:repo-9", - "number": 12, - "type": "pr" - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "item": { - "id": "PR_1", - "number": 12, - "type": "pr", - "state": "open", - "title": "Recorded", - "url": "https://github.com/owner/repo/pull/12", - "updatedAt": "2026-01-01T00:00:00Z", - "labels": [], - "assignees": [] - }, - "body": "body", - "headSha": "head-sha-1", - "comments": [ - { - "id": 55, - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12#discussion_r55", - "threadId": "thread-1", - "path": "src/app.ts", - "line": 3, - "isResolved": false - } - ] - } - } - }, - { - "checkpoint": "loaded" - } - ] - }, { "id": "pr-sidebar-revisit-and-refresh", "operation": "session.pr-sidebar", @@ -5607,174 +4756,6 @@ } ] }, - { - "id": "pr-sidebar-checks-refused", - "operation": "session.pr-sidebar", - "family": "session.pr-sidebar", - "sites": [ - "mobile/src/source-control/review/use-mobile-pr-sidebar-controller.ts", - "mobile/src/source-control/review/mobile-pr-queries.ts", - "mobile/src/source-control/review/mobile-pr-sidebar-state.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-9" - }, - "reply": { - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - }, - { - "complete": "hostedReview.forBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedGitHubPR": null, - "active": true - }, - "reply": { - "ok": true, - "result": { - "provider": "github", - "number": 12, - "title": "Recorded", - "state": "open", - "url": "https://github.com/owner/repo/pull/12", - "updatedAt": "2026-01-01T00:00:00Z", - "mergeable": "MERGEABLE" - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "linkedPR": null - } - } - } - }, - { - "checkpoint": "branch-hint" - }, - { - "complete": "github.prForBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": 12, - "acceptMergedFallbackPR": true, - "currentHeadOid": null - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "kind": "found", - "pr": { - "number": 12, - "state": "open", - "title": "Recorded", - "url": "https://github.com/owner/repo/pull/12", - "headSha": "head-sha-1", - "updatedAt": "2026-01-01T00:00:00Z", - "mergeable": "MERGEABLE" - }, - "fetchedAt": 0 - } - } - }, - { - "checkpoint": "pr" - }, - { - "complete": "github.prChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "headSha": "head-sha-1" - }, - "reply": { - "ok": true, - "result": { - "checks": [] - } - } - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded" - } - } - }, - { - "complete": "github.workItemDetails#1", - "params": { - "repo": "id:repo-9", - "number": 12, - "type": "pr" - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "item": { - "id": "PR_1", - "number": 12, - "type": "pr", - "state": "open", - "title": "Recorded", - "url": "https://github.com/owner/repo/pull/12", - "updatedAt": "2026-01-01T00:00:00Z", - "labels": [], - "assignees": [] - }, - "body": "body", - "headSha": "head-sha-1", - "comments": [ - { - "id": 55, - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12#discussion_r55", - "threadId": "thread-1", - "path": "src/app.ts", - "line": 3, - "isResolved": false - } - ] - } - } - }, - { - "checkpoint": "checks-refused" - } - ] - }, { "id": "pr-resolve-refused-rolls-back", "operation": "session.pr-sidebar", @@ -5975,816 +4956,6 @@ } ] }, - { - "id": "pr-comment-posted-in-place", - "operation": "session.pr-sidebar", - "family": "session.pr-sidebar", - "sites": [ - "mobile/src/source-control/review/use-mobile-pr-sidebar-controller.ts", - "mobile/src/source-control/review/mobile-pr-queries.ts", - "mobile/src/source-control/review/mobile-pr-sidebar-state.ts", - "mobile/src/source-control/review/pr-comment-writes.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-9" - }, - "reply": { - "ok": true, - "result": { - "owner": "owner", - "repo": "repo" - } - } - }, - { - "complete": "hostedReview.forBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedGitHubPR": null, - "active": true - }, - "reply": { - "ok": true, - "result": { - "provider": "github", - "number": 12, - "title": "Recorded", - "state": "open", - "url": "https://github.com/owner/repo/pull/12", - "updatedAt": "2026-01-01T00:00:00Z", - "mergeable": "MERGEABLE" - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "linkedPR": null - } - } - } - }, - { - "checkpoint": "branch-hint" - }, - { - "complete": "github.prForBranch#1", - "params": { - "repo": "id:repo-9", - "branch": "feature", - "linkedPRNumber": null, - "fallbackPRNumber": 12, - "acceptMergedFallbackPR": true, - "currentHeadOid": null - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "kind": "found", - "pr": { - "number": 12, - "state": "open", - "title": "Recorded", - "url": "https://github.com/owner/repo/pull/12", - "headSha": "head-sha-1", - "updatedAt": "2026-01-01T00:00:00Z", - "mergeable": "MERGEABLE" - }, - "fetchedAt": 0 - } - } - }, - { - "checkpoint": "pr" - }, - { - "complete": "github.prChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "headSha": "head-sha-1" - }, - "reply": { - "ok": true, - "result": [ - { - "name": "build", - "status": "completed", - "conclusion": "success", - "checkRunId": 7 - } - ] - } - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "recorded" - } - } - }, - { - "complete": "github.workItemDetails#1", - "params": { - "repo": "id:repo-9", - "number": 12, - "type": "pr" - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "item": { - "id": "PR_1", - "number": 12, - "type": "pr", - "state": "open", - "title": "Recorded", - "url": "https://github.com/owner/repo/pull/12", - "updatedAt": "2026-01-01T00:00:00Z", - "labels": [], - "assignees": [] - }, - "body": "body", - "headSha": "head-sha-1", - "comments": [ - { - "id": 55, - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12#discussion_r55", - "threadId": "thread-1", - "path": "src/app.ts", - "line": 3, - "isResolved": false - } - ] - } - } - }, - { - "checkpoint": "loaded" - }, - { - "action": "post-comment", - "id": "post-comment" - }, - { - "complete": "github.addIssueComment#1", - "params": { - "repo": "id:repo-9", - "number": 12, - "body": "recorded comment", - "type": "pr" - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 57 - } - } - } - }, - { - "checkpoint": "comment-sent" - }, - { - "complete": "github.prComments#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "noCache": true, - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "paramsFollowDivergence": true, - "reply": { - "ok": true, - "result": [ - { - "id": 55, - "author": "rev", - "body": "please fix", - "createdAt": "2026-01-01T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12#discussion_r55", - "threadId": "thread-1", - "path": "src/app.ts", - "line": 3, - "isResolved": false - }, - { - "id": 57, - "author": "me", - "body": "recorded comment", - "createdAt": "2026-01-01T00:01:00Z", - "url": "https://github.com/owner/repo/pull/12#issuecomment-57" - } - ] - } - }, - { - "checkpoint": "comment-shown" - } - ] - }, - { - "id": "pr-mutation-status", - "operation": "session.pr-mutations", - "family": "github.pr-mutation", - "sites": ["mobile/src/source-control/review/github-pr-mutations.ts"], - "schedules": [], - "steps": [ - { - "checkpoint": "pending" - }, - { - "action": "merge", - "id": "merge" - }, - { - "complete": "github.mergePR#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "method": "squash" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "merge" - }, - { - "action": "auto-merge", - "id": "auto-merge" - }, - { - "complete": "github.setPRAutoMerge#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "enabled": true - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "auto-merge" - }, - { - "action": "close", - "id": "close" - }, - { - "complete": "github.updatePRState#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "updates": { - "state": "closed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "close" - }, - { - "action": "request-reviewers", - "id": "request-reviewers" - }, - { - "complete": "github.requestPRReviewers#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "reviewers": ["octocat"] - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "request-reviewers" - }, - { - "action": "remove-reviewers", - "id": "remove-reviewers" - }, - { - "complete": "github.removePRReviewers#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "reviewers": ["octocat"] - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "remove-reviewers" - }, - { - "action": "rerun-checks", - "id": "rerun-checks" - }, - { - "complete": "github.rerunPRChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "failedOnly": true, - "headSha": "head-sha-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "rerun-checks" - } - ] - }, - { - "id": "pr-mutation-in-band-failure", - "operation": "session.pr-mutations", - "family": "github.pr-mutation", - "sites": ["mobile/src/source-control/review/github-pr-mutations.ts"], - "schedules": [], - "steps": [ - { - "action": "merge", - "id": "string-error" - }, - { - "complete": "github.mergePR#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "method": "squash" - }, - "reply": { - "ok": true, - "result": { - "ok": false, - "error": "Pull request is not mergeable" - } - } - }, - { - "checkpoint": "string-error" - }, - { - "action": "close", - "id": "object-error" - }, - { - "complete": "github.updatePRState#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "updates": { - "state": "closed" - } - }, - "reply": { - "ok": true, - "result": { - "ok": false, - "error": { - "message": "Branch is protected" - } - } - } - }, - { - "checkpoint": "object-error" - }, - { - "action": "auto-merge", - "id": "unstructured" - }, - { - "complete": "github.setPRAutoMerge#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "enabled": true - }, - "reply": { - "ok": true, - "result": true - } - }, - { - "checkpoint": "unstructured" - }, - { - "action": "rerun-checks", - "id": "empty-object-error" - }, - { - "complete": "github.rerunPRChecks#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "failedOnly": true, - "headSha": "head-sha-1" - }, - "reply": { - "ok": true, - "result": { - "ok": false, - "error": { - "message": "" - } - } - } - }, - { - "checkpoint": "empty-object-error" - } - ] - }, - { - "id": "pr-comment-mutation", - "operation": "session.pr-mutations", - "family": "github.pr-comment-mutation", - "sites": ["mobile/src/source-control/review/github-pr-mutations.ts"], - "schedules": [], - "steps": [ - { - "checkpoint": "pending" - }, - { - "action": "reply", - "id": "reply" - }, - { - "complete": "github.addPRReviewCommentReply#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "commentId": 55, - "body": "recorded reply", - "threadId": "thread-1", - "path": "src/app.ts", - "line": 3 - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 56 - } - } - } - }, - { - "checkpoint": "reply" - }, - { - "action": "root-comment", - "id": "root-comment" - }, - { - "complete": "github.addIssueComment#1", - "params": { - "repo": "id:repo-9", - "number": 12, - "body": "recorded comment", - "type": "pr" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 57 - } - } - } - }, - { - "checkpoint": "root-comment" - }, - { - "action": "resolve-thread", - "id": "resolve-thread" - }, - { - "complete": "github.resolveReviewThread#1", - "params": { - "repo": "id:repo-9", - "threadId": "thread-1", - "resolve": true - }, - "reply": { - "ok": true, - "result": true - } - }, - { - "checkpoint": "resolve-thread" - }, - { - "action": "edit-comment", - "id": "edit-comment" - }, - { - "complete": "github.project.updateIssueCommentBySlug#1", - "params": { - "owner": "owner", - "repo": "repo", - "commentId": 55, - "body": "edited" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "edit-comment" - }, - { - "action": "delete-comment", - "id": "delete-comment" - }, - { - "complete": "github.project.deleteIssueCommentBySlug#1", - "params": { - "owner": "owner", - "repo": "repo", - "commentId": 55 - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "delete-comment" - } - ] - }, - { - "id": "pr-line-comment-and-file-viewed", - "operation": "session.pr-mutations", - "family": "github.pr-comment-mutation", - "sites": ["mobile/src/source-control/review/github-pr-review-line-mutations.ts"], - "schedules": [], - "steps": [ - { - "action": "line-comment", - "id": "line-comment" - }, - { - "complete": "github.addPRReviewComment#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "commitId": "head-sha-1", - "path": "src/app.ts", - "line": 5, - "body": "recorded line comment", - "startLine": 3 - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 57 - } - } - } - }, - { - "checkpoint": "line-comment" - }, - { - "action": "file-viewed", - "id": "viewed" - }, - { - "complete": "github.setPRFileViewed#1", - "params": { - "repo": "id:repo-9", - "pullRequestId": "PR_kwDO", - "path": "src/app.ts", - "viewed": true - }, - "reply": { - "ok": true, - "result": true - } - }, - { - "checkpoint": "viewed" - }, - { - "action": "file-viewed", - "id": "refused" - }, - { - "complete": "github.setPRFileViewed#2", - "params": { - "repo": "id:repo-9", - "pullRequestId": "PR_kwDO", - "path": "src/app.ts", - "viewed": true - }, - "reply": { - "ok": true, - "result": false - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "pr-comment-resolve-unconfirmed", - "operation": "session.pr-mutations", - "family": "github.pr-comment-mutation", - "sites": ["mobile/src/source-control/review/github-pr-mutations.ts"], - "schedules": [], - "steps": [ - { - "action": "resolve-thread", - "id": "explicit-false" - }, - { - "complete": "github.resolveReviewThread#1", - "params": { - "repo": "id:repo-9", - "threadId": "thread-1", - "resolve": true - }, - "reply": { - "ok": true, - "result": false - } - }, - { - "checkpoint": "explicit-false" - }, - { - "action": "resolve-thread", - "id": "absent-result" - }, - { - "complete": "github.resolveReviewThread#2", - "params": { - "repo": "id:repo-9", - "threadId": "thread-1", - "resolve": true - }, - "reply": { - "ok": true - } - }, - { - "checkpoint": "absent-result" - } - ] - }, - { - "id": "pr-title-mutation", - "operation": "session.pr-mutations", - "family": "github.pr-title-mutation", - "sites": ["mobile/src/source-control/review/github-pr-mutations.ts"], - "schedules": [], - "steps": [ - { - "action": "title", - "id": "title" - }, - { - "complete": "github.updatePRTitle#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "title": "Recorded title" - }, - "reply": { - "ok": true, - "result": true - } - }, - { - "checkpoint": "title" - } - ] - }, - { - "id": "pr-title-unconfirmed", - "operation": "session.pr-mutations", - "family": "github.pr-title-mutation", - "sites": ["mobile/src/source-control/review/github-pr-mutations.ts"], - "schedules": [], - "steps": [ - { - "action": "title", - "id": "explicit-false" - }, - { - "complete": "github.updatePRTitle#1", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "title": "Recorded title" - }, - "reply": { - "ok": true, - "result": false - } - }, - { - "checkpoint": "explicit-false" - }, - { - "action": "title", - "id": "refused" - }, - { - "complete": "github.updatePRTitle#2", - "params": { - "repo": "id:repo-9", - "prNumber": 12, - "title": "Recorded title" - }, - "reply": { - "ok": false, - "error": { - "code": "refused", - "message": "" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, { "id": "pr-triage-launch", "operation": "session.pr-triage-launch", @@ -7073,696 +5244,6 @@ } ] }, - { - "id": "pr-branch-identity", - "operation": "session.pr-branch-context", - "family": "session.pr-branch-context", - "sites": ["mobile/src/source-control/review/use-mobile-pr-branch-context.ts"], - "schedules": [], - "steps": [ - { - "action": "identity", - "id": "identity" - }, - { - "checkpoint": "pending" - }, - { - "complete": "git.status#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "head-sha-1", - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "area": "unstaged", - "added": 3, - "removed": 1 - } - ], - "upstreamStatus": { - "hasUpstream": true, - "ahead": 1, - "behind": 0 - } - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12 - } - } - } - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - }, - { - "complete": "git.branchCompare#1", - "params": { - "worktree": "id:repo-9::/w", - "baseRef": "origin/main" - }, - "reply": { - "ok": true, - "result": { - "summary": { - "baseRef": "origin/main", - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "changedFiles": 1, - "status": "ready" - }, - "entries": [ - { - "path": "src/old.ts", - "status": "modified", - "added": 1, - "removed": 0 - } - ] - } - } - }, - { - "checkpoint": "identity" - } - ] - }, - { - "id": "pr-branch-repo-context", - "operation": "session.pr-branch-context", - "family": "session.pr-branch-context", - "sites": ["mobile/src/source-control/review/use-mobile-pr-branch-context.ts"], - "schedules": [], - "steps": [ - { - "action": "repo-context", - "id": "repo-context" - }, - { - "complete": "github.repoSlug#1", - "params": { - "repo": "id:repo-9" - }, - "reply": { - "ok": true, - "result": { - "owner": "orca", - "repo": "orca", - "host": "github.com" - } - } - }, - { - "checkpoint": "repo-context" - } - ] - }, - { - "id": "diff-review-snapshot", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": [ - "mobile/src/source-control/review/mobile-diff-review-loaders.ts", - "mobile/src/source-control/review/mobile-diff-review-snapshot-loader.ts" - ], - "schedules": [], - "steps": [ - { - "action": "snapshot", - "id": "snapshot" - }, - { - "checkpoint": "pending" - }, - { - "complete": "git.status#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "head-sha-1", - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "area": "unstaged", - "added": 3, - "removed": 1 - } - ], - "upstreamStatus": { - "hasUpstream": true, - "ahead": 1, - "behind": 0 - } - } - } - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12, - "diffComments": [], - "mobileDiffReview": { - "files": [] - } - } - } - } - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - }, - { - "complete": "git.branchCompare#1", - "params": { - "worktree": "id:repo-9::/w", - "baseRef": "origin/main" - }, - "reply": { - "ok": true, - "result": { - "summary": { - "baseRef": "origin/main", - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "changedFiles": 1, - "status": "ready" - }, - "entries": [ - { - "path": "src/old.ts", - "status": "modified", - "added": 1, - "removed": 0 - } - ] - } - } - }, - { - "checkpoint": "snapshot" - } - ] - }, - { - "id": "diff-review-status-unavailable", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": [ - "mobile/src/source-control/review/mobile-diff-review-loaders.ts", - "mobile/src/source-control/review/mobile-diff-review-snapshot-loader.ts" - ], - "schedules": [], - "steps": [ - { - "action": "snapshot", - "id": "unavailable" - }, - { - "complete": "git.status#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method" - } - } - }, - { - "checkpoint": "unavailable" - } - ] - }, - { - "id": "diff-review-worktree-file-diff", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": ["mobile/src/source-control/review/mobile-diff-review-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "diff", - "id": "binary", - "args": { - "scope": "unstaged" - } - }, - { - "complete": "git.diff#1", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": true, - "result": { - "kind": "binary" - } - } - }, - { - "checkpoint": "binary" - }, - { - "action": "diff", - "id": "too-large", - "args": { - "scope": "staged" - } - }, - { - "complete": "git.diff#2", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": true - }, - "reply": { - "ok": true, - "result": { - "kind": "too-large", - "byteLength": 2048 - } - } - }, - { - "checkpoint": "too-large" - }, - { - "action": "diff", - "id": "invalid", - "args": { - "scope": "unstaged" - } - }, - { - "complete": "git.diff#3", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": true, - "result": { - "kind": "unknown" - } - } - }, - { - "checkpoint": "invalid" - } - ] - }, - { - "id": "diff-review-refused-file-diff", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": ["mobile/src/source-control/review/mobile-diff-review-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "diff", - "id": "diff-too-large", - "args": { - "scope": "unstaged" - } - }, - { - "complete": "git.diff#1", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": false, - "error": { - "code": "diff_too_large", - "message": "Diff exceeds the limit" - } - } - }, - { - "checkpoint": "diff-too-large" - }, - { - "action": "diff", - "id": "deleted", - "args": { - "scope": "unstaged", - "status": "deleted" - } - }, - { - "complete": "git.diff#2", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": false, - "error": { - "code": "internal", - "message": "boom" - } - } - }, - { - "checkpoint": "deleted" - }, - { - "action": "diff", - "id": "refused", - "args": { - "scope": "unstaged" - } - }, - { - "complete": "git.diff#3", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": false, - "error": { - "code": "internal", - "message": "" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "diff-review-branch-file-diff", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": ["mobile/src/source-control/review/mobile-diff-review-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "diff", - "id": "branch", - "args": { - "scope": "branch" - } - }, - { - "complete": "git.branchDiff#1", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "compare": { - "baseRef": "origin/main", - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567" - } - }, - "reply": { - "ok": true, - "result": { - "kind": "binary" - } - } - }, - { - "checkpoint": "branch" - }, - { - "action": "diff", - "id": "no-compare", - "args": { - "scope": "branch", - "compare": false - } - }, - { - "checkpoint": "no-compare" - } - ] - }, - { - "id": "diff-review-commit-file-diff", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": [ - "mobile/src/source-control/review/mobile-diff-review-loaders.ts", - "mobile/src/source-control/review/mobile-diff-review-commit-loader.ts" - ], - "schedules": [], - "steps": [ - { - "action": "commit-snapshot", - "id": "commit" - }, - { - "complete": "git.commitCompare#1", - "params": { - "worktree": "id:repo-9::/w", - "commitId": "c0ffee0123456789abcdef0123456789abcdef01" - }, - "reply": { - "ok": true, - "result": { - "summary": { - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "parentOid": "beef0123456789abcdef0123456789abcdef0123", - "compareRef": "c0ffee0", - "baseRef": "beef012", - "changedFiles": 1, - "status": "ready" - }, - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "added": 2, - "removed": 1 - } - ] - } - } - }, - { - "checkpoint": "commit" - }, - { - "action": "diff", - "id": "commit-file", - "args": { - "scope": "commit" - } - }, - { - "complete": "git.commitDiff#1", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "commitOid": "c0ffee0123456789abcdef0123456789abcdef01", - "parentOid": "beef0123456789abcdef0123456789abcdef0123" - }, - "reply": { - "ok": true, - "result": { - "kind": "text", - "originalContent": "a\n", - "modifiedContent": "a\nb\n", - "originalIsBinary": false, - "modifiedIsBinary": false - } - } - }, - { - "checkpoint": "commit-file" - } - ] - }, - { - "id": "diff-review-branch-compare", - "operation": "session.diff-review-load", - "family": "session.diff-review", - "sites": ["mobile/src/source-control/review/mobile-diff-review-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "branch-compare", - "id": "unavailable" - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12 - } - } - } - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - }, - { - "complete": "git.branchCompare#1", - "params": { - "worktree": "id:repo-9::/w", - "baseRef": "origin/main" - }, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "git is not available" - } - } - }, - { - "checkpoint": "unavailable" - }, - { - "action": "branch-compare", - "id": "invalid" - }, - { - "complete": "worktree.show#2", - "params": { - "worktree": "id:repo-9::/w" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main", - "linkedPR": 12 - } - } - } - }, - { - "complete": "repo.list#2", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9", - "worktreeBaseRef": "origin/main" - } - ] - } - } - }, - { - "complete": "git.branchCompare#2", - "params": { - "worktree": "id:repo-9::/w", - "baseRef": "origin/main" - }, - "reply": { - "ok": true, - "result": { - "summary": {}, - "entries": [] - } - } - }, - { - "checkpoint": "invalid" - } - ] - }, { "id": "diff-review-notes-refused-before-compare", "operation": "session.diff-review-load", @@ -11516,125 +8997,6 @@ } ] }, - { - "id": "native-chat-stop-accepted", - "operation": "session.native-chat-stop", - "family": "session.native-chat-stop", - "sites": ["mobile/src/session/native-chat/composer/use-mobile-native-chat-stop.ts"], - "schedules": [], - "steps": [ - { - "action": "stop", - "id": "stop" - }, - { - "complete": "terminal.send#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "first-accepted" - }, - { - "advance": 1000 - }, - { - "complete": "terminal.send#2", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - }, - "optional": true, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "native-chat-stop-both-rejected", - "operation": "session.native-chat-stop", - "family": "session.native-chat-stop", - "sites": ["mobile/src/session/native-chat/composer/use-mobile-native-chat-stop.ts"], - "schedules": [], - "steps": [ - { - "action": "stop", - "id": "stop" - }, - { - "complete": "terminal.send#1", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - }, - { - "advance": 1000 - }, - { - "complete": "terminal.send#2", - "params": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "terminal": "terminal-1", - "text": "\u001b" - }, - "optional": true, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - }, - { - "checkpoint": "reported" - } - ] - }, { "id": "native-chat-stop-delivery-unknown", "operation": "session.native-chat-stop", @@ -11890,83 +9252,6 @@ } ] }, - { - "id": "review-mark-reviewed-persists", - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mark-reviewed", - "id": "mark-reviewed" - }, - { - "complete": "worktree.set#1", - "params": { - "diffComments": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "worktreeId": "workspace-1", - "side": "modified" - } - ], - "diffCommentsBase": [ - { - "body": "needs a test", - "createdAt": 0, - "filePath": "src/app.ts", - "id": "note-1", - "lineNumber": 4, - "worktreeId": "workspace-1", - "side": "modified" - } - ], - "mobileDiffReview": { - "completedAt": 1767225600000, - "files": { - "unstaged:src/app.ts": { - "filePath": "src/app.ts", - "key": "unstaged:src/app.ts", - "lastOpenedAt": { - "$undefined": true - }, - "lastSeenDiffIdentity": "identity-1", - "oldPath": { - "$undefined": true - }, - "reviewDiffIdentity": "identity-1", - "reviewedAt": 1767225600000, - "scope": "unstaged" - } - }, - "updatedAt": 1767225600000, - "version": 1 - }, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "updated": true - } - } - }, - { - "checkpoint": "persisted" - } - ] - }, { "id": "review-mark-reviewed-rolls-back", "operation": "session.diff-review-actions", @@ -12045,320 +9330,6 @@ } ] }, - { - "id": "review-stage-file", - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "stage", - "id": "stage" - }, - { - "complete": "git.stage#1", - "params": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "staged": true - } - } - }, - { - "checkpoint": "staged" - } - ] - }, - { - "id": "review-stage-refused", - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "discard", - "id": "discard" - }, - { - "complete": "git.discard#1", - "params": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "git_conflict", - "message": "Cannot discard during a merge" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "review-open-in-session", - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "open-in-session", - "id": "open-in-session" - }, - { - "complete": "files.openDiff#1", - "params": { - "relativePath": "src/app.ts", - "staged": false, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "opened": true - } - } - }, - { - "checkpoint": "opened" - } - ] - }, - { - "id": "review-send-notes-heals-stale-input", - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mark-stale", - "id": "mark-stale" - }, - { - "action": "send-notes", - "id": "send-notes" - }, - { - "complete": "terminal.read#1", - "params": { - "terminal": "terminal-1", - "screen": true, - "limit": 1 - }, - "reply": { - "ok": true, - "result": { - "terminal": {} - } - } - }, - { - "complete": "terminal.send#1", - "params": { - "enter": false, - "terminal": "terminal-1", - "text": "\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u0015\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b" - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "healed" - } - ] - }, - { - "id": "review-create-agent-refused", - "operation": "session.diff-review-actions", - "family": "session.diff-review-actions", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "create-and-send", - "id": "create-and-send" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "workspace-1" - } - ] - } - } - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": null, - "disabledTuiAgents": [] - } - } - } - }, - { - "complete": "preflight.detectAgents#1", - "params": { - "worktreeId": "workspace-1" - }, - "reply": { - "ok": true, - "result": ["claude"] - } - }, - { - "complete": "agent.launchReplay#1", - "params": { - "agent": "claude", - "operationId": "1767225600000-00000000000040008000000000000001", - "target": { - "kind": "existing", - "worktree": "id:workspace-1" - }, - "prompt": { - "delivery": "submit", - "text": "File: src/app.ts\nLine: 4\nUser comment: \"needs a test\"" - }, - "launchSource": "notes_send" - }, - "reply": { - "ok": false, - "error": { - "code": "selector_not_found", - "message": "Workspace not found" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "session-markdown-saved", - "operation": "session.markdown-save", - "family": "session.markdown-save", - "sites": ["mobile/src/files/session-documents/use-mobile-session-markdown-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "save", - "id": "save" - }, - { - "complete": "markdown.saveTab#1", - "params": { - "baseVersion": "v1", - "content": "# b", - "tabId": "tab-md", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "content": "# b", - "version": "v2", - "isDirty": false - } - } - }, - { - "checkpoint": "saved" - } - ] - }, - { - "id": "session-markdown-save-conflict", - "operation": "session.markdown-save", - "family": "session.markdown-save", - "sites": ["mobile/src/files/session-documents/use-mobile-session-markdown-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "save", - "id": "save" - }, - { - "complete": "markdown.saveTab#1", - "params": { - "baseVersion": "v1", - "content": "# b", - "tabId": "tab-md", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "version_conflict", - "message": "Document changed on disk" - } - } - }, - { - "checkpoint": "conflicted" - } - ] - }, { "id": "quick-commands-loaded-and-saved", "operation": "settings.quick-commands", @@ -13141,117 +10112,6 @@ } ] }, - { - "id": "sc-changes-loaded", - "operation": "source-control.changes-load", - "family": "git.changes-load", - "sites": ["mobile/src/source-control/changes/use-mobile-source-control-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "status-pending" - }, - { - "complete": "git.status#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "head-oid", - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "area": "unstaged", - "added": 4, - "removed": 1 - }, - { - "path": "src/old.ts", - "oldPath": "src/older.ts", - "status": "renamed", - "area": "staged" - } - ], - "upstreamStatus": { - "hasUpstream": true, - "ahead": 1, - "behind": 0, - "upstreamName": "origin/feature" - } - } - } - }, - { - "checkpoint": "compare-pending" - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/dev" - } - } - } - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [] - } - } - }, - { - "complete": "git.branchCompare#1", - "params": { - "worktree": "id:repo42::/p", - "baseRef": "origin/dev" - }, - "reply": { - "ok": true, - "result": { - "summary": { - "baseRef": "origin/dev", - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "compareRef": "feature", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567", - "changedFiles": 1, - "status": "ready" - }, - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "added": 2, - "removed": 1 - } - ] - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-changes-return-from-memory", "operation": "source-control.changes-load", @@ -13564,106 +10424,6 @@ } ] }, - { - "id": "sc-history-branch-commits", - "operation": "source-control.history-branch-commits", - "family": "git.history-branch-commits", - "sites": ["mobile/src/source-control/history/MobileGitHistoryList.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "base-pending" - }, - { - "complete": "worktree.show#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "worktree": { - "baseRef": "origin/main" - } - } - } - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo42", - "worktreeBaseRef": null - } - ] - } - } - }, - { - "checkpoint": "history-pending" - }, - { - "complete": "git.history#1", - "params": { - "worktree": "id:repo42::/p", - "limit": 50, - "skip": 0, - "baseRef": "origin/main", - "branchOnly": true - }, - "reply": { - "ok": true, - "result": { - "items": [ - { - "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "displayId": "aaaaaaa", - "subject": "first", - "author": "dev", - "parentIds": ["bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"], - "timestamp": 1767222000000, - "pushed": false, - "statistics": { - "files": 2, - "insertions": 13, - "deletions": 1 - }, - "message": "first\n\nExplains the change.\n\nCo-authored-by: Pair " - } - ], - "hasMore": false, - "skip": 0, - "branch": { - "baseRef": { - "id": "refs/remotes/origin/main", - "name": "origin/main" - }, - "ahead": 1, - "behind": 2, - "unpushed": 1 - } - } - } - }, - { - "action": "open", - "id": "open" - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "notifications-desktop-stream-replayed", "operation": "notifications.desktop-stream", @@ -14893,238 +11653,6 @@ } ] }, - { - "id": "review-file-diff-shapes", - "operation": "session.diff-review-load", - "family": "session.review-file-diff", - "sites": ["mobile/src/source-control/review/mobile-diff-review-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "diff", - "id": "binary", - "args": { - "scope": "unstaged" - } - }, - { - "complete": "git.diff#1", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": true, - "result": { - "kind": "binary" - } - } - }, - { - "checkpoint": "binary" - }, - { - "action": "diff", - "id": "too-large", - "args": { - "scope": "staged" - } - }, - { - "complete": "git.diff#2", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": true - }, - "reply": { - "ok": true, - "result": { - "kind": "too-large", - "byteLength": 2048 - } - } - }, - { - "checkpoint": "too-large" - }, - { - "action": "diff", - "id": "invalid", - "args": { - "scope": "unstaged" - } - }, - { - "complete": "git.diff#3", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "staged": false - }, - "reply": { - "ok": true, - "result": { - "kind": "unknown" - } - } - }, - { - "checkpoint": "invalid" - } - ] - }, - { - "id": "review-branch-diff-shapes", - "operation": "session.diff-review-load", - "family": "session.review-branch-diff", - "sites": ["mobile/src/source-control/review/mobile-diff-review-loaders.ts"], - "schedules": [], - "steps": [ - { - "action": "diff", - "id": "branch", - "args": { - "scope": "branch" - } - }, - { - "complete": "git.branchDiff#1", - "params": { - "worktree": "id:repo-9::/w", - "filePath": "src/app.ts", - "compare": { - "baseRef": "origin/main", - "baseOid": "a1b2c3d4e5f60718293a4b5c6d7e8f9012345678", - "headOid": "f0e1d2c3b4a5968778695a4b3c2d1e0f98765432", - "mergeBase": "0123456789abcdef0123456789abcdef01234567" - } - }, - "reply": { - "ok": true, - "result": { - "kind": "binary" - } - } - }, - { - "checkpoint": "branch" - }, - { - "action": "diff", - "id": "no-compare", - "args": { - "scope": "branch", - "compare": false - } - }, - { - "checkpoint": "no-compare" - } - ] - }, - { - "id": "review-git-mutations-run", - "operation": "session.diff-review-actions", - "family": "session.review-git-mutations", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "stage", - "id": "stage" - }, - { - "complete": "git.stage#1", - "params": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "staged": true - } - } - }, - { - "checkpoint": "staged" - }, - { - "action": "discard", - "id": "discard" - }, - { - "complete": "git.discard#1", - "params": { - "filePath": "src/app.ts", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "discarded": true - } - } - }, - { - "checkpoint": "discarded" - } - ] - }, - { - "id": "review-send-sheet-lists-terminals", - "operation": "session.diff-review-actions", - "family": "session.review-send-sheet", - "sites": [ - "mobile/src/source-control/review/use-mobile-diff-review-interactions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-comment-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-git-actions.ts", - "mobile/src/source-control/review/use-mobile-diff-review-send-actions.ts", - "mobile/src/session/native-chat/composer/mobile-native-chat-stale-input.ts" - ], - "schedules": [], - "steps": [ - { - "action": "open-send-sheet", - "id": "open" - }, - { - "complete": "session.tabs.list#1", - "params": { - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "tabs": [ - { - "id": "tab-1", - "type": "terminal", - "title": "codex", - "terminal": "terminal-1" - }, - { - "id": "tab-2", - "type": "markdown", - "title": "notes.md" - } - ] - } - } - }, - { - "checkpoint": "listed" - } - ] - }, { "id": "new-tab-local-agents", "operation": "settings.new-tab-agents", diff --git a/mobile/src/test-support/bridged-parity/divergence-classes.ts b/mobile/src/test-support/bridged-parity/divergence-classes.ts index 7ea05389dba..e3b7ef6ef82 100644 --- a/mobile/src/test-support/bridged-parity/divergence-classes.ts +++ b/mobile/src/test-support/bridged-parity/divergence-classes.ts @@ -113,102 +113,3 @@ export const BRIDGED_PARITY_EXCLUSIONS: Readonly> = { - identical: 385, - 'reply-meta-required': 0, - 'result-absent-settlement': 328, - 'result-absent-observation': 6, - 'result-absent-stream-release': 1, - 'params-undefined': 27, - 'write-ordinal': 30, - unclassified: 0 -} - -export type BridgedParityTally = { - identical: number - counts: Readonly> -} - -// Check both directions and identical too; broad unclassified/exclusion gates cannot detect every class trade. -export function bridgedParityTallyDrift(tally: BridgedParityTally): readonly string[] { - const ran: Readonly> = { ...tally.counts, identical: tally.identical } - const drift: string[] = [] - for (const [name, pinned] of Object.entries(BRIDGED_PARITY_BASELINE)) { - const count = ran[name] ?? 0 - if (count !== pinned) { - drift.push(`${name}: pinned ${pinned}, ran ${count}`) - } - } - return drift -} - -export const BRIDGED_PARITY_NAMEABLE = 8 - -// Pin small classes by membership because unchanged counts can hide one real failure replacing an excluded artifact. -export const BRIDGED_PARITY_MEMBERS: Readonly< - Partial> -> = { - 'result-absent-observation': [ - 'matrix-live-worktree-name-runtime.clientevents.subscribe-1-2', - 'matrix-host-worktree-refresh-runtime.clientevents.subscribe-1-2', - 'matrix-host-worktree-refresh-runtime.clientevents.subscribe-1-3', - 'matrix-notifications.desktop-stream-notifications.subscribe-1-1', - 'matrix-notifications.desktop-stream-notifications.subscribe-1-2', - 'matrix-session.native-chat-page-nativechat.subscribe-2-1' - ], - 'result-absent-stream-release': ['matrix-session.native-chat-page-nativechat.subscribe-1-1'], - 'write-ordinal': [ - 'diff-review-notes-refused-before-compare', - 'diff-review-snapshot', - 'diff-review-status-unavailable', - 'matrix-session.diff-review-git.branchcompare-1', - 'matrix-session.diff-review-git.status-1', - 'matrix-session.diff-review-repo.list-1', - 'matrix-session.diff-review-worktree.show-1', - 'sc-changes-loaded', - 'sc-changes-return-from-memory', - 'sc-changes-write-reads-live', - 'matrix-git.changes-load-git.branchcompare-1', - 'matrix-git.changes-load-git.status-1', - 'matrix-git.changes-load-repo.list-1', - 'matrix-git.changes-load-worktree.show-1', - 'aivault-history-scan-association', - 'aivault-history-scan-fulfilled', - 'aivault-history-scan-refresh', - 'aivault-history-scan-revisit', - 'aivault-history-scan-unsupported', - 'aivault-history-screen-listed', - 'aivault-history-screen-worktrees', - 'host-worktree-refresh-stream', - 'live-worktree-name-stream', - 'matrix-host-worktree-refresh-runtime.clientevents.subscribe-1-1', - 'matrix-live-worktree-name-runtime.clientevents.subscribe-1-1', - 'matrix-host-worktree-refresh-runtime.clientevents.subscribe-2-1', - 'matrix-live-worktree-name-runtime.clientevents.subscribe-2-1', - 'matrix-live-worktree-name-worktree.show-1', - 'matrix-live-worktree-name-worktree.show-2', - 'matrix-live-worktree-name-worktree.show-3' - ] -} - -export function bridgedParityMembershipDrift( - observed: ReadonlyMap -): readonly string[] { - const drift: string[] = [] - for (const [name, pinned] of Object.entries(BRIDGED_PARITY_MEMBERS)) { - if (pinned === undefined) { - continue - } - const seen = observed.get(name) ?? [] - const arrived = seen.filter((id) => !pinned.includes(id)) - const left = pinned.filter((id) => !seen.includes(id)) - if (arrived.length > 0 || left.length > 0) { - drift.push( - `${name}: arrived ${arrived.join(', ') || '(none)'}; left ${left.join(', ') || '(none)'}` - ) - } - } - return drift -} diff --git a/mobile/src/test-support/rpc-recording/changed-bridge-outcomes.ts b/mobile/src/test-support/rpc-recording/changed-bridge-outcomes.ts index 9a33b840911..1467f936b77 100644 --- a/mobile/src/test-support/rpc-recording/changed-bridge-outcomes.ts +++ b/mobile/src/test-support/rpc-recording/changed-bridge-outcomes.ts @@ -1,177 +1,6 @@ -import type { BridgedParityClass } from '../bridged-parity/divergence-classes' import { isKeyedObject } from '../bridged-parity/divergence-evidence' import type { RecordedValue } from './recording-values' -// Producers whose input or recorded product contract this PR changed (the re-recorded set). Each earns its own -// direct page outcomes; none is judged by a legacy label or counted in the unchanged tally. -export const CHANGED_PRODUCERS: readonly string[] = [ - 'matrix-tasks.item-review-github-pr-check-discovery', - 'matrix-github.pr-read-github.listassignableusers-1', - 'matrix-github.pr-read-github.prcheckdetails-1', - 'matrix-github.pr-read-github.prchecks-1', - 'matrix-github.pr-read-github.prforbranch-1', - 'matrix-github.pr-read-github.reposlug-1', - 'matrix-github.pr-read-github.workitemdetails-1', - 'matrix-github.pr-read-hostedreview.forbranch-1', - 'matrix-tasks.item-checks-files-github.addprreviewcomment-1', - 'matrix-tasks.item-checks-files-github.prfilecontents-1', - 'matrix-tasks.item-checks-files-github.rerunprchecks-1', - 'matrix-tasks.item-checks-files-github.resolvereviewthread-1', - 'matrix-tasks.item-checks-files-github.setprfileviewed-1', - 'matrix-tasks.item-comment-github-github.addissuecomment-1', - 'matrix-tasks.item-comment-gitlab-gitlab.addissuecomment-1', - 'matrix-tasks.item-comment-gitlab-mr-gitlab.addmrcomment-1', - 'matrix-tasks.item-detail-github-github.workitemdetails-1', - 'matrix-tasks.item-detail-gitlab-gitlab.workitemdetails-1', - 'matrix-tasks.item-detail-linear-linear.getissue-1', - 'matrix-tasks.item-detail-linear-linear.issuecomments-1', - 'matrix-tasks.item-merge-gitlab-gitlab.mergemr-1', - 'matrix-tasks.item-metadata-github-github.updatepr-1', - 'matrix-tasks.item-metadata-gitlab-gitlab.updateissue-1', - 'matrix-tasks.item-metadata-gitlab-mr-gitlab.updatemr-1', - 'matrix-tasks.item-reply-merge-github.addissuecomment-1', - 'matrix-tasks.item-reply-merge-github.addprreviewcommentreply-1', - 'matrix-tasks.item-reply-merge-github.mergepr-1', - 'matrix-tasks.item-reply-merge-linear.updateissue-1', - 'matrix-tasks.item-review-github-github.prchecks-1', - 'matrix-tasks.item-review-github-github.requestprreviewers-1', - 'matrix-tasks.item-status-gitlab-github.updateissue-1', - 'matrix-tasks.item-status-gitlab-gitlab.updateissue-1', - 'matrix-tasks.item-status-gitlab-mr-gitlab.updatemrstate-1', - 'matrix-tasks.linear-item-linear.addissuecomment-1', - 'matrix-tasks.linear-item-linear.createissue-1', - 'matrix-tasks.linear-item-linear.getissue-1', - 'matrix-tasks.linear-team-context-linear.listteams-1', - 'matrix-tasks.linear-team-context-linear.teamstates-1', - 'matrix-tasks.project-row-detail-github.project.workitemdetailsbyslug-1', - 'matrix-tasks.project-row-files-merge-github.addprreviewcomment-1', - 'matrix-tasks.project-row-files-merge-github.mergepr-1', - 'matrix-tasks.project-row-files-merge-github.prfilecontents-1', - 'matrix-tasks.project-row-files-merge-github.updateissue-1', - 'matrix-tasks.project-row-files-merge-github.updateprstate-1', - 'pr-read-surface', - 'tk-item-checks-files', - 'tk-item-comment-github', - 'tk-item-comment-gitlab', - 'tk-item-comment-gitlab-mr', - 'tk-item-detail-github', - 'tk-item-detail-github-reactions', - 'tk-item-detail-gitlab', - 'tk-item-detail-gitlab-reactions', - 'tk-item-detail-linear', - 'tk-item-detail-metadata', - 'tk-item-merge-gitlab', - 'tk-item-metadata-github', - 'tk-item-metadata-gitlab', - 'tk-item-metadata-gitlab-mr', - 'tk-item-reply-merge', - 'tk-item-review-github', - 'tk-item-status-gitlab', - 'tk-item-status-gitlab-mr', - 'tk-linear-item', - 'tk-linear-team-context', - 'tk-project-row-detail', - 'tk-project-row-files-merge', - 'matrix-github.pr-read-status.get-1', - 'matrix-tasks.item-detail-github-status.get-1', - 'matrix-tasks.item-status-gitlab-status.get-1', - 'matrix-tasks.project-row-files-merge-status.get-1' -] - -type BaselineClass = BridgedParityClass | 'identical' - -// Branch-base classes (f2bee638f25) of members moved to direct judging: closure pins, or the admitted baseline -// replay for the eight without one. -export const MOVED_FROM_BASELINE: Readonly> = { - 'matrix-github.pr-read-github.listassignableusers-1': 'result-absent-settlement', - 'matrix-github.pr-read-github.prcheckdetails-1': 'result-absent-settlement', - 'matrix-github.pr-read-github.prchecks-1': 'result-absent-settlement', - 'matrix-github.pr-read-github.prforbranch-1': 'result-absent-settlement', - 'matrix-github.pr-read-github.reposlug-1': 'result-absent-settlement', - 'matrix-github.pr-read-github.workitemdetails-1': 'result-absent-settlement', - 'matrix-github.pr-read-hostedreview.forbranch-1': 'result-absent-settlement', - 'matrix-tasks.item-checks-files-github.addprreviewcomment-1': 'params-undefined', - 'matrix-tasks.item-checks-files-github.prfilecontents-1': 'params-undefined', - 'matrix-tasks.item-checks-files-github.rerunprchecks-1': 'params-undefined', - 'matrix-tasks.item-checks-files-github.resolvereviewthread-1': 'params-undefined', - 'matrix-tasks.item-checks-files-github.setprfileviewed-1': 'params-undefined', - 'matrix-tasks.item-comment-github-github.addissuecomment-1': 'result-absent-settlement', - 'matrix-tasks.item-comment-gitlab-gitlab.addissuecomment-1': 'result-absent-settlement', - 'matrix-tasks.item-comment-gitlab-mr-gitlab.addmrcomment-1': 'result-absent-settlement', - 'matrix-tasks.item-detail-github-github.workitemdetails-1': 'result-absent-settlement', - 'matrix-tasks.item-detail-gitlab-gitlab.workitemdetails-1': 'result-absent-settlement', - 'matrix-tasks.item-detail-linear-linear.getissue-1': 'result-absent-settlement', - 'matrix-tasks.item-detail-linear-linear.issuecomments-1': 'result-absent-settlement', - 'matrix-tasks.item-merge-gitlab-gitlab.mergemr-1': 'result-absent-settlement', - 'matrix-tasks.item-metadata-github-github.updatepr-1': 'result-absent-settlement', - 'matrix-tasks.item-metadata-gitlab-gitlab.updateissue-1': 'result-absent-settlement', - 'matrix-tasks.item-metadata-gitlab-mr-gitlab.updatemr-1': 'params-undefined', - 'matrix-tasks.item-reply-merge-github.addissuecomment-1': 'result-absent-settlement', - 'matrix-tasks.item-reply-merge-github.addprreviewcommentreply-1': 'result-absent-settlement', - 'matrix-tasks.item-reply-merge-github.mergepr-1': 'result-absent-settlement', - 'matrix-tasks.item-reply-merge-linear.updateissue-1': 'result-absent-settlement', - 'matrix-tasks.item-review-github-github.prchecks-1': 'result-absent-settlement', - 'matrix-tasks.item-review-github-github.requestprreviewers-1': 'result-absent-settlement', - 'matrix-tasks.item-status-gitlab-github.updateissue-1': 'result-absent-settlement', - 'matrix-tasks.item-status-gitlab-gitlab.updateissue-1': 'result-absent-settlement', - 'matrix-tasks.item-status-gitlab-mr-gitlab.updatemrstate-1': 'result-absent-settlement', - 'matrix-tasks.linear-item-linear.addissuecomment-1': 'result-absent-settlement', - 'matrix-tasks.linear-item-linear.createissue-1': 'result-absent-settlement', - 'matrix-tasks.linear-item-linear.getissue-1': 'result-absent-settlement', - 'matrix-tasks.linear-team-context-linear.listteams-1': 'result-absent-settlement', - 'matrix-tasks.linear-team-context-linear.teamstates-1': 'result-absent-settlement', - 'matrix-tasks.project-row-detail-github.project.workitemdetailsbyslug-1': - 'result-absent-settlement', - 'matrix-tasks.project-row-files-merge-github.addprreviewcomment-1': 'params-undefined', - 'matrix-tasks.project-row-files-merge-github.mergepr-1': 'params-undefined', - 'matrix-tasks.project-row-files-merge-github.prfilecontents-1': 'params-undefined', - 'matrix-tasks.project-row-files-merge-github.updateissue-1': 'params-undefined', - 'matrix-tasks.project-row-files-merge-github.updateprstate-1': 'params-undefined', - 'pr-read-surface': 'identical', - 'tk-item-checks-files': 'params-undefined', - 'tk-item-comment-github': 'identical', - 'tk-item-comment-gitlab': 'identical', - 'tk-item-comment-gitlab-mr': 'identical', - 'tk-item-detail-github': 'identical', - 'tk-item-detail-github-reactions': 'identical', - 'tk-item-detail-gitlab': 'identical', - 'tk-item-detail-gitlab-reactions': 'identical', - 'tk-item-detail-linear': 'identical', - 'tk-item-detail-metadata': 'identical', - 'tk-item-merge-gitlab': 'identical', - 'tk-item-metadata-github': 'identical', - 'tk-item-metadata-gitlab': 'identical', - 'tk-item-metadata-gitlab-mr': 'params-undefined', - 'tk-item-reply-merge': 'identical', - 'tk-item-review-github': 'identical', - 'tk-item-status-gitlab': 'identical', - 'tk-item-status-gitlab-mr': 'identical', - 'tk-linear-item': 'identical', - 'tk-linear-team-context': 'identical', - 'tk-project-row-detail': 'identical', - 'tk-project-row-files-merge': 'params-undefined' -} - -// Producers the PR removed from the corpus, with their branch-base class. -export const REMOVED_FROM_BASELINE: Readonly> = { - 'matrix-tasks.item-detail-metadata-github.listassignableusers-1': 'result-absent-settlement', - 'matrix-tasks.item-detail-metadata-github.listlabels-1': 'result-absent-settlement', - 'speech-desktop-start-recording-failed': 'identical' -} - -export function expectedUnchangedTally( - baseline: Readonly> -): Record { - const expected = { ...baseline } - for (const old of [ - ...Object.values(MOVED_FROM_BASELINE), - ...Object.values(REMOVED_FROM_BASELINE) - ]) { - expected[old] -= 1 - } - return expected -} - export function rows(value: RecordedValue): Record[] { if (!Array.isArray(value)) { throw new Error('Missing reviewed recorded rows') diff --git a/mobile/src/test-support/rpc-recording/derived-goldens.ts b/mobile/src/test-support/rpc-recording/derived-goldens.ts index ca5748330c5..510baaf0816 100644 --- a/mobile/src/test-support/rpc-recording/derived-goldens.ts +++ b/mobile/src/test-support/rpc-recording/derived-goldens.ts @@ -1,11 +1,6 @@ import { materializeScenario } from './scenario-execution-mode' import { hoistPreludeCheckpoints } from './prelude-checkpoints' -import { - bindCompletions, - interruptionSchedules, - lifecycleSchedules, - siblingSchedules -} from './schedule-driver' +import { bindCompletions, lifecycleSchedules } from './schedule-driver' import type { RecordingScenario, ExecutionMode, ScenarioLineage } from './recording-scenario' // Share derivation with census/pruning so all consumers enumerate the recordings actually written. @@ -18,14 +13,6 @@ export type DerivedGolden = { scenarios: () => RecordingScenario[] } -const SIBLING_SCHEDULE_BASES = [ - 'b3', - 'settings-new-tab-ssh', - 'settings-workspace-context-fulfilled', - 'settings-task-hydration-fulfilled', - 'settings-repo-metadata-fulfilled' -] -const INTERRUPTION_BASES = ['inventory-lifecycle', 'settings-bot-overrides-fulfilled'] const LIFECYCLE_BASES = [ 'inventory-lifecycle', 'b3', @@ -87,38 +74,6 @@ export function familyGoldens( ): DerivedGolden[] { const manifest = input.map((scenario) => materializeScenario(scenario, mode)) const goldens: DerivedGolden[] = [] - for (const id of SIBLING_SCHEDULE_BASES) { - const base = baseScenario(manifest, id) - const replies = base.steps.flatMap((step) => ('complete' in step ? [step] : [])) - // Complete prerequisites before permuting the sibling barrier. - const first = replies.find((step) => - step.complete.startsWith(id === 'b3' ? 'linear.getIssue' : 'settings.get') - ) - if (!first) { - throw new Error(`No prerequisite completion to order siblings against: ${id}`) - } - const second = replies[replies.indexOf(first) + 1] - if (!second) { - continue - } - goldens.push({ - id: `schedules-${id}`, - title: `schedules-${id}: completion orders and correlated faults`, - family: base.family, - lineage: { ...base.lineage!, schedule: 'siblings' }, - scenarios: () => siblingSchedules(base, first, second) - }) - } - for (const id of INTERRUPTION_BASES) { - const base = baseScenario(manifest, id) - goldens.push({ - id: `interruptions-${id}`, - title: `interruptions-${id}: timeout, disconnect and stable-client cutover`, - family: base.family, - lineage: { ...base.lineage!, schedule: 'interruptions' }, - scenarios: () => interruptionSchedules(base) - }) - } for (const id of LIFECYCLE_BASES) { const base = baseScenario(manifest, id) const actions: readonly ('reset' | 'unmount' | 'blur')[] = id.includes('hydration') From 59dc4eff3b1578df70fe32120f721867a9d34b5e Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 12:54:50 -0800 Subject: [PATCH 06/49] test: remove low-value session and speech recording groups (#42130) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../goldens/sc-prerequisite-push.json | 129 -- ...c-review-commit-refused-empty-message.json | 82 - .../goldens/sc-review-commit-rejected.json | 79 - .../goldens/sc-review-commit.json | 80 - .../goldens/sc-review-status-normalized.json | 300 --- .../session-markdown-tab-disk-fallback.json | 131 -- ...session-startup-both-activation-sites.json | 453 ----- ...artup-floating-route-skips-activation.json | 138 -- ...-keeps-terminals-visible-on-reconnect.json | 230 --- ...efused-tab-load-still-loads-terminals.json | 205 -- ...ion-tab-activation-focus-and-activate.json | 152 -- .../session-tab-activation-refused.json | 95 - ...ession-tab-activation-transport-error.json | 76 - ...tab-close-host-unavailable-tells-user.json | 101 - .../session-tab-close-refused-keeps-tab.json | 99 - .../session-tab-close-session-tab.json | 94 - .../goldens/session-tab-close-terminal.json | 94 - .../goldens/session-tabs-health-errored.json | 91 - .../session-tabs-health-reconciled.json | 110 - .../goldens/session-tabs-health-refused.json | 97 - ...terminal-display-mode-auto-take-floor.json | 161 -- ...isplay-mode-auto-without-device-token.json | 153 -- ...al-display-mode-auto-without-viewport.json | 151 -- ...sion-terminal-display-mode-to-desktop.json | 153 -- ...session-terminal-list-dedupes-handles.json | 101 - .../session-terminal-list-empty-guarded.json | 76 - .../goldens/session-terminal-list-merged.json | 115 -- .../session-terminal-list-refused.json | 77 - .../speech-audio-chunk-acknowledged.json | 84 - .../speech-desktop-start-superseded.json | 125 -- .../speech-dictation-session-cancelled.json | 120 -- .../speech-dictation-session-transcript.json | 120 -- .../speech-setup-sheet-denied-to-mobile.json | 76 - .../goldens/speech-setup-sheet-fulfilled.json | 267 --- .../speech-setup-sheet-legacy-desktop.json | 76 - .../speech-setup-sheet-model-vocabulary.json | 155 -- .../terminal-gesture-flush-and-clear.json | 310 --- .../goldens/terminal-live-input-accepted.json | 93 - .../goldens/terminal-paste-accepted.json | 172 -- .../goldens/terminal-paste-refused.json | 155 -- ...terminal-worktree-connection-resolved.json | 138 -- mobile/rpc-foundation/pilot-scenarios.json | 1770 ----------------- 42 files changed, 7484 deletions(-) delete mode 100644 mobile/rpc-foundation/goldens/sc-prerequisite-push.json delete mode 100644 mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json delete mode 100644 mobile/rpc-foundation/goldens/sc-review-commit-rejected.json delete mode 100644 mobile/rpc-foundation/goldens/sc-review-commit.json delete mode 100644 mobile/rpc-foundation/goldens/sc-review-status-normalized.json delete mode 100644 mobile/rpc-foundation/goldens/session-markdown-tab-disk-fallback.json delete mode 100644 mobile/rpc-foundation/goldens/session-startup-both-activation-sites.json delete mode 100644 mobile/rpc-foundation/goldens/session-startup-floating-route-skips-activation.json delete mode 100644 mobile/rpc-foundation/goldens/session-startup-keeps-terminals-visible-on-reconnect.json delete mode 100644 mobile/rpc-foundation/goldens/session-startup-refused-tab-load-still-loads-terminals.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-activation-focus-and-activate.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-activation-refused.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-activation-transport-error.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-close-host-unavailable-tells-user.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-close-refused-keeps-tab.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-close-session-tab.json delete mode 100644 mobile/rpc-foundation/goldens/session-tab-close-terminal.json delete mode 100644 mobile/rpc-foundation/goldens/session-tabs-health-errored.json delete mode 100644 mobile/rpc-foundation/goldens/session-tabs-health-reconciled.json delete mode 100644 mobile/rpc-foundation/goldens/session-tabs-health-refused.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-take-floor.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-device-token.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-viewport.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-display-mode-to-desktop.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-list-dedupes-handles.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-list-empty-guarded.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-list-merged.json delete mode 100644 mobile/rpc-foundation/goldens/session-terminal-list-refused.json delete mode 100644 mobile/rpc-foundation/goldens/speech-audio-chunk-acknowledged.json delete mode 100644 mobile/rpc-foundation/goldens/speech-desktop-start-superseded.json delete mode 100644 mobile/rpc-foundation/goldens/speech-dictation-session-cancelled.json delete mode 100644 mobile/rpc-foundation/goldens/speech-dictation-session-transcript.json delete mode 100644 mobile/rpc-foundation/goldens/speech-setup-sheet-denied-to-mobile.json delete mode 100644 mobile/rpc-foundation/goldens/speech-setup-sheet-fulfilled.json delete mode 100644 mobile/rpc-foundation/goldens/speech-setup-sheet-legacy-desktop.json delete mode 100644 mobile/rpc-foundation/goldens/speech-setup-sheet-model-vocabulary.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-gesture-flush-and-clear.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-live-input-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-paste-accepted.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-paste-refused.json delete mode 100644 mobile/rpc-foundation/goldens/terminal-worktree-connection-resolved.json diff --git a/mobile/rpc-foundation/goldens/sc-prerequisite-push.json b/mobile/rpc-foundation/goldens/sc-prerequisite-push.json deleted file mode 100644 index 7d2f553452f..00000000000 --- a/mobile/rpc-foundation/goldens/sc-prerequisite-push.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.remote-prerequisite", - "family": "git.remote-prerequisite", - "namedDeltas": [], - "values": { - "00e8a3bac22f": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "ran": true - } - }, - "03b4110a11c7": { - "name": "git.push#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.push\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "0fe2eb2410a4": { - "outcome": { - "ok": true, - "ran": true - } - }, - "1cfd4ed2f051": { - "name": "progress", - "ordinal": 1, - "value": "pushing" - }, - "7fbeade80602": { - "name": "git.push#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "git.push" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "c1ca3b60f701": { - "name": "git.push#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "git.push" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "cf19981c2114": { - "outcome": "unapplied" - } - }, - "recording": { - "scenario": "sc-prerequisite-push", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["c1ca3b60f701"], - "payloads": ["03b4110a11c7"], - "settlements": { - "apply": "9270aeb7d9c6" - }, - "state": "cf19981c2114", - "effects": ["1cfd4ed2f051"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["7fbeade80602"], - "payloads": ["03b4110a11c7"], - "settlements": { - "apply": "00e8a3bac22f" - }, - "state": "0fe2eb2410a4", - "effects": ["1cfd4ed2f051"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json b/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json deleted file mode 100644 index 7a96be5a02f..00000000000 --- a/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "namedDeltas": [], - "values": { - "342343f97688": { - "name": "git.commit#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.commit\",\"params\":{\"worktree\":\"id:repo42::/p\",\"message\":\"recorded message\"}}" - }, - "45f289a0f3ae": { - "committed": { - "error": "Commit failed", - "ok": false - }, - "status": "unread" - }, - "9dac5d637ed4": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Commit failed", - "ok": false - } - }, - "b14d9ec6b441": { - "name": "git.commit#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.commit" - }, - { - "name": "params", - "value": { - "message": "recorded message", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "internal", - "message": "" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "sc-review-commit-refused-empty-message", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["b14d9ec6b441"], - "payloads": ["342343f97688"], - "settlements": { - "commit": "9dac5d637ed4" - }, - "state": "45f289a0f3ae", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json b/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json deleted file mode 100644 index c108efe47c7..00000000000 --- a/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "namedDeltas": [], - "values": { - "342343f97688": { - "name": "git.commit#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.commit\",\"params\":{\"worktree\":\"id:repo42::/p\",\"message\":\"recorded message\"}}" - }, - "465d78c22406": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "connection lost", - "ok": false - } - }, - "7c923ba16626": { - "committed": { - "error": "connection lost", - "ok": false - }, - "status": "unread" - }, - "b5383f4d86af": { - "name": "git.commit#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.commit" - }, - { - "name": "params", - "value": { - "message": "recorded message", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "connection lost", - "isRpcDeliveryUnknown": true - } - } - } - }, - "recording": { - "scenario": "sc-review-commit-rejected", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["b5383f4d86af"], - "payloads": ["342343f97688"], - "settlements": { - "commit": "465d78c22406" - }, - "state": "7c923ba16626", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-review-commit.json b/mobile/rpc-foundation/goldens/sc-review-commit.json deleted file mode 100644 index 990308832f9..00000000000 --- a/mobile/rpc-foundation/goldens/sc-review-commit.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "namedDeltas": [], - "values": { - "17bb401abe83": { - "committed": { - "ok": true - }, - "status": "unread" - }, - "2a7ee2985949": { - "name": "git.commit#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.commit" - }, - { - "name": "params", - "value": { - "message": "recorded message", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "commit": "abc1234", - "success": true - } - } - } - }, - "342343f97688": { - "name": "git.commit#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.commit\",\"params\":{\"worktree\":\"id:repo42::/p\",\"message\":\"recorded message\"}}" - }, - "fbc958e4d46e": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true - } - } - }, - "recording": { - "scenario": "sc-review-commit", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["2a7ee2985949"], - "payloads": ["342343f97688"], - "settlements": { - "commit": "fbc958e4d46e" - }, - "state": "17bb401abe83", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-review-status-normalized.json b/mobile/rpc-foundation/goldens/sc-review-status-normalized.json deleted file mode 100644 index 6729e504a3f..00000000000 --- a/mobile/rpc-foundation/goldens/sc-review-status-normalized.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "namedDeltas": [], - "values": { - "1858779f58e9": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "branch": "feature", - "entries": [ - { - "area": "staged", - "path": "src/app.ts", - "status": "modified" - }, - { - "area": "untracked", - "path": "src/new.ts", - "status": "untracked" - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "8601995022f5": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "95c11f23ad0d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "ok": true, - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [ - { - "added": { - "$rpc": "undefined" - }, - "area": "staged", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/app.ts", - "removed": { - "$rpc": "undefined" - }, - "status": "modified", - "submodule": { - "$rpc": "undefined" - }, - "submoduleRoot": { - "$rpc": "undefined" - } - }, - { - "added": { - "$rpc": "undefined" - }, - "area": "untracked", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/new.ts", - "removed": { - "$rpc": "undefined" - }, - "status": "untracked", - "submodule": { - "$rpc": "undefined" - }, - "submoduleRoot": { - "$rpc": "undefined" - } - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - } - } - }, - "ac07554f62ad": { - "committed": "uncommitted", - "status": "unread" - }, - "ace37e236a18": { - "committed": "uncommitted", - "status": { - "ok": true, - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [ - { - "added": { - "$rpc": "undefined" - }, - "area": "staged", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/app.ts", - "removed": { - "$rpc": "undefined" - }, - "status": "modified", - "submodule": { - "$rpc": "undefined" - }, - "submoduleRoot": { - "$rpc": "undefined" - } - }, - { - "added": { - "$rpc": "undefined" - }, - "area": "untracked", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/new.ts", - "removed": { - "$rpc": "undefined" - }, - "status": "untracked", - "submodule": { - "$rpc": "undefined" - }, - "submoduleRoot": { - "$rpc": "undefined" - } - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - } - } - }, - "ddee63fd3bf5": { - "name": "git.status#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - } - }, - "recording": { - "scenario": "sc-review-status-normalized", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["8601995022f5"], - "payloads": ["ddee63fd3bf5"], - "settlements": { - "status": "9270aeb7d9c6" - }, - "state": "ac07554f62ad", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["1858779f58e9"], - "payloads": ["ddee63fd3bf5"], - "settlements": { - "status": "95c11f23ad0d" - }, - "state": "ace37e236a18", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-markdown-tab-disk-fallback.json b/mobile/rpc-foundation/goldens/session-markdown-tab-disk-fallback.json deleted file mode 100644 index 53e6780530e..00000000000 --- a/mobile/rpc-foundation/goldens/session-markdown-tab-disk-fallback.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-documents", - "family": "session.tab-documents", - "namedDeltas": [], - "values": { - "44abbe2af7aa": { - "name": "markdown.readTab#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"markdown.readTab\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-md\"}}" - }, - "c6cea5310098": { - "file": {}, - "markdown": { - "tab-md": { - "baseVersion": "", - "content": "# disk", - "editable": false, - "isDirty": false, - "localContent": "# disk", - "readOnlyReason": "Editing needs Orca desktop running.", - "stale": false, - "status": "ready" - } - } - }, - "d4be01606497": { - "name": "files.read#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"files.read\",\"params\":{\"worktree\":\"id:workspace-1\",\"relativePath\":\"docs/readme.md\"}}" - }, - "d59404d25d6c": { - "name": "files.read#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "files.read" - }, - { - "name": "params", - "value": { - "relativePath": "docs/readme.md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "byteLength": 6, - "content": "# disk", - "truncated": false - } - } - } - }, - "e258dafc91f1": { - "name": "markdown.readTab#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "markdown.readTab" - }, - { - "name": "params", - "value": { - "tabId": "tab-md", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "renderer_unavailable", - "message": "Renderer unavailable" - }, - "id": "frame-1", - "ok": false - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-markdown-tab-disk-fallback", - "checkpoints": [ - { - "id": "fell-back", - "observation": { - "sender": ["e258dafc91f1", "d59404d25d6c"], - "payloads": ["44abbe2af7aa", "d4be01606497"], - "settlements": { - "markdown": "eb79a9b3682a" - }, - "state": "c6cea5310098", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-startup-both-activation-sites.json b/mobile/rpc-foundation/goldens/session-startup-both-activation-sites.json deleted file mode 100644 index 51333805d7e..00000000000 --- a/mobile/rpc-foundation/goldens/session-startup-both-activation-sites.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.startup", - "family": "session.startup", - "namedDeltas": [], - "values": { - "19efe7a6058c": { - "name": "worktree.activate#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 1800 - } - }, - "1dca7912e0fe": { - "name": "worktree.activate#2", - "ordinal": 15, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.activate\",\"params\":{\"worktree\":\"id:wt-1\",\"notifyClients\":false,\"navigation\":\"caller\"}}" - }, - "1e40b8324af4": { - "name": "worktree.activate#2", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 2550 - } - }, - "38b377793c34": { - "name": "ensure-session-tabs", - "ordinal": 5, - "value": {} - }, - "4319ba45c158": { - "name": "toast", - "ordinal": 9, - "value": { - "durationMs": 3000, - "message": "Open Orca on the host to wake sleeping agents." - } - }, - "4669e4d646e8": { - "name": "fetch-terminals", - "ordinal": 6, - "value": { - "allowEmptyLoaded": false - } - }, - "51ae204eb34b": { - "status": "fulfilled", - "startedAt": 2550, - "settledAt": 2550, - "value": { - "$rpc": "undefined" - } - }, - "5ea84cbe70fc": { - "name": "worktree.activate#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 1800, - "settledAt": 1800, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "sleepingAgentWake": "unsupported-headless" - } - } - } - }, - "63abf3b998b3": { - "name": "fetch-terminals", - "ordinal": 14, - "value": { - "allowEmptyLoaded": false - } - }, - "6419a011f13b": { - "name": "clear-terminal-cache", - "ordinal": 1, - "value": {} - }, - "650e3aedd38c": { - "name": "clear-pending-live-input-commit", - "ordinal": 17, - "value": {} - }, - "6c4561ecc9ee": { - "name": "ensure-session-tabs", - "ordinal": 13, - "value": {} - }, - "854cb236952a": { - "actionSheetRequestSeq": 1, - "activeHandle": { - "$rpc": "null" - }, - "appliedSnapshotMarker": { - "epoch": { - "$rpc": "null" - }, - "version": -1 - }, - "closedTabTombstones": 0, - "initializedHandles": [], - "sessionTabs": [], - "terminalsLoaded": false - }, - "95c8385db422": { - "name": "clear-delayed-action-timers", - "ordinal": 4, - "value": {} - }, - "9a856559977e": { - "name": "toast", - "ordinal": 16, - "value": { - "durationMs": 3000, - "message": "Open Orca on the host to wake sleeping agents." - } - }, - "a509dd4610b2": { - "name": "fetch-terminals", - "ordinal": 11, - "value": { - "allowEmptyLoaded": true - } - }, - "aab012c297bd": { - "name": "diagnostics-reset-route", - "ordinal": 2, - "value": {} - }, - "b86ad4df402e": { - "name": "clear-delayed-action-timers", - "ordinal": 18, - "value": {} - }, - "ba45b883b259": { - "name": "fetch-terminals", - "ordinal": 10, - "value": { - "allowEmptyLoaded": true - } - }, - "d2c3cccdd0b2": { - "name": "worktree.activate#2", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 2550, - "settledAt": 2550, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "sleepingAgentWake": "unsupported-headless" - } - } - } - }, - "e8b978dbecff": { - "name": "worktree.activate#1", - "ordinal": 8, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.activate\",\"params\":{\"worktree\":\"id:wt-1\",\"notifyClients\":false,\"navigation\":\"caller\"}}" - }, - "e927128e41fc": { - "name": "clear-pending-live-input-commit", - "ordinal": 3, - "value": {} - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-startup-both-activation-sites", - "checkpoints": [ - { - "id": "loading", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8" - ] - } - }, - { - "id": "reactivating", - "observation": { - "sender": ["19efe7a6058c"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8" - ] - } - }, - { - "id": "reactivated", - "observation": { - "sender": ["5ea84cbe70fc"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "4319ba45c158", - "ba45b883b259" - ] - } - }, - { - "id": "refreshed", - "observation": { - "sender": ["5ea84cbe70fc"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "4319ba45c158", - "ba45b883b259", - "a509dd4610b2" - ] - } - }, - { - "id": "activating", - "observation": { - "sender": ["5ea84cbe70fc", "1e40b8324af4"], - "payloads": ["e8b978dbecff", "1dca7912e0fe"], - "settlements": { - "mount": "eb79a9b3682a", - "consume-route": "51ae204eb34b" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "4319ba45c158", - "ba45b883b259", - "a509dd4610b2", - "6c4561ecc9ee", - "63abf3b998b3" - ] - } - }, - { - "id": "activated", - "observation": { - "sender": ["5ea84cbe70fc", "d2c3cccdd0b2"], - "payloads": ["e8b978dbecff", "1dca7912e0fe"], - "settlements": { - "mount": "eb79a9b3682a", - "consume-route": "51ae204eb34b" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "4319ba45c158", - "ba45b883b259", - "a509dd4610b2", - "6c4561ecc9ee", - "63abf3b998b3", - "9a856559977e" - ] - } - }, - { - "id": "reloaded", - "observation": { - "sender": ["5ea84cbe70fc", "d2c3cccdd0b2"], - "payloads": ["e8b978dbecff", "1dca7912e0fe"], - "settlements": { - "mount": "eb79a9b3682a", - "consume-route": "51ae204eb34b" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "4319ba45c158", - "ba45b883b259", - "a509dd4610b2", - "6c4561ecc9ee", - "63abf3b998b3", - "9a856559977e" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["5ea84cbe70fc", "d2c3cccdd0b2"], - "payloads": ["e8b978dbecff", "1dca7912e0fe"], - "settlements": { - "mount": "eb79a9b3682a", - "consume-route": "51ae204eb34b" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "4319ba45c158", - "ba45b883b259", - "a509dd4610b2", - "6c4561ecc9ee", - "63abf3b998b3", - "9a856559977e", - "650e3aedd38c", - "b86ad4df402e" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-startup-floating-route-skips-activation.json b/mobile/rpc-foundation/goldens/session-startup-floating-route-skips-activation.json deleted file mode 100644 index d2f2aa57cf3..00000000000 --- a/mobile/rpc-foundation/goldens/session-startup-floating-route-skips-activation.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.startup", - "family": "session.startup", - "namedDeltas": [], - "values": { - "38b377793c34": { - "name": "ensure-session-tabs", - "ordinal": 5, - "value": {} - }, - "4669e4d646e8": { - "name": "fetch-terminals", - "ordinal": 6, - "value": { - "allowEmptyLoaded": false - } - }, - "481b4ed03a28": { - "name": "clear-pending-live-input-commit", - "ordinal": 7, - "value": {} - }, - "6419a011f13b": { - "name": "clear-terminal-cache", - "ordinal": 1, - "value": {} - }, - "6afa2a4d3bfe": { - "name": "clear-delayed-action-timers", - "ordinal": 8, - "value": {} - }, - "854cb236952a": { - "actionSheetRequestSeq": 1, - "activeHandle": { - "$rpc": "null" - }, - "appliedSnapshotMarker": { - "epoch": { - "$rpc": "null" - }, - "version": -1 - }, - "closedTabTombstones": 0, - "initializedHandles": [], - "sessionTabs": [], - "terminalsLoaded": false - }, - "95c8385db422": { - "name": "clear-delayed-action-timers", - "ordinal": 4, - "value": {} - }, - "aab012c297bd": { - "name": "diagnostics-reset-route", - "ordinal": 2, - "value": {} - }, - "e927128e41fc": { - "name": "clear-pending-live-input-commit", - "ordinal": 3, - "value": {} - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-startup-floating-route-skips-activation", - "checkpoints": [ - { - "id": "loading", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8" - ] - } - }, - { - "id": "settled", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "38b377793c34", - "4669e4d646e8", - "481b4ed03a28", - "6afa2a4d3bfe" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-startup-keeps-terminals-visible-on-reconnect.json b/mobile/rpc-foundation/goldens/session-startup-keeps-terminals-visible-on-reconnect.json deleted file mode 100644 index bcaa94b1e50..00000000000 --- a/mobile/rpc-foundation/goldens/session-startup-keeps-terminals-visible-on-reconnect.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.startup", - "family": "session.startup", - "namedDeltas": [], - "values": { - "57e0a895cdde": { - "name": "worktree.activate#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "6419a011f13b": { - "name": "clear-terminal-cache", - "ordinal": 1, - "value": {} - }, - "8c990409ac55": { - "name": "worktree.activate#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": {} - } - } - }, - "95c8385db422": { - "name": "clear-delayed-action-timers", - "ordinal": 4, - "value": {} - }, - "968d084a5a35": { - "name": "clear-delayed-action-timers", - "ordinal": 10, - "value": {} - }, - "a193ad4304cb": { - "name": "fetch-terminals", - "ordinal": 7, - "value": { - "allowEmptyLoaded": false - } - }, - "a98356c9153c": { - "actionSheetRequestSeq": 2, - "activeHandle": { - "$rpc": "null" - }, - "appliedSnapshotMarker": { - "epoch": { - "$rpc": "null" - }, - "version": -1 - }, - "closedTabTombstones": 0, - "initializedHandles": [], - "sessionTabs": [], - "terminalsLoaded": true - }, - "aa6511b23729": { - "status": "fulfilled", - "startedAt": 1500, - "settledAt": 1500, - "value": { - "$rpc": "undefined" - } - }, - "aab012c297bd": { - "name": "diagnostics-reset-route", - "ordinal": 2, - "value": {} - }, - "bc94d6f00eeb": { - "name": "clear-pending-live-input-commit", - "ordinal": 9, - "value": {} - }, - "e022e11065b3": { - "actionSheetRequestSeq": 1, - "activeHandle": { - "$rpc": "null" - }, - "appliedSnapshotMarker": { - "epoch": { - "$rpc": "null" - }, - "version": -1 - }, - "closedTabTombstones": 0, - "initializedHandles": [], - "sessionTabs": [], - "terminalsLoaded": true - }, - "e8b978dbecff": { - "name": "worktree.activate#1", - "ordinal": 8, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.activate\",\"params\":{\"worktree\":\"id:wt-1\",\"notifyClients\":false,\"navigation\":\"caller\"}}" - }, - "e927128e41fc": { - "name": "clear-pending-live-input-commit", - "ordinal": 3, - "value": {} - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed8838ca9a14": { - "name": "ensure-session-tabs", - "ordinal": 6, - "value": {} - } - }, - "recording": { - "scenario": "session-startup-keeps-terminals-visible-on-reconnect", - "checkpoints": [ - { - "id": "loading", - "observation": { - "sender": ["57e0a895cdde"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "e022e11065b3", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "ed8838ca9a14", - "a193ad4304cb" - ] - } - }, - { - "id": "refreshed", - "observation": { - "sender": ["8c990409ac55"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "e022e11065b3", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "ed8838ca9a14", - "a193ad4304cb" - ] - } - }, - { - "id": "unmounted", - "observation": { - "sender": ["8c990409ac55"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a", - "unmount": "aa6511b23729" - }, - "state": "a98356c9153c", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "ed8838ca9a14", - "a193ad4304cb", - "bc94d6f00eeb", - "968d084a5a35" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-startup-refused-tab-load-still-loads-terminals.json b/mobile/rpc-foundation/goldens/session-startup-refused-tab-load-still-loads-terminals.json deleted file mode 100644 index cc15db3252a..00000000000 --- a/mobile/rpc-foundation/goldens/session-startup-refused-tab-load-still-loads-terminals.json +++ /dev/null @@ -1,205 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.startup", - "family": "session.startup", - "namedDeltas": [], - "values": { - "57e0a895cdde": { - "name": "worktree.activate#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "6419a011f13b": { - "name": "clear-terminal-cache", - "ordinal": 1, - "value": {} - }, - "854cb236952a": { - "actionSheetRequestSeq": 1, - "activeHandle": { - "$rpc": "null" - }, - "appliedSnapshotMarker": { - "epoch": { - "$rpc": "null" - }, - "version": -1 - }, - "closedTabTombstones": 0, - "initializedHandles": [], - "sessionTabs": [], - "terminalsLoaded": false - }, - "8c990409ac55": { - "name": "worktree.activate#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.activate" - }, - { - "name": "params", - "value": { - "navigation": "caller", - "notifyClients": false, - "worktree": "id:wt-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": {} - } - } - }, - "95c8385db422": { - "name": "clear-delayed-action-timers", - "ordinal": 4, - "value": {} - }, - "968d084a5a35": { - "name": "clear-delayed-action-timers", - "ordinal": 10, - "value": {} - }, - "a193ad4304cb": { - "name": "fetch-terminals", - "ordinal": 7, - "value": { - "allowEmptyLoaded": false - } - }, - "aab012c297bd": { - "name": "diagnostics-reset-route", - "ordinal": 2, - "value": {} - }, - "bc94d6f00eeb": { - "name": "clear-pending-live-input-commit", - "ordinal": 9, - "value": {} - }, - "e8b978dbecff": { - "name": "worktree.activate#1", - "ordinal": 8, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.activate\",\"params\":{\"worktree\":\"id:wt-1\",\"notifyClients\":false,\"navigation\":\"caller\"}}" - }, - "e927128e41fc": { - "name": "clear-pending-live-input-commit", - "ordinal": 3, - "value": {} - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ed8838ca9a14": { - "name": "ensure-session-tabs", - "ordinal": 6, - "value": {} - } - }, - "recording": { - "scenario": "session-startup-refused-tab-load-still-loads-terminals", - "checkpoints": [ - { - "id": "tab-load-refused", - "observation": { - "sender": ["57e0a895cdde"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "ed8838ca9a14", - "a193ad4304cb" - ] - } - }, - { - "id": "refreshed", - "observation": { - "sender": ["8c990409ac55"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "ed8838ca9a14", - "a193ad4304cb" - ] - } - }, - { - "id": "cleanup", - "observation": { - "sender": ["8c990409ac55"], - "payloads": ["e8b978dbecff"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "854cb236952a", - "effects": [ - "6419a011f13b", - "aab012c297bd", - "e927128e41fc", - "95c8385db422", - "ed8838ca9a14", - "a193ad4304cb", - "bc94d6f00eeb", - "968d084a5a35" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-activation-focus-and-activate.json b/mobile/rpc-foundation/goldens/session-tab-activation-focus-and-activate.json deleted file mode 100644 index 512766198aa..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-activation-focus-and-activate.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-activation", - "family": "session.tab-activation", - "namedDeltas": [], - "values": { - "36e84700f75b": { - "name": "terminal.focus#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.focus\",\"params\":{\"terminal\":\"terminal-1\",\"navigation\":\"host\"}}" - }, - "3db95ed7902c": { - "name": "terminal.focus#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.focus" - }, - { - "name": "params", - "value": { - "navigation": "host", - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "focused": true - } - } - } - }, - "4e4394afbcef": { - "activate": { - "id": "frame-2", - "ok": true, - "result": { - "activated": true - } - }, - "failure": { - "$rpc": "null" - }, - "focus": { - "id": "frame-1", - "ok": true, - "result": { - "focused": true - } - } - }, - "795aac33fef6": { - "name": "session.tabs.activate#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "session.tabs.activate" - }, - { - "name": "params", - "value": { - "intent": "user", - "navigation": "caller", - "notifyClients": false, - "tabId": "tab-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "activated": true - } - } - } - }, - "84d74a6de2ca": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "activated": true - } - } - }, - "9fd53197e14f": { - "name": "session.tabs.activate#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.activate\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-1\",\"notifyClients\":false,\"navigation\":\"caller\",\"intent\":\"user\"}}" - }, - "ecc5d1639f16": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "focused": true - } - } - } - }, - "recording": { - "scenario": "session-tab-activation-focus-and-activate", - "checkpoints": [ - { - "id": "activated", - "observation": { - "sender": ["3db95ed7902c", "795aac33fef6"], - "payloads": ["36e84700f75b", "9fd53197e14f"], - "settlements": { - "focus": "ecc5d1639f16", - "activate": "84d74a6de2ca" - }, - "state": "4e4394afbcef", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-activation-refused.json b/mobile/rpc-foundation/goldens/session-tab-activation-refused.json deleted file mode 100644 index 447ade8967e..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-activation-refused.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-activation", - "family": "session.tab-activation", - "namedDeltas": [], - "values": { - "7a0a4e34e537": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "tab_not_found", - "message": "No such tab" - }, - "id": "frame-1", - "ok": false - } - }, - "80b6a2c3dc17": { - "name": "session.tabs.activate#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.activate" - }, - { - "name": "params", - "value": { - "intent": "user", - "navigation": "caller", - "notifyClients": false, - "tabId": "tab-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "tab_not_found", - "message": "No such tab" - }, - "id": "frame-1", - "ok": false - } - } - }, - "97f1e4150cc6": { - "activate": { - "error": { - "code": "tab_not_found", - "message": "No such tab" - }, - "id": "frame-1", - "ok": false - }, - "failure": { - "$rpc": "null" - } - }, - "af35a6da041d": { - "name": "session.tabs.activate#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.activate\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-1\",\"notifyClients\":false,\"navigation\":\"caller\",\"intent\":\"user\"}}" - } - }, - "recording": { - "scenario": "session-tab-activation-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["80b6a2c3dc17"], - "payloads": ["af35a6da041d"], - "settlements": { - "activate": "7a0a4e34e537" - }, - "state": "97f1e4150cc6", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-activation-transport-error.json b/mobile/rpc-foundation/goldens/session-tab-activation-transport-error.json deleted file mode 100644 index abe6745c411..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-activation-transport-error.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-activation", - "family": "session.tab-activation", - "namedDeltas": [], - "values": { - "36e84700f75b": { - "name": "terminal.focus#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.focus\",\"params\":{\"terminal\":\"terminal-1\",\"navigation\":\"host\"}}" - }, - "50dc9b14a69a": { - "name": "terminal.focus#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.focus" - }, - { - "name": "params", - "value": { - "navigation": "host", - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Request timed out", - "isRpcDeliveryUnknown": false - } - } - }, - "6b74a7e08acf": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Request timed out", - "isRpcDeliveryUnknown": false - } - }, - "9acb73463ead": { - "failure": "Request timed out" - } - }, - "recording": { - "scenario": "session-tab-activation-transport-error", - "checkpoints": [ - { - "id": "errored", - "observation": { - "sender": ["50dc9b14a69a"], - "payloads": ["36e84700f75b"], - "settlements": { - "focus": "6b74a7e08acf" - }, - "state": "9acb73463ead", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-close-host-unavailable-tells-user.json b/mobile/rpc-foundation/goldens/session-tab-close-host-unavailable-tells-user.json deleted file mode 100644 index 19a41ad7993..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-close-host-unavailable-tells-user.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-close", - "family": "session.tab-close", - "namedDeltas": [], - "values": { - "3e15def58214": { - "activeHandle": "terminal-1", - "sessionTabs": [ - { - "id": "tab-1", - "isActive": true, - "terminal": "terminal-1", - "title": "Terminal", - "type": "terminal" - } - ], - "terminals": [ - { - "handle": "terminal-1", - "isActive": true, - "title": "Terminal" - } - ] - }, - "50a46af5cf5c": { - "name": "session.tabs.close#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.close\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-1\",\"reason\":\"user\"}}" - }, - "b8970b98f1e3": { - "name": "toast", - "ordinal": 3, - "value": { - "message": "Couldn't close the tab. Orca on your computer is still loading. Try again in a moment." - } - }, - "d1730750ac1c": { - "name": "session.tabs.close#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.close" - }, - { - "name": "params", - "value": { - "reason": "user", - "tabId": "tab-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "runtime_unavailable", - "message": "runtime_unavailable" - }, - "id": "frame-1", - "ok": false - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-tab-close-host-unavailable-tells-user", - "checkpoints": [ - { - "id": "kept", - "observation": { - "sender": ["d1730750ac1c"], - "payloads": ["50a46af5cf5c"], - "settlements": { - "close-tab": "eb79a9b3682a" - }, - "state": "3e15def58214", - "effects": ["b8970b98f1e3"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-close-refused-keeps-tab.json b/mobile/rpc-foundation/goldens/session-tab-close-refused-keeps-tab.json deleted file mode 100644 index 5f9eee6af52..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-close-refused-keeps-tab.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-close", - "family": "session.tab-close", - "namedDeltas": [], - "values": { - "26d1891758e0": { - "name": "toast", - "ordinal": 3, - "value": { - "message": "Couldn't close the tab. Try again." - } - }, - "3e15def58214": { - "activeHandle": "terminal-1", - "sessionTabs": [ - { - "id": "tab-1", - "isActive": true, - "terminal": "terminal-1", - "title": "Terminal", - "type": "terminal" - } - ], - "terminals": [ - { - "handle": "terminal-1", - "isActive": true, - "title": "Terminal" - } - ] - }, - "744d30b1a0ad": { - "name": "terminal.close#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.close" - }, - { - "name": "params", - "value": { - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "terminal_not_found", - "message": "No such terminal" - }, - "id": "frame-1", - "ok": false - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ff9e6fa68d38": { - "name": "terminal.close#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.close\",\"params\":{\"terminal\":\"terminal-1\"}}" - } - }, - "recording": { - "scenario": "session-tab-close-refused-keeps-tab", - "checkpoints": [ - { - "id": "kept", - "observation": { - "sender": ["744d30b1a0ad"], - "payloads": ["ff9e6fa68d38"], - "settlements": { - "close-terminal": "eb79a9b3682a" - }, - "state": "3e15def58214", - "effects": ["26d1891758e0"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-close-session-tab.json b/mobile/rpc-foundation/goldens/session-tab-close-session-tab.json deleted file mode 100644 index 9af8f1b38f0..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-close-session-tab.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-close", - "family": "session.tab-close", - "namedDeltas": [], - "values": { - "1195cdf08e57": { - "name": "unsubscribe-terminal", - "ordinal": 3, - "value": { - "handle": "terminal-1" - } - }, - "50a46af5cf5c": { - "name": "session.tabs.close#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.close\",\"params\":{\"worktree\":\"id:workspace-1\",\"tabId\":\"tab-1\",\"reason\":\"user\"}}" - }, - "567d11711027": { - "activeHandle": { - "$rpc": "null" - }, - "sessionTabs": [], - "terminals": [ - { - "handle": "terminal-1", - "isActive": true, - "title": "Terminal" - } - ] - }, - "de4cc94c0333": { - "name": "session.tabs.close#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "session.tabs.close" - }, - { - "name": "params", - "value": { - "reason": "user", - "tabId": "tab-1", - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "closed": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-tab-close-session-tab", - "checkpoints": [ - { - "id": "closed", - "observation": { - "sender": ["de4cc94c0333"], - "payloads": ["50a46af5cf5c"], - "settlements": { - "close-tab": "eb79a9b3682a" - }, - "state": "567d11711027", - "effects": ["1195cdf08e57"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tab-close-terminal.json b/mobile/rpc-foundation/goldens/session-tab-close-terminal.json deleted file mode 100644 index a095a9d17b6..00000000000 --- a/mobile/rpc-foundation/goldens/session-tab-close-terminal.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tab-close", - "family": "session.tab-close", - "namedDeltas": [], - "values": { - "1195cdf08e57": { - "name": "unsubscribe-terminal", - "ordinal": 3, - "value": { - "handle": "terminal-1" - } - }, - "6d591243ee36": { - "name": "terminal.close#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.close" - }, - { - "name": "params", - "value": { - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "closed": true - } - } - } - }, - "de039f500462": { - "activeHandle": { - "$rpc": "null" - }, - "sessionTabs": [ - { - "id": "tab-1", - "isActive": true, - "terminal": "terminal-1", - "title": "Terminal", - "type": "terminal" - } - ], - "terminals": [] - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ff9e6fa68d38": { - "name": "terminal.close#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.close\",\"params\":{\"terminal\":\"terminal-1\"}}" - } - }, - "recording": { - "scenario": "session-tab-close-terminal", - "checkpoints": [ - { - "id": "closed", - "observation": { - "sender": ["6d591243ee36"], - "payloads": ["ff9e6fa68d38"], - "settlements": { - "close-terminal": "eb79a9b3682a" - }, - "state": "de039f500462", - "effects": ["1195cdf08e57"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tabs-health-errored.json b/mobile/rpc-foundation/goldens/session-tabs-health-errored.json deleted file mode 100644 index 05337a4c387..00000000000 --- a/mobile/rpc-foundation/goldens/session-tabs-health-errored.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tabs-stream-health", - "family": "session.tabs-stream-health", - "namedDeltas": [], - "values": { - "0cde28482d1a": { - "name": "session.tabs.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.list\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "49a2260ea0e7": { - "accepted": "unapplied", - "applicationRevision": 0 - }, - "510d7b10aacf": { - "name": "fetch-started", - "ordinal": 1, - "value": {} - }, - "778c46b2e8ff": { - "name": "fetch-errored", - "ordinal": 4, - "value": "Connection lost" - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "c59ddd1d2f73": { - "name": "session.tabs.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "session.tabs.list" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Connection lost", - "isRpcDeliveryUnknown": true - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-tabs-health-errored", - "checkpoints": [ - { - "id": "errored", - "observation": { - "sender": ["c59ddd1d2f73"], - "payloads": ["0cde28482d1a"], - "settlements": { - "activate": "84e5ca07cb7a", - "reconcile": "eb79a9b3682a" - }, - "state": "49a2260ea0e7", - "effects": ["510d7b10aacf", "778c46b2e8ff"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tabs-health-reconciled.json b/mobile/rpc-foundation/goldens/session-tabs-health-reconciled.json deleted file mode 100644 index 411acd5125b..00000000000 --- a/mobile/rpc-foundation/goldens/session-tabs-health-reconciled.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tabs-stream-health", - "family": "session.tabs-stream-health", - "namedDeltas": [], - "values": { - "0cde28482d1a": { - "name": "session.tabs.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.list\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "18295edda482": { - "name": "session.tabs.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "session.tabs.list" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "tabs": [ - { - "id": "tab-1" - } - ] - } - } - } - }, - "510d7b10aacf": { - "name": "fetch-started", - "ordinal": 1, - "value": {} - }, - "540a1c1f9afc": { - "name": "fetch-succeeded", - "ordinal": 4, - "value": { - "tabs": [ - { - "id": "tab-1" - } - ] - } - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "e29309cc10af": { - "accepted": { - "source": "list", - "tabs": [ - { - "id": "tab-1" - } - ] - }, - "applicationRevision": 0 - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-tabs-health-reconciled", - "checkpoints": [ - { - "id": "reconciled", - "observation": { - "sender": ["18295edda482"], - "payloads": ["0cde28482d1a"], - "settlements": { - "activate": "84e5ca07cb7a", - "reconcile": "eb79a9b3682a" - }, - "state": "e29309cc10af", - "effects": ["510d7b10aacf", "540a1c1f9afc"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-tabs-health-refused.json b/mobile/rpc-foundation/goldens/session-tabs-health-refused.json deleted file mode 100644 index d2575205a91..00000000000 --- a/mobile/rpc-foundation/goldens/session-tabs-health-refused.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.tabs-stream-health", - "family": "session.tabs-stream-health", - "namedDeltas": [], - "values": { - "0cde28482d1a": { - "name": "session.tabs.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"session.tabs.list\",\"params\":{\"worktree\":\"id:workspace-1\"}}" - }, - "49a2260ea0e7": { - "accepted": "unapplied", - "applicationRevision": 0 - }, - "510d7b10aacf": { - "name": "fetch-started", - "ordinal": 1, - "value": {} - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "878af0e23d93": { - "name": "fetch-failed", - "ordinal": 4, - "value": { - "code": "worktree_not_found", - "message": "No such workspace" - } - }, - "c4ac5e6a7071": { - "name": "session.tabs.list#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "session.tabs.list" - }, - { - "name": "params", - "value": { - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "worktree_not_found", - "message": "No such workspace" - }, - "id": "frame-1", - "ok": false - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-tabs-health-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["c4ac5e6a7071"], - "payloads": ["0cde28482d1a"], - "settlements": { - "activate": "84e5ca07cb7a", - "reconcile": "eb79a9b3682a" - }, - "state": "49a2260ea0e7", - "effects": ["510d7b10aacf", "878af0e23d93"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-take-floor.json b/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-take-floor.json deleted file mode 100644 index a0693d0d4c2..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-take-floor.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "namedDeltas": [], - "values": { - "39066dc373ed": { - "name": "terminal.setDisplayMode#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.setDisplayMode\",\"params\":{\"terminal\":\"terminal-1\",\"mode\":\"auto\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"},\"viewport\":{\"cols\":100,\"rows\":30}}}" - }, - "61b1eb90a019": { - "crash": { - "$rpc": "null" - }, - "inFlight": ["terminal-1"], - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "ad499ab069a7": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "mode": "auto", - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "c21196ef3035": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "mode": "auto", - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "mode": "auto" - } - } - } - }, - "e27323f28d10": { - "name": "subscribe-terminal", - "ordinal": 1, - "value": { - "handle": "terminal-1" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "fa46c84fb0ab": { - "crash": { - "$rpc": "null" - }, - "inFlight": [], - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - "recording": { - "scenario": "session-terminal-display-mode-auto-take-floor", - "checkpoints": [ - { - "id": "in-flight", - "observation": { - "sender": ["ad499ab069a7"], - "payloads": ["39066dc373ed"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "9270aeb7d9c6" - }, - "state": "61b1eb90a019", - "effects": ["e27323f28d10"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["c21196ef3035"], - "payloads": ["39066dc373ed"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "eb79a9b3682a" - }, - "state": "fa46c84fb0ab", - "effects": ["e27323f28d10"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-device-token.json b/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-device-token.json deleted file mode 100644 index 09e2abe41fb..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-device-token.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "namedDeltas": [], - "values": { - "3ba74271a870": { - "name": "terminal.setDisplayMode#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.setDisplayMode\",\"params\":{\"terminal\":\"terminal-1\",\"mode\":\"auto\",\"viewport\":{\"cols\":100,\"rows\":30}}}" - }, - "61b1eb90a019": { - "crash": { - "$rpc": "null" - }, - "inFlight": ["terminal-1"], - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "857d314fbd2c": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "mode": "auto", - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "mode": "auto" - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "9d25aa3b9920": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "mode": "auto", - "terminal": "terminal-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "e27323f28d10": { - "name": "subscribe-terminal", - "ordinal": 1, - "value": { - "handle": "terminal-1" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "fa46c84fb0ab": { - "crash": { - "$rpc": "null" - }, - "inFlight": [], - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - "recording": { - "scenario": "session-terminal-display-mode-auto-without-device-token", - "checkpoints": [ - { - "id": "in-flight", - "observation": { - "sender": ["9d25aa3b9920"], - "payloads": ["3ba74271a870"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "9270aeb7d9c6" - }, - "state": "61b1eb90a019", - "effects": ["e27323f28d10"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["857d314fbd2c"], - "payloads": ["3ba74271a870"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "eb79a9b3682a" - }, - "state": "fa46c84fb0ab", - "effects": ["e27323f28d10"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-viewport.json b/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-viewport.json deleted file mode 100644 index f94c96e44e9..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-display-mode-auto-without-viewport.json +++ /dev/null @@ -1,151 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "namedDeltas": [], - "values": { - "36a9812a9d80": { - "crash": { - "$rpc": "null" - }, - "inFlight": [], - "viewport": { - "$rpc": "null" - } - }, - "8dda780d8b54": { - "crash": { - "$rpc": "null" - }, - "inFlight": ["terminal-1"], - "viewport": { - "$rpc": "null" - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "a1c27099bee5": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "mode": "auto", - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "mode": "auto" - } - } - } - }, - "b8202d6f729b": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "mode": "auto", - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "d26d24f38a03": { - "name": "terminal.setDisplayMode#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.setDisplayMode\",\"params\":{\"terminal\":\"terminal-1\",\"mode\":\"auto\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "e27323f28d10": { - "name": "subscribe-terminal", - "ordinal": 1, - "value": { - "handle": "terminal-1" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "session-terminal-display-mode-auto-without-viewport", - "checkpoints": [ - { - "id": "in-flight", - "observation": { - "sender": ["b8202d6f729b"], - "payloads": ["d26d24f38a03"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "9270aeb7d9c6" - }, - "state": "8dda780d8b54", - "effects": ["e27323f28d10"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["a1c27099bee5"], - "payloads": ["d26d24f38a03"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "eb79a9b3682a" - }, - "state": "36a9812a9d80", - "effects": ["e27323f28d10"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-display-mode-to-desktop.json b/mobile/rpc-foundation/goldens/session-terminal-display-mode-to-desktop.json deleted file mode 100644 index 5ba97b73847..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-display-mode-to-desktop.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "namedDeltas": [], - "values": { - "61b1eb90a019": { - "crash": { - "$rpc": "null" - }, - "inFlight": ["terminal-1"], - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "65926da8a267": { - "name": "terminal.setDisplayMode#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.setDisplayMode\",\"params\":{\"terminal\":\"terminal-1\",\"mode\":\"desktop\",\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "bfd37fff9f79": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "mode": "desktop", - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "mode": "desktop" - } - } - } - }, - "e27323f28d10": { - "name": "subscribe-terminal", - "ordinal": 1, - "value": { - "handle": "terminal-1" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "fa46c84fb0ab": { - "crash": { - "$rpc": "null" - }, - "inFlight": [], - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "fe1c824daad7": { - "name": "terminal.setDisplayMode#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "terminal.setDisplayMode" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "mode": "desktop", - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - } - }, - "recording": { - "scenario": "session-terminal-display-mode-to-desktop", - "checkpoints": [ - { - "id": "in-flight", - "observation": { - "sender": ["fe1c824daad7"], - "payloads": ["65926da8a267"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "9270aeb7d9c6" - }, - "state": "61b1eb90a019", - "effects": ["e27323f28d10"] - } - }, - { - "id": "settled", - "observation": { - "sender": ["bfd37fff9f79"], - "payloads": ["65926da8a267"], - "settlements": { - "mount": "eb79a9b3682a", - "toggle": "eb79a9b3682a" - }, - "state": "fa46c84fb0ab", - "effects": ["e27323f28d10"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-list-dedupes-handles.json b/mobile/rpc-foundation/goldens/session-terminal-list-dedupes-handles.json deleted file mode 100644 index 0298a8b31c1..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-list-dedupes-handles.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "namedDeltas": [], - "values": { - "475f23d61c0e": { - "name": "terminal.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.list\",\"params\":{\"worktree\":\"id:workspace-1\",\"includeVisualLayouts\":false,\"includePreview\":false}}" - }, - "580c77c4c1df": { - "known": [ - { - "handle": "terminal-1", - "terminalTheme": { - "$rpc": "undefined" - }, - "title": "one" - } - ], - "terminals": [ - { - "handle": "terminal-1", - "terminalTheme": { - "$rpc": "undefined" - }, - "title": "one" - } - ] - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "c7073e587980": { - "name": "terminal.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.list" - }, - { - "name": "params", - "value": { - "includePreview": false, - "includeVisualLayouts": false, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "terminals": [ - { - "handle": "terminal-1", - "title": "one" - }, - { - "handle": "terminal-1", - "title": "renamed" - } - ] - } - } - } - } - }, - "recording": { - "scenario": "session-terminal-list-dedupes-handles", - "checkpoints": [ - { - "id": "deduped", - "observation": { - "sender": ["c7073e587980"], - "payloads": ["475f23d61c0e"], - "settlements": { - "fetch": "84e5ca07cb7a" - }, - "state": "580c77c4c1df", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-list-empty-guarded.json b/mobile/rpc-foundation/goldens/session-terminal-list-empty-guarded.json deleted file mode 100644 index 2e5573b1235..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-list-empty-guarded.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "namedDeltas": [], - "values": { - "475f23d61c0e": { - "name": "terminal.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.list\",\"params\":{\"worktree\":\"id:workspace-1\",\"includeVisualLayouts\":false,\"includePreview\":false}}" - }, - "6aa9d70c1c82": { - "known": [], - "terminals": [] - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "fd88f17223dd": { - "name": "terminal.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.list" - }, - { - "name": "params", - "value": { - "includePreview": false, - "includeVisualLayouts": false, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "terminals": [] - } - } - } - } - }, - "recording": { - "scenario": "session-terminal-list-empty-guarded", - "checkpoints": [ - { - "id": "kept", - "observation": { - "sender": ["fd88f17223dd"], - "payloads": ["475f23d61c0e"], - "settlements": { - "no-empty": "84e5ca07cb7a" - }, - "state": "6aa9d70c1c82", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-list-merged.json b/mobile/rpc-foundation/goldens/session-terminal-list-merged.json deleted file mode 100644 index a1033e22af2..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-list-merged.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "namedDeltas": [], - "values": { - "475f23d61c0e": { - "name": "terminal.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.list\",\"params\":{\"worktree\":\"id:workspace-1\",\"includeVisualLayouts\":false,\"includePreview\":false}}" - }, - "727166f3bc25": { - "known": [ - { - "handle": "terminal-1", - "terminalTheme": { - "$rpc": "undefined" - }, - "title": "one" - }, - { - "handle": "terminal-2", - "terminalTheme": { - "$rpc": "undefined" - }, - "title": "two" - } - ], - "terminals": [ - { - "handle": "terminal-1", - "terminalTheme": { - "$rpc": "undefined" - }, - "title": "one" - }, - { - "handle": "terminal-2", - "terminalTheme": { - "$rpc": "undefined" - }, - "title": "two" - } - ] - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "ee68ebc5fb96": { - "name": "terminal.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.list" - }, - { - "name": "params", - "value": { - "includePreview": false, - "includeVisualLayouts": false, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "terminals": [ - { - "handle": "terminal-1", - "title": "one" - }, - { - "handle": "terminal-2", - "title": "two" - } - ] - } - } - } - } - }, - "recording": { - "scenario": "session-terminal-list-merged", - "checkpoints": [ - { - "id": "listed", - "observation": { - "sender": ["ee68ebc5fb96"], - "payloads": ["475f23d61c0e"], - "settlements": { - "fetch": "84e5ca07cb7a" - }, - "state": "727166f3bc25", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/session-terminal-list-refused.json b/mobile/rpc-foundation/goldens/session-terminal-list-refused.json deleted file mode 100644 index efeda9e4612..00000000000 --- a/mobile/rpc-foundation/goldens/session-terminal-list-refused.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "namedDeltas": [], - "values": { - "475f23d61c0e": { - "name": "terminal.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.list\",\"params\":{\"worktree\":\"id:workspace-1\",\"includeVisualLayouts\":false,\"includePreview\":false}}" - }, - "6aa9d70c1c82": { - "known": [], - "terminals": [] - }, - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "af74332c1c73": { - "name": "terminal.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.list" - }, - { - "name": "params", - "value": { - "includePreview": false, - "includeVisualLayouts": false, - "worktree": "id:workspace-1" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "worktree_not_found", - "message": "No such workspace" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "session-terminal-list-refused", - "checkpoints": [ - { - "id": "refused", - "observation": { - "sender": ["af74332c1c73"], - "payloads": ["475f23d61c0e"], - "settlements": { - "fetch": "7ed3d39f0607" - }, - "state": "6aa9d70c1c82", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-audio-chunk-acknowledged.json b/mobile/rpc-foundation/goldens/speech-audio-chunk-acknowledged.json deleted file mode 100644 index 70bea28d688..00000000000 --- a/mobile/rpc-foundation/goldens/speech-audio-chunk-acknowledged.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.audio-chunk", - "family": "speech.dictation-chunk", - "namedDeltas": [], - "values": { - "02cebe6f0062": { - "failures": [], - "pending": 0 - }, - "5133fafc8626": { - "name": "speech.dictation.chunk#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.dictation.chunk" - }, - { - "name": "params", - "value": { - "audioBase64": "ACVKb5S53gM=", - "dictationId": "dictation-1", - "sampleRate": 16000, - "seq": 0 - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "received": true - } - } - } - }, - "70f6f0244686": { - "name": "speech.dictation.chunk#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.chunk\",\"params\":{\"dictationId\":\"dictation-1\",\"audioBase64\":\"ACVKb5S53gM=\",\"sampleRate\":16000,\"seq\":0}}" - }, - "bc459c132276": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": [ - { - "status": "fulfilled", - "value": { - "$rpc": "undefined" - } - } - ] - } - }, - "recording": { - "scenario": "speech-audio-chunk-acknowledged", - "checkpoints": [ - { - "id": "acknowledged", - "observation": { - "sender": ["5133fafc8626"], - "payloads": ["70f6f0244686"], - "settlements": { - "chunk": "bc459c132276" - }, - "state": "02cebe6f0062", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-desktop-start-superseded.json b/mobile/rpc-foundation/goldens/speech-desktop-start-superseded.json deleted file mode 100644 index 7b5aad5f777..00000000000 --- a/mobile/rpc-foundation/goldens/speech-desktop-start-superseded.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.desktop-start", - "family": "speech.dictation-start", - "namedDeltas": [], - "values": { - "4c42677aca21": { - "name": "speech.dictation.start#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.dictation.start" - }, - { - "name": "params", - "value": { - "dictationId": "dictation-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "started": true - } - } - } - }, - "7ed3d39f0607": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": false - }, - "9ab91ee194b8": { - "name": "speech.dictation.cancel#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "speech.dictation.cancel" - }, - { - "name": "params", - "value": { - "dictationId": "dictation-1" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "cancelled": true - } - } - } - }, - "a7ddd021010a": { - "name": "speech.dictation.start#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.start\",\"params\":{\"dictationId\":\"dictation-1\"}}" - }, - "ce9cbc8837fa": { - "name": "speech.dictation.cancel#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.cancel\",\"params\":{\"dictationId\":\"dictation-1\"}}" - }, - "e0fcd8f8c1a9": { - "activeId": { - "$rpc": "null" - }, - "idle": false, - "started": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "speech-desktop-start-superseded", - "checkpoints": [ - { - "id": "stale-start-cancelled", - "observation": { - "sender": ["4c42677aca21", "9ab91ee194b8"], - "payloads": ["a7ddd021010a", "ce9cbc8837fa"], - "settlements": { - "supersede": "eb79a9b3682a", - "start": "7ed3d39f0607" - }, - "state": "e0fcd8f8c1a9", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-dictation-session-cancelled.json b/mobile/rpc-foundation/goldens/speech-dictation-session-cancelled.json deleted file mode 100644 index c69d15c6603..00000000000 --- a/mobile/rpc-foundation/goldens/speech-dictation-session-cancelled.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.dictation-session", - "family": "speech.dictation-session", - "namedDeltas": [], - "values": { - "6b76435b6f3e": { - "error": { - "$rpc": "null" - }, - "status": "idle", - "transcripts": [] - }, - "859d310e63d6": { - "name": "speech.dictation.start#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.start\",\"params\":{\"dictationId\":\"mobile-dictation-1767225600000-8ig2henseon\"}}" - }, - "bd004568e24c": { - "name": "speech.dictation.start#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.dictation.start" - }, - { - "name": "params", - "value": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "started": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ebdac948a90d": { - "name": "speech.dictation.cancel#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.cancel\",\"params\":{\"dictationId\":\"mobile-dictation-1767225600000-8ig2henseon\"}}" - }, - "ed7a0ff994cd": { - "name": "speech.dictation.cancel#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "speech.dictation.cancel" - }, - { - "name": "params", - "value": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "cancelled": true - } - } - } - } - }, - "recording": { - "scenario": "speech-dictation-session-cancelled", - "checkpoints": [ - { - "id": "cancelled", - "observation": { - "sender": ["bd004568e24c", "ed7a0ff994cd"], - "payloads": ["859d310e63d6", "ebdac948a90d"], - "settlements": { - "mount": "eb79a9b3682a", - "start": "eb79a9b3682a", - "cancel": "eb79a9b3682a" - }, - "state": "6b76435b6f3e", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-dictation-session-transcript.json b/mobile/rpc-foundation/goldens/speech-dictation-session-transcript.json deleted file mode 100644 index 570afbc56d9..00000000000 --- a/mobile/rpc-foundation/goldens/speech-dictation-session-transcript.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.dictation-session", - "family": "speech.dictation-session", - "namedDeltas": [], - "values": { - "1bdc94d60271": { - "name": "speech.dictation.finish#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.finish\",\"params\":{\"dictationId\":\"mobile-dictation-1767225600000-8ig2henseon\"}}" - }, - "4728ad10f92b": { - "name": "speech.dictation.finish#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "speech.dictation.finish" - }, - { - "name": "params", - "value": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 75000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "text": " hello world " - } - } - } - }, - "859d310e63d6": { - "name": "speech.dictation.start#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.start\",\"params\":{\"dictationId\":\"mobile-dictation-1767225600000-8ig2henseon\"}}" - }, - "a19279fc9c65": { - "error": { - "$rpc": "null" - }, - "status": "idle", - "transcripts": ["hello world"] - }, - "bd004568e24c": { - "name": "speech.dictation.start#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.dictation.start" - }, - { - "name": "params", - "value": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "started": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "speech-dictation-session-transcript", - "checkpoints": [ - { - "id": "transcribed", - "observation": { - "sender": ["bd004568e24c", "4728ad10f92b"], - "payloads": ["859d310e63d6", "1bdc94d60271"], - "settlements": { - "mount": "eb79a9b3682a", - "start": "eb79a9b3682a", - "stop": "eb79a9b3682a" - }, - "state": "a19279fc9c65", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-setup-sheet-denied-to-mobile.json b/mobile/rpc-foundation/goldens/speech-setup-sheet-denied-to-mobile.json deleted file mode 100644 index 479b08be79d..00000000000 --- a/mobile/rpc-foundation/goldens/speech-setup-sheet-denied-to-mobile.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "namedDeltas": [], - "values": { - "100447f8b483": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Update the paired desktop Orca app to use mobile voice settings.", - "isRpcDeliveryUnknown": false - } - }, - "44136fa355b3": {}, - "4f793e38be31": { - "name": "speech.models.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.models.list\",\"params\":null}" - }, - "9b9e5dcda8ac": { - "name": "speech.models.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.models.list" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "forbidden", - "message": "speech.models.list is not available to mobile clients" - }, - "id": "frame-1", - "ok": false - } - } - } - }, - "recording": { - "scenario": "speech-setup-sheet-denied-to-mobile", - "checkpoints": [ - { - "id": "denied", - "observation": { - "sender": ["9b9e5dcda8ac"], - "payloads": ["4f793e38be31"], - "settlements": { - "list": "100447f8b483" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-setup-sheet-fulfilled.json b/mobile/rpc-foundation/goldens/speech-setup-sheet-fulfilled.json deleted file mode 100644 index 8a0e5e99a5c..00000000000 --- a/mobile/rpc-foundation/goldens/speech-setup-sheet-fulfilled.json +++ /dev/null @@ -1,267 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "namedDeltas": [], - "values": { - "0e61f11d0307": { - "name": "speech.models.delete#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"speech.models.delete\",\"params\":{\"modelId\":\"whisper-small\"}}" - }, - "38ccf3e1658f": { - "name": "speech.dictation.setup#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "speech.dictation.setup" - }, - { - "name": "params", - "value": { - "enabled": true, - "modelId": "whisper-small" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "enabled": true, - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ], - "selectedModelId": "whisper-small" - } - } - } - }, - "4f793e38be31": { - "name": "speech.models.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.models.list\",\"params\":null}" - }, - "694b34cbeee9": { - "name": "speech.models.download#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"speech.models.download\",\"params\":{\"modelId\":\"whisper-small\"}}" - }, - "6c40f11805ec": { - "name": "speech.models.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.models.list" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "enabled": true, - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ], - "selectedModelId": "whisper-small" - } - } - } - }, - "7c5b27891a8f": { - "configure": { - "enabled": true, - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ], - "selectedModelId": "whisper-small" - }, - "delete": { - "enabled": true, - "models": [], - "selectedModelId": "whisper-small" - }, - "download": "started", - "list": { - "enabled": true, - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ], - "selectedModelId": "whisper-small" - } - }, - "a2879fd6371d": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "enabled": true, - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ], - "selectedModelId": "whisper-small" - } - }, - "adbb96fcc08c": { - "name": "speech.models.download#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "speech.models.download" - }, - { - "name": "params", - "value": { - "modelId": "whisper-small" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "started": true - } - } - } - }, - "d8c329a93e43": { - "name": "speech.models.delete#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "speech.models.delete" - }, - { - "name": "params", - "value": { - "modelId": "whisper-small" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "enabled": true, - "models": [], - "selectedModelId": "whisper-small" - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "fba26d61d9d2": { - "name": "speech.dictation.setup#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"speech.dictation.setup\",\"params\":{\"enabled\":true,\"modelId\":\"whisper-small\"}}" - }, - "fc5fb77f49bb": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "enabled": true, - "models": [], - "selectedModelId": "whisper-small" - } - } - }, - "recording": { - "scenario": "speech-setup-sheet-fulfilled", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["6c40f11805ec", "adbb96fcc08c", "d8c329a93e43", "38ccf3e1658f"], - "payloads": ["4f793e38be31", "694b34cbeee9", "0e61f11d0307", "fba26d61d9d2"], - "settlements": { - "list": "a2879fd6371d", - "download": "eb79a9b3682a", - "delete": "fc5fb77f49bb", - "configure": "a2879fd6371d" - }, - "state": "7c5b27891a8f", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-setup-sheet-legacy-desktop.json b/mobile/rpc-foundation/goldens/speech-setup-sheet-legacy-desktop.json deleted file mode 100644 index 53045b2042c..00000000000 --- a/mobile/rpc-foundation/goldens/speech-setup-sheet-legacy-desktop.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "namedDeltas": [], - "values": { - "100447f8b483": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "Update the paired desktop Orca app to use mobile voice settings.", - "isRpcDeliveryUnknown": false - } - }, - "103ab24b6298": { - "name": "speech.models.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.models.list" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "method_not_found", - "message": "Unknown method: speech.models.list" - }, - "id": "frame-1", - "ok": false - } - } - }, - "44136fa355b3": {}, - "4f793e38be31": { - "name": "speech.models.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.models.list\",\"params\":null}" - } - }, - "recording": { - "scenario": "speech-setup-sheet-legacy-desktop", - "checkpoints": [ - { - "id": "legacy-desktop", - "observation": { - "sender": ["103ab24b6298"], - "payloads": ["4f793e38be31"], - "settlements": { - "list": "100447f8b483" - }, - "state": "44136fa355b3", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/speech-setup-sheet-model-vocabulary.json b/mobile/rpc-foundation/goldens/speech-setup-sheet-model-vocabulary.json deleted file mode 100644 index b0f3cd54c7c..00000000000 --- a/mobile/rpc-foundation/goldens/speech-setup-sheet-model-vocabulary.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "namedDeltas": [], - "values": { - "430a60866d83": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "dictationMode": "hold", - "enabled": true, - "models": [ - { - "id": "whisper-small", - "label": "Small", - "progress": 0.42, - "provider": "local", - "recommended": true, - "sizeBytes": 466862080, - "status": "downloading" - }, - { - "id": "gpt-4o-transcribe", - "label": "OpenAI", - "progress": { - "$rpc": "null" - }, - "provider": "openai", - "recommended": false, - "sizeBytes": { - "$rpc": "null" - }, - "status": "ready" - } - ], - "selectedModelId": "gpt-4o-transcribe" - } - }, - "4f793e38be31": { - "name": "speech.models.list#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"speech.models.list\",\"params\":null}" - }, - "d91e455b7326": { - "list": { - "dictationMode": "hold", - "enabled": true, - "models": [ - { - "id": "whisper-small", - "label": "Small", - "progress": 0.42, - "provider": "local", - "recommended": true, - "sizeBytes": 466862080, - "status": "downloading" - }, - { - "id": "gpt-4o-transcribe", - "label": "OpenAI", - "progress": { - "$rpc": "null" - }, - "provider": "openai", - "recommended": false, - "sizeBytes": { - "$rpc": "null" - }, - "status": "ready" - } - ], - "selectedModelId": "gpt-4o-transcribe" - } - }, - "f4bd63aa8e8f": { - "name": "speech.models.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "speech.models.list" - }, - { - "name": "params", - "value": { - "$rpc": "null" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "dictationMode": "hold", - "enabled": true, - "models": [ - { - "id": "whisper-small", - "label": "Small", - "progress": 0.42, - "provider": "local", - "recommended": true, - "sizeBytes": 466862080, - "status": "downloading" - }, - { - "id": "gpt-4o-transcribe", - "label": "OpenAI", - "progress": { - "$rpc": "null" - }, - "provider": "openai", - "recommended": false, - "sizeBytes": { - "$rpc": "null" - }, - "status": "ready" - } - ], - "selectedModelId": "gpt-4o-transcribe" - } - } - } - } - }, - "recording": { - "scenario": "speech-setup-sheet-model-vocabulary", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["f4bd63aa8e8f"], - "payloads": ["4f793e38be31"], - "settlements": { - "list": "430a60866d83" - }, - "state": "d91e455b7326", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-gesture-flush-and-clear.json b/mobile/rpc-foundation/goldens/terminal-gesture-flush-and-clear.json deleted file mode 100644 index 455a9f9c9d3..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-gesture-flush-and-clear.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-gesture-input", - "family": "session.terminal-gesture-input", - "namedDeltas": [], - "values": { - "0cc3e25ebff5": { - "bucketTokens": 63, - "crash": { - "$rpc": "null" - }, - "inFlight": false, - "queuedBytes": { - "$rpc": "null" - }, - "queuedSequences": { - "$rpc": "null" - } - }, - "204da356c8b7": { - "status": "fulfilled", - "startedAt": 16, - "settledAt": 16, - "value": { - "$rpc": "undefined" - } - }, - "3dc7f55dee2a": { - "name": "toast", - "ordinal": 7, - "value": { - "durationMs": { - "$rpc": "null" - }, - "message": "Terminal cleared" - } - }, - "47c387a75ffc": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u001b[<64;10;5M" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 16, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "4b5c402c0aac": { - "name": "terminal.clearBuffer#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "terminal.clearBuffer" - }, - { - "name": "params", - "value": { - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 16 - } - }, - "4d7959cb9208": { - "name": "terminal.clearBuffer#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "terminal.clearBuffer" - }, - { - "name": "params", - "value": { - "terminal": "terminal-1" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 16, - "settledAt": 16, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "clear": { - "cleared": true, - "handle": "terminal-1" - } - } - } - } - }, - "70f80fc43078": { - "name": "terminal-subscribe", - "ordinal": 6, - "value": { - "handle": "terminal-1" - } - }, - "8224ccdb2cd8": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b[<64;10;5M\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "839dec95ae1c": { - "status": "pending", - "startedAt": 16 - }, - "9fa6cd0b7fa0": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u001b[<64;10;5M" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "a8bcca91a365": { - "name": "terminal-unsubscribe", - "ordinal": 5, - "value": { - "handle": "terminal-1" - } - }, - "caa6ece1bdab": { - "bucketTokens": 63, - "crash": { - "$rpc": "null" - }, - "inFlight": true, - "queuedBytes": { - "$rpc": "null" - }, - "queuedSequences": { - "$rpc": "null" - } - }, - "d9c52be2f839": { - "name": "terminal.clearBuffer#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.clearBuffer\",\"params\":{\"terminal\":\"terminal-1\"}}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "terminal-gesture-flush-and-clear", - "checkpoints": [ - { - "id": "queued", - "observation": { - "sender": ["9fa6cd0b7fa0"], - "payloads": ["8224ccdb2cd8"], - "settlements": { - "mount": "eb79a9b3682a", - "gesture": "eb79a9b3682a" - }, - "state": "caa6ece1bdab", - "effects": [] - } - }, - { - "id": "flushing", - "observation": { - "sender": ["9fa6cd0b7fa0"], - "payloads": ["8224ccdb2cd8"], - "settlements": { - "mount": "eb79a9b3682a", - "gesture": "eb79a9b3682a" - }, - "state": "caa6ece1bdab", - "effects": [] - } - }, - { - "id": "sent", - "observation": { - "sender": ["47c387a75ffc"], - "payloads": ["8224ccdb2cd8"], - "settlements": { - "mount": "eb79a9b3682a", - "gesture": "eb79a9b3682a" - }, - "state": "0cc3e25ebff5", - "effects": [] - } - }, - { - "id": "reported", - "observation": { - "sender": ["47c387a75ffc"], - "payloads": ["8224ccdb2cd8"], - "settlements": { - "mount": "eb79a9b3682a", - "gesture": "eb79a9b3682a" - }, - "state": "0cc3e25ebff5", - "effects": [] - } - }, - { - "id": "clearing", - "observation": { - "sender": ["47c387a75ffc", "4b5c402c0aac"], - "payloads": ["8224ccdb2cd8", "d9c52be2f839"], - "settlements": { - "mount": "eb79a9b3682a", - "gesture": "eb79a9b3682a", - "clear": "839dec95ae1c" - }, - "state": "0cc3e25ebff5", - "effects": [] - } - }, - { - "id": "cleared", - "observation": { - "sender": ["47c387a75ffc", "4d7959cb9208"], - "payloads": ["8224ccdb2cd8", "d9c52be2f839"], - "settlements": { - "mount": "eb79a9b3682a", - "gesture": "eb79a9b3682a", - "clear": "204da356c8b7" - }, - "state": "0cc3e25ebff5", - "effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-live-input-accepted.json b/mobile/rpc-foundation/goldens/terminal-live-input-accepted.json deleted file mode 100644 index 85a525a3aca..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-live-input-accepted.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-input-send", - "family": "session.terminal-input-send", - "namedDeltas": [], - "values": { - "13757a453325": { - "crash": { - "$rpc": "null" - }, - "liveAccepted": true - }, - "49c62bc1232e": { - "name": "terminal.send#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "ls" - } - }, - { - "name": "options", - "value": { - "failWhenDisconnected": true - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "727ebf3d264d": { - "name": "terminal.send#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"ls\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "84e5ca07cb7a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": true - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "terminal-live-input-accepted", - "checkpoints": [ - { - "id": "live-sent", - "observation": { - "sender": ["49c62bc1232e"], - "payloads": ["727ebf3d264d"], - "settlements": { - "mount": "eb79a9b3682a", - "live": "84e5ca07cb7a" - }, - "state": "13757a453325", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-paste-accepted.json b/mobile/rpc-foundation/goldens/terminal-paste-accepted.json deleted file mode 100644 index 35ce9daa2f4..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-paste-accepted.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-clipboard", - "family": "session.terminal-paste", - "namedDeltas": [], - "values": { - "26d0fe750677": { - "name": "terminal.send#1", - "ordinal": 6, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b[200~echo hi\\u001b[201~\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "3fb0e93ab6cb": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "settings": { - "terminalCopyTrimsGutter": true - } - } - } - } - }, - "50a1efe07486": { - "name": "terminal.send#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u001b[200~echo hi\u001b[201~" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - } - }, - "528166d1face": { - "connectionId": "unresolved", - "crash": { - "$rpc": "null" - }, - "pasteOutcome": "sent" - }, - "84990d8de7e9": { - "connectionId": "unresolved", - "crash": { - "$rpc": "null" - }, - "pasteOutcome": "unpasted" - }, - "87b511344653": { - "name": "refresh-can-paste", - "ordinal": 7, - "value": {} - }, - "8e065efdacec": { - "name": "flush-live-input", - "ordinal": 4, - "value": { - "handle": "terminal-1" - } - }, - "a4fb8cfbcc58": { - "name": "toast", - "ordinal": 3, - "value": { - "durationMs": { - "$rpc": "null" - }, - "message": "Copied" - } - }, - "c8c77ac17e0a": { - "name": "settings.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "terminal-paste-accepted", - "checkpoints": [ - { - "id": "copied", - "observation": { - "sender": ["3fb0e93ab6cb"], - "payloads": ["c8c77ac17e0a"], - "settlements": { - "mount": "eb79a9b3682a", - "copy": "eb79a9b3682a" - }, - "state": "84990d8de7e9", - "effects": ["a4fb8cfbcc58"] - } - }, - { - "id": "pasted", - "observation": { - "sender": ["3fb0e93ab6cb", "50a1efe07486"], - "payloads": ["c8c77ac17e0a", "26d0fe750677"], - "settlements": { - "mount": "eb79a9b3682a", - "copy": "eb79a9b3682a", - "paste": "eb79a9b3682a" - }, - "state": "528166d1face", - "effects": ["a4fb8cfbcc58", "8e065efdacec", "87b511344653"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-paste-refused.json b/mobile/rpc-foundation/goldens/terminal-paste-refused.json deleted file mode 100644 index f75c5aee66d..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-paste-refused.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-clipboard", - "family": "session.terminal-paste", - "namedDeltas": [], - "values": { - "10a954319977": { - "name": "terminal.send#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "terminal.send" - }, - { - "name": "params", - "value": { - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "enter": false, - "terminal": "terminal-1", - "text": "\u001b[200~echo hi\u001b[201~" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - } - }, - "26d0fe750677": { - "name": "terminal.send#1", - "ordinal": 6, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.send\",\"params\":{\"terminal\":\"terminal-1\",\"text\":\"\\u001b[200~echo hi\\u001b[201~\",\"enter\":false,\"client\":{\"id\":\"device-token-1\",\"type\":\"mobile\"}}}" - }, - "3fb0e93ab6cb": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "settings": { - "terminalCopyTrimsGutter": true - } - } - } - } - }, - "86cf27deee09": { - "name": "toast", - "ordinal": 7, - "value": { - "durationMs": 1500, - "message": "Paste failed" - } - }, - "8e065efdacec": { - "name": "flush-live-input", - "ordinal": 4, - "value": { - "handle": "terminal-1" - } - }, - "a4fb8cfbcc58": { - "name": "toast", - "ordinal": 3, - "value": { - "durationMs": { - "$rpc": "null" - }, - "message": "Copied" - } - }, - "c8c77ac17e0a": { - "name": "settings.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "ebe2af37c0a0": { - "connectionId": "unresolved", - "crash": { - "$rpc": "null" - }, - "pasteOutcome": "error" - } - }, - "recording": { - "scenario": "terminal-paste-refused", - "checkpoints": [ - { - "id": "not-reported", - "observation": { - "sender": ["3fb0e93ab6cb", "10a954319977"], - "payloads": ["c8c77ac17e0a", "26d0fe750677"], - "settlements": { - "mount": "eb79a9b3682a", - "copy": "eb79a9b3682a", - "paste": "eb79a9b3682a" - }, - "state": "ebe2af37c0a0", - "effects": ["a4fb8cfbcc58", "8e065efdacec", "86cf27deee09"] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/terminal-worktree-connection-resolved.json b/mobile/rpc-foundation/goldens/terminal-worktree-connection-resolved.json deleted file mode 100644 index 3e7b855496d..00000000000 --- a/mobile/rpc-foundation/goldens/terminal-worktree-connection-resolved.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.terminal-clipboard", - "family": "session.worktree-connection", - "namedDeltas": [], - "values": { - "3fb0e93ab6cb": { - "name": "settings.get#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "settings": { - "terminalCopyTrimsGutter": true - } - } - } - } - }, - "5a51b87432e2": { - "name": "repo.list#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "repos": [ - { - "connectionId": "ssh-zeta", - "displayName": "zeta", - "id": "repo-z" - }, - { - "connectionId": "ssh-alpha", - "displayName": "alpha", - "id": "repo-a" - } - ] - } - } - } - }, - "c8c77ac17e0a": { - "name": "settings.get#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "d64700b9de3b": { - "name": "repo.list#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "e61132f30b52": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": "ssh-alpha" - }, - "e84b72d7c6fc": { - "connectionId": "ssh-alpha", - "crash": { - "$rpc": "null" - }, - "pasteOutcome": "unpasted" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "terminal-worktree-connection-resolved", - "checkpoints": [ - { - "id": "resolved", - "observation": { - "sender": ["3fb0e93ab6cb", "5a51b87432e2"], - "payloads": ["c8c77ac17e0a", "d64700b9de3b"], - "settlements": { - "mount": "eb79a9b3682a", - "connection": "e61132f30b52" - }, - "state": "e84b72d7c6fc", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/pilot-scenarios.json b/mobile/rpc-foundation/pilot-scenarios.json index 0266dd49296..fc11501f9df 100644 --- a/mobile/rpc-foundation/pilot-scenarios.json +++ b/mobile/rpc-foundation/pilot-scenarios.json @@ -2534,57 +2534,6 @@ } ] }, - { - "id": "sc-review-status-normalized", - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-git-preparation.ts" - ], - "schedules": [], - "steps": [ - { - "action": "status", - "id": "status" - }, - { - "checkpoint": "pending" - }, - { - "complete": "git.status#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "abc1234", - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "area": "staged" - }, - { - "path": "src/new.ts", - "status": "untracked", - "area": "untracked" - } - ], - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-review-status-entries-not-array", "operation": "source-control.review-git-preparation", @@ -2616,38 +2565,6 @@ } ] }, - { - "id": "sc-review-commit", - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-git-preparation.ts" - ], - "schedules": [], - "steps": [ - { - "action": "commit", - "id": "commit" - }, - { - "complete": "git.commit#1", - "params": { - "worktree": "id:repo42::/p", - "message": "recorded message" - }, - "reply": { - "ok": true, - "result": { - "success": true, - "commit": "abc1234" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-review-commit-inner-failure", "operation": "source-control.review-git-preparation", @@ -2680,108 +2597,6 @@ } ] }, - { - "id": "sc-review-commit-refused-empty-message", - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-git-preparation.ts" - ], - "schedules": [], - "steps": [ - { - "action": "commit", - "id": "commit" - }, - { - "complete": "git.commit#1", - "params": { - "worktree": "id:repo42::/p", - "message": "recorded message" - }, - "reply": { - "ok": false, - "error": { - "code": "internal", - "message": "" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-review-commit-rejected", - "operation": "source-control.review-git-preparation", - "family": "git.review-preparation", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-git-preparation.ts" - ], - "schedules": [], - "steps": [ - { - "action": "commit", - "id": "commit" - }, - { - "complete": "git.commit#1", - "params": { - "worktree": "id:repo42::/p", - "message": "recorded message" - }, - "reject": { - "message": "connection lost", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-prerequisite-push", - "operation": "source-control.remote-prerequisite", - "family": "git.remote-prerequisite", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-remote-prerequisite.ts" - ], - "schedules": [], - "steps": [ - { - "action": "apply", - "id": "apply", - "args": { - "blockedReason": "needs_push", - "upstreamStatus": { - "hasUpstream": true, - "ahead": 1, - "behind": 0 - } - } - }, - { - "checkpoint": "pending" - }, - { - "complete": "git.push#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-prerequisite-publish", "operation": "source-control.remote-prerequisite", @@ -7057,372 +6872,6 @@ } ] }, - { - "id": "speech-setup-sheet-fulfilled", - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "sites": ["mobile/src/dictation/mobile-dictation-setup.ts"], - "schedules": [], - "steps": [ - { - "action": "list", - "id": "list" - }, - { - "complete": "speech.models.list#1", - "params": null, - "reply": { - "ok": true, - "result": { - "enabled": true, - "selectedModelId": "whisper-small", - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ] - } - } - }, - { - "action": "download", - "id": "download" - }, - { - "complete": "speech.models.download#1", - "params": { - "modelId": "whisper-small" - }, - "reply": { - "ok": true, - "result": { - "started": true - } - } - }, - { - "action": "delete", - "id": "delete" - }, - { - "complete": "speech.models.delete#1", - "params": { - "modelId": "whisper-small" - }, - "reply": { - "ok": true, - "result": { - "enabled": true, - "selectedModelId": "whisper-small", - "models": [] - } - } - }, - { - "action": "configure", - "id": "configure" - }, - { - "complete": "speech.dictation.setup#1", - "params": { - "enabled": true, - "modelId": "whisper-small" - }, - "reply": { - "ok": true, - "result": { - "enabled": true, - "selectedModelId": "whisper-small", - "models": [ - { - "id": "whisper-small", - "name": "Small", - "status": "ready" - } - ] - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "speech-setup-sheet-model-vocabulary", - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "sites": ["mobile/src/dictation/mobile-dictation-setup.ts"], - "schedules": [], - "steps": [ - { - "action": "list", - "id": "list" - }, - { - "complete": "speech.models.list#1", - "params": null, - "reply": { - "ok": true, - "result": { - "enabled": true, - "selectedModelId": "gpt-4o-transcribe", - "dictationMode": "hold", - "models": [ - { - "id": "whisper-small", - "label": "Small", - "provider": "local", - "status": "downloading", - "sizeBytes": 466862080, - "progress": 0.42, - "recommended": true - }, - { - "id": "gpt-4o-transcribe", - "label": "OpenAI", - "provider": "openai", - "status": "ready", - "sizeBytes": null, - "progress": null, - "recommended": false - } - ] - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "speech-setup-sheet-legacy-desktop", - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "sites": ["mobile/src/dictation/mobile-dictation-setup.ts"], - "schedules": [], - "steps": [ - { - "action": "list", - "id": "list" - }, - { - "complete": "speech.models.list#1", - "params": null, - "reply": { - "ok": false, - "error": { - "code": "method_not_found", - "message": "Unknown method: speech.models.list" - } - } - }, - { - "checkpoint": "legacy-desktop" - } - ] - }, - { - "id": "speech-setup-sheet-denied-to-mobile", - "operation": "speech.setup-sheet", - "family": "speech.setup-sheet", - "sites": ["mobile/src/dictation/mobile-dictation-setup.ts"], - "schedules": [], - "steps": [ - { - "action": "list", - "id": "list" - }, - { - "complete": "speech.models.list#1", - "params": null, - "reply": { - "ok": false, - "error": { - "code": "forbidden", - "message": "speech.models.list is not available to mobile clients" - } - } - }, - { - "checkpoint": "denied" - } - ] - }, - { - "id": "speech-desktop-start-superseded", - "operation": "speech.desktop-start", - "family": "speech.dictation-start", - "sites": ["mobile/src/hooks/mobile-dictation-desktop-start.ts"], - "schedules": [], - "steps": [ - { - "action": "supersede", - "id": "supersede" - }, - { - "action": "start", - "id": "start" - }, - { - "complete": "speech.dictation.start#1", - "params": { - "dictationId": "dictation-1" - }, - "reply": { - "ok": true, - "result": { - "started": true - } - } - }, - { - "complete": "speech.dictation.cancel#1", - "params": { - "dictationId": "dictation-1" - }, - "reply": { - "ok": true, - "result": { - "cancelled": true - } - } - }, - { - "checkpoint": "stale-start-cancelled" - } - ] - }, - { - "id": "speech-audio-chunk-acknowledged", - "operation": "speech.audio-chunk", - "family": "speech.dictation-chunk", - "sites": ["mobile/src/hooks/mobile-dictation-audio-chunk.ts"], - "schedules": [], - "steps": [ - { - "action": "chunk", - "id": "chunk" - }, - { - "complete": "speech.dictation.chunk#1", - "params": { - "audioBase64": "ACVKb5S53gM=", - "dictationId": "dictation-1", - "sampleRate": 16000, - "seq": 0 - }, - "reply": { - "ok": true, - "result": { - "received": true - } - } - }, - { - "checkpoint": "acknowledged" - } - ] - }, - { - "id": "speech-dictation-session-transcript", - "operation": "speech.dictation-session", - "family": "speech.dictation-session", - "sites": ["mobile/src/hooks/use-mobile-dictation.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "start", - "id": "start" - }, - { - "complete": "speech.dictation.start#1", - "params": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - }, - "reply": { - "ok": true, - "result": { - "started": true - } - } - }, - { - "action": "stop", - "id": "stop" - }, - { - "complete": "speech.dictation.finish#1", - "params": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - }, - "reply": { - "ok": true, - "result": { - "text": " hello world " - } - } - }, - { - "checkpoint": "transcribed" - } - ] - }, - { - "id": "speech-dictation-session-cancelled", - "operation": "speech.dictation-session", - "family": "speech.dictation-session", - "sites": ["mobile/src/hooks/use-mobile-dictation.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "start", - "id": "start" - }, - { - "complete": "speech.dictation.start#1", - "params": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - }, - "reply": { - "ok": true, - "result": { - "started": true - } - } - }, - { - "action": "cancel", - "id": "cancel" - }, - { - "complete": "speech.dictation.cancel#1", - "params": { - "dictationId": "mobile-dictation-1767225600000-8ig2henseon" - }, - "reply": { - "ok": true, - "result": { - "cancelled": true - } - } - }, - { - "checkpoint": "cancelled" - } - ] - }, { "id": "aivault-history-scan-worktrees-late", "operation": "aiVault.history-scan", @@ -8430,183 +7879,6 @@ } ] }, - { - "id": "session-tab-activation-focus-and-activate", - "operation": "session.tab-activation", - "family": "session.tab-activation", - "sites": ["mobile/src/session/tabs/mobile-session-tab-activation.ts"], - "schedules": [], - "steps": [ - { - "action": "focus", - "id": "focus" - }, - { - "complete": "terminal.focus#1", - "params": { - "navigation": "host", - "terminal": "terminal-1" - }, - "reply": { - "ok": true, - "result": { - "focused": true - } - } - }, - { - "action": "activate", - "id": "activate" - }, - { - "complete": "session.tabs.activate#1", - "params": { - "intent": "user", - "navigation": "caller", - "notifyClients": false, - "tabId": "tab-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "activated": true - } - } - }, - { - "checkpoint": "activated" - } - ] - }, - { - "id": "session-tab-activation-refused", - "operation": "session.tab-activation", - "family": "session.tab-activation", - "sites": ["mobile/src/session/tabs/mobile-session-tab-activation.ts"], - "schedules": [], - "steps": [ - { - "action": "activate", - "id": "activate" - }, - { - "complete": "session.tabs.activate#1", - "params": { - "intent": "user", - "navigation": "caller", - "notifyClients": false, - "tabId": "tab-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "tab_not_found", - "message": "No such tab" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "session-tab-activation-transport-error", - "operation": "session.tab-activation", - "family": "session.tab-activation", - "sites": ["mobile/src/session/tabs/mobile-session-tab-activation.ts"], - "schedules": [], - "steps": [ - { - "action": "focus", - "id": "focus" - }, - { - "complete": "terminal.focus#1", - "params": { - "navigation": "host", - "terminal": "terminal-1" - }, - "reject": { - "message": "Request timed out" - } - }, - { - "checkpoint": "errored" - } - ] - }, - { - "id": "session-tabs-health-reconciled", - "operation": "session.tabs-stream-health", - "family": "session.tabs-stream-health", - "sites": ["mobile/src/session/tabs/mobile-session-tabs-stream-health.ts"], - "schedules": [], - "steps": [ - { - "action": "activate", - "id": "activate" - }, - { - "action": "reconcile", - "id": "reconcile" - }, - { - "complete": "session.tabs.list#1", - "params": { - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "tabs": [ - { - "id": "tab-1" - } - ] - } - } - }, - { - "checkpoint": "reconciled" - } - ] - }, - { - "id": "session-tabs-health-refused", - "operation": "session.tabs-stream-health", - "family": "session.tabs-stream-health", - "sites": ["mobile/src/session/tabs/mobile-session-tabs-stream-health.ts"], - "schedules": [], - "steps": [ - { - "action": "activate", - "id": "activate" - }, - { - "action": "reconcile", - "id": "reconcile" - }, - { - "complete": "session.tabs.list#1", - "params": { - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "worktree_not_found", - "message": "No such workspace" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, { "id": "session-tabs-health-stale-application-revision", "operation": "session.tabs-stream-health", @@ -8647,36 +7919,6 @@ } ] }, - { - "id": "session-tabs-health-errored", - "operation": "session.tabs-stream-health", - "family": "session.tabs-stream-health", - "sites": ["mobile/src/session/tabs/mobile-session-tabs-stream-health.ts"], - "schedules": [], - "steps": [ - { - "action": "activate", - "id": "activate" - }, - { - "action": "reconcile", - "id": "reconcile" - }, - { - "complete": "session.tabs.list#1", - "params": { - "worktree": "id:workspace-1" - }, - "reject": { - "message": "Connection lost", - "deliveryUnknown": true - } - }, - { - "checkpoint": "errored" - } - ] - }, { "id": "file-tap-opens-worktree-file", "operation": "files.terminal-path-tap", @@ -8813,190 +8055,6 @@ } ] }, - { - "id": "session-markdown-tab-disk-fallback", - "operation": "session.tab-documents", - "family": "session.tab-documents", - "sites": ["mobile/src/files/session-documents/use-mobile-session-document-readers.ts"], - "schedules": [], - "steps": [ - { - "action": "markdown", - "id": "markdown" - }, - { - "complete": "markdown.readTab#1", - "params": { - "tabId": "tab-md", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "renderer_unavailable", - "message": "Renderer unavailable" - } - } - }, - { - "complete": "files.read#1", - "params": { - "relativePath": "docs/readme.md", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "content": "# disk", - "truncated": false, - "byteLength": 6 - } - } - }, - { - "checkpoint": "fell-back" - } - ] - }, - { - "id": "session-terminal-list-merged", - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "sites": ["mobile/src/terminal/session/inventory/use-mobile-session-terminal-list.ts"], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "complete": "terminal.list#1", - "params": { - "includeVisualLayouts": false, - "includePreview": false, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "terminals": [ - { - "handle": "terminal-1", - "title": "one" - }, - { - "handle": "terminal-2", - "title": "two" - } - ] - } - } - }, - { - "checkpoint": "listed" - } - ] - }, - { - "id": "session-terminal-list-dedupes-handles", - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "sites": ["mobile/src/terminal/session/inventory/use-mobile-session-terminal-list.ts"], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "complete": "terminal.list#1", - "params": { - "includeVisualLayouts": false, - "includePreview": false, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "terminals": [ - { - "handle": "terminal-1", - "title": "one" - }, - { - "handle": "terminal-1", - "title": "renamed" - } - ] - } - } - }, - { - "checkpoint": "deduped" - } - ] - }, - { - "id": "session-terminal-list-refused", - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "sites": ["mobile/src/terminal/session/inventory/use-mobile-session-terminal-list.ts"], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "complete": "terminal.list#1", - "params": { - "includeVisualLayouts": false, - "includePreview": false, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "worktree_not_found", - "message": "No such workspace" - } - } - }, - { - "checkpoint": "refused" - } - ] - }, - { - "id": "session-terminal-list-empty-guarded", - "operation": "session.terminal-inventory", - "family": "session.terminal-inventory", - "sites": ["mobile/src/terminal/session/inventory/use-mobile-session-terminal-list.ts"], - "schedules": [], - "steps": [ - { - "action": "no-empty", - "id": "no-empty" - }, - { - "complete": "terminal.list#1", - "params": { - "includeVisualLayouts": false, - "includePreview": false, - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "terminals": [] - } - } - }, - { - "checkpoint": "kept" - } - ] - }, { "id": "native-chat-stop-delivery-unknown", "operation": "session.native-chat-stop", @@ -9134,124 +8192,6 @@ } ] }, - { - "id": "session-tab-close-terminal", - "operation": "session.tab-close", - "family": "session.tab-close", - "sites": ["mobile/src/session/tabs/use-mobile-session-close-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "close-terminal", - "id": "close-terminal" - }, - { - "complete": "terminal.close#1", - "params": { - "terminal": "terminal-1" - }, - "reply": { - "ok": true, - "result": { - "closed": true - } - } - }, - { - "checkpoint": "closed" - } - ] - }, - { - "id": "session-tab-close-refused-keeps-tab", - "operation": "session.tab-close", - "family": "session.tab-close", - "sites": ["mobile/src/session/tabs/use-mobile-session-close-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "close-terminal", - "id": "close-terminal" - }, - { - "complete": "terminal.close#1", - "params": { - "terminal": "terminal-1" - }, - "reply": { - "ok": false, - "error": { - "code": "terminal_not_found", - "message": "No such terminal" - } - } - }, - { - "checkpoint": "kept" - } - ] - }, - { - "id": "session-tab-close-session-tab", - "operation": "session.tab-close", - "family": "session.tab-close", - "sites": ["mobile/src/session/tabs/use-mobile-session-close-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "close-tab", - "id": "close-tab" - }, - { - "complete": "session.tabs.close#1", - "params": { - "reason": "user", - "tabId": "tab-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": true, - "result": { - "closed": true - } - } - }, - { - "checkpoint": "closed" - } - ] - }, - { - "id": "session-tab-close-host-unavailable-tells-user", - "operation": "session.tab-close", - "family": "session.tab-close", - "sites": ["mobile/src/session/tabs/use-mobile-session-close-actions.ts"], - "schedules": [], - "steps": [ - { - "action": "close-tab", - "id": "close-tab" - }, - { - "complete": "session.tabs.close#1", - "params": { - "reason": "user", - "tabId": "tab-1", - "worktree": "id:workspace-1" - }, - "reply": { - "ok": false, - "error": { - "code": "runtime_unavailable", - "message": "runtime_unavailable" - } - } - }, - { - "checkpoint": "kept" - } - ] - }, { "id": "review-mark-reviewed-rolls-back", "operation": "session.diff-review-actions", @@ -9568,238 +8508,6 @@ } ] }, - { - "id": "terminal-paste-accepted", - "operation": "session.terminal-clipboard", - "family": "session.terminal-paste", - "sites": [ - "mobile/src/terminal/session/input-controls/use-mobile-terminal-paste.ts", - "mobile/src/terminal/session/accessory-keys/use-mobile-session-accessory-selection.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "terminalCopyTrimsGutter": true - } - } - } - }, - { - "action": "copy", - "id": "copy", - "args": { - "text": "echo hi" - } - }, - { - "checkpoint": "copied" - }, - { - "action": "paste", - "id": "paste" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "\u001b[200~echo hi\u001b[201~", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "pasted" - } - ] - }, - { - "id": "terminal-paste-refused", - "operation": "session.terminal-clipboard", - "family": "session.terminal-paste", - "sites": ["mobile/src/terminal/session/input-controls/use-mobile-terminal-paste.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "terminalCopyTrimsGutter": true - } - } - } - }, - { - "action": "copy", - "id": "copy", - "args": { - "text": "echo hi" - } - }, - { - "action": "paste", - "id": "paste" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "\u001b[200~echo hi\u001b[201~", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": false - } - } - } - }, - { - "checkpoint": "not-reported" - } - ] - }, - { - "id": "terminal-worktree-connection-resolved", - "operation": "session.terminal-clipboard", - "family": "session.worktree-connection", - "sites": [ - "mobile/src/terminal/session/accessory-keys/use-mobile-session-accessory-selection.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "terminalCopyTrimsGutter": true - } - } - } - }, - { - "action": "connection", - "id": "connection" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-z", - "displayName": "zeta", - "connectionId": "ssh-zeta" - }, - { - "id": "repo-a", - "displayName": "alpha", - "connectionId": "ssh-alpha" - } - ] - } - } - }, - { - "checkpoint": "resolved" - } - ] - }, - { - "id": "terminal-live-input-accepted", - "operation": "session.terminal-input-send", - "family": "session.terminal-input-send", - "sites": [ - "mobile/src/terminal/session/input-controls/use-mobile-session-terminal-send-actions.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "live", - "id": "live", - "args": { - "bytes": "ls" - } - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "ls", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "live-sent" - } - ] - }, { "id": "notifications-display-test-not-registered", "operation": "notifications.display-test-screen", @@ -10776,187 +9484,6 @@ } ] }, - { - "id": "terminal-gesture-flush-and-clear", - "operation": "session.terminal-gesture-input", - "family": "session.terminal-gesture-input", - "sites": ["mobile/src/terminal/session/input-controls/use-mobile-session-terminal-input.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "gesture", - "id": "gesture" - }, - { - "checkpoint": "queued" - }, - { - "advance": 16 - }, - { - "checkpoint": "flushing" - }, - { - "complete": "terminal.send#1", - "params": { - "terminal": "terminal-1", - "text": "\u001b[<64;10;5M", - "enter": false, - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "send": { - "accepted": true - } - } - } - }, - { - "checkpoint": "sent" - }, - { - "checkpoint": "reported" - }, - { - "action": "clear", - "id": "clear" - }, - { - "checkpoint": "clearing" - }, - { - "complete": "terminal.clearBuffer#1", - "params": { - "terminal": "terminal-1" - }, - "reply": { - "ok": true, - "result": { - "clear": { - "handle": "terminal-1", - "cleared": true - } - } - } - }, - { - "checkpoint": "cleared" - } - ] - }, - { - "id": "session-startup-both-activation-sites", - "operation": "session.startup", - "family": "session.startup", - "sites": ["mobile/src/session/use-mobile-session-startup.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "created": "1" - } - }, - { - "checkpoint": "loading" - }, - { - "advance": 1800 - }, - { - "checkpoint": "reactivating" - }, - { - "complete": "worktree.activate#1", - "params": { - "worktree": "id:wt-1", - "notifyClients": false, - "navigation": "caller" - }, - "reply": { - "ok": true, - "result": { - "sleepingAgentWake": "unsupported-headless" - } - } - }, - { - "checkpoint": "reactivated" - }, - { - "advance": 750 - }, - { - "checkpoint": "refreshed" - }, - { - "action": "consume-created-route", - "id": "consume-route" - }, - { - "checkpoint": "activating" - }, - { - "complete": "worktree.activate#2", - "params": { - "worktree": "id:wt-1", - "notifyClients": false, - "navigation": "caller" - }, - "reply": { - "ok": true, - "result": { - "sleepingAgentWake": "unsupported-headless" - } - } - }, - { - "checkpoint": "activated" - }, - { - "advance": 1500 - }, - { - "checkpoint": "reloaded" - } - ] - }, - { - "id": "session-startup-floating-route-skips-activation", - "operation": "session.startup", - "family": "session.startup", - "sites": ["mobile/src/session/use-mobile-session-startup.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "created": "1", - "floating": true - } - }, - { - "checkpoint": "loading" - }, - { - "advance": 2600 - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "session-startup-reopens-with-last-strip", "operation": "session.startup", @@ -11049,87 +9576,6 @@ } ] }, - { - "id": "session-startup-keeps-terminals-visible-on-reconnect", - "operation": "session.startup", - "family": "session.startup", - "sites": ["mobile/src/session/use-mobile-session-startup.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "initialized": ["terminal-0"] - } - }, - { - "checkpoint": "loading" - }, - { - "complete": "worktree.activate#1", - "params": { - "worktree": "id:wt-1", - "notifyClients": false, - "navigation": "caller" - }, - "reply": { - "ok": true, - "result": {} - } - }, - { - "advance": 1500 - }, - { - "checkpoint": "refreshed" - }, - { - "action": "unmount", - "id": "unmount" - }, - { - "checkpoint": "unmounted" - } - ] - }, - { - "id": "session-startup-refused-tab-load-still-loads-terminals", - "operation": "session.startup", - "family": "session.startup", - "sites": ["mobile/src/session/use-mobile-session-startup.ts"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "tabLoadRejects": true - } - }, - { - "checkpoint": "tab-load-refused" - }, - { - "complete": "worktree.activate#1", - "params": { - "worktree": "id:wt-1", - "notifyClients": false, - "navigation": "caller" - }, - "reply": { - "ok": true, - "result": {} - } - }, - { - "advance": 1500 - }, - { - "checkpoint": "refreshed" - } - ] - }, { "id": "session-create-terminal-without-handle", "operation": "session.create-terminal", @@ -11262,117 +9708,6 @@ } ] }, - { - "id": "session-terminal-display-mode-auto-take-floor", - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "sites": [ - "mobile/src/terminal/session/streaming/use-mobile-session-terminal-stream-display.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "deviceToken": "device-token-1", - "viewport": { - "cols": 100, - "rows": 30 - }, - "modes": { - "terminal-1": "desktop" - } - } - }, - { - "action": "toggle", - "id": "toggle", - "args": { - "handle": "terminal-1" - } - }, - { - "checkpoint": "in-flight" - }, - { - "complete": "terminal.setDisplayMode#1", - "params": { - "terminal": "terminal-1", - "mode": "auto", - "client": { - "id": "device-token-1", - "type": "mobile" - }, - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "reply": { - "ok": true, - "result": { - "mode": "auto" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "session-terminal-display-mode-to-desktop", - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "sites": [ - "mobile/src/terminal/session/streaming/use-mobile-session-terminal-stream-display.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "deviceToken": "device-token-1", - "viewport": { - "cols": 100, - "rows": 30 - } - } - }, - { - "action": "toggle", - "id": "toggle", - "args": { - "handle": "terminal-1" - } - }, - { - "checkpoint": "in-flight" - }, - { - "complete": "terminal.setDisplayMode#1", - "params": { - "terminal": "terminal-1", - "mode": "desktop", - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "mode": "desktop" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "session-terminal-display-mode-drops-second-toggle", "operation": "session.terminal-display-mode", @@ -11445,111 +9780,6 @@ } ] }, - { - "id": "session-terminal-display-mode-auto-without-viewport", - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "sites": [ - "mobile/src/terminal/session/streaming/use-mobile-session-terminal-stream-display.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "deviceToken": "device-token-1", - "modes": { - "terminal-1": "desktop" - } - } - }, - { - "action": "toggle", - "id": "toggle", - "args": { - "handle": "terminal-1" - } - }, - { - "checkpoint": "in-flight" - }, - { - "complete": "terminal.setDisplayMode#1", - "params": { - "terminal": "terminal-1", - "mode": "auto", - "client": { - "id": "device-token-1", - "type": "mobile" - } - }, - "reply": { - "ok": true, - "result": { - "mode": "auto" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "session-terminal-display-mode-auto-without-device-token", - "operation": "session.terminal-display-mode", - "family": "session.terminal-display-mode", - "sites": [ - "mobile/src/terminal/session/streaming/use-mobile-session-terminal-stream-display.ts" - ], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount", - "args": { - "viewport": { - "cols": 100, - "rows": 30 - }, - "modes": { - "terminal-1": "desktop" - } - } - }, - { - "action": "toggle", - "id": "toggle", - "args": { - "handle": "terminal-1" - } - }, - { - "checkpoint": "in-flight" - }, - { - "complete": "terminal.setDisplayMode#1", - "params": { - "terminal": "terminal-1", - "mode": "auto", - "viewport": { - "cols": 100, - "rows": 30 - } - }, - "reply": { - "ok": true, - "result": { - "mode": "auto" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "notifications-desktop-stream-closed", "operation": "notifications.desktop-stream", From 3fe2827bc9a88e507b38fe33eca60c533c15c10e Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:06:27 -0800 Subject: [PATCH 07/49] Label Git execution callers, command shapes and priority in traces (#41950) --- src/main/git/command-runner/git-exec-file.ts | 5 +- src/main/git/command-runner/git-spawn.ts | 2 +- .../git/command-runner/git-stream-stdout.ts | 3 +- .../git/refs/snapshot/branch-ref-snapshot.ts | 14 ++++ .../observability/git-execution-spans.test.ts | 73 +++++++++++++++++++ src/main/observability/git-execution-spans.ts | 41 +++++++++++ src/main/observability/git-operation-cause.ts | 1 + 7 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 src/main/observability/git-execution-spans.test.ts diff --git a/src/main/git/command-runner/git-exec-file.ts b/src/main/git/command-runner/git-exec-file.ts index 7500f661e11..d116f2f7b90 100644 --- a/src/main/git/command-runner/git-exec-file.ts +++ b/src/main/git/command-runner/git-exec-file.ts @@ -41,7 +41,7 @@ async function gitExecFileAsyncUnlocked( ): Promise<{ stdout: string; stderr: string }> { // Trace caller intent rather than the resolved binary so WSL and native commands group together. return withGitSpan( - { args, ...(options.cwd !== undefined ? { cwd: options.cwd } : {}) }, + { args, cwd: options.cwd, admissionTier: options.admissionTier }, async (span) => { if (options.onStderr && options.terminationBarrier) { throw new Error('onStderr is not supported with terminationBarrier.') @@ -225,7 +225,8 @@ async function gitExecFileAsyncBufferInSpan( args: string[], options: GitBufferExecOptions ): Promise<{ stdout: Buffer }> { - return withGitSpan({ args, cwd: options.cwd }, async (span) => { + const meta = { args, cwd: options.cwd, admissionTier: options.admissionTier } + return withGitSpan(meta, async (span) => { const checkoutRoutingReady = pendingWslDriveCheckoutGitRouting(args, options) if (checkoutRoutingReady) { await checkoutRoutingReady diff --git a/src/main/git/command-runner/git-spawn.ts b/src/main/git/command-runner/git-spawn.ts index af7ec64214f..a8eae4ab821 100644 --- a/src/main/git/command-runner/git-spawn.ts +++ b/src/main/git/command-runner/git-spawn.ts @@ -69,7 +69,7 @@ export async function withGitAdmission( if (admission) { await admission } - const span = startGitSpan({ args, cwd: options.cwd }) + const span = startGitSpan({ args, cwd: options.cwd, admissionTier: options.admissionTier }) let grant: Awaited> | null = null try { grant = await acquireGitAdmission({ diff --git a/src/main/git/command-runner/git-stream-stdout.ts b/src/main/git/command-runner/git-stream-stdout.ts index 61873b9602e..46234e2a943 100644 --- a/src/main/git/command-runner/git-stream-stdout.ts +++ b/src/main/git/command-runner/git-stream-stdout.ts @@ -69,7 +69,8 @@ function streamInSpan( maxBuffer: number, timeoutMs: number | undefined ): Promise { - return withGitSpan({ args, cwd: options.cwd }, async (span) => { + const meta = { args, cwd: options.cwd, admissionTier: options.admissionTier } + return withGitSpan(meta, async (span) => { const checkoutRoutingReady = pendingWslDriveCheckoutGitRouting(args, options) if (checkoutRoutingReady) { await checkoutRoutingReady diff --git a/src/main/git/refs/snapshot/branch-ref-snapshot.ts b/src/main/git/refs/snapshot/branch-ref-snapshot.ts index 71317810d8e..c58194294e9 100644 --- a/src/main/git/refs/snapshot/branch-ref-snapshot.ts +++ b/src/main/git/refs/snapshot/branch-ref-snapshot.ts @@ -9,6 +9,7 @@ import { import { BranchRefSnapshotStore, BranchSnapshotIdentityChanged } from './branch-ref-snapshot-store' import { subscribeGitRefChanges } from '../git-ref-change-signal' import { readTranslatedWorktreeGraph } from '../../worktrees/catalog/worktree-list-reader' +import { withRepositoryGitCause } from '../../repository-git-cause' const snapshots = new BranchRefSnapshotStore({ subscribe: subscribeGitRefChanges }) @@ -16,6 +17,19 @@ async function withIdentity( path: string, git: LocalGitExecOptions, read: (identity: BranchSnapshotIdentity) => Promise +): Promise { + return withRepositoryGitCause( + path, + git, + { family: 'refs', reason: 'branch-snapshot', cache: 'uncached' }, + () => readWithIdentity(path, git, read) + ) +} + +async function readWithIdentity( + path: string, + git: LocalGitExecOptions, + read: (identity: BranchSnapshotIdentity) => Promise ): Promise { for (let attempt = 0; attempt < 2; attempt++) { const identity = await resolveBranchSnapshotIdentity(path, git) diff --git a/src/main/observability/git-execution-spans.test.ts b/src/main/observability/git-execution-spans.test.ts new file mode 100644 index 00000000000..c740a49585c --- /dev/null +++ b/src/main/observability/git-execution-spans.test.ts @@ -0,0 +1,73 @@ +import { afterEach, expect, it } from 'vitest' +import { createGitOperationExecutor } from '../git/command-runner/admission/git-operation-executor' +import { runWithGitCause } from './git-operation-cause' +import { startGitSpan, withGitSpan, _resetGitSpanSamplingForTests } from './git-execution-spans' +import { setActiveSink } from './tracer' + +afterEach(() => { + setActiveSink(null) + _resetGitSpanSamplingForTests() +}) + +it('attributes scoped Git intent without retaining argv operands in its shape', async () => { + const records: unknown[] = [] + setActiveSink({ push: (record) => records.push(record), flush() {}, close() {} }) + await createGitOperationExecutor('background').run(() => + runWithGitCause( + { family: 'catalog', reason: 'desktop-catalog', cache: 'miss' }, + undefined, + () => + withGitSpan( + { + args: [ + '-C', + '/private/repo', + '-c', + 'key=private-value', + 'worktree', + 'list', + '--porcelain', + '-z' + ] + }, + async () => undefined + ) + ) + ) + await withGitSpan( + { args: ['commit', '-mprivate-message', '--', '--private-file'], admissionTier: 'interactive' }, + async () => undefined + ) + await runWithGitCause( + { family: 'refs', reason: 'branch-snapshot', cache: 'uncached' }, + undefined, + async () => startGitSpan({ args: ['diff', '--output=/private/output', '--', 'file'] }).end() + ) + expect(records).toEqual([ + expect.objectContaining({ + attributes: expect.objectContaining({ + 'git.caller': 'desktop-catalog', + 'git.argv_shape': 'worktree list --porcelain', + 'git.admission_tier': 'background', + 'git.foreground': false + }) + }), + expect.objectContaining({ + attributes: expect.objectContaining({ + 'git.caller': 'unattributed', + 'git.argv_shape': 'commit -m', + 'git.admission_tier': 'interactive', + 'git.foreground': true + }) + }), + expect.objectContaining({ + attributes: expect.objectContaining({ + 'git.caller': 'branch-snapshot', + 'git.argv_shape': 'diff --output', + 'git.admission_tier': 'status', + 'git.foreground': 'unknown' + }) + }) + ]) + expect(JSON.stringify(records)).not.toMatch(/private|key=/) +}) diff --git a/src/main/observability/git-execution-spans.ts b/src/main/observability/git-execution-spans.ts index 08d17ca266b..8f93bdd9619 100644 --- a/src/main/observability/git-execution-spans.ts +++ b/src/main/observability/git-execution-spans.ts @@ -1,5 +1,12 @@ import { hasActiveTraceSink, startSpan, withSpan, type ActiveSpan } from './tracer' import { getGitOperationCause } from './git-operation-cause' +import { resolveGitAdmissionTier } from '../git/command-runner/admission/git-operation-executor' +import type { GitAdmissionTier } from '../../shared/rpc-contract/git-admission-tier-params' + +const GIT_ACTION_NAMES: Record = { + worktree: ['list', 'add', 'remove', 'move', 'prune', 'lock', 'unlock', 'repair'], + remote: ['get-url', 'set-url', 'add', 'remove', 'rename', 'show'] +} const GIT_FAST_SUCCESS_THRESHOLD_MS = 250 const GIT_FAST_SUCCESS_WINDOW_MS = 60_000 @@ -77,6 +84,34 @@ function gitSubcommandFromArgs(args: readonly string[]): string { return args[gitSubcommandIndex(args)] ?? '' } +function gitArgvShape(args: readonly string[]): string { + const index = gitSubcommandIndex(args) + if (index < 0) { + return '' + } + const subcommand = args[index] ?? '' + let name = /^[a-z][a-z0-9-]*$/.test(subcommand) ? subcommand : '' + const action = args[index + 1] + if ( + Object.hasOwn(GIT_ACTION_NAMES, subcommand) && + GIT_ACTION_NAMES[subcommand].includes(action) + ) { + name += ` ${action}` + } + for (let i = index + 1; i < args.length; i++) { + const arg = args[i] + if (arg === '--') { + break + } + // Discard option values, including attached short-option operands. + const flag = /^(--[a-z][a-z0-9-]*)(?:=|$)/.exec(arg)?.[1] ?? /^(-[a-zA-Z])/.exec(arg)?.[1] + if (flag) { + return `${name} ${flag}` + } + } + return name +} + function gitCommandVariant(args: readonly string[]): string { const index = gitSubcommandIndex(args) switch (args[index]) { @@ -177,6 +212,11 @@ function addGitAttributes(span: ActiveSpan, meta: GitSpanArgs): void { span.setAttribute('git.arg_count', meta.args.length) span.setAttribute('git.variant', gitCommandVariant(meta.args)) const cause = getGitOperationCause() + span.setAttribute('git.caller', cause?.reason ?? 'unattributed') + span.setAttribute('git.argv_shape', gitArgvShape(meta.args)) + const tier = resolveGitAdmissionTier(meta.admissionTier) + span.setAttribute('git.admission_tier', tier) + span.setAttribute('git.foreground', tier === 'status' ? 'unknown' : tier === 'interactive') if (cause) { span.setAttribute('git.operation', cause.family) span.setAttribute('git.reason', cause.reason) @@ -199,6 +239,7 @@ export function _gitSpanSamplingBucketCountForTests(): number { export type GitSpanArgs = { readonly args: readonly string[] readonly cwd?: string + readonly admissionTier?: GitAdmissionTier } export async function withGitSpan( diff --git a/src/main/observability/git-operation-cause.ts b/src/main/observability/git-operation-cause.ts index 5d1ea7198e0..c19279483ee 100644 --- a/src/main/observability/git-operation-cause.ts +++ b/src/main/observability/git-operation-cause.ts @@ -10,6 +10,7 @@ export type GitOperationCause = { | 'worktree-scan' | 'creation-base-refresh' | 'branch-search' + | 'branch-snapshot' | 'status-read' | 'remote-fetch' | 'base-refresh' From 1fe195557874a7704fbf362305590069162c49d9 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:07:42 -0800 Subject: [PATCH 08/49] Save complete macOS freeze diagnostics automatically (#41532) * Keep complete bounded native hang reports * Fix hang capture validation fixtures and catalog * Clarify freeze report submission failures * Capture freezes silently and enrich existing diagnostics event --- .../crash-feedback-diagnostic-bundle.ts | 12 +- .../reports/crash-report-store.ts | 50 +++- .../hang-watchdog-worker-protocol.ts | 4 + .../main-thread-hang-capture.test.ts | 79 +++++- .../main-thread-hang-watchdog-entry.ts | 90 ++----- .../main-thread-hang-watchdog.ts | 18 +- .../native-hang-artifact.test.ts | 246 ++++++++++++++++++ .../native-hang-capture-store.ts | 178 +++++++++++++ src/main/hang-watchdog/native-hang-capture.ts | 29 ++- src/main/hang-watchdog/native-hang-report.ts | 140 ++++++++++ .../previous-native-hang-report.ts | 45 ++++ .../previous-native-hang-telemetry.ts | 41 +++ .../hang-watchdog/watchdog-hang-capture.ts | 137 ++++++++++ .../crash-reporting-sendable-reports.ts | 8 +- .../crash-reporting-submission.ts | 5 +- .../ipc/crash-reporting/crash-reporting.ts | 17 +- src/main/observability/bundle.ts | 20 +- src/main/observability/index.ts | 22 +- src/main/startup/main-process-observers.ts | 22 +- .../startup/main-process-ready-foundation.ts | 4 +- .../CrashReportDialogSurface.test.tsx | 68 +++++ .../crash-report/CrashReportDialogSurface.tsx | 121 +++------ .../crash-report/crash-report-dialog-copy.ts | 94 +++++++ .../crash-report-submit-notice.ts | 71 +++-- src/renderer/src/i18n/locales/en.json | 15 ++ src/shared/telemetry-daemon-event-schemas.ts | 9 +- 26 files changed, 1330 insertions(+), 215 deletions(-) create mode 100644 src/main/hang-watchdog/native-hang-artifact.test.ts create mode 100644 src/main/hang-watchdog/native-hang-capture-store.ts create mode 100644 src/main/hang-watchdog/native-hang-report.ts create mode 100644 src/main/hang-watchdog/previous-native-hang-report.ts create mode 100644 src/main/hang-watchdog/previous-native-hang-telemetry.ts create mode 100644 src/main/hang-watchdog/watchdog-hang-capture.ts create mode 100644 src/renderer/src/components/crash-report/CrashReportDialogSurface.test.tsx create mode 100644 src/renderer/src/components/crash-report/crash-report-dialog-copy.ts diff --git a/src/main/crash-reporting/reports/crash-feedback-diagnostic-bundle.ts b/src/main/crash-reporting/reports/crash-feedback-diagnostic-bundle.ts index 2072224c13f..5b5a05b2172 100644 --- a/src/main/crash-reporting/reports/crash-feedback-diagnostic-bundle.ts +++ b/src/main/crash-reporting/reports/crash-feedback-diagnostic-bundle.ts @@ -27,7 +27,9 @@ function skippedCrashDiagnosticBundle(): CrashDiagnosticBundleAttachment { } } -async function collectCrashDiagnosticBundleAttachment(): Promise { +async function collectCrashDiagnosticBundleAttachment( + nativeHangCaptureId?: string +): Promise { const status = getDiagnosticsStatus() if (!status.bundleEnabled) { return { @@ -47,7 +49,8 @@ async function collectCrashDiagnosticBundleAttachment(): Promise { return includeDiagnosticLogs - ? collectCrashDiagnosticBundleAttachment() + ? collectCrashDiagnosticBundleAttachment(nativeHangCaptureId) : skippedCrashDiagnosticBundle() } diff --git a/src/main/crash-reporting/reports/crash-report-store.ts b/src/main/crash-reporting/reports/crash-report-store.ts index a5e22e0adf0..ad6d26b14b7 100644 --- a/src/main/crash-reporting/reports/crash-report-store.ts +++ b/src/main/crash-reporting/reports/crash-report-store.ts @@ -92,16 +92,7 @@ export class CrashReportStore { async record(input: CrashReportCreateInput): Promise { return this.withWrite(async (reports) => { - const report: CrashReportRecord = { - ...input, - id: crypto.randomUUID(), - createdAt: new Date().toISOString(), - status: 'pending', - details: sanitizeCrashReportDetails(input.details), - breadcrumbs: sanitizeCrashReportBreadcrumbs(input.breadcrumbs)?.map( - ({ origin: _origin, ...breadcrumb }) => breadcrumb - ) - } + const report = this.createRecord(input) return { reports: [report, ...reports].slice(0, MAX_REPORTS), result: report @@ -109,6 +100,41 @@ export class CrashReportStore { }) } + async importHangReport(input: CrashReportCreateInput): Promise { + return this.withWrite(async (reports) => { + const existing = reports.find( + (report) => + report.reason === 'main-thread-hang' && + report.details.captureId === input.details.captureId + ) + if (existing) { + return { reports, result: existing } + } + if ( + reports.some( + (report) => report.status === 'pending' && report.reason !== 'main-thread-hang' + ) + ) { + return { reports, result: null } + } + const report: CrashReportRecord = { ...this.createRecord(input), status: 'dismissed' } + return { reports: [report, ...reports].slice(0, MAX_REPORTS), result: report } + }) + } + + private createRecord(input: CrashReportCreateInput): CrashReportRecord { + return { + ...input, + id: crypto.randomUUID(), + createdAt: new Date().toISOString(), + status: 'pending', + details: sanitizeCrashReportDetails(input.details), + breadcrumbs: sanitizeCrashReportBreadcrumbs(input.breadcrumbs)?.map( + ({ origin: _origin, ...breadcrumb }) => breadcrumb + ) + } + } + /** Crashpad may finish writing after process-gone; merge its signature into the existing report. */ async attachDetails( id: string, @@ -203,7 +229,9 @@ export class CrashReportStore { // Reading directly avoids waiting on the write chain this callback already owns. const reports = await this.readReportsFromDisk() const { reports: nextReports, result } = await mutate(reports) - await this.writeReports(nextReports) + if (nextReports !== reports) { + await this.writeReports(nextReports) + } return result }) this.writeChain = run.then( diff --git a/src/main/hang-watchdog/hang-watchdog-worker-protocol.ts b/src/main/hang-watchdog/hang-watchdog-worker-protocol.ts index b731d1fa6d2..8668760ebac 100644 --- a/src/main/hang-watchdog/hang-watchdog-worker-protocol.ts +++ b/src/main/hang-watchdog/hang-watchdog-worker-protocol.ts @@ -1,6 +1,7 @@ export const HANG_WATCHDOG_HEARTBEAT_INTERVAL_MS = 2_000 export const HANG_WATCHDOG_TIMEOUT_MS = 45_000 export const HANG_WATCHDOG_CHECK_INTERVAL_MS = 5_000 +import type { NativeHangProcessMetadata } from './native-hang-report' export type HangWatchdogWorkerData = { parentPid: number @@ -8,12 +9,15 @@ export type HangWatchdogWorkerData = { timeoutMs: number checkIntervalMs: number tracePath?: string + artifactDirectory?: string + processMetadata?: NativeHangProcessMetadata } export type MainToHangWatchdogWorkerMessage = | { type: 'heartbeat' } | { type: 'shutdown' } | { type: 'capture-drain-ack'; token: string } + | { type: 'menu-bar-setting'; enabled: boolean } | { type: 'power-event'; event: HangPowerReceipt['event']; observedAt: number } import type { HangPowerReceipt } from './hang-observations' diff --git a/src/main/hang-watchdog/main-thread-hang-capture.test.ts b/src/main/hang-watchdog/main-thread-hang-capture.test.ts index 3d8bb430345..627fce1591a 100644 --- a/src/main/hang-watchdog/main-thread-hang-capture.test.ts +++ b/src/main/hang-watchdog/main-thread-hang-capture.test.ts @@ -5,6 +5,9 @@ const state = vi.hoisted(() => ({ clock: 0, delayedWrite: false, rejectRunner: false, + parkedStop: false, + successfulNative: false, + artifacts: new Array<{ showMenuBarIcon: boolean | null }>(), commands: new Array(), terminations: new Array<() => void>(), records: new Array() @@ -14,8 +17,16 @@ vi.mock('node:inspector', () => ({ Session: class { connectToMainThread() {} disconnect() {} - post(method: string, _params: unknown, response: (error: null, result?: unknown) => void) { + post( + method: string, + _params: unknown, + response: (error: Error | null, result?: unknown) => void + ) { state.commands.push(method) + if (method === 'Profiler.stop' && state.parkedStop) { + response(new Error('uncertain inspector transport')) + return + } response( null, method === 'Profiler.stop' @@ -31,9 +42,22 @@ vi.mock('@orca/process-host', () => ({ if (state.rejectRunner) { throw new Error('runner rejected after possible acquisition') } + if (state.successfulNative) { + options.onChildTerminated() + return { stdout: 'native evidence', stderr: '', code: 0, timedOut: false } + } return { stdout: '', stderr: '', code: null, timedOut: true } } })) +vi.mock('./native-hang-capture-store', () => ({ + createNativeHangCaptureId: (time: number) => `hang-${time}`, + NativeHangCaptureStore: class { + async save(artifact: { showMenuBarIcon: boolean | null }) { + state.artifacts.push(structuredClone(artifact)) + } + async recover() {} + } +})) vi.mock('./hang-detection-marker', () => ({ readAvailableHangDetectionMarker: () => null, writeHangDetectionMarker: (_path: string, record: unknown) => { @@ -53,6 +77,9 @@ beforeEach(() => { state.clock = 0 state.delayedWrite = false state.rejectRunner = false + state.parkedStop = false + state.successfulNative = false + state.artifacts = [] state.commands = [] state.terminations = [] state.records = [] @@ -75,6 +102,15 @@ function watchdog() { { parentPid: 123, markerPath: '/qa/main-thread-hang.json', + artifactDirectory: '/qa/captures', + processMetadata: { + appVersion: '1', + electronVersion: '43', + chromeVersion: '150', + arch: 'arm64', + osRelease: '25', + osVersion: 'Darwin' + }, timeoutMs: 100, checkIntervalMs: 25 }, @@ -124,7 +160,7 @@ it.each([false, true])( await vi.advanceTimersByTimeAsync(125) await vi.dynamicImportSettled() expect(state.records.at(-1)).toMatchObject({ - observations: [expect.anything(), expect.not.objectContaining({ mainJs: expect.anything() })] + observations: [expect.anything(), expect.not.objectContaining({ native: expect.anything() })] }) owner.send({ type: 'heartbeat' }) state.terminations.shift()?.() @@ -153,3 +189,42 @@ it.each([false, true])( owner.send({ type: 'shutdown' }) } ) + +it('captures a later native episode while the earlier inspector cleanup remains uncertain', async () => { + state.parkedStop = true + const owner = watchdog() + await vi.advanceTimersByTimeAsync(125) + await vi.dynamicImportSettled() + state.terminations.shift()?.() + owner.send({ type: 'heartbeat' }) + await vi.dynamicImportSettled() + await vi.advanceTimersByTimeAsync(125) + await vi.dynamicImportSettled() + expect(state.records.at(-1)).toMatchObject({ + observations: [ + expect.objectContaining({ mainJs: expect.objectContaining({ state: 'failed' }) }), + expect.objectContaining({ native: expect.objectContaining({ state: 'completed' }) }) + ] + }) + owner.send({ type: 'shutdown' }) +}) + +it('snapshots only the setting actually received before each episode', async () => { + state.successfulNative = true + const owner = watchdog() + await vi.advanceTimersByTimeAsync(125) + await vi.dynamicImportSettled() + owner.send({ type: 'heartbeat' }) + owner.send({ type: 'menu-bar-setting', enabled: false }) + await vi.dynamicImportSettled() + await vi.advanceTimersByTimeAsync(125) + await vi.dynamicImportSettled() + owner.send({ type: 'menu-bar-setting', enabled: true }) + expect(state.artifacts.map((item) => item.showMenuBarIcon)).toEqual([null, false]) + owner.send({ type: 'heartbeat' }) + await vi.dynamicImportSettled() + await vi.advanceTimersByTimeAsync(125) + await vi.dynamicImportSettled() + expect(state.artifacts.map((item) => item.showMenuBarIcon)).toEqual([null, false, true]) + owner.send({ type: 'shutdown' }) +}) diff --git a/src/main/hang-watchdog/main-thread-hang-watchdog-entry.ts b/src/main/hang-watchdog/main-thread-hang-watchdog-entry.ts index 94cc8e897db..17b2d976b1b 100644 --- a/src/main/hang-watchdog/main-thread-hang-watchdog-entry.ts +++ b/src/main/hang-watchdog/main-thread-hang-watchdog-entry.ts @@ -12,6 +12,7 @@ import { type HangPowerReceipt } from './hang-observations' import { captureHangSnapshot } from './hang-snapshot' +import { createWatchdogHangCapture } from './watchdog-hang-capture' import type { HangWatchdogWorkerData, MainToHangWatchdogWorkerMessage @@ -22,13 +23,6 @@ type HangWatchdogPort = { close: () => void postMessage?: (message: { type: 'capture-drain'; token: string }) => void } -type CaptureOwner = { - id: string - reason?: 'recovery' | 'shutdown' - stopJs?: (reason: 'recovery' | 'shutdown') => void - stopNative?: () => void - done?: Promise -} export function runWatchdog( config: HangWatchdogWorkerData, @@ -43,7 +37,7 @@ export function runWatchdog( let sequence = 0 let activeStallId: string | null = null let stopped = false - let captureOwner: CaptureOwner | null = null + let showMenuBarIcon: boolean | null = null let drain: { token: string; acknowledge: () => void } | null = null let collector: AbortController | null = null let recentPower: HangPowerReceipt[] = [] @@ -80,55 +74,18 @@ export function runWatchdog( observations = retainHangObservation(observations, { ...record, ...change }) save() } - const capture = (record: HangObservation, detectedAt: number): void => { - if (isMainThread || captureOwner || stopped || record.kind !== 'heartbeat-stall') { - return - } - const owner: CaptureOwner = { id: record.id } - captureOwner = owner - owner.done = (async () => { - const [inspector, js, native] = await Promise.all([ - import('node:inspector'), - import('./main-js-hang-capture'), - import('./native-hang-capture') - ]) - const mainJs = js.captureMainJsHang({ - session: new inspector.Session(), - detectedAt, - now: () => performance.now(), - publish: (mainJs) => update(record.id, { mainJs }), - drain: () => - new Promise((resolve) => { - drain = { token: record.id, acknowledge: resolve } - port.postMessage?.({ type: 'capture-drain', token: record.id }) - }) - }) - owner.stopJs = mainJs.stop - if (owner.reason) { - mainJs.stop(owner.reason) - } - const nativeCapture = - !owner.reason && process.platform === 'darwin' - ? native.captureNativeHang({ - pid: config.parentPid, - publish: (native) => update(record.id, { native }) - }) - : null - owner.stopNative = nativeCapture?.stop - await Promise.all([mainJs.done, nativeCapture?.done]) - })() - .catch(() => { - // A published baseline remains useful if an optional collector cannot initialize. - }) - .finally(() => { - if (captureOwner === owner) { - captureOwner = null - } - if (stopped) { - port.close() - } - }) - } + const captures = createWatchdogHangCapture({ + parentPid: config.parentPid, + artifactDirectory: config.artifactDirectory, + processMetadata: config.processMetadata, + publish: update, + drain: (token) => + new Promise((resolve) => { + drain = { token, acknowledge: resolve } + port.postMessage?.({ type: 'capture-drain', token }) + }), + onIdle: () => port.close() + }) const openReceiptWindow = (id: string): void => { receiptWindow = { id, until: Date.now() + config.checkIntervalMs, remaining: 4 } } @@ -204,7 +161,9 @@ export function runWatchdog( } openReceiptWindow(record.id) save() - capture(record, detectedAt) + if (!isMainThread) { + captures.capture(record, detectedAt, showMenuBarIcon) + } enrich(record) } const loop = createHangWatchdogDetectionLoop({ @@ -218,10 +177,7 @@ export function runWatchdog( } const id = activeStallId activeStallId = null - if (captureOwner?.id === id) { - captureOwner.reason ??= 'recovery' - captureOwner.stopJs?.('recovery') - } + captures.recover(id) update(id, { selfRecovered: true, resolution: captureHangSnapshot() }) openReceiptWindow(id) }, @@ -254,6 +210,8 @@ export function runWatchdog( } if (message.type === 'heartbeat') { loop.recordHeartbeat() + } else if (message.type === 'menu-bar-setting') { + showMenuBarIcon = message.enabled } else if (message.type === 'power-event') { const receipt = parsePowerReceipt({ ...message, receivedAt: Date.now() }) if (!receipt) { @@ -281,13 +239,7 @@ export function runWatchdog( receiptWindow = null clearInterval(checkTimer) collector?.abort() - if (captureOwner) { - captureOwner.reason ??= 'shutdown' - captureOwner.stopJs?.('shutdown') - captureOwner.stopNative?.() - } else { - port.close() - } + captures.shutdown() } }) } diff --git a/src/main/hang-watchdog/main-thread-hang-watchdog.ts b/src/main/hang-watchdog/main-thread-hang-watchdog.ts index 502a133639f..8dac63f5c83 100644 --- a/src/main/hang-watchdog/main-thread-hang-watchdog.ts +++ b/src/main/hang-watchdog/main-thread-hang-watchdog.ts @@ -1,9 +1,11 @@ import type { Worker } from 'node:worker_threads' +import os from 'node:os' import { spawnWorkerThread } from '../worker-threads/worker-thread-spawn' import { app, powerMonitor } from 'electron' import { hangDetectionMarkerPath } from './hang-detection-marker' import { resolveHangWatchdogWorkerPath } from './hang-watchdog-worker-path' import { getTraceFilePath, resolveObservabilityConsent } from '../observability' +import { nativeHangCaptureDirectory } from './native-hang-capture-store' import { HANG_WATCHDOG_CHECK_INTERVAL_MS, HANG_WATCHDOG_HEARTBEAT_INTERVAL_MS, @@ -16,6 +18,7 @@ import { export type MainThreadHangWatchdogHandle = { stop: () => void worker: Worker + setMenuBarIconSetting: (enabled: boolean) => void } function positiveTiming(value: string | undefined, fallback: number): number { @@ -41,6 +44,15 @@ export function installMainThreadHangWatchdog(options: { parentPid: process.pid, markerPath: hangDetectionMarkerPath(options.userDataPath), tracePath: getTraceFilePath(), + artifactDirectory: nativeHangCaptureDirectory(options.userDataPath), + processMetadata: { + appVersion: app.getVersion(), + electronVersion: process.versions.electron ?? 'unknown', + chromeVersion: process.versions.chrome ?? 'unknown', + arch: os.arch(), + osRelease: os.release(), + osVersion: os.version() + }, timeoutMs: positiveTiming(process.env.ORCA_HANG_WATCHDOG_TIMEOUT_MS, HANG_WATCHDOG_TIMEOUT_MS), checkIntervalMs: positiveTiming( process.env.ORCA_HANG_WATCHDOG_CHECK_INTERVAL_MS, @@ -117,5 +129,9 @@ export function installMainThreadHangWatchdog(options: { }) worker.unref() app.on('will-quit', stop) - return { stop, worker } + return { + stop, + worker, + setMenuBarIconSetting: (enabled) => postMessage({ type: 'menu-bar-setting', enabled }) + } } diff --git a/src/main/hang-watchdog/native-hang-artifact.test.ts b/src/main/hang-watchdog/native-hang-artifact.test.ts new file mode 100644 index 00000000000..c69d2084a64 --- /dev/null +++ b/src/main/hang-watchdog/native-hang-artifact.test.ts @@ -0,0 +1,246 @@ +import fs from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, expect, it, vi } from 'vitest' +import { CrashReportStore } from '../crash-reporting/reports/crash-report-store' +import { createPreviousNativeHangReport } from './previous-native-hang-report' +import { + NativeHangCaptureStore, + nativeHangCaptureDirectory, + readNativeHangCapture, + readPreviousNativeHangCapture +} from './native-hang-capture-store' +import { sanitizeNativeHangReport, type NativeHangArtifact } from './native-hang-report' +import { readPreviousNativeHangTelemetry } from './previous-native-hang-telemetry' +import { mainThreadHangDetectedSchema } from '../../shared/telemetry-daemon-event-schemas' +import { getLatestPendingReport } from '../ipc/crash-reporting/crash-reporting-sendable-reports' +import { collectBundle } from '../observability/bundle' + +const sample = `Sampling process 123 for 1 second with 10 milliseconds of run time between samples +Process: Orca [123] +Path: /Users/Test User/Secret Project/Orca.app/Contents/MacOS/Orca +Analysis Tool: /Users/Test User/Private Tools/sample +OS Version: macOS 26.1 (25B78) +Call graph: + 100 Thread_1 DispatchQueue_1: com.apple.main-thread (serial) + + 100 nativeWait (in Orca) + 12 [0x10000000c] + 100 Thread_42 background-worker + + 100 backgroundWork (in /Users/Test User/Private (Client List)/Worker) + 8 [0x100100008] +Total number in stack (recursive counted multiple, when >=5): + 100 nativeWait +password=fixture-private-value +Binary Images: +0x100000000 - 0x1000fffff Orca (1.2.3) /Users/Test User/Secret Project/Orca.app/Contents/MacOS/Orca +0x100100000 - 0x1001fffff Worker (4.5.6) /Users/Test User/Private Project/Worker +` + +function artifact(time: number): NativeHangArtifact { + return { + version: 1, + captureId: `hang-${time}-00000000-0000-0000-0000-${String(time).padStart(12, '0')}`, + detectedAt: time, + capturedAt: time + 1, + pid: 123, + showMenuBarIcon: null, + process: { + appVersion: '1.2.3', + electronVersion: '43.8.6', + chromeVersion: '150', + arch: 'arm64', + osRelease: '25.1.0', + osVersion: 'Darwin Kernel Version 25.1.0' + }, + report: sample + } +} + +let directory: string +beforeEach(async () => { + vi.useFakeTimers({ toFake: ['Date'] }) + vi.setSystemTime('2026-11-12T01:00:00.000Z') + directory = await fs.mkdtemp(join(tmpdir(), 'orca-native-hang-')) +}) +afterEach(async () => { + vi.useRealTimers() + await fs.rm(directory, { recursive: true, force: true }) +}) + +it('retains every sampled thread and image identity while removing full spaced paths and credentials', async () => { + const store = new NativeHangCaptureStore(directory) + await store.save(artifact(1)) + const capture = await readNativeHangCapture(directory) + expect(capture?.artifact).toMatchObject({ + showMenuBarIcon: null, + process: { appVersion: '1.2.3', electronVersion: '43.8.6' } + }) + expect(capture?.artifact.report).toContain('Thread_42 background-worker') + expect(capture?.artifact.report).toContain('backgroundWork (in Worker) + 8 [0x100100008]') + expect(capture?.artifact.report).toContain('macOS 26.1 (25B78)') + expect(capture?.artifact.report).toContain( + '0x100100000 - 0x1001fffff Worker (4.5.6) ' + ) + expect(capture?.artifact.report).not.toMatch( + /Test User|Secret Project|Private Project|Client List|Private Tools|fixture-private-value/ + ) + expect((await fs.stat(capture!.path)).mode & 0o777).toBe(0o600) +}) + +it('withholds complete-artifact admission for a cut report or unsafe image row', () => { + expect(sanitizeNativeHangReport(sample.trimEnd())).toBeNull() + expect(sanitizeNativeHangReport(sample.replace('Binary Images:', 'Missing Images:'))).toBeNull() + expect(sanitizeNativeHangReport(`${sample}unparsed /Users/Test User/private image\n`)).toBeNull() + expect(sanitizeNativeHangReport(sample.replace('[0x100100008]', 'unknown location'))).toBeNull() +}) + +it.each([ + { count: 4, times: [1, 2, 3, 4] }, + { count: 40, times: [37, 38, 39, 40] } +])( + 'bounds retained evidence after $count incidents and preserves unrelated files', + async ({ count, times }) => { + const store = new NativeHangCaptureStore(directory) + await fs.writeFile(join(directory, 'unrelated.txt'), 'keep') + await fs.writeFile( + join(directory, 'hang-0-00000000-0000-0000-0000-000000000000.tmp'), + 'interrupted' + ) + for (let time = 1; time <= count; time++) { + await store.save(artifact(time)) + } + const names = await fs.readdir(directory) + const retained: number[] = [] + for (const name of names.filter((name) => name.endsWith('.json'))) { + retained.push(JSON.parse(await fs.readFile(join(directory, name), 'utf8')).detectedAt) + } + expect(retained.sort((a, b) => a - b)).toEqual(times) + expect(names.filter((name) => name.endsWith('.tmp'))).toEqual([]) + expect(await fs.readFile(join(directory, 'unrelated.txt'), 'utf8')).toBe('keep') + } +) + +it('keeps manual freeze reports silent and preserves identity and sent status across restarts', async () => { + await new NativeHangCaptureStore(directory).save(artifact(1)) + const store = new CrashReportStore(join(directory, 'reports.json')) + const previous = createPreviousNativeHangReport({ store, directory, processStartedAt: 100 }) + await Promise.all([previous.ensureImported(), previous.ensureImported()]) + const report = (await store.listRecent())[0]! + expect(await getLatestPendingReport(store)).toBeNull() + expect(report).toMatchObject({ + status: 'dismissed', + details: { captureId: artifact(1).captureId, showMenuBarIcon: null } + }) + await store.markDismissedSent(report.id) + await createPreviousNativeHangReport({ store, directory, processStartedAt: 200 }).ensureImported() + expect(await store.listRecent()).toMatchObject([{ id: report.id, status: 'sent' }]) + expect((await readPreviousNativeHangCapture(directory, 200))?.artifact.captureId).toBe( + artifact(1).captureId + ) +}) + +it('preserves an ordinary pending crash and imports freeze evidence on a later manual open', async () => { + await new NativeHangCaptureStore(directory).save(artifact(1)) + const store = new CrashReportStore(join(directory, 'reports.json')) + const original = await store.record({ + source: 'renderer', + processType: 'renderer', + reason: 'crashed', + exitCode: 5, + platform: 'darwin', + appVersion: '1', + electronVersion: '43', + chromeVersion: '150', + arch: 'arm64', + osRelease: '25', + details: {} + }) + const previous = createPreviousNativeHangReport({ store, directory, processStartedAt: 100 }) + await previous.ensureImported() + expect((await getLatestPendingReport(store))?.id).toBe(original.id) + expect(await store.listRecent()).toHaveLength(1) + await store.dismiss(original.id) + await previous.ensureImported() + expect((await store.listRecent())[0]).toMatchObject({ + reason: 'main-thread-hang', + status: 'dismissed', + details: { captureId: artifact(1).captureId } + }) + expect(await getLatestPendingReport(store)).toBeNull() +}) + +it('enriches only the matching freeze event with captured safe frames, build and setting', async () => { + const captures = nativeHangCaptureDirectory(directory) + await new NativeHangCaptureStore(captures).save({ ...artifact(1), showMenuBarIcon: false }) + await new NativeHangCaptureStore(captures).save({ ...artifact(2), showMenuBarIcon: true }) + const marker = { detectedAt: 1, parentPid: 123, unresponsiveMs: 50000, selfRecovered: false } + const details = await readPreviousNativeHangTelemetry(directory, marker) + expect(details).toEqual({ + native_top_frames: ['nativeWait [Orca]'], + macos_build: 'macOS 26.1 (25B78)', + menu_bar_icon: false + }) + expect( + mainThreadHangDetectedSchema.safeParse({ + unresponsive_ms: 50000, + self_recovered: false, + ...details + }).success + ).toBe(true) + expect(await readPreviousNativeHangTelemetry(directory, { ...marker, parentPid: 999 })).toEqual( + {} + ) + expect(await readPreviousNativeHangTelemetry(directory, { ...marker, detectedAt: 3 })).toEqual({}) +}) + +it('selects the reported incident and never replaces missing evidence with a newer capture', async () => { + const store = new NativeHangCaptureStore(directory) + await store.save(artifact(1)) + await store.save(artifact(2)) + expect((await readNativeHangCapture(directory, artifact(1).captureId))?.artifact.detectedAt).toBe( + 1 + ) + expect((await readNativeHangCapture(directory))?.artifact.detectedAt).toBe(2) + expect(await readNativeHangCapture(directory, artifact(3).captureId)).toBeNull() +}) + +it('keeps an intact large capture with both log sources inside the attachment limit', async () => { + const trace = join(directory, 'main.trace') + const daemon = join(directory, 'daemon.log') + await fs.writeFile( + trace, + `${JSON.stringify({ name: 'important-main-span', ts: '2026-11-12T00:59:00.000Z', value: 't'.repeat(16_000) })}\n` + ) + await fs.writeFile( + daemon, + Array.from({ length: 200 }, () => + JSON.stringify({ name: 'daemon-event', value: 'a'.repeat(8_000) }) + ).join('\n') + ) + const clean = sample.replace('password=fixture-private-value\n', '') + const base = { type: 'native-hang-capture', status: 'complete', ...artifact(1), report: clean } + const escapedPadding = Math.floor((3_145_600 - Buffer.byteLength(JSON.stringify(base))) / 2) + const report = clean.replace( + 'nativeWait (in Orca)', + `${'\\'.repeat(escapedPadding)}nativeWait (in Orca)` + ) + + const bundle = collectBundle({ + traceFilePath: trace, + maxFiles: 1, + daemonLogFilePath: daemon, + appVersion: '1', + platform: 'darwin', + arch: 'arm64', + osRelease: '25', + orcaChannel: 'dev', + nativeHangRecord: { type: 'native-hang-capture', status: 'complete', ...artifact(1), report } + }) + const lines = bundle.payload + .trimEnd() + .split('\n') + .map((line) => JSON.parse(line)) + expect(lines.find((line) => line.type === 'native-hang-capture')?.report).toBe(report) + expect(lines.some((line) => line.name === 'important-main-span')).toBe(true) + expect(lines.some((line) => line.name === 'daemon-event')).toBe(true) + expect(Buffer.byteLength(bundle.payload)).toBeLessThanOrEqual(4_194_304) + expect(bundle.bytes).toBe(Buffer.byteLength(bundle.payload)) +}) diff --git a/src/main/hang-watchdog/native-hang-capture-store.ts b/src/main/hang-watchdog/native-hang-capture-store.ts new file mode 100644 index 00000000000..a2995849369 --- /dev/null +++ b/src/main/hang-watchdog/native-hang-capture-store.ts @@ -0,0 +1,178 @@ +import { randomUUID } from 'node:crypto' +import { constants } from 'node:fs' +import fs from 'node:fs/promises' +import { join } from 'node:path' +import { + MAX_NATIVE_HANG_ARTIFACT_BYTES, + parseNativeHangArtifact, + type NativeHangArtifact +} from './native-hang-report' + +const CAPTURE_ID = /^hang-(\d{1,16})-[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/ +const CAPTURE_FILE = /^(hang-\d{1,16}-[\da-f-]{36})(\.(?:recovered|seen))?\.json$/ +type CaptureFile = { name: string; captureId: string; detectedAt: number } +export type StoredNativeHangCapture = { artifact: NativeHangArtifact; path: string } + +export function nativeHangCaptureDirectory(userDataPath: string): string { + return join(userDataPath, 'hang-captures') +} + +export function createNativeHangCaptureId(detectedAt: number): string { + return `hang-${detectedAt}-${randomUUID()}` +} + +function captureFile(name: string): CaptureFile | null { + const match = CAPTURE_FILE.exec(name) + const id = match && CAPTURE_ID.exec(match[1]!) + return match && id ? { name, captureId: match[1]!, detectedAt: Number(id[1]) } : null +} + +async function entries(directory: string): Promise { + try { + if (!(await fs.lstat(directory)).isDirectory()) { + return null + } + const handle = await fs.opendir(directory) + try { + const names: string[] = [] + while (names.length < 64) { + const entry = await handle.read() + if (!entry) { + return names + } + names.push(entry.name) + } + return null + } finally { + await handle.close() + } + } catch { + return null + } +} + +export async function listNativeHangCaptures(directory: string): Promise { + return ((await entries(directory)) ?? []) + .map(captureFile) + .filter((file): file is CaptureFile => file !== null) + .sort((a, b) => b.detectedAt - a.detectedAt || b.name.localeCompare(a.name)) +} + +async function readCaptureFile( + directory: string, + file: CaptureFile +): Promise { + const filePath = join(directory, file.name) + let handle: Awaited> | undefined + try { + handle = await fs.open(filePath, constants.O_RDONLY | constants.O_NOFOLLOW) + const stat = await handle.stat() + if (!stat.isFile() || stat.size > MAX_NATIVE_HANG_ARTIFACT_BYTES) { + return null + } + const bytes = Buffer.alloc(stat.size + 1) + const { bytesRead } = await handle.read(bytes, 0, bytes.length, 0) + if (bytesRead !== stat.size) { + return null + } + const parsed: unknown = JSON.parse(bytes.subarray(0, bytesRead).toString('utf8')) + const artifact = parseNativeHangArtifact(parsed) + return artifact && + artifact.captureId === file.captureId && + artifact.detectedAt === file.detectedAt + ? { artifact, path: filePath } + : null + } catch { + return null + } finally { + await handle?.close() + } +} + +export async function readNativeHangCapture( + directory: string, + captureId?: string +): Promise { + const files = captureId + ? CAPTURE_ID.test(captureId) + ? ['', '.seen', '.recovered'].map((state) => captureFile(`${captureId}${state}.json`)!) + : [] + : await listNativeHangCaptures(directory) + for (const file of files) { + const capture = await readCaptureFile(directory, file) + if (capture) { + return capture + } + } + return null +} + +export async function readPreviousNativeHangCapture( + directory: string, + processStartedAt: number +): Promise { + for (const file of await listNativeHangCaptures(directory)) { + if (file.detectedAt < processStartedAt) { + const capture = await readCaptureFile(directory, file) + if (capture) { + return capture + } + } + } + return null +} + +export class NativeHangCaptureStore { + private busy = false + + constructor(private readonly directory: string) {} + + async save(artifact: NativeHangArtifact): Promise { + if (this.busy || !CAPTURE_ID.test(artifact.captureId)) { + return + } + this.busy = true + const temporary = join(this.directory, `${artifact.captureId}.tmp`) + try { + const safe = parseNativeHangArtifact(artifact) + if (!safe) { + return + } + const payload = `${JSON.stringify(safe)}\n` + if (Buffer.byteLength(payload) > MAX_NATIVE_HANG_ARTIFACT_BYTES) { + return + } + await fs.mkdir(this.directory, { recursive: true, mode: 0o700 }) + if (!(await fs.lstat(this.directory)).isDirectory()) { + return + } + await fs.chmod(this.directory, 0o700) + const names = await entries(this.directory) + if (!names) { + return + } + const captures = names + .map(captureFile) + .filter((file): file is CaptureFile => !!file) + .sort((a, b) => b.detectedAt - a.detectedAt) + for (const name of names) { + if (name.endsWith('.tmp') && CAPTURE_ID.test(name.slice(0, -4))) { + await fs.unlink(join(this.directory, name)) + } + } + for (const [index, file] of captures.entries()) { + const stat = await fs.lstat(join(this.directory, file.name)) + if (index >= 3 || stat.size > MAX_NATIVE_HANG_ARTIFACT_BYTES || !stat.isFile()) { + await fs.unlink(join(this.directory, file.name)) + } + } + await fs.writeFile(temporary, payload, { mode: 0o600, flag: 'wx' }) + await fs.rename(temporary, join(this.directory, `${artifact.captureId}.json`)) + } catch { + // Optional full evidence must not interrupt marker capture or child cleanup. + } finally { + await fs.unlink(temporary).catch(() => {}) + this.busy = false + } + } +} diff --git a/src/main/hang-watchdog/native-hang-capture.ts b/src/main/hang-watchdog/native-hang-capture.ts index 3ab8b3cadfe..f311bf1caa6 100644 --- a/src/main/hang-watchdog/native-hang-capture.ts +++ b/src/main/hang-watchdog/native-hang-capture.ts @@ -1,4 +1,5 @@ import type { runProcess as runNativeProcess } from '@orca/process-host' +import { MAX_NATIVE_HANG_REPORT_BYTES } from './native-hang-report' import { emptyHangStacks, hangLabel, @@ -117,8 +118,13 @@ export function reduceNativeHangSample( export function captureNativeHang(options: { pid: number publish: (capture: NativeHangCapture) => void -}): { stop: () => void; done: Promise } { + completeReport?: (report: string) => void +}): { stop: () => void; started: Promise; done: Promise } { const abort = new AbortController() + let acquired: () => void = () => {} + const started = new Promise((resolve) => { + acquired = resolve + }) const baseline: NativeHangCapture = { ...emptyHangStacks(), state: 'collecting', @@ -141,6 +147,7 @@ export function captureNativeHang(options: { runProcess = (await import('@orca/process-host')).runProcess } catch { publish({ ...baseline, state: 'failed', completedAt: Date.now(), cleanup: 'unverified' }) + acquired() return } let terminated = false @@ -149,11 +156,11 @@ export function captureNativeHang(options: { release = resolve }) try { - const result = await runProcess({ + const pending = runProcess({ program: '/usr/bin/sample', args: [String(options.pid), '1', '10', '-file', '/dev/stdout'], - timeoutMs: 2500, - maxOutputBytes: 128 * 1024, + timeoutMs: 10_000, + maxOutputBytes: MAX_NATIVE_HANG_REPORT_BYTES, killOnOutputLimit: true, signal: abort.signal, onChildTerminated: () => { @@ -161,6 +168,8 @@ export function captureNativeHang(options: { release() } }) + acquired() + const result = await pending publish({ ...baseline, ...reduceNativeHangSample(result.stdout), @@ -171,6 +180,14 @@ export function captureNativeHang(options: { cleanup: terminated ? 'terminated' : 'unverified', ...(result.code !== null ? { exitCode: result.code } : {}) }) + if ( + result.code === 0 && + !result.timedOut && + !result.outputTruncated && + !abort.signal.aborted + ) { + options.completeReport?.(result.stdout) + } } catch { publish({ ...baseline, @@ -178,11 +195,13 @@ export function captureNativeHang(options: { completedAt: Date.now(), cleanup: terminated ? 'terminated' : 'unverified' }) + } finally { + acquired() } if (!terminated) { await termination publish({ ...latest, cleanup: 'terminated' }) } })() - return { stop: () => abort.abort(), done } + return { stop: () => abort.abort(), started, done } } diff --git a/src/main/hang-watchdog/native-hang-report.ts b/src/main/hang-watchdog/native-hang-report.ts new file mode 100644 index 00000000000..1b75d578146 --- /dev/null +++ b/src/main/hang-watchdog/native-hang-report.ts @@ -0,0 +1,140 @@ +import { basename } from 'node:path/posix' +import { sanitizeCrashReportString } from '../../shared/crash-report-redaction' +import { redactString } from '../observability/redactor' + +export const MAX_NATIVE_HANG_REPORT_BYTES = 2 * 1024 * 1024 +export const MAX_NATIVE_HANG_ARTIFACT_BYTES = 3 * 1024 * 1024 + +export type NativeHangProcessMetadata = { + appVersion: string + electronVersion: string + chromeVersion: string + arch: string + osRelease: string + osVersion: string +} + +export type NativeHangArtifact = { + version: 1 + captureId: string + detectedAt: number + capturedAt: number + pid: number + showMenuBarIcon: boolean | null + process: NativeHangProcessMetadata + report: string +} + +export function sanitizeNativeHangReport(text: string): string | null { + if ( + !text.endsWith('\n') || + !/^OS Version:\s+.+\(.+\)/m.test(text) || + !/^Call graph:/m.test(text) || + !/^\s+\d+ Thread_\S+/m.test(text) + ) { + return null + } + const lines = text.split('\n') + const images = lines.indexOf('Binary Images:') + if (images === -1) { + return null + } + let imageCount = 0 + for (let index = 0; index < lines.length; index++) { + const line = lines[index]! + if (index > images && line.trim()) { + const image = + /^(\s*0x[\da-f]+\s+-\s+0x[\da-f]+\s+.+\s+<[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}>)\s+.+$/i.exec( + line + ) + if (!image) { + return null + } + lines[index] = `${image[1]} [redacted-path]` + imageCount++ + } else if (/^(?:Path|Analysis Tool):/.test(line)) { + lines[index] = `${line.slice(0, line.indexOf(':'))}: [redacted-path]` + } else { + lines[index] = line.replace( + /\(in (\/.+)\)(?=\s+(?:\+\s+\d+\s+)?\[0x[\da-f]+\])/gi, + (_match, location: string) => `(in ${basename(location)})` + ) + if (lines[index]!.includes('(in /')) { + return null + } + } + } + if (!imageCount) { + return null + } + // Artifact admission bounds the whole value; scalar truncation would destroy image identities. + return redactString(sanitizeCrashReportString(lines.join('\n'), Number.MAX_SAFE_INTEGER)) +} + +export function parseNativeHangArtifact(value: unknown): NativeHangArtifact | null { + if ( + !value || + typeof value !== 'object' || + !('version' in value) || + value.version !== 1 || + !('captureId' in value) || + typeof value.captureId !== 'string' || + !('detectedAt' in value) || + typeof value.detectedAt !== 'number' || + !Number.isSafeInteger(value.detectedAt) || + !('capturedAt' in value) || + typeof value.capturedAt !== 'number' || + !Number.isSafeInteger(value.capturedAt) || + !('pid' in value) || + typeof value.pid !== 'number' || + !Number.isSafeInteger(value.pid) || + value.pid <= 0 || + !('showMenuBarIcon' in value) || + (typeof value.showMenuBarIcon !== 'boolean' && value.showMenuBarIcon !== null) || + !('report' in value) || + typeof value.report !== 'string' || + !('process' in value) || + !value.process || + typeof value.process !== 'object' + ) { + return null + } + const metadata = value.process + if ( + !('appVersion' in metadata) || + typeof metadata.appVersion !== 'string' || + !('electronVersion' in metadata) || + typeof metadata.electronVersion !== 'string' || + !('chromeVersion' in metadata) || + typeof metadata.chromeVersion !== 'string' || + !('arch' in metadata) || + typeof metadata.arch !== 'string' || + !('osRelease' in metadata) || + typeof metadata.osRelease !== 'string' || + !('osVersion' in metadata) || + typeof metadata.osVersion !== 'string' + ) { + return null + } + const report = sanitizeNativeHangReport(value.report) + if (!report) { + return null + } + return { + version: 1, + captureId: value.captureId, + detectedAt: value.detectedAt, + capturedAt: value.capturedAt, + pid: value.pid, + showMenuBarIcon: value.showMenuBarIcon, + process: { + appVersion: sanitizeCrashReportString(metadata.appVersion), + electronVersion: sanitizeCrashReportString(metadata.electronVersion), + chromeVersion: sanitizeCrashReportString(metadata.chromeVersion), + arch: sanitizeCrashReportString(metadata.arch), + osRelease: sanitizeCrashReportString(metadata.osRelease), + osVersion: sanitizeCrashReportString(metadata.osVersion) + }, + report + } +} diff --git a/src/main/hang-watchdog/previous-native-hang-report.ts b/src/main/hang-watchdog/previous-native-hang-report.ts new file mode 100644 index 00000000000..adb0723207e --- /dev/null +++ b/src/main/hang-watchdog/previous-native-hang-report.ts @@ -0,0 +1,45 @@ +import type { CrashReportStore } from '../crash-reporting/reports/crash-report-store' +import { readPreviousNativeHangCapture } from './native-hang-capture-store' + +export function createPreviousNativeHangReport(options: { + store: CrashReportStore + directory: string + processStartedAt: number +}): { ensureImported: () => Promise } { + let importing: Promise | undefined + const prepare = async (): Promise => { + const capture = await readPreviousNativeHangCapture(options.directory, options.processStartedAt) + if (!capture) { + return + } + const artifact = capture.artifact + await options.store.importHangReport({ + source: 'child', + processType: 'main', + reason: 'main-thread-hang', + exitCode: null, + appVersion: artifact.process.appVersion, + electronVersion: artifact.process.electronVersion, + chromeVersion: artifact.process.chromeVersion, + platform: 'darwin', + arch: artifact.process.arch, + osRelease: artifact.process.osRelease, + details: { + captureId: artifact.captureId, + detectedAt: new Date(artifact.detectedAt).toISOString(), + capturedAt: new Date(artifact.capturedAt).toISOString(), + targetPid: artifact.pid, + osVersion: artifact.process.osVersion, + showMenuBarIcon: artifact.showMenuBarIcon + } + }) + } + return { + ensureImported: () => + (importing ??= prepare() + .catch(() => {}) + .finally(() => { + importing = undefined + })) + } +} diff --git a/src/main/hang-watchdog/previous-native-hang-telemetry.ts b/src/main/hang-watchdog/previous-native-hang-telemetry.ts new file mode 100644 index 00000000000..e90532c2525 --- /dev/null +++ b/src/main/hang-watchdog/previous-native-hang-telemetry.ts @@ -0,0 +1,41 @@ +import type { EventProps } from '../../shared/telemetry-events' +import type { HangDetectionMarker } from './hang-detection-marker' +import { + listNativeHangCaptures, + nativeHangCaptureDirectory, + readNativeHangCapture +} from './native-hang-capture-store' +import { reduceNativeHangSample } from './native-hang-capture' + +export type NativeHangTelemetry = Pick< + EventProps<'main_thread_hang_detected'>, + 'native_top_frames' | 'macos_build' | 'menu_bar_icon' +> + +export async function readPreviousNativeHangTelemetry( + userDataPath: string, + marker: HangDetectionMarker +): Promise { + const directory = nativeHangCaptureDirectory(userDataPath) + for (const file of await listNativeHangCaptures(directory)) { + if (file.detectedAt !== marker.detectedAt) { + continue + } + const capture = await readNativeHangCapture(directory, file.captureId) + if (!capture || capture.artifact.pid !== marker.parentPid) { + continue + } + const artifact = capture.artifact + const macosBuild = /^OS Version:\s*(macOS \d+(?:\.\d+){0,3} \([A-Za-z0-9]+\))\s*$/m.exec( + artifact.report + )?.[1] + return { + native_top_frames: reduceNativeHangSample(artifact.report).stacks.flatMap((stack) => + stack.frames.map((frame) => `${frame.name} [${frame.module}]`) + ), + ...(macosBuild && macosBuild.length <= 64 ? { macos_build: macosBuild } : {}), + menu_bar_icon: artifact.showMenuBarIcon + } + } + return {} +} diff --git a/src/main/hang-watchdog/watchdog-hang-capture.ts b/src/main/hang-watchdog/watchdog-hang-capture.ts new file mode 100644 index 00000000000..cb3d5d915b8 --- /dev/null +++ b/src/main/hang-watchdog/watchdog-hang-capture.ts @@ -0,0 +1,137 @@ +import { createNativeHangCaptureId, NativeHangCaptureStore } from './native-hang-capture-store' +import type { NativeHangProcessMetadata } from './native-hang-report' +import type { HangObservation } from './hang-observations' + +type CaptureOwner = { + id: string + reason?: 'recovery' | 'shutdown' + stop?: (reason: 'recovery' | 'shutdown') => void +} + +export function createWatchdogHangCapture(options: { + parentPid: number + artifactDirectory?: string + processMetadata?: NativeHangProcessMetadata + publish: (id: string, change: Partial) => void + drain: (token: string) => Promise + onIdle: () => void +}): { + capture: (record: HangObservation, detectedAt: number, showMenuBarIcon: boolean | null) => void + recover: (id: string) => void + shutdown: () => void +} { + let stopped = false + let jsOwner: CaptureOwner | null = null + let nativeOwner: CaptureOwner | null = null + const store = options.artifactDirectory + ? new NativeHangCaptureStore(options.artifactDirectory) + : null + const idle = (): void => { + if (stopped && !jsOwner && !nativeOwner) { + options.onIdle() + } + } + const capture = ( + record: HangObservation, + detectedAt: number, + showMenuBarIcon: boolean | null + ): void => { + if (stopped || record.kind !== 'heartbeat-stall') { + return + } + let nativeStarted: Promise = Promise.resolve() + if (process.platform === 'darwin' && !nativeOwner) { + const owner: CaptureOwner = { id: record.id } + nativeOwner = owner + const captureId = createNativeHangCaptureId(record.detectedAt) + const metadata = options.processMetadata + nativeStarted = import('./native-hang-capture') + .then((native) => { + const child = native.captureNativeHang({ + pid: options.parentPid, + publish: (native) => options.publish(record.id, { native }), + completeReport: (report) => { + if (store && metadata) { + void store.save({ + version: 1, + captureId, + detectedAt: record.detectedAt, + capturedAt: Date.now(), + pid: options.parentPid, + showMenuBarIcon, + process: metadata, + report + }) + } + } + }) + owner.stop = () => child.stop() + if (owner.reason === 'shutdown') { + child.stop() + } + void child.done.finally(() => { + if (nativeOwner === owner) { + nativeOwner = null + } + idle() + }) + return child.started + }) + .catch(() => { + if (nativeOwner === owner) { + nativeOwner = null + } + idle() + }) + } + if (!jsOwner) { + const owner: CaptureOwner = { id: record.id } + jsOwner = owner + void (async () => { + await nativeStarted + const [inspector, js] = await Promise.all([ + import('node:inspector'), + import('./main-js-hang-capture') + ]) + const mainJs = js.captureMainJsHang({ + session: new inspector.Session(), + detectedAt, + now: () => performance.now(), + publish: (mainJs) => options.publish(record.id, { mainJs }), + drain: () => options.drain(record.id) + }) + owner.stop = mainJs.stop + if (owner.reason) { + mainJs.stop(owner.reason) + } + await mainJs.done + })() + .catch(() => {}) + .finally(() => { + if (jsOwner === owner) { + jsOwner = null + } + idle() + }) + } + } + return { + capture, + recover: (id) => { + if (jsOwner?.id === id) { + jsOwner.reason ??= 'recovery' + jsOwner.stop?.('recovery') + } + }, + shutdown: () => { + stopped = true + for (const owner of [jsOwner, nativeOwner]) { + if (owner) { + owner.reason ??= 'shutdown' + owner.stop?.('shutdown') + } + } + idle() + } + } +} diff --git a/src/main/ipc/crash-reporting/crash-reporting-sendable-reports.ts b/src/main/ipc/crash-reporting/crash-reporting-sendable-reports.ts index 4c8317f641a..fb0b07894a4 100644 --- a/src/main/ipc/crash-reporting/crash-reporting-sendable-reports.ts +++ b/src/main/ipc/crash-reporting/crash-reporting-sendable-reports.ts @@ -23,8 +23,12 @@ export async function getLatestPendingReport( ): Promise>> { const reports = await store.listRecent() return ( - reports.find((report) => report.status === 'pending' && !submittedReportIds.has(report.id)) ?? - null + reports.find( + (report) => + report.status === 'pending' && + report.reason !== 'main-thread-hang' && + !submittedReportIds.has(report.id) + ) ?? null ) } diff --git a/src/main/ipc/crash-reporting/crash-reporting-submission.ts b/src/main/ipc/crash-reporting/crash-reporting-submission.ts index 6472bb9b1e3..559a0bd311f 100644 --- a/src/main/ipc/crash-reporting/crash-reporting-submission.ts +++ b/src/main/ipc/crash-reporting/crash-reporting-submission.ts @@ -101,7 +101,10 @@ export async function submitCrashReport( inFlightSubmissions.add(report.id) try { const diagnosticUpload = await prepareCrashDiagnosticBundle( - args.includeDiagnosticLogs !== false + args.includeDiagnosticLogs !== false, + report.reason === 'main-thread-hang' && typeof report.details.captureId === 'string' + ? report.details.captureId + : undefined ) const diagnosticBundle = diagnosticUpload.diagnosticBundle const reportOnlyDiagnosticBundle = diagnosticBundleForReportOnlyRetry(diagnosticUpload) diff --git a/src/main/ipc/crash-reporting/crash-reporting.ts b/src/main/ipc/crash-reporting/crash-reporting.ts index da8291e69f4..cd1cfc5ce82 100644 --- a/src/main/ipc/crash-reporting/crash-reporting.ts +++ b/src/main/ipc/crash-reporting/crash-reporting.ts @@ -1,4 +1,7 @@ import { clipboard, ipcMain } from 'electron' +import { getCanonicalUserDataPath } from '../../persistence/loading-store/user-data-path' +import { nativeHangCaptureDirectory } from '../../hang-watchdog/native-hang-capture-store' +import { createPreviousNativeHangReport } from '../../hang-watchdog/previous-native-hang-report' import { type CrashReportCopyDiagnosticsArgs, type CrashReportSubmitArgs, @@ -48,11 +51,23 @@ export function _getCrashReportingStateSizesForTests(): { } export function registerCrashReportingHandlers(store: CrashReportStore): void { + const directory = nativeHangCaptureDirectory(getCanonicalUserDataPath()) + const previousHang = + process.platform === 'darwin' + ? createPreviousNativeHangReport({ + store, + directory, + processStartedAt: Date.now() - process.uptime() * 1000 + }) + : null ipcMain.removeHandler('crashReports:getLatestPending') ipcMain.handle('crashReports:getLatestPending', () => getLatestPendingReport(store)) ipcMain.removeHandler('crashReports:getLatestReport') - ipcMain.handle('crashReports:getLatestReport', () => getLatestSendableReport(store)) + ipcMain.handle('crashReports:getLatestReport', async () => { + await previousHang?.ensureImported() + return getLatestSendableReport(store) + }) ipcMain.removeHandler('crashReports:dismiss') ipcMain.handle('crashReports:dismiss', async (_event, args: { reportId: string }) => { diff --git a/src/main/observability/bundle.ts b/src/main/observability/bundle.ts index 61bfdbb29da..3fa933b8af5 100644 --- a/src/main/observability/bundle.ts +++ b/src/main/observability/bundle.ts @@ -22,6 +22,7 @@ export type CollectBundleOptions = { readonly arch: string readonly osRelease: string readonly orcaChannel: 'stable' | 'rc' | 'dev' + readonly nativeHangRecord?: Record } export type CollectedBundle = { @@ -172,6 +173,13 @@ export function collectBundle(opts: CollectBundleOptions): CollectedBundle { const headerLine = JSON.stringify({ type: 'bundle-header', ...header }) const headerBytes = Buffer.byteLength(`${headerLine}\n`) + const nativeLine = opts.nativeHangRecord + ? JSON.stringify(redactValue(opts.nativeHangRecord, 'server')) + : null + const nativeBytes = nativeLine ? Buffer.byteLength(nativeLine) + 1 : 0 + if (headerBytes + nativeBytes > MAX_BUNDLE_BYTES) { + throw new Error('Saved freeze report exceeds the diagnostic attachment size limit.') + } const recordWindow = { cutoffMs, cutoffNanos, @@ -179,7 +187,8 @@ export function collectBundle(opts: CollectBundleOptions): CollectedBundle { } // Reserve daemon space so busy traces cannot crowd out OOM diagnostics. - const available = MAX_BUNDLE_BYTES - headerBytes + const available = MAX_BUNDLE_BYTES - headerBytes - nativeBytes + const traceReservation = nativeLine ? Math.min(256 * 1024, Math.floor(available / 2)) : 0 // Collect up to the full cap, reserve the daemon floor, then return unused trace space. const daemonAll = opts.daemonLogFilePath ? collectNewestRecords( @@ -188,16 +197,19 @@ export function collectBundle(opts: CollectBundleOptions): CollectedBundle { recordWindow ) : { lines: [], bytes: 0 } - const reserved = takeNewestLines(daemonAll.lines, Math.min(DAEMON_LOG_BUDGET_BYTES, available)) + const reserved = takeNewestLines( + daemonAll.lines, + Math.min(DAEMON_LOG_BUDGET_BYTES, available - traceReservation) + ) const traces = collectNewestRecords( listRotatedFiles(opts.traceFilePath, opts.maxFiles), available - reserved.bytes, recordWindow ) const daemon = takeNewestLines(daemonAll.lines, available - traces.bytes) - const lines = [headerLine, ...traces.lines, ...daemon.lines] + const lines = [headerLine, ...(nativeLine ? [nativeLine] : []), ...traces.lines, ...daemon.lines] const spanCount = traces.lines.length + daemon.lines.length - const currentBytes = headerBytes + traces.bytes + daemon.bytes + const currentBytes = headerBytes + nativeBytes + traces.bytes + daemon.bytes const payload = `${lines.join('\n')}\n` return { diff --git a/src/main/observability/index.ts b/src/main/observability/index.ts index 008a82a0156..cfcf44d055c 100644 --- a/src/main/observability/index.ts +++ b/src/main/observability/index.ts @@ -186,17 +186,35 @@ export async function collectDiagnosticBundle( meta: Pick< CollectBundleOptions, 'appVersion' | 'platform' | 'arch' | 'osRelease' | 'orcaChannel' | 'lookbackMinutes' - > + > & { nativeHangCaptureId?: string } ): Promise { // Flush before collection so the bundle includes the user’s latest action. await sink?.flushAsync() + const { nativeHangCaptureId, ...bundleMeta } = meta + let nativeHangRecord: Record | undefined + if (process.platform === 'darwin' && resolveObservabilityConsent().localFileEnabled) { + const [captures, paths] = await Promise.all([ + import('../hang-watchdog/native-hang-capture-store'), + import('../persistence/loading-store/user-data-path') + ]) + const capture = await captures.readNativeHangCapture( + captures.nativeHangCaptureDirectory(paths.getCanonicalUserDataPath()), + nativeHangCaptureId + ) + nativeHangRecord = capture + ? { type: 'native-hang-capture', status: 'complete', ...capture.artifact } + : nativeHangCaptureId + ? { type: 'native-hang-capture', status: 'unavailable', captureId: nativeHangCaptureId } + : undefined + } return _collectBundle({ traceFilePath: getTraceFilePath(), maxFiles: DEFAULT_MAX_FILES, // The daemon writes a separate file; collection does not glob the directory. daemonLogFilePath: getDaemonLogFilePath(), daemonLogMaxFiles: DAEMON_LOG_MAX_FILES, - ...meta + ...bundleMeta, + nativeHangRecord }) } diff --git a/src/main/startup/main-process-observers.ts b/src/main/startup/main-process-observers.ts index 9ed997eaff7..5b9e69bce58 100644 --- a/src/main/startup/main-process-observers.ts +++ b/src/main/startup/main-process-observers.ts @@ -16,6 +16,7 @@ import { setCodexTrustGrantTelemetry } from '../codex/trust/grants/codex-trust-g import { initObservability } from '../observability/index' import { recordDurableCrashBreadcrumb } from '../crash-reporting/breadcrumbs/durable-crash-breadcrumb' import { reportPreviousHangDetection } from '../hang-watchdog/previous-hang-detection' +import type { NativeHangTelemetry } from '../hang-watchdog/previous-native-hang-telemetry' import { getCanonicalUserDataPath } from '../persistence/loading-store/user-data-path' import { recoverPendingSkillTransactions } from '../skills/transaction-state/skill-transaction-startup-recovery' import { initCohortClassifier } from '../telemetry/cohort-classifier' @@ -113,10 +114,23 @@ export function initializeMainProcessObservers(): void { }) state.hangDetection = reportPreviousHangDetection(getCanonicalUserDataPath()) if (state.hangDetection) { - track('main_thread_hang_detected', { - unresponsive_ms: Math.round(state.hangDetection.unresponsiveMs), - self_recovered: state.hangDetection.selfRecovered - }) + const marker = state.hangDetection + const report = (details: NativeHangTelemetry): void => { + track('main_thread_hang_detected', { + unresponsive_ms: Math.round(marker.unresponsiveMs), + self_recovered: marker.selfRecovered, + ...details + }) + } + if (process.platform === 'darwin') { + void import('../hang-watchdog/previous-native-hang-telemetry') + .then(({ readPreviousNativeHangTelemetry }) => + readPreviousNativeHangTelemetry(getCanonicalUserDataPath(), marker) + ) + .then(report, () => report({})) + } else { + report({}) + } } state.skillTransactionRecovery = recoverPendingSkillTransactions( join(app.getPath('userData'), 'skill-installs') diff --git a/src/main/startup/main-process-ready-foundation.ts b/src/main/startup/main-process-ready-foundation.ts index 354f4df927b..839ed16b4c6 100644 --- a/src/main/startup/main-process-ready-foundation.ts +++ b/src/main/startup/main-process-ready-foundation.ts @@ -88,7 +88,7 @@ export async function initializeReadyFoundation(): Promise { }) const canonicalUserDataPath = getCanonicalUserDataPath() preservePreviousHangDetection(canonicalUserDataPath) - installMainThreadHangWatchdog({ userDataPath: canonicalUserDataPath }) + const hangWatchdog = installMainThreadHangWatchdog({ userDataPath: canonicalUserDataPath }) // Install certificate decisions before any webview/headless window can issue TLS. app.on( 'certificate-error', @@ -174,6 +174,7 @@ export async function initializeReadyFoundation(): Promise { } const store = profileState.store state.store = store + hangWatchdog?.setMenuBarIconSetting(store.getSettings().showMenuBarIcon !== false) // SSH users keep ssh2 loaded before interactive use, as before #35731; others load it on first connect. if (store.getSshTargets().length > 0) { preloadSsh2() @@ -271,6 +272,7 @@ export async function initializeReadyFoundation(): Promise { void switchBrowserExtensionSupport(settings.browserExtensionsEnabled !== false) } if ('showMenuBarIcon' in updates) { + hangWatchdog?.setMenuBarIconSetting(settings.showMenuBarIcon !== false) // Store owns settings mutations; sync every menu-bar toggle through this listener. syncMacMenuBarIcon(settings.showMenuBarIcon !== false) } diff --git a/src/renderer/src/components/crash-report/CrashReportDialogSurface.test.tsx b/src/renderer/src/components/crash-report/CrashReportDialogSurface.test.tsx new file mode 100644 index 00000000000..fd0a6acecb9 --- /dev/null +++ b/src/renderer/src/components/crash-report/CrashReportDialogSurface.test.tsx @@ -0,0 +1,68 @@ +// @vitest-environment happy-dom + +import { act, cleanup, fireEvent, render, screen } from '@testing-library/react' +import { afterEach, expect, it, vi } from 'vitest' +import type { CrashReportRecord } from '../../../../shared/crash-reporting' +import { CrashReportDialogSurface } from './CrashReportDialogSurface' + +vi.mock('sonner', () => ({ + toast: { dismiss: vi.fn(), error: vi.fn(), success: vi.fn(), warning: vi.fn() } +})) + +afterEach(() => { + cleanup() + vi.restoreAllMocks() +}) + +it('honors attachment consent when sending a manually opened freeze report', async () => { + const report: CrashReportRecord = { + id: 'freeze-report-1', + createdAt: '2026-11-12T01:00:00.000Z', + status: 'dismissed', + source: 'child', + processType: 'main', + reason: 'main-thread-hang', + exitCode: null, + appVersion: '1.4.214', + platform: 'darwin', + osRelease: '25.1.0', + arch: 'arm64', + electronVersion: '43', + chromeVersion: '150', + details: { captureId: 'incident-1', detectedAt: '2026-11-11T23:00:00.000Z' } + } + const submit = vi.fn().mockResolvedValue({ ok: true, report: { ...report, status: 'sent' } }) + Object.defineProperty(window, 'api', { + configurable: true, + value: { + gh: { viewer: () => Promise.resolve(null) }, + crashReports: { submit } + } + }) + const onOpenChange = vi.fn() + await act(async () => { + render( + {}} + /> + ) + }) + expect(submit).not.toHaveBeenCalled() + fireEvent.click(screen.getByRole('checkbox')) + await act(async () => { + fireEvent.click(screen.getByRole('button', { name: 'Send Report' })) + }) + expect(submit).toHaveBeenCalledWith({ + reportId: 'freeze-report-1', + notes: '', + includeDiagnosticLogs: false, + submitAnonymously: true, + githubLogin: null, + githubEmail: null + }) + expect(onOpenChange).toHaveBeenCalledWith(false) +}) diff --git a/src/renderer/src/components/crash-report/CrashReportDialogSurface.tsx b/src/renderer/src/components/crash-report/CrashReportDialogSurface.tsx index 2894f7f9391..cd8170220a1 100644 --- a/src/renderer/src/components/crash-report/CrashReportDialogSurface.tsx +++ b/src/renderer/src/components/crash-report/CrashReportDialogSurface.tsx @@ -15,14 +15,12 @@ import { Label } from '@/components/ui/label' import { useMountedRef } from '@/hooks/useMountedRef' import { formatCrashReportText, - isReactErrorBoundaryReport, MAX_USER_NOTES_LENGTH, type CrashReportDiagnosticBundle, type CrashReportRecord } from '../../../../shared/crash-reporting' import type { GitHubViewer } from '../../../../shared/github/pull-requests/pull-request-types' -import { translate } from '@/i18n/i18n' -import { useIntlLocale, useTranslate, type Translate } from '@/i18n/use-translate' +import { useIntlLocale, useTranslate } from '@/i18n/use-translate' import { CRASH_REPORT_SUBMIT_FAILURE_TOAST_ID, getCrashReportCopySubmissionFailure, @@ -30,73 +28,12 @@ import { getCrashReportSubmitWarningNotice } from './crash-report-submit-notice' import { useCrashReportCopy } from './use-crash-report-copy' - -function formatSummary(report: CrashReportRecord, t: Translate = translate): string { - if (isReactErrorBoundaryReport(report)) { - const surface = typeof report.details.surface === 'string' ? report.details.surface : null - return surface - ? t( - 'auto.components.crash.report.CrashReportDialogSurface.renderErrorIn', - 'React render error in {{surface}}', - { surface } - ) - : t('auto.components.crash.report.CrashReportDialogSurface.renderError', 'React render error') - } - return `${report.processType} ${report.reason}${ - report.exitCode === null ? '' : ` (exit ${report.exitCode})` - }` -} - -function getDialogTitle(report: CrashReportRecord | null, t: Translate = translate): string { - if (!report) { - return t('auto.components.crash.report.CrashReportDialogSurface.reportTitle', 'Report a crash') - } - return report && isReactErrorBoundaryReport(report) - ? t( - 'auto.components.crash.report.CrashReportDialogSurface.uiErrorTitle', - 'Orca hit a recoverable UI error' - ) - : t( - 'auto.components.crash.report.CrashReportDialogSurface.closedTitle', - 'Orca closed unexpectedly' - ) -} - -function getDialogDescription(report: CrashReportRecord | null, t: Translate = translate): string { - if (!report) { - return t( - 'auto.components.crash.report.CrashReportDialogSurface.reportDescription', - 'Send a privacy-safe crash report. Recent redacted diagnostic logs are included when available.' - ) - } - return report && isReactErrorBoundaryReport(report) - ? t( - 'auto.components.crash.report.CrashReportDialogSurface.uiErrorDescription', - 'Send a privacy-safe diagnostic report to help us understand the failed UI surface.' - ) - : t( - 'auto.components.crash.report.CrashReportDialogSurface.closedDescription', - 'Send a privacy-safe diagnostic report to help us understand what happened.' - ) -} - -function getNotesPlaceholder(report: CrashReportRecord | null, t: Translate = translate): string { - if (!report) { - return t( - 'auto.components.crash.report.CrashReportDialogSurface.reportNotesPlaceholder', - 'Optional: what happened?' - ) - } - return report && isReactErrorBoundaryReport(report) - ? t( - 'auto.components.crash.report.CrashReportDialogSurface.uiErrorNotesPlaceholder', - 'Optional: what were you doing before this UI error?' - ) - : t( - 'auto.components.crash.report.CrashReportDialogSurface.closedNotesPlaceholder', - 'Optional: what were you doing before Orca closed?' - ) -} +import { + formatSummary, + getDialogTitle, + getDialogDescription, + getNotesPlaceholder +} from './crash-report-dialog-copy' type CrashReportDialogSurfaceProps = { open: boolean @@ -129,6 +66,7 @@ export function CrashReportDialogSurface({ [deferredNotes, report] ) const copyCrashReportDetails = useCrashReportCopy(report, notes) + const isFreezeReport = report?.reason === 'main-thread-hang' const clearViewer = useCallback((): void => { viewerRequestIdRef.current += 1 @@ -167,7 +105,7 @@ export function CrashReportDialogSurface({ diagnosticBundle?: CrashReportDiagnosticBundle ): void => { const failure = { error, ...(diagnosticBundle ? { diagnosticBundle } : {}) } - const notice = getCrashReportSubmitFailureNotice(failure, includeDiagnosticLogs) + const notice = getCrashReportSubmitFailureNotice(failure, includeDiagnosticLogs, isFreezeReport) const copyFailure = getCrashReportCopySubmissionFailure(failure) toast.error(notice.title, { id: CRASH_REPORT_SUBMIT_FAILURE_TOAST_ID, @@ -222,12 +160,18 @@ export function CrashReportDialogSurface({ onReportChange(result.report) setNotes('') toast.dismiss(CRASH_REPORT_SUBMIT_FAILURE_TOAST_ID) - const warningNotice = getCrashReportSubmitWarningNotice(result, includeDiagnosticLogs) + const warningNotice = getCrashReportSubmitWarningNotice( + result, + includeDiagnosticLogs, + isFreezeReport + ) if (warningNotice) { toast.warning(warningNotice.title, { description: warningNotice.description }) } else { toast.success( - t('auto.components.crash.report.CrashReportDialog.8e24fe4f75', 'Crash report sent.') + isFreezeReport + ? t('crashReport.freeze.sent', 'Freeze report sent.') + : t('auto.components.crash.report.CrashReportDialog.8e24fe4f75', 'Crash report sent.') ) } onOpenChange(false) @@ -277,8 +221,12 @@ export function CrashReportDialogSurface({
{formatSummary(report, t)}
- {new Date(report.createdAt).toLocaleString(intlLocale)} · {report.platform}{' '} - {report.arch} ·{' '} + {new Date( + isFreezeReport && typeof report.details.detectedAt === 'string' + ? report.details.detectedAt + : report.createdAt + ).toLocaleString(intlLocale)}{' '} + · {report.platform} {report.arch} ·{' '} {t('auto.components.crash.report.CrashReportDialog.835037edc9', 'Orca')}{' '} {report.appVersion}
@@ -336,16 +284,23 @@ export function CrashReportDialogSurface({ />
- {t( - 'auto.components.crash.report.CrashReportDialog.e59f0b9427', - 'Sends a capped redacted log bundle with the report.' - )} + {isFreezeReport + ? t( + 'crashReport.freeze.attachDescription', + 'Sends the saved freeze report with a capped, redacted log bundle.' + ) + : t( + 'auto.components.crash.report.CrashReportDialog.e59f0b9427', + 'Sends a capped redacted log bundle with the report.' + )}
diff --git a/src/renderer/src/components/crash-report/crash-report-dialog-copy.ts b/src/renderer/src/components/crash-report/crash-report-dialog-copy.ts new file mode 100644 index 00000000000..fceb7d8019b --- /dev/null +++ b/src/renderer/src/components/crash-report/crash-report-dialog-copy.ts @@ -0,0 +1,94 @@ +import { + isReactErrorBoundaryReport, + type CrashReportRecord +} from '../../../../shared/crash-reporting' +import { translate } from '@/i18n/i18n' +import type { Translate } from '@/i18n/use-translate' + +export function formatSummary(report: CrashReportRecord, t: Translate = translate): string { + if (report.reason === 'main-thread-hang') { + return t('crashReport.freeze.summary', 'Orca stopped responding') + } + if (isReactErrorBoundaryReport(report)) { + const surface = typeof report.details.surface === 'string' ? report.details.surface : null + return surface + ? t( + 'auto.components.crash.report.CrashReportDialogSurface.renderErrorIn', + 'React render error in {{surface}}', + { surface } + ) + : t('auto.components.crash.report.CrashReportDialogSurface.renderError', 'React render error') + } + return `${report.processType} ${report.reason}${ + report.exitCode === null ? '' : ` (exit ${report.exitCode})` + }` +} + +export function getDialogTitle(report: CrashReportRecord | null, t: Translate = translate): string { + if (report?.reason === 'main-thread-hang') { + return t('crashReport.freeze.title', 'Report a freeze') + } + if (!report) { + return t('auto.components.crash.report.CrashReportDialogSurface.reportTitle', 'Report a crash') + } + return report && isReactErrorBoundaryReport(report) + ? t( + 'auto.components.crash.report.CrashReportDialogSurface.uiErrorTitle', + 'Orca hit a recoverable UI error' + ) + : t( + 'auto.components.crash.report.CrashReportDialogSurface.closedTitle', + 'Orca closed unexpectedly' + ) +} + +export function getDialogDescription( + report: CrashReportRecord | null, + t: Translate = translate +): string { + if (report?.reason === 'main-thread-hang') { + return t( + 'crashReport.freeze.description', + 'Send the saved freeze report to help us understand what happened.' + ) + } + if (!report) { + return t( + 'auto.components.crash.report.CrashReportDialogSurface.reportDescription', + 'Send a privacy-safe crash report. Recent redacted diagnostic logs are included when available.' + ) + } + return report && isReactErrorBoundaryReport(report) + ? t( + 'auto.components.crash.report.CrashReportDialogSurface.uiErrorDescription', + 'Send a privacy-safe diagnostic report to help us understand the failed UI surface.' + ) + : t( + 'auto.components.crash.report.CrashReportDialogSurface.closedDescription', + 'Send a privacy-safe diagnostic report to help us understand what happened.' + ) +} + +export function getNotesPlaceholder( + report: CrashReportRecord | null, + t: Translate = translate +): string { + if (report?.reason === 'main-thread-hang') { + return t('crashReport.freeze.notes', 'Optional: what were you doing before Orca froze?') + } + if (!report) { + return t( + 'auto.components.crash.report.CrashReportDialogSurface.reportNotesPlaceholder', + 'Optional: what happened?' + ) + } + return report && isReactErrorBoundaryReport(report) + ? t( + 'auto.components.crash.report.CrashReportDialogSurface.uiErrorNotesPlaceholder', + 'Optional: what were you doing before this UI error?' + ) + : t( + 'auto.components.crash.report.CrashReportDialogSurface.closedNotesPlaceholder', + 'Optional: what were you doing before Orca closed?' + ) +} diff --git a/src/renderer/src/components/crash-report/crash-report-submit-notice.ts b/src/renderer/src/components/crash-report/crash-report-submit-notice.ts index 29824b60416..5fa9cbb7201 100644 --- a/src/renderer/src/components/crash-report/crash-report-submit-notice.ts +++ b/src/renderer/src/components/crash-report/crash-report-submit-notice.ts @@ -63,7 +63,8 @@ export function getCrashReportCopySubmissionFailure( export function getCrashReportSubmitFailureNotice( failure: CrashReportSubmitFailureLike, - includeDiagnosticLogs: boolean + includeDiagnosticLogs: boolean, + isFreezeReport = false ): CrashReportSubmitFailureNotice { const ticketDetail = failure.diagnosticBundle?.status === 'uploaded' @@ -76,30 +77,40 @@ export function getCrashReportSubmitFailureNotice( const omittedDetail = failure.diagnosticBundle?.status === 'not_uploaded' ? asSentence( - translate( - 'auto.components.crash.report.submit.notice.diagnosticsReason', - 'Diagnostic logs were not attached: {{value0}}', - { value0: normalizedFailureMessage(failure.diagnosticBundle.reason) } - ) + isFreezeReport + ? translate( + 'crashReport.freeze.attachmentsOmitted', + 'The saved freeze report and diagnostic logs were not attached: {{value0}}', + { value0: normalizedFailureMessage(failure.diagnosticBundle.reason) } + ) + : translate( + 'auto.components.crash.report.submit.notice.diagnosticsReason', + 'Diagnostic logs were not attached: {{value0}}', + { value0: normalizedFailureMessage(failure.diagnosticBundle.reason) } + ) ) : null const attachmentAlreadyOmitted = failure.diagnosticBundle?.status === 'not_uploaded' const recovery = includeDiagnosticLogs && !attachmentAlreadyOmitted - ? translate( - 'auto.components.crash.report.submit.notice.uncheckDiagnostics', - 'Uncheck "Attach recent diagnostic logs" and try again, or copy the details.' - ) + ? isFreezeReport + ? translate( + 'crashReport.freeze.uncheckAttachments', + 'Uncheck "Attach saved freeze report and diagnostic logs" and try again, or copy the details.' + ) + : translate( + 'auto.components.crash.report.submit.notice.uncheckDiagnostics', + 'Uncheck "Attach recent diagnostic logs" and try again, or copy the details.' + ) : translate( 'auto.components.crash.report.submit.notice.checkConnection', 'Check your connection and try again, or copy the details.' ) return { - title: translate( - 'auto.components.crash.report.submit.notice.notSent', - "Crash report wasn't sent" - ), + title: isFreezeReport + ? translate('crashReport.freeze.notSent', "Freeze report wasn't sent") + : translate('auto.components.crash.report.submit.notice.notSent', "Crash report wasn't sent"), description: [ asSentence(normalizedFailureMessage(failure.error)), ticketDetail, @@ -114,21 +125,33 @@ export function getCrashReportSubmitFailureNotice( export function getCrashReportSubmitWarningNotice( result: Extract, - includeDiagnosticLogs: boolean + includeDiagnosticLogs: boolean, + isFreezeReport = false ): CrashReportSubmitWarningNotice | null { if (!includeDiagnosticLogs || result.diagnosticBundle?.status !== 'not_uploaded') { return null } return { - title: translate( - 'auto.components.crash.report.submit.notice.sentWithoutDiagnostics', - 'Crash report sent without diagnostic logs' - ), - description: translate( - 'auto.components.crash.report.submit.notice.diagnosticsReason', - 'Diagnostic logs were not attached: {{value0}}', - { value0: normalizedFailureMessage(result.diagnosticBundle.reason) } - ) + title: isFreezeReport + ? translate( + 'crashReport.freeze.sentWithoutAttachments', + 'Details sent without the saved freeze report or diagnostic logs' + ) + : translate( + 'auto.components.crash.report.submit.notice.sentWithoutDiagnostics', + 'Crash report sent without diagnostic logs' + ), + description: isFreezeReport + ? translate( + 'crashReport.freeze.attachmentsOmitted', + 'The saved freeze report and diagnostic logs were not attached: {{value0}}', + { value0: normalizedFailureMessage(result.diagnosticBundle.reason) } + ) + : translate( + 'auto.components.crash.report.submit.notice.diagnosticsReason', + 'Diagnostic logs were not attached: {{value0}}', + { value0: normalizedFailureMessage(result.diagnosticBundle.reason) } + ) } } diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 8222131a9ea..c9d53f4fc77 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -25462,5 +25462,20 @@ "read": "Usage could not be loaded. Try Refresh again.", "retry": "Refresh" } + }, + "crashReport": { + "freeze": { + "attach": "Attach saved freeze report and diagnostic logs", + "attachDescription": "Sends the saved freeze report with a capped, redacted log bundle.", + "attachmentsOmitted": "The saved freeze report and diagnostic logs were not attached: {{value0}}", + "description": "Send the saved freeze report to help us understand what happened.", + "notSent": "Freeze report wasn't sent", + "notes": "Optional: what were you doing before Orca froze?", + "sent": "Freeze report sent.", + "sentWithoutAttachments": "Details sent without the saved freeze report or diagnostic logs", + "summary": "Orca stopped responding", + "title": "Report a freeze", + "uncheckAttachments": "Uncheck \"Attach saved freeze report and diagnostic logs\" and try again, or copy the details." + } } } diff --git a/src/shared/telemetry-daemon-event-schemas.ts b/src/shared/telemetry-daemon-event-schemas.ts index 98ee3e32204..7cc51b793f1 100644 --- a/src/shared/telemetry-daemon-event-schemas.ts +++ b/src/shared/telemetry-daemon-event-schemas.ts @@ -51,7 +51,14 @@ export const remoteOutboundBudgetCloseSchema = z export const mainThreadHangDetectedSchema = z .object({ unresponsive_ms: z.number().int().nonnegative(), - self_recovered: z.boolean() + self_recovered: z.boolean(), + native_top_frames: z.array(z.string().max(180)).max(24).optional(), + macos_build: z + .string() + .max(64) + .regex(/^macOS \d+(?:\.\d+){0,3} \([A-Za-z0-9]+\)$/) + .optional(), + menu_bar_icon: z.boolean().nullable().optional() }) .strict() From 21c946621c8756b2629b329036c80d422e1f6f43 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 13:09:32 -0800 Subject: [PATCH 09/49] test: remove low-value task recordings and assignment checks (#42135) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../assignment-home-cell-unavailable.test.ts | 69 +- .../assignment-rejection-log-window.test.ts | 62 - .../assignment-rejection-logging.test.ts | 107 -- ...assignment-reserve-mode-evacuation.test.ts | 11 - .../assignment-reserve-mode.test.ts | 45 - .../assignment-roll-replaced-cell.test.ts | 21 - .../goldens/pr-triage-launch.json | 300 ----- ...reate-intent-stage-commit-push-create.json | 1123 ----------------- .../sc-create-pushes-then-creates.json | 300 ----- .../sc-create-refused-empty-message.json | 87 -- .../sc-create-rejected-empty-message.json | 84 -- .../goldens/sc-eligibility-fetched.json | 179 --- .../sc-prefill-unavailable-on-rejection.json | 107 -- .../goldens/tk-item-comment-github.json | 356 ------ .../goldens/tk-item-comment-gitlab-mr.json | 265 ---- .../goldens/tk-item-comment-gitlab.json | 265 ---- .../tk-item-detail-github-reactions.json | 372 ------ .../tk-item-detail-gitlab-reactions.json | 365 ------ .../goldens/tk-item-detail-metadata.json | 182 --- .../goldens/tk-item-merge-gitlab.json | 224 ---- .../goldens/tk-item-metadata-github.json | 438 ------- mobile/rpc-foundation/pilot-scenarios.json | 983 --------------- .../changed-page-item-refusals.ts | 240 ---- .../rpc-recording/changed-page-outcomes.ts | 179 --- .../rpc-recording/changed-page-refusals.ts | 197 --- 25 files changed, 3 insertions(+), 6558 deletions(-) delete mode 100644 cloud/apps/relay/src/assignment/assignment-rejection-log-window.test.ts delete mode 100644 cloud/apps/relay/src/assignment/assignment-rejection-logging.test.ts delete mode 100644 mobile/rpc-foundation/goldens/pr-triage-launch.json delete mode 100644 mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json delete mode 100644 mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json delete mode 100644 mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json delete mode 100644 mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json delete mode 100644 mobile/rpc-foundation/goldens/sc-eligibility-fetched.json delete mode 100644 mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-comment-github.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-comment-gitlab-mr.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-comment-gitlab.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-detail-github-reactions.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-detail-gitlab-reactions.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-detail-metadata.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-merge-gitlab.json delete mode 100644 mobile/rpc-foundation/goldens/tk-item-metadata-github.json delete mode 100644 mobile/src/test-support/rpc-recording/changed-page-item-refusals.ts delete mode 100644 mobile/src/test-support/rpc-recording/changed-page-outcomes.ts delete mode 100644 mobile/src/test-support/rpc-recording/changed-page-refusals.ts diff --git a/cloud/apps/relay/src/assignment/assignment-home-cell-unavailable.test.ts b/cloud/apps/relay/src/assignment/assignment-home-cell-unavailable.test.ts index 3227d64e82b..7d96a37494f 100644 --- a/cloud/apps/relay/src/assignment/assignment-home-cell-unavailable.test.ts +++ b/cloud/apps/relay/src/assignment/assignment-home-cell-unavailable.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it } from 'vitest' -import { RelayAssignmentStore, RelayHomeCellUnavailableError } from './assignment-store.js' +import { RelayAssignmentStore } from './assignment-store.js' import type { RelayCellConfig } from '../config.js' import { openInMemoryRelayDatabase, type RelayDatabase } from '../database/database.js' @@ -7,16 +7,6 @@ const HEARTBEAT_TTL_MS = 45_000 const START_MS = 100 const IDENTITY = { userId: 'user-1', relayHostId: 'host000000000001' } -// A connection-limited cell is what makes the committed fence mandatory, and -// that is the branch which used to answer "capacity exhausted". -const FENCED_CELL: RelayCellConfig = { - id: 'home', - url: 'https://home.example.com', - capacityRequests: 1_000, - connectionHardCap: 600, - connectionUnobservedBound: 50 -} - const databases: RelayDatabase[] = [] afterEach(async () => { @@ -29,7 +19,7 @@ interface Harness { setNow: (value: number) => void } -async function setup(cells: RelayCellConfig[] = [FENCED_CELL]): Promise { +async function setup(cells: RelayCellConfig[]): Promise { const database = await openInMemoryRelayDatabase() databases.push(database) let now = START_MS @@ -45,67 +35,14 @@ async function setup(cells: RelayCellConfig[] = [FENCED_CELL]): Promise cellIncarnation: `1111111${cells.indexOf(cell)}-1111-4111-8111-111111111111`, startedAt: 50, ready, - observedRequests: 0, - ...(cell.connectionHardCap === undefined - ? {} - : { - totalConnections: 0, - inFlightConnections: 0, - reservedConnectionUnits: 0, - enforcedConnectionUnits: 0, - connectionHardCap: cell.connectionHardCap, - connectionUnobservedBound: cell.connectionUnobservedBound - }) + observedRequests: 0 }) } for (const cell of cells) await heartbeat(cell, true) return { store, heartbeat, setNow: (value: number) => (now = value) } } -async function assignFailure(store: RelayAssignmentStore): Promise { - return await store.assign(IDENTITY).then( - () => new Error('assign unexpectedly succeeded'), - (error: unknown) => error - ) -} - -function homeCellError(error: unknown): RelayHomeCellUnavailableError { - expect(error).toBeInstanceOf(RelayHomeCellUnavailableError) - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the assertion above. - return error as RelayHomeCellUnavailableError -} - describe('home cell unavailable', () => { - it('names a readiness failure rather than reporting fleet capacity', async () => { - const { store, heartbeat, setNow } = await setup() - await store.assign(IDENTITY) - setNow(START_MS + 1_000) - await heartbeat(FENCED_CELL, false) - - const error = homeCellError(await assignFailure(store)) - - expect(error.message).toBe('relay_home_cell_unavailable') - expect(error.unavailableCause).toBe('not_ready') - expect(error.cellId).toBe(FENCED_CELL.id) - }) - - it('names a heartbeat gap as unheard even though the cell last reported ready', async () => { - const { store, setNow } = await setup() - await store.assign(IDENTITY) - setNow(START_MS + HEARTBEAT_TTL_MS + 1) - - expect(homeCellError(await assignFailure(store)).unavailableCause).toBe('unheard') - }) - - it('names a drained cell as draining ahead of its heartbeat gap', async () => { - const { store, setNow } = await setup() - await store.assign(IDENTITY) - await store.configureCell(FENCED_CELL, false) - setNow(START_MS + HEARTBEAT_TTL_MS + 1) - - expect(homeCellError(await assignFailure(store)).unavailableCause).toBe('draining') - }) - it('rehomes instead of rejecting when the unavailable cell needs no fence', async () => { const home: RelayCellConfig = { id: 'home', diff --git a/cloud/apps/relay/src/assignment/assignment-rejection-log-window.test.ts b/cloud/apps/relay/src/assignment/assignment-rejection-log-window.test.ts deleted file mode 100644 index d3a4709cdc9..00000000000 --- a/cloud/apps/relay/src/assignment/assignment-rejection-log-window.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { AssignmentRejectionLogWindow } from './assignment-rejection-log-window.js' - -describe('assignment rejection log window', () => { - it('emits once per key per window and closes it with its own suppressed count', () => { - const timers = manualTimers() - const closed: { key: string; suppressed: number; sample: string }[] = [] - const window = new AssignmentRejectionLogWindow({ - windowMs: 10_000, - schedule: timers.schedule, - onWindowClosed: (input) => closed.push(input) - }) - const key = 'assign:placement:host-rate-limited' - - expect(window.admit(key, 'host-a')).toBe(true) - expect(window.admit(key, 'host-b')).toBe(false) - expect(window.admit(key, 'host-c')).toBe(false) - expect(closed).toEqual([]) - - timers.runPending() - expect(closed).toEqual([{ key, suppressed: 2, sample: 'host-c' }]) - - // The next window starts clean instead of inheriting the closed window's count. - expect(window.admit(key, 'host-d')).toBe(true) - timers.runPending() - expect(closed).toHaveLength(1) - }) - - it('keeps distinct keys on independent windows', () => { - const timers = manualTimers() - const window = new AssignmentRejectionLogWindow({ - windowMs: 10_000, - schedule: timers.schedule, - onWindowClosed: () => undefined - }) - - expect(window.admit('assign:placement:host-rate-limited', 'host-a')).toBe(true) - expect(window.admit('assign:placement:queue-full', 'host-a')).toBe(true) - expect(window.admit('assign:placement:queue-full', 'host-a')).toBe(false) - }) -}) - -function manualTimers(): { - schedule: (callback: () => void) => () => void - runPending: () => void -} { - const pending = new Map void>() - let nextId = 0 - return { - schedule: (callback) => { - const id = nextId++ - pending.set(id, callback) - return () => pending.delete(id) - }, - runPending: () => { - for (const [id, callback] of [...pending]) { - pending.delete(id) - callback() - } - } - } -} diff --git a/cloud/apps/relay/src/assignment/assignment-rejection-logging.test.ts b/cloud/apps/relay/src/assignment/assignment-rejection-logging.test.ts deleted file mode 100644 index 763d1a28d3f..00000000000 --- a/cloud/apps/relay/src/assignment/assignment-rejection-logging.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { afterEach, describe, expect, it, vi } from 'vitest' -import type { RelayAssignment } from './assignment-store.js' -import type { RelayConfig } from '../config.js' - -const fakes = vi.hoisted(() => ({ - verifyRelayToken: vi.fn(async (token: string) => ({ - sub: 'user-1', - relayHostId: token - })) -})) - -vi.mock('../authentication/relay-token-verifier.js', () => ({ - createRelayTokenVerifier: () => fakes.verifyRelayToken, - readBearer: (value: string | undefined) => value?.replace(/^Bearer /, '') ?? null -})) - -import { createRelayApp } from '../app.js' - -describe('assignment rejection logging', () => { - afterEach(() => { - vi.restoreAllMocks() - }) - - it('logs the store reason and host digest when assign() rejects on capacity', async () => { - const host = 'hhhhhhhhhhhhhhhh' - const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined) - const app = createRelayApp(config(), { - store: {} as never, - assignments: { - assign: vi.fn(async () => { - throw new Error('relay_capacity_exhausted') - }), - resolve: vi.fn(async () => assignment('cell-r', host)) - } as never, - drain: vi.fn(), - ready: vi.fn(async () => true) - }) - - const hinted = await app.request('/v1/assign', assignmentRequest(host, { reconnect: true })) - - expect(hinted.status).toBe(503) - expect(await hinted.json()).toEqual({ error: 'relay_capacity_exhausted' }) - const line = warn.mock.calls - .map((call) => String(call[0])) - .find((entry) => entry.includes('assignment rejected')) - expect(line).toContain('route=assign') - expect(line).toContain('lane=sticky') - expect(line).toContain('hinted=true') - expect(line).toContain('reason=relay_capacity_exhausted') - expect(line).toContain('host=af342ad00ee4') - expect(line).not.toContain(host) - }) -}) - -function assignmentRequest( - relayHostId: string, - extra: Record = {} -): RequestInit & { headers: Record } { - return { - method: 'POST', - headers: { - authorization: `Bearer ${relayHostId}`, - 'content-type': 'application/json' - }, - body: JSON.stringify({ v: 1, relayHostId, ...extra }) - } -} - -function assignment(cellId: string, relayHostId: string): RelayAssignment { - return { - userId: 'user-1', - relayHostId, - cellId, - cellUrl: `https://${cellId}.relay.example.test`, - assignmentEpoch: 1, - leaseExpiresAt: Date.now() + 300_000 - } -} - -function config(overrides: Partial = {}): RelayConfig { - return { - port: 8080, - publicUrl: 'https://relay.example.test', - cellUrl: 'https://relay.example.test', - authIssuer: 'https://auth.example.test', - authAudience: 'orca-relay', - jwksUrl: 'https://auth.example.test/jwks', - assignmentSigningKey: new TextEncoder().encode('assignment-key-with-at-least-32-bytes'), - role: 'director', - cellId: 'director', - cells: [], - adminAudience: 'https://relay.example.test/v1/admin/drain', - deployServiceAccount: 'deploy@example.test', - runtimeServiceAccount: 'runtime@example.test', - adminJwksUrl: 'https://auth.example.test/jwks', - databasePoolMax: 3, - publicAssignmentsEnabled: true, - publicAssignmentConcurrency: 2, - publicAssignmentQueueMax: 128, - publicAssignmentWaitMs: 4_000, - publicResolveConcurrency: 1, - publicResolveWaitMs: 5_000, - publicAssignmentRetryAfterSeconds: 5, - dataDir: './data', - ...overrides - } -} diff --git a/cloud/apps/relay/src/assignment/assignment-reserve-mode-evacuation.test.ts b/cloud/apps/relay/src/assignment/assignment-reserve-mode-evacuation.test.ts index 962835176d2..577b68e618c 100644 --- a/cloud/apps/relay/src/assignment/assignment-reserve-mode-evacuation.test.ts +++ b/cloud/apps/relay/src/assignment/assignment-reserve-mode-evacuation.test.ts @@ -62,15 +62,4 @@ describe('evacuation from reserve-mode cells', () => { await store.setCellAdmitMode('cell-a', 'db') expect(await store.completeReadyEvacuations()).toBe(1) }) - - it('refuses evacuation status for a reserve cell, where activeCellMigrations would count no units', async () => { - const store = await setup(() => 1_000) - await store.setCellAdmitMode('cell-a', 'reserve') - await expect(store.cellEvacuationStatus('cell-a', 'cell-b', true)).rejects.toThrow( - 'cell_in_reserve_mode' - ) - await expect(store.cellEvacuationStatus('cell-b', 'cell-a', false)).rejects.toThrow( - 'cell_in_reserve_mode' - ) - }) }) diff --git a/cloud/apps/relay/src/assignment/assignment-reserve-mode.test.ts b/cloud/apps/relay/src/assignment/assignment-reserve-mode.test.ts index 94455f83ba7..ec6c939b58a 100644 --- a/cloud/apps/relay/src/assignment/assignment-reserve-mode.test.ts +++ b/cloud/apps/relay/src/assignment/assignment-reserve-mode.test.ts @@ -64,24 +64,6 @@ describe('assignment reserve-mode behavior', () => { expect(await store.releaseExpiredActivityLeases()).toBeGreaterThan(0) }) - it('keeps an idle host sticky on a reserve-mode cell where today it would be re-placed', async () => { - let now = 1_000 - const store = await setup(() => now) - const identity = { userId: 'user-a', relayHostId: 'host000000000001' } - const first = await store.assign(identity) - await store.changeActivity(identity, 'control', -1) - now += ASSIGNMENT_LIMITS.activityLeaseMs + ASSIGNMENT_LIMITS.dormantTtlMs + 1 - await setReserve(store, [first.cellId]) - expect(await store.assign(identity)).toMatchObject({ - cellId: first.cellId, - assignmentEpoch: first.assignmentEpoch - }) - // Not knowing which cells are switched on is treated the same way. - const { unknown, restore } = await unknownSet(() => now) - expect((await unknown.assign(identity)).assignmentEpoch).toBe(first.assignmentEpoch) - await restore() - }) - it('keeps a connected host pinned when its reserve cell goes existing-only after a ledger write', async () => { let now = 1_000 const store = await setup(() => now) @@ -192,12 +174,6 @@ describe('assignment reserve-mode behavior', () => { } }) - it('never places a fresh host on a reserve-mode cell through the database', async () => { - const store = await setup(() => 1_000, ['cell-a']) - const placed = await store.assign({ userId: 'user-0', relayHostId: 'host000000000000' }) - expect(placed.cellId).toBe('cell-b') - }) - it('refuses drains, evacuations and status reads that would treat a reserve-mode cell as empty', async () => { const store = await setup(() => 1_000, ['cell-a']) await expect(store.cellDeploymentStatus('cell-a')).rejects.toBeInstanceOf( @@ -224,25 +200,4 @@ describe('assignment reserve-mode behavior', () => { await expect(unknown.cellDeploymentStatus('cell-b')).rejects.toThrow('reserve_mode_unknown') await restore() }) - - it('refuses the flip to reserve while a migration names the cell', async () => { - const store = await setup(() => 1_000) - await database!.query( - `INSERT INTO relay_assignment_migrations - (user_id, relay_host_id, source_cell_id, target_cell_id, previous_epoch, assignment_epoch, - source_request_units, target_reserved_units, expires_at, created_at, updated_at) - VALUES ('user-a', 'host000000000001', 'cell-b', 'cell-a', 1, 2, 0, 1, 9999, 1000, 1000)` - ) - await expect(store.setCellAdmitMode('cell-a', 'reserve')).rejects.toThrow( - 'cell_has_open_migration' - ) - expect(await store.cellAdmitMode('cell-a')).toMatchObject({ admitMode: 'db' }) - await store.setCellAdmitMode('cell-a', 'db') - await database!.query(`UPDATE relay_assignment_migrations SET aborted_at = 1001`) - await store.setCellAdmitMode('cell-a', 'reserve') - expect(await store.cellAdmitMode('cell-a')).toMatchObject({ - admitMode: 'reserve', - updatedAt: 1_000 - }) - }) }) diff --git a/cloud/apps/relay/src/assignment/assignment-roll-replaced-cell.test.ts b/cloud/apps/relay/src/assignment/assignment-roll-replaced-cell.test.ts index a30f59a07e7..b7cb1640123 100644 --- a/cloud/apps/relay/src/assignment/assignment-roll-replaced-cell.test.ts +++ b/cloud/apps/relay/src/assignment/assignment-roll-replaced-cell.test.ts @@ -140,9 +140,6 @@ async function setup(cells: RelayCellConfig[] = [SOURCE, TARGET]) { } } -// The old process stopped heartbeating at START_MS, so it is unheard from here. -const OLD_UNHEARD_AT = START_MS + HEARTBEAT_TTL_MS + 1_000 - async function hintedAssign(store: RelayAssignmentStore) { return await store.assign(IDENTITY, 'us-central1', 'us-central1', undefined, { hostRequested: true @@ -204,14 +201,6 @@ describe('a host offline through a roll redials via hinted assign', () => { await expectRefused(hintedAssign(store), 'unheard') }) - it('is refused on an ordinary readiness dip with no roll stamp', async () => { - const { store, heartbeat, at } = await setup() - await at(20_000) - await heartbeat(SOURCE, { incarnation: NEW_INCARNATION, startedAt: 15_000, ready: false }) - - await expectRefused(hintedAssign(store), 'not_ready') - }) - it('is refused on a migration-only cell parked without a roll stamp', async () => { const { store, heartbeat, at, park } = await setup() await park('migration-only') @@ -222,16 +211,6 @@ describe('a host offline through a roll redials via hinted assign', () => { }) }) - // Residual: the old process is past its TTL and the new one has not heartbeated yet, so - // nothing proves the drained sockets gone. The client's retry lands once the new one is heard. - it('is still refused between the old process going unheard and the new one heartbeating', async () => { - const { store, at, isolateForRoll } = await setup() - await isolateForRoll() - await at(OLD_UNHEARD_AT) - - await expectRefused(hintedAssign(store), 'unheard') - }) - it('is refused when the roll stamp is stale, even with a new process', async () => { const { store, heartbeat, at, isolateForRoll } = await setup() await isolateForRoll() diff --git a/mobile/rpc-foundation/goldens/pr-triage-launch.json b/mobile/rpc-foundation/goldens/pr-triage-launch.json deleted file mode 100644 index 0be5ea15b10..00000000000 --- a/mobile/rpc-foundation/goldens/pr-triage-launch.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "session.pr-triage-launch", - "family": "session.pr-triage", - "namedDeltas": [], - "values": { - "02188f091419": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [] - } - } - } - } - }, - "1c2564f1daca": { - "name": "settings.get#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" - }, - "28339abecf78": { - "name": "agent.launchReplay#1", - "ordinal": 8, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"agent.launchReplay\",\"params\":{\"agent\":\"codex\",\"operationId\":\"1767225600000-00000000000040008000000000000001\",\"target\":{\"kind\":\"existing\",\"worktree\":\"id:repo-9::/w\"},\"prompt\":{\"text\":\"Fix the failing checks\",\"delivery\":\"submit\"},\"launchSource\":\"task_page\"}}" - }, - "35f85fe3b71c": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "3e6a0417d2ee": { - "name": "repo.list#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "repo.list" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9" - } - ] - } - } - } - }, - "51d4cb56be85": { - "name": "settings.get#1", - "ordinal": 2, - "args": [ - { - "name": "method", - "value": "settings.get" - }, - { - "name": "params", - "value": { - "$rpc": "absent" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "742db574bda3": { - "name": "preflight.detectAgents#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectAgents\",\"params\":{\"worktreeId\":\"repo-9::/w\"}}" - }, - "8ea2eb0159dd": { - "launched": { - "kind": "sent", - "opens": { - "paneKey": { - "$rpc": "null" - }, - "worktreeId": "repo-9::/w" - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "a4273b38df83": { - "launched": "unlaunched" - }, - "ba3fac1eb199": { - "name": "agent.launchReplay#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "agent.launchReplay" - }, - { - "name": "params", - "value": { - "agent": "codex", - "launchSource": "task_page", - "operationId": "1767225600000-00000000000040008000000000000001", - "prompt": { - "delivery": "submit", - "text": "Fix the failing checks" - }, - "target": { - "kind": "existing", - "worktree": "id:repo-9::/w" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 90000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "outcome": { - "handle": "term-1", - "kind": "terminal" - }, - "prompt": { - "delivery": "submit", - "outcome": "handed-to-terminal" - }, - "receipt": { - "detail": "Started a terminal agent, the default for new agent tabs in your settings.", - "mode": "terminal", - "preferred": "terminal", - "reason": "user_default" - }, - "worktreeId": "repo-9::/w" - } - } - } - }, - "e0eef7c9fafe": { - "name": "repo.list#1", - "ordinal": 3, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.list\"}" - }, - "e5392ac00e18": { - "name": "preflight.detectAgents#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "preflight.detectAgents" - }, - { - "name": "params", - "value": { - "worktreeId": "repo-9::/w" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": ["codex"] - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "pr-triage-launch", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["35f85fe3b71c", "51d4cb56be85"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca"], - "settlements": { - "launch": "9270aeb7d9c6" - }, - "state": "a4273b38df83", - "effects": [] - } - }, - { - "id": "launched", - "observation": { - "sender": ["3e6a0417d2ee", "02188f091419", "e5392ac00e18", "ba3fac1eb199"], - "payloads": ["e0eef7c9fafe", "1c2564f1daca", "742db574bda3", "28339abecf78"], - "settlements": { - "launch": "eb79a9b3682a" - }, - "state": "8ea2eb0159dd", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json b/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json deleted file mode 100644 index 572837bf850..00000000000 --- a/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json +++ /dev/null @@ -1,1123 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.create-intent", - "family": "hostedReview.create-intent", - "namedDeltas": [], - "values": { - "0e4c5b9b4b61": { - "name": "git.commit#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "git.commit" - }, - { - "name": "params", - "value": { - "message": "feat: recorded", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-5", - "ok": true, - "result": { - "success": true - } - } - } - }, - "0f6982ada2e6": { - "name": "git.commit#1", - "ordinal": 12, - "args": [ - { - "name": "method", - "value": "git.commit" - }, - { - "name": "params", - "value": { - "message": "feat: recorded", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "10f528114aef": { - "name": "git.generateCommitMessage#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "git.generateCommitMessage" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "1858779f58e9": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "branch": "feature", - "entries": [ - { - "area": "staged", - "path": "src/app.ts", - "status": "modified" - }, - { - "area": "untracked", - "path": "src/new.ts", - "status": "untracked" - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "201cece6e0bb": { - "name": "git.status#3", - "ordinal": 15, - "json": "{\"id\":\"frame-6\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "22cb4850c7e9": { - "name": "git.generateCommitMessage#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "git.generateCommitMessage" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-4", - "ok": true, - "result": { - "message": "feat: recorded", - "success": true - } - } - } - }, - "324be6bef431": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 16, - "args": [ - { - "name": "method", - "value": "hostedReview.getCreationEligibility" - }, - { - "name": "params", - "value": { - "ahead": 1, - "base": { - "$rpc": "null" - }, - "behind": 0, - "branch": "feature", - "hasUncommittedChanges": false, - "hasUpstream": true, - "linkedGitHubPR": { - "$rpc": "null" - }, - "linkedGitLabMR": { - "$rpc": "null" - }, - "repo": "id:repo42", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-7", - "ok": true, - "result": { - "blockedReason": "needs_push", - "body": "Host body", - "canCreate": false, - "defaultBaseRef": "main", - "nextAction": { - "$rpc": "null" - }, - "provider": "github", - "reviewLookupOutcome": "not_found", - "title": "Host title" - } - } - } - }, - "395c47c3d42e": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 17, - "json": "{\"id\":\"frame-7\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.getCreationEligibility\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"branch\":\"feature\",\"base\":null,\"hasUncommittedChanges\":false,\"hasUpstream\":true,\"ahead\":1,\"behind\":0,\"linkedGitHubPR\":null,\"linkedGitLabMR\":null}}" - }, - "42e0a785c289": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 16, - "args": [ - { - "name": "method", - "value": "hostedReview.getCreationEligibility" - }, - { - "name": "params", - "value": { - "ahead": 1, - "base": { - "$rpc": "null" - }, - "behind": 0, - "branch": "feature", - "hasUncommittedChanges": false, - "hasUpstream": true, - "linkedGitHubPR": { - "$rpc": "null" - }, - "linkedGitLabMR": { - "$rpc": "null" - }, - "repo": "id:repo42", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "43ccfe31d2a4": { - "outcome": { - "committed": true, - "ok": true, - "prefill": { - "base": "main", - "blockedReason": { - "$rpc": "null" - }, - "body": "Host body", - "canCreate": true, - "nextAction": { - "$rpc": "null" - }, - "provider": "github", - "reviewLookupOutcome": "not_found", - "title": "Host title" - }, - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [], - "head": "def5678", - "upstreamStatus": { - "ahead": 0, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - }, - "url": "https://review.test/5", - "warning": { - "$rpc": "undefined" - } - } - }, - "49a4ef454656": { - "name": "git.generateCommitMessage#1", - "ordinal": 10, - "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"git.generateCommitMessage\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "4e72cd693c7e": { - "name": "progress", - "ordinal": 25, - "value": "creating_review" - }, - "570c09f158bd": { - "name": "git.status#4", - "ordinal": 21, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-9", - "ok": true, - "result": { - "branch": "feature", - "entries": [], - "head": "def5678", - "upstreamStatus": { - "ahead": 0, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "682fbd1f6b74": { - "name": "progress", - "ordinal": 11, - "value": "committing" - }, - "6a9e29548c49": { - "name": "hostedReview.getCreationEligibility#2", - "ordinal": 23, - "args": [ - { - "name": "method", - "value": "hostedReview.getCreationEligibility" - }, - { - "name": "params", - "value": { - "ahead": 0, - "base": { - "$rpc": "null" - }, - "behind": 0, - "branch": "feature", - "hasUncommittedChanges": false, - "hasUpstream": true, - "linkedGitHubPR": { - "$rpc": "null" - }, - "linkedGitLabMR": { - "$rpc": "null" - }, - "repo": "id:repo42", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-10", - "ok": true, - "result": { - "blockedReason": { - "$rpc": "null" - }, - "body": "Host body", - "canCreate": true, - "defaultBaseRef": "main", - "nextAction": { - "$rpc": "null" - }, - "provider": "github", - "reviewLookupOutcome": "not_found", - "title": "Host title" - } - } - } - }, - "6b3d90cdf382": { - "name": "hostedReview.create#1", - "ordinal": 26, - "args": [ - { - "name": "method", - "value": "hostedReview.create" - }, - { - "name": "params", - "value": { - "base": "main", - "body": "Host body", - "draft": false, - "head": "feature", - "provider": "github", - "repo": "id:repo42", - "title": "Host title", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "6e227482ca80": { - "name": "git.push#1", - "ordinal": 19, - "args": [ - { - "name": "method", - "value": "git.push" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-8", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "6f8094ed6558": { - "name": "git.status#4", - "ordinal": 22, - "json": "{\"id\":\"frame-9\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "72b388fd3302": { - "outcome": "unrun" - }, - "77a1112e7648": { - "name": "hostedReview.create#1", - "ordinal": 27, - "json": "{\"id\":\"frame-11\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.create\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"provider\":\"github\",\"base\":\"main\",\"head\":\"feature\",\"title\":\"Host title\",\"body\":\"Host body\",\"draft\":false}}" - }, - "7b98416e2b81": { - "name": "git.status#3", - "ordinal": 14, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-6", - "ok": true, - "result": { - "branch": "feature", - "entries": [], - "head": "def5678", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "81faa0ecff79": { - "name": "git.bulkStage#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "git.bulkStage" - }, - { - "name": "params", - "value": { - "filePaths": ["src/new.ts"], - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "8601995022f5": { - "name": "git.status#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "8b784bb9dff5": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "committed": true, - "ok": true, - "prefill": { - "base": "main", - "blockedReason": { - "$rpc": "null" - }, - "body": "Host body", - "canCreate": true, - "nextAction": { - "$rpc": "null" - }, - "provider": "github", - "reviewLookupOutcome": "not_found", - "title": "Host title" - }, - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [], - "head": "def5678", - "upstreamStatus": { - "ahead": 0, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - }, - "url": "https://review.test/5", - "warning": { - "$rpc": "undefined" - } - } - }, - "8f3b0ba895a1": { - "name": "hostedReview.create#1", - "ordinal": 26, - "args": [ - { - "name": "method", - "value": "hostedReview.create" - }, - { - "name": "params", - "value": { - "base": "main", - "body": "Host body", - "draft": false, - "head": "feature", - "provider": "github", - "repo": "id:repo42", - "title": "Host title", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-11", - "ok": true, - "result": { - "number": 5, - "ok": true, - "url": "https://review.test/5" - } - } - } - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "962b56dc8acd": { - "name": "git.bulkStage#1", - "ordinal": 4, - "args": [ - { - "name": "method", - "value": "git.bulkStage" - }, - { - "name": "params", - "value": { - "filePaths": ["src/new.ts"], - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "96f0e8413cda": { - "name": "git.push#1", - "ordinal": 20, - "json": "{\"id\":\"frame-8\",\"deviceToken\":\"recording-device\",\"method\":\"git.push\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "982c7a7a656d": { - "name": "worktree.set#1", - "ordinal": 28, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "baseRef": "main", - "linkedPR": 5, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-12", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "9df18368de2c": { - "name": "git.status#2", - "ordinal": 7, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "b2ae4b8e30b7": { - "name": "progress", - "ordinal": 8, - "value": "generating_commit_message" - }, - "d7fed979e629": { - "name": "git.push#1", - "ordinal": 19, - "args": [ - { - "name": "method", - "value": "git.push" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "d921a388f59f": { - "name": "git.status#2", - "ordinal": 6, - "args": [ - { - "name": "method", - "value": "git.status" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "branch": "feature", - "entries": [ - { - "area": "staged", - "path": "src/app.ts", - "status": "modified" - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - } - }, - "ddee63fd3bf5": { - "name": "git.status#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.status\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "e20a71f63f51": { - "name": "git.bulkStage#1", - "ordinal": 5, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.bulkStage\",\"params\":{\"worktree\":\"id:repo42::/p\",\"filePaths\":[\"src/new.ts\"]}}" - }, - "e6dbcef99c41": { - "name": "hostedReview.getCreationEligibility#2", - "ordinal": 24, - "json": "{\"id\":\"frame-10\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.getCreationEligibility\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"branch\":\"feature\",\"base\":null,\"hasUncommittedChanges\":false,\"hasUpstream\":true,\"ahead\":0,\"behind\":0,\"linkedGitHubPR\":null,\"linkedGitLabMR\":null}}" - }, - "e83dca631c9c": { - "name": "progress", - "ordinal": 3, - "value": "staging" - }, - "f192f1898bef": { - "name": "git.commit#1", - "ordinal": 13, - "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"git.commit\",\"params\":{\"worktree\":\"id:repo42::/p\",\"message\":\"feat: recorded\"}}" - }, - "fccf28a4e541": { - "name": "progress", - "ordinal": 18, - "value": "pushing" - }, - "ffef2a178ce4": { - "name": "worktree.set#1", - "ordinal": 29, - "json": "{\"id\":\"frame-12\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.set\",\"params\":{\"worktree\":\"id:repo42::/p\",\"baseRef\":\"main\",\"linkedPR\":5}}" - } - }, - "recording": { - "scenario": "sc-create-intent-stage-commit-push-create", - "checkpoints": [ - { - "id": "initial-status-pending", - "observation": { - "sender": ["8601995022f5"], - "payloads": ["ddee63fd3bf5"], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": [] - } - }, - { - "id": "stage-pending", - "observation": { - "sender": ["1858779f58e9", "962b56dc8acd"], - "payloads": ["ddee63fd3bf5", "e20a71f63f51"], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": ["e83dca631c9c"] - } - }, - { - "id": "generate-message-pending", - "observation": { - "sender": ["1858779f58e9", "81faa0ecff79", "d921a388f59f", "10f528114aef"], - "payloads": ["ddee63fd3bf5", "e20a71f63f51", "9df18368de2c", "49a4ef454656"], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": ["e83dca631c9c", "b2ae4b8e30b7"] - } - }, - { - "id": "commit-pending", - "observation": { - "sender": [ - "1858779f58e9", - "81faa0ecff79", - "d921a388f59f", - "22cb4850c7e9", - "0f6982ada2e6" - ], - "payloads": [ - "ddee63fd3bf5", - "e20a71f63f51", - "9df18368de2c", - "49a4ef454656", - "f192f1898bef" - ], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": ["e83dca631c9c", "b2ae4b8e30b7", "682fbd1f6b74"] - } - }, - { - "id": "prefill-pending", - "observation": { - "sender": [ - "1858779f58e9", - "81faa0ecff79", - "d921a388f59f", - "22cb4850c7e9", - "0e4c5b9b4b61", - "7b98416e2b81", - "42e0a785c289" - ], - "payloads": [ - "ddee63fd3bf5", - "e20a71f63f51", - "9df18368de2c", - "49a4ef454656", - "f192f1898bef", - "201cece6e0bb", - "395c47c3d42e" - ], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": ["e83dca631c9c", "b2ae4b8e30b7", "682fbd1f6b74"] - } - }, - { - "id": "push-pending", - "observation": { - "sender": [ - "1858779f58e9", - "81faa0ecff79", - "d921a388f59f", - "22cb4850c7e9", - "0e4c5b9b4b61", - "7b98416e2b81", - "324be6bef431", - "d7fed979e629" - ], - "payloads": [ - "ddee63fd3bf5", - "e20a71f63f51", - "9df18368de2c", - "49a4ef454656", - "f192f1898bef", - "201cece6e0bb", - "395c47c3d42e", - "96f0e8413cda" - ], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": ["e83dca631c9c", "b2ae4b8e30b7", "682fbd1f6b74", "fccf28a4e541"] - } - }, - { - "id": "create-pending", - "observation": { - "sender": [ - "1858779f58e9", - "81faa0ecff79", - "d921a388f59f", - "22cb4850c7e9", - "0e4c5b9b4b61", - "7b98416e2b81", - "324be6bef431", - "6e227482ca80", - "570c09f158bd", - "6a9e29548c49", - "6b3d90cdf382" - ], - "payloads": [ - "ddee63fd3bf5", - "e20a71f63f51", - "9df18368de2c", - "49a4ef454656", - "f192f1898bef", - "201cece6e0bb", - "395c47c3d42e", - "96f0e8413cda", - "6f8094ed6558", - "e6dbcef99c41", - "77a1112e7648" - ], - "settlements": { - "run": "9270aeb7d9c6" - }, - "state": "72b388fd3302", - "effects": [ - "e83dca631c9c", - "b2ae4b8e30b7", - "682fbd1f6b74", - "fccf28a4e541", - "4e72cd693c7e" - ] - } - }, - { - "id": "settled", - "observation": { - "sender": [ - "1858779f58e9", - "81faa0ecff79", - "d921a388f59f", - "22cb4850c7e9", - "0e4c5b9b4b61", - "7b98416e2b81", - "324be6bef431", - "6e227482ca80", - "570c09f158bd", - "6a9e29548c49", - "8f3b0ba895a1", - "982c7a7a656d" - ], - "payloads": [ - "ddee63fd3bf5", - "e20a71f63f51", - "9df18368de2c", - "49a4ef454656", - "f192f1898bef", - "201cece6e0bb", - "395c47c3d42e", - "96f0e8413cda", - "6f8094ed6558", - "e6dbcef99c41", - "77a1112e7648", - "ffef2a178ce4" - ], - "settlements": { - "run": "8b784bb9dff5" - }, - "state": "43ccfe31d2a4", - "effects": [ - "e83dca631c9c", - "b2ae4b8e30b7", - "682fbd1f6b74", - "fccf28a4e541", - "4e72cd693c7e" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json b/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json deleted file mode 100644 index e5668af8453..00000000000 --- a/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.hosted-review-create", - "family": "hostedReview.create-chain", - "namedDeltas": [], - "values": { - "0122a4affef8": { - "name": "hostedReview.create#1", - "ordinal": 4, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.create\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"provider\":\"github\",\"base\":\"main\",\"head\":\"feature\",\"title\":\"Recorded title\",\"body\":\"Recorded body\",\"draft\":false}}" - }, - "121d8ad302a6": { - "name": "worktree.set#1", - "ordinal": 6, - "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.set\",\"params\":{\"worktree\":\"id:repo42::/p\",\"baseRef\":\"main\",\"linkedPR\":5}}" - }, - "147a3131d1b9": { - "name": "hostedReview.create#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "hostedReview.create" - }, - { - "name": "params", - "value": { - "base": "main", - "body": "Recorded body", - "draft": false, - "head": "feature", - "provider": "github", - "repo": "id:repo42", - "title": "Recorded title", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "number": 5, - "ok": true, - "url": "https://review.test/5" - } - } - } - }, - "2b7bba64b59e": { - "name": "git.push#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.push" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "3f946ad0279c": { - "outcome": "uncreated" - }, - "7cd929185e93": { - "name": "worktree.set#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "baseRef": "main", - "linkedPR": 5, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-3", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "840445dcb569": { - "name": "git.push#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"git.push\",\"params\":{\"worktree\":\"id:repo42::/p\"}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "9fca4a23f963": { - "outcome": { - "number": 5, - "ok": true, - "url": "https://review.test/5" - } - }, - "a95ae8a9ee57": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "number": 5, - "ok": true, - "url": "https://review.test/5" - } - }, - "b9099560487b": { - "name": "git.push#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "git.push" - }, - { - "name": "params", - "value": { - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "cbe1742f3b41": { - "name": "worktree.set#1", - "ordinal": 5, - "args": [ - { - "name": "method", - "value": "worktree.set" - }, - { - "name": "params", - "value": { - "baseRef": "main", - "linkedPR": 5, - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "dfaf8f437106": { - "name": "hostedReview.create#1", - "ordinal": 3, - "args": [ - { - "name": "method", - "value": "hostedReview.create" - }, - { - "name": "params", - "value": { - "base": "main", - "body": "Recorded body", - "draft": false, - "head": "feature", - "provider": "github", - "repo": "id:repo42", - "title": "Recorded title", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - } - }, - "recording": { - "scenario": "sc-create-pushes-then-creates", - "checkpoints": [ - { - "id": "push-pending", - "observation": { - "sender": ["b9099560487b"], - "payloads": ["840445dcb569"], - "settlements": { - "create": "9270aeb7d9c6" - }, - "state": "3f946ad0279c", - "effects": [] - } - }, - { - "id": "create-pending", - "observation": { - "sender": ["2b7bba64b59e", "dfaf8f437106"], - "payloads": ["840445dcb569", "0122a4affef8"], - "settlements": { - "create": "9270aeb7d9c6" - }, - "state": "3f946ad0279c", - "effects": [] - } - }, - { - "id": "link-pending", - "observation": { - "sender": ["2b7bba64b59e", "147a3131d1b9", "cbe1742f3b41"], - "payloads": ["840445dcb569", "0122a4affef8", "121d8ad302a6"], - "settlements": { - "create": "9270aeb7d9c6" - }, - "state": "3f946ad0279c", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["2b7bba64b59e", "147a3131d1b9", "7cd929185e93"], - "payloads": ["840445dcb569", "0122a4affef8", "121d8ad302a6"], - "settlements": { - "create": "a95ae8a9ee57" - }, - "state": "9fca4a23f963", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json b/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json deleted file mode 100644 index 265cb1b3360..00000000000 --- a/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.hosted-review-create", - "family": "hostedReview.create-chain", - "namedDeltas": [], - "values": { - "38143ba8e1d0": { - "name": "hostedReview.create#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.create\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"provider\":\"github\",\"base\":\"main\",\"head\":\"feature\",\"title\":\"Recorded title\",\"body\":\"Recorded body\",\"draft\":false}}" - }, - "a75f3e11f830": { - "name": "hostedReview.create#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "hostedReview.create" - }, - { - "name": "params", - "value": { - "base": "main", - "body": "Recorded body", - "draft": false, - "head": "feature", - "provider": "github", - "repo": "id:repo42", - "title": "Recorded title", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": { - "code": "internal", - "message": "" - }, - "id": "frame-1", - "ok": false - } - } - }, - "d14a0dd639ad": { - "outcome": { - "error": "Failed to create pull request", - "ok": false - } - }, - "e12183bfd2c3": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "Failed to create pull request", - "ok": false - } - } - }, - "recording": { - "scenario": "sc-create-refused-empty-message", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["a75f3e11f830"], - "payloads": ["38143ba8e1d0"], - "settlements": { - "create": "e12183bfd2c3" - }, - "state": "d14a0dd639ad", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json b/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json deleted file mode 100644 index 0ca5809ea79..00000000000 --- a/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.hosted-review-create", - "family": "hostedReview.create-chain", - "namedDeltas": [], - "values": { - "38143ba8e1d0": { - "name": "hostedReview.create#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.create\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"provider\":\"github\",\"base\":\"main\",\"head\":\"feature\",\"title\":\"Recorded title\",\"body\":\"Recorded body\",\"draft\":false}}" - }, - "3c6a5a164e8a": { - "outcome": { - "error": "", - "ok": false - } - }, - "702854b17b9b": { - "name": "hostedReview.create#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "hostedReview.create" - }, - { - "name": "params", - "value": { - "base": "main", - "body": "Recorded body", - "draft": false, - "head": "feature", - "provider": "github", - "repo": "id:repo42", - "title": "Recorded title", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "", - "isRpcDeliveryUnknown": true - } - } - }, - "fb4429083480": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "error": "", - "ok": false - } - } - }, - "recording": { - "scenario": "sc-create-rejected-empty-message", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["702854b17b9b"], - "payloads": ["38143ba8e1d0"], - "settlements": { - "create": "fb4429083480" - }, - "state": "3c6a5a164e8a", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json b/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json deleted file mode 100644 index ba0a4e4bfa5..00000000000 --- a/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.hosted-review-eligibility", - "family": "hostedReview.eligibility", - "namedDeltas": [], - "values": { - "24bd84c9fb40": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "blockedReason": { - "$rpc": "null" - }, - "body": "Host body", - "canCreate": true, - "defaultBaseRef": "main", - "nextAction": { - "$rpc": "null" - }, - "provider": "gitlab", - "reviewLookupOutcome": "none", - "title": "Host title" - } - }, - "2cbc383a17fc": { - "eligibility": { - "blockedReason": { - "$rpc": "null" - }, - "body": "Host body", - "canCreate": true, - "defaultBaseRef": "main", - "nextAction": { - "$rpc": "null" - }, - "provider": "gitlab", - "reviewLookupOutcome": "none", - "title": "Host title" - }, - "prefill": "unresolved" - }, - "482bc172202f": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "hostedReview.getCreationEligibility" - }, - { - "name": "params", - "value": { - "base": { - "$rpc": "null" - }, - "branch": "feature", - "linkedGitHubPR": { - "$rpc": "null" - }, - "linkedGitLabMR": { - "$rpc": "null" - }, - "repo": "id:repo42", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "pending", - "startedAt": 0 - } - }, - "485a0942bda3": { - "eligibility": "unfetched", - "prefill": "unresolved" - }, - "8bbf03da5e8d": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.getCreationEligibility\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"branch\":\"feature\",\"base\":null,\"linkedGitHubPR\":null,\"linkedGitLabMR\":null}}" - }, - "9270aeb7d9c6": { - "status": "pending", - "startedAt": 0 - }, - "ef2ac85133d3": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "hostedReview.getCreationEligibility" - }, - { - "name": "params", - "value": { - "base": { - "$rpc": "null" - }, - "branch": "feature", - "linkedGitHubPR": { - "$rpc": "null" - }, - "linkedGitLabMR": { - "$rpc": "null" - }, - "repo": "id:repo42", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "blockedReason": { - "$rpc": "null" - }, - "body": "Host body", - "canCreate": true, - "defaultBaseRef": "main", - "nextAction": { - "$rpc": "null" - }, - "provider": "gitlab", - "reviewLookupOutcome": "none", - "title": "Host title" - } - } - } - } - }, - "recording": { - "scenario": "sc-eligibility-fetched", - "checkpoints": [ - { - "id": "pending", - "observation": { - "sender": ["482bc172202f"], - "payloads": ["8bbf03da5e8d"], - "settlements": { - "fetch": "9270aeb7d9c6" - }, - "state": "485a0942bda3", - "effects": [] - } - }, - { - "id": "settled", - "observation": { - "sender": ["ef2ac85133d3"], - "payloads": ["8bbf03da5e8d"], - "settlements": { - "fetch": "24bd84c9fb40" - }, - "state": "2cbc383a17fc", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json b/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json deleted file mode 100644 index 9fbe322ab53..00000000000 --- a/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "source-control.hosted-review-eligibility", - "family": "hostedReview.eligibility", - "namedDeltas": [], - "values": { - "478df34536dc": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "base": "main", - "blockedReason": { - "$rpc": "null" - }, - "body": "", - "nextAction": { - "$rpc": "null" - }, - "provider": "github", - "reviewLookupOutcome": "unavailable", - "title": "Recorded title" - } - }, - "8bbf03da5e8d": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 2, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"hostedReview.getCreationEligibility\",\"params\":{\"repo\":\"id:repo42\",\"worktree\":\"id:repo42::/p\",\"branch\":\"feature\",\"base\":null,\"linkedGitHubPR\":null,\"linkedGitLabMR\":null}}" - }, - "a0eed8835645": { - "name": "hostedReview.getCreationEligibility#1", - "ordinal": 1, - "args": [ - { - "name": "method", - "value": "hostedReview.getCreationEligibility" - }, - { - "name": "params", - "value": { - "base": { - "$rpc": "null" - }, - "branch": "feature", - "linkedGitHubPR": { - "$rpc": "null" - }, - "linkedGitLabMR": { - "$rpc": "null" - }, - "repo": "id:repo42", - "worktree": "id:repo42::/p" - } - }, - { - "name": "options", - "value": { - "$rpc": "absent" - } - } - ], - "settlement": { - "status": "rejected", - "startedAt": 0, - "settledAt": 0, - "error": { - "category": "Error", - "message": "transport failure", - "isRpcDeliveryUnknown": true - } - } - }, - "ac13623773fe": { - "eligibility": "unfetched", - "prefill": { - "base": "main", - "blockedReason": { - "$rpc": "null" - }, - "body": "", - "nextAction": { - "$rpc": "null" - }, - "provider": "github", - "reviewLookupOutcome": "unavailable", - "title": "Recorded title" - } - } - }, - "recording": { - "scenario": "sc-prefill-unavailable-on-rejection", - "checkpoints": [ - { - "id": "settled", - "observation": { - "sender": ["a0eed8835645"], - "payloads": ["8bbf03da5e8d"], - "settlements": { - "prefill": "478df34536dc" - }, - "state": "ac13623773fe", - "effects": [] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-comment-github.json b/mobile/rpc-foundation/goldens/tk-item-comment-github.json deleted file mode 100644 index 082e8e1ec47..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-comment-github.json +++ /dev/null @@ -1,356 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-comment-github", - "family": "tasks.item-comment-github", - "namedDeltas": [], - "values": { - "1ca30ac68b76": { - "name": "detailPayload", - "ordinal": 7, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000issue\u00009" - } - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "4031bf455f49": { - "name": "mutatingStatus", - "ordinal": 5, - "value": false - }, - "53506297367b": { - "name": "itemCommentDraft", - "ordinal": 3, - "value": "" - }, - "69e396c2097f": { - "name": "github.addIssueComment#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.addIssueComment\",\"params\":{\"repo\":\"id:repo-1\",\"number\":9,\"body\":\"a comment\",\"type\":\"issue\",\"prRepo\":{\"host\":\"github.com\",\"owner\":\"owner\",\"repo\":\"repo\"}}}" - }, - "6f50ec77f02f": { - "name": "itemCommentDraft", - "ordinal": 15, - "value": "" - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "9331fbfa07e4": { - "name": "itemCommentDraft", - "ordinal": 9, - "value": "a comment" - }, - "ac15f5699a77": { - "name": "itemReviewersDraft", - "ordinal": 8, - "value": "octocat" - }, - "ae745d4c2372": { - "name": "detailPayload", - "ordinal": 14, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000issue\u00009" - } - }, - "b36fef11f7dc": { - "draft": "", - "error": "", - "item": { - "provider": "github", - "source": { - "id": "github:issue:9", - "labels": ["bug"], - "number": 9, - "repoId": "repo-1", - "reviewRequests": [], - "state": "open", - "type": "issue", - "url": "https://github.com/owner/repo/issues/9" - }, - "title": "An issue" - }, - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000issue\u00009" - } - }, - "c43ab05aed16": { - "name": "actionItem", - "ordinal": 6, - "value": { - "provider": "github", - "source": { - "id": "github:issue:9", - "labels": ["bug"], - "number": 9, - "repoId": "repo-1", - "reviewRequests": [], - "state": "open", - "type": "issue", - "url": "https://github.com/owner/repo/issues/9" - }, - "title": "An issue" - } - }, - "c445ea7e151b": { - "name": "github.addIssueComment#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.addIssueComment" - }, - { - "name": "params", - "value": { - "body": "a comment", - "number": 9, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "type": "issue" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 902 - }, - "ok": true - } - } - } - }, - "c650cf641414": { - "name": "itemReviewersDraft", - "ordinal": 4, - "value": "" - }, - "cbae54d3d351": { - "name": "mutatingStatus", - "ordinal": 16, - "value": false - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-comment-github", - "checkpoints": [ - { - "id": "comment-settled", - "observation": { - "sender": ["c445ea7e151b"], - "payloads": ["69e396c2097f"], - "settlements": { - "mount": "eb79a9b3682a", - "comment-0": "eb79a9b3682a" - }, - "state": "b36fef11f7dc", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "53506297367b", - "c650cf641414", - "4031bf455f49", - "c43ab05aed16", - "1ca30ac68b76", - "ac15f5699a77", - "9331fbfa07e4", - "3aefb3006914", - "886c60a7e62e", - "ae745d4c2372", - "6f50ec77f02f", - "cbae54d3d351" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-comment-gitlab-mr.json b/mobile/rpc-foundation/goldens/tk-item-comment-gitlab-mr.json deleted file mode 100644 index c578aa4f5f8..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-comment-gitlab-mr.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-comment-gitlab-mr", - "family": "tasks.item-comment-gitlab-mr", - "namedDeltas": [], - "values": { - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "4031bf455f49": { - "name": "mutatingStatus", - "ordinal": 5, - "value": false - }, - "474412c229f4": { - "name": "detailPayload", - "ordinal": 7, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "4c60f1fd22ca": { - "name": "gitlab.addMRComment#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.addMRComment\",\"params\":{\"repo\":\"id:repo-1\",\"iid\":7,\"body\":\"a comment\",\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}" - }, - "53506297367b": { - "name": "itemCommentDraft", - "ordinal": 3, - "value": "" - }, - "622bbddf4f05": { - "name": "actionItem", - "ordinal": 6, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - } - }, - "6f50ec77f02f": { - "name": "itemCommentDraft", - "ordinal": 15, - "value": "" - }, - "816c715cd13d": { - "name": "gitlab.addMRComment#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "gitlab.addMRComment" - }, - { - "name": "params", - "value": { - "body": "a comment", - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 905 - }, - "ok": true - } - } - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "9331fbfa07e4": { - "name": "itemCommentDraft", - "ordinal": 9, - "value": "a comment" - }, - "ac15f5699a77": { - "name": "itemReviewersDraft", - "ordinal": 8, - "value": "octocat" - }, - "c650cf641414": { - "name": "itemReviewersDraft", - "ordinal": 4, - "value": "" - }, - "cbae54d3d351": { - "name": "mutatingStatus", - "ordinal": 16, - "value": false - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "ea24a662dd3d": { - "draft": "", - "error": "", - "item": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - }, - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 905 - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "f3cb1a7df6dc": { - "name": "detailPayload", - "ordinal": 14, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 905 - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - } - }, - "recording": { - "scenario": "tk-item-comment-gitlab-mr", - "checkpoints": [ - { - "id": "comment-settled", - "observation": { - "sender": ["816c715cd13d"], - "payloads": ["4c60f1fd22ca"], - "settlements": { - "mount": "eb79a9b3682a", - "comment-0": "eb79a9b3682a" - }, - "state": "ea24a662dd3d", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "53506297367b", - "c650cf641414", - "4031bf455f49", - "622bbddf4f05", - "474412c229f4", - "ac15f5699a77", - "9331fbfa07e4", - "3aefb3006914", - "886c60a7e62e", - "f3cb1a7df6dc", - "6f50ec77f02f", - "cbae54d3d351" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-comment-gitlab.json b/mobile/rpc-foundation/goldens/tk-item-comment-gitlab.json deleted file mode 100644 index 12c817feb30..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-comment-gitlab.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-comment-gitlab", - "family": "tasks.item-comment-gitlab", - "namedDeltas": [], - "values": { - "02b5df9521e8": { - "name": "detailPayload", - "ordinal": 14, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 904 - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "17b97af91ff8": { - "draft": "", - "error": "", - "item": { - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue" - }, - "title": "A GitLab issue" - }, - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - }, - { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 904 - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "4031bf455f49": { - "name": "mutatingStatus", - "ordinal": 5, - "value": false - }, - "474412c229f4": { - "name": "detailPayload", - "ordinal": 7, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "53506297367b": { - "name": "itemCommentDraft", - "ordinal": 3, - "value": "" - }, - "6f50ec77f02f": { - "name": "itemCommentDraft", - "ordinal": 15, - "value": "" - }, - "779d1b9a2edb": { - "name": "actionItem", - "ordinal": 6, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue" - }, - "title": "A GitLab issue" - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "9331fbfa07e4": { - "name": "itemCommentDraft", - "ordinal": 9, - "value": "a comment" - }, - "ac15f5699a77": { - "name": "itemReviewersDraft", - "ordinal": 8, - "value": "octocat" - }, - "ad33e328b827": { - "name": "gitlab.addIssueComment#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.addIssueComment\",\"params\":{\"repo\":\"id:repo-1\",\"number\":4,\"body\":\"a comment\",\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}" - }, - "c650cf641414": { - "name": "itemReviewersDraft", - "ordinal": 4, - "value": "" - }, - "cbae54d3d351": { - "name": "mutatingStatus", - "ordinal": 16, - "value": false - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "d3b00d7291ae": { - "name": "gitlab.addIssueComment#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "gitlab.addIssueComment" - }, - { - "name": "params", - "value": { - "body": "a comment", - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "comment": { - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 904 - }, - "ok": true - } - } - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-comment-gitlab", - "checkpoints": [ - { - "id": "comment-settled", - "observation": { - "sender": ["d3b00d7291ae"], - "payloads": ["ad33e328b827"], - "settlements": { - "mount": "eb79a9b3682a", - "comment-0": "eb79a9b3682a" - }, - "state": "17b97af91ff8", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "53506297367b", - "c650cf641414", - "4031bf455f49", - "779d1b9a2edb", - "474412c229f4", - "ac15f5699a77", - "9331fbfa07e4", - "3aefb3006914", - "886c60a7e62e", - "02b5df9521e8", - "6f50ec77f02f", - "cbae54d3d351" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-detail-github-reactions.json b/mobile/rpc-foundation/goldens/tk-item-detail-github-reactions.json deleted file mode 100644 index a9a83fcd78e..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-detail-github-reactions.json +++ /dev/null @@ -1,372 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-detail-github", - "family": "tasks.item-detail-github", - "namedDeltas": [], - "values": { - "16125975286b": { - "name": "detailLoading", - "ordinal": 3, - "value": false - }, - "185dd46f0a38": { - "name": "detailLoading", - "ordinal": 8, - "value": true - }, - "20f8d00e8abe": { - "name": "detailLoading", - "ordinal": 12, - "value": false - }, - "4b2ed31e98ae": { - "error": "", - "item": { - "key": "github:repo-1:pr:12", - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - }, - "items": [ - { - "key": "github:repo-1:pr:12", - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - ], - "loading": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "authorAvatarUrl": "", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "reactions": [ - { - "content": "+1", - "count": 3 - }, - { - "content": "heart", - "count": 1 - } - ], - "url": "https://github.com/owner/repo/pull/12#issuecomment-901" - } - ], - "files": [], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": "APPROVED", - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "617b71ab2cc6": { - "name": "github.workItemDetails#1", - "ordinal": 11, - "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12,\"type\":\"pr\"}}" - }, - "684c16e60ccd": { - "name": "github.workItemDetails#1", - "ordinal": 10, - "args": [ - { - "name": "method", - "value": "github.workItemDetails" - }, - { - "name": "params", - "value": { - "number": 12, - "repo": "id:repo-1", - "type": "pr" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-2", - "ok": true, - "result": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "authorAvatarUrl": "", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "reactions": [ - { - "content": "+1", - "count": 3 - }, - { - "content": "heart", - "count": 1 - } - ], - "url": "https://github.com/owner/repo/pull/12#issuecomment-901" - } - ], - "files": [], - "headSha": "head-sha", - "item": { - "author": { - "$rpc": "null" - }, - "id": "pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "reviewDecision": "APPROVED", - "reviewRequests": [], - "state": "open", - "title": "A pull request", - "type": "pr", - "updatedAt": "2026-10-30T00:00:00Z", - "url": "https://github.com/owner/repo/pull/12" - }, - "pullRequestId": "PR_kwDO" - } - } - } - }, - "72c0fc81a418": { - "name": "detailPayload", - "ordinal": 4, - "value": { - "$rpc": "null" - } - }, - "7649c383b850": { - "name": "detailPayload", - "ordinal": 13, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "authorAvatarUrl": "", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "reactions": [ - { - "content": "+1", - "count": 3 - }, - { - "content": "heart", - "count": 1 - } - ], - "url": "https://github.com/owner/repo/pull/12#issuecomment-901" - } - ], - "files": [], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": "APPROVED", - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "988fd3d6f1c4": { - "name": "detailRefreshSeq", - "ordinal": 5, - "value": 0 - }, - "a4f1a8696a24": { - "name": "detailError", - "ordinal": 2, - "value": "" - }, - "b99a772c440f": { - "name": "status.get#1", - "ordinal": 9, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" - }, - "c6baeb478bf3": { - "name": "status.get#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "status.get" - }, - { - "name": "params", - "value": { - "$rpc": "undefined" - } - }, - { - "name": "options", - "value": { - "beforeSend": "[local beforeSend]", - "failWhenDisconnected": true, - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "hostDescriptor": { - "installationId": "detail-host" - }, - "runtimeId": "detail-runtime" - } - } - } - }, - "cacd48cf20dc": { - "name": "actionItem", - "ordinal": 6, - "value": { - "key": "github:repo-1:pr:12", - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - } - }, - "recording": { - "scenario": "tk-item-detail-github-reactions", - "checkpoints": [ - { - "id": "mounted", - "observation": { - "sender": ["c6baeb478bf3", "684c16e60ccd"], - "payloads": ["b99a772c440f", "617b71ab2cc6"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "4b2ed31e98ae", - "effects": [ - "cc2ece9478f0", - "a4f1a8696a24", - "16125975286b", - "72c0fc81a418", - "988fd3d6f1c4", - "cacd48cf20dc", - "185dd46f0a38", - "20f8d00e8abe", - "7649c383b850" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-detail-gitlab-reactions.json b/mobile/rpc-foundation/goldens/tk-item-detail-gitlab-reactions.json deleted file mode 100644 index a1f4c43b1b1..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-detail-gitlab-reactions.json +++ /dev/null @@ -1,365 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-detail-gitlab", - "family": "tasks.item-detail-gitlab", - "namedDeltas": [], - "values": { - "0b2033ec0891": { - "name": "gitlab.workItemDetails#1", - "ordinal": 7, - "args": [ - { - "name": "method", - "value": "gitlab.workItemDetails" - }, - { - "name": "params", - "value": { - "iid": 4, - "markViewerComments": true, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "type": "issue" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "approvalState": { - "approvalsLeft": 0, - "approvalsRequired": 1 - }, - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "authorAvatarUrl": "", - "body": "a discussion note", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "reactions": [ - { - "count": 2, - "name": "thumbsup" - } - ], - "url": "https://gitlab.example.com/group/project/-/issues/4#note_901" - } - ], - "item": { - "labels": ["bug"], - "mergeable": "MERGEABLE" - }, - "pipelineJobs": [], - "reviewers": [] - } - } - } - }, - "12958fc227ba": { - "error": "", - "item": { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "checksSummary": { - "cancelled": 0, - "failed": 0, - "neutral": 0, - "passed": 0, - "pending": 0, - "state": "none", - "total": 0 - }, - "id": "gitlab:issue:4", - "labels": ["bug"], - "mergeable": "MERGEABLE", - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "reviewDecision": "approved", - "reviewerCount": 0, - "state": "opened", - "type": "issue", - "url": "https://gitlab.com/group/project/-/issues/4" - }, - "title": "A GitLab issue" - }, - "items": [ - { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "checksSummary": { - "cancelled": 0, - "failed": 0, - "neutral": 0, - "passed": 0, - "pending": 0, - "state": "none", - "total": 0 - }, - "id": "gitlab:issue:4", - "labels": ["bug"], - "mergeable": "MERGEABLE", - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "reviewDecision": "approved", - "reviewerCount": 0, - "state": "opened", - "type": "issue", - "url": "https://gitlab.com/group/project/-/issues/4" - }, - "title": "A GitLab issue" - } - ], - "loading": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "authorAvatarUrl": "", - "body": "a discussion note", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "reactions": [ - { - "count": 2, - "name": "thumbsup" - } - ], - "url": "https://gitlab.example.com/group/project/-/issues/4#note_901" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "16125975286b": { - "name": "detailLoading", - "ordinal": 3, - "value": false - }, - "185dd46f0a38": { - "name": "detailLoading", - "ordinal": 8, - "value": true - }, - "20f8d00e8abe": { - "name": "detailLoading", - "ordinal": 12, - "value": false - }, - "274b8ecb4f73": { - "name": "actionItem", - "ordinal": 6, - "value": { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "id": "gitlab:issue:4", - "labels": ["bug"], - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "issue", - "url": "https://gitlab.com/group/project/-/issues/4" - }, - "title": "A GitLab issue" - } - }, - "5c69a0ab4415": { - "name": "actionItem", - "ordinal": 11, - "value": { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "checksSummary": { - "cancelled": 0, - "failed": 0, - "neutral": 0, - "passed": 0, - "pending": 0, - "state": "none", - "total": 0 - }, - "id": "gitlab:issue:4", - "labels": ["bug"], - "mergeable": "MERGEABLE", - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "reviewDecision": "approved", - "reviewerCount": 0, - "state": "opened", - "type": "issue", - "url": "https://gitlab.com/group/project/-/issues/4" - }, - "title": "A GitLab issue" - } - }, - "72c0fc81a418": { - "name": "detailPayload", - "ordinal": 4, - "value": { - "$rpc": "null" - } - }, - "988fd3d6f1c4": { - "name": "detailRefreshSeq", - "ordinal": 5, - "value": 0 - }, - "a4f1a8696a24": { - "name": "detailError", - "ordinal": 2, - "value": "" - }, - "b4d8ed508667": { - "name": "detailPayload", - "ordinal": 13, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "authorAvatarUrl": "", - "body": "a discussion note", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 901, - "reactions": [ - { - "count": 2, - "name": "thumbsup" - } - ], - "url": "https://gitlab.example.com/group/project/-/issues/4#note_901" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "ba6215ed3c22": { - "name": "gitlab.workItemDetails#1", - "ordinal": 9, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemDetails\",\"params\":{\"repo\":\"id:repo-1\",\"iid\":4,\"type\":\"issue\",\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"},\"markViewerComments\":true}}" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "f9f4fedb976a": { - "name": "items", - "ordinal": 10, - "value": [ - { - "key": "gitlab:repo-1:issue:4", - "provider": "gitlab", - "source": { - "checksSummary": { - "cancelled": 0, - "failed": 0, - "neutral": 0, - "passed": 0, - "pending": 0, - "state": "none", - "total": 0 - }, - "id": "gitlab:issue:4", - "labels": ["bug"], - "mergeable": "MERGEABLE", - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "reviewDecision": "approved", - "reviewerCount": 0, - "state": "opened", - "type": "issue", - "url": "https://gitlab.com/group/project/-/issues/4" - }, - "title": "A GitLab issue" - } - ] - } - }, - "recording": { - "scenario": "tk-item-detail-gitlab-reactions", - "checkpoints": [ - { - "id": "mounted", - "observation": { - "sender": ["0b2033ec0891"], - "payloads": ["ba6215ed3c22"], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "12958fc227ba", - "effects": [ - "cc2ece9478f0", - "a4f1a8696a24", - "16125975286b", - "72c0fc81a418", - "988fd3d6f1c4", - "274b8ecb4f73", - "185dd46f0a38", - "f9f4fedb976a", - "5c69a0ab4415", - "20f8d00e8abe", - "b4d8ed508667" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-detail-metadata.json b/mobile/rpc-foundation/goldens/tk-item-detail-metadata.json deleted file mode 100644 index 2c1af69792f..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-detail-metadata.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-detail-metadata", - "family": "tasks.item-detail-metadata", - "namedDeltas": [], - "values": { - "1ae1dc53b706": { - "name": "itemBodyDraft", - "ordinal": 13, - "value": "body" - }, - "4c5fe26e1c97": { - "name": "itemLabelsError", - "ordinal": 8, - "value": "" - }, - "5c50471cdd48": { - "name": "mutatingStatus", - "ordinal": 10, - "value": false - }, - "7a1299e1e3ac": { - "name": "itemLabelsLoading", - "ordinal": 9, - "value": false - }, - "9c483a675f4b": { - "name": "itemAvailableLabels", - "ordinal": 6, - "value": [] - }, - "a0ec6c8c4548": { - "labels": [], - "labelsError": "", - "labelsLoading": false, - "users": [], - "usersError": "", - "usersLoading": false - }, - "bcd7aec5dd24": { - "name": "itemAssignableUsersError", - "ordinal": 4, - "value": "" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "d191f868fc7a": { - "name": "itemAssignableUsersLoading", - "ordinal": 5, - "value": false - }, - "dc200050b5f4": { - "name": "actionItem", - "ordinal": 11, - "value": { - "provider": "github", - "source": { - "id": "github:issue:9", - "labels": ["bug"], - "number": 9, - "repoId": "repo-1", - "reviewRequests": [], - "state": "open", - "type": "issue", - "url": "https://github.com/owner/repo/issues/9" - }, - "title": "An issue" - } - }, - "df267b378e62": { - "name": "itemAssignableUsers", - "ordinal": 3, - "value": [] - }, - "e416a2404225": { - "name": "itemBodyDraft", - "ordinal": 7, - "value": "" - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "f5d301978157": { - "name": "detailPayload", - "ordinal": 12, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000issue\u00009" - } - } - }, - "recording": { - "scenario": "tk-item-detail-metadata", - "checkpoints": [ - { - "id": "mounted", - "observation": { - "sender": [], - "payloads": [], - "settlements": { - "mount": "eb79a9b3682a" - }, - "state": "a0ec6c8c4548", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "df267b378e62", - "bcd7aec5dd24", - "d191f868fc7a", - "9c483a675f4b", - "e416a2404225", - "4c5fe26e1c97", - "7a1299e1e3ac", - "5c50471cdd48", - "dc200050b5f4", - "f5d301978157", - "1ae1dc53b706" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-merge-gitlab.json b/mobile/rpc-foundation/goldens/tk-item-merge-gitlab.json deleted file mode 100644 index b5c7a650107..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-merge-gitlab.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-merge-gitlab", - "family": "tasks.item-merge-gitlab", - "namedDeltas": [], - "values": { - "104bf14d3af8": { - "name": "error", - "ordinal": 8, - "value": "" - }, - "11b6302399f9": { - "name": "mutatingStatus", - "ordinal": 10, - "value": true - }, - "3c854b38217d": { - "name": "detailPayload", - "ordinal": 6, - "value": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "40b5b543334f": { - "name": "gitlab.mergeMR#1", - "ordinal": 9, - "args": [ - { - "name": "method", - "value": "gitlab.mergeMR" - }, - { - "name": "params", - "value": { - "iid": 7, - "method": "squash", - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1" - } - }, - { - "name": "options", - "value": { - "timeoutMs": 60000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "42be1ca2bc40": { - "name": "mutatingStatus", - "ordinal": 4, - "value": false - }, - "589373883844": { - "error": "", - "item": { - "$rpc": "null" - }, - "items": [ - { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - } - ], - "mutating": false, - "payload": { - "assignees": [], - "body": "body", - "comments": [ - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "labels": ["bug"], - "pipelineJobs": [], - "provider": "gitlab" - } - }, - "81282764182b": { - "name": "itemReplyDrafts", - "ordinal": 7, - "value": { - "501": "a reply", - "comment-2": "a reply" - } - }, - "a45f1237e928": { - "name": "actionItem", - "ordinal": 5, - "value": { - "provider": "gitlab", - "source": { - "id": "gitlab:mr:7", - "labels": [], - "number": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repoId": "repo-1", - "state": "opened", - "type": "mr" - }, - "title": "A merge request" - } - }, - "aa01ca6020fb": { - "name": "itemReplyDrafts", - "ordinal": 3, - "value": {} - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "e0a9defd9b13": { - "name": "mutatingStatus", - "ordinal": 13, - "value": false - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - }, - "f7191833ef4f": { - "name": "gitlab.mergeMR#1", - "ordinal": 11, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.mergeMR\",\"params\":{\"repo\":\"id:repo-1\",\"iid\":7,\"method\":\"squash\",\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}" - }, - "fbf2ffe3d253": { - "name": "actionItem", - "ordinal": 12, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-merge-gitlab", - "checkpoints": [ - { - "id": "merge-settled", - "observation": { - "sender": ["40b5b543334f"], - "payloads": ["f7191833ef4f"], - "settlements": { - "mount": "eb79a9b3682a", - "merge-0": "eb79a9b3682a" - }, - "state": "589373883844", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "aa01ca6020fb", - "42be1ca2bc40", - "a45f1237e928", - "3c854b38217d", - "81282764182b", - "104bf14d3af8", - "11b6302399f9", - "fbf2ffe3d253", - "e0a9defd9b13" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/goldens/tk-item-metadata-github.json b/mobile/rpc-foundation/goldens/tk-item-metadata-github.json deleted file mode 100644 index 8c5a4754c46..00000000000 --- a/mobile/rpc-foundation/goldens/tk-item-metadata-github.json +++ /dev/null @@ -1,438 +0,0 @@ -{ - "goldenFormatVersion": 6, - "operation": "tasks.item-metadata-github", - "family": "tasks.item-metadata-github", - "namedDeltas": [], - "values": { - "091fa60820e6": { - "name": "github.updatePR#1", - "ordinal": 11, - "args": [ - { - "name": "method", - "value": "github.updatePR" - }, - { - "name": "params", - "value": { - "prNumber": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repo": "id:repo-1", - "updates": { - "body": "new body", - "title": "Renamed" - } - } - }, - { - "name": "options", - "value": { - "timeoutMs": 30000 - } - } - ], - "settlement": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "id": "frame-1", - "ok": true, - "result": { - "ok": true - } - } - } - }, - "14949c71727e": { - "name": "mutatingStatus", - "ordinal": 7, - "value": false - }, - "3aefb3006914": { - "name": "error", - "ordinal": 10, - "value": "" - }, - "534352bbf363": { - "name": "items", - "ordinal": 14, - "value": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "title": "Renamed", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "Renamed" - } - ] - }, - "62e92e71cb1f": { - "name": "mutatingStatus", - "ordinal": 17, - "value": false - }, - "67c9daa7195e": { - "error": "", - "item": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "title": "Renamed", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "Renamed" - }, - "items": [ - { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "title": "Renamed", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "Renamed" - } - ], - "mutating": false, - "payload": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "new body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "6b1d692015cd": { - "name": "detailPayload", - "ordinal": 9, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "886c60a7e62e": { - "name": "mutatingStatus", - "ordinal": 12, - "value": true - }, - "8f2e59bf5214": { - "name": "actionItem", - "ordinal": 15, - "value": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "title": "Renamed", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "Renamed" - } - }, - "96990f48ae85": { - "name": "detailPayload", - "ordinal": 16, - "value": { - "assignees": ["octocat"], - "baseSha": "base-sha", - "body": "new body", - "checks": [], - "comments": [ - { - "author": "octocat", - "body": "please fix", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": 501, - "isResolved": false, - "line": 12, - "path": "src/index.ts", - "threadId": "thread-1" - }, - { - "author": "octocat", - "body": "a thought", - "createdAt": "2020-01-01T00:00:00.000Z", - "id": "comment-2" - } - ], - "files": [ - { - "additions": 2, - "deletions": 1, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/index.ts", - "status": "modified", - "viewerViewedState": "UNVIEWED" - } - ], - "headSha": "head-sha", - "labels": ["bug"], - "latestReviews": [], - "provider": "github", - "pullRequestId": "PR_kwDO", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "targetKey": "repo-1\u0000owner/repo\u0000pr\u000012" - } - }, - "98fe08e442ec": { - "name": "itemRemoveAssigneesDraft", - "ordinal": 5, - "value": "" - }, - "a80ee9a342f1": { - "name": "itemAddAssigneesDraft", - "ordinal": 3, - "value": "" - }, - "b701ca439037": { - "name": "github.updatePR#1", - "ordinal": 13, - "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePR\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"prRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"},\"updates\":{\"title\":\"Renamed\",\"body\":\"new body\"}}}" - }, - "b93b4f6d74db": { - "name": "itemAddLabelsDraft", - "ordinal": 4, - "value": "" - }, - "c79fe0d83267": { - "name": "itemRemoveLabelsDraft", - "ordinal": 6, - "value": "" - }, - "cc2ece9478f0": { - "name": "actionItem", - "ordinal": 1, - "value": { - "$rpc": "null" - } - }, - "cd8620080e8a": { - "name": "actionItem", - "ordinal": 8, - "value": { - "provider": "github", - "source": { - "id": "github:pr:12", - "labels": ["bug"], - "latestReviews": [], - "number": 12, - "prRepo": { - "host": "github.com", - "owner": "owner", - "repo": "repo" - }, - "repoId": "repo-1", - "reviewDecision": { - "$rpc": "null" - }, - "reviewRequests": [], - "state": "open", - "type": "pr", - "url": "https://github.com/owner/repo/pull/12" - }, - "title": "A pull request" - } - }, - "eb79a9b3682a": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "$rpc": "undefined" - } - }, - "eda130337c99": { - "name": "detailPayload", - "ordinal": 2, - "value": { - "$rpc": "null" - } - } - }, - "recording": { - "scenario": "tk-item-metadata-github", - "checkpoints": [ - { - "id": "update-pr-settled", - "observation": { - "sender": ["091fa60820e6"], - "payloads": ["b701ca439037"], - "settlements": { - "mount": "eb79a9b3682a", - "update-pr-0": "eb79a9b3682a" - }, - "state": "67c9daa7195e", - "effects": [ - "cc2ece9478f0", - "eda130337c99", - "a80ee9a342f1", - "b93b4f6d74db", - "98fe08e442ec", - "c79fe0d83267", - "14949c71727e", - "cd8620080e8a", - "6b1d692015cd", - "3aefb3006914", - "886c60a7e62e", - "534352bbf363", - "8f2e59bf5214", - "96990f48ae85", - "62e92e71cb1f" - ] - } - } - ] - } -} diff --git a/mobile/rpc-foundation/pilot-scenarios.json b/mobile/rpc-foundation/pilot-scenarios.json index fc11501f9df..964a487a746 100644 --- a/mobile/rpc-foundation/pilot-scenarios.json +++ b/mobile/rpc-foundation/pilot-scenarios.json @@ -2742,49 +2742,6 @@ } ] }, - { - "id": "sc-eligibility-fetched", - "operation": "source-control.hosted-review-eligibility", - "family": "hostedReview.eligibility", - "sites": ["mobile/src/source-control/review/creation/mobile-hosted-review-service.ts"], - "schedules": [], - "steps": [ - { - "action": "fetch", - "id": "fetch" - }, - { - "checkpoint": "pending" - }, - { - "complete": "hostedReview.getCreationEligibility#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "branch": "feature", - "base": null, - "linkedGitHubPR": null, - "linkedGitLabMR": null - }, - "reply": { - "ok": true, - "result": { - "provider": "gitlab", - "defaultBaseRef": "main", - "title": "Host title", - "body": "Host body", - "canCreate": true, - "blockedReason": null, - "nextAction": null, - "reviewLookupOutcome": "none" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-prefill-unavailable-on-refusal", "operation": "source-control.hosted-review-eligibility", @@ -2819,115 +2776,6 @@ } ] }, - { - "id": "sc-prefill-unavailable-on-rejection", - "operation": "source-control.hosted-review-eligibility", - "family": "hostedReview.eligibility", - "sites": ["mobile/src/source-control/review/creation/mobile-hosted-review-service.ts"], - "schedules": [], - "steps": [ - { - "action": "prefill", - "id": "prefill" - }, - { - "complete": "hostedReview.getCreationEligibility#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "branch": "feature", - "base": null, - "linkedGitHubPR": null, - "linkedGitLabMR": null - }, - "reject": { - "message": "transport failure", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-create-pushes-then-creates", - "operation": "source-control.hosted-review-create", - "family": "hostedReview.create-chain", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-service.ts", - "mobile/src/source-control/review/mobile-pr-link.ts" - ], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create", - "args": { - "pushBeforeCreate": true - } - }, - { - "checkpoint": "push-pending" - }, - { - "complete": "git.push#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "create-pending" - }, - { - "complete": "hostedReview.create#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "provider": "github", - "base": "main", - "head": "feature", - "title": "Recorded title", - "body": "Recorded body", - "draft": false - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "number": 5, - "url": "https://review.test/5" - } - } - }, - { - "checkpoint": "link-pending" - }, - { - "complete": "worktree.set#1", - "params": { - "worktree": "id:repo42::/p", - "baseRef": "main", - "linkedPR": 5 - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-create-link-failure-is-non-fatal", "operation": "source-control.hosted-review-create", @@ -3042,359 +2890,6 @@ } ] }, - { - "id": "sc-create-refused-empty-message", - "operation": "source-control.hosted-review-create", - "family": "hostedReview.create-chain", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-service.ts", - "mobile/src/source-control/review/mobile-pr-link.ts" - ], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create", - "args": {} - }, - { - "complete": "hostedReview.create#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "provider": "github", - "base": "main", - "head": "feature", - "title": "Recorded title", - "body": "Recorded body", - "draft": false - }, - "reply": { - "ok": false, - "error": { - "code": "internal", - "message": "" - } - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-create-rejected-empty-message", - "operation": "source-control.hosted-review-create", - "family": "hostedReview.create-chain", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-service.ts", - "mobile/src/source-control/review/mobile-pr-link.ts" - ], - "schedules": [], - "steps": [ - { - "action": "create", - "id": "create", - "args": {} - }, - { - "complete": "hostedReview.create#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "provider": "github", - "base": "main", - "head": "feature", - "title": "Recorded title", - "body": "Recorded body", - "draft": false - }, - "reject": { - "message": "", - "deliveryUnknown": true - } - }, - { - "checkpoint": "settled" - } - ] - }, - { - "id": "sc-create-intent-stage-commit-push-create", - "operation": "source-control.create-intent", - "family": "hostedReview.create-intent", - "sites": [ - "mobile/src/source-control/review/creation/mobile-hosted-review-create-intent-runner.ts", - "mobile/src/source-control/review/creation/mobile-hosted-review-create-intent.ts" - ], - "schedules": [], - "steps": [ - { - "action": "run", - "id": "run", - "args": {} - }, - { - "checkpoint": "initial-status-pending" - }, - { - "complete": "git.status#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "abc1234", - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "area": "staged" - }, - { - "path": "src/new.ts", - "status": "untracked", - "area": "untracked" - } - ], - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - }, - { - "checkpoint": "stage-pending" - }, - { - "complete": "git.bulkStage#1", - "params": { - "worktree": "id:repo42::/p", - "filePaths": ["src/new.ts"] - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "complete": "git.status#2", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "abc1234", - "entries": [ - { - "path": "src/app.ts", - "status": "modified", - "area": "staged" - } - ], - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - }, - { - "checkpoint": "generate-message-pending" - }, - { - "complete": "git.generateCommitMessage#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "success": true, - "message": "feat: recorded" - } - } - }, - { - "checkpoint": "commit-pending" - }, - { - "complete": "git.commit#1", - "params": { - "worktree": "id:repo42::/p", - "message": "feat: recorded" - }, - "reply": { - "ok": true, - "result": { - "success": true - } - } - }, - { - "complete": "git.status#3", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "def5678", - "entries": [], - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "hasUpstream": true - } - } - } - }, - { - "checkpoint": "prefill-pending" - }, - { - "complete": "hostedReview.getCreationEligibility#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "branch": "feature", - "base": null, - "hasUncommittedChanges": false, - "hasUpstream": true, - "ahead": 1, - "behind": 0, - "linkedGitHubPR": null, - "linkedGitLabMR": null - }, - "reply": { - "ok": true, - "result": { - "provider": "github", - "defaultBaseRef": "main", - "title": "Host title", - "body": "Host body", - "canCreate": false, - "blockedReason": "needs_push", - "nextAction": null, - "reviewLookupOutcome": "not_found" - } - } - }, - { - "checkpoint": "push-pending" - }, - { - "complete": "git.push#1", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "complete": "git.status#4", - "params": { - "worktree": "id:repo42::/p" - }, - "reply": { - "ok": true, - "result": { - "branch": "feature", - "head": "def5678", - "entries": [], - "upstreamStatus": { - "ahead": 0, - "behind": 0, - "hasUpstream": true - } - } - } - }, - { - "complete": "hostedReview.getCreationEligibility#2", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "branch": "feature", - "base": null, - "hasUncommittedChanges": false, - "hasUpstream": true, - "ahead": 0, - "behind": 0, - "linkedGitHubPR": null, - "linkedGitLabMR": null - }, - "reply": { - "ok": true, - "result": { - "provider": "github", - "defaultBaseRef": "main", - "title": "Host title", - "body": "Host body", - "canCreate": true, - "blockedReason": null, - "nextAction": null, - "reviewLookupOutcome": "not_found" - } - } - }, - { - "checkpoint": "create-pending" - }, - { - "complete": "hostedReview.create#1", - "params": { - "repo": "id:repo42", - "worktree": "id:repo42::/p", - "provider": "github", - "base": "main", - "head": "feature", - "title": "Host title", - "body": "Host body", - "draft": false - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "number": 5, - "url": "https://review.test/5" - } - } - }, - { - "complete": "worktree.set#1", - "params": { - "worktree": "id:repo42::/p", - "baseRef": "main", - "linkedPR": 5 - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "settled" - } - ] - }, { "id": "sc-create-intent-unlisted-provider", "operation": "source-control.create-intent", @@ -4771,102 +4266,6 @@ } ] }, - { - "id": "pr-triage-launch", - "operation": "session.pr-triage-launch", - "family": "session.pr-triage", - "sites": ["mobile/src/source-control/review/pr-ai-triage-launch.ts"], - "schedules": [], - "steps": [ - { - "action": "launch", - "id": "launch" - }, - { - "checkpoint": "pending" - }, - { - "complete": "repo.list#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "repos": [ - { - "id": "repo-9" - } - ] - } - } - }, - { - "complete": "settings.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": [] - } - } - } - }, - { - "complete": "preflight.detectAgents#1", - "params": { - "worktreeId": "repo-9::/w" - }, - "reply": { - "ok": true, - "result": ["codex"] - } - }, - { - "complete": "agent.launchReplay#1", - "params": { - "agent": "codex", - "operationId": "1767225600000-00000000000040008000000000000001", - "target": { - "kind": "existing", - "worktree": "id:repo-9::/w" - }, - "prompt": { - "text": "Fix the failing checks", - "delivery": "submit" - }, - "launchSource": "task_page" - }, - "reply": { - "ok": true, - "result": { - "outcome": { - "kind": "terminal", - "handle": "term-1" - }, - "worktreeId": "repo-9::/w", - "receipt": { - "mode": "terminal", - "preferred": "terminal", - "reason": "user_default", - "detail": "Started a terminal agent, the default for new agent tabs in your settings." - }, - "prompt": { - "delivery": "submit", - "outcome": "handed-to-terminal" - } - } - } - }, - { - "checkpoint": "launched" - } - ] - }, { "id": "pr-triage-prompt-not-delivered", "operation": "session.pr-triage-launch", @@ -5831,96 +5230,6 @@ } ] }, - { - "id": "tk-item-detail-github-reactions", - "operation": "tasks.item-detail-github", - "family": "tasks.item-detail-github", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-item-detail-loading.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "status.get#1", - "params": { - "$undefined": true - }, - "reply": { - "ok": true, - "result": { - "runtimeId": "detail-runtime", - "hostDescriptor": { - "installationId": "detail-host" - } - } - } - }, - { - "complete": "github.workItemDetails#1", - "params": { - "number": 12, - "repo": "id:repo-1", - "type": "pr" - }, - "reply": { - "ok": true, - "result": { - "body": "body", - "comments": [ - { - "id": 901, - "author": "octocat", - "authorAvatarUrl": "", - "body": "a review comment", - "createdAt": "2020-01-01T00:00:00.000Z", - "url": "https://github.com/owner/repo/pull/12#issuecomment-901", - "reactions": [ - { - "content": "+1", - "count": 3 - }, - { - "content": "heart", - "count": 1 - } - ] - } - ], - "item": { - "id": "pr:12", - "type": "pr", - "number": 12, - "title": "A pull request", - "url": "https://github.com/owner/repo/pull/12", - "state": "open", - "updatedAt": "2026-10-30T00:00:00Z", - "author": null, - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - }, - "labels": ["bug"], - "reviewDecision": "APPROVED", - "reviewRequests": [], - "latestReviews": [] - }, - "assignees": ["octocat"], - "headSha": "head-sha", - "baseSha": "base-sha", - "pullRequestId": "PR_kwDO", - "checks": [], - "files": [] - } - } - }, - { - "checkpoint": "mounted" - } - ] - }, { "id": "tk-item-detail-gitlab", "operation": "tasks.item-detail-gitlab", @@ -5968,68 +5277,6 @@ } ] }, - { - "id": "tk-item-detail-gitlab-reactions", - "operation": "tasks.item-detail-gitlab", - "family": "tasks.item-detail-gitlab", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-item-detail-loading.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "complete": "gitlab.workItemDetails#1", - "params": { - "iid": 4, - "markViewerComments": true, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1", - "type": "issue" - }, - "reply": { - "ok": true, - "result": { - "body": "body", - "comments": [ - { - "id": 901, - "author": "octocat", - "authorAvatarUrl": "", - "body": "a discussion note", - "createdAt": "2020-01-01T00:00:00.000Z", - "url": "https://gitlab.example.com/group/project/-/issues/4#note_901", - "reactions": [ - { - "name": "thumbsup", - "count": 2 - } - ] - } - ], - "item": { - "labels": ["bug"], - "mergeable": "MERGEABLE" - }, - "assignees": [], - "pipelineJobs": [], - "reviewers": [], - "approvalState": { - "approvalsRequired": 1, - "approvalsLeft": 0 - } - } - } - }, - { - "checkpoint": "mounted" - } - ] - }, { "id": "tk-item-detail-linear", "operation": "tasks.item-detail-linear", @@ -6098,22 +5345,6 @@ } ] }, - { - "id": "tk-item-detail-metadata", - "operation": "tasks.item-detail-metadata", - "family": "tasks.item-detail-metadata", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-item-detail-metadata-effects.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "checkpoint": "mounted" - } - ] - }, { "id": "tk-list-linear-switch-back", "operation": "tasks.task-list-linear", @@ -6274,140 +5505,6 @@ } ] }, - { - "id": "tk-item-comment-github", - "operation": "tasks.item-comment-github", - "family": "tasks.item-comment-github", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-hosted-comment-review-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "comment", - "id": "comment-0" - }, - { - "complete": "github.addIssueComment#1", - "params": { - "body": "a comment", - "number": 9, - "repo": "id:repo-1", - "type": "issue", - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 902, - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z" - } - } - } - }, - { - "checkpoint": "comment-settled" - } - ] - }, - { - "id": "tk-item-comment-gitlab", - "operation": "tasks.item-comment-gitlab", - "family": "tasks.item-comment-gitlab", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-hosted-comment-review-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "comment", - "id": "comment-0" - }, - { - "complete": "gitlab.addIssueComment#1", - "params": { - "body": "a comment", - "number": 4, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 904, - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z" - } - } - } - }, - { - "checkpoint": "comment-settled" - } - ] - }, - { - "id": "tk-item-comment-gitlab-mr", - "operation": "tasks.item-comment-gitlab-mr", - "family": "tasks.item-comment-gitlab-mr", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-hosted-comment-review-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "comment", - "id": "comment-0" - }, - { - "complete": "gitlab.addMRComment#1", - "params": { - "body": "a comment", - "iid": 7, - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true, - "comment": { - "id": 905, - "author": "You", - "body": "a comment", - "createdAt": "2020-01-01T00:00:00.000Z" - } - } - } - }, - { - "checkpoint": "comment-settled" - } - ] - }, { "id": "tk-item-checks-files", "operation": "tasks.item-checks-files-github", @@ -6597,86 +5694,6 @@ } ] }, - { - "id": "tk-item-merge-gitlab", - "operation": "tasks.item-merge-gitlab", - "family": "tasks.item-merge-gitlab", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-github-reply-merge-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "merge", - "id": "merge-0" - }, - { - "complete": "gitlab.mergeMR#1", - "params": { - "iid": 7, - "method": "squash", - "projectRef": { - "host": "gitlab.com", - "path": "group/project" - }, - "repo": "id:repo-1" - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "merge-settled" - } - ] - }, - { - "id": "tk-item-metadata-github", - "operation": "tasks.item-metadata-github", - "family": "tasks.item-metadata-github", - "sites": ["mobile/src/tasks/item-detail/use-mobile-tasks-hosted-metadata-actions.tsx"], - "schedules": [], - "steps": [ - { - "action": "mount", - "id": "mount" - }, - { - "action": "update-pr", - "id": "update-pr-0" - }, - { - "complete": "github.updatePR#1", - "params": { - "prNumber": 12, - "repo": "id:repo-1", - "updates": { - "body": "new body", - "title": "Renamed" - }, - "prRepo": { - "owner": "owner", - "repo": "repo", - "host": "github.com" - } - }, - "reply": { - "ok": true, - "result": { - "ok": true - } - } - }, - { - "checkpoint": "update-pr-settled" - } - ] - }, { "id": "tk-item-metadata-gitlab", "operation": "tasks.item-metadata-gitlab", diff --git a/mobile/src/test-support/rpc-recording/changed-page-item-refusals.ts b/mobile/src/test-support/rpc-recording/changed-page-item-refusals.ts deleted file mode 100644 index 34e9a6f5c6a..00000000000 --- a/mobile/src/test-support/rpc-recording/changed-page-item-refusals.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { BRIDGE_REPLY_REFUSED, Retained, type PageRefusal } from './changed-page-refusals' - -// The reviewed native detail the Linear screen loads when the absent comments read as none. -const LINEAR_DETAIL = { - assignee: { $rpc: 'undefined' }, - children: [], - comments: [], - description: 'a description', - labels: [], - project: { $rpc: 'undefined' }, - provider: 'linear' -} - -// The task item screens copy a failed action's error into `error` state and its error effect, which later -// checkpoints still record. -export const ITEM_REFUSALS: Readonly> = { - 'matrix-tasks.item-checks-files-github.addprreviewcomment-1': { - request: 'github.addPRReviewComment#1', - checkpoints: { - 'tk-item-checks-files.result-absent:file-comment-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-checks-files-github.prfilecontents-1': { - request: 'github.prFileContents#1', - checkpoints: { - 'tk-item-checks-files.result-absent:expand-settled': ['state.error', 'effects.error'], - 'tk-item-checks-files.result-absent:file-comment-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-checks-files-github.rerunprchecks-1': { - request: 'github.rerunPRChecks#1', - checkpoints: { - 'tk-item-checks-files.result-absent:rerun-settled': ['state.error', 'effects.error'], - 'tk-item-checks-files.result-absent:viewed-settled': ['effects.error'], - 'tk-item-checks-files.result-absent:thread-settled': ['effects.error'], - 'tk-item-checks-files.result-absent:expand-settled': ['effects.error'], - 'tk-item-checks-files.result-absent:file-comment-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-checks-files-github.resolvereviewthread-1': { - request: 'github.resolveReviewThread#1', - checkpoints: { - 'tk-item-checks-files.result-absent:thread-settled': ['state.error', 'effects.error'], - 'tk-item-checks-files.result-absent:expand-settled': ['effects.error'], - 'tk-item-checks-files.result-absent:file-comment-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-checks-files-github.setprfileviewed-1': { - request: 'github.setPRFileViewed#1', - checkpoints: { - 'tk-item-checks-files.result-absent:viewed-settled': ['state.error', 'effects.error'], - 'tk-item-checks-files.result-absent:thread-settled': ['effects.error'], - 'tk-item-checks-files.result-absent:expand-settled': ['effects.error'], - 'tk-item-checks-files.result-absent:file-comment-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-comment-github-github.addissuecomment-1': { - request: 'github.addIssueComment#1', - checkpoints: { - 'tk-item-comment-github.result-absent:comment-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-comment-gitlab-gitlab.addissuecomment-1': { - request: 'gitlab.addIssueComment#1', - checkpoints: { - 'tk-item-comment-gitlab.result-absent:comment-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-comment-gitlab-mr-gitlab.addmrcomment-1': { - request: 'gitlab.addMRComment#1', - checkpoints: { - 'tk-item-comment-gitlab-mr.result-absent:comment-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-detail-github-github.workitemdetails-1': { - request: 'github.workItemDetails#1', - checkpoints: { - 'tk-item-detail-github.result-absent:mounted': ['state.error', 'effects.detailError'] - } - }, - 'matrix-tasks.item-detail-gitlab-gitlab.workitemdetails-1': { - request: 'gitlab.workItemDetails#1', - checkpoints: { - 'tk-item-detail-gitlab.result-absent:mounted': ['state.error', 'effects.detailError'] - } - }, - 'matrix-tasks.item-detail-linear-linear.getissue-1': { - request: 'linear.getIssue#1', - checkpoints: { - 'tk-item-detail-linear.result-absent:mounted': ['state.error', 'effects.detailError'] - } - }, - // Natively the absent comments read as none and the detail loads; the page's refusal fails the load - // instead (the catch shows it, the finally still resets loading). - 'matrix-tasks.item-detail-linear-linear.issuecomments-1': { - request: 'linear.issueComments#1', - checkpoints: { - 'tk-item-detail-linear.result-absent:mounted': { - state: { error: ['', BRIDGE_REPLY_REFUSED], payload: [LINEAR_DETAIL, { $rpc: 'null' }] }, - effects: [ - [ - ['detailLoading', false], - ['detailPayload', LINEAR_DETAIL] - ], - [ - ['detailError', BRIDGE_REPLY_REFUSED], - ['detailLoading', false] - ] - ] - } - } - }, - 'matrix-tasks.item-merge-gitlab-gitlab.mergemr-1': { - request: 'gitlab.mergeMR#1', - checkpoints: { - 'tk-item-merge-gitlab.result-absent:merge-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-metadata-github-github.updatepr-1': { - request: 'github.updatePR#1', - checkpoints: { - 'tk-item-metadata-github.result-absent:update-pr-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-metadata-gitlab-gitlab.updateissue-1': { - request: 'gitlab.updateIssue#1', - checkpoints: { - 'tk-item-metadata-gitlab.result-absent:update-gitlab-settled': [ - 'state.error', - 'effects.error' - ] - } - }, - 'matrix-tasks.item-metadata-gitlab-mr-gitlab.updatemr-1': { - request: 'gitlab.updateMR#1', - checkpoints: { - 'tk-item-metadata-gitlab-mr.result-absent:update-gitlab-settled': [ - 'state.error', - 'effects.error' - ] - } - }, - 'matrix-tasks.item-reply-merge-github.addissuecomment-1': { - request: 'github.addIssueComment#1', - checkpoints: { - 'tk-item-reply-merge.result-absent:issue-reply-settled': ['state.error', 'effects.error'], - 'tk-item-reply-merge.result-absent:merge-settled': ['effects.error'], - 'tk-item-reply-merge.result-absent:linear-status-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-reply-merge-github.addprreviewcommentreply-1': { - request: 'github.addPRReviewCommentReply#1', - checkpoints: { - 'tk-item-reply-merge.result-absent:review-reply-settled': ['state.error', 'effects.error'], - 'tk-item-reply-merge.result-absent:issue-reply-settled': ['effects.error'], - 'tk-item-reply-merge.result-absent:merge-settled': ['effects.error'], - 'tk-item-reply-merge.result-absent:linear-status-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-reply-merge-github.mergepr-1': { - request: 'github.mergePR#1', - checkpoints: { - 'tk-item-reply-merge.result-absent:merge-settled': ['state.error', 'effects.error'], - 'tk-item-reply-merge.result-absent:linear-status-settled': ['effects.error'] - } - }, - // Natively the absent result reads as a successful status change; the page's refusal shows the error and - // leaves the shown items as they were. - 'matrix-tasks.item-reply-merge-linear.updateissue-1': { - request: 'linear.updateIssue#1', - checkpoints: { - 'tk-item-reply-merge.result-absent:linear-status-settled': { - state: { error: ['', BRIDGE_REPLY_REFUSED] }, - effects: [ - [ - ['items', new Retained('items')], - ['mutatingStatus', false] - ], - [ - ['error', BRIDGE_REPLY_REFUSED], - ['mutatingStatus', false] - ] - ] - } - } - }, - 'matrix-tasks.item-review-github-github.prchecks-1': { - request: 'github.prChecks#1', - checkpoints: { - 'tk-item-review-github.result-absent:checks-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.item-review-github-github.requestprreviewers-1': { - request: 'github.requestPRReviewers#1', - checkpoints: { - 'tk-item-review-github.result-absent:reviewers-settled': ['state.error', 'effects.error'], - 'tk-item-review-github.result-absent:checks-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-status-gitlab-github.updateissue-1': { - request: 'github.updateIssue#1', - checkpoints: { - 'tk-item-status-gitlab.result-absent:github-metadata-settled': [ - 'state.error', - 'effects.error' - ] - } - }, - 'matrix-tasks.item-status-gitlab-gitlab.updateissue-1': { - request: 'gitlab.updateIssue#1', - checkpoints: { - 'tk-item-status-gitlab.result-absent:gitlab-status-settled': ['state.error', 'effects.error'], - 'tk-item-status-gitlab.result-absent:github-metadata-settled': ['effects.error'] - } - }, - 'matrix-tasks.item-status-gitlab-mr-gitlab.updatemrstate-1': { - request: 'gitlab.updateMRState#1', - checkpoints: { - 'tk-item-status-gitlab-mr.result-absent:gitlab-status-settled': [ - 'state.error', - 'effects.error' - ] - } - }, - 'matrix-tasks.item-detail-github-status.get-1': { - request: 'status.get#1', - checkpoints: { - 'tk-item-detail-github.result-absent:mounted': ['state.error', 'effects.detailError'] - } - }, - 'matrix-tasks.item-status-gitlab-status.get-1': { - request: 'status.get#1', - checkpoints: { - 'tk-item-status-gitlab.result-absent:github-metadata-settled': [ - 'state.error', - 'effects.error' - ] - } - } -} diff --git a/mobile/src/test-support/rpc-recording/changed-page-outcomes.ts b/mobile/src/test-support/rpc-recording/changed-page-outcomes.ts deleted file mode 100644 index 64b085089e3..00000000000 --- a/mobile/src/test-support/rpc-recording/changed-page-outcomes.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { GITHUB_EXACT_OPERATION_UNSUPPORTED } from '../../../../src/shared/github/work-items/work-item-target' -import { GITHUB_CONNECTION_CHANGED } from '../../source-control/review/github-target-invocation' -import { isKeyedObject, scriptsAbsentResultReply } from '../bridged-parity/divergence-evidence' -import { rows } from './changed-bridge-outcomes' -import { ITEM_REFUSALS } from './changed-page-item-refusals' -import { - BRIDGE_REPLY_REFUSED, - READ_AND_PROJECT_REFUSALS, - Retained, - type PageEnding -} from './changed-page-refusals' -import type { Observation, Recording, RecordingScenario } from './recording-scenario' -import type { RecordedValue } from './recording-values' - -const PAGE_REFUSALS = { ...READ_AND_PROJECT_REFUSALS, ...ITEM_REFUSALS } -export const PAGE_REFUSAL_PRODUCERS = Object.keys(PAGE_REFUSALS) - -// The error each side shows for the refused request. The GitHub exact-target check maps its own failures: -// natively an unreadable answer says to update the server, while the page's refusal of that frame is a failed -// transport check, which says the connection changed. -function copies(request: string): readonly [native: string, page: string] { - const method = request.replace(/#.*$/, '') - return method === 'status.get' - ? [GITHUB_EXACT_OPERATION_UNSUPPORTED, GITHUB_CONNECTION_CHANGED] - : [`The host sent a reply this app could not read (${method})`, BRIDGE_REPLY_REFUSED] -} - -const same = (left: unknown, right: unknown) => JSON.stringify(left) === JSON.stringify(right) - -function acceptsAbsentResult(attempt: Record): boolean { - const settlement = attempt.settlement - return ( - isKeyedObject(settlement) && - settlement.status === 'fulfilled' && - isKeyedObject(settlement.value) && - settlement.value.ok === true && - !Object.hasOwn(settlement.value, 'result') - ) -} - -// Replace one named slot after checking it holds the reviewed native value, so a stale case fails. -function edit( - observation: Observation, - path: string, - native: RecordedValue, - page: RecordedValue -): void { - if (path.startsWith('effects.')) { - const name = path.slice('effects.'.length) - const matches = rows(observation.effects).filter( - (effect) => effect.name === name && same(effect.value, native) - ) - if (matches.length !== 1) { - throw new Error(`Expected one reviewed ${name} effect holding ${JSON.stringify(native)}`) - } - matches[0]!.value = page - return - } - const keys = path.replace(/\[(\d+)\]/g, '.$1').split('.') - const last = keys.pop()! - let container: unknown = observation - for (const key of keys) { - container = Array.isArray(container) - ? container[Number(key)] - : isKeyedObject(container) - ? container[key] - : undefined - } - const stale = () => - new Error(`Reviewed native slot ${path} no longer holds ${JSON.stringify(native)}`) - if (Array.isArray(container)) { - if (!same(container[Number(last)], native)) { - throw stale() - } - container[Number(last)] = page - } else if (isKeyedObject(container) && same(container[last], native)) { - container[last] = page - } else { - throw stale() - } -} - -function end(observation: Observation, ending: PageEnding): void { - for (const [key, [native, page]] of Object.entries(ending.state)) { - edit(observation, `state.${key}`, native, page) - } - const [native, page] = ending.effects - const effects = rows(observation.effects) - const tail = effects.slice(-native.length) - const shown = (value: RecordedValue | Retained) => - value instanceof Retained - ? isKeyedObject(observation.state) - ? observation.state[value.key] - : undefined - : value - if ( - tail.length !== native.length || - page.length > native.length || - native.some(([name, value], index) => { - const effect = tail[index]! - return effect.name !== name || !same(effect.value, shown(value)) - }) - ) { - throw new Error( - `Reviewed native golden no longer ends with ${native.map(([name]) => name).join(', ')}` - ) - } - observation.effects = [ - ...effects.slice(0, -native.length), - ...page.map(([name, value], index) => ({ name, ordinal: tail[index]!.ordinal, value })) - ] -} - -/** - * The expected page recording of a changed producer, built from its reviewed native golden and declared - * page refusals alone, before any page run is judged. Both page modes refuse the injected absent result - * alike (reply metadata adds no result), so one expectation serves each. Every other field stays native. - */ -export function pageExpectation( - id: string, - expected: Recording, - scenarios: readonly RecordingScenario[] -): Recording { - const refusal = PAGE_REFUSALS[id] - const declared = new Set(Object.keys(refusal?.checkpoints ?? {})) - const checkpoints = expected.checkpoints.map((checkpoint) => { - const absent = rows(checkpoint.observation.sender).filter(acceptsAbsentResult) - if (!absent.length && !declared.has(checkpoint.id)) { - return checkpoint - } - const slots = refusal?.checkpoints[checkpoint.id] - const source = - scenarios.length === 1 - ? scenarios[0] - : scenarios.find((scenario) => checkpoint.id.startsWith(`${scenario.id}:`)) - if ( - !refusal || - !slots || - !source || - !scriptsAbsentResultReply(source) || - absent.length !== 1 || - absent[0]!.name !== refusal.request - ) { - throw new Error(`Undeclared or stale page refusal: ${id} ${checkpoint.id}`) - } - declared.delete(checkpoint.id) - const observation: Observation = structuredClone(checkpoint.observation) - const attempt = rows(observation.sender).find((entry) => entry.name === refusal.request)! - const settlement = attempt.settlement - if (!isKeyedObject(settlement)) { - throw new Error(`Missing reviewed settlement: ${refusal.request}`) - } - const { value: _value, ...timing } = settlement - attempt.settlement = { - ...timing, - status: 'rejected', - error: { - category: 'BridgeReplyRefusedError', - message: BRIDGE_REPLY_REFUSED, - isRpcDeliveryUnknown: true - } - } - if ('effects' in slots) { - end(observation, slots) - } else { - const [native, page] = copies(refusal.request) - for (const slot of slots) { - edit(observation, slot, native, page) - } - } - return { ...checkpoint, observation } - }) - if (declared.size) { - throw new Error( - `Declared page refusal has no reviewed checkpoint: ${id} ${[...declared].join(', ')}` - ) - } - return { ...expected, checkpoints } -} diff --git a/mobile/src/test-support/rpc-recording/changed-page-refusals.ts b/mobile/src/test-support/rpc-recording/changed-page-refusals.ts deleted file mode 100644 index 61278a2d8ef..00000000000 --- a/mobile/src/test-support/rpc-recording/changed-page-refusals.ts +++ /dev/null @@ -1,197 +0,0 @@ -import type { RecordedValue } from './recording-values' - -// The finite page outcomes of the changed producers' injected absent results, by producer and checkpoint. - -export const BRIDGE_REPLY_REFUSED = 'the reply could not be read (unrecognised-message)' - -/** A native effect value that equals what native state still shows under this key. */ -export class Retained { - constructor(readonly key: string) {} -} - -/** Where the page run ends differently from native, each edit naming the native value it replaces. */ -export type PageEnding = { - readonly state: Readonly> - /** Native's last effects the page does not reach, then the page's own at the same ordinals. */ - readonly effects: readonly [ - native: readonly (readonly [name: string, value: RecordedValue | Retained])[], - page: readonly (readonly [name: string, value: RecordedValue])[] - ] -} - -/** - * The bound request whose injected absent result the page refuses, and each checkpoint that observes that - * refusal: the slots where the screen copies the request's error (none where it shows nothing), or the - * different ending the screen reaches instead. - */ -export type PageRefusal = { - readonly request: string - readonly checkpoints: Readonly> -} - -// The read surface copies each read's error into that read's own settlement and state. -function surfaceRead(request: string, key: string, checkpoints: readonly string[]): PageRefusal { - const slots = [`settlements.${key}.value.error`, `state.${key}.error`] - return { - request, - checkpoints: Object.fromEntries( - checkpoints.map((checkpoint) => [`pr-read-surface.result-absent:${checkpoint}`, slots]) - ) - } -} - -const AFTER_WORK_ITEM = ['work-item', 'checks', 'check-details', 'assignable'] -const AFTER_HOSTED_REVIEW = ['hosted-review', 'pr-for-branch', ...AFTER_WORK_ITEM] - -export const READ_AND_PROJECT_REFUSALS: Readonly> = { - 'matrix-tasks.item-review-github-pr-check-discovery': { - request: 'status.get#1', - checkpoints: { 'tk-item-review-github.result-absent:checks-settled': [] } - }, - 'matrix-github.pr-read-github.listassignableusers-1': surfaceRead( - 'github.listAssignableUsers#1', - 'assignable', - ['assignable'] - ), - 'matrix-github.pr-read-github.prcheckdetails-1': surfaceRead( - 'github.prCheckDetails#1', - 'check-details', - ['check-details', 'assignable'] - ), - 'matrix-github.pr-read-github.prchecks-1': surfaceRead('github.prChecks#1', 'checks', [ - 'checks', - 'check-details', - 'assignable' - ]), - 'matrix-github.pr-read-github.prforbranch-1': surfaceRead( - 'github.prForBranch#1', - 'pr-for-branch', - ['pr-for-branch', ...AFTER_WORK_ITEM] - ), - 'matrix-github.pr-read-github.reposlug-1': surfaceRead('github.repoSlug#1', 'repo-slug', [ - 'repo-slug', - ...AFTER_HOSTED_REVIEW - ]), - 'matrix-github.pr-read-github.workitemdetails-1': surfaceRead( - 'github.workItemDetails#1', - 'work-item', - AFTER_WORK_ITEM - ), - 'matrix-github.pr-read-hostedreview.forbranch-1': surfaceRead( - 'hostedReview.forBranch#1', - 'hosted-review', - AFTER_HOSTED_REVIEW - ), - 'matrix-github.pr-read-status.get-1': surfaceRead('status.get#1', 'assignable', ['assignable']), - 'matrix-tasks.linear-item-linear.addissuecomment-1': { - request: 'linear.addIssueComment#1', - checkpoints: { - 'tk-linear-item.result-absent:comment-settled': ['state.error', 'effects.error'], - 'tk-linear-item.result-absent:sub-issue-open-settled': ['effects.error'], - 'tk-linear-item.result-absent:sub-issue-create-settled': ['effects.error'] - } - }, - 'matrix-tasks.linear-item-linear.createissue-1': { - request: 'linear.createIssue#1', - checkpoints: { - 'tk-linear-item.result-absent:sub-issue-create-settled': ['state.error', 'effects.error'] - } - }, - 'matrix-tasks.linear-item-linear.getissue-1': { - request: 'linear.getIssue#1', - checkpoints: { - 'tk-linear-item.result-absent:sub-issue-open-settled': ['state.error', 'effects.error'], - 'tk-linear-item.result-absent:sub-issue-create-settled': ['effects.error'] - } - }, - 'matrix-tasks.linear-team-context-linear.listteams-1': { - request: 'linear.listTeams#1', - checkpoints: { - 'tk-linear-team-context.result-absent:open-composer-settled': [], - 'tk-linear-team-context.result-absent:select-metadata-item-settled': [] - } - }, - 'matrix-tasks.linear-team-context-linear.teamstates-1': { - request: 'linear.teamStates#1', - checkpoints: { - 'tk-linear-team-context.result-absent:select-metadata-item-settled': [] - } - }, - 'matrix-tasks.project-row-detail-github.project.workitemdetailsbyslug-1': { - request: 'github.project.workItemDetailsBySlug#1', - checkpoints: { - 'tk-project-row-detail.result-absent:mounted': [ - 'state.error', - 'effects.projectRowDetailError' - ] - } - }, - 'matrix-tasks.project-row-files-merge-github.addprreviewcomment-1': { - request: 'github.addPRReviewComment#1', - checkpoints: { - 'tk-project-row-files-merge.result-absent:file-comment-settled': [ - 'state.error', - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:merge-settled': ['effects.projectRowDetailError'], - 'tk-project-row-files-merge.result-absent:issue-state-settled': [ - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:pr-state-settled': ['effects.projectRowDetailError'] - } - }, - 'matrix-tasks.project-row-files-merge-github.mergepr-1': { - request: 'github.mergePR#1', - checkpoints: { - 'tk-project-row-files-merge.result-absent:merge-settled': [ - 'state.error', - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:issue-state-settled': [ - 'state.error', - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:pr-state-settled': [ - 'state.error', - 'effects.projectRowDetailError' - ] - } - }, - 'matrix-tasks.project-row-files-merge-github.prfilecontents-1': { - request: 'github.prFileContents#1', - checkpoints: { - 'tk-project-row-files-merge.result-absent:expand-settled': [ - 'state.error', - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:file-comment-settled': [ - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:merge-settled': ['effects.projectRowDetailError'], - 'tk-project-row-files-merge.result-absent:issue-state-settled': [ - 'effects.projectRowDetailError' - ], - 'tk-project-row-files-merge.result-absent:pr-state-settled': ['effects.projectRowDetailError'] - } - }, - 'matrix-tasks.project-row-files-merge-github.updateissue-1': { - request: 'github.updateIssue#1', - checkpoints: { - 'tk-project-row-files-merge.result-absent:issue-state-settled': [], - 'tk-project-row-files-merge.result-absent:pr-state-settled': [] - } - }, - 'matrix-tasks.project-row-files-merge-github.updateprstate-1': { - request: 'github.updatePRState#1', - checkpoints: { - 'tk-project-row-files-merge.result-absent:pr-state-settled': [] - } - }, - 'matrix-tasks.project-row-files-merge-status.get-1': { - request: 'status.get#1', - checkpoints: { - 'tk-project-row-files-merge.result-absent:issue-state-settled': [], - 'tk-project-row-files-merge.result-absent:pr-state-settled': [] - } - } -} From 5e0743213996111112ab1b4fc485217ba2eab6e0 Mon Sep 17 00:00:00 2001 From: Jinjing <6427696+AmethystLiang@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:09:55 -0800 Subject: [PATCH 10/49] fix(dev): omit search opt-in when seeding profiles (#42137) --- .../scripts/development/profile-seeding/dev-profile-seed.mjs | 4 ++++ .../development/profile-seeding/dev-profile-seed.test.mjs | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/config/scripts/development/profile-seeding/dev-profile-seed.mjs b/config/scripts/development/profile-seeding/dev-profile-seed.mjs index bb92fc71d42..9af198f4d41 100644 --- a/config/scripts/development/profile-seeding/dev-profile-seed.mjs +++ b/config/scripts/development/profile-seeding/dev-profile-seed.mjs @@ -93,6 +93,10 @@ function pickSeededDomains(domains) { picked[domain] = domains[domain] } } + if (picked.settings) { + picked.settings = { ...picked.settings } + delete picked.settings.aiVaultSearch + } return picked } diff --git a/config/scripts/development/profile-seeding/dev-profile-seed.test.mjs b/config/scripts/development/profile-seeding/dev-profile-seed.test.mjs index b0c83a5079e..7f1cfa3b4c3 100644 --- a/config/scripts/development/profile-seeding/dev-profile-seed.test.mjs +++ b/config/scripts/development/profile-seeding/dev-profile-seed.test.mjs @@ -49,7 +49,10 @@ function createSourceProfile() { ) const insert = db.prepare("INSERT INTO profile_state_documents VALUES (?, ?, 1, 1, 0, 'hash')") insert.run('repos', JSON.stringify([{ id: 'repo-1', path: '/src/app' }])) - insert.run('settings', JSON.stringify({ theme: 'dark' })) + insert.run( + 'settings', + JSON.stringify({ theme: 'dark', aiVaultSearch: { enabled: true, historyDays: null } }) + ) insert.run('sshTargets', JSON.stringify([{ id: 'ssh-1' }])) insert.run('workspaceSession', JSON.stringify({ tabsByWorktree: { a: [] } })) insert.run('sshRemotePtyLeases', JSON.stringify([{ ptyId: 'p' }])) From d112b017c7926eaae033606e1213129c79e72774 Mon Sep 17 00:00:00 2001 From: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com> Date: Fri, 13 Nov 2026 16:12:30 -0500 Subject: [PATCH 11/49] fix(orchestration): a reuse start takes an agent mid-turn instead of waiting for idle (#42114) --- .../construction/runtime-identity-state.ts | 4 +- .../input/terminal-agent-prompt-render.ts | 1 + .../wait/launched-agent-composer-readiness.ts | 7 +++- .../reused-agent-mid-turn-readiness.test.ts | 37 +++++++++++++++++++ .../wait/terminal-delivery-refusal.ts | 10 +++++ .../terminal/wait/terminal-idle-polls.ts | 14 ++++--- .../wait/terminal-wait-settlements.ts | 23 ++++++------ .../runtime/terminal/wait/terminal-wait.ts | 27 +++++++++++--- .../runtime/terminal/wait/terminal-waiter.ts | 2 + .../terminal/wait/tui-idle-evidence-source.ts | 2 + 10 files changed, 103 insertions(+), 24 deletions(-) create mode 100644 src/main/runtime/terminal/wait/reused-agent-mid-turn-readiness.test.ts diff --git a/src/main/runtime/construction/runtime-identity-state.ts b/src/main/runtime/construction/runtime-identity-state.ts index ea4a9ce5aa7..6b0383c745f 100644 --- a/src/main/runtime/construction/runtime-identity-state.ts +++ b/src/main/runtime/construction/runtime-identity-state.ts @@ -91,6 +91,7 @@ export abstract class OrcaRuntimeWithRuntimeId extends RuntimeConstructionServic } protected abstract claimIdleShellPromptForPty(ptyId: string): Promise + protected abstract isAgentSettledForDelivery(ptyId: string): boolean protected abstract terminalHandleAccess(): TerminalHandleAccess protected readonly runtimeId = randomUUID() @@ -339,7 +340,8 @@ export abstract class OrcaRuntimeWithRuntimeId extends RuntimeConstructionServic getHookTurn: (ptyId, agent) => this.readTuiIdleHookTurnForPty(ptyId, agent), readScreenLines: (ptyId) => this.readLiveTerminalScreenLines(ptyId), readRuledScreen: (ptyId) => this.readRuledScreen(ptyId), - getOutputClockAt: (ptyId) => this.readOutputClockAt(ptyId) + getOutputClockAt: (ptyId) => this.readOutputClockAt(ptyId), + isSettledForDelivery: (ptyId) => this.isAgentSettledForDelivery(ptyId) } protected readonly terminalIdlePolls = new RuntimeTerminalIdlePolls({ diff --git a/src/main/runtime/terminal/input/terminal-agent-prompt-render.ts b/src/main/runtime/terminal/input/terminal-agent-prompt-render.ts index 92bc15fe592..8e3fcf077dd 100644 --- a/src/main/runtime/terminal/input/terminal-agent-prompt-render.ts +++ b/src/main/runtime/terminal/input/terminal-agent-prompt-render.ts @@ -197,6 +197,7 @@ export abstract class OrcaRuntimeWithCreateAgentPromptRenderGate extends OrcaRun timeoutMs?: number signal?: AbortSignal launchReadiness?: boolean + acceptsMidTurnInput?: boolean } ): Promise { // Switch point: a saved pane main holds with no terminal yet starts first (once, shared). diff --git a/src/main/runtime/terminal/wait/launched-agent-composer-readiness.ts b/src/main/runtime/terminal/wait/launched-agent-composer-readiness.ts index ca2c71375d9..3008d1cad24 100644 --- a/src/main/runtime/terminal/wait/launched-agent-composer-readiness.ts +++ b/src/main/runtime/terminal/wait/launched-agent-composer-readiness.ts @@ -225,7 +225,12 @@ export async function waitForWorkerAgentReady( ? waitWatchingForAgentExit(runtime, handle, agent, args.creation, undefined, (signal) => waitForWorkerStartComposer(runtime, handle, agent, args.timeoutMs, signal) ) - : runtime.waitForTerminal(handle, { condition: 'tui-idle', timeoutMs: args.timeoutMs })) + : // A reused pane's agent queues or steers a task sent mid-turn, as it does mail. + runtime.waitForTerminal(handle, { + condition: 'tui-idle', + timeoutMs: args.timeoutMs, + acceptsMidTurnInput: true + })) return args.reusesTerminal ? result : requireFreshReadiness(runtime, handle, args.creation, result) diff --git a/src/main/runtime/terminal/wait/reused-agent-mid-turn-readiness.test.ts b/src/main/runtime/terminal/wait/reused-agent-mid-turn-readiness.test.ts new file mode 100644 index 00000000000..c4ba4f86762 --- /dev/null +++ b/src/main/runtime/terminal/wait/reused-agent-mid-turn-readiness.test.ts @@ -0,0 +1,37 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import { createTranscriptPane } from '../../orca-runtime-tests/agent-transcript-pane-test-harness' +import { waitForWorkerAgentReady } from './launched-agent-composer-readiness' + +vi.mock('electron', () => ({ + BrowserWindow: { fromId: vi.fn(() => null) }, + webContents: { fromId: vi.fn(() => null) }, + ipcMain: { on: vi.fn(), removeListener: vi.fn() }, + app: { getPath: vi.fn(() => '/tmp') } +})) + +describe('a worker start reusing a pane whose agent is mid-turn', () => { + afterEach(() => { + vi.restoreAllMocks() + }) + + // Claude's spinner title while a turn runs. + function midTurnClaudePane() { + return createTranscriptPane({ + paneTitle: 'Terminal', + foregroundProcess: 'claude', + data: '\x1b]0;⠂ Watch PR checks\x07✻ Running gh pr checks --watch…\r\n', + launchAgent: 'claude' + }) + } + + it('is ready at once, since the agent queues a task sent mid-turn', async () => { + const pane = await midTurnClaudePane() + await expect( + waitForWorkerAgentReady(pane.runtime, pane.handle, { + agent: undefined, + reusesTerminal: true, + timeoutMs: 150 + }) + ).resolves.toMatchObject({ satisfied: true }) + }) +}) diff --git a/src/main/runtime/terminal/wait/terminal-delivery-refusal.ts b/src/main/runtime/terminal/wait/terminal-delivery-refusal.ts index 5750a2ec1d1..56e194d187a 100644 --- a/src/main/runtime/terminal/wait/terminal-delivery-refusal.ts +++ b/src/main/runtime/terminal/wait/terminal-delivery-refusal.ts @@ -1,5 +1,6 @@ import type { MailboxDeliveryHold } from '../../orchestration/mailbox/delivery-hold/mailbox-delivery-hold' import { isTuiIdleReadyVerdict, type TuiIdleVerdict } from './tui-idle-evidence' +import type { TuiIdleEvidenceSource } from './tui-idle-evidence-source' /** Why pointer plus Enter would not be typed into a settled-looking worker terminal now (dialogs and * drafts are checked first); null means it would. Takes the waits' readiness ranking plus a working @@ -26,3 +27,12 @@ export function terminalDeliveryRefusal(input: { ? { kind: 'blocked', reason: verdict.reason } : { kind: 'unsettled' } } + +/** A wait that accepts mid-turn input settles on a working agent exactly where mail would be typed in. */ +export function settlesForMidTurnInput( + verdict: TuiIdleVerdict, + ptyId: string, + source: Pick +): boolean { + return verdict.kind === 'working' && source.isSettledForDelivery?.(ptyId) === true +} diff --git a/src/main/runtime/terminal/wait/terminal-idle-polls.ts b/src/main/runtime/terminal/wait/terminal-idle-polls.ts index b460abb4897..511a3039da5 100644 --- a/src/main/runtime/terminal/wait/terminal-idle-polls.ts +++ b/src/main/runtime/terminal/wait/terminal-idle-polls.ts @@ -9,6 +9,7 @@ import { buildPtyTerminalWaitResult } from './terminal-wait-results' import { buildTerminalWaitText } from './terminal-wait-tail-state' +import { settlesForMidTurnInput } from './terminal-delivery-refusal' import { evaluateTuiIdle, type QuietForegroundLane, type TuiIdleVerdict } from './tui-idle-evidence' import { outputClockOf, @@ -56,6 +57,8 @@ type IdlePollEntry = { /** One reading of a waiter's pane, and the results it would settle with. */ type IdlePollSample = { verdict: TuiIdleVerdict + /** A mid-turn agent that takes input settles a waiter that accepts it. */ + takesInputNow: boolean ptyId: string ready(): RuntimeTerminalWait blocked(reason: RuntimeTerminalWaitBlockedReason): RuntimeTerminalWait @@ -116,11 +119,12 @@ export class RuntimeTerminalIdlePolls { const { pty } = entry const readWaitText = () => buildTerminalWaitText(pty.tailBuffer, pty.tailPartialLine, pty.preview) + const evidence = ptyTuiIdleEvidence(this.deps, pty, readWaitText) + const verdict = evaluateTuiIdle({ ...evidence, launchReadiness: entry.waiter.launchReadiness }) return { - verdict: evaluateTuiIdle({ - ...ptyTuiIdleEvidence(this.deps, pty, readWaitText), - launchReadiness: entry.waiter.launchReadiness - }), + verdict, + takesInputNow: + !!entry.waiter.acceptsMidTurnInput && settlesForMidTurnInput(verdict, pty.ptyId, this.deps), ptyId: pty.ptyId, ready: () => buildPtyTerminalWaitResult(handle, 'tui-idle', pty), blocked: (reason) => buildPtyTerminalWaitBlockedResult(handle, 'tui-idle', pty, reason), @@ -144,7 +148,7 @@ export class RuntimeTerminalIdlePolls { return } // Strong readiness outranks unscoped dialog wording elsewhere on the screen. - if (verdict.kind === 'ready-strong') { + if (verdict.kind === 'ready-strong' || sample.takesInputNow) { this.settle(entry, sample.ready()) return } diff --git a/src/main/runtime/terminal/wait/terminal-wait-settlements.ts b/src/main/runtime/terminal/wait/terminal-wait-settlements.ts index f94565d90a0..83e2748f8bd 100644 --- a/src/main/runtime/terminal/wait/terminal-wait-settlements.ts +++ b/src/main/runtime/terminal/wait/terminal-wait-settlements.ts @@ -8,8 +8,8 @@ import { import type { AgentStatus } from '../../../../shared/agent-status/title/agent-title-core' import { detectExplicitIdleStatusFromTitle } from './terminal-wait-detection' import { buildTerminalWaitText } from './terminal-wait-tail-state' -import { evaluateTuiIdle, type TuiIdleVerdict } from './tui-idle-evidence' -import { terminalDeliveryRefusal } from './terminal-delivery-refusal' +import { evaluateTuiIdle } from './tui-idle-evidence' +import { settlesForMidTurnInput, terminalDeliveryRefusal } from './terminal-delivery-refusal' import { ptyTuiIdleEvidence } from './tui-idle-evidence-source' import { TUI_IDLE_QUIESCENCE_MS } from './terminal-idle-policy' import { USER_INPUT_HOLD_CAP_MS } from './claude-open-dialog-hold' @@ -44,14 +44,21 @@ export abstract class OrcaRuntimeWithResolveExitWaiters extends OrcaRuntimeWithB return } // Re-rank titles: weak readiness cannot see tail-truncated dialogs and must wait for a rendered-screen poll. - const verdict = this.evaluateTuiIdleForPty(pty) + const evidence = ptyTuiIdleEvidence(this.tuiIdleEvidenceSource, pty, () => + buildTerminalWaitText(pty.tailBuffer, pty.tailPartialLine, pty.preview) + ) + const verdict = evaluateTuiIdle(evidence) for (const waiter of waiters) { if (verdict.kind === 'blocked') { this.terminalWaiters.resolve( waiter, buildPtyTerminalWaitBlockedResult(waiter.handle, 'tui-idle', pty, verdict.reason) ) - } else if (verdict.kind === 'ready-strong') { + } else if ( + verdict.kind === 'ready-strong' || + (waiter.acceptsMidTurnInput && + settlesForMidTurnInput(verdict, ptyId, this.tuiIdleEvidenceSource)) + ) { this.terminalWaiters.resolve( waiter, buildPtyTerminalWaitResult(waiter.handle, 'tui-idle', pty) @@ -193,14 +200,6 @@ export abstract class OrcaRuntimeWithResolveExitWaiters extends OrcaRuntimeWithB : !!readTerminalComposerTypedText(context) } - protected evaluateTuiIdleForPty(pty: RuntimePtyWorktreeRecord): TuiIdleVerdict { - return evaluateTuiIdle( - ptyTuiIdleEvidence(this.tuiIdleEvidenceSource, pty, () => - buildTerminalWaitText(pty.tailBuffer, pty.tailPartialLine, pty.preview) - ) - ) - } - protected getAdoptedPtyExplicitIdleStatus(pty: RuntimePtyWorktreeRecord): AgentStatus | null { const title = pty.lastOscTitle ?? this.getAdoptedPtyTitle(pty) return title ? detectExplicitIdleStatusFromTitle(title) : null diff --git a/src/main/runtime/terminal/wait/terminal-wait.ts b/src/main/runtime/terminal/wait/terminal-wait.ts index f26b02f37bd..2d23683b961 100644 --- a/src/main/runtime/terminal/wait/terminal-wait.ts +++ b/src/main/runtime/terminal/wait/terminal-wait.ts @@ -12,6 +12,7 @@ import { readsTrustedScreen } from '../../agent-state-rules/agent-state-rules-en import { showsScreenProbeBanner } from '../../agent-state-rules/agent-state-text-anchors' import { buildTerminalWaitText } from './terminal-wait-tail-state' import { evaluateTuiIdle, type TuiIdleVerdict } from './tui-idle-evidence' +import { settlesForMidTurnInput } from './terminal-delivery-refusal' import { outputClockOf, ptyTuiIdleEvidence, @@ -61,8 +62,19 @@ export class RuntimeTerminalWait { ) {} /** Why one helper: the immediate check and the poll must rank the same terminal the same way. */ - private evaluate(pty: RuntimePtyWorktreeRecord, waitText: string): TuiIdleVerdict { - return evaluateTuiIdle(ptyTuiIdleEvidence(this.deps, pty, () => waitText)) + private evaluate( + pty: RuntimePtyWorktreeRecord, + waitText: string, + acceptsMidTurnInput: boolean | undefined + ): { verdict: TuiIdleVerdict; ready: boolean } { + const evidence = ptyTuiIdleEvidence(this.deps, pty, () => waitText) + const verdict = evaluateTuiIdle(evidence) + return { + verdict, + ready: + verdict.kind === 'ready-strong' || + (!!acceptsMidTurnInput && settlesForMidTurnInput(verdict, pty.ptyId, this.deps)) + } } async wait( @@ -73,6 +85,8 @@ export class RuntimeTerminalWait { signal?: AbortSignal /** Main-internal, never on the wire: see `TerminalWaiter.launchReadiness`. */ launchReadiness?: boolean + /** Main-internal, never on the wire: see `TerminalWaiter.acceptsMidTurnInput`. */ + acceptsMidTurnInput?: boolean } ): Promise { const condition = options?.condition ?? 'exit' @@ -85,11 +99,13 @@ export class RuntimeTerminalWait { } const waitText = buildTerminalWaitText(pty.tailBuffer, pty.tailPartialLine, pty.preview) // Only strong verdicts settle synchronously; weak evidence needs the poll's rendered-screen check. - const verdict = condition === 'tui-idle' ? this.evaluate(pty, waitText) : null + const ranked = + condition === 'tui-idle' ? this.evaluate(pty, waitText, options?.acceptsMidTurnInput) : null + const verdict = ranked?.verdict ?? null if (verdict?.kind === 'blocked') { return buildPtyTerminalWaitBlockedResult(handle, condition, pty, verdict.reason) } - if (verdict?.kind === 'ready-strong') { + if (ranked?.ready) { return buildPtyTerminalWaitResult(handle, condition, pty) } return await new Promise((resolve, reject) => { @@ -109,7 +125,8 @@ export class RuntimeTerminalWait { timeout: null, cancelIdlePoll: null, abortCleanup: null, - ...(options?.launchReadiness ? { launchReadiness: true } : {}) + ...(options?.launchReadiness ? { launchReadiness: true } : {}), + ...(options?.acceptsMidTurnInput ? { acceptsMidTurnInput: true } : {}) } if (!this.waiters.bindAbort(waiter, options?.signal)) { reject(new Error('request_aborted')) diff --git a/src/main/runtime/terminal/wait/terminal-waiter.ts b/src/main/runtime/terminal/wait/terminal-waiter.ts index a56e2e72752..addf226cad6 100644 --- a/src/main/runtime/terminal/wait/terminal-waiter.ts +++ b/src/main/runtime/terminal/wait/terminal-waiter.ts @@ -16,4 +16,6 @@ export type TerminalWaiter = { abortCleanup: (() => void) | null /** Main-only launch-readiness wait: name-only titles require quiet output (TuiIdleEvaluationInput.launchReadiness). */ launchReadiness?: boolean + /** Main-only: a recognized agent mid-turn settles it, as mail delivery treats one (`settlesForMidTurnInput`). */ + acceptsMidTurnInput?: boolean } diff --git a/src/main/runtime/terminal/wait/tui-idle-evidence-source.ts b/src/main/runtime/terminal/wait/tui-idle-evidence-source.ts index 1b386ed39a4..06035d8dcde 100644 --- a/src/main/runtime/terminal/wait/tui-idle-evidence-source.ts +++ b/src/main/runtime/terminal/wait/tui-idle-evidence-source.ts @@ -35,6 +35,8 @@ export type TuiIdleEvidenceSource = { readRuledScreen?(ptyId: string | null | undefined): RuledScreen | null /** The PTY's quiet clock: its last output, else when main began receiving its silent stream. */ getOutputClockAt?(ptyId: string | null | undefined): number | null + /** Whether mail delivery would type into this pane now (drafts, prompts and overlays hold it). */ + isSettledForDelivery?(ptyId: string): boolean } /** One clock per terminal, read by ptyId. */ From fe7241058b1af9ecf783326e1799e59fde84b927 Mon Sep 17 00:00:00 2001 From: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com> Date: Fri, 13 Nov 2026 16:12:38 -0500 Subject: [PATCH 12/49] fix(orchestration): name the reused agent on reuse starts that never bind (#42111) * fix(orchestration): name the reused terminal's agent on unbound reuse starts * fix(orchestration): record the reused agent where start options are built --- .../orchestration/legacy-remote/federation.ts | 6 +++++ .../senders/orchestration-sender-name.ts | 6 ++++- .../runtime-orchestration-sender-names.ts | 7 ++++++ .../start/failed-worker-start-report.test.ts | 25 +++++++++++++++++++ .../start/launch/worker-launch-preferences.ts | 22 ++++++++++++++++ .../start/local-worker-start-dispatch.ts | 15 +++++++++-- 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/main/runtime/orchestration/legacy-remote/federation.ts b/src/main/runtime/orchestration/legacy-remote/federation.ts index 522efc19515..4150b8d9618 100644 --- a/src/main/runtime/orchestration/legacy-remote/federation.ts +++ b/src/main/runtime/orchestration/legacy-remote/federation.ts @@ -19,6 +19,7 @@ import { import { FederationAttachStartParams } from '../../../../shared/rpc-contract/orchestration/orchestration-federation-start-params' import { failFederatedAttachmentWithReceipt } from './federation-start-receipt' import { prepareFederationWorkerLaunchOnHost } from '../../rpc/methods/orchestration/worker/start/launch/worker-opencode-model-preflight' +import { reusedWorkerLaunchReceipt } from '../../rpc/methods/orchestration/worker/start/launch/worker-launch-preferences' import { isWorkerStartTimeoutWithinTimerLimit, resolveWorkerStartReadinessTimeoutMs @@ -158,6 +159,11 @@ export const ORCHESTRATION_FEDERATION_ATTACH_METHODS = [ `Terminal ${terminalHandle} is not running a recognized agent.` ) } + launch.receipt = reusedWorkerLaunchReceipt(runtime, launch.receipt, { + address: terminalHandle, + terminalHandle, + orcaSessionId: null + }) effects.push({ kind: 'terminal', role: 'agent', diff --git a/src/main/runtime/orchestration/mailbox/senders/orchestration-sender-name.ts b/src/main/runtime/orchestration/mailbox/senders/orchestration-sender-name.ts index 52bcf492372..647e5a21acc 100644 --- a/src/main/runtime/orchestration/mailbox/senders/orchestration-sender-name.ts +++ b/src/main/runtime/orchestration/mailbox/senders/orchestration-sender-name.ts @@ -252,12 +252,16 @@ function observedTaskName( return task?.display_name || task?.task_title || null } +export function liveSenderAgent(observation: SenderObservation): AgentType | null { + return observation.chat?.agent || observation.terminal?.agent || null +} + /** Current live kind wins; exact durable dispatch knowledge survives loss of live observations. */ export function orchestrationSenderAgent( sources: Pick, observation: SenderObservation ): AgentType | null { - const live = observation.chat?.agent || observation.terminal?.agent + const live = liveSenderAgent(observation) if (live) { return live } diff --git a/src/main/runtime/orchestration/mailbox/senders/runtime-orchestration-sender-names.ts b/src/main/runtime/orchestration/mailbox/senders/runtime-orchestration-sender-names.ts index 3a343377bc9..468e0bde791 100644 --- a/src/main/runtime/orchestration/mailbox/senders/runtime-orchestration-sender-names.ts +++ b/src/main/runtime/orchestration/mailbox/senders/runtime-orchestration-sender-names.ts @@ -12,6 +12,8 @@ import { structuredAgentSessionIdFromTabId } from '../../../../../shared/agent-s import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' import type { OrchestrationDb } from '../../db/orchestration-db' import { + liveSenderAgent, + observeOrchestrationSender, orchestrationSenderName, structuredChatNaming, captureMirroredTabs, @@ -93,6 +95,11 @@ export class RuntimeOrchestrationSenderNames { ) } + /** The agent a chat or terminal party is running now, as its sender card would show it. */ + liveAgentOf(party: AgentMessageSender['party']): AgentType | null { + return liveSenderAgent(observeOrchestrationSender(party, this.namingSources())) + } + /** Name and agent share one current chat or terminal observation. */ snapshotOf(party: AgentMessageSender['party'], reportedDispatchId?: string) { return observeSenderSnapshot(party, this.namingSources(), reportedDispatchId) diff --git a/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts b/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts index 3edacf8f406..efa444c6ec9 100644 --- a/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts +++ b/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts @@ -26,4 +26,29 @@ describe('a worker-start that fails', () => { ) expect(mail[0]?.body).not.toContain('still open') }) + + it('names the agent already running in a reused terminal when the start never binds', async () => { + h.setup() + vi.spyOn(h.runtime.orchestrationSenderNames, 'liveAgentOf').mockImplementation((party) => + party.terminalHandle === 'term_reused' ? 'claude' : null + ) + vi.spyOn(h.runtime, 'waitForTerminal').mockResolvedValue({ + handle: 'term_reused', + condition: 'tui-idle', + satisfied: false, + status: 'running', + exitCode: null + }) + const task = h.db.createTask({ spec: 'follow up on the PR', runId: h.activeRunId }) + const receipt = await h.call('orchestration.workerStart', { + task: task.id, + from: 'term_coord', + terminal: 'term_reused' + }) + expect(receipt).toMatchObject({ state: 'failed', failedStage: 'agent_readiness' }) + + const [lost] = h.db.getUnreadRunMailbox(h.activeRunId, 100, ['escalation']) + expect(lost?.from_handle).toMatch(/^dispatch:/) + expect(h.runtime.orchestrationSenderNames.sender(lost!.from_handle).agent).toBe('claude') + }) }) diff --git a/src/main/runtime/rpc/methods/orchestration/worker/start/launch/worker-launch-preferences.ts b/src/main/runtime/rpc/methods/orchestration/worker/start/launch/worker-launch-preferences.ts index 71b4a7a77c2..a64d7b36e91 100644 --- a/src/main/runtime/rpc/methods/orchestration/worker/start/launch/worker-launch-preferences.ts +++ b/src/main/runtime/rpc/methods/orchestration/worker/start/launch/worker-launch-preferences.ts @@ -2,6 +2,9 @@ import type { AgentLaunchPreferences } from '../../../../../../../../shared/agen import { checkAgentLaunchModelPreferences } from '../../../../../../../../shared/agent-launch/choices/agent-launch-model-preferences' import { ORCHESTRATION_WORKER_LAUNCH_PREFERENCES_RUNTIME_CAPABILITY } from '../../../../../../../../shared/orchestration/orchestration-runtime-capabilities' import type { TuiAgent } from '../../../../../../../../shared/agent-launch/catalog/tui-agent' +import { isTuiAgent } from '../../../../../../../../shared/agent-launch/catalog/tui-agent-config' +import type { OrcaRuntimeService } from '../../../../../../orca-runtime' +import type { AgentMessageSender } from '../../../../../../../../shared/agent-session/agent-session-message-source' import { OrchestrationError } from '../../../../../../orchestration/orchestration-error' export type OrchestrationWorkerLaunchSelection = { @@ -28,6 +31,25 @@ export function createWorkerLaunchReceipt(args: { return { requested: selection, effective: { ...selection } } } +/** A reuse start launches nothing; the agent already running there is its effective agent, so + * mail from a start that never binds still names it. */ +export function reusedWorkerLaunchReceipt( + runtime: Pick, + receipt: OrchestrationWorkerLaunchReceipt, + party: AgentMessageSender['party'] +): OrchestrationWorkerLaunchReceipt { + if (receipt.effective?.agent) { + return receipt + } + const running = runtime.orchestrationSenderNames.liveAgentOf(party) + return isTuiAgent(running) + ? { + ...receipt, + effective: { ...(receipt.effective ?? receipt.requested), agent: running } + } + : receipt +} + export function createPendingWorkerLaunchReceipt(args: { agent: TuiAgent | null model?: string diff --git a/src/main/runtime/rpc/methods/orchestration/worker/start/local-worker-start-dispatch.ts b/src/main/runtime/rpc/methods/orchestration/worker/start/local-worker-start-dispatch.ts index dc8832e6b4c..5a8cdea62d6 100644 --- a/src/main/runtime/rpc/methods/orchestration/worker/start/local-worker-start-dispatch.ts +++ b/src/main/runtime/rpc/methods/orchestration/worker/start/local-worker-start-dispatch.ts @@ -1,6 +1,10 @@ import type { TuiAgent } from '../../../../../../../shared/agent-launch/catalog/tui-agent' import type { AgentLaunchModeReceipt as WorkerStartModeReceipt } from '../../../../../../../shared/agent-launch/contracts/agent-launch-intent' -import type { OrchestrationWorkerLaunchReceipt } from './launch/worker-launch-preferences' +import { + reusedWorkerLaunchReceipt, + type OrchestrationWorkerLaunchReceipt +} from './launch/worker-launch-preferences' +import { resolveDispatchAssigneeParty } from '../../../../../orchestration/addressing/orchestration-party' import type { WorkerStartInput } from './worker-start-input' import type { RunRow } from '../../../../../orchestration/db/orchestration-records' import type { startLocalWorker } from './local-worker-start' @@ -49,7 +53,14 @@ export function createLocalWorkerStartDispatch( baseBranch: params.baseBranch ?? null, terminal: params.terminal ?? null, agent: agent ?? null, - launch: launchReceipt, + // Mail from a reuse start that never binds still names the agent already running there. + launch: params.terminal + ? reusedWorkerLaunchReceipt( + runtime, + launchReceipt, + resolveDispatchAssigneeParty(params.terminal, db) + ) + : launchReceipt, timeoutMs: params.timeoutMs ?? 60_000, setup: createsWorktree ? (params.setup ?? 'run') : 'not_applicable', setupSource: createsWorktree From 54590ba35e35a75c43a9827517f2124d0383c6a0 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:19:21 -0800 Subject: [PATCH 13/49] refactor: organize terminal store modules by lifecycle owner (#42124) * refactor: organize terminal store modules by lifecycle owner * fix: align retirement validation with moved owners --- config/focus-setting-read-baseline.txt | 8 +- config/legacy-relay-compat-tags-baseline.txt | 2 +- config/reliability-gates.jsonc | 19 +- config/renderer-layout-writer-baseline.txt | 34 +- .../check-tab-map-seam-ratchet.mjs | 14 +- ...eck-terminal-parking-ownership-ratchet.mjs | 44 +- .../source-routing/pr-e2e-source-routing.mjs | 2 +- .../source-routing/pr-layout-oracle-route.mjs | 1 + config/workspace-record-read-baseline.txt | 2 +- ...ve-chat-agent-message-sender-view.test.tsx | 12 +- .../native-chat-agent-sender.test-fixture.ts | 2 +- .../NativeChatAgentMessageCard.fixture.tsx | 2 +- .../routing/native-chat-layout-actions.ts | 2 +- .../shared/kill-all-terminal-surfaces.ts | 4 +- .../sleep/workspace-sleep-target.ts | 2 +- ...mirrored-terminal-lineage.test-fixture.tsx | 2 +- ...worktree-agent-rows-subscriptions.test.tsx | 2 +- .../activity/worktree-agent-row-selectors.ts | 2 +- .../activity/worktree-card-status-inputs.ts | 2 +- .../worktree-terminal-record-selector.ts | 0 .../status-bar/CodexSwitcherMenu.fixture.tsx | 2 +- .../tab-bar/group-tab-order.test.ts | 2 +- .../components/tab-group/SplitPaneLanding.tsx | 2 +- .../detached/codex-detached-pane-restart.ts | 2 +- .../close/pending-split-close-test-fixture.ts | 2 +- .../close/retire-unbound-ipc-terminal-pane.ts | 4 +- .../retire-unbound-runtime-terminal-pane.ts | 4 +- .../close/terminal-pane-close-admission.ts | 4 +- .../close/use-terminal-pane-close-actions.ts | 2 +- .../layout/detach/terminal-pane-tab-detach.ts | 2 +- .../mounting/terminal-pane-mount-cleanup.ts | 2 +- .../terminal-pane-notice-retirement.ts | 2 +- .../terminal-pane-retirement-ownership.ts | 2 +- .../terminal-notification-liveness.ts | 2 +- .../parked-terminal-tab-coverage.ts | 2 +- .../terminal-parked-pty-watcher.ts | 2 +- .../sleeping-record-park-exemption.ts | 2 +- .../codex-shared-server-banner.test.tsx | 225 ---------- ...mand-finished-status-store-test-fixture.ts | 2 +- .../pty-connection/connect-pane-pty.ts | 2 +- .../deferred-cold-restore-and-snapshot.ts | 2 +- ...-owner-hydration-backend-retention.test.ts | 274 ------------ .../startup/sleeping-record-access.ts | 2 +- .../recovery/terminal-pane-recovery.ts | 4 +- .../close-local-terminal-tab-state.ts | 2 +- .../terminal/running-terminal-close-guard.ts | 2 +- .../terminal/terminal-close-target.ts | 2 +- .../terminal-provider-capability-revision.ts | 2 +- ...erminal-provider-snapshot-bound-pty-ids.ts | 2 +- ...terminal-tab-actions-unified-close.test.ts | 2 +- .../terminal/terminal-tab-actions.ts | 2 +- .../terminal/terminal-tab-close-intent.ts | 2 +- .../terminal-worktree-prewarm-targets.ts | 2 +- .../use-terminal-startup-activation.ts | 2 +- ...al-bulk-close-actions.frame-flush.test.tsx | 60 --- ...inal-bulk-close-actions.placement.test.tsx | 340 --------------- .../use-terminal-watcher-effects.ts | 2 +- ...kspace-cleanup-removal.agent-stop.test.tsx | 11 +- .../agent-hook-completion-notifications.ts | 2 +- ...tatus-pane-routing-index-retention.test.ts | 19 +- ...minal-presentation-frame-drawn-tab.test.ts | 11 +- .../terminal-presentation-ipc-bridge.ts | 2 +- .../terminal-presentation-pane-title.test.ts | 22 +- ...pc-tab-switch-structured-tab-cycle.test.ts | 73 ---- .../use-terminal-quick-command-hosts.test.ts | 25 +- .../hooks/use-terminal-quick-command-hosts.ts | 2 +- .../useReadOnScreenAttention.away.test.ts | 61 +-- ...seReadOnScreenAttention.clock-skew.test.ts | 7 +- ...adOnScreenAttention.floating-panel.test.ts | 2 +- ...eReadOnScreenAttention.focus-group.test.ts | 2 +- ...dOnScreenAttention.mixed-workspace.test.ts | 127 ------ .../agent-account-restart-startup.test.ts | 10 +- .../agent-hibernation-runtime-owner.ts | 2 +- ...unch-agent-structured-chat-test-fixture.ts | 2 +- .../resume/resume-sleeping-agent-session.ts | 2 +- .../resume/sleeping-agent-pane-ownership.ts | 4 +- .../resume/sleeping-agent-wake-requests.ts | 2 +- .../wake-sleeping-agents-in-background.ts | 2 +- .../tab-identity/use-tab-agent.ts | 2 +- .../active-worktree-removal-successor.test.ts | 50 +-- .../worktree-agent-activation-gate.ts | 2 +- .../ownership/terminal-close-route.ts | 2 +- .../tabs/activate-tab-and-focus-pane.ts | 2 +- .../legacy-chat-rename-migration.test.tsx | 250 ----------- .../naming/structured-chat-rename.ts | 2 +- .../agent-status-primitives.ts | 2 +- .../host-session-mirror-frame-fixtures.ts | 2 +- .../runtime/web-session-tabs-sync/state.ts | 2 +- .../frames/workspace-layout-frame-changes.ts | 2 +- .../frames/workspace-layout-frame-sync.ts | 2 +- .../sleeping-records-to-layout-owner.ts | 2 +- src/renderer/src/store/index.ts | 4 +- .../project-removal-host-twin-state.test.ts | 58 +-- .../repo-removal-host-twin-attribution.ts | 2 +- .../repos/repo-removal-host-twin-teardown.ts | 2 +- .../repos/store-session-cascades.test.ts | 9 +- .../wsl-moved-project-chat-purge.test.ts | 4 +- .../agent-hibernation-live-anchor-e2e.test.ts | 71 +-- .../agent-status/agent-status-batch.test.ts | 56 +-- .../agent-status-live-map-leak.test.ts | 11 +- .../agent-status-manual-sleep-capture.test.ts | 2 +- .../agent-status-quit-capture.test.ts | 13 +- .../agent-status-recovery-actions.ts | 2 +- .../agent-status-recovery-collection.ts | 2 +- .../agent-status/agent-status-runtime.ts | 2 +- .../agent-status-sleeping-records.ts | 2 +- .../agent-status-worktree-purge-leak.test.ts | 13 +- .../slices/agent-status/agent-status.test.ts | 28 +- ...k-session-binding-renderer.test-fixture.ts | 2 +- .../browser-close-focused-group.test.ts | 4 +- .../browser-background-tab-creation.test.ts | 7 +- .../tabs/editor-open-link-placement.test.ts | 2 +- .../tabs/editor-tab-layout-owner.test.ts | 57 +-- ...me-managed-repair-keeps-workspaces.test.ts | 2 +- ...-runtime-environments-purge-wiring.test.ts | 2 +- .../store/slices/tabs/tabs-host-mirroring.ts | 2 +- .../store/slices/tabs/tabs-label-actions.ts | 2 +- .../tabs-reconciliation-empty-groups.test.ts | 101 ----- .../store/slices/tabs/tabs-reconciliation.ts | 2 +- .../tabs/worktree-terminal-tab-respawn.ts | 2 +- .../workspace-attention-slice.ts | 2 +- ...rkspace-unread-characterization-fixture.ts | 2 +- ...rkspace-cleanup-wrong-host-removal.test.ts | 2 +- .../listing/fetched-worktree-merge.ts | 2 +- ...le-listing-purges-created-worktree.test.ts | 13 +- ...ktrees-fetch-stale-catalog-version.test.ts | 99 ----- .../workspace-activation-preparation.test.ts | 11 +- .../session/worktree-identity-rename-state.ts | 2 +- .../session/worktree-slice-lookups.ts | 10 +- ...trees-terminal-reference-admission.test.ts | 25 +- ...rktrees-terminal-reference-origins.test.ts | 4 +- .../teardown/host-twin-worktree-purge.ts | 2 +- .../native-chat-launch-draft-teardown.test.ts | 2 +- ...purge-stale-runtime-host-ownership.test.ts | 2 +- .../removed-worktree-renderer-teardown.ts | 2 +- .../store-worktree-removal-cascade.test.ts | 4 +- ...tab-worktree-orphan-map-purge-leak.test.ts | 13 +- .../workspace-chat-draft-removal.test.ts | 2 +- .../teardown/worktree-state-before-removal.ts | 4 +- .../worktrees/worktree-slice-contract.ts | 2 +- .../src/store/store-observer-installers.ts | 2 +- .../store/terminals/create-terminal-slice.ts | 40 +- .../restored-relay-session-identity.test.ts | 12 +- ...terminal-hydration-store.test-bootstrap.ts | 0 .../terminal-session-row-hydration.ts | 10 +- .../terminal-transient-state.ts | 4 +- ...ls-hydration-canonical-pty-overlap.test.ts | 17 +- .../workspace-terminal-active-tabs.ts | 4 +- .../workspace-terminal-hydration-patch.ts | 14 +- .../workspace-terminal-hydration.ts | 14 +- .../workspace-terminal-layout-plan.ts | 12 +- .../workspace-terminal-placeholders.ts | 13 +- .../workspace-terminal-reconnect-plan.ts | 8 +- .../workspace-terminal-reconnect.ts | 12 +- .../workspace-terminal-row-plan.ts | 13 +- .../workspace-terminal-ssh-placeholders.ts | 10 +- .../workspace-terminal-worktree-index.ts | 2 +- .../terminal-chat-pane-layout-owner.ts | 4 +- .../terminal-layout-pty-ownership.test.ts | 8 +- .../{ => layout}/terminal-layout-state.ts | 14 +- ...erminal-pane-detach-agent-identity.test.ts | 13 +- .../terminal-single-pane-layout.ts | 2 +- .../active-tab-owner-worktree.ts | 4 +- .../terminal-tab-bucket-index.ts | 0 .../{ => ownership}/terminal-tab-location.ts | 2 +- .../terminal-tab-owner-index.test.ts | 0 .../terminal-tab-owner-index.ts | 0 .../terminal-parking-input-equality.ts | 8 +- .../terminal-parking-input-fields.ts | 0 .../terminal-parking-input-owner.ts | 8 +- .../terminal-parking-input-transitions.ts | 2 +- .../codex-restart-notice-account-identity.ts | 0 .../terminal-activation-spawn-suppression.ts | 2 +- .../terminal-disowned-pty-sources.ts | 2 +- .../terminal-exited-pane-liveness.test.ts | 16 +- .../{ => pty}/terminal-pty-bindings.ts | 8 +- .../{ => pty}/terminal-pty-identities.ts | 6 +- .../terminal-pty-identity-replacement.test.ts | 4 +- ...minal-pty-release-orphan-retention.test.ts | 11 +- .../{ => pty}/terminal-pty-release.ts | 6 +- .../{ => pty}/terminal-restart-state.ts | 4 +- .../{ => pty}/terminal-tab-recovery-ledger.ts | 2 +- .../terminal-tab-recovery-remount.test.ts | 10 +- .../{ => pty}/terminal-unverified-pty-loss.ts | 2 +- .../terminal-quick-command-hosts.ts | 14 +- .../legacy-relay-bridged-tab-close.ts | 0 ...aired-terminal-tab-close-intent-actions.ts | 4 +- .../retired-terminal-tab-state-sweep.ts | 12 +- .../terminal-last-tab-close.test.ts | 12 +- .../terminal-notice-removal.ts | 0 .../terminal-orphan-cleanup.ts | 2 +- ...erminal-retirement-teardown-reservation.ts | 0 .../terminal-surface-close-intent.ts | 2 +- .../terminal-tab-close-intent.test.ts | 40 +- .../terminal-tab-close-layout-owner.ts | 2 +- .../terminal-tab-close-providers.ts | 2 +- .../{ => retirement}/terminal-tab-close.ts | 26 +- .../terminal-tab-retirement-store.test.ts | 81 ++++ .../terminal-tab-retirement.ts | 14 +- .../sleeping-agent-record-index.ts | 2 +- .../store-sleep-exact-runtime-stop.test.ts | 14 +- .../store-sleep-pane-hibernation.test.ts | 25 +- .../store-sleep-runtime-convergence.test.ts | 21 +- .../{ => sleep}/terminal-pane-hibernation.ts | 18 +- .../{ => sleep}/terminal-shutdown-guards.ts | 6 +- .../{ => sleep}/terminal-shutdown-record.ts | 0 .../{ => sleep}/terminal-shutdown-state.ts | 18 +- .../{ => sleep}/terminal-shutdown.ts | 14 +- .../terminal-sleep-layout-owner.ts | 8 +- .../terminal-sleep-rpc.test-fixture.ts | 4 +- .../{ => sleep}/terminal-teardown-owner.ts | 2 +- .../store-create-tab-start-in-main.test.ts | 149 ------- .../structured-chat-tab-rename.test.ts | 338 --------------- ...terminal-active-workspace-creation.test.ts | 8 +- .../terminal-active-workspace-creation.ts | 10 +- .../terminal-companion-record-operations.ts | 2 +- .../creation}/terminal-created-shell.ts | 12 +- ...terminal-creation-orphan-retention.test.ts | 26 +- .../creation}/terminal-startup-queues.ts | 4 +- .../terminal-tab-agent-launch-pane.ts | 6 +- ...erminal-tab-create-through-layout-owner.ts | 12 +- .../creation}/terminal-tab-creation.ts | 32 +- .../creation}/terminal-workspace-routing.ts | 20 +- .../creation}/window-tab-start-in-main.ts | 12 +- .../presentation}/renamable-unified-tab.ts | 2 +- .../runtime-pane-title-sort-epoch.test.ts | 6 +- .../tab-change-through-layout-owner.ts | 2 +- .../presentation}/terminal-tab-appearance.ts | 4 +- .../terminal-tab-layout-owner-actions.ts | 6 +- .../terminal-tab-presentation.ts | 12 +- .../presentation}/terminal-tab-title-batch.ts | 18 +- .../recently-closed-terminal-tabs.test.ts | 6 +- .../recently-closed-terminal-tabs.ts | 6 +- .../{ => tabs}/terminal-tab-navigation.ts | 10 +- .../src/store/terminals/terminal-actions.ts | 10 +- .../terminal-quick-command-hosts.test.ts | 77 ---- .../src/store/terminals/terminal-state.ts | 2 +- .../terminal-tab-retirement-store.test.ts | 141 ------ .../terminal-row.test-fixture.ts | 2 +- .../terminal-tab.test-fixture.ts | 2 +- .../store/testing/app-store-test-fixture.ts | 4 +- src/renderer/src/store/types.ts | 4 +- .../frames/workspace-layout-frame-slices.ts | 6 +- .../host-isolation/host-twin.test-fixture.ts | 2 +- tests/e2e/agent-sender-delivery.unit.test.ts | 403 ------------------ 245 files changed, 733 insertions(+), 3805 deletions(-) rename src/renderer/src/{store/terminals => components/sidebar/workspace-card/activity}/worktree-terminal-record-selector.ts (100%) delete mode 100644 src/renderer/src/components/terminal-pane/provider-notices/codex-server-isolation/codex-shared-server-banner.test.tsx delete mode 100644 src/renderer/src/components/terminal-pane/pty-connection/host-ownership/pty-connection-owner-hydration-backend-retention.test.ts delete mode 100644 src/renderer/src/components/use-terminal-bulk-close-actions.frame-flush.test.tsx delete mode 100644 src/renderer/src/components/use-terminal-bulk-close-actions.placement.test.tsx delete mode 100644 src/renderer/src/hooks/ipc-tab-switch-structured-tab-cycle.test.ts delete mode 100644 src/renderer/src/hooks/useReadOnScreenAttention.mixed-workspace.test.ts delete mode 100644 src/renderer/src/runtime/native-chat/naming/legacy-chat-rename-migration.test.tsx delete mode 100644 src/renderer/src/store/slices/tabs/tabs-reconciliation-empty-groups.test.ts delete mode 100644 src/renderer/src/store/slices/worktrees/listing/worktrees-fetch-stale-catalog-version.test.ts rename src/renderer/src/store/terminals/{ => hydration}/restored-relay-session-identity.test.ts (87%) rename src/renderer/src/store/terminals/{ => hydration}/terminal-hydration-store.test-bootstrap.ts (100%) rename src/renderer/src/store/terminals/{ => hydration}/terminal-session-row-hydration.ts (91%) rename src/renderer/src/store/terminals/{ => hydration}/terminal-transient-state.ts (72%) rename src/renderer/src/store/terminals/{ => hydration}/terminals-hydration-canonical-pty-overlap.test.ts (83%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-active-tabs.ts (88%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-hydration-patch.ts (93%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-hydration.ts (95%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-layout-plan.ts (76%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-placeholders.ts (88%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-reconnect-plan.ts (90%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-reconnect.ts (93%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-row-plan.ts (86%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-ssh-placeholders.ts (90%) rename src/renderer/src/store/terminals/{ => hydration}/workspace-terminal-worktree-index.ts (89%) rename src/renderer/src/store/terminals/{ => layout}/terminal-chat-pane-layout-owner.ts (85%) rename src/renderer/src/store/terminals/{ => layout}/terminal-layout-pty-ownership.test.ts (92%) rename src/renderer/src/store/terminals/{ => layout}/terminal-layout-state.ts (92%) rename src/renderer/src/store/terminals/{ => layout}/terminal-pane-detach-agent-identity.test.ts (84%) rename src/renderer/src/store/terminals/{ => layout}/terminal-single-pane-layout.ts (77%) rename src/renderer/src/store/terminals/{ => ownership}/active-tab-owner-worktree.ts (92%) rename src/renderer/src/store/terminals/{ => ownership}/terminal-tab-bucket-index.ts (100%) rename src/renderer/src/store/terminals/{ => ownership}/terminal-tab-location.ts (86%) rename src/renderer/src/store/terminals/{ => ownership}/terminal-tab-owner-index.test.ts (100%) rename src/renderer/src/store/terminals/{ => ownership}/terminal-tab-owner-index.ts (100%) rename src/renderer/src/store/terminals/{ => parking}/terminal-parking-input-equality.ts (91%) rename src/renderer/src/store/terminals/{ => parking}/terminal-parking-input-fields.ts (100%) rename src/renderer/src/store/terminals/{ => parking}/terminal-parking-input-owner.ts (97%) rename src/renderer/src/store/terminals/{ => parking}/terminal-parking-input-transitions.ts (93%) rename src/renderer/src/store/terminals/{ => pty}/codex-restart-notice-account-identity.ts (100%) rename src/renderer/src/store/terminals/{ => pty}/terminal-activation-spawn-suppression.ts (90%) rename src/renderer/src/store/terminals/{ => pty}/terminal-disowned-pty-sources.ts (93%) rename src/renderer/src/store/terminals/{ => pty}/terminal-exited-pane-liveness.test.ts (79%) rename src/renderer/src/store/terminals/{ => pty}/terminal-pty-bindings.ts (97%) rename src/renderer/src/store/terminals/{ => pty}/terminal-pty-identities.ts (91%) rename src/renderer/src/store/terminals/{ => pty}/terminal-pty-identity-replacement.test.ts (91%) rename src/renderer/src/store/terminals/{ => pty}/terminal-pty-release-orphan-retention.test.ts (88%) rename src/renderer/src/store/terminals/{ => pty}/terminal-pty-release.ts (95%) rename src/renderer/src/store/terminals/{ => pty}/terminal-restart-state.ts (98%) rename src/renderer/src/store/terminals/{ => pty}/terminal-tab-recovery-ledger.ts (99%) rename src/renderer/src/store/terminals/{ => pty}/terminal-tab-recovery-remount.test.ts (86%) rename src/renderer/src/store/terminals/{ => pty}/terminal-unverified-pty-loss.ts (94%) rename src/renderer/src/store/terminals/{ => quick-commands}/terminal-quick-command-hosts.ts (94%) rename src/renderer/src/store/terminals/{ => retirement}/legacy-relay-bridged-tab-close.ts (100%) rename src/renderer/src/store/terminals/{ => retirement}/paired-terminal-tab-close-intent-actions.ts (88%) rename src/renderer/src/store/terminals/{ => retirement}/retired-terminal-tab-state-sweep.ts (91%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-last-tab-close.test.ts (87%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-notice-removal.ts (100%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-orphan-cleanup.ts (99%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-retirement-teardown-reservation.ts (100%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-surface-close-intent.ts (82%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-tab-close-intent.test.ts (72%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-tab-close-layout-owner.ts (96%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-tab-close-providers.ts (98%) rename src/renderer/src/store/terminals/{ => retirement}/terminal-tab-close.ts (93%) create mode 100644 src/renderer/src/store/terminals/retirement/terminal-tab-retirement-store.test.ts rename src/renderer/src/store/terminals/{ => retirement}/terminal-tab-retirement.ts (94%) rename src/renderer/src/store/terminals/{ => sleep}/sleeping-agent-record-index.ts (98%) rename src/renderer/src/store/terminals/{ => sleep}/store-sleep-exact-runtime-stop.test.ts (87%) rename src/renderer/src/store/terminals/{ => sleep}/store-sleep-pane-hibernation.test.ts (82%) rename src/renderer/src/store/terminals/{ => sleep}/store-sleep-runtime-convergence.test.ts (75%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-pane-hibernation.ts (94%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-shutdown-guards.ts (96%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-shutdown-record.ts (100%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-shutdown-state.ts (90%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-shutdown.ts (93%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-sleep-layout-owner.ts (91%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-sleep-rpc.test-fixture.ts (83%) rename src/renderer/src/store/terminals/{ => sleep}/terminal-teardown-owner.ts (96%) delete mode 100644 src/renderer/src/store/terminals/store-create-tab-start-in-main.test.ts delete mode 100644 src/renderer/src/store/terminals/structured-chat-tab-rename.test.ts rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-active-workspace-creation.test.ts (92%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-active-workspace-creation.ts (91%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-companion-record-operations.ts (87%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-created-shell.ts (85%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-creation-orphan-retention.test.ts (86%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-startup-queues.ts (97%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-tab-agent-launch-pane.ts (83%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-tab-create-through-layout-owner.ts (93%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-tab-creation.ts (91%) rename src/renderer/src/store/terminals/{ => tabs/creation}/terminal-workspace-routing.ts (83%) rename src/renderer/src/store/terminals/{ => tabs/creation}/window-tab-start-in-main.ts (93%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/renamable-unified-tab.ts (88%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/runtime-pane-title-sort-epoch.test.ts (88%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/tab-change-through-layout-owner.ts (97%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/terminal-tab-appearance.ts (96%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/terminal-tab-layout-owner-actions.ts (95%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/terminal-tab-presentation.ts (93%) rename src/renderer/src/store/terminals/{ => tabs/presentation}/terminal-tab-title-batch.ts (90%) rename src/renderer/src/store/terminals/{ => tabs}/recently-closed-terminal-tabs.test.ts (95%) rename src/renderer/src/store/terminals/{ => tabs}/recently-closed-terminal-tabs.ts (96%) rename src/renderer/src/store/terminals/{ => tabs}/terminal-tab-navigation.ts (91%) delete mode 100644 src/renderer/src/store/terminals/terminal-quick-command-hosts.test.ts delete mode 100644 src/renderer/src/store/terminals/terminal-tab-retirement-store.test.ts rename src/renderer/src/store/terminals/{ => testing}/terminal-row.test-fixture.ts (73%) rename src/renderer/src/store/terminals/{ => testing}/terminal-tab.test-fixture.ts (89%) delete mode 100644 tests/e2e/agent-sender-delivery.unit.test.ts diff --git a/config/focus-setting-read-baseline.txt b/config/focus-setting-read-baseline.txt index bef6f0b90de..3bc0a19973e 100644 --- a/config/focus-setting-read-baseline.txt +++ b/config/focus-setting-read-baseline.txt @@ -317,10 +317,10 @@ 1 src/renderer/src/store/slices/worktrees/metadata/worktree-lineage-actions.ts 3 src/renderer/src/store/slices/worktrees/metadata/worktree-lineage-host-merge.ts 3 src/renderer/src/store/slices/worktrees/session/worktree-terminal-reference.ts -1 src/renderer/src/store/terminals/terminal-active-workspace-creation.ts -1 src/renderer/src/store/terminals/terminal-tab-appearance.ts -1 src/renderer/src/store/terminals/terminal-tab-close-providers.ts -1 src/renderer/src/store/terminals/terminal-tab-retirement.ts +1 src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.ts +1 src/renderer/src/store/terminals/tabs/presentation/terminal-tab-appearance.ts +1 src/renderer/src/store/terminals/retirement/terminal-tab-close-providers.ts +1 src/renderer/src/store/terminals/retirement/terminal-tab-retirement.ts 1 src/renderer/src/web/preload-api/web-app-api.ts 3 src/renderer/src/web/preload-api/web-preference-normalization.ts 20 src/renderer/src/web/preload-api/web-preferences-store.ts diff --git a/config/legacy-relay-compat-tags-baseline.txt b/config/legacy-relay-compat-tags-baseline.txt index ffcbba0a3fa..ca172741a09 100644 --- a/config/legacy-relay-compat-tags-baseline.txt +++ b/config/legacy-relay-compat-tags-baseline.txt @@ -23,7 +23,7 @@ src/renderer/src/components/terminal-pane/pty-transport/legacy-relay/legacy-rela src/renderer/src/components/terminal-pane/pty-connection/output/foreground-output-refresh.ts src/renderer/src/components/terminal-pane/pty-connection/host-ownership/unserved-ssh-pane-connect.ts src/renderer/src/hooks/ipc-events/ssh-managed-server-state-effects.ts -src/renderer/src/store/terminals/legacy-relay-bridged-tab-close.ts +src/renderer/src/store/terminals/retirement/legacy-relay-bridged-tab-close.ts src/shared/legacy-relay-bridge-contract.ts src/shared/ssh-types.ts src/shared/telemetry-ssh-host-server-event-schemas.ts diff --git a/config/reliability-gates.jsonc b/config/reliability-gates.jsonc index f35cd88221a..0e009d6c046 100644 --- a/config/reliability-gates.jsonc +++ b/config/reliability-gates.jsonc @@ -5941,14 +5941,14 @@ "invariant": "Within one terminal tab, each PTY has at most one layout leaf, pane manager surface, and xterm renderer owner. Restore and remote mirroring must normalize duplicate ownership before replay while retaining active-leaf focus, scrollback, pane authority, agent metadata, and distinct sibling PTYs.", "oracle": "Current adopted test policy at native 6f2e: retire the sampled PTY/focus permutation callback and its assertion reference. This loses its ownership-uniqueness, rooted-focus, immutability and idempotence alarms over those combinations. Eleven direct component callbacks and the depth/store/E2E file selectors remain; no equivalent replacement or fresh execution is claimed. Previous metadata account (preserved verbatim): Audit1925 (sources1922/1923): Partial ownership suite loses fixed first-leaf/rootless/dangling-selection/idempotence/identity examples. Both existing active assertion aliases stay backed by exact retained active-leaf metadata pruning and idempotence across PTY/focus permutation callbacks; metadata collision and repeated-leaf challenges survive. No deleted fixed example is assigned replacement coverage. Preserve meaningful remaining selectors/assertions and unchanged dated receipts within their original scope. Reduced selectors have no fresh gate execution evidence in this metadata packet. No equivalent replacement, physical watcher/PTY/provider, live SSH/remote/mobile, rendered, cross-platform, soak or measured-budget result is claimed. Historical prior account (preserved verbatim): Launch Orca with a real daemon PTY running a synchronized full-screen stream, close the desktop client without killing the daemon process, seed the persisted tab layout with two leaves bound to that PTY, and relaunch. Hide the restored tab behind a sibling and reveal it, then require the stream to remain visible with exactly one manager pane, one xterm DOM node, one root leaf, one PTY binding, and one unique PTY. Component contracts cover persisted replay, rootless and repeated-leaf layouts, metadata repair, and deeply nested input. Retained store contracts cover live/future authority transfer onto a retained leaf and preservation of a prior detach destination.", "commands": [ - "pnpm exec vitest run --config config/vitest.config.ts src/shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership-depth.test.ts src/renderer/src/components/terminal-pane/layout/terminal-layout-pty-ownership.test.ts src/renderer/src/store/terminals/terminal-layout-pty-ownership.test.ts --reporter=dot", + "pnpm exec vitest run --config config/vitest.config.ts src/shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership-depth.test.ts src/renderer/src/components/terminal-pane/layout/terminal-layout-pty-ownership.test.ts src/renderer/src/store/terminals/layout/terminal-layout-pty-ownership.test.ts --reporter=dot", "pnpm exec electron-vite build --mode e2e", "SKIP_BUILD=1 pnpm exec playwright test tests/e2e/terminal-duplicate-pty-renderer-reveal.spec.ts --config tests/playwright.config.ts --project electron-headless --workers=1" ], "testFiles": [ "src/shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership-depth.test.ts", "src/renderer/src/components/terminal-pane/layout/terminal-layout-pty-ownership.test.ts", - "src/renderer/src/store/terminals/terminal-layout-pty-ownership.test.ts", + "src/renderer/src/store/terminals/layout/terminal-layout-pty-ownership.test.ts", "tests/e2e/terminal-duplicate-pty-renderer-reveal.spec.ts" ], "assertionRefs": [ @@ -5961,7 +5961,7 @@ "assertions": ["keeps the active leaf and prunes the stale surface plus its metadata"] }, { - "file": "src/renderer/src/store/terminals/terminal-layout-pty-ownership.test.ts", + "file": "src/renderer/src/store/terminals/layout/terminal-layout-pty-ownership.test.ts", "assertions": [ "moves live and future pane authority onto the retained PTY leaf", "does not steal authority from a pane that was already detached to another tab" @@ -6179,7 +6179,7 @@ "commands": [ "pnpm exec vitest run --config config/vitest.config.ts src/main/runtime/terminal/surface/orca-runtime-terminal-close-continuity.test.ts", "pnpm exec vitest run --config config/vitest.config.ts src/main/runtime/construction/orca-runtime.test.ts", - "pnpm dlx node@24 ./node_modules/vitest/vitest.mjs run --config config/vitest.config.ts src/main/agent-hooks/server/testing/authority/server-pane-authority.test.ts src/main/ipc/agent-hooks.test.ts src/main/ipc/agent-pane-authority-ownership.test.ts src/main/persistence/restoring-sessions/persistence-pane-identity-migration.test.ts src/main/persistence/loading-store/terminal-bindings/persistence-pty-binding-reconciliation.test.ts src/renderer/src/store/slices/agent-status/agent-pane-authority.test.ts src/renderer/src/store/terminals/terminal-pane-detach-agent-identity.test.ts src/renderer/src/store/terminals/terminal-tab-retirement-store.test.ts src/renderer/src/components/shared/kill-all-terminal-surfaces.test.ts", + "pnpm dlx node@24 ./node_modules/vitest/vitest.mjs run --config config/vitest.config.ts src/main/agent-hooks/server/testing/authority/server-pane-authority.test.ts src/main/ipc/agent-hooks.test.ts src/main/ipc/agent-pane-authority-ownership.test.ts src/main/persistence/restoring-sessions/persistence-pane-identity-migration.test.ts src/main/persistence/loading-store/terminal-bindings/persistence-pty-binding-reconciliation.test.ts src/renderer/src/store/slices/agent-status/agent-pane-authority.test.ts src/renderer/src/store/terminals/layout/terminal-pane-detach-agent-identity.test.ts src/renderer/src/store/terminals/retirement/terminal-tab-retirement-store.test.ts src/renderer/src/components/shared/kill-all-terminal-surfaces.test.ts", "pnpm exec vitest run --config config/vitest.config.ts src/main/pty/process-retirement/pty-descendant-termination.test.ts src/main/daemon/terminal-host/testing/terminal-host.test.ts src/main/providers/local-pty/local-pty-provider-shutdown.test.ts src/main/runtime/workspaces/removal/worktree-teardown.test.ts", "pnpm run test:e2e -- tests/e2e/terminal-tab-close-restart-persistence.spec.ts --workers=1", "pnpm run test:e2e -- tests/e2e/terminal-parked-close-retirement.spec.ts --workers=1", @@ -6200,8 +6200,8 @@ "src/main/providers/local-pty/local-pty-provider-shutdown.test.ts", "src/main/runtime/workspaces/removal/worktree-teardown.test.ts", "src/renderer/src/store/slices/agent-status/agent-pane-authority.test.ts", - "src/renderer/src/store/terminals/terminal-pane-detach-agent-identity.test.ts", - "src/renderer/src/store/terminals/terminal-tab-retirement-store.test.ts", + "src/renderer/src/store/terminals/layout/terminal-pane-detach-agent-identity.test.ts", + "src/renderer/src/store/terminals/retirement/terminal-tab-retirement-store.test.ts", "src/renderer/src/components/shared/kill-all-terminal-surfaces.test.ts", "tests/e2e/terminal-tab-close-restart-persistence.spec.ts", "tests/e2e/terminal-parked-close-retirement.spec.ts", @@ -9346,7 +9346,7 @@ "oracle": "Audit3390 composes root-adopted3382/independent3383 and3386/independent3387 and3388/independent3389: intentionally retires216 authored registrations/230 expanded cases in42 whole authored suites plus5 zero-case registration drivers, without equivalent replacement. Lost local alarms include fake PTY identity/routing/startup/replay/mode/title/mouse/IME/scroll matrices, broad startup identity and file-open wiring, mock mailbox title recovery, mobile row parity and whole-v-selective save parity. Retained24 registrations/26 expanded cases in22 suites preserve actual xterm Windows buffer/wrap/scroll, typed TOML scalar, real Promise cancellation/settlement, HTTP Codex scanner/projector semantics, durable recovery admission/newer-schema bytes, federation completion/ACK/SQLite atomicity and failed stale-run-write versus imported durable history. Additional retained clock-domain scheduling, durable freeze/ACK/checkpoint ordering, ABA dirty intent, SQL atomicity, folder-domain retier/last-note deletion, scrollback durable no-sync staging, PanelBridge subscriber lifetime and reserved-send publication preserve narrower concrete behaviors. Current finite owner drift assessed in bounded defining bodies; retained callback bytes unchanged. Historical notes and complete dated receipts keep their original exact scopes. No new execution, equivalent replacement, native focus/device/pixel, live remote or global mixed-version guarantee is claimed. Audit3368 narrows stream-reconnect coverage to the actual ten synthetic transport epochs retaining one PTY identity, accepting and holding detached input for exactly-once later delivery, current decoded output and per-epoch subscription release. Prior rejection wording was inaccurate. Phase/backoff/cutoff/manual reconnect and parser/OSC/pause/retained-image/fatal/latch/claim/early-close alarms are intentionally lost without equivalent replacement. The Linux multi-pane reconnect receipt remains verbatim with its original scope; no fresh live SSH/provider/PTY/UI/mobile/mixed-version/cross-platform evidence is claimed. Audit3359 retires whole host-surface-replacement and create-handoff suites, removing their compound unit command tokens, test-file entries and assertion references. Fake polling/deadline/subscription, supplied stale-handle ownership, close and replacement examples are intentionally lost without equivalent replacement. The unrelated Linux paired multi-pane reconnect receipt stays verbatim with its original scope. No fresh SSH/provider/network/PTY recovery, historical-import, mobile, mixed-version or cross-platform validation is claimed. Audit3342 retires the complete client create-outcome identity/options/recovery suite and the malformed-or-contradictory repo-owner response matrix. Client replay identity, options, no-downgrade, quiescence/budget/manual retry, authoritative probe-error and malformed-owner refusal alarms are intentionally lost without equivalent replacement. Remaining repo-owner late catalog and old-host re-adoption boundaries do not replace them. The unrelated Linux paired-reconnect receipt stays verbatim with its original scope. Surviving selectors are unexecuted here; no fresh SSH/provider/process-deduplication, mobile, mixed-version or cross-platform validation is claimed. Audit3326 adopts reconciled source audit3324 and intentionally retires these low-value examples and their regression alarms: keeps a sidebar row for every still-live pane after a long sleep — Whole suite: 279 lines manually replay renderer ownership registry/status writes, snapshot patch/set, six-pane fixture inventory, and sidebar selectors/builders; expected pane IDs are production-computed. Does not run sleep/wake/transport or actual sidebar entry. Retires reconnect row-preservation assembly alarm.; still retires the regular TUI surface after an explicit terminal exit — Ordinary explicit-exit callback/map cleanup is repeated in the stale/new stream lifecycle case below. Retires separate regular-TUI baseline; keeper is not equivalent process/UI proof.; asks the HUB to recover an expired SSH pane and rebinds the host identity — Expired SSH owner error must ask the owning HUB to recover, then adopt fixed replacement handle, resubscribe and report rebind; actual transport dispatch and handle state prevent wrong-client recovery.; does not recover a pane whose relay reply was an identity mismatch — Identity mismatch means a different live PTY, so actual transport must surface refusal without recover/create, keeping original identity. Prevents destructive duplicate agent recovery.; fails closed when an older HUB cannot recover an expired SSH pane — Old HUB method_not_found is scripted mock refusal/error echo with no actual skewed host; repeats generic recovery failure propagation. Retires old-host recovery fallback refusal example.; names a held recovery's stopped WSL distro in readable copy, not the raw hold code — Pins exact WSL stopped-distro error prose after mock code; translation/copy assertion with no actual held recovery behavior. Retires readable-copy alarm.. Retained tests do not replace these alarms. Dated unrelated evidence remains scoped to its original execution; no historical source/import-closure equivalence, fresh execution, real network/provider/SSH, rendered UI, mobile, mixed-version or cross-platform validation is claimed. Audit 3318 reduces runtime-environment-ssh-state.test.ts, intentionally losing metadata membership-pruning/new-target-only-read and other-environment/local-bucket isolation alarms. Preserve generation/failed-full-refresh assertion and unknown-target authoritative-list reread; these narrower cases are not equivalent replacements. The unchanged active two-case Linux reconnect materialization/sidebar receipt and covered platform retain their exact scope and do not validate the reduced SSH state selector. Preserve unrelated SSH assertions, selectors and archived history. No fresh SSH discovery, provider/PTY/network, rendered, mobile, mixed-version, cross-platform or full-gate execution is claimed. Audit 3312 retires the ordinary six-pane distinct-live-handle reconnect/resubscription alarm from paired-reconnect-multi-pane-materialization.test.ts. The unchanged parked-pane activation/rematerialization case remains narrower and is not an equivalent replacement. The complete prior seven-contract macOS receipt is archived as historical evidence; it does not validate the reduced selector. No fresh socket, PTY, sleep/wake, provider, platform, mobile, mixed-version or rendered execution is claimed. Audit3096: remove the deleted reconnect-banner selector and its two UI aliases. The reduced recovery-state selector retains only the deadline cancelling pending backoff and explicit retry owning a new epoch alias; healthy-replacement stale-schedule and independent caller-cutoff cancellation aliases retire. Other retained state cases cover reentrant retry, owner settlement and same-epoch parked revival, without replacing those removed alarms. Prior admission-selector retirement, archived July 28 receipt, unrelated selectors/claims/receipts and old gaps remain unchanged; no fresh execution is claimed. Audit3086: retire the destroyed fresh-session fallback settlement/non-destructive reattach alias and its direct selector; retain the detach/attach selector and assertion unchanged. The retained admission cases cover adopt-before-data and explicitly buffered-death admission without a new spawn, without replacing fallback retirement. July 28 evidence was already archived by audit3077; no duplicate retirement or new execution is claimed. Audit2133 current-parent preparation: Current reduced sources/selectors intentionally retire the alarms listed in knownGaps; prior dated runs and replacement claims do not validate the changed set. Historical prior account (preserved verbatim): Audit2076 (sources2073/2074): Intentionally retire these low-value alarms without replacement: src/main/ssh/connection/ssh-connection-manager.test.ts: tears a failed startup down quietly, so its error is not replaced by a disconnect; marks a dial that never reached the host, so setup reports SSH’s reason; removes the registration when bulk teardown fails; leaves a connection whose own reconnect is asking the user alone; clears the pool entry when the closed connection is still the registered one; still reuses a connection that is already up; dials a user's connection test. Existing unrelated evidenceRuns retain their original scope; unchanged dated receipt objects do not validate changed source bytes or reduced selectors. No fresh gate execution or historical import-closure equivalence is claimed. Frozen current literal-import graph reaches these changed test bytes; unresolved local and computed edges remain debt, and current reachability is not historical execution or equivalent replacement evidence. Historical prior account (preserved verbatim): Audit2052 (sources2049/2050/2051): Remove complete low-value restored-pane-title and pane-visibility-identity suites and their current selectors. Their supplied snapshot/title and nullable identity-comparison alarms are intentionally lost without replacement. Unrelated dated evidenceRuns remain unchanged and do not validate the reduced commands. No fresh gate execution, actual PTY/provider, rendered, remote/mobile or cross-platform result is claimed. Historical prior account (preserved verbatim): Audit1983: Delete the terminal-create idempotency forwarding suite and its prospective selector. Preserve2 unrelated receipts without claiming the lost forwarding alarm was replaced. Changed-source prior results do not validate reduced-source bytes. No fresh execution, equivalent replacement, red/green, measured budget, soak, provider/PTY, rendered, live remote/mobile or cross-platform result is claimed. Historical prior account (preserved verbatim): Audit1931 (sources1928/1929): Delete complete transport-unmount and queued-initial-CWD helper suites: despite lifecycle-shaped fixtures, the unmount owner returns a Boolean PTY-id predicate, while CWD cases check nullish field selection and callback counts. Lose their detach/destroy/teardown and one-shot-CWD supplied examples. Partial queued-pane-startup loses three identical/empty/nonowner identity examples, retaining four exact one-shot/replacement ownership callbacks. No assertion object maps to these three sources, so unrelated alias objects remain byte-exact. Preserve the current81ed prior removal of pane-split-startup; stale bd948 source metadata snapshots are not replayed. No actual process/PTY startup, transport shutdown, live SSH or rendered recovery is proven by this metadata change. Preserve meaningful remaining selectors/assertions and unchanged dated receipts within their original scope. Reduced selectors have no fresh gate execution evidence in this metadata packet. No equivalent replacement, physical watcher/PTY/provider, live SSH/remote/mobile, rendered, cross-platform, soak or measured-budget result is claimed. Historical prior account (preserved verbatim): Audit1925 (sources1922/1923): Delete the sole supplied public-SSH-state spread/sanitized-error projection and its provider-authority-pair alias. Also delete the complete tiny one-shot split-startup wrapper suite: callback-visible temporary field/reset, sequential payload and thrown-sentinel reset alarms disappear. No SSH provider epoch handoff, connection, process startup or actual terminal split was performed by either deleted suite. Preserve meaningful remaining selectors/assertions and unchanged dated receipts within their original scope. Reduced selectors have no fresh gate execution evidence in this metadata packet. No equivalent replacement, physical watcher/PTY/provider, live SSH/remote/mobile, rendered, cross-platform, soak or measured-budget result is claimed. Historical prior account (preserved verbatim): Audit1903 removes whole mocked detach, supplied geometry and/or close-request suites selected by this gate. Their pending-CWD/PTY-binding argument/order, fabricated hit-test and close bookkeeping alarms are intentionally lost without replacement. Valid remaining selectors/assertions and unchanged-selector execution receipts retain their original scope. Reduced unit selections have no fresh broad gate, real PTY/provider, rendered focus, or measured-budget validation. Historical prior account (preserved verbatim): Existing exact unchanged-selector receipts remain the only current execution evidence. Changed source selectors have no fresh execution result. Historical prior-source oracle account: Existing exact unchanged-selector receipts remain the only current execution evidence. Changed source selectors have no fresh execution result. Historical prior-source oracle account: The retained unchanged-source receipts are the only current execution evidence; reduced-source assertions await validation. Historical oracle account (not a current claim for changed sources): The retained unchanged-source receipts are the only current execution evidence; reduced-source assertions await validation. Historical oracle account (not a current claim for changed sources): Deterministic tests cover bounded stale-handle replacement, suspended heartbeat clocks, cold and established subscription failure, ten partition/recovery cycles, automatic-recovery cutoff, manual reconnect, and direct SSH binding retention. They assert SSH state changes leave PTY bindings in place, relay identity survives, and another target/local/WSL/runtime panes remain byte-identical through target snapshot hydration and reconnect. Both remount callbacks consume split-count activity suppression, intentional dispose emits no failure/timeout, and a same-attempt StrictMode remount still owns one timeout. Hydration clears an untrusted PTY hint without clearing its current pending owner, healthy current-authority bindings suppress correction, hydration finalizes once, and reconnect emits no paired close lifecycle. A provider-level session-ID reattach returns an incarnation, then a legacy exit without an incarnation must resolve to that returned identity rather than minting a fallback identity. The shared-control oracle withholds the first encrypted ready frame, starts one RPC, triggers the successful-probe refresh, then requires exactly two client connections, one host request, a successful response, zero pending calls, and zero retained request bytes. Tests also assert one unsubscribe per remote-runtime epoch, observable recovery phases, stable PTY identity, resumed snapshot/output/input, no healthy state before replay, no retry or input after cutoff, a new manual epoch against the same PTY, quiet recovery UI with an explicit Reconnect action, pane-close state cleanup, one stable create mutation id, old-runtime no-retry behavior, cross-process PTY adoption, and bounded in-flight coordination. A focused recovery oracle surfaces two distinct failures through one transport, completes authoritative replay, and requires both matching clear callbacks; pane-state tests require only the active pane's error to render, matching-pane recovery to preserve sibling and unrelated errors, dismissal to re-admit later failures, and distinct storms to retain only the newest eight messages within 24 lines and 4,000 characters. The retained store replacement assertion observes one atomic pane/tab subscriber publication; repeated rotations and snapshot-first pending-restart migration no longer have their direct store examples. Preload layout cleanup retires the mock SSH forwarding/type-census suite without replacement: preload wiring alarms are lost; shared authority-admission tests cover narrower behavior. Historical receipts retain their original scope.", "commands": [ "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/paired-reconnect-multi-pane-materialization.test.ts --reporter=dot", - "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal/background-terminal-worktree-mount.test.ts src/renderer/src/components/terminal-pane/mounting/queued-pane-startup.test.ts src/renderer/src/components/terminal-pane/parking/one-shot-park-replay.test.ts src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-stream-reconnect.test.ts src/renderer/src/store/terminals/terminal-pty-identity-replacement.test.ts", + "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal/background-terminal-worktree-mount.test.ts src/renderer/src/components/terminal-pane/mounting/queued-pane-startup.test.ts src/renderer/src/components/terminal-pane/parking/one-shot-park-replay.test.ts src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-stream-reconnect.test.ts src/renderer/src/store/terminals/pty/terminal-pty-identity-replacement.test.ts", "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal-pane/pty-transport/ipc/pty-transport-detach-attach-handoff.test.ts", "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-stream-reconnect.test.ts src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-expired-pane-recovery.test.ts src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/recovery/remote-runtime-pty-recovery-state.test.ts src/shared/remote-runtime/remote-runtime-socket-liveness.test.ts src/shared/remote-runtime/control/remote-runtime-shared-control-connection.test.ts src/shared/remote-runtime/control/remote-runtime-shared-control-socket-generation.test.ts src/shared/remote-runtime/remote-runtime-client-error-classification.test.ts src/main/runtime/terminal/launch/orca-runtime-terminal-create-idempotency.test.ts", "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/store/slices/ui/workspace-navigation-history-hydration.test.ts src/renderer/src/store/repos/repos-ssh-host-reconciliation.test.ts --reporter=dot", @@ -9364,7 +9364,7 @@ "src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-stream-reconnect.test.ts", "src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-expired-pane-recovery.test.ts", "src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/recovery/remote-runtime-pty-recovery-state.test.ts", - "src/renderer/src/store/terminals/terminal-pty-identity-replacement.test.ts", + "src/renderer/src/store/terminals/pty/terminal-pty-identity-replacement.test.ts", "src/shared/remote-runtime/remote-runtime-socket-liveness.test.ts", "src/shared/remote-runtime/control/remote-runtime-shared-control-connection.test.ts", "src/shared/remote-runtime/control/remote-runtime-shared-control-socket-generation.test.ts", @@ -13469,12 +13469,11 @@ "invariant": "A Quick Command selected for a new terminal remains owned by that tab through a recovery remount, executes exactly once only after the successor PTY binds, and never reaches an unrelated terminal.", "oracle": "Audit2052 (sources2049/2050/2051): Remove complete low-value restored-pane-title and pane-visibility-identity suites and their current selectors. Their supplied snapshot/title and nullable identity-comparison alarms are intentionally lost without replacement. Unrelated dated evidenceRuns remain unchanged and do not validate the reduced commands. No fresh gate execution, actual PTY/provider, rendered, remote/mobile or cross-platform result is claimed. Historical prior account (preserved verbatim): Audit1931 (sources1928/1929): Delete complete transport-unmount and queued-initial-CWD helper suites: despite lifecycle-shaped fixtures, the unmount owner returns a Boolean PTY-id predicate, while CWD cases check nullish field selection and callback counts. Lose their detach/destroy/teardown and one-shot-CWD supplied examples. Partial queued-pane-startup loses three identical/empty/nonowner identity examples, retaining four exact one-shot/replacement ownership callbacks. No assertion object maps to these three sources, so unrelated alias objects remain byte-exact. Preserve the current81ed prior removal of pane-split-startup; stale bd948 source metadata snapshots are not replayed. No actual process/PTY startup, transport shutdown, live SSH or rendered recovery is proven by this metadata change. Preserve meaningful remaining selectors/assertions and unchanged dated receipts within their original scope. Reduced selectors have no fresh gate execution evidence in this metadata packet. No equivalent replacement, physical watcher/PTY/provider, live SSH/remote/mobile, rendered, cross-platform, soak or measured-budget result is claimed. Historical prior account (preserved verbatim): Audit1925 (sources1922/1923): Delete the complete pane-split-startup wrapper suite and selector. Its temporary dependency-field exposure/reset, sequential payload isolation and thrown-sentinel cleanup alarms are lost; no quick command, process or PTY startup was exercised by those callbacks. Remaining queued-startup/ownership sources are not equivalent replacements. Preserve meaningful remaining selectors/assertions and unchanged dated receipts within their original scope. Reduced selectors have no fresh gate execution evidence in this metadata packet. No equivalent replacement, physical watcher/PTY/provider, live SSH/remote/mobile, rendered, cross-platform, soak or measured-budget result is claimed. Historical prior account (preserved verbatim): Audit1903 removes whole mocked detach, supplied geometry and/or close-request suites selected by this gate. Their pending-CWD/PTY-binding argument/order, fabricated hit-test and close bookkeeping alarms are intentionally lost without replacement. Valid remaining selectors/assertions and unchanged-selector execution receipts retain their original scope. Reduced unit selections have no fresh broad gate, real PTY/provider, rendered focus, or measured-budget validation. Historical prior account (preserved verbatim): Arm the E2E-only pre-spawn barrier, click the visible Quick Command, force one recovery generation while the original spawn is blocked, and release it. Require one exact semantic xterm marker, an independently written pane/tab identity file matching the bound live PTY, queue consumption only after bind, and a live interactive sibling canary.", "commands": [ - "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal-pane/pty-connection/host-ownership/pty-connection-owner-hydration-backend-retention.test.ts src/renderer/src/components/terminal-pane/mounting/queued-pane-startup.test.ts src/renderer/src/components/terminal-pane/parking/one-shot-park-replay.test.ts --reporter=dot", + "pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal-pane/mounting/queued-pane-startup.test.ts src/renderer/src/components/terminal-pane/parking/one-shot-park-replay.test.ts --reporter=dot", "pnpm exec playwright test tests/e2e/terminal-quick-command-pre-bind-recovery.spec.ts --config tests/playwright.config.ts --project electron-headless --workers=1", "ORCA_E2E_FORCE_HEADFUL=1 SKIP_BUILD=1 pnpm exec playwright test tests/e2e/terminal-quick-command-pre-bind-recovery.spec.ts --config tests/playwright.config.ts --project electron-headless --workers=1" ], "testFiles": [ - "src/renderer/src/components/terminal-pane/pty-connection/host-ownership/pty-connection-owner-hydration-backend-retention.test.ts", "src/renderer/src/components/terminal-pane/mounting/queued-pane-startup.test.ts", "src/renderer/src/components/terminal-pane/parking/one-shot-park-replay.test.ts", "tests/e2e/terminal-quick-command-pre-bind-recovery.spec.ts" diff --git a/config/renderer-layout-writer-baseline.txt b/config/renderer-layout-writer-baseline.txt index 26d3f04ab48..ae7525844d7 100644 --- a/config/renderer-layout-writer-baseline.txt +++ b/config/renderer-layout-writer-baseline.txt @@ -101,23 +101,23 @@ 5 src/renderer/src/store/slices/worktrees/session/set-active-worktree.ts 2 src/renderer/src/store/slices/worktrees/session/worktree-slice-lookups.ts 6 src/renderer/src/store/terminals/create-terminal-slice.ts -5 src/renderer/src/store/terminals/terminal-layout-state.ts -6 src/renderer/src/store/terminals/terminal-orphan-cleanup.ts -2 src/renderer/src/store/terminals/terminal-pane-hibernation.ts -3 src/renderer/src/store/terminals/terminal-pty-bindings.ts -2 src/renderer/src/store/terminals/terminal-pty-release.ts -1 src/renderer/src/store/terminals/terminal-shutdown-guards.ts -3 src/renderer/src/store/terminals/terminal-shutdown-state.ts -1 src/renderer/src/store/terminals/terminal-tab-agent-launch-pane.ts -2 src/renderer/src/store/terminals/terminal-tab-appearance.ts -6 src/renderer/src/store/terminals/terminal-tab-close.ts -10 src/renderer/src/store/terminals/terminal-tab-creation.ts -7 src/renderer/src/store/terminals/terminal-tab-navigation.ts -3 src/renderer/src/store/terminals/terminal-tab-presentation.ts -2 src/renderer/src/store/terminals/terminal-tab-title-batch.ts -5 src/renderer/src/store/terminals/workspace-terminal-hydration-patch.ts -2 src/renderer/src/store/terminals/workspace-terminal-hydration.ts -2 src/renderer/src/store/terminals/workspace-terminal-reconnect.ts +5 src/renderer/src/store/terminals/layout/terminal-layout-state.ts +6 src/renderer/src/store/terminals/retirement/terminal-orphan-cleanup.ts +2 src/renderer/src/store/terminals/sleep/terminal-pane-hibernation.ts +3 src/renderer/src/store/terminals/pty/terminal-pty-bindings.ts +2 src/renderer/src/store/terminals/pty/terminal-pty-release.ts +1 src/renderer/src/store/terminals/sleep/terminal-shutdown-guards.ts +3 src/renderer/src/store/terminals/sleep/terminal-shutdown-state.ts +1 src/renderer/src/store/terminals/tabs/creation/terminal-tab-agent-launch-pane.ts +2 src/renderer/src/store/terminals/tabs/presentation/terminal-tab-appearance.ts +6 src/renderer/src/store/terminals/retirement/terminal-tab-close.ts +10 src/renderer/src/store/terminals/tabs/creation/terminal-tab-creation.ts +7 src/renderer/src/store/terminals/tabs/terminal-tab-navigation.ts +3 src/renderer/src/store/terminals/tabs/presentation/terminal-tab-presentation.ts +2 src/renderer/src/store/terminals/tabs/presentation/terminal-tab-title-batch.ts +5 src/renderer/src/store/terminals/hydration/workspace-terminal-hydration-patch.ts +2 src/renderer/src/store/terminals/hydration/workspace-terminal-hydration.ts +2 src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect.ts 7 src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-held-tabs.ts 4 src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-slices.ts 12 src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-store-patch.ts diff --git a/config/scripts/static-analysis/ratchets/renderer-state/check-tab-map-seam-ratchet.mjs b/config/scripts/static-analysis/ratchets/renderer-state/check-tab-map-seam-ratchet.mjs index c6743a1ae76..5fe02e109cc 100644 --- a/config/scripts/static-analysis/ratchets/renderer-state/check-tab-map-seam-ratchet.mjs +++ b/config/scripts/static-analysis/ratchets/renderer-state/check-tab-map-seam-ratchet.mjs @@ -96,13 +96,13 @@ export const WRITERS = [ 'src/renderer/src/store/slices/worktrees/session/worktree-identity-rename-state.ts', 'src/renderer/src/store/slices/worktrees/session/worktree-slice-lookups.ts', 'src/renderer/src/store/slices/worktrees/teardown/record-key-omission.ts', - 'src/renderer/src/store/terminals/terminal-tab-close.ts', - 'src/renderer/src/store/terminals/terminal-tab-creation.ts', - 'src/renderer/src/store/terminals/terminal-tab-navigation.ts', - 'src/renderer/src/store/terminals/terminal-tab-title-batch.ts', - 'src/renderer/src/store/terminals/workspace-terminal-hydration-patch.ts', - 'src/renderer/src/store/terminals/workspace-terminal-hydration.ts', - 'src/renderer/src/store/terminals/workspace-terminal-reconnect.ts', + 'src/renderer/src/store/terminals/retirement/terminal-tab-close.ts', + 'src/renderer/src/store/terminals/tabs/creation/terminal-tab-creation.ts', + 'src/renderer/src/store/terminals/tabs/terminal-tab-navigation.ts', + 'src/renderer/src/store/terminals/tabs/presentation/terminal-tab-title-batch.ts', + 'src/renderer/src/store/terminals/hydration/workspace-terminal-hydration-patch.ts', + 'src/renderer/src/store/terminals/hydration/workspace-terminal-hydration.ts', + 'src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect.ts', 'src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-store-patch.ts' ] export const SEAM_FIELDS = new Set([ diff --git a/config/scripts/static-analysis/ratchets/renderer-state/check-terminal-parking-ownership-ratchet.mjs b/config/scripts/static-analysis/ratchets/renderer-state/check-terminal-parking-ownership-ratchet.mjs index 8d823b050a9..4724e8a18af 100644 --- a/config/scripts/static-analysis/ratchets/renderer-state/check-terminal-parking-ownership-ratchet.mjs +++ b/config/scripts/static-analysis/ratchets/renderer-state/check-terminal-parking-ownership-ratchet.mjs @@ -41,28 +41,32 @@ const HOT_MAPS = new Set([ ]) const OWNER_ROOTS = [ { - rel: 'store/terminals/terminal-parking-input-owner.ts', + rel: 'store/terminals/parking/terminal-parking-input-owner.ts', name: 'acceptTerminalParkingInputs', inputs: [] }, { - rel: 'store/terminals/terminal-parking-input-owner.ts', + rel: 'store/terminals/parking/terminal-parking-input-owner.ts', name: 'publishAcceptedTerminalParkingInputs', inputs: [] }, { - rel: 'store/terminals/terminal-parking-input-owner.ts', + rel: 'store/terminals/parking/terminal-parking-input-owner.ts', name: 'invalidateTerminalParkingPtyInputs', inputs: [] }, { - rel: 'store/terminals/terminal-tab-owner-index.ts', + rel: 'store/terminals/ownership/terminal-tab-owner-index.ts', name: 'update', inputs: ['tabsByWorktree'] }, - { rel: 'store/terminals/sleeping-agent-record-index.ts', name: 'update', inputs: ['records'] }, { - rel: 'store/terminals/sleeping-agent-record-index.ts', + rel: 'store/terminals/sleep/sleeping-agent-record-index.ts', + name: 'update', + inputs: ['records'] + }, + { + rel: 'store/terminals/sleep/sleeping-agent-record-index.ts', name: 'acceptTransition', inputs: ['previous', 'next'] }, @@ -73,14 +77,14 @@ const OWNER_ROOTS = [ } ] const KEY_DIFFS = new Set([ - `${RENDERER}store/terminals/terminal-parking-input-owner.ts#diffUnknownParkingRecordKeys`, - `${RENDERER}store/terminals/terminal-tab-owner-index.ts#diffUnknownTabOwnerKeys`, - `${RENDERER}store/terminals/sleeping-agent-record-index.ts#diffUnknownSleepingRecordKeys`, + `${RENDERER}store/terminals/parking/terminal-parking-input-owner.ts#diffUnknownParkingRecordKeys`, + `${RENDERER}store/terminals/ownership/terminal-tab-owner-index.ts#diffUnknownTabOwnerKeys`, + `${RENDERER}store/terminals/sleep/sleeping-agent-record-index.ts#diffUnknownSleepingRecordKeys`, `${RENDERER}lib/workspace/tabs/worktree-tab-bucket-projection.ts#diffUnknownProjectionKeys` ]) const COLD_RESYNCS = new Set([ - `${RENDERER}store/terminals/terminal-parking-input-owner.ts#resyncTerminalParkingWorkspaceIds`, - `${RENDERER}store/terminals/sleeping-agent-record-index.ts#resyncSleepingAgentRecordKeys` + `${RENDERER}store/terminals/parking/terminal-parking-input-owner.ts#resyncTerminalParkingWorkspaceIds`, + `${RENDERER}store/terminals/sleep/sleeping-agent-record-index.ts#resyncSleepingAgentRecordKeys` ]) function isColdResyncCall(node, source) { @@ -139,15 +143,15 @@ const ADDRESSED_FIELDS = new Set([ 'sleepingAgentSessionsByPaneKey' ]) const ORDINARY_WRITERS = [ - 'store/terminals/terminal-layout-state.ts', - 'store/terminals/terminal-pane-hibernation.ts', - 'store/terminals/terminal-pty-bindings.ts', - 'store/terminals/terminal-pty-release.ts', - 'store/terminals/terminal-orphan-cleanup.ts', - 'store/terminals/terminal-startup-queues.ts', - 'store/terminals/terminal-tab-presentation.ts', - 'store/terminals/terminal-shutdown-state.ts', - 'store/terminals/window-tab-start-in-main.ts', + 'store/terminals/layout/terminal-layout-state.ts', + 'store/terminals/sleep/terminal-pane-hibernation.ts', + 'store/terminals/pty/terminal-pty-bindings.ts', + 'store/terminals/pty/terminal-pty-release.ts', + 'store/terminals/retirement/terminal-orphan-cleanup.ts', + 'store/terminals/tabs/creation/terminal-startup-queues.ts', + 'store/terminals/tabs/presentation/terminal-tab-presentation.ts', + 'store/terminals/sleep/terminal-shutdown-state.ts', + 'store/terminals/tabs/creation/window-tab-start-in-main.ts', 'store/slices/agent-status/agent-status-live-reducer.ts', 'store/slices/agent-status/agent-status-launch-actions.ts', 'store/slices/agent-status/agent-status-provider-session-actions.ts', diff --git a/config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs b/config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs index 7cadca40ba7..dcd141bb974 100644 --- a/config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs +++ b/config/scripts/workflow/source-routing/pr-e2e-source-routing.mjs @@ -447,7 +447,7 @@ export const PR_E2E_SOURCE_ROUTES = [ ], matches: (file) => isProductSource(file) && - /^(?:src\/renderer\/src\/components\/terminal-pane\/(?:layout\/close\/retire-unbound-(?:ipc|runtime)-terminal-pane|terminal-pane-(?:close-admission|close-identity|lifecycle-close|pane-closed|retirement-ownership)|use-terminal-pane-close-actions)|src\/renderer\/src\/store\/(?:terminals\/terminal-tab-close(?:-providers)?|slices\/(?:terminal-tab-retirement|terminal-retirement-teardown-reservation|retired-terminal-tab-state-sweep)))\.ts$/.test( + /^(?:src\/renderer\/src\/components\/terminal-pane\/(?:layout\/close\/retire-unbound-(?:ipc|runtime)-terminal-pane|terminal-pane-(?:close-admission|close-identity|lifecycle-close|pane-closed|retirement-ownership)|use-terminal-pane-close-actions)|src\/renderer\/src\/store\/(?:terminals\/retirement\/(?:terminal-tab-close(?:-providers)?|terminal-tab-retirement|terminal-retirement-teardown-reservation|retired-terminal-tab-state-sweep)))\.ts$/.test( file ) }, diff --git a/config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs b/config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs index 298e9bb6b60..76cbd285784 100644 --- a/config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs +++ b/config/scripts/workflow/source-routing/pr-layout-oracle-route.mjs @@ -22,6 +22,7 @@ const LAYOUT_ORACLE_PREFIXES = [ // Window-side layout writers the layout-holder stack replaces; widened while it is open. 'src/renderer/src/store/slices/tabs', 'src/renderer/src/store/terminals/', + 'src/renderer/src/components/sidebar/workspace-card/activity/worktree-terminal-record-selector.ts', 'src/renderer/src/store/workspace-layout/workspace-layout-cache', 'src/renderer/src/components/terminal-pane/', 'src/renderer/src/components/agent-session-continuation/AgentSessionContinuationMenuItem.tsx', diff --git a/config/workspace-record-read-baseline.txt b/config/workspace-record-read-baseline.txt index b6e4e4e16f9..3efc1f265d9 100644 --- a/config/workspace-record-read-baseline.txt +++ b/config/workspace-record-read-baseline.txt @@ -70,4 +70,4 @@ 6 src/renderer/src/store/slices/worktrees/teardown/host-qualified-worktree-row-removal.ts # store writer 8 src/renderer/src/store/slices/worktrees/teardown/purge-stale-runtime-host-state.ts # store writer 1 src/renderer/src/store/slices/worktrees/teardown/remove-worktree-store-cleanup.ts # store writer -8 src/renderer/src/store/terminals/workspace-terminal-hydration.ts # store writer +8 src/renderer/src/store/terminals/hydration/workspace-terminal-hydration.ts # store writer diff --git a/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-message-sender-view.test.tsx b/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-message-sender-view.test.tsx index 850b37187a7..9e7638cdb71 100644 --- a/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-message-sender-view.test.tsx +++ b/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-message-sender-view.test.tsx @@ -4,7 +4,7 @@ import { act, cleanup, renderHook } from '@testing-library/react' import { afterEach, beforeEach, expect, it, vi } from 'vitest' import { render } from '../actions/native-chat-tooltip-test-harness' import { useAppStore } from '@/store' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '@/store/slices/worktrees/worktree.test-fixture' import { TEST_REPO } from '@/store/repos/repo.test-fixture' import type { AgentStatusEntry } from '../../../../../../shared/agent-status/contracts/agent-status-types' @@ -13,7 +13,6 @@ import '@/components/sidebar/workspace-card/activity/worktree-agent-row-selector import { useAgentMessageSenderView } from './native-chat-agent-message-sender-view' import { initialStore, status, resetSenderStore } from './native-chat-agent-sender.test-fixture' -const renders = new Map() function Probe({ id, workspace = 'workspace', @@ -41,7 +40,6 @@ function Probe({ remote ? { kind: 'environment', environmentId: 'remote' } : { kind: 'local' }, proof === 'terminal' ? undefined : `${proof === 'gone' ? 'closed' : 'source'}-${sourceId}` ) - renders.set(id, (renders.get(id) ?? 0) + 1) return null } let publicationRevision = 0 @@ -77,7 +75,6 @@ function write(i: number, update: Partial) { beforeEach(() => { vi.useFakeTimers({ toFake: ['Date'] }) vi.setSystemTime(2_000_000) - renders.clear() resetSenderStore() publishSources(1) publishSources(10, 'runtime:remote', 'remote') @@ -126,7 +123,7 @@ it.each(['run:coordinator', 'dispatch:past'])( } ) -it('shows only a proved Dispatch invocation and withdraws proof without changing unrelated sender rows', () => { +it('shows only a proved Dispatch invocation and withdraws missing proof', () => { write(0, { agentType: 'codex' }) const saved = { name: 'Worker', @@ -182,15 +179,14 @@ it('shows only a proved Dispatch invocation and withdraws proof without changing const single = renderHook(() => useAgentMessageSenderView(saved, 'workspace', { kind: 'local' })) expect(single.result.current).toMatchObject({ agentType: 'codex', dot: 'working' }) expect(alias.result.current).toEqual({ agentType: 'codex' }) - const before = new Map(renders) act(() => publish(false, 2)) - expect(renders).toEqual(before) + expect(single.result.current.agentType).toBe('codex') expect(single.result.current.dot).toBeUndefined() expect(alias.result.current.agentType).toBe('codex') expect(alias.result.current.dot).toBeUndefined() act(() => publish(false, 3)) - expect(renders).toEqual(before) + expect(alias.result.current.dot).toBeUndefined() // The current terminal alias must not bypass missing source proof. write(0, { state: 'waiting' }) diff --git a/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-sender.test-fixture.ts b/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-sender.test-fixture.ts index 127fd6a14c1..cde81b4c7cb 100644 --- a/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-sender.test-fixture.ts +++ b/src/renderer/src/components/native-chat/messages/agent-senders/native-chat-agent-sender.test-fixture.ts @@ -1,7 +1,7 @@ import { structuredAgentSessionPaneKey } from '../../../../../../shared/agent-session/view/structured-agent-session-projection' import type { OrcaSessionId } from '../../../../../../shared/orca-session-address' import { useAppStore } from '@/store' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import { makeUnifiedTab } from '@/store/slices/tabs/tab-group.test-fixture' import type { AgentStatusEntry } from '../../../../../../shared/agent-status/contracts/agent-status-types' import type { AgentMessageSource } from '../../../../../../shared/agent-session/agent-session-message-source' diff --git a/src/renderer/src/components/native-chat/messages/rows/NativeChatAgentMessageCard.fixture.tsx b/src/renderer/src/components/native-chat/messages/rows/NativeChatAgentMessageCard.fixture.tsx index 0f591dddcce..fbcb49999fe 100644 --- a/src/renderer/src/components/native-chat/messages/rows/NativeChatAgentMessageCard.fixture.tsx +++ b/src/renderer/src/components/native-chat/messages/rows/NativeChatAgentMessageCard.fixture.tsx @@ -1,7 +1,7 @@ import type { AgentStatusEntry } from '../../../../../../shared/agent-status/contracts/agent-status-types' import type { NativeChatMessage } from '../../../../../../shared/native-chat/native-chat-types' import { defineFixture } from '../../../../component-fixtures/component-fixture' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import type { AgentMessageSource } from '../../../../../../shared/agent-session/agent-session-message-source' import { NativeChatAgentMessageCard } from './NativeChatAgentMessageCard' import { MessageRow } from './NativeChatMessageRow' diff --git a/src/renderer/src/components/native-chat/pane/routing/native-chat-layout-actions.ts b/src/renderer/src/components/native-chat/pane/routing/native-chat-layout-actions.ts index ceb92e18243..d70bc3608a7 100644 --- a/src/renderer/src/components/native-chat/pane/routing/native-chat-layout-actions.ts +++ b/src/renderer/src/components/native-chat/pane/routing/native-chat-layout-actions.ts @@ -3,7 +3,7 @@ import { translate } from '@/i18n/i18n' import type { AppState } from '@/store/types' import { useAppStore } from '@/store' import { requestActiveTerminalPaneSplit } from '@/components/tab-bar/request-active-terminal-pane-split' -import { openNewTerminalTabInWorkspace } from '@/store/terminals/terminal-active-workspace-creation' +import { openNewTerminalTabInWorkspace } from '@/store/terminals/tabs/creation/terminal-active-workspace-creation' import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../../../shared/constants' import type { NativeChatSplitDirection } from './native-chat-pane-shortcut' diff --git a/src/renderer/src/components/shared/kill-all-terminal-surfaces.ts b/src/renderer/src/components/shared/kill-all-terminal-surfaces.ts index 3d3eda414b7..911946e6401 100644 --- a/src/renderer/src/components/shared/kill-all-terminal-surfaces.ts +++ b/src/renderer/src/components/shared/kill-all-terminal-surfaces.ts @@ -8,8 +8,8 @@ import { buildTerminalTabRetirementPlans, type TerminalTabRetirementPlan, type TerminalTabRetirementState -} from '@/store/terminals/terminal-tab-retirement' -import { reserveTerminalRetirementTeardowns } from '@/store/terminals/terminal-retirement-teardown-reservation' +} from '@/store/terminals/retirement/terminal-tab-retirement' +import { reserveTerminalRetirementTeardowns } from '@/store/terminals/retirement/terminal-retirement-teardown-reservation' import { notifyDaemonSessionInventoryInvalidated } from '../status-bar/daemon-session-inventory-invalidation' const CLOSE_BATCH_SIZE = 2 diff --git a/src/renderer/src/components/sidebar/workspace-actions/sleep/workspace-sleep-target.ts b/src/renderer/src/components/sidebar/workspace-actions/sleep/workspace-sleep-target.ts index a8d12562709..9f0bc627c31 100644 --- a/src/renderer/src/components/sidebar/workspace-actions/sleep/workspace-sleep-target.ts +++ b/src/renderer/src/components/sidebar/workspace-actions/sleep/workspace-sleep-target.ts @@ -13,7 +13,7 @@ import { resolveOwner } from '@/lib/workspace/ownership/resolve-owner' import { resolveTerminalPtyOwner } from '@/lib/workspace/ownership/terminal-worktree-route' import { runtimeRpcTargetForAuthorityKey } from '@/runtime/rpc/targets/runtime-client-target' import { workspacePublishingHosts } from '@/store/slices/worktrees/teardown/host-twin-purge-scopes' -import { resolveTerminalTeardownOwner } from '@/store/terminals/terminal-teardown-owner' +import { resolveTerminalTeardownOwner } from '@/store/terminals/sleep/terminal-teardown-owner' import type { AppState } from '@/store/types' /** One runtime per copy of the workspace; with no listing row, the workspace's route. */ diff --git a/src/renderer/src/components/sidebar/workspace-card/activity/mirrored-terminal-lineage.test-fixture.tsx b/src/renderer/src/components/sidebar/workspace-card/activity/mirrored-terminal-lineage.test-fixture.tsx index 7ddbf2fb315..dde0c977cac 100644 --- a/src/renderer/src/components/sidebar/workspace-card/activity/mirrored-terminal-lineage.test-fixture.tsx +++ b/src/renderer/src/components/sidebar/workspace-card/activity/mirrored-terminal-lineage.test-fixture.tsx @@ -7,7 +7,7 @@ import type { AppState } from '@/store/types' import type { DashboardAgentRow } from '@/components/dashboard/useDashboardData' import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' import type { AgentStatusEntry } from '../../../../../../shared/agent-status/contracts/agent-status-types' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' // Load the native graph during collection; fixture state stays per test. const { diff --git a/src/renderer/src/components/sidebar/workspace-card/activity/use-worktree-agent-rows-subscriptions.test.tsx b/src/renderer/src/components/sidebar/workspace-card/activity/use-worktree-agent-rows-subscriptions.test.tsx index 5acdc2c8134..bb451230f5d 100644 --- a/src/renderer/src/components/sidebar/workspace-card/activity/use-worktree-agent-rows-subscriptions.test.tsx +++ b/src/renderer/src/components/sidebar/workspace-card/activity/use-worktree-agent-rows-subscriptions.test.tsx @@ -4,7 +4,7 @@ import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { useAppStore } from '@/store' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import type { AppState } from '@/store/types' import type { DashboardAgentRow } from '@/components/dashboard/useDashboardData' import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' diff --git a/src/renderer/src/components/sidebar/workspace-card/activity/worktree-agent-row-selectors.ts b/src/renderer/src/components/sidebar/workspace-card/activity/worktree-agent-row-selectors.ts index 958474fd018..cb405ca512d 100644 --- a/src/renderer/src/components/sidebar/workspace-card/activity/worktree-agent-row-selectors.ts +++ b/src/renderer/src/components/sidebar/workspace-card/activity/worktree-agent-row-selectors.ts @@ -11,7 +11,7 @@ import { patchLiveEntriesByWorktree } from './worktree-agent-live-index-patch' import './worktree-agent-orchestration-index' -import { createWorktreeRecordSelector } from '@/store/terminals/worktree-terminal-record-selector' +import { createWorktreeRecordSelector } from '@/components/sidebar/workspace-card/activity/worktree-terminal-record-selector' import type { TerminalLayoutSnapshot } from '../../../../../../shared/workspace-layout/terminal-tab-types' // Why frozen and exported: card hooks return these from their inactive branch, diff --git a/src/renderer/src/components/sidebar/workspace-card/activity/worktree-card-status-inputs.ts b/src/renderer/src/components/sidebar/workspace-card/activity/worktree-card-status-inputs.ts index df951a8f53e..04d81f24455 100644 --- a/src/renderer/src/components/sidebar/workspace-card/activity/worktree-card-status-inputs.ts +++ b/src/renderer/src/components/sidebar/workspace-card/activity/worktree-card-status-inputs.ts @@ -2,7 +2,7 @@ import type { AppState } from '@/store/types' import type { PaneForegroundAgentEntry } from '@/store/slices/agent-status/pane-foreground-agent' import { parsePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' import type { TerminalPaneLayoutNode } from '../../../../../../shared/workspace-layout/terminal-tab-types' -import { createWorktreeRecordSelector } from '@/store/terminals/worktree-terminal-record-selector' +import { createWorktreeRecordSelector } from '@/components/sidebar/workspace-card/activity/worktree-terminal-record-selector' // Cache projected maps per source snapshot while preserving per-tab value references. diff --git a/src/renderer/src/store/terminals/worktree-terminal-record-selector.ts b/src/renderer/src/components/sidebar/workspace-card/activity/worktree-terminal-record-selector.ts similarity index 100% rename from src/renderer/src/store/terminals/worktree-terminal-record-selector.ts rename to src/renderer/src/components/sidebar/workspace-card/activity/worktree-terminal-record-selector.ts diff --git a/src/renderer/src/components/status-bar/CodexSwitcherMenu.fixture.tsx b/src/renderer/src/components/status-bar/CodexSwitcherMenu.fixture.tsx index f5150bdbfca..5e66fb95cbb 100644 --- a/src/renderer/src/components/status-bar/CodexSwitcherMenu.fixture.tsx +++ b/src/renderer/src/components/status-bar/CodexSwitcherMenu.fixture.tsx @@ -7,7 +7,7 @@ import type { ProviderRateLimits, RateLimitWindow } from '../../../../shared/rate-limit-types' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import { CodexSwitcherMenu } from './CodexSwitcherMenu' import { DropdownMenu, diff --git a/src/renderer/src/components/tab-bar/group-tab-order.test.ts b/src/renderer/src/components/tab-bar/group-tab-order.test.ts index d4557bb5702..0ac485fe386 100644 --- a/src/renderer/src/components/tab-bar/group-tab-order.test.ts +++ b/src/renderer/src/components/tab-bar/group-tab-order.test.ts @@ -4,7 +4,7 @@ import type { AppState } from '../../store/types' import { getActiveTabNavOrder } from './group-tab-order' import { makeOpenFile } from '../../store/slices/editor/types/open-file.test-fixture' -import { makeTerminalTab } from '../../store/terminals/terminal-row.test-fixture' +import { makeTerminalTab } from '../../store/terminals/testing/terminal-row.test-fixture' function terminalTab(id: string, groupId: string, entityId: string, sortOrder: number): Tab { return { diff --git a/src/renderer/src/components/tab-group/SplitPaneLanding.tsx b/src/renderer/src/components/tab-group/SplitPaneLanding.tsx index e7a9d41b20a..c3251e3ebae 100644 --- a/src/renderer/src/components/tab-group/SplitPaneLanding.tsx +++ b/src/renderer/src/components/tab-group/SplitPaneLanding.tsx @@ -9,7 +9,7 @@ import { ensureClientCreationActionAllowed, showClientCreationActionError } from '@/lib/workspace/creation/surface-policy/client-creation-action-error' -import { openNewTerminalTabInWorkspace } from '@/store/terminals/terminal-active-workspace-creation' +import { openNewTerminalTabInWorkspace } from '@/store/terminals/tabs/creation/terminal-active-workspace-creation' import { getWorkspaceClientCreationActionPolicy } from '@/lib/workspace/creation/surface-policy/client-creation-action-policy' import { openMobileEmulatorTab } from '@/lib/simulator/launch/open-mobile-emulator-tab' import { diff --git a/src/renderer/src/components/terminal-pane/account-restart/detached/codex-detached-pane-restart.ts b/src/renderer/src/components/terminal-pane/account-restart/detached/codex-detached-pane-restart.ts index 61d6387533c..a2737937d11 100644 --- a/src/renderer/src/components/terminal-pane/account-restart/detached/codex-detached-pane-restart.ts +++ b/src/renderer/src/components/terminal-pane/account-restart/detached/codex-detached-pane-restart.ts @@ -4,7 +4,7 @@ import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' import { useAppStore } from '@/store/index' -import { singlePaneLayoutSnapshot } from '@/store/terminals/terminal-single-pane-layout' +import { singlePaneLayoutSnapshot } from '@/store/terminals/layout/terminal-single-pane-layout' import { hasRegisteredRuntimeTerminalTab } from '@/runtime/hosted-terminals/mounted-surfaces/mounted-terminal-tab-registry' import { buildCodexAccountRestartStartup, diff --git a/src/renderer/src/components/terminal-pane/layout/close/pending-split-close-test-fixture.ts b/src/renderer/src/components/terminal-pane/layout/close/pending-split-close-test-fixture.ts index 5259e667145..57c68c8ff56 100644 --- a/src/renderer/src/components/terminal-pane/layout/close/pending-split-close-test-fixture.ts +++ b/src/renderer/src/components/terminal-pane/layout/close/pending-split-close-test-fixture.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, vi } from 'vitest' import type { AppState } from '@/store/types' -import type { TerminalTabRetirementState } from '@/store/terminals/terminal-tab-retirement' +import type { TerminalTabRetirementState } from '@/store/terminals/retirement/terminal-tab-retirement' import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' import type { PaneManager } from '@/lib/pane-manager/pane-manager' import type { PtyConnectResult, PtyTransport } from '../../pty-transport/pty-transport-types' diff --git a/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-ipc-terminal-pane.ts b/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-ipc-terminal-pane.ts index 9f3ebf911a5..18f615f7241 100644 --- a/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-ipc-terminal-pane.ts +++ b/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-ipc-terminal-pane.ts @@ -2,8 +2,8 @@ import { captureTerminalPaneNoticeRetirement } from '../../mounting/terminal-pan import { buildTerminalTabRetirementPlan, getTerminalPtyOwnershipIdentity -} from '@/store/terminals/terminal-tab-retirement' -import { startTerminalTabProviderRetirement } from '@/store/terminals/terminal-tab-close-providers' +} from '@/store/terminals/retirement/terminal-tab-retirement' +import { startTerminalTabProviderRetirement } from '@/store/terminals/retirement/terminal-tab-close-providers' import { terminalPaneHasOtherOwner, type UnboundTerminalPaneRetirement diff --git a/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-runtime-terminal-pane.ts b/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-runtime-terminal-pane.ts index 7b17c1033c6..6f88cd56049 100644 --- a/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-runtime-terminal-pane.ts +++ b/src/renderer/src/components/terminal-pane/layout/close/retire-unbound-runtime-terminal-pane.ts @@ -3,8 +3,8 @@ import { parseRemoteRuntimePtyId } from '../../../../../../shared/remote-runtime import { buildTerminalTabRetirementPlan, getTerminalPtyOwnershipIdentity -} from '@/store/terminals/terminal-tab-retirement' -import { startTerminalTabProviderRetirement } from '@/store/terminals/terminal-tab-close-providers' +} from '@/store/terminals/retirement/terminal-tab-retirement' +import { startTerminalTabProviderRetirement } from '@/store/terminals/retirement/terminal-tab-close-providers' import { terminalPaneHasOtherOwner, type UnboundTerminalPaneRetirement diff --git a/src/renderer/src/components/terminal-pane/layout/close/terminal-pane-close-admission.ts b/src/renderer/src/components/terminal-pane/layout/close/terminal-pane-close-admission.ts index e62b037e12e..e4614e969d7 100644 --- a/src/renderer/src/components/terminal-pane/layout/close/terminal-pane-close-admission.ts +++ b/src/renderer/src/components/terminal-pane/layout/close/terminal-pane-close-admission.ts @@ -2,8 +2,8 @@ import type { AppState } from '@/store/types' import { buildTerminalTabRetirementPlan, getTerminalPtyOwnershipIdentity -} from '@/store/terminals/terminal-tab-retirement' -import { locateTerminalTab } from '@/store/terminals/terminal-tab-location' +} from '@/store/terminals/retirement/terminal-tab-retirement' +import { locateTerminalTab } from '@/store/terminals/ownership/terminal-tab-location' import { resolveTerminalHostOwnership } from '@/lib/workspace/ownership/terminal-worktree-route' import { parseRemoteRuntimePtyId } from '../../../../../../shared/remote-runtime/remote-runtime-pty-id' import { getRuntimeEnvironmentRevision } from '@/runtime/rpc/environment-revisions/runtime-environment-revision' diff --git a/src/renderer/src/components/terminal-pane/layout/close/use-terminal-pane-close-actions.ts b/src/renderer/src/components/terminal-pane/layout/close/use-terminal-pane-close-actions.ts index 8667d0bf644..8b99dd27ff6 100644 --- a/src/renderer/src/components/terminal-pane/layout/close/use-terminal-pane-close-actions.ts +++ b/src/renderer/src/components/terminal-pane/layout/close/use-terminal-pane-close-actions.ts @@ -13,7 +13,7 @@ import { clearPaneTerminalError } from '../../errors/terminal-error-accumulation import type { TerminalPaneBindingController } from '../ownership/use-terminal-pane-layout-bindings' import { retireUnboundIpcTerminalPane } from './retire-unbound-ipc-terminal-pane' import { capturePendingTerminalPaneClose } from './terminal-pane-close-admission' -import { commitTerminalSurfaceClose } from '@/store/terminals/terminal-surface-close-intent' +import { commitTerminalSurfaceClose } from '@/store/terminals/retirement/terminal-surface-close-intent' import { noteAgentLaunchPaneClosedByUser } from '../../../../lib/agent-session/launch/pane/agent-launch-pane-closes' import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../../shared/layout-owner-switch' import { sendUserPaneCloseToLayoutOwner } from './layout-owner-pane-close-command' diff --git a/src/renderer/src/components/terminal-pane/layout/detach/terminal-pane-tab-detach.ts b/src/renderer/src/components/terminal-pane/layout/detach/terminal-pane-tab-detach.ts index ad829d00c4a..b0c19afebfc 100644 --- a/src/renderer/src/components/terminal-pane/layout/detach/terminal-pane-tab-detach.ts +++ b/src/renderer/src/components/terminal-pane/layout/detach/terminal-pane-tab-detach.ts @@ -4,7 +4,7 @@ import { translate } from '@/i18n/i18n' import { createNonSecureContextUuid as createBrowserUuid } from '../../../../../../shared/non-secure-context-uuid' import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' import type { TerminalLeafMoveRequest } from '../../../../../../shared/workspace-layout/terminal-topology/terminal-leaf-move' -import { commitTerminalSurfaceClose } from '@/store/terminals/terminal-surface-close-intent' +import { commitTerminalSurfaceClose } from '@/store/terminals/retirement/terminal-surface-close-intent' import type { PaneCwdEntry } from '../split/resolve-split-cwd' import { detachTerminalLayoutLeaf } from './terminal-layout-leaf-detach' import { moveLeafThroughLayoutOwner } from './terminal-pane-detach-layout-owner' diff --git a/src/renderer/src/components/terminal-pane/mounting/terminal-pane-mount-cleanup.ts b/src/renderer/src/components/terminal-pane/mounting/terminal-pane-mount-cleanup.ts index 82e9b2a3725..385ba516b7a 100644 --- a/src/renderer/src/components/terminal-pane/mounting/terminal-pane-mount-cleanup.ts +++ b/src/renderer/src/components/terminal-pane/mounting/terminal-pane-mount-cleanup.ts @@ -14,7 +14,7 @@ import { releaseDeferredSplitPaneHandoff, type DeferredSplitPaneHandoffHandle } from '../layout/split/deferred-split-pane-handoff' -import { isTerminalTabPresent } from '@/store/terminals/terminal-tab-retirement' +import { isTerminalTabPresent } from '@/store/terminals/retirement/terminal-tab-retirement' import { clearTerminalFontSizeOverride } from '../appearance/terminal-font-size-overrides' import { e2eConfig } from '@/app-shell/startup/e2e-config' import { useAppStore } from '@/store/index' diff --git a/src/renderer/src/components/terminal-pane/mounting/terminal-pane-notice-retirement.ts b/src/renderer/src/components/terminal-pane/mounting/terminal-pane-notice-retirement.ts index 2deb0ecb369..3899183697d 100644 --- a/src/renderer/src/components/terminal-pane/mounting/terminal-pane-notice-retirement.ts +++ b/src/renderer/src/components/terminal-pane/mounting/terminal-pane-notice-retirement.ts @@ -1,5 +1,5 @@ import { useAppStore } from '@/store/index' -import { getTerminalPtyOwnershipIdentity } from '@/store/terminals/terminal-tab-retirement' +import { getTerminalPtyOwnershipIdentity } from '@/store/terminals/retirement/terminal-tab-retirement' import { getTerminalNoticeLifetime, retireTerminalNoticeLifetime, diff --git a/src/renderer/src/components/terminal-pane/mounting/terminal-pane-retirement-ownership.ts b/src/renderer/src/components/terminal-pane/mounting/terminal-pane-retirement-ownership.ts index 7e70070175d..7be8ebf5c8c 100644 --- a/src/renderer/src/components/terminal-pane/mounting/terminal-pane-retirement-ownership.ts +++ b/src/renderer/src/components/terminal-pane/mounting/terminal-pane-retirement-ownership.ts @@ -2,7 +2,7 @@ import type { AppState } from '@/store/types' import { getTerminalPtyOwnershipIdentity, hasTerminalPtyOwnerOutsidePane -} from '@/store/terminals/terminal-tab-retirement' +} from '@/store/terminals/retirement/terminal-tab-retirement' import type { PtyTransport } from '../pty-transport/pty-transport-types' export type UnboundTerminalPaneRetirement = { diff --git a/src/renderer/src/components/terminal-pane/notifications/terminal-notification-liveness.ts b/src/renderer/src/components/terminal-pane/notifications/terminal-notification-liveness.ts index 8a51218acf7..8855424583b 100644 --- a/src/renderer/src/components/terminal-pane/notifications/terminal-notification-liveness.ts +++ b/src/renderer/src/components/terminal-pane/notifications/terminal-notification-liveness.ts @@ -7,7 +7,7 @@ import type { TerminalPaneLayoutNode } from '../../../../../shared/workspace-lay import { getFirstTerminalTab, terminalTabHasOwnerOutside -} from '@/store/terminals/terminal-tab-owner-index' +} from '@/store/terminals/ownership/terminal-tab-owner-index' type StoreSnapshot = ReturnType const emptyTerminalTabs: StoreSnapshot['tabsByWorktree'] = {} diff --git a/src/renderer/src/components/terminal-pane/parking/output-watchers/parked-terminal-tab-coverage.ts b/src/renderer/src/components/terminal-pane/parking/output-watchers/parked-terminal-tab-coverage.ts index 26294ff1968..ec7a654bb64 100644 --- a/src/renderer/src/components/terminal-pane/parking/output-watchers/parked-terminal-tab-coverage.ts +++ b/src/renderer/src/components/terminal-pane/parking/output-watchers/parked-terminal-tab-coverage.ts @@ -1,6 +1,6 @@ import { isTerminalNoticeLifetimeCurrent } from '../../provider-notices/terminal-notice-lifetime' import { useAppStore } from '@/store/index' -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import { isTerminalLeafId } from '../../../../../../shared/workspace-layout/stable-pane-id' import { isRemoteExecutionHostPtyId } from '../../../../../../shared/execution-host/remote-execution-host-pty-id' import { terminalProviderAllowsParking } from '../../../terminal/terminal-provider-snapshot-capability' diff --git a/src/renderer/src/components/terminal-pane/parking/output-watchers/terminal-parked-pty-watcher.ts b/src/renderer/src/components/terminal-pane/parking/output-watchers/terminal-parked-pty-watcher.ts index 6c9f0fce236..508ecd0445d 100644 --- a/src/renderer/src/components/terminal-pane/parking/output-watchers/terminal-parked-pty-watcher.ts +++ b/src/renderer/src/components/terminal-pane/parking/output-watchers/terminal-parked-pty-watcher.ts @@ -4,7 +4,7 @@ import { isTerminalLeafId } from '../../../../../../shared/workspace-layout/stab import { isProvenProcessExit } from '../../../../../../shared/terminal/pty/lifecycle/terminal-exit-cause' import { isRemoteRuntimePtyId } from '../../../../../../shared/remote-runtime/remote-runtime-pty-id' import { useAppStore } from '@/store/index' -import { getTerminalTabOwnerWorktreeId } from '@/store/terminals/terminal-tab-owner-index' +import { getTerminalTabOwnerWorktreeId } from '@/store/terminals/ownership/terminal-tab-owner-index' import { terminalProviderSessionIsGone } from '../../../terminal/terminal-provider-gone-sessions' import { closeTerminalTab } from '../../../terminal/terminal-tab-actions' import { startParkedTerminalByteWatcher } from './parked-terminal-byte-watcher' diff --git a/src/renderer/src/components/terminal-pane/parking/retention/sleeping-record-park-exemption.ts b/src/renderer/src/components/terminal-pane/parking/retention/sleeping-record-park-exemption.ts index 301f0b4fa36..9a1a54b8b57 100644 --- a/src/renderer/src/components/terminal-pane/parking/retention/sleeping-record-park-exemption.ts +++ b/src/renderer/src/components/terminal-pane/parking/retention/sleeping-record-park-exemption.ts @@ -4,7 +4,7 @@ import { parsePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' import { activationTreatsNoteAsFinished } from '../../../../lib/agent-session/resume/sleeping-agent-pane-ownership' -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' const EMPTY_TAB_IDS: ReadonlySet = new Set() diff --git a/src/renderer/src/components/terminal-pane/provider-notices/codex-server-isolation/codex-shared-server-banner.test.tsx b/src/renderer/src/components/terminal-pane/provider-notices/codex-server-isolation/codex-shared-server-banner.test.tsx deleted file mode 100644 index 480481d0c38..00000000000 --- a/src/renderer/src/components/terminal-pane/provider-notices/codex-server-isolation/codex-shared-server-banner.test.tsx +++ /dev/null @@ -1,225 +0,0 @@ -// @vitest-environment happy-dom - -import { act } from 'react' -import { createRoot, type Root } from 'react-dom/client' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { useAppStore } from '@/store/index' -import type { GlobalSettings } from '../../../../../../shared/global-settings-types' -import { getDefaultSettings } from '../../../../../../shared/constants' -import { CodexSharedServerBanner } from './CodexSharedServerBanner' -import type { CodexSharedServerStatus } from '../../../../../../shared/codex-shared-server-command' -import { - admitTerminalNoticeLifetime, - getTerminalNoticeLifetime, - retireTerminalNoticeLifetime -} from '../terminal-notice-lifetime' -import { - installIpcPtyWindow, - restorePtySpecWindow -} from '../../pty-transport/ipc/pty-transport-test-harness' - -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' - -import { TEST_REPO } from '@/store/repos/repo.test-fixture' -import { makeWorktree } from '@/store/slices/worktrees/worktree.test-fixture' - -import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' - -import { renderNoticePaneLifecycle } from './terminal-notice-pane.test-fixture' -import type { PtyTransport } from '../../pty-transport/pty-transport-types' - -import { retireUnboundIpcTerminalPane } from '../../layout/close/retire-unbound-ipc-terminal-pane' - -const routing = vi.hoisted(() => ({ - activateAndRevealWorkspace: vi.fn<(id: string) => unknown>(), - revealFloatingWorkspacePanel: vi.fn(), - createFloatingWorkspaceTerminalTab: vi.fn() -})) -vi.mock('@/lib/workspace/activation/worktree-activation', () => ({ - activateAndRevealWorkspace: routing.activateAndRevealWorkspace -})) -vi.mock('@/components/floating-terminal/floating-workspace-panel-reveal', () => ({ - revealFloatingWorkspacePanel: routing.revealFloatingWorkspacePanel -})) -vi.mock('@/components/floating-terminal/floating-workspace-tab-creation', () => ({ - createFloatingWorkspaceTerminalTab: routing.createFloatingWorkspaceTerminalTab -})) - -globalThis.IS_REACT_ACT_ENVIRONMENT = true - -const TAB_ID = 'tab-1' -const LEAF_ID = '11111111-1111-4111-8111-111111111111' -const PANE_KEY = makePaneKey(TAB_ID, LEAF_ID) -const JOINED: CodexSharedServerStatus = { joined: true, openedBeforeWrapper: false } - -let paneElement: HTMLDivElement -let root: Root -let isCodexOnSharedServer: ReturnType< - typeof vi.fn<(id: string) => Promise> -> -let disableCodexSharedServerAutoStart: ReturnType Promise>> -let stopCodexSharedServer: ReturnType Promise>> -let writeClipboardText: ReturnType Promise>> -let updateSettings: ReturnType) => Promise>> -let nextPtyId = 0 -let ptyId: string - -class ResizeObserverStub { - observe(): void {} - disconnect(): void {} -} - -function setState(settings: Partial, agent: 'codex' | null = 'codex'): void { - useAppStore.setState({ - settings: { ...getDefaultSettings('/home/me'), ...settings }, - paneForegroundAgentByPaneKey: agent ? { [PANE_KEY]: { agent, shellForeground: false } } : {}, - updateSettings - }) -} - -function installPtyEvents(sinks: Parameters[1]): void { - const domWindow = window - installIpcPtyWindow(domWindow, sinks) - const api = window.api - restorePtySpecWindow(domWindow) - Object.defineProperty(domWindow, 'api', { configurable: true, value: api }) -} - -async function renderBanner(): Promise { - await act(async () => { - root.render() - }) -} - -async function advance(ms: number): Promise { - await act(async () => { - await vi.advanceTimersByTimeAsync(ms) - }) -} - -async function renderPaneLifecycle(transport: PtyTransport, worktreeId = 'wt-1') { - return renderNoticePaneLifecycle(root, ptyId, TAB_ID, LEAF_ID, transport, worktreeId) -} - -// Why document: the dialog portals out of the pane. -function button(label: string): HTMLButtonElement { - const match = Array.from(document.querySelectorAll('button')).find( - (candidate) => - candidate.textContent?.trim() === label || candidate.getAttribute('aria-label') === label - ) - if (!match) { - throw new Error(`missing ${label} button`) - } - return match -} - -beforeEach(() => { - vi.useFakeTimers() - vi.clearAllMocks() - routing.activateAndRevealWorkspace.mockReturnValue({ primaryTabId: null }) - vi.stubGlobal('ResizeObserver', ResizeObserverStub) - useAppStore.setState(useAppStore.getInitialState(), true) - ptyId = `wt-1@@pty-${(nextPtyId += 1)}` - admitTerminalNoticeLifetime(ptyId, { fresh: true }) - paneElement = document.createElement('div') - paneElement.className = 'pane' - document.body.appendChild(paneElement) - root = createRoot(paneElement) - isCodexOnSharedServer = vi.fn(() => Promise.resolve(JOINED)) - disableCodexSharedServerAutoStart = vi.fn(() => Promise.resolve(true)) - stopCodexSharedServer = vi.fn(() => Promise.resolve(true)) - writeClipboardText = vi.fn(() => Promise.resolve()) - updateSettings = vi.fn((updates: Partial) => { - setState({ ...useAppStore.getState().settings, ...updates }) - return Promise.resolve() - }) - Object.defineProperty(window, 'api', { - configurable: true, - value: { - pty: { isCodexOnSharedServer, disableCodexSharedServerAutoStart, stopCodexSharedServer }, - ui: { writeClipboardText, set: vi.fn(() => Promise.resolve()) } - } - }) -}) - -afterEach(() => { - const current = getTerminalNoticeLifetime(ptyId) - if (current) { - retireTerminalNoticeLifetime(current) - } - act(() => root.unmount()) - paneElement.remove() - vi.unstubAllGlobals() - vi.restoreAllMocks() - vi.useRealTimers() - useAppStore.setState(useAppStore.getInitialState(), true) -}) - -describe('CodexSharedServerBanner', () => { - function publishPaneOwner() { - useAppStore.setState({ - repos: [{ ...TEST_REPO, id: 'repo', executionHostId: 'local' }], - worktreesByRepo: { repo: [makeWorktree({ id: 'wt-1', repoId: 'repo', hostId: 'local' })] }, - tabsByWorktree: { 'wt-1': [makeTab({ id: TAB_ID, worktreeId: 'wt-1', ptyId })] }, - terminalLayoutsByTabId: { - [TAB_ID]: { - root: { type: 'leaf', leafId: LEAF_ID }, - activeLeafId: LEAF_ID, - expandedLeafId: null, - ptyIdsByLeafId: { [LEAF_ID]: ptyId } - } - } - }) - } - - async function dismissPaneWarning() { - installPtyEvents({}) - const { createIpcPtyTransport } = await import('../../pty-transport/ipc/pty-transport') - publishPaneOwner() - setState({}) - const transport = createIpcPtyTransport({}) - transport.attach({ existingPtyId: ptyId, callbacks: {} }) - const pane = await renderPaneLifecycle(transport) - await advance(1_000) - await act(async () => button('Dismiss').click()) - return { ...pane, transport } - } - - async function reattachPaneWarning() { - const { createIpcPtyTransport } = await import('../../pty-transport/ipc/pty-transport') - const next = createIpcPtyTransport({}) - next.attach({ existingPtyId: ptyId, callbacks: {} }) - setState({}) - await renderBanner() - await advance(1_000) - next.detach?.({ preserveExitObserver: false }) - } - - it('releases a pending unbound close without letting its late reply retire a successor', async () => { - const pane = await dismissPaneWarning() - pane.transport.detach?.({ preserveExitObserver: false }) - const { createIpcPtyTransport } = await import('../../pty-transport/ipc/pty-transport') - const spawn = Promise.withResolvers<{ id: string }>() - vi.mocked(window.api.pty.spawn).mockReturnValueOnce(spawn.promise) - const pending = createIpcPtyTransport({}) - const connecting = pending.connect({ url: '', sessionId: ptyId, callbacks: {} }) - await act(async () => - retireUnboundIpcTerminalPane({ - getState: useAppStore.getState, - tabId: TAB_ID, - leafId: LEAF_ID, - transport: pending, - getTransports: () => new Map([[1, pending]]) - }) - ) - await reattachPaneWarning() - expect(paneElement.querySelector('button')).not.toBeNull() - await act(async () => button('Dismiss').click()) - await act(async () => { - spawn.resolve({ id: ptyId }) - await connecting - }) - await reattachPaneWarning() - expect(paneElement.textContent).toBe('') - }) -}) diff --git a/src/renderer/src/components/terminal-pane/pty-connection/agent-identity/command-finished-status-store-test-fixture.ts b/src/renderer/src/components/terminal-pane/pty-connection/agent-identity/command-finished-status-store-test-fixture.ts index 9274963da5b..39405438088 100644 --- a/src/renderer/src/components/terminal-pane/pty-connection/agent-identity/command-finished-status-store-test-fixture.ts +++ b/src/renderer/src/components/terminal-pane/pty-connection/agent-identity/command-finished-status-store-test-fixture.ts @@ -2,7 +2,7 @@ import { createStore } from 'zustand/vanilla' import type { AppState } from '@/store/types' import type { AgentStatusEntry } from '../../../../../../shared/agent-status/contracts/agent-status-types' import { createAgentStatusSlice } from '@/store/slices/agent-status/agent-status' -import { createTerminalTabPresentationActions } from '@/store/terminals/terminal-tab-presentation' +import { createTerminalTabPresentationActions } from '@/store/terminals/tabs/presentation/terminal-tab-presentation' export function createCommandFinishedStatusStore(): { acceptWorkingClaudeStatus: (paneKey: string) => AgentStatusEntry diff --git a/src/renderer/src/components/terminal-pane/pty-connection/connect-pane-pty.ts b/src/renderer/src/components/terminal-pane/pty-connection/connect-pane-pty.ts index 511da38e01f..bc344b3473e 100644 --- a/src/renderer/src/components/terminal-pane/pty-connection/connect-pane-pty.ts +++ b/src/renderer/src/components/terminal-pane/pty-connection/connect-pane-pty.ts @@ -12,7 +12,7 @@ import { resolvePaneKeyboardProtocolAgent } from '../input/keyboard/terminal-key import { TerminalKittyKeyboardModeTracker } from '../../../../../shared/terminal/protocol/input-modes/terminal-kitty-keyboard-mode-tracker' import type { PtyConnectionDeps } from './pty-connection-deps' import { registerTerminalPaneRecoveryInstance } from '../render-health/recovery/terminal-pane-recovery' -import { captureTabRecoveryGeneration } from '@/store/terminals/terminal-tab-recovery-ledger' +import { captureTabRecoveryGeneration } from '@/store/terminals/pty/terminal-tab-recovery-ledger' import { TerminalIdleCursorReset } from '../emulation/terminal-idle-cursor-reset' import { TerminalStreamPosition } from '../pty-transport/delivery/terminal-stream-position' import { writeTerminalOutput } from '@/lib/pane-manager/terminal-output/pane-terminal-output-scheduler' diff --git a/src/renderer/src/components/terminal-pane/pty-connection/deferred-cold-restore-and-snapshot.ts b/src/renderer/src/components/terminal-pane/pty-connection/deferred-cold-restore-and-snapshot.ts index 1a0f8e96a76..4ec93125627 100644 --- a/src/renderer/src/components/terminal-pane/pty-connection/deferred-cold-restore-and-snapshot.ts +++ b/src/renderer/src/components/terminal-pane/pty-connection/deferred-cold-restore-and-snapshot.ts @@ -6,7 +6,7 @@ import { waitForTerminalOutputParsed } from '@/lib/pane-manager/terminal-output/ import { executeTerminalStartupCommandPaste } from '../input/paste/terminal-startup-command-paste' import { resolveTerminalPasteRuntime } from '../input/paste/terminal-paste-runtime' import { CLIENT_PLATFORM } from '@/lib/workspace/creation/new-workspace' -import { recordPaneWakeThroughLayoutOwner } from '@/store/terminals/terminal-sleep-layout-owner' +import { recordPaneWakeThroughLayoutOwner } from '@/store/terminals/sleep/terminal-sleep-layout-owner' import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch' import { shouldKeepHiddenStartupRendererQueriesLive } from './output/hidden-startup-renderer-query' diff --git a/src/renderer/src/components/terminal-pane/pty-connection/host-ownership/pty-connection-owner-hydration-backend-retention.test.ts b/src/renderer/src/components/terminal-pane/pty-connection/host-ownership/pty-connection-owner-hydration-backend-retention.test.ts deleted file mode 100644 index 6b7258c399e..00000000000 --- a/src/renderer/src/components/terminal-pane/pty-connection/host-ownership/pty-connection-owner-hydration-backend-retention.test.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { makeWorktree } from '@/store/slices/worktrees/worktree.test-fixture' -import { TEST_REPO } from '@/store/repos/repo.test-fixture' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' -import { createPaneManagerOptionsTestContext } from '../../mounting/terminal-pane-manager-options-test-context' -import { mockPanePtyArgs } from '../test-fixtures/pty-connection-test-connect-mock-pane' -import type * as React from 'react' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { - createMockTransport, - createPane, - createManager, - type MockTransport -} from '../test-fixtures/pty-connection-test-pane-fixtures' -import { - buildPaneConnectionDeps, - type PtyConnectionAgentTitleMocks, - bindPaneAgentTitleMocks -} from '../test-fixtures/pty-connection-test-deps' -import { createInitialStoreState } from '../test-fixtures/pty-connection-test-store-fixtures' -import type { StoreState } from '../test-fixtures/pty-connection-test-store-state' -import { - installTerminalTestGlobals, - restoreTerminalTestGlobals -} from '../test-fixtures/pty-connection-test-environment' - -const { - resetAndRefreshAllTerminalWebglAtlases, - scheduleRuntimeGraphSync, - shouldSeedCacheTimerOnInitialTitle, - toastInfo, - notifyCodexPaneBoundForStaleSweep -} = vi.hoisted(() => ({ - resetAndRefreshAllTerminalWebglAtlases: vi.fn(), - scheduleRuntimeGraphSync: vi.fn(), - shouldSeedCacheTimerOnInitialTitle: vi.fn(() => false), - toastInfo: vi.fn(), - notifyCodexPaneBoundForStaleSweep: vi.fn() -})) - -let mockStoreState: StoreState -let transportFactoryQueue: MockTransport[] = [] -let createdTransportOptions: Record[] = [] -let storeSubscribers: ((state: StoreState) => void)[] = [] - -vi.mock('@/runtime/sync-runtime-graph/graph-sync-scheduler', () => ({ scheduleRuntimeGraphSync })) - -vi.mock('@/lib/pane-manager/pane-manager-registry', async (importOriginal) => ({ - ...(await importOriginal>()), - resetAndRefreshAllTerminalWebglAtlases -})) - -vi.mock('@/store', () => ({ - useAppStore: { - getState: () => mockStoreState, - subscribe: (listener: (state: StoreState) => void) => { - storeSubscribers.push(listener) - return () => { - storeSubscribers = storeSubscribers.filter((candidate) => candidate !== listener) - } - } - } -})) - -vi.mock('@/lib/agent-status/aggregation/worktree-agent-status', async (importOriginal) => { - const { buildAgentStatusModuleMock } = - await import('../test-fixtures/pty-connection-test-environment') - return buildAgentStatusModuleMock(await importOriginal>()) -}) - -vi.mock('../../titles/cache-timer-seeding', () => ({ shouldSeedCacheTimerOnInitialTitle })) - -vi.mock('sonner', () => ({ toast: { info: toastInfo } })) - -vi.mock('@/lib/agent-session/accounts/codex/codex-stale-pane-sweep', () => ({ - notifyCodexPaneBoundForStaleSweep -})) - -vi.mock('react', async (importOriginal) => { - const actual = await importOriginal() - return { - ...actual, - useCallback: unknown>(fn: T): T => fn - } -}) - -vi.mock('../../pty-transport/ipc/pty-transport', () => ({ - createIpcPtyTransport: vi.fn((options: Record) => { - createdTransportOptions.push(options) - const nextTransport = transportFactoryQueue.shift() - if (!nextTransport) { - throw new Error('No mock transport queued') - } - return nextTransport - }) -})) - -vi.mock('../../pty-transport/remote-runtime/remote-runtime-pty-transport', () => ({ - createRemoteRuntimePtyTransport: vi.fn( - (_environmentId: string, options: Record) => { - createdTransportOptions.push(options) - const transport = transportFactoryQueue.shift() - if (!transport) { - throw new Error('No remote mock transport queued') - } - return transport - } - ) -})) - -vi.mock('../../pty-transport/delivery/pty-dispatcher', async (importOriginal) => { - const actual = await importOriginal>() - return { ...actual, getEagerPtyBufferHandle: vi.fn(() => undefined) } -}) -describe('connectPanePty owner hydration and backend retention', () => { - beforeEach(async () => { - vi.resetModules() - vi.clearAllMocks() - transportFactoryQueue = [] - createdTransportOptions = [] - storeSubscribers = [] - mockStoreState = createInitialStoreState(() => mockStoreState) - await installTerminalTestGlobals() - }) - - afterEach(async () => { - await restoreTerminalTestGlobals() - vi.unstubAllGlobals() - }) - - it('parks an unknown owner until hydration, then retains the acquired backend on refresh', async () => { - const { connectPanePty } = await import('../connect-pane-pty') - const agentTitleMocks = await vi.importMock( - '@/lib/agent-status/aggregation/worktree-agent-status' - ) - const { createIpcPtyTransport } = await import('../../pty-transport/ipc/pty-transport') - const { createRemoteRuntimePtyTransport } = - await import('../../pty-transport/remote-runtime/remote-runtime-pty-transport') - const { createTerminalPaneManagerOptions } = - await import('../../mounting/terminal-pane-manager-options') - const { clearTerminalTabsParkedOnUnresolvedHost, getTabIdsAwaitingHostHydrationRemount } = - await import('@/components/terminal-pane/mounting/parked-terminal-host-hydration') - clearTerminalTabsParkedOnUnresolvedHost() - const worktree = makeWorktree({ id: 'wt-hydrating', repoId: TEST_REPO.id, hostId: undefined }) - const tab = makeTab({ id: 'tab-1', worktreeId: worktree.id, ptyId: null }) - mockStoreState.repos = [] - mockStoreState.worktreesByRepo = { [TEST_REPO.id]: [worktree] } - mockStoreState.tabsByWorktree = { [worktree.id]: [tab] } - mockStoreState.ptyIdsByTabId = {} - const deps = buildPaneConnectionDeps(() => mockStoreState, { worktreeId: worktree.id }) - const pane = createPane(1) - const args = mockPanePtyArgs(pane, createManager(1), deps) - bindPaneAgentTitleMocks(args[2], agentTitleMocks) - - const parked = connectPanePty(...args) - expect(parked.getOwnerContext().executionHostId).toBe('runtime:unresolved-owner') - expect(createIpcPtyTransport).not.toHaveBeenCalled() - expect(createRemoteRuntimePtyTransport).not.toHaveBeenCalled() - const hydrationState = { - repos: [], - folderWorkspaces: [], - projectGroups: [], - worktreesByRepo: { [TEST_REPO.id]: [worktree] }, - tabsByWorktree: { [worktree.id]: [tab] }, - ptyIdsByTabId: {} - } - expect(getTabIdsAwaitingHostHydrationRemount(hydrationState)).toEqual([]) - const repo = { ...TEST_REPO, executionHostId: 'runtime:server' as const } - mockStoreState.repos = [repo] - mockStoreState.runtimeEnvironments = [{ id: 'server' }] - expect(getTabIdsAwaitingHostHydrationRemount({ ...hydrationState, repos: [repo] })).toEqual([ - 'tab-1' - ]) - parked.dispose() - transportFactoryQueue.push(createMockTransport()) - bindPaneAgentTitleMocks(args[2], agentTitleMocks) - - const binding = connectPanePty(...args) - const captured = binding.getOwnerContext() - expect(captured.executionHostId).toBe('runtime:server') - expect(createRemoteRuntimePtyTransport).toHaveBeenCalledExactlyOnceWith( - 'server', - expect.any(Object) - ) - expect(createIpcPtyTransport).not.toHaveBeenCalled() - mockStoreState.settings = { ...mockStoreState.settings, activeRuntimeEnvironmentId: 'other' } - const context = createPaneManagerOptionsTestContext(args[2], binding, deps.cwd) - const options = createTerminalPaneManagerOptions(context) - if (typeof options.terminalOptions === 'function') { - options.terminalOptions(1) - } - expect(binding.getOwnerContext()).toBe(captured) - binding.dispose() - clearTerminalTabsParkedOnUnresolvedHost() - }) - - it.each([ - { rowless: true, remote: false }, - { rowless: true, remote: true }, - { rowless: false, remote: false }, - { rowless: false, remote: true } - ])( - 'retains the connect owner through focus changes ($rowless, $remote)', - async ({ rowless, remote }) => { - const { connectPanePty } = await import('../connect-pane-pty') - const agentTitleMocks5 = await vi.importMock( - '@/lib/agent-status/aggregation/worktree-agent-status' - ) - const { createTerminalPaneManagerOptions } = - await import('../../mounting/terminal-pane-manager-options') - vi.stubGlobal('navigator', { userAgent: 'Windows' }) - const worktreeId = rowless ? 'ephemeral-setup-terminal:install' : 'repo1::/tmp/wt-1' - if (!rowless) { - mockStoreState.worktreesByRepo = { - repo1: [ - { - id: worktreeId, - repoId: 'repo1', - path: '/tmp/wt-1', - hostId: remote ? 'runtime:server' : 'local' - } - ] - } - } - mockStoreState.tabsByWorktree[worktreeId] = [{ id: 'tab-1', ptyId: null }] - mockStoreState.settings = { - ...mockStoreState.settings, - activeRuntimeEnvironmentId: remote ? 'server' : null - } - mockStoreState.runtimeEnvironments = remote ? [{ id: 'server' }] : [] - if (!rowless && remote) { - mockStoreState.repos = mockStoreState.repos.map((repo) => ({ - ...repo, - executionHostId: 'runtime:server' - })) - } - const transport = createMockTransport() - transportFactoryQueue.push(transport) - const deps = buildPaneConnectionDeps(() => mockStoreState, { worktreeId }) - const pane = createPane(1) - const args = mockPanePtyArgs(pane, createManager(1), deps) - bindPaneAgentTitleMocks(args[2], agentTitleMocks5) - - const binding = connectPanePty(...args) - const captured = binding.getOwnerContext() - expect(captured.route).toEqual({ runtimeEnvironmentId: remote ? 'server' : null }) - expect(captured.executionHostId).toBe(remote ? 'runtime:server' : 'local') - expect(captured.connectionId).toBe(rowless ? undefined : null) - const localConpty = !rowless && !remote - expect(pane.terminal.options.windowsPty).toEqual( - localConpty ? { backend: 'conpty', buildNumber: 26100 } : undefined - ) - expect(createdTransportOptions[0]?.terminalKittyKeyboardProtocol).toBe(!localConpty) - const tracker = deps.paneKittyKeyboardModesRef.current.get(1) - expect(tracker).toBeDefined() - tracker?.restoreSnapshotFlags(1) - expect(tracker?.flags).toBe(localConpty ? 0 : 1) - mockStoreState.settings = { - ...mockStoreState.settings, - activeRuntimeEnvironmentId: remote ? null : 'other' - } - mockStoreState.runtimeEnvironments = remote ? [] : [{ id: 'other' }] - const context = createPaneManagerOptionsTestContext(args[2], binding, deps.cwd) - const options = createTerminalPaneManagerOptions(context) - const refreshed = - typeof options.terminalOptions === 'function' - ? options.terminalOptions(1) - : options.terminalOptions - expect(binding.getOwnerContext()).toBe(captured) - expect(refreshed?.windowsPty).toEqual(pane.terminal.options.windowsPty) - expect(refreshed?.vtExtensions).toEqual(localConpty ? { kittyKeyboard: false } : undefined) - binding.dispose() - } - ) -}) diff --git a/src/renderer/src/components/terminal-pane/pty-connection/startup/sleeping-record-access.ts b/src/renderer/src/components/terminal-pane/pty-connection/startup/sleeping-record-access.ts index 9ff1154ada3..3b2c918c4eb 100644 --- a/src/renderer/src/components/terminal-pane/pty-connection/startup/sleeping-record-access.ts +++ b/src/renderer/src/components/terminal-pane/pty-connection/startup/sleeping-record-access.ts @@ -1,7 +1,7 @@ import { installSavedResumeStartupCancellation } from './saved-resume-startup-cancellation' import { launchConfigsEqual } from '../../../../../../shared/agent-session/lifecycle/agent-resume-record-equivalence' import { useAppStore } from '@/store/index' -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import type { PtyConnectResult } from '../../pty-transport/pty-transport-types' import { createNonSecureContextUuid as createBrowserUuid } from '../../../../../../shared/non-secure-context-uuid' import { findLegacyNumericSleepingRecord } from '../../../../../../shared/sleeping-record-legacy-pane-key' diff --git a/src/renderer/src/components/terminal-pane/render-health/recovery/terminal-pane-recovery.ts b/src/renderer/src/components/terminal-pane/render-health/recovery/terminal-pane-recovery.ts index 5966fbccce1..44a6b270d6e 100644 --- a/src/renderer/src/components/terminal-pane/render-health/recovery/terminal-pane-recovery.ts +++ b/src/renderer/src/components/terminal-pane/render-health/recovery/terminal-pane-recovery.ts @@ -1,6 +1,6 @@ import { useAppStore } from '@/store/index' import { recordRendererCrashBreadcrumb } from '@/diagnostics/crash-reporting/crash-breadcrumb-recorder' -import { locateTerminalTab } from '@/store/terminals/terminal-tab-location' +import { locateTerminalTab } from '@/store/terminals/ownership/terminal-tab-location' import { admitTerminalRecoveryRemount, captureTabRecoveryGeneration, @@ -8,7 +8,7 @@ import { type TerminalRecoveryRemountRequest, type TerminalRecoveryRemountResult, type TerminalRecoveryTrigger -} from '@/store/terminals/terminal-tab-recovery-ledger' +} from '@/store/terminals/pty/terminal-tab-recovery-ledger' import type { TerminalPaneRecoveryReason } from '../../../../../../shared/workspace-layout/terminal-tab-types' import { diff --git a/src/renderer/src/components/terminal/close-local-terminal-tab-state.ts b/src/renderer/src/components/terminal/close-local-terminal-tab-state.ts index c97c0d02e1c..c9190ca2dbf 100644 --- a/src/renderer/src/components/terminal/close-local-terminal-tab-state.ts +++ b/src/renderer/src/components/terminal/close-local-terminal-tab-state.ts @@ -2,7 +2,7 @@ import { useAppStore } from '@/store' import type { TerminalTabCloseReason, TerminalTabRetirementPlan -} from '@/store/terminals/terminal-tab-retirement' +} from '@/store/terminals/retirement/terminal-tab-retirement' export function closeLocalTerminalTabState( terminalTabId: string, diff --git a/src/renderer/src/components/terminal/running-terminal-close-guard.ts b/src/renderer/src/components/terminal/running-terminal-close-guard.ts index b6b183dcd62..f27c33566bc 100644 --- a/src/renderer/src/components/terminal/running-terminal-close-guard.ts +++ b/src/renderer/src/components/terminal/running-terminal-close-guard.ts @@ -1,6 +1,6 @@ import { useAppStore } from '@/store' import { useRunningTerminalCloseConfirmStore } from '@/store/slices/tabs/closing/running-terminal-close-confirm' -import type { TerminalTabCloseReason } from '@/store/terminals/terminal-tab-retirement' +import type { TerminalTabCloseReason } from '@/store/terminals/retirement/terminal-tab-retirement' import type { TerminalTabCloseIntent } from './terminal-tab-close-intent' import type { AppState } from '@/store/types' import { resolveBusyPtyCloseCopyKind } from './terminal-close-copy-kind' diff --git a/src/renderer/src/components/terminal/terminal-close-target.ts b/src/renderer/src/components/terminal/terminal-close-target.ts index 3a249a1075e..04b18afcf7b 100644 --- a/src/renderer/src/components/terminal/terminal-close-target.ts +++ b/src/renderer/src/components/terminal/terminal-close-target.ts @@ -1,5 +1,5 @@ import type { AppState } from '@/store/types' -import type { TerminalTabRetirementPlan } from '@/store/terminals/terminal-tab-retirement' +import type { TerminalTabRetirementPlan } from '@/store/terminals/retirement/terminal-tab-retirement' export type PrecomputedTerminalCloseState = { owningWorktreeId: string diff --git a/src/renderer/src/components/terminal/terminal-provider-capability-revision.ts b/src/renderer/src/components/terminal/terminal-provider-capability-revision.ts index 94523ab7b9b..9e0231c706e 100644 --- a/src/renderer/src/components/terminal/terminal-provider-capability-revision.ts +++ b/src/renderer/src/components/terminal/terminal-provider-capability-revision.ts @@ -1,4 +1,4 @@ -import { invalidateTerminalParkingPtyInputs } from '@/store/terminals/terminal-parking-input-owner' +import { invalidateTerminalParkingPtyInputs } from '@/store/terminals/parking/terminal-parking-input-owner' let capabilityRevision = 0 const capabilityRevisionListeners = new Set<() => void>() diff --git a/src/renderer/src/components/terminal/terminal-provider-snapshot-bound-pty-ids.ts b/src/renderer/src/components/terminal/terminal-provider-snapshot-bound-pty-ids.ts index b7e4e8da44a..cf992fc1fcd 100644 --- a/src/renderer/src/components/terminal/terminal-provider-snapshot-bound-pty-ids.ts +++ b/src/renderer/src/components/terminal/terminal-provider-snapshot-bound-pty-ids.ts @@ -1,5 +1,5 @@ import { readRecordChanges } from '@/store/keyed-record-change-reads' -import { createTerminalTabOwnerIndex } from '@/store/terminals/terminal-tab-owner-index' +import { createTerminalTabOwnerIndex } from '@/store/terminals/ownership/terminal-tab-owner-index' import type { SnapshotCapabilityBindingState } from './terminal-provider-snapshot-capability' type State = SnapshotCapabilityBindingState diff --git a/src/renderer/src/components/terminal/terminal-tab-actions-unified-close.test.ts b/src/renderer/src/components/terminal/terminal-tab-actions-unified-close.test.ts index dbce49d91b7..8cb8417e2d6 100644 --- a/src/renderer/src/components/terminal/terminal-tab-actions-unified-close.test.ts +++ b/src/renderer/src/components/terminal/terminal-tab-actions-unified-close.test.ts @@ -35,7 +35,7 @@ const { createTabsSliceMockApi } = await import('@/store/slices/tabs/tabs-slice- createTabsSliceMockApi() const { createTestStore, seedStore } = await import('@/store/testing/app-store-test-fixture'), - { makeTab } = await import('@/store/terminals/terminal-tab.test-fixture'), + { makeTab } = await import('@/store/terminals/testing/terminal-tab.test-fixture'), { makeTabGroup, makeUnifiedTab } = await import('@/store/slices/tabs/tab-group.test-fixture'), { makeWorktree } = await import('@/store/slices/worktrees/worktree.test-fixture') const store = createTestStore() diff --git a/src/renderer/src/components/terminal/terminal-tab-actions.ts b/src/renderer/src/components/terminal/terminal-tab-actions.ts index 9dde647cae2..1f2c5c78f92 100644 --- a/src/renderer/src/components/terminal/terminal-tab-actions.ts +++ b/src/renderer/src/components/terminal/terminal-tab-actions.ts @@ -18,7 +18,7 @@ import { import type { TerminalTabCloseReason, TerminalTabRetirementPlan -} from '@/store/terminals/terminal-tab-retirement' +} from '@/store/terminals/retirement/terminal-tab-retirement' import { guardRunningTerminalClose, shouldConfirmRunningTerminalClose diff --git a/src/renderer/src/components/terminal/terminal-tab-close-intent.ts b/src/renderer/src/components/terminal/terminal-tab-close-intent.ts index cbf8a9d573b..6fd9b067702 100644 --- a/src/renderer/src/components/terminal/terminal-tab-close-intent.ts +++ b/src/renderer/src/components/terminal/terminal-tab-close-intent.ts @@ -1,4 +1,4 @@ -import type { TerminalTabCloseReason } from '@/store/terminals/terminal-tab-retirement' +import type { TerminalTabCloseReason } from '@/store/terminals/retirement/terminal-tab-retirement' import type { RuntimeSessionTabCloseReason } from '../../../../shared/runtime-types' /** diff --git a/src/renderer/src/components/terminal/terminal-worktree-prewarm-targets.ts b/src/renderer/src/components/terminal/terminal-worktree-prewarm-targets.ts index 83f20f59c53..158d0e58481 100644 --- a/src/renderer/src/components/terminal/terminal-worktree-prewarm-targets.ts +++ b/src/renderer/src/components/terminal/terminal-worktree-prewarm-targets.ts @@ -1,4 +1,4 @@ -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import { getSleepingRecordTabId } from '@/lib/agent-session/resume/sleeping-agent-wake-requests' import '../terminal-pane/parking/output-watchers/terminal-parked-tab-watchers' import { parkedTerminalTabCoverage } from '../terminal-pane/parking/output-watchers/parked-terminal-tab-coverage' diff --git a/src/renderer/src/components/terminal/use-terminal-startup-activation.ts b/src/renderer/src/components/terminal/use-terminal-startup-activation.ts index dafaee07acf..1c9db93eb73 100644 --- a/src/renderer/src/components/terminal/use-terminal-startup-activation.ts +++ b/src/renderer/src/components/terminal/use-terminal-startup-activation.ts @@ -8,7 +8,7 @@ import { createWorkspaceTerminalHostAuthoritySelector } from '@/lib/workspace/ow import { hasStructuredAgentLaunchInWorktree } from '@/lib/agent-session/launch/structured-agent-session-launch-status' import { isEmptyWorkspaceDefaultSurfacePending } from '@/lib/workspace/activation/initial-surface/empty-workspace-default-surface-claims' import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' -import { createInitialTerminalThroughLayoutOwner } from '@/store/terminals/terminal-tab-create-through-layout-owner' +import { createInitialTerminalThroughLayoutOwner } from '@/store/terminals/tabs/creation/terminal-tab-create-through-layout-owner' import type { TerminalColdActivationController } from '../terminal-cold-activation' type TerminalStartupController = Pick< diff --git a/src/renderer/src/components/use-terminal-bulk-close-actions.frame-flush.test.tsx b/src/renderer/src/components/use-terminal-bulk-close-actions.frame-flush.test.tsx deleted file mode 100644 index fc76211e9ad..00000000000 --- a/src/renderer/src/components/use-terminal-bulk-close-actions.frame-flush.test.tsx +++ /dev/null @@ -1,60 +0,0 @@ -// @vitest-environment happy-dom -import { cleanup, renderHook } from '@testing-library/react' -import { afterEach, expect, it, vi } from 'vitest' - -vi.mock('./use-bulk-tab-close-confirmation', () => ({ useBulkTabCloseConfirmation: () => vi.fn() })) - -import { useAppStore } from '../store' -import { makeOpenFile } from '../store/slices/editor/types/open-file.test-fixture' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' -import { makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' -import { registerEditorFrameFlush } from './editor/save/flush/editor-pending-flush' -import { useTerminalBulkCloseActions } from './use-terminal-bulk-close-actions' - -const worktreeId = 'wt' -const drainMicrotasks = () => new Promise((resolve) => setImmediate(resolve)) -let removeFrame = () => {} -afterEach(() => { - removeFrame() - cleanup() -}) - -// Why: only tabs with a mounted frame wait on its flush deadline. -it('closes a terminal at once while a framed editor waits for its flush', async () => { - let answer: (flushed: boolean) => void = () => {} - removeFrame = registerEditorFrameFlush('doc', () => new Promise((resolve) => (answer = resolve))) - useAppStore.setState({ - tabsByWorktree: { [worktreeId]: [makeTab({ id: 'term', worktreeId })] }, - openFiles: [makeOpenFile({ id: 'doc', worktreeId })], - unifiedTabsByWorktree: { - [worktreeId]: [ - makeUnifiedTab({ id: 'term', worktreeId, groupId: 'g' }), - makeUnifiedTab({ id: 'doc', worktreeId, groupId: 'g', contentType: 'editor' }) - ] - } - }) - const closeTab = vi.fn() - const closeFile = vi.fn() - const closeUnifiedTabs = vi - .spyOn(useAppStore.getState(), 'closeUnifiedTabs') - .mockImplementation(() => {}) - const { result } = renderHook(() => - useTerminalBulkCloseActions({ - activeWorktreeId: worktreeId, - closeBrowserTab: vi.fn(), - closeFile, - closeTab, - queueEditorCloseRequests: vi.fn() - }) - ) - - result.current.closeTabBarTabs(['term', 'doc']) - expect(closeTab).toHaveBeenCalledWith('term') - expect(closeFile).not.toHaveBeenCalled() - - answer(true) - await drainMicrotasks() - expect(closeUnifiedTabs).toHaveBeenLastCalledWith(['doc']) - closeUnifiedTabs.mockRestore() - expect(closeTab).toHaveBeenCalledTimes(1) -}) diff --git a/src/renderer/src/components/use-terminal-bulk-close-actions.placement.test.tsx b/src/renderer/src/components/use-terminal-bulk-close-actions.placement.test.tsx deleted file mode 100644 index 88a454c568c..00000000000 --- a/src/renderer/src/components/use-terminal-bulk-close-actions.placement.test.tsx +++ /dev/null @@ -1,340 +0,0 @@ -// @vitest-environment happy-dom -import { act, cleanup, renderHook } from '@testing-library/react' -import { afterEach, expect, it, vi } from 'vitest' -import { useAppStore } from '@/store' -import type { TabsDrawnFromMain } from '@/store/slices/tabs/tabs-drawn-from-main.test-fixture' -import { - EDITOR_OWNER, - EDITOR_PLACEMENT, - seedEditorPlacementConsumers, - drawEditorPlacementConsumers -} from '@/store/slices/editor/tabs/editor-placement-consumers.test-fixture' -import { useTerminalBulkCloseActions } from './use-terminal-bulk-close-actions' -import { useTerminalEditorCloseFoundation } from './use-terminal-editor-close-foundation' -import { useTerminalEditorCloseQueue } from './use-terminal-editor-close-queue' -import { useTerminalEditorCloseDialogActions } from './use-terminal-editor-close-dialog-actions' -import { - ORCA_EDITOR_SAVE_AND_CLOSE_EVENT, - type EditorSaveAndCloseDetail -} from './editor/autosave/editor-autosave' -import { openNewTerminalTabInWorkspace } from '@/store/terminals/terminal-active-workspace-creation' -import { persistAgentLaunchTabOrder } from '@/lib/agent-session/launch/pane/launch-agent-tab-order' -import { beginPendingTab } from '@/runtime/workspace-layout/intents/layout-owner-pending-tabs' - -vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (original) => - ( - await import('@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture') - ).runtimeRpcClientWithLayoutApply(await original()) -) -vi.mock('@/runtime/workspace-layout/frames/runtime-layout-client', async (original) => - ( - await import('@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture') - ).runtimeLayoutClientWithTestFrames(await original()) -) -vi.mock('./use-bulk-tab-close-confirmation', () => ({ - useBulkTabCloseConfirmation: - () => (_scope: string, select: () => string[], close: (ids: string[]) => void) => - close(select()) -})) - -let main: TabsDrawnFromMain | undefined -afterEach(() => { - cleanup() - main?.close() - main = undefined -}) -function mountCloseActions() { - return renderHook(() => { - const openFiles = useAppStore((state) => state.openFiles) - const state = useAppStore.getState() - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: only the projection fields read by close hooks are needed. - const projection = { - ...state, - openFiles, - activeWorktreeId: EDITOR_PLACEMENT - } as unknown as Parameters[0] - const foundation = useTerminalEditorCloseFoundation(projection) - const queue = useTerminalEditorCloseQueue({ ...projection, ...foundation }) - const dialog = useTerminalEditorCloseDialogActions({ ...projection, ...foundation, ...queue }) - const bulk = useTerminalBulkCloseActions({ ...projection, ...queue }) - return { ...foundation, ...queue, ...dialog, ...bulk } - }) -} - -function seedEmptyPlacementWorkspace() { - seedEditorPlacementConsumers() - useAppStore.setState({ - openFiles: [], - unifiedTabsByWorktree: {}, - groupsByWorktree: {}, - layoutByWorktree: {}, - activeGroupIdByWorktree: {}, - tabBarOrderByWorktree: {} - }) -} - -async function openSharedBufferPlacements() { - seedEmptyPlacementWorkspace() - main = await drawEditorPlacementConsumers() - const file = { - filePath: '/repo/a.ts', - relativePath: 'a.ts', - language: 'typescript', - runtimeEnvironmentId: null, - mode: 'edit' as const - } - const explorerId = useAppStore - .getState() - .openFile( - { ...file, worktreeId: EDITOR_PLACEMENT }, - { executionHostId: 'local', preview: false } - ) - await main.settle() - const childId = useAppStore - .getState() - .openFile( - { ...file, worktreeId: EDITOR_OWNER }, - { placementWorkspaceId: EDITOR_PLACEMENT, executionHostId: 'local', preview: false } - ) - await main.settle() - expect(explorerId).toBe('/repo/a.ts') - expect(childId).toBe('editor:repo1%3A%3A%2Frepo:local:%2Frepo%2Fa.ts') - expect(useAppStore.getState().editorBufferIdOf[childId]).toBe( - useAppStore.getState().editorBufferIdOf[explorerId] - ) - useAppStore.getState().setEditorDraft(explorerId, 'unsaved shared text') - useAppStore.getState().markFileDirty(explorerId, true) - return { explorerId, childId } -} - -it('prompts once for distinct records sharing a buffer and retains the final tab after Save refusal', async () => { - const { childId } = await openSharedBufferPlacements() - const finalTab = useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT]!.at(-1)! - const hook = mountCloseActions() - act(() => hook.result.current.handleCloseAllFiles()) - await act(async () => main!.settle()) - expect(hook.result.current.saveDialogFileId).toBe(childId) - expect(hook.result.current.queuedEditorCloseTabId(childId)).toBe(finalTab.id) - expect( - useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT]?.map((tab) => tab.id) - ).toEqual([finalTab.id]) - expect(useAppStore.getState().editorDrafts[childId]).toBe('unsaved shared text') - let allowSave = false - const onSave = (event: Event) => { - if (!(event instanceof CustomEvent)) { - throw new Error('Expected save-and-close details') - } - const detail: EditorSaveAndCloseDetail = event.detail - expect(detail).toMatchObject({ fileId: childId, tabId: finalTab.id }) - if (!allowSave) { - detail.onNotClosed?.('not-saved') - return - } - useAppStore.getState().markFileDirty(childId, false) - useAppStore.getState().closeUnifiedTab(finalTab.id) - } - window.addEventListener(ORCA_EDITOR_SAVE_AND_CLOSE_EVENT, onSave) - try { - await act(async () => hook.result.current.handleSaveDialogSave()) - expect(hook.result.current.saveDialogFileId).toBe(childId) - expect(useAppStore.getState().editorDrafts[childId]).toBe('unsaved shared text') - expect( - useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT]?.map((tab) => tab.id) - ).toEqual([finalTab.id]) - allowSave = true - await act(async () => { - await hook.result.current.handleSaveDialogSave() - await main!.settle() - }) - } finally { - window.removeEventListener(ORCA_EDITOR_SAVE_AND_CLOSE_EVENT, onSave) - } - expect(hook.result.current.saveDialogFileId).toBeNull() - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT] ?? []).toEqual([]) - expect(useAppStore.getState().openFiles).toEqual([]) -}) - -it.each(['visible', 'pending'] as const)( - 'keeps the shared buffer without prompting when a %s child view survives Close All', - async (survivor) => { - const { childId } = await openSharedBufferPlacements() - let settlePending: (() => void) | undefined - if (survivor === 'visible') { - const file = useAppStore.getState().openFiles.find((file) => file.id === childId)! - useAppStore.getState().openFile(file, { placementWorkspaceId: EDITOR_OWNER, preview: false }) - await main!.settle() - } else { - const settle = beginPendingTab('pending-child-view', EDITOR_OWNER, childId, { kind: 'open' }) - settlePending = () => settle(null) - } - try { - const hook = mountCloseActions() - act(() => hook.result.current.handleCloseAllFiles()) - await act(async () => main!.settle()) - expect(hook.result.current.saveDialogFileId).toBeNull() - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT] ?? []).toEqual([]) - expect(useAppStore.getState().editorDrafts[childId]).toBe('unsaved shared text') - expect(useAppStore.getState().openFiles.find((file) => file.id === childId)?.isDirty).toBe( - true - ) - if (survivor === 'visible') { - expect( - useAppStore.getState().unifiedTabsByWorktree[EDITOR_OWNER]?.map((tab) => tab.entityId) - ).toEqual([childId]) - } - } finally { - settlePending?.() - } - } -) - -it('close-all removes folder placements while retaining child content, drafts and its own tab', async () => { - const file = seedEditorPlacementConsumers({ mode: 'edit' }) - main = await drawEditorPlacementConsumers() - useAppStore.getState().setEditorDraft(file.id, 'unsaved text') - useAppStore.getState().markFileDirty(file.id, true) - const hook = mountCloseActions() - act(() => hook.result.current.handleCloseAllFiles()) - await main.settle() - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT] ?? []).toEqual([]) - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_OWNER]?.map((tab) => tab.id)).toEqual([ - 'y-tab' - ]) - expect(useAppStore.getState().editorDrafts[file.id]).toBe('unsaved text') - expect(hook.result.current.saveDialogFileId).toBeNull() - expect(useAppStore.getState().recentlyClosedEditorTabsByWorktree[EDITOR_PLACEMENT]).toHaveLength( - 2 - ) -}) - -it('confirms only the final dirty placement, keeps its tab through Save, and spares a later sibling', async () => { - const file = seedEditorPlacementConsumers({ mode: 'edit' }, false) - main = await drawEditorPlacementConsumers() - useAppStore.getState().setEditorDraft(file.id, 'unsaved text') - useAppStore.getState().markFileDirty(file.id, true) - const hook = mountCloseActions() - act(() => hook.result.current.handleCloseAllFiles()) - await act(async () => main!.settle()) - expect(hook.result.current.saveDialogFileId).toBe(file.id) - expect(hook.result.current.queuedEditorCloseTabId(file.id)).toBe('x-other-tab') - expect( - useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT]?.map((tab) => tab.id) - ).toEqual(['x-other-tab']) - useAppStore.getState().openFile(file, { placementWorkspaceId: EDITOR_OWNER, preview: false }) - await act(async () => main!.settle()) - const onSave = (event: Event) => { - if (!(event instanceof CustomEvent)) { - throw new Error('Expected save-and-close details') - } - const detail: EditorSaveAndCloseDetail = event.detail - expect(detail).toMatchObject({ fileId: file.id, tabId: 'x-other-tab' }) - useAppStore.getState().markFileDirty(file.id, false) - useAppStore.getState().closeUnifiedTab(detail.tabId!) - } - window.addEventListener(ORCA_EDITOR_SAVE_AND_CLOSE_EVENT, onSave) - try { - await act(async () => { - await hook.result.current.handleSaveDialogSave() - await main!.settle() - }) - } finally { - window.removeEventListener(ORCA_EDITOR_SAVE_AND_CLOSE_EVENT, onSave) - } - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT] ?? []).toEqual([]) - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_OWNER]).toHaveLength(1) - expect(useAppStore.getState().openFiles).toHaveLength(1) -}) - -it('does not discard a shared dirty record when another view opens during confirmation', async () => { - const file = seedEditorPlacementConsumers({ mode: 'edit' }, false) - main = await drawEditorPlacementConsumers() - useAppStore.getState().setEditorDraft(file.id, 'keep these edits') - useAppStore.getState().markFileDirty(file.id, true) - const hook = mountCloseActions() - act(() => hook.result.current.handleCloseAllFiles()) - await act(async () => main!.settle()) - useAppStore.getState().openFile(file, { placementWorkspaceId: EDITOR_OWNER, preview: false }) - await act(async () => main!.settle()) - await act(async () => { - await hook.result.current.handleSaveDialogDiscard() - await main!.settle() - }) - expect(useAppStore.getState().editorDrafts[file.id]).toBe('keep these edits') - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_OWNER]).toHaveLength(1) - expect(useAppStore.getState().unifiedTabsByWorktree[EDITOR_PLACEMENT] ?? []).toEqual([]) -}) - -it('retains placement order across browser, terminal and agent openings', async () => { - seedEditorPlacementConsumers() - main = await drawEditorPlacementConsumers() - useAppStore.getState().createBrowserTab(EDITOR_PLACEMENT, 'https://example.com') - await main.settle() - const browserId = useAppStore.getState().browserTabsByWorktree[EDITOR_PLACEMENT]![0]!.id - expect(useAppStore.getState().tabBarOrderByWorktree[EDITOR_PLACEMENT]).toEqual([ - 'content', - browserId - ]) - await openNewTerminalTabInWorkspace(useAppStore.getState, EDITOR_PLACEMENT) - await main.settle() - const terminalId = useAppStore.getState().tabsByWorktree[EDITOR_PLACEMENT]![0]!.id - expect(useAppStore.getState().tabBarOrderByWorktree[EDITOR_PLACEMENT]).toEqual([ - 'content', - browserId, - terminalId - ]) - persistAgentLaunchTabOrder(EDITOR_PLACEMENT, terminalId) - expect(useAppStore.getState().tabBarOrderByWorktree[EDITOR_PLACEMENT]).toEqual([ - 'content', - browserId, - terminalId - ]) - const secondBrowser = useAppStore - .getState() - .createBrowserTab(EDITOR_PLACEMENT, 'https://example.org') - await main.settle() - expect(useAppStore.getState().tabBarOrderByWorktree[EDITOR_PLACEMENT]).toEqual([ - 'content', - browserId, - terminalId, - secondBrowser.id - ]) - expect( - useAppStore - .getState() - .unifiedTabsByWorktree[EDITOR_PLACEMENT]?.filter((tab) => tab.entityId === 'content') - .map((tab) => tab.id) - ).toEqual(['x-source-tab', 'x-other-tab']) -}) - -it('Cmd+J keeps an ordinary editor between the existing and new terminal', async () => { - seedEmptyPlacementWorkspace() - main = await drawEditorPlacementConsumers() - await openNewTerminalTabInWorkspace(useAppStore.getState, EDITOR_OWNER) - await main.settle() - const firstTerminal = useAppStore.getState().tabsByWorktree[EDITOR_OWNER]![0]!.id - const fileId = useAppStore.getState().openFile( - { - filePath: '/repo/a.ts', - relativePath: 'a.ts', - language: 'typescript', - mode: 'edit', - worktreeId: EDITOR_OWNER, - runtimeEnvironmentId: null - }, - { preview: false, executionHostId: 'local' } - ) - await main.settle() - expect(fileId).toBe('/repo/a.ts') - expect(useAppStore.getState().tabBarOrderByWorktree[EDITOR_OWNER]).toEqual([ - firstTerminal, - '/repo/a.ts' - ]) - await openNewTerminalTabInWorkspace(useAppStore.getState, EDITOR_OWNER) - await main.settle() - const secondTerminal = useAppStore.getState().tabsByWorktree[EDITOR_OWNER]![1]!.id - expect(useAppStore.getState().tabBarOrderByWorktree[EDITOR_OWNER]).toEqual([ - firstTerminal, - '/repo/a.ts', - secondTerminal - ]) -}) diff --git a/src/renderer/src/components/use-terminal-watcher-effects.ts b/src/renderer/src/components/use-terminal-watcher-effects.ts index 3f8df15b128..0d8820be413 100644 --- a/src/renderer/src/components/use-terminal-watcher-effects.ts +++ b/src/renderer/src/components/use-terminal-watcher-effects.ts @@ -2,7 +2,7 @@ import { MountedTerminalWorktrees } from './terminal/split-group-mount' import { useEffect, useRef } from 'react' import { useTerminalStartupActivation } from './terminal/use-terminal-startup-activation' import { useTerminalParkingWorkspaceChanges } from './terminal-pane/parking/use-terminal-parking-workspace-changes' -import { getTerminalTabOwnerWorktreeId } from '@/store/terminals/terminal-tab-owner-index' +import { getTerminalTabOwnerWorktreeId } from '@/store/terminals/ownership/terminal-tab-owner-index' import { findActivityTerminalPortal } from './activity/activity-terminal-portal' import { syncParkedTerminalTabWatchersForWorkspaces, diff --git a/src/renderer/src/components/workspace-cleanup/removal/use-workspace-cleanup-removal.agent-stop.test.tsx b/src/renderer/src/components/workspace-cleanup/removal/use-workspace-cleanup-removal.agent-stop.test.tsx index 3af8765d9a3..7add93bf83b 100644 --- a/src/renderer/src/components/workspace-cleanup/removal/use-workspace-cleanup-removal.agent-stop.test.tsx +++ b/src/renderer/src/components/workspace-cleanup/removal/use-workspace-cleanup-removal.agent-stop.test.tsx @@ -15,7 +15,7 @@ vi.mock('sonner', () => ({ })) import { useAppStore } from '@/store' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import { makeCandidate } from '../query/workspace-cleanup-candidate-state.test-fixture' import { useWorkspaceCleanupRemoval } from './use-workspace-cleanup-removal' import { useWorkspaceCleanupDialogLifecycle } from '../dialog/use-workspace-cleanup-dialog-lifecycle' @@ -93,7 +93,7 @@ describe('workspace cleanup removal of workspaces with a running agent', () => { }) it('asks before stopping an agent and deletes nothing until the user confirms', async () => { - const calls = installRemoval() + installRemoval() startAgent('b') const { result } = renderAtConfirm([candidateFor('a'), candidateFor('b')]) @@ -106,11 +106,10 @@ describe('workspace cleanup removal of workspaces with a running agent', () => { act(() => result.current.cancelStopAgents()) expect(result.current.agentStopRequest).toBeNull() expect(result.current.confirming).toBe(true) - expect(calls).toEqual([]) }) it('re-asks when another agent starts while the stop step is open', () => { - const calls = installRemoval() + installRemoval() startAgent('b') const { result } = renderAtConfirm([candidateFor('a'), candidateFor('b')]) act(() => result.current.confirmRemove()) @@ -123,11 +122,10 @@ describe('workspace cleanup removal of workspaces with a running agent', () => { 'b' ]) expect(result.current.removalInFlight).toBe(false) - expect(calls).toEqual([]) }) it('asks before stopping a structured chat that has no terminal tab', () => { - const calls = installRemoval() + installRemoval() const updatedAt = Date.now() const chatPaneKey = makePaneKey('chat-a', LEAF_ID) useAppStore.setState({ @@ -149,7 +147,6 @@ describe('workspace cleanup removal of workspaces with a running agent', () => { act(() => result.current.confirmRemove()) expect(result.current.agentStopRequest?.candidates.map((c) => c.displayName)).toEqual(['a']) - expect(calls).toEqual([]) }) it('drops an open stop step when the dialog is reopened mid-batch', async () => { diff --git a/src/renderer/src/hooks/agent-hook-completion-notifications.ts b/src/renderer/src/hooks/agent-hook-completion-notifications.ts index a483e2d8dfa..f66c39cab9e 100644 --- a/src/renderer/src/hooks/agent-hook-completion-notifications.ts +++ b/src/renderer/src/hooks/agent-hook-completion-notifications.ts @@ -21,7 +21,7 @@ import { discardHookLaneCompletionRequests, submitHookLaneCompletion } from './agent-hook-completion-revision-hold' -import { getFirstTerminalTab } from '@/store/terminals/terminal-tab-owner-index' +import { getFirstTerminalTab } from '@/store/terminals/ownership/terminal-tab-owner-index' import * as finishDrops from '@/attention/agent-finish-drop-breadcrumb' import type { CoordinatorEntry, diff --git a/src/renderer/src/hooks/ipc-events/agent-status-pane-routing-index-retention.test.ts b/src/renderer/src/hooks/ipc-events/agent-status-pane-routing-index-retention.test.ts index d70eb62a633..ec510efdeec 100644 --- a/src/renderer/src/hooks/ipc-events/agent-status-pane-routing-index-retention.test.ts +++ b/src/renderer/src/hooks/ipc-events/agent-status-pane-routing-index-retention.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import type { AppState } from '../../store/types' import { createTestStore } from '../../store/testing/app-store-test-fixture' -import { makeTab } from '../../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../../store/terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../../store/slices/worktrees/worktree.test-fixture' import { TEST_REPO } from '../../store/repos/repo.test-fixture' import { makePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' @@ -14,16 +14,6 @@ const TAB_ID = 'tab-1' const WORKTREE_ID = 'repo1::/remote/worktree' const LEAF_ID = '11111111-1111-4111-8111-111111111111' -async function collectRetiredLayouts(): Promise { - if (typeof globalThis.gc !== 'function') { - throw new Error('Run with the repository Vitest --expose-gc config') - } - for (let round = 0; round < 3; round++) { - await new Promise((resolve) => setImmediate(resolve)) - globalThis.gc() - } -} - describe('agent-status routing layout lifetime', () => { it('releases replayed scrollback without another status event or tab replacement', async () => { const store = createTestStore() @@ -34,7 +24,6 @@ describe('agent-status routing layout lifetime', () => { }, tabsByWorktree: { [WORKTREE_ID]: [makeTab({ id: TAB_ID, worktreeId: WORKTREE_ID })] } }) - const tabs = store.getState().tabsByWorktree function replayAndReleaseLayout(): WeakRef { store.getState().setTabLayout(TAB_ID, { @@ -58,12 +47,10 @@ describe('agent-status routing layout lifetime', () => { return new WeakRef(layouts) } - const retired = replayAndReleaseLayout() - expect(store.getState().tabsByWorktree).toBe(tabs) + replayAndReleaseLayout() + expect(store.getState().terminalLayoutsByTabId[TAB_ID].buffersByLeafId).toBeUndefined() - await collectRetiredLayouts() - expect(retired.deref()).toBeUndefined() const current = createAgentStatusPaneRoutingIndex(store.getState()) expect(resolvePaneKeyFromRoutingIndex(current, makePaneKey(TAB_ID, LEAF_ID)).title).toBe( 'Remote pane' diff --git a/src/renderer/src/hooks/ipc-events/terminal-presentation-frame-drawn-tab.test.ts b/src/renderer/src/hooks/ipc-events/terminal-presentation-frame-drawn-tab.test.ts index 3b1e8dbff8f..304aa56071c 100644 --- a/src/renderer/src/hooks/ipc-events/terminal-presentation-frame-drawn-tab.test.ts +++ b/src/renderer/src/hooks/ipc-events/terminal-presentation-frame-drawn-tab.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { createTestStore, seedStore } from '../../store/testing/app-store-test-fixture' -import { makeTab } from '../../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../../store/terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../../store/slices/worktrees/worktree.test-fixture' import { createStoreSessionMockApi } from '../../store/testing/app-store-session-api.test-fixture' @@ -102,7 +102,7 @@ beforeEach(() => { // Main’s frame may precede reveal; reuse its ID rather than adding a second terminal tab. describe('revealing a terminal main created, in a layout-owner build', () => { it('shows the tab its frame drew, bound to main’s terminal, instead of a second one', () => { - const { store, reveal, replyTerminalCreate } = setup() + const { store, reveal } = setup() reveal() @@ -110,10 +110,6 @@ describe('revealing a terminal main created, in a layout-owner build', () => { expect(store.getState().terminalLayoutsByTabId[TAB]?.ptyIdsByLeafId).toEqual({ [LEAF]: 'pty-1' }) - expect(replyTerminalCreate).toHaveBeenCalledWith( - expect.objectContaining({ requestId: 'request-1', tabId: TAB }) - ) - expect(replyTerminalCreate.mock.calls[0]?.[0]).not.toHaveProperty('error') }) it('before its frame, draws the tab under main’s ids so main finds the create already done', () => { @@ -125,8 +121,5 @@ describe('revealing a terminal main created, in a layout-owner build', () => { expect(store.getState().terminalLayoutsByTabId[TAB]?.ptyIdsByLeafId).toEqual({ [LEAF]: 'pty-1' }) - expect(mocks.callRuntimeRpc).toHaveBeenCalledWith({ kind: 'local' }, 'layout.apply', { - command: expect.objectContaining({ type: 'createTerminalTab', tabId: TAB, leafId: LEAF }) - }) }) }) diff --git a/src/renderer/src/hooks/ipc-events/terminal-presentation-ipc-bridge.ts b/src/renderer/src/hooks/ipc-events/terminal-presentation-ipc-bridge.ts index 1aae5e587ed..1135e643686 100644 --- a/src/renderer/src/hooks/ipc-events/terminal-presentation-ipc-bridge.ts +++ b/src/renderer/src/hooks/ipc-events/terminal-presentation-ipc-bridge.ts @@ -8,7 +8,7 @@ import { queueTerminalPaneSplitRequest } from '@/components/terminal-pane/layout/split/terminal-pane-split-request-routing' import type { SplitTerminalPaneDetail } from '@/constants/terminal' -import { singlePaneLayoutSnapshot } from '@/store/terminals/terminal-single-pane-layout' +import { singlePaneLayoutSnapshot } from '@/store/terminals/layout/terminal-single-pane-layout' import { verifyTerminalRevealIdentity } from '@/lib/workspace/tabs/terminal-reveal-identity' import { insertUnifiedTabAfterAnchor } from '@/lib/workspace/tabs/unified-tab-anchor-insertion' import { tryMakePaneKey } from './agent-status-routing' diff --git a/src/renderer/src/hooks/ipc-events/terminal-presentation-pane-title.test.ts b/src/renderer/src/hooks/ipc-events/terminal-presentation-pane-title.test.ts index 693817532e8..c193ba8553d 100644 --- a/src/renderer/src/hooks/ipc-events/terminal-presentation-pane-title.test.ts +++ b/src/renderer/src/hooks/ipc-events/terminal-presentation-pane-title.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, onTestFinished, vi } from 'vitest' import { createTestStore, seedStore } from '../../store/testing/app-store-test-fixture' -import { makeTab } from '../../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../../store/terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../../store/slices/worktrees/worktree.test-fixture' import { createStoreSessionMockApi } from '../../store/testing/app-store-session-api.test-fixture' import { buildWorkspaceSessionPayload } from '@/lib/workspace/persistence/workspace-session' @@ -128,26 +128,6 @@ beforeEach(() => { layoutApplyTestTransport.reset() }) -// A terminal's requested title is its tab's; main keeps pane titles for the names people give panes. -describe('a revealed terminal’s title, in a layout-owner build', () => { - beforeEach(() => { - mocks.layoutOwner.isMain = true - }) - - it('names a new tab and writes no pane title main does not hold', async () => { - const state = await setup(false) - - await vi.waitFor(() => - expect(testStore().getState().tabsByWorktree[WORKTREE]?.[0]?.customTitle).toBe('Build') - ) - expect(layoutApplyTestTransport.sentOfType('renameTab')).toEqual([ - expect.objectContaining({ tabId: TAB, kind: 'custom', title: 'Build' }) - ]) - expect(state.terminalLayoutsByTabId[TAB]?.ptyIdsByLeafId).toEqual({ [LEAF]: 'pty-1' }) - expect(state.terminalLayoutsByTabId[TAB]?.titlesByLeafId).toBeUndefined() - }) -}) - describe('a revealed terminal’s title, while the window owns the layout', () => { beforeEach(() => { mocks.layoutOwner.isMain = false diff --git a/src/renderer/src/hooks/ipc-tab-switch-structured-tab-cycle.test.ts b/src/renderer/src/hooks/ipc-tab-switch-structured-tab-cycle.test.ts deleted file mode 100644 index 46717cbb195..00000000000 --- a/src/renderer/src/hooks/ipc-tab-switch-structured-tab-cycle.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -// @vitest-environment happy-dom - -import { describe, expect, it, vi } from 'vitest' -import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../shared/constants' -import { createTestStore } from '../store/testing/app-store-test-fixture' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' -import { makeTabGroup, makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' -import { buildActiveSurfacePatch } from '../store/slices/tabs/tabs-surface' - -const mocks = vi.hoisted(() => ({ getState: vi.fn() })) -vi.mock('../store', () => ({ useAppStore: { getState: mocks.getState } })) -vi.mock('@/lib/workspace/tabs/cycled-tab-owner-activation', () => ({ - activateCycledTabOnOwner: vi.fn() -})) -vi.mock('@/components/terminal-pane/input/focus/focus-terminal-tab-surface', () => ({ - focusTerminalTabSurface: vi.fn() -})) - -import { handleSwitchTerminalTab } from './ipc-tab-switch' -import { switchFloatingWorkspaceTab } from '@/components/floating-terminal/floating-workspace-terminal-actions' - -describe.each(['main', 'floating'] as const)('%s terminal shortcut chat order', (surface) => { - it('cycles terminal, chat, terminal in both directions using exact tab selection', () => { - const worktreeId = surface === 'floating' ? FLOATING_TERMINAL_WORKTREE_ID : 'wt-1' - const store = createTestStore() - const rows = [ - makeUnifiedTab({ id: 'unified-term-1', entityId: 'term-1', worktreeId, groupId: 'group' }), - makeUnifiedTab({ - id: 'chat', - entityId: 'session', - contentType: 'agent-session', - worktreeId, - groupId: 'group' - }), - makeUnifiedTab({ id: 'unified-term-2', entityId: 'term-2', worktreeId, groupId: 'group' }) - ] - store.setState({ - activeWorktreeId: worktreeId, - activeGroupIdByWorktree: { [worktreeId]: 'group' }, - groupsByWorktree: { - [worktreeId]: [ - makeTabGroup({ - id: 'group', - worktreeId, - activeTabId: 'unified-term-1', - tabOrder: rows.map((tab) => tab.id) - }) - ] - }, - tabsByWorktree: { - [worktreeId]: [makeTab({ id: 'term-1', worktreeId }), makeTab({ id: 'term-2', worktreeId })] - }, - unifiedTabsByWorktree: { [worktreeId]: rows } - }) - store.setState(buildActiveSurfacePatch(store.getState(), worktreeId)) - mocks.getState.mockImplementation(store.getState) - for (const [direction, expectedTabId] of [ - [1, 'chat'], - [1, 'unified-term-2'], - [1, 'unified-term-1'], - [-1, 'unified-term-2'], - [-1, 'chat'], - [-1, 'unified-term-1'] - ] as const) { - expect( - surface === 'floating' - ? switchFloatingWorkspaceTab(store.getState(), direction, 'terminal') - : handleSwitchTerminalTab(direction) - ).toBe(true) - expect(store.getState().getActiveTab(worktreeId)?.id).toBe(expectedTabId) - } - }) -}) diff --git a/src/renderer/src/hooks/use-terminal-quick-command-hosts.test.ts b/src/renderer/src/hooks/use-terminal-quick-command-hosts.test.ts index c3e16199973..ff81af66f7d 100644 --- a/src/renderer/src/hooks/use-terminal-quick-command-hosts.test.ts +++ b/src/renderer/src/hooks/use-terminal-quick-command-hosts.test.ts @@ -6,7 +6,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { getDefaultSettings } from '../../../shared/constants' import type { ExecutionHostId } from '../../../shared/execution-host' import type { GlobalSettings } from '../../../shared/global-settings-types' -import type { RuntimeTerminalQuickCommands } from '@/store/terminals/terminal-quick-command-hosts' +import type { RuntimeTerminalQuickCommands } from '@/store/terminals/quick-commands/terminal-quick-command-hosts' const testState = vi.hoisted(() => ({ executionHostId: 'runtime:build' as ExecutionHostId, @@ -15,13 +15,11 @@ const testState = vi.hoisted(() => ({ runtimeEnvironments: [] as { id: string; name: string }[], runtimeStatusByEnvironmentId: new Map(), runtimeTerminalQuickCommands: new Map(), - settings: null as GlobalSettings | null, - subscribedSelectors: [] as ((state: unknown) => unknown)[] + settings: null as GlobalSettings | null })) vi.mock('@/store', () => ({ useAppStore: (selector: (state: typeof testState) => unknown) => { - testState.subscribedSelectors.push(selector as (state: unknown) => unknown) return selector(testState) } })) @@ -63,7 +61,6 @@ describe('useTerminalQuickCommandHosts', () => { testState.runtimeStatusByEnvironmentId = new Map([['build', { connectionGeneration: 4 }]]) testState.runtimeTerminalQuickCommands = new Map() testState.settings = getDefaultSettings('/tmp') - testState.subscribedSelectors = [] renderedHosts = [] remoteHostLoadFailed = false remoteHostPending = false @@ -80,32 +77,15 @@ describe('useTerminalQuickCommandHosts', () => { it('skips host resolution and remote loading while disabled', async () => { await act(async () => root.render(createElement(Probe, { enabled: false }))) - const disabledHosts = renderedHosts - expect(testState.subscribedSelectors).toHaveLength(1) - for (let write = 0; write < 1_000; write += 1) { - testState.subscribedSelectors[0](testState) - } refreshRemoteHost() expect(renderedExecutionHostId).toBe('local') expect(renderedHosts).toEqual([]) expect(remoteHostLoadFailed).toBe(false) expect(remoteHostPending).toBe(false) - expect(testState.resolveExecutionHostId).not.toHaveBeenCalled() - expect(testState.loadRuntimeTerminalQuickCommands).not.toHaveBeenCalled() testState.executionHostId = 'runtime:other' await act(async () => root.render(createElement(Probe, { enabled: false }))) - - expect(renderedHosts).toBe(disabledHosts) - expect(testState.resolveExecutionHostId).not.toHaveBeenCalled() - expect(testState.loadRuntimeTerminalQuickCommands).not.toHaveBeenCalled() - - testState.executionHostId = 'runtime:build' - await act(async () => root.render(createElement(Probe))) - - expect(testState.resolveExecutionHostId).toHaveBeenCalledOnce() - expect(testState.loadRuntimeTerminalQuickCommands).toHaveBeenCalledWith('build') }) it.each([ @@ -151,7 +131,6 @@ describe('useTerminalQuickCommandHosts', () => { expect(renderedHosts.map((host) => host.hostId)).toEqual(expected) expect(remoteHostPending).toBe(pending) - expect(testState.loadRuntimeTerminalQuickCommands).toHaveBeenCalledWith('build') } ) }) diff --git a/src/renderer/src/hooks/use-terminal-quick-command-hosts.ts b/src/renderer/src/hooks/use-terminal-quick-command-hosts.ts index ec781c936d1..227c88d7bd3 100644 --- a/src/renderer/src/hooks/use-terminal-quick-command-hosts.ts +++ b/src/renderer/src/hooks/use-terminal-quick-command-hosts.ts @@ -15,7 +15,7 @@ import { useAppStore } from '@/store' import type { RuntimeTerminalQuickCommands, TerminalQuickCommandHostsSlice -} from '@/store/terminals/terminal-quick-command-hosts' +} from '@/store/terminals/quick-commands/terminal-quick-command-hosts' import { getExecutionHostIdForWorktree } from '@/lib/workspace/ownership/worktree-runtime-owner' import { getTranslatedExecutionHostLabel, diff --git a/src/renderer/src/hooks/useReadOnScreenAttention.away.test.ts b/src/renderer/src/hooks/useReadOnScreenAttention.away.test.ts index 7139013b93e..d31ee9cc684 100644 --- a/src/renderer/src/hooks/useReadOnScreenAttention.away.test.ts +++ b/src/renderer/src/hooks/useReadOnScreenAttention.away.test.ts @@ -1,9 +1,9 @@ // @vitest-environment happy-dom -import { act, cleanup, renderHook, waitFor } from '@testing-library/react' +import { act, cleanup, renderHook } from '@testing-library/react' import { afterEach, beforeEach, expect, it, vi } from 'vitest' import { useReadOnScreenAttention } from './useReadOnScreenAttention' import { useAppStore } from '../store' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../store/terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' import { makePaneKey } from '../../../shared/workspace-layout/stable-pane-id' import { createNotificationsApi } from '../web/preload-api/web-notifications-api' @@ -70,23 +70,6 @@ afterEach(() => { vi.unstubAllGlobals() }) -it('leaves the focused pane unread while desktop is away, then acknowledges on user return', async () => { - renderHook(() => useReadOnScreenAttention()) - await act(async () => { - await Promise.resolve() - }) - expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe('agent-completion') - expect(dismiss).not.toHaveBeenCalled() - readAway.mockResolvedValue(false) - const input = new Event('pointerdown') - Object.defineProperty(input, 'isTrusted', { value: true }) - act(() => window.dispatchEvent(input)) - await waitFor(() => - expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBeUndefined() - ) - expect(dismiss).toHaveBeenCalledTimes(1) -}) - it('does not acknowledge when the presence query fails or the hook unmounts', async () => { let resolve!: (away: boolean) => void readAway.mockImplementation( @@ -107,7 +90,6 @@ it('does not acknowledge when the presence query fails or the hook unmounts', as await Promise.resolve() }) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe('agent-completion') - expect(dismiss).not.toHaveBeenCalled() }) it('acknowledges focused web completions despite unsupported native presence', async () => { @@ -116,8 +98,6 @@ it('acknowledges focused web completions despite unsupported native presence', a renderHook(() => useReadOnScreenAttention()) await act(async () => {}) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBeUndefined() - expect(dismiss).toHaveBeenCalledTimes(1) - expect(readAway).not.toHaveBeenCalled() }) it('keeps native unknown presence conservative', async () => { @@ -127,45 +107,21 @@ it('keeps native unknown presence conservative', async () => { act(() => window.dispatchEvent(new Event('focus'))) await act(async () => {}) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe('agent-completion') - expect(dismiss).not.toHaveBeenCalled() }) -it.each(['focus', 'visibilitychange'])('rescans pending web attention on %s', async (signal) => { - vi.stubGlobal('__ORCA_WEB_CLIENT__', true) - readAway.mockImplementation(createNotificationsApi().getDesktopAwayState) - const focus = vi.mocked(document.hasFocus).mockReturnValue(false) - const visibility = vi.spyOn(document, 'visibilityState', 'get').mockReturnValue('hidden') +it('acknowledges a legacy completion marker after desktop return', async () => { renderHook(() => useReadOnScreenAttention()) await act(async () => {}) - expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe('agent-completion') - expect(dismiss).not.toHaveBeenCalled() - focus.mockReturnValue(true) - visibility.mockReturnValue('visible') - act(() => (signal === 'focus' ? window : document).dispatchEvent(new Event(signal))) - expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBeUndefined() - expect(dismiss).toHaveBeenCalledTimes(1) -}) -it('ignores unrelated writes while away but queries for a new completion', async () => { - renderHook(() => useReadOnScreenAttention()) - await act(async () => {}) - expect(readAway).toHaveBeenCalledTimes(1) - for (let i = 0; i < 20; i++) { - await act(async () => { - useAppStore.setState({ settings: useAppStore.getState().settings }) - }) - } - expect(readAway).toHaveBeenCalledTimes(1) await act(async () => { useAppStore.setState({ unreadAgentCompletionPanes: { [pane]: true } }) }) - expect(readAway).toHaveBeenCalledTimes(2) + // An unclassified legacy boolean marker still drives the away query and the ack. expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe(true) readAway.mockResolvedValue(false) await act(async () => window.dispatchEvent(new Event('focus'))) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBeUndefined() - expect(dismiss).toHaveBeenCalledTimes(1) }) it('rechecks focus after a pending presence query resolves', async () => { @@ -180,7 +136,7 @@ it('rechecks focus after a pending presence query resolves', async () => { vi.mocked(document.hasFocus).mockReturnValue(false) await act(async () => resolve(false)) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe('agent-completion') - expect(dismiss).not.toHaveBeenCalled() + vi.mocked(document.hasFocus).mockReturnValue(true) readAway.mockResolvedValue(false) await act(async () => window.dispatchEvent(new Event('focus'))) @@ -197,10 +153,10 @@ it('rechecks the selected pane after a coalesced presence query resolves', async ) renderHook(() => useReadOnScreenAttention()) act(() => useAppStore.getState().activateTab('other-tab')) - expect(readAway).toHaveBeenCalledTimes(1) + await act(async () => resolve(false)) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBe('agent-completion') - expect(dismiss).not.toHaveBeenCalled() + readAway.mockResolvedValue(false) await act(async () => useAppStore.getState().activateTab('away-tab')) expect(useAppStore.getState().unreadAgentCompletionPanes[pane]).toBeUndefined() @@ -212,13 +168,10 @@ it.each([false, true])('preserves manual unread across return signals (web=%s)', renderHook(() => useReadOnScreenAttention()) await act(async () => {}) act(() => useAppStore.getState().unacknowledgeAgents([pane])) - const turn = useAppStore.getState().agentStatusByPaneKey[pane]!.stateStartedAt dismiss.mockClear() await act(async () => window.dispatchEvent(new Event('focus'))) const input = new Event('pointerdown') Object.defineProperty(input, 'isTrusted', { value: true }) act(() => window.dispatchEvent(input)) expect(useAppStore.getState().acknowledgedAgentsByPaneKey[pane]).toBeUndefined() - expect(useAppStore.getState().manuallyUnreadTurnsByPaneKey[pane]).toBe(turn) - expect(dismiss).not.toHaveBeenCalled() }) diff --git a/src/renderer/src/hooks/useReadOnScreenAttention.clock-skew.test.ts b/src/renderer/src/hooks/useReadOnScreenAttention.clock-skew.test.ts index f29301fe5fc..8f359f01dad 100644 --- a/src/renderer/src/hooks/useReadOnScreenAttention.clock-skew.test.ts +++ b/src/renderer/src/hooks/useReadOnScreenAttention.clock-skew.test.ts @@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type * as AgentAutoAckPresence from './agent-auto-ack-presence' import { useReadOnScreenAttention } from './useReadOnScreenAttention' import { useAppStore } from '../store' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../store/terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' import { makePaneKey } from '../../../shared/workspace-layout/stable-pane-id' import type { AgentStatusEntry } from '../../../shared/agent-status/contracts/agent-status-types' @@ -101,13 +101,12 @@ describe('useReadOnScreenAttention — clock-skewed execution host', () => { useAppStore.setState({ acknowledgeAgents: realAcknowledgeAgents }) }) - it('acks a turn stamped ahead of the local clock exactly once', () => { + it('acks a turn stamped ahead of the local clock', () => { seedFutureStampedTurn(NOW + SKEW_MS) - const calls = instrumentAcknowledgeAgents() + instrumentAcknowledgeAgents() renderHook(() => useReadOnScreenAttention()) - expect(calls).toEqual([[PANE_KEY]]) const ackAt = useAppStore.getState().acknowledgedAgentsByPaneKey[PANE_KEY] ?? 0 expect(ackAt).toBeGreaterThanOrEqual(NOW + SKEW_MS) }) diff --git a/src/renderer/src/hooks/useReadOnScreenAttention.floating-panel.test.ts b/src/renderer/src/hooks/useReadOnScreenAttention.floating-panel.test.ts index fa1e42c198b..acccf833ae8 100644 --- a/src/renderer/src/hooks/useReadOnScreenAttention.floating-panel.test.ts +++ b/src/renderer/src/hooks/useReadOnScreenAttention.floating-panel.test.ts @@ -6,7 +6,7 @@ import type * as AgentAutoAckPresence from './agent-auto-ack-presence' import { useReadOnScreenAttention } from './useReadOnScreenAttention' import { useAppStore } from '../store' import { selectFloatingWorkspaceHasUnread } from '../store/workspaces/floating/floating-workspace-unread-selector' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../store/terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' import { FLOATING_TERMINAL_WORKTREE_ID, getDefaultSettings } from '../../../shared/constants' import { makePaneKey } from '../../../shared/workspace-layout/stable-pane-id' diff --git a/src/renderer/src/hooks/useReadOnScreenAttention.focus-group.test.ts b/src/renderer/src/hooks/useReadOnScreenAttention.focus-group.test.ts index 596cbf50a7e..021a84ae185 100644 --- a/src/renderer/src/hooks/useReadOnScreenAttention.focus-group.test.ts +++ b/src/renderer/src/hooks/useReadOnScreenAttention.focus-group.test.ts @@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type * as AgentAutoAckPresence from './agent-auto-ack-presence' import { useReadOnScreenAttention } from './useReadOnScreenAttention' import { useAppStore } from '../store' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' +import { makeTab } from '../store/terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' import { structuredAgentSessionPaneKey } from '../../../shared/agent-session/view/structured-agent-session-projection' diff --git a/src/renderer/src/hooks/useReadOnScreenAttention.mixed-workspace.test.ts b/src/renderer/src/hooks/useReadOnScreenAttention.mixed-workspace.test.ts deleted file mode 100644 index 3bbbd527e1c..00000000000 --- a/src/renderer/src/hooks/useReadOnScreenAttention.mixed-workspace.test.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { describe, expect, it } from 'vitest' - -import { resolveAutoAckTabTargets } from './agent-auto-ack-targets' -import { acknowledgeViewedAutoAckTarget } from './agent-auto-ack-surfaces' -import { createTestStore } from '../store/testing/app-store-test-fixture' -import { makeTab } from '../store/terminals/terminal-tab.test-fixture' -import { makeTabGroup, makeUnifiedTab } from '../store/slices/tabs/tab-group.test-fixture' -import { makePaneKey } from '../../../shared/workspace-layout/stable-pane-id' -import { structuredAgentSessionPaneKey } from '../../../shared/agent-session/view/structured-agent-session-projection' -import { workspaceHasLiveMarker } from '../store/slices/workspace-attention/workspace-live-markers' - -const WORKSPACE = 'wt-1' -const GROUP = 'group-1' -const TERMINAL_TAB = 'term-tab' -const LEAF = '11111111-1111-4111-8111-111111111111' -const TERMINAL_SUBJECT = makePaneKey(TERMINAL_TAB, LEAF) -const CHAT_TAB = 'chat-tab' -const SESSION = 'session-1' -const CHAT_SUBJECT = structuredAgentSessionPaneKey(CHAT_TAB, SESSION) - -type TestStore = ReturnType - -/** Choose terminal/chat visibility within one group while legacy activeTabId still names the terminal in either case. */ -function seedMixedWorkspace(seed: { - visible: 'terminal' | 'chat' - unreadSubjectKeys: readonly string[] -}): { store: TestStore } { - const store = createTestStore() - store.setState({ - activeView: 'terminal', - activeWorktreeId: WORKSPACE, - activeTabId: TERMINAL_TAB, - activeTabIdByWorktree: { [WORKSPACE]: TERMINAL_TAB }, - tabsByWorktree: { [WORKSPACE]: [makeTab({ id: TERMINAL_TAB, worktreeId: WORKSPACE })] }, - ptyIdsByTabId: { [TERMINAL_TAB]: ['pty-1'] }, - terminalLayoutsByTabId: { - [TERMINAL_TAB]: { - root: { type: 'leaf', leafId: LEAF }, - activeLeafId: LEAF, - expandedLeafId: null, - ptyIdsByLeafId: { [LEAF]: 'pty-1' } - } - }, - unifiedTabsByWorktree: { - [WORKSPACE]: [ - makeUnifiedTab({ id: TERMINAL_TAB, worktreeId: WORKSPACE, groupId: GROUP }), - makeUnifiedTab({ - id: CHAT_TAB, - worktreeId: WORKSPACE, - groupId: GROUP, - contentType: 'agent-session', - entityId: SESSION, - agentSessionAgent: 'claude' - }) - ] - }, - groupsByWorktree: { - [WORKSPACE]: [ - makeTabGroup({ - id: GROUP, - worktreeId: WORKSPACE, - activeTabId: seed.visible === 'chat' ? CHAT_TAB : TERMINAL_TAB, - tabOrder: [TERMINAL_TAB, CHAT_TAB] - }) - ] - }, - activeGroupIdByWorktree: { [WORKSPACE]: GROUP }, - unreadAgentCompletionPanes: Object.fromEntries( - seed.unreadSubjectKeys.map((key) => [key, 'agent-completion']) - ) - }) - return { store } -} - -function runAutoAckScan(store: TestStore): void { - const targets = resolveAutoAckTabTargets(store.getState()) - for (const target of targets) { - acknowledgeViewedAutoAckTarget(store.getState(), target) - } - store - .getState() - .readOnScreenAttention({ workspaceIds: [WORKSPACE], targets }, { screenArrived: true }) -} - -const workspaceStillHeld = (store: TestStore): boolean => - workspaceHasLiveMarker(store.getState(), WORKSPACE) - -describe('the on-screen read in a workspace holding both a terminal and a structured chat', () => { - it('reading the visible terminal keeps the hidden chat unread', () => { - const { store } = seedMixedWorkspace({ - visible: 'terminal', - unreadSubjectKeys: [TERMINAL_SUBJECT, CHAT_SUBJECT] - }) - - runAutoAckScan(store) - - expect(store.getState().unreadAgentCompletionPanes[TERMINAL_SUBJECT]).toBeUndefined() - expect(store.getState().unreadAgentCompletionPanes[CHAT_SUBJECT]).toBe('agent-completion') - expect(workspaceStillHeld(store)).toBe(true) - }) - - it('reading the visible chat keeps the hidden terminal unread', () => { - const { store } = seedMixedWorkspace({ - visible: 'chat', - unreadSubjectKeys: [TERMINAL_SUBJECT, CHAT_SUBJECT] - }) - - runAutoAckScan(store) - - expect(store.getState().unreadAgentCompletionPanes[CHAT_SUBJECT]).toBeUndefined() - expect(store.getState().unreadAgentCompletionPanes[TERMINAL_SUBJECT]).toBe('agent-completion') - expect(workspaceStillHeld(store)).toBe(true) - }) - - it('keeps workspace attention while a hidden chat holds only its tab marker', () => { - const { store } = seedMixedWorkspace({ - visible: 'terminal', - unreadSubjectKeys: [TERMINAL_SUBJECT] - }) - store.setState({ unreadTerminalTabs: { [CHAT_TAB]: 'agent-completion' } }) - - runAutoAckScan(store) - - expect(store.getState().unreadTerminalTabs[CHAT_TAB]).toBe('agent-completion') - expect(workspaceStillHeld(store)).toBe(true) - }) -}) diff --git a/src/renderer/src/lib/agent-session/accounts/agent-account-restart-startup.test.ts b/src/renderer/src/lib/agent-session/accounts/agent-account-restart-startup.test.ts index cc1c5ed36d5..23d318ac27a 100644 --- a/src/renderer/src/lib/agent-session/accounts/agent-account-restart-startup.test.ts +++ b/src/renderer/src/lib/agent-session/accounts/agent-account-restart-startup.test.ts @@ -2,8 +2,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { useAppStore } from '@/store/index' import { makePaneKey } from '../../../../../shared/workspace-layout/stable-pane-id' import { getDefaultSettings } from '../../../../../shared/constants' -import { resolveAgentResumeLaunchTarget } from '@/lib/agent-session/resume/agent-resume-launch-target' -import { makeTerminalTab } from '@/store/terminals/terminal-row.test-fixture' + +import { makeTerminalTab } from '@/store/terminals/testing/terminal-row.test-fixture' import { makeWorktree } from '@/store/slices/worktrees/worktree.test-fixture' import { TEST_REPO } from '@/store/repos/repo.test-fixture' import { buildPaneAccountRestartStartup } from './agent-account-restart-startup' @@ -173,12 +173,6 @@ describe('buildPaneAccountRestartStartup for Claude', () => { expect(buildPaneAccountRestartStartup('claude', pane)?.command).toBe( `${prefix}claude '--resume' '${SESSION_ID}'` ) - expect(resolveAgentResumeLaunchTarget).toHaveBeenLastCalledWith( - expect.objectContaining({ - executionHostId: 'runtime:remote-host', - connectionId: 'selected-ssh' - }) - ) } finally { useAppStore.setState(original) } diff --git a/src/renderer/src/lib/agent-session/hibernation/agent-hibernation-runtime-owner.ts b/src/renderer/src/lib/agent-session/hibernation/agent-hibernation-runtime-owner.ts index 0f031775177..c0975f0a82f 100644 --- a/src/renderer/src/lib/agent-session/hibernation/agent-hibernation-runtime-owner.ts +++ b/src/renderer/src/lib/agent-session/hibernation/agent-hibernation-runtime-owner.ts @@ -1,4 +1,4 @@ -import { resolveTerminalTeardownOwner } from '@/store/terminals/terminal-teardown-owner' +import { resolveTerminalTeardownOwner } from '@/store/terminals/sleep/terminal-teardown-owner' import type { TerminalPtyOwner } from '@/lib/workspace/ownership/terminal-worktree-route' export type AgentHibernationRuntimeOwner = diff --git a/src/renderer/src/lib/agent-session/launch/new-tab/launch-agent-structured-chat-test-fixture.ts b/src/renderer/src/lib/agent-session/launch/new-tab/launch-agent-structured-chat-test-fixture.ts index 99dd79857f3..47c4943c7f1 100644 --- a/src/renderer/src/lib/agent-session/launch/new-tab/launch-agent-structured-chat-test-fixture.ts +++ b/src/renderer/src/lib/agent-session/launch/new-tab/launch-agent-structured-chat-test-fixture.ts @@ -2,7 +2,7 @@ import { afterEach, beforeEach, vi } from 'vitest' import { createTestStore, seedStore } from '@/store/testing/app-store-test-fixture' import { makeWorktree } from '@/store/slices/worktrees/worktree.test-fixture' import { TEST_REPO } from '@/store/repos/repo.test-fixture' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' +import { makeTab } from '@/store/terminals/testing/terminal-tab.test-fixture' import { makeUnifiedTab, makeTabGroup } from '@/store/slices/tabs/tab-group.test-fixture' import { drawTabsFromMain } from '@/store/slices/tabs/tabs-drawn-from-main.test-fixture' import type * as Frames from '@/store/slices/tabs/tabs-drawn-from-main.test-fixture' diff --git a/src/renderer/src/lib/agent-session/resume/resume-sleeping-agent-session.ts b/src/renderer/src/lib/agent-session/resume/resume-sleeping-agent-session.ts index 8e8ac43ff18..a1f18f72fa5 100644 --- a/src/renderer/src/lib/agent-session/resume/resume-sleeping-agent-session.ts +++ b/src/renderer/src/lib/agent-session/resume/resume-sleeping-agent-session.ts @@ -1,4 +1,4 @@ -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import { useAppStore } from '@/store/index' import { isWorkspaceSleepRecord } from '../../../../../shared/workspace-sleep' import { agentProviderSessionsEqual } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' diff --git a/src/renderer/src/lib/agent-session/resume/sleeping-agent-pane-ownership.ts b/src/renderer/src/lib/agent-session/resume/sleeping-agent-pane-ownership.ts index 0f828eac188..9da2dad30d7 100644 --- a/src/renderer/src/lib/agent-session/resume/sleeping-agent-pane-ownership.ts +++ b/src/renderer/src/lib/agent-session/resume/sleeping-agent-pane-ownership.ts @@ -1,5 +1,5 @@ -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' -import { getFirstTerminalTabOwnerWorktreeId } from '@/store/terminals/terminal-tab-owner-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' +import { getFirstTerminalTabOwnerWorktreeId } from '@/store/terminals/ownership/terminal-tab-owner-index' import type { useAppStore } from '@/store/index' import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' import { agentTurnEndedUncleanly } from '../../../../../shared/agent-status/lifecycle/agent-main-agent-verdict' diff --git a/src/renderer/src/lib/agent-session/resume/sleeping-agent-wake-requests.ts b/src/renderer/src/lib/agent-session/resume/sleeping-agent-wake-requests.ts index 84725e394a1..d19479d6979 100644 --- a/src/renderer/src/lib/agent-session/resume/sleeping-agent-wake-requests.ts +++ b/src/renderer/src/lib/agent-session/resume/sleeping-agent-wake-requests.ts @@ -1,5 +1,5 @@ import { useAppStore } from '@/store/index' -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import { parseLegacyNumericPaneKey, parsePaneKey diff --git a/src/renderer/src/lib/agent-session/resume/wake-sleeping-agents-in-background.ts b/src/renderer/src/lib/agent-session/resume/wake-sleeping-agents-in-background.ts index b75a8fc1f34..7bc808acd4b 100644 --- a/src/renderer/src/lib/agent-session/resume/wake-sleeping-agents-in-background.ts +++ b/src/renderer/src/lib/agent-session/resume/wake-sleeping-agents-in-background.ts @@ -13,7 +13,7 @@ import { isStrandedWorkspaceSleepRecord, recordPaneIsOwnedByPreservedPane } from './sleeping-agent-pane-ownership' -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' type BackgroundSleepingAgentWakeDispatcherOptions = { diff --git a/src/renderer/src/lib/agent-session/tab-identity/use-tab-agent.ts b/src/renderer/src/lib/agent-session/tab-identity/use-tab-agent.ts index 690e4e0930a..f0982c5d3ba 100644 --- a/src/renderer/src/lib/agent-session/tab-identity/use-tab-agent.ts +++ b/src/renderer/src/lib/agent-session/tab-identity/use-tab-agent.ts @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react' import { useAppStore } from '@/store/index' -import { worktreeUsesRemoteConnection } from '@/store/terminals/terminal-workspace-routing' +import { worktreeUsesRemoteConnection } from '@/store/terminals/tabs/creation/terminal-workspace-routing' import { hasRemoteRuntimePtyForTab } from './tab-agent-remote-pty-selector' import { isTerminalLeafId, diff --git a/src/renderer/src/lib/workspace/activation/active-worktree-removal-successor.test.ts b/src/renderer/src/lib/workspace/activation/active-worktree-removal-successor.test.ts index 2d5b8f2a374..2ceedd79b9f 100644 --- a/src/renderer/src/lib/workspace/activation/active-worktree-removal-successor.test.ts +++ b/src/renderer/src/lib/workspace/activation/active-worktree-removal-successor.test.ts @@ -6,7 +6,7 @@ import { } from '@/lib/workspace/activation/active-worktree-removal-successor' import { createTestStore, seedStore } from '../../../store/testing/app-store-test-fixture' import { makeWorktree } from '../../../store/slices/worktrees/worktree.test-fixture' -import { makeTerminalTab } from '../../../store/terminals/terminal-row.test-fixture' +import { makeTerminalTab } from '../../../store/terminals/testing/terminal-row.test-fixture' import { TEST_REPO } from '../../../store/repos/repo.test-fixture' import { createStoreCascadesMockApi } from '../../../store/testing/app-store-cascade-api.test-fixture' import { clearSshHostWorkspaces } from '@/components/sidebar/ssh-host-remove-workspaces' @@ -97,25 +97,6 @@ const resolution = { } describe('deleting the active workspace', () => { - it('navigates on durable retirement while retaining the checkout and its draft state', async () => { - const store = setup() - const before = store.getState() - store.setState({ worktreesByRepo: { repo1: [{ ...active, removing: true }, sibling, main] } }) - await Promise.resolve() - expect(activateAndRevealWorktree).not.toHaveBeenCalled() - store.setState({ - worktreesByRepo: { - repo1: [{ ...active, removing: true, removalRecorded: true }, sibling, main] - } - }) - await Promise.resolve() - expect(activateAndRevealWorktree).toHaveBeenCalledWith(sibling.id, { - revealInSidebar: false, - executionHostId: 'local' - }) - expect(store.getState().worktreesByRepo.repo1.find((row) => row.id === active.id)).toBeDefined() - expect(store.getState().tabsByWorktree).toBe(before.tabsByWorktree) - }) it('respects a user closing the last browser tab after startup dropped its row', async () => { const store = setup() layoutMain = await drawTabsFromMain(store) @@ -126,7 +107,6 @@ describe('deleting the active workspace', () => { await layoutMain.settle() await Promise.resolve() expect(store.getState().activeWorktreeId).toBeNull() - expect(activateAndRevealWorktree).not.toHaveBeenCalled() }) it('keeps a failed host removal selected and allows a later ordinary removal to hand off', async () => { @@ -138,29 +118,8 @@ describe('deleting the active workspace', () => { removeForHost.mockRejectedValueOnce(new Error('host unavailable')) expect((await clearSshHostWorkspaces(resolution)).failedIds).toContain(active.id) expect(store.getState().activeWorktreeId).toBe(active.id) - expect(activateAndRevealWorktree).not.toHaveBeenCalled() - await forget(store, active) - expect(activateAndRevealWorktree).toHaveBeenCalledWith('repo1::/sibling', { - revealInSidebar: false, - executionHostId: 'local' - }) - }) - it('keeps paired-host retirement on Landing while ordinary disappearance on another host still repairs', async () => { - const store = setup() - const retired = { ...active, runtimeOwnerEnvironmentId: 'retired' } - store.setState({ worktreesByRepo: { repo1: [retired, sibling, main] } }) - store.getState().purgeStaleRuntimeHostState(['retired']) - await Promise.resolve() - expect(activateAndRevealWorktree).not.toHaveBeenCalled() - store.getState().setActiveWorktree(sibling.id, 'local') - store.getState().purgeStaleRuntimeHostState(['unrelated']) - await forget(store, sibling) - await Promise.resolve() - expect(activateAndRevealWorktree).toHaveBeenCalledWith('repo1::/main', { - revealInSidebar: false, - executionHostId: 'local' - }) + await forget(store, active) }) it('does not wake a sibling that "Hide sleeping" keeps out of the sidebar', async () => { const store = setup() @@ -179,16 +138,13 @@ describe('deleting the active workspace', () => { }) await forget(store, active) await Promise.resolve() - expect(vi.mocked(activateAndRevealWorktree).mock.calls.map((call) => call[0])).toEqual([ - awake.id - ]) store.getState().setActiveWorktree(awake.id, 'local') vi.mocked(activateAndRevealWorktree).mockReset() store.setState({ ptyIdsByTabId: {} }) await forget(store, awake) await Promise.resolve() - expect(activateAndRevealWorktree).not.toHaveBeenCalled() + expect(store.getState().activeWorktreeId).toBeNull() }) diff --git a/src/renderer/src/lib/workspace/activation/worktree-agent-activation-gate.ts b/src/renderer/src/lib/workspace/activation/worktree-agent-activation-gate.ts index 0d8f18ed5d4..4874b80e088 100644 --- a/src/renderer/src/lib/workspace/activation/worktree-agent-activation-gate.ts +++ b/src/renderer/src/lib/workspace/activation/worktree-agent-activation-gate.ts @@ -1,4 +1,4 @@ -import { sleepingAgentRecordIndex } from '@/store/terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '@/store/terminals/sleep/sleeping-agent-record-index' import { useAppStore } from '@/store/index' import type { PtyListedSession } from '../../../../../shared/terminal/pty/lifecycle/pty-listed-session' import { diff --git a/src/renderer/src/lib/workspace/ownership/terminal-close-route.ts b/src/renderer/src/lib/workspace/ownership/terminal-close-route.ts index 9e471081ca7..cf63a788b74 100644 --- a/src/renderer/src/lib/workspace/ownership/terminal-close-route.ts +++ b/src/renderer/src/lib/workspace/ownership/terminal-close-route.ts @@ -1,7 +1,7 @@ import { parseExecutionHostId } from '../../../../../shared/execution-host' import { getPtyExecutionHost } from '../../../../../shared/terminal/pty/lifecycle/terminal-execution-host' import type { AppState } from '@/store/types' -import { collectPtyIdsForTab } from '@/store/terminals/terminal-tab-retirement' +import { collectPtyIdsForTab } from '@/store/terminals/retirement/terminal-tab-retirement' import { resolveTerminalWorktreeRoute, type TerminalWorktreeRoute } from './terminal-worktree-route' function routeForHost(hostId: string | null | undefined): TerminalWorktreeRoute | null { diff --git a/src/renderer/src/lib/workspace/tabs/activate-tab-and-focus-pane.ts b/src/renderer/src/lib/workspace/tabs/activate-tab-and-focus-pane.ts index 036a81bcd23..c17b9d65de4 100644 --- a/src/renderer/src/lib/workspace/tabs/activate-tab-and-focus-pane.ts +++ b/src/renderer/src/lib/workspace/tabs/activate-tab-and-focus-pane.ts @@ -1,5 +1,5 @@ import { useAppStore } from '@/store/index' -import { resolveActiveTabOwnerWorktreeId } from '@/store/terminals/active-tab-owner-worktree' +import { resolveActiveTabOwnerWorktreeId } from '@/store/terminals/ownership/active-tab-owner-worktree' import { FOCUS_TERMINAL_PANE_EVENT, type FocusTerminalPaneDetail } from '@/constants/terminal' let pendingFocusPaneFrameId: number | null = null diff --git a/src/renderer/src/runtime/native-chat/naming/legacy-chat-rename-migration.test.tsx b/src/renderer/src/runtime/native-chat/naming/legacy-chat-rename-migration.test.tsx deleted file mode 100644 index d4cd2478e44..00000000000 --- a/src/renderer/src/runtime/native-chat/naming/legacy-chat-rename-migration.test.tsx +++ /dev/null @@ -1,250 +0,0 @@ -// @vitest-environment happy-dom -import { act, cleanup, render, renderHook } from '@testing-library/react' -import { afterEach, beforeEach, expect, it, vi } from 'vitest' -import type { Tab } from '../../../../../shared/tab-types' -import '../../../../../shared/global-settings-test-fixture' - -import '../../../../../shared/ephemeral-setup-terminal-worktree-id' -import type { AgentSessionStatusSummary } from '../../../../../shared/agent-session/agent-session-wire' -import type * as LayoutRouting from '@/store/terminals/tab-change-through-layout-owner' -import type * as LocalRuntimeCapabilities from '../../hosts/capabilities/local-runtime-capabilities' -import { makeWorktree } from '@/store/slices/worktrees/worktree.test-fixture' -import { makeUnifiedTab } from '@/store/slices/tabs/tab-group.test-fixture' -import { TEST_REPO } from '@/store/repos/repo.test-fixture' -import { makeFolderWorkspace } from '@/store/folder-workspaces/folder-workspace.test-fixture' -import { WorkspaceAttachmentOrigins } from '@/components/sidebar/workspace-card/review/WorkspaceAttachmentOrigins' -import { useAppStore } from '@/store/index' -import { readStructuredChatTabName } from './structured-chat-tab-name' -import '@/store/slices/tabs/closing/pinned-tab-close-guard' -import { - subscribeStructuredChatTabNames, - getStructuredChatTabNames -} from './structured-chat-name-observation' -import { useLiveDashboardSnapshot } from '@/components/dashboard/useLiveDashboardSnapshot' -import { useAgentPaneThreads } from '@/components/activity/use-agent-pane-threads' -import { makePaneKey } from '../../../../../shared/workspace-layout/stable-pane-id' -import type { RuntimeClientTarget } from '../../../../../shared/runtime-client-target' - -import '../../web-session-tabs-sync/snapshot-api' -import '../../web-session-tabs-sync/store-patch' -import '../../local-structured-session-tabs-sync/snapshot-apply' -import '@/lib/agent-session/launch/structured-agent-session-launch-persistence' - -const mock = vi.hoisted(() => ({ - rpc: vi.fn(), - layout: vi.fn(), - contacts: new Set<() => void>(), - listeners: new Set<() => void>(), - snapshot: new Map(), - paired: new Map(), - activates: vi.fn(), - deactivates: vi.fn(), - send: vi.fn() -})) -vi.mock( - '@/components/native-chat/session/structured/delivery/structured-agent-session-message-sender', - () => ({ - sendStructuredAgentSessionMessage: mock.send - }) -) -vi.mock('@/store/index', async () => ({ - useAppStore: (await import('@/store/testing/app-store-test-fixture')).createTestStore() -})) -vi.mock('../../rpc/calls/runtime-rpc-call', () => ({ - callRuntimeRpc: mock.rpc -})) -vi.mock('../host-capabilities/structured-agent-session-host-support', () => ({ - supportsStructuredAgentSessionRename: async () => true -})) -vi.mock('../../../../../shared/layout-owner-switch', () => ({ ORCA_LAYOUT_OWNER_IS_MAIN: true })) -vi.mock('@/store/terminals/tab-change-through-layout-owner', () => ({ - sendTabChangeToLayoutOwner: mock.layout -})) -vi.mock('../../hosts/capabilities/local-runtime-capabilities', async (importOriginal) => ({ - ...(await importOriginal()), - subscribeLocalRuntimeCapabilitiesKnown: () => () => {} -})) -vi.mock('../../hosts/connections/runtime-host-contact-regained', () => ({ - subscribeRuntimeHostContactRegained: (_id: string, listener: () => void) => { - mock.contacts.add(listener) - return () => mock.contacts.delete(listener) - } -})) -vi.mock('../status/structured-agent-session-status-feed', () => ({ - getStructuredAgentSessionStatusFeed: (target: RuntimeClientTarget) => ({ - getSnapshot: () => (target.kind === 'local' ? mock.snapshot : mock.paired), - getNamingSnapshot: () => (target.kind === 'local' ? mock.snapshot : mock.paired), - activate: () => { - mock.activates() - return mock.deactivates - }, - subscribe: (listener: () => void) => { - mock.listeners.add(listener) - return () => mock.listeners.delete(listener) - } - }) -})) - -const workspace = makeWorktree({ id: 'repo::/tmp/rename-migration', repoId: 'repo' }) -const chat = (extra: Partial = {}): Tab => - makeUnifiedTab({ - id: 'chat-tab', - entityId: 'session-1', - worktreeId: workspace.id, - groupId: 'group', - contentType: 'agent-session', - agentSessionAgent: 'codex', - label: 'Codex Chat', - ...extra - }) -function seed(tab: Tab) { - useAppStore.setState({ - workspaceSessionReady: true, - repos: [{ ...TEST_REPO, id: 'repo' }], - worktreesByRepo: { repo: [workspace] }, - unifiedTabsByWorktree: { [tab.worktreeId]: [tab] } - }) -} -const stops: (() => void)[] = [] -beforeEach(() => { - vi.spyOn(Date, 'now').mockReturnValue(1_700_000_000_000) - useAppStore.setState(useAppStore.getInitialState(), true) - mock.activates.mockClear() - mock.deactivates.mockClear() - mock.rpc.mockReset() - mock.layout.mockReset() - mock.layout.mockReturnValue(false) -}) -afterEach(() => { - cleanup() - stops.splice(0).forEach((stop) => stop()) - mock.snapshot.clear() - mock.paired.clear() - vi.restoreAllMocks() -}) - -function seedTwin(tab: Tab) { - seed(tab) - const folder = makeFolderWorkspace({ id: 'twin' }) - const paneKey = makePaneKey(tab.id, '11111111-1111-4111-8111-111111111111') - useAppStore.setState({ - activeWorktreeId: tab.worktreeId, - activeWorkspaceExecutionHostId: 'runtime:paired', - folderWorkspaces: [ - { ...folder, executionHostId: 'local' }, - { ...folder, executionHostId: 'runtime:paired' } - ], - agentStatusByPaneKey: { - [paneKey]: { - paneKey, - tabId: tab.id, - worktreeId: tab.worktreeId, - agentType: 'codex', - state: 'working', - prompt: '', - updatedAt: Date.now(), - stateStartedAt: Date.now(), - stateHistory: [] - } - } - }) -} -function name(tab: Tab, conversationName: string): AgentSessionStatusSummary { - return { - sessionId: tab.entityId, - workspaceId: tab.worktreeId, - agent: 'codex', - status: null, - latestPrompt: '', - updatedAt: 1, - conversationName - } -} - -it('shares qualified current names with live dashboard and attachments without activating plain reads', () => { - const tab = chat({ worktreeId: 'folder:twin' }) - seedTwin(tab) - mock.snapshot = new Map([[tab.entityId, name(tab, 'Same')]]) - mock.paired = new Map([[tab.entityId, name(tab, 'Same')]]) - const attached = chat({ id: 'attached-tab', executionHostId: 'runtime:paired' }) - useAppStore.setState((state) => ({ - unifiedTabsByWorktree: { ...state.unifiedTabsByWorktree, [workspace.id]: [attached] } - })) - const before = getStructuredChatTabNames() - expect(getStructuredChatTabNames()).toBe(before) - expect(before.get(tab)).toMatchObject({ owner: 'runtime:paired', savedName: 'Same' }) - expect(mock.activates).not.toHaveBeenCalled() - stops.push(useAppStore.subscribe(() => getStructuredChatTabNames())) - const changed = vi.fn() - const stop = subscribeStructuredChatTabNames(changed) - const view = render( - - ) - const dashboard = renderHook(useLiveDashboardSnapshot) - const activity = renderHook(() => - useAgentPaneThreads({ - query: '', - readFilter: 'all', - groupBy: 'none', - selectedPaneKey: null - }) - ) - const activityTitle = () => - activity.result.current.allThreads.find((row) => row.tab.id === tab.id)?.paneTitle - const shown = () => - dashboard.result.current.cards.find((card) => card.tabId === tab.id)?.conversationName - expect(shown()).toBe('Same') - expect(activityTitle()).toBe('Same') - expect(view.container.textContent).toContain('Same') - expect(mock.activates).toHaveBeenCalledTimes(1) - act(() => useAppStore.setState({ agentStatusEpoch: 1 })) - expect(getStructuredChatTabNames()).toBe(before) - act(() => useAppStore.setState({ activeWorkspaceExecutionHostId: 'local' })) - expect(getStructuredChatTabNames()).not.toBe(before) - expect(getStructuredChatTabNames().get(tab)?.owner).toBe('local') - expect(activityTitle()).toBe('Same') - act(() => { - mock.snapshot = new Map([[tab.entityId, name(tab, 'Local renamed')]]) - mock.listeners.forEach((notify) => notify()) - }) - expect(shown()).toBe('Local renamed') - expect(activityTitle()).toBe('Local renamed') - const local = getStructuredChatTabNames() - act(() => { - mock.paired = new Map([[tab.entityId, name(tab, 'Unrelated')]]) - mock.listeners.forEach((notify) => notify()) - }) - expect(getStructuredChatTabNames().get(tab)).toEqual(local.get(tab)) - expect(view.container.textContent).toContain('Unrelated') - expect(shown()).toBe('Local renamed') - expect(activityTitle()).toBe('Local renamed') - act(() => useAppStore.setState({ activeWorktreeId: 'elsewhere' })) - expect(getStructuredChatTabNames().get(tab)?.owner).toBeNull() - expect(shown()).toBe('Codex Chat') - expect(activityTitle()).toBe('Codex Chat') - const replacement = { ...tab } - act(() => useAppStore.setState({ unifiedTabsByWorktree: { [tab.worktreeId]: [replacement] } })) - expect(getStructuredChatTabNames().has(tab)).toBe(false) - expect(getStructuredChatTabNames().has(replacement)).toBe(true) - dashboard.unmount() - activity.unmount() - view.unmount() - expect(mock.deactivates).toHaveBeenCalledTimes(2) - stop() - mock.paired = new Map([[tab.entityId, name(tab, 'Dormant rename')]]) - useAppStore.setState({ - activeWorktreeId: tab.worktreeId, - activeWorkspaceExecutionHostId: 'runtime:paired' - }) - expect(getStructuredChatTabNames().get(replacement)?.savedName).toBe('Dormant rename') - expect(readStructuredChatTabName(replacement, useAppStore.getState())).toBe('Dormant rename') - expect(mock.activates).toHaveBeenCalledTimes(2) -}) diff --git a/src/renderer/src/runtime/native-chat/naming/structured-chat-rename.ts b/src/renderer/src/runtime/native-chat/naming/structured-chat-rename.ts index fd8dd4589aa..6e900c51057 100644 --- a/src/renderer/src/runtime/native-chat/naming/structured-chat-rename.ts +++ b/src/renderer/src/runtime/native-chat/naming/structured-chat-rename.ts @@ -12,7 +12,7 @@ import { executionHostIdForStructuredTarget } from '../session-ownership/structured-agent-session-owner' import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch' -import { sendTabChangeToLayoutOwner } from '@/store/terminals/tab-change-through-layout-owner' +import { sendTabChangeToLayoutOwner } from '@/store/terminals/tabs/presentation/tab-change-through-layout-owner' import { captureStructuredChatRename } from './structured-chat-rename-action' type RenameResult = { name: string | null; applied: boolean } diff --git a/src/renderer/src/runtime/web-session-tabs-sync/agent-status-primitives.ts b/src/renderer/src/runtime/web-session-tabs-sync/agent-status-primitives.ts index bacdb7ebe97..11ec1c4cfdd 100644 --- a/src/renderer/src/runtime/web-session-tabs-sync/agent-status-primitives.ts +++ b/src/renderer/src/runtime/web-session-tabs-sync/agent-status-primitives.ts @@ -14,7 +14,7 @@ import type { RuntimeMobileSessionTerminalClientTab } from '../../../../shared/r import { type RetiredTerminalTabSweepState, buildRetiredTerminalTabStateSweepPatch -} from '../../store/terminals/retired-terminal-tab-state-sweep' +} from '../../store/terminals/retirement/retired-terminal-tab-state-sweep' import { isMirroredTerminalSurfaceId } from './terminal-surfaces' import { isAgentStatusFresh } from './state-equality-core' diff --git a/src/renderer/src/runtime/web-session-tabs-sync/hydration/testing/host-session-mirror-frame-fixtures.ts b/src/renderer/src/runtime/web-session-tabs-sync/hydration/testing/host-session-mirror-frame-fixtures.ts index 1bd77ece66f..e6eeb0f89a7 100644 --- a/src/renderer/src/runtime/web-session-tabs-sync/hydration/testing/host-session-mirror-frame-fixtures.ts +++ b/src/renderer/src/runtime/web-session-tabs-sync/hydration/testing/host-session-mirror-frame-fixtures.ts @@ -2,7 +2,7 @@ import { vi, type Mock } from 'vitest' import type { RuntimeMobileSessionTabsResult } from '../../../../../../shared/runtime-session-contracts' import { toWebTerminalSurfaceTabId } from '../../../../../../shared/workspace-layout/terminal-surface-id' import type { AppState } from '@/store/types' -import { makeTerminalTab } from '@/store/terminals/terminal-row.test-fixture' +import { makeTerminalTab } from '@/store/terminals/testing/terminal-row.test-fixture' import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' /** Shared with the frame-ordering suites through their `vi.mock` factories, so diff --git a/src/renderer/src/runtime/web-session-tabs-sync/state.ts b/src/renderer/src/runtime/web-session-tabs-sync/state.ts index 96405a7f204..ef3e006cf6b 100644 --- a/src/renderer/src/runtime/web-session-tabs-sync/state.ts +++ b/src/renderer/src/runtime/web-session-tabs-sync/state.ts @@ -1,6 +1,6 @@ import type { BrowserInitializationPresentation } from './browser-initialization-presentation' import type { AppState } from '../../store/types' -import type { RetiredTerminalTabSweepState } from '../../store/terminals/retired-terminal-tab-state-sweep' +import type { RetiredTerminalTabSweepState } from '../../store/terminals/retirement/retired-terminal-tab-state-sweep' import type { RuntimeMobileSessionTabsResult } from '../../../../shared/runtime-types' import type { RuntimeMobileSessionBrowserTab, diff --git a/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-changes.ts b/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-changes.ts index a15ca216b02..d95dd757b6c 100644 --- a/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-changes.ts +++ b/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-changes.ts @@ -1,7 +1,7 @@ // Apply spinner-rate live title frames to individual tabs, avoiding workspace rebuilds. import { shownLiveTitle } from '@/store/workspace-layout/frames/workspace-layout-frame-slices' -import type { TerminalTabTitleUpdate } from '@/store/terminals/terminal-tab-title-batch' +import type { TerminalTabTitleUpdate } from '@/store/terminals/tabs/presentation/terminal-tab-title-batch' import type { PublishedTab, PublishedWorkspaceLayout diff --git a/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-sync.ts b/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-sync.ts index d9d21e89851..6d67193265f 100644 --- a/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-sync.ts +++ b/src/renderer/src/runtime/workspace-layout/frames/workspace-layout-frame-sync.ts @@ -15,7 +15,7 @@ import { layoutHoldsBoundPane, onWorkspaceStartsDrawing } from './workspace-layout-frame-drawn-workspaces' -import type { TerminalTabTitleUpdate } from '@/store/terminals/terminal-tab-title-batch' +import type { TerminalTabTitleUpdate } from '@/store/terminals/tabs/presentation/terminal-tab-title-batch' import type { WorkspaceLayoutChangeFrame } from '../../../../../shared/workspace-layout/published-layout/workspace-layout-stream-frames' import { liveTitleUpdates } from './workspace-layout-frame-changes' import { terminalLayoutsWithFramePaneTrees } from './workspace-layout-frame-pane-trees' diff --git a/src/renderer/src/runtime/workspace-layout/sleep-records/sleeping-records-to-layout-owner.ts b/src/renderer/src/runtime/workspace-layout/sleep-records/sleeping-records-to-layout-owner.ts index a74115fb0bf..9648c2ba4a9 100644 --- a/src/renderer/src/runtime/workspace-layout/sleep-records/sleeping-records-to-layout-owner.ts +++ b/src/renderer/src/runtime/workspace-layout/sleep-records/sleeping-records-to-layout-owner.ts @@ -1,7 +1,7 @@ // Window still captures agent resume records; main must record every change because layout frames omit them. import { useAppStore } from '@/store/index' -import { recordSleepingRecordChangesThroughLayoutOwner } from '@/store/terminals/terminal-sleep-layout-owner' +import { recordSleepingRecordChangesThroughLayoutOwner } from '@/store/terminals/sleep/terminal-sleep-layout-owner' let following = false diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index a0bde318e44..9139f63c114 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -45,14 +45,14 @@ import { createRuntimeStatusSlice } from './slices/runtime-status/create-runtime import { createPullRequestGenerationSlice } from './slices/hosted-review/generation/pull-request-generation' import { createCommitMessageGenerationSlice } from './slices/hosted-review/generation/commit-message-generation' import { createPinnedTabCloseConfirmSlice } from './slices/tabs/pinned-tab-close-confirm' -import { createRecentlyClosedTerminalTabsSlice } from './terminals/recently-closed-terminal-tabs' +import { createRecentlyClosedTerminalTabsSlice } from './terminals/tabs/recently-closed-terminal-tabs' import { createRecentlyClosedTabsSlice } from './slices/tabs/recently-closed-tabs' import { createOrcaProfilesSlice } from './slices/orca-profiles/create-orca-profiles-slice' import { createNewIssueDraftSlice } from './slices/task-creation/new-issue-draft' import { createFeedbackDraftSlice } from './slices/feedback/feedback-draft' import { createTaskCreationDraftsSlice } from './slices/task-creation/task-creation-drafts' import { createRemoteServerUpdatesSlice } from './slices/runtime-host-updates/remote-server-updates' -import { createTerminalQuickCommandHostsSlice } from './terminals/terminal-quick-command-hosts' +import { createTerminalQuickCommandHostsSlice } from './terminals/quick-commands/terminal-quick-command-hosts' import { createStructuredSessionLaunchDirectorySlice } from './slices/agent-status/structured-session-launch-directories' import { createStructuredChatSleptAtSlice } from './slices/agent-status/structured-chat-slept-at' import { createStructuredChatCompanionWritesSlice } from './slices/agent-status/structured-chat-companion-writes' diff --git a/src/renderer/src/store/repos/project-removal-host-twin-state.test.ts b/src/renderer/src/store/repos/project-removal-host-twin-state.test.ts index 1dd739d034d..9f904e120c7 100644 --- a/src/renderer/src/store/repos/project-removal-host-twin-state.test.ts +++ b/src/renderer/src/store/repos/project-removal-host-twin-state.test.ts @@ -1,10 +1,9 @@ /** Same repo/path IDs can belong to two hosts; removing remote copy must preserve local shells, tabs and dirty drafts. */ import { beforeEach, describe, expect, it, vi } from 'vitest' -import { registerPendingEditorFlush } from '@/components/editor/save/flush/editor-pending-flush' -import { confirmUnsavedDiscard } from '../slices/worktrees/teardown/removed-workspace-unsaved-files' + import { createTestStore } from '../testing/app-store-test-fixture' import { makeOpenFile } from '../slices/editor/types/open-file.test-fixture' -import { makeTab } from '../terminals/terminal-tab.test-fixture' +import { makeTab } from '../terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../slices/tabs/tab-group.test-fixture' import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' import type { Repo } from '../../../../shared/repo-types' @@ -186,57 +185,6 @@ function seedTwins(): ReturnType { } describe('removing a remote project keeps its local twin', () => { - it.each([false, true])( - 'captures twin and exclusive delayed text in one notice (confirmed=%s)', - async (confirmed) => { - const store = seedTwins() - const exclusive = `${PROJECT_ID}::/work/exclusive` - const exclusiveFile = '/work/exclusive/note.ts' - store.setState((s) => ({ - worktreesByRepo: { - [PROJECT_ID]: [ - ...(s.worktreesByRepo[PROJECT_ID] ?? []), - makeWorktree({ id: exclusive, repoId: PROJECT_ID, hostId: REMOTE_HOST }) - ] - }, - openFiles: [ - ...s.openFiles, - makeOpenFile({ id: exclusiveFile, worktreeId: exclusive, runtimeEnvironmentId: 'env-b' }) - ] - })) - const flushed: string[] = [] - const unregister = ['editor:remote-file', exclusiveFile].map((id) => - registerPendingEditorFlush(id, () => { - flushed.push(id) - store.setState((s) => ({ editorDrafts: { ...s.editorDrafts, [id]: `late ${id}` } })) - }) - ) - try { - const confirmedDiscards = confirmed - ? confirmUnsavedDiscard(store.getState, [ - { id: WORKTREE_ID, hostId: REMOTE_HOST }, - { id: exclusive, hostId: REMOTE_HOST } - ]) - : undefined - await store.getState().removeProject(PROJECT_ID, { hostId: REMOTE_HOST, confirmedDiscards }) - await layoutApplyTestTransport.settle() - expect([...new Set(flushed)].sort()).toEqual(['editor:remote-file', exclusiveFile].sort()) - expect(store.getState().editorDrafts['/work/same/local.ts']).toBe('unsaved local edit') - if (confirmed) { - await new Promise((resolve) => setTimeout(resolve, 0)) - expect(recoveryNotice).not.toHaveBeenCalled() - } else { - await vi.waitFor(() => expect(recoveryNotice).toHaveBeenCalledTimes(1)) - expect( - recoveryNotice.mock.calls[0]?.[0].map((f: { content: string }) => f.content).sort() - ).toEqual(['late editor:remote-file', `late ${exclusiveFile}`].sort()) - } - } finally { - unregister.forEach((f) => f()) - } - } - ) - it('keeps a tab that gained a surviving pane during removal and stops its removed pane', async () => { const store = seedTwins() store.setState((s) => ({ @@ -261,7 +209,5 @@ describe('removing a remote project keeps its local twin', () => { expect(store.getState().tabsByWorktree[WORKTREE_ID]?.map((tab) => tab.id)).toEqual([ 'tab-local' ]) - expect(ptyKill).toHaveBeenCalledWith('pty-local') - expect(ptyKill).not.toHaveBeenCalledWith(remotePtyId) }) }) diff --git a/src/renderer/src/store/repos/repo-removal-host-twin-attribution.ts b/src/renderer/src/store/repos/repo-removal-host-twin-attribution.ts index e653544b3a1..6f3c74fdd38 100644 --- a/src/renderer/src/store/repos/repo-removal-host-twin-attribution.ts +++ b/src/renderer/src/store/repos/repo-removal-host-twin-attribution.ts @@ -5,7 +5,7 @@ import { type ExecutionHostId } from '../../../../shared/execution-host' import { getPtyExecutionHost } from '../../../../shared/terminal/pty/lifecycle/terminal-execution-host' -import { collectPtyIdsForTab } from '../terminals/terminal-tab-retirement' +import { collectPtyIdsForTab } from '../terminals/retirement/terminal-tab-retirement' import { toVisibleTabType } from '../../../../shared/tab-types' import { isExecutionHostAliasForWorktree } from '@/lib/workspace/ownership/worktree-execution-host-alias' import { diff --git a/src/renderer/src/store/repos/repo-removal-host-twin-teardown.ts b/src/renderer/src/store/repos/repo-removal-host-twin-teardown.ts index ad139077e13..820e5b45103 100644 --- a/src/renderer/src/store/repos/repo-removal-host-twin-teardown.ts +++ b/src/renderer/src/store/repos/repo-removal-host-twin-teardown.ts @@ -2,7 +2,7 @@ import type { AppState } from '../types' import type { ExecutionHostId } from '../../../../shared/execution-host' import type { EditorBufferKeepRequest } from '../slices/editor/buffers/editor-buffer-kept' import { isRemoteRuntimePtyId } from '../../../../shared/remote-runtime/remote-runtime-pty-id' -import { buildTerminalTabRetirementPlans } from '../terminals/terminal-tab-retirement' +import { buildTerminalTabRetirementPlans } from '../terminals/retirement/terminal-tab-retirement' import { cancelStructuredLaunchesForWorktrees } from '../slices/worktrees/teardown/purged-structured-launch-retirement' import { collectHostTwinPurgeScopes } from '../slices/worktrees/teardown/host-twin-purge-scopes' import { omitRecordKeys } from '../slices/worktrees/teardown/record-key-omission' diff --git a/src/renderer/src/store/repos/store-session-cascades.test.ts b/src/renderer/src/store/repos/store-session-cascades.test.ts index 4f20d41111f..ecc22cf5c33 100644 --- a/src/renderer/src/store/repos/store-session-cascades.test.ts +++ b/src/renderer/src/store/repos/store-session-cascades.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' import { createTestStore } from '../testing/app-store-test-fixture' import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { makeTab, makeLayout } from '../terminals/terminal-tab.test-fixture' +import { makeTab, makeLayout } from '../terminals/testing/terminal-tab.test-fixture' import { createStoreSessionMockApi } from '../testing/app-store-session-api.test-fixture' vi.mock('sonner', () => ({ toast: { info: vi.fn(), success: vi.fn(), error: vi.fn() } })) @@ -73,14 +73,7 @@ describe('removeProject cascade', () => { expect(s.terminalLayoutsByTabId['tab2']).toBeUndefined() expect(s.activeTabId).toBeNull() - expect(mockApi.pty.kill).toHaveBeenCalledWith('pty1') - expect(mockApi.pty.kill).toHaveBeenCalledWith('pty2') - // Tabs are gone before async exit events fire, so retaining one-shot guards would leak ephemeral PTY ids. - expect(s.suppressedPtyExitIds['pty1']).toBeUndefined() - expect(s.suppressedPtyExitIds['pty2']).toBeUndefined() - expect(s.pendingPaneAccountRestarts['pty1']).toBeUndefined() - expect(s.pendingPaneAccountRestarts['pty2']).toBeUndefined() store.getState().clearTabPtyId('tab1', 'pty1') store.getState().clearTabPtyId('tab2', 'pty2') diff --git a/src/renderer/src/store/repos/wsl-moved-project-chat-purge.test.ts b/src/renderer/src/store/repos/wsl-moved-project-chat-purge.test.ts index 74265702e42..f50fff632a9 100644 --- a/src/renderer/src/store/repos/wsl-moved-project-chat-purge.test.ts +++ b/src/renderer/src/store/repos/wsl-moved-project-chat-purge.test.ts @@ -1,5 +1,5 @@ import { beforeEach, expect, it, vi } from 'vitest' -import { makeTab } from '../terminals/terminal-tab.test-fixture' +import { makeTab } from '../terminals/testing/terminal-tab.test-fixture' import { makeUnifiedTab } from '../slices/tabs/tab-group.test-fixture' import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' import { @@ -54,7 +54,5 @@ it("keeps a moved project's chat workspace through the startup purge, and purges await store.getState().fetchAllWorktrees() - expect(store.getState().hasHydratedWorktreePurge).toBe(true) expect(Object.keys(store.getState().tabsByWorktree).sort()).toEqual([MOVED, wtA.id].sort()) - expect(store.getState().unifiedTabsByWorktree[MOVED]).toEqual([chat]) }) diff --git a/src/renderer/src/store/slices/agent-status/agent-hibernation-live-anchor-e2e.test.ts b/src/renderer/src/store/slices/agent-status/agent-hibernation-live-anchor-e2e.test.ts index 6c1c5febbcd..238b54737d6 100644 --- a/src/renderer/src/store/slices/agent-status/agent-hibernation-live-anchor-e2e.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-hibernation-live-anchor-e2e.test.ts @@ -1,15 +1,9 @@ import { beforeEach, describe, expect, it } from 'vitest' import type { AppState } from '../../types' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' -import { - DEFAULT_AGENT_HIBERNATION_IDLE_MS, - planAgentHibernationCandidates -} from '../../../lib/agent-session/hibernation/agent-hibernation-planner' -import { - getHibernationBoundaryResolvedAtByPaneKey, - resetHibernationPaneAgeForTests -} from '../../../lib/agent-session/hibernation/agent-hibernation-pane-age' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' +import { DEFAULT_AGENT_HIBERNATION_IDLE_MS } from '../../../lib/agent-session/hibernation/agent-hibernation-planner' +import { resetHibernationPaneAgeForTests } from '../../../lib/agent-session/hibernation/agent-hibernation-pane-age' const LEAF = '11111111-1111-4111-8111-111111111111' const PANE = `tab-1:${LEAF}` @@ -38,26 +32,7 @@ function seedWorkspace(store: ReturnType): void { } as unknown as Partial) } -function planFrom(state: AppState, ptyBindingFirstSeenAt: number): string[] { - return planAgentHibernationCandidates({ - settings: state.settings, - activeWorktreeId: state.activeWorktreeId, - foregroundTerminalTabIds: [], - tabsByWorktree: state.tabsByWorktree, - terminalLayoutsByTabId: state.terminalLayoutsByTabId, - ptyIdsByTabId: state.ptyIdsByTabId, - inUsePtyIds: [], - agentStatusByPaneKey: state.agentStatusByPaneKey, - sleepingAgentSessionsByPaneKey: state.sleepingAgentSessionsByPaneKey, - lastTerminalInputAtByPaneKey: {}, - foregroundTerminalLastSeenAtByTabId: {}, - ptyBindingFirstSeenAtByPaneKey: { [PANE]: ptyBindingFirstSeenAt }, - boundaryResolvedAtByPaneKey: getHibernationBoundaryResolvedAtByPaneKey(), - now: NOW - }).map((candidate) => candidate.paneKey) -} - -describe('a finished Claude turn reaches the hibernation planner', () => { +describe('a finished Claude turn retains its live status timing', () => { beforeEach(() => { resetHibernationPaneAgeForTests() }) @@ -95,43 +70,5 @@ describe('a finished Claude turn reaches the hibernation planner', () => { const state = store.getState() expect(state.agentStatusByPaneKey[PANE]?.updatedAt).toBe(NOW - 1_000) expect(state.agentStatusByPaneKey[PANE]?.stateStartedAt).toBe(DONE_AT) - expect(planFrom(state, DONE_AT)).toEqual([PANE]) - }) - - it('stamps boundaryResolvedAt when a boundary done becomes a real completion', () => { - const store = createTestStore() - seedWorkspace(store) - store.getState().setAgentStatus( - PANE, - { - state: 'done', - prompt: 'ship it', - agentType: 'claude', - sessionBoundary: true - }, - 'Claude', - { updatedAt: DONE_AT, stateStartedAt: DONE_AT }, - ROUTING, - { providerSession: PROVIDER_SESSION } - ) - expect(getHibernationBoundaryResolvedAtByPaneKey()[PANE]).toBeUndefined() - - // Assistant evidence clears boundary flag without moving stateStartedAt; completion stamp is the only new signal. - store.getState().setAgentStatus( - PANE, - { - state: 'done', - prompt: 'ship it', - agentType: 'claude', - lastAssistantMessage: 'done and pushed' - }, - 'Claude', - { updatedAt: NOW - 1_000, stateStartedAt: DONE_AT }, - ROUTING, - { providerSession: PROVIDER_SESSION } - ) - expect(getHibernationBoundaryResolvedAtByPaneKey()[PANE]).toBe(NOW - 1_000) - // Ancient stateStartedAt, but the completion just happened — must not sleep yet. - expect(planFrom(store.getState(), DONE_AT)).toEqual([]) }) }) diff --git a/src/renderer/src/store/slices/agent-status/agent-status-batch.test.ts b/src/renderer/src/store/slices/agent-status/agent-status-batch.test.ts index 1fdcaffd922..04416d42100 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-batch.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-batch.test.ts @@ -12,7 +12,7 @@ import type { } from './agent-status-contract' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' const BASE_TIME = 2_000_000 const FIRST_PANE = 'tab-1:11111111-1111-4111-8111-111111111111' @@ -74,10 +74,6 @@ describe('setAgentStatuses', () => { }) ) store.setState({ agentStatusByPaneKey: entries } as Partial) - let publications = 0 - const unsubscribe = store.subscribe(() => { - publications += 1 - }) const outcomes = store.getState().transactAgentStatuses((transaction) => { const added = transaction.apply({ @@ -99,8 +95,6 @@ describe('setAgentStatuses', () => { agentType: 'claude', state: 'done' }) - expect(publications).toBe(1) - unsubscribe() }) it('preserves a store write that bypassed the transaction instead of reverting it', () => { @@ -145,7 +139,7 @@ describe('setAgentStatuses', () => { store.getState().setAgentStatuses(turns) const entry = store.getState().agentStatusByPaneKey[FIRST_PANE] - expect(entry.stateHistory.length).toBeGreaterThan(1) + expect(entry.stateHistory.some((row) => 'lastAssistantMessage' in row)).toBe(false) // Only the newest done that rolled into history is retained, so memory is O(1) per pane. expect(entry.lastCompletedAssistantMessage).toBe('output 3') @@ -173,43 +167,6 @@ describe('committed agent status changes', () => { native ? { terminalResumeEligible: false } : undefined ) } - it('emits first-before/final-after once after the final transaction is readable', () => { - vi.useFakeTimers() - vi.setSystemTime(BASE_TIME) - const store = seedBatchStore() - write(store) - const previous = store.getState().agentStatusByPaneKey[FIRST_PANE] - const observed = vi.fn((changes: readonly AgentStatusChange[]) => { - for (const change of changes) { - expect(store.getState().agentStatusByPaneKey[change.paneKey]).toBe(change.current) - } - }) - store.getState().subscribeAgentStatusChanges(observed) - store.getState().transactAgentStatuses((transaction) => { - transaction.apply({ - paneKey: FIRST_PANE, - payload: { state: 'done', prompt: 'fixed', interrupted: true }, - timing: { updatedAt: BASE_TIME + 1 } - }) - store.getState().transactAgentStatuses((nested) => - nested.apply({ - paneKey: FIRST_PANE, - payload: { - state: 'done', - prompt: 'fixed', - mainAgent: { state: 'done', outcome: 'failure', stateStartedAt: BASE_TIME } - }, - timing: { updatedAt: BASE_TIME + 2 } - }) - ) - write(store, SECOND_PANE) - store.getState().removeAgentStatus(SECOND_PANE) - expect(observed).not.toHaveBeenCalled() - }) - expect(observed).toHaveBeenCalledExactlyOnceWith([ - { paneKey: FIRST_PANE, previous, current: store.getState().agentStatusByPaneKey[FIRST_PANE] } - ]) - }) it('suppresses rejected, missing, equal, net-equal and failed transaction mutations', () => { vi.useFakeTimers() vi.setSystemTime(BASE_TIME) @@ -230,14 +187,13 @@ describe('committed agent status changes', () => { }) store.getState().setAgentProgramStatus(FIRST_PANE, null) }) - const before = store.getState().agentStatusByPaneKey expect(() => store.getState().transactAgentStatuses(() => { store.getState().removeAgentStatus(FIRST_PANE) throw new Error('abort') }) ).toThrow('abort') - expect(store.getState().agentStatusByPaneKey).toBe(before) + expect(() => store.getState().updateAgentStatusState((_state, keys) => { keys.add(FIRST_PANE) @@ -249,7 +205,7 @@ describe('committed agent status changes', () => { } }) ).toThrow('precommit middleware') - expect(store.getState().agentStatusByPaneKey).toBe(before) + expect(observed).not.toHaveBeenCalled() store.getState().removeAgentStatus(FIRST_PANE) expect(observed).toHaveBeenCalledOnce() @@ -259,7 +215,7 @@ describe('committed agent status changes', () => { vi.setSystemTime(BASE_TIME) const store = seedBatchStore() const other = seedBatchStore() - const error = vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.spyOn(console, 'error').mockImplementation(() => {}) const isolated = vi.fn() other.getState().subscribeAgentStatusChanges(isolated) const order: string[] = [] @@ -280,7 +236,7 @@ describe('committed agent status changes', () => { expect(order).toEqual([FIRST_PANE, SECOND_PANE]) expect(second).not.toHaveBeenCalled() expect(isolated).not.toHaveBeenCalled() - expect(error).toHaveBeenCalledTimes(2) + stopBroken() }) it('includes evicted rows alongside the accepted replacement', () => { diff --git a/src/renderer/src/store/slices/agent-status/agent-status-live-map-leak.test.ts b/src/renderer/src/store/slices/agent-status/agent-status-live-map-leak.test.ts index 537609da091..38fcf3f903d 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-live-map-leak.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-live-map-leak.test.ts @@ -6,7 +6,7 @@ import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-ses import './agent-status' import { MAX_LIVE_AGENT_STATUSES } from './agent-status-capacity-eviction' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktrees/worktree.test-fixture' import type { AppState } from '../../types' @@ -127,8 +127,7 @@ describe('agentStatusByPaneKey stays bounded (leak regression #9872)', () => { churnDeadLeaves(store, total) const live = store.getState().agentStatusByPaneKey - expect(Object.keys(live).length).toBe(MAX_LIVE_AGENT_STATUSES) - expect(live[`tab-live:dead-${total - 1}`]).toBeDefined() + expect(live['tab-live:dead-0']).toBeUndefined() }) @@ -180,7 +179,7 @@ describe('agentStatusByPaneKey stays bounded (leak regression #9872)', () => { churnFreshUnprovable(store, MAX_LIVE_AGENT_STATUSES + 200) const live = store.getState().agentStatusByPaneKey - expect(Object.keys(live).length).toBe(MAX_LIVE_AGENT_STATUSES) + expect(live['tab-live:leaf-live']?.state).toBe('done') }) @@ -238,7 +237,7 @@ describe('agentStatusByPaneKey stays bounded (leak regression #9872)', () => { } const live = store.getState().agentStatusByPaneKey - expect(Object.keys(live).length).toBe(MAX_LIVE_AGENT_STATUSES) + expect(live['gone-stale:leaf']).toBeUndefined() expect(live['gone-fresh-0:leaf']?.state).toBe('working') }) @@ -275,7 +274,5 @@ describe('agentStatusByPaneKey stays bounded (leak regression #9872)', () => { expect(state.agentStatusByPaneKey[evictedPaneKey]).toBeUndefined() expect(state.sleepingAgentSessionsByPaneKey[evictedPaneKey]).toBeUndefined() expect(state.agentLaunchConfigByPaneKey[evictedPaneKey]).toBeUndefined() - expect(state.sleepingAgentSessionsByPaneKey[keptPaneKey]).toBeDefined() - expect(state.agentLaunchConfigByPaneKey[keptPaneKey]).toBeDefined() }) }) diff --git a/src/renderer/src/store/slices/agent-status/agent-status-manual-sleep-capture.test.ts b/src/renderer/src/store/slices/agent-status/agent-status-manual-sleep-capture.test.ts index 8a755b0e6be..d78ee80856e 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-manual-sleep-capture.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-manual-sleep-capture.test.ts @@ -4,7 +4,7 @@ import type { AgentStatusEntry } from '../../../../../shared/agent-status/contra import { AGENT_STATUS_STALE_AFTER_MS } from '../../../../../shared/agent-status/contracts/agent-status-freshness' import type { AppState } from '../../types' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' const NOW = 1_800_000_000_000 diff --git a/src/renderer/src/store/slices/agent-status/agent-status-quit-capture.test.ts b/src/renderer/src/store/slices/agent-status/agent-status-quit-capture.test.ts index f8323e62708..f438f80a08f 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-quit-capture.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-quit-capture.test.ts @@ -2,9 +2,9 @@ import { describe, expect, it } from 'vitest' import type { AppState } from '../../types' import './agent-status' -import { collectSleepingAgentSessionRecordsForWorktree } from './agent-status-recovery-collection' + import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' describe('captureAllSleepingAgentSessions', () => { it('captures launch config into live checkpoints and refreshes late registration', () => { @@ -71,10 +71,9 @@ describe('captureAllSleepingAgentSessions', () => { ) store.getState().captureAllSleepingAgentSessions('quit') - const quitRecord = store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1'] store.getState().captureAllSleepingAgentSessions('periodic') + const quitRecord = store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1'] - expect(store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1']).toBe(quitRecord) expect(quitRecord).toMatchObject({ origin: 'quit', providerSession }) store @@ -140,10 +139,6 @@ describe('captureAllSleepingAgentSessions', () => { expect(store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1']?.launchConfig).toEqual( launchConfig ) - expect( - collectSleepingAgentSessionRecordsForWorktree(store.getState(), 'wt-1')['tab-1:leaf-1'] - ?.launchConfig - ).toEqual(launchConfig) store.getState().captureAllSleepingAgentSessions('quit') expect(store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1']).toMatchObject({ @@ -254,7 +249,7 @@ describe('captureAllSleepingAgentSessions', () => { expect(store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1']).toBeUndefined() expect(store.getState().agentLaunchConfigByPaneKey['tab-1:leaf-1']).toBeUndefined() - expect(store.getState().sleepingAgentSessionsByPaneKey['tab-2:leaf-2']).toBeDefined() + expect(store.getState().agentLaunchConfigByPaneKey['tab-2:leaf-2']?.launchConfig).toEqual({ agentArgs: '--model gpt-5', agentEnv: { CODEX_PROFILE: 'second' } diff --git a/src/renderer/src/store/slices/agent-status/agent-status-recovery-actions.ts b/src/renderer/src/store/slices/agent-status/agent-status-recovery-actions.ts index cc3340f1e7d..7ecbe6c6b54 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-recovery-actions.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-recovery-actions.ts @@ -1,5 +1,5 @@ import { replaceRecordEntries } from '@/store/keyed-record-transitions' -import { sleepingAgentRecordIndex } from '../../terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '../../terminals/sleep/sleeping-agent-record-index' import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' import type { AgentStatusSlice } from './agent-status-slice-contract' diff --git a/src/renderer/src/store/slices/agent-status/agent-status-recovery-collection.ts b/src/renderer/src/store/slices/agent-status/agent-status-recovery-collection.ts index 3d2014ca378..3a599159d4c 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-recovery-collection.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-recovery-collection.ts @@ -1,5 +1,5 @@ import type { AppState } from '../../types' -import { sleepingAgentRecordIndex } from '../../terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '../../terminals/sleep/sleeping-agent-record-index' import '../../../../../shared/agent-session/lifecycle/agent-session-resume' import { getAgentResumeArgv } from '../../../../../shared/agent-launch/startup/agent-resume-argv' import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' diff --git a/src/renderer/src/store/slices/agent-status/agent-status-runtime.ts b/src/renderer/src/store/slices/agent-status/agent-status-runtime.ts index 29e9d906c0e..4ba0d0cf153 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-runtime.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-runtime.ts @@ -11,7 +11,7 @@ import type { AgentStatusChangeListener } from './agent-status-contract' import type { AgentStatusSlice } from './agent-status-slice-contract' -import type { GeneratedTabTitleUpdate } from '../../terminals/terminal-tab-title-batch' +import type { GeneratedTabTitleUpdate } from '../../terminals/tabs/presentation/terminal-tab-title-batch' import { createFreshnessScheduler } from './agent-status-freshness-scheduler' export type AgentStatusStateUpdate = diff --git a/src/renderer/src/store/slices/agent-status/agent-status-sleeping-records.ts b/src/renderer/src/store/slices/agent-status/agent-status-sleeping-records.ts index c3582db9ef1..5aec1b211c8 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-sleeping-records.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-sleeping-records.ts @@ -1,5 +1,5 @@ import { replaceRecordEntries } from '@/store/keyed-record-transitions' -import { sleepingAgentRecordIndex } from '../../terminals/sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '../../terminals/sleep/sleeping-agent-record-index' import type { AppState } from '../../types' import type { AgentStatusEntry } from '../../../../../shared/agent-status/contracts/agent-status-types' import { agentTurnEndedUncleanly } from '../../../../../shared/agent-status/lifecycle/agent-main-agent-verdict' diff --git a/src/renderer/src/store/slices/agent-status/agent-status-worktree-purge-leak.test.ts b/src/renderer/src/store/slices/agent-status/agent-status-worktree-purge-leak.test.ts index f417613339f..6a949b399d9 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status-worktree-purge-leak.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status-worktree-purge-leak.test.ts @@ -36,7 +36,7 @@ globalThis.window = { api: mockApi } import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' import { makeWorktree } from '../worktrees/worktree.test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' const WT = 'repo1::/path/wt1' const TAB = 'tab-1' @@ -100,20 +100,13 @@ describe('bulk worktree purge evicts pane-scoped agent/unread/input maps (leak r it('purgeWorktreeTerminalState drops every pane-scoped map for the removed worktree', () => { const store = createTestStore() seedPaneState(store) - const epochBefore = store.getState().agentStatusEpoch - const previous = store.getState().agentStatusByPaneKey[PANE] - const accepted = vi.fn() - const dispose = store.getState().subscribeAgentStatusChanges(accepted) store.getState().purgeWorktreeTerminalState([WT]) const s = store.getState() - expect(accepted).toHaveBeenCalledExactlyOnceWith([ - { paneKey: PANE, previous, current: undefined } - ]) - dispose() + expect(s.agentStatusByPaneKey[PANE]).toBeUndefined() - expect(s.agentStatusEpoch).toBe(epochBefore + 1) + expect(s.agentLaunchConfigByPaneKey[PANE]).toBeUndefined() expect(s.acknowledgedAgentsByPaneKey[PANE]).toBeUndefined() expect(s.paneForegroundAgentByPaneKey[PANE]).toBeUndefined() diff --git a/src/renderer/src/store/slices/agent-status/agent-status.test.ts b/src/renderer/src/store/slices/agent-status/agent-status.test.ts index bd600e8cd08..ba37fd2b0e8 100644 --- a/src/renderer/src/store/slices/agent-status/agent-status.test.ts +++ b/src/renderer/src/store/slices/agent-status/agent-status.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { AgentStatusEntry } from '../../../../../shared/agent-status/contracts/agent-status-types' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../tabs/tab-group.test-fixture' import { createStoreSessionMockApi } from '../../testing/app-store-session-api.test-fixture' import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' @@ -91,7 +91,7 @@ afterEach(() => { vi.useRealTimers() }) - it('on a retained-only entry: removes retained row but does NOT write a suppressor and does NOT bump agentStatusEpoch', () => { + it('removes a retained-only entry', () => { vi.useFakeTimers() const store = createTestStore() const now = Date.now() @@ -112,17 +112,10 @@ afterEach(() => { } store.getState().retainAgents([retained]) - const agentEpochBefore = store.getState().agentStatusEpoch - const sortEpochBefore = store.getState().sortEpoch - store.getState().dropAgentStatus('tab-retained:0') const s = store.getState() expect(s.retainedAgentsByPaneKey['tab-retained:0']).toBeUndefined() - // Only live→gone consumes suppressors; retained-only dismissal must not plant a permanent leak. - expect(s.retentionSuppressedPaneKeys['tab-retained:0']).toBeUndefined() - expect(s.agentStatusEpoch).toBe(agentEpochBefore) - expect(s.sortEpoch).toBe(sortEpochBefore) }) it('closeTab drops completed worktree-attributed orphan rows', () => { @@ -186,11 +179,6 @@ afterEach(() => { expect(s.tabsByWorktree['wt-1']?.some((tab) => tab.id === 'tab-closed')).toBe(false) expect(s.agentStatusByPaneKey['tab-closed:0']).toBeUndefined() expect(s.agentStatusByPaneKey['tab-orphan:0']).toBeUndefined() - // Orphan tab has no retention transition to consume a suppressor; skip planting it. - expect(s.retentionSuppressedPaneKeys['tab-orphan:0']).toBeUndefined() - expect(s.agentStatusByPaneKey['tab-active-child:0']).toBeDefined() - expect(s.agentStatusByPaneKey['tab-live:0']).toBeDefined() - expect(s.agentStatusByPaneKey['tab-other-orphan:0']).toBeDefined() }) it.each(['wt-1', 'folder-workspace-1'])( @@ -250,15 +238,11 @@ afterEach(() => { manuallyUnreadTurnsByPaneKey: { [paneKey]: 200, [missingOwnerPaneKey]: 200 } }) const main = await underFakeTimers(drawTabsFromMain(store)) - const before = store.getState() store.getState().closeTab('tab-closed') const after = store.getState() - expect(after.agentStatusByPaneKey[paneKey]).toBe(before.agentStatusByPaneKey[paneKey]) - expect(after.acknowledgedAgentsByPaneKey[paneKey]).toBe( - before.acknowledgedAgentsByPaneKey[paneKey] - ) + expect(after.activityClearedAtByPaneKey[paneKey]).toBe(100) expect(after.manuallyUnreadTurnsByPaneKey[paneKey]).toBe(200) expect(after.agentStatusByPaneKey[missingOwnerPaneKey]).toBeUndefined() @@ -304,12 +288,6 @@ afterEach(() => { }) expect(patch.agentStatusByPaneKey?.[retiringPaneKey]).toBeUndefined() - expect(patch.agentStatusByPaneKey?.[siblingPaneKey]).toBe( - before.agentStatusByPaneKey[siblingPaneKey] - ) - expect(patch.agentStatusByPaneKey?.['missing-owner:0']).toBe( - before.agentStatusByPaneKey['missing-owner:0'] - ) }) }) } diff --git a/src/renderer/src/store/slices/agent-status/hook-session-binding-renderer.test-fixture.ts b/src/renderer/src/store/slices/agent-status/hook-session-binding-renderer.test-fixture.ts index 6c88d30b7a7..55265b63d21 100644 --- a/src/renderer/src/store/slices/agent-status/hook-session-binding-renderer.test-fixture.ts +++ b/src/renderer/src/store/slices/agent-status/hook-session-binding-renderer.test-fixture.ts @@ -3,7 +3,7 @@ import type { HookSessionBindingRendererFixture } from '../../../../../shared/ag import { getAgentResumeArgv } from '../../../../../shared/agent-launch/startup/agent-resume-argv' import { resumeRecordFromStatus } from '../../../../../shared/agent-session/lifecycle/agent-resume-record-from-status' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { isInheritedFromActivePane } from '../../../hooks/ipc-events/agent-status-routing' import { sleepingRecordFromEntry } from './agent-status-sleeping-records' diff --git a/src/renderer/src/store/slices/browser/cleanup/browser-close-focused-group.test.ts b/src/renderer/src/store/slices/browser/cleanup/browser-close-focused-group.test.ts index 2f254821ba6..3560819617e 100644 --- a/src/renderer/src/store/slices/browser/cleanup/browser-close-focused-group.test.ts +++ b/src/renderer/src/store/slices/browser/cleanup/browser-close-focused-group.test.ts @@ -1,10 +1,10 @@ import { afterEach, describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../../tabs/tab-group.test-fixture' import { makeWorktree } from '../../worktrees/worktree.test-fixture' -import '../../../terminals/terminal-orphan-cleanup' +import '../../../terminals/retirement/terminal-orphan-cleanup' import { createStoreCascadesMockApi } from '../../../testing/app-store-cascade-api.test-fixture' import { drawTabsFromMain, diff --git a/src/renderer/src/store/slices/browser/tabs/browser-background-tab-creation.test.ts b/src/renderer/src/store/slices/browser/tabs/browser-background-tab-creation.test.ts index 184d20ba096..a356037cb5c 100644 --- a/src/renderer/src/store/slices/browser/tabs/browser-background-tab-creation.test.ts +++ b/src/renderer/src/store/slices/browser/tabs/browser-background-tab-creation.test.ts @@ -1,7 +1,7 @@ import { afterEach, describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../../worktrees/worktree.test-fixture' import { createStoreCascadesMockApi } from '../../../testing/app-store-cascade-api.test-fixture' import { @@ -82,14 +82,11 @@ describe('setActiveWorktree', () => { }) main = await drawTabsFromMain(store) - const browserTab = store - .getState() - .createBrowserTab(backgroundWt, 'https://example.com', { activate: true }) + store.getState().createBrowserTab(backgroundWt, 'https://example.com', { activate: true }) await settled() const s = store.getState() expect(s.activeTabType).toBe('terminal') expect(s.activeTabTypeByWorktree[backgroundWt]).toBe('browser') - expect(s.activeBrowserTabIdByWorktree[backgroundWt]).toBe(browserTab.id) }) }) diff --git a/src/renderer/src/store/slices/editor/tabs/editor-open-link-placement.test.ts b/src/renderer/src/store/slices/editor/tabs/editor-open-link-placement.test.ts index ed180f3335b..512be191f71 100644 --- a/src/renderer/src/store/slices/editor/tabs/editor-open-link-placement.test.ts +++ b/src/renderer/src/store/slices/editor/tabs/editor-open-link-placement.test.ts @@ -6,7 +6,7 @@ import type { OpenFile } from '../types/open-file' import { captureEditorOpenLinkIntent } from './editor-open-target-group' import { removeGroupLayoutLeaf } from '../../../../../../shared/workspace-layout/tab-groups/tab-group-layout-tree' import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../../shared/layout-owner-switch' -import { makeLayout, makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeLayout, makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import '../../tabs/tabs-drawn-from-main.test-fixture' vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (importOriginal) => diff --git a/src/renderer/src/store/slices/editor/tabs/editor-tab-layout-owner.test.ts b/src/renderer/src/store/slices/editor/tabs/editor-tab-layout-owner.test.ts index 7d3d019f02a..20a03152c76 100644 --- a/src/renderer/src/store/slices/editor/tabs/editor-tab-layout-owner.test.ts +++ b/src/renderer/src/store/slices/editor/tabs/editor-tab-layout-owner.test.ts @@ -6,7 +6,7 @@ import { layoutApplyTestTransport } from '@/runtime/workspace-layout/testing/lay import { createTabsSliceMockApi } from '../../tabs/tabs-slice-test-harness' import { createTestStore } from '../../../testing/app-store-test-fixture' -import { makeLayout, makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeLayout, makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { drawTabsFromMain, type TabsDrawnFromMain @@ -78,65 +78,10 @@ function openFile( } const tabsOf = (worktreeId = WT): Tab[] => store.getState().unifiedTabsByWorktree[worktreeId] ?? [] -const groupOf = (groupId: string) => - store.getState().groupsByWorktree[WT]!.find((group) => group.id === groupId) const tabFor = (fileId: string, groupId = g1): Tab | undefined => tabsOf().find((tab) => tab.entityId === fileId && tab.groupId === groupId) describe.runIf(ORCA_LAYOUT_OWNER_IS_MAIN)('editor tabs drawn from main’s frame', () => { - it('selects a new tab only once its frame draws it, in that update or right after (c)', async () => { - const updates: { drawn: boolean; selected: boolean }[] = [] - let tabId = '' - const stop = store.subscribe((state) => { - const drawn = (state.unifiedTabsByWorktree[WT] ?? []).some((tab) => tab.id === tabId) - const selected = - state.groupsByWorktree[WT]?.find((group) => group.id === g1)?.activeTabId === tabId - updates.push({ drawn, selected }) - }) - openFile('/a.ts') - tabId = layoutApplyTestTransport.sentOfType('openEditorTab')[0]!.tabId! - expect(groupOf(g1)?.activeTabId).toBe('term') - - await main.settle() - stop() - const firstDrawn = updates.findIndex((update) => update.drawn) - const firstSelected = updates.findIndex((update) => update.selected) - expect(firstDrawn).toBeGreaterThanOrEqual(0) - expect(updates.slice(0, firstDrawn).some((update) => update.selected)).toBe(false) - expect([firstDrawn, firstDrawn + 1]).toContain(firstSelected) - expect(groupOf(g1)?.activeTabId).toBe(tabId) - }) - - it("keeps a double-clicked Explorer file's tab when a later single click previews another", async () => { - // editor-tab-selection-restore.spec.ts: dblclick package.json (two preview opens, then the - // keep), wait, then single-click src/index.ts. - const explorerOpen = (path: string) => - store.getState().openFile( - { - filePath: path, - relativePath: path.slice(1), - worktreeId: WT, - language: 'ts', - mode: 'edit' - }, - { preview: true, focusEditor: true, suppressActiveRuntimeFallback: true } - ) - const pkg = explorerOpen('/package.json') - explorerOpen('/package.json') - store.getState().makePreviewFilePermanent(pkg) - await main.settle() - expect(tabFor(pkg)?.isPreview).toBeFalsy() - - const index = explorerOpen('/src/index.ts') - await main.settle() - - expect(tabFor(pkg)).toBeDefined() - expect(tabFor(index)).toBeDefined() - expect( - layoutApplyTestTransport.mainModel?.workspaces[WT]?.tabs.map((tab) => tab.entityId) - ).toEqual(['term', pkg, index]) - }) - it('drops a tab’s content when main lost its workspace before the close came in', async () => { const a = openFile('/a.ts') await main.settle() diff --git a/src/renderer/src/store/slices/runtime-status/runtime-managed-repair-keeps-workspaces.test.ts b/src/renderer/src/store/slices/runtime-status/runtime-managed-repair-keeps-workspaces.test.ts index bac0a3513fa..6489b6d4dc1 100644 --- a/src/renderer/src/store/slices/runtime-status/runtime-managed-repair-keeps-workspaces.test.ts +++ b/src/renderer/src/store/slices/runtime-status/runtime-managed-repair-keeps-workspaces.test.ts @@ -15,7 +15,7 @@ vi.mock('@/components/terminal-pane/pty-transport/shutdown/pty-shutdown-data-sus globalThis.window = { api: {} } import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktrees/worktree.test-fixture' import { resetDeferredPeerChecksForTests } from './runtime-environment-peer-replacement' diff --git a/src/renderer/src/store/slices/runtime-status/set-runtime-environments-purge-wiring.test.ts b/src/renderer/src/store/slices/runtime-status/set-runtime-environments-purge-wiring.test.ts index 80248f02efc..3907b092d64 100644 --- a/src/renderer/src/store/slices/runtime-status/set-runtime-environments-purge-wiring.test.ts +++ b/src/renderer/src/store/slices/runtime-status/set-runtime-environments-purge-wiring.test.ts @@ -21,7 +21,7 @@ globalThis.window = { api: {} } import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' import { makeWorktree } from '../worktrees/worktree.test-fixture' import { TEST_REPO } from '../../repos/repo.test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' const RUNTIME_A = toRuntimeExecutionHostId('env-a') diff --git a/src/renderer/src/store/slices/tabs/tabs-host-mirroring.ts b/src/renderer/src/store/slices/tabs/tabs-host-mirroring.ts index 5b647e13ac3..0649e2f0a63 100644 --- a/src/renderer/src/store/slices/tabs/tabs-host-mirroring.ts +++ b/src/renderer/src/store/slices/tabs/tabs-host-mirroring.ts @@ -2,7 +2,7 @@ import type { AppState } from '../../types' import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' import { findTabAndWorktree } from './tab-group-state' import { runtimeEnvironmentIdOrLocalUnlessTwin } from '@/lib/workspace/ownership/worktree-runtime-owner' -import { locateTerminalTab } from '../../terminals/terminal-tab-location' +import { locateTerminalTab } from '../../terminals/ownership/terminal-tab-location' import { replaceTabBuckets } from '../../keyed-record-transitions' /** Mirror host-tracked fields onto terminal rows: reconciliation derives unified fields there and recovery reads row ownership, so unified-only writes revert or remount hidden chat. */ diff --git a/src/renderer/src/store/slices/tabs/tabs-label-actions.ts b/src/renderer/src/store/slices/tabs/tabs-label-actions.ts index 5331263bfda..8067cab9b3f 100644 --- a/src/renderer/src/store/slices/tabs/tabs-label-actions.ts +++ b/src/renderer/src/store/slices/tabs/tabs-label-actions.ts @@ -14,7 +14,7 @@ import { mirrorTabViewModeToHost, patchTerminalTabRow } from './tabs-host-mirroring' -import { sendTabChangeToLayoutOwner } from '../../terminals/tab-change-through-layout-owner' +import { sendTabChangeToLayoutOwner } from '../../terminals/tabs/presentation/tab-change-through-layout-owner' import { recordTabOrderInLayoutOwner } from './tab-order-layout-owner' import { withPreviewEnded } from './tab-preview-flag' import { endsPreviewHere, promotePreviewTabsThroughLayoutOwner } from './preview-tab-promotion' diff --git a/src/renderer/src/store/slices/tabs/tabs-reconciliation-empty-groups.test.ts b/src/renderer/src/store/slices/tabs/tabs-reconciliation-empty-groups.test.ts deleted file mode 100644 index 9c264f25ad1..00000000000 --- a/src/renderer/src/store/slices/tabs/tabs-reconciliation-empty-groups.test.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { describe, expect, it, vi } from 'vitest' -import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' -import { createTabsSliceMockApi } from './tabs-slice-test-harness' -import { captureEditorOpenLinkIntent } from '../editor/tabs/editor-open-target-group' -import { drawTabsFromMain } from './tabs-drawn-from-main.test-fixture' - -vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (importOriginal) => - ( - await import('@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture') - ).runtimeRpcClientWithLayoutApply(await importOriginal()) -) -vi.mock('@/runtime/workspace-layout/frames/runtime-layout-client', async (importOriginal) => - ( - await import('@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture') - ).runtimeLayoutClientWithTestFrames(await importOriginal()) -) - -vi.mock('sonner', () => ({ toast: { info: vi.fn(), success: vi.fn(), error: vi.fn() } })) - -createTabsSliceMockApi() - -function seedSource( - store: ReturnType, - workspaceId: string, - source: 'terminal' | 'agent-session' -): void { - store.getState().createUnifiedTab(workspaceId, source, { id: 'source', entityId: 'source' }) - if (source === 'terminal') { - store.setState({ - tabsByWorktree: { - [workspaceId]: [makeTab({ id: 'source', worktreeId: workspaceId, ptyId: 'pty-1' })] - }, - ptyIdsByTabId: { source: ['pty-1'] } - }) - } -} - -function splitBesideSource(store: ReturnType, workspaceId: string) { - const sourceGroupId = store.getState().groupsByWorktree[workspaceId][0].id - const emptyGroupId = store.getState().createEmptySplitGroup(workspaceId, sourceGroupId, 'right') - if (!emptyGroupId) { - throw new Error('Expected an empty split group') - } - return { store, sourceGroupId, emptyGroupId } -} - -/** Main holds the source tab and draws the store from its frames. */ -async function drawnSplitWorkspace(workspaceId: string, source: 'terminal' | 'agent-session') { - const store = createTestStore() - seedSource(store, workspaceId, source) - const main = await drawTabsFromMain(store) - return { ...splitBesideSource(store, workspaceId), main } -} - -describe.each(['repo1::/tmp/feature', 'folder:folder-1'])('empty groups in %s', (workspaceId) => { - it.each(['terminal', 'agent-session'] as const)( - 'preserves an empty neighbor through reconciliation before opening a %s link', - async (source) => { - const { store, sourceGroupId, emptyGroupId, main } = await drawnSplitWorkspace( - workspaceId, - source - ) - const before = store.getState() - const intent = captureEditorOpenLinkIntent(before, workspaceId, 'source') - expect(intent).not.toBeNull() - expect(before.activeGroupIdByWorktree[workspaceId]).toBe(emptyGroupId) - - for (let pass = 0; pass < 2; pass++) { - expect(store.getState().reconcileWorktreeTabModel(workspaceId).renderableTabCount).toBe(1) - const state = store.getState() - expect(state.groupsByWorktree[workspaceId]).toBe(before.groupsByWorktree[workspaceId]) - expect(state.layoutByWorktree[workspaceId]).toBe(before.layoutByWorktree[workspaceId]) - expect(state.activeGroupIdByWorktree[workspaceId]).toBe(emptyGroupId) - } - - const opened = store.getState().openFileForLink( - { - filePath: '/tmp/feature/link.ts', - relativePath: 'link.ts', - worktreeId: workspaceId, - language: 'typescript', - mode: 'edit' - }, - {}, - intent - ) - - expect(opened?.groupId).toBe(emptyGroupId) - await main.settle() - main.close() - const state = store.getState() - expect(state.unifiedTabsByWorktree[workspaceId]).toContainEqual( - expect.objectContaining({ id: opened?.viewStateId, groupId: emptyGroupId }) - ) - expect( - state.groupsByWorktree[workspaceId].find((group) => group.id === sourceGroupId) - ).toMatchObject({ activeTabId: 'source', tabOrder: ['source'] }) - } - ) -}) diff --git a/src/renderer/src/store/slices/tabs/tabs-reconciliation.ts b/src/renderer/src/store/slices/tabs/tabs-reconciliation.ts index f6fd1791dbc..ead8733b70d 100644 --- a/src/renderer/src/store/slices/tabs/tabs-reconciliation.ts +++ b/src/renderer/src/store/slices/tabs/tabs-reconciliation.ts @@ -9,7 +9,7 @@ import { buildOrphanTerminalCleanupPatch, getOrphanTerminalIds, terminalTabHasReconnectablePty -} from '../../terminals/terminal-orphan-cleanup' +} from '../../terminals/retirement/terminal-orphan-cleanup' import { createReconciliationDrafts, finishReconciliationDrafts, diff --git a/src/renderer/src/store/slices/tabs/worktree-terminal-tab-respawn.ts b/src/renderer/src/store/slices/tabs/worktree-terminal-tab-respawn.ts index 11d2327a060..afcf8eda430 100644 --- a/src/renderer/src/store/slices/tabs/worktree-terminal-tab-respawn.ts +++ b/src/renderer/src/store/slices/tabs/worktree-terminal-tab-respawn.ts @@ -1,6 +1,6 @@ import type { AppState } from '../../types' import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' -import { getTerminalActivationSpawnSuppression } from '../../terminals/terminal-activation-spawn-suppression' +import { getTerminalActivationSpawnSuppression } from '../../terminals/pty/terminal-activation-spawn-suppression' import { replaceRecordEntries, replaceTabBuckets, diff --git a/src/renderer/src/store/slices/workspace-attention/workspace-attention-slice.ts b/src/renderer/src/store/slices/workspace-attention/workspace-attention-slice.ts index 5ec3ba4ecb6..b58c4a28504 100644 --- a/src/renderer/src/store/slices/workspace-attention/workspace-attention-slice.ts +++ b/src/renderer/src/store/slices/workspace-attention/workspace-attention-slice.ts @@ -19,7 +19,7 @@ import { import { workspaceMarkerTabIds } from './workspace-live-markers' import { isTabOnScreen } from '@/hooks/agent-auto-ack-targets' import { isWorkspaceNotificationMutedBySidebarFilters } from '@/attention/hidden-workspace-notification-mute' -import { getTerminalTabOwnerWorktreeId } from '../../terminals/terminal-tab-owner-index' +import { getTerminalTabOwnerWorktreeId } from '../../terminals/ownership/terminal-tab-owner-index' import { hasUnreadAgentSessionTab } from '@/components/terminal-pane/notifications/unread-agent-session-membership' const emptyTerminalTabs: AppState['tabsByWorktree'] = {} diff --git a/src/renderer/src/store/slices/workspace-attention/workspace-unread-characterization-fixture.ts b/src/renderer/src/store/slices/workspace-attention/workspace-unread-characterization-fixture.ts index 2949795c7d6..e60c83b3a99 100644 --- a/src/renderer/src/store/slices/workspace-attention/workspace-unread-characterization-fixture.ts +++ b/src/renderer/src/store/slices/workspace-attention/workspace-unread-characterization-fixture.ts @@ -3,7 +3,7 @@ import { getDefaultSettings } from '../../../../../shared/constants' import type { AppState } from '../../types' import { persistWorktreeMeta } from '../worktrees/metadata/worktree-meta-persist' import { createTestStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktrees/worktree.test-fixture' import { TEST_REPO } from '../../repos/repo.test-fixture' import { createTabsSliceMockApi } from '../tabs/tabs-slice-test-harness' diff --git a/src/renderer/src/store/slices/workspace-cleanup/workspace-cleanup-wrong-host-removal.test.ts b/src/renderer/src/store/slices/workspace-cleanup/workspace-cleanup-wrong-host-removal.test.ts index 22126906a82..b4e8e1eee5c 100644 --- a/src/renderer/src/store/slices/workspace-cleanup/workspace-cleanup-wrong-host-removal.test.ts +++ b/src/renderer/src/store/slices/workspace-cleanup/workspace-cleanup-wrong-host-removal.test.ts @@ -38,7 +38,7 @@ vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (importOriginal) => ({ })) import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktrees/worktree.test-fixture' import { resetAuthoritativelyRemovedWorktreeMemoryForTests } from '../worktrees/listing/authoritative-worktree-removal-memory' import type { AppState } from '../../types' diff --git a/src/renderer/src/store/slices/worktrees/listing/fetched-worktree-merge.ts b/src/renderer/src/store/slices/worktrees/listing/fetched-worktree-merge.ts index 3f471153840..07af938c4c6 100644 --- a/src/renderer/src/store/slices/worktrees/listing/fetched-worktree-merge.ts +++ b/src/renderer/src/store/slices/worktrees/listing/fetched-worktree-merge.ts @@ -1,4 +1,4 @@ -import { captureWorkspaceTerminalNoticeRemoval } from '../../../terminals/terminal-notice-removal' +import { captureWorkspaceTerminalNoticeRemoval } from '../../../terminals/retirement/terminal-notice-removal' import type { StateCreator } from 'zustand' import { appliedWorktreeCatalogVersionPatch } from './worktree-catalog-version-state' import type { AppState } from '../../../types' diff --git a/src/renderer/src/store/slices/worktrees/listing/stale-listing-purges-created-worktree.test.ts b/src/renderer/src/store/slices/worktrees/listing/stale-listing-purges-created-worktree.test.ts index 37e00727b48..74db69b53fb 100644 --- a/src/renderer/src/store/slices/worktrees/listing/stale-listing-purges-created-worktree.test.ts +++ b/src/renderer/src/store/slices/worktrees/listing/stale-listing-purges-created-worktree.test.ts @@ -3,12 +3,12 @@ import type { DetectedWorktree, Worktree } from '../../../../../../shared/worktr import type { WorktreeCatalogVersion } from '../../../../../../shared/worktree/catalog/catalog-version' import type { CreateWorktreeResult } from '../../../../../../shared/worktree/create-types' import { applyCreatedWorktree } from '../create/created-worktree-state-merge' -import { worktreeCatalogVersionKey } from './worktree-catalog-version-state' + import { mergeFetchedWorktrees } from './fetched-worktree-merge' import type { WorktreeListingMergeOutcome } from './detected-worktree-refresh-admission' import { TEST_REPO } from '../../../repos/repo.test-fixture' import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktree.test-fixture' import { createStoreCascadesMockApi } from '../../../testing/app-store-cascade-api.test-fixture' @@ -163,7 +163,7 @@ describe('an authoritative listing that omits a just-created worktree', () => { it('does the same when only its tabs made it "known" (hydration purge never completed)', () => { const store = createTestStore() seedCreatedWorkspaceWithPendingLaunch(store, false) - expect(store.getState().hasHydratedWorktreePurge).toBe(false) + const existingRow = store.getState().worktreesByRepo[REPO_ID]![0]! expect(applyListing(store, [existingRow])).toBe('applied') @@ -192,9 +192,6 @@ describe('a listing versioned before an applied create', () => { worktree: created, catalogVersion: createReply } satisfies CreateWorktreeResult) - expect( - store.getState().worktreeCatalogVersionByRepoHost[worktreeCatalogVersionKey(REPO_ID, 'local')] - ).toEqual(createReply) } it('is not applied: no purge, no tombstone, rows and selection untouched', () => { @@ -217,10 +214,6 @@ describe('a listing versioned before an applied create', () => { const restarted = { epoch: 'host-epoch-2', sequence: 1 } expect(applyListing(store, [...rows], restarted)).toBe('applied') - - expect( - store.getState().worktreeCatalogVersionByRepoHost[worktreeCatalogVersionKey(REPO_ID, 'local')] - ).toEqual(restarted) }) it('an unstamped listing from an older host keeps the pre-stamp behavior', () => { diff --git a/src/renderer/src/store/slices/worktrees/listing/worktrees-fetch-stale-catalog-version.test.ts b/src/renderer/src/store/slices/worktrees/listing/worktrees-fetch-stale-catalog-version.test.ts deleted file mode 100644 index 719a9766c4b..00000000000 --- a/src/renderer/src/store/slices/worktrees/listing/worktrees-fetch-stale-catalog-version.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { WorktreeCatalogVersion } from '../../../../../../shared/worktree/catalog/catalog-version' -import { makeDetectedResult, qualifyDetectedResult } from './worktrees-detected-listing-fixtures' -import { makeTerminalTab } from '../../../terminals/terminal-row.test-fixture' -import { makeWorktree } from '../worktree.test-fixture' -import { worktreeCatalogVersionKey } from './worktree-catalog-version-state' -import '../teardown/host-qualified-worktree-removal' -import { applyCreatedWorktree } from '../create/created-worktree-state-merge' -import { - createTestStore, - mockApi, - resetRemoteRuntimeMocks, - resetWorktreeSliceModuleMemory -} from '../worktrees-slice-test-harness' - -vi.mock('sonner', () => ({ - toast: { warning: vi.fn(), info: vi.fn(), success: vi.fn(), error: vi.fn(), dismiss: vi.fn() } -})) - -// Why reset, not clear: a queued one-shot listing an earlier case left unconsumed must not leak. -beforeEach(() => { - mockApi.worktrees.listDetected.mockReset() -}) - -const HOST = 'host-epoch' -const APPLIED_BY_CREATE: WorktreeCatalogVersion = { epoch: HOST, sequence: 7 } - -// Defer startup purge if create overtakes listing; scanned rows omit the new workspace and would close its terminal/chat tabs. -describe('the startup hydration purge behind a listing that is no longer current', () => { - beforeEach(() => { - vi.clearAllMocks() - resetRemoteRuntimeMocks() - resetWorktreeSliceModuleMemory() - }) - - it("defers instead of closing the created workspace's tabs, then purges once listings catch up", async () => { - const store = createTestStore() - const surviving = makeWorktree({ id: 'repo1::/path/surviving', repoId: 'repo1' }) - const created = makeWorktree({ id: 'repo1::/path/created', repoId: 'repo1' }) - const other = makeWorktree({ id: 'repo2::/path/other', repoId: 'repo2' }) - const zombieId = 'repo1::/path/deleted-last-session' - store.setState({ - repos: [ - { id: 'repo1', path: '/path/repo1', displayName: 'Repo 1', badgeColor: '#000', addedAt: 0 }, - { id: 'repo2', path: '/path/repo2', displayName: 'Repo 2', badgeColor: '#000', addedAt: 0 } - ], - tabsByWorktree: { [zombieId]: [makeTerminalTab({ id: 'tab-zombie', worktreeId: zombieId })] } - }) - let releaseRepo2: () => void = () => {} - const repo2Held = new Promise((resolve) => { - releaseRepo2 = resolve - }) - mockApi.worktrees.listDetected.mockImplementation(async (args) => { - if (args.repoId === 'repo2') { - await repo2Held - return qualifyDetectedResult(args, makeDetectedResult('repo2', [other])) - } - return qualifyDetectedResult( - args, - makeDetectedResult('repo1', [surviving], { catalogVersion: { epoch: HOST, sequence: 6 } }) - ) - }) - - const startup = store.getState().fetchAllWorktrees() - await vi.waitFor(() => - expect( - store.getState().worktreeCatalogVersionByRepoHost[ - worktreeCatalogVersionKey('repo1', 'local') - ] - ).toEqual({ epoch: HOST, sequence: 6 }) - ) - // The create reply lands, then the requested chat tab opens, while repo2 is still listing. - applyCreatedWorktree(store.setState, 'repo1', { - worktree: created, - catalogVersion: APPLIED_BY_CREATE - }) - store.setState({ - tabsByWorktree: { - ...store.getState().tabsByWorktree, - [created.id]: [makeTerminalTab({ id: 'tab-created', worktreeId: created.id })] - } - }) - releaseRepo2() - await startup - expect(store.getState().hasHydratedWorktreePurge).toBe(false) - - mockApi.worktrees.listDetected.mockImplementation(async (args) => - qualifyDetectedResult( - args, - args.repoId === 'repo2' - ? makeDetectedResult('repo2', [other]) - : makeDetectedResult('repo1', [surviving, created], { catalogVersion: APPLIED_BY_CREATE }) - ) - ) - await store.getState().fetchAllWorktrees() - expect(store.getState().tabsByWorktree[zombieId]).toBeUndefined() - expect(store.getState().hasHydratedWorktreePurge).toBe(true) - }) -}) diff --git a/src/renderer/src/store/slices/worktrees/session/workspace-activation-preparation.test.ts b/src/renderer/src/store/slices/worktrees/session/workspace-activation-preparation.test.ts index 9b827510808..7ab3616f203 100644 --- a/src/renderer/src/store/slices/worktrees/session/workspace-activation-preparation.test.ts +++ b/src/renderer/src/store/slices/worktrees/session/workspace-activation-preparation.test.ts @@ -7,7 +7,7 @@ import { forgetWorktreeSleepIntent } from '@/lib/workspace/sleep/worktree-sleep-intent' import { createTestStore } from '../../../testing/app-store-test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktree.test-fixture' import { makeFolderWorkspace } from '../../../folder-workspaces/folder-workspace.test-fixture' import type { ExecutionHostId } from '../../../../../../shared/execution-host' @@ -66,7 +66,6 @@ it('wakes slept folder on local after publishing restored explorer and terminal expect(store.getState().activeWorkspaceExecutionHostId).toBe('local') expect(store.getState().tabsByWorktree[workspaceId][0].pendingActivationSpawn).toBe(true) expect(store.getState().activeTabId).toBe('terminal') - expect(store.getState().refreshGitHubForWorktreeIfStale).not.toHaveBeenCalled() }) it('wakes slept git on ssh:remote after publishing restored explorer and terminal state', () => { @@ -85,10 +84,9 @@ it('wakes slept git on ssh:remote after publishing restored explorer and termina expect(store.getState().activeWorkspaceExecutionHostId).toBe('ssh:remote') expect(store.getState().tabsByWorktree[workspaceId][0].pendingActivationSpawn).toBe(true) expect(store.getState().activeTabId).toBe('terminal') - expect(store.getState().refreshGitHubForWorktreeIfStale).toHaveBeenCalled() }) -it('reads only the selected folder owner on screen and persists to that host', () => { +it('reads only the selected folder owner on screen', () => { const { store, activate } = seedWorkspace('folder', 'ssh:remote') const updateFolderWorkspace = vi.fn().mockResolvedValue(null) store.setState({ @@ -103,9 +101,4 @@ it('reads only the selected folder owner on screen and persists to that host', ( activate() expect(store.getState().folderWorkspaces.map((folder) => folder.isUnread)).toEqual([true, false]) - expect(updateFolderWorkspace).toHaveBeenCalledWith( - FOLDER_ID, - { isUnread: false }, - { executionHostId: 'ssh:remote' } - ) }) diff --git a/src/renderer/src/store/slices/worktrees/session/worktree-identity-rename-state.ts b/src/renderer/src/store/slices/worktrees/session/worktree-identity-rename-state.ts index 4a6546599d5..f27128488bc 100644 --- a/src/renderer/src/store/slices/worktrees/session/worktree-identity-rename-state.ts +++ b/src/renderer/src/store/slices/worktrees/session/worktree-identity-rename-state.ts @@ -10,7 +10,7 @@ import { getWorktreeIdFromVisitKey } from '@/lib/workspace/activation/worktree-v import { remapClosedTerminalTabSnapshotCwds, type ClosedTerminalTabSnapshot -} from '../../../terminals/recently-closed-terminal-tabs' +} from '../../../terminals/tabs/recently-closed-terminal-tabs' import '../../tabs/worktree-layout-lifecycle' import { renameWorktreeLayoutKeys } from '../../tabs/rename-worktree-layout' import { replaceRecordEntries } from '../../../keyed-record-transitions' diff --git a/src/renderer/src/store/slices/worktrees/session/worktree-slice-lookups.ts b/src/renderer/src/store/slices/worktrees/session/worktree-slice-lookups.ts index 54c9eec7423..005718c3c2a 100644 --- a/src/renderer/src/store/slices/worktrees/session/worktree-slice-lookups.ts +++ b/src/renderer/src/store/slices/worktrees/session/worktree-slice-lookups.ts @@ -1,20 +1,20 @@ -import { captureWorkspaceTerminalNoticeRemoval } from '../../../terminals/terminal-notice-removal' +import { captureWorkspaceTerminalNoticeRemoval } from '../../../terminals/retirement/terminal-notice-removal' import type { WorktreeSlice } from '../worktree-slice-contract' import type { WorktreeSliceGet, WorktreeSliceSet } from '../listing/worktree-slice-types' import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../../../shared/constants' -import { getTerminalActivationSpawnSuppression } from '../../../terminals/terminal-activation-spawn-suppression' +import { getTerminalActivationSpawnSuppression } from '../../../terminals/pty/terminal-activation-spawn-suppression' import { findKnownWorktreeById } from '../listing/detected-worktree-meta' import { buildWorktreePurgeState } from '../teardown/worktree-purge-state' -import { locateTerminalTab } from '../../../terminals/terminal-tab-location' +import { locateTerminalTab } from '../../../terminals/ownership/terminal-tab-location' import { admitTerminalRecoveryRemount, nextTerminalRecoveryLedger, settledTerminalRecoveryLedger -} from '../../../terminals/terminal-tab-recovery-ledger' +} from '../../../terminals/pty/terminal-tab-recovery-ledger' import type { TerminalRecoveryRemountRequest, TerminalRecoveryRemountResult -} from '../../../terminals/terminal-tab-recovery-ledger' +} from '../../../terminals/pty/terminal-tab-recovery-ledger' import { settleAttentionRemovedBy } from '../../workspace-attention/attention-removal-follow-up' import { selectWorktreesByRepo } from '../../../workspaces/catalog/workspace-record-fields' import { flushPurgedWorkspaceEdits } from '../teardown/removed-workspace-unsaved-files' diff --git a/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-admission.test.ts b/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-admission.test.ts index d41b7cc4cc3..ef0a5d2f361 100644 --- a/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-admission.test.ts +++ b/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-admission.test.ts @@ -2,8 +2,8 @@ import { beforeEach, expect, it, vi } from 'vitest' import type { GitHubWorkItem } from '../../../../../../shared/github/work-items/work-item-types' import { getWorkspaceAttachments } from '../../../../../../shared/workspace-attachments/workspace-attachments' import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' -import { singlePaneLayoutSnapshot } from '../../../terminals/terminal-single-pane-layout' -import { makeTerminalTab } from '../../../terminals/terminal-row.test-fixture' +import { singlePaneLayoutSnapshot } from '../../../terminals/layout/terminal-single-pane-layout' +import { makeTerminalTab } from '../../../terminals/testing/terminal-row.test-fixture' import { makeWorktree } from '../worktree.test-fixture' import { createTestStore, @@ -110,40 +110,39 @@ beforeEach(() => { resetWorktreeSliceModuleMemory() }) -it('drops stale queued starts and fallback reads after the pane closes', async () => { - const { store, pending, observeBurst, closePane, branchLookup } = setup() +it('keeps workspace attachments unchanged after closed-pane lookups settle', async () => { + const { store, pending, observeBurst, closePane } = setup() observeBurst() await flush() - expect(exactLookup).toHaveBeenCalledWith(expect.objectContaining({ number: 100 })) + closePane() for (const deferred of pending.values()) { deferred.resolve(null) } await flush() - expect(exactLookup).not.toHaveBeenCalledWith(expect.objectContaining({ number: 103 })) - expect(branchLookup).not.toHaveBeenCalled() + expect( getWorkspaceAttachments(store.getState().worktreesByRepo.repo[0]).map((item) => item.number) ).toEqual([7]) }) -it('retains occupied native permits until settlement after their pane closes', async () => { - const { store, pending, observeBurst, closePane, branchLookup } = setup() +it('attaches a current pane review after closed-pane lookups settle', async () => { + const { store, pending, observeBurst, closePane } = setup() observeBurst() await flush() - expect(exactLookup).toHaveBeenCalledWith(expect.objectContaining({ number: 100 })) + closePane() store.getState().observeTerminalGitHubPullRequestLink(workspaceId, link(1000), context('tab-2')) await flush() - expect(exactLookup).not.toHaveBeenCalledWith(expect.objectContaining({ number: 1000 })) + pending.get(100)?.resolve(null) await flush() - expect(exactLookup).toHaveBeenLastCalledWith(expect.objectContaining({ number: 1000 })) + pending.get(1000)?.resolve(review(1000)) pending.get(101)?.resolve(null) pending.get(102)?.resolve(null) await flush() - expect(branchLookup).not.toHaveBeenCalled() + expect( getWorkspaceAttachments(store.getState().worktreesByRepo.repo[0]).map((item) => item.number) ).toEqual([7, 1000]) diff --git a/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-origins.test.ts b/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-origins.test.ts index 1e9379ff578..b6e1db23f16 100644 --- a/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-origins.test.ts +++ b/src/renderer/src/store/slices/worktrees/session/worktrees-terminal-reference-origins.test.ts @@ -3,9 +3,9 @@ import type { HostedReviewInfo, HostedReviewForBranchArgs } from '../../../../../../shared/source-control/hosted-review/hosted-review-contracts' -import { singlePaneLayoutSnapshot } from '../../../terminals/terminal-single-pane-layout' +import { singlePaneLayoutSnapshot } from '../../../terminals/layout/terminal-single-pane-layout' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { makeTerminalTab } from '../../../terminals/terminal-row.test-fixture' +import { makeTerminalTab } from '../../../terminals/testing/terminal-row.test-fixture' import { makeWorktree } from '../worktree.test-fixture' import { createTestStore, diff --git a/src/renderer/src/store/slices/worktrees/teardown/host-twin-worktree-purge.ts b/src/renderer/src/store/slices/worktrees/teardown/host-twin-worktree-purge.ts index 41a4d741d29..375e1a2dc38 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/host-twin-worktree-purge.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/host-twin-worktree-purge.ts @@ -9,7 +9,7 @@ import { import { removeWorktreeLayout } from '../../tabs/worktree-layout-lifecycle' import { buildActiveSurfacePatch } from '../../tabs/tabs-surface' import { collectSurfacePurgeDoomedIds } from './worktree-purge-doomed-ids' -import { collectPtyIdsForTab } from '../../../terminals/terminal-tab-retirement' +import { collectPtyIdsForTab } from '../../../terminals/retirement/terminal-tab-retirement' import { createWorktreePurgeOmitters } from './worktree-purge-omitters' import { omitSleepingAgentSessionsForWorktrees } from './sleeping-agent-session-omission' import { diff --git a/src/renderer/src/store/slices/worktrees/teardown/native-chat-launch-draft-teardown.test.ts b/src/renderer/src/store/slices/worktrees/teardown/native-chat-launch-draft-teardown.test.ts index 29927ef75ae..eeca27efbcd 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/native-chat-launch-draft-teardown.test.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/native-chat-launch-draft-teardown.test.ts @@ -45,7 +45,7 @@ globalThis.window = { api: mockApi } import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' import { makeWorktree } from '../worktree.test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { readNativeChatComposerDraft } from '@/components/native-chat/drafts/native-chat-composer-draft-store' import { addNativeChatPendingAttachment, diff --git a/src/renderer/src/store/slices/worktrees/teardown/purge-stale-runtime-host-ownership.test.ts b/src/renderer/src/store/slices/worktrees/teardown/purge-stale-runtime-host-ownership.test.ts index cb9fe4a5c34..c40d729b79a 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/purge-stale-runtime-host-ownership.test.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/purge-stale-runtime-host-ownership.test.ts @@ -17,7 +17,7 @@ vi.mock('@/components/terminal-pane/pty-transport/shutdown/pty-shutdown-data-sus globalThis.window = { api: {} } import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktree.test-fixture' const RUNTIME_A = toRuntimeExecutionHostId('env-a') diff --git a/src/renderer/src/store/slices/worktrees/teardown/removed-worktree-renderer-teardown.ts b/src/renderer/src/store/slices/worktrees/teardown/removed-worktree-renderer-teardown.ts index bb04557aee5..ab81f1f7267 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/removed-worktree-renderer-teardown.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/removed-worktree-renderer-teardown.ts @@ -1,4 +1,4 @@ -import { retireRemovedWorktreeTerminalNotices } from '../../../terminals/terminal-notice-removal' +import { retireRemovedWorktreeTerminalNotices } from '../../../terminals/retirement/terminal-notice-removal' import type { ExecutionHostId } from '../../../../../../shared/execution-host' import type { WorktreeSliceGet, WorktreeSliceSet } from '../listing/worktree-slice-types' import type { WorktreeCatalogVersion } from '../../../../../../shared/worktree/catalog/catalog-version' diff --git a/src/renderer/src/store/slices/worktrees/teardown/store-worktree-removal-cascade.test.ts b/src/renderer/src/store/slices/worktrees/teardown/store-worktree-removal-cascade.test.ts index d2173923934..80d18530ab7 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/store-worktree-removal-cascade.test.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/store-worktree-removal-cascade.test.ts @@ -4,7 +4,7 @@ import { createCompatibleRuntimeStatusResponseIfNeeded } from '../../../../runti import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../../../runtime/rpc/compatibility/runtime-compatibility-cache' import 'sonner' import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' -import { makeLayout, makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeLayout, makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeWorktree } from '../worktree.test-fixture' import { saveSessionCommitDrafts } from '@/lib/source-control/drafts/source-control-commit-draft-session' import { createStoreCascadesMockApi } from '../../../testing/app-store-cascade-api.test-fixture' @@ -85,7 +85,7 @@ describe('removeWorktree cascade', () => { expect(s.worktreesByRepo['repo1']).toHaveLength(1) expect(s.tabsByWorktree[worktreeId]).toHaveLength(1) expect(s.ptyIdsByTabId['tab1']).toEqual(['pty1']) - expect(mockApi.pty.kill).not.toHaveBeenCalled() + expect(s.activeWorktreeId).toBe(worktreeId) }) }) diff --git a/src/renderer/src/store/slices/worktrees/teardown/tab-worktree-orphan-map-purge-leak.test.ts b/src/renderer/src/store/slices/worktrees/teardown/tab-worktree-orphan-map-purge-leak.test.ts index b73b6a0acf0..a20fb2f00d2 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/tab-worktree-orphan-map-purge-leak.test.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/tab-worktree-orphan-map-purge-leak.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' import { - getForegroundTerminalTabLastSeenAtById, resetForegroundTerminalTabIdsForTests, setForegroundTerminalTabIds } from '@/components/terminal-pane/parking/retention/foreground-terminal-tabs' @@ -42,7 +41,7 @@ globalThis.window = { api: mockApi } import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' import { makeWorktree } from '../worktree.test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' const WT1 = 'repo1::/path/wt1' const WT2 = 'repo1::/path/wt2' const TAB1 = 'tab-wt1' @@ -96,9 +95,8 @@ describe('tab/worktree removal evicts the module maps it previously leaked', () store.getState().purgeWorktreeTerminalState([WT1]) - expect(getForegroundTerminalTabLastSeenAtById()[TAB1]).toBeUndefined() expect(startupGuardCleared(WT1, TAB1, TOKEN1)).toBe(true) - expect(getForegroundTerminalTabLastSeenAtById()[TAB2]).toBeGreaterThan(0) + expect(startupGuardCleared(WT2, TAB2, TOKEN2)).toBe(false) }) @@ -109,9 +107,8 @@ describe('tab/worktree removal evicts the module maps it previously leaked', () const result = await store.getState().removeWorktree({ id: WT1, executionHostId: null }) expect(result).toEqual({ ok: true }) - expect(getForegroundTerminalTabLastSeenAtById()[TAB1]).toBeUndefined() expect(startupGuardCleared(WT1, TAB1, TOKEN1)).toBe(true) - expect(getForegroundTerminalTabLastSeenAtById()[TAB2]).toBeGreaterThan(0) + expect(startupGuardCleared(WT2, TAB2, TOKEN2)).toBe(false) }) @@ -122,9 +119,9 @@ describe('tab/worktree removal evicts the module maps it previously leaked', () store.getState().closeTab(TAB1) // closeTab is tab-scoped: the tab-keyed maps drop, the worktree-keyed one stays. - expect(getForegroundTerminalTabLastSeenAtById()[TAB1]).toBeUndefined() + expect(startupGuardCleared(WT1, TAB1, TOKEN1)).toBe(true) - expect(getForegroundTerminalTabLastSeenAtById()[TAB2]).toBeGreaterThan(0) + expect(startupGuardCleared(WT2, TAB2, TOKEN2)).toBe(false) }) }) diff --git a/src/renderer/src/store/slices/worktrees/teardown/workspace-chat-draft-removal.test.ts b/src/renderer/src/store/slices/worktrees/teardown/workspace-chat-draft-removal.test.ts index d9b348a74a9..e64e43517fd 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/workspace-chat-draft-removal.test.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/workspace-chat-draft-removal.test.ts @@ -29,7 +29,7 @@ globalThis.window = { api: mockApi } import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' import { makeWorktree } from '../worktree.test-fixture' -import { makeTab } from '../../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../../terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../../tabs/tab-group.test-fixture' import { clearNativeChatComposerDraftsForTests } from '@/components/native-chat/drafts/native-chat-draft-reset' import { diff --git a/src/renderer/src/store/slices/worktrees/teardown/worktree-state-before-removal.ts b/src/renderer/src/store/slices/worktrees/teardown/worktree-state-before-removal.ts index 3a1a5e0d3b6..d48f4b02e45 100644 --- a/src/renderer/src/store/slices/worktrees/teardown/worktree-state-before-removal.ts +++ b/src/renderer/src/store/slices/worktrees/teardown/worktree-state-before-removal.ts @@ -1,6 +1,6 @@ import type { TerminalNoticeLifetime } from '@/components/terminal-pane/provider-notices/terminal-notice-lifetime' -import { captureWorktreeTerminalNoticeRemoval } from '../../../terminals/terminal-notice-removal' -import type { TerminalTabRetirementState } from '../../../terminals/terminal-tab-retirement' +import { captureWorktreeTerminalNoticeRemoval } from '../../../terminals/retirement/terminal-notice-removal' +import type { TerminalTabRetirementState } from '../../../terminals/retirement/terminal-tab-retirement' import type { ExecutionHostId } from '../../../../../../shared/execution-host' import { captureWorkspaceChatDraftKeys, diff --git a/src/renderer/src/store/slices/worktrees/worktree-slice-contract.ts b/src/renderer/src/store/slices/worktrees/worktree-slice-contract.ts index 68c71c1da1c..723be200882 100644 --- a/src/renderer/src/store/slices/worktrees/worktree-slice-contract.ts +++ b/src/renderer/src/store/slices/worktrees/worktree-slice-contract.ts @@ -50,7 +50,7 @@ import type { TerminalPaneRecoveryOutcome } from '../../../../../shared/workspac import type { TerminalRecoveryRemountRequest, TerminalRecoveryRemountResult -} from '../../terminals/terminal-tab-recovery-ledger' +} from '../../terminals/pty/terminal-tab-recovery-ledger' import type { RemoveWorktreeOptions } from './teardown/worktree-removal-options' import type { HostQualifiedDetectedWorktreeResult } from '../../../../../shared/detected-worktree-provider-contract' diff --git a/src/renderer/src/store/store-observer-installers.ts b/src/renderer/src/store/store-observer-installers.ts index df211cc0ac3..9d03b5f60f5 100644 --- a/src/renderer/src/store/store-observer-installers.ts +++ b/src/renderer/src/store/store-observer-installers.ts @@ -1,5 +1,5 @@ import type { AppState } from './types' -import { installTerminalParkingInputs } from './terminals/terminal-parking-input-transitions' +import { installTerminalParkingInputs } from './terminals/parking/terminal-parking-input-transitions' export type StoreObserverHost = { getState: () => AppState diff --git a/src/renderer/src/store/terminals/create-terminal-slice.ts b/src/renderer/src/store/terminals/create-terminal-slice.ts index 55f49379362..2770b505a93 100644 --- a/src/renderer/src/store/terminals/create-terminal-slice.ts +++ b/src/renderer/src/store/terminals/create-terminal-slice.ts @@ -3,27 +3,27 @@ import type { AppState } from '../types' import type { TerminalSlice, TerminalStoreGet } from './terminal-state' import { createTerminalEphemeralActions } from './terminal-ephemeral-state' -import { createTerminalTabCreationActions } from './terminal-tab-creation' -import { createTerminalTabAgentLaunchPaneActions } from './terminal-tab-agent-launch-pane' -import { createActiveWorkspaceTerminalActions } from './terminal-active-workspace-creation' -import { createTerminalTabCloseActions } from './terminal-tab-close' -import { createTerminalTabNavigationActions } from './terminal-tab-navigation' -import { createTerminalTabPresentationActions } from './terminal-tab-presentation' -import { createTerminalTabAppearanceActions } from './terminal-tab-appearance' -import { routeTerminalTabChangesThroughLayoutOwner } from './terminal-tab-layout-owner-actions' +import { createTerminalTabCreationActions } from './tabs/creation/terminal-tab-creation' +import { createTerminalTabAgentLaunchPaneActions } from './tabs/creation/terminal-tab-agent-launch-pane' +import { createActiveWorkspaceTerminalActions } from './tabs/creation/terminal-active-workspace-creation' +import { createTerminalTabCloseActions } from './retirement/terminal-tab-close' +import { createTerminalTabNavigationActions } from './tabs/terminal-tab-navigation' +import { createTerminalTabPresentationActions } from './tabs/presentation/terminal-tab-presentation' +import { createTerminalTabAppearanceActions } from './tabs/presentation/terminal-tab-appearance' +import { routeTerminalTabChangesThroughLayoutOwner } from './tabs/presentation/terminal-tab-layout-owner-actions' import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' -import { createTerminalPtyBindingActions } from './terminal-pty-bindings' -import { createTerminalPtyReleaseActions } from './terminal-pty-release' -import { createTerminalUnverifiedPtyLossActions } from './terminal-unverified-pty-loss' -import { createTerminalDisownedPtySourceActions } from './terminal-disowned-pty-sources' -import { createTerminalPaneHibernationActions } from './terminal-pane-hibernation' -import { createTerminalShutdownActions } from './terminal-shutdown' -import { createTerminalRestartActions } from './terminal-restart-state' -import { createTerminalLayoutActions } from './terminal-layout-state' -import { createTerminalStartupQueueActions } from './terminal-startup-queues' -import { createWorkspaceTerminalHydrationActions } from './workspace-terminal-hydration' -import { createWorkspaceTerminalReconnectActions } from './workspace-terminal-reconnect' -import { createPairedTerminalTabCloseIntentSlice } from './paired-terminal-tab-close-intent-actions' +import { createTerminalPtyBindingActions } from './pty/terminal-pty-bindings' +import { createTerminalPtyReleaseActions } from './pty/terminal-pty-release' +import { createTerminalUnverifiedPtyLossActions } from './pty/terminal-unverified-pty-loss' +import { createTerminalDisownedPtySourceActions } from './pty/terminal-disowned-pty-sources' +import { createTerminalPaneHibernationActions } from './sleep/terminal-pane-hibernation' +import { createTerminalShutdownActions } from './sleep/terminal-shutdown' +import { createTerminalRestartActions } from './pty/terminal-restart-state' +import { createTerminalLayoutActions } from './layout/terminal-layout-state' +import { createTerminalStartupQueueActions } from './tabs/creation/terminal-startup-queues' +import { createWorkspaceTerminalHydrationActions } from './hydration/workspace-terminal-hydration' +import { createWorkspaceTerminalReconnectActions } from './hydration/workspace-terminal-reconnect' +import { createPairedTerminalTabCloseIntentSlice } from './retirement/paired-terminal-tab-close-intent-actions' export const createTerminalSlice: ( ...args: [ diff --git a/src/renderer/src/store/terminals/restored-relay-session-identity.test.ts b/src/renderer/src/store/terminals/hydration/restored-relay-session-identity.test.ts similarity index 87% rename from src/renderer/src/store/terminals/restored-relay-session-identity.test.ts rename to src/renderer/src/store/terminals/hydration/restored-relay-session-identity.test.ts index 4e14fb70d14..2e5dbcc6257 100644 --- a/src/renderer/src/store/terminals/restored-relay-session-identity.test.ts +++ b/src/renderer/src/store/terminals/hydration/restored-relay-session-identity.test.ts @@ -1,13 +1,13 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' import { buildWorkspaceSessionPayload } from '@/lib/workspace/persistence/workspace-session' -import './terminal-orphan-cleanup' -import { createTestStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' +import '../retirement/terminal-orphan-cleanup' +import { createTestStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' const layoutOwner = vi.hoisted(() => ({ isMain: false })) -vi.mock('../../../../shared/layout-owner-switch', () => ({ +vi.mock('../../../../../shared/layout-owner-switch', () => ({ get ORCA_LAYOUT_OWNER_IS_MAIN() { return layoutOwner.isMain } diff --git a/src/renderer/src/store/terminals/terminal-hydration-store.test-bootstrap.ts b/src/renderer/src/store/terminals/hydration/terminal-hydration-store.test-bootstrap.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-hydration-store.test-bootstrap.ts rename to src/renderer/src/store/terminals/hydration/terminal-hydration-store.test-bootstrap.ts diff --git a/src/renderer/src/store/terminals/terminal-session-row-hydration.ts b/src/renderer/src/store/terminals/hydration/terminal-session-row-hydration.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-session-row-hydration.ts rename to src/renderer/src/store/terminals/hydration/terminal-session-row-hydration.ts index 794231ba84f..ac6a5910fef 100644 --- a/src/renderer/src/store/terminals/terminal-session-row-hydration.ts +++ b/src/renderer/src/store/terminals/hydration/terminal-session-row-hydration.ts @@ -1,15 +1,15 @@ import type { TerminalLayoutSnapshot, TerminalTab -} from '../../../../shared/workspace-layout/terminal-tab-types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' -import type { AiVaultSessionTitle } from '../../../../shared/ai-vault/contracts/ai-vault-session-title' -import { isValidTerminalTabId } from '../../../../shared/workspace-layout/terminal-surfaces/terminal-tab-id' +} from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' +import type { AiVaultSessionTitle } from '../../../../../shared/ai-vault/contracts/ai-vault-session-title' +import { isValidTerminalTabId } from '../../../../../shared/workspace-layout/terminal-surfaces/terminal-tab-id' import { readCanonicalPtyOwners, resolveCanonicalPtyClaim, type CanonicalPtyOwners -} from '../../../../shared/workspace-layout/terminal-topology/legacy-terminal-row-claims' +} from '../../../../../shared/workspace-layout/terminal-topology/legacy-terminal-row-claims' import { clearTransientTerminalState } from './terminal-transient-state' /** Canonical/unified and legacy rows may share PTYs: retain uniquely owned panes, drop fully subsumed rows and strip shared PTYs from partial overlaps. */ diff --git a/src/renderer/src/store/terminals/terminal-transient-state.ts b/src/renderer/src/store/terminals/hydration/terminal-transient-state.ts similarity index 72% rename from src/renderer/src/store/terminals/terminal-transient-state.ts rename to src/renderer/src/store/terminals/hydration/terminal-transient-state.ts index 1b03593290d..dc67ed7c228 100644 --- a/src/renderer/src/store/terminals/terminal-transient-state.ts +++ b/src/renderer/src/store/terminals/hydration/terminal-transient-state.ts @@ -1,5 +1,5 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import { detectAgentStatusFromTitle } from '../../../../shared/agent-status/title/agent-title-status' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import { detectAgentStatusFromTitle } from '../../../../../shared/agent-status/title/agent-title-status' export function clearTransientTerminalState(tab: TerminalTab, index: number): TerminalTab { return { diff --git a/src/renderer/src/store/terminals/terminals-hydration-canonical-pty-overlap.test.ts b/src/renderer/src/store/terminals/hydration/terminals-hydration-canonical-pty-overlap.test.ts similarity index 83% rename from src/renderer/src/store/terminals/terminals-hydration-canonical-pty-overlap.test.ts rename to src/renderer/src/store/terminals/hydration/terminals-hydration-canonical-pty-overlap.test.ts index 017daf778ae..3e0c54d4b27 100644 --- a/src/renderer/src/store/terminals/terminals-hydration-canonical-pty-overlap.test.ts +++ b/src/renderer/src/store/terminals/hydration/terminals-hydration-canonical-pty-overlap.test.ts @@ -1,16 +1,15 @@ // Keep this bare import first: it installs the preload-API stub the store imports read at eval time. import './terminal-hydration-store.test-bootstrap' import { describe, expect, it, vi } from 'vitest' -import { getOrphanTerminalIds } from './terminal-orphan-cleanup' -import type { Tab } from '../../../../shared/tab-types' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' -import { getDefaultWorkspaceSession } from '../../../../shared/constants' +import type { Tab } from '../../../../../shared/tab-types' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' +import { getDefaultWorkspaceSession } from '../../../../../shared/constants' import '@/lib/workspace/persistence/workspace-session' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeLayout, makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeLayout, makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' vi.mock('sonner', () => ({ toast: { info: vi.fn(), success: vi.fn(), error: vi.fn() } })) vi.mock('@/runtime/sync-runtime-graph/graph-sync-scheduler', () => ({ @@ -110,8 +109,6 @@ describe('hydrateWorkspaceSession canonical PTY overlap', () => { const store = hydrate(session) // Anchor the retained leaf-only PTY or orphan sweep deletes the row before its pane can reattach. - expect(store.getState().pendingReconnectPtyIdByTabId['split-tab']).toBe(soloPtyId) - expect(getOrphanTerminalIds(store.getState(), WORKTREE_ID).has('split-tab')).toBe(false) store.getState().reconcileWorktreeTabModel(WORKTREE_ID) await store.getState().reconnectPersistedTerminals() diff --git a/src/renderer/src/store/terminals/workspace-terminal-active-tabs.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-active-tabs.ts similarity index 88% rename from src/renderer/src/store/terminals/workspace-terminal-active-tabs.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-active-tabs.ts index 4550b96492c..44894ebe6fc 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-active-tabs.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-active-tabs.ts @@ -1,5 +1,5 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' /** Restore per-worktree active tab; validate ids when the map exists, else derive for legacy sessions. */ export function restoreActiveTabIdByWorktree({ diff --git a/src/renderer/src/store/terminals/workspace-terminal-hydration-patch.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-hydration-patch.ts similarity index 93% rename from src/renderer/src/store/terminals/workspace-terminal-hydration-patch.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-hydration-patch.ts index b703084365a..487f3b895d5 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-hydration-patch.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-hydration-patch.ts @@ -1,14 +1,14 @@ -import type { AppState } from '../types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' +import type { AppState } from '../../types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' import { isTerminalLeafId, makePaneKey, parsePaneKey -} from '../../../../shared/workspace-layout/stable-pane-id' -import { resolveAgentPaneAuthorityKey } from '../slices/agent-status/agent-pane-authority' -import type { HydrateWorkspaceSessionOptions } from './terminal-contracts' -import { omitUnverifiedPtyLossTabIds } from './terminal-unverified-pty-loss' -import { markFullResync, replaceRecordEntries } from '../keyed-record-transitions' +} from '../../../../../shared/workspace-layout/stable-pane-id' +import { resolveAgentPaneAuthorityKey } from '../../slices/agent-status/agent-pane-authority' +import type { HydrateWorkspaceSessionOptions } from '../terminal-contracts' +import { omitUnverifiedPtyLossTabIds } from '../pty/terminal-unverified-pty-loss' +import { markFullResync, replaceRecordEntries } from '../../keyed-record-transitions' export type WorkspaceHydrationPatch = Pick< AppState, diff --git a/src/renderer/src/store/terminals/workspace-terminal-hydration.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-hydration.ts similarity index 95% rename from src/renderer/src/store/terminals/workspace-terminal-hydration.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-hydration.ts index b0a12ae1516..d7b3b52b7cf 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-hydration.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-hydration.ts @@ -1,18 +1,18 @@ import { markFullResync } from '@/store/keyed-record-transitions' -import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../shared/constants' +import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../../shared/constants' import { type WorkspaceKey, folderWorkspaceKey, isWorkspaceKey, worktreeWorkspaceKey -} from '../../../../shared/workspace-scope' -import { buildByIdIndex } from '../../../../shared/first-row-by-id-index' +} from '../../../../../shared/workspace-scope' +import { buildByIdIndex } from '../../../../../shared/first-row-by-id-index' import { addAdditionalValidWorkspaceKeys } from '@/lib/workspace/persistence/workspace-session-hydration-keys' import { buildValidWorktreeIdsForSessionHydration, collectPersistedWorktreeIdsForSessionHydration -} from '../../../../shared/worktree/catalog/degraded-repo-worktree-validity' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +} from '../../../../../shared/worktree/catalog/degraded-repo-worktree-validity' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' import { buildRuntimeSessionPlaceholders } from './workspace-terminal-placeholders' import { markFullWorkspaceHydration, @@ -25,9 +25,9 @@ import { buildWorkspaceTerminalRowPlan } from './workspace-terminal-row-plan' import { buildWorkspaceTerminalReconnectPlan } from './workspace-terminal-reconnect-plan' import { buildWorkspaceTerminalLayoutPlan } from './workspace-terminal-layout-plan' import { addHydratedSshWorktreePlaceholders } from './workspace-terminal-ssh-placeholders' -import { retainUnverifiedPtyLossTabIds } from './terminal-unverified-pty-loss' +import { retainUnverifiedPtyLossTabIds } from '../pty/terminal-unverified-pty-loss' import { restoreActiveTabIdByWorktree } from './workspace-terminal-active-tabs' -import { retainPairedTerminalTabCloseIntentsForCatalog } from '../../runtime/web-session-tabs-sync/closing/paired-terminal-tab-close-intents' +import { retainPairedTerminalTabCloseIntentsForCatalog } from '../../../runtime/web-session-tabs-sync/closing/paired-terminal-tab-close-intents' export function createWorkspaceTerminalHydrationActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/workspace-terminal-layout-plan.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-layout-plan.ts similarity index 76% rename from src/renderer/src/store/terminals/workspace-terminal-layout-plan.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-layout-plan.ts index a73bdd048a2..0cf46b89f75 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-layout-plan.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-layout-plan.ts @@ -1,13 +1,13 @@ import type { TerminalLayoutSnapshot, TerminalTab -} from '../../../../shared/workspace-layout/terminal-tab-types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' +} from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' import { releaseTerminalLayoutPtyIds } from './terminal-session-row-hydration' -import { normalizeTerminalLayoutSnapshot } from '../../components/terminal-pane/layout/terminal-layout-normalization' -import { resolvePtyBoundActiveLeafId } from '../../components/terminal-pane/layout/ownership/terminal-layout-active-leaf' -import { resolveTerminalLayoutPtyOwnershipTransfers } from '../../../../shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership' -import { sanitizeTerminalLayoutPaneTitles } from '../../../../shared/workspace-layout/terminal-topology/terminal-pane-title-sanitization' +import { normalizeTerminalLayoutSnapshot } from '../../../components/terminal-pane/layout/terminal-layout-normalization' +import { resolvePtyBoundActiveLeafId } from '../../../components/terminal-pane/layout/ownership/terminal-layout-active-leaf' +import { resolveTerminalLayoutPtyOwnershipTransfers } from '../../../../../shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership' +import { sanitizeTerminalLayoutPaneTitles } from '../../../../../shared/workspace-layout/terminal-topology/terminal-pane-title-sanitization' import type { TerminalLayoutPtyOwnershipTransfer } from './workspace-terminal-hydration-patch' export function buildWorkspaceTerminalLayoutPlan({ diff --git a/src/renderer/src/store/terminals/workspace-terminal-placeholders.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-placeholders.ts similarity index 88% rename from src/renderer/src/store/terminals/workspace-terminal-placeholders.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-placeholders.ts index 2ab9170a30a..510393edb8b 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-placeholders.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-placeholders.ts @@ -1,14 +1,15 @@ -import type { Repo } from '../../../../shared/repo-types' -import type { Worktree } from '../../../../shared/worktree/types' -import { DEFAULT_REPO_BADGE_COLOR } from '../../../../shared/constants' +import type { Repo } from '../../../../../shared/repo-types' +import type { Worktree } from '../../../../../shared/worktree/types' +import '../../../../../shared/constants' +import { DEFAULT_REPO_BADGE_COLOR } from '../../../../../shared/repo-badge-color' import { getRepoExecutionHostId, parseExecutionHostId, type ExecutionHostId -} from '../../../../shared/execution-host' +} from '../../../../../shared/execution-host' import { repoRowOwnerStamp } from './workspace-terminal-ssh-placeholders' -import { parseWorkspaceKey } from '../../../../shared/workspace-scope' -import { splitWorktreeIdForFilesystem } from '../../../../shared/worktree/id' +import { parseWorkspaceKey } from '../../../../../shared/workspace-scope' +import { splitWorktreeIdForFilesystem } from '../../../../../shared/worktree/id' export function getPathDisplayName(path: string, fallback: string): string { const normalized = path.trim().replace(/[\\/]+$/g, '') diff --git a/src/renderer/src/store/terminals/workspace-terminal-reconnect-plan.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect-plan.ts similarity index 90% rename from src/renderer/src/store/terminals/workspace-terminal-reconnect-plan.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect-plan.ts index 895ca3417fd..21bdcd3d165 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-reconnect-plan.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect-plan.ts @@ -1,7 +1,7 @@ -import type { Repo } from '../../../../shared/repo-types' -import type { Worktree } from '../../../../shared/worktree/types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' -import { buildByIdIndex } from '../../../../shared/first-row-by-id-index' +import type { Repo } from '../../../../../shared/repo-types' +import type { Worktree } from '../../../../../shared/worktree/types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' +import { buildByIdIndex } from '../../../../../shared/first-row-by-id-index' import { buildWorktreeByIdIndex } from './workspace-terminal-worktree-index' export type WorkspaceTerminalReconnectPlan = { diff --git a/src/renderer/src/store/terminals/workspace-terminal-reconnect.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect.ts similarity index 93% rename from src/renderer/src/store/terminals/workspace-terminal-reconnect.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect.ts index 824472531a7..1b5663cfe5e 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-reconnect.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-reconnect.ts @@ -1,10 +1,10 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import { buildByIdIndex } from '../../../../shared/first-row-by-id-index' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import { buildByIdIndex } from '../../../../../shared/first-row-by-id-index' import { buildWorktreeByIdIndex } from './workspace-terminal-worktree-index' -import { getRepoIdFromWorktreeId } from '../../../../shared/worktree/id' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' -import { selectWorktreesByRepo } from '../workspaces/catalog/workspace-record-fields' -import { markFullResync, recordDraft, tabBucketDraft } from '../keyed-record-transitions' +import { getRepoIdFromWorktreeId } from '../../../../../shared/worktree/id' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' +import { selectWorktreesByRepo } from '../../workspaces/catalog/workspace-record-fields' +import { markFullResync, recordDraft, tabBucketDraft } from '../../keyed-record-transitions' export function createWorkspaceTerminalReconnectActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/workspace-terminal-row-plan.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-row-plan.ts similarity index 86% rename from src/renderer/src/store/terminals/workspace-terminal-row-plan.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-row-plan.ts index bb6704dd489..e7f7a3d1c48 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-row-plan.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-row-plan.ts @@ -1,12 +1,15 @@ -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { WorkspaceSessionState } from '../../../../shared/workspace-session/workspace-session-state-types' -import { isTerminalLeafId, makePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' +import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { WorkspaceSessionState } from '../../../../../shared/workspace-session/workspace-session-state-types' +import { + isTerminalLeafId, + makePaneKey +} from '../../../../../shared/workspace-layout/stable-pane-id' import { collectReleasedLeafIds, hydrateWorkspaceTerminalRows } from './terminal-session-row-hydration' -import { removeSleepingAgentSessionsForTab } from './terminal-tab-retirement' +import { removeSleepingAgentSessionsForTab } from '../retirement/terminal-tab-retirement' export type WorkspaceTerminalRowPlan = { canonicalTabIdBySubsumedTabId: Map diff --git a/src/renderer/src/store/terminals/workspace-terminal-ssh-placeholders.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-ssh-placeholders.ts similarity index 90% rename from src/renderer/src/store/terminals/workspace-terminal-ssh-placeholders.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-ssh-placeholders.ts index ed5ab7f8fc0..cb391ee0ea8 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-ssh-placeholders.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-ssh-placeholders.ts @@ -1,15 +1,15 @@ -import type { Repo } from '../../../../shared/repo-types' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { Worktree } from '../../../../shared/worktree/types' +import type { Repo } from '../../../../../shared/repo-types' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { Worktree } from '../../../../../shared/worktree/types' import { getRepoIdFromWorktreeId, splitWorktreeIdForFilesystem -} from '../../../../shared/worktree/id' +} from '../../../../../shared/worktree/id' import { getRepoExecutionHostId, parseExecutionHostId, toSshExecutionHostId -} from '../../../../shared/execution-host' +} from '../../../../../shared/execution-host' type PlaceholderOwner = Pick diff --git a/src/renderer/src/store/terminals/workspace-terminal-worktree-index.ts b/src/renderer/src/store/terminals/hydration/workspace-terminal-worktree-index.ts similarity index 89% rename from src/renderer/src/store/terminals/workspace-terminal-worktree-index.ts rename to src/renderer/src/store/terminals/hydration/workspace-terminal-worktree-index.ts index da81e85c47a..9526536d377 100644 --- a/src/renderer/src/store/terminals/workspace-terminal-worktree-index.ts +++ b/src/renderer/src/store/terminals/hydration/workspace-terminal-worktree-index.ts @@ -1,4 +1,4 @@ -import type { Worktree } from '../../../../shared/worktree/types' +import type { Worktree } from '../../../../../shared/worktree/types' /** Index once to avoid per-ID flatten scans; first match agrees with find/getIndexedWorktreeMap (STA-4343). Bare IDs cannot distinguish host twins: use getIndexedWorktreesById or explicit hosts for destructive work. */ export function buildWorktreeByIdIndex( diff --git a/src/renderer/src/store/terminals/terminal-chat-pane-layout-owner.ts b/src/renderer/src/store/terminals/layout/terminal-chat-pane-layout-owner.ts similarity index 85% rename from src/renderer/src/store/terminals/terminal-chat-pane-layout-owner.ts rename to src/renderer/src/store/terminals/layout/terminal-chat-pane-layout-owner.ts index 3d2c2c6ebd9..fe55269b682 100644 --- a/src/renderer/src/store/terminals/terminal-chat-pane-layout-owner.ts +++ b/src/renderer/src/store/terminals/layout/terminal-chat-pane-layout-owner.ts @@ -1,8 +1,8 @@ // Record window-picked chat panes in main so saves cannot change them; frames bypass setTabLayout, so its chat moves are window choices. import { recordLayoutApply } from '@/runtime/workspace-layout/commands/layout-apply-send' -import type { TerminalLayoutSnapshot } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { AppState } from '../types' +import type { TerminalLayoutSnapshot } from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { AppState } from '../../types' export function recordChatPaneInLayoutOwner( state: AppState, diff --git a/src/renderer/src/store/terminals/terminal-layout-pty-ownership.test.ts b/src/renderer/src/store/terminals/layout/terminal-layout-pty-ownership.test.ts similarity index 92% rename from src/renderer/src/store/terminals/terminal-layout-pty-ownership.test.ts rename to src/renderer/src/store/terminals/layout/terminal-layout-pty-ownership.test.ts index 2d570047f1d..376281faf45 100644 --- a/src/renderer/src/store/terminals/terminal-layout-pty-ownership.test.ts +++ b/src/renderer/src/store/terminals/layout/terminal-layout-pty-ownership.test.ts @@ -1,11 +1,11 @@ import { beforeEach, describe, expect, it } from 'vitest' -import { makePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' -import '../../../../shared/constants' +import { makePaneKey } from '../../../../../shared/workspace-layout/stable-pane-id' +import '../../../../../shared/constants' import { resetAgentPaneAuthorityAliasesForTests, resolveAgentPaneAuthorityKey -} from '../slices/agent-status/agent-pane-authority' -import { createTestStore } from '../testing/app-store-test-fixture' +} from '../../slices/agent-status/agent-pane-authority' +import { createTestStore } from '../../testing/app-store-test-fixture' const LEAF_1 = '11111111-1111-4111-8111-111111111111' const LEAF_2 = '22222222-2222-4222-8222-222222222222' diff --git a/src/renderer/src/store/terminals/terminal-layout-state.ts b/src/renderer/src/store/terminals/layout/terminal-layout-state.ts similarity index 92% rename from src/renderer/src/store/terminals/terminal-layout-state.ts rename to src/renderer/src/store/terminals/layout/terminal-layout-state.ts index 3f450cca4b4..c7005e42ade 100644 --- a/src/renderer/src/store/terminals/terminal-layout-state.ts +++ b/src/renderer/src/store/terminals/layout/terminal-layout-state.ts @@ -1,18 +1,18 @@ import { replaceRecordEntries } from '@/store/keyed-record-transitions' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' -import { makePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' -import { terminalLayoutEqual } from '../../../../shared/workspace-layout/terminal-topology/terminal-layout-equality' +import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch' +import { makePaneKey } from '../../../../../shared/workspace-layout/stable-pane-id' +import { terminalLayoutEqual } from '../../../../../shared/workspace-layout/terminal-topology/terminal-layout-equality' import { normalizeTerminalLayoutPtyOwnership, resolveTerminalLayoutPtyOwnershipTransfers -} from '../../../../shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +} from '../../../../../shared/workspace-layout/terminal-topology/terminal-layout-pty-ownership' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' import { resolvePrimaryLayoutPtyId, uniquePtyIds, withTerminalTabPtyIds -} from './terminal-pty-identities' -import { transferNormalizedTerminalLayoutPtyOwnership } from './workspace-terminal-hydration-patch' +} from '../pty/terminal-pty-identities' +import { transferNormalizedTerminalLayoutPtyOwnership } from '../hydration/workspace-terminal-hydration-patch' import { recordChatPaneInLayoutOwner } from './terminal-chat-pane-layout-owner' export function createTerminalLayoutActions( diff --git a/src/renderer/src/store/terminals/terminal-pane-detach-agent-identity.test.ts b/src/renderer/src/store/terminals/layout/terminal-pane-detach-agent-identity.test.ts similarity index 84% rename from src/renderer/src/store/terminals/terminal-pane-detach-agent-identity.test.ts rename to src/renderer/src/store/terminals/layout/terminal-pane-detach-agent-identity.test.ts index 6534714654e..8ee7fbb74e7 100644 --- a/src/renderer/src/store/terminals/terminal-pane-detach-agent-identity.test.ts +++ b/src/renderer/src/store/terminals/layout/terminal-pane-detach-agent-identity.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from 'vitest' -import { resolveWindowsShiftEnterEncodingForPane } from '@/components/terminal-pane/input/keyboard/terminal-windows-shift-enter' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' + +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' describe('syncPaneDetachPtyOwnership agent identity', () => { it('moves process, hook, launch, and resume authority to the detached leaf', () => { @@ -105,13 +105,10 @@ describe('syncPaneDetachPtyOwnership agent identity', () => { tabId: targetTabId, providerSession: { key: 'session_id', id: 'session-1' } }) - expect(state.retentionSuppressedPaneKeys[sourcePaneKey]).toBeUndefined() - expect(state.retentionSuppressedPaneKeys[targetPaneKey]).toBeUndefined() + expect(state.paneForegroundAgentByPaneKey[siblingPaneKey]).toEqual({ agent: 'antigravity', shellForeground: false }) - expect(resolveWindowsShiftEnterEncodingForPane(state, targetPaneKey)).toBe('csi-u') - expect(resolveWindowsShiftEnterEncodingForPane(state, siblingPaneKey)).toBe('alt-enter') }) }) diff --git a/src/renderer/src/store/terminals/terminal-single-pane-layout.ts b/src/renderer/src/store/terminals/layout/terminal-single-pane-layout.ts similarity index 77% rename from src/renderer/src/store/terminals/terminal-single-pane-layout.ts rename to src/renderer/src/store/terminals/layout/terminal-single-pane-layout.ts index 5fad47ed791..b716450d6d9 100644 --- a/src/renderer/src/store/terminals/terminal-single-pane-layout.ts +++ b/src/renderer/src/store/terminals/layout/terminal-single-pane-layout.ts @@ -1,4 +1,4 @@ -import type { TerminalLayoutSnapshot } from '../../../../shared/workspace-layout/terminal-tab-types' +import type { TerminalLayoutSnapshot } from '../../../../../shared/workspace-layout/terminal-tab-types' export function singlePaneLayoutSnapshot( leafId: string, diff --git a/src/renderer/src/store/terminals/active-tab-owner-worktree.ts b/src/renderer/src/store/terminals/ownership/active-tab-owner-worktree.ts similarity index 92% rename from src/renderer/src/store/terminals/active-tab-owner-worktree.ts rename to src/renderer/src/store/terminals/ownership/active-tab-owner-worktree.ts index 4112cb7d869..c1fc3931760 100644 --- a/src/renderer/src/store/terminals/active-tab-owner-worktree.ts +++ b/src/renderer/src/store/terminals/ownership/active-tab-owner-worktree.ts @@ -1,5 +1,5 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import { recordRendererCrashBreadcrumb } from '../../diagnostics/crash-reporting/crash-breadcrumb-recorder' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import { recordRendererCrashBreadcrumb } from '../../../diagnostics/crash-reporting/crash-breadcrumb-recorder' const reportedDuplicateTabVerdicts = new Set() // Bound never-pruned verdict keys: 256 covers evidence for 128–256 duplicate tab IDs. diff --git a/src/renderer/src/store/terminals/terminal-tab-bucket-index.ts b/src/renderer/src/store/terminals/ownership/terminal-tab-bucket-index.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-tab-bucket-index.ts rename to src/renderer/src/store/terminals/ownership/terminal-tab-bucket-index.ts diff --git a/src/renderer/src/store/terminals/terminal-tab-location.ts b/src/renderer/src/store/terminals/ownership/terminal-tab-location.ts similarity index 86% rename from src/renderer/src/store/terminals/terminal-tab-location.ts rename to src/renderer/src/store/terminals/ownership/terminal-tab-location.ts index da0d549c27c..ccdd56b979a 100644 --- a/src/renderer/src/store/terminals/terminal-tab-location.ts +++ b/src/renderer/src/store/terminals/ownership/terminal-tab-location.ts @@ -1,4 +1,4 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' /** Recovery/remount/budget/native-chat guards must all use terminal rows; unified-index gaps previously erased each remount’s budget and defeated its cap (b5cfc6ca). */ export function locateTerminalTab( diff --git a/src/renderer/src/store/terminals/terminal-tab-owner-index.test.ts b/src/renderer/src/store/terminals/ownership/terminal-tab-owner-index.test.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-tab-owner-index.test.ts rename to src/renderer/src/store/terminals/ownership/terminal-tab-owner-index.test.ts diff --git a/src/renderer/src/store/terminals/terminal-tab-owner-index.ts b/src/renderer/src/store/terminals/ownership/terminal-tab-owner-index.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-tab-owner-index.ts rename to src/renderer/src/store/terminals/ownership/terminal-tab-owner-index.ts diff --git a/src/renderer/src/store/terminals/terminal-parking-input-equality.ts b/src/renderer/src/store/terminals/parking/terminal-parking-input-equality.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-parking-input-equality.ts rename to src/renderer/src/store/terminals/parking/terminal-parking-input-equality.ts index 1144bbed304..8a77d9c79ba 100644 --- a/src/renderer/src/store/terminals/terminal-parking-input-equality.ts +++ b/src/renderer/src/store/terminals/parking/terminal-parking-input-equality.ts @@ -1,7 +1,7 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { Tab, TabGroup } from '../../../../shared/tab-types' -import type { AppState } from '../types' -import type { TabRowChange } from '../keyed-tab-row-changes' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { Tab, TabGroup } from '../../../../../shared/tab-types' +import type { AppState } from '../../types' +import type { TabRowChange } from '../../keyed-tab-row-diff' export function sameTerminalParkingTab( previous: TerminalTab | undefined, diff --git a/src/renderer/src/store/terminals/terminal-parking-input-fields.ts b/src/renderer/src/store/terminals/parking/terminal-parking-input-fields.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-parking-input-fields.ts rename to src/renderer/src/store/terminals/parking/terminal-parking-input-fields.ts diff --git a/src/renderer/src/store/terminals/terminal-parking-input-owner.ts b/src/renderer/src/store/terminals/parking/terminal-parking-input-owner.ts similarity index 97% rename from src/renderer/src/store/terminals/terminal-parking-input-owner.ts rename to src/renderer/src/store/terminals/parking/terminal-parking-input-owner.ts index 46fea6b24c3..68bd309399a 100644 --- a/src/renderer/src/store/terminals/terminal-parking-input-owner.ts +++ b/src/renderer/src/store/terminals/parking/terminal-parking-input-owner.ts @@ -5,7 +5,7 @@ import { parkedWatchersByTabId, retireParkedTerminalTab } from '@/components/terminal-pane/parking/output-watchers/terminal-parked-watcher-registry' -import type { AppState } from '../types' +import type { AppState } from '../../types' import { readRecordChanges } from '@/store/keyed-record-change-reads' import { readTabRowChanges } from '@/store/keyed-tab-row-changes' import { @@ -13,19 +13,19 @@ import { sameTerminalParkingTitleSlots, sameTerminalParkingAssignmentChanges } from './terminal-parking-input-equality' -import { sleepingAgentRecordIndex } from './sleeping-agent-record-index' +import { sleepingAgentRecordIndex } from '../sleep/sleeping-agent-record-index' import { getTerminalTab, getTerminalTabOwnerWorktreeIds, getTerminalTabOwnerWorktreeId, getTerminalTabOwners -} from './terminal-tab-owner-index' +} from '../ownership/terminal-tab-owner-index' import { runtimeEnvironmentSupportsTerminalParking } from '@/components/terminal-pane/parking/retention/paired-runtime-parking-capabilities' import { invalidateTerminalParkingInputs, retireTerminalParkingInputs } from '@/components/terminal-pane/parking/terminal-parking-input-events' -import { parseRemoteRuntimePtyId } from '../../../../shared/remote-runtime/remote-runtime-pty-id' +import { parseRemoteRuntimePtyId } from '../../../../../shared/remote-runtime/remote-runtime-pty-id' import { SEAM_PARKING_TAB_FIELDS, SEAM_PARKING_WORKSPACE_FIELDS diff --git a/src/renderer/src/store/terminals/terminal-parking-input-transitions.ts b/src/renderer/src/store/terminals/parking/terminal-parking-input-transitions.ts similarity index 93% rename from src/renderer/src/store/terminals/terminal-parking-input-transitions.ts rename to src/renderer/src/store/terminals/parking/terminal-parking-input-transitions.ts index b69fcb65b24..5be14d025dd 100644 --- a/src/renderer/src/store/terminals/terminal-parking-input-transitions.ts +++ b/src/renderer/src/store/terminals/parking/terminal-parking-input-transitions.ts @@ -1,5 +1,5 @@ import type { StoreApi } from 'zustand' -import type { AppState } from '../types' +import type { AppState } from '../../types' import { acceptTerminalParkingInputs, publishAcceptedTerminalParkingInputs diff --git a/src/renderer/src/store/terminals/codex-restart-notice-account-identity.ts b/src/renderer/src/store/terminals/pty/codex-restart-notice-account-identity.ts similarity index 100% rename from src/renderer/src/store/terminals/codex-restart-notice-account-identity.ts rename to src/renderer/src/store/terminals/pty/codex-restart-notice-account-identity.ts diff --git a/src/renderer/src/store/terminals/terminal-activation-spawn-suppression.ts b/src/renderer/src/store/terminals/pty/terminal-activation-spawn-suppression.ts similarity index 90% rename from src/renderer/src/store/terminals/terminal-activation-spawn-suppression.ts rename to src/renderer/src/store/terminals/pty/terminal-activation-spawn-suppression.ts index 1e892bbcf9a..37a89e174d5 100644 --- a/src/renderer/src/store/terminals/terminal-activation-spawn-suppression.ts +++ b/src/renderer/src/store/terminals/pty/terminal-activation-spawn-suppression.ts @@ -1,7 +1,7 @@ import type { TerminalLayoutSnapshot, TerminalPaneLayoutNode -} from '../../../../shared/workspace-layout/terminal-tab-types' +} from '../../../../../shared/workspace-layout/terminal-tab-types' function countTerminalLayoutLeaves(node: TerminalPaneLayoutNode | null | undefined): number { if (!node) { diff --git a/src/renderer/src/store/terminals/terminal-disowned-pty-sources.ts b/src/renderer/src/store/terminals/pty/terminal-disowned-pty-sources.ts similarity index 93% rename from src/renderer/src/store/terminals/terminal-disowned-pty-sources.ts rename to src/renderer/src/store/terminals/pty/terminal-disowned-pty-sources.ts index d17268ce992..5bc28bd8bab 100644 --- a/src/renderer/src/store/terminals/terminal-disowned-pty-sources.ts +++ b/src/renderer/src/store/terminals/pty/terminal-disowned-pty-sources.ts @@ -1,4 +1,4 @@ -import type { TerminalSlice, TerminalStoreSet } from './terminal-state' +import type { TerminalSlice, TerminalStoreSet } from '../terminal-state' /** Only reachable relay’s exact-ID disown reply permits retiring binding/respawning; it is weaker than exited (restarted relays forget IDs) and may leak old processes. Lost links/timeouts/mismatches remain unverifiable (ssh-execution-boundary.md). Session-only. */ export function createTerminalDisownedPtySourceActions( diff --git a/src/renderer/src/store/terminals/terminal-exited-pane-liveness.test.ts b/src/renderer/src/store/terminals/pty/terminal-exited-pane-liveness.test.ts similarity index 79% rename from src/renderer/src/store/terminals/terminal-exited-pane-liveness.test.ts rename to src/renderer/src/store/terminals/pty/terminal-exited-pane-liveness.test.ts index 32b956f133a..26f1485cc60 100644 --- a/src/renderer/src/store/terminals/terminal-exited-pane-liveness.test.ts +++ b/src/renderer/src/store/terminals/pty/terminal-exited-pane-liveness.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from 'vitest' -import type { TerminalLayoutSnapshot } from '../../../../shared/workspace-layout/terminal-tab-types' -import { tabHasLivePty } from '../../../../shared/tab-has-live-pty' -import { createTestStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { createStoreSessionMockApi } from '../testing/app-store-session-api.test-fixture' +import type { TerminalLayoutSnapshot } from '../../../../../shared/workspace-layout/terminal-tab-types' + +import { createTestStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' +import { createStoreSessionMockApi } from '../../testing/app-store-session-api.test-fixture' vi.mock('sonner', () => ({ toast: { info: vi.fn(), success: vi.fn(), error: vi.fn() } })) @@ -55,7 +55,7 @@ describe('exited pane in a split', () => { const state = store.getState() expect(state.ptyIdsByTabId['tab-1']).toEqual(['pty-right']) - expect(tabHasLivePty(state.ptyIdsByTabId, 'tab-1')).toBe(true) + expect(state.terminalLayoutsByTabId['tab-1']).toEqual(splitLayout()) }) @@ -66,7 +66,7 @@ describe('exited pane in a split', () => { store.getState().clearTabPtyId('tab-1', 'pty-right') const state = store.getState() - expect(tabHasLivePty(state.ptyIdsByTabId, 'tab-1')).toBe(false) + expect(state.tabsByWorktree[WORKTREE]?.[0]?.ptyId).toBeNull() expect(state.terminalLayoutsByTabId['tab-1']?.ptyIdsByLeafId).toEqual({ [LEFT]: 'pty-left', diff --git a/src/renderer/src/store/terminals/terminal-pty-bindings.ts b/src/renderer/src/store/terminals/pty/terminal-pty-bindings.ts similarity index 97% rename from src/renderer/src/store/terminals/terminal-pty-bindings.ts rename to src/renderer/src/store/terminals/pty/terminal-pty-bindings.ts index 3a78952fa45..6d277e06303 100644 --- a/src/renderer/src/store/terminals/terminal-pty-bindings.ts +++ b/src/renderer/src/store/terminals/pty/terminal-pty-bindings.ts @@ -1,11 +1,11 @@ import { replaceTabBuckets, replaceRecordEntries } from '@/store/keyed-record-transitions' -import { getFirstTerminalTabOwnerWorktreeId } from './terminal-tab-owner-index' +import { getFirstTerminalTabOwnerWorktreeId } from '../ownership/terminal-tab-owner-index' import { isRemoteRuntimePtyId, parseRemoteRuntimePtyId, toRemoteRuntimePtyId -} from '../../../../shared/remote-runtime/remote-runtime-pty-id' -import { isTerminalTabPresent } from './terminal-tab-retirement' +} from '../../../../../shared/remote-runtime/remote-runtime-pty-id' +import { isTerminalTabPresent } from '../retirement/terminal-tab-retirement' import { consumePendingActivationSpawn, getPendingActivationSpawnCount @@ -13,7 +13,7 @@ import { import { omitUnverifiedPtyLossTabIds } from './terminal-unverified-pty-loss' import { clearWorktreeSleepIntent } from '@/lib/workspace/sleep/worktree-sleep-intent' import { omitDisownedPtyIds } from './terminal-disowned-pty-sources' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' export function createTerminalPtyBindingActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/terminal-pty-identities.ts b/src/renderer/src/store/terminals/pty/terminal-pty-identities.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-pty-identities.ts rename to src/renderer/src/store/terminals/pty/terminal-pty-identities.ts index 9cc683113d7..fd0fedb32d3 100644 --- a/src/renderer/src/store/terminals/terminal-pty-identities.ts +++ b/src/renderer/src/store/terminals/pty/terminal-pty-identities.ts @@ -1,13 +1,13 @@ import { replaceTabBuckets } from '@/store/keyed-record-transitions' -import { getFirstTerminalTabOwnerWorktreeId } from './terminal-tab-owner-index' +import { getFirstTerminalTabOwnerWorktreeId } from '../ownership/terminal-tab-owner-index' import type { TerminalLayoutSnapshot, TerminalTab -} from '../../../../shared/workspace-layout/terminal-tab-types' +} from '../../../../../shared/workspace-layout/terminal-tab-types' import { parseLegacyNumericPaneKey, parsePaneKey -} from '../../../../shared/workspace-layout/stable-pane-id' +} from '../../../../../shared/workspace-layout/stable-pane-id' export function getPendingActivationSpawnCount(value: boolean | number | undefined): number { if (value === true) { diff --git a/src/renderer/src/store/terminals/terminal-pty-identity-replacement.test.ts b/src/renderer/src/store/terminals/pty/terminal-pty-identity-replacement.test.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-pty-identity-replacement.test.ts rename to src/renderer/src/store/terminals/pty/terminal-pty-identity-replacement.test.ts index 128b470ffc7..3e732dc05da 100644 --- a/src/renderer/src/store/terminals/terminal-pty-identity-replacement.test.ts +++ b/src/renderer/src/store/terminals/pty/terminal-pty-identity-replacement.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' { describe('terminal PTY identity replacement', () => { diff --git a/src/renderer/src/store/terminals/terminal-pty-release-orphan-retention.test.ts b/src/renderer/src/store/terminals/pty/terminal-pty-release-orphan-retention.test.ts similarity index 88% rename from src/renderer/src/store/terminals/terminal-pty-release-orphan-retention.test.ts rename to src/renderer/src/store/terminals/pty/terminal-pty-release-orphan-retention.test.ts index ecfcde7431b..7891a7c5610 100644 --- a/src/renderer/src/store/terminals/terminal-pty-release-orphan-retention.test.ts +++ b/src/renderer/src/store/terminals/pty/terminal-pty-release-orphan-retention.test.ts @@ -1,11 +1,11 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { getOrphanTerminalIds } from './terminal-orphan-cleanup' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' + +import { createStoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' const mockUnregisterPtyDataHandlers = vi.hoisted(() => vi.fn<() => unknown[]>(() => [])) const mockRestorePtyDataHandlersAfterFailedShutdown = vi.hoisted(() => vi.fn()) @@ -79,6 +79,5 @@ describe('setActiveWorktree', () => { expect(state.ptyIdsByTabId[tabId]).toEqual([]) expect(state.tabsByWorktree[wt][0].ptyId).toBeNull() expect(state.lastKnownRelayPtyIdByTabId[tabId]).toBe('pty-A') - expect(getOrphanTerminalIds(state, wt)).not.toContain(tabId) }) }) diff --git a/src/renderer/src/store/terminals/terminal-pty-release.ts b/src/renderer/src/store/terminals/pty/terminal-pty-release.ts similarity index 95% rename from src/renderer/src/store/terminals/terminal-pty-release.ts rename to src/renderer/src/store/terminals/pty/terminal-pty-release.ts index 06fe7c9dda9..03b1596d1db 100644 --- a/src/renderer/src/store/terminals/terminal-pty-release.ts +++ b/src/renderer/src/store/terminals/pty/terminal-pty-release.ts @@ -1,12 +1,12 @@ import { replaceTabBuckets, replaceRecordEntries } from '@/store/keyed-record-transitions' -import { getFirstTerminalTabOwnerWorktreeId } from './terminal-tab-owner-index' -import { isRemoteRuntimePtyId } from '../../../../shared/remote-runtime/remote-runtime-pty-id' +import { getFirstTerminalTabOwnerWorktreeId } from '../ownership/terminal-tab-owner-index' +import { isRemoteRuntimePtyId } from '../../../../../shared/remote-runtime/remote-runtime-pty-id' import { hasWorktreeSleepIntent } from '@/lib/workspace/sleep/worktree-sleep-intent' import { consumePendingActivationSpawn, getPendingActivationSpawnCount } from './terminal-pty-identities' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' export function createTerminalPtyReleaseActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/terminal-restart-state.ts b/src/renderer/src/store/terminals/pty/terminal-restart-state.ts similarity index 98% rename from src/renderer/src/store/terminals/terminal-restart-state.ts rename to src/renderer/src/store/terminals/pty/terminal-restart-state.ts index 667091f1313..0d07fc3930c 100644 --- a/src/renderer/src/store/terminals/terminal-restart-state.ts +++ b/src/renderer/src/store/terminals/pty/terminal-restart-state.ts @@ -1,6 +1,6 @@ import { isSameCodexRestartNoticeAccount } from './codex-restart-notice-account-identity' -import type { AccountRestartAgent } from './terminal-contracts' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import type { AccountRestartAgent } from '../terminal-contracts' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' // Why: Codex notice cleanup shares this map with Claude switch restarts and must not drop them. function dropQueuedCodexRestart(pending: Record, ptyId: string): void { diff --git a/src/renderer/src/store/terminals/terminal-tab-recovery-ledger.ts b/src/renderer/src/store/terminals/pty/terminal-tab-recovery-ledger.ts similarity index 99% rename from src/renderer/src/store/terminals/terminal-tab-recovery-ledger.ts rename to src/renderer/src/store/terminals/pty/terminal-tab-recovery-ledger.ts index 72332ea4c6f..e14ca3422b5 100644 --- a/src/renderer/src/store/terminals/terminal-tab-recovery-ledger.ts +++ b/src/renderer/src/store/terminals/pty/terminal-tab-recovery-ledger.ts @@ -3,7 +3,7 @@ import type { TerminalPaneRecoveryReason, TerminalTab, TerminalTabRecoveryLedger -} from '../../../../shared/workspace-layout/terminal-tab-types' +} from '../../../../../shared/workspace-layout/terminal-tab-types' // Row-owned recovery survives remount disposal that erased module-map budgets (b5cfc6ca). Pending attempts block repeats; observed failure refuses the same reason until a new trigger. diff --git a/src/renderer/src/store/terminals/terminal-tab-recovery-remount.test.ts b/src/renderer/src/store/terminals/pty/terminal-tab-recovery-remount.test.ts similarity index 86% rename from src/renderer/src/store/terminals/terminal-tab-recovery-remount.test.ts rename to src/renderer/src/store/terminals/pty/terminal-tab-recovery-remount.test.ts index a7276b250ed..078a6786041 100644 --- a/src/renderer/src/store/terminals/terminal-tab-recovery-remount.test.ts +++ b/src/renderer/src/store/terminals/pty/terminal-tab-recovery-remount.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import './terminal-tab-retirement' -import { folderWorkspaceKey } from '../../../../shared/workspace-scope' -import { createStoreSessionMockApi } from '../testing/app-store-session-api.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' +import '../retirement/terminal-tab-retirement' +import { folderWorkspaceKey } from '../../../../../shared/workspace-scope' +import { createStoreSessionMockApi } from '../../testing/app-store-session-api.test-fixture' const WORKTREE_ID = 'repo1::/path/wt1' diff --git a/src/renderer/src/store/terminals/terminal-unverified-pty-loss.ts b/src/renderer/src/store/terminals/pty/terminal-unverified-pty-loss.ts similarity index 94% rename from src/renderer/src/store/terminals/terminal-unverified-pty-loss.ts rename to src/renderer/src/store/terminals/pty/terminal-unverified-pty-loss.ts index 075d349a528..1f740d7ec69 100644 --- a/src/renderer/src/store/terminals/terminal-unverified-pty-loss.ts +++ b/src/renderer/src/store/terminals/pty/terminal-unverified-pty-loss.ts @@ -1,4 +1,4 @@ -import type { TerminalSlice, TerminalStoreSet } from './terminal-state' +import type { TerminalSlice, TerminalStoreSet } from '../terminal-state' /** Session-scoped protection for tabs whose host disappeared before an exit was proven. */ export function createTerminalUnverifiedPtyLossActions( diff --git a/src/renderer/src/store/terminals/terminal-quick-command-hosts.ts b/src/renderer/src/store/terminals/quick-commands/terminal-quick-command-hosts.ts similarity index 94% rename from src/renderer/src/store/terminals/terminal-quick-command-hosts.ts rename to src/renderer/src/store/terminals/quick-commands/terminal-quick-command-hosts.ts index 1f16e0fa5a4..f0b2668bd4b 100644 --- a/src/renderer/src/store/terminals/terminal-quick-command-hosts.ts +++ b/src/renderer/src/store/terminals/quick-commands/terminal-quick-command-hosts.ts @@ -1,20 +1,20 @@ import type { StateCreator } from 'zustand' import { toast } from 'sonner' -import type { AppState } from '../types' -import type { TerminalQuickCommand } from '../../../../shared/terminal/quick-commands/terminal-quick-command-types' +import type { AppState } from '../../types' +import type { TerminalQuickCommand } from '../../../../../shared/terminal/quick-commands/terminal-quick-command-types' import { applyTerminalQuickCommandMutation, parseNormalizedTerminalQuickCommands, type TerminalQuickCommandMutation -} from '../../../../shared/terminal/quick-commands/terminal-quick-commands' -import { parseExecutionHostId, type ExecutionHostId } from '../../../../shared/execution-host' -import '../../../../shared/protocol-version' -import { TERMINAL_QUICK_COMMANDS_RUNTIME_CAPABILITY } from '../../../../shared/terminal/quick-commands/terminal-quick-command-capabilities' +} from '../../../../../shared/terminal/quick-commands/terminal-quick-commands' +import { parseExecutionHostId, type ExecutionHostId } from '../../../../../shared/execution-host' +import '../../../../../shared/protocol-version' +import { TERMINAL_QUICK_COMMANDS_RUNTIME_CAPABILITY } from '../../../../../shared/terminal/quick-commands/terminal-quick-command-capabilities' import { callRuntimeRpc } from '@/runtime/rpc/calls/runtime-rpc-call' import { runtimeEnvironmentSupportsCapability } from '@/runtime/rpc/compatibility/runtime-capability-proof' import { translate } from '@/i18n/i18n' import { extractIpcErrorMessage } from '@/runtime/errors/ipc-error' -import { getRuntimeEnvironmentConnectionGeneration } from '../slices/runtime-status/runtime-status-connection-generation' +import { getRuntimeEnvironmentConnectionGeneration } from '../../slices/runtime-status/runtime-status-connection-generation' export type RuntimeTerminalQuickCommands = { commands: TerminalQuickCommand[] diff --git a/src/renderer/src/store/terminals/legacy-relay-bridged-tab-close.ts b/src/renderer/src/store/terminals/retirement/legacy-relay-bridged-tab-close.ts similarity index 100% rename from src/renderer/src/store/terminals/legacy-relay-bridged-tab-close.ts rename to src/renderer/src/store/terminals/retirement/legacy-relay-bridged-tab-close.ts diff --git a/src/renderer/src/store/terminals/paired-terminal-tab-close-intent-actions.ts b/src/renderer/src/store/terminals/retirement/paired-terminal-tab-close-intent-actions.ts similarity index 88% rename from src/renderer/src/store/terminals/paired-terminal-tab-close-intent-actions.ts rename to src/renderer/src/store/terminals/retirement/paired-terminal-tab-close-intent-actions.ts index 6bf11fcbf35..7c8a5b5b14d 100644 --- a/src/renderer/src/store/terminals/paired-terminal-tab-close-intent-actions.ts +++ b/src/renderer/src/store/terminals/retirement/paired-terminal-tab-close-intent-actions.ts @@ -1,9 +1,9 @@ -import type { PairedTerminalTabCloseIntent } from '../../../../shared/workspace-layout/terminal-surfaces/paired-terminal-tab-close-intent' +import type { PairedTerminalTabCloseIntent } from '../../../../../shared/workspace-layout/terminal-surfaces/paired-terminal-tab-close-intent' import { clearPairedTerminalTabCloseIntents, recordPairedTerminalTabCloseIntent, type PairedTerminalTabCloseIntentsByEnvironment -} from '../../runtime/web-session-tabs-sync/closing/paired-terminal-tab-close-intents' +} from '../../../runtime/web-session-tabs-sync/closing/paired-terminal-tab-close-intents' export type PairedTerminalTabCloseIntentSlice = { /** Persist unacknowledged paired-host closes by environment so reload/snapshots cannot reopen closed tabs. */ diff --git a/src/renderer/src/store/terminals/retired-terminal-tab-state-sweep.ts b/src/renderer/src/store/terminals/retirement/retired-terminal-tab-state-sweep.ts similarity index 91% rename from src/renderer/src/store/terminals/retired-terminal-tab-state-sweep.ts rename to src/renderer/src/store/terminals/retirement/retired-terminal-tab-state-sweep.ts index bcac0c0de77..c300535a71b 100644 --- a/src/renderer/src/store/terminals/retired-terminal-tab-state-sweep.ts +++ b/src/renderer/src/store/terminals/retirement/retired-terminal-tab-state-sweep.ts @@ -1,18 +1,18 @@ -import { removePaneKeys } from '../slices/agent-status/agent-status-pane-keyed-records' -import type { AppState } from '../types' +import { removePaneKeys } from '../../slices/agent-status/agent-status-pane-keyed-records' +import type { AppState } from '../../types' import { forgetAgentHibernationTabOutput } from '@/lib/agent-session/hibernation/agent-hibernation-output-activity' import { forgetForegroundTerminalTabs } from '@/components/terminal-pane/parking/retention/foreground-terminal-tabs' import { forgetAgentStartupDeliveriesForTabs } from '@/lib/agent-session/launch/startup/agent-startup-delivery-guards' // Use store-free registry to avoid a slice-evaluation cycle through terminal-parked-tab-watchers. import { retireParkedTerminalTab } from '@/components/terminal-pane/parking/output-watchers/terminal-parked-watcher-registry' import { forgetNativeChatPromptDismissalsForTab } from '@/components/native-chat/prompts/native-chat-prompt-dismissals' -import { retireAgentPaneAuthorityAliasesByOwnerTab } from '../slices/agent-status/agent-pane-authority' -import '../slices/agent-status/agent-status' +import { retireAgentPaneAuthorityAliasesByOwnerTab } from '../../slices/agent-status/agent-pane-authority' +import '../../slices/agent-status/agent-status' import { buildAgentStatusTabPrefixDropPatch, type AgentStatusTabPrefixDropState -} from '../slices/agent-status/agent-status-drop-reducer' -import { buildPaneForegroundAgentTabPrefixClearPatch } from '../slices/agent-status/pane-foreground-agent' +} from '../../slices/agent-status/agent-status-drop-reducer' +import { buildPaneForegroundAgentTabPrefixClearPatch } from '../../slices/agent-status/pane-foreground-agent' export type RetiredTerminalTabSweepActions = Pick< AppState, diff --git a/src/renderer/src/store/terminals/terminal-last-tab-close.test.ts b/src/renderer/src/store/terminals/retirement/terminal-last-tab-close.test.ts similarity index 87% rename from src/renderer/src/store/terminals/terminal-last-tab-close.test.ts rename to src/renderer/src/store/terminals/retirement/terminal-last-tab-close.test.ts index caf6a1a2c2d..3410bccff80 100644 --- a/src/renderer/src/store/terminals/terminal-last-tab-close.test.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-last-tab-close.test.ts @@ -1,11 +1,11 @@ import { afterEach, describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeTabGroup, makeUnifiedTab } from '../slices/tabs/tab-group.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' -import type { TabsDrawnFromMain } from '../slices/tabs/tabs-drawn-from-main.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeTabGroup, makeUnifiedTab } from '../../slices/tabs/tab-group.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' +import { createStoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' +import type { TabsDrawnFromMain } from '../../slices/tabs/tabs-drawn-from-main.test-fixture' const mockUnregisterPtyDataHandlers = vi.hoisted(() => vi.fn<() => unknown[]>(() => [])) const mockRestorePtyDataHandlersAfterFailedShutdown = vi.hoisted(() => vi.fn()) diff --git a/src/renderer/src/store/terminals/terminal-notice-removal.ts b/src/renderer/src/store/terminals/retirement/terminal-notice-removal.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-notice-removal.ts rename to src/renderer/src/store/terminals/retirement/terminal-notice-removal.ts diff --git a/src/renderer/src/store/terminals/terminal-orphan-cleanup.ts b/src/renderer/src/store/terminals/retirement/terminal-orphan-cleanup.ts similarity index 99% rename from src/renderer/src/store/terminals/terminal-orphan-cleanup.ts rename to src/renderer/src/store/terminals/retirement/terminal-orphan-cleanup.ts index 8d21eaa8e4d..9d6b3708e0c 100644 --- a/src/renderer/src/store/terminals/terminal-orphan-cleanup.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-orphan-cleanup.ts @@ -1,5 +1,5 @@ import { replaceTabBuckets, replaceRecordEntries } from '@/store/keyed-record-transitions' -import type { AppState } from '../types' +import type { AppState } from '../../types' type TerminalTabReconnectState = Pick< AppState, diff --git a/src/renderer/src/store/terminals/terminal-retirement-teardown-reservation.ts b/src/renderer/src/store/terminals/retirement/terminal-retirement-teardown-reservation.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-retirement-teardown-reservation.ts rename to src/renderer/src/store/terminals/retirement/terminal-retirement-teardown-reservation.ts diff --git a/src/renderer/src/store/terminals/terminal-surface-close-intent.ts b/src/renderer/src/store/terminals/retirement/terminal-surface-close-intent.ts similarity index 82% rename from src/renderer/src/store/terminals/terminal-surface-close-intent.ts rename to src/renderer/src/store/terminals/retirement/terminal-surface-close-intent.ts index 0799985b29f..821564ba848 100644 --- a/src/renderer/src/store/terminals/terminal-surface-close-intent.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-surface-close-intent.ts @@ -1,4 +1,4 @@ -import type { TerminalSurfaceCloseTarget } from '../../../../shared/workspace-layout/terminal-surfaces/terminal-surface-close-target' +import type { TerminalSurfaceCloseTarget } from '../../../../../shared/workspace-layout/terminal-surfaces/terminal-surface-close-target' /** Commits a terminal tab or split-pane close in main, which owns membership: a renderer save * cannot shrink it, so without this the close would ride on the PTY exit. */ diff --git a/src/renderer/src/store/terminals/terminal-tab-close-intent.test.ts b/src/renderer/src/store/terminals/retirement/terminal-tab-close-intent.test.ts similarity index 72% rename from src/renderer/src/store/terminals/terminal-tab-close-intent.test.ts rename to src/renderer/src/store/terminals/retirement/terminal-tab-close-intent.test.ts index e7c5b290e74..f61c4c1bf05 100644 --- a/src/renderer/src/store/terminals/terminal-tab-close-intent.test.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-tab-close-intent.test.ts @@ -1,12 +1,11 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { TEST_REPO } from '../repos/repo.test-fixture' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { TEST_REPO } from '../../repos/repo.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' +import { createStoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' import { layoutApplyTestTransport } from '@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (importOriginal) => ( @@ -14,28 +13,6 @@ vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (importOriginal) => ).runtimeRpcClientWithLayoutApply(await importOriginal()) ) -type CloseReason = 'user' | 'cleanup' - -/** The closes main was told to record: `closeTabs` intents with the switch on, else today's call. */ -function sentCloses( - closeTerminalSurface: ReturnType -): { worktreeId: string; tabId: string; reason: CloseReason }[] { - if (ORCA_LAYOUT_OWNER_IS_MAIN) { - // Main hears each close once: never also through today's call. - expect(closeTerminalSurface).not.toHaveBeenCalled() - return layoutApplyTestTransport.sentOfType('closeTabs').map((command) => ({ - worktreeId: command.workspace, - tabId: command.tabIds[0]!, - reason: command.recordClose === 'cleanup' ? 'cleanup' : 'user' - })) - } - return closeTerminalSurface.mock.calls.map(([args]) => ({ - worktreeId: args.worktreeId, - tabId: args.target.tabId, - reason: args.reason - })) -} - vi.mock('sonner', () => ({ toast: { info: vi.fn(), success: vi.fn(), error: vi.fn(), warning: vi.fn() } })) @@ -88,17 +65,15 @@ vi.mock('@/lib/agent-status/aggregation/worktree-agent-status', async (importOri mockApi.worktrees.updateMeta.mockResolvedValue({}) }) - it('removes the tab and kills it without waiting for main to write the close', async () => { + it('removes the tab without waiting for main to write the close', async () => { closeTerminalSurface.mockReturnValue(new Promise(() => {})) layoutApplyTestTransport.answerWith('pending') const store = storeWithSshTab() store.getState().closeTab('ssh-tab') - expect(sentCloses(closeTerminalSurface)).toHaveLength(1) expect(store.getState().tabsByWorktree[SSH_WORKTREE]).toEqual([]) await Promise.resolve() - expect(mockApi.pty.kill).toHaveBeenCalledWith(SSH_PTY) }) }) } @@ -144,12 +119,11 @@ vi.mock('@/lib/agent-status/aggregation/worktree-agent-status', async (importOri cacheTimerByKey: { 'tab-a:leaf': 1, 'tab-b:leaf': 2 }, unreadTerminalPanes: { 'tab-a:leaf': true } } as never) - const before = store.getState() store.getState().closeTab('tab-a') const after = store.getState() - expect(after.expandedPaneByTabId).not.toBe(before.expandedPaneByTabId) + expect(after.expandedPaneByTabId).toEqual({ 'tab-b': false }) expect(after.pendingStartupByTabId).toEqual({}) expect(after.cacheTimerByKey).toEqual({ 'tab-b:leaf': 2 }) diff --git a/src/renderer/src/store/terminals/terminal-tab-close-layout-owner.ts b/src/renderer/src/store/terminals/retirement/terminal-tab-close-layout-owner.ts similarity index 96% rename from src/renderer/src/store/terminals/terminal-tab-close-layout-owner.ts rename to src/renderer/src/store/terminals/retirement/terminal-tab-close-layout-owner.ts index b287816680b..73da64729e3 100644 --- a/src/renderer/src/store/terminals/terminal-tab-close-layout-owner.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-tab-close-layout-owner.ts @@ -1,4 +1,4 @@ -import type { AppState } from '../types' +import type { AppState } from '../../types' import type { WorktreeRuntimeOwnerState } from '@/lib/workspace/ownership/worktree-runtime-owner-state' import { sendLayoutApply } from '@/runtime/workspace-layout/commands/layout-apply-send' import { commitTerminalSurfaceClose } from './terminal-surface-close-intent' diff --git a/src/renderer/src/store/terminals/terminal-tab-close-providers.ts b/src/renderer/src/store/terminals/retirement/terminal-tab-close-providers.ts similarity index 98% rename from src/renderer/src/store/terminals/terminal-tab-close-providers.ts rename to src/renderer/src/store/terminals/retirement/terminal-tab-close-providers.ts index 744c8c27dbb..6cbde8036ae 100644 --- a/src/renderer/src/store/terminals/terminal-tab-close-providers.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-tab-close-providers.ts @@ -2,7 +2,7 @@ import { captureRuntimeEnvironmentRequestRevision, getRuntimeEnvironmentRevision } from '@/runtime/rpc/environment-revisions/runtime-environment-revision' -import type { AppState } from '../types' +import type { AppState } from '../../types' import { callRuntimeRpc } from '@/runtime/rpc/calls/runtime-rpc-call' import { ensureRuntimeEnvironmentCompatible } from '@/runtime/rpc/compatibility/runtime-compatibility-probe' import { diff --git a/src/renderer/src/store/terminals/terminal-tab-close.ts b/src/renderer/src/store/terminals/retirement/terminal-tab-close.ts similarity index 93% rename from src/renderer/src/store/terminals/terminal-tab-close.ts rename to src/renderer/src/store/terminals/retirement/terminal-tab-close.ts index 97ce5648c70..c9e250f2fe5 100644 --- a/src/renderer/src/store/terminals/terminal-tab-close.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-tab-close.ts @@ -2,31 +2,31 @@ import { getTerminalNoticeLifetime, retireTerminalNoticeLifetime } from '@/components/terminal-pane/provider-notices/terminal-notice-lifetime' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' import { sweepRetiredTerminalTabState } from './retired-terminal-tab-state-sweep' -import { getRecentlyClosedTabPosition } from '../slices/tabs/recently-closed-tab-position' -import { pushClosedTerminalTabSnapshot } from './recently-closed-terminal-tabs' -import { pushRecentlyClosedTabKind } from '../slices/tabs/recently-closed-tabs' +import { getRecentlyClosedTabPosition } from '../../slices/tabs/recently-closed-tab-position' +import { pushClosedTerminalTabSnapshot } from '../tabs/recently-closed-terminal-tabs' +import { pushRecentlyClosedTabKind } from '../../slices/tabs/recently-closed-tabs' // Use store-free registry to avoid reentering slice creation through terminal-parked-tab-watchers. import { retireParkedTerminalTab } from '@/components/terminal-pane/parking/output-watchers/terminal-parked-watcher-registry' import { buildTerminalTabRetirementPlan } from './terminal-tab-retirement' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' import { startTerminalTabProviderRetirement } from './terminal-tab-close-providers' import { stopLegacyRelayBridgedShellsForTab } from './legacy-relay-bridged-tab-close' import { commitTerminalSurfaceClose } from './terminal-surface-close-intent' import { recordTerminalTabCloseThroughLayoutOwner } from './terminal-tab-close-layout-owner' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' -import { omitUnverifiedPtyLossTabIds } from './terminal-unverified-pty-loss' -import { removePaneKeysByTabPrefix } from '../slices/agent-status/agent-status-pane-keyed-records' -import { removeTabsAttention } from '../slices/workspace-attention/subject-attention-transitions' -import { omitRecordKeys } from '../slices/worktrees/teardown/record-key-omission' +import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch' +import { omitUnverifiedPtyLossTabIds } from '../pty/terminal-unverified-pty-loss' +import { removePaneKeysByTabPrefix } from '../../slices/agent-status/agent-status-pane-keyed-records' +import { removeTabsAttention } from '../../slices/workspace-attention/subject-attention-transitions' +import { omitRecordKeys } from '../../slices/worktrees/teardown/record-key-omission' import { deleteNativeChatComposerDraftsForTab } from '@/components/native-chat/drafts/native-chat-composer-draft-removal' import { dropNativeChatPendingAttachmentsForTab } from '@/components/native-chat/attachments/chips/native-chat-pending-attachment-cache' import { noteAgentLaunchPaneClosedByUser } from '@/lib/agent-session/launch/pane/agent-launch-pane-closes' import { settleAgentLaunchPaneStart } from '@/lib/agent-session/launch/pane/agent-launch-pane-start' -import { settleAttentionRemovedBy } from '../slices/workspace-attention/attention-removal-follow-up' -import { runAsAutomaticDeselection } from '../workspaces/selection/active-worktree-deselection-intent' -import { recordDraft, tabBucketDraft } from '../keyed-record-transitions' +import { settleAttentionRemovedBy } from '../../slices/workspace-attention/attention-removal-follow-up' +import { runAsAutomaticDeselection } from '../../workspaces/selection/active-worktree-deselection-intent' +import { recordDraft, tabBucketDraft } from '../../keyed-record-transitions' export function createTerminalTabCloseActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/retirement/terminal-tab-retirement-store.test.ts b/src/renderer/src/store/terminals/retirement/terminal-tab-retirement-store.test.ts new file mode 100644 index 00000000000..2a7fa8f5d0d --- /dev/null +++ b/src/renderer/src/store/terminals/retirement/terminal-tab-retirement-store.test.ts @@ -0,0 +1,81 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mockKill = vi.fn().mockResolvedValue(undefined) +const mockRuntimeCall = vi.fn().mockResolvedValue({ + id: 'rpc-1', + ok: true, + result: {}, + _meta: { runtimeId: 'local-runtime' } +}) + +vi.stubGlobal('window', { + api: { + pty: { kill: mockKill }, + runtime: { call: mockRuntimeCall }, + runtimeEnvironments: { call: vi.fn() } + } +}) + +import { + capturedPanesByTabId, + parkedWatchersByTabId +} from '@/components/terminal-pane/parking/output-watchers/terminal-parked-watcher-registry' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' + +import { makeTabGroup, makeUnifiedTab } from '../../slices/tabs/tab-group.test-fixture' + +function createRetirementStore() { + const store = createTestStore() + seedStore(store, { + worktreesByRepo: { + repo1: [makeWorktree({ id: 'wt-1', repoId: 'repo1', path: '/repo/wt-1' })] + } + }) + return store +} + +describe('terminal tab retirement store boundary', () => { + beforeEach(() => { + vi.clearAllMocks() + mockKill.mockResolvedValue(undefined) + mockRuntimeCall.mockResolvedValue({ + id: 'rpc-1', + ok: true, + result: {}, + _meta: { runtimeId: 'local-runtime' } + }) + parkedWatchersByTabId.clear() + capturedPanesByTabId.clear() + }) + + it('retires a unified-only terminal instead of removing only its wrapper', async () => { + const store = createRetirementStore() + const unified = makeUnifiedTab({ + id: 'unified-tab-1', + entityId: 'terminal-tab-1', + worktreeId: 'wt-1', + groupId: 'group-1' + }) + seedStore(store, { + tabsByWorktree: { 'wt-1': [] }, + unifiedTabsByWorktree: { 'wt-1': [unified] }, + groupsByWorktree: { + 'wt-1': [ + makeTabGroup({ + id: 'group-1', + worktreeId: 'wt-1', + activeTabId: unified.id, + tabOrder: [unified.id] + }) + ] + }, + ptyIdsByTabId: { 'terminal-tab-1': ['pty-unified-only'] } + }) + + store.getState().closeUnifiedTab(unified.id) + + expect(store.getState().unifiedTabsByWorktree['wt-1']).toEqual([]) + expect(store.getState().ptyIdsByTabId['terminal-tab-1']).toBeUndefined() + }) +}) diff --git a/src/renderer/src/store/terminals/terminal-tab-retirement.ts b/src/renderer/src/store/terminals/retirement/terminal-tab-retirement.ts similarity index 94% rename from src/renderer/src/store/terminals/terminal-tab-retirement.ts rename to src/renderer/src/store/terminals/retirement/terminal-tab-retirement.ts index 8b13454f1f6..aa30e9760f8 100644 --- a/src/renderer/src/store/terminals/terminal-tab-retirement.ts +++ b/src/renderer/src/store/terminals/retirement/terminal-tab-retirement.ts @@ -1,18 +1,18 @@ import { isRemoteRuntimePtyId, parseRemoteRuntimePtyId -} from '../../../../shared/remote-runtime/remote-runtime-pty-id' -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' -import type { AppState } from '../types' +} from '../../../../../shared/remote-runtime/remote-runtime-pty-id' +import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' +import type { AppState } from '../../types' import type { WorktreeRuntimeOwnerState } from '@/lib/workspace/ownership/worktree-runtime-owner-state' import { resolveTerminalHostOwnership, resolveTerminalPtyOwner } from '@/lib/workspace/ownership/terminal-worktree-route' -import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../shared/constants' -import { isEphemeralSetupTerminalWorktreeId } from '../../../../shared/ephemeral-setup-terminal-worktree-id' -import { parseWorkspaceKey } from '../../../../shared/workspace-scope' -import { locateTerminalTab } from './terminal-tab-location' +import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../../shared/constants' +import { isEphemeralSetupTerminalWorktreeId } from '../../../../../shared/ephemeral-setup-terminal-worktree-id' +import { parseWorkspaceKey } from '../../../../../shared/workspace-scope' +import { locateTerminalTab } from '../ownership/terminal-tab-location' export type TerminalTabCloseReason = 'user' | 'cleanup' | 'pty-exit' diff --git a/src/renderer/src/store/terminals/sleeping-agent-record-index.ts b/src/renderer/src/store/terminals/sleep/sleeping-agent-record-index.ts similarity index 98% rename from src/renderer/src/store/terminals/sleeping-agent-record-index.ts rename to src/renderer/src/store/terminals/sleep/sleeping-agent-record-index.ts index b085f3678d0..2dff9b5e846 100644 --- a/src/renderer/src/store/terminals/sleeping-agent-record-index.ts +++ b/src/renderer/src/store/terminals/sleep/sleeping-agent-record-index.ts @@ -1,4 +1,4 @@ -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' +import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' import { readRecordChanges } from '@/store/keyed-record-change-reads' type Records = Readonly> diff --git a/src/renderer/src/store/terminals/store-sleep-exact-runtime-stop.test.ts b/src/renderer/src/store/terminals/sleep/store-sleep-exact-runtime-stop.test.ts similarity index 87% rename from src/renderer/src/store/terminals/store-sleep-exact-runtime-stop.test.ts rename to src/renderer/src/store/terminals/sleep/store-sleep-exact-runtime-stop.test.ts index 4677af92565..b28e210e8d7 100644 --- a/src/renderer/src/store/terminals/store-sleep-exact-runtime-stop.test.ts +++ b/src/renderer/src/store/terminals/sleep/store-sleep-exact-runtime-stop.test.ts @@ -1,14 +1,14 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { getDefaultSettings } from '../../../../shared/constants' -import { createCompatibleRuntimeStatusResponseIfNeeded } from '../../runtime/rpc/testing/runtime-compatibility-test-fixture' -import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../runtime/rpc/compatibility/runtime-compatibility-cache' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeRuntimeOwnedWorktree } from '../slices/worktrees/worktree-owner.test-fixture' -import { makeTab } from './terminal-tab.test-fixture' +import { getDefaultSettings } from '../../../../../shared/constants' +import { createCompatibleRuntimeStatusResponseIfNeeded } from '../../../runtime/rpc/testing/runtime-compatibility-test-fixture' +import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../../runtime/rpc/compatibility/runtime-compatibility-cache' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeRuntimeOwnedWorktree } from '../../slices/worktrees/worktree-owner.test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' import { shutdownBufferCaptures } from '@/components/terminal-pane/snapshots/shutdown-buffer-captures' import { applySleepRuntimeRpcDefault } from './terminal-sleep-rpc.test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { createStoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' const mockUnregisterPtyDataHandlers = vi.hoisted(() => vi.fn<() => unknown[]>(() => [])) const mockRestorePtyDataHandlersAfterFailedShutdown = vi.hoisted(() => vi.fn()) diff --git a/src/renderer/src/store/terminals/store-sleep-pane-hibernation.test.ts b/src/renderer/src/store/terminals/sleep/store-sleep-pane-hibernation.test.ts similarity index 82% rename from src/renderer/src/store/terminals/store-sleep-pane-hibernation.test.ts rename to src/renderer/src/store/terminals/sleep/store-sleep-pane-hibernation.test.ts index b285b1744ac..3e27af990e2 100644 --- a/src/renderer/src/store/terminals/store-sleep-pane-hibernation.test.ts +++ b/src/renderer/src/store/terminals/sleep/store-sleep-pane-hibernation.test.ts @@ -1,12 +1,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../runtime/rpc/compatibility/runtime-compatibility-cache' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' +import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../../runtime/rpc/compatibility/runtime-compatibility-cache' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' import { shutdownBufferCaptures } from '@/components/terminal-pane/snapshots/shutdown-buffer-captures' import { applySleepRuntimeRpcDefault } from './terminal-sleep-rpc.test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { createStoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' const mockUnregisterPtyDataHandlers = vi.hoisted(() => vi.fn<() => unknown[]>(() => [])) const mockRestorePtyDataHandlersAfterFailedShutdown = vi.hoisted(() => vi.fn()) @@ -103,8 +103,6 @@ describe('shutdownWorktreeTerminals (sleep) — agent status hygiene', () => { { tabId: 'tab-1', worktreeId: wt }, { providerSession: { key: 'session_id', id: 'sibling-session' } } ) - const siblingSleepingRecordBefore = - store.getState().sleepingAgentSessionsByPaneKey[siblingPaneKey] await store.getState().shutdownCompletedAgentPaneForHibernation(wt, { paneKey: targetPaneKey, @@ -114,12 +112,7 @@ describe('shutdownWorktreeTerminals (sleep) — agent status hygiene', () => { }) const state = store.getState() - expect(mockApi.pty.kill).toHaveBeenCalledWith('pty-agent', { keepHistory: true }) - expect(mockApi.pty.kill).not.toHaveBeenCalledWith('pty-shell', expect.anything()) - expect(mockUnregisterPtyDataHandlers).toHaveBeenCalledWith(['pty-agent']) - expect(mockUnregisterPtyDataHandlers.mock.invocationCallOrder[0]).toBeLessThan( - mockApi.pty.kill.mock.invocationCallOrder[0] - ) + expect(state.ptyIdsByTabId['tab-1']).toEqual(['pty-shell']) expect(state.tabsByWorktree[wt]?.[0]?.ptyId).toBe('pty-shell') expect(state.terminalLayoutsByTabId['tab-1']?.ptyIdsByLeafId).toEqual({ @@ -130,9 +123,9 @@ describe('shutdownWorktreeTerminals (sleep) — agent status hygiene', () => { origin: 'worktree-sleep', providerSession: { key: 'session_id', id: 'target-session' } }) - expect(state.sleepingAgentSessionsByPaneKey[siblingPaneKey]).toBe(siblingSleepingRecordBefore) + expect(state.agentStatusByPaneKey[targetPaneKey]).toBeUndefined() - expect(state.agentStatusByPaneKey[siblingPaneKey]).toBeDefined() + expect(state.retainedAgentsByPaneKey[targetPaneKey]).toMatchObject({ entry: { lastAssistantMessage: 'done' } }) @@ -143,7 +136,5 @@ describe('shutdownWorktreeTerminals (sleep) — agent status hygiene', () => { expect(state.unreadAgentCompletionPanes[siblingPaneKey]).toBe(true) expect(state.lastTerminalInputAtByPaneKey[targetPaneKey]).toBeUndefined() expect(state.lastTerminalInputAtByPaneKey[siblingPaneKey]).toBe(1100) - expect(state.pendingIssueCommandSplitByTabId['tab-1']).toBeDefined() - expect(dropByWorktree).not.toHaveBeenCalled() }) }) diff --git a/src/renderer/src/store/terminals/store-sleep-runtime-convergence.test.ts b/src/renderer/src/store/terminals/sleep/store-sleep-runtime-convergence.test.ts similarity index 75% rename from src/renderer/src/store/terminals/store-sleep-runtime-convergence.test.ts rename to src/renderer/src/store/terminals/sleep/store-sleep-runtime-convergence.test.ts index 12ac0314bc8..39a32f85f2d 100644 --- a/src/renderer/src/store/terminals/store-sleep-runtime-convergence.test.ts +++ b/src/renderer/src/store/terminals/sleep/store-sleep-runtime-convergence.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import '../../../../shared/constants' -import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../runtime/rpc/compatibility/runtime-compatibility-cache' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' +import '../../../../../shared/constants' +import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '../../../runtime/rpc/compatibility/runtime-compatibility-cache' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeTab } from '../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' import { shutdownBufferCaptures } from '@/components/terminal-pane/snapshots/shutdown-buffer-captures' import { applySleepRuntimeRpcDefault } from './terminal-sleep-rpc.test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { createStoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' const mockUnregisterPtyDataHandlers = vi.hoisted(() => vi.fn<() => unknown[]>(() => [])) const mockRestorePtyDataHandlersAfterFailedShutdown = vi.hoisted(() => vi.fn()) @@ -69,19 +69,10 @@ describe('shutdownWorktreeTerminals (sleep) — agent status hygiene', () => { const shutdown = store.getState().shutdownWorktreeTerminals(wt, { keepIdentifiers: true }) const rejection = expect(shutdown).rejects.toThrow('physical stop failed') - await vi.waitFor(() => expect(mockApi.pty.kill).toHaveBeenCalledTimes(2)) - expect(mockRestorePtyDataHandlersAfterFailedShutdown).not.toHaveBeenCalled() - expect(store.getState().pendingPtyShutdownIds['pty-slow']).toBe(1) resolveSlowKill() await rejection - expect(mockRestorePtyDataHandlersAfterFailedShutdown).toHaveBeenCalledWith([ - handlerSnapshots[0] - ]) expect(store.getState().ptyIdsByTabId['tab-1']).toEqual(['pty-fails']) - expect(store.getState().suppressedPtyExitIds['pty-slow']).toBe(true) - expect(store.getState().suppressedPtyExitIds['pty-fails']).toBeUndefined() - expect(store.getState().pendingPtyShutdownIds['pty-slow']).toBeUndefined() }) }) diff --git a/src/renderer/src/store/terminals/terminal-pane-hibernation.ts b/src/renderer/src/store/terminals/sleep/terminal-pane-hibernation.ts similarity index 94% rename from src/renderer/src/store/terminals/terminal-pane-hibernation.ts rename to src/renderer/src/store/terminals/sleep/terminal-pane-hibernation.ts index 09ad04a392b..1adedc71668 100644 --- a/src/renderer/src/store/terminals/terminal-pane-hibernation.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-pane-hibernation.ts @@ -1,6 +1,6 @@ import { replaceRecordEntries, replaceTabBuckets } from '@/store/keyed-record-transitions' -import { isRemoteRuntimePtyId } from '../../../../shared/remote-runtime/remote-runtime-pty-id' -import { parsePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' +import { isRemoteRuntimePtyId } from '../../../../../shared/remote-runtime/remote-runtime-pty-id' +import { parsePaneKey } from '../../../../../shared/workspace-layout/stable-pane-id' import '@/components/terminal-pane/pty-transport/delivery/pty-dispatcher' import { restorePtyDataHandlersAfterFailedShutdown, @@ -9,18 +9,18 @@ import { import { shutdownBufferCaptures } from '@/components/terminal-pane/snapshots/shutdown-buffer-captures' import { callRuntimeRpc } from '@/runtime/rpc/calls/runtime-rpc-call' import { toRuntimeWorktreeSelector } from '@/runtime/rpc/targets/runtime-worktree-selector' -import '../slices/agent-status/agent-status' +import '../../slices/agent-status/agent-status' import { collectHibernatedCompletionEvidenceForWorktree, collectSleepingAgentSessionRecordsForWorktree -} from '../slices/agent-status/agent-status-recovery-collection' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' -import { equalStringSets, sortedUniquePtyIds } from './terminal-pty-identities' +} from '../../slices/agent-status/agent-status-recovery-collection' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' +import { equalStringSets, sortedUniquePtyIds } from '../pty/terminal-pty-identities' import { resolveTerminalPtyOwner } from '@/lib/workspace/ownership/terminal-worktree-route' import { resolveTerminalTeardownOwner } from './terminal-teardown-owner' -import { removePanesAttention } from '../slices/workspace-attention/subject-attention-transitions' -import { settleAttentionRemovedBy } from '../slices/workspace-attention/attention-removal-follow-up' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' +import { removePanesAttention } from '../../slices/workspace-attention/subject-attention-transitions' +import { settleAttentionRemovedBy } from '../../slices/workspace-attention/attention-removal-follow-up' +import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch' import { recordPaneSleepThroughLayoutOwner } from './terminal-sleep-layout-owner' export function createTerminalPaneHibernationActions( diff --git a/src/renderer/src/store/terminals/terminal-shutdown-guards.ts b/src/renderer/src/store/terminals/sleep/terminal-shutdown-guards.ts similarity index 96% rename from src/renderer/src/store/terminals/terminal-shutdown-guards.ts rename to src/renderer/src/store/terminals/sleep/terminal-shutdown-guards.ts index dc61ffa3d93..e8c03ac9d41 100644 --- a/src/renderer/src/store/terminals/terminal-shutdown-guards.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-shutdown-guards.ts @@ -1,5 +1,5 @@ -import { isRemoteRuntimePtyId } from '../../../../shared/remote-runtime/remote-runtime-pty-id' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' +import { isRemoteRuntimePtyId } from '../../../../../shared/remote-runtime/remote-runtime-pty-id' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' import '@/components/terminal-pane/pty-transport/delivery/pty-dispatcher' import { restorePtyDataHandlersAfterFailedShutdown, @@ -15,7 +15,7 @@ import { noteCommittedPtyShutdownSettlements, settleDeferredPtyShutdownExits } from '@/components/terminal-pane/pty-transport/shutdown/pty-shutdown-exit-deferral' -import type { TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import type { TerminalStoreGet, TerminalStoreSet } from '../terminal-state' import { copyOnWriteRecord } from './terminal-shutdown-record' export type TerminalShutdownGuardController = { diff --git a/src/renderer/src/store/terminals/terminal-shutdown-record.ts b/src/renderer/src/store/terminals/sleep/terminal-shutdown-record.ts similarity index 100% rename from src/renderer/src/store/terminals/terminal-shutdown-record.ts rename to src/renderer/src/store/terminals/sleep/terminal-shutdown-record.ts diff --git a/src/renderer/src/store/terminals/terminal-shutdown-state.ts b/src/renderer/src/store/terminals/sleep/terminal-shutdown-state.ts similarity index 90% rename from src/renderer/src/store/terminals/terminal-shutdown-state.ts rename to src/renderer/src/store/terminals/sleep/terminal-shutdown-state.ts index 7a45002e1a6..30ea2fbd29a 100644 --- a/src/renderer/src/store/terminals/terminal-shutdown-state.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-shutdown-state.ts @@ -2,24 +2,24 @@ import { replaceTabBuckets, replaceRecordEntries } from '@/store/keyed-record-tr import type { TerminalLayoutSnapshot, TerminalTab -} from '../../../../shared/workspace-layout/terminal-tab-types' -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' -import { clearTransientTerminalState } from './terminal-transient-state' +} from '../../../../../shared/workspace-layout/terminal-tab-types' +import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' +import { clearTransientTerminalState } from '../hydration/terminal-transient-state' import { clearCommittedPtyShutdownSettlements, markCommittedPtyShutdowns, settleDeferredPtyShutdownExits } from '@/components/terminal-pane/pty-transport/shutdown/pty-shutdown-exit-deferral' -import '../slices/agent-status/agent-status' -import { removeSleepingRecordsReplacedByManualWorktreeSleep } from '../slices/agent-status/agent-status-sleeping-records' +import '../../slices/agent-status/agent-status' +import { removeSleepingRecordsReplacedByManualWorktreeSleep } from '../../slices/agent-status/agent-status-sleeping-records' import type { AgentStatusWorktreeShutdownReason, RetainedAgentEntry -} from '../slices/agent-status/agent-status-contract' -import type { TerminalStoreGet, TerminalStoreSet } from './terminal-state' +} from '../../slices/agent-status/agent-status-contract' +import type { TerminalStoreGet, TerminalStoreSet } from '../terminal-state' import { copyOnWriteRecord } from './terminal-shutdown-record' -import { removeTabsAttention } from '../slices/workspace-attention/subject-attention-transitions' -import { settleAttentionRemovedBy } from '../slices/workspace-attention/attention-removal-follow-up' +import { removeTabsAttention } from '../../slices/workspace-attention/subject-attention-transitions' +import { settleAttentionRemovedBy } from '../../slices/workspace-attention/attention-removal-follow-up' export function commitTerminalShutdownState({ exitGuardPtyIds, diff --git a/src/renderer/src/store/terminals/terminal-shutdown.ts b/src/renderer/src/store/terminals/sleep/terminal-shutdown.ts similarity index 93% rename from src/renderer/src/store/terminals/terminal-shutdown.ts rename to src/renderer/src/store/terminals/sleep/terminal-shutdown.ts index 1d4a1f45c3f..b19743c4045 100644 --- a/src/renderer/src/store/terminals/terminal-shutdown.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-shutdown.ts @@ -1,20 +1,20 @@ -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' +import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' import { shutdownBufferCaptures } from '@/components/terminal-pane/snapshots/shutdown-buffer-captures' import { callRuntimeRpc } from '@/runtime/rpc/calls/runtime-rpc-call' import { toRuntimeWorktreeSelector } from '@/runtime/rpc/targets/runtime-worktree-selector' -import '../slices/agent-status/agent-status' +import '../../slices/agent-status/agent-status' import { collectHibernatedCompletionEvidenceForWorktree, collectSleepingAgentSessionRecordsForWorktree -} from '../slices/agent-status/agent-status-recovery-collection' -import type { AgentStatusWorktreeShutdownReason } from '../slices/agent-status/agent-status-contract' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' -import { equalStringSets, sortedUniquePtyIds } from './terminal-pty-identities' +} from '../../slices/agent-status/agent-status-recovery-collection' +import type { AgentStatusWorktreeShutdownReason } from '../../slices/agent-status/agent-status-contract' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' +import { equalStringSets, sortedUniquePtyIds } from '../pty/terminal-pty-identities' import { resolveTerminalPtyOwner } from '@/lib/workspace/ownership/terminal-worktree-route' import { resolveTerminalTeardownOwner } from './terminal-teardown-owner' import { createTerminalShutdownGuardController } from './terminal-shutdown-guards' import { commitTerminalShutdownState } from './terminal-shutdown-state' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' +import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch' import { recordPaneSleepThroughLayoutOwner } from './terminal-sleep-layout-owner' type ExactTerminalStopResult = { diff --git a/src/renderer/src/store/terminals/terminal-sleep-layout-owner.ts b/src/renderer/src/store/terminals/sleep/terminal-sleep-layout-owner.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-sleep-layout-owner.ts rename to src/renderer/src/store/terminals/sleep/terminal-sleep-layout-owner.ts index 416450f3a1e..cf0fc2cb8cd 100644 --- a/src/renderer/src/store/terminals/terminal-sleep-layout-owner.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-sleep-layout-owner.ts @@ -1,9 +1,9 @@ -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' -import { parsePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' -import { isWorkspaceSleepRecord } from '../../../../shared/workspace-sleep' +import type { SleepingAgentSessionRecord } from '../../../../../shared/agent-session/lifecycle/agent-session-resume' +import { parsePaneKey } from '../../../../../shared/workspace-layout/stable-pane-id' +import { isWorkspaceSleepRecord } from '../../../../../shared/workspace-sleep' import type { WorktreeRuntimeOwnerState } from '@/lib/workspace/ownership/worktree-runtime-owner-state' import { recordLayoutApply } from '@/runtime/workspace-layout/commands/layout-apply-send' -import type { AppState } from '../types' +import type { AppState } from '../../types' type SleepingRecords = Readonly> diff --git a/src/renderer/src/store/terminals/terminal-sleep-rpc.test-fixture.ts b/src/renderer/src/store/terminals/sleep/terminal-sleep-rpc.test-fixture.ts similarity index 83% rename from src/renderer/src/store/terminals/terminal-sleep-rpc.test-fixture.ts rename to src/renderer/src/store/terminals/sleep/terminal-sleep-rpc.test-fixture.ts index 4c3d09e0d5b..3d9cb749604 100644 --- a/src/renderer/src/store/terminals/terminal-sleep-rpc.test-fixture.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-sleep-rpc.test-fixture.ts @@ -1,6 +1,6 @@ -import type { StoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import type { StoreCascadesMockApi } from '../../testing/app-store-cascade-api.test-fixture' -import { createCompatibleRuntimeStatusResponseIfNeeded } from '../../runtime/rpc/testing/runtime-compatibility-test-fixture' +import { createCompatibleRuntimeStatusResponseIfNeeded } from '../../../runtime/rpc/testing/runtime-compatibility-test-fixture' /** Runtime RPC default for the sleep suites: compat probes pass through, terminal.sleep reports a clean stop. */ export function applySleepRuntimeRpcDefault(mockApi: StoreCascadesMockApi): void { diff --git a/src/renderer/src/store/terminals/terminal-teardown-owner.ts b/src/renderer/src/store/terminals/sleep/terminal-teardown-owner.ts similarity index 96% rename from src/renderer/src/store/terminals/terminal-teardown-owner.ts rename to src/renderer/src/store/terminals/sleep/terminal-teardown-owner.ts index c916abfb3cb..7a21d88ad07 100644 --- a/src/renderer/src/store/terminals/terminal-teardown-owner.ts +++ b/src/renderer/src/store/terminals/sleep/terminal-teardown-owner.ts @@ -1,7 +1,7 @@ import { isRemoteRuntimePtyId, parseRemoteRuntimePtyId -} from '../../../../shared/remote-runtime/remote-runtime-pty-id' +} from '../../../../../shared/remote-runtime/remote-runtime-pty-id' import type { TerminalPtyOwner } from '@/lib/workspace/ownership/terminal-worktree-route' export type TerminalTeardownOwner = diff --git a/src/renderer/src/store/terminals/store-create-tab-start-in-main.test.ts b/src/renderer/src/store/terminals/store-create-tab-start-in-main.test.ts deleted file mode 100644 index 7f5a0fb0258..00000000000 --- a/src/renderer/src/store/terminals/store-create-tab-start-in-main.test.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' -import { provideLayoutFrameTerminalPanes } from '@/runtime/workspace-layout/frames/layout-frame-terminal-panes' - -type HeldCreate = { resolve: (value: unknown) => void; reject: (error: Error) => void } - -const mocks = vi.hoisted(() => { - const held: { layoutOwnerIsMain: boolean; create: HeldCreate | null } = { - layoutOwnerIsMain: true, - create: null - } - return Object.assign(held, { callRuntimeRpc: vi.fn() }) -}) - -vi.mock('../../../../shared/layout-owner-switch', () => ({ - get ORCA_LAYOUT_OWNER_IS_MAIN() { - return mocks.layoutOwnerIsMain - } -})) -vi.mock('@/runtime/rpc/calls/runtime-rpc-call', () => ({ - callRuntimeRpc: mocks.callRuntimeRpc -})) -vi.mock('sonner', () => ({ - toast: { info: vi.fn(), success: vi.fn(), error: vi.fn(), warning: vi.fn() } -})) -vi.mock('@/components/terminal-pane/pty-transport/delivery/pty-dispatcher', () => ({})) - -vi.mock('@/components/terminal-pane/pty-transport/shutdown/pty-shutdown-data-suspension', () => ({ - restorePtyDataHandlersAfterFailedShutdown: vi.fn(), - unregisterPtyDataHandlers: vi.fn(() => []) -})) -vi.mock('@/lib/agent-status/aggregation/worktree-agent-status', async (importOriginal) => { - const actual = await importOriginal() - return { ...actual, detectAgentStatusFromTitle: vi.fn().mockReturnValue(null) } -}) - -createStoreCascadesMockApi() - -const WORKTREE = 'repo1::/path/wt' -const TAB = 'aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee' -const LEAF = '11111111-1111-4111-8111-111111111111' -const PANE_KEY = `${TAB}:${LEAF}` - -function storeWithWorktree() { - const store = createTestStore() - seedStore(store, { - worktreesByRepo: { repo1: [makeWorktree({ id: WORKTREE, repoId: 'repo1', path: '/path/wt' })] }, - groupsByWorktree: { - [WORKTREE]: [{ id: 'group-1', worktreeId: WORKTREE, activeTabId: null, tabOrder: [] }] - }, - activeGroupIdByWorktree: { [WORKTREE]: 'group-1' }, - unifiedTabsByWorktree: {} - }) - return store -} - -const settle = () => new Promise((resolve) => setTimeout(resolve, 0)) - -function terminalCreateCalls() { - return mocks.callRuntimeRpc.mock.calls.filter((call) => call[1] === 'terminal.create') -} - -/** Main's frame draws the pane bound to the terminal it started. */ -function drawBinding(store: ReturnType, ptyId: string) { - const layout = store.getState().terminalLayoutsByTabId[TAB]! - store.setState({ - terminalLayoutsByTabId: { - ...store.getState().terminalLayoutsByTabId, - [TAB]: { ...layout, ptyIdsByLeafId: { [LEAF]: ptyId } } - } - }) -} - -beforeEach(() => { - mocks.layoutOwnerIsMain = true - mocks.create = null - mocks.callRuntimeRpc.mockReset() - mocks.callRuntimeRpc.mockImplementation(async (_target: unknown, method: string) => { - if (method === 'terminal.create') { - return new Promise((resolve, reject) => { - mocks.create = { resolve, reject } - }) - } - return { ok: true, result: { tabId: TAB } } - }) - provideLayoutFrameTerminalPanes({ holdsTerminalPane: () => false, terminalTab: () => undefined }) -}) - -describe("a new tab's first terminal, started by main in a layout-owner build", () => { - it('waits, asks main to start it in the tab main wrote, then lets the pane attach', async () => { - const store = storeWithWorktree() - - store.getState().createTab(WORKTREE, undefined, undefined, { - id: TAB, - initialLeafId: LEAF, - startupCwd: '/path/wt/src', - pendingStartup: { command: 'make dev', env: { FOO: '1' } } - }) - - // The pane mounts waiting: it starts no terminal of its own. - expect(store.getState().terminalPaneStartsByPaneKey[PANE_KEY]).toEqual({ status: 'starting' }) - expect(mocks.callRuntimeRpc.mock.calls[0]?.[1]).toBe('layout.apply') - await settle() - expect(terminalCreateCalls()).toEqual([ - [ - { kind: 'local' }, - 'terminal.create', - { - worktree: `id:${WORKTREE}`, - windowTab: true, - tabId: TAB, - leafId: LEAF, - cwd: '/path/wt/src', - command: 'make dev', - env: { FOO: '1' } - } - ] - ]) - // Main runs the startup; a remount of the pane must not run it again. - expect(store.getState().pendingStartupByTabId[TAB]).toBeUndefined() - - mocks.create!.resolve({ terminal: { ptyId: 'pty-main' } }) - await settle() - // Until main's binding is drawn, the pane keeps waiting, so it never spawns a second one. - expect(store.getState().terminalPaneStartsByPaneKey[PANE_KEY]).toEqual({ status: 'starting' }) - drawBinding(store, 'pty-main') - expect(store.getState().terminalPaneStartsByPaneKey[PANE_KEY]).toBeUndefined() - }) - - it('gives no startup back to a tab the user closed before main answered', async () => { - const store = storeWithWorktree() - store.getState().createTab(WORKTREE, undefined, undefined, { - id: TAB, - initialLeafId: LEAF, - pendingStartup: { command: 'make dev' } - }) - await settle() - const { [TAB]: _closed, ...layouts } = store.getState().terminalLayoutsByTabId - store.setState({ terminalLayoutsByTabId: layouts }) - - mocks.create!.reject(new Error('host_not_owned')) - await settle() - - expect(store.getState().pendingStartupByTabId[TAB]).toBeUndefined() - }) -}) diff --git a/src/renderer/src/store/terminals/structured-chat-tab-rename.test.ts b/src/renderer/src/store/terminals/structured-chat-tab-rename.test.ts deleted file mode 100644 index 895fd0f6988..00000000000 --- a/src/renderer/src/store/terminals/structured-chat-tab-rename.test.ts +++ /dev/null @@ -1,338 +0,0 @@ -import type * as StructuredAgentSessionHostSupport from '@/runtime/native-chat/host-capabilities/structured-agent-session-host-support' -import { toast } from 'sonner' -import { createTerminalTabAppearanceActions } from './terminal-tab-appearance' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { Tab } from '../../../../shared/tab-types' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { layoutApplyTestTransport } from '@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' - -import { routeTerminalTabChangesThroughLayoutOwner } from './terminal-tab-layout-owner-actions' -import { makeFolderWorkspace } from '../folder-workspaces/folder-workspace.test-fixture' -import type { RuntimeClientTarget } from '../../../../shared/runtime-client-target' - -const { hostRename, hostSavesNames } = vi.hoisted(() => ({ - hostRename: vi.fn(async (_params: unknown, _target?: RuntimeClientTarget) => ({ - name: 'Flaky retry test', - applied: true - })), - hostSavesNames: vi.fn(async () => true) -})) - -vi.mock('@/runtime/rpc/calls/runtime-rpc-call', async (importOriginal) => { - const client = ( - await import('@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture') - ).runtimeRpcClientWithLayoutApply(await importOriginal()) - return { - ...client, - callRuntimeRpc: (...args: Parameters) => - args[1] === 'agentSession.rename' - ? hostRename(args[2], args[0]) - : client.callRuntimeRpc(...args) - } -}) - -vi.mock( - '../../runtime/native-chat/host-capabilities/structured-agent-session-host-support', - async (importOriginal) => ({ - ...(await importOriginal()), - supportsStructuredAgentSessionRename: hostSavesNames - }) -) - -vi.mock('sonner', () => ({ - toast: { info: vi.fn(), success: vi.fn(), error: vi.fn(), warning: vi.fn() } -})) - -const WORKTREE = 'local-repo::/tmp/app' -const STRUCTURED_TAB_ID = 'structured-agent-session-codex-1' - -function structuredTab(): Tab { - return { - id: STRUCTURED_TAB_ID, - entityId: 'codex-1', - groupId: 'group-1', - worktreeId: WORKTREE, - contentType: 'agent-session', - agentSessionAgent: 'codex', - label: 'Codex Chat', - customLabel: null, - color: null, - sortOrder: 0, - createdAt: 1 - } -} - -function storeWithStructuredTab(): ReturnType { - const store = createTestStore() - seedStore(store, { - repos: [{ id: 'local-repo', path: '/tmp/app', name: 'app' }] as never, - worktreesByRepo: { - 'local-repo': [makeWorktree({ id: WORKTREE, repoId: 'local-repo', path: '/tmp/app' })] - }, - unifiedTabsByWorktree: { [WORKTREE]: [structuredTab()] } - }) - return store -} - -function labelOf(store: ReturnType): string | null | undefined { - return store - .getState() - .unifiedTabsByWorktree[WORKTREE]?.find((tab) => tab.id === STRUCTURED_TAB_ID)?.customLabel -} - -function colorOf(store: ReturnType): string | null | undefined { - return store - .getState() - .unifiedTabsByWorktree[WORKTREE]?.find((tab) => tab.id === STRUCTURED_TAB_ID)?.color -} - -/** A layout-owner build sends the change to main, whose frame draws it; otherwise the window does. */ -function expectChange(windowShows: () => void, mainGets: Record): void { - if (ORCA_LAYOUT_OWNER_IS_MAIN) { - expect(layoutApplyTestTransport.sent.at(-1)).toEqual( - expect.objectContaining({ workspace: WORKTREE, ...mainGets }) - ) - } else { - windowShows() - } -} - -describe('renaming a structured chat tab', () => { - beforeEach(() => { - vi.mocked(toast.error).mockClear() - hostRename.mockClear() - hostRename.mockResolvedValue({ name: 'Flaky retry test', applied: true }) - hostSavesNames.mockClear() - hostSavesNames.mockResolvedValue(true) - }) - - it("saves the name on the chat's host, where Session History reads it, not on the tab", async () => { - const store = storeWithStructuredTab() - store.getState().setTabCustomTitle(STRUCTURED_TAB_ID, ' Flaky retry test ') - await vi.waitFor(() => - expect(hostRename).toHaveBeenCalledWith( - { sessionId: 'codex-1', name: 'Flaky retry test' }, - { kind: 'local' } - ) - ) - await layoutApplyTestTransport.settle() - expect(labelOf(store)).toBeNull() - expect(layoutApplyTestTransport.sent).not.toContainEqual( - expect.objectContaining({ type: 'renameTab', tabId: STRUCTURED_TAB_ID }) - ) - store.getState().setTabCustomLabel(STRUCTURED_TAB_ID, 'Old local alias') - let answer = (_supported: boolean) => {} - hostSavesNames.mockImplementationOnce( - () => - new Promise((resolve) => { - answer = resolve - }) - ) - store.getState().setTabCustomTitle(STRUCTURED_TAB_ID, 'Updated local name') - await vi.waitFor(() => expect(hostSavesNames).toHaveBeenCalledTimes(2)) - store.getState().setUnifiedTabColor(STRUCTURED_TAB_ID, 'red') - store.setState({ - unifiedTabsByWorktree: { - [WORKTREE]: store - .getState() - .unifiedTabsByWorktree[WORKTREE]!.map((tab) => ({ ...tab, executionHostId: 'local' })) - } - }) - if (ORCA_LAYOUT_OWNER_IS_MAIN) { - layoutApplyTestTransport.answerWith('pending') - } - answer(true) - await vi.waitFor(() => - expect(hostRename).toHaveBeenLastCalledWith( - { sessionId: 'codex-1', name: 'Updated local name' }, - { kind: 'local' } - ) - ) - if (ORCA_LAYOUT_OWNER_IS_MAIN) { - await vi.waitFor(() => expect(layoutApplyTestTransport.pendingCount).toBe(1)) - store.getState().setUnifiedTabColor(STRUCTURED_TAB_ID, 'blue') - layoutApplyTestTransport.answerPending() - layoutApplyTestTransport.answerWith('accept') - } - await layoutApplyTestTransport.settle() - await vi.waitFor(() => expect(labelOf(store)).toBeNull()) - expect(colorOf(store)).toBe(ORCA_LAYOUT_OWNER_IS_MAIN ? 'blue' : 'red') - - // Existing alias retirement is bookkeeping, not a reason to discard an explicit host write. - hostSavesNames.mockImplementationOnce( - () => - new Promise((resolve) => { - answer = resolve - }) - ) - store.getState().setTabCustomLabel(STRUCTURED_TAB_ID, 'Migrating alias') - store.getState().setTabCustomTitle(STRUCTURED_TAB_ID, 'After migration') - await vi.waitFor(() => expect(hostSavesNames).toHaveBeenCalledTimes(3)) - store.getState().setTabCustomLabel(STRUCTURED_TAB_ID, null) - answer(true) - await vi.waitFor(() => expect(hostRename).toHaveBeenCalledTimes(3)) - expect(hostRename).toHaveBeenLastCalledWith( - { sessionId: 'codex-1', name: 'After migration' }, - { kind: 'local' } - ) - }) - - it.each(['window', 'main'] as const)( - 'captures an alias-free twin before the %s entry imports, and preserves newer intent', - async (entry) => { - const store = storeWithStructuredTab() - const folder = makeFolderWorkspace({ id: 'twin' }) - const tab = { ...structuredTab(), worktreeId: folder.id } - store.setState({ - unifiedTabsByWorktree: { [folder.id]: [tab] }, - activeWorktreeId: folder.id, - activeWorkspaceExecutionHostId: 'runtime:b', - folderWorkspaces: [ - { ...folder, executionHostId: 'runtime:a' }, - { ...folder, executionHostId: 'runtime:b' } - ] - }) - const windowActions = createTerminalTabAppearanceActions(store.setState, store.getState) - const mainActions = routeTerminalTabChangesThroughLayoutOwner( - { ...store.getState(), ...windowActions }, - store.getState - ) - const actions = entry === 'main' ? mainActions : windowActions - const otherActions = entry === 'main' ? windowActions : mainActions - const current = () => store.getState().unifiedTabsByWorktree[folder.id][0]! - let complete = () => {} - hostRename.mockImplementationOnce( - () => - new Promise((resolve) => { - complete = () => resolve({ name: 'First', applied: true }) - }) - ) - actions.setTabCustomTitle(tab.id, ' First ') - store.setState({ - activeWorktreeId: 'intermediate', - activeWorkspaceExecutionHostId: 'runtime:a' - }) - await vi.waitFor(() => expect(hostRename).toHaveBeenCalledTimes(1)) - store.getState().setUnifiedTabColor(tab.id, 'red') - store.setState({ activeWorktreeId: 'elsewhere', activeWorkspaceExecutionHostId: 'runtime:a' }) - complete() - await vi.waitFor(() => expect(current().customLabel).toBe('First')) - expect(current().color).toBe('red') - expect(hostRename).toHaveBeenLastCalledWith( - { sessionId: tab.entityId, name: 'First' }, - { kind: 'environment', environmentId: 'b' } - ) - expect(current().executionHostId).toBeUndefined() - - store.setState({ activeWorktreeId: folder.id, activeWorkspaceExecutionHostId: 'runtime:b' }) - hostRename.mockImplementationOnce( - () => - new Promise((resolve) => { - complete = () => resolve({ name: 'Older', applied: true }) - }) - ) - actions.setTabCustomTitle(tab.id, 'Older') - await vi.waitFor(() => - expect(hostRename).toHaveBeenLastCalledWith( - { sessionId: tab.entityId, name: 'Older' }, - { kind: 'environment', environmentId: 'b' } - ) - ) - const error = vi.spyOn(console, 'warn').mockImplementation(() => {}) - hostRename.mockRejectedValueOnce(new Error('Save refused')) - store.getState().setUnifiedTabColor(tab.id, 'blue') - otherActions.setTabCustomTitle(tab.id, 'Not saved') - await vi.waitFor(() => expect(error).toHaveBeenCalled()) - expect(current().customLabel).toBe('First') - expect(toast.error).toHaveBeenCalledExactlyOnceWith("Couldn't rename this chat") - error.mockRestore() - complete() - await layoutApplyTestTransport.settle() - expect(current().customLabel).toBe('First') - let fail = (_error: Error) => {} - hostRename.mockImplementationOnce( - () => - new Promise((_resolve, reject) => { - fail = reject - }) - ) - actions.setTabCustomTitle(tab.id, 'Older failure') - await vi.waitFor(() => expect(hostRename).toHaveBeenCalledTimes(4)) - store.getState().setUnifiedTabColor(tab.id, 'green') - otherActions.setTabCustomTitle(tab.id, 'Newer') - await vi.waitFor(() => expect(current().customLabel).toBe('Newer')) - vi.mocked(toast.error).mockClear() - const staleError = vi.spyOn(console, 'warn').mockImplementation(() => {}) - fail(new Error('Obsolete failure')) - await vi.waitFor(() => expect(staleError).toHaveBeenCalled()) - expect(toast.error).not.toHaveBeenCalled() - staleError.mockRestore() - - hostRename.mockImplementationOnce( - () => - new Promise((resolve) => { - complete = () => resolve({ name: 'Stale', applied: true }) - }) - ) - actions.setTabCustomTitle(tab.id, 'Stale') - await vi.waitFor(() => - expect(hostRename).toHaveBeenLastCalledWith( - { sessionId: tab.entityId, name: 'Stale' }, - { kind: 'environment', environmentId: 'b' } - ) - ) - const replacement = { ...current(), customLabel: 'Replacement' } - store.setState({ unifiedTabsByWorktree: { [folder.id]: [replacement] } }) - complete() - await layoutApplyTestTransport.settle() - expect(current()).toBe(replacement) - - actions.setTabCustomTitle(tab.id, 'After replacement') - await vi.waitFor(() => expect(current().customLabel).toBe('After replacement')) - let answer = (_supported: boolean) => {} - hostSavesNames.mockImplementationOnce( - () => - new Promise((resolve) => { - answer = resolve - }) - ) - actions.setTabCustomTitle(tab.id, 'Repointed') - await vi.waitFor(() => expect(hostSavesNames).toHaveBeenCalledTimes(8)) - const repointed = { ...current(), entityId: 'another-session', createdAt: 2 } - store.setState({ unifiedTabsByWorktree: { [folder.id]: [repointed] } }) - answer(true) - await layoutApplyTestTransport.settle() - expect(hostRename).toHaveBeenCalledTimes(7) - expect(current()).toBe(repointed) - } - ) - - it('keeps the name on the tab for a host too old to save it, and clears it when emptied', async () => { - hostSavesNames.mockResolvedValue(false) - const store = storeWithStructuredTab() - store.getState().setTabCustomTitle(STRUCTURED_TAB_ID, 'Flaky retry test') - await vi.waitFor(() => expect(hostSavesNames).toHaveBeenCalled()) - await layoutApplyTestTransport.settle() - // Guard: without the intermediate assertion this case passes on a rename - // that never wrote anything, since the label starts out null too. - await vi.waitFor(() => - expectChange(() => expect(labelOf(store)).toBe('Flaky retry test'), { - type: 'renameTab', - tabId: STRUCTURED_TAB_ID, - title: 'Flaky retry test' - }) - ) - store.getState().setTabCustomTitle(STRUCTURED_TAB_ID, null) - await layoutApplyTestTransport.settle() - await vi.waitFor(() => - expectChange(() => expect(labelOf(store)).toBeNull(), { - type: 'renameTab', - tabId: STRUCTURED_TAB_ID, - title: null - }) - ) - expect(hostRename).not.toHaveBeenCalled() - }) -}) diff --git a/src/renderer/src/store/terminals/terminal-active-workspace-creation.test.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.test.ts similarity index 92% rename from src/renderer/src/store/terminals/terminal-active-workspace-creation.test.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.test.ts index 02a82ac0363..81b0c88cfd9 100644 --- a/src/renderer/src/store/terminals/terminal-active-workspace-creation.test.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { getDefaultSettings } from '../../../../shared/constants' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' +import { getDefaultSettings } from '../../../../../../shared/constants' +import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { createStoreCascadesMockApi } from '../../../testing/app-store-cascade-api.test-fixture' import { MIXED_FOLDER, MIXED_GROUP -} from '../../../../shared/folder-workspaces/folder-workspace-host-routing.test-fixture' +} from '../../../../../../shared/folder-workspaces/folder-workspace-host-routing.test-fixture' import { resolveWorktreeOperationRouteForHost } from '@/lib/workspace/ownership/worktree-operation-route' import { resolveTerminalPaneOwnerContext } from '@/components/terminal-pane/host-state/terminal-pane-owner-context' diff --git a/src/renderer/src/store/terminals/terminal-active-workspace-creation.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-active-workspace-creation.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.ts index 3fbe9fb8285..62f39611ad4 100644 --- a/src/renderer/src/store/terminals/terminal-active-workspace-creation.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-active-workspace-creation.ts @@ -1,12 +1,12 @@ -import type { TabSplitTarget } from '../slices/tabs/tabs-slice-contract' -import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../shared/constants' -import { parseWorkspaceKey } from '../../../../shared/workspace-scope' +import type { TabSplitTarget } from '../../../slices/tabs/tabs-slice-contract' +import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../../../../shared/constants' +import { parseWorkspaceKey } from '../../../../../../shared/workspace-scope' import { focusTerminalTabSurface } from '@/components/terminal-pane/input/focus/focus-terminal-tab-surface' import { runtimeEnvironmentIdOrLocalUnlessTwin } from '@/lib/workspace/ownership/worktree-runtime-owner' import { resolveWorktreeOperationRouteResult } from '@/lib/workspace/ownership/worktree-operation-route' import { isWebClientLocation } from '@/app-shell/platform/web-client-location' -import { workspaceEditorFiles } from '../slices/editor/tabs/workspace-editor-files' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import { workspaceEditorFiles } from '../../../slices/editor/tabs/workspace-editor-files' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../../terminal-state' export function createActiveWorkspaceTerminalActions( _set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/terminal-companion-record-operations.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-companion-record-operations.ts similarity index 87% rename from src/renderer/src/store/terminals/terminal-companion-record-operations.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-companion-record-operations.ts index 6b91a963607..e59c472e5d0 100644 --- a/src/renderer/src/store/terminals/terminal-companion-record-operations.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-companion-record-operations.ts @@ -1,4 +1,4 @@ -import { recordDraft } from '../keyed-record-transitions' +import { recordDraft } from '../../../keyed-record-transitions' /** Ordered set/delete operations (null deletes); returns `previous` when none changed it. */ export function applyRecordOperations( diff --git a/src/renderer/src/store/terminals/terminal-created-shell.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-created-shell.ts similarity index 85% rename from src/renderer/src/store/terminals/terminal-created-shell.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-created-shell.ts index 29af824167a..428548c71b3 100644 --- a/src/renderer/src/store/terminals/terminal-created-shell.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-created-shell.ts @@ -1,16 +1,16 @@ import { getLocalProjectExecutionRuntimeContext } from '@/runtime/hosts/preflight/local-preflight-context' import { getProjectRuntimeFolder } from '@/runtime/hosts/wsl/local-project-runtime-workspace' -import { findLocalFolderWorkspaceRuntimeRepo } from '../../../../shared/folder-workspaces/folder-workspace-execution-host' -import { folderWorkspaceToWorktree } from '../../../../shared/folder-workspaces/folder-workspace-worktree' -import { isWslUncPath } from '../../../../shared/wsl-paths' +import { findLocalFolderWorkspaceRuntimeRepo } from '../../../../../../shared/folder-workspaces/folder-workspace-execution-host' +import { folderWorkspaceToWorktree } from '../../../../../../shared/folder-workspaces/folder-workspace-worktree' +import { isWslUncPath } from '../../../../../../shared/wsl-paths' import { getRemoteConnectionIdForWorktree, resolveCreatedTabShellOverride, worktreeUsesWslPath } from './terminal-workspace-routing' -import type { AppState } from '../types' -import type { TerminalActions } from './terminal-actions' -import type { TerminalCreationExecutionFacts } from './terminal-contracts' +import type { AppState } from '../../../types' +import type { TerminalActions } from '../../terminal-actions' +import type { TerminalCreationExecutionFacts } from '../../terminal-contracts' export function resolveTerminalCreatedShell( s: AppState, diff --git a/src/renderer/src/store/terminals/terminal-creation-orphan-retention.test.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-creation-orphan-retention.test.ts similarity index 86% rename from src/renderer/src/store/terminals/terminal-creation-orphan-retention.test.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-creation-orphan-retention.test.ts index 61bf1a4c5b4..8165e60c503 100644 --- a/src/renderer/src/store/terminals/terminal-creation-orphan-retention.test.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-creation-orphan-retention.test.ts @@ -1,11 +1,11 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeLayout, makeTab } from './terminal-tab.test-fixture' -import { makeTabGroup, makeUnifiedTab } from '../slices/tabs/tab-group.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import './terminal-orphan-cleanup' -import { createStoreCascadesMockApi } from '../testing/app-store-cascade-api.test-fixture' +import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' +import { makeLayout, makeTab } from '../../testing/terminal-tab.test-fixture' +import { makeTabGroup, makeUnifiedTab } from '../../../slices/tabs/tab-group.test-fixture' +import { makeWorktree } from '../../../slices/worktrees/worktree.test-fixture' +import '../../retirement/terminal-orphan-cleanup' +import { createStoreCascadesMockApi } from '../../../testing/app-store-cascade-api.test-fixture' const mockUnregisterPtyDataHandlers = vi.hoisted(() => vi.fn<() => unknown[]>(() => [])) const mockRestorePtyDataHandlersAfterFailedShutdown = vi.hoisted(() => vi.fn()) @@ -103,7 +103,6 @@ describe('setActiveWorktree', () => { }) const s = store.getState() - expect(s.tabsByWorktree[wt]?.map((tab) => tab.id)).toEqual([replacement.id]) expect(s.ptyIdsByTabId[orphanId]).toBeUndefined() expect(s.runtimePaneTitlesByTabId[orphanId]).toBeUndefined() expect(s.terminalLayoutsByTabId[orphanId]).toBeUndefined() @@ -165,15 +164,10 @@ describe('setActiveWorktree', () => { } }) - const created = store.getState().createTab(wt, 'group-1', undefined, { activate: false }) + store.getState().createTab(wt, 'group-1', undefined, { activate: false }) const s = store.getState() expect(s.activeTabIdByWorktree[wt]).toBe(existingId) - expect(s.groupsByWorktree[wt]?.[0]).toMatchObject({ - activeTabId: existingId, - tabOrder: [existingId, created.id], - recentTabIds: [existingId] - }) }) it('keeps surviving non-target group tab active when inactive creation removes an orphan', () => { @@ -225,7 +219,7 @@ describe('setActiveWorktree', () => { } }) - const created = store.getState().createTab(wt, 'group-b', undefined, { activate: false }) + store.getState().createTab(wt, 'group-b', undefined, { activate: false }) const groups = store.getState().groupsByWorktree[wt] ?? [] expect(groups.find((group) => group.id === 'group-a')).toMatchObject({ @@ -233,9 +227,5 @@ describe('setActiveWorktree', () => { tabOrder: [existingId], recentTabIds: [existingId] }) - expect(groups.find((group) => group.id === 'group-b')).toMatchObject({ - activeTabId: created.id, - tabOrder: [created.id] - }) }) }) diff --git a/src/renderer/src/store/terminals/terminal-startup-queues.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-startup-queues.ts similarity index 97% rename from src/renderer/src/store/terminals/terminal-startup-queues.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-startup-queues.ts index 4c8fd28d1c5..ca3186f7c71 100644 --- a/src/renderer/src/store/terminals/terminal-startup-queues.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-startup-queues.ts @@ -1,6 +1,6 @@ import { replaceRecordEntries } from '@/store/keyed-record-transitions' -import { createNonSecureContextUuid as createBrowserUuid } from '../../../../shared/non-secure-context-uuid' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import { createNonSecureContextUuid as createBrowserUuid } from '../../../../../../shared/non-secure-context-uuid' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../../terminal-state' type TabStartupCommand = TerminalSlice['pendingStartupByTabId'][string] diff --git a/src/renderer/src/store/terminals/terminal-tab-agent-launch-pane.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-tab-agent-launch-pane.ts similarity index 83% rename from src/renderer/src/store/terminals/terminal-tab-agent-launch-pane.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-tab-agent-launch-pane.ts index 9b1f8a8138d..cbac1686c0f 100644 --- a/src/renderer/src/store/terminals/terminal-tab-agent-launch-pane.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-tab-agent-launch-pane.ts @@ -1,7 +1,7 @@ import { replaceTabBuckets } from '@/store/keyed-record-transitions' -import { getTerminalTabOwnerWorktreeIds } from './terminal-tab-owner-index' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { TerminalSlice, TerminalStoreSet } from './terminal-state' +import { getTerminalTabOwnerWorktreeIds } from '../../ownership/terminal-tab-owner-index' +import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' +import type { TerminalSlice, TerminalStoreSet } from '../../terminal-state' export function createTerminalTabAgentLaunchPaneActions( set: TerminalStoreSet diff --git a/src/renderer/src/store/terminals/terminal-tab-create-through-layout-owner.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-tab-create-through-layout-owner.ts similarity index 93% rename from src/renderer/src/store/terminals/terminal-tab-create-through-layout-owner.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-tab-create-through-layout-owner.ts index c7221f7130c..0d139495cba 100644 --- a/src/renderer/src/store/terminals/terminal-tab-create-through-layout-owner.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-tab-create-through-layout-owner.ts @@ -1,6 +1,6 @@ // C3: window draws immediately for synchronous callers; main records the same IDs before later pane commands. Main-created tabs retain main’s facts so window saves do not mutate them. -import { createNonSecureContextUuid as createBrowserUuid } from '../../../../shared/non-secure-context-uuid' +import { createNonSecureContextUuid as createBrowserUuid } from '../../../../../../shared/non-secure-context-uuid' import { afterLayoutFrame } from '@/runtime/workspace-layout/frames/layout-frame-position' import { expectTabRowFields } from '@/runtime/workspace-layout/intents/layout-owner-pane-intents' import { runtimeEnvironmentIdUnlessTwin } from '@/lib/workspace/ownership/resolve-owner' @@ -8,14 +8,14 @@ import { sendLayoutApply } from '@/runtime/workspace-layout/commands/layout-appl import { newGroupSplitOf } from '@/runtime/workspace-layout/commands/layout-owner-new-group-split' import { callRuntimeRpc } from '@/runtime/rpc/calls/runtime-rpc-call' import { layoutFrameTerminalTab } from '@/runtime/workspace-layout/frames/layout-frame-terminal-panes' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import { pickStoredFields } from '../../../../shared/workspace-layout/persistence/stored-record-fields' +import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' +import { pickStoredFields } from '../../../../../../shared/workspace-layout/persistence/stored-record-fields' import type { CommandOf, LayoutApplyReply -} from '../../../../shared/workspace-layout/workspace-layout-command-types' -import type { AppState } from '../types' -import { makePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' +} from '../../../../../../shared/workspace-layout/workspace-layout-command-types' +import type { AppState } from '../../../types' +import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' import { clearWindowTabMark, markWindowTabStarting, diff --git a/src/renderer/src/store/terminals/terminal-tab-creation.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-tab-creation.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-tab-creation.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-tab-creation.ts index 41406c57da4..bc6ea1e791a 100644 --- a/src/renderer/src/store/terminals/terminal-tab-creation.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-tab-creation.ts @@ -4,36 +4,36 @@ import { clearWorktreeSleepIntent } from '@/lib/workspace/sleep/worktree-sleep-i import { isValidHostTerminalTabId, isValidMirroredHostTerminalTabId -} from '../../../../shared/workspace-layout/terminal-surfaces/terminal-tab-id' -import { getNextTerminalOrdinal } from '../../../../shared/workspace-layout/terminal-topology/terminal-tab-ordinal' -import { singlePaneLayoutSnapshot } from './terminal-single-pane-layout' -import { isTerminalLeafId } from '../../../../shared/workspace-layout/stable-pane-id' +} from '../../../../../../shared/workspace-layout/terminal-surfaces/terminal-tab-id' +import { getNextTerminalOrdinal } from '../../../../../../shared/workspace-layout/terminal-topology/terminal-tab-ordinal' +import { singlePaneLayoutSnapshot } from '../../layout/terminal-single-pane-layout' +import { isTerminalLeafId } from '../../../../../../shared/workspace-layout/stable-pane-id' import { buildOrphanTerminalCompanionCleanupPatch, getOrphanTerminalIds -} from './terminal-orphan-cleanup' +} from '../../retirement/terminal-orphan-cleanup' import { ensureWorktreeGroup, findTabByEntityInGroup, updateGroup -} from '../slices/tabs/tab-group-state' -import { pushRecentTabId, sanitizeRecentTabIds } from '../slices/tabs/tab-selection-history' -import { dedupeTabOrder } from '../../../../shared/workspace-layout/tab-groups/tab-order' -import { createNonSecureContextUuid as createBrowserUuid } from '../../../../shared/non-secure-context-uuid' -import { emptySplitGroup, splitGroupEntries } from '../slices/tabs/tabs-group-actions' -import { ownsGlobalSelection } from '../workspaces/selection/global-selection-owner' -import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch' +} from '../../../slices/tabs/tab-group-state' +import { pushRecentTabId, sanitizeRecentTabIds } from '../../../slices/tabs/tab-selection-history' +import { dedupeTabOrder } from '../../../../../../shared/workspace-layout/tab-groups/tab-order' +import { createNonSecureContextUuid as createBrowserUuid } from '../../../../../../shared/non-secure-context-uuid' +import { emptySplitGroup, splitGroupEntries } from '../../../slices/tabs/tabs-group-actions' +import { ownsGlobalSelection } from '../../../workspaces/selection/global-selection-owner' +import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../../shared/layout-owner-switch' import { recordCreatedTerminalTabInLayoutOwner, terminalTabCreateCommand, withMainTerminalFacts } from './terminal-tab-create-through-layout-owner' import { normalizeTabStartupCommand } from './terminal-startup-queues' -import { replaceRecordEntries, replaceTabBuckets } from '../keyed-record-transitions' +import { replaceRecordEntries, replaceTabBuckets } from '../../../keyed-record-transitions' import { applyRecordOperations } from './terminal-companion-record-operations' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' -import type { AppState } from '../types' +import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../../terminal-state' +import type { AppState } from '../../../types' export function createTerminalTabCreationActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/terminal-workspace-routing.ts b/src/renderer/src/store/terminals/tabs/creation/terminal-workspace-routing.ts similarity index 83% rename from src/renderer/src/store/terminals/terminal-workspace-routing.ts rename to src/renderer/src/store/terminals/tabs/creation/terminal-workspace-routing.ts index 1d2932fa49f..dc2fc9cf781 100644 --- a/src/renderer/src/store/terminals/terminal-workspace-routing.ts +++ b/src/renderer/src/store/terminals/tabs/creation/terminal-workspace-routing.ts @@ -1,17 +1,17 @@ -import type { AppState } from '../types' -import { parseWorkspaceKey } from '../../../../shared/workspace-scope' -import { getRepoIdFromWorktreeId } from '../../../../shared/worktree/id' -import { isWslUncPath } from '../../../../shared/wsl-paths' -import type { ProjectExecutionRuntimeResolution } from '../../../../shared/execution-host/project-execution-runtime' -import { resolveLocalWindowsTerminalShellOverrideForTab } from '../../../../shared/local-windows-terminal-runtime' -import { WINDOWS_GIT_BASH_SHELL } from '../../../../shared/windows-terminal-shell' +import type { AppState } from '../../../types' +import { parseWorkspaceKey } from '../../../../../../shared/workspace-scope' +import { getRepoIdFromWorktreeId } from '../../../../../../shared/worktree/id' +import { isWslUncPath } from '../../../../../../shared/wsl-paths' +import type { ProjectExecutionRuntimeResolution } from '../../../../../../shared/execution-host/project-execution-runtime' +import { resolveLocalWindowsTerminalShellOverrideForTab } from '../../../../../../shared/local-windows-terminal-runtime' +import { WINDOWS_GIT_BASH_SHELL } from '../../../../../../shared/windows-terminal-shell' import { getFolderWorkspaceConnectionId } from '@/lib/workspace/ownership/folder-workspace-connection' -import { getIndexedRepoMap } from '../repos/repository-catalog-index' -import { getIndexedWorktreeMap } from '../slices/worktrees/listing/worktree-catalog-index' +import { getIndexedRepoMap } from '../../../repos/repository-catalog-index' +import { getIndexedWorktreeMap } from '../../../slices/worktrees/listing/worktree-catalog-index' import { selectFolderWorkspaces, selectWorktreesByRepo -} from '../workspaces/catalog/workspace-record-fields' +} from '../../../workspaces/catalog/workspace-record-fields' export function isWindowsRendererRuntime(): boolean { return typeof navigator !== 'undefined' && navigator.userAgent.includes('Windows') diff --git a/src/renderer/src/store/terminals/window-tab-start-in-main.ts b/src/renderer/src/store/terminals/tabs/creation/window-tab-start-in-main.ts similarity index 93% rename from src/renderer/src/store/terminals/window-tab-start-in-main.ts rename to src/renderer/src/store/terminals/tabs/creation/window-tab-start-in-main.ts index bab08893fef..01b5f13aa12 100644 --- a/src/renderer/src/store/terminals/window-tab-start-in-main.ts +++ b/src/renderer/src/store/terminals/tabs/creation/window-tab-start-in-main.ts @@ -2,12 +2,12 @@ import { replaceRecordEntries } from '@/store/keyed-record-transitions' // Main starts window-drawn tabs under their IDs after recording them; panes wait (D1b-1). Inputs main cannot carry retain window spawn (L252). import { callRuntimeRpc } from '@/runtime/rpc/calls/runtime-rpc-call' -import { makePaneKey } from '../../../../shared/workspace-layout/stable-pane-id' -import { collectLeafIds } from '../../../../shared/workspace-layout/terminal-topology/terminal-pane-layout-tree' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import { isSupportedWindowsShellOverride } from '../../../../shared/windows-terminal-shell' -import type { AppState } from '../types' -import type { TerminalPaneStart } from './terminal-state' +import { makePaneKey } from '../../../../../../shared/workspace-layout/stable-pane-id' +import { collectLeafIds } from '../../../../../../shared/workspace-layout/terminal-topology/terminal-pane-layout-tree' +import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' +import { isSupportedWindowsShellOverride } from '../../../../../../shared/windows-terminal-shell' +import type { AppState } from '../../../types' +import type { TerminalPaneStart } from '../../terminal-state' import { getRemoteConnectionIdForWorktree, worktreeUsesWslPath } from './terminal-workspace-routing' type TabStartup = AppState['pendingStartupByTabId'][string] diff --git a/src/renderer/src/store/terminals/renamable-unified-tab.ts b/src/renderer/src/store/terminals/tabs/presentation/renamable-unified-tab.ts similarity index 88% rename from src/renderer/src/store/terminals/renamable-unified-tab.ts rename to src/renderer/src/store/terminals/tabs/presentation/renamable-unified-tab.ts index c99801f049d..d68bfce1036 100644 --- a/src/renderer/src/store/terminals/renamable-unified-tab.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/renamable-unified-tab.ts @@ -1,4 +1,4 @@ -import type { Tab } from '../../../../shared/tab-types' +import type { Tab } from '../../../../../../shared/tab-types' /** Presentation actions use terminal entityId for backed tabs, unified ID for rowless structured chats. */ export function findRenamableUnifiedTab( diff --git a/src/renderer/src/store/terminals/runtime-pane-title-sort-epoch.test.ts b/src/renderer/src/store/terminals/tabs/presentation/runtime-pane-title-sort-epoch.test.ts similarity index 88% rename from src/renderer/src/store/terminals/runtime-pane-title-sort-epoch.test.ts rename to src/renderer/src/store/terminals/tabs/presentation/runtime-pane-title-sort-epoch.test.ts index 16c7fae2e04..3eed29bddc3 100644 --- a/src/renderer/src/store/terminals/runtime-pane-title-sort-epoch.test.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/runtime-pane-title-sort-epoch.test.ts @@ -19,9 +19,9 @@ vi.mock('@/components/terminal-pane/snapshots/shutdown-buffer-captures', () => ( // @ts-expect-error -- minimal preload API stub for the slice's IPC writes globalThis.window = { api: {} } -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' +import { createTestStore, seedStore } from '../../../testing/app-store-test-fixture' +import { makeTab } from '../../testing/terminal-tab.test-fixture' +import { makeWorktree } from '../../../slices/worktrees/worktree.test-fixture' describe('runtimePaneTitle → sortEpoch', () => { it('retains the visible title across a decorative spinner frame', () => { diff --git a/src/renderer/src/store/terminals/tab-change-through-layout-owner.ts b/src/renderer/src/store/terminals/tabs/presentation/tab-change-through-layout-owner.ts similarity index 97% rename from src/renderer/src/store/terminals/tab-change-through-layout-owner.ts rename to src/renderer/src/store/terminals/tabs/presentation/tab-change-through-layout-owner.ts index e75218bc4a1..4caa8b08eca 100644 --- a/src/renderer/src/store/terminals/tab-change-through-layout-owner.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/tab-change-through-layout-owner.ts @@ -1,4 +1,4 @@ -import type { Tab } from '../../../../shared/tab-types' +import type { Tab } from '../../../../../../shared/tab-types' import { sendLayoutApply, type WindowLayoutCommand diff --git a/src/renderer/src/store/terminals/terminal-tab-appearance.ts b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-appearance.ts similarity index 96% rename from src/renderer/src/store/terminals/terminal-tab-appearance.ts rename to src/renderer/src/store/terminals/tabs/presentation/terminal-tab-appearance.ts index b86b6b1522f..0db40a77cd7 100644 --- a/src/renderer/src/store/terminals/terminal-tab-appearance.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-appearance.ts @@ -1,8 +1,8 @@ import { replaceTabBuckets } from '@/store/keyed-record-transitions' -import { getTerminalTabOwnerWorktreeIds } from './terminal-tab-owner-index' +import { getTerminalTabOwnerWorktreeIds } from '../../ownership/terminal-tab-owner-index' import { scheduleRuntimeGraphSync } from '@/runtime/sync-runtime-graph/graph-sync-scheduler' import { resolveTerminalWorktreeRoute } from '@/lib/workspace/ownership/terminal-worktree-route' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../../terminal-state' import { findRenamableUnifiedTab } from './renamable-unified-tab' import { captureStructuredChatRename } from '@/runtime/native-chat/naming/structured-chat-rename-action' diff --git a/src/renderer/src/store/terminals/terminal-tab-layout-owner-actions.ts b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-layout-owner-actions.ts similarity index 95% rename from src/renderer/src/store/terminals/terminal-tab-layout-owner-actions.ts rename to src/renderer/src/store/terminals/tabs/presentation/terminal-tab-layout-owner-actions.ts index b9a365c087a..2a7c8681268 100644 --- a/src/renderer/src/store/terminals/terminal-tab-layout-owner-actions.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-layout-owner-actions.ts @@ -1,7 +1,7 @@ -import type { AppState } from '../types' +import type { AppState } from '../../../types' import { getTabIdFromPaneKey, type GeneratedTabTitleUpdate } from './terminal-tab-title-batch' -import { getTerminalTabOwnerWorktreeId } from './terminal-tab-owner-index' -import type { TerminalSlice, TerminalStoreGet } from './terminal-state' +import { getTerminalTabOwnerWorktreeId } from '../../ownership/terminal-tab-owner-index' +import type { TerminalSlice, TerminalStoreGet } from '../../terminal-state' import { sendRenamableTabChangeToLayoutOwner, type TabChange diff --git a/src/renderer/src/store/terminals/terminal-tab-presentation.ts b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-presentation.ts similarity index 93% rename from src/renderer/src/store/terminals/terminal-tab-presentation.ts rename to src/renderer/src/store/terminals/tabs/presentation/terminal-tab-presentation.ts index b5829568a90..446f11c5f76 100644 --- a/src/renderer/src/store/terminals/terminal-tab-presentation.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-presentation.ts @@ -1,7 +1,7 @@ import { replaceTabBuckets, replaceRecordEntries } from '@/store/keyed-record-transitions' -import { isDecorativeAgentTitleFrameChange } from '../../../../shared/agent-status/title/agent-decorative-title-signature' +import { isDecorativeAgentTitleFrameChange } from '../../../../../../shared/agent-status/title/agent-decorative-title-signature' import { scheduleRuntimeGraphSync } from '@/runtime/sync-runtime-graph/graph-sync-scheduler' -import { detectAgentStatusFromTitle } from '../../../../shared/agent-status/title/agent-title-status' +import { detectAgentStatusFromTitle } from '../../../../../../shared/agent-status/title/agent-title-status' import { applyGeneratedTabTitleUpdates, applyTerminalTabTitleUpdates @@ -9,10 +9,10 @@ import { import { adoptTerminalTabOwnerMetadataOnlyBuckets, getTerminalTabOwnerWorktreeId -} from './terminal-tab-owner-index' -import { getTabIdFromPaneKey } from './terminal-pty-identities' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' -import { sameAiVaultSessionTitle } from '../../../../shared/ai-vault/contracts/ai-vault-session-title' +} from '../../ownership/terminal-tab-owner-index' +import { getTabIdFromPaneKey } from '../../pty/terminal-pty-identities' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../../terminal-state' +import { sameAiVaultSessionTitle } from '../../../../../../shared/ai-vault/contracts/ai-vault-session-title' export function createTerminalTabPresentationActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/terminal-tab-title-batch.ts b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-title-batch.ts similarity index 90% rename from src/renderer/src/store/terminals/terminal-tab-title-batch.ts rename to src/renderer/src/store/terminals/tabs/presentation/terminal-tab-title-batch.ts index 4462d88d97c..02050b6d6c3 100644 --- a/src/renderer/src/store/terminals/terminal-tab-title-batch.ts +++ b/src/renderer/src/store/terminals/tabs/presentation/terminal-tab-title-batch.ts @@ -1,18 +1,18 @@ -import { deriveGeneratedTabTitle } from '../../../../shared/agent-status/presentation/agent-tab-title' -import { tabHasProtectedTitle } from '../../../../shared/agent-status/presentation/agent-generated-tab-title-rules' -import { isDecorativeAgentTitleFrameChange } from '../../../../shared/agent-status/title/agent-decorative-title-signature' +import { deriveGeneratedTabTitle } from '../../../../../../shared/agent-status/presentation/agent-tab-title' +import { tabHasProtectedTitle } from '../../../../../../shared/agent-status/presentation/agent-generated-tab-title-rules' +import { isDecorativeAgentTitleFrameChange } from '../../../../../../shared/agent-status/title/agent-decorative-title-signature' import { parseLegacyNumericPaneKey, parsePaneKey -} from '../../../../shared/workspace-layout/stable-pane-id' -import type { Tab } from '../../../../shared/tab-types' -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' -import type { AppState } from '../types' -import { replaceTabBuckets } from '../keyed-record-transitions' +} from '../../../../../../shared/workspace-layout/stable-pane-id' +import type { Tab } from '../../../../../../shared/tab-types' +import type { TerminalTab } from '../../../../../../shared/workspace-layout/terminal-tab-types' +import type { AppState } from '../../../types' +import { replaceTabBuckets } from '../../../keyed-record-transitions' import { adoptTerminalTabOwnerMetadataOnlyBuckets, getTerminalTabOwners -} from './terminal-tab-owner-index' +} from '../../ownership/terminal-tab-owner-index' export type TerminalTabTitleUpdate = { tabId: string; title: string } diff --git a/src/renderer/src/store/terminals/recently-closed-terminal-tabs.test.ts b/src/renderer/src/store/terminals/tabs/recently-closed-terminal-tabs.test.ts similarity index 95% rename from src/renderer/src/store/terminals/recently-closed-terminal-tabs.test.ts rename to src/renderer/src/store/terminals/tabs/recently-closed-terminal-tabs.test.ts index 21b156b63c7..2a1ce950f05 100644 --- a/src/renderer/src/store/terminals/recently-closed-terminal-tabs.test.ts +++ b/src/renderer/src/store/terminals/tabs/recently-closed-terminal-tabs.test.ts @@ -1,7 +1,7 @@ // Reopen terminal/browser/editor snapshots in true cross-type MRU order via Cmd/Ctrl+Shift+T. import { describe, it, expect, vi, beforeEach } from 'vitest' import type * as AgentStatusModule from '@/lib/agent-status/aggregation/worktree-agent-status' -import { getDefaultSettings } from '../../../../shared/constants' +import { getDefaultSettings } from '../../../../../shared/constants' vi.mock('sonner', () => ({ toast: { info: vi.fn(), success: vi.fn(), error: vi.fn(), warning: vi.fn() } @@ -31,8 +31,8 @@ const mockApi = { // @ts-expect-error -- minimal window.api stub for the store under test globalThis.window = { api: mockApi } -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' +import { createTestStore, seedStore } from '../../testing/app-store-test-fixture' +import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' import { remapClosedTerminalTabSnapshotCwds } from './recently-closed-terminal-tabs' import { layoutApplyTestTransport } from '@/runtime/workspace-layout/testing/layout-apply-test-transport.test-fixture' diff --git a/src/renderer/src/store/terminals/recently-closed-terminal-tabs.ts b/src/renderer/src/store/terminals/tabs/recently-closed-terminal-tabs.ts similarity index 96% rename from src/renderer/src/store/terminals/recently-closed-terminal-tabs.ts rename to src/renderer/src/store/terminals/tabs/recently-closed-terminal-tabs.ts index c7f947cfceb..2800ebad978 100644 --- a/src/renderer/src/store/terminals/recently-closed-terminal-tabs.ts +++ b/src/renderer/src/store/terminals/tabs/recently-closed-terminal-tabs.ts @@ -1,14 +1,14 @@ import type { StateCreator } from 'zustand' -import type { AppState } from '../types' +import type { AppState } from '../../types' import { runtimeEnvironmentIdForWorkspaceOwner } from '@/lib/workspace/ownership/resolve-owner' import { isWindowsAbsolutePathLike, relativePathInsideRoot -} from '../../../../shared/cross-platform-path' +} from '../../../../../shared/cross-platform-path' import { restoreRecentlyClosedTabPosition, type RecentlyClosedTabPosition -} from '../slices/tabs/recently-closed-tab-position' +} from '../../slices/tabs/recently-closed-tab-position' /** Reopen user-closed terminals as fresh shells at original cwd, never old PTYs, scrollback or agent sessions (Ghostty semantics). */ export type ClosedTerminalTabSnapshot = { diff --git a/src/renderer/src/store/terminals/terminal-tab-navigation.ts b/src/renderer/src/store/terminals/tabs/terminal-tab-navigation.ts similarity index 91% rename from src/renderer/src/store/terminals/terminal-tab-navigation.ts rename to src/renderer/src/store/terminals/tabs/terminal-tab-navigation.ts index 391121f581d..05115187576 100644 --- a/src/renderer/src/store/terminals/terminal-tab-navigation.ts +++ b/src/renderer/src/store/terminals/tabs/terminal-tab-navigation.ts @@ -1,8 +1,8 @@ -import { resolveActiveTabOwnerWorktreeId } from './active-tab-owner-worktree' -import { getTerminalTabOwnerWorktreeId } from './terminal-tab-owner-index' -import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from './terminal-state' -import { ownsGlobalSelection } from '../workspaces/selection/global-selection-owner' -import { replaceTabBuckets } from '../keyed-record-transitions' +import { resolveActiveTabOwnerWorktreeId } from '../ownership/active-tab-owner-worktree' +import { getTerminalTabOwnerWorktreeId } from '../ownership/terminal-tab-owner-index' +import type { TerminalSlice, TerminalStoreGet, TerminalStoreSet } from '../terminal-state' +import { ownsGlobalSelection } from '../../workspaces/selection/global-selection-owner' +import { replaceTabBuckets } from '../../keyed-record-transitions' export function createTerminalTabNavigationActions( set: TerminalStoreSet, diff --git a/src/renderer/src/store/terminals/terminal-actions.ts b/src/renderer/src/store/terminals/terminal-actions.ts index 44e45b91489..d25ad988811 100644 --- a/src/renderer/src/store/terminals/terminal-actions.ts +++ b/src/renderer/src/store/terminals/terminal-actions.ts @@ -17,13 +17,19 @@ import type { StartupCommandDelivery } from '../../../../shared/agent-launch/sta import type { SessionOptionValue } from '../../../../shared/native-chat/input/native-chat-session-options' import type { AgentStartedTelemetry } from '../../lib/workspace/creation/worktree-startup-payload' import type { AiVaultSessionTitle } from '../../../../shared/ai-vault/contracts/ai-vault-session-title' -import type { GeneratedTabTitleUpdate, TerminalTabTitleUpdate } from './terminal-tab-title-batch' +import type { + GeneratedTabTitleUpdate, + TerminalTabTitleUpdate +} from './tabs/presentation/terminal-tab-title-batch' import type { NativeChatLaunchDraft, NativeChatLaunchPrompt } from '@/components/native-chat/drafts/native-chat-launch-prompt' import type { AgentStatusWorktreeShutdownReason } from '../slices/agent-status/agent-status-contract' -import type { TerminalTabCloseReason, TerminalTabRetirementPlan } from './terminal-tab-retirement' +import type { + TerminalTabCloseReason, + TerminalTabRetirementPlan +} from './retirement/terminal-tab-retirement' import type { AccountRestartAgent, TerminalCreationExecutionFacts, diff --git a/src/renderer/src/store/terminals/terminal-quick-command-hosts.test.ts b/src/renderer/src/store/terminals/terminal-quick-command-hosts.test.ts deleted file mode 100644 index 4a22721e237..00000000000 --- a/src/renderer/src/store/terminals/terminal-quick-command-hosts.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { createTestStore } from '../testing/app-store-test-fixture' -import type { TerminalQuickCommand } from '../../../../shared/terminal/quick-commands/terminal-quick-command-types' - -import { - MIN_COMPATIBLE_RUNTIME_CLIENT_VERSION, - RUNTIME_PROTOCOL_VERSION -} from '../../../../shared/protocol-version' -import { TERMINAL_QUICK_COMMANDS_RUNTIME_CAPABILITY } from '../../../../shared/terminal/quick-commands/terminal-quick-command-capabilities' -import { clearRuntimeCompatibilityCache as clearRuntimeCompatibilityCacheForTests } from '@/runtime/rpc/compatibility/runtime-compatibility-cache' -import { stubRuntimeEnvironmentBridge } from '../../runtime/rpc/testing/runtime-environment-bridge-fixture' - -vi.mock('sonner', () => ({ toast: { error: vi.fn() } })) - -const savedCommand: TerminalQuickCommand = { - id: 'remote-build', - label: 'Remote build', - action: 'terminal-command', - command: 'pnpm build', - appendEnter: true, - scope: { type: 'global' } -} - -function success(result: unknown) { - return { id: 'rpc-1', ok: true, result, _meta: { runtimeId: 'runtime-1' } } -} - -beforeEach(() => { - clearRuntimeCompatibilityCacheForTests() - vi.clearAllMocks() -}) - -describe('terminal quick command host collections', () => { - it('does not let an older load overwrite a concurrent mutation', async () => { - let resolveLoad: (value: ReturnType) => void = () => undefined - const staleLoad = new Promise>((resolve) => { - resolveLoad = resolve - }) - const edited = { ...savedCommand, command: 'pnpm test' } - const call = vi.fn(({ method, params }: { method: string; params?: unknown }) => { - if (method === 'status.get') { - return Promise.resolve( - success({ - runtimeId: 'runtime-1', - graphStatus: 'ready', - runtimeProtocolVersion: RUNTIME_PROTOCOL_VERSION, - minCompatibleRuntimeClientVersion: MIN_COMPATIBLE_RUNTIME_CLIENT_VERSION, - capabilities: [TERMINAL_QUICK_COMMANDS_RUNTIME_CAPABILITY] - }) - ) - } - if (method === 'settings.getTerminalQuickCommands') { - return staleLoad - } - if (method === 'settings.updateTerminalQuickCommands') { - return Promise.resolve(success({ terminalQuickCommands: [edited] })) - } - throw new Error(`Unexpected method: ${method} ${String(params)}`) - }) - stubRuntimeEnvironmentBridge({ call }) - const store = createTestStore() - - const load = store.getState().loadRuntimeTerminalQuickCommands('env-race', { force: true }) - await vi.waitFor(() => - expect(call).toHaveBeenCalledWith( - expect.objectContaining({ method: 'settings.getTerminalQuickCommands' }) - ) - ) - await store.getState().upsertTerminalQuickCommand('runtime:env-race', edited) - resolveLoad(success({ terminalQuickCommands: [savedCommand] })) - await load - - expect(store.getState().runtimeTerminalQuickCommands.get('env-race')?.commands).toEqual([ - edited - ]) - }) -}) diff --git a/src/renderer/src/store/terminals/terminal-state.ts b/src/renderer/src/store/terminals/terminal-state.ts index 7895453f8b8..a82f250c91d 100644 --- a/src/renderer/src/store/terminals/terminal-state.ts +++ b/src/renderer/src/store/terminals/terminal-state.ts @@ -32,7 +32,7 @@ import type { StateCreator } from 'zustand' import type { AppState } from '../types' import type { TerminalActions } from './terminal-actions' import type { AgentPaneLaunchRequest } from '../../../../shared/agent-launch/contracts/agent-pane-launch-request' -import type { PairedTerminalTabCloseIntentSlice } from './paired-terminal-tab-close-intent-actions' +import type { PairedTerminalTabCloseIntentSlice } from './retirement/paired-terminal-tab-close-intent-actions' export type TerminalState = { tabsByWorktree: Record diff --git a/src/renderer/src/store/terminals/terminal-tab-retirement-store.test.ts b/src/renderer/src/store/terminals/terminal-tab-retirement-store.test.ts deleted file mode 100644 index 2e0480e073f..00000000000 --- a/src/renderer/src/store/terminals/terminal-tab-retirement-store.test.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { SleepingAgentSessionRecord } from '../../../../shared/agent-session/lifecycle/agent-session-resume' - -const mockKill = vi.fn().mockResolvedValue(undefined) -const mockRuntimeCall = vi.fn().mockResolvedValue({ - id: 'rpc-1', - ok: true, - result: {}, - _meta: { runtimeId: 'local-runtime' } -}) - -vi.stubGlobal('window', { - api: { - pty: { kill: mockKill }, - runtime: { call: mockRuntimeCall }, - runtimeEnvironments: { call: vi.fn() } - } -}) - -import { - capturedPanesByTabId, - parkedWatchersByTabId -} from '@/components/terminal-pane/parking/output-watchers/terminal-parked-watcher-registry' -import { createTestStore, seedStore } from '../testing/app-store-test-fixture' -import { makeWorktree } from '../slices/worktrees/worktree.test-fixture' -import { makeTab } from './terminal-tab.test-fixture' -import { makeTabGroup, makeUnifiedTab } from '../slices/tabs/tab-group.test-fixture' - -function createRetirementStore() { - const store = createTestStore() - seedStore(store, { - worktreesByRepo: { - repo1: [makeWorktree({ id: 'wt-1', repoId: 'repo1', path: '/repo/wt-1' })] - } - }) - return store -} - -function sleepingRecord(paneKey: string, tabId: string): SleepingAgentSessionRecord { - return { - paneKey, - tabId, - worktreeId: 'wt-1', - agent: 'codex', - providerSession: { key: 'session_id', id: paneKey }, - prompt: 'continue', - state: 'working', - capturedAt: 1, - updatedAt: 1 - } -} - -describe('terminal tab retirement store boundary', () => { - beforeEach(() => { - vi.clearAllMocks() - mockKill.mockResolvedValue(undefined) - mockRuntimeCall.mockResolvedValue({ - id: 'rpc-1', - ok: true, - result: {}, - _meta: { runtimeId: 'local-runtime' } - }) - parkedWatchersByTabId.clear() - capturedPanesByTabId.clear() - }) - - it('routes runtime handles to runtime close and preserves shared PTYs', async () => { - const store = createRetirementStore() - seedStore(store, { - tabsByWorktree: { - 'wt-1': [ - makeTab({ id: 'tab-1', worktreeId: 'wt-1', ptyId: 'remote:terminal-1' }), - makeTab({ id: 'tab-2', worktreeId: 'wt-1', ptyId: 'pty-shared' }) - ] - }, - ptyIdsByTabId: { - 'tab-1': ['remote:terminal-1', 'pty-shared'], - 'tab-2': ['pty-shared'] - } - }) - - store.getState().closeTab('tab-1') - await vi.waitFor(() => expect(mockRuntimeCall).toHaveBeenCalled()) - - expect(mockRuntimeCall).toHaveBeenCalledWith({ - method: 'terminal.close', - params: { terminal: 'terminal-1' } - }) - expect(mockKill).not.toHaveBeenCalled() - }) - - it('reconciles natural exit without issuing teardown or revoking resume authority', async () => { - const store = createRetirementStore() - const record = sleepingRecord('tab-1:leaf-1', 'tab-1') - seedStore(store, { - tabsByWorktree: { - 'wt-1': [makeTab({ id: 'tab-1', worktreeId: 'wt-1', ptyId: 'pty-dead' })] - }, - ptyIdsByTabId: { 'tab-1': ['pty-dead'] }, - sleepingAgentSessionsByPaneKey: { 'tab-1:leaf-1': record } - }) - - store.getState().closeTab('tab-1', { reason: 'pty-exit' }) - await Promise.resolve() - - expect(mockKill).not.toHaveBeenCalled() - expect(mockRuntimeCall).not.toHaveBeenCalled() - expect(store.getState().sleepingAgentSessionsByPaneKey['tab-1:leaf-1']).toBe(record) - }) - - it('retires a unified-only terminal instead of removing only its wrapper', async () => { - const store = createRetirementStore() - const unified = makeUnifiedTab({ - id: 'unified-tab-1', - entityId: 'terminal-tab-1', - worktreeId: 'wt-1', - groupId: 'group-1' - }) - seedStore(store, { - tabsByWorktree: { 'wt-1': [] }, - unifiedTabsByWorktree: { 'wt-1': [unified] }, - groupsByWorktree: { - 'wt-1': [ - makeTabGroup({ - id: 'group-1', - worktreeId: 'wt-1', - activeTabId: unified.id, - tabOrder: [unified.id] - }) - ] - }, - ptyIdsByTabId: { 'terminal-tab-1': ['pty-unified-only'] } - }) - - store.getState().closeUnifiedTab(unified.id) - await vi.waitFor(() => expect(mockKill).toHaveBeenCalledWith('pty-unified-only')) - - expect(store.getState().unifiedTabsByWorktree['wt-1']).toEqual([]) - expect(store.getState().ptyIdsByTabId['terminal-tab-1']).toBeUndefined() - }) -}) diff --git a/src/renderer/src/store/terminals/terminal-row.test-fixture.ts b/src/renderer/src/store/terminals/testing/terminal-row.test-fixture.ts similarity index 73% rename from src/renderer/src/store/terminals/terminal-row.test-fixture.ts rename to src/renderer/src/store/terminals/testing/terminal-row.test-fixture.ts index e81f5b877de..c18db82a1ef 100644 --- a/src/renderer/src/store/terminals/terminal-row.test-fixture.ts +++ b/src/renderer/src/store/terminals/testing/terminal-row.test-fixture.ts @@ -1,4 +1,4 @@ -import type { TerminalTab } from '../../../../shared/workspace-layout/terminal-tab-types' +import type { TerminalTab } from '../../../../../shared/workspace-layout/terminal-tab-types' export function makeTerminalTab( overrides: Partial & { id: string; worktreeId: string } diff --git a/src/renderer/src/store/terminals/terminal-tab.test-fixture.ts b/src/renderer/src/store/terminals/testing/terminal-tab.test-fixture.ts similarity index 89% rename from src/renderer/src/store/terminals/terminal-tab.test-fixture.ts rename to src/renderer/src/store/terminals/testing/terminal-tab.test-fixture.ts index c2ba27a12de..f0d9f69f183 100644 --- a/src/renderer/src/store/terminals/terminal-tab.test-fixture.ts +++ b/src/renderer/src/store/terminals/testing/terminal-tab.test-fixture.ts @@ -1,7 +1,7 @@ import type { TerminalLayoutSnapshot, TerminalTab -} from '../../../../shared/workspace-layout/terminal-tab-types' +} from '../../../../../shared/workspace-layout/terminal-tab-types' import { translate } from '@/i18n/i18n' diff --git a/src/renderer/src/store/testing/app-store-test-fixture.ts b/src/renderer/src/store/testing/app-store-test-fixture.ts index 3b081545739..52bb537d420 100644 --- a/src/renderer/src/store/testing/app-store-test-fixture.ts +++ b/src/renderer/src/store/testing/app-store-test-fixture.ts @@ -42,14 +42,14 @@ import { createRuntimeStatusSlice } from '../slices/runtime-status/create-runtim import { createPullRequestGenerationSlice } from '../slices/hosted-review/generation/pull-request-generation' import { createCommitMessageGenerationSlice } from '../slices/hosted-review/generation/commit-message-generation' import { createPinnedTabCloseConfirmSlice } from '../slices/tabs/pinned-tab-close-confirm' -import { createRecentlyClosedTerminalTabsSlice } from '../terminals/recently-closed-terminal-tabs' +import { createRecentlyClosedTerminalTabsSlice } from '../terminals/tabs/recently-closed-terminal-tabs' import { createRecentlyClosedTabsSlice } from '../slices/tabs/recently-closed-tabs' import { createOrcaProfilesSlice } from '../slices/orca-profiles/create-orca-profiles-slice' import { createNewIssueDraftSlice } from '../slices/task-creation/new-issue-draft' import { createFeedbackDraftSlice } from '../slices/feedback/feedback-draft' import { createTaskCreationDraftsSlice } from '../slices/task-creation/task-creation-drafts' import { createRemoteServerUpdatesSlice } from '../slices/runtime-host-updates/remote-server-updates' -import { createTerminalQuickCommandHostsSlice } from '../terminals/terminal-quick-command-hosts' +import { createTerminalQuickCommandHostsSlice } from '../terminals/quick-commands/terminal-quick-command-hosts' import { createStructuredSessionLaunchDirectorySlice } from '../slices/agent-status/structured-session-launch-directories' import { createStructuredChatSleptAtSlice } from '../slices/agent-status/structured-chat-slept-at' import { createStructuredChatCompanionWritesSlice } from '../slices/agent-status/structured-chat-companion-writes' diff --git a/src/renderer/src/store/types.ts b/src/renderer/src/store/types.ts index 946f34993d3..0bc0c339869 100644 --- a/src/renderer/src/store/types.ts +++ b/src/renderer/src/store/types.ts @@ -39,14 +39,14 @@ import type { RuntimeStatusSlice } from './slices/runtime-status/runtime-status- import type { PullRequestGenerationSlice } from './slices/hosted-review/generation/pull-request-generation-state' import type { CommitMessageGenerationSlice } from './slices/hosted-review/generation/commit-message-generation' import type { PinnedTabCloseConfirmSlice } from './slices/tabs/pinned-tab-close-confirm' -import type { RecentlyClosedTerminalTabsSlice } from './terminals/recently-closed-terminal-tabs' +import type { RecentlyClosedTerminalTabsSlice } from './terminals/tabs/recently-closed-terminal-tabs' import type { RecentlyClosedTabsSlice } from './slices/tabs/recently-closed-tabs' import type { OrcaProfilesSlice } from './slices/orca-profiles/create-orca-profiles-slice' import type { NewIssueDraftSlice } from './slices/task-creation/new-issue-draft' import type { FeedbackDraftSlice } from './slices/feedback/feedback-draft' import type { TaskCreationDraftsSlice } from './slices/task-creation/task-creation-drafts' import type { RemoteServerUpdatesSlice } from './slices/runtime-host-updates/remote-server-updates' -import type { TerminalQuickCommandHostsSlice } from './terminals/terminal-quick-command-hosts' +import type { TerminalQuickCommandHostsSlice } from './terminals/quick-commands/terminal-quick-command-hosts' import type { StructuredSessionLaunchDirectorySlice } from './slices/agent-status/structured-session-launch-directories' import type { StructuredChatSleptAtSlice } from './slices/agent-status/structured-chat-slept-at' import type { StructuredChatCompanionWritesSlice } from './slices/agent-status/structured-chat-companion-writes' diff --git a/src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-slices.ts b/src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-slices.ts index 2c949deeb27..f2ce06d19ea 100644 --- a/src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-slices.ts +++ b/src/renderer/src/store/workspace-layout/frames/workspace-layout-frame-slices.ts @@ -25,9 +25,9 @@ import type { EditorTabView } from '../../../../../shared/editor-tab-view-types' import { migrateHydratedEditorTabsAndGroups } from '../../slices/editor/file-ids/hydrated-editor-file-ids' import { buildHydratedTabState } from '../../slices/tabs/tabs-hydration' import { buildByIdIndex } from '../../../../../shared/first-row-by-id-index' -import { restoreActiveTabIdByWorktree } from '../../terminals/workspace-terminal-active-tabs' -import { buildWorkspaceTerminalLayoutPlan } from '../../terminals/workspace-terminal-layout-plan' -import { buildWorkspaceTerminalRowPlan } from '../../terminals/workspace-terminal-row-plan' +import { restoreActiveTabIdByWorktree } from '../../terminals/hydration/workspace-terminal-active-tabs' +import { buildWorkspaceTerminalLayoutPlan } from '../../terminals/hydration/workspace-terminal-layout-plan' +import { buildWorkspaceTerminalRowPlan } from '../../terminals/hydration/workspace-terminal-row-plan' import type { AppState } from '../../types' import type { WorkspaceLayoutCache } from '../workspace-layout-cache' diff --git a/src/renderer/src/store/workspaces/host-isolation/host-twin.test-fixture.ts b/src/renderer/src/store/workspaces/host-isolation/host-twin.test-fixture.ts index 7fa3f9fdcfb..e2267ab2cc6 100644 --- a/src/renderer/src/store/workspaces/host-isolation/host-twin.test-fixture.ts +++ b/src/renderer/src/store/workspaces/host-isolation/host-twin.test-fixture.ts @@ -4,7 +4,7 @@ import { toAppSshPtyId } from '../../../../../shared/ssh-pty-id' import { folderWorkspaceKey } from '../../../../../shared/workspace-scope' import { createTestStore } from '../../testing/app-store-test-fixture' import { makeOpenFile } from '../../slices/editor/types/open-file.test-fixture' -import { makeTab } from '../../terminals/terminal-tab.test-fixture' +import { makeTab } from '../../terminals/testing/terminal-tab.test-fixture' import { makeTabGroup, makeUnifiedTab } from '../../slices/tabs/tab-group.test-fixture' import { makeWorktree } from '../../slices/worktrees/worktree.test-fixture' import { makeFolderWorkspace } from '../../folder-workspaces/folder-workspace.test-fixture' diff --git a/tests/e2e/agent-sender-delivery.unit.test.ts b/tests/e2e/agent-sender-delivery.unit.test.ts deleted file mode 100644 index 9b3d9b0dc6a..00000000000 --- a/tests/e2e/agent-sender-delivery.unit.test.ts +++ /dev/null @@ -1,403 +0,0 @@ -// @vitest-environment happy-dom -import { act, cleanup, renderHook } from '@testing-library/react' -import { afterEach, beforeEach, expect, it } from 'vitest' -import { useAppStore } from '@/store' -import { createRuntimeAgentProjections } from '../../src/main/runtime/construction/runtime-agent-projections' -import { createSessionTabsStreamDelta } from '../../src/main/runtime/rpc/methods/session-tabs/session-tabs-sender-delta' -import { MIRROR_LEAVES_STEP_1 } from '../../src/main/runtime/terminal/records/runtime-leaf-record-projection.test-fixture' -import type { - RuntimeLeafRecord, - RuntimePtyWorktreeRecord -} from '../../src/main/runtime/terminal/records/runtime-terminal-state-records' -import type { RuntimeMobileSessionTabsResult } from '../../src/shared/runtime-types' -import type { RuntimeSyncWindowGraphResult } from '../../src/shared/runtime-session-contracts' - -/** The sender part of a window graph reply, as main sends it. */ -type SenderGraphReply = Pick< - RuntimeSyncWindowGraphResult, - 'agentSenderAssociations' | 'agentSenderRevision' -> -import { - agentSenderIndexWorkForTest, - selectAgentSenderAssociation -} from '@/runtime/native-chat/agent-senders/agent-sender-associations' -import { agentSenderAliasWorkForTest } from '@/runtime/native-chat/agent-senders/agent-sender-alias-projection' -import { applyStructuredSessionTabSnapshots } from '@/runtime/local-structured-session-tabs-sync/snapshot-apply' -import { resetLocalStructuredSessionVersionForTests } from '@/runtime/local-structured-session-tabs-sync/inventory-generation-fence' -import { handleGlobalSessionEvent } from '@/runtime/web-session-tabs-sync/global-session-events' -import { VisibilityResumeCoordinator } from '@/runtime/web-session-tabs-sync/visibility-resume-coordinator' -import { resetWebSessionTabsSnapshotFreshnessForTests } from '@/runtime/web-session-tabs-sync/tracking-lifecycle' -import { useAgentMessageSenderView } from '@/components/native-chat/messages/agent-senders/native-chat-agent-message-sender-view' -import { - initialStore, - resetSenderStore -} from '@/components/native-chat/messages/agent-senders/native-chat-agent-sender.test-fixture' -import { makeTab } from '@/store/terminals/terminal-tab.test-fixture' - -const unissued = (): never => { - throw new Error('a sender build issued a terminal handle') -} - -beforeEach(() => { - resetSenderStore() - resetWebSessionTabsSnapshotFreshnessForTests() - resetLocalStructuredSessionVersionForTests() -}) -afterEach(() => { - cleanup() - useAppStore.setState(initialStore, true) -}) - -const leafOf = (i: number) => `${(i + 1).toString(16).padStart(8, '0')}-1111-4111-8111-111111111111` -const handleOf = (i: number) => `term_${i}` -const sender = (i: number) => ({ - party: { address: handleOf(i), terminalHandle: handleOf(i), orcaSessionId: null }, - name: `Worker ${i}` -}) - -/** A host runtime with live terminals split over two worktrees, and the wire as JSON. */ -function host(n: number) { - const leaves: RuntimeLeafRecord[] = [] - const ptys: RuntimePtyWorktreeRecord[] = [] - const open = (i: number, worktreeId: string) => { - leaves.push({ ...MIRROR_LEAVES_STEP_1[0], tabId: `tab${i}`, worktreeId, ptyId: `pty-${i}` }) - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the publisher reads only these fields. - ptys.push({ ptyId: `pty-${i}`, incarnationId: 'inc', worktreeId } as RuntimePtyWorktreeRecord) - } - for (let i = 0; i < n; i++) { - open(i, i % 2 ? 'w2' : 'w1') - } - const start = () => - createRuntimeAgentProjections( - { - getExistingOrchestrationDb: () => null, - resolveOrchestrationWorkerServer: () => { - throw new Error('unpaired') - } - }, - { - getDb: () => null, - getLeaves: () => leaves, - getPtys: () => ptys, - paneOf: () => ({ tabId: null, paneKey: null, recordedAtGraphSequence: 0 }), - // Orchestration issues handles; sender rows only read the ones already issued. - issueLeafHandle: unissued, - issuePtyHandle: unissued, - readLeafHandle: (leaf) => handleOf(Number(leaf.tabId.slice(3))), - readPtyHandles: () => () => null, - makePaneKey: (leaf) => `${leaf.tabId}:${leafOf(Number(leaf.tabId.slice(3)))}`, - getWorktreeId: () => null, - getHandleForPaneKey: () => null, - getPaneKey: () => null, - getDispatchAuthority: () => null, - getAgentStatusSnapshot: () => [], - getSessionRecords: () => null - } - ).senders - let senders = start() - // Round-trips through JSON as the host serves it; the declared type is what was sent. - const wire = (value: T): T => JSON.parse(JSON.stringify(value)) - let rowsSent = 0 - const count = (publication: { associations: readonly unknown[] } | undefined) => { - rowsSent += publication?.associations.length ?? 0 - } - /** The window's graph sync: it sends the revision it applied, and applies only rows. */ - const graphReply = () => { - const base = useAppStore.getState().agentSenderPublicationsByHost.local?.['*']?.revision - return wire(senders.buildForGraph(base)) - } - const applyGraph = (result: SenderGraphReply) => { - count(result.agentSenderAssociations) - if (!result.agentSenderRevision) { - useAppStore.getState().setAgentSenderPublication('local', result.agentSenderAssociations) - } - } - let stream = createSessionTabsStreamDelta(undefined) - let version = 0 - /** One session-tab stream frame for a worktree, through that stream's encoder and the wire; - * a host re-emit repeats the tab version the window already has. */ - const frame = (worktree: string, snapshotVersion = ++version) => - wire( - stream({ - worktree, - publicationEpoch: 'host', - snapshotVersion, - activeGroupId: null, - activeTabId: null, - activeTabType: null, - tabs: [], - agentSenderAssociations: senders.buildForFrame(worktree) - }) - ) - /** The window's local receipt path, with its version, placeholder and frames-draw checks. */ - const applyFrame = (snapshot: RuntimeMobileSessionTabsResult, framesDraw = false) => { - count(snapshot.agentSenderAssociations) - applyStructuredSessionTabSnapshots([snapshot], undefined, { framesDraw: () => framesDraw }) - } - const deliverAll = () => - act(() => { - applyGraph(graphReply()) - applyFrame(frame('w1')) - applyFrame(frame('w2')) - }) - return { - open, - leaves, - get senders() { - return senders - }, - rowsSent: () => rowsSent, - graphReply, - applyGraph, - frame, - applyFrame, - deliverAll, - version: () => version, - reconnect: () => { - stream = createSessionTabsStreamDelta(undefined) - }, - replaceRuntime: () => { - senders = start() - } - } -} - -const located = (i: number) => - selectAgentSenderAssociation(useAppStore.getState(), 'local', sender(i))?.paneKey - -it.each([100, 1000])( - 'sends and reduces nothing for unchanged sender data, at %i live terminals', - (n) => { - const h = host(n) - useAppStore.getState().setAgentSenderPublication('runtime:other', { - associations: [{ identity: 'term_far', paneKey: 'far:pane', worktreeId: 'far' }], - principals: [], - attachments: [], - revision: { epoch: 'far', revision: 1 } - }) - let renders = 0 - let otherRenders = 0 - renderHook(() => { - renders++ - return useAgentMessageSenderView(sender(0), 'w1', { kind: 'local' }) - }) - renderHook(() => { - otherRenders++ - return useAgentMessageSenderView( - { - ...sender(0), - party: { ...sender(0).party, address: 'term_far', terminalHandle: 'term_far' } - }, - 'far', - { kind: 'environment', environmentId: 'other' } - ) - }) - // This window's own terminal tabs, split over two worktrees, feed the sender aliases. - const windowTabs = (bucket: string) => - Array.from({ length: n / 2 }, (_, i) => - makeTab({ id: `${bucket}-tab-${i}::${leafOf(i)}`, worktreeId: bucket }) - ) - useAppStore.setState({ tabsByWorktree: { w1: windowTabs('w1'), w2: windowTabs('w2') } }) - h.deliverAll() - expect(located(0)).toBe(`tab0:${leafOf(0)}`) - const settled = { - revision: h.senders.publisher.current().revision, - store: useAppStore.getState().agentSenderPublicationsByHost, - index: agentSenderIndexWorkForTest(), - aliases: agentSenderAliasWorkForTest(), - rows: h.rowsSent(), - renders, - otherRenders - } - // Status and title changes, and repeats, alternating both transports; and this window's - // unrelated writes, a switch between other workspaces and a settings write. - for (let k = 0; k < 5; k++) { - h.leaves[k].lastOutputAt = 100 + k - h.deliverAll() - act(() => - useAppStore.setState((state) => ({ - sidebarBody: k % 2 ? 'agents' : 'workspaces', - activeWorktreeId: `elsewhere-${k}`, - settings: state.settings ? { ...state.settings } : state.settings - })) - ) - } - expect({ - revision: h.senders.publisher.current().revision, - store: useAppStore.getState().agentSenderPublicationsByHost, - index: agentSenderIndexWorkForTest(), - aliases: agentSenderAliasWorkForTest(), - rows: h.rowsSent(), - renders, - otherRenders - }).toEqual(settled) - // A title-only change rescans that one bucket and rebuilds no index. - act(() => - useAppStore.setState((state) => ({ - tabsByWorktree: { - ...state.tabsByWorktree, - w1: state.tabsByWorktree.w1.map((tab, i) => (i ? tab : { ...tab, title: 'renamed' })) - } - })) - ) - act(() => h.applyGraph(h.graphReply())) - expect(agentSenderAliasWorkForTest()).toBe(settled.aliases + n / 2) - expect(agentSenderIndexWorkForTest()).toEqual(settled.index) - expect(renders).toBe(settled.renders) - - // One real change publishes once; its duplicate on the other transport changes nothing again. - h.open(n, 'w2') - act(() => h.applyGraph(h.graphReply())) - const published = useAppStore.getState().agentSenderPublicationsByHost - expect(h.senders.publisher.current().revision?.revision).toBe( - (settled.revision?.revision ?? 0) + 1 - ) - expect(located(n)).toBe(`tab${n}:${leafOf(n)}`) - act(() => { - h.applyFrame(h.frame('w2')) - h.applyFrame(h.frame('w1')) - }) - expect(useAppStore.getState().agentSenderPublicationsByHost).toBe(published) - expect(otherRenders).toBe(settled.otherRenders) - } -) - -it('keeps a newer worktree scope over a delayed whole-host reply, in either order', () => { - const h = host(4) - h.deliverAll() - // A whole-host reply with rows is cut, then delayed past a newer change to w1. - h.open(4, 'w1') - const delayed = h.graphReply() - expect(delayed.agentSenderAssociations?.associations).toHaveLength(5) - h.open(6, 'w1') - act(() => h.applyFrame(h.frame('w1'))) - act(() => h.applyGraph(delayed)) - expect(located(6)).toBe(`tab6:${leafOf(6)}`) - expect(located(4)).toBe(`tab4:${leafOf(4)}`) - expect(located(1)).toBe(`tab1:${leafOf(1)}`) - // Reverse: the whole-host reply first, then the same change's scope, which adds nothing. - h.open(5, 'w2') - act(() => h.applyGraph(h.graphReply())) - const applied = useAppStore.getState().agentSenderPublicationsByHost - act(() => h.applyFrame(h.frame('w2'))) - expect(useAppStore.getState().agentSenderPublicationsByHost).toBe(applied) - expect(located(5)).toBe(`tab5:${leafOf(5)}`) -}) - -it('sends complete sender data to a reconnected stream, a second window and a replaced runtime', () => { - const h = host(4) - h.deliverAll() - const before = h.rowsSent() - expect(h.frame('w1').agentSenderAssociations).toBeUndefined() - h.reconnect() - expect(h.frame('w1').agentSenderAssociations?.associations).toHaveLength(2) - // A window that applied nothing yet sends no base. - expect(h.senders.buildForGraph(undefined).agentSenderAssociations?.associations).toHaveLength(4) - h.replaceRuntime() - h.reconnect() - act(() => { - h.applyGraph(h.graphReply()) - h.applyFrame(h.frame('w1')) - }) - expect(h.rowsSent()).toBe(before + 4 + 2) - expect(useAppStore.getState().agentSenderPublicationsByHost.local['*'].revision?.epoch).toBe( - h.senders.publisher.epoch - ) - expect(located(3)).toBe(`tab3:${leafOf(3)}`) -}) - -it('applies a sender scope whose local frame the tab checks drop, and keeps it when later frames omit it', () => { - const h = host(2) - h.deliverAll() - // A host re-emit at the tab version the window already applied carries the new terminal. - h.open(2, 'w1') - act(() => h.applyFrame(h.frame('w1', h.version()))) - expect(located(2)).toBe(`tab2:${leafOf(2)}`) - expect(h.frame('w1').agentSenderAssociations).toBeUndefined() - // A workspace main's frames draw drops the tab patch; the sender scope still applies. - h.open(4, 'w1') - act(() => h.applyFrame(h.frame('w1'), true)) - expect(located(4)).toBe(`tab4:${leafOf(4)}`) -}) - -const PAIRED = 'paired' -const pairedLocated = (i: number) => - selectAgentSenderAssociation(useAppStore.getState(), `runtime:${PAIRED}`, sender(i))?.paneKey - -/** A paired host's frames through the window's real stream handler: runtime fence, receipt - * order, the retired-lineage and resume-census checks, then the tab version gate. */ -function pairedWindow() { - const coordinator = new VisibilityResumeCoordinator({ - environments: [], - environmentIdBySubscriptionSpec: [], - omissions: new Map(), - activeRuntimeWorktreeKey: () => null - }) - const receive = (event: unknown, runtimeId = 'rt-1', resume = false) => - act(() => - handleGlobalSessionEvent({ - environmentId: PAIRED, - expectedEnvironmentConnectionGeneration: 0, - expectedTrackingGeneration: 0, - visibilityGeneration: resume ? 1 : 0, - isCurrent: () => true, - event, - response: { id: 'stream', ok: true, result: event, _meta: { runtimeId } }, - awaitingVisibilityResumeInventory: { value: resume }, - coordinator - }) - ) - return { - frame: (snapshot: RuntimeMobileSessionTabsResult, runtimeId?: string) => - receive({ ...snapshot, type: 'updated' }, runtimeId), - census: (snapshots: RuntimeMobileSessionTabsResult[]) => - receive({ type: 'snapshots', snapshots }, 'rt-1', true) - } -} - -it('applies a paired host scope its tab gates drop: same-version re-emit, then later frames that omit it', () => { - const h = host(2) - const w = pairedWindow() - w.frame(h.frame('w1')) - expect(pairedLocated(0)).toBe(`tab0:${leafOf(0)}`) - h.open(2, 'w1') - const reemit = h.frame('w1', h.version()) - expect(reemit.agentSenderAssociations?.associations).toHaveLength(2) - w.frame(reemit) - const later = h.frame('w1') - expect(later.agentSenderAssociations).toBeUndefined() - w.frame(later) - expect(pairedLocated(2)).toBe(`tab2:${leafOf(2)}`) - // A resume census at unchanged versions skips its tab work, not its sender scopes. - h.reconnect() - h.open(4, 'w1') - w.census([h.frame('w1', h.version()), h.frame('w2', h.version())]) - expect(pairedLocated(4)).toBe(`tab4:${leafOf(4)}`) - expect(pairedLocated(1)).toBe(`tab1:${leafOf(1)}`) -}) - -it('never lets an older paired scope or a superseded runtime replace a newer one', () => { - const h = host(2) - const w = pairedWindow() - w.frame(h.frame('w1')) - // A one-shot list cut before the change arrives after the stream delivered it. - h.reconnect() - const delayed = h.frame('w1') - h.open(2, 'w1') - w.frame(h.frame('w1')) - const applied = useAppStore.getState().agentSenderPublicationsByHost - w.frame(delayed) - expect(useAppStore.getState().agentSenderPublicationsByHost).toBe(applied) - expect(pairedLocated(2)).toBe(`tab2:${leafOf(2)}`) - // The host restarts: the new runtime's scope replaces the old epoch, and the old runtime's - // straggler changes nothing. - const straggler = h.frame('w1') - h.replaceRuntime() - h.reconnect() - h.leaves.splice(2, 1) - w.frame(h.frame('w1'), 'rt-2') - expect(pairedLocated(2)).toBeUndefined() - const restarted = useAppStore.getState().agentSenderPublicationsByHost - w.frame({ ...straggler, agentSenderAssociations: delayed.agentSenderAssociations }, 'rt-1') - expect(useAppStore.getState().agentSenderPublicationsByHost).toBe(restarted) -}) From 3d13314d86dbeaec6ebeeece481e4dd94b5837e4 Mon Sep 17 00:00:00 2001 From: Jinjing <6427696+AmethystLiang@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:20:18 -0800 Subject: [PATCH 14/49] perf(orchestration): ask the pull-loop question in one statement without a temporary set (STA-15102) (#42122) The per-server check from #41834 used `state IN ('open', 'cancel_owed')`, which makes SQLite build a small temporary set on every call, and asked about home conversations in a separate statement. A server with one live link and no home conversation paid more per pull than the old global scan did. It is now one statement: a home-conversation seek, then one equality seek per live link state on the same covering index, stopping at the first row. Closed-link history still never enters the check. The answer, the read-error fallback and global discovery are unchanged. --- .../db/federation/peer-mail-store.ts | 13 --------- .../peer-mail/peer-mail-relay-environments.ts | 28 +++++++++---------- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/main/runtime/orchestration/db/federation/peer-mail-store.ts b/src/main/runtime/orchestration/db/federation/peer-mail-store.ts index 4fc7015d837..28948462d3b 100644 --- a/src/main/runtime/orchestration/db/federation/peer-mail-store.ts +++ b/src/main/runtime/orchestration/db/federation/peer-mail-store.ts @@ -75,17 +75,6 @@ export function listHomePeerMailEnvironments(this: OrchestrationDb): string[] { return rows.map((row) => row.environment_id) } -/** One server's check, for its pull loop: a seek on that server's home rows, not every server's. */ -export function hasHomePeerMailEnvironment(this: OrchestrationDb, environmentId: string): boolean { - return ( - this.db - .prepare( - `SELECT 1 FROM peer_mail_conversations WHERE role = 'home' AND environment_id = ? LIMIT 1` - ) - .get(environmentId) !== undefined - ) -} - /** Conversations a paired Orca opened here that hold replies it has not acknowledged yet. */ export function listPeerConversationIdsWithPendingReplies( this: OrchestrationDb, @@ -189,7 +178,6 @@ export type PeerMailStoreMethods = { openHomePeerMailConversation: typeof openHomePeerMailConversation getPeerMailConversation: typeof getPeerMailConversation listHomePeerMailEnvironments: typeof listHomePeerMailEnvironments - hasHomePeerMailEnvironment: typeof hasHomePeerMailEnvironment listPeerConversationIdsWithPendingReplies: typeof listPeerConversationIdsWithPendingReplies getPeerMailMessage: typeof getPeerMailMessage isPeerMailSenderLabel: typeof isPeerMailSenderLabel @@ -201,7 +189,6 @@ export function attachPeerMailStore(ctor: { prototype: object }): void { openHomePeerMailConversation, getPeerMailConversation, listHomePeerMailEnvironments, - hasHomePeerMailEnvironment, listPeerConversationIdsWithPendingReplies, getPeerMailMessage, isPeerMailSenderLabel, diff --git a/src/main/runtime/orchestration/federation/peer-mail/peer-mail-relay-environments.ts b/src/main/runtime/orchestration/federation/peer-mail/peer-mail-relay-environments.ts index d3cc5c2ea91..e83c38f56b9 100644 --- a/src/main/runtime/orchestration/federation/peer-mail/peer-mail-relay-environments.ts +++ b/src/main/runtime/orchestration/federation/peer-mail/peer-mail-relay-environments.ts @@ -6,24 +6,22 @@ export function peerMailRelayEnvironments(db: OrchestrationDb): Set { return new Set([...db.listHomePeerMailEnvironments(), ...listLiveRemoteRunLinkEnvironments(db)]) } -/** Whether a server's pull loop still has a reason to run; a store read error keeps it running. Runs - * every pull, so it asks about this one server only: closed links' history never enters it. */ +// Every pull asks about one server only, so closed links' history never enters it: an index seek +// for a home conversation, then one per live link state, stopping at the first row. One equality +// per state, because an IN list builds a temporary set on every call. +const RELAY_WANTS_SQL = ` +SELECT 1 FROM peer_mail_conversations WHERE role = 'home' AND environment_id = ?1 +UNION ALL +SELECT 1 FROM remote_run_links WHERE environment_id = ?1 AND state = 'open' +UNION ALL +SELECT 1 FROM remote_run_links WHERE environment_id = ?1 AND state = 'cancel_owed' +LIMIT 1` + +/** Whether a server's pull loop still has a reason to run; a store read error keeps it running. */ export function peerMailRelayWants(db: OrchestrationDb, environmentId: string): boolean { try { - return db.hasHomePeerMailEnvironment(environmentId) || hasLiveRemoteRunLink(db, environmentId) + return db.db.prepare(RELAY_WANTS_SQL).get(environmentId) !== undefined } catch { return true } } - -/** A seek on this server's own (environment_id, state) index rows, however many closed links it keeps. */ -function hasLiveRemoteRunLink(db: OrchestrationDb, environmentId: string): boolean { - return ( - db.db - .prepare( - `SELECT 1 FROM remote_run_links - WHERE environment_id = ? AND state IN ('open', 'cancel_owed') LIMIT 1` - ) - .get(environmentId) !== undefined - ) -} From dd9f8e3994b8a953c22202b319966ebccc337ddf Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 13:28:36 -0800 Subject: [PATCH 15/49] test: remove low-value relay coverage and stale fixtures (#42139) * test: remove redundant rehome cases and backend replays * test: remove redundant credential and diagnostic coverage --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../src/admin-route-transient-app.test.ts | 17 --- .../dead-cell-evacuation-precheck.test.ts | 51 +------ .../drain-return-admission.test.ts | 21 --- .../public-assignment-reconnect-lane.test.ts | 51 ------- ...dle-regional-rehome-reconciliation.test.ts | 17 --- .../idle-regional-rehome-store.test.ts | 10 -- .../idle-regional-rehome-window.test.ts | 19 --- .../region-correction-restart.test.ts | 20 --- .../region-correction-store.test.ts | 47 ------ .../regional-rehome-store.test.ts | 76 ---------- .../assignment/relay-region-placement.test.ts | 26 ---- .../reserve-ledger-writer.test.ts | 14 -- ...ontrol-reservation-reconnect-claim.test.ts | 49 +----- .../released-reservation-prune.test.ts | 13 +- .../credential-store-cleanup.test.ts | 51 ------- .../resume-confirmed-audit-buffer.test.ts | 52 ------- ...postgres-lock-wait-sample-postgres.test.ts | 79 ---------- .../postgres-statement-stats-postgres.test.ts | 23 --- .../postgres-transaction-recovery.test.ts | 139 +----------------- 19 files changed, 15 insertions(+), 760 deletions(-) delete mode 100644 cloud/apps/relay/src/credentials/resume-confirmed-audit-buffer.test.ts delete mode 100644 cloud/apps/relay/src/database/postgres-lock-wait-sample-postgres.test.ts diff --git a/cloud/apps/relay/src/admin-route-transient-app.test.ts b/cloud/apps/relay/src/admin-route-transient-app.test.ts index 1145d5964fb..70e5e981fe5 100644 --- a/cloud/apps/relay/src/admin-route-transient-app.test.ts +++ b/cloud/apps/relay/src/admin-route-transient-app.test.ts @@ -53,23 +53,6 @@ describe('admin routes under a database that is briefly out of reach', () => { expect(response.headers.get('Retry-After')).toBe('7') expect(await response.json()).toEqual({ error: 'database_temporarily_unavailable' }) }) - - it('answers admission-selector/status with a retryable 503 instead of a conflict', async () => { - const inspectCellAdmissionSelector = vi.fn(async () => { - throw poolTimeout() - }) - const app = appWith({ inspectCellAdmissionSelector }) - - const response = await app.request( - '/v1/admin/admission-selector/status', - adminRequest({ v: 1, attemptId: '22222222-2222-4222-8222-222222222222' }) - ) - - expect(response.status).toBe(503) - expect(response.headers.get('Retry-After')).toBe('5') - expect(await response.json()).toEqual({ error: 'database_temporarily_unavailable' }) - }) - }) function config(overrides: Partial = {}): RelayConfig { diff --git a/cloud/apps/relay/src/assignment/migrations/dead-cell-evacuation-precheck.test.ts b/cloud/apps/relay/src/assignment/migrations/dead-cell-evacuation-precheck.test.ts index 4a1a2aff115..da21d0579ff 100644 --- a/cloud/apps/relay/src/assignment/migrations/dead-cell-evacuation-precheck.test.ts +++ b/cloud/apps/relay/src/assignment/migrations/dead-cell-evacuation-precheck.test.ts @@ -1,53 +1,14 @@ -import pg from 'pg' -import { afterAll, afterEach, describe, expect, it } from 'vitest' +import { afterEach, describe, expect, it } from 'vitest' import { RelayAssignmentStore } from '../assignment-store.js' import type { RelayCellConfig } from '../../config.js' -import { - openInMemoryRelayDatabase, - openRelayDatabase, - type RelayDatabase -} from '../../database/database.js' +import { openInMemoryRelayDatabase, type RelayDatabase } from '../../database/database.js' -const databaseUrl = process.env.ORCA_RELAY_TEST_POSTGRES_URL -const schema = 'relay_dead_cell_precheck_test' const CELLS: RelayCellConfig[] = [ { id: 'cell-a', url: 'https://relay-a.example.com', capacityRequests: 10 }, { id: 'cell-b', url: 'https://relay-b.example.com', capacityRequests: 10 } ] -function scopedUrl(): string { - const url = new URL(databaseUrl!) - url.searchParams.set('options', `-c search_path=${schema}`) - return url.toString() -} - -async function onAdmin(sql: string): Promise { - const client = new pg.Client({ connectionString: databaseUrl }) - await client.connect() - try { - await client.query(sql) - } finally { - await client.end() - } -} - -const dialects: [string, () => Promise][] = [ - ['sqlite', openInMemoryRelayDatabase], - ...(databaseUrl - ? [ - [ - 'postgres', - async () => { - await onAdmin(`DROP SCHEMA IF EXISTS ${schema} CASCADE`) - await onAdmin(`CREATE SCHEMA ${schema}`) - return await openRelayDatabase({ databaseUrl: scopedUrl(), dataDir: '' }) - } - ] as [string, () => Promise] - ] - : []) -] - -describe.each(dialects)('dead-cell evacuation pre-check (%s)', (_dialect, open) => { +describe('dead-cell evacuation pre-check', () => { let database: RelayDatabase | undefined afterEach(async () => { @@ -55,12 +16,8 @@ describe.each(dialects)('dead-cell evacuation pre-check (%s)', (_dialect, open) database = undefined }) - afterAll(async () => { - if (databaseUrl) await onAdmin(`DROP SCHEMA IF EXISTS ${schema} CASCADE`) - }) - async function setup(now: () => number) { - database = await open() + database = await openInMemoryRelayDatabase() const store = new RelayAssignmentStore(database, now, { requireLiveCells: true, heartbeatTtlMs: 45_000 diff --git a/cloud/apps/relay/src/assignment/public-admission/drain-return-admission.test.ts b/cloud/apps/relay/src/assignment/public-admission/drain-return-admission.test.ts index 011e5c99313..22bf3a13267 100644 --- a/cloud/apps/relay/src/assignment/public-admission/drain-return-admission.test.ts +++ b/cloud/apps/relay/src/assignment/public-admission/drain-return-admission.test.ts @@ -39,31 +39,10 @@ function admitted(result: DrainReturnGrant | DrainReturnDeferral): DrainReturnGr return result } -function deferred(result: DrainReturnGrant | DrainReturnDeferral): DrainReturnDeferral { - if (result.kind !== 'deferred') throw new Error('expected a deferral') - return result -} - const host = (index: number): string => `host${String(index).padStart(12, '0')}` describe('drain-return admission', () => { - it('answers a host’s own early retry with its interval, not a place behind the cohort', async () => { - const { lane } = harness() - admitted(await lane.acquire(host(0))).lease.release() - - // A row-busy refusal says "retry in 1 s"; that redial is the host's own. - const repeat = deferred(await lane.acquire(host(0))) - expect(repeat).toMatchObject({ - reason: 'host-rate-limited', - retryAfterSeconds: 2 - }) - - // And it booked nothing: the next overflow still gets the first slot. - admitted(await lane.acquire(host(1))) - expect(deferred(await lane.acquire(host(2))).retryAfterSeconds).toBe(2) - }) - it('lets a queued placement go before a queued drain return', async () => { const { lane, placement } = harness({ maxQueued: 1 }) const drain = admitted(await lane.acquire(host(0))) diff --git a/cloud/apps/relay/src/assignment/public-admission/public-assignment-reconnect-lane.test.ts b/cloud/apps/relay/src/assignment/public-admission/public-assignment-reconnect-lane.test.ts index 1a2b795252a..87176b7e53c 100644 --- a/cloud/apps/relay/src/assignment/public-admission/public-assignment-reconnect-lane.test.ts +++ b/cloud/apps/relay/src/assignment/public-admission/public-assignment-reconnect-lane.test.ts @@ -64,25 +64,6 @@ describe('public assignment reconnect lane', () => { expect((await second).status).toBe(200) }) - it('rejects on the fast lane when the verification probe fails transiently', async () => { - const host = 'tttttttttttttttt' - const assign = vi.fn() - const resolve = vi.fn(async () => { - throw Object.assign(new Error('deadlock detected'), { code: '40P01' }) - }) - const app = createRelayApp(config(), { - store: {} as never, - assignments: { assign, resolve } as never, - drain: vi.fn(), - ready: vi.fn(async () => true) - }) - - const response = await app.request('/v1/assign', assignmentRequest(host, { reconnect: true })) - - expect(response.status).toBe(503) - expect(response.headers.get('retry-after')).toBe('2') - }) - it('refuses a dial whose assignment row is busy at once, and frees the fast lane', async () => { const busy = 'bbbbbbbbbbbbbbbb' const next = 'nnnnnnnnnnnnnnnn' @@ -113,38 +94,6 @@ describe('public assignment reconnect lane', () => { warn.mockRestore() }) - it('asks a busy resume to retry in a second', async () => { - const host = 'rrrrrrrrrrrrrrrr' - const app = createRelayApp(config(), { - store: { - resolveResume: vi.fn(async () => ({ userId: 'user-1', relayDeviceId: 'device-1' })) - } as never, - assignments: { - assign: vi.fn(async () => { - throw new RelayAssignmentRowBusyError() - }), - resolve: vi.fn(async () => null) - } as never, - drain: vi.fn(), - ready: vi.fn(async () => true) - }) - const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) - - const response = await app.request('/v1/resolve', { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ - v: 1, - relayHostId: host, - resumeToken: Buffer.alloc(32, 1).toString('base64url') - }) - }) - - expect(response.status).toBe(503) - expect(response.headers.get('retry-after')).toBe('1') - expect(await response.json()).toEqual({ error: 'relay_assignment_row_busy' }) - warn.mockRestore() - }) }) function assignmentRequest(relayHostId: string, extra: { reconnect?: boolean } = {}): RequestInit { diff --git a/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-reconciliation.test.ts b/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-reconciliation.test.ts index b38b0924c44..e66de86e5d7 100644 --- a/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-reconciliation.test.ts +++ b/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-reconciliation.test.ts @@ -39,23 +39,6 @@ async function setup() { } describe('idle cutover durable reconciliation', () => { - it('only permits reopening when the exact source still owns the assignment', async () => { - const { store } = await setup() - expect(await store.reconcileIdleRegionalRehome(request)).toBe('not-committed') - await store.activateControl(request, { - cellId: request.sourceCellId, - assignmentEpoch: request.sourceAssignmentEpoch, - generation: request.sourceGeneration + 1, - cellIncarnation: request.sourceCellIncarnation - }) - expect(await store.reconcileIdleRegionalRehome(request)).toBe('stale') - }) - - it('does not reopen an obsolete source after an assignment change', async () => { - const { store } = await setup() - await store.startEvacuation(request, request.targetCellId) - expect(await store.reconcileIdleRegionalRehome(request)).toBe('stale') - }) it('waits for an outstanding assignment transaction before deciding authority', async () => { const { database, store } = await setup() diff --git a/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-store.test.ts b/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-store.test.ts index 18a95333bbb..2f97cdc67b2 100644 --- a/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-store.test.ts +++ b/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-store.test.ts @@ -111,15 +111,6 @@ async function setup() { } describe('constrained idle regional assignment transaction', () => { - it('sees durable control changes between candidate polls', async () => { - const { store, database, safety } = await setup() - await database.query("UPDATE relay_region_rehome_control SET enabled = 0 WHERE control_id = 'global'") - expect(await store.selectIdleRegionalRehomeCandidates(safety)).toEqual([]) - await database.query("UPDATE relay_region_rehome_control SET enabled = 1 WHERE control_id = 'global'") - expect(await store.selectIdleRegionalRehomeCandidates(safety)).toHaveLength(1) - await database.query("UPDATE relay_region_rehome_control SET enabled = 0 WHERE control_id = 'global'") - expect(await store.selectIdleRegionalRehomeCandidates(safety)).toEqual([]) - }) it.each([10, 11])('reserves source activity plus assignment at target capacity %i', async (capacity) => { const { store, database, safety, request } = await setup() @@ -321,7 +312,6 @@ describe('constrained idle regional assignment transaction', () => { }) expect(await database.query('SELECT * FROM relay_region_rehome_attempts')).toEqual([]) }) - }) function holdStatement(database: RelayDatabase, fragment: string) { diff --git a/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-window.test.ts b/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-window.test.ts index 6c4c559f06f..bf2df745a3d 100644 --- a/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-window.test.ts +++ b/cloud/apps/relay/src/assignment/regional-rehome/idle-regional-rehome-window.test.ts @@ -220,23 +220,4 @@ describe('idle regional rehome candidate window', () => { expect(seen.size).toBe(363) expect(wrapped).toBe(true) }) - - it('excludes a host inside its rehome cooldown and takes it back after', async () => { - const { store, database, safety, now } = await setup() - await seedHost(store, identity) - await database.query( - `INSERT INTO relay_region_rehome_attempts - (attempt_id, user_id, relay_host_id, preferred_region, source_cell_id, source_cell_incarnation, - target_cell_id, target_cell_incarnation, previous_epoch, assignment_epoch, drain_grace_ms, - send_attempts, created_at, updated_at) - VALUES ('cooled', ?, ?, 'asia-east2', 'us', ?, 'asia-idle', ?, 0, 9, 0, 0, ?, ?)`, - [identity.userId, identity.relayHostId, incarnations[0], incarnations[2], now - 1_000, now] - ) - expect(await store.selectIdleRegionalRehomeCandidates(safety)).toEqual([]) - await database.query('UPDATE relay_region_rehome_attempts SET created_at = ?', [ - now - 604_800_000 - 1 - ]) - expect(await store.selectIdleRegionalRehomeCandidates(safety)).toHaveLength(3) - }) - }) diff --git a/cloud/apps/relay/src/assignment/regional-rehome/region-correction-restart.test.ts b/cloud/apps/relay/src/assignment/regional-rehome/region-correction-restart.test.ts index beb6a3c58d1..396db5fb319 100644 --- a/cloud/apps/relay/src/assignment/regional-rehome/region-correction-restart.test.ts +++ b/cloud/apps/relay/src/assignment/regional-rehome/region-correction-restart.test.ts @@ -85,15 +85,6 @@ describe('persisted region decisions across director restart', () => { .toMatchObject({ reportStatus: 'stale' }) }) - it('uses server expiry after a restart regardless of an old client report', async () => { - const context = await setup() - context.setNow(context.window.expiresAt) - const restarted = await context.restart() - expect(await restarted.store.exchangeRegionCorrection(identity, context.report, context.window.assignmentEpoch)) - .toMatchObject({ reportStatus: 'expired' }) - expect(await restarted.store.previewRegionCorrection()).toEqual({ expired: 1 }) - }) - it('does not interpret a persisted future-policy window using the old policy after rollback', async () => { const context = await setup() await context.database.query('UPDATE relay_region_decisions SET policy_version = 2') @@ -105,15 +96,4 @@ describe('persisted region decisions across director restart', () => { expect(row.preferred_region).toBeNull() expect(row.report_json).toBeNull() }) - - it('keeps generation ordering when the server clock moves backwards across restart', async () => { - const context = await setup() - context.setNow(1_000_000_000 - 60_000) - const restarted = await context.restart() - const successor = (await context.issue(restarted.store)).window! - expect(successor.generation).toBe(2) - expect(successor.expiresAt).toBe(context.window.expiresAt - 60_000) - expect(await restarted.store.exchangeRegionCorrection(identity, context.report, context.window.assignmentEpoch)) - .toMatchObject({ reportStatus: 'stale' }) - }) }) diff --git a/cloud/apps/relay/src/assignment/regional-rehome/region-correction-store.test.ts b/cloud/apps/relay/src/assignment/regional-rehome/region-correction-store.test.ts index 384945db575..e9220bd8ee5 100644 --- a/cloud/apps/relay/src/assignment/regional-rehome/region-correction-store.test.ts +++ b/cloud/apps/relay/src/assignment/regional-rehome/region-correction-store.test.ts @@ -147,53 +147,6 @@ describe('ordered region decisions and migration outcomes', () => { ).toMatchObject({ reportStatus: 'stale' }) }) - it('compares with assigned region, preserves hints, and never extends a window on report', async () => { - const context = await setup() - await context.store.assign(identity, 'asia-east2') - const issued = await window(context) - expect(issued.incumbentRegion).toBe('us-central1') - context.advance(50) - await context.store.exchangeRegionCorrection( - identity, - { - v: 1, - action: 'report', - generation: issued.generation, - assignmentEpoch: issued.assignmentEpoch, - policyVersion: 1, - outcome: 'conclusive', - measurements: { 'us-central1': 110, 'asia-east2': 90 } - }, - issued.assignmentEpoch - ) - expect(await context.store.previewRegionCorrection()).toEqual({ ineligible: 1 }) - const row = (await context.database.query(`SELECT * FROM relay_region_decisions`))[0]! - expect(Number(row.expires_at)).toBe(issued.expiresAt) - const hint = ( - await context.database.query( - `SELECT preferred_region FROM relay_assignment_region_preferences WHERE user_id = ?`, - [identity.userId] - ) - )[0] - expect(hint?.preferred_region).toBe('asia-east2') - context.advance(24 * 60 * 60_000) - expect( - await context.store.exchangeRegionCorrection( - identity, - { - v: 1, - action: 'report', - generation: issued.generation, - assignmentEpoch: issued.assignmentEpoch, - policyVersion: 1, - outcome: 'inconclusive', - reason: 'late' - }, - issued.assignmentEpoch - ) - ).toMatchObject({ reportStatus: 'expired' }) - }) - it('rejects stale assignment basis and requires both thresholds', async () => { const context = await setup() for (const measurements of [ diff --git a/cloud/apps/relay/src/assignment/regional-rehome/regional-rehome-store.test.ts b/cloud/apps/relay/src/assignment/regional-rehome/regional-rehome-store.test.ts index dd0c445ed15..c7e128a36bb 100644 --- a/cloud/apps/relay/src/assignment/regional-rehome/regional-rehome-store.test.ts +++ b/cloud/apps/relay/src/assignment/regional-rehome/regional-rehome-store.test.ts @@ -30,68 +30,6 @@ const targetIncarnation = '22222222-2222-4222-8222-222222222222' describe('regional rehome assignment state', () => { - it('moves one live preferred host and completes without disabling its source cell', async () => { - const context = await setup() - const identity = { userId: 'user-1', relayHostId: 'abcdefghijklmnop' } - const neighbor = { userId: 'user-2', relayHostId: 'ponmlkjihgfedcba' } - const sourceControl = await activatePreferredSource(context, identity) - await activateSource(context, neighbor) - - const attempt = await context.store.tryIdleRehome() - expect(attempt).toMatchObject({ - userId: identity.userId, - relayHostId: identity.relayHostId, - sourceCellId: source.id, - sourceCellIncarnation: sourceIncarnation, - targetCellId: target.id, - targetCellIncarnation: targetIncarnation, - previousEpoch: 1, - assignmentEpoch: 2, - sendAttempts: 1 - }) - expect(await context.store.resolve(neighbor)).toMatchObject({ cellId: source.id }) - expect(await context.store.completeReadyRegionalRehomes()).toBe(0) - expect( - await context.database.query( - 'SELECT drain_outcome FROM relay_region_rehome_attempts WHERE attempt_id = ?', - [attempt!.attemptId] - ) - ).toEqual([{ drain_outcome: 'accepted' }]) - - const targetControl = await context.store.activateControl(identity, { - cellId: target.id, - assignmentEpoch: 2, - generation: 1 - }) - await context.store.markMigrationTargetRegistered(identity, { - cellId: target.id, - assignmentEpoch: 2 - }) - expect(await context.store.completeReadyRegionalRehomes()).toBe(0) - await context.store.releaseActivity(identity, sourceControl) - expect(await context.store.completeReadyRegionalRehomes()).toBe(1) - - expect(await context.store.resolve(identity)).toMatchObject({ - cellId: target.id, - assignmentEpoch: 2 - }) - expect(await context.store.resolve(neighbor)).toMatchObject({ cellId: source.id }) - expect( - await context.database.query( - `SELECT completed_at, aborted_at FROM relay_assignment_migrations - WHERE user_id = ? AND relay_host_id = ?`, - [identity.userId, identity.relayHostId] - ) - ).toEqual([{ completed_at: context.now(), aborted_at: null }]) - expect( - await context.database.query( - `SELECT drain_receipt_at, completed_at, aborted_at FROM relay_region_rehome_attempts` - ) - ).toEqual([{ drain_receipt_at: context.now(), completed_at: context.now(), aborted_at: null }]) - expect(targetControl).toMatch(/^control:/) - await context.database.close() - }) - it('completes healthy candidates past a poisoned attempt and logs it', async () => { const context = await setup() const poisoned = { userId: 'user-1', relayHostId: 'abcdefghijklmnop' } @@ -146,8 +84,6 @@ describe('regional rehome assignment state', () => { ).toEqual([{ completed_at: context.now() }]) await context.database.close() }) - - }) type Context = Awaited> @@ -251,18 +187,6 @@ async function activatePreferredSource( return control } -async function activateSource( - context: Context, - identity: { userId: string; relayHostId: string } -): Promise { - const assignment = await context.store.assign(identity, undefined, 'us-central1') - return await context.store.activateControl(identity, { - cellId: source.id, - assignmentEpoch: assignment.assignmentEpoch, - generation: 1 - }) -} - async function heartbeat( store: IdleRehomeTestStore, cell: typeof source | typeof target, diff --git a/cloud/apps/relay/src/assignment/relay-region-placement.test.ts b/cloud/apps/relay/src/assignment/relay-region-placement.test.ts index 25873f15666..dec09f344fa 100644 --- a/cloud/apps/relay/src/assignment/relay-region-placement.test.ts +++ b/cloud/apps/relay/src/assignment/relay-region-placement.test.ts @@ -45,16 +45,6 @@ describe('Relay regional placement', () => { afterEach(async () => await database.close()) - it('falls back globally only when the target region has no safe general cell', async () => { - await store.configureCell(CELLS[1]!, 'migration-only') - await store.configureCell(CELLS[2]!, 'migration-only') - await store.configureCell(CELLS[3]!, 'migration-only') - - await expect( - store.assign({ userId: 'fallback-user', relayHostId: 'fallbackhost0001' }, 'asia-east2') - ).resolves.toMatchObject({ cellId: 'us-c1', region: 'us-central1' }) - }) - it('preserves sticky assignments while updating only explicit preferences', async () => { const identity = { userId: 'sticky-user', relayHostId: 'stickyhost000001' } await expect(store.assign(identity)).resolves.toMatchObject({ cellId: 'us-c1' }) @@ -219,20 +209,4 @@ describe('Relay regional placement', () => { }) }) - it('expires identity-linked region preferences after 30 days', async () => { - const identity = { userId: 'expiry-user', relayHostId: 'expiryhost000001' } - await store.assign(identity, 'asia-east2') - now += 30 * 24 * 60 * 60_000 - await expect(store.releaseExpiredRegionPreferences()).resolves.toBe(0) - now += 1 - - await expect(store.releaseExpiredRegionPreferences()).resolves.toBe(1) - await expect( - database.query( - `SELECT preferred_region FROM relay_assignment_region_preferences - WHERE user_id = ? AND relay_host_id = ?`, - [identity.userId, identity.relayHostId] - ) - ).resolves.toEqual([]) - }) }) diff --git a/cloud/apps/relay/src/assignment/reserve-placement/reserve-ledger-writer.test.ts b/cloud/apps/relay/src/assignment/reserve-placement/reserve-ledger-writer.test.ts index 66a5e7b15fc..297cc74c640 100644 --- a/cloud/apps/relay/src/assignment/reserve-placement/reserve-ledger-writer.test.ts +++ b/cloud/apps/relay/src/assignment/reserve-placement/reserve-ledger-writer.test.ts @@ -26,20 +26,6 @@ describe('reserve ledger writer', () => { ) )[0] - it('writes a booked join, and only a higher epoch replaces it', async () => { - const { database: db, writer } = await setup() - writer.enqueue({ ...HOST, cellId: 'c1', epoch: 5 }) - await writer.flush() - expect(await row(db)).toMatchObject({ cell_id: 'c1', assignment_epoch: 5 }) - writer.enqueue({ ...HOST, cellId: 'c2', epoch: 4 }) - writer.enqueue({ ...HOST, cellId: 'c3', epoch: 5 }) - await writer.flush() - expect(await row(db)).toMatchObject({ cell_id: 'c1', assignment_epoch: 5 }) - writer.enqueue({ ...HOST, cellId: 'c2', epoch: 6 }) - await writer.flush() - expect(await row(db)).toMatchObject({ cell_id: 'c2', assignment_epoch: 6 }) - }) - it('drops a moved row’s counters but keeps a same-cell row’s', async () => { const { database: db, writer } = await setup() await db.query( diff --git a/cloud/apps/relay/src/control-leases/control-reservation-reconnect-claim.test.ts b/cloud/apps/relay/src/control-leases/control-reservation-reconnect-claim.test.ts index abc4cb147c4..b7db80d670f 100644 --- a/cloud/apps/relay/src/control-leases/control-reservation-reconnect-claim.test.ts +++ b/cloud/apps/relay/src/control-leases/control-reservation-reconnect-claim.test.ts @@ -1,11 +1,7 @@ import { afterEach, describe, expect, it } from 'vitest' import { RelayAssignmentStore } from '../assignment/assignment-store.js' import type { RelayCellConfig } from '../config.js' -import { - openInMemoryRelayDatabase, - openRelayDatabase, - type RelayDatabase -} from '../database/database.js' +import { openInMemoryRelayDatabase, type RelayDatabase } from '../database/database.js' const KEY_PREFIX = 'reconnect-claim' const USER_ID = `${KEY_PREFIX}-user-1` @@ -21,54 +17,19 @@ const CELL_INCARNATION = '11111111-1111-4111-8111-111111111111' const IDENTITY = { userId: USER_ID, relayHostId: RELAY_HOST_ID } const CONTROL_ACTIVITY_ID = `control:${CELL.id}:1` -const databaseUrl = process.env.ORCA_RELAY_TEST_POSTGRES_URL -const backends: { name: string; open: () => Promise }[] = [ - { name: 'sqlite', open: openInMemoryRelayDatabase }, - ...(databaseUrl - ? [ - { - name: 'postgres', - open: () => openRelayDatabase({ databaseUrl, dataDir: '' }) - } - ] - : []) -] - const databases: RelayDatabase[] = [] -async function removeScopedRows(database: RelayDatabase): Promise { - await database.query( - `DELETE FROM relay_control_connection_reservations WHERE user_id LIKE '${KEY_PREFIX}-%'` - ) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id LIKE '${KEY_PREFIX}-%'` - ) - await database.query(`DELETE FROM relay_assignments WHERE user_id LIKE '${KEY_PREFIX}-%'`) - for (const table of [ - 'relay_cell_connection_snapshots', - 'relay_cell_connection_runtime', - 'relay_cell_connection_limits', - 'relay_cell_runtime', - 'relay_cells' - ]) { - await database.query(`DELETE FROM ${table} WHERE cell_id = ?`, [CELL.id]) - } -} - afterEach(async () => { for (const database of databases.splice(0)) { - await removeScopedRows(database) await database.close() } }) async function setup( - open: () => Promise, now: () => number ): Promise<{ database: RelayDatabase; store: RelayAssignmentStore }> { - const database = await open() + const database = await openInMemoryRelayDatabase() databases.push(database) - await removeScopedRows(database) const store = new RelayAssignmentStore(database, now, { requireLiveCells: true, heartbeatTtlMs: 45_000 @@ -113,10 +74,10 @@ async function reservations( })) } -describe.each(backends)('control reservation claim on reconnect ($name)', ({ open }) => { +describe('control reservation claim on reconnect', () => { it('claims the fresh reservation when the same generation reconnects', async () => { let now = 100_000_000 - const { database, store } = await setup(open, () => now) + const { database, store } = await setup(() => now) const assignment = await store.assign(IDENTITY) await store.activateControl(IDENTITY, { @@ -158,7 +119,7 @@ describe.each(backends)('control reservation claim on reconnect ($name)', ({ ope it('still refuses to claim a second reservation while the first is outstanding', async () => { let now = 100_000_000 - const { database, store } = await setup(open, () => now) + const { database, store } = await setup(() => now) const assignment = await store.assign(IDENTITY) await store.activateControl(IDENTITY, { diff --git a/cloud/apps/relay/src/control-leases/released-reservation-prune.test.ts b/cloud/apps/relay/src/control-leases/released-reservation-prune.test.ts index 3a8b2a768d0..4d65b1dac7b 100644 --- a/cloud/apps/relay/src/control-leases/released-reservation-prune.test.ts +++ b/cloud/apps/relay/src/control-leases/released-reservation-prune.test.ts @@ -63,12 +63,7 @@ async function remainingIds(database: RelayDatabase): Promise { return rows.map((row) => String(row.reservation_id)) } -const dialects: [string, () => Promise][] = [ - ['sqlite', openInMemoryRelayDatabase], - ...(databaseUrl ? [['postgres', openPostgres] as [string, () => Promise]] : []) -] - -describe.each(dialects)('released reservation prune (%s)', (_dialect, open) => { +describe('released reservation prune', () => { let database: RelayDatabase | undefined afterEach(async () => { @@ -76,12 +71,8 @@ describe.each(dialects)('released reservation prune (%s)', (_dialect, open) => { database = undefined }) - afterAll(async () => { - if (databaseUrl) await onAdmin(`DROP SCHEMA IF EXISTS ${schema} CASCADE`) - }) - it('deletes only released rows older than the retention window', async () => { - database = await open() + database = await openInMemoryRelayDatabase() await insertReservation(database, 'a-old-released', 'released', STALE - 1) await insertReservation(database, 'b-edge-released', 'released', STALE) await insertReservation(database, 'c-fresh-released', 'released', STALE + 1) diff --git a/cloud/apps/relay/src/credentials/credential-store-cleanup.test.ts b/cloud/apps/relay/src/credentials/credential-store-cleanup.test.ts index ffab5abc2de..6758eb18359 100644 --- a/cloud/apps/relay/src/credentials/credential-store-cleanup.test.ts +++ b/cloud/apps/relay/src/credentials/credential-store-cleanup.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from 'vitest' import { AUDIT_EVENT_RETENTION_MS, - hashCredential, CONFIRM_RESULT_RETENTION_MS, RelayCredentialStore, type RelayIdentity @@ -292,54 +291,4 @@ describe('credential cleanup invite reaper', () => { expect(await remainingIds(database, 'relay_audit_events', 'id')).toEqual(['audit-recent']) await database.close() }) - - it('still replays a confirm result inside retention', async () => { - const database = await openInMemoryRelayDatabase() - let now = NOW - DAY_MS - const store = new RelayCredentialStore(database, () => now) - try { - const invite = await store.createInvite(identity, 'device-1') - const reservation = await store.reserveCredential(identity.relayHostId, invite.inviteToken) - if (!reservation) { - throw new Error('invite did not reserve') - } - await store.recordConnectionBasis({ - ...reservation, - basisConnId: 'invite-basis', - owningControlGeneration: 1, - deadline: reservation.leaseExpiresAt - }) - await store.installCredential({ - ...identity, - relayDeviceId: 'device-1', - reqId: 'install-1', - newResumeTokenHash: hashCredential('resume-token'), - owningControlGeneration: 1, - authorization: { mode: 'relay-basis', basisConnId: 'invite-basis' } - }) - const resume = await store.reserveCredential(identity.relayHostId, 'resume-token') - if (!resume) { - throw new Error('resume did not reserve') - } - await store.recordConnectionBasis({ - ...resume, - basisConnId: 'resume-basis', - owningControlGeneration: 1, - deadline: resume.leaseExpiresAt - }) - const request = { - ...identity, - reqId: 'confirm-1', - basisConnId: 'resume-basis', - owningControlGeneration: 1 - } - const confirmed = await store.confirmResume(request) - expect(confirmed).toMatchObject({ renewed: true, acceptedAs: 'current' }) - now = NOW - await store.cleanup() - expect(await store.confirmResume(request)).toEqual(confirmed) - } finally { - await database.close() - } - }) }) diff --git a/cloud/apps/relay/src/credentials/resume-confirmed-audit-buffer.test.ts b/cloud/apps/relay/src/credentials/resume-confirmed-audit-buffer.test.ts deleted file mode 100644 index eb94d957544..00000000000 --- a/cloud/apps/relay/src/credentials/resume-confirmed-audit-buffer.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { afterEach, describe, expect, it } from 'vitest' -import { openInMemoryRelayDatabase, type RelayDatabase, type SqlRow } from '../database/database.js' -import { ResumeConfirmedAuditBuffer } from './resume-confirmed-audit-buffer.js' - -const event = (reqId: string) => ({ - userId: 'user-1', - relayHostId: 'host000000000001', - relayDeviceId: 'device-1', - detail: { reqId, basisConnId: `basis-${reqId}`, renewed: true } -}) - -describe('the batched resume-confirmed audit', () => { - let inner: RelayDatabase | undefined - - afterEach(async () => { - await inner?.close() - inner = undefined - }) - - async function setup() { - inner = await openInMemoryRelayDatabase() - const database = inner - const buffer = new ResumeConfirmedAuditBuffer(database, Date.now, () => undefined) - const rows = async (): Promise => - await inner!.query( - `SELECT type, relay_device_id, detail_json FROM relay_audit_events ORDER BY at, id` - ) - return { database, buffer, rows } - } - - it('retries a flush whose commit outcome was lost without writing any row twice', async () => { - const { database, buffer, rows } = await setup() - buffer.add(event('a')) - buffer.add(event('b')) - // The insert commits, then the reply is lost. - const query = database.query.bind(database) - let lost = true - database.query = async (sql, params) => { - const result = await query(sql, params) - if (lost) { - lost = false - throw new Error('Connection terminated unexpectedly') - } - return result - } - await buffer.flush() - await buffer.flush() - expect(await rows()).toHaveLength(2) - buffer.stop() - }) - -}) diff --git a/cloud/apps/relay/src/database/postgres-lock-wait-sample-postgres.test.ts b/cloud/apps/relay/src/database/postgres-lock-wait-sample-postgres.test.ts deleted file mode 100644 index 6873b486738..00000000000 --- a/cloud/apps/relay/src/database/postgres-lock-wait-sample-postgres.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { RelayAssignmentStore } from '../assignment/assignment-store.js' -import { openRelayDatabase, type RelayDatabase } from './database.js' -import { readPostgresLockWaitSample } from './postgres-lock-wait-sample.js' - -const databaseUrl = process.env.ORCA_RELAY_TEST_POSTGRES_URL -const describePostgres = databaseUrl ? describe : describe.skip - -const cell = { - id: 'lock-wait-sample-cell', - url: 'https://lock-wait-sample.example.com', - capacityRequests: 10 -} - -// The split rests on application_name surviving into pg_stat_activity for both -// the waiter and its blocker, which only a real server shows. -describePostgres('PostgreSQL lock-wait sample', () => { - let cellDatabase: RelayDatabase - let directorDatabase: RelayDatabase - - beforeAll(async () => { - cellDatabase = await openRelayDatabase({ - databaseUrl, - dataDir: '', - applicationName: `orca-relay/cell/${cell.id}` - }) - directorDatabase = await openRelayDatabase({ - databaseUrl, - dataDir: '', - applicationName: 'orca-relay/director/director' - }) - await new RelayAssignmentStore(directorDatabase).reconcileCells([cell]) - }) - - afterAll(async () => { - for (const table of ['relay_cell_regions', 'relay_cell_admission']) { - await directorDatabase?.query(`DELETE FROM ${table} WHERE cell_id = ?`, [cell.id]) - } - await directorDatabase?.query(`DELETE FROM relay_cells WHERE cell_id = ?`, [cell.id]) - await cellDatabase?.close() - await directorDatabase?.close() - }) - - // Every waiter after the first is blocked by the first waiter's tuple lock, so - // only the root of the chain names the cell transaction that holds the row. - it('attributes a convoy of directors to the cell holding the relay_cells row', async () => { - expect(await readPostgresLockWaitSample(directorDatabase)).toEqual([]) - - let release!: () => void - const released = new Promise((resolve) => (release = resolve)) - let held!: () => void - const holding = new Promise((resolve) => (held = resolve)) - const holder = cellDatabase.transaction(async (transaction) => { - await transaction.query( - `UPDATE relay_cells SET reserved_requests = reserved_requests WHERE cell_id = ?`, - [cell.id] - ) - held() - await released - }) - await holding - const waiters = Array.from({ length: 3 }, () => - directorDatabase.transaction(async (transaction) => { - await transaction.queryLocked(`SELECT * FROM relay_cells WHERE cell_id = ?`, [cell.id]) - }) - ) - - try { - await expect - .poll(async () => await readPostgresLockWaitSample(directorDatabase), { timeout: 900 }) - .toEqual([ - { waiterRole: 'director', table: 'relay_cells', holderRole: 'cell', waiters: 3 } - ]) - } finally { - release() - await Promise.all([holder, ...waiters]) - } - }) -}) diff --git a/cloud/apps/relay/src/database/postgres-statement-stats-postgres.test.ts b/cloud/apps/relay/src/database/postgres-statement-stats-postgres.test.ts index 7f1efd76202..035d0af0ff2 100644 --- a/cloud/apps/relay/src/database/postgres-statement-stats-postgres.test.ts +++ b/cloud/apps/relay/src/database/postgres-statement-stats-postgres.test.ts @@ -1,7 +1,6 @@ import { randomUUID } from 'node:crypto' import pg from 'pg' import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { openRelayDatabase } from './database.js' import { POSTGRES_STATEMENT_STATS_MIGRATION } from './postgres-statement-stats.js' const databaseUrl = process.env.ORCA_RELAY_TEST_POSTGRES_URL @@ -52,28 +51,6 @@ describePostgres('optional PostgreSQL statement statistics', () => { return result.rows[0]!.present } - it('exposes an existing collector idempotently, and skips servers without one', async () => { - const url = await freshDatabase() - const database = await openRelayDatabase({ databaseUrl: url, dataDir: '' }) - await database.close() - const client = await connect(url) - try { - expect(await installed(client)).toBe(preloaded) - if (preloaded) { - const before = await client.query('SELECT stats_reset FROM public.pg_stat_statements_info') - await client.query(POSTGRES_STATEMENT_STATS_MIGRATION) - const after = await client.query('SELECT stats_reset FROM public.pg_stat_statements_info') - expect(after.rows).toEqual(before.rows) - await client.query('SELECT calls, wal_bytes, shared_blks_dirtied FROM public.pg_stat_statements LIMIT 1') - } else { - await client.query(POSTGRES_STATEMENT_STATS_MIGRATION) - expect(await installed(client)).toBe(false) - } - } finally { - await client.end() - } - }) - it('tolerates missing extension privileges', async () => { const client = await connect(await freshDatabase()) const role = `relay_stats_role_${randomUUID().replaceAll('-', '')}` diff --git a/cloud/apps/relay/src/database/postgres-transaction-recovery.test.ts b/cloud/apps/relay/src/database/postgres-transaction-recovery.test.ts index 597bcc0386a..382b6e12f5e 100644 --- a/cloud/apps/relay/src/database/postgres-transaction-recovery.test.ts +++ b/cloud/apps/relay/src/database/postgres-transaction-recovery.test.ts @@ -100,43 +100,16 @@ describePostgres('PostgreSQL transaction recovery', () => { 'relay_assignment_migration_incarnations', 'relay_control_connection_reservations' ]) { - await database.query(`DELETE FROM ${table} WHERE user_id IN (?, ?)`, [ - 'completion-race-user', - 'completion-contention-user' + await database.query(`DELETE FROM ${table} WHERE user_id = ?`, [ + 'completion-race-user' ]) } for (const table of ['relay_cell_admission', 'relay_cell_regions']) { - await database.query(`DELETE FROM ${table} WHERE cell_id IN (?, ?, ?, ?)`, [ + await database.query(`DELETE FROM ${table} WHERE cell_id IN (?, ?)`, [ 'completion-race-source', - 'completion-race-target', - 'completion-contention-source', - 'completion-contention-target' + 'completion-race-target' ]) } - for (const identity of [ - { userId: 'released-order-user', relayHostId: 'releasedorder001' }, - { userId: 'normalized-order-user', relayHostId: 'normalizedorder1' }, - { userId: 'atomic-final-user-a', relayHostId: 'atomicfinalhosta' }, - { userId: 'atomic-final-user-b', relayHostId: 'atomicfinalhostb' }, - { userId: 'lease-assignment-contention-user', relayHostId: 'leaseassignment1' } - ]) { - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id = ? AND relay_host_id = ?`, - [identity.userId, identity.relayHostId] - ) - await database.query( - `DELETE FROM relay_assignments WHERE user_id = ? AND relay_host_id = ?`, - [identity.userId, identity.relayHostId] - ) - } - await database.query(`DELETE FROM relay_cells WHERE cell_id IN (?, ?)`, [ - 'released-order-cell', - 'normalized-order-cell' - ]) - await database.query(`DELETE FROM relay_cells WHERE cell_id = ?`, ['atomic-final-cell']) - await database.query(`DELETE FROM relay_cells WHERE cell_id = ?`, [ - 'lease-assignment-contention-cell' - ]) await database.query( `DELETE FROM relay_assignment_activity_leases WHERE user_id LIKE 'reconcile-user-%'` ) @@ -159,110 +132,6 @@ describePostgres('PostgreSQL transaction recovery', () => { 'completion-race-source', 'completion-race-target' ]) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id = ?`, - ['completion-contention-user'] - ) - await database.query(`DELETE FROM relay_assignment_migrations WHERE user_id = ?`, [ - 'completion-contention-user' - ]) - await database.query(`DELETE FROM relay_assignments WHERE user_id = ?`, [ - 'completion-contention-user' - ]) - await database.query(`DELETE FROM relay_cell_runtime WHERE cell_id IN (?, ?)`, [ - 'completion-contention-source', - 'completion-contention-target' - ]) - await database.query(`DELETE FROM relay_cells WHERE cell_id IN (?, ?)`, [ - 'completion-contention-source', - 'completion-contention-target' - ]) - await database.query(`DELETE FROM relay_cell_fences WHERE cell_id = ?`, [ - 'dead-source-contention-source' - ]) - await database.query( - `DELETE FROM relay_control_connection_reservations WHERE user_id = ?`, - ['dead-source-contention-user'] - ) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id = ?`, - ['dead-source-contention-user'] - ) - await database.query( - `DELETE FROM relay_assignment_migration_incarnations WHERE user_id = ?`, - ['dead-source-contention-user'] - ) - await database.query(`DELETE FROM relay_assignment_migrations WHERE user_id = ?`, [ - 'dead-source-contention-user' - ]) - await database.query(`DELETE FROM relay_assignments WHERE user_id = ?`, [ - 'dead-source-contention-user' - ]) - await database.query(`DELETE FROM relay_cell_runtime WHERE cell_id IN (?, ?)`, [ - 'dead-source-contention-source', - 'dead-source-contention-target' - ]) - await database.query(`DELETE FROM relay_cell_admission WHERE cell_id IN (?, ?)`, [ - 'dead-source-contention-source', - 'dead-source-contention-target' - ]) - await database.query(`DELETE FROM relay_cells WHERE cell_id IN (?, ?)`, [ - 'dead-source-contention-source', - 'dead-source-contention-target' - ]) - await database.query( - `DELETE FROM relay_assignment_activity_leases - WHERE user_id IN (?, ?)`, - ['lease-contention-user', 'aggregate-contention-user'] - ) - await database.query( - `DELETE FROM relay_assignments - WHERE user_id IN (?, ?)`, - ['lease-contention-user', 'aggregate-contention-user'] - ) - await database.query(`DELETE FROM relay_cells WHERE cell_id IN (?, ?)`, [ - 'lease-contention-cell', - 'aggregate-contention-cell' - ]) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id = ?`, - ['sustained-lock-user'] - ) - await database.query(`DELETE FROM relay_assignments WHERE user_id = ?`, [ - 'sustained-lock-user' - ]) - await database.query(`DELETE FROM relay_cells WHERE cell_id = ?`, [ - 'sustained-lock-cell' - ]) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id = ?`, - ['sticky-cell-contention-user'] - ) - await database.query( - `DELETE FROM relay_assignments WHERE user_id = ?`, - ['sticky-cell-contention-user'] - ) - await database.query(`DELETE FROM relay_cells WHERE cell_id = ?`, [ - 'sticky-cell-contention-cell' - ]) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id LIKE 'postgres-user-%'` - ) - await database.query(`DELETE FROM relay_assignments WHERE user_id LIKE 'postgres-user-%'`) - await database.query(`DELETE FROM relay_cells WHERE cell_id IN (?, ?, ?)`, [ - 'cell-a', - 'cell-b', - 'cell-c' - ]) - await database.query( - `DELETE FROM relay_assignment_activity_leases WHERE user_id LIKE 'sticky-fast-user-%'` - ) - await database.query( - `DELETE FROM relay_assignments WHERE user_id LIKE 'sticky-fast-user-%'` - ) - await database.query(`DELETE FROM relay_cells WHERE cell_id = ?`, [ - 'sticky-fast-cell' - ]) }) it('retries an entire deadlock victim transaction on a fresh attempt', async () => { From b22328d476f4b7ee73ef04f632f9f5350cbbb0f3 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 13:40:50 -0800 Subject: [PATCH 16/49] test: remove low-value cell and host-session coverage (#42140) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../src/cell-status-reserve-view.test.ts | 314 ----------------- .../admission/cell-admission-selector.test.ts | 170 --------- .../admission/cell-connection-cap.test.ts | 85 +---- .../relay-control-flag-channel.test.ts | 19 - ...ll-reserve-dead-man-slots.blackbox.test.ts | 9 - .../cell-reserve-dead-man.test.ts | 9 - .../cell/seats/cell-poll-reachability.test.ts | 10 +- .../cell/seats/shadow-seat-directory.test.ts | 11 - .../connections/host-session-registry.test.ts | 329 ------------------ .../relay/src/host-whereabouts-app.test.ts | 211 ----------- 10 files changed, 3 insertions(+), 1164 deletions(-) delete mode 100644 cloud/apps/relay/src/cell-status-reserve-view.test.ts delete mode 100644 cloud/apps/relay/src/connections/host-session-registry.test.ts delete mode 100644 cloud/apps/relay/src/host-whereabouts-app.test.ts diff --git a/cloud/apps/relay/src/cell-status-reserve-view.test.ts b/cloud/apps/relay/src/cell-status-reserve-view.test.ts deleted file mode 100644 index e554c245818..00000000000 --- a/cloud/apps/relay/src/cell-status-reserve-view.test.ts +++ /dev/null @@ -1,314 +0,0 @@ -import { afterEach, describe, expect, it, vi } from 'vitest' -import type { RelayConfig } from './config.js' - -vi.mock('./authentication/admin-token-verifier.js', () => ({ - createAdminTokenVerifier: () => async (token: string) => token === 'deploy-token', - createReadOnlyAdminTokenVerifier: () => async () => false, - createRegionalRehomeControlApplyTokenVerifier: () => async () => false, - createRegionalRehomeRuntimeTokenVerifier: () => async () => false, - createRegionalRehomeTokenVerifier: () => async () => false, - createRuntimeTokenVerifier: () => async () => false -})) - -vi.mock('./authentication/relay-token-verifier.js', () => ({ - createRelayTokenVerifier: () => async () => null, - readBearer: (value: string | undefined) => value?.replace(/^Bearer /, '') ?? null -})) - -import { createRelayApp } from './app.js' -import { RelayAssignmentStore } from './assignment/assignment-store.js' -import type { CellReserveClient } from './cell/reservations/cell-reserve-client.js' -import { openInMemoryRelayDatabase, type RelayDatabase } from './database/database.js' -import { ReserveAssignment, type ReservePlacementMode } from './assignment/reserve-placement/reserve-assignment.js' -import { ReservePlacer } from './assignment/reserve-placement/reserve-placement.js' -import { - ShadowSeatDirectory, - type SeatFeedCell, - type SeatFeedResponse -} from './cell/seats/shadow-seat-directory.js' - -const INCARNATION = '11111111-1111-4111-8111-111111111111' -const CELLS = [ - { id: 'cell-a', url: 'https://relay-a.example.com', capacityRequests: 10 }, - { id: 'cell-b', url: 'https://relay-b.example.com', capacityRequests: 10 } -] -const PER_HOST_FIELDS = [ - 'reservedRequests', - 'assignments', - 'activityLeases', - 'activityRequestUnits', - 'restartBlockingActivityLeases', - 'restartBlockingActivityRequestUnits', - 'restartBlockingReservedRequests', - 'outgoingMigrations', - 'incomingMigrations' -] - -function feed(cellId: string, overrides: Partial = {}): SeatFeedResponse { - return { - v: 1, - cellId, - incarnation: INCARNATION, - seq: 1, - at: 0, - draining: false, - counts: { seats: 40, controls: 42, bookings: 3, units: 45, ceiling: 500 }, - intake: { perSec: 5, burst: 20, tokens: 20 }, - flagsApplied: { generation: 3, flags: { admitMode: 'reserve' } }, - admitModeEffective: 'reserve', - admitModeRaw: 'reserve', - full: [], - ...overrides - } -} - -describe('reserve-aware cell status', () => { - let database: RelayDatabase | undefined - - afterEach(async () => { - await database?.close() - database = undefined - }) - - async function setup( - options: { mode?: ReservePlacementMode; startedAt?: number; placement?: boolean } = {} - ) { - const now = { value: 100_000 } - database = await openInMemoryRelayDatabase() - const store = new RelayAssignmentStore(database, () => now.value, { heartbeatTtlMs: 45_000 }) - await store.reconcileCells(CELLS) - for (const cell of CELLS) { - await store.recordCellHeartbeat({ - cellId: cell.id, - cellUrl: cell.url, - cellIncarnation: INCARNATION, - startedAt: 50, - ready: true, - observedRequests: 0 - }) - } - await store.assign({ userId: 'user-a', relayHostId: 'host000000000001' }) - await store.setCellAdmitMode('cell-a', 'reserve') - const cells: SeatFeedCell[] = CELLS.map((cell) => ({ - cellId: cell.id, - cellUrl: cell.url, - region: 'us-central1', - heartbeatExpiresAt: Number.MAX_SAFE_INTEGER, - requiredForComplete: true, - general: true - })) - const directory = new ShadowSeatDirectory() - directory.setCells(cells.map((cell) => cell.cellId)) - const reservePlacement = new ReserveAssignment({ - mode: options.mode ?? 'on', - directory, - cells: () => cells, - startedAt: options.startedAt ?? 0, - placer: new ReservePlacer( - () => now.value, - () => 0.25 - ), - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the status route never books or demotes. - client: {} as CellReserveClient, - readRow: async () => null, - now: () => now.value - }) - const app = createRelayApp(config(), { - store: {} as never, - assignments: store, - ...(options.placement === false ? {} : { reservePlacement }), - drain: vi.fn(), - ready: vi.fn(async () => true) - }) - const status = async (body: Record) => - await app.request('/v1/admin/cell-status', { - method: 'POST', - headers: { authorization: 'Bearer deploy-token', 'content-type': 'application/json' }, - body: JSON.stringify({ v: 1, ...body }) - }) - return { store, directory, now, status } - } - - it('reads a database cell exactly as today, and leaves a reserve cell without per-host counts', async () => { - const { store } = await setup() - expect(await store.reserveAwareCellDeploymentStatus('cell-b')).toEqual({ - admitMode: 'db', - status: await store.cellDeploymentStatus('cell-b') - }) - await expect(store.cellDeploymentStatus('cell-a')).rejects.toThrow('cell_in_reserve_mode') - const reserve = await store.reserveAwareCellDeploymentStatus('cell-a') - expect(reserve).toMatchObject({ - admitMode: 'reserve', - status: { - cellId: 'cell-a', - runtime: { cellIncarnation: INCARNATION, ready: true, heartbeatFresh: true } - } - }) - expect(Object.keys(reserve.status).filter((key) => PER_HOST_FIELDS.includes(key))).toEqual([]) - await database!.query( - 'ALTER TABLE relay_cell_admit_modes RENAME TO relay_cell_admit_modes_gone' - ) - const unknown = new RelayAssignmentStore(database!, () => 100_000) - await expect(unknown.reserveAwareCellDeploymentStatus('cell-b')).rejects.toThrow( - 'reserve_mode_unknown' - ) - }) - - it('keeps the 404 for a reserve cell without the opt-in, and 400s an unknown view', async () => { - const { status } = await setup() - const refused = await status({ cellId: 'cell-a' }) - expect(refused.status).toBe(404) - expect(await refused.json()).toEqual({ error: 'cell_in_reserve_mode' }) - expect((await status({ cellId: 'cell-a', view: 'all' })).status).toBe(400) - }) - - it('answers a reserve cell from the map, with perHost null and never zeros', async () => { - const { directory, now, status } = await setup() - directory.apply('cell-a', feed('cell-a', { draining: true }), now.value, now.value - 1_500) - directory.apply( - 'cell-b', - feed('cell-b', { admitModeEffective: 'db', admitModeRaw: 'db' }), - now.value, - now.value - ) - now.value += 20_000 - const response = await status({ cellId: 'cell-a', view: 'reserve-aware' }) - expect(response.status).toBe(200) - const body = await statusBody(response) - expect(body.status).toMatchObject({ - cellId: 'cell-a', - admissionState: 'general', - runtime: { cellIncarnation: INCARNATION }, - perHost: null, - reserve: { - admitMode: 'reserve', - feedStatus: 'live', - // Reported, not enforced: the caller rejects a stale map. - polledAgeMs: 21_500, - incarnation: INCARNATION, - draining: true, - controls: 42, - seats: 40, - bookings: 3, - units: 45, - ceiling: 500, - intakePerSec: 5, - free: 500 - (45 - 3) - 3 - } - }) - expect(Object.keys(body.status).filter((key) => PER_HOST_FIELDS.includes(key))).toEqual([]) - }) - - it('reports nulls, not zeros, for a restarted cell that has not applied its reserve switch', async () => { - const { directory, now, status } = await setup() - directory.apply( - 'cell-a', - feed('cell-a', { - counts: { seats: 0, controls: 0 }, - intake: undefined, - flagsApplied: { generation: 0, flags: {} }, - admitModeEffective: 'db', - admitModeRaw: 'db' - }), - now.value, - now.value - ) - const body = await statusBody(await status({ cellId: 'cell-a', view: 'reserve-aware' })) - expect(body.status.reserve).toMatchObject({ - admitMode: 'db', - bookings: null, - units: null, - ceiling: null, - intakePerSec: null, - free: null - }) - }) - - it('answers a retryable 503 while this director cannot vouch for the cell', async () => { - const unavailable = async (response: Response) => ({ - status: response.status, - retryAfter: response.headers.get('Retry-After'), - body: await response.json() - }) - const expected = (reason: string) => ({ - status: 503, - retryAfter: '5', - body: { error: 'reserve_status_unavailable', reason } - }) - for (const options of [{ mode: 'dry-run' as const }, { placement: false }]) { - const { directory, now, status } = await setup(options) - directory.apply('cell-a', feed('cell-a'), now.value, now.value) - expect(await unavailable(await status({ cellId: 'cell-a', view: 'reserve-aware' }))).toEqual( - expected('placement-off') - ) - await database?.close() - } - // A starting director with one cell unheard. - const starting = await setup({ startedAt: 99_000 }) - starting.directory.apply('cell-a', feed('cell-a'), starting.now.value, starting.now.value) - expect( - await unavailable(await starting.status({ cellId: 'cell-a', view: 'reserve-aware' })) - ).toEqual(expected('map-incomplete')) - await database?.close() - const { directory, now, status } = await setup() - directory.apply('cell-b', feed('cell-b'), now.value, now.value) - directory.markNoFeed('cell-a', now.value) - expect(await unavailable(await status({ cellId: 'cell-a', view: 'reserve-aware' }))).toEqual( - expected('no-feed') - ) - // A feed without the drain flag or counts is an older image: no feed, never an empty cell. - directory.apply('cell-a', feed('cell-a', { draining: undefined }), now.value, now.value) - expect(await unavailable(await status({ cellId: 'cell-a', view: 'reserve-aware' }))).toEqual( - expected('no-feed') - ) - directory.apply('cell-a', feed('cell-a', { counts: undefined }), now.value, now.value) - expect(await unavailable(await status({ cellId: 'cell-a', view: 'reserve-aware' }))).toEqual( - expected('no-feed') - ) - // The process that answered the feed is not the one heartbeating the runtime row. - directory.apply( - 'cell-a', - feed('cell-a', { incarnation: '22222222-2222-4222-8222-222222222222' }), - now.value, - now.value - ) - expect(await unavailable(await status({ cellId: 'cell-a', view: 'reserve-aware' }))).toEqual( - expected('incarnation-mismatch') - ) - }) -}) - -async function statusBody(response: Response) { - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the route answers { v, status } on 200. - return (await response.json()) as { v: number; status: Record } -} - -function config(overrides: Partial = {}): RelayConfig { - return { - port: 8080, - publicUrl: 'https://relay.example.test', - cellUrl: 'https://relay.example.test', - region: 'us-central1', - authIssuer: 'https://auth.example.test', - authAudience: 'orca-relay', - jwksUrl: 'https://auth.example.test/jwks', - assignmentSigningKey: new Uint8Array(32), - role: 'director', - cellId: 'director', - cells: [], - adminAudience: 'https://relay.example.test/v1/admin/drain', - deployServiceAccount: 'deploy@example.test', - runtimeServiceAccount: 'relay-cell@example.test', - adminJwksUrl: 'https://auth.example.test/jwks', - databasePoolMax: 10, - publicAssignmentsEnabled: true, - publicAssignmentConcurrency: 2, - publicAssignmentQueueMax: 128, - publicAssignmentWaitMs: 4_000, - publicResolveConcurrency: 1, - publicResolveWaitMs: 5_000, - publicAssignmentRetryAfterSeconds: 5, - dataDir: './data', - ...overrides - } -} diff --git a/cloud/apps/relay/src/cell/admission/cell-admission-selector.test.ts b/cloud/apps/relay/src/cell/admission/cell-admission-selector.test.ts index f7c4164afc1..3069552a6e0 100644 --- a/cloud/apps/relay/src/cell/admission/cell-admission-selector.test.ts +++ b/cloud/apps/relay/src/cell/admission/cell-admission-selector.test.ts @@ -1,4 +1,3 @@ -import { ASSIGNMENT_LIMITS } from '@orca-cloud/relay-contract/assignment-invariants' import { createHash } from 'node:crypto' import { afterEach, describe, expect, it } from 'vitest' import { RelayAssignmentStore } from '../../assignment/assignment-store.js' @@ -27,41 +26,6 @@ const BASE_MEMBERSHIP = { general: ['c1', 'c2', 'c3'] } -class FailAfterIntentDatabase implements RelayDatabase { - private transactionsUntilFailure = Number.POSITIVE_INFINITY - - constructor(private readonly delegate: RelayDatabase) {} - - failSecondTransaction(): void { - this.transactionsUntilFailure = 2 - } - - async query(sql: string, params?: unknown[]): Promise { - return await this.delegate.query(sql, params) - } - - async queryLocked( - sql: string, - params?: unknown[], - options?: RelayLockOptions - ): Promise { - return await this.delegate.queryLocked(sql, params, options) - } - - async transaction(operation: (transaction: RelayDatabase) => Promise): Promise { - this.transactionsUntilFailure-- - if (this.transactionsUntilFailure === 0) { - this.transactionsUntilFailure = Number.POSITIVE_INFINITY - throw new Error('injected_commit_ambiguity') - } - return await this.delegate.transaction(operation) - } - - async close(): Promise { - await this.delegate.close() - } -} - class AfterTransactionDatabase implements RelayDatabase { private afterTransaction: (() => Promise) | undefined @@ -154,34 +118,6 @@ describe('relay cell admission selector', () => { }) }) - it('excludes existing-only and migration-only cells from dormant placement', async () => { - let now = 100 - const store = await setup(() => now) - const identity = { userId: 'dormant', relayHostId: 'host000000000001' } - const assignment = await store.assign(identity) - const control = await store.activateControl(identity, { - cellId: assignment.cellId, - assignmentEpoch: assignment.assignmentEpoch, - generation: 1 - }) - await store.releaseActivity(identity, control) - now += ASSIGNMENT_LIMITS.dormantTtlMs + 1 - - await store.applyCellAdmissionSelector({ - attemptId: 'cutover_002', - expectedGeneration: 0, - expectedMembershipSha256: BASE_MEMBERSHIP_SHA256, - membership: INITIAL_MEMBERSHIP - }) - - await expect(store.rebalanceDormant(identity, 'c2')).rejects.toThrow( - 'target_cell_unavailable' - ) - await expect(store.rebalanceDormant(identity, 'c3')).resolves.toMatchObject({ - cellId: 'c3' - }) - }) - it('does not recover an unfenced dead existing-only assignment', async () => { let now = 100 const store = await setup(() => now, true) @@ -283,94 +219,6 @@ describe('relay cell admission selector', () => { ]) }) - it('persists failed CAS intent without mutating current membership', async () => { - const store = await setup(() => 100) - await store.applyCellAdmissionSelector({ - attemptId: 'cutover_005', - expectedGeneration: 0, - expectedMembershipSha256: BASE_MEMBERSHIP_SHA256, - membership: INITIAL_MEMBERSHIP - }) - - await expect( - store.applyCellAdmissionSelector({ - attemptId: 'stale_attempt', - expectedGeneration: 5, - membership: { - existingOnly: ['c1'], - migrationOnly: [], - general: ['c2', 'c3'] - } - }) - ).rejects.toThrow('admission_selector_generation_mismatch') - await expect(store.inspectCellAdmissionSelector('stale_attempt')).resolves.toMatchObject({ - selector: { generation: 1, membership: INITIAL_MEMBERSHIP }, - intent: { state: 'diverged' } - }) - }) - - it('rejects duplicate or incomplete selector membership before mutation', async () => { - const store = await setup(() => 100) - - await expect( - store.applyCellAdmissionSelector({ - attemptId: 'duplicate_001', - expectedGeneration: 0, - expectedMembershipSha256: BASE_MEMBERSHIP_SHA256, - membership: { - existingOnly: ['c1', 'c1'], - migrationOnly: ['c2'], - general: ['c3'] - } - }) - ).rejects.toThrow('admission_selector_duplicate_cell') - await expect( - store.applyCellAdmissionSelector({ - attemptId: 'incomplete_001', - expectedGeneration: 0, - expectedMembershipSha256: BASE_MEMBERSHIP_SHA256, - membership: { - existingOnly: ['c1'], - migrationOnly: ['c2'], - general: [] - } - }) - ).rejects.toThrow('admission_selector_incomplete_membership') - await expect(store.inspectCellAdmissionSelector()).resolves.toMatchObject({ - selector: { - generation: 0, - membership: { existingOnly: [], migrationOnly: [], general: ['c1', 'c2', 'c3'] } - } - }) - }) - - it('inspects an unchanged durable intent after an ambiguous apply failure', async () => { - const underlying = await openInMemoryRelayDatabase() - const failingDatabase = new FailAfterIntentDatabase(underlying) - database = failingDatabase - const store = new RelayAssignmentStore(failingDatabase, () => 100) - await store.reconcileCells(CELLS) - failingDatabase.failSecondTransaction() - - const input = { - attemptId: 'ambiguous_001', - expectedGeneration: 0, - expectedMembershipSha256: BASE_MEMBERSHIP_SHA256, - membership: INITIAL_MEMBERSHIP - } - await expect(store.applyCellAdmissionSelector(input)).rejects.toThrow( - 'injected_commit_ambiguity' - ) - await expect(store.inspectCellAdmissionSelector(input.attemptId)).resolves.toMatchObject({ - selector: { generation: 0 }, - intent: { state: 'unchanged' } - }) - await expect(store.applyCellAdmissionSelector(input)).resolves.toMatchObject({ - changed: true, - selector: { generation: 1, membership: INITIAL_MEMBERSHIP } - }) - }) - it('allows only one concurrent CAS and never re-enables legacy cells', async () => { const store = await setup(() => 100) await store.applyCellAdmissionSelector({ @@ -416,24 +264,6 @@ describe('relay cell admission selector', () => { ).rejects.toThrow('admission_selector_legacy_reenable') }) - it('preserves the selector boundary across compatible reconciliation', async () => { - const store = await setup(() => 100) - await store.applyCellAdmissionSelector({ - attemptId: 'cutover_007', - expectedGeneration: 0, - expectedMembershipSha256: BASE_MEMBERSHIP_SHA256, - membership: INITIAL_MEMBERSHIP - }) - - await expect(store.reconcileCells(CELLS, false)).resolves.toBeUndefined() - await expect(store.reconcileCells([CELLS[0]!, CELLS[2]!])).rejects.toThrow( - 'admission_selector_boundary_active' - ) - await expect(store.inspectCellAdmissionSelector()).resolves.toMatchObject({ - selector: { generation: 1, membership: INITIAL_MEMBERSHIP } - }) - }) - it('atomically adds exact migration-only cells after the selector boundary', async () => { const store = await setup(() => 100) await store.applyCellAdmissionSelector({ diff --git a/cloud/apps/relay/src/cell/admission/cell-connection-cap.test.ts b/cloud/apps/relay/src/cell/admission/cell-connection-cap.test.ts index d3e20f33e75..75e17a40b7a 100644 --- a/cloud/apps/relay/src/cell/admission/cell-connection-cap.test.ts +++ b/cloud/apps/relay/src/cell/admission/cell-connection-cap.test.ts @@ -1,14 +1,11 @@ -import { createHash } from 'node:crypto' import { afterEach, describe, expect, it, vi } from 'vitest' import { RelayAssignmentStore } from '../../assignment/assignment-store.js' -import { encodeMembership, type CellAdmissionMembership } from './cell-admission-selector.js' import type { RelayCellConfig } from '../../config.js' import { openInMemoryRelayDatabase, type RelayDatabase } from '../../database/database.js' const HEARTBEAT_TTL_MS = 45_000 const BOUND = 60 const OLD_INCARNATION = '11111111-1111-4111-8111-111111111111' -const NEW_INCARNATION = '22222222-2222-4222-8222-222222222222' function cell(index: number, connectionHardCap: 1_000 | 3_000): RelayCellConfig { const id = `us-c${String(index).padStart(2, '0')}` @@ -40,7 +37,7 @@ type Report = { async function setup(cells: RelayCellConfig[]) { const database = await openInMemoryRelayDatabase() databases.push(database) - let now = 100 + const now = 100 const store = new RelayAssignmentStore(database, () => now, { requireLiveCells: true, heartbeatTtlMs: HEARTBEAT_TTL_MS @@ -81,32 +78,13 @@ async function setup(cells: RelayCellConfig[]) { } return rows } - const isolateForRoll = async (cellId: string): Promise => { - const current = await store.inspectCellAdmissionSelector() - const membership: CellAdmissionMembership = { - existingOnly: [], - migrationOnly: [cellId], - general: cells.map(({ id }) => id).filter((id) => id !== cellId) - } - await store.applyCellAdmissionSelector({ - attemptId: `isolate-${cellId}`, - expectedGeneration: current.selector.generation, - expectedMembershipSha256: createHash('sha256') - .update(encodeMembership(current.selector.membership)) - .digest('hex'), - membership, - rollIsolatedCells: [cellId] - }) - } return { database, store, heartbeat, capacity, reportedHardCap, - telemetryRows, - isolateForRoll, - setNow: (value: number) => (now = value) + telemetryRows } } @@ -215,63 +193,4 @@ describe('effective connection cap = min(configured, reported)', () => { harness.store.assign({ userId: 'user-a', relayHostId: 'host000000000001' }) ).rejects.toThrow('relay_capacity_exhausted') }) - - it('places a mixed fleet against each cell’s own reported cap', async () => { - const small = cell(1, 3_000) - const large = cell(2, 3_000) - const harness = await setup([small, large]) - await harness.heartbeat(small, { connectionHardCap: 1_000, units: 840 }) - await harness.heartbeat(large, { connectionHardCap: 3_000, units: 840 }) - - expect(await harness.capacity(small.id)).toMatchObject({ normalAdmissionPause: 840 }) - expect(await harness.capacity(large.id)).toMatchObject({ normalAdmissionPause: 2_840 }) - for (let index = 0; index < 4; index++) { - await expect( - harness.store.assign({ userId: `user-${index}`, relayHostId: `host00000000000${index}` }) - ).resolves.toMatchObject({ cellId: large.id }) - } - }) - - it('has no unavailable window while a cell rolls 1,000 -> 3,000', async () => { - const cells = [cell(1, 1_000), cell(2, 1_000)] - const [rolled, neighbour] = cells - const harness = await setup(cells) - const identity = { userId: 'user-a', relayHostId: 'host000000000001' } - await harness.heartbeat(rolled!, { connectionHardCap: 1_000 }) - await harness.heartbeat(neighbour!, { connectionHardCap: 1_000, units: 500 }) - const home = await harness.store.assign(identity) - expect(home.cellId).toBe(rolled!.id) - await harness.store.reconcileCells( - cells.map((_, index) => cell(index + 1, 3_000)), - true - ) - - // The old process keeps heartbeating its 1,000 well past the TTL; the host stays sticky. - for (const at of [30_000, 60_000, 90_000]) { - harness.setNow(at) - await harness.heartbeat(rolled!, { connectionHardCap: 1_000 }) - await harness.heartbeat(neighbour!, { connectionHardCap: 1_000, units: 500 }) - await expect(harness.store.assign(identity)).resolves.toMatchObject({ - cellId: rolled!.id, - assignmentEpoch: home.assignmentEpoch - }) - } - // The roll isolates the live old process: the isolated-incumbent lane re-places the host. - await harness.isolateForRoll(rolled!.id) - const moved = await harness.store.assign(identity) - expect(moved).toMatchObject({ cellId: neighbour!.id, placed: true }) - - // The replacement boots and reports the new cap. - harness.setNow(120_000) - await harness.heartbeat(rolled!, { - connectionHardCap: 3_000, - incarnation: NEW_INCARNATION, - startedAt: 110_000 - }) - expect(await harness.capacity(rolled!.id)).toMatchObject({ - effectiveHardCap: 3_000, - heartbeatFresh: true - }) - }) - }) diff --git a/cloud/apps/relay/src/cell/control-flags/relay-control-flag-channel.test.ts b/cloud/apps/relay/src/cell/control-flags/relay-control-flag-channel.test.ts index 6e6eeee42c8..60358c5d59b 100644 --- a/cloud/apps/relay/src/cell/control-flags/relay-control-flag-channel.test.ts +++ b/cloud/apps/relay/src/cell/control-flags/relay-control-flag-channel.test.ts @@ -77,25 +77,6 @@ describe('control flag channel', () => { .filter((line) => line.includes(`"event":"${CELL_FLAGS_APPLIED_EVENT}"`)) .map((line): unknown => JSON.parse(line)) - it('flips a flag on and back off, logging each applied generation once', async () => { - const google = fakeGoogle(cellObject(5, { readinessLocal: true, ticketCheck: 'shadow' })) - const channel = cellChannel(google.fetchImpl) - await channel.poll() - await channel.poll() - expect(google.state.storageRequests[1]?.searchParams.get('ifGenerationNotMatch')).toBe('5') - google.state.object = cellObject(7, { readinessLocal: false, ticketCheck: 'off' }) - await channel.poll() - expect(channel.applied()).toEqual({ generation: 7, flags: CELL_FLAG_DEFAULTS }) - expect(appliedLines()).toEqual([ - { - event: CELL_FLAGS_APPLIED_EVENT, - generation: 5, - flags: { ...CELL_FLAG_DEFAULTS, readinessLocal: true, ticketCheck: 'shadow' } - }, - { event: CELL_FLAGS_APPLIED_EVENT, generation: 7, flags: CELL_FLAG_DEFAULTS } - ]) - }) - it('keeps the applied values through every kind of lost contact, logging once per cause', async () => { const google = fakeGoogle(cellObject(5, { readinessLocal: true })) const channel = cellChannel(google.fetchImpl) diff --git a/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man-slots.blackbox.test.ts b/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man-slots.blackbox.test.ts index 7c0eba9cacb..59eb5dd1637 100644 --- a/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man-slots.blackbox.test.ts +++ b/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man-slots.blackbox.test.ts @@ -128,13 +128,4 @@ describe('dead-man trip slots', () => { expect(seated.socket.readyState).toBe(WebSocket.OPEN) }, 30_000) - it('without the flag, trips with every slot taken, as before', async () => { - let now = Date.now() - const { database, reserve } = await cell(() => now) - await trippedPeer(database, 'production-gce-c90', now) - await reserve.bookedHost(3) - expect(reserve.relay.sessions.inReserveMode()).toBe(true) - now += reserveDeadManWindowMs(reserve.config.cellId) + 1_000 - expect(reserve.relay.sessions.inReserveMode()).toBe(false) - }, 30_000) }) diff --git a/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man.test.ts b/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man.test.ts index 518925c8268..7ced8b04125 100644 --- a/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man.test.ts +++ b/cloud/apps/relay/src/cell/reservations/cell-reserve-dead-man.test.ts @@ -55,15 +55,6 @@ describe('ReserveDeadMan', () => { ]) }) - it('keeps the plain window for a later reserve write once a director has been in touch', () => { - const { clock, deadMan } = setup(3 * WINDOW_MS) - deadMan.mode(reserve(1)) - deadMan.contact() - expect(deadMan.mode(reserve(2))).toBe('reserve') - clock.value += WINDOW_MS + 1 - expect(deadMan.mode(reserve(2))).toBe('db') - }) - // A claim answered after the director came back must not trip the cell later without a slot. it('drops a permit for a silence that contact has ended', () => { const { clock, deadMan, events } = setup() diff --git a/cloud/apps/relay/src/cell/seats/cell-poll-reachability.test.ts b/cloud/apps/relay/src/cell/seats/cell-poll-reachability.test.ts index fc6201b5989..38fe72400b5 100644 --- a/cloud/apps/relay/src/cell/seats/cell-poll-reachability.test.ts +++ b/cloud/apps/relay/src/cell/seats/cell-poll-reachability.test.ts @@ -50,7 +50,7 @@ const answer = (status: number) => new Response('{}', { status }) // Every cell serves a feed page on the first round; `respond` answers every round after it. function poller( respond: (cellId: string) => Response | Promise, - options: { identityFails?: boolean; cells?: SeatFeedCell[]; neverServed?: ReadonlySet } = {} + options: { cells?: SeatFeedCell[]; neverServed?: ReadonlySet } = {} ) { let now = 1_000 let round = 0 @@ -66,7 +66,6 @@ function poller( return round === 0 ? page(cellId) : await respond(cellId) }), identityToken: vi.fn(async () => { - if (options.identityFails && round > 0) throw new Error('metadata_unavailable') return 'token-1' }), now: () => now, @@ -107,13 +106,6 @@ describe('seat-feed poller reachability', () => { } }) - it('does not blame a cell for a token this director cannot mint', async () => { - const cells = poller((cellId) => page(cellId), { identityFails: true }) - const at = await cells.run(CELL_POLL_DEAD_STREAK_MS) - cells.stop() - expect(cells.deadCellVerdict('c2', at)).toBeNull() - }) - it('counts only cells that served a feed: legacy 404 rows neither fill the sample nor dilute it', async () => { // Staging's shape: a few real cells and 16 legacy rows. Every real cell fails. const cells = poller(() => answer(502), { cells: [...CELLS.slice(0, 3), ...LEGACY] }) diff --git a/cloud/apps/relay/src/cell/seats/shadow-seat-directory.test.ts b/cloud/apps/relay/src/cell/seats/shadow-seat-directory.test.ts index 373a119003e..517e2966282 100644 --- a/cloud/apps/relay/src/cell/seats/shadow-seat-directory.test.ts +++ b/cloud/apps/relay/src/cell/seats/shadow-seat-directory.test.ts @@ -351,17 +351,6 @@ describe('startShadowSeatPoller', () => { expect(directory.cellState('cell-b')?.flagsApplied).toBeUndefined() }) - it('completes without a cell that is dead, empty or isolated', async () => { - const cell = poller({ 'cell-a': () => json(feed({ seq: 1, full: [] })) }, 'all', async () => [ - CELLS[0]!, - { ...CELLS[1]!, requiredForComplete: false } - ]) - await cell.tick() - cell.stop() - expect(cell.directory.cellState('cell-b')).toMatchObject({ status: 'pending' }) - expect(cell.directory.isComplete()).toBe(true) - }) - it('treats a malformed or mislabelled body as unverifiable', async () => { const cell = poller({ 'cell-a': () => json({ v: 2 }), diff --git a/cloud/apps/relay/src/connections/host-session-registry.test.ts b/cloud/apps/relay/src/connections/host-session-registry.test.ts deleted file mode 100644 index 1208ebd1658..00000000000 --- a/cloud/apps/relay/src/connections/host-session-registry.test.ts +++ /dev/null @@ -1,329 +0,0 @@ -import { EventEmitter } from 'node:events' -import { CONTROL_CONTINUITY_LIMITS } from '@orca-cloud/relay-contract/control-continuity' -import { RELAY_CLOSE_CODE } from '@orca-cloud/relay-contract/close-codes' -import { RELAY_HOST_CAPABILITY_IDLE_REGIONAL_REHOME } from '@orca-cloud/relay-contract/control-messages' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import type WebSocket from 'ws' -import type { RelayAssignmentStore } from '../assignment/assignment-store.js' -import type { RelayConfig } from '../config.js' -import type { RelayCredentialStore } from '../credentials/credential-store.js' -import { CONTROL_RENEWAL_BATCH_INTERVAL_MS } from '../control-leases/control-renewal-batch.js' -import type { - ControlRenewalOutcome -} from '../control-leases/control-renewal-statement.js' -import { - HostSessionRegistry, - IDLE_REHOME_MIN_CONTROL_AGE_MS, - type HostSession -} from './host-session-registry.js' -import type { RelayRuntimeObserver } from '../observability/relay-observability.js' -import type { RelayTokenClaims } from '../authentication/relay-token-verifier.js' -import { ProcessQueuedByteBudget } from './splice-forwarder.js' - -// A due renewal leaves the heartbeat as a batch enqueue, so the store only sees -// the tick once the batch window closes. -async function closeRenewalWindow(): Promise { - await vi.advanceTimersByTimeAsync(CONTROL_RENEWAL_BATCH_INTERVAL_MS) -} - -class FakeSocket extends EventEmitter { - readonly OPEN = 1 - readonly CLOSING = 2 - readonly CLOSED = 3 - readyState = this.OPEN - readonly send = vi.fn() - readonly close = vi.fn((code?: number, reason?: string) => { - this.readyState = this.CLOSED - this.emit('close', code, Buffer.from(reason ?? '')) - }) - readonly terminate = vi.fn(() => { - this.readyState = this.CLOSED - this.emit('close') - }) -} - -type ActivateSession = ( - socket: WebSocket, - identity: RelayTokenClaims, - existing: HostSession | null, - generation: number, - rebind: boolean, - assignmentEpoch: number, - appVersion?: string -) => Promise - -const config = { - port: 8080, - publicUrl: 'https://relay-c3.example.com', - cellUrl: 'https://relay-c3.example.com', - authIssuer: 'https://auth.example.com', - authAudience: 'orca-relay', - jwksUrl: 'https://auth.example.com/jwks', - assignmentSigningKey: new Uint8Array(32), - role: 'cell', - cellId: 'production-gce-c3', - cells: [ - { - id: 'production-gce-c3', - url: 'https://relay-c3.example.com', - capacityRequests: 4_000 - } - ], - adminAudience: 'https://relay-c3.example.com/v1/admin/drain', - deployServiceAccount: 'deploy@example.com', - runtimeServiceAccount: 'runtime@example.com', - adminJwksUrl: 'https://auth.example.com/admin-jwks', - databasePoolMax: 10, - publicAssignmentsEnabled: true, - publicAssignmentConcurrency: 2, - publicAssignmentQueueMax: 128, - publicAssignmentWaitMs: 4_000, - publicResolveConcurrency: 1, - publicResolveWaitMs: 5_000, - publicAssignmentRetryAfterSeconds: 5, - dataDir: './test-data' -} satisfies RelayConfig - -const identity = { - sub: 'user-1', - prof: 'profile-1', - relayHostId: 'abcdefghijklmnop', - purpose: 'host-control', - exp: 4_102_444_800 -} satisfies RelayTokenClaims - -function deferred(): { - promise: Promise - resolve(value: T): void -} { - let resolve!: (value: T) => void - const promise = new Promise((complete) => { - resolve = complete - }) - return { promise, resolve } -} - -function createRegistry( - activateControl: RelayAssignmentStore['activateControl'], - store: Partial = {}, - verifyRelayToken: (token: string) => Promise = vi.fn() -): { - registry: HostSessionRegistry - activate: ActivateSession - acquireActivity: ReturnType - renewControlActivities: ReturnType> - releaseActivity: ReturnType - observer: { - recordAuth: ReturnType - recordControlClose: ReturnType - recordPostProofClose: ReturnType - recordSpliceClose: ReturnType - } -} { - const acquireActivity = vi.fn().mockResolvedValue(undefined) - const releaseActivity = vi.fn().mockResolvedValue(true) - const renewControlActivities = vi - .fn() - .mockImplementation(async (rows) => rows.map(() => 'renewed')) - const assignments = { - activateControl, - markMigrationTargetRegistered: vi.fn().mockResolvedValue(undefined), - resolve: vi.fn().mockResolvedValue({ cellId: config.cellId }), - acquireActivity, - renewControlActivities, - releaseActivity - } as unknown as RelayAssignmentStore - const observer = { - recordAuth: vi.fn(), - recordForwardedBytes: vi.fn(), - recordHttp: vi.fn(), - recordReconnect: vi.fn(), - recordSql: vi.fn(), - recordControlClose: vi.fn(), - recordPostProofClose: vi.fn(), - recordSpliceClose: vi.fn() - } satisfies RelayRuntimeObserver - const registry = new HostSessionRegistry( - config, - verifyRelayToken, - store as RelayCredentialStore, - assignments, - new ProcessQueuedByteBudget(), - observer, - Date.now, - Math.random, - 'incarnation-1' - ) - // Mirrors the production signature exactly so a future positional shift fails to compile. - const bound = ( - registry as unknown as { - activate: ( - socket: WebSocket, - identity: RelayTokenClaims, - existing: HostSession | null, - generation: number, - rebind: boolean, - assignmentEpoch: number, - appVersion: string, - connectionInclusionWatermark?: number - ) => Promise - } - ).activate.bind(registry) - const activate: ActivateSession = ( - socket, - identity, - existing, - generation, - rebind, - assignmentEpoch, - appVersion = '1.4.173' - ) => bound(socket, identity, existing, generation, rebind, assignmentEpoch, appVersion) - return { - registry, - activate, - acquireActivity, - renewControlActivities, - releaseActivity, - observer - } -} - -describe('host session cleanup races', () => { - beforeEach(() => vi.useFakeTimers()) - afterEach(() => { - vi.clearAllTimers() - vi.useRealTimers() - }) - - // c34 ghost seat came from activation outliving orphan grace and reviving a removed session outside the map. - it('refuses a rebind whose session left the map while its activation was in flight', async () => { - const blocked = deferred() - const activateControl = vi - .fn() - .mockResolvedValueOnce('control:production-gce-c3:1') - .mockReturnValueOnce(blocked.promise) - const { registry, activate, releaseActivity } = createRegistry(activateControl) - const key = { userId: identity.sub, relayHostId: identity.relayHostId } - const originalSocket = new FakeSocket() - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: FakeSocket implements the registry's WebSocket event and lifecycle surface. - await activate(originalSocket as unknown as WebSocket, identity, null, 1, false, 1) - const original = registry.get(key) - originalSocket.close(1006, 'network reset') - expect(original?.state).toBe('orphaned') - - const rebindSocket = new FakeSocket() - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: FakeSocket implements the registry's WebSocket event and lifecycle surface. - const rebinding = activate(rebindSocket as unknown as WebSocket, identity, original, 1, true, 1) - await vi.advanceTimersByTimeAsync(0) - // The grace runs out while the database answers slowly. - await vi.advanceTimersByTimeAsync(CONTROL_CONTINUITY_LIMITS.orphanGraceMs) - expect(registry.get(key)).toBeNull() - blocked.resolve('control:production-gce-c3:1') - await rebinding - - expect(rebindSocket.close).toHaveBeenCalledWith( - RELAY_CLOSE_CODE.PEER_DROPPED, - 'control activation superseded' - ) - expect(registry.get(key)).toBeNull() - expect(original?.state).toBe('closed') - const page = registry.seatFeed(null) - expect('full' in page && page.full).toEqual([]) - expect(releaseActivity).toHaveBeenCalledWith(key, 'control:production-gce-c3:1') - }) - - it('ignores a denial belonging to the socket before a same-generation rebind', async () => { - const h = createRegistry(vi.fn().mockResolvedValue('control:production-gce-c3:1')) - const oldSocket = new FakeSocket() - await h.activate(oldSocket as unknown as WebSocket, identity, null, 1, false, 1) - const session = h.registry.get({ userId: identity.sub, relayHostId: identity.relayHostId })! - let finish!: (outcomes: ControlRenewalOutcome[]) => void - h.renewControlActivities.mockReturnValueOnce( - new Promise((resolve) => { - finish = resolve - }) - ) - await vi.advanceTimersByTimeAsync(15_000) - await closeRenewalWindow() - const replacement = new FakeSocket() - await h.activate(replacement as unknown as WebSocket, identity, session, 1, true, 1) - finish(['activity_cell_not_authoritative']) - await vi.advanceTimersByTimeAsync(0) - expect(replacement.close).not.toHaveBeenCalled() - expect(session.socket).toBe(replacement) - expect(session.generation).toBe(1) - }) -}) - -describe('source-owned idle cutover', () => { - beforeEach(() => vi.useFakeTimers()) - afterEach(() => { - vi.clearAllTimers() - vi.useRealTimers() - }) - const request = { - attemptId: 'idle-1', - userId: identity.sub, - relayHostId: identity.relayHostId, - sourceAssignmentEpoch: 1, - sourceGeneration: 1, - sourceCellIncarnation: 'incarnation-1', - targetCellId: 'target' - } - async function source() { - const h = createRegistry(vi.fn().mockResolvedValue('control:1')) - const socket = new FakeSocket() - h.registry.acceptControl( - socket as unknown as WebSocket, - identity, - undefined, - new Set([RELAY_HOST_CAPABILITY_IDLE_REGIONAL_REHOME]) - ) - socket.removeAllListeners('message') - await h.activate(socket as unknown as WebSocket, identity, null, 1, false, 1) - // Moves the clock without firing the heartbeat timers that would close the session. - vi.setSystemTime(Date.now() + IDLE_REHOME_MIN_CONTROL_AGE_MS) - return { ...h, socket, session: h.registry.get(request)! } - } - - it('rejects new accepts and replacements synchronously while a commit awaits', async () => { - const h = await source() - const result = deferred<{ outcome: 'deferred' }>() - const commit = vi.fn().mockReturnValue(result.promise) - const moving = h.registry.idleRehome( - request, - commit, - vi.fn().mockResolvedValue('not-committed') - ) - const duplicate = h.registry.idleRehome( - request, - commit, - vi.fn().mockResolvedValue('not-committed') - ) - const client = new FakeSocket() - const release = vi.fn() - await h.registry.acceptClient( - client as unknown as WebSocket, - identity.relayHostId, - 'credential', - { release } as never - ) - expect(client.close).toHaveBeenCalledWith(RELAY_CLOSE_CODE.WRONG_CELL, expect.any(String)) - expect(release).toHaveBeenCalledOnce() - const replacement = new FakeSocket() - await h.activate(replacement as unknown as WebSocket, identity, h.session, 2, false, 1) - expect(replacement.close).toHaveBeenCalledWith(RELAY_CLOSE_CODE.WRONG_CELL, expect.any(String)) - result.resolve({ outcome: 'deferred' }) - await moving - await duplicate - expect(commit).toHaveBeenCalledOnce() - expect(h.socket.close).not.toHaveBeenCalled() - expect( - await h.registry.idleRehome( - { ...request, attemptId: 'next' }, - vi.fn().mockResolvedValue({ outcome: 'committed' }), - vi.fn().mockResolvedValue('not-committed') - ) - ).toEqual({ outcome: 'committed' }) - }) -}) diff --git a/cloud/apps/relay/src/host-whereabouts-app.test.ts b/cloud/apps/relay/src/host-whereabouts-app.test.ts deleted file mode 100644 index e8072835260..00000000000 --- a/cloud/apps/relay/src/host-whereabouts-app.test.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { describe, expect, it, vi } from 'vitest' -import type * as AdminTokenVerifier from './authentication/admin-token-verifier.js' -import type { HostWhereaboutsRow } from './assignment/assignment-store.js' -import { RelayAssignmentStore } from './assignment/assignment-store.js' -import type { RelayConfig } from './config.js' -import { openInMemoryRelayDatabase } from './database/database.js' -import { ShadowSeatDirectory } from './cell/seats/shadow-seat-directory.js' - -vi.mock('./authentication/admin-token-verifier.js', async (importOriginal) => { - const actual = await importOriginal() - const identities = new Map[0]>([ - ['deploy-token', 'deploy'], - ['capacity-token', 'capacity'] - ]) - return { - ...actual, - // The real route allow-list behind a token-to-identity stub. - createAdminTokenVerifier: () => async (token: string, route?: string) => { - const identity = identities.get(token) - if (identity === undefined) return false - return !route || actual.relayAdminIdentityMayAccess(identity, route) - }, - createReadOnlyAdminTokenVerifier: () => async () => false, - createRegionalRehomeControlApplyTokenVerifier: () => async () => false, - createRegionalRehomeRuntimeTokenVerifier: () => async () => false, - createRegionalRehomeTokenVerifier: () => async () => false, - createRuntimeTokenVerifier: () => async () => false - } -}) - -vi.mock('./authentication/relay-token-verifier.js', () => ({ - createRelayTokenVerifier: () => async () => null, - readBearer: (value: string | undefined) => value?.replace(/^Bearer /, '') ?? null -})) - -import { createRelayApp } from './app.js' - -const HOST = 'hhhhhhhhhhhhhhhh' -const ROW: HostWhereaboutsRow = { - cellId: 'cell-a', - assignmentEpoch: 3, - leaseExpiresAt: 5_000, - openMigration: null -} - -function request(body: unknown, token = 'deploy-token'): RequestInit { - return { - method: 'POST', - headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json' }, - body: JSON.stringify(body) - } -} - -function directory(): ShadowSeatDirectory { - const shadow = new ShadowSeatDirectory() - shadow.setCells(['cell-a', 'cell-b']) - shadow.apply( - 'cell-a', - { - v: 1, - cellId: 'cell-a', - incarnation: 'inc-a', - seq: 1, - at: 1, - flagsApplied: { generation: '7', flags: { readinessLocal: false } }, - full: [ - { - userId: 'user-a', - relayHostId: HOST, - epoch: 3, - generation: 1, - state: 'active', - joinedAt: 1 - } - ] - }, - Date.now() - ) - shadow.markNoFeed('cell-b', Date.now()) - return shadow -} - -function appWith( - hostWhereabouts: (identity: { userId: string; relayHostId: string }) => Promise, - options: { shadowSeats?: ShadowSeatDirectory; role?: RelayConfig['role'] } = {} -) { - return createRelayApp(config(options.role), { - store: {} as never, - // SAFETY: the whereabouts route reads only hostWhereabouts. - assignments: { hostWhereabouts } as never, - drain: vi.fn(), - ready: vi.fn(async () => true), - cellIncarnation: 'director-incarnation', - shadowSeats: options.shadowSeats - }) -} - -describe('POST /v1/admin/host-whereabouts', () => { - it('requires admin auth and a director', async () => { - const lookup = vi.fn(async () => ROW) - const app = appWith(lookup) - const body = { v: 1, relayHostId: HOST, userId: 'user-a' } - - expect((await app.request('/v1/admin/host-whereabouts', request(body, 'other'))).status).toBe( - 401 - ) - const cell = appWith(lookup, { role: 'cell' }) - expect((await cell.request('/v1/admin/host-whereabouts', request(body))).status).toBe(404) - expect( - (await app.request('/v1/admin/host-whereabouts', request({ ...body, extra: 1 }))).status - ).toBe(400) - }) - - - it('names the user from the map when the request has only a host id', async () => { - const lookup = vi.fn(async () => ROW) - const app = appWith(lookup, { shadowSeats: directory() }) - - const response = await app.request( - '/v1/admin/host-whereabouts', - request({ v: 1, relayHostId: HOST }) - ) - - expect(await response.json()).toMatchObject({ users: [{ userId: 'user-a', database: ROW }] }) - }) - - it('judges the verdict as /v1/resolve would when the row names a dead cell', async () => { - const shadow = directory() - // cell-a's heartbeat had already run out when the cell list was read. - shadow.setCells(['cell-a', 'cell-b'], ['cell-a', 'cell-b'], { - readAt: Date.now(), - expiresAt: new Map([ - ['cell-a', Date.now() - 1], - ['cell-b', Date.now() + 60_000] - ]) - }) - const app = appWith(async () => ROW, { shadowSeats: shadow }) - - const response = await app.request( - '/v1/admin/host-whereabouts', - request({ v: 1, relayHostId: HOST, userId: 'user-a' }) - ) - - expect(await response.json()).toMatchObject({ - users: [{ database: ROW, verdict: { class: 'map-only-cell-unlive', explained: true } }] - }) - }) -}) - -describe('RelayAssignmentStore.hostWhereabouts', () => { - it('reads the assignment row and its open migration by primary key', async () => { - const database = await openInMemoryRelayDatabase() - try { - const store = new RelayAssignmentStore(database, () => 100) - await store.reconcileCells([ - { id: 'cell-a', url: 'https://cell-a.example.test', capacityRequests: 10 }, - { id: 'cell-b', url: 'https://cell-b.example.test', capacityRequests: 10 } - ]) - const identity = { userId: 'user-a', relayHostId: HOST } - expect(await store.hostWhereabouts(identity)).toBeNull() - - await store.assign(identity) - - await database.query( - `INSERT INTO relay_assignment_migrations - (user_id, relay_host_id, source_cell_id, target_cell_id, previous_epoch, assignment_epoch, - source_request_units, target_reserved_units, expires_at, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, - ['user-a', HOST, 'cell-a', 'cell-b', 1, 2, 1, 1, 900, 100, 100] - ) - expect((await store.hostWhereabouts(identity))?.openMigration).toEqual({ - sourceCellId: 'cell-a', - targetCellId: 'cell-b', - previousEpoch: 1, - assignmentEpoch: 2, - expiresAt: 900, - targetRegisteredAt: null - }) - } finally { - await database.close() - } - }) -}) - -function config(role: RelayConfig['role'] = 'director'): RelayConfig { - return { - port: 8080, - publicUrl: 'https://relay.example.test', - cellUrl: 'https://relay.example.test', - authIssuer: 'https://auth.example.test', - authAudience: 'orca-relay', - jwksUrl: 'https://auth.example.test/jwks', - assignmentSigningKey: new TextEncoder().encode('assignment-key-with-at-least-32-bytes'), - role, - cellId: role === 'cell' ? 'cell-a' : 'director', - cells: [], - adminAudience: 'https://relay.example.test/v1/admin/drain', - deployServiceAccount: 'deploy@example.test', - runtimeServiceAccount: 'runtime@example.test', - adminJwksUrl: 'https://auth.example.test/jwks', - databasePoolMax: 3, - publicAssignmentsEnabled: true, - publicAssignmentConcurrency: 2, - publicAssignmentQueueMax: 128, - publicAssignmentWaitMs: 4_000, - publicResolveConcurrency: 1, - publicResolveWaitMs: 5_000, - publicAssignmentRetryAfterSeconds: 5, - dataDir: './data' - } -} From 42d9f4e0423200c85e0ec34b2be0332a969761ed Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:46:07 -0800 Subject: [PATCH 17/49] Name terminal agent hosts separately from Orca (#41848) * Name terminal agent hosts separately from Orca * Account for one startup process naming write * Use the Node runtime for the Linux naming contract --- config/main-sync-fs-baseline.txt | 1 + .../verify-packaged-daemon-entry.cjs | 4 +- .../macos-terminal-host-bundle.cjs | 17 +++-- .../macos-daemon-tcc-attribution.md | 15 +++- src/main/daemon/daemon-entry.ts | 2 + src/main/daemon/daemon-process-name.ts | 13 ++++ .../macos/macos-daemon-bundle-retirement.ts | 23 +++--- .../macos/macos-daemon-bundle.ts | 6 +- .../macos-daemon-bundle-retirement.test.ts | 25 ++++++- .../macos/testing/macos-daemon-bundle.test.ts | 19 ++--- .../testing/macos-daemon-launchd.test.ts | 2 +- .../daemon-process-name.integration.test.ts | 70 +++++++++++++++++++ 12 files changed, 161 insertions(+), 36 deletions(-) create mode 100644 src/main/daemon/daemon-process-name.ts create mode 100644 src/main/daemon/testing/daemon-process-name.integration.test.ts diff --git a/config/main-sync-fs-baseline.txt b/config/main-sync-fs-baseline.txt index 4952f5ff34b..04d9c48fd04 100644 --- a/config/main-sync-fs-baseline.txt +++ b/config/main-sync-fs-baseline.txt @@ -182,6 +182,7 @@ 5 src/main/daemon/admission/host-terminal-ledger.ts 1 src/main/daemon/admission/legacy-restore-records.ts 1 src/main/daemon/daemon-entry.ts +1 src/main/daemon/daemon-process-name.ts 1 src/main/daemon/endpoint/identity/daemon-endpoint-incarnation.ts 3 src/main/daemon/endpoint/identity/daemon-pid-identity.ts 2 src/main/daemon/endpoint/identity/daemon-pid-record-quarantine.ts diff --git a/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs index 2d51eb60881..dfef71717d9 100644 --- a/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs +++ b/config/scripts/desktop-distribution/runtime-verification/verify-packaged-daemon-entry.cjs @@ -3,7 +3,7 @@ const { spawn, spawnSync } = require('node:child_process') const { randomUUID } = require('node:crypto') const { connect } = require('node:net') const { tmpdir } = require('node:os') -const { join, relative } = require('node:path') +const { basename, join, relative } = require('node:path') const { setTimeout: delay } = require('node:timers/promises') const { macTerminalHostPaths @@ -267,7 +267,7 @@ async function verifyPackagedMacTerminalHostBoots(appPath, { arch, required }) { const stderr = [] // Boot clone outside build tree so ancestor node_modules cannot satisfy missing packaged dependency. const isolated = mkdtempSync(join(tmpdir(), 'orca-terminal-host-boot-')) - const clone = join(isolated, 'Orca Terminal Host.app') + const clone = join(isolated, basename(paths.bundle)) try { const cloned = spawnSync('/bin/cp', ['-cR', paths.bundle, clone], { encoding: 'utf8' }) if (cloned.status !== 0) { diff --git a/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs b/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs index 9d73f7f55fa..d81e208ae3c 100644 --- a/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs +++ b/config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs @@ -15,8 +15,8 @@ const { builtinModules } = require('node:module') const { basename, dirname, join, relative, resolve, sep } = require('node:path') const { pathToFileURL } = require('node:url') -const MAC_TERMINAL_HOST_NAME = 'Orca Terminal Host' -const MAC_TERMINAL_HOST_EXECUTABLE = 'orca-terminal-host' +const MAC_TERMINAL_HOST_NAME = 'Orca Agents' +const MAC_TERMINAL_HOST_EXECUTABLE = 'Orca Agents' const macTerminalHostSignIgnore = [`/Contents/Helpers/${MAC_TERMINAL_HOST_NAME}\\.app(/|$)`] const NODE_PTY_FILES = [ 'package.json', @@ -194,8 +194,8 @@ function buildMacTerminalHostInfo({ appInfo, usageDescriptions, minimumOs }) { return { ...usageDescriptions, CFBundleIdentifier: appInfo.CFBundleIdentifier, - CFBundleName: 'Orca', - CFBundleDisplayName: 'Orca', + CFBundleName: MAC_TERMINAL_HOST_NAME, + CFBundleDisplayName: MAC_TERMINAL_HOST_NAME, CFBundleExecutable: MAC_TERMINAL_HOST_EXECUTABLE, CFBundlePackageType: 'APPL', CFBundleInfoDictionaryVersion: '6.0', @@ -210,6 +210,15 @@ function buildMacTerminalHostInfo({ appInfo, usageDescriptions, minimumOs }) { function findMacTerminalHostInfoProblems(info, { appId, usageDescriptions, minimumOs }) { const problems = [] + for (const [key, expected] of Object.entries({ + CFBundleName: MAC_TERMINAL_HOST_NAME, + CFBundleDisplayName: MAC_TERMINAL_HOST_NAME, + CFBundleExecutable: MAC_TERMINAL_HOST_EXECUTABLE + })) { + if (info[key] !== expected) { + problems.push(`${key} is ${info[key]}, expected ${expected}`) + } + } if (info.CFBundleIdentifier !== appId) { problems.push(`CFBundleIdentifier is ${info.CFBundleIdentifier}, expected ${appId}`) } diff --git a/docs/agents-md-refs/macos-daemon-tcc-attribution.md b/docs/agents-md-refs/macos-daemon-tcc-attribution.md index 5515ab519a5..796d89894c6 100644 --- a/docs/agents-md-refs/macos-daemon-tcc-attribution.md +++ b/docs/agents-md-refs/macos-daemon-tcc-attribution.md @@ -14,13 +14,14 @@ protected files keeps working after its old executable is deleted. So a packaged macOS GUI app starts its daemon from a private copy that the updater never touches: -- Each packaged macOS app ships a signed helper, `Contents/Helpers/Orca Terminal Host.app` (about +- Each packaged macOS app ships a signed helper, `Contents/Helpers/Orca Agents.app` (about 124 MiB): the pinned Node from `src/shared/node-runtime-pin.ts` as its main executable, the - daemon's `out/main` JS and that slice's node-pty. `config/scripts/macos-terminal-host-bundle.cjs` + daemon's `out/main` JS and that slice's node-pty. + `config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs` builds and signs it in `afterPack`, boots it through one PTY round trip, and fails the build on any layout, Info.plist, OS floor, architecture or signature drift. - `macos-daemon-bundle.ts` keeps one copy per helper build, named by the helper's CDHash, at - `userData/daemon-host/macos/terminal-host-/app.noindex/Orca Terminal Host.app`. The helper + `userData/daemon-host/macos/terminal-host-/app.noindex/Orca Agents.app`. The helper is read from the bundle the running main process executes from, never the whole app. A present copy is reused as is. Otherwise the helper is cloned (APFS clone, regular copy otherwise) into a `.staging--*` sibling, verified once with @@ -55,6 +56,12 @@ Signing the helper with the app's own identifier lets it inherit every existing Disk Access, which a user can only add by hand. A distinct identifier would be a new client: new folder prompts naming it, and a new Full Disk Access row for every user. +The helper's bundle, executable and display name are `Orca Agents`; its identifier, signing team +and designated requirement still match Orca.app. This names the existing terminal-agent process +without changing its privacy client. Native chat providers still run under the GUI process. An +adopted older daemon keeps its original name until it exits; the fork fallback and Windows names +are unchanged. + ## macOS floor The helper's Node declares `LC_BUILD_VERSION minos 13.5`, which is also the helper's @@ -108,6 +115,8 @@ The helper declares no links, documents or types, has a lower `CFBundleVersion` `.noindex` folder, which Spotlight skips, and Orca never registers them. Starting the daemon through launchd leaves no record, but another process running the copy's executable directly can make macOS register it, so retirement runs `lsregister -u` on the bundle before deleting it. +Retirement recognizes both `Orca Agents.app` and the legacy `Orca Terminal Host.app` inside unused +copies, so changing the current bundle name does not leave old LaunchServices registrations behind. The helper's main-executable UUID is Node's, shared by every official Node 24.21.0 binary of that architecture, so it is not unique to Orca. Local Network access still passed in the signed spike: diff --git a/src/main/daemon/daemon-entry.ts b/src/main/daemon/daemon-entry.ts index 7fcbbd801d3..09524f343cc 100644 --- a/src/main/daemon/daemon-entry.ts +++ b/src/main/daemon/daemon-entry.ts @@ -29,10 +29,12 @@ import { startDaemonScopeDeathWatch } from './process-scopes/daemon-scope-death- import { isWindowsProcessTableAvailable } from '../windows/windows-process-table' import { leaseAppImageGenerationForCurrentProcess } from '../cli/appimage/appimage-generation-lease' import { createDaemonShutdownDeadline } from './launch/daemon-shutdown-deadline' +import { setDaemonProcessName } from './daemon-process-name' async function main(): Promise { // The parent closes startup stderr after readiness; later EPIPE errors must not kill the daemon. process.stderr.on('error', () => {}) + setDaemonProcessName() const { socketPath, diff --git a/src/main/daemon/daemon-process-name.ts b/src/main/daemon/daemon-process-name.ts new file mode 100644 index 00000000000..188422f9650 --- /dev/null +++ b/src/main/daemon/daemon-process-name.ts @@ -0,0 +1,13 @@ +import { writeFileSync } from 'node:fs' + +export function setDaemonProcessName(): void { + if (process.platform !== 'linux') { + return + } + try { + // process.title overwrites argv, which daemon adoption and recovery use as identity evidence. + writeFileSync('/proc/self/comm', 'orca-agents') + } catch { + // Naming must not prevent terminals starting when procfs is unavailable or read-only. + } +} diff --git a/src/main/daemon/executable-host/macos/macos-daemon-bundle-retirement.ts b/src/main/daemon/executable-host/macos/macos-daemon-bundle-retirement.ts index 08ae78c820a..7982fc78158 100644 --- a/src/main/daemon/executable-host/macos/macos-daemon-bundle-retirement.ts +++ b/src/main/daemon/executable-host/macos/macos-daemon-bundle-retirement.ts @@ -2,7 +2,7 @@ import { readdir } from 'node:fs/promises' import { join } from 'node:path' import { runProcess } from '@orca/process-host' import { rm } from '../../../filesystem/asar-transparent-fs' -import { macDaemonCopyBundlePath } from './macos-daemon-bundle' +import { MAC_TERMINAL_HOST_BUNDLE } from './macos-daemon-bundle' const LSREGISTER = '/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister' @@ -27,13 +27,20 @@ export async function retireUnusedMacDaemonCopy(directory: string): Promise {}) + // Old copies retain their original bundle name when the helper is renamed. + const parent = join(directory, 'app.noindex') + const bundles = await readdir(parent).catch(() => []) + for (const bundle of bundles) { + if (bundle !== MAC_TERMINAL_HOST_BUNDLE && bundle !== 'Orca Terminal Host.app') { + continue + } + await runProcess({ + program: LSREGISTER, + args: ['-u', join(parent, bundle)], + timeoutMs: 5_000, + maxOutputBytes: 8192 + }).catch(() => {}) + } await rm(directory, { recursive: true, force: true }) } catch { // Retain code when its use cannot be verified. diff --git a/src/main/daemon/executable-host/macos/macos-daemon-bundle.ts b/src/main/daemon/executable-host/macos/macos-daemon-bundle.ts index ecdcfe54fa1..65e8eb7a190 100644 --- a/src/main/daemon/executable-host/macos/macos-daemon-bundle.ts +++ b/src/main/daemon/executable-host/macos/macos-daemon-bundle.ts @@ -7,9 +7,9 @@ import { rm } from '../../../filesystem/asar-transparent-fs' import { ensurePrivateDir } from '../../endpoint/publication/daemon-private-file-modes' import { inspectMacProcessCodeIdentity } from './daemon-mac-code-identity' -/** Plain Node helper packaged by config/scripts/macos-terminal-host-bundle.cjs. */ -export const MAC_TERMINAL_HOST_BUNDLE = 'Orca Terminal Host.app' -export const MAC_TERMINAL_HOST_EXECUTABLE = 'orca-terminal-host' +/** Plain Node helper packaged by config/scripts/macos/terminal-host-bundle/macos-terminal-host-bundle.cjs. */ +export const MAC_TERMINAL_HOST_BUNDLE = 'Orca Agents.app' +export const MAC_TERMINAL_HOST_EXECUTABLE = 'Orca Agents' export const MAC_DAEMON_COPY_PREFIX = 'terminal-host-' export type MacDaemonBundle = { diff --git a/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle-retirement.test.ts b/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle-retirement.test.ts index 091f660c456..61988c9001e 100644 --- a/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle-retirement.test.ts +++ b/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle-retirement.test.ts @@ -29,9 +29,9 @@ afterEach(async () => { await rm(root, { recursive: true, force: true }) }) -async function copy(name: string): Promise { +async function copy(name: string, bundle = 'Orca Agents.app'): Promise { const directory = join(root, name) - await mkdir(join(directory, 'app.noindex', 'Orca Terminal Host.app'), { recursive: true }) + await mkdir(join(directory, 'app.noindex', bundle), { recursive: true }) return directory } @@ -68,6 +68,27 @@ it.each([ expect(await exists(directory)).toBe(true) }) +it.each(['Orca Agents.app', 'Orca Terminal Host.app'])( + 'unregisters an unused %s before deleting its copy', + async (bundle) => { + const directory = await copy('terminal-host-old', bundle) + run.mockImplementation(async (spec) => { + if (spec.program === LSREGISTER) { + expect(await exists(directory)).toBe(true) + } + return unused + }) + await retireUnusedMacDaemonCopy(directory) + expect(run).toHaveBeenCalledWith( + expect.objectContaining({ + program: LSREGISTER, + args: ['-u', join(directory, 'app.noindex', bundle)] + }) + ) + expect(await exists(directory)).toBe(false) + } +) + it("retires every unused copy and staging dir except the current build's and this process's staging", async () => { const current = await copy('terminal-host-current') const oldUnused = await copy('terminal-host-old') diff --git a/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle.test.ts b/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle.test.ts index 28c8b3d75b4..450f0bbfac1 100644 --- a/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle.test.ts +++ b/src/main/daemon/executable-host/macos/testing/macos-daemon-bundle.test.ts @@ -35,13 +35,13 @@ let verifyCode: number let onCopy: (() => Promise) | null const signal = (): AbortSignal => new AbortController().signal -const helperExecutable = (): string => join(helper, 'Contents', 'MacOS', 'orca-terminal-host') +const helperExecutable = (): string => join(helper, 'Contents', 'MacOS', 'Orca Agents') beforeEach(async () => { root = await realpath(await mkdtemp(join(tmpdir(), 'orca-mac-runtime-'))) // Model an update that moved the running bundle and replaced its original path. source = join(root, 'com.stablyai.orca.ShipIt.old', 'Orca.app') - helper = join(source, 'Contents', 'Helpers', 'Orca Terminal Host.app') + helper = join(source, 'Contents', 'Helpers', 'Orca Agents.app') copies = join(root, 'profile', 'daemon-host', 'macos') await mkdir(join(source, 'Contents', 'MacOS'), { recursive: true }) await mkdir(join(helper, 'Contents', 'MacOS'), { recursive: true }) @@ -101,14 +101,7 @@ it('publishes one verified copy per helper build, from the running app rather th await rm(source, { recursive: true }) expect(copy.directory).toBe(join(copies, `terminal-host-${cdhash}`)) expect(copy.execPath).toBe( - join( - copy.directory, - 'app.noindex', - 'Orca Terminal Host.app', - 'Contents', - 'MacOS', - 'orca-terminal-host' - ) + join(copy.directory, 'app.noindex', 'Orca Agents.app', 'Contents', 'MacOS', 'Orca Agents') ) expect(await readFile(copy.execPath, 'utf8')).toBe('signed-node') expect(await readFile(copy.entryPath, 'utf8')).toBe('daemon-code') @@ -136,9 +129,9 @@ it("rejects a copy that does not satisfy the running app's requirement and publi it('keeps the winning copy when a concurrent publisher renames first', async () => { onCopy = async () => { onCopy = null - const winner = join(copies, `terminal-host-${cdhash}`, 'app.noindex', 'Orca Terminal Host.app') + const winner = join(copies, `terminal-host-${cdhash}`, 'app.noindex', 'Orca Agents.app') await cp(helper, winner, { recursive: true }) - await writeFile(join(winner, 'Contents', 'MacOS', 'orca-terminal-host'), 'winner') + await writeFile(join(winner, 'Contents', 'MacOS', 'Orca Agents'), 'winner') } const copy = await materializeMacDaemonBundle(copies, signal()) expect(await readFile(copy.execPath, 'utf8')).toBe('winner') @@ -155,7 +148,7 @@ it('stops at the shared deadline and removes the staging copy', async () => { return controller.signal.aborted ? { ...ok, code: null } : (signed?.(spec) ?? ok) }) await expect(materializeMacDaemonBundle(copies, controller.signal)).rejects.toThrow( - 'Could not copy Orca Terminal Host.app' + 'Could not copy Orca Agents.app' ) expect(await readdir(copies)).toEqual([]) }) diff --git a/src/main/daemon/executable-host/macos/testing/macos-daemon-launchd.test.ts b/src/main/daemon/executable-host/macos/testing/macos-daemon-launchd.test.ts index ae57f9a34a4..4422d64ff2e 100644 --- a/src/main/daemon/executable-host/macos/testing/macos-daemon-launchd.test.ts +++ b/src/main/daemon/executable-host/macos/testing/macos-daemon-launchd.test.ts @@ -92,7 +92,7 @@ const nativePlatform = process.platform const originalGetuid = Object.getOwnPropertyDescriptor(process, 'getuid') const originalGetSystemVersion = Object.getOwnPropertyDescriptor(process, 'getSystemVersion') const roomyDeadline = (): number => Date.now() + 60_000 -const helperExec = (): string => join(copyDir, 'MacOS', 'orca-terminal-host') +const helperExec = (): string => join(copyDir, 'MacOS', 'Orca Agents') const helperEntry = (): string => join(copyDir, 'daemon-entry.js') const service = (): string => `gui/501/${macDaemonJobLabel(state.root)}` const launchctlCalls = (verb: string): ProcessSpec[] => diff --git a/src/main/daemon/testing/daemon-process-name.integration.test.ts b/src/main/daemon/testing/daemon-process-name.integration.test.ts new file mode 100644 index 00000000000..67273230b47 --- /dev/null +++ b/src/main/daemon/testing/daemon-process-name.integration.test.ts @@ -0,0 +1,70 @@ +import { once } from 'node:events' +import { createInterface } from 'node:readline' +import { spawnProcess } from '@orca/process-host' +import { describe, expect, it } from 'vitest' +import { inspectDaemonProcessIdentity } from '../endpoint/identity/daemon-pid-identity' + +const namingModule = new URL('../daemon-process-name.ts', import.meta.url) + +describe.skipIf(process.platform !== 'linux')('Linux daemon process naming', () => { + it.each([false, true])( + 'preserves live daemon identity when naming writes are denied: %s', + async (denyWrites) => { + const socketPath = '/tmp/orca naming contract/daemon.sock' + const tokenPath = `/tmp/orca naming contract/${'long endpoint component/'.repeat(12)}daemon.token` + const script = ` + import { readFileSync } from 'node:fs' + import { setDaemonProcessName } from ${JSON.stringify(namingModule.href)} + const before = readFileSync('/proc/self/cmdline').toString('base64') + const beforeName = readFileSync('/proc/self/comm').toString('base64') + setDaemonProcessName() + process.stdin.resume() + console.log([ + before, + readFileSync('/proc/self/cmdline').toString('base64'), + beforeName, + readFileSync('/proc/self/comm').toString('base64') + ].join(' ')) + ` + const child = spawnProcess({ + program: process.env.ORCA_TEST_NODE_EXECUTABLE ?? process.execPath, + args: [ + ...(denyWrites ? ['--permission', '--allow-fs-read=*'] : []), + '--input-type=module', + '-e', + script, + '--', + 'daemon-entry.js', + '--socket', + socketPath, + '--token', + tokenPath + ] + }) + const exited = once(child, 'exit') + const lines = createInterface({ input: child.stdout }) + try { + const [line] = await Promise.race([ + once(lines, 'line'), + exited.then(() => { + throw new Error('Naming fixture exited before publishing its process identity') + }) + ]) + const [before, after, beforeName, afterName] = String(line).split(' ') + expect(Buffer.from(before, 'base64').toString()).toContain(tokenPath) + expect(after).toBe(before) + expect(Buffer.from(afterName, 'base64').toString()).toBe( + denyWrites ? Buffer.from(beforeName, 'base64').toString() : 'orca-agents\n' + ) + expect(child.pid).toBeDefined() + expect( + await inspectDaemonProcessIdentity(child.pid ?? 0, socketPath, tokenPath, null) + ).toBe('match') + } finally { + lines.close() + child.stdin.end() + await exited + } + } + ) +}) From 60209cd4d2bae81b95b23a9880ca7bb232783a1b Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:47:21 -0800 Subject: [PATCH 18/49] fix(crash-reporting): stop forcing a renderer GC every 30 s while memory stays high (#42133) * fix(crash-reporting): read renderer allocation profiles only on heap growth Each sampling-profile read makes V8 run a full renderer GC first, and the old 30 s refresh paid that pause for as long as a window's heap stayed high. Main's 30 s tick now asks only for heap usage (no GC); a profile is read once after one interval and then only after 5% of the limit of further growth. Stopping detaches instead of calling stopSampling, which also forced a GC. Co-Authored-By: Claude Opus 5.5 (1M context) * fix(crash-reporting): take the baseline profile on main's first heap check Tie the no-growth baseline read to main's first heap check instead of a wall-clock deadline, so a clock correction can't postpone it, and ignore non-finite heap readings. Co-Authored-By: Claude Opus 5.5 (1M context) --------- Co-authored-by: Claude Opus 5.5 (1M context) --- .../renderer-heap-allocation-profile.ts | 101 +++++++++++++----- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/src/main/crash-reporting/memory/renderer-heap-allocation-profile.ts b/src/main/crash-reporting/memory/renderer-heap-allocation-profile.ts index a09aa66bdd3..2fd412f59fc 100644 --- a/src/main/crash-reporting/memory/renderer-heap-allocation-profile.ts +++ b/src/main/crash-reporting/memory/renderer-heap-allocation-profile.ts @@ -14,8 +14,10 @@ import { const SAMPLING_INTERVAL_BYTES = 512 * 1024 const START_HEAP_RATIO = 0.6 const STOP_HEAP_RATIO = 0.5 -// Main refreshes independently because hidden renderers throttle memory samples. -const PROFILE_REFRESH_MS = 30_000 +// Each profile read forces a full renderer GC, so after the first read require this much growth. +const PROFILE_READ_GROWTH_RATIO = 0.05 +// Main checks the heap itself because hidden renderers throttle memory samples. +const HEAP_CHECK_MS = 30_000 export type ProfiledDebugger = { isAttached(): boolean @@ -61,8 +63,8 @@ export function profiledRendererFor(contents: WebContents): ProfiledRenderer { export type RendererHeapReading = { heapRatio: number + heapLimitBytes: number rendererSurface: string - isHighwaterMark: boolean } type SamplingSession = { @@ -70,9 +72,13 @@ type SamplingSession = { startedAtPct: number startedAtMs: number trustedScriptPrefix: string | null + heapLimitBytes: number + admittedHeapRatio: number + profileReadAdmitted: boolean // Wait for startSampling before requesting a profile. ready: boolean reading: boolean + checking: boolean stop: () => void } @@ -94,23 +100,31 @@ export function noteRendererHeapReading( } return } - if (reading.heapRatio < STOP_HEAP_RATIO) { + noteSessionHeapRatio(renderer, session, reading.heapRatio, false, record) +} + +function noteSessionHeapRatio( + renderer: ProfiledRenderer, + session: SamplingSession, + heapRatio: number, + fromHeapCheck: boolean, + record: (data: CrashReportBreadcrumbData) => void +): void { + if (heapRatio < STOP_HEAP_RATIO) { session.stop() return } - if (reading.isHighwaterMark) { - refreshProfile(renderer, session, record) - } -} - -function refreshProfile( - renderer: ProfiledRenderer, - session: SamplingSession, - record: (data: CrashReportBreadcrumbData) => void -): void { if (!session.ready || session.reading) { return } + // The first heap check reads even without growth so a steady high heap still has evidence. + const firstReadDue = fromHeapCheck && !session.profileReadAdmitted + if (!firstReadDue && heapRatio < session.admittedHeapRatio + PROFILE_READ_GROWTH_RATIO) { + return + } + // Admission, not success, consumes the allowance: a failed read may already have paid for its GC. + session.profileReadAdmitted = true + session.admittedHeapRatio = Math.max(session.admittedHeapRatio, heapRatio) session.reading = true void renderer.debugger .sendCommand('HeapProfiler.getSamplingProfile') @@ -137,7 +151,7 @@ function startSampling( record: (data: CrashReportBreadcrumbData) => void ): void { const debug = renderer.debugger - // Do not take over a debugger attached by DevTools or another diagnostic client. + // Only sees Orca's own debugger client (the lag capture); other CDP sessions are not visible here. if (debug.isAttached()) { return } @@ -159,7 +173,7 @@ function startSampling( debug.removeListener('detach', onDetach) unwatch() if (!renderer.isDestroyed() && debug.isAttached()) { - void debug.sendCommand('HeapProfiler.stopSampling').catch(() => undefined) + // Detaching ends the inspector session, which stops sampling without stopSampling's forced GC. try { debug.detach() } catch { @@ -175,8 +189,12 @@ function startSampling( startedAtPct: Math.round(reading.heapRatio * 100), startedAtMs: Date.now(), trustedScriptPrefix: trustedScriptPrefixFor(renderer.getURL()), + heapLimitBytes: reading.heapLimitBytes, + admittedHeapRatio: reading.heapRatio, + profileReadAdmitted: false, ready: false, reading: false, + checking: false, stop } sessions.set(renderer.id, session) @@ -192,15 +210,40 @@ function startSampling( return } session.ready = true - refreshTimer = setInterval( - () => refreshProfile(renderer, session, record), - PROFILE_REFRESH_MS - ) + refreshTimer = setInterval(() => checkHeap(renderer, session, record), HEAP_CHECK_MS) refreshTimer.unref?.() }) .catch(stop) } +function checkHeap( + renderer: ProfiledRenderer, + session: SamplingSession, + record: (data: CrashReportBreadcrumbData) => void +): void { + if (session.checking) { + return + } + session.checking = true + void renderer.debugger + .sendCommand('Runtime.getHeapUsage') + .then((result) => { + const used = + result && typeof result === 'object' && 'usedSize' in result ? result.usedSize : undefined + if ( + typeof used === 'number' && + Number.isFinite(used) && + sessions.get(renderer.id) === session + ) { + noteSessionHeapRatio(renderer, session, used / session.heapLimitBytes, true, record) + } + }) + .catch(() => undefined) + .finally(() => { + session.checking = false + }) +} + export function profileRendererMemoryBreadcrumb( renderer: ProfiledRenderer, args: { name?: unknown; data?: unknown } | undefined, @@ -217,21 +260,29 @@ export function profileRendererMemoryBreadcrumb( function readHeapReading( args: { name?: unknown; data?: unknown } | undefined ): RendererHeapReading | null { - const isHighwaterMark = args?.name === 'renderer_memory_highwater' const data = args?.data - if ((!isHighwaterMark && args?.name !== 'renderer_memory') || !data || typeof data !== 'object') { + if ( + (args?.name !== 'renderer_memory_highwater' && args?.name !== 'renderer_memory') || + !data || + typeof data !== 'object' + ) { return null } const used = 'usedHeapMB' in data ? data.usedHeapMB : undefined const limit = 'heapLimitMB' in data ? data.heapLimitMB : undefined - if (typeof used !== 'number' || typeof limit !== 'number' || !(limit > 0)) { + if ( + typeof used !== 'number' || + !Number.isFinite(used) || + typeof limit !== 'number' || + !(limit > 0) + ) { return null } const surface = 'rendererSurface' in data ? data.rendererSurface : undefined return { heapRatio: used / limit, - rendererSurface: typeof surface === 'string' ? surface : 'unknown', - isHighwaterMark + heapLimitBytes: limit * 1024 * 1024, + rendererSurface: typeof surface === 'string' ? surface : 'unknown' } } From e748732cad6901fe819f9b194ca7d385f8e60874 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 13:49:08 -0800 Subject: [PATCH 19/49] test: remove redundant relay workflows and shutdown probe (#42142) Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- .../cell-phone-path.blackbox.test.ts | 136 +------------ cloud/apps/relay/src/edge-relay.test.ts | 11 -- .../relay/src/regional-host-drain-app.test.ts | 92 --------- cloud/apps/relay/src/relay-region-app.test.ts | 181 ------------------ .../src/relay-sigterm-exit.blackbox.test.ts | 127 ------------ 5 files changed, 2 insertions(+), 545 deletions(-) delete mode 100644 cloud/apps/relay/src/relay-region-app.test.ts delete mode 100644 cloud/apps/relay/src/relay-sigterm-exit.blackbox.test.ts diff --git a/cloud/apps/relay/src/connections/cell-phone-path.blackbox.test.ts b/cloud/apps/relay/src/connections/cell-phone-path.blackbox.test.ts index 822c12000a3..f41cd74388a 100644 --- a/cloud/apps/relay/src/connections/cell-phone-path.blackbox.test.ts +++ b/cloud/apps/relay/src/connections/cell-phone-path.blackbox.test.ts @@ -2,11 +2,9 @@ import { mkdtempSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' -import { reserveDeadManWindowMs } from '../cell/reservations/cell-reserve-dead-man.js' import { openRelayDatabase } from '../database/database.js' import { nextFrame, - RESERVE_MODE_CELL_ID, startReserveModeCell } from '../test-fixtures/reserve-mode-cell.js' import { StatementRecordingDatabase } from '../test-fixtures/statement-recording-database.js' @@ -22,14 +20,6 @@ const OTHER_CELL = { capacityRequests: 900 } -async function until(check: () => Promise, timeoutMs = 10_000): Promise { - const deadline = Date.now() + timeoutMs - while (!(await check())) { - if (Date.now() > deadline) throw new Error('condition not reached') - await new Promise((resolve) => setTimeout(resolve, 50)) - } -} - describe('the memory phone path', () => { const cleanup: Array<() => Promise | void> = [] @@ -67,14 +57,12 @@ describe('the memory phone path', () => { // A phone resumed and spliced to its desktop, waiting to confirm. async function splicedPhone( phonePath: 'db' | 'memory', - device: { expiresAt?: number } = {}, - clock: { now?: () => number; beforeDial?: () => void } = {} + device: { expiresAt?: number } = {} ) { - const reserve = await cell(clock.now) + const reserve = await cell() reserve.setAdmitMode('reserve', { phonePath }) const seated = await reserve.bookedHost(3) await reserve.installDevice(seated.identity.hostId, TOKEN, device) - clock.beforeDial?.() const connOpen = nextFrame(seated.socket, 'conn-open') const phone = await reserve.dialPhone(seated.identity.hostId, TOKEN) const basisConnId = String((await connOpen).connId) @@ -97,44 +85,6 @@ describe('the memory phone path', () => { const deviceRow = async (reserve: Awaited>) => (await reserve.raw.query(`SELECT current_expires_at FROM relay_devices`))[0] - it('admits a seated phone resume without an activity lease', async () => { - const { reserve, seated } = await seatedPhoneHost('memory') - const connOpen = nextFrame(seated.socket, 'conn-open') - const phone = await reserve.dialPhone(seated.identity.hostId, TOKEN) - expect(await connOpen).toMatchObject({ kind: 'resume', relayDeviceId: 'device-1' }) - await reserve.attachData(await connOpen, seated.ack.generation) - expect(await phone.hello).toMatchObject({ - type: 'relay-hello', - ok: true, - credentialKind: 'resume' - }) - expect(await reserve.activityLeases()).toEqual([]) - }) - - it('persists the connection basis and activity leases while phonePath is db', async () => { - const { reserve, seated } = await seatedPhoneHost('db') - const connOpen = nextFrame(seated.socket, 'conn-open') - const phone = await reserve.dialPhone(seated.identity.hostId, TOKEN) - await reserve.attachData(await connOpen, seated.ack.generation) - expect(await phone.hello).toMatchObject({ type: 'relay-hello', ok: true }) - expect((await reserve.activityLeases()).map((lease) => lease.activity_kind).sort()).toEqual([ - 'confirmation', - 'splice' - ]) - expect( - await reserve.raw.query( - `SELECT basis_conn_id, relay_device_id, credential_kind, active FROM relay_connection_bases` - ) - ).toEqual([ - { - basis_conn_id: String((await connOpen).connId), - relay_device_id: 'device-1', - credential_kind: 'resume', - active: 1 - } - ]) - }) - it('closes a revoked or expired device 4401', async () => { const reserve = await cell() reserve.setAdmitMode('reserve', { phonePath: 'memory' }) @@ -275,24 +225,6 @@ describe('the memory phone path', () => { expect(await confirm('confirm-2')).toMatchObject({ code: 'confirmation_not_active' }) }) - it('answers a grace-version confirm renewed:false with its expiry unchanged, as today', async () => { - const { reserve, confirm } = await splicedPhone('memory') - const stored = Number((await deviceRow(reserve))?.current_expires_at) - // An install rotated the credential after the accept read, so the accepted version is grace. - await reserve.raw.query( - `UPDATE relay_devices SET grace_hash = current_hash, grace_version = 1, grace_expires_at = ?, - current_hash = 'rotated', current_version = 2`, - [Date.now() + 60_000] - ) - expect(await confirm('confirm-1')).toMatchObject({ - type: 'device-resume-confirmed', - currentVersion: 2, - acceptedAs: 'current', - renewed: false, - resumeExpiresAt: stored - }) - }) - it('durably confirms and renews a database-path resume, releasing only its confirmation lease', async () => { const { reserve, confirm, basisConnId } = await splicedPhone('db') const before = Number((await deviceRow(reserve))?.current_expires_at) @@ -314,70 +246,6 @@ describe('the memory phone path', () => { expect(await confirm('confirm-1')).toEqual(answer) }) - describe('rolling a memory cell back', () => { - // Flip back by the switch, or by the dead-man; either way the confirm finishes from memory. - type Cell = Awaited> - type Advance = (ms: number) => void - type Rollback = { - beforeDial?: (advance: Advance) => void - roll: (reserve: Cell, advance: Advance) => void - } - // The dead-man trips just after the phone's accept: its window ran from the host's booking. - const window = reserveDeadManWindowMs(RESERVE_MODE_CELL_ID) - const rollbacks: Record = { - 'admitMode=db': { roll: (reserve) => reserve.setAdmitMode('db', { phonePath: 'memory' }) }, - 'phonePath=db': { roll: (reserve) => reserve.setAdmitMode('reserve', { phonePath: 'db' }) }, - 'a dead-man trip': { - beforeDial: (advance) => advance(window - 5_000), - roll: (_reserve, advance) => advance(6_000) - } - } - - for (const [name, rollback] of Object.entries(rollbacks)) { - it(`finishes an in-flight confirm on its memory basis after ${name}, writing and leaking no lease`, async () => { - let now = Date.now() - const advance: Advance = (ms) => { - now += ms - } - const spliced = await splicedPhone( - 'memory', - {}, - { - now: () => now, - beforeDial: () => rollback.beforeDial?.(advance) - } - ) - const { reserve, seated } = spliced - // The flag tool records reserve in Postgres before the cell admits from memory. - await reserve.relay.assignments.reconcileCells([...reserve.config.cells, OTHER_CELL]) - await reserve.relay.assignments.setCellAdmitMode(reserve.config.cellId, 'reserve') - rollback.roll(reserve, advance) - expect(reserve.relay.sessions.phonePathEffective()).toBe('db') - expect(await spliced.confirm('confirm-1')).toMatchObject({ - type: 'device-resume-confirmed', - renewed: true - }) - // Only the control lease a flip back re-registers; nothing for the phone. - const leases = async () => - (await reserve.activityLeases()).map((lease) => lease.activity_kind) - expect((await leases()).filter((kind) => kind !== 'control')).toEqual([]) - // Postgres still records reserve, so evacuation leaves the cell alone. - await expect( - reserve.relay.assignments.startEvacuation( - { userId: 'user-1', relayHostId: seated.identity.hostId }, - OTHER_CELL.id - ) - ).rejects.toThrow('cell_in_reserve_mode') - // The splice still runs, and closing it releases nothing it never took. - expect(spliced.phone.socket.readyState).toBe(spliced.phone.socket.OPEN) - await until(async () => reserve.relay.sessions.reregistrationPending() === 0) - spliced.phone.socket.close() - await spliced.phone.closed - expect((await leases()).filter((kind) => kind !== 'control')).toEqual([]) - }) - } - }) - // E-dep-6 in miniature: the staging drill blocks one memory cell's database for 10 minutes. it('rides out a database outage: splices keep forwarding, new work fails cleanly and recovers', async () => { let now = Date.now() diff --git a/cloud/apps/relay/src/edge-relay.test.ts b/cloud/apps/relay/src/edge-relay.test.ts index 43b62345ee4..f39f1631332 100644 --- a/cloud/apps/relay/src/edge-relay.test.ts +++ b/cloud/apps/relay/src/edge-relay.test.ts @@ -129,15 +129,4 @@ describe('edge move', () => { expect(moved.assignmentEpoch).toBe(placed.assignmentEpoch + 4) }) - it('rolls back: with the cohort off, the host is re-placed on GCE above the edge epoch', async () => { - const { database, store, edge } = await setup({ requireLiveCells: true }) - await edge.ensureEdgeCell() - await store.assign(IDENTITY) - await settle(database) - const moved = await edge.moveToEdge(IDENTITY, 0) - const back = await store.assign(IDENTITY) - expect(back.cellId).toBe(GCE_CELL.id) - expect(back.assignmentEpoch).toBeGreaterThan(moved.assignmentEpoch) - expect(await edge.edgeAssignment(IDENTITY)).toBeNull() - }) }) diff --git a/cloud/apps/relay/src/regional-host-drain-app.test.ts b/cloud/apps/relay/src/regional-host-drain-app.test.ts index 566843673df..5658c294633 100644 --- a/cloud/apps/relay/src/regional-host-drain-app.test.ts +++ b/cloud/apps/relay/src/regional-host-drain-app.test.ts @@ -87,7 +87,6 @@ describe('idle regional cutover endpoint', () => { }) describe('regional host drain endpoint', () => { - it('accepts only the dedicated identity and exact cell generation', async () => { const drainHost = vi.fn(() => 'accepted' as const) const app = createRelayApp(config(), { @@ -116,22 +115,6 @@ describe('regional host drain endpoint', () => { expect(drainHost).toHaveBeenCalledOnce() }) - it('rejects a failed asynchronous drain instead of acknowledging it', async () => { - const app = createRelayApp(config(), { - store: {} as never, - assignments: {} as never, - drain: vi.fn(), - drainHost: async () => { - throw new Error('activity_cell_not_authoritative') - }, - cellIncarnation, - ready: vi.fn(async () => true) - }) - const response = await post(app, 'rehome-token', request) - expect(response.status).toBe(409) - expect(await response.json()).toEqual({ error: 'activity_cell_not_authoritative' }) - }) - it('rechecks synthetic host absence after asynchronous identity proof', async () => { let hostExists = false const drainHost = vi.fn(() => 'host-not-connected' as const) @@ -160,81 +143,6 @@ describe('regional host drain endpoint', () => { expect(response.status).toBe(409) expect(drainHost).not.toHaveBeenCalled() }) - -}) - -describe('regional rehome director controls', () => { - - it('applies the durable switch only with matching confirmation', async () => { - const inspectRegionalRehomeControl = vi.fn().mockResolvedValue({ - generation: 0, - enabled: false - }) - const applyRegionalRehomeControl = vi.fn(async (input) => ({ - ...input, - generation: input.expectedGeneration + 1 - })) - const app = createRelayApp(config({ role: 'director', cellId: 'director' }), { - store: {} as never, - assignments: { - inspectRegionalRehomeControl, - applyRegionalRehomeControl - } as never, - drain: vi.fn(), - ready: vi.fn(async () => true) - }) - expect( - ( - await postPath(app, '/v1/admin/regional-rehome-control', 'deploy-token', { - v: 1, - action: 'inspect' - }) - ).status - ).toBe(200) - const apply = { - v: 1, - action: 'apply', - expectedGeneration: 0, - enabled: true, - notBefore: 100, - ratePerMinute: 10, - preferenceMaxAgeMs: 24 * 60 * 60_000, - hostCooldownMs: 7 * 24 * 60 * 60_000, - drainGraceMs: 60_000, - confirmation: 'ENABLE_REGIONAL_REHOMING' - } - expect( - (await postPath(app, '/v1/admin/regional-rehome-control', 'deploy-token', apply)).status - ).toBe(200) - expect(applyRegionalRehomeControl).toHaveBeenCalledOnce() - expect( - ( - await postPath(app, '/v1/admin/regional-rehome-control', 'monitor-token', { - v: 1, - action: 'inspect' - }) - ).status - ).toBe(200) - expect( - (await postPath(app, '/v1/admin/regional-rehome-control', 'monitor-token', apply)).status - ).toBe(403) - expect( - ( - await postPath(app, '/v1/admin/regional-rehome-control', 'deploy-token', { - ...apply, - confirmation: 'DISABLE_REGIONAL_REHOMING' - }) - ).status - ).toBe(400) - // The per-host cooldown is part of the durable shape an operator must state. - const { hostCooldownMs: _omitted, ...withoutCooldown } = apply - expect( - (await postPath(app, '/v1/admin/regional-rehome-control', 'deploy-token', withoutCooldown)) - .status - ).toBe(400) - expect(applyRegionalRehomeControl).toHaveBeenCalledExactlyOnceWith(apply) - }) - }) async function post( diff --git a/cloud/apps/relay/src/relay-region-app.test.ts b/cloud/apps/relay/src/relay-region-app.test.ts deleted file mode 100644 index 1bb2dcd5051..00000000000 --- a/cloud/apps/relay/src/relay-region-app.test.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { describe, expect, it, vi } from 'vitest' -import type { RelayConfig } from './config.js' - -const fakes = vi.hoisted(() => ({ - verifyRelayToken: vi.fn(async (token: string) => ({ sub: 'user-1', relayHostId: token })) -})) - -vi.mock('./authentication/relay-token-verifier.js', () => ({ - createRelayTokenVerifier: () => fakes.verifyRelayToken, - readBearer: (value: string | undefined) => value?.replace(/^Bearer /, '') ?? null -})) - -import { createRelayApp } from './app.js' - -describe('Relay region API', () => { - - it('returns successful placement when optional window storage is unavailable', async () => { - const app = createRelayApp(config(), { - store: {} as never, - assignments: { - assign: async () => ({ - cellId: 'asia-c1', - region: 'asia-east2', - cellUrl: 'https://asia-c1.relay.example.test', - assignmentEpoch: 7 - }), - exchangeRegionCorrection: async () => { - throw new Error('database unavailable') - } - } as never, - drain: vi.fn(), - ready: async () => true - }) - const response = await app.request( - '/v1/assign', - assignmentRequest('abcdefghijklmnop', { - preferredRegion: 'asia-east2', - regionCorrection: { v: 1, action: 'issue-window' } - }) - ) - expect(response.status).toBe(200) - expect(await response.json()).toMatchObject({ - cellUrl: 'https://asia-c1.relay.example.test', - assignmentEpoch: 7 - }) - }) - - it('does not place or write a legacy hint when reporting migration evidence', async () => { - const current = { - userId: 'user-1', - relayHostId: 'abcdefghijklmnop', - cellId: 'asia-c1', - cellUrl: 'https://asia-c1.relay.example.test', - region: 'asia-east2', - assignmentEpoch: 7, - leaseExpiresAt: Date.now() + 300_000 - } - const assign = vi.fn() - const resolve = vi.fn(async () => current) - const exchangeRegionCorrection = vi.fn(async () => ({ v: 1, reportStatus: 'accepted' })) - const app = createRelayApp(config(), { - store: {} as never, - assignments: { assign, resolve, exchangeRegionCorrection } as never, - drain: vi.fn(), - ready: async () => true - }) - const regionCorrection = { - v: 1, - action: 'report', - generation: 2, - assignmentEpoch: 7, - policyVersion: 1, - outcome: 'conclusive', - measurements: { 'us-central1': 40, 'asia-east2': 180 } - } - const response = await app.request( - '/v1/assign', - assignmentRequest('abcdefghijklmnop', { - preferredRegion: 'us-central1', - regionCorrection - }) - ) - expect(response.status).toBe(200) - expect(assign).not.toHaveBeenCalled() - expect(exchangeRegionCorrection).toHaveBeenCalledWith( - { userId: 'user-1', relayHostId: 'abcdefghijklmnop' }, - regionCorrection, - 7 - ) - expect(((await response.json()) as { assignmentEpoch: number }).assignmentEpoch).toBe(7) - }) - - it('does not manufacture an assignment for a report whose assignment disappeared', async () => { - const assign = vi.fn() - const exchangeRegionCorrection = vi.fn() - const app = createRelayApp(config(), { - store: {} as never, - assignments: { assign, resolve: async () => null, exchangeRegionCorrection } as never, - drain: vi.fn(), - ready: async () => true - }) - const response = await app.request( - '/v1/assign', - assignmentRequest('abcdefghijklmnop', { - regionCorrection: { - v: 1, - action: 'report', - generation: 2, - assignmentEpoch: 7, - policyVersion: 1, - outcome: 'inconclusive', - reason: 'timeout' - } - }) - ) - expect(response.status).toBe(409) - expect(assign).not.toHaveBeenCalled() - expect(exchangeRegionCorrection).not.toHaveBeenCalled() - }) - - it('answers a pool that cannot hand out a client with a retryable 503', async () => { - const regionCatalog = vi.fn(async () => { - throw new Error('Connection terminated due to connection timeout') - }) - const app = createRelayApp(config({ publicAssignmentRetryAfterSeconds: 7 }), { - store: {} as never, - assignments: { regionCatalog } as never, - drain: vi.fn(), - ready: vi.fn(async () => true) - }) - - const response = await app.request('/v1/regions') - - expect(response.status).toBe(503) - expect(response.headers.get('Retry-After')).toBe('7') - expect(await response.json()).toEqual({ error: 'region_catalog_temporarily_unavailable' }) - }) - -}) - -function assignmentRequest(relayHostId: string, extra: Record): RequestInit { - return { - method: 'POST', - headers: { - authorization: `Bearer ${relayHostId}`, - 'content-type': 'application/json' - }, - body: JSON.stringify({ v: 1, relayHostId, ...extra }) - } -} - -function config(overrides: Partial = {}): RelayConfig { - return { - port: 8080, - publicUrl: 'https://relay.example.test', - cellUrl: 'https://relay.example.test', - region: 'us-central1', - authIssuer: 'https://auth.example.test', - authAudience: 'orca-relay', - jwksUrl: 'https://auth.example.test/jwks', - assignmentSigningKey: new TextEncoder().encode('assignment-key-with-at-least-32-bytes'), - role: 'director', - cellId: 'director', - cells: [], - adminAudience: 'https://relay.example.test/v1/admin/drain', - deployServiceAccount: 'deploy@example.test', - runtimeServiceAccount: 'runtime@example.test', - adminJwksUrl: 'https://auth.example.test/jwks', - databasePoolMax: 3, - publicAssignmentsEnabled: true, - regionalPlacementEnabled: true, - publicAssignmentConcurrency: 2, - publicAssignmentQueueMax: 128, - publicAssignmentWaitMs: 4_000, - publicResolveConcurrency: 1, - publicResolveWaitMs: 5_000, - publicAssignmentRetryAfterSeconds: 5, - dataDir: './data', - ...overrides - } -} diff --git a/cloud/apps/relay/src/relay-sigterm-exit.blackbox.test.ts b/cloud/apps/relay/src/relay-sigterm-exit.blackbox.test.ts deleted file mode 100644 index c72236c13c2..00000000000 --- a/cloud/apps/relay/src/relay-sigterm-exit.blackbox.test.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { ChildProcess } from 'node:child_process' -import { spawnProcess } from '@orca/process-host' -import { mkdtempSync, rmSync } from 'node:fs' -import { connect, createServer, type Socket } from 'node:net' -import { tmpdir } from 'node:os' -import { resolve } from 'node:path' -import { fileURLToPath } from 'node:url' -import { afterEach, expect, it } from 'vitest' -import WebSocket from 'ws' - -const appDirectory = fileURLToPath(new URL('..', import.meta.url)) -const cleanups: (() => void)[] = [] -afterEach(() => { - for (const cleanup of cleanups.splice(0).toReversed()) { - cleanup() - } -}) - -async function unusedPort(): Promise { - const server = createServer() - await new Promise((resolveListen) => server.listen(0, '127.0.0.1', resolveListen)) - const address = server.address() - if (!address || typeof address === 'string') { - throw new Error('missing test port') - } - await new Promise((resolveClose) => server.close(() => resolveClose())) - return address.port -} - -async function startRelay(port: number): Promise { - const dataDirectory = mkdtempSync(resolve(tmpdir(), 'orca-relay-sigterm-exit-')) - const url = `http://127.0.0.1:${port}` - const child = spawnProcess({ - program: process.execPath, - args: ['--import', 'tsx', 'src/index.ts'], - cwd: appDirectory, - // Explicit so an inherited DATABASE_URL cannot point the relay at a shared database. - env: { - PATH: process.env.PATH ?? '', - ...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}), - PORT: String(port), - ORCA_RELAY_PUBLIC_URL: url, - ORCA_RELAY_CELL_URL: url, - ORCA_RELAY_AUTH_ISSUER: 'http://127.0.0.1:9', - ORCA_RELAY_JWKS_URL: 'http://127.0.0.1:9/jwks', - ORCA_RELAY_ASSIGNMENT_SIGNING_KEY: 'test-assignment-key-with-at-least-32-bytes', - ORCA_RELAY_DATA_DIR: dataDirectory, - ORCA_RELAY_ADMIN_AUDIENCE: `${url}/v1/admin/drain`, - ORCA_RELAY_DEPLOY_SERVICE_ACCOUNT: 'deploy@example.com', - ORCA_RELAY_ADMIN_JWKS_URL: 'http://127.0.0.1:9/jwks' - }, - stdio: ['ignore', 'pipe', 'pipe'] - }) - cleanups.push(() => { - if (child.exitCode === null && child.signalCode === null) { - child.kill('SIGKILL') - } - rmSync(dataDirectory, { recursive: true, force: true }) - }) - await new Promise((resolveReady, reject) => { - let stderr = '' - child.stderr?.on('data', (chunk: Buffer) => (stderr += chunk.toString())) - child.stdout?.on('data', (chunk: Buffer) => { - if (chunk.toString().includes('[orca-relay] listening')) { - resolveReady() - } - }) - child.once('exit', (code) => reject(new Error(`relay exited before ready: ${code}\n${stderr}`))) - }) - return child -} - -// Pauses reading so the peer never answers the relay's close frame. -async function unresponsiveWebSocketPeer(port: number): Promise { - const socket = new WebSocket(`ws://127.0.0.1:${port}/v1/connect/abcdefghijklmnop`) - socket.on('error', () => undefined) - await new Promise((resolveOpen) => socket.once('open', () => resolveOpen())) - const raw = (socket as unknown as { _socket: Socket })._socket - raw.pause() - return raw -} - -// Resolves once the listener refuses new connections, i.e. the relay has begun shutting down. -async function waitUntilListenerClosed(port: number): Promise { - const deadline = Date.now() + 4_000 - while (Date.now() < deadline) { - const accepted = await new Promise((resolveProbe) => { - const probe = connect(port, '127.0.0.1') - probe.once('connect', () => { - probe.destroy() - resolveProbe(true) - }) - probe.once('error', () => resolveProbe(false)) - }) - if (!accepted) { - return - } - await new Promise((resolveDelay) => setTimeout(resolveDelay, 50)) - } - throw new Error('relay kept accepting connections after SIGTERM') -} - -// Peers that are not idle to server.close(); unbounded, a silent one held exit until SIGKILL. -it('exits within the shutdown bound on SIGTERM with an unresponsive upgraded WebSocket peer', async () => { - const port = await unusedPort() - const relay = await startRelay(port) - const peer = await unresponsiveWebSocketPeer(port) - cleanups.push(() => peer.destroy()) - const peerClosed = new Promise((resolveClose) => peer.once('close', () => resolveClose())) - - const startedAt = Date.now() - const exited = new Promise((resolveExit) => - relay.once('exit', (code) => resolveExit(code)) - ) - relay.kill('SIGTERM') - // A second signal must not restart or extend shutdown. Send it only once the first has been - // handled, so the two cannot coalesce into one delivery. - await waitUntilListenerClosed(port) - relay.kill('SIGTERM') - - expect(await exited).toBe(0) - // Under the 10 s backstop: the socket grace, not the backstop, released it. - expect(Date.now() - startedAt).toBeLessThan(9_000) - // A paused peer only observes the relay's FIN once it reads again. - peer.resume() - await peerClosed -}, 15_000) From 58c09251b193dabccdcb489e70ce5c697ec2bde8 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:55:30 -0800 Subject: [PATCH 20/49] fix(observability): import git admission tier from its moved contract path (#42151) --- src/main/observability/git-execution-spans.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/observability/git-execution-spans.ts b/src/main/observability/git-execution-spans.ts index 8f93bdd9619..8915b331af0 100644 --- a/src/main/observability/git-execution-spans.ts +++ b/src/main/observability/git-execution-spans.ts @@ -1,7 +1,7 @@ import { hasActiveTraceSink, startSpan, withSpan, type ActiveSpan } from './tracer' import { getGitOperationCause } from './git-operation-cause' import { resolveGitAdmissionTier } from '../git/command-runner/admission/git-operation-executor' -import type { GitAdmissionTier } from '../../shared/rpc-contract/git-admission-tier-params' +import type { GitAdmissionTier } from '../../shared/rpc-contract/source-control/git-admission-tier-params' const GIT_ACTION_NAMES: Record = { worktree: ['list', 'add', 'remove', 'move', 'prune', 'lock', 'unlock', 'repair'], From 16093f1ff5814804cf9a2340b1728d91af2b9146 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Fri, 13 Nov 2026 14:04:56 -0800 Subject: [PATCH 21/49] test: remove redundant browser suites and adapter workflows (#42154) * test: remove redundant browser policy and migration suites * test: remove duplicate cross-context Electron identity probe * test: remove repeated browser prompt adapter workflows * test: drop synthetic browser RPC integration harness * test: prune ratchet entries for removed Electron probe --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- config/flaky-test-pattern-baseline.txt | 2 - .../commands/cdp-bridge-integration.test.ts | 371 ---------------- .../cdp/commands/cdp-print-to-pdf.test.ts | 28 -- .../prompts/browser-http-auth-prompt.test.ts | 132 ------ .../browser-javascript-dialogs.test.ts | 47 -- .../prompts/browser-page-prompts.test.ts | 29 -- ...etired-profile-identity-inspection.test.ts | 56 --- ...re-identity-cross-context.electron.test.ts | 416 ------------------ ...er-session-partition-proxy-install.test.ts | 214 --------- .../browser-site-display-controller.test.ts | 69 +-- .../browser-site-permission-prompt.test.ts | 78 +--- 11 files changed, 3 insertions(+), 1439 deletions(-) delete mode 100644 src/main/browser/cdp/commands/cdp-bridge-integration.test.ts delete mode 100644 src/main/browser/guest-lifecycle/prompts/browser-http-auth-prompt.test.ts delete mode 100644 src/main/browser/identity/mode/browser-retired-profile-identity-inspection.test.ts delete mode 100644 src/main/browser/identity/wire-probes/browser-session-ua-wire-identity-cross-context.electron.test.ts delete mode 100644 src/main/browser/sessions/partition-policies/browser-session-partition-proxy-install.test.ts diff --git a/config/flaky-test-pattern-baseline.txt b/config/flaky-test-pattern-baseline.txt index 044c4c20559..6b7e1e34ae7 100644 --- a/config/flaky-test-pattern-baseline.txt +++ b/config/flaky-test-pattern-baseline.txt @@ -130,7 +130,6 @@ 1 test-no-real-time-wait:src/main/browser/cdp/input/guest-focused-frame-route.test.ts 3 test-no-real-time-wait:src/main/browser/cookies/browser-cookie-import-concurrency.test.ts 1 test-no-real-time-wait:src/main/browser/guest-lifecycle/popups/compatibility/browser-popup-native-compatibility.electron.test.ts -1 test-no-real-time-wait:src/main/browser/identity/wire-probes/browser-session-ua-wire-identity-cross-context.electron.test.ts 1 test-no-real-time-wait:src/main/browser/identity/wire-probes/browser-session-ua-wire-identity.electron.test.ts 1 test-no-real-time-wait:src/main/browser/network/tunnels/execution-route-socket-duplex.test.ts 1 test-no-real-time-wait:src/main/browser/network/tunnels/remote-browser-socks-server.test.ts @@ -555,7 +554,6 @@ 1 test-timeout-needs-reason:src/main/browser/cookies/browser-cookie-import-partition.electron.test.ts 1 test-timeout-needs-reason:src/main/browser/cookies/browser-cookie-import-validated-partition.electron.test.ts 1 test-timeout-needs-reason:src/main/browser/guest-lifecycle/find/browser-find-frame-traversal.electron.test.ts -1 test-timeout-needs-reason:src/main/browser/identity/wire-probes/browser-session-ua-wire-identity-cross-context.electron.test.ts 1 test-timeout-needs-reason:src/main/browser/identity/wire-probes/browser-session-ua-wire-identity.electron.test.ts 2 test-timeout-needs-reason:src/main/codex/app-server/codex-app-server-teardown.integration.test.ts 1 test-timeout-needs-reason:src/main/codex/hooks/installation/hook-service-legacy-cleanup.test.ts diff --git a/src/main/browser/cdp/commands/cdp-bridge-integration.test.ts b/src/main/browser/cdp/commands/cdp-bridge-integration.test.ts deleted file mode 100644 index a852f9d55dd..00000000000 --- a/src/main/browser/cdp/commands/cdp-bridge-integration.test.ts +++ /dev/null @@ -1,371 +0,0 @@ -import { guestNavigationMethods } from '../../guest-lifecycle/manager/browser-manager-test-harness' -import type * as WorktreeScanCacheModule from '../../../git/worktrees/catalog/worktree-scan-cache' -import type * as WorktreeListingModule from '../../../git/worktrees/catalog/worktree-listing' -import { mkdtempSync } from 'node:fs' -import { RuntimeBrowserCommands } from '../../../runtime/browser/commands/browser-commands' -import { setRuntimeBrowserCommandsFactory } from '../../../runtime/browser/installation/runtime-browser-commands-factory' -import { tmpdir } from 'node:os' -import { join } from 'node:path' -import { createConnection } from 'node:net' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { BrowserManager } from '../../guest-lifecycle/manager/browser-manager' -import { CdpBridge } from './cdp-bridge' -import { OrcaRuntimeService } from '../../../runtime/orca-runtime' -import { OrcaRuntimeRpcServer } from '../../../runtime/rpc/server/runtime-rpc' -import { readRuntimeMetadata } from '../../../runtime/rpc/server/runtime-metadata' - -const { webContentsFromIdMock } = vi.hoisted(() => ({ - webContentsFromIdMock: vi.fn() -})) - -vi.mock('../../../git/worktrees/catalog/worktree-scan-cache', async (importOriginal) => { - const facade = getWorktreeListingMocks() - return { - ...(await importOriginal()), - listWorktrees: facade.listWorktrees - } -}) - -vi.mock('../../../git/worktrees/catalog/worktree-listing', async (importOriginal) => { - const facade = getWorktreeListingMocks() - return { - ...(await importOriginal()), - listWorktreesStrict: facade.listWorktreesStrict - } -}) - -vi.mock('electron', () => ({ - webContents: { fromId: webContentsFromIdMock }, - shell: { openExternal: vi.fn() }, - ipcMain: { handle: vi.fn(), removeHandler: vi.fn(), on: vi.fn() }, - app: { getPath: vi.fn(() => '/tmp'), isPackaged: false } -})) - -const { getWorktreeListingMocks } = vi.hoisted(() => { - const createWorktreeListingMocks = () => ({ - listWorktrees: vi.fn().mockResolvedValue([]), - listWorktreesStrict: vi.fn().mockResolvedValue([]) - }) - let listings: ReturnType | undefined - return { getWorktreeListingMocks: () => (listings ??= createWorktreeListingMocks()) } -}) - -type AXNode = { - nodeId: string - backendDOMNodeId?: number - role?: { type: string; value: string } - name?: { type: string; value: string } - properties?: { name: string; value: { type: string; value: unknown } }[] - childIds?: string[] - ignored?: boolean -} - -function axNode( - id: string, - role: string, - name: string, - opts?: { childIds?: string[]; backendDOMNodeId?: number } -): AXNode { - return { - nodeId: id, - backendDOMNodeId: opts?.backendDOMNodeId ?? Number.parseInt(id, 10) * 100, - role: { type: 'role', value: role }, - name: { type: 'computedString', value: name }, - childIds: opts?.childIds - } -} - -const EXAMPLE_COM_TREE: AXNode[] = [ - axNode('1', 'WebArea', 'Example Domain', { childIds: ['2', '3', '4'] }), - axNode('2', 'heading', 'Example Domain'), - axNode('3', 'staticText', 'This domain is for use in illustrative examples.'), - axNode('4', 'link', 'More information...', { backendDOMNodeId: 400 }) -] - -const SEARCH_PAGE_TREE: AXNode[] = [ - axNode('1', 'WebArea', 'Search', { childIds: ['2', '3', '4', '5'] }), - axNode('2', 'navigation', 'Main Nav', { childIds: ['3'] }), - axNode('3', 'link', 'Home', { backendDOMNodeId: 300 }), - axNode('4', 'textbox', 'Search query', { backendDOMNodeId: 400 }), - axNode('5', 'button', 'Search', { backendDOMNodeId: 500 }) -] - -function createMockGuest( - id: number, - url: string, - title: string, - options?: { readyState?: string | (() => string) } -) { - let currentUrl = url - let currentTitle = title - let currentTree = EXAMPLE_COM_TREE - let navHistoryId = 1 - let debuggerAttached = false - - const sendCommandMock = vi.fn(async (method: string, params?: Record) => { - switch (method) { - case 'Page.enable': - case 'DOM.enable': - case 'Accessibility.enable': - return {} - case 'Accessibility.getFullAXTree': - return { nodes: currentTree } - case 'Page.getNavigationHistory': - return { - entries: [{ id: navHistoryId, url: currentUrl }], - currentIndex: 0 - } - case 'Page.navigate': { - const targetUrl = (params as { url: string }).url - if (targetUrl.includes('nonexistent.invalid')) { - return { errorText: 'net::ERR_NAME_NOT_RESOLVED' } - } - navHistoryId++ - currentUrl = targetUrl - if (targetUrl.includes('search.example.com')) { - currentTitle = 'Search' - currentTree = SEARCH_PAGE_TREE - } else { - currentTitle = 'Example Domain' - currentTree = EXAMPLE_COM_TREE - } - return {} - } - case 'Runtime.evaluate': { - const expr = (params as { expression: string }).expression - if (expr === 'document.readyState') { - return { - result: { - value: - typeof options?.readyState === 'function' - ? options.readyState() - : (options?.readyState ?? 'complete') - } - } - } - if (expr === 'location.origin') { - return { result: { value: new URL(currentUrl).origin } } - } - if (expr.includes('innerWidth')) { - return { result: { value: JSON.stringify({ w: 1280, h: 720 }) } } - } - if (expr.includes('scrollBy')) { - return { result: { value: undefined } } - } - if (expr.includes('dispatchEvent')) { - return { result: { value: undefined } } - } - // eslint-disable-next-line no-eval - return { result: { value: String(eval(expr)), type: 'string' } } - } - case 'DOM.scrollIntoViewIfNeeded': - return {} - case 'DOM.getBoxModel': - return { model: { content: [100, 200, 300, 200, 300, 250, 100, 250] } } - case 'Input.dispatchMouseEvent': - return {} - case 'Input.insertText': - return {} - case 'Input.dispatchKeyEvent': - return {} - case 'DOM.focus': - return {} - case 'DOM.describeNode': - return { node: { nodeId: 1 } } - case 'DOM.requestNode': - return { nodeId: 1 } - case 'DOM.resolveNode': - return { object: { objectId: 'obj-1' } } - case 'Runtime.callFunctionOn': - return { result: { value: undefined } } - case 'DOM.setFileInputFiles': - return {} - case 'Page.captureScreenshot': - return { - data: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==' - } - case 'Page.reload': - return {} - case 'Network.enable': - return {} - case 'Target.setAutoAttach': - return {} - case 'Page.addScriptToEvaluateOnNewDocument': - return { identifier: 'mock-script-id' } - case 'Runtime.enable': - return {} - default: - throw new Error(`Unexpected CDP method: ${method}`) - } - }) - - const debuggerListeners = new Map void)[]>() - - const guest = { - ...guestNavigationMethods(), - id, - isDestroyed: vi.fn(() => false), - isCurrentlyAudible: vi.fn(() => false), - setIgnoreMenuShortcuts: vi.fn(), - getType: vi.fn(() => 'webview'), - getURL: vi.fn(() => currentUrl), - getTitle: vi.fn(() => currentTitle), - setBackgroundThrottling: vi.fn(), - setWindowOpenHandler: vi.fn(), - on: vi.fn(), - off: vi.fn(), - debugger: { - isAttached: vi.fn(() => debuggerAttached), - attach: vi.fn(() => { - if (debuggerAttached) { - throw new Error('Another debugger is already attached') - } - debuggerAttached = true - }), - detach: vi.fn(), - sendCommand: sendCommandMock, - on: vi.fn((event: string, handler: (...args: unknown[]) => void) => { - const handlers = debuggerListeners.get(event) ?? [] - handlers.push(handler) - debuggerListeners.set(event, handlers) - }), - removeListener: vi.fn((event: string, handler: (...args: unknown[]) => void) => { - const handlers = debuggerListeners.get(event) ?? [] - const idx = handlers.indexOf(handler) - if (idx !== -1) { - handlers.splice(idx, 1) - } - }), - removeAllListeners: vi.fn((event: string) => { - debuggerListeners.set(event, []) - }), - off: vi.fn() - } - } - - return { - guest, - sendCommandMock, - setTree(tree: AXNode[]) { - currentTree = tree - }, - emitDebugger(event: string, ...args: unknown[]) { - for (const handler of debuggerListeners.get(event) ?? []) { - handler(...args) - } - }, - emitDebuggerMessage(method: string, params?: Record) { - for (const handler of debuggerListeners.get('message') ?? []) { - handler({}, method, params) - } - } - } -} - -async function sendRequest( - endpoint: string, - request: Record -): Promise> { - return await new Promise((resolve, reject) => { - const socket = createConnection(endpoint) - let buffer = '' - socket.setEncoding('utf8') - socket.once('error', reject) - socket.on('data', (chunk: string) => { - buffer += chunk - const newlineIndex = buffer.indexOf('\n') - if (newlineIndex === -1) { - return - } - const message = buffer.slice(0, newlineIndex) - socket.end() - resolve(JSON.parse(message) as Record) - }) - socket.on('connect', () => { - socket.write(`${JSON.stringify(request)}\n`) - }) - }) -} - -describe('Browser automation pipeline (integration)', () => { - let server: OrcaRuntimeRpcServer - let endpoint: string - let authToken: string - let activeGuestHarness: ReturnType - let cdpBridge: CdpBridge - - const GUEST_WC_ID = 5001 - const RENDERER_WC_ID = 1 - - beforeEach(async () => { - // The Electron entry installs this factory; Node hosts omit browser commands. - setRuntimeBrowserCommandsFactory((host) => new RuntimeBrowserCommands(host)) - activeGuestHarness = createMockGuest(GUEST_WC_ID, 'https://example.com', 'Example Domain') - const { guest } = activeGuestHarness - webContentsFromIdMock.mockImplementation((id: number) => { - if (id === GUEST_WC_ID) { - return guest - } - return null - }) - - const browserManager = new BrowserManager() - // Production applies these policies in will-attach-webview. - browserManager.attachGuestPolicies(guest as never) - browserManager.registerGuest({ - browserPageId: 'page-1', - webContentsId: GUEST_WC_ID, - rendererWebContentsId: RENDERER_WC_ID - }) - - cdpBridge = new CdpBridge(browserManager) - cdpBridge.setActiveTab(GUEST_WC_ID) - - const userDataPath = mkdtempSync(join(tmpdir(), 'browser-e2e-')) - const runtime = new OrcaRuntimeService() - // eslint-disable-next-line @typescript-eslint/no-explicit-any - runtime.setAgentBrowserBridge(cdpBridge as any) - - server = new OrcaRuntimeRpcServer({ runtime, userDataPath }) - await server.start() - - const metadata = readRuntimeMetadata(userDataPath)! - endpoint = metadata.transports[0]!.endpoint - authToken = metadata.authToken! - }) - - afterEach(async () => { - await server.stop() - }) - - async function rpc(method: string, params?: Record) { - const response = await sendRequest(endpoint, { - id: `req_${method}`, - authToken, - method, - ...(params ? { params } : {}) - }) - return response - } - - it('navigates to a URL and invalidates refs', async () => { - await rpc('browser.snapshot') - - const gotoRes = await rpc('browser.goto', { url: 'https://search.example.com' }) - expect(gotoRes.ok).toBe(true) - const gotoResult = gotoRes.result as { url: string; title: string } - expect(gotoResult.url).toBe('https://search.example.com') - expect(gotoResult.title).toBe('Search') - - const clickRes = await rpc('browser.click', { element: '@e1' }) - expect(clickRes.ok).toBe(false) - expect((clickRes.error as { code: string }).code).toBe('browser_stale_ref') - - const snapRes = await rpc('browser.snapshot') - expect(snapRes.ok).toBe(true) - const snapResult = snapRes.result as { snapshot: string; refs: { name: string }[] } - expect(snapResult.snapshot).toContain('Search') - expect(snapResult.refs.map((r) => r.name)).toContain('Search') - expect(snapResult.refs.map((r) => r.name)).toContain('Home') - }) -}) diff --git a/src/main/browser/cdp/commands/cdp-print-to-pdf.test.ts b/src/main/browser/cdp/commands/cdp-print-to-pdf.test.ts index 200a96efab9..6fc79fd5489 100644 --- a/src/main/browser/cdp/commands/cdp-print-to-pdf.test.ts +++ b/src/main/browser/cdp/commands/cdp-print-to-pdf.test.ts @@ -7,17 +7,6 @@ describe('CdpPdfStreamStore', () => { vi.useRealTimers() }) - it('claims only its own handles', () => { - const store = new CdpPdfStreamStore() - const handle = store.create(Buffer.from('pdf')) - - expect(store.ownsHandle({ handle })).toBe(true) - expect(handle).toMatch(/^orca-pdf-[\da-f-]{36}-\d+$/) - expect(store.ownsHandle({ handle: 'trace-stream' })).toBe(false) - expect(store.ownsHandle({ handle: 'orca-pdf-forged-1' })).toBe(false) - expect(store.ownsHandle({})).toBe(false) - }) - it('reads sequential chunks and reports eof', () => { const store = new CdpPdfStreamStore() const handle = store.create(Buffer.from('abcdef')) @@ -32,23 +21,6 @@ describe('CdpPdfStreamStore', () => { }) }) - it('honors an explicit read offset', () => { - const store = new CdpPdfStreamStore() - const handle = store.create(Buffer.from('abcdef')) - - expect(store.read({ handle, offset: 4 })).toEqual({ - data: Buffer.from('ef').toString('base64'), - eof: true - }) - }) - - it('returns an empty eof chunk when reading past the end', () => { - const store = new CdpPdfStreamStore() - const handle = store.create(Buffer.from('abc')) - - expect(store.read({ handle, offset: 99 })).toEqual({ data: '', eof: true }) - }) - it('evicts an abandoned stream after the TTL', () => { vi.useFakeTimers() const store = new CdpPdfStreamStore() diff --git a/src/main/browser/guest-lifecycle/prompts/browser-http-auth-prompt.test.ts b/src/main/browser/guest-lifecycle/prompts/browser-http-auth-prompt.test.ts deleted file mode 100644 index 5f1f833ed51..00000000000 --- a/src/main/browser/guest-lifecycle/prompts/browser-http-auth-prompt.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { EventEmitter } from 'node:events' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const mocks = vi.hoisted(() => ({ - resolvePagePromptTarget: vi.fn() -})) - -vi.mock('../manager/browser-manager', () => ({ - browserManager: { - resolvePagePromptTarget: mocks.resolvePagePromptTarget - } -})) - -import type { BrowserPagePromptRequest } from '../../../../shared/browser/prompts/browser-page-prompt' -import { handleBrowserGuestLogin } from './browser-http-auth-prompt' -import { BROWSER_PAGE_PROMPT_TIMEOUT_MS, respondToBrowserPagePrompt } from './browser-page-prompts' - -type MockGuest = Electron.WebContents & EventEmitter - -const guests: MockGuest[] = [] - -function mockGuest(pageUrl = 'https://staging.acme.com/'): MockGuest { - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the prompt only reads id, isDestroyed, getURL and the input, navigation and destroyed events. - const guest = new EventEmitter() as MockGuest - Object.assign(guest, { - id: 100 + guests.length, - isDestroyed: () => false, - getURL: () => pageUrl - }) - guests.push(guest) - return guest -} - -function mockRenderer(id: number): Electron.WebContents { - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: prompts only read id, isDestroyed, send and subscribe to the window's lifecycle events. - return { - id, - isDestroyed: () => false, - send: vi.fn(), - on: vi.fn(), - off: vi.fn() - } as unknown as Electron.WebContents -} - -function showTabIn(renderer: Electron.WebContents, browserPageId = 'page-1'): void { - mocks.resolvePagePromptTarget.mockReturnValue({ browserPageId, renderer }) -} - -function challenge( - guest: MockGuest, - { - url = 'https://staging.acme.com/', - isRequestForNavigation = true, - firstAuthAttempt = true, - isProxy = false, - realm = 'Staging' - } = {} -) { - const event = { preventDefault: vi.fn() } - const callback = vi.fn() - handleBrowserGuestLogin( - event, - guest, - { url, pid: 1, isRequestForNavigation, firstAuthAttempt }, - { isProxy, scheme: 'basic', host: new URL(url).hostname, port: 443, realm }, - callback - ) - return { asked: event.preventDefault.mock.calls.length > 0, callback } -} - -function sentRequests(renderer: Electron.WebContents): BrowserPagePromptRequest<'http-auth'>[] { - return vi - .mocked(renderer.send) - .mock.calls.filter(([channel]) => channel === 'browser:page-prompt-requested') - .map(([, request]) => request) -} - -const answer = (renderer: Electron.WebContents, requestId: string, value: unknown) => - respondToBrowserPagePrompt(renderer, { requestId, answer: value }) - -const CREDENTIALS = { username: 'qa', password: 'hunter2' } - -describe('browser HTTP auth prompt', () => { - beforeEach(() => { - vi.useFakeTimers() - mocks.resolvePagePromptTarget.mockReset() - }) - - afterEach(() => { - vi.advanceTimersByTime(BROWSER_PAGE_PROMPT_TIMEOUT_MS) - for (const guest of guests.splice(0)) { - guest.emit('destroyed') - } - vi.useRealTimers() - }) - - it.each([ - ['a proxy challenge', { isProxy: true }], - [ - 'an image from another site', - { url: 'https://cdn.other.com/a.png', isRequestForNavigation: false } - ] - ])('leaves %s to Electron, which cancels it', (_name, options) => { - const renderer = mockRenderer(10) - showTabIn(renderer) - - const { asked } = challenge(mockGuest(), options) - - expect(asked).toBe(false) - expect(sentRequests(renderer)).toEqual([]) - }) - - it('shares one prompt per realm and cancels a different challenge meanwhile', async () => { - const renderer = mockRenderer(10) - showTabIn(renderer) - const guest = mockGuest() - - const first = challenge(guest) - const sameRealm = challenge(guest, { - url: 'https://staging.acme.com/logo.png', - isRequestForNavigation: false - }) - const otherRealm = challenge(guest, { realm: 'Admin' }) - - expect([first.asked, sameRealm.asked, otherRealm.asked]).toEqual([true, true, false]) - const [request] = sentRequests(renderer) - expect(sentRequests(renderer)).toHaveLength(1) - await answer(renderer, request.requestId, CREDENTIALS) - expect(first.callback).toHaveBeenCalledWith('qa', 'hunter2') - expect(sameRealm.callback).toHaveBeenCalledWith('qa', 'hunter2') - }) -}) diff --git a/src/main/browser/guest-lifecycle/prompts/browser-javascript-dialogs.test.ts b/src/main/browser/guest-lifecycle/prompts/browser-javascript-dialogs.test.ts index a9efc10b55e..33e8e8bb1e8 100644 --- a/src/main/browser/guest-lifecycle/prompts/browser-javascript-dialogs.test.ts +++ b/src/main/browser/guest-lifecycle/prompts/browser-javascript-dialogs.test.ts @@ -7,7 +7,6 @@ import { getBrowserJavaScriptDialog, installBrowserJavaScriptDialogs } from './browser-javascript-dialogs' -import { respondToBrowserPagePrompt } from './browser-page-prompts' type MockContents = Electron.WebContents & EventEmitter & { debugger: EventEmitter } @@ -58,39 +57,6 @@ function setup() { } describe('browser JavaScript dialogs', () => { - it('asks in the page prompt instead of Electron’s window-wide sheet', () => { - const { guest, electronSheet, openDialog, shownPrompts } = setup() - - const callback = openDialog('confirm', 'Delete everything?') - - expect(electronSheet).not.toHaveBeenCalled() - expect(callback).not.toHaveBeenCalled() - expect(getBrowserJavaScriptDialog(guest.id)).toEqual({ - type: 'confirm', - message: 'Delete everything?', - defaultPromptText: '' - }) - expect(shownPrompts()).toEqual([ - expect.objectContaining({ - kind: 'javascript-dialog', - details: { - type: 'confirm', - message: 'Delete everything?', - defaultPromptText: '', - origin: 'https://shop.example' - } - }) - ]) - }) - - it('names an embedded page that asks, not the site around it', () => { - const { openDialog, shownPrompts } = setup() - - openDialog('prompt', 'Re-enter your password', '', { origin: 'https://ads.example' }) - - expect(shownPrompts()[0]?.details).toMatchObject({ origin: 'https://ads.example' }) - }) - it('takes an agent’s prompt answer and closes the page prompt', () => { const { guest, openDialog, closedPrompts } = setup() const callback = openDialog('prompt', 'Your name?', 'def') @@ -103,19 +69,6 @@ describe('browser JavaScript dialogs', () => { expect(answerBrowserJavaScriptDialog(guest.id, { accept: true, promptText: '' })).toBe(false) }) - it('answers the page with what the user chose in the page prompt', async () => { - const { renderer, guest, openDialog, shownPrompts } = setup() - const callback = openDialog('confirm', 'Leave?') - - await respondToBrowserPagePrompt(renderer, { - requestId: shownPrompts()[0].requestId, - answer: { accept: false, promptText: '' } - }) - - expect(callback).toHaveBeenCalledExactlyOnceWith(false, '') - expect(getBrowserJavaScriptDialog(guest.id)).toBeNull() - }) - it('turns away a second frame’s dialog and keeps the first one answerable', () => { const { guest, openDialog } = setup() const first = openDialog('confirm', 'Delete everything?') diff --git a/src/main/browser/guest-lifecycle/prompts/browser-page-prompts.test.ts b/src/main/browser/guest-lifecycle/prompts/browser-page-prompts.test.ts index 1e391d985b8..e8eccfbbe8c 100644 --- a/src/main/browser/guest-lifecycle/prompts/browser-page-prompts.test.ts +++ b/src/main/browser/guest-lifecycle/prompts/browser-page-prompts.test.ts @@ -4,7 +4,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { BrowserPagePromptRequest } from '../../../../shared/browser/prompts/browser-page-prompt' import { BROWSER_PAGE_PROMPT_TIMEOUT_MS, - cancelBrowserPagePrompts, openBrowserPagePrompt, respondToBrowserPagePrompt, showBrowserPagePromptsAwaitingRegistration, @@ -57,13 +56,6 @@ function sentRequests(renderer: Electron.WebContents): BrowserPagePromptRequest[ .map(([, request]) => request) } -function closedRequestIds(renderer: Electron.WebContents): string[] { - return vi - .mocked(renderer.send) - .mock.calls.filter(([channel]) => channel === 'browser:page-prompt-closed') - .map(([, event]) => event.requestId) -} - const latestId = (renderer: Electron.WebContents): string => sentRequests(renderer).at(-1)!.requestId @@ -172,25 +164,4 @@ describe('browser page prompts', () => { await respondToBrowserPagePrompt(renderer, { requestId: latestId(renderer), answer: true }) expect(ask(guest).opening).toBe('prompting') }) - - it('closes the prompt with a null answer when it expires or its page goes away', async () => { - const renderer = mockRenderer(10) - const expiring = ask(mockGuest(renderer, 'page-1')) - const expiringId = latestId(renderer) - const closingGuest = mockGuest(renderer, 'page-2') - const closing = ask(closingGuest) - const closingId = latestId(renderer) - - cancelBrowserPagePrompts('page-2') - vi.advanceTimersByTime(BROWSER_PAGE_PROMPT_TIMEOUT_MS) - await Promise.resolve() - - expect(closedRequestIds(renderer)).toEqual([closingId, expiringId]) - expect(expiring.settle).toHaveBeenCalledWith(null) - expect(closing.settle).toHaveBeenCalledWith(null) - await expect( - respondToBrowserPagePrompt(renderer, { requestId: closingId, answer: true }) - ).resolves.toBe('rejected') - expect(ask(closingGuest).opening).toBe('prompting') - }) }) diff --git a/src/main/browser/identity/mode/browser-retired-profile-identity-inspection.test.ts b/src/main/browser/identity/mode/browser-retired-profile-identity-inspection.test.ts deleted file mode 100644 index eb050a91f96..00000000000 --- a/src/main/browser/identity/mode/browser-retired-profile-identity-inspection.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { getOrcaProfileBrowserSessionPartition } from '../../../../shared/orca-profiles' -import { inspectRetiredBrowserSessionProfileUserAgentModes } from './browser-retired-profile-identity-inspection' - -const ORCA_PROFILE_ID = 'local-default' -const PROFILE_ID = '11111111-1111-4111-8111-111111111111' - -function profileWithMode(mode: unknown): Record { - return { - id: PROFILE_ID, - scope: 'isolated', - partition: getOrcaProfileBrowserSessionPartition(ORCA_PROFILE_ID, PROFILE_ID), - label: 'Existing', - source: null, - userAgentMode: mode - } -} - -function unhydratableProfile(extra: Record = {}): Record { - return { - id: 'not-a-uuid', - scope: 'isolated', - partition: 'persist:orca-browser-session-not-a-uuid', - label: 'Unhydratable', - source: null, - ...extra - } -} - -describe('retired browser profile identity inspection', () => { - it('detects an inspectable old choice without removing its bytes', () => { - const profile = profileWithMode('native') - - expect(inspectRetiredBrowserSessionProfileUserAgentModes([profile], ORCA_PROFILE_ID)).toEqual({ - noticePending: true, - degraded: false - }) - expect(profile.userAgentMode).toBe('native') - }) - - it.each([ - { scenario: 'an unreadable mode', entry: profileWithMode('unexpected') }, - { - scenario: 'a mode on an entry that cannot be hydrated', - entry: unhydratableProfile({ userAgentMode: 'native' }) - } - ])('turns $scenario into a degraded notice without throwing', ({ entry }) => { - expect(() => - inspectRetiredBrowserSessionProfileUserAgentModes([entry], ORCA_PROFILE_ID) - ).not.toThrow() - expect(inspectRetiredBrowserSessionProfileUserAgentModes([entry], ORCA_PROFILE_ID)).toEqual({ - noticePending: true, - degraded: true - }) - }) -}) diff --git a/src/main/browser/identity/wire-probes/browser-session-ua-wire-identity-cross-context.electron.test.ts b/src/main/browser/identity/wire-probes/browser-session-ua-wire-identity-cross-context.electron.test.ts deleted file mode 100644 index d5b3e0c58f9..00000000000 --- a/src/main/browser/identity/wire-probes/browser-session-ua-wire-identity-cross-context.electron.test.ts +++ /dev/null @@ -1,416 +0,0 @@ -import { spawn, type ChildProcess } from 'node:child_process' -import { createServer } from 'node:net' -import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' -import { createRequire } from 'node:module' -import { tmpdir } from 'node:os' -import { basename, join } from 'node:path' -import { chromium } from 'playwright' -import { afterAll, beforeAll, describe, expect, it } from 'vitest' -import { build as buildVite } from 'vite' -import { - BrowserSessionUaCdpCollector, - type BrowserSessionUaCdpRequest, - waitForBrowserCdpEndpoint -} from './browser-session-ua-cdp-collector' -import { - startBrowserSessionUaWireProbeServer, - type WireProbeJavaScriptIdentity, - type WireProbeReceipt -} from './browser-session-ua-wire-probe-server' - -const electronBinary = createRequire(import.meta.url)('electron') as string -const fixtureRoots: string[] = [] -let processIdentityModulePath: string -let exceptionModulePath: string - -beforeAll(async () => { - const root = mkdtempSync(join(tmpdir(), 'orca-wire-identity-modules-')) - fixtureRoots.push(root) - processIdentityModulePath = join(root, 'browser-process-user-agent.cjs') - exceptionModulePath = join(root, 'browser-session-ua.cjs') - await Promise.all([ - buildModule( - 'src/main/browser/identity/browser-process-user-agent.ts', - processIdentityModulePath - ), - buildModule('src/main/browser/identity/requests/browser-session-ua.ts', exceptionModulePath) - ]) -}) - -afterAll(() => { - for (const root of fixtureRoots) { - rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }) - } -}) - -type ProbeArm = 'clean' | 'fallback-disabled' - -type ProbeResult = Readonly<{ - arm: ProbeArm - rawUserAgent: string - cleanUserAgent: string - navigatorUserAgent: string - receipts: readonly WireProbeReceipt[] - identities: readonly WireProbeJavaScriptIdentity[] - cdpRequests: readonly BrowserSessionUaCdpRequest[] - cdpDiagnostics: readonly string[] - fixtureResult: string - fixtureStderr: string -}> - -describe('browser session wire identity in cross-site frames and dedicated workers', () => { - it('keeps OOPIF, dedicated-worker, and client-hint identities clean', async () => { - const result = await runProbe('clean') - assertCapturedContexts(result) - const checks = identityChecks(result) - expect(checks.crossSiteDocument).toBe(true) - expect(checks.crossSiteFetch).toBe(true) - expect(checks.dedicatedWorkerScript).toBe(true) - expect(checks.dedicatedWorkerFetch).toBe(true) - expect(checks.clientHints, JSON.stringify(receiptForPath(result.receipts, '/'))).toBe(true) - }, 60_000) -}) - -async function runProbe(arm: ProbeArm): Promise { - const root = mkdtempSync(join(tmpdir(), `orca-wire-cross-context-${arm}-`)) - fixtureRoots.push(root) - const server = await startBrowserSessionUaWireProbeServer() - const resultPath = join(root, 'result.json') - const barrierPath = join(root, 'continue') - const fixturePath = join(root, 'main.cjs') - const cdpPort = await reservePort() - writeFileSync( - fixturePath, - fixtureMain({ - arm, - barrierPath, - exceptionModulePath, - httpOrigin: server.httpOrigin, - processIdentityModulePath, - resultPath - }) - ) - let process: ChildProcess | null = null - let collector: BrowserSessionUaCdpCollector | null = null - let browser: Awaited> | null = null - try { - process = launchFixture(fixturePath, root, cdpPort) - await waitForBrowserCdpEndpoint(cdpPort) - browser = await chromium.connectOverCDP(`http://127.0.0.1:${cdpPort}`) - collector = await BrowserSessionUaCdpCollector.connect(cdpPort) - await collector.installAutoAttach() - writeFileSync(barrierPath, '') - const processResult = await waitForProcess(process) - const fixtureResult = existsSync(resultPath) ? readFileSync(resultPath, 'utf8') : 'no result' - expect( - processResult.code, - `${fixtureResult}\n${processResult.stderr}\n${JSON.stringify({ diagnostics: collector.diagnostics, receipts: server.receipts, identities: server.identities })}` - ).toBe(0) - await new Promise((resolve) => setTimeout(resolve, 250)) - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: JSON.parse is untyped; the fixture writes this exact shape before exiting. - const parsed = JSON.parse(fixtureResult) as Omit< - ProbeResult, - | 'receipts' - | 'identities' - | 'cdpRequests' - | 'cdpDiagnostics' - | 'fixtureResult' - | 'fixtureStderr' - > - return { - ...parsed, - fixtureResult, - fixtureStderr: processResult.stderr, - receipts: [...server.receipts], - identities: [...server.identities], - cdpDiagnostics: [...collector.diagnostics], - cdpRequests: collector.snapshot().filter(({ url }) => { - return ( - url.startsWith(server.httpOrigin) || - url.startsWith(server.crossSiteOrigin) || - url.startsWith(server.httpsOrigin) - ) - }) - } - } finally { - await collector?.close().catch(() => {}) - await browser?.close().catch(() => {}) - await server.close() - if (process && process.exitCode === null) { - process.kill('SIGTERM') - } - } -} - -async function buildModule(entry: string, outputPath: string): Promise { - await buildVite({ - configFile: false, - logLevel: 'silent', - build: { - emptyOutDir: false, - lib: { - entry: join(process.cwd(), entry), - formats: ['cjs'], - fileName: () => basename(outputPath) - }, - outDir: join(outputPath, '..'), - target: 'node20', - rollupOptions: { external: ['electron', /^node:/] } - } - }) -} - -function launchFixture(fixturePath: string, root: string, cdpPort: number): ChildProcess { - const { ELECTRON_RUN_AS_NODE: _electronRunAsNode, ...env } = process.env - const args = [ - fixturePath, - `--user-data-dir=${join(root, 'profile')}`, - `--remote-debugging-port=${cdpPort}`, - '--site-per-process' - ] - if (process.platform === 'linux') { - args.push('--no-sandbox') - } - return spawn( - process.platform === 'linux' ? 'xvfb-run' : electronBinary, - process.platform === 'linux' ? ['--auto-servernum', electronBinary, ...args] : args, - { - env: { ...env, ORCA_BACKGROUND_LAUNCH: '1' }, - stdio: ['ignore', 'pipe', 'pipe'] - } - ) -} - -function fixtureMain(options: { - arm: ProbeArm - barrierPath: string - exceptionModulePath: string - httpOrigin: string - processIdentityModulePath: string - resultPath: string -}): string { - return String.raw` -const { app, BrowserWindow, session } = require('electron') -const { existsSync, writeFileSync } = require('node:fs') -const processIdentity = require(${JSON.stringify(options.processIdentityModulePath)}) -const { cleanElectronUserAgent } = require(${JSON.stringify(options.processIdentityModulePath)}) -const arm = ${JSON.stringify(options.arm)} -app.setName('OrcaCrossContextFixture') -app.commandLine.appendSwitch('site-per-process') -const rawUserAgent = app.userAgentFallback -if (arm === 'clean') processIdentity.initializeBrowserProcessUserAgent('clean') -const waitForBarrier = async () => { - const deadline = Date.now() + 15000 - while (!existsSync(${JSON.stringify(options.barrierPath)})) { - if (Date.now() >= deadline) throw new Error('startup barrier timeout') - await new Promise(resolve => setTimeout(resolve, 20)) - } -} -async function run() { - const timeout = setTimeout(() => { writeFileSync(${JSON.stringify(options.resultPath)}, JSON.stringify({ error: 'timeout' })); app.exit(2) }, 20000) - await app.whenReady() - await waitForBarrier() - const sess = session.fromPartition('persist:wire-cross-context') - sess.setCertificateVerifyProc((_request, callback) => callback(0)) - const windows = [] - const window = new BrowserWindow({ show: false, webPreferences: { partition: 'persist:wire-cross-context', sandbox: true } }) - windows.push(window) - window.webContents.setWindowOpenHandler(() => ({ - action: 'allow', - createWindow: options => { - const popup = new BrowserWindow({ ...options, show: false }) - windows.push(popup) - return popup.webContents - } - })) - await window.loadURL(${JSON.stringify(options.httpOrigin)} + '/?cross-context=1') - const [navigatorUserAgent] = await Promise.all([ - window.webContents.executeJavaScript('navigator.userAgent'), - window.webContents.executeJavaScript('window.probePromise') - ]) - // Allow isolated-frame CDP events to flush before the fixture exits. - await new Promise(resolve => setTimeout(resolve, 1500)) - clearTimeout(timeout) - writeFileSync(${JSON.stringify(options.resultPath)}, JSON.stringify({ arm, rawUserAgent, cleanUserAgent: cleanElectronUserAgent(rawUserAgent), navigatorUserAgent })) - for (const candidate of windows) if (!candidate.isDestroyed()) candidate.destroy() - app.exit(0) -} -run().catch(error => { writeFileSync(${JSON.stringify(options.resultPath)}, JSON.stringify({ error: String(error?.stack || error) })); app.exit(1) }) -` -} - -function assertCapturedContexts(result: ProbeResult): void { - const paths = new Set(result.receipts.map(({ path }) => path)) - for (const path of [ - '/', - '/cross-site-frame', - '/cross-site-frame-fetch', - '/dedicated-worker.js', - '/dedicated-worker-fetch', - '/report/cross-site-frame', - '/report/dedicated-worker' - ]) { - expect( - paths, - `${result.arm} omitted ${path}\n cdp: ${JSON.stringify(result.cdpDiagnostics)}\n receipts: ${JSON.stringify(result.receipts.map((r) => r.path))}\n fixture: ${result.fixtureResult}\n stderr: ${result.fixtureStderr}` - ).toContain(path) - } - expect( - result.cdpDiagnostics.some((message) => message.startsWith('attached:iframe:')), - JSON.stringify(result.cdpDiagnostics) - ).toBe(true) - expect( - result.cdpDiagnostics.some((message) => message.startsWith('attached:worker:')), - JSON.stringify(result.cdpDiagnostics) - ).toBe(true) - expect( - result.receipts - .filter(({ path }) => path === '/cross-site-frame') - .map(({ protocol }) => protocol) - ).toEqual(['https']) - expect( - result.receipts - .filter(({ path }) => path === '/cross-site-frame-fetch') - .map(({ protocol }) => protocol) - ).toEqual(['https']) - expect( - result.cdpRequests.some(({ url, targetType }) => { - return new URL(url).pathname === '/cross-site-frame-fetch' && targetType === 'iframe' - }), - JSON.stringify(result.cdpRequests.filter(({ url }) => url.includes('cross-site-frame-fetch'))) - ).toBe(true) -} - -function identityChecks(result: ProbeResult): Readonly> { - const frameIdentity = identityForContext(result.identities, 'cross-site-frame') - const workerIdentity = identityForContext(result.identities, 'dedicated-worker') - const frameReceipt = receiptForPath(result.receipts, '/cross-site-frame-fetch') - const workerScriptReceipt = receiptForPath(result.receipts, '/dedicated-worker.js') - const workerFetchReceipt = receiptForPath(result.receipts, '/dedicated-worker-fetch') - // Compare hints on a subsequent fetch because initial navigation may omit them. - const rootReceipt = receiptForPath(result.receipts, '/report/document') - return { - crossSiteDocument: frameIdentity.userAgent === result.cleanUserAgent, - crossSiteFetch: frameReceipt.userAgent === result.cleanUserAgent, - dedicatedWorkerScript: workerScriptReceipt.userAgent === result.cleanUserAgent, - dedicatedWorkerFetch: - workerIdentity.userAgent === result.cleanUserAgent && - workerFetchReceipt.userAgent === result.cleanUserAgent, - clientHints: clientHintIdentityIsClean( - rootReceipt, - identityForContext(result.identities, 'document'), - result.cleanUserAgent - ) - } -} - -function clientHintIdentityIsClean( - receipt: WireProbeReceipt, - identity: WireProbeJavaScriptIdentity, - cleanUserAgent: string -): boolean { - // Native UA-CH can remain Chromium-shaped; require a clean legacy UA on the same request. - const secChUa = receipt.clientHints['sec-ch-ua'] - const wireBrands = parseSecChUa(secChUa) - const navigatorBrands = readNavigatorBrands(identity.userAgentData) - if (!secChUa || wireBrands.length === 0 || navigatorBrands.length === 0) { - return false - } - const token = /electron|orca/i - return ( - receipt.userAgent === cleanUserAgent && - !token.test(receipt.userAgent ?? '') && - !token.test(secChUa) && - !navigatorBrands.some(({ brand, version }) => token.test(brand) || token.test(version)) && - sameBrands(wireBrands, navigatorBrands) - ) -} - -function parseSecChUa(value: string | undefined): { brand: string; version: string }[] { - if (!value) { - return [] - } - const brands: { brand: string; version: string }[] = [] - const pattern = /"([^"]+)"\s*;\s*v="([^"]*)"/g - for (const match of value.matchAll(pattern)) { - const brand = match[1] - const version = match[2] - if (brand !== undefined && version !== undefined) { - brands.push({ brand, version }) - } - } - return brands -} - -function readNavigatorBrands(value: unknown): { brand: string; version: string }[] { - if (typeof value !== 'object' || value === null) { - return [] - } - const brandsValue = Object.entries(value).find(([key]) => key === 'brands')?.[1] - if (!Array.isArray(brandsValue)) { - return [] - } - const brands: { brand: string; version: string }[] = [] - for (const entry of brandsValue) { - if (typeof entry !== 'object' || entry === null) { - continue - } - const fields = Object.fromEntries(Object.entries(entry)) - const brand = fields.brand - const version = fields.version - if (typeof brand === 'string' && typeof version === 'string') { - brands.push({ brand, version }) - } - } - return brands -} - -function sameBrands( - left: readonly { brand: string; version: string }[], - right: readonly { brand: string; version: string }[] -): boolean { - const normalize = (brands: readonly { brand: string; version: string }[]) => - brands.map(({ brand, version }) => `${brand}\u0000${version}`).sort() - return JSON.stringify(normalize(left)) === JSON.stringify(normalize(right)) -} - -function identityForContext( - identities: readonly WireProbeJavaScriptIdentity[], - context: string -): WireProbeJavaScriptIdentity { - const matches = identities.filter((identity) => identity.context === context) - expect(matches, context).toHaveLength(1) - return matches[0]! -} - -function receiptForPath(receipts: readonly WireProbeReceipt[], path: string): WireProbeReceipt { - const matches = receipts.filter((receipt) => receipt.path === path) - expect(matches, path).not.toHaveLength(0) - return matches[0]! -} - -async function reservePort(): Promise { - const server = createServer() - await new Promise((resolve, reject) => { - server.once('error', reject) - server.listen(0, '127.0.0.1', resolve) - }) - const address = server.address() - if (!address || typeof address === 'string') { - throw new Error('cdp port unavailable') - } - await new Promise((resolve) => server.close(() => resolve())) - return address.port -} - -function waitForProcess(process: ChildProcess): Promise<{ code: number | null; stderr: string }> { - let stderr = '' - process.stderr?.setEncoding('utf8') - process.stderr?.on('data', (chunk: string) => { - stderr += chunk - }) - return new Promise((resolve, reject) => { - process.once('error', reject) - process.once('exit', (code) => resolve({ code, stderr })) - }) -} diff --git a/src/main/browser/sessions/partition-policies/browser-session-partition-proxy-install.test.ts b/src/main/browser/sessions/partition-policies/browser-session-partition-proxy-install.test.ts deleted file mode 100644 index edccd0a8004..00000000000 --- a/src/main/browser/sessions/partition-policies/browser-session-partition-proxy-install.test.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const { fromPartitionMock } = vi.hoisted(() => { - const sessionsByPartition = new Map>>() - const fromPartitionMock = vi.fn((partition: string) => { - const existing = sessionsByPartition.get(partition) - if (existing) { - return existing - } - const created = { - resolveProxy: vi.fn(async () => 'DIRECT'), - setProxy: vi.fn(async () => {}), - closeAllConnections: vi.fn(async () => {}), - getUserAgent: vi.fn(() => 'Mozilla/5.0 Electron/43.0.0 Orca/1.0'), - setUserAgent: vi.fn(), - setPermissionRequestHandler: vi.fn(), - setPermissionCheckHandler: vi.fn(), - setDisplayMediaRequestHandler: vi.fn(), - removeListener: vi.fn(), - on: vi.fn() - } - sessionsByPartition.set(partition, created) - return created - }) - return { sessionsByPartition, fromPartitionMock } -}) - -const identityState = vi.hoisted(() => ({ unavailable: false })) - -vi.mock('electron', () => ({ - session: { - defaultSession: { resolveProxy: vi.fn(async () => 'DIRECT'), setProxy: vi.fn(async () => {}) }, - fromPartition: fromPartitionMock - } -})) -vi.mock('../../guest-lifecycle/manager/browser-manager', () => ({ - browserManager: { - installCertificateRequestGuard: vi.fn(), - removeCertificateRequestGuard: vi.fn(), - notifyPermissionDenied: vi.fn(), - handleGuestWillDownload: vi.fn() - } -})) -vi.mock('../../site-settings/permissions/browser-media-access', () => ({ - hasSystemMediaAccess: vi.fn(() => false), - requestSystemMediaAccess: vi.fn(async () => false) -})) -vi.mock('../../identity/requests/browser-session-ua', () => ({ - installBrowserSessionUserAgentPolicy: vi.fn(() => vi.fn()) -})) -vi.mock('../../identity/browser-process-user-agent', () => ({ - getBrowserProcessUserAgentIdentity: () => { - if (identityState.unavailable) { - throw new Error('Browser process user agent is not initialized') - } - return { - mode: 'clean', - userAgent: 'Mozilla/5.0 Chrome/150.0.0.0 Safari/537.36' - } - } -})) -vi.mock('../../webauthn/browser-webauthn-access', () => ({ - allowsBrowserWebAuthnPermission: vi.fn(() => false), - clearBrowserWebAuthnAccessHandlers: vi.fn(), - installBrowserWebAuthnAccessHandlers: vi.fn() -})) - -import { - clearBrowserSessionPartitionPolicies, - installBrowserSessionPartitionPolicies -} from './browser-session-partition-policies' - -import { - applyBrowserSessionProxies, - setBrowserNetworkProxySettingsResolver -} from '../proxy/browser-session-proxy' -import { handleElectronProxyLogin } from '../../../network/electron-proxy-credentials' - -let partitionCounter = 0 -function nextProfile() { - partitionCounter += 1 - const partition = `persist:orca-browser-session-install-${partitionCounter}` - return { - id: `p${partitionCounter}`, - scope: 'isolated' as const, - partition, - label: 'p', - source: null - } -} - -describe('installBrowserSessionPartitionPolicies proxy wiring', () => { - beforeEach(() => { - setBrowserNetworkProxySettingsResolver(null) - // Ignore host-shell proxy variables when testing settings. - for (const key of [ - 'HTTP_PROXY', - 'http_proxy', - 'HTTPS_PROXY', - 'https_proxy', - 'ALL_PROXY', - 'all_proxy' - ]) { - vi.stubEnv(key, '') - } - }) - - afterEach(() => { - setBrowserNetworkProxySettingsResolver(null) - vi.unstubAllEnvs() - identityState.unavailable = false - }) - - it('reports an unavailable process identity through the promise, not a synchronous throw', async () => { - const profile = nextProfile() - identityState.unavailable = true - - let installation: Promise | undefined - expect(() => { - installation = installBrowserSessionPartitionPolicies(profile) - }).not.toThrow() - await expect(installation).rejects.toThrow('Browser process user agent is not initialized') - }) - - it('does not report a new partition ready until Electron finishes applying its proxy', async () => { - let finishWrite: (() => void) | undefined - setBrowserNetworkProxySettingsResolver(() => ({ - httpProxyUrl: 'socks5://127.0.0.1:1080', - httpProxyBypassRules: '' - })) - const profile = nextProfile() - const sess = fromPartitionMock(profile.partition) - sess.setProxy.mockImplementation(() => new Promise((resolve) => (finishWrite = resolve))) - - let ready = false - const installation = installBrowserSessionPartitionPolicies(profile).then(() => (ready = true)) - await vi.waitFor(() => expect(sess.setProxy).toHaveBeenCalledTimes(1)) - expect(ready).toBe(false) - - finishWrite?.() - await installation - expect(ready).toBe(true) - }) - - it('recovers partition readiness after one transient proxy rejection', async () => { - setBrowserNetworkProxySettingsResolver(() => ({ - httpProxyUrl: 'http://proxy.example:8080', - httpProxyBypassRules: '' - })) - const profile = nextProfile() - const sess = fromPartitionMock(profile.partition) - sess.setProxy.mockRejectedValueOnce(new Error('transient proxy failure')) - - await expect(installBrowserSessionPartitionPolicies(profile)).resolves.toBeUndefined() - - expect(sess.setProxy).toHaveBeenCalledTimes(2) - }) - - it('forgets failed startup credentials and restores them after recovery', async () => { - setBrowserNetworkProxySettingsResolver(() => ({ - httpProxyUrl: 'http://alice:secret@proxy.example:8080', - httpProxyBypassRules: '' - })) - const profile = nextProfile() - const sess = fromPartitionMock(profile.partition) - sess.closeAllConnections.mockRejectedValue(new Error('proxy settlement failed')) - - await expect(installBrowserSessionPartitionPolicies(profile)).rejects.toThrow( - 'proxy settlement failed' - ) - const failedCallback = vi.fn() - handleElectronProxyLogin( - { preventDefault: vi.fn() } as never, - { session: sess } as never, - {} as never, - { isProxy: true, host: 'proxy.example', port: 8080 }, - failedCallback - ) - expect(failedCallback).not.toHaveBeenCalled() - - sess.closeAllConnections.mockResolvedValue(undefined) - await expect(installBrowserSessionPartitionPolicies(profile)).resolves.toBeUndefined() - const recoveredCallback = vi.fn() - handleElectronProxyLogin( - { preventDefault: vi.fn() } as never, - { session: sess } as never, - {} as never, - { isProxy: true, host: 'proxy.example', port: 8080 }, - recoveredCallback - ) - expect(recoveredCallback).toHaveBeenCalledWith('alice', 'secret') - }) - - it('cancels an in-flight policy retry when partition policies are cleared', async () => { - let proxyUrl = 'http://old.example:8080' - let finishWrite: (() => void) | undefined - setBrowserNetworkProxySettingsResolver(() => ({ httpProxyUrl: proxyUrl })) - const profile = nextProfile() - const sess = fromPartitionMock(profile.partition) - sess.setProxy.mockImplementationOnce( - () => new Promise((resolve) => (finishWrite = resolve)) - ) - - const installation = installBrowserSessionPartitionPolicies(profile) - await vi.waitFor(() => expect(sess.setProxy).toHaveBeenCalledTimes(1)) - clearBrowserSessionPartitionPolicies(profile.partition, sess as never) - proxyUrl = 'http://new.example:8080' - await applyBrowserSessionProxies([], { httpProxyUrl: proxyUrl }) - finishWrite?.() - await installation - - expect(sess.setProxy).toHaveBeenCalledTimes(1) - }) -}) diff --git a/src/main/browser/site-settings/display/browser-site-display-controller.test.ts b/src/main/browser/site-settings/display/browser-site-display-controller.test.ts index 8ef505bf2d9..c9fc9e8eebd 100644 --- a/src/main/browser/site-settings/display/browser-site-display-controller.test.ts +++ b/src/main/browser/site-settings/display/browser-site-display-controller.test.ts @@ -4,10 +4,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { PersistedUIState } from '../../../../shared/persisted-ui-state-types' -import { - browserPageZoomLevelToPercent, - normalizeBrowserPageZoomLevel -} from '../../../../shared/browser-page-zoom' +import { browserPageZoomLevelToPercent } from '../../../../shared/browser-page-zoom' import { BrowserSiteDisplayController } from './browser-site-display-controller' import { configureBrowserSiteDisplayStore, @@ -55,12 +52,6 @@ function fakeGuest(url: string): FakeGuest { return guest } -function commit(controller: BrowserSiteDisplayController, guest: FakeGuest, url: string): void { - guest.url = url - controller.onMainFrameNavigationCommitted(guest.id) - guest.emit('dom-ready') -} - function uiStore(initial: Partial = {}): { getUI: () => PersistedUIState onUIChanged: (listener: (ui: PersistedUIState) => void) => () => void @@ -89,29 +80,6 @@ beforeEach(() => { }) describe('BrowserSiteDisplayController zoom', () => { - it('keeps zoom per site and browser profile, and resets it to Default Zoom', () => { - const controller = new BrowserSiteDisplayController() - const ui = uiStore({ browserDefaultZoomLevel: normalizeBrowserPageZoomLevel(0.5) }) - controller.followZoomSettings(ui) - const github = fakeGuest('https://github.com/a') - const githubOtherPort = fakeGuest('https://github.com:8443/b') - const githubWork = fakeGuest('https://github.com/c') - const docs = fakeGuest('https://docs.example.com/') - controller.onGuestRegistered(github, null) - controller.onGuestRegistered(githubOtherPort, 'default') - controller.onGuestRegistered(githubWork, 'work') - controller.onGuestRegistered(docs, null) - - controller.zoomPage(github.id, 'in') - - expect([github, githubOtherPort, githubWork, docs].map(percent)).toEqual([125, 125, 110, 110]) - commit(controller, docs, 'https://github.com/d') - expect(percent(docs)).toBe(125) - - expect(controller.zoomPage(github.id, 'reset')).toMatchObject({ siteHasZoom: false }) - expect([github, githubOtherPort, docs].map(percent)).toEqual([110, 110, 110]) - }) - it("restores the site's zoom after Orca's UI zoom is copied onto the page", () => { const controller = new BrowserSiteDisplayController() const ui = uiStore() @@ -141,41 +109,6 @@ describe('BrowserSiteDisplayController zoom', () => { }) describe('BrowserSiteDisplayController color scheme', () => { - it('uses chat media for document guests without changing zoom, and upgrades browser registration', () => { - const controller = new BrowserSiteDisplayController() - const preview = fakeGuest('orca-preview://grant/theme.html') - preview.level = 1 - controller.onGuestDocumentStart(preview, { - url: preview.url, - profileId: null, - colorScheme: 'dark' - }) - controller.onMainFrameNavigationCommitted(preview.id) - expect(preview.mediaSent).toEqual(['dark', 'dark']) - expect(preview.level).toBe(1) - expect(preview.listenerCount('dom-ready')).toBe(0) - - const local = fakeGuest('file:///chat-scratch/theme.html') - controller.onGuestDocumentStart(local, { - url: local.url, - profileId: 'work', - colorScheme: 'dark' - }) - controller.onGuestRegistered(local, 'work') - controller.setColorScheme(local.id, 'light') - controller.setGuestColorSchemeFallback(local, 'light') - controller.setGuestColorSchemeFallback(local, 'dark') - expect(local.mediaSent.at(-1)).toBe('light') - expect(controller.getPageDisplay(local.id)?.colorScheme).toBe('light') - controller.setColorScheme(local.id, null) - expect(local.mediaSent.at(-1)).toBe('dark') - controller.setGuestColorSchemeFallback(local, undefined) - commit(controller, local, 'https://ordinary.example/') - expect(local.mediaSent.slice(-2)).toEqual(['dark', '']) - controller.onGuestRetired(preview.id) - expect(preview.debugger.isAttached()).toBe(false) - }) - it.each([ { order: 'read-first', profileId: 'work', colorScheme: 'light', saved: 'dark' }, { order: 'registration-first', profileId: 'work', colorScheme: 'light', saved: 'dark' } diff --git a/src/main/browser/site-settings/permissions/browser-site-permission-prompt.test.ts b/src/main/browser/site-settings/permissions/browser-site-permission-prompt.test.ts index 80141f91612..59b43a07dc8 100644 --- a/src/main/browser/site-settings/permissions/browser-site-permission-prompt.test.ts +++ b/src/main/browser/site-settings/permissions/browser-site-permission-prompt.test.ts @@ -20,19 +20,12 @@ import { BROWSER_PAGE_PROMPT_TIMEOUT_MS, respondToBrowserPagePrompt } from '../../guest-lifecycle/prompts/browser-page-prompts' -import { - decideBrowserSitePermissions, - isBrowserSitePermissionAllowed -} from './browser-site-permission-prompt' +import { decideBrowserSitePermissions } from './browser-site-permission-prompt' import { savedBrowserSitePermissions, - sessionBrowserSitePermissions, type BrowserSitePermissionMemory } from './browser-site-permission-memory' -import { - configureBrowserSitePermissionStore, - listBrowserSitePermissions -} from './browser-site-permission-store' +import { configureBrowserSitePermissionStore } from './browser-site-permission-store' type MockGuest = Electron.WebContents & EventEmitter @@ -83,20 +76,6 @@ function ask( return decideBrowserSitePermissions({ requester: guest, frameOrigin, memory, permissions }) } -function allowedOnCheck( - permissions: BrowserSitePermission[], - { - memory = savedBrowserSitePermissions('default'), - frameOrigin = 'https://meet.example.com' - }: { memory?: BrowserSitePermissionMemory; frameOrigin?: string } = {} -): boolean { - return isBrowserSitePermissionAllowed({ - source: { pageUrl: 'https://meet.example.com/room', frameOrigin }, - memory, - permissions - }) -} - async function answerLatest(value: unknown): Promise { const request = sentRequests(renderer).at(-1) if (!request) { @@ -140,57 +119,4 @@ describe('browser site permission prompts', () => { await expect(ask(['camera', 'microphone'])).resolves.toBe(false) expect(sentRequests(renderer)).toHaveLength(2) }) - - it("keeps a paired server's answers for its session only, where checks still see them", async () => { - const pairedSession = sessionBrowserSitePermissions('persist:paired-a') - const call = ask(['notifications'], { memory: pairedSession }) - await answerLatest('allow') - await expect(call).resolves.toBe(true) - - expect(allowedOnCheck(['notifications'], { memory: pairedSession })).toBe(true) - await expect(ask(['notifications'], { memory: pairedSession })).resolves.toBe(true) - expect(sentRequests(renderer)).toHaveLength(1) - expect(listBrowserSitePermissions('default')).toEqual([]) - void ask(['notifications'], { memory: sessionBrowserSitePermissions('persist:paired-b') }) - expect(sentRequests(renderer)).toHaveLength(2) - }) - - it("gives another site's frame only its own notification answer, and never asks for it", async () => { - const tab = ask(['notifications']) - await answerLatest('allow') - await tab - const widgetPage = ask(['notifications'], { guest: mockGuest('https://widget.example.net/') }) - await answerLatest('allow') - await widgetPage - - expect(allowedOnCheck(['notifications'], { frameOrigin: 'https://widget.example.net' })).toBe( - true - ) - await expect( - ask(['notifications'], { frameOrigin: 'https://widget.example.net' }) - ).resolves.toBe(true) - expect(allowedOnCheck(['notifications'], { frameOrigin: 'https://ads.example.net' })).toBe( - false - ) - await expect(ask(['notifications'], { frameOrigin: 'https://ads.example.net' })).resolves.toBe( - false - ) - expect(sentRequests(renderer)).toHaveLength(2) - }) - - it('remembers answers across a restart', async () => { - const directory = mkdtempSync(join(tmpdir(), 'orca-site-permissions-')) - configureBrowserSitePermissionStore(directory) - const call = ask(['midi']) - await answerLatest('allow') - await call - - // Switch directories to evict the cache and verify the next read comes from disk. - configureBrowserSitePermissionStore(mkdtempSync(join(tmpdir(), 'orca-site-permissions-'))) - expect(listBrowserSitePermissions('default')).toEqual([]) - configureBrowserSitePermissionStore(directory) - expect(listBrowserSitePermissions('default')).toEqual([ - { origin: 'https://meet.example.com', decisions: { midi: 'allow' } } - ]) - }) }) From 1afbb01955caf98ad61cc939bdedd7fbe211e6f5 Mon Sep 17 00:00:00 2001 From: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com> Date: Fri, 13 Nov 2026 17:12:43 -0500 Subject: [PATCH 22/49] fix(orchestration): a reuse start that failed before binding reads as never started (#42112) * fix(orchestration): a reuse start that failed before binding reads as never started * test: read the failed reuse start's dispatch without a cast --- .../turn-stops/failed-worker-start-report.ts | 31 +++++++++++++++++-- .../start/failed-worker-start-report.test.ts | 28 +++++++++++++++++ .../orchestration/worker/worker-control.ts | 5 +-- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/main/runtime/orchestration/workers/turn-stops/failed-worker-start-report.ts b/src/main/runtime/orchestration/workers/turn-stops/failed-worker-start-report.ts index 4b2fbfc7335..f9d21e1c70e 100644 --- a/src/main/runtime/orchestration/workers/turn-stops/failed-worker-start-report.ts +++ b/src/main/runtime/orchestration/workers/turn-stops/failed-worker-start-report.ts @@ -1,5 +1,5 @@ import type { OrchestrationDb } from '../../db/orchestration-db' -import type { WorkerDispatchRow } from '../../db/orchestration-records' +import type { DispatchContextRow, WorkerDispatchRow } from '../../db/orchestration-records' import { reportWorkerTurnStop } from './worker-turn-stop-report' /** What a failed start left behind, as its residual resources name it. */ @@ -28,6 +28,32 @@ function describeLeftover(residualResources: string): string | undefined { return described.length > 0 ? described.join(', ') : undefined } +function reusesTerminal(worker: WorkerDispatchRow): boolean { + try { + const options: unknown = JSON.parse(worker.start_options) + return ( + typeof options === 'object' && options !== null && 'terminal' in options && !!options.terminal + ) + } catch { + return false + } +} + +/** A start that failed after its terminal opened still has output to read; a local reuse start + * that failed before binding never ran in the terminal it named. Federated rows never bind here. */ +export function failedWorkerStartHasOutput( + db: OrchestrationDb, + worker: WorkerDispatchRow, + dispatch: DispatchContextRow | undefined +): boolean { + const unboundReuse = + reusesTerminal(worker) && + !dispatch?.assignee_handle && + !dispatch?.assignee_orca_session_id && + !db.getFederatedDispatch(worker.dispatch_id) + return Boolean(worker.agent_terminal_handle || dispatch?.assignee_handle) && !unboundReuse +} + /** A failed start leaves its task unowned, and the caller may never have read the start's receipt. */ export function reportFailedWorkerStart( db: OrchestrationDb, @@ -51,8 +77,7 @@ export function reportFailedWorkerStart( cause: `it never started: ${worker.last_error ?? 'its start failed'}`, lastOutput: undefined, leftover: describeLeftover(worker.residual_resources), - // A start that failed after its terminal opened still has output to read. - ...(worker.agent_terminal_handle || dispatch.assignee_handle ? {} : { neverStarted: true }), + ...(failedWorkerStartHasOutput(db, worker, dispatch) ? {} : { neverStarted: true }), ...(settled ? { settled } : {}) }, { getDb: () => db, isWaitingForMail: () => false, notify } diff --git a/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts b/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts index efa444c6ec9..ba0dceae158 100644 --- a/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts +++ b/src/main/runtime/rpc/methods/orchestration/worker/start/failed-worker-start-report.test.ts @@ -51,4 +51,32 @@ describe('a worker-start that fails', () => { expect(lost?.from_handle).toMatch(/^dispatch:/) expect(h.runtime.orchestrationSenderNames.sender(lost!.from_handle).agent).toBe('claude') }) + + it('treats a reuse start that failed before binding as never started', async () => { + h.setup() + vi.spyOn(h.runtime, 'waitForTerminal').mockResolvedValue({ + handle: 'term_reused', + condition: 'tui-idle', + satisfied: false, + status: 'running', + exitCode: null + }) + const task = h.db.createTask({ spec: 'follow up on the PR', runId: h.activeRunId }) + const receipt = await h.call('orchestration.workerStart', { + task: task.id, + from: 'term_coord', + terminal: 'term_reused' + }) + expect(receipt).toMatchObject({ state: 'failed' }) + const dispatchId = h.db.getDispatchContext(task.id)?.id + + const [lost] = h.db.getUnreadRunMailbox(h.activeRunId, 100, ['escalation']) + expect(lost?.body).not.toContain('worker-read') + await expect( + h.call('orchestration.workerRead', { dispatch: dispatchId }) + ).rejects.toMatchObject({ + code: 'worker_never_started', + message: expect.stringContaining('never started: Agent did not become ready') + }) + }) }) diff --git a/src/main/runtime/rpc/methods/orchestration/worker/worker-control.ts b/src/main/runtime/rpc/methods/orchestration/worker/worker-control.ts index 9ea94c34645..71ba02a4de5 100644 --- a/src/main/runtime/rpc/methods/orchestration/worker/worker-control.ts +++ b/src/main/runtime/rpc/methods/orchestration/worker/worker-control.ts @@ -18,6 +18,7 @@ import { sessionIdFromStructuredWorkerIncarnation } from '../../../../orchestrat import { readExactWorkerOutput } from './output/worker-output' import { exposeWorkerTerminalResource } from './release/worker-terminal-resource-presentation' import { liveWorkerTerminalAutoReleaseAt } from '../../../../orchestration/terminal-authority/release/worker-terminal-ownership' +import { failedWorkerStartHasOutput } from '../../../../orchestration/workers/turn-stops/failed-worker-start-report' import { readFederatedWorkerOutput } from '../../../../orchestration/legacy-remote-home/federated-worker-read' import { showFederatedWorker } from '../../../../orchestration/legacy-remote-home/federated-worker-show' import { @@ -93,8 +94,8 @@ export const ORCHESTRATION_WORKER_CONTROL_METHODS = [ const dispatch = db.getDispatchContextById(params.dispatch) const worker = db.getWorkerDispatch(params.dispatch) const terminalHandle = worker?.agent_terminal_handle ?? dispatch?.assignee_handle - // A start that never got a terminal has only its failure, on any host. - if (worker?.state === 'failed' && !terminalHandle) { + // A start that never ran in a terminal has only its failure, on any host. + if (worker?.state === 'failed' && !failedWorkerStartHasOutput(db, worker, dispatch)) { throw new OrchestrationError( 'worker_never_started', `Worker Dispatch ${params.dispatch} never started: ${worker.last_error ?? 'its start failed'}` From 3168badf7ea11193ddfb00ed98da8823acfc3659 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 14:16:23 -0800 Subject: [PATCH 23/49] Approve workspace setup from the branch the workspace is created from (#41823) * fix(hooks): approve setup from the ref a new workspace checks out The setup trust check before a create read orca.yaml from the project's own checkout, while the host (since #37977) checks the created worktree. A checkout behind origin/main made every create skip setup and open the "branch has different setup commands" dialog right after creation. The check now reads orca.yaml at the ref the create checks out (the resolved base, or the local branch for explicit reuse), refreshing it only when create would, under one deadline. Any failure falls back to the previous checkout read, and older hosts ignore the new parameter. * fix(hooks): stop optional setup reads at the deadline and cover automation recovery, VM and web paths * fix(hooks): refuse late WSL git retries and approve an automation's saved base on recovery * docs(hooks): move the skipped-setup recovery comment back to its function * fix(automations): re-approve setup when an automation's base branch changes --- src/main/git/command-runner/git-exec-file.ts | 3 + .../refs/resolution/repo-default-base-ref.ts | 6 +- .../creation/worktree-base-ref-probe.ts | 1 + .../register-worktree-hook-check-handler.ts | 32 +++- .../runtime-repository-command-state.ts | 11 +- .../runtime-repository-hooks-commands.ts | 21 ++- src/main/runtime/rpc/methods/projects/repo.ts | 5 +- ...create-source-setup-hooks-real-git.test.ts | 75 ++++++++ .../create-source-setup-hooks.ts | 166 ++++++++++++++++++ src/preload/api/agent-hooks/agent-hook-api.ts | 10 +- src/preload/api/agent-hooks/hooks-bridge.ts | 9 +- .../authoring/automation-orca-save.ts | 22 +-- .../authoring/automation-setup-review.ts | 62 ++++++- .../creation/setup/workspace-setup-trust.ts | 7 +- .../work-item/direct-work-item-setup.ts | 19 +- .../work-item/launch-work-item-direct.ts | 44 ++--- ...worktree-creation-hook-preparation.test.ts | 27 +++ .../worktree-creation-hook-preparation.ts | 23 ++- .../repo-hooks/ensure-hooks-confirmed.ts | 8 +- .../repo-hooks/runtime-hooks-client.ts | 11 +- .../src/web/preload-api/web-review-api.ts | 5 +- .../rpc-contract/projects/repo-params.ts | 13 +- .../worktree/setup-hooks-create-source.ts | 7 + 23 files changed, 525 insertions(+), 62 deletions(-) create mode 100644 src/main/workspace-hooks/create-source-setup-hooks-real-git.test.ts create mode 100644 src/main/workspace-hooks/create-source-setup-hooks.ts create mode 100644 src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.test.ts create mode 100644 src/shared/worktree/setup-hooks-create-source.ts diff --git a/src/main/git/command-runner/git-exec-file.ts b/src/main/git/command-runner/git-exec-file.ts index d116f2f7b90..d4687d919fd 100644 --- a/src/main/git/command-runner/git-exec-file.ts +++ b/src/main/git/command-runner/git-exec-file.ts @@ -137,6 +137,9 @@ async function gitExecFileAsyncUnlocked( ) { await terminationState.current const wasMissing = invalidateMissingDirectWslGit(error, resolved) + if (options.canStart?.() === false) { + throw createAbortError() + } const fallback = resolveGitCommand(args, effectiveOptions, true, true) result = await capture(fallback) // Why: matching failures can be normal Git control flow; only a successful login retry proves the direct environment was insufficient. diff --git a/src/main/git/refs/resolution/repo-default-base-ref.ts b/src/main/git/refs/resolution/repo-default-base-ref.ts index f811ffd7bb4..aec7701f864 100644 --- a/src/main/git/refs/resolution/repo-default-base-ref.ts +++ b/src/main/git/refs/resolution/repo-default-base-ref.ts @@ -5,12 +5,15 @@ import { resolveDefaultBaseRefViaExec } from '../../../../shared/git/refs/git-de export type LocalGitExecOptions = { wslDistro?: string admissionTier?: GitAdmissionTier + /** Checked at admission; a bounded optional read refuses git that would start past its deadline. */ + canStart?: () => boolean } export type LocalDefaultBaseRefGitOptions = { cwd: string wslDistro?: string admissionTier?: GitAdmissionTier + canStart?: () => boolean } export const DEFAULT_BASE_REF_PROBE_TIMEOUT_MS = 15_000 @@ -22,7 +25,8 @@ export function gitExecOptions( return { cwd, ...(options.wslDistro ? { wslDistro: options.wslDistro } : {}), - ...(options.admissionTier ? { admissionTier: options.admissionTier } : {}) + ...(options.admissionTier ? { admissionTier: options.admissionTier } : {}), + ...(options.canStart ? { canStart: options.canStart } : {}) } } diff --git a/src/main/git/worktrees/creation/worktree-base-ref-probe.ts b/src/main/git/worktrees/creation/worktree-base-ref-probe.ts index 8d0f1c6b10a..25b67689b97 100644 --- a/src/main/git/worktrees/creation/worktree-base-ref-probe.ts +++ b/src/main/git/worktrees/creation/worktree-base-ref-probe.ts @@ -8,6 +8,7 @@ import { resolveWorktreeAddBaseRef } from '../../../../shared/worktree/base-refs type GitExecOptions = { wslDistro?: string admissionTier?: GitAdmissionTier + canStart?: () => boolean } /** Return the probe's commit OID so callers need not resolve it again. */ diff --git a/src/main/ipc/hooks/register-worktree-hook-check-handler.ts b/src/main/ipc/hooks/register-worktree-hook-check-handler.ts index ae5ac61df6f..84a2d78e74d 100644 --- a/src/main/ipc/hooks/register-worktree-hook-check-handler.ts +++ b/src/main/ipc/hooks/register-worktree-hook-check-handler.ts @@ -10,13 +10,24 @@ import { hasHooksFile, loadHooks, hasUnrecognizedOrcaYamlKeys } from '../../work import { resolveRepoForExecutionHost } from '../worktrees/repo-host-ownership' import { blockedWslDistroForPath } from '../../wsl/filesystem/wsl-unc-access-gate' import type { WorktreeIpcContext } from '../worktrees/worktree-ipc-context' +import type { SetupHooksCreateSource } from '../../../shared/worktree/setup-hooks-create-source' +import { readCreateSourceSetupHooks } from '../../workspace-hooks/create-source-setup-hooks' +import { getWorktreeCreatePrefetchGitOptions } from '../../workspaces/execution-host/project-runtime-git-options' export function registerWorktreeHookCheckHandler(context: WorktreeIpcContext): void { - const { store } = context + const { store, runtime } = context ipcMain.handle( 'hooks:check', - async (_event, args: { repoId: string; hostId?: ExecutionHostId; background?: boolean }) => { + async ( + _event, + args: { + repoId: string + hostId?: ExecutionHostId + background?: boolean + createSource?: SetupHooksCreateSource + } + ) => { const repo = resolveRepoForExecutionHost(store, args.repoId, args.hostId) if (!repo) { const repoIdExists = store.getRepos().some((candidate) => candidate.id === args.repoId) @@ -58,6 +69,23 @@ export function registerWorktreeHookCheckHandler(context: WorktreeIpcContext): v } } + if (args.createSource && !args.background) { + const created = await readCreateSourceSetupHooks({ + repo, + source: args.createSource, + runtime, + gitOptions: getWorktreeCreatePrefetchGitOptions(store, repo) + }) + if (created) { + return { + status: 'ok', + hasHooks: created.hooks !== null, + hooks: created.hooks, + mayNeedUpdate: false + } + } + } + const has = hasHooksFile(repo.path) const hooks = scopeHooksToRepoKind(repo, has ? loadHooks(repo.path) : null) // Well-formed unknown keys may come from a newer Orca; suggest updating instead of parse repair. diff --git a/src/main/runtime/construction/runtime-repository-command-state.ts b/src/main/runtime/construction/runtime-repository-command-state.ts index 59f39b3725f..9562eb18589 100644 --- a/src/main/runtime/construction/runtime-repository-command-state.ts +++ b/src/main/runtime/construction/runtime-repository-command-state.ts @@ -21,6 +21,8 @@ import { storeBackedBranchSwitchSources } from '../integrations/git/runtime-branch-switch-host' import { OrcaRuntimeWithFileCommands } from './runtime-file-command-state' +import { readCreateSourceSetupHooks } from '../../workspace-hooks/create-source-setup-hooks' +import { getWorktreeCreatePrefetchGitOptions } from '../../workspaces/execution-host/project-runtime-git-options' export abstract class OrcaRuntimeWithRepositoryCommands extends OrcaRuntimeWithFileCommands { protected readonly gitCommands = new RuntimeGitCommands({ @@ -156,7 +158,14 @@ export abstract class OrcaRuntimeWithRepositoryCommands extends OrcaRuntimeWithF protected readonly gitHubProjectCommands = new RuntimeGitHubProjectCommands() protected readonly repositoryHooks = new RuntimeRepositoryHooksCommands({ - resolveRepo: (selector) => this.resolveRepoSelector(selector) + resolveRepo: (selector) => this.resolveRepoSelector(selector), + readCreateSourceHooks: (repo, source) => + readCreateSourceSetupHooks({ + repo, + source, + runtime: this.remoteFetches, + gitOptions: getWorktreeCreatePrefetchGitOptions(this.requireStore(), repo) + }) }) protected readonly repositoryIssueCommand = new RuntimeRepositoryIssueCommand({ diff --git a/src/main/runtime/repositories/runtime-repository-hooks-commands.ts b/src/main/runtime/repositories/runtime-repository-hooks-commands.ts index 844dc691151..c5c8016f0a4 100644 --- a/src/main/runtime/repositories/runtime-repository-hooks-commands.ts +++ b/src/main/runtime/repositories/runtime-repository-hooks-commands.ts @@ -19,9 +19,14 @@ import { inspectSetupScriptImportCandidates } from '../../../shared/workspace-se import { joinWorktreeRelativePath } from '../files/paths/runtime-relative-paths' import { blockedWslDistroForPath } from '../../wsl/filesystem/wsl-unc-access-gate' import { hashOrcaHookTrustContent } from '../../workspace-hooks/created-worktree-setup-trust' +import type { SetupHooksCreateSource } from '../../../shared/worktree/setup-hooks-create-source' type RuntimeRepositoryHooksCommandsDeps = { resolveRepo: (selector: string) => Promise + readCreateSourceHooks: ( + repo: Repo, + source: SetupHooksCreateSource + ) => Promise<{ hooks: OrcaHooks | null } | undefined> } export class RuntimeRepositoryHooksCommands { @@ -60,7 +65,10 @@ export class RuntimeRepositoryHooksCommands { } } - async checkRepoHooks(repoSelector: string, options: { background?: boolean } = {}) { + async checkRepoHooks( + repoSelector: string, + options: { background?: boolean; createSource?: SetupHooksCreateSource } = {} + ) { const repo = await this.deps.resolveRepo(repoSelector) if (isFolderRepo(repo) && !isRepoOnCatalogHost(repo)) { return { status: 'ok' as const, hasHooks: false, hooks: null, mayNeedUpdate: false } @@ -83,6 +91,17 @@ export class RuntimeRepositoryHooksCommands { : ('wsl-distro-unverifiable' as const) } } + if (options.createSource && !options.background) { + const created = await this.deps.readCreateSourceHooks(repo, options.createSource) + if (created) { + return { + status: 'ok' as const, + hasHooks: created.hooks !== null, + hooks: created.hooks, + mayNeedUpdate: false + } + } + } const has = hasHooksFile(repo.path) const hooks = scopeHooksToRepoKind(repo, has ? loadHooks(repo.path) : null) return { diff --git a/src/main/runtime/rpc/methods/projects/repo.ts b/src/main/runtime/rpc/methods/projects/repo.ts index 21672047b84..da9c4181b46 100644 --- a/src/main/runtime/rpc/methods/projects/repo.ts +++ b/src/main/runtime/rpc/methods/projects/repo.ts @@ -233,7 +233,10 @@ export const REPO_METHODS = [ permission: 'workspace', params: RepoHooksCheck, handler: async (params, { runtime }) => - runtime.checkRepoHooks(params.repo, { background: repoHooksCheckIsBackground(params) }) + runtime.checkRepoHooks(params.repo, { + background: repoHooksCheckIsBackground(params), + createSource: params.createSource + }) }), defineMethod({ name: 'repo.setupScriptImports', diff --git a/src/main/workspace-hooks/create-source-setup-hooks-real-git.test.ts b/src/main/workspace-hooks/create-source-setup-hooks-real-git.test.ts new file mode 100644 index 00000000000..56dc35be59b --- /dev/null +++ b/src/main/workspace-hooks/create-source-setup-hooks-real-git.test.ts @@ -0,0 +1,75 @@ +import { mkdtemp, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, expect, it } from 'vitest' +import type { Repo } from '../../shared/repo-types' +import { gitExecFileAsync } from '../git/command-runner/git-exec-file' +import { RuntimeRemoteFetchController } from '../runtime/repositories/runtime-remote-fetch-controller' +import { readCreateSourceSetupHooks } from './create-source-setup-hooks' + +const roots: string[] = [] +afterEach(async () => { + await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +const commitArgs = ['-c', 'user.name=Test', '-c', 'user.email=test@example.com'] + +async function git(cwd: string, ...args: string[]): Promise { + await gitExecFileAsync(args, { cwd }) +} + +async function commitOrcaYaml(cwd: string, setupLine: string, eol = '\n'): Promise { + const yaml = ['scripts:', ' setup: |', ` ${setupLine}`, ''].join(eol) + await writeFile(join(cwd, 'orca.yaml'), yaml) + await git(cwd, 'add', 'orca.yaml') + await git(cwd, ...commitArgs, 'commit', '-m', setupLine) +} + +// A project checkout left on old setup commands while origin/main moved on. +async function staleCheckout(): Promise<{ repo: Repo; upstream: string }> { + const root = await mkdtemp(join(tmpdir(), 'orca-create-source-hooks-')) + roots.push(root) + const upstream = join(root, 'upstream') + const checkout = join(root, 'checkout') + await git(root, 'init', '-b', 'main', upstream) + await git(upstream, 'config', 'core.autocrlf', 'false') + await commitOrcaYaml(upstream, 'node old-setup.mjs') + await git(root, 'clone', upstream, checkout) + await commitOrcaYaml(upstream, 'node new-setup.mjs', '\r\n') + const repo: Repo = { + id: 'repo-1', + path: checkout, + displayName: 'repo', + badgeColor: '#000000', + addedAt: 0 + } + return { repo, upstream } +} + +function read(repo: Repo, source: Parameters[0]['source']) { + return readCreateSourceSetupHooks({ + repo, + source, + runtime: new RuntimeRemoteFetchController(), + gitOptions: {} + }) +} + +it('reads the refreshed base instead of the stale project checkout', async () => { + const { repo } = await staleCheckout() + + const result = await read(repo, { kind: 'base', baseBranch: 'origin/main' }) + + expect(result?.hooks?.scripts.setup).toBe('node new-setup.mjs') +}) + +it('reads an explicitly reused local branch, and the base when that branch is absent', async () => { + const { repo } = await staleCheckout() + await git(repo.path, 'branch', 'feature', 'main') + + const reused = await read(repo, { kind: 'branch', ref: 'feature', baseBranch: 'origin/main' }) + const created = await read(repo, { kind: 'branch', ref: 'missing', baseBranch: 'origin/main' }) + + expect(reused?.hooks?.scripts.setup).toBe('node old-setup.mjs') + expect(created?.hooks?.scripts.setup).toBe('node new-setup.mjs') +}) diff --git a/src/main/workspace-hooks/create-source-setup-hooks.ts b/src/main/workspace-hooks/create-source-setup-hooks.ts new file mode 100644 index 00000000000..9d5656a70e1 --- /dev/null +++ b/src/main/workspace-hooks/create-source-setup-hooks.ts @@ -0,0 +1,166 @@ +import type { Repo } from '../../shared/repo-types' +import type { OrcaHooks } from '../../shared/orca-yaml-hook-types' +import { parseOrcaYaml } from '../../shared/orca-yaml' +import { scopeHooksToRepoKind } from '../../shared/folder-workspace-hooks' +import { isFolderRepo } from '../../shared/repo-kind' +import { resolveWorktreeAddBaseRef } from '../../shared/worktree/base-refs/base-ref' +import type { SetupHooksCreateSource } from '../../shared/worktree/setup-hooks-create-source' +import { gitExecFileAsync } from '../git/command-runner/git-exec-file' +import { + getDefaultBaseRefAsync, + type LocalGitExecOptions +} from '../git/refs/resolution/repo-default-base-ref' +import { + hasLocalWorktreeBaseRef, + hasWorktreeBaseCommitRef +} from '../git/worktrees/creation/worktree-base-ref-probe' +import { resolveWorktreeCreateBase } from '../workspaces/creation/worktree-create-base' +import type { + RemoteFetchResult, + RemoteTrackingBase +} from '../runtime/repositories/runtime-remote-fetch-controller' + +// Leaves the 15 s hooks-check RPC room to fall back to the checkout read. +const CREATE_SOURCE_READ_DEADLINE_MS = 8_000 + +export type CreateSourceSetupHooksRuntime = { + resolveRemoteTrackingBase: ( + repoPath: string, + baseBranch: string, + options?: LocalGitExecOptions + ) => Promise + hasRemoteTrackingRef: ( + repoPath: string, + base: RemoteTrackingBase, + options?: LocalGitExecOptions + ) => Promise + getOrStartRemoteTrackingBaseRefresh: ( + repoPath: string, + base: RemoteTrackingBase, + options?: LocalGitExecOptions + ) => Promise +} + +class DeadlinePassed extends Error {} + +/** + * The orca.yaml hooks at the ref a create will check out. Undefined when that ref can't be read in + * time; callers then read the project checkout, as before, and the host's created-worktree check stays the backstop. + */ +export async function readCreateSourceSetupHooks(args: { + repo: Repo + source: SetupHooksCreateSource + runtime: CreateSourceSetupHooksRuntime + gitOptions: LocalGitExecOptions +}): Promise<{ hooks: OrcaHooks | null } | undefined> { + if (isFolderRepo(args.repo)) { + return undefined + } + const deadline = Date.now() + CREATE_SOURCE_READ_DEADLINE_MS + // Git admission refuses past the deadline, even for a step the race already abandoned. + const gated = { ...args.gitOptions, canStart: () => Date.now() < deadline } + const step = async (work: () => Promise): Promise => { + const remaining = deadline - Date.now() + if (remaining <= 0) { + throw new DeadlinePassed() + } + let timer: ReturnType | undefined + try { + return await Promise.race([ + work(), + new Promise((_, reject) => { + timer = setTimeout(() => reject(new DeadlinePassed()), remaining) + }) + ]) + } finally { + clearTimeout(timer) + } + } + try { + const ref = await step(() => resolveCreateSourceRef(args, gated, step)) + return ref ? await step(() => readOrcaYamlAtRef(args.repo, ref, gated)) : undefined + } catch { + return undefined + } +} + +async function resolveCreateSourceRef( + args: Parameters[0], + gitOptions: LocalGitExecOptions, + step: (work: () => Promise) => Promise +): Promise { + const { repo, source, runtime } = args + // Explicit reuse checks out exactly the local branch when it exists, otherwise creates it from the base. + if (source.kind === 'branch') { + const localRef = `refs/heads/${source.ref}` + if (await step(() => hasWorktreeBaseCommitRef(repo.path, localRef, gitOptions))) { + return localRef + } + } + const baseBranch = await step(() => + resolveWorktreeCreateBase({ + requestedBaseBranch: source.baseBranch, + repoWorktreeBaseRef: repo.worktreeBaseRef, + resolveDefaultBaseRef: () => getDefaultBaseRefAsync(repo.path, gitOptions), + isBaseUsable: async (candidate) => { + const remoteBase = await runtime.resolveRemoteTrackingBase(repo.path, candidate, gitOptions) + if (remoteBase && (await runtime.hasRemoteTrackingRef(repo.path, remoteBase, gitOptions))) { + return true + } + return hasLocalWorktreeBaseRef(repo.path, candidate, gitOptions) + } + }) + ) + if (!baseBranch) { + return null + } + // Refresh exactly when create would, sharing its in-flight fetch and freshness. + const remoteBase = await step(() => + runtime.resolveRemoteTrackingBase(repo.path, baseBranch, gitOptions) + ) + if (remoteBase) { + const [hasRemoteRef, hasLocalRef] = await step(() => + Promise.all([ + runtime.hasRemoteTrackingRef(repo.path, remoteBase, gitOptions), + hasLocalWorktreeBaseRef(repo.path, baseBranch, gitOptions) + ]) + ) + if (hasRemoteRef || !hasLocalRef) { + // Ungated and never aborted: past the deadline create joins this same fetch. + await step(() => + runtime.getOrStartRemoteTrackingBaseRefresh(repo.path, remoteBase, args.gitOptions) + ) + } + } + const qualified = await step(() => + resolveWorktreeAddBaseRef(baseBranch, (candidate) => + hasWorktreeBaseCommitRef(repo.path, candidate, gitOptions) + ) + ) + return (await step(() => hasWorktreeBaseCommitRef(repo.path, qualified, gitOptions))) + ? qualified + : null +} + +async function readOrcaYamlAtRef( + repo: Repo, + ref: string, + gitOptions: LocalGitExecOptions +): Promise<{ hooks: OrcaHooks | null } | undefined> { + const { stdout: entry } = await gitExecFileAsync(['ls-tree', ref, '--', 'orca.yaml'], { + cwd: repo.path, + ...gitOptions + }) + if (!entry.trim()) { + return { hooks: null } + } + // A symlink's blob is its target path; the checkout follows it, so read the checkout instead. + if (!entry.startsWith('100')) { + return undefined + } + const { stdout } = await gitExecFileAsync(['show', `${ref}:orca.yaml`], { + cwd: repo.path, + ...gitOptions + }) + return { hooks: scopeHooksToRepoKind(repo, parseOrcaYaml(stdout)) } +} diff --git a/src/preload/api/agent-hooks/agent-hook-api.ts b/src/preload/api/agent-hooks/agent-hook-api.ts index 37579bff473..2aa5c83398e 100644 --- a/src/preload/api/agent-hooks/agent-hook-api.ts +++ b/src/preload/api/agent-hooks/agent-hook-api.ts @@ -1,10 +1,16 @@ import type { OrcaHooks } from '../../../shared/orca-yaml-hook-types' import type { ExecutionHostId } from '../../../shared/execution-host' import type { SetupScriptImportCandidate } from '../../../shared/workspace-setup/setup-script-imports' +import type { SetupHooksCreateSource } from '../../../shared/worktree/setup-hooks-create-source' export type HooksApi = { - /** `background`: a render-driven probe, refused (status 'error') rather than booting a stopped WSL distro. */ - check: (args: { repoId: string; hostId?: ExecutionHostId; background?: boolean }) => Promise<{ + /** `background`: a render-driven probe, refused (status 'error') rather than booting a stopped WSL distro. `createSource`: read orca.yaml at the ref a create checks out. */ + check: (args: { + repoId: string + hostId?: ExecutionHostId + background?: boolean + createSource?: SetupHooksCreateSource + }) => Promise<{ status?: 'ok' | 'error' hasHooks: boolean hooks: OrcaHooks | null diff --git a/src/preload/api/agent-hooks/hooks-bridge.ts b/src/preload/api/agent-hooks/hooks-bridge.ts index be35b2d12ad..1a8ca98eef0 100644 --- a/src/preload/api/agent-hooks/hooks-bridge.ts +++ b/src/preload/api/agent-hooks/hooks-bridge.ts @@ -1,10 +1,15 @@ import { ipcRenderer } from 'electron' import type { ExecutionHostId } from '../../../shared/execution-host' import type { PreloadApi } from '../../api-types' +import type { SetupHooksCreateSource } from '../../../shared/worktree/setup-hooks-create-source' export const hooksApi = { - check: (args: { repoId: string; hostId?: ExecutionHostId; background?: boolean }) => - ipcRenderer.invoke('hooks:check', args), + check: (args: { + repoId: string + hostId?: ExecutionHostId + background?: boolean + createSource?: SetupHooksCreateSource + }) => ipcRenderer.invoke('hooks:check', args), inspectSetupScriptImports: (args: { repoId: string; hostId?: ExecutionHostId }) => ipcRenderer.invoke('hooks:inspectSetupScriptImports', args), diff --git a/src/renderer/src/components/automations/authoring/automation-orca-save.ts b/src/renderer/src/components/automations/authoring/automation-orca-save.ts index e2dd43ee641..9eb54531ce9 100644 --- a/src/renderer/src/components/automations/authoring/automation-orca-save.ts +++ b/src/renderer/src/components/automations/authoring/automation-orca-save.ts @@ -17,7 +17,6 @@ import type { AutomationUpdateInput } from '../../../../../shared/automations/automation-definition' import { getRepoExecutionHostId } from '../../../../../shared/execution-host' -import { ensureHooksApproved } from '@/runtime/repo-hooks/ensure-hooks-confirmed' import { translate } from '@/i18n/i18n' import { useAppStore } from '@/store/index' import { listAutomationsForTarget } from '../hosts/automation-host-client' @@ -28,7 +27,7 @@ import { import { buildDraftPrecheck, buildDraftSchedule } from './automation-draft-model' import { buildAutomationRunContextForRepo } from './automation-run-context' import { resolveAutomationSetupDecisionForSave } from './automation-setup-decision' -import { reconfirmSkippedSetup } from './automation-setup-review' +import { confirmAutomationSaveSetup } from './automation-setup-review' import { createAutomationOnDestination, moveAutomationToDestination, @@ -135,14 +134,17 @@ export async function saveOrcaAutomation( draftSetupDecision: draft.setupDecision }) : currentAutomation.setupDecision - const trust = - setupDecision === 'run' && ((targetEdited && !recordedContext) || edited('setupDecision')) - ? await ensureHooksApproved(useAppStore.getState(), draft.projectId, 'setup', setupHostId) - : null - // Stored with `run` so later runs execute only this content. - const setupTrustHash = - trust?.approvedContentHash ?? - (await reconfirmSkippedSetup(context, trust, setupDecision, currentAutomation, setupHostId)) + const { trust, setupTrustHash } = await confirmAutomationSaveSetup(context, { + // A new base can bring different orca.yaml setup, so it needs its own approval. + prompt: + setupDecision === 'run' && + ((targetEdited && !recordedContext) || edited('setupDecision') || edited('baseBranch')), + repoId: draft.projectId, + hostId: setupHostId, + baseBranch: edited('baseBranch') ? draft.baseBranch : currentAutomation?.baseBranch, + setupDecision, + automation: currentAutomation + }) if (trust?.decision === 'skip') { setupDecision = 'skip' } diff --git a/src/renderer/src/components/automations/authoring/automation-setup-review.ts b/src/renderer/src/components/automations/authoring/automation-setup-review.ts index 280510157b4..3e01a078725 100644 --- a/src/renderer/src/components/automations/authoring/automation-setup-review.ts +++ b/src/renderer/src/components/automations/authoring/automation-setup-review.ts @@ -13,6 +13,25 @@ import { getAutomationRunRepoId } from '../../../../../shared/automations/histor import type { SetupDecision, SetupTrustMismatch } from '../../../../../shared/worktree/create-types' import type { ExecutionHostId } from '../../../../../shared/execution-host' +/** Runs create from the automation's base, so approve the orca.yaml there, not the project checkout's. */ +export function approveAutomationSetup( + repoId: string, + hostId: ExecutionHostId | undefined, + baseBranch: string | null | undefined +): Promise { + const createSource = { kind: 'base' as const, baseBranch: baseBranch?.trim() || undefined } + return ensureHooksApproved( + useAppStore.getState(), + repoId, + 'setup', + hostId, + undefined, + undefined, + undefined, + createSource + ) +} + /** A skipped setup still waiting for approval; null once the automation approves that content. */ export type PendingAutomationSetupReview = { content: SetupTrustMismatch | null } @@ -71,15 +90,48 @@ export async function reviewAutomationSkippedSetup( } /** - * Saving an automation whose last run skipped changed setup re-confirms that setup: the skipped - * content when the host recorded it, else the repo's current one. Returns the hash to store. + * A save's setup approval: prompt when the target or setup choice changed, else re-review a skipped run. + * The hash is stored with `run` so later runs execute only this content. */ -export async function reconfirmSkippedSetup( +export async function confirmAutomationSaveSetup( + context: Pick, + args: { + prompt: boolean + repoId: string + hostId: ExecutionHostId | undefined + /** The base this save persists, which an edit may have just changed. */ + baseBranch: string | null | undefined + setupDecision: SetupDecision | undefined + automation: Automation | null + } +): Promise<{ trust: HookTrustApproval | null; setupTrustHash: string | undefined }> { + const trust = args.prompt + ? await approveAutomationSetup(args.repoId, args.hostId, args.baseBranch) + : null + const setupTrustHash = + trust?.approvedContentHash ?? + (await reconfirmSkippedSetup( + context, + trust, + args.setupDecision, + args.automation, + args.hostId, + args.baseBranch + )) + return { trust, setupTrustHash } +} + +/** + * Saving an automation whose last run skipped changed setup re-confirms that setup: the skipped + * content when the host recorded it, else the content at the automation's base. Returns the hash to store. + */ +async function reconfirmSkippedSetup( context: Pick, trust: HookTrustApproval | null, setupDecision: SetupDecision | undefined, automation: Automation | null, - hostId: ExecutionHostId | undefined + hostId: ExecutionHostId | undefined, + baseBranch: string | null | undefined ): Promise { // A changed target or setup choice was just confirmed by the regular save prompt. if (trust || context.local.targetEdited || setupDecision !== 'run' || !automation) { @@ -100,7 +152,7 @@ export async function reconfirmSkippedSetup( hostId, 'automation' ) - : await ensureHooksApproved(useAppStore.getState(), repoId, 'setup', hostId) + : await approveAutomationSetup(repoId, hostId, baseBranch) return approval.decision === 'run' && approval.approvedContentHash !== automation.setupTrustHash ? approval.approvedContentHash : undefined diff --git a/src/renderer/src/lib/workspace/creation/setup/workspace-setup-trust.ts b/src/renderer/src/lib/workspace/creation/setup/workspace-setup-trust.ts index 85ad20c7802..a7c1f1eddf0 100644 --- a/src/renderer/src/lib/workspace/creation/setup/workspace-setup-trust.ts +++ b/src/renderer/src/lib/workspace/creation/setup/workspace-setup-trust.ts @@ -9,6 +9,7 @@ import type { ApprovedSetupHashes } from '../../../../../../shared/worktree/crea import { approvedOrcaHookContentHashes } from '../../../../../../shared/orca-hook-trust-entries' import { ensureHooksApproved } from '../../../../runtime/repo-hooks/ensure-hooks-confirmed' import { settleComposerSubmit } from '../composer-submit-cancellation' +import type { SetupHooksCreateSource } from '../../../../../../shared/worktree/setup-hooks-create-source' export async function confirmWorkspaceSetupDecision( stateOrGetter: AppState | (() => AppState), @@ -16,7 +17,8 @@ export async function confirmWorkspaceSetupDecision boolean, - signal?: AbortSignal + signal?: AbortSignal, + createSource?: SetupHooksCreateSource ): Promise< | ({ setupDecision: T | 'skip' | 'run'; trustDecision: 'run' | 'skip' } & ApprovedSetupHashes) | 'cancelled' @@ -29,7 +31,8 @@ export async function confirmWorkspaceSetupDecision void -): Promise< - ({ setupDecision: SetupDecision } & ApprovedSetupHashes) | 'cancelled' | 'review-request' -> { +): Promise { const inspection = await resolveDirectSetupDecision(repo.id, repo, ownerHostId) if (signal?.aborted) { return 'cancelled' @@ -96,13 +96,24 @@ export async function prepareDirectWorkItemSetup( if (decision === 'cancelled' || signal?.aborted) { return 'cancelled' } + return decision +} + +export async function confirmDirectWorkItemSetup( + repo: Repo, + ownerHostId: ExecutionHostId, + decision: SetupDecision, + createSource: SetupHooksCreateSource, + signal?: AbortSignal +): Promise<({ setupDecision: SetupDecision } & ApprovedSetupHashes) | 'cancelled'> { const confirmed = await confirmWorkspaceSetupDecision( useAppStore.getState(), repo.id, decision, ownerHostId, () => signal?.aborted === true, - signal + signal, + createSource ) if (confirmed === 'cancelled') { return 'cancelled' diff --git a/src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct.ts b/src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct.ts index 47ea3519d8f..cb5bce66782 100644 --- a/src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct.ts +++ b/src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct.ts @@ -1,6 +1,6 @@ import { pickApprovedSetupHashes } from '../../../../../../shared/worktree/creation/approved-setup-hashes' import { agentLaunchRecoveryMessage } from '@/lib/agent-session/launch/failure/agent-launch-failure' -import { prepareDirectWorkItemSetup } from './direct-work-item-setup' +import { confirmDirectWorkItemSetup, prepareDirectWorkItemSetup } from './direct-work-item-setup' import type { DirectWorkItemLaunchResult } from './direct-work-item-setup' import { useAppStore } from '@/store/index' import { activateAndRevealWorktree } from '@/lib/workspace/activation/worktree-activation' @@ -11,7 +11,7 @@ import { unavailableAgentErrorMessage, workspaceActivationErrorMessage } from '@/lib/workspace/creation/work-item/launch-work-item-direct-messages' -import type { GitPushTarget } from '../../../../../../shared/worktree/types' +import type { GitHubPrStartPoint } from '../../../../../../shared/worktree/types' import { buildDirectWorkItemStartupOpts } from '@/lib/workspace/creation/work-item/launch-work-item-direct-agent' import { getDirectWorkItemIdentity, @@ -60,35 +60,25 @@ export async function launchWorkItemDirect( const { repo } = context const promptDelivery = args.promptDelivery ?? 'draft' const { itemType, itemNumber } = getDirectWorkItemIdentity(item) - const confirmedSetup = await prepareDirectWorkItemSetup( + const setupDecision = await prepareDirectWorkItemSetup( repo, context.executionHostId, args.signal, args.onSetupRequired ) - if (confirmedSetup === 'review-request') { - return false - } - if (confirmedSetup === 'cancelled') { - return 'cancelled' + if (setupDecision === 'review-request' || setupDecision === 'cancelled') { + return setupDecision === 'cancelled' ? 'cancelled' : false } const { workspaceIntentName, workspaceName } = getDirectWorkItemWorkspaceNames( item, itemType, itemNumber ) - let resolvedBaseBranch = baseBranch - let resolvedPushTarget: GitPushTarget | undefined - let resolvedBranchNameOverride: string | undefined - let resolvedCompareBaseRef: string | undefined - if (!resolvedBaseBranch && itemType === 'pr' && itemNumber) { + let prStart: GitHubPrStartPoint | undefined + if (!baseBranch && itemType === 'pr' && itemNumber) { try { // Direct Use PR bypasses the picker but still needs its resolved head before git worktree add. - const result = await resolveDirectPrStartPoint(repoId, itemNumber, context.target, item) - resolvedBaseBranch = result.baseBranch - resolvedPushTarget = result.pushTarget - resolvedBranchNameOverride = result.branchNameOverride - resolvedCompareBaseRef = result.compareBaseRef + prStart = await resolveDirectPrStartPoint(repoId, itemNumber, context.target, item) } catch { if (args.signal?.aborted) { return 'cancelled' @@ -98,6 +88,18 @@ export async function launchWorkItemDirect( return false } } + const resolvedBaseBranch = prStart?.baseBranch ?? baseBranch + // Approve the orca.yaml at the start point the create checks out, so a PR's own setup is what's reviewed. + const confirmedSetup = await confirmDirectWorkItemSetup( + repo, + context.executionHostId, + setupDecision, + { kind: 'base', baseBranch: resolvedBaseBranch }, + args.signal + ) + if (confirmedSetup === 'cancelled') { + return 'cancelled' + } const projectPreflight = await context.projectContextPromise if (args.signal?.aborted) { @@ -171,10 +173,10 @@ export async function launchWorkItemDirect( workspaceIntentName?.displayName ?? item.title, itemType === 'issue' && itemNumber ? itemNumber : undefined, itemType === 'pr' && itemNumber ? itemNumber : undefined, - resolvedPushTarget, + prStart?.pushTarget, undefined, item.linearIdentifier, - resolvedBranchNameOverride, + prStart?.branchNameOverride, undefined, itemType === 'mr' && itemNumber ? itemNumber : undefined, gitLabIssueNumber({ ...item, type: itemType, number: itemNumber }), @@ -186,7 +188,7 @@ export async function launchWorkItemDirect( undefined, undefined, undefined, - resolvedCompareBaseRef, + prStart?.compareBaseRef, { executionHostId: context.executionHostId, ...pickApprovedSetupHashes(confirmedSetup) diff --git a/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.test.ts b/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.test.ts new file mode 100644 index 00000000000..0dc5946b673 --- /dev/null +++ b/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from 'vitest' +import { setupHooksCreateSource } from './worktree-creation-hook-preparation' + +describe('setupHooksCreateSource', () => { + it('reads the named branch only for explicit reuse', () => { + expect( + setupHooksCreateSource({ + branchIntent: 'open-existing-v2', + branchNameOverride: 'feature', + baseBranch: 'origin/main' + }) + ).toEqual({ kind: 'branch', ref: 'feature', baseBranch: 'origin/main' }) + }) + + it('reads the base when a new branch only borrows the name', () => { + expect( + setupHooksCreateSource({ + branchIntent: 'create-new', + branchNameOverride: 'feature', + baseBranch: 'origin/main' + }) + ).toEqual({ kind: 'base', baseBranch: 'origin/main' }) + expect( + setupHooksCreateSource({ branchNameOverride: 'pr-branch', baseBranch: 'refs/pull/7/head' }) + ).toEqual({ kind: 'base', baseBranch: 'refs/pull/7/head' }) + }) +}) diff --git a/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.ts b/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.ts index 730d69791c6..686cc864489 100644 --- a/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.ts +++ b/src/renderer/src/lib/workspace/creation/worktree-creation-hook-preparation.ts @@ -4,6 +4,7 @@ import { } from '../../../../../shared/worktree/creation/approved-setup-hashes' import { useAppStore } from '@/store/index' import type { WorktreeCreationRequest } from './pending-worktree-creation' +import type { SetupHooksCreateSource } from '../../../../../shared/worktree/setup-hooks-create-source' import { ensureHooksConfirmed, readAndConfirmRuntimeIssueCommand @@ -36,7 +37,9 @@ export async function prepareWorktreeCreationHooks( request.repoId, request.setupDecision, preparation.executionHostId, - isCancelled + isCancelled, + undefined, + setupHooksCreateSource(request) ) if (confirmed === 'cancelled') { return null @@ -88,6 +91,24 @@ export async function prepareWorktreeCreationHooks( return prepared } +/** + * Only explicit reuse checks out the named branch; every other create starts from the base. A VM + * create picks its base after this check, so it keeps reading the project checkout. + */ +export function setupHooksCreateSource( + request: Pick< + WorktreeCreationRequest, + 'branchIntent' | 'branchNameOverride' | 'baseBranch' | 'ephemeralVmRecipe' + > +): SetupHooksCreateSource | undefined { + if (request.ephemeralVmRecipe) { + return undefined + } + return request.branchIntent === 'open-existing-v2' && request.branchNameOverride + ? { kind: 'branch', ref: request.branchNameOverride, baseBranch: request.baseBranch } + : { kind: 'base', baseBranch: request.baseBranch } +} + /** Setup fields for the create call; the approved hash lets the host check the created branch. */ export function setupCreateArgs( request: Pick diff --git a/src/renderer/src/runtime/repo-hooks/ensure-hooks-confirmed.ts b/src/renderer/src/runtime/repo-hooks/ensure-hooks-confirmed.ts index e4c4c9bc37e..e8808bee86f 100644 --- a/src/renderer/src/runtime/repo-hooks/ensure-hooks-confirmed.ts +++ b/src/renderer/src/runtime/repo-hooks/ensure-hooks-confirmed.ts @@ -9,6 +9,7 @@ import { import { hashOrcaHookScript } from './orca-hook-trust' import type { OrcaHookTrustKind } from '../../../../shared/orca-hook-trust-entries' import { getVmRecipeTrustContent } from './vm-recipe-trust-content' +import type { SetupHooksCreateSource } from '../../../../shared/worktree/setup-hooks-create-source' import { getIssueCommandTrustContent, isUserOwnedIssueCommand } from './issue-command-trust-content' import { checkRuntimeHooks, @@ -260,7 +261,9 @@ export async function ensureHooksApproved( hostId?: ExecutionHostId, runtimeOwnerEnvironmentId?: string | null, isCancelled: () => boolean = NEVER_CANCEL_TRUST_CHECK, - signal?: AbortSignal + signal?: AbortSignal, + /** Setup for a create: read orca.yaml at the ref it checks out, not the project checkout. */ + createSource?: SetupHooksCreateSource ): Promise { return enqueueTrustPrompt(async () => { if (isCancelled() || signal?.aborted) { @@ -305,7 +308,8 @@ export async function ensureHooksApproved( } const result = await checkRuntimeHooks( hookRepoOwnerHostId(state, repoId, hostId, runtimeOwnerEnvironmentId), - repoId + repoId, + scriptKind === 'setup' && createSource ? { createSource } : {} ) if (result.status === 'error') { return SKIP diff --git a/src/renderer/src/runtime/repo-hooks/runtime-hooks-client.ts b/src/renderer/src/runtime/repo-hooks/runtime-hooks-client.ts index 97ce615f8cf..2db49fd8ae5 100644 --- a/src/renderer/src/runtime/repo-hooks/runtime-hooks-client.ts +++ b/src/renderer/src/runtime/repo-hooks/runtime-hooks-client.ts @@ -5,6 +5,7 @@ import { callRuntimeRpc } from '../rpc/calls/runtime-rpc-call' import { ipcOrRuntimeTargetForHostId } from '../rpc/targets/runtime-client-target' import type { RuntimeClientTarget } from '../../../../shared/runtime-client-target' import { repoHooksCheckWakeParams } from '../../../../shared/repo-hooks-check-wake' +import type { SetupHooksCreateSource } from '../../../../shared/worktree/setup-hooks-create-source' /** The repo's own host: a server's runtime, or this app (with `hostId`) for local and SSH repos. */ function getHookInspectionTarget(hostId: ExecutionHostId): RuntimeClientTarget { @@ -36,24 +37,26 @@ export type IssueCommandReadResult = { refusedWslDistro?: string } -/** `background`: a render-driven probe that must not boot a stopped WSL distro (E9); launches omit it. */ +/** `background`: a render-driven probe that must not boot a stopped WSL distro (E9); launches omit it. `createSource`: read the ref a create checks out. */ export async function checkRuntimeHooks( hostId: ExecutionHostId, repoId: string, - options: { background?: boolean } = {} + options: { background?: boolean; createSource?: SetupHooksCreateSource } = {} ): Promise { const target = getHookInspectionTarget(hostId) + const createSource = options.createSource ? { createSource: options.createSource } : {} if (target.kind !== 'environment') { return window.api.hooks.check({ repoId, hostId, - ...(options.background ? { background: true } : {}) + ...(options.background ? { background: true } : {}), + ...createSource }) } return callRuntimeRpc( target, 'repo.hooksCheck', - { repo: repoId, ...repoHooksCheckWakeParams(options.background) }, + { repo: repoId, ...repoHooksCheckWakeParams(options.background), ...createSource }, { timeoutMs: 15_000 } ) } diff --git a/src/renderer/src/web/preload-api/web-review-api.ts b/src/renderer/src/web/preload-api/web-review-api.ts index 129fa7c0d06..1bdcfc177fa 100644 --- a/src/renderer/src/web/preload-api/web-review-api.ts +++ b/src/renderer/src/web/preload-api/web-review-api.ts @@ -13,10 +13,11 @@ export function createRuntimeNamespaceApi(prefix: string): never { export function createHooksApi(): NonNullable['hooks']> { return { - check: async ({ repoId, background }) => + check: async ({ repoId, background, createSource }) => callRuntimeResult('repo.hooksCheck', { repo: repoId, - ...repoHooksCheckWakeParams(background) + ...repoHooksCheckWakeParams(background), + ...(createSource ? { createSource } : {}) }), inspectSetupScriptImports: async ({ repoId }) => callRuntimeResult('repo.setupScriptImports', { repo: repoId }), diff --git a/src/shared/rpc-contract/projects/repo-params.ts b/src/shared/rpc-contract/projects/repo-params.ts index 3759ef1883e..5d274b3b8c1 100644 --- a/src/shared/rpc-contract/projects/repo-params.ts +++ b/src/shared/rpc-contract/projects/repo-params.ts @@ -46,7 +46,18 @@ export const RepoSetHidden = RepoShow.extend({ /** See `repoHooksCheckIsBackground`: only `wakeWslDistro` may open a stopped WSL distro (E9). */ export const RepoHooksCheck = RepoSelector.extend({ background: z.boolean().optional(), - wakeWslDistro: OptionalBoolean + wakeWslDistro: OptionalBoolean, + // Older hosts strip this and read the project checkout, as before. + createSource: z + .union([ + z.object({ kind: z.literal('base'), baseBranch: z.string().optional() }), + z.object({ + kind: z.literal('branch'), + ref: z.string().min(1), + baseBranch: z.string().optional() + }) + ]) + .optional() }) export const RepoSearchRefs = z.object({ diff --git a/src/shared/worktree/setup-hooks-create-source.ts b/src/shared/worktree/setup-hooks-create-source.ts new file mode 100644 index 00000000000..488bbb5627c --- /dev/null +++ b/src/shared/worktree/setup-hooks-create-source.ts @@ -0,0 +1,7 @@ +/** + * The ref a create will check out, so a setup approval reads the orca.yaml the new workspace gets + * instead of the project's own checkout. `branch` is only for explicit reuse of an existing branch. + */ +export type SetupHooksCreateSource = + | { kind: 'base'; baseBranch?: string } + | { kind: 'branch'; ref: string; baseBranch?: string } From f6f5eb6aa30d3eaccf166cb18276c5068ede417d Mon Sep 17 00:00:00 2001 From: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com> Date: Fri, 13 Nov 2026 22:18:59 +0000 Subject: [PATCH 24/49] feat(settings): add a Workspace Cleanup settings page with rules, run now and activity (#42039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(settings): add Workspace Cleanup settings page Adds a Settings > Workspace Cleanup page for the host that owns the repos: status with Clean up now, the rule switches, the ignored-files protection and an Activity list of past runs. Turning on a delete rule that matches workspaces right now asks first; Keep pins a workspace. The page refreshes when the host's runner finishes a run: desktop main now forwards workspaceCleanupRunFinished to its window, and remote hosts' event is no longer dropped by the client event allowlist. * feat(settings): confirm any cleanup rule change that would delete workspaces now Lowering the inactive days or turning off the ignored-files protection makes the runner delete within seconds too, so those changes get the same confirm as turning a rule on. * fix(settings): serialize cleanup rule changes and guard the confirm One rule change at a time, built from the host's rules as they are when it is saved; Esc or the close button can no longer abandon a confirm that is already saving. Local save failures surface, a host whose rules cannot be read says so with a retry, and the page follows project rules that keep the runner on. * fix(settings): keep cleanup changes bound to fresh rules and this page A change re-reads the host's rules when it is confirmed, a change still previewing when the page closes is dropped, Keep locks while saving, and each preview is kept with the rules it evaluated. The page is hidden in a paired browser, whose settings are not the host's. * refactor(settings): reuse existing helpers in the Workspace Cleanup page One row key helper, useMountedRef, SettingsSwitchRow and the shared runtime target builder; only the preview of rules about to be saved is kept as the page's matches, and the report waits for the rules. * chore(i18n): protect the cleanup confirm's copy * fix(settings): re-check the cleanup confirm when the rules moved meanwhile If another client changed the rules while the confirm was open, preview again and list any workspace the dialog had not shown before saving. * fix(settings): preview again on every cleanup confirm A workspace can age past a rule while the confirm is open, so the confirm always checks again and lists anything new before saving. * fix(settings): drop a confirmed cleanup change if the page closed while pinning * feat(workspace-cleanup): keep PR number and ignored file names on cleanup rows Run and preview rows now carry the merged PR number and up to 3 ignored file names the evidence already read, so the page can say 'Merged · #4182' and 'Ignored files · .env'. No new Git reads; older saved runs lack them. * fix(settings): say when a run's saved receipt lists fewer kept workspaces * fix(workspace-cleanup): import at-risk local files from its new home * perf(workspace-cleanup): share in-flight previews and stop re-scanning confirmed rules The host shares one evaluation between previews of the same rules, so reopened pages and several clients no longer stack full scans. The page keeps a would-be rules preview out of its matches until those rules are saved, then adopts it, and reuses its own preview for the current rules. --- .../events/runtime-notifier-contract.ts | 2 + .../runtime-workspace-change-events.ts | 1 + src/main/window/runtime-window-lifecycle.ts | 1 + .../cleanup/workspace-cleanup-run-summary.ts | 28 +- .../workspace-cleanup-runner-preview.test.ts | 48 ++ .../cleanup/workspace-cleanup-runner.ts | 40 +- .../api/workspaces/workspace-cleanup-api.ts | 3 + .../workspaces/workspace-cleanup-bridge.ts | 11 +- .../form-controls/SettingsFormControls.tsx | 22 +- .../navigation/settings-navigation-types.ts | 1 + .../settings/page/settings-page-renderer.tsx | 4 +- ...tings-setup-workflow-section-renderers.tsx | 31 ++ .../SettingsGroupDisclosure.tsx | 6 + .../WorkspaceCleanupSettingsPane.tsx | 428 ++++++++++++++++++ .../use-workspace-cleanup-host-activity.ts | 188 ++++++++ .../use-workspace-cleanup-host-rules.ts | 136 ++++++ .../workspace-cleanup-activity-list.tsx | 334 ++++++++++++++ .../workspace-cleanup-reason-chip.tsx | 49 ++ .../workspace-cleanup-rule-change-dialog.tsx | 177 ++++++++ .../workspace-cleanup-rule-keys.ts | 38 ++ .../workspace-cleanup-rule-rows.tsx | 239 ++++++++++ .../workspace-cleanup-run-labels.ts | 124 +++++ .../workspace-cleanup-settings-search.ts | 152 +++++++ .../workspace-cleanup-settings-status.tsx | 151 ++++++ .../workspace-cleanup-workspace-line.tsx | 38 ++ ...space-cleanup-run-finished-window-event.ts | 36 ++ ...vents-agent-status-window-test-fixtures.ts | 1 + .../ipc-events-close-routing-test-harness.ts | 1 + .../ipc-events/app-lifetime-ipc-bridge.ts | 6 + .../ipc-events/runtime-client-ipc-bridge.ts | 10 +- .../runtime-client-window-events.ts | 24 + ...settings-navigation-capability-sections.ts | 17 + .../src/i18n/en-runtime-required.json | 30 ++ src/renderer/src/i18n/locales/en.json | 158 +++++++ .../subscriptions/runtime-client-events.ts | 3 +- .../languages/protected-copy-keys.json | 11 + .../workspace-cleanup-policy.ts | 2 +- .../workspace-cleanup-run.ts | 46 +- 38 files changed, 2552 insertions(+), 45 deletions(-) create mode 100644 src/main/workspaces/cleanup/workspace-cleanup-runner-preview.test.ts create mode 100644 src/renderer/src/components/settings/workspace-cleanup/WorkspaceCleanupSettingsPane.tsx create mode 100644 src/renderer/src/components/settings/workspace-cleanup/use-workspace-cleanup-host-activity.ts create mode 100644 src/renderer/src/components/settings/workspace-cleanup/use-workspace-cleanup-host-rules.ts create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-activity-list.tsx create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-reason-chip.tsx create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-rule-change-dialog.tsx create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-rule-keys.ts create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-rule-rows.tsx create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-run-labels.ts create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-settings-search.ts create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-settings-status.tsx create mode 100644 src/renderer/src/components/settings/workspace-cleanup/workspace-cleanup-workspace-line.tsx create mode 100644 src/renderer/src/components/workspace-cleanup/events/workspace-cleanup-run-finished-window-event.ts create mode 100644 src/renderer/src/hooks/ipc-events/runtime-client-window-events.ts diff --git a/src/main/runtime/client/events/runtime-notifier-contract.ts b/src/main/runtime/client/events/runtime-notifier-contract.ts index a91a15a9255..299078fa642 100644 --- a/src/main/runtime/client/events/runtime-notifier-contract.ts +++ b/src/main/runtime/client/events/runtime-notifier-contract.ts @@ -1,4 +1,5 @@ import type { WorkspaceMetadataSet } from '../../../../shared/worktree/metadata/workspace-metadata-set' +import type { WorkspaceCleanupRunFinishedEvent } from '../../../../shared/workspace-cleanup/workspace-cleanup-run' import type { RuntimeEditorTabReveal, RuntimeFileOpenPosition @@ -55,6 +56,7 @@ export type RuntimeNotifier = { worktreeRemoteBranchConflict?(event: WorktreeRemoteBranchConflictEvent): void reposChanged(): void browserProfilesChanged?(): void + workspaceCleanupRunFinished?(run: WorkspaceCleanupRunFinishedEvent['run']): void activateWorktree( repoId: string, worktreeId: string, diff --git a/src/main/runtime/workspaces/catalog/runtime-workspace-change-events.ts b/src/main/runtime/workspaces/catalog/runtime-workspace-change-events.ts index 90226e7b05e..9169085e2f3 100644 --- a/src/main/runtime/workspaces/catalog/runtime-workspace-change-events.ts +++ b/src/main/runtime/workspaces/catalog/runtime-workspace-change-events.ts @@ -69,6 +69,7 @@ export abstract class RuntimeWorkspaceChangeEvents extends NativeChatLaunchDraft /** The cleanup runner finished a run on this host; clients may toast. */ notifyWorkspaceCleanupRunFinished(run: WorkspaceCleanupRunFinishedEvent['run']): void { + this.notifier?.workspaceCleanupRunFinished?.(run) this.emitClientEvent({ type: 'workspaceCleanupRunFinished', run }) } } diff --git a/src/main/window/runtime-window-lifecycle.ts b/src/main/window/runtime-window-lifecycle.ts index 22c9b64e9ef..f1bc293bfc6 100644 --- a/src/main/window/runtime-window-lifecycle.ts +++ b/src/main/window/runtime-window-lifecycle.ts @@ -52,6 +52,7 @@ export function registerRuntimeWindowLifecycle( reposChanged: () => send('repos:changed'), browserProfilesChanged: () => send('browser:session:profilesChanged'), automationsChanged: (payload) => send('automations:changed', payload), + workspaceCleanupRunFinished: (run) => send('workspaceCleanup:runFinished', run), activateWorktree: ( repoId, worktreeId, diff --git a/src/main/workspaces/cleanup/workspace-cleanup-run-summary.ts b/src/main/workspaces/cleanup/workspace-cleanup-run-summary.ts index b865a5ea5b1..494c39c996a 100644 --- a/src/main/workspaces/cleanup/workspace-cleanup-run-summary.ts +++ b/src/main/workspaces/cleanup/workspace-cleanup-run-summary.ts @@ -1,6 +1,12 @@ -import type { WorkspaceCleanupEvaluation } from '../../../shared/workspace-cleanup/workspace-cleanup-evaluation' +import type { + WorkspaceCleanupEvaluation, + WorkspaceCleanupEvaluationInput +} from '../../../shared/workspace-cleanup/workspace-cleanup-evaluation' +import { hasWorktreeAtRiskLocalFiles } from '../../../shared/worktree/removal/at-risk-local-files' import { WORKSPACE_CLEANUP_REPORT_ROW_LIMIT, + WORKSPACE_CLEANUP_ROW_IGNORED_FILE_LIMIT, + type WorkspaceCleanupRowDetails, WORKSPACE_CLEANUP_UNWATCHED_CAUSES, type WorkspaceCleanupRun, type WorkspaceCleanupRunOutcome, @@ -12,6 +18,26 @@ export type WorkspaceCleanupKeptOutcome = Pick< 'outcome' | 'reason' | 'keepCause' | 'waiting' > +/** What the evidence already says about a row, for its label; no new Git reads. */ +export function workspaceCleanupRowDetails( + input: Pick +): WorkspaceCleanupRowDetails { + const review = input.git.merge?.mergedReview + const files = input.git.atRiskLocalFiles + return { + ...(review?.containsHead ? { prNumber: review.number } : {}), + ...(files && hasWorktreeAtRiskLocalFiles(files) + ? { + ignoredFiles: { + count: files.count, + samplePaths: files.samplePaths.slice(0, WORKSPACE_CLEANUP_ROW_IGNORED_FILE_LIMIT), + complete: files.complete + } + } + : {}) + } +} + export function keptRunOutcome( evaluation: WorkspaceCleanupEvaluation ): WorkspaceCleanupKeptOutcome { diff --git a/src/main/workspaces/cleanup/workspace-cleanup-runner-preview.test.ts b/src/main/workspaces/cleanup/workspace-cleanup-runner-preview.test.ts new file mode 100644 index 00000000000..4ccc129a108 --- /dev/null +++ b/src/main/workspaces/cleanup/workspace-cleanup-runner-preview.test.ts @@ -0,0 +1,48 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { OrcaRuntimeService } from '../../runtime/orca-runtime' +import type { RuntimeStore } from '../../runtime/construction/runtime-store-contract' +import { getDefaultWorkspaceCleanupRules } from '../../../shared/workspace-cleanup/workspace-cleanup-policy' + +const { collectWorkspaces } = vi.hoisted(() => ({ collectWorkspaces: vi.fn() })) + +vi.mock('./workspace-cleanup-run-evidence', () => ({ + collectWorkspaceCleanupWorkspaces: collectWorkspaces +})) +vi.mock('../space-analysis/workspace-space-analysis-snapshot', () => ({ + readWorkspaceSpaceAnalysisSnapshot: () => Promise.resolve(null) +})) + +const { WorkspaceCleanupRunner } = await import('./workspace-cleanup-runner') + +function createRunner(): InstanceType { + const store = { + getSettings: () => ({ workspaceCleanupPolicy: getDefaultWorkspaceCleanupRules() }) + } + return new WorkspaceCleanupRunner({ + // SAFETY: preview only reads settings from the store and passes the runtime through to mocked evidence. + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: see above + store: store as unknown as RuntimeStore, + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: see above + runtime: {} as OrcaRuntimeService, + historyDirectory: '/unused' + }) +} + +describe('workspace cleanup runner preview', () => { + afterEach(() => { + collectWorkspaces.mockReset() + }) + + it('shares one evaluation between concurrent previews of the same rules', async () => { + let finish: (value: []) => void = () => {} + collectWorkspaces.mockReturnValue(new Promise<[]>((resolve) => (finish = resolve))) + const runner = createRunner() + + const first = runner.preview() + const second = runner.preview(getDefaultWorkspaceCleanupRules()) + finish([]) + await Promise.all([first, second]) + + expect(collectWorkspaces).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/main/workspaces/cleanup/workspace-cleanup-runner.ts b/src/main/workspaces/cleanup/workspace-cleanup-runner.ts index 95cab81bd2e..f51f1243c95 100644 --- a/src/main/workspaces/cleanup/workspace-cleanup-runner.ts +++ b/src/main/workspaces/cleanup/workspace-cleanup-runner.ts @@ -16,6 +16,7 @@ import type { WorkspaceCleanupReport, WorkspaceCleanupRun, WorkspaceCleanupRunRow, + WorkspaceCleanupRowDetails, WorkspaceCleanupRunTrigger, WorkspaceCleanupWorkspaceRef } from '../../../shared/workspace-cleanup/workspace-cleanup-run' @@ -24,7 +25,11 @@ import { type WorkspaceCleanupWorkspace } from './workspace-cleanup-run-evidence' import { decideWorkspaceCleanup, removeWorkspaceForCleanup } from './workspace-cleanup-removal-step' -import { keptRunOutcome, summarizeWorkspaceCleanupRun } from './workspace-cleanup-run-summary' +import { + keptRunOutcome, + summarizeWorkspaceCleanupRun, + workspaceCleanupRowDetails +} from './workspace-cleanup-run-summary' import { appendWorkspaceCleanupRun, readWorkspaceCleanupRunHistory @@ -39,7 +44,7 @@ const SETTINGS_DEBOUNCE_MS = 10 * 1000 type DecidedWorkspace = { workspace: WorkspaceCleanupWorkspace - ref: WorkspaceCleanupWorkspaceRef & { sizeBytes?: number } + ref: WorkspaceCleanupWorkspaceRef & WorkspaceCleanupRowDetails & { sizeBytes?: number } evaluation: WorkspaceCleanupEvaluation } @@ -54,6 +59,8 @@ export type WorkspaceCleanupRunnerDeps = { export class WorkspaceCleanupRunner { private readonly deps: WorkspaceCleanupRunnerDeps private current: Promise | null = null + // Every caller asking for the same rules while one evaluation runs shares it: reopened pages, several clients. + private readonly previews = new Map>() private timer: ReturnType | null = null private nextRunAt: number | null = null private enabledRules = new Set() @@ -107,9 +114,28 @@ export class WorkspaceCleanupRunner { } /** What a run would do now, removing nothing; `rules` previews other global rules. */ - async preview(rules?: WorkspaceCleanupRules): Promise { + preview(rules?: WorkspaceCleanupRules): Promise { + const effective = rules ?? this.globalRules() + const key = JSON.stringify(effective) + const shared = this.previews.get(key) + if (shared) { + return shared + } + const evaluation = this.evaluatePreview(effective) + this.previews.set(key, evaluation) + void evaluation + .catch(() => undefined) + .finally(() => { + if (this.previews.get(key) === evaluation) { + this.previews.delete(key) + } + }) + return evaluation + } + + private async evaluatePreview(rules: WorkspaceCleanupRules): Promise { const evaluatedAt = Date.now() - const decided = await this.evaluate(rules ?? this.globalRules(), evaluatedAt) + const decided = await this.evaluate(rules, evaluatedAt) return { evaluatedAt, rows: decided.map(({ ref, evaluation }) => ({ ...ref, evaluation })) } } @@ -193,7 +219,11 @@ export class WorkspaceCleanupRunner { const sizeBytes = sizes.get(workspace.ref.worktreeId) decided.push({ workspace, - ref: { ...workspace.ref, ...(sizeBytes !== undefined ? { sizeBytes } : {}) }, + ref: { + ...workspace.ref, + ...workspaceCleanupRowDetails(workspace.input), + ...(sizeBytes !== undefined ? { sizeBytes } : {}) + }, evaluation: await decideWorkspaceCleanup(this.deps.runtime, workspace, now) }) } diff --git a/src/preload/api/workspaces/workspace-cleanup-api.ts b/src/preload/api/workspaces/workspace-cleanup-api.ts index e286bbd2913..a16c8d7b7b2 100644 --- a/src/preload/api/workspaces/workspace-cleanup-api.ts +++ b/src/preload/api/workspaces/workspace-cleanup-api.ts @@ -12,6 +12,7 @@ import type { WorkspaceSpaceScanProgress } from '../../../shared/workspace-disk-space/workspace-space-types' import type { ExecutionHostId } from '../../../shared/execution-host' +import type { WorkspaceCleanupRunFinishedEvent } from '../../../shared/workspace-cleanup/workspace-cleanup-run' import type { WorkspaceSpaceChange } from '../../../shared/workspace-disk-space/workspace-space-change' export type WorkspaceCleanupApi = { @@ -27,6 +28,8 @@ export type WorkspaceCleanupApi = { beginRemovalSnapshotPruneBatch?: (args: WorkspaceCleanupSnapshotPruneBatchArgs) => Promise recordRemovalSnapshotPrune?: (args: WorkspaceCleanupSnapshotPruneRecordArgs) => Promise finishRemovalSnapshotPruneBatch?: (args: WorkspaceCleanupSnapshotPruneBatchArgs) => Promise + /** This app's own cleanup runner finished a run. */ + onRunFinished: (callback: (run: WorkspaceCleanupRunFinishedEvent['run']) => void) => () => void } export type WorkspaceSpaceApi = { diff --git a/src/preload/api/workspaces/workspace-cleanup-bridge.ts b/src/preload/api/workspaces/workspace-cleanup-bridge.ts index 4c979e55e84..f7d47eb08b0 100644 --- a/src/preload/api/workspaces/workspace-cleanup-bridge.ts +++ b/src/preload/api/workspaces/workspace-cleanup-bridge.ts @@ -1,5 +1,6 @@ import { ipcRenderer } from 'electron' import type { WorkspaceCleanupScanProgress } from '../../../shared/workspace-cleanup/workspace-cleanup' +import type { WorkspaceCleanupRunFinishedEvent } from '../../../shared/workspace-cleanup/workspace-cleanup-run' import type { PreloadApi } from '../../api-types' export const workspaceCleanupApi = { @@ -30,5 +31,13 @@ export const workspaceCleanupApi = { recordRemovalSnapshotPrune: (args) => ipcRenderer.invoke('workspaceCleanup:recordRemovalSnapshotPrune', args), finishRemovalSnapshotPruneBatch: (args) => - ipcRenderer.invoke('workspaceCleanup:finishRemovalSnapshotPruneBatch', args) + ipcRenderer.invoke('workspaceCleanup:finishRemovalSnapshotPruneBatch', args), + onRunFinished: (callback) => { + const listener = ( + _event: Electron.IpcRendererEvent, + run: WorkspaceCleanupRunFinishedEvent['run'] + ): void => callback(run) + ipcRenderer.on('workspaceCleanup:runFinished', listener) + return () => ipcRenderer.removeListener('workspaceCleanup:runFinished', listener) + } } satisfies PreloadApi['workspaceCleanup'] diff --git a/src/renderer/src/components/settings/form-controls/SettingsFormControls.tsx b/src/renderer/src/components/settings/form-controls/SettingsFormControls.tsx index 995a0a52a82..4aa0610a117 100644 --- a/src/renderer/src/components/settings/form-controls/SettingsFormControls.tsx +++ b/src/renderer/src/components/settings/form-controls/SettingsFormControls.tsx @@ -253,7 +253,7 @@ type ColorFieldProps = { type NumberFieldProps = { label: string - description: string + description?: string /** undefined renders the field empty — pair it with `placeholder` and `onClear` for an unset state. */ value: number | undefined defaultValue?: number @@ -369,15 +369,17 @@ export function NumberField({ className={className} label={label} description={ - <> - {description} - {defaultValue !== undefined ? ( - - {t('auto.components.settings.SettingsFormControls.b661b034ec', '· Default:')}{' '} - {defaultValue} - - ) : null} - + description || defaultValue !== undefined ? ( + <> + {description} + {defaultValue !== undefined ? ( + + {t('auto.components.settings.SettingsFormControls.b661b034ec', '· Default:')}{' '} + {defaultValue} + + ) : null} + + ) : undefined } control={
diff --git a/src/renderer/src/components/settings/navigation/settings-navigation-types.ts b/src/renderer/src/components/settings/navigation/settings-navigation-types.ts index c90336ad724..798d0163f16 100644 --- a/src/renderer/src/components/settings/navigation/settings-navigation-types.ts +++ b/src/renderer/src/components/settings/navigation/settings-navigation-types.ts @@ -15,6 +15,7 @@ export type SettingsNavInstallStatus = const SETTINGS_NAV_TARGETS = [ 'general', + 'workspace-cleanup', 'integrations', 'accounts', 'browser', diff --git a/src/renderer/src/components/settings/page/settings-page-renderer.tsx b/src/renderer/src/components/settings/page/settings-page-renderer.tsx index 376049e9d6a..df2ec7f741f 100644 --- a/src/renderer/src/components/settings/page/settings-page-renderer.tsx +++ b/src/renderer/src/components/settings/page/settings-page-renderer.tsx @@ -25,7 +25,8 @@ import { renderMobileSettingsSection, renderOrcaAccountSettingsSection, renderSetupGuideSettingsSection, - renderShareSkillsSettingsSection + renderShareSkillsSettingsSection, + renderWorkspaceCleanupSettingsSection } from './settings-setup-workflow-section-renderers' import { renderGitSettingsSection, @@ -169,6 +170,7 @@ export function renderSettingsPage( {renderOrcaAccountSettingsSection(context, t)} {renderSetupGuideSettingsSection(context, t)} {renderGeneralSettingsSection(context, t)} + {renderWorkspaceCleanupSettingsSection(context, t)} {renderIntegrationsSettingsSection(context, t)} {renderMobileSettingsSection(context, t)} {renderAutomationsSettingsSection(context, t)} diff --git a/src/renderer/src/components/settings/page/settings-setup-workflow-section-renderers.tsx b/src/renderer/src/components/settings/page/settings-setup-workflow-section-renderers.tsx index e70d30dc142..5f8715f59d5 100644 --- a/src/renderer/src/components/settings/page/settings-setup-workflow-section-renderers.tsx +++ b/src/renderer/src/components/settings/page/settings-setup-workflow-section-renderers.tsx @@ -13,6 +13,8 @@ import { translate } from '@/i18n/i18n' import type { Translate } from '@/i18n/use-translate' import type { SettingsRenderContext } from './settings-render-context' import { SettingsGroup } from '../section-layout/SettingsGroup' +import { WorkspaceCleanupSettingsPane } from '../workspace-cleanup/WorkspaceCleanupSettingsPane' +import { runtimeTargetEnvironmentId } from '@/runtime/rpc/targets/runtime-client-target' export function renderOrcaAccountSettingsSection( context: SettingsRenderContext, @@ -236,3 +238,32 @@ export function renderSessionHistorySettingsSection( ) } + +export function renderWorkspaceCleanupSettingsSection( + context: SettingsRenderContext, + t: Translate = translate +): React.JSX.Element | null { + const { model, navigation, view } = context + // A paired browser's settings are its own; the cleanup rules live on the host it pairs with. + return model.showDesktopOnlySettings ? ( + + {view.isSectionMounted('workspace-cleanup') ? ( + + ) : null} + + ) : null +} diff --git a/src/renderer/src/components/settings/section-layout/SettingsGroupDisclosure.tsx b/src/renderer/src/components/settings/section-layout/SettingsGroupDisclosure.tsx index 9a51102871f..612a79198f9 100644 --- a/src/renderer/src/components/settings/section-layout/SettingsGroupDisclosure.tsx +++ b/src/renderer/src/components/settings/section-layout/SettingsGroupDisclosure.tsx @@ -8,6 +8,8 @@ import { SETTINGS_GROUP_NESTED_INSET_CLASS } from './SettingsGroup' type SettingsGroupDisclosureProps = { label?: string + /** A muted hint after the label naming what the disclosure holds. */ + description?: string forceOpen?: boolean children: React.ReactNode } @@ -15,6 +17,7 @@ type SettingsGroupDisclosureProps = { /** Collapsible rows inside a SettingsGroup card, one fixed step in from the card's rows. Search force-opens it so matches remain reachable. */ export function SettingsGroupDisclosure({ label, + description, forceOpen = false, children }: SettingsGroupDisclosureProps): React.JSX.Element { @@ -40,6 +43,9 @@ export function SettingsGroupDisclosure({ )} /> {label ?? t('auto.components.settings.AppearanceAdvancedDisclosure.advanced', 'Advanced')} + {description ? ( + {description} + ) : null} {/* Stays mounted while collapsed so a settings jump can find and reveal its rows. */}