Keep phone fork pull requests on their selected repository (#36762)

* Keep opened GitHub work items bound to their exact repository

* Bind GitHub work item ownership through consumers and dispatch

* Keep empty mention lists from consuming selection keys

* Preserve GitHub action and consumer ownership across resource changes

* Exercise repository account updates through their production store action

* Exercise account publication and cache settlement through GitHub consumers

* Simplify fork PR contract verification

* Make contract verification imports and clocks deterministic

* Correct mobile task test fixtures and model types

* Correct task recording fixtures and CI types

* Correct task fixture types and static checks

* Consolidate replay test RPC imports

* Separate GitHub metadata imports from Linear hooks

* Scope mobile PR sidebar reads to the selected resource

* Separate desktop GitHub changes from phone updates

* Preserve complete phone GitHub repository identity updates

* Fix relay authority probe census across topology cases

* Repair repository owner proof fixtures and compiler allocation

* Preserve repository row observation in host lookup

* Seed metadata fixture before server-side store acquisition

* Preserve nullable fixture settings and discover mixed test types

* Refetch phone reviewer list after a connection change

A disconnect or session change while the reviewer list loaded left the drawer showing an empty list until it was reopened. The drawer now shows its loading state while disconnected and fetches the same repository again once connected, still ignoring the cancelled load's result. Also merges a duplicate type import that failed mobile lint.

* Keep phone reviewer rows through connection changes

The reviewer picker now owns one query per open visit of a client, worktree and repository. A connection or session change retires the in-flight request at once but keeps the people already loaded; reconnecting refreshes them in the background. Without loaded people the drawer shows its spinner, or the existing connection explanation once an outage is revealed, and never a false empty list. Closing, retargeting or reopening starts a fresh visit that no earlier reply can paint. Also wraps the synchronous bridge teardown steps so the cleanup loop awaits only promises.

* Keep the viewed phone PR through connection changes

A relay/direct switch or reconnect selected a fresh, hidden PR observation in Source Control and Diff Review, so the next render unmounted the PR, closed the reviewer picker and erased an unsent comment. The PR observation is now scoped to the client, worktree and branch. One connection listener retires the in-flight reads when the connection changes and repeats the query the screen already asked for once connected, so accepted content stays mounted and refreshes in place. A failed background refresh keeps the accepted result. Task PR files likewise keep their loaded contents and expansion across a connection loss and read an interrupted file again on reconnect.

* Show a failed PR refresh over kept content; recover task files on every connection change

A failed refresh of an accepted PR (or no-PR) result now keeps the content and shows the existing "Failed to refresh pull request." line with Retry above it, whoever started the read, until the next good read. Task PR file reads are retired and re-read from the task selection's own connection listener, so a reconnect batched into one render or a connection switch at the same state also recovers an interrupted file. The reviewer-picker contract test leaves the React Native test program for now; its checked owner follows.

* Typecheck the phone/host contract tests through emitted declarations

The reviewer-picker contract test and the recorded request params test import real desktop sources, which do not typecheck under the phone's React Native libraries. Both source graphs now emit declarations under their own compiler settings, and a strict Node program checks the two test bodies against them; Vitest still runs them against the original sources through path aliases. The tests typecheck ratchet runs this program and fails unless both bodies are in it and it passes, the CI test runner checks that Bun ran and passed both, and the Mobile workflow finishes compiler work before starting tests. The six other excluded tests stay runtime-only and are labelled that way.

* Name the types phone declaration emission needs

Declaration emission for the phone/host contract program could not name the i18n instance's type or the buffered terminal draft send type; annotate the one and export the other. Also types the drawer mock's children in the Source Control scenario so the React Native test program checks it.

* Stub every icon in the Source Control scenario

Source Control modules read icons at import time, so the scenario's fixed icon list failed to load the file under Bun.

* Give the recorded params check's stand-in method a permission

The recorded request params test is now typechecked and its stand-in method lacked the permission every RPC method declares; parsing never reads it.

* Use the real composer styles in the Source Control scenario

Source Control's list styles read composer style constants at import time, so stubbing that module failed the file under Bun.

* Mock the PR sidebar hooks without loading their native modules

Only the PR sidebar reads these hooks, so the Source Control scenario's mocks need not load the real modules, whose imports reach Expo native code that does not run under Vitest.

* Count recording-internal observations apart from recorded ordinals

The scripted transport runs the real request tracker, and its connection wait, id allocation, completion, late-reply and terminal observations each took the shared write ordinal that requests, frames and effects record. Every recording's ordinals shifted although the same frames went out in the same order. Those observations now use their own counter, keeping their association with the native request, so recorded ordinals match the existing recordings again.

* Record a cleanup checkpoint only when teardown adds effects

Comparing the whole snapshot before and after teardown added a cleanup checkpoint whenever a pending request settled at dispose, which changed about 166 recordings without new evidence. Restore the condition the recordings were made with: teardown effects alone add the checkpoint.

* Run the bridged recording corpus on Node

Its goldens hold V8's TypeError wording, which the Bun pass reports differently, so ten exact error comparisons failed only on engine text. It now runs with family-recordings on Node; the comparison stays exact.

* Bind the probe test's fresh status.get by its actual child

* Edit the GitLab status scenario's GitHub issue only after opening it

* Type the Source Control scenario's composer adapters with the real component props

* Mock the Source Control scenario's icons and protocol gates without loading the real modules

* Give the PR sidebar probe test the shared typed fake client

* Select the GitLab status scenario's GitHub issue as a typed task item

* Declare the buffered terminal draft send as an exported type

* Run the Source Control scenario's focus effect only when its callback changes, as the router does

The router mock ran the loaders' focus effect after every commit, so each status read re-rendered and re-ran it. Also mock AppState for the comments section and stop act from awaiting held PR reloads.

* Re-record the GitHub and Tasks goldens for the selected-repository requests

Re-recorded with pnpm --dir mobile rpc:record for the 71 scenario IDs: 66 changed and 5 added for the exact-target status.get probe, 0 removed. The goldens now carry the selected repository on GitHub requests, the exact-target probe before GitHub operations, the skipped hidden metadata loads and the new item-detail failure copy.

* Declare the probed GitHub operations' params in the order the app sends them

The bridge probe test compares the forwarded frame byte for byte with the declared params, so tk-item-detail-github, tk-item-status-gitlab and tk-project-row-files-merge now declare the exact key order their goldens record. Values are unchanged, and completion matching ignores key order.

* Close the native connection before the page in recordings, and make late replies and inherited timers explicit

Recording teardown now closes the native client, flushes its rejection through the bridge, then closes the page, so page callers see the relayed native close. Sibling rejections name the stable logical site in every mode. Replies scripted after a timeout or disconnect are explicit late replies that must resolve nothing. Four product timers inherited from main are declared by producer, scenario, owner and delay and still reported; every other run keeps zero residual timers. The bridge probe oracle for tk-item-status-gitlab expects the published deadline failure and the exact retained issue.

* Judge unchanged bridged recordings as main does and changed ones by their own outcomes

Unchanged producers follow main's order again: identical earns identical, History keeps its strict path, and other divergences take a legacy label from the reply-meta counterfactual's typed evidence. A bounded guard pins zero unclassified, small-class membership and the branch-base tally less each named moved or removed producer; eight moved producers without a base pin are named as old-class-pending until their baseline replay. The re-recorded producers are judged directly in both page modes against their reviewed goldens, with only the page's refusal of the injected absent result applied, or by their exact strict own-undefined stop, and are pinned as bridge contracts. Bridge-only preludes are observed after their action, and the pending invocation's relayed native close is read from its own page promise. Every producer must be routed exactly once.

* Say what to do when the GitHub server check fails, and share one deadline with the action

The exact-target check runs before a GitHub action is sent, so a timeout or lost connection now shows the existing 'The Orca server connection changed. Try again.' and a refused or unreadable answer shows the existing 'Update Orca on the executing server' message, instead of raw text naming status.get. The check's own connection-changed error passes through. On native, the checks and the action share one 30-second budget, so a dead server fails in 30 seconds instead of 60.

* Pass the scenario manifest to the changed-producer comparison

* Correct the bridged corpus repairs from their first full run

The re-recorded producers no longer stop on the strict own-undefined matcher and all replay in bridge mode, so they are all judged directly; the page's refusal of the GitHub server check now expects the connection-changed copy. Unchanged legacy labels read their first difference from the replay without injected metadata. The sibling timeout and each interruption, including the cutover, end the requests the goldens record as ended, so those replies are explicit late replies. New producers in pinned families get their bridge-contract pins, and an unexpected timer or changed outcome now names its scenario and values.

* Restore six unchanged scenarios to their single own-undefined steps

tw-smart-search-all-providers, tw-smart-search-linear-listed, tk-list-gitlab-items, review-mark-reviewed-persists, review-mark-reviewed-rolls-back and session-create-terminal-without-active-tab had their own-undefined steps split into native and bridge copies, so the page replay no longer reached the strict own-undefined stop and these unchanged producers left their baseline labels. Their steps are the branch-base steps again; native recordings are unchanged.

* Fill the eight moved producers' base classes from the admitted baseline replay

pr-read-surface was identical and the seven github.pr-read matrices were result-absent-settlement at the branch base, so the unchanged tally is exact again with no pending members.

* Deliver the sibling disconnect's trailing replies as late replies too

A disconnect rejects preflight.check, linear.status and jira.status before the suffix replays their replies, exactly as the sibling timeout does, so those declared replies are late in both variants; the cutover stays strict.

* Expect the page's refusal in the two Linear producers' result-absent checkpoints

Natively the injected { ok: true } reads as an empty result, so the Linear detail and status update finish; the page refuses that frame and the screen shows the refusal instead. Each producer now has one finite expectation for that checkpoint, guarded on the reviewed golden's final effects, and everything else must still equal the golden.

* Share one deadline between the shell's server check and the GitHub action

The shell gave the exact-target check and the forwarded action each the page's full timeout unless the page asked otherwise, so a dead server took twice as long to fail on the hosted page as on native. The two legs now always share the page's one deadline; the forwarded options are unchanged.

* Deliver the sibling client cutover's trailing replies as late replies too

* Build the changed producers' page expectations from one finite table before comparing

* Re-record the three exact-target check goldens for the mapped copy

The GitHub check now shows the update-server or connection-changed copy instead of raw reply text; the item detail's empty-message cases now also record their detailError effect. Recorded on the admitted run (check-3949 Job 1).

* Declare the traced inherited timers per inner scenario and recording mode

Each declaration now names the modes where its inner scenario leaves the timer. Adds the inner scenarios traced in check-3949/qa-report-trace.md Job 2, with the ruled delays and owner chains: the reveal's 300 ms first-poll timer for all ten reply partitions of tabs.list-1 and tabs.activate-1 in both modes, and the pr-triage 20,000 ms reconnect waiter for transport-rejection and transport-rejection-no-message in both modes and result-absent through the page only. Exact counts, owners and delays stay enforced.

* Expect the compiler wait before Mobile verify's tests and only the fastlane tools after

* Call recorded timer callbacks through a typed signature

* Show the reviewer picker's no-rows wait with the screen header's connection verdict

The drawer classified only its client's state and counters, so during relay recovery it flipped between Disconnected and Connecting on every dial and never showed relay or pairing verdicts. The source control and diff review screens now pass the host's own verdict inputs (reconnect attempts, last connect, relay recovery status), re-read on host state and path changes, so the drawer shows the same steady verdict as the header.

* Say a timed-out GitHub target check timed out, on native and in the shell

A server check that ran out its own deadline on a connection that never changed now reads "Timed out confirming the executing Orca server.", as the shell's budget already did, and the native shared budget running out uses the same copy. A lost or changed connection still reads "The Orca server connection changed. Try again."

* Name the paired desktop when it is the build missing the exact-target check

When the phone's paired desktop relays to an updated executing server but lacks the exact-target capability itself, the edit now says "Update Orca desktop" instead of pointing at the executing server. An old executing server still gets the executing-server copy.

* Preserve GitHub detail argument types and optional capabilities

* Say what updating the paired desktop enables, as the executing-server copy does

* Drop the tab-reveal timer declarations now that main removed the reveal operation

* Let keyed details queries own pending read replacement

* Repair GitHub RPC and relay test fixture boundaries

* Own the new PR tab's caches, sheets, confirmations and polls by the complete PR

Fork #N and upstream #N were one owner to the tab: check details, open sheets and confirmations keyed by worktree and number survived a repository change, so a fork draft or decision could act on upstream and fork check data could show for upstream. Each is now owned by the PR incarnation (client, worktree, branch and full resource key), selected during render, so a departure closes old requests without retargeting them, A -> B -> A starts fresh, an outgoing sheet renders nothing and sends nothing, a late save closes only its own request, and a departed PR's poll neither blocks nor re-arms its successor.

* Load the reviewers sheet's people through the selected repository's resource-owned query

The new sheet read people once on the first search with no repository, connection recovery or retry, so a fork PR listed the wrong repository and a search while reconnecting stuck on an error. The first search of an open sheet now demands the selected repository's list through the exact-target helper; the query reads only while connected, retires its attempt on every real state or generation change, recovers on reconnect, keeps accepted rows and search through refreshes, and shows the header's own calm connection verdict while it has no candidates. Closing or a PR departure ends the visit; reopening starts fresh.

* Mark a failed PR discovery from every caller, polls included, and keep a poll's checks-only failure quiet

Main's poller made a failed background discovery silent, narrowing the ruled all-caller contract. Any current failed discovery over an accepted PR or no-PR result now keeps it and shows the one refresh-failed row with Retry, and the poll still backs off on 'failed'. A poll whose discovery succeeded but whose checks read failed for the same complete PR lands its discovery (clearing an older warning) and keeps the prior checks, reporting 'failed' once; equal numbers in another repository no longer count as the same PR. A viewed-file update from a departed observation changes nothing.

* Send the phone's addressed details reads with the server's read intent where it is advertised

github.workItemDetails accepts optional canonical:false (ordinary) / true (Refresh), advertised by github.exact-details-read-intent.v1; missing intent means ordinary. The phone's addressed details reads (PR tab and Tasks) now pass that intent through the existing exact-target preparation: a host advertising it gets canonical:false for ordinary loads, recovery and polls and canonical:true for the user's explicit Refresh; a canonical-only host gets ordinary reads without the owner and Refresh with the owner only; hosts with neither keep today's params, and an explicit Refresh there is refused as unsupported. Refresh intent travels only with the Refresh command, never as reconnect demand. The poll's checks-only settling moves into pr-sidebar-load-result to keep the controller within its size limit.

* Keep today's details params for a host with neither read-intent capability, Refresh included

* Drive the reviewer target contract through the new tab's reviewers sheet, first search included

* Cover a poll's discovery warning, its clearing, and a same-PR checks-only poll failure in the controller

* Prove the Source Control PR tab's demand, retained sheet and draft, failure line and fork/upstream request ownership on the new navigation

* Cover the details read intent the phone sends to explicit-intent, canonical-only and older hosts

* Fix the round's test typecheck and assertion findings: awaited controller loads, the diff review props, typed doubles

* Send Refresh's owner to a canonical-only server outside the exact-target check, as the desktop does

* Restore the base's mobile change-scope test, which the base merge dropped by mistake

* Prove the PR poller keeps each fork/upstream incarnation's poll, backoff and cadence its own

* Verify expected GitHub account at repository execution capture

* Give the Linear detail recording adapter the detail Refresh request its loader reads

* Keep the detail Refresh request ref out of the recorded owner projection, like the other ref

* Count cancelled GitHub probes against the desktop request cap main introduced

* Keep the comment tree out of the diff review controller test, as its drawers already are

* Restore the Source Control action icons the scenario rewrite dropped from its icon mock

* Supply the settled-list setter main added to the Tasks list fixture

* Preserve captured GitHub account expectations through client dispatch

* Re-record the Linear team-context goldens for this PR's actionItem owner effect

* Retain observed runtime status after switching environments

* Fix account contract fixture types and RPC setup timing

* Restore the negative-capability switch probe assertion

* Align account fixtures with runtime identity and configured origin

* Consolidate details test imports

* Type the reviewer test's search stand-in locally so native declarations stay out of its Node-checked program

* Add the PR tab Retry label's English entry the localization check requires

* Restore the PR tab Retry label's translations in the other mobile locales

* Pass the phone write reread through the reviewer contract.

The sheet fixture omitted the required reread, so the phone typecheck failed. Desktop settlement tests that main already removed were still on this branch and pulled telemetry into the web typecheck.

* Declare the phone pull request refresh failure.

The sidebar already shows this sentence when a refresh fails. The English catalog omitted it, and the boot bundle still carried two strings no startup call needs.

* Let the phone sidebar tests subscribe to connection state.

The sidebar records the client's connection before it loads a pull request. These tests drive that through the screen's connection prop, so the stand-in client only has to accept the subscription.

* Justify the phone sidebar test client.

The changed-code check rejects a new cast unless the line says why it is sound. These tests still only subscribe and read connection state.

* Name the repository on the phone sidebar details fixture.

A same-numbered pull request in another repository is not this one. The loaded body has to name the repository the test selected.

* Keep phone review-thread feedback on its accepted detail revision

* Capture phone review actions from the current render

* Align phone recording fixtures with the integrated detail loader

* Keep provider-switch detail fixtures addressed to the selected item

* Preserve same-turn bridge refusal evidence across client call shapes

* Publish phone detail revisions through one synchronous owner

* Type the queued publication regression with its provider contract

* Conform phone regression and relay types to static analysis

* Trim duplicate phone RPC tests and focus recorded observations
This commit is contained in:
Brennan Benson
2026-11-03 14:19:08 -08:00
committed by GitHub
parent ab6f6a7880
commit a56e6de883
247 changed files with 104507 additions and 70969 deletions
+21 -5
View File
@@ -33,6 +33,12 @@ on:
- 'src/main/runtime/agent-session/agent-session-rewind-*.ts'
- 'src/main/runtime/agent-session/agent-session-runtime-*.ts'
- 'src/main/runtime/agent-session/agent-session-unsaved-*.ts'
# The phone/host contract program's unmocked desktop sources and its declaration owner's inputs.
- 'src/main/runtime/runtime-github-repository-query-commands.ts'
- 'src/main/github/issue-field-options.ts'
- 'config/tsconfig.test.mobile-host-declarations.json'
- 'config/tsconfig.node.json'
- 'src/types/build-constants.d.ts'
- 'src/main/native-chat/agent-session-wire/**'
- 'src/main/runtime/structured-attention-original-delivery.test-fixture.ts'
# Rerun the only Fastfile-loading checks for release-workflow/Fastfile edits.
@@ -91,6 +97,12 @@ on:
- 'src/main/runtime/agent-session/agent-session-rewind-*.ts'
- 'src/main/runtime/agent-session/agent-session-runtime-*.ts'
- 'src/main/runtime/agent-session/agent-session-unsaved-*.ts'
# The phone/host contract program's unmocked desktop sources and its declaration owner's inputs.
- 'src/main/runtime/runtime-github-repository-query-commands.ts'
- 'src/main/github/issue-field-options.ts'
- 'config/tsconfig.test.mobile-host-declarations.json'
- 'config/tsconfig.node.json'
- 'src/types/build-constants.d.ts'
- 'src/main/native-chat/agent-session-wire/**'
- 'src/main/runtime/structured-attention-original-delivery.test-fixture.ts'
- '.github/workflows/mobile.yml'
@@ -217,7 +229,8 @@ jobs:
# Why a ratchet and not the raw typecheck: mobile/tsconfig.json excludes test files, so until
# tsconfig.test.json existed nothing checked them, and at introduction 127 of the 632 had
# drifted. This fails when a test file that checks today stops checking, when a test leaves
# the program, and on @ts-nocheck; the baseline may only shrink.
# the program, and on @ts-nocheck; the baseline may only shrink. It then emits phone and host
# declarations and strictly checks the phone/host contract tests against them.
- name: Typecheck tests (ratchet)
id: test-types
background: true
@@ -242,14 +255,17 @@ jobs:
bun-version-file: config/.bun-version
no-cache: true
# Compiler work (including the ratchet's declaration emission) finishes before Vitest workers start.
- wait: [production-types, test-types]
- name: Test
if: steps.test-scope.outputs.should_run != 'false'
env:
ORCA_BACKGROUND_LAUNCH: '1'
run: node ../config/scripts/run-mobile-ci-tests.mjs
# All checks read the completed install; compilers need not hold up test workers.
- wait: [production-types, test-types, ruby-tools]
# The Ruby checks below read the completed fastlane install.
- wait: ruby-tools
# Decode hash-addressed golden behavior changes for review, including after failed tests; advisory only.
- name: Summarize RPC recording changes
@@ -374,9 +390,9 @@ jobs:
bun-version-file: config/.bun-version
no-cache: true
- wait: [production-types, test-types]
- name: Test
env:
ORCA_BACKGROUND_LAUNCH: '1'
run: node ../config/scripts/run-mobile-ci-tests.mjs
- wait: [production-types, test-types]
+3 -1
View File
@@ -22,7 +22,9 @@ const nodeFiles = [
'src/transport/pairing-relay-served-recovery.test.ts',
'src/transport/mobile-relay-rpc-stream-cancellation.test.ts',
'src/test-support/rpc-recording/subscription-recording.test.ts',
'src/test-support/rpc-recording/family-recordings.test.ts'
'src/test-support/rpc-recording/family-recordings.test.ts',
// Its goldens carry V8's TypeError wording, as family-recordings' do.
'src/test-support/rpc-recording/bridged-recording-corpus.test.ts'
]
const config = mergeConfig(original, { cacheDir: process.env.ORCA_MOBILE_CI_CACHE_DIR })
+35 -2
View File
@@ -1,8 +1,8 @@
import { runProcess } from '@orca/process-host'
import { mkdtempSync, mkdirSync, realpathSync, rmSync } from 'node:fs'
import { existsSync, mkdtempSync, mkdirSync, readFileSync, realpathSync, rmSync } from 'node:fs'
import { createRequire } from 'node:module'
import { tmpdir } from 'node:os'
import { dirname, join } from 'node:path'
import { dirname, join, relative } from 'node:path'
import { fileURLToPath } from 'node:url'
const root = fileURLToPath(new URL('../..', import.meta.url))
@@ -27,6 +27,35 @@ const onTerminate = () => {
process.on('SIGINT', onInterrupt)
process.on('SIGTERM', onTerminate)
// The phone/host contract tests are typechecked by their own program; prove Bun actually ran and
// passed them, with assertions, and Node did not. Their names come from that program's roots.
function checkContractTestMembership() {
const config = JSON.parse(readFileSync(join(root, 'mobile/tsconfig.test.node.json'), 'utf8'))
const expected = config.files.filter((file) => /\.test\.tsx?$/.test(file))
const read = (role) => {
const file = join(scratch, role, 'results.json')
return existsSync(file) ? (JSON.parse(readFileSync(file, 'utf8')).testResults ?? []) : []
}
const name = (entry) => relative(join(root, 'mobile'), entry.name).replaceAll('\\', '/')
const bun = new Map(read('bun').map((entry) => [name(entry), entry]))
const node = new Set(read('node').map(name))
const problems = []
for (const file of expected) {
const assertions = bun.get(file)?.assertionResults ?? []
if (
bun.get(file)?.status !== 'passed' ||
assertions.length === 0 ||
assertions.some((assertion) => assertion.status !== 'passed')
) {
problems.push(`${file} did not run and pass every assertion under Bun`)
}
if (node.has(file)) {
problems.push(`${file} ran under Node`)
}
}
return problems
}
async function runRole(role, program, runtimeArgs) {
const owned = join(scratch, role)
let launched = false
@@ -84,6 +113,10 @@ try {
exitCode ||= result.value.code ?? 1
}
}
for (const problem of checkContractTestMembership()) {
console.error(`::error::${problem}`)
exitCode ||= 1
}
process.exitCode = signalExitCode ?? exitCode
} finally {
process.removeListener('SIGINT', onInterrupt)
@@ -0,0 +1,30 @@
{
"extends": "./tsconfig.node.json",
"compilerOptions": {
"composite": false,
"incremental": false,
"noEmit": false,
"noEmitOnError": true,
"declaration": true,
"emitDeclarationOnly": true,
"declarationMap": false,
"rootDir": "..",
"outDir": "../mobile/node_modules/.cache/phone-host-contract-types"
},
"files": [
"../src/main/runtime/runtime-github-repository-query-commands.ts",
"../src/main/runtime/rpc/methods/github-repo-work-item-methods.ts",
"../src/main/runtime/orca-runtime.ts",
"../src/main/runtime/rpc/core.ts",
"../src/main/runtime/rpc/dispatcher-request-parsing.ts",
"../src/main/github/issue-field-options.ts",
"../src/types/build-constants.d.ts"
],
"include": ["../src/shared/**/*.ts", "../src/shared/**/*.tsx"],
"exclude": [
"../src/shared/**/*.test.ts",
"../src/shared/**/*.test.tsx",
"../src/shared/**/*.spec.ts",
"../src/shared/**/*.spec.tsx"
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,851 +0,0 @@
{
"goldenFormatVersion": 6,
"operation": "tasks.item-detail-metadata",
"family": "tasks.item-detail-metadata",
"namedDeltas": [],
"values": {
"046247fe2cbb": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [],
"usersError": "",
"usersLoading": false
},
"187a6bd82efe": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"1fb96ebc4d56": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": {
"error": "inner refused",
"ok": false
}
}
}
},
"201bfb8a7b2a": {
"name": "itemAssignableUsersError",
"ordinal": 14,
"value": ""
},
"215de61d1fbb": {
"name": "itemAssignableUsersLoading",
"ordinal": 15,
"value": false
},
"297efc016dab": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"error": {
"code": "refused",
"message": "outer refused"
},
"id": "frame-2",
"ok": false
}
}
},
"3356ec8253b4": {
"name": "itemBodyDraft",
"ordinal": 1,
"value": "body"
},
"3b4a3643a78c": {
"name": "github.listAssignableUsers#1",
"ordinal": 11,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.listAssignableUsers\",\"params\":{\"repo\":\"id:repo-1\"}}"
},
"3c0f8d43db2e": {
"name": "itemLabelsLoading",
"ordinal": 13,
"value": false
},
"3de0a3c1d4f4": {
"name": "itemAssignableUsersError",
"ordinal": 14,
"value": "Unknown method"
},
"3edb9333eaaf": {
"name": "itemAssignableUsers",
"ordinal": 6,
"value": []
},
"401dbdd3d1e0": {
"name": "itemAssignableUsersError",
"ordinal": 14,
"value": "transport failure"
},
"4e8a9b0b302b": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true
}
}
},
"4f0b27d85f31": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
]
}
}
},
"51e44980e984": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [],
"usersError": "Unknown method",
"usersLoading": false
},
"52bf7ee20ac1": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": {
"error": {
"message": "inner refused"
},
"ok": false
}
}
}
},
"556482c37d97": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "",
"isRpcDeliveryUnknown": true
}
}
},
"5b9626f7c5fd": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [],
"usersError": "outer refused",
"usersLoading": false
},
"8656a07ff9a8": {
"name": "itemAssignableUsersError",
"ordinal": 14,
"value": "outer refused"
},
"90483b517d86": {
"name": "itemAssignableUsers",
"ordinal": 14,
"value": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
]
},
"97461d34df3a": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"error": {
"code": "refused",
"message": ""
},
"id": "frame-2",
"ok": false
}
}
},
"99b2357770d0": {
"name": "itemAssignableUsersError",
"ordinal": 7,
"value": ""
},
"9a8e65d1e38f": {
"name": "github.listLabels#1",
"ordinal": 10,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listLabels\",\"params\":{\"repo\":\"id:repo-1\"}}"
},
"a49372405361": {
"name": "itemAssignableUsersLoading",
"ordinal": 8,
"value": true
},
"ac0fe77ec843": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"error": {
"code": "method_not_found",
"message": "Unknown method"
},
"id": "frame-2",
"ok": false
}
}
},
"ae373967e842": {
"name": "itemLabelsLoading",
"ordinal": 4,
"value": true
},
"b547643a8c4b": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [],
"usersError": "The host sent a reply this app could not read (github.listAssignableUsers)",
"usersLoading": false
},
"bb786eaeecad": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": {
"error": "refused"
}
}
}
},
"cd0e3d61ff7d": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": ["bug", "chore"]
}
}
},
"d20d6958d614": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [],
"usersError": "transport failure",
"usersLoading": false
},
"d2115cb2a5a1": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": {
"$rpc": "null"
}
}
}
},
"e11f2dac1b42": {
"name": "itemLabelsError",
"ordinal": 3,
"value": ""
},
"e8ff540f77f3": {
"name": "itemAvailableLabels",
"ordinal": 2,
"value": []
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
},
"ee14574545b1": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "transport failure",
"isRpcDeliveryUnknown": true
}
}
},
"f446885f520e": {
"name": "itemAssignableUsersError",
"ordinal": 14,
"value": "The host sent a reply this app could not read (github.listAssignableUsers)"
},
"fbaca9693f87": {
"name": "itemAvailableLabels",
"ordinal": 12,
"value": ["bug", "chore"]
}
},
"recording": {
"scenario": "matrix-tasks.item-detail-metadata-github.listassignableusers-1",
"checkpoints": [
{
"id": "tk-item-detail-metadata.normal:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "187a6bd82efe",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.result-absent:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "4e8a9b0b302b"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b547643a8c4b",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"f446885f520e",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.result-null:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "d2115cb2a5a1"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b547643a8c4b",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"f446885f520e",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.inner-ok-missing:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "bb786eaeecad"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b547643a8c4b",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"f446885f520e",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.inner-false-string-error:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "1fb96ebc4d56"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b547643a8c4b",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"f446885f520e",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.inner-false-object-error:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "52bf7ee20ac1"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b547643a8c4b",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"f446885f520e",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.outer-refused:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "297efc016dab"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "5b9626f7c5fd",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"8656a07ff9a8",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.outer-refused-no-message:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "97461d34df3a"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "046247fe2cbb",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"201bfb8a7b2a",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.method-not-found:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "ac0fe77ec843"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "51e44980e984",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"3de0a3c1d4f4",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.transport-rejection:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "ee14574545b1"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "d20d6958d614",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"401dbdd3d1e0",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.transport-rejection-no-message:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "556482c37d97"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "046247fe2cbb",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"201bfb8a7b2a",
"215de61d1fbb"
]
}
}
]
}
}
@@ -1,891 +0,0 @@
{
"goldenFormatVersion": 6,
"operation": "tasks.item-detail-metadata",
"family": "tasks.item-detail-metadata",
"namedDeltas": [],
"values": {
"0bfb51d103da": {
"name": "itemLabelsError",
"ordinal": 12,
"value": "transport failure"
},
"0d670a7b256b": {
"labels": [],
"labelsError": "transport failure",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"187a6bd82efe": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"215de61d1fbb": {
"name": "itemAssignableUsersLoading",
"ordinal": 15,
"value": false
},
"222c049cbb2a": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"error": {
"code": "refused",
"message": ""
},
"id": "frame-1",
"ok": false
}
}
},
"2dcccd0a2e1e": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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
}
}
},
"3356ec8253b4": {
"name": "itemBodyDraft",
"ordinal": 1,
"value": "body"
},
"345426dc323b": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": {
"error": "refused"
}
}
}
},
"3b4a3643a78c": {
"name": "github.listAssignableUsers#1",
"ordinal": 11,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.listAssignableUsers\",\"params\":{\"repo\":\"id:repo-1\"}}"
},
"3c0f8d43db2e": {
"name": "itemLabelsLoading",
"ordinal": 13,
"value": false
},
"3edb9333eaaf": {
"name": "itemAssignableUsers",
"ordinal": 6,
"value": []
},
"43b6d24fbc7b": {
"name": "itemLabelsError",
"ordinal": 12,
"value": "outer refused"
},
"476e11905643": {
"labels": [],
"labelsError": "Unknown method",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"4f0b27d85f31": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
]
}
}
},
"586d4bb85833": {
"name": "itemLabelsError",
"ordinal": 12,
"value": "The host sent a reply this app could not read (github.listLabels)"
},
"8133d5271224": {
"name": "itemLabelsError",
"ordinal": 12,
"value": ""
},
"90483b517d86": {
"name": "itemAssignableUsers",
"ordinal": 14,
"value": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
]
},
"99b2357770d0": {
"name": "itemAssignableUsersError",
"ordinal": 7,
"value": ""
},
"9a8e65d1e38f": {
"name": "github.listLabels#1",
"ordinal": 10,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listLabels\",\"params\":{\"repo\":\"id:repo-1\"}}"
},
"a2835189d719": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "transport failure",
"isRpcDeliveryUnknown": true
}
}
},
"a49372405361": {
"name": "itemAssignableUsersLoading",
"ordinal": 8,
"value": true
},
"ae373967e842": {
"name": "itemLabelsLoading",
"ordinal": 4,
"value": true
},
"bcc62e574cde": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": {
"$rpc": "null"
}
}
}
},
"c8bbeea01e3a": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "",
"isRpcDeliveryUnknown": true
}
}
},
"cd0e3d61ff7d": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": ["bug", "chore"]
}
}
},
"d1182c2be3cf": {
"labels": [],
"labelsError": "outer refused",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"d79f6e922f48": {
"labels": [],
"labelsError": "",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"d7a33503e34e": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"error": {
"code": "refused",
"message": "outer refused"
},
"id": "frame-1",
"ok": false
}
}
},
"de4475507e53": {
"name": "itemLabelsError",
"ordinal": 12,
"value": "Unknown method"
},
"e11f2dac1b42": {
"name": "itemLabelsError",
"ordinal": 3,
"value": ""
},
"e3c567dd8755": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"error": {
"code": "method_not_found",
"message": "Unknown method"
},
"id": "frame-1",
"ok": false
}
}
},
"e8ff540f77f3": {
"name": "itemAvailableLabels",
"ordinal": 2,
"value": []
},
"e988589d9748": {
"labels": [],
"labelsError": "The host sent a reply this app could not read (github.listLabels)",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"eb10dbb56e82": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": {
"error": "inner refused",
"ok": false
}
}
}
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
},
"f688d81cf210": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": {
"error": {
"message": "inner refused"
},
"ok": false
}
}
}
},
"fbaca9693f87": {
"name": "itemAvailableLabels",
"ordinal": 12,
"value": ["bug", "chore"]
}
},
"recording": {
"scenario": "matrix-tasks.item-detail-metadata-github.listlabels-1",
"checkpoints": [
{
"id": "tk-item-detail-metadata.normal:mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "187a6bd82efe",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.result-absent:mounted",
"observation": {
"sender": ["2dcccd0a2e1e", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "e988589d9748",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"586d4bb85833",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.result-null:mounted",
"observation": {
"sender": ["bcc62e574cde", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "e988589d9748",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"586d4bb85833",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.inner-ok-missing:mounted",
"observation": {
"sender": ["345426dc323b", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "e988589d9748",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"586d4bb85833",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.inner-false-string-error:mounted",
"observation": {
"sender": ["eb10dbb56e82", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "e988589d9748",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"586d4bb85833",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.inner-false-object-error:mounted",
"observation": {
"sender": ["f688d81cf210", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "e988589d9748",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"586d4bb85833",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.outer-refused:mounted",
"observation": {
"sender": ["d7a33503e34e", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "d1182c2be3cf",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"43b6d24fbc7b",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.outer-refused-no-message:mounted",
"observation": {
"sender": ["222c049cbb2a", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "d79f6e922f48",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"8133d5271224",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.method-not-found:mounted",
"observation": {
"sender": ["e3c567dd8755", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "476e11905643",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"de4475507e53",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.transport-rejection:mounted",
"observation": {
"sender": ["a2835189d719", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "0d670a7b256b",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"0bfb51d103da",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
},
{
"id": "tk-item-detail-metadata.transport-rejection-no-message:mounted",
"observation": {
"sender": ["c8bbeea01e3a", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "d79f6e922f48",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"8133d5271224",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
]
}
}
]
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -4,23 +4,11 @@
"family": "tasks.project-row-detail",
"namedDeltas": [],
"values": {
"0216abb9c43b": {
"name": "projectTitleDraft",
"ordinal": 1,
"value": {
"$rpc": "undefined"
}
},
"0679b27a119b": {
"name": "projectFieldDrafts",
"ordinal": 11,
"value": {}
},
"0ad63b01155a": {
"name": "prFileContents",
"ordinal": 8,
"value": {}
},
"0fa980ff8396": {
"detail": {
"$rpc": "null"
@@ -150,13 +138,6 @@
"ordinal": 17,
"value": "outer refused"
},
"2e6edf535ef3": {
"name": "prFileLoadingPath",
"ordinal": 9,
"value": {
"$rpc": "null"
}
},
"2ee1c7329449": {
"name": "projectRowDetail",
"ordinal": 12,
@@ -164,6 +145,11 @@
"$rpc": "null"
}
},
"31fcc93f02da": {
"name": "projectEditingCommentDraft",
"ordinal": 9,
"value": ""
},
"3236e59b43c5": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
@@ -207,6 +193,23 @@
"error": "transport failure",
"loading": false
},
"368311fc2981": {
"name": "projectCommentDraft",
"ordinal": 7,
"value": ""
},
"3a42a92c5487": {
"name": "projectBodyDraft",
"ordinal": 6,
"value": "Project issue body"
},
"3b9902cb94f1": {
"name": "expandedPrFilePath",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"41f7d0f4ab48": {
"detail": {
"$rpc": "null"
@@ -221,9 +224,9 @@
"error": "",
"loading": false
},
"4ad8bb2f6308": {
"4f23116da7f6": {
"name": "projectReviewersDraft",
"ordinal": 6,
"ordinal": 10,
"value": ""
},
"561861a537bb": {
@@ -231,13 +234,18 @@
"ordinal": 18,
"value": false
},
"6545686833e4": {
"name": "expandedPrFilePath",
"ordinal": 7,
"5cebe6c14680": {
"name": "prFileLoadingPath",
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"60012e7abb60": {
"name": "prFileCommentDrafts",
"ordinal": 2,
"value": {}
},
"6c3d811fffe9": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
@@ -276,10 +284,71 @@
}
}
},
"742985d99709": {
"name": "projectEditingCommentDraft",
"ordinal": 5,
"value": ""
"7ca2bb47ab1c": {
"name": "prFileContents",
"ordinal": 3,
"value": {}
},
"899221be28d8": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
"args": [
{
"name": "method",
"value": "github.project.workItemDetailsBySlug"
},
{
"name": "params",
"value": {
"host": "github.enterprise.test",
"number": 1,
"owner": "owner",
"repo": "repo",
"type": "issue"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"details": {
"assignees": [],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"item": {
"author": {
"$rpc": "null"
},
"id": "issue:1",
"labels": [],
"number": 1,
"state": "open",
"title": "Project issue",
"type": "issue",
"updatedAt": "2026-10-30T00:00:00Z",
"url": "https://github.enterprise.test/owner/repo/issues/1"
},
"pullRequestId": "PR_kwDO"
},
"ok": true
}
}
}
},
"8bea5c781cb0": {
"name": "github.project.workItemDetailsBySlug#1",
@@ -360,6 +429,11 @@
}
}
},
"9911dd53d1d7": {
"name": "projectTitleDraft",
"ordinal": 5,
"value": "Project issue"
},
"9c91ff2e7fe6": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
@@ -435,13 +509,6 @@
}
}
},
"9f0108368fff": {
"name": "projectEditingCommentId",
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"a90f501112f8": {
"name": "projectRowDetailError",
"ordinal": 17,
@@ -473,57 +540,6 @@
"error": "",
"loading": false
},
"b4e65ea8b72c": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
"args": [
{
"name": "method",
"value": "github.project.workItemDetailsBySlug"
},
{
"name": "params",
"value": {
"host": "github.enterprise.test",
"number": 1,
"owner": "owner",
"repo": "repo",
"type": "issue"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"details": {
"assignees": [],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"item": {
"labels": []
},
"pullRequestId": "PR_kwDO"
},
"ok": true
}
}
}
},
"b63d5911050c": {
"name": "projectRowDetailError",
"ordinal": 13,
@@ -534,6 +550,13 @@
"ordinal": 17,
"value": ""
},
"c0e2c37d8abf": {
"name": "projectEditingCommentId",
"ordinal": 8,
"value": {
"$rpc": "null"
}
},
"cd23fb9a85c7": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
@@ -573,11 +596,6 @@
}
}
},
"da1a7926872e": {
"name": "projectBodyDraft",
"ordinal": 2,
"value": ""
},
"ea064759ca04": {
"name": "projectRowDetailError",
"ordinal": 17,
@@ -591,11 +609,6 @@
"$rpc": "undefined"
}
},
"eec8081f6290": {
"name": "projectCommentDraft",
"ordinal": 3,
"value": ""
},
"f6a5085dd8e9": {
"name": "projectRowDetailLoading",
"ordinal": 14,
@@ -641,11 +654,6 @@
}
}
}
},
"fdcd0ea3f000": {
"name": "prFileCommentDrafts",
"ordinal": 10,
"value": {}
}
},
"recording": {
@@ -654,23 +662,23 @@
{
"id": "tk-project-row-detail.normal:mounted",
"observation": {
"sender": ["b4e65ea8b72c"],
"sender": ["899221be28d8"],
"payloads": ["118d9662d37f"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b2a01ad6d4fe",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -690,16 +698,16 @@
},
"state": "183c3c26aba7",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -719,16 +727,16 @@
},
"state": "183c3c26aba7",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -748,16 +756,16 @@
},
"state": "183c3c26aba7",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -777,16 +785,16 @@
},
"state": "183c3c26aba7",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -806,16 +814,16 @@
},
"state": "205699b4093c",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -835,16 +843,16 @@
},
"state": "0fa980ff8396",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -864,16 +872,16 @@
},
"state": "45b703d1ba29",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -893,16 +901,16 @@
},
"state": "41f7d0f4ab48",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -922,16 +930,16 @@
},
"state": "348c16318267",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
@@ -951,16 +959,16 @@
},
"state": "45b703d1ba29",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -4,9 +4,99 @@
"family": "tasks.item-comment-github",
"namedDeltas": [],
"values": {
"064357f4a198": {
"1ca30ac68b76": {
"name": "detailPayload",
"ordinal": 6,
"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"
}
},
"1fc52836dac4": {
"name": "itemReviewersDraft",
"ordinal": 9,
"value": "octocat"
},
"3aefb3006914": {
"name": "error",
"ordinal": 10,
"value": ""
},
"4031bf455f49": {
"name": "mutatingStatus",
"ordinal": 5,
"value": false
},
"53506297367b": {
"name": "itemCommentDraft",
"ordinal": 3,
"value": ""
},
"56a29701de21": {
"name": "itemCommentDraft",
"ordinal": 8,
"value": "a comment"
},
"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
},
"ae745d4c2372": {
"name": "detailPayload",
"ordinal": 14,
"value": {
"assignees": ["octocat"],
"baseSha": "base-sha",
@@ -56,15 +146,11 @@
"reviewDecision": {
"$rpc": "null"
},
"reviewRequests": []
"reviewRequests": [],
"targetKey": "repo-1\u0000owner/repo\u0000issue\u00009"
}
},
"14949c71727e": {
"name": "mutatingStatus",
"ordinal": 7,
"value": false
},
"35cd4f653b4b": {
"b36fef11f7dc": {
"draft": "",
"error": "",
"item": {
@@ -76,7 +162,8 @@
"repoId": "repo-1",
"reviewRequests": [],
"state": "open",
"type": "issue"
"type": "issue",
"url": "https://github.com/owner/repo/issues/9"
},
"title": "An issue"
},
@@ -130,22 +217,31 @@
"reviewDecision": {
"$rpc": "null"
},
"reviewRequests": []
"reviewRequests": [],
"targetKey": "repo-1\u0000owner/repo\u0000issue\u00009"
}
},
"59b03dcdb55e": {
"name": "itemCommentDraft",
"ordinal": 5,
"value": ""
"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"
}
},
"700390b3c879": {
"c445ea7e151b": {
"name": "github.addIssueComment#1",
"ordinal": 4,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.addIssueComment\",\"params\":{\"repo\":\"id:repo-1\",\"number\":9,\"body\":\"a comment\",\"type\":\"issue\"}}"
},
"a77d082f5f48": {
"name": "github.addIssueComment#1",
"ordinal": 3,
"ordinal": 11,
"args": [
{
"name": "method",
@@ -156,6 +252,11 @@
"value": {
"body": "a comment",
"number": 9,
"prRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repo": "id:repo-1",
"type": "issue"
}
@@ -186,6 +287,23 @@
}
}
},
"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,
@@ -194,15 +312,12 @@
"$rpc": "undefined"
}
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -211,19 +326,28 @@
{
"id": "comment-settled",
"observation": {
"sender": ["a77d082f5f48"],
"payloads": ["700390b3c879"],
"sender": ["c445ea7e151b"],
"payloads": ["69e396c2097f"],
"settlements": {
"mount": "eb79a9b3682a",
"comment-0": "eb79a9b3682a"
},
"state": "35cd4f653b4b",
"state": "b36fef11f7dc",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"59b03dcdb55e",
"064357f4a198",
"14949c71727e"
"cc2ece9478f0",
"eda130337c99",
"53506297367b",
"c650cf641414",
"4031bf455f49",
"c43ab05aed16",
"1ca30ac68b76",
"56a29701de21",
"1fc52836dac4",
"3aefb3006914",
"886c60a7e62e",
"ae745d4c2372",
"6f50ec77f02f",
"cbae54d3d351"
]
}
}
@@ -4,14 +4,83 @@
"family": "tasks.item-comment-gitlab-mr",
"namedDeltas": [],
"values": {
"14949c71727e": {
"1fc52836dac4": {
"name": "itemReviewersDraft",
"ordinal": 9,
"value": "octocat"
},
"3aefb3006914": {
"name": "error",
"ordinal": 10,
"value": ""
},
"4031bf455f49": {
"name": "mutatingStatus",
"ordinal": 7,
"ordinal": 5,
"value": false
},
"48f9793316e8": {
"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": ""
},
"56a29701de21": {
"name": "itemCommentDraft",
"ordinal": 8,
"value": "a comment"
},
"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",
@@ -55,15 +124,27 @@
}
}
},
"59b03dcdb55e": {
"name": "itemCommentDraft",
"ordinal": 5,
"886c60a7e62e": {
"name": "mutatingStatus",
"ordinal": 12,
"value": true
},
"c650cf641414": {
"name": "itemReviewersDraft",
"ordinal": 4,
"value": ""
},
"aff818772586": {
"name": "gitlab.addMRComment#1",
"ordinal": 4,
"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\"}}}"
"cbae54d3d351": {
"name": "mutatingStatus",
"ordinal": 16,
"value": false
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"ea24a662dd3d": {
"draft": "",
@@ -115,14 +196,16 @@
"$rpc": "undefined"
}
},
"ed3a7d6bc894": {
"name": "error",
"ordinal": 2,
"value": ""
},
"f157114ec080": {
"eda130337c99": {
"name": "detailPayload",
"ordinal": 6,
"ordinal": 2,
"value": {
"$rpc": "null"
}
},
"f3cb1a7df6dc": {
"name": "detailPayload",
"ordinal": 14,
"value": {
"assignees": [],
"body": "body",
@@ -144,11 +227,6 @@
"pipelineJobs": [],
"provider": "gitlab"
}
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
}
},
"recording": {
@@ -157,19 +235,28 @@
{
"id": "comment-settled",
"observation": {
"sender": ["48f9793316e8"],
"payloads": ["aff818772586"],
"sender": ["816c715cd13d"],
"payloads": ["4c60f1fd22ca"],
"settlements": {
"mount": "eb79a9b3682a",
"comment-0": "eb79a9b3682a"
},
"state": "ea24a662dd3d",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"59b03dcdb55e",
"f157114ec080",
"14949c71727e"
"cc2ece9478f0",
"eda130337c99",
"53506297367b",
"c650cf641414",
"4031bf455f49",
"622bbddf4f05",
"474412c229f4",
"56a29701de21",
"1fc52836dac4",
"3aefb3006914",
"886c60a7e62e",
"f3cb1a7df6dc",
"6f50ec77f02f",
"cbae54d3d351"
]
}
}
@@ -4,10 +4,30 @@
"family": "tasks.item-comment-gitlab",
"namedDeltas": [],
"values": {
"14949c71727e": {
"name": "mutatingStatus",
"ordinal": 7,
"value": false
"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": "",
@@ -51,14 +71,24 @@
"provider": "gitlab"
}
},
"59b03dcdb55e": {
"name": "itemCommentDraft",
"ordinal": 5,
"1fc52836dac4": {
"name": "itemReviewersDraft",
"ordinal": 9,
"value": "octocat"
},
"3aefb3006914": {
"name": "error",
"ordinal": 10,
"value": ""
},
"69fe3fea1fa0": {
"4031bf455f49": {
"name": "mutatingStatus",
"ordinal": 5,
"value": false
},
"474412c229f4": {
"name": "detailPayload",
"ordinal": 6,
"ordinal": 7,
"value": {
"assignees": [],
"body": "body",
@@ -68,12 +98,6 @@
"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"],
@@ -81,22 +105,71 @@
"provider": "gitlab"
}
},
"8ab635fff625": {
"name": "gitlab.addIssueComment#1",
"ordinal": 4,
"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\"}}}"
"53506297367b": {
"name": "itemCommentDraft",
"ordinal": 3,
"value": ""
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"56a29701de21": {
"name": "itemCommentDraft",
"ordinal": 8,
"value": "a comment"
},
"6f50ec77f02f": {
"name": "itemCommentDraft",
"ordinal": 15,
"value": ""
},
"779d1b9a2edb": {
"name": "actionItem",
"ordinal": 6,
"value": {
"$rpc": "undefined"
"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"
}
},
"ebbbaa5649f1": {
"886c60a7e62e": {
"name": "mutatingStatus",
"ordinal": 12,
"value": true
},
"ad33e328b827": {
"name": "gitlab.addIssueComment#1",
"ordinal": 3,
"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",
@@ -140,15 +213,20 @@
}
}
},
"ed3a7d6bc894": {
"name": "error",
"ordinal": 2,
"value": ""
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -157,19 +235,28 @@
{
"id": "comment-settled",
"observation": {
"sender": ["ebbbaa5649f1"],
"payloads": ["8ab635fff625"],
"sender": ["d3b00d7291ae"],
"payloads": ["ad33e328b827"],
"settlements": {
"mount": "eb79a9b3682a",
"comment-0": "eb79a9b3682a"
},
"state": "17b97af91ff8",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"59b03dcdb55e",
"69fe3fea1fa0",
"14949c71727e"
"cc2ece9478f0",
"eda130337c99",
"53506297367b",
"c650cf641414",
"4031bf455f49",
"779d1b9a2edb",
"474412c229f4",
"56a29701de21",
"1fc52836dac4",
"3aefb3006914",
"886c60a7e62e",
"02b5df9521e8",
"6f50ec77f02f",
"cbae54d3d351"
]
}
}
@@ -4,40 +4,69 @@
"family": "tasks.item-detail-github",
"namedDeltas": [],
"values": {
"19e10d5e8599": {
"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"
"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"
"type": "pr",
"url": "https://github.com/owner/repo/pull/12"
},
"title": "A pull request"
}
@@ -75,24 +104,18 @@
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": "APPROVED",
"reviewRequests": []
"reviewRequests": [],
"targetKey": "repo-1\u0000owner/repo\u0000pr\u000012"
}
},
"264010756b38": {
"name": "detailLoading",
"ordinal": 3,
"value": true
},
"33614c90b6eb": {
"name": "detailPayload",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"3e81549611f6": {
"617b71ab2cc6": {
"name": "github.workItemDetails#1",
"ordinal": 4,
"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",
@@ -109,6 +132,8 @@
{
"name": "options",
"value": {
"beforeSend": "[local beforeSend]",
"failWhenDisconnected": true,
"timeoutMs": 30000
}
}
@@ -118,7 +143,7 @@
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"id": "frame-2",
"ok": true,
"result": {
"assignees": ["octocat"],
@@ -148,34 +173,41 @@
"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": []
"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"
}
}
}
},
"5d06a9d9f7ea": {
"name": "github.workItemDetails#1",
"ordinal": 5,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12,\"type\":\"pr\"}}"
},
"7816d31432b8": {
"name": "detailLoading",
"ordinal": 7,
"value": false
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"e56f8c6b3c42": {
"72c0fc81a418": {
"name": "detailPayload",
"ordinal": 6,
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"7649c383b850": {
"name": "detailPayload",
"ordinal": 13,
"value": {
"assignees": ["octocat"],
"baseSha": "base-sha",
@@ -208,7 +240,97 @@
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": "APPROVED",
"reviewRequests": []
"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": {
@@ -226,18 +348,22 @@
{
"id": "mounted",
"observation": {
"sender": ["3e81549611f6"],
"payloads": ["5d06a9d9f7ea"],
"sender": ["c6baeb478bf3", "684c16e60ccd"],
"payloads": ["b99a772c440f", "617b71ab2cc6"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "19e10d5e8599",
"state": "4b2ed31e98ae",
"effects": [
"33614c90b6eb",
"cc2ece9478f0",
"a4f1a8696a24",
"264010756b38",
"e56f8c6b3c42",
"7816d31432b8"
"16125975286b",
"72c0fc81a418",
"988fd3d6f1c4",
"cacd48cf20dc",
"185dd46f0a38",
"20f8d00e8abe",
"7649c383b850"
]
}
}
@@ -4,40 +4,276 @@
"family": "tasks.item-detail-github",
"namedDeltas": [],
"values": {
"1874e6e64ab8": {
"error": "",
"item": {
"16125975286b": {
"name": "detailLoading",
"ordinal": 3,
"value": false
},
"185dd46f0a38": {
"name": "detailLoading",
"ordinal": 8,
"value": true
},
"20f8d00e8abe": {
"name": "detailLoading",
"ordinal": 12,
"value": false
},
"2d2a330997f7": {
"name": "github.workItemDetails#1",
"ordinal": 10,
"args": [
{
"name": "method",
"value": "github.workItemDetails"
},
{
"name": "params",
"value": {
"number": 12,
"ownerRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repo": "id:repo-1",
"type": "pr"
}
},
{
"name": "options",
"value": {
"beforeSend": "[local beforeSend]",
"envelope": {
"expectedRuntimeSource": {
"runtimeId": "detail-runtime",
"sourceId": "detail-host"
}
},
"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": [],
"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"
}
}
}
},
"46643bb88ce4": {
"name": "github.workItemDetails#1",
"ordinal": 11,
"json": "{\"expectedRuntimeSource\":{\"sourceId\":\"detail-host\",\"runtimeId\":\"detail-runtime\"},\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12,\"type\":\"pr\",\"ownerRepo\":{\"owner\":\"owner\",\"repo\":\"repo\",\"host\":\"github.com\"}}}"
},
"72c0fc81a418": {
"name": "detailPayload",
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"90eb12657cbd": {
"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": {
"capabilities": ["github.exact-work-item-target.v1"],
"hostDescriptor": {
"installationId": "detail-host"
},
"runtimeId": "detail-runtime"
}
}
}
},
"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\"}"
},
"c540e93e8c8a": {
"name": "detailPayload",
"ordinal": 13,
"value": {
"assignees": ["octocat"],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"labels": ["bug"],
"latestReviews": [],
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": "APPROVED",
"reviewRequests": [],
"targetKey": "repo-1\u0000owner/repo\u0000pr\u000012"
}
},
"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"
"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"
}
},
"fe60b5a8212b": {
"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"
"type": "pr",
"url": "https://github.com/owner/repo/pull/12"
},
"title": "A pull request"
}
@@ -56,110 +292,8 @@
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": "APPROVED",
"reviewRequests": []
}
},
"264010756b38": {
"name": "detailLoading",
"ordinal": 3,
"value": true
},
"2f7a8a3927f9": {
"name": "detailPayload",
"ordinal": 6,
"value": {
"assignees": ["octocat"],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"labels": ["bug"],
"latestReviews": [],
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": "APPROVED",
"reviewRequests": []
}
},
"33614c90b6eb": {
"name": "detailPayload",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"397d0cad127a": {
"name": "github.workItemDetails#1",
"ordinal": 4,
"args": [
{
"name": "method",
"value": "github.workItemDetails"
},
{
"name": "params",
"value": {
"number": 12,
"repo": "id:repo-1",
"type": "pr"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"assignees": ["octocat"],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"item": {
"labels": ["bug"],
"latestReviews": [],
"reviewDecision": "APPROVED",
"reviewRequests": []
},
"pullRequestId": "PR_kwDO"
}
}
}
},
"5d06a9d9f7ea": {
"name": "github.workItemDetails#1",
"ordinal": 5,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemDetails\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12,\"type\":\"pr\"}}"
},
"7816d31432b8": {
"name": "detailLoading",
"ordinal": 7,
"value": false
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
"reviewRequests": [],
"targetKey": "repo-1\u0000owner/repo\u0000pr\u000012"
}
}
},
@@ -169,18 +303,22 @@
{
"id": "mounted",
"observation": {
"sender": ["397d0cad127a"],
"payloads": ["5d06a9d9f7ea"],
"sender": ["90eb12657cbd", "2d2a330997f7"],
"payloads": ["b99a772c440f", "46643bb88ce4"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "1874e6e64ab8",
"state": "fe60b5a8212b",
"effects": [
"33614c90b6eb",
"cc2ece9478f0",
"a4f1a8696a24",
"264010756b38",
"2f7a8a3927f9",
"7816d31432b8"
"16125975286b",
"72c0fc81a418",
"988fd3d6f1c4",
"cacd48cf20dc",
"185dd46f0a38",
"20f8d00e8abe",
"c540e93e8c8a"
]
}
}
@@ -4,10 +4,21 @@
"family": "tasks.item-detail-gitlab",
"namedDeltas": [],
"values": {
"012013790766": {
"16125975286b": {
"name": "detailLoading",
"ordinal": 3,
"value": false
},
"185dd46f0a38": {
"name": "detailLoading",
"ordinal": 8,
"value": true
},
"18a362320fb7": {
"name": "actionItem",
"ordinal": 7,
"ordinal": 11,
"value": {
"key": "gitlab:repo-1:issue:4",
"provider": "gitlab",
"source": {
"checksSummary": {
@@ -30,31 +41,141 @@
"reviewDecision": "approved",
"reviewerCount": 0,
"state": "opened",
"type": "issue"
"type": "issue",
"url": "https://gitlab.com/group/project/-/issues/4"
},
"title": "A GitLab issue"
}
},
"20dbc6200418": {
"name": "gitlab.workItemDetails#1",
"ordinal": 5,
"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\"}}}"
},
"264010756b38": {
"20f8d00e8abe": {
"name": "detailLoading",
"ordinal": 3,
"value": true
"ordinal": 12,
"value": false
},
"33614c90b6eb": {
"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"
}
},
"6d1464c64f13": {
"error": "",
"item": {
"key": "gitlab:repo-1:issue:4",
"provider": "gitlab",
"source": {
"checksSummary": {
"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": {
"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"
}
},
"72c0fc81a418": {
"name": "detailPayload",
"ordinal": 1,
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"59623b0af407": {
"8ac545c58ec2": {
"name": "gitlab.workItemDetails#1",
"ordinal": 4,
"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\"}}}"
},
"90e2c30bae69": {
"name": "gitlab.workItemDetails#1",
"ordinal": 7,
"args": [
{
"name": "method",
@@ -119,109 +240,20 @@
}
}
},
"612bc240a5da": {
"name": "items",
"ordinal": 8,
"value": [
{
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
}
]
},
"8ccd4fa759a5": {
"name": "detailLoading",
"ordinal": 9,
"value": false
"988fd3d6f1c4": {
"name": "detailRefreshSeq",
"ordinal": 5,
"value": 0
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"d5ef076aa5ea": {
"error": "",
"item": {
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
},
"items": [
{
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
}
],
"loading": false,
"payload": {
"b4d8ed508667": {
"name": "detailPayload",
"ordinal": 13,
"value": {
"assignees": [],
"body": "body",
"comments": [
@@ -245,6 +277,48 @@
"provider": "gitlab"
}
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"d759afce345e": {
"name": "items",
"ordinal": 10,
"value": [
{
"key": "gitlab:repo-1:issue:4",
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
}
]
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -252,33 +326,6 @@
"value": {
"$rpc": "undefined"
}
},
"f960b61daf75": {
"name": "detailPayload",
"ordinal": 6,
"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"
}
}
},
"recording": {
@@ -287,20 +334,24 @@
{
"id": "mounted",
"observation": {
"sender": ["59623b0af407"],
"payloads": ["20dbc6200418"],
"sender": ["90e2c30bae69"],
"payloads": ["8ac545c58ec2"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "d5ef076aa5ea",
"state": "6d1464c64f13",
"effects": [
"33614c90b6eb",
"cc2ece9478f0",
"a4f1a8696a24",
"264010756b38",
"f960b61daf75",
"012013790766",
"612bc240a5da",
"8ccd4fa759a5"
"16125975286b",
"72c0fc81a418",
"988fd3d6f1c4",
"274b8ecb4f73",
"185dd46f0a38",
"d759afce345e",
"18a362320fb7",
"20f8d00e8abe",
"b4d8ed508667"
]
}
}
@@ -4,180 +4,9 @@
"family": "tasks.item-detail-gitlab",
"namedDeltas": [],
"values": {
"012013790766": {
"name": "actionItem",
"0b1aa38d91fe": {
"name": "gitlab.workItemDetails#1",
"ordinal": 7,
"value": {
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
}
},
"20dbc6200418": {
"name": "gitlab.workItemDetails#1",
"ordinal": 5,
"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\"}}}"
},
"264010756b38": {
"name": "detailLoading",
"ordinal": 3,
"value": true
},
"33614c90b6eb": {
"name": "detailPayload",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"612bc240a5da": {
"name": "items",
"ordinal": 8,
"value": [
{
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
}
]
},
"6a8913577681": {
"name": "detailPayload",
"ordinal": 6,
"value": {
"assignees": [],
"body": "body",
"comments": [],
"labels": ["bug"],
"pipelineJobs": [],
"provider": "gitlab"
}
},
"8ccd4fa759a5": {
"name": "detailLoading",
"ordinal": 9,
"value": false
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"cfffc75a3055": {
"error": "",
"item": {
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
},
"items": [
{
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
},
"title": "A GitLab issue"
}
],
"loading": false,
"payload": {
"assignees": [],
"body": "body",
"comments": [],
"labels": ["bug"],
"pipelineJobs": [],
"provider": "gitlab"
}
},
"e9b468d599e5": {
"name": "gitlab.workItemDetails#1",
"ordinal": 4,
"args": [
{
"name": "method",
@@ -227,6 +56,224 @@
}
}
},
"16125975286b": {
"name": "detailLoading",
"ordinal": 3,
"value": false
},
"185dd46f0a38": {
"name": "detailLoading",
"ordinal": 8,
"value": true
},
"18a362320fb7": {
"name": "actionItem",
"ordinal": 11,
"value": {
"key": "gitlab:repo-1:issue:4",
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
}
},
"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"
}
},
"3d683d8ca027": {
"name": "detailPayload",
"ordinal": 13,
"value": {
"assignees": [],
"body": "body",
"comments": [],
"labels": ["bug"],
"pipelineJobs": [],
"provider": "gitlab"
}
},
"72c0fc81a418": {
"name": "detailPayload",
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"8ac545c58ec2": {
"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\"}}}"
},
"988fd3d6f1c4": {
"name": "detailRefreshSeq",
"ordinal": 5,
"value": 0
},
"9fa102187add": {
"error": "",
"item": {
"key": "gitlab:repo-1:issue:4",
"provider": "gitlab",
"source": {
"checksSummary": {
"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": {
"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": [],
"labels": ["bug"],
"pipelineJobs": [],
"provider": "gitlab"
}
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"d759afce345e": {
"name": "items",
"ordinal": 10,
"value": [
{
"key": "gitlab:repo-1:issue:4",
"provider": "gitlab",
"source": {
"checksSummary": {
"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"
}
]
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -242,20 +289,24 @@
{
"id": "mounted",
"observation": {
"sender": ["e9b468d599e5"],
"payloads": ["20dbc6200418"],
"sender": ["0b1aa38d91fe"],
"payloads": ["8ac545c58ec2"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "cfffc75a3055",
"state": "9fa102187add",
"effects": [
"33614c90b6eb",
"cc2ece9478f0",
"a4f1a8696a24",
"264010756b38",
"6a8913577681",
"012013790766",
"612bc240a5da",
"8ccd4fa759a5"
"16125975286b",
"72c0fc81a418",
"988fd3d6f1c4",
"274b8ecb4f73",
"185dd46f0a38",
"d759afce345e",
"18a362320fb7",
"20f8d00e8abe",
"3d683d8ca027"
]
}
}
@@ -4,153 +4,10 @@
"family": "tasks.item-detail-linear",
"namedDeltas": [],
"values": {
"1eaad537f925": {
"name": "linear.getIssue#1",
"ordinal": 6,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.getIssue\",\"params\":{\"id\":\"issue-1\",\"workspaceId\":\"linear-workspace\"}}"
},
"264010756b38": {
"name": "detailLoading",
"ordinal": 3,
"value": true
},
"33614c90b6eb": {
"name": "detailPayload",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"54cb880016c0": {
"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": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": [
{
"body": "a comment",
"createdAt": "2020-01-01T00:00:00.000Z",
"id": "comment-1",
"user": {
"displayName": "Octo"
}
}
]
}
}
},
"7d8d46d494ff": {
"name": "linear.issueComments#1",
"ordinal": 7,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.issueComments\",\"params\":{\"issueId\":\"issue-1\",\"workspaceId\":\"linear-workspace\"}}"
},
"8dfd0fa77324": {
"name": "detailPayload",
"ordinal": 8,
"value": {
"assignee": {
"$rpc": "undefined"
},
"children": [],
"comments": [
{
"body": "a comment",
"createdAt": "2020-01-01T00:00:00.000Z",
"id": "comment-1",
"user": {
"displayName": "Octo"
}
}
],
"description": "a description",
"labels": [],
"project": {
"$rpc": "undefined"
},
"provider": "linear"
}
},
"a2ca64ce452f": {
"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": {
"id": "frame-1",
"ok": true,
"result": {
"description": "a description",
"id": "issue-2",
"identifier": "ENG-2",
"labels": [],
"priority": 0,
"state": {
"color": "#000",
"name": "Todo",
"type": "unstarted"
},
"subIssues": [],
"team": {
"id": "team-1",
"key": "ENG",
"name": "Engineering"
},
"title": "A sub-issue",
"updatedAt": "2020-01-01T00:00:00.000Z",
"url": "",
"workspaceId": "linear-workspace"
}
}
}
},
"a2e20872c3f2": {
"15e1aea28b53": {
"error": "",
"item": {
"key": "linear:linear-workspace:issue-1",
"provider": "linear",
"source": {
"description": "",
@@ -182,6 +39,7 @@
},
"items": [
{
"key": "linear:linear-workspace:issue-1",
"provider": "linear",
"source": {
"description": "",
@@ -236,28 +94,80 @@
"provider": "linear"
}
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"a7fb6d964b37": {
"16125975286b": {
"name": "detailLoading",
"ordinal": 10,
"ordinal": 3,
"value": false
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
"20f8d00e8abe": {
"name": "detailLoading",
"ordinal": 12,
"value": false
},
"2bd0692fa5f7": {
"name": "linear.getIssue#1",
"ordinal": 10,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.getIssue\",\"params\":{\"id\":\"issue-1\",\"workspaceId\":\"linear-workspace\"}}"
},
"36f9b9dfbc87": {
"name": "linear.getIssue#1",
"ordinal": 7,
"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": {
"id": "frame-1",
"ok": true,
"result": {
"description": "a description",
"id": "issue-1",
"identifier": "ENG-1",
"labels": [],
"priority": 0,
"state": {
"color": "#000",
"name": "Todo",
"type": "unstarted"
},
"subIssues": [],
"team": {
"id": "team-1",
"key": "ENG",
"name": "Engineering"
},
"title": "A Linear issue",
"updatedAt": "2020-01-01T00:00:00.000Z",
"url": "",
"workspaceId": "linear-workspace"
}
}
}
},
"ffc9ef3e7044": {
"54d7c7cacff6": {
"name": "actionItem",
"ordinal": 9,
"ordinal": 6,
"value": {
"key": "linear:linear-workspace:issue-1",
"provider": "linear",
"source": {
"description": "",
@@ -287,6 +197,116 @@
},
"title": "A Linear issue"
}
},
"72c0fc81a418": {
"name": "detailPayload",
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"7b19e846a6d0": {
"name": "linear.issueComments#1",
"ordinal": 11,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.issueComments\",\"params\":{\"issueId\":\"issue-1\",\"workspaceId\":\"linear-workspace\"}}"
},
"833d6b4e5d8e": {
"name": "detailPayload",
"ordinal": 13,
"value": {
"assignee": {
"$rpc": "undefined"
},
"children": [],
"comments": [
{
"body": "a comment",
"createdAt": "2020-01-01T00:00:00.000Z",
"id": "comment-1",
"user": {
"displayName": "Octo"
}
}
],
"description": "a description",
"labels": [],
"project": {
"$rpc": "undefined"
},
"provider": "linear"
}
},
"85395348970f": {
"name": "linear.issueComments#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "linear.issueComments"
},
{
"name": "params",
"value": {
"issueId": "issue-1",
"workspaceId": "linear-workspace"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": [
{
"body": "a comment",
"createdAt": "2020-01-01T00:00:00.000Z",
"id": "comment-1",
"user": {
"displayName": "Octo"
}
}
]
}
}
},
"988fd3d6f1c4": {
"name": "detailRefreshSeq",
"ordinal": 5,
"value": 0
},
"a4f1a8696a24": {
"name": "detailError",
"ordinal": 2,
"value": ""
},
"c41a28a9097d": {
"name": "detailLoading",
"ordinal": 9,
"value": true
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
}
},
"recording": {
@@ -295,19 +315,22 @@
{
"id": "mounted",
"observation": {
"sender": ["a2ca64ce452f", "54cb880016c0"],
"payloads": ["1eaad537f925", "7d8d46d494ff"],
"sender": ["36f9b9dfbc87", "85395348970f"],
"payloads": ["2bd0692fa5f7", "7b19e846a6d0"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "a2e20872c3f2",
"state": "15e1aea28b53",
"effects": [
"33614c90b6eb",
"cc2ece9478f0",
"a4f1a8696a24",
"264010756b38",
"8dfd0fa77324",
"ffc9ef3e7044",
"a7fb6d964b37"
"16125975286b",
"72c0fc81a418",
"988fd3d6f1c4",
"54d7c7cacff6",
"c41a28a9097d",
"20f8d00e8abe",
"833d6b4e5d8e"
]
}
}
@@ -4,162 +4,84 @@
"family": "tasks.item-detail-metadata",
"namedDeltas": [],
"values": {
"187a6bd82efe": {
"labels": ["bug", "chore"],
"labelsError": "",
"labelsLoading": false,
"users": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
],
"usersError": "",
"usersLoading": false
},
"215de61d1fbb": {
"name": "itemAssignableUsersLoading",
"ordinal": 15,
"value": false
},
"3356ec8253b4": {
"1ae1dc53b706": {
"name": "itemBodyDraft",
"ordinal": 1,
"ordinal": 13,
"value": "body"
},
"3b4a3643a78c": {
"name": "github.listAssignableUsers#1",
"ordinal": 11,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.listAssignableUsers\",\"params\":{\"repo\":\"id:repo-1\"}}"
"4c5fe26e1c97": {
"name": "itemLabelsError",
"ordinal": 8,
"value": ""
},
"3c0f8d43db2e": {
"name": "itemLabelsLoading",
"ordinal": 13,
"5c50471cdd48": {
"name": "mutatingStatus",
"ordinal": 10,
"value": false
},
"3edb9333eaaf": {
"name": "itemAssignableUsers",
"7a1299e1e3ac": {
"name": "itemLabelsLoading",
"ordinal": 9,
"value": false
},
"9c483a675f4b": {
"name": "itemAvailableLabels",
"ordinal": 6,
"value": []
},
"4f0b27d85f31": {
"name": "github.listAssignableUsers#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "github.listAssignableUsers"
},
{
"name": "params",
"value": {
"repo": "id:repo-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"ok": true,
"result": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
]
}
"a0ec6c8c4548": {
"labels": [],
"labelsError": "",
"labelsLoading": false,
"users": [],
"usersError": "",
"usersLoading": false
},
"bcd7aec5dd24": {
"name": "itemAssignableUsersError",
"ordinal": 4,
"value": ""
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"90483b517d86": {
"name": "itemAssignableUsers",
"ordinal": 14,
"value": [
{
"avatarUrl": {
"$rpc": "null"
},
"login": "octocat",
"name": "Octo"
}
]
"d191f868fc7a": {
"name": "itemAssignableUsersLoading",
"ordinal": 5,
"value": false
},
"99b2357770d0": {
"name": "itemAssignableUsersError",
"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": ""
},
"9a8e65d1e38f": {
"name": "github.listLabels#1",
"ordinal": 10,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listLabels\",\"params\":{\"repo\":\"id:repo-1\"}}"
},
"a49372405361": {
"name": "itemAssignableUsersLoading",
"ordinal": 8,
"value": true
},
"ae373967e842": {
"name": "itemLabelsLoading",
"ordinal": 4,
"value": true
},
"cd0e3d61ff7d": {
"name": "github.listLabels#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "github.listLabels"
},
{
"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": ["bug", "chore"]
}
}
},
"e11f2dac1b42": {
"name": "itemLabelsError",
"ordinal": 3,
"value": ""
},
"e8ff540f77f3": {
"name": "itemAvailableLabels",
"ordinal": 2,
"value": []
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -168,10 +90,62 @@
"$rpc": "undefined"
}
},
"fbaca9693f87": {
"name": "itemAvailableLabels",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": {
"$rpc": "null"
}
},
"f5d301978157": {
"name": "detailPayload",
"ordinal": 12,
"value": ["bug", "chore"]
"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": {
@@ -180,24 +154,26 @@
{
"id": "mounted",
"observation": {
"sender": ["cd0e3d61ff7d", "4f0b27d85f31"],
"payloads": ["9a8e65d1e38f", "3b4a3643a78c"],
"sender": [],
"payloads": [],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "187a6bd82efe",
"state": "a0ec6c8c4548",
"effects": [
"3356ec8253b4",
"e8ff540f77f3",
"e11f2dac1b42",
"ae373967e842",
"3edb9333eaaf",
"99b2357770d0",
"a49372405361",
"fbaca9693f87",
"3c0f8d43db2e",
"90483b517d86",
"215de61d1fbb"
"cc2ece9478f0",
"eda130337c99",
"df267b378e62",
"bcd7aec5dd24",
"d191f868fc7a",
"9c483a675f4b",
"e416a2404225",
"4c5fe26e1c97",
"7a1299e1e3ac",
"5c50471cdd48",
"dc200050b5f4",
"f5d301978157",
"1ae1dc53b706"
]
}
}
@@ -4,9 +4,38 @@
"family": "tasks.item-merge-gitlab",
"namedDeltas": [],
"values": {
"3272022b3a4e": {
"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": 3,
"ordinal": 9,
"args": [
{
"name": "method",
@@ -44,12 +73,10 @@
}
}
},
"3ea7248d382b": {
"name": "actionItem",
"ordinal": 5,
"value": {
"$rpc": "null"
}
"42be1ca2bc40": {
"name": "mutatingStatus",
"ordinal": 4,
"value": false
},
"589373883844": {
"error": "",
@@ -91,10 +118,50 @@
"provider": "gitlab"
}
},
"af6d48e640c6": {
"name": "gitlab.mergeMR#1",
"ordinal": 4,
"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\"}}}"
"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",
@@ -104,20 +171,24 @@
"$rpc": "undefined"
}
},
"ecf9003e4ef1": {
"name": "mutatingStatus",
"ordinal": 6,
"value": false
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
"value": {
"$rpc": "null"
}
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"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": {
@@ -126,14 +197,26 @@
{
"id": "merge-settled",
"observation": {
"sender": ["3272022b3a4e"],
"payloads": ["af6d48e640c6"],
"sender": ["40b5b543334f"],
"payloads": ["f7191833ef4f"],
"settlements": {
"mount": "eb79a9b3682a",
"merge-0": "eb79a9b3682a"
},
"state": "589373883844",
"effects": ["fd2fad47bec2", "ed3a7d6bc894", "3ea7248d382b", "ecf9003e4ef1"]
"effects": [
"cc2ece9478f0",
"eda130337c99",
"aa01ca6020fb",
"42be1ca2bc40",
"a45f1237e928",
"3c854b38217d",
"81282764182b",
"104bf14d3af8",
"11b6302399f9",
"fbf2ffe3d253",
"e0a9defd9b13"
]
}
}
]
@@ -4,9 +4,9 @@
"family": "tasks.item-metadata-github",
"namedDeltas": [],
"values": {
"4227d4e27287": {
"091fa60820e6": {
"name": "github.updatePR#1",
"ordinal": 3,
"ordinal": 11,
"args": [
{
"name": "method",
@@ -16,6 +16,11 @@
"name": "params",
"value": {
"prNumber": 12,
"prRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repo": "id:repo-1",
"updates": {
"body": "new body",
@@ -43,90 +48,19 @@
}
}
},
"82bce4c83103": {
"name": "github.updatePR#1",
"ordinal": 4,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.updatePR\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"updates\":{\"title\":\"Renamed\",\"body\":\"new body\"}}}"
},
"9b243259db75": {
"14949c71727e": {
"name": "mutatingStatus",
"ordinal": 8,
"ordinal": 7,
"value": false
},
"bcd901c23e88": {
"name": "actionItem",
"ordinal": 5,
"value": {
"provider": "github",
"source": {
"id": "github:pr:12",
"labels": ["bug"],
"latestReviews": [],
"number": 12,
"repoId": "repo-1",
"reviewDecision": {
"$rpc": "null"
},
"reviewRequests": [],
"state": "open",
"title": "Renamed",
"type": "pr"
},
"title": "Renamed"
}
"3aefb3006914": {
"name": "error",
"ordinal": 10,
"value": ""
},
"c5829ecafc57": {
"name": "detailPayload",
"ordinal": 7,
"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": []
}
},
"ca02c3ae6243": {
"534352bbf363": {
"name": "items",
"ordinal": 6,
"ordinal": 14,
"value": [
{
"provider": "github",
@@ -135,6 +69,11 @@
"labels": ["bug"],
"latestReviews": [],
"number": 12,
"prRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repoId": "repo-1",
"reviewDecision": {
"$rpc": "null"
@@ -142,13 +81,19 @@
"reviewRequests": [],
"state": "open",
"title": "Renamed",
"type": "pr"
"type": "pr",
"url": "https://github.com/owner/repo/pull/12"
},
"title": "Renamed"
}
]
},
"e3fcde8cdbfe": {
"62e92e71cb1f": {
"name": "mutatingStatus",
"ordinal": 17,
"value": false
},
"67c9daa7195e": {
"error": "",
"item": {
"provider": "github",
@@ -157,6 +102,11 @@
"labels": ["bug"],
"latestReviews": [],
"number": 12,
"prRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repoId": "repo-1",
"reviewDecision": {
"$rpc": "null"
@@ -164,7 +114,8 @@
"reviewRequests": [],
"state": "open",
"title": "Renamed",
"type": "pr"
"type": "pr",
"url": "https://github.com/owner/repo/pull/12"
},
"title": "Renamed"
},
@@ -176,6 +127,11 @@
"labels": ["bug"],
"latestReviews": [],
"number": 12,
"prRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repoId": "repo-1",
"reviewDecision": {
"$rpc": "null"
@@ -183,7 +139,8 @@
"reviewRequests": [],
"state": "open",
"title": "Renamed",
"type": "pr"
"type": "pr",
"url": "https://github.com/owner/repo/pull/12"
},
"title": "Renamed"
}
@@ -232,7 +189,200 @@
"reviewDecision": {
"$rpc": "null"
},
"reviewRequests": []
"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": {
@@ -243,15 +393,12 @@
"$rpc": "undefined"
}
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -260,20 +407,29 @@
{
"id": "update-pr-settled",
"observation": {
"sender": ["4227d4e27287"],
"payloads": ["82bce4c83103"],
"sender": ["091fa60820e6"],
"payloads": ["b701ca439037"],
"settlements": {
"mount": "eb79a9b3682a",
"update-pr-0": "eb79a9b3682a"
},
"state": "e3fcde8cdbfe",
"state": "67c9daa7195e",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"bcd901c23e88",
"ca02c3ae6243",
"c5829ecafc57",
"9b243259db75"
"cc2ece9478f0",
"eda130337c99",
"a80ee9a342f1",
"b93b4f6d74db",
"98fe08e442ec",
"c79fe0d83267",
"14949c71727e",
"cd8620080e8a",
"6b1d692015cd",
"3aefb3006914",
"886c60a7e62e",
"534352bbf363",
"8f2e59bf5214",
"96990f48ae85",
"62e92e71cb1f"
]
}
}
@@ -4,53 +4,28 @@
"family": "tasks.item-metadata-gitlab-mr",
"namedDeltas": [],
"values": {
"1baaae5c9ed0": {
"name": "gitlab.updateMR#1",
"ordinal": 3,
"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"
}
"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"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"ok": true
}
}
],
"labels": ["bug"],
"pipelineJobs": [],
"provider": "gitlab"
}
},
"266686bfdeec": {
@@ -108,35 +83,14 @@
"provider": "gitlab"
}
},
"2f03f52f6db7": {
"name": "actionItem",
"ordinal": 5,
"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"
}
},
"5c50471cdd48": {
"name": "mutatingStatus",
"3aefb3006914": {
"name": "error",
"ordinal": 10,
"value": false
"value": ""
},
"9e163f6ab338": {
"3af513ef8a7e": {
"name": "items",
"ordinal": 6,
"ordinal": 14,
"value": [
{
"provider": "gitlab",
@@ -157,14 +111,45 @@
}
]
},
"b4055ff60394": {
"name": "itemAddLabelsDraft",
"ordinal": 8,
"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": ""
},
"d6b74d32804d": {
"9e46e6e7c627": {
"name": "detailPayload",
"ordinal": 7,
"ordinal": 16,
"value": {
"assignees": [],
"body": "body",
@@ -181,9 +166,100 @@
"provider": "gitlab"
}
},
"db0f3547ca00": {
"name": "gitlab.updateMR#1",
"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": {
@@ -194,20 +270,12 @@
"$rpc": "undefined"
}
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
},
"f11c308f1979": {
"name": "itemRemoveLabelsDraft",
"ordinal": 9,
"value": ""
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -216,22 +284,29 @@
{
"id": "update-gitlab-settled",
"observation": {
"sender": ["1baaae5c9ed0"],
"payloads": ["db0f3547ca00"],
"sender": ["c41542d48b3c"],
"payloads": ["daa0db125085"],
"settlements": {
"mount": "eb79a9b3682a",
"update-gitlab-0": "eb79a9b3682a"
},
"state": "266686bfdeec",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"2f03f52f6db7",
"9e163f6ab338",
"d6b74d32804d",
"b4055ff60394",
"f11c308f1979",
"5c50471cdd48"
"cc2ece9478f0",
"eda130337c99",
"a80ee9a342f1",
"b93b4f6d74db",
"98fe08e442ec",
"c79fe0d83267",
"14949c71727e",
"a4c82b4992bd",
"23ede8191c86",
"3aefb3006914",
"886c60a7e62e",
"3af513ef8a7e",
"806d212f3150",
"9e46e6e7c627",
"62e92e71cb1f"
]
}
}
@@ -4,6 +4,11 @@
"family": "tasks.item-metadata-gitlab",
"namedDeltas": [],
"values": {
"14949c71727e": {
"name": "mutatingStatus",
"ordinal": 7,
"value": false
},
"1607ea6e021e": {
"error": "",
"item": {
@@ -59,14 +64,59 @@
"provider": "gitlab"
}
},
"2edac82b3b9a": {
"name": "itemRemoveAssigneesDraft",
"ordinal": 11,
"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"
}
},
"240ae11e401e": {
"name": "gitlab.updateIssue#1",
"ordinal": 13,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.updateIssue\",\"params\":{\"repo\":\"id:repo-1\",\"number\":4,\"updates\":{\"title\":\"Renamed\",\"addLabels\":[\"triage\"]},\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}"
},
"3aefb3006914": {
"name": "error",
"ordinal": 10,
"value": ""
},
"6d09f297c6ee": {
"43bb0a08255a": {
"name": "actionItem",
"ordinal": 15,
"value": {
"provider": "gitlab",
"source": {
"id": "gitlab:issue:4",
"labels": ["bug", "triage"],
"number": 4,
"projectRef": {
"host": "gitlab.com",
"path": "group/project"
},
"repoId": "repo-1",
"state": "opened",
"title": "Renamed",
"type": "issue"
},
"title": "Renamed"
}
},
"515a0a9e6a73": {
"name": "gitlab.updateIssue#1",
"ordinal": 3,
"ordinal": 11,
"args": [
{
"name": "method",
@@ -107,69 +157,19 @@
}
}
},
"9de8a1be3f13": {
"62e92e71cb1f": {
"name": "mutatingStatus",
"ordinal": 12,
"ordinal": 17,
"value": false
},
"b4055ff60394": {
"name": "itemAddLabelsDraft",
"ordinal": 8,
"value": ""
"886c60a7e62e": {
"name": "mutatingStatus",
"ordinal": 12,
"value": true
},
"c217dd32a83b": {
"name": "gitlab.updateIssue#1",
"ordinal": 4,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.updateIssue\",\"params\":{\"repo\":\"id:repo-1\",\"number\":4,\"updates\":{\"title\":\"Renamed\",\"addLabels\":[\"triage\"]},\"projectRef\":{\"host\":\"gitlab.com\",\"path\":\"group/project\"}}}"
},
"c43f4fb1b61f": {
"name": "actionItem",
"ordinal": 5,
"value": {
"provider": "gitlab",
"source": {
"id": "gitlab:issue:4",
"labels": ["bug", "triage"],
"number": 4,
"projectRef": {
"host": "gitlab.com",
"path": "group/project"
},
"repoId": "repo-1",
"state": "opened",
"title": "Renamed",
"type": "issue"
},
"title": "Renamed"
}
},
"cbedc96ba8c3": {
"name": "itemAddAssigneesDraft",
"ordinal": 10,
"value": ""
},
"d6b74d32804d": {
"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", "triage"],
"pipelineJobs": [],
"provider": "gitlab"
}
},
"e2912ad4d0f1": {
"8a6982070d5f": {
"name": "items",
"ordinal": 6,
"ordinal": 14,
"value": [
{
"provider": "gitlab",
@@ -190,6 +190,72 @@
}
]
},
"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"
}
},
"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": ""
},
"c79fe0d83267": {
"name": "itemRemoveLabelsDraft",
"ordinal": 6,
"value": ""
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -198,20 +264,12 @@
"$rpc": "undefined"
}
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
},
"f11c308f1979": {
"name": "itemRemoveLabelsDraft",
"ordinal": 9,
"value": ""
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -220,24 +278,29 @@
{
"id": "update-gitlab-settled",
"observation": {
"sender": ["6d09f297c6ee"],
"payloads": ["c217dd32a83b"],
"sender": ["515a0a9e6a73"],
"payloads": ["240ae11e401e"],
"settlements": {
"mount": "eb79a9b3682a",
"update-gitlab-0": "eb79a9b3682a"
},
"state": "1607ea6e021e",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"c43f4fb1b61f",
"e2912ad4d0f1",
"d6b74d32804d",
"b4055ff60394",
"f11c308f1979",
"cbedc96ba8c3",
"2edac82b3b9a",
"9de8a1be3f13"
"cc2ece9478f0",
"eda130337c99",
"a80ee9a342f1",
"b93b4f6d74db",
"98fe08e442ec",
"c79fe0d83267",
"14949c71727e",
"b26dc20548a8",
"23ede8191c86",
"3aefb3006914",
"886c60a7e62e",
"8a6982070d5f",
"43bb0a08255a",
"9e46e6e7c627",
"62e92e71cb1f"
]
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -4,13 +4,45 @@
"family": "tasks.item-status-gitlab-mr",
"namedDeltas": [],
"values": {
"3ea7248d382b": {
"name": "actionItem",
"ordinal": 5,
"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": {
"$rpc": "null"
"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": {
@@ -51,14 +83,9 @@
"provider": "gitlab"
}
},
"7c485a70bc3e": {
"6f52cc0afcf0": {
"name": "gitlab.updateMRState#1",
"ordinal": 4,
"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\"}}}"
},
"ab2e27397394": {
"name": "gitlab.updateMRState#1",
"ordinal": 3,
"ordinal": 11,
"args": [
{
"name": "method",
@@ -96,6 +123,65 @@
}
}
},
"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,
@@ -104,20 +190,12 @@
"$rpc": "undefined"
}
},
"ecf9003e4ef1": {
"name": "mutatingStatus",
"ordinal": 6,
"value": false
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -126,14 +204,28 @@
{
"id": "gitlab-status-settled",
"observation": {
"sender": ["ab2e27397394"],
"payloads": ["7c485a70bc3e"],
"sender": ["6f52cc0afcf0"],
"payloads": ["1586a62c0b50"],
"settlements": {
"mount": "eb79a9b3682a",
"gitlab-status-0": "eb79a9b3682a"
},
"state": "589373883844",
"effects": ["fd2fad47bec2", "ed3a7d6bc894", "3ea7248d382b", "ecf9003e4ef1"]
"effects": [
"cc2ece9478f0",
"eda130337c99",
"a80ee9a342f1",
"b93b4f6d74db",
"98fe08e442ec",
"c79fe0d83267",
"14949c71727e",
"a4c82b4992bd",
"23ede8191c86",
"3aefb3006914",
"886c60a7e62e",
"91e56b4fbd5b",
"5737a7806a0c"
]
}
}
]
@@ -4,11 +4,6 @@
"family": "tasks.item-status-gitlab",
"namedDeltas": [],
"values": {
"04df4241c3b7": {
"name": "mutatingStatus",
"ordinal": 7,
"value": true
},
"05df5d49a11c": {
"error": "",
"item": {
@@ -49,26 +44,207 @@
"provider": "gitlab"
}
},
"104bf14d3af8": {
"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": 8,
"ordinal": 10,
"value": ""
},
"20cf2c45839d": {
"name": "github.updateIssue#1",
"ordinal": 10,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.updateIssue\",\"params\":{\"repo\":\"id:repo-1\",\"number\":9,\"updates\":{\"title\":\"Renamed\",\"addLabels\":[\"triage\"],\"removeLabels\":[\"bug\"]}}}"
"5737a7806a0c": {
"name": "mutatingStatus",
"ordinal": 15,
"value": false
},
"20d4f63859b9": {
"5a062aaf1adc": {
"name": "actionItem",
"ordinal": 11,
"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"
}
},
"2452bd6b82d1": {
"98fe08e442ec": {
"name": "itemRemoveAssigneesDraft",
"ordinal": 5,
"value": ""
},
"99e035739729": {
"name": "gitlab.updateIssue#1",
"ordinal": 3,
"ordinal": 11,
"args": [
{
"name": "method",
@@ -108,105 +284,63 @@
}
}
},
"31052c726682": {
"name": "itemRemoveLabelsDraft",
"ordinal": 15,
"value": ""
},
"3ea7248d382b": {
"name": "actionItem",
"ordinal": 5,
"value": {
"$rpc": "null"
}
},
"4521fe8a79e3": {
"name": "detailPayload",
"ordinal": 13,
"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"
}
},
"49e6ea49243a": {
"name": "itemAddLabelsDraft",
"ordinal": 14,
"value": ""
},
"6463243364b2": {
"name": "items",
"ordinal": 12,
"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"
}
]
},
"7c9ae1d5d0a9": {
"name": "gitlab.updateIssue#1",
"ordinal": 4,
"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\"}}}"
},
"832217477701": {
"name": "itemRemoveAssigneesDraft",
"ordinal": 17,
"value": ""
},
"a17cf032d1cb": {
"name": "mutatingStatus",
"ordinal": 18,
"value": false
},
"d9f85a74992e": {
"name": "itemAddAssigneesDraft",
"9d1f08a6e600": {
"name": "error",
"ordinal": 16,
"value": ""
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
},
"ecf9003e4ef1": {
"name": "mutatingStatus",
"ordinal": 6,
"value": false
},
"ed3a7d6bc894": {
"name": "error",
"ordinal": 2,
"a80ee9a342f1": {
"name": "itemAddAssigneesDraft",
"ordinal": 3,
"value": ""
},
"fa0f8ddcd40a": {
"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": 9,
"ordinal": 21,
"args": [
{
"name": "method",
@@ -216,6 +350,11 @@
"name": "params",
"value": {
"number": 9,
"ownerRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
},
"repo": "id:repo-1",
"updates": {
"addLabels": ["triage"],
@@ -227,6 +366,14 @@
{
"name": "options",
"value": {
"beforeSend": "[local beforeSend]",
"envelope": {
"expectedRuntimeSource": {
"runtimeId": "recorded",
"sourceId": "recorded"
}
},
"failWhenDisconnected": true,
"timeoutMs": 30000
}
}
@@ -236,7 +383,7 @@
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-2",
"id": "frame-3",
"ok": true,
"result": {
"ok": true
@@ -244,9 +391,41 @@
}
}
},
"fd2fad47bec2": {
"name": "mutatingStatus",
"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
}
},
@@ -256,42 +435,61 @@
{
"id": "gitlab-status-settled",
"observation": {
"sender": ["2452bd6b82d1"],
"payloads": ["7c9ae1d5d0a9"],
"sender": ["99e035739729"],
"payloads": ["66a7662321ab"],
"settlements": {
"mount": "eb79a9b3682a",
"gitlab-status-0": "eb79a9b3682a"
},
"state": "05df5d49a11c",
"effects": ["fd2fad47bec2", "ed3a7d6bc894", "3ea7248d382b", "ecf9003e4ef1"]
"effects": [
"cc2ece9478f0",
"eda130337c99",
"a80ee9a342f1",
"b93b4f6d74db",
"98fe08e442ec",
"c79fe0d83267",
"14949c71727e",
"b26dc20548a8",
"23ede8191c86",
"3aefb3006914",
"886c60a7e62e",
"91e56b4fbd5b",
"5737a7806a0c"
]
}
},
{
"id": "github-metadata-settled",
"observation": {
"sender": ["2452bd6b82d1", "fa0f8ddcd40a"],
"payloads": ["7c9ae1d5d0a9", "20cf2c45839d"],
"sender": ["99e035739729", "87cd6a741359", "c5b803a7c562"],
"payloads": ["66a7662321ab", "e0bebf1cd037", "5d27fa679339"],
"settlements": {
"mount": "eb79a9b3682a",
"gitlab-status-0": "eb79a9b3682a",
"github-metadata-1": "eb79a9b3682a"
},
"state": "05df5d49a11c",
"state": "1d07085d77f7",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"3ea7248d382b",
"ecf9003e4ef1",
"04df4241c3b7",
"104bf14d3af8",
"20d4f63859b9",
"6463243364b2",
"4521fe8a79e3",
"49e6ea49243a",
"31052c726682",
"d9f85a74992e",
"832217477701",
"a17cf032d1cb"
"cc2ece9478f0",
"eda130337c99",
"a80ee9a342f1",
"b93b4f6d74db",
"98fe08e442ec",
"c79fe0d83267",
"14949c71727e",
"b26dc20548a8",
"23ede8191c86",
"3aefb3006914",
"886c60a7e62e",
"91e56b4fbd5b",
"5737a7806a0c",
"9d1f08a6e600",
"5a062aaf1adc",
"f3640f6ae8be",
"69c27ef617a1",
"c2fc779dad42",
"38e625888db0"
]
}
}
+282 -181
View File
@@ -4,14 +4,117 @@
"family": "tasks.linear-item",
"namedDeltas": [],
"values": {
"04f53bdc9dca": {
"name": "mutatingStatus",
"029bb83f402f": {
"name": "error",
"ordinal": 21,
"value": ""
},
"039c2b59e061": {
"name": "linear.createIssue#1",
"ordinal": 22,
"args": [
{
"name": "method",
"value": "linear.createIssue"
},
{
"name": "params",
"value": {
"parentIssueId": "issue-1",
"projectId": {
"$rpc": "null"
},
"teamId": "team-1",
"title": "A sub-issue",
"workspaceId": "linear-workspace"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"id": "issue-3",
"identifier": "ENG-3",
"ok": true,
"title": "A sub-issue",
"url": ""
}
}
}
},
"104bf14d3af8": {
"name": "error",
"ordinal": 8,
"value": ""
},
"11b6302399f9": {
"name": "mutatingStatus",
"ordinal": 10,
"value": true
},
"11da347c285d": {
"name": "detailPayload",
"29cadc65bcbb": {
"name": "error",
"ordinal": 15,
"value": ""
},
"3abc893d377b": {
"name": "mutatingStatus",
"ordinal": 3,
"value": false
},
"3accbb2a4fcb": {
"name": "mutatingStatus",
"ordinal": 20,
"value": false
},
"3b3ee1b48010": {
"name": "actionItem",
"ordinal": 19,
"value": {
"key": "linear:linear-workspace:issue-2",
"provider": "linear",
"source": {
"description": "a description",
"id": "issue-2",
"identifier": "ENG-2",
"labels": [],
"priority": 0,
"state": {
"color": "#000",
"name": "Todo",
"type": "unstarted"
},
"subIssues": [],
"team": {
"id": "team-1",
"key": "ENG",
"name": "Engineering"
},
"title": "A sub-issue",
"updatedAt": "2020-01-01T00:00:00.000Z",
"url": "",
"workspaceId": "linear-workspace"
},
"status": "Todo",
"subtitle": "ENG-2 · Engineering",
"title": "A sub-issue",
"updatedAt": "2020-01-01T00:00:00.000Z"
}
},
"3f24b734fd8e": {
"name": "detailPayload",
"ordinal": 26,
"value": {
"assignee": {
"$rpc": "undefined"
@@ -42,25 +145,15 @@
"provider": "linear"
}
},
"14949c71727e": {
"3fcdcfa261ee": {
"name": "mutatingStatus",
"ordinal": 23,
"value": true
},
"44efd00fa69f": {
"name": "linearCommentDraft",
"ordinal": 7,
"value": false
},
"29cadc65bcbb": {
"name": "error",
"ordinal": 15,
"value": ""
},
"3accbb2a4fcb": {
"name": "mutatingStatus",
"ordinal": 20,
"value": false
},
"41b1d67e2d48": {
"name": "linearSubIssueTitle",
"ordinal": 18,
"value": ""
"value": "a linear comment"
},
"48107958be60": {
"error": "",
@@ -125,46 +218,14 @@
"provider": "linear"
}
},
"4c07ee77d270": {
"name": "linear.addIssueComment#1",
"ordinal": 3,
"args": [
{
"name": "method",
"value": "linear.addIssueComment"
},
{
"name": "params",
"value": {
"body": "a linear comment",
"issueId": "issue-1",
"workspaceId": "linear-workspace"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"id": "comment-9",
"ok": true
}
}
}
"4dd9211bea32": {
"name": "mutatingStatus",
"ordinal": 17,
"value": true
},
"55ef5154f27b": {
"5bb480ca469c": {
"name": "detailPayload",
"ordinal": 6,
"ordinal": 12,
"value": {
"assignee": {
"$rpc": "undefined"
@@ -188,6 +249,16 @@
"provider": "linear"
}
},
"760659bea59b": {
"name": "linear.addIssueComment#1",
"ordinal": 11,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.addIssueComment\",\"params\":{\"issueId\":\"issue-1\",\"workspaceId\":\"linear-workspace\",\"body\":\"a linear comment\"}}"
},
"7b614cf87045": {
"name": "linearSubIssueTitle",
"ordinal": 25,
"value": ""
},
"7c14fba8a1fe": {
"error": "",
"item": {
@@ -244,58 +315,19 @@
"provider": "linear"
}
},
"7fa172662b38": {
"88dbfd66d809": {
"name": "linear.createIssue#1",
"ordinal": 16,
"args": [
{
"name": "method",
"value": "linear.createIssue"
},
{
"name": "params",
"value": {
"parentIssueId": "issue-1",
"projectId": {
"$rpc": "null"
},
"teamId": "team-1",
"title": "A sub-issue",
"workspaceId": "linear-workspace"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"id": "issue-3",
"identifier": "ENG-3",
"ok": true,
"title": "A sub-issue",
"url": ""
}
}
}
},
"a3172021f067": {
"name": "linear.createIssue#1",
"ordinal": 17,
"ordinal": 24,
"json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.createIssue\",\"params\":{\"teamId\":\"team-1\",\"title\":\"A sub-issue\",\"workspaceId\":\"linear-workspace\",\"parentIssueId\":\"issue-1\",\"projectId\":null}}"
},
"b9efa9d17fe7": {
"8e34e506a7f8": {
"name": "linear.getIssue#1",
"ordinal": 10,
"ordinal": 18,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.getIssue\",\"params\":{\"id\":\"issue-2\",\"workspaceId\":\"linear-workspace\"}}"
},
"9c2ca99506b2": {
"name": "linear.getIssue#1",
"ordinal": 16,
"args": [
{
"name": "method",
@@ -347,35 +379,27 @@
}
}
},
"bced143b7f3d": {
"9dc1f136772e": {
"name": "linearCommentDraft",
"ordinal": 5,
"ordinal": 4,
"value": ""
},
"cc26835ea96d": {
"name": "mutatingStatus",
"ordinal": 14,
"value": true
},
"d5866a3b75ed": {
"name": "linear.getIssue#1",
"ordinal": 11,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.getIssue\",\"params\":{\"id\":\"issue-2\",\"workspaceId\":\"linear-workspace\"}}"
},
"dae567a6f8ac": {
"b1f0308d3795": {
"name": "actionItem",
"ordinal": 12,
"ordinal": 5,
"value": {
"key": "linear:linear-workspace:issue-2",
"provider": "linear",
"source": {
"description": "a description",
"id": "issue-2",
"identifier": "ENG-2",
"description": "",
"id": "issue-1",
"identifier": "ENG-1",
"labels": [],
"priority": 0,
"project": {
"$rpc": "null"
},
"state": {
"color": "#000",
"color": "#000000",
"name": "Todo",
"type": "unstarted"
},
@@ -383,17 +407,81 @@
"team": {
"id": "team-1",
"key": "ENG",
"name": "Engineering"
"name": "Engineering",
"workspaceId": "linear-workspace"
},
"title": "A sub-issue",
"updatedAt": "2020-01-01T00:00:00.000Z",
"url": "",
"workspaceId": "linear-workspace"
"workspaceId": "linear-workspace",
"workspaceName": "Workspace"
},
"status": "Todo",
"subtitle": "ENG-2 · Engineering",
"title": "A sub-issue",
"updatedAt": "2020-01-01T00:00:00.000Z"
"title": "A Linear issue"
}
},
"b8a8e13fff32": {
"name": "detailPayload",
"ordinal": 6,
"value": {
"assignee": {
"$rpc": "undefined"
},
"children": [],
"comments": [],
"description": "description",
"labels": [],
"project": {
"$rpc": "null"
},
"provider": "linear"
}
},
"bce8f337fd46": {
"name": "linearCommentDraft",
"ordinal": 14,
"value": ""
},
"c99df17a93d5": {
"name": "linear.addIssueComment#1",
"ordinal": 9,
"args": [
{
"name": "method",
"value": "linear.addIssueComment"
},
{
"name": "params",
"value": {
"body": "a linear comment",
"issueId": "issue-1",
"workspaceId": "linear-workspace"
}
},
{
"name": "options",
"value": {
"timeoutMs": 30000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"id": "comment-9",
"ok": true
}
}
}
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"dcb5a0348220": {
@@ -457,16 +545,6 @@
"ordinal": 13,
"value": false
},
"e24c62500e8a": {
"name": "linear.addIssueComment#1",
"ordinal": 4,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.addIssueComment\",\"params\":{\"issueId\":\"issue-1\",\"workspaceId\":\"linear-workspace\",\"body\":\"a linear comment\"}}"
},
"e492cb3deb38": {
"name": "error",
"ordinal": 9,
"value": ""
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -475,15 +553,17 @@
"$rpc": "undefined"
}
},
"ed3a7d6bc894": {
"name": "error",
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": ""
"value": {
"$rpc": "null"
}
},
"fd2fad47bec2": {
"fa2f2de4dfe7": {
"name": "mutatingStatus",
"ordinal": 1,
"value": true
"ordinal": 27,
"value": false
}
},
"recording": {
@@ -492,27 +572,34 @@
{
"id": "comment-settled",
"observation": {
"sender": ["4c07ee77d270"],
"payloads": ["e24c62500e8a"],
"sender": ["c99df17a93d5"],
"payloads": ["760659bea59b"],
"settlements": {
"mount": "eb79a9b3682a",
"comment-0": "eb79a9b3682a"
},
"state": "dcb5a0348220",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"bced143b7f3d",
"55ef5154f27b",
"14949c71727e"
"cc2ece9478f0",
"eda130337c99",
"3abc893d377b",
"9dc1f136772e",
"b1f0308d3795",
"b8a8e13fff32",
"44efd00fa69f",
"104bf14d3af8",
"11b6302399f9",
"5bb480ca469c",
"e0a9defd9b13",
"bce8f337fd46"
]
}
},
{
"id": "sub-issue-open-settled",
"observation": {
"sender": ["4c07ee77d270", "b9efa9d17fe7"],
"payloads": ["e24c62500e8a", "d5866a3b75ed"],
"sender": ["c99df17a93d5", "9c2ca99506b2"],
"payloads": ["760659bea59b", "8e34e506a7f8"],
"settlements": {
"mount": "eb79a9b3682a",
"comment-0": "eb79a9b3682a",
@@ -520,23 +607,30 @@
},
"state": "7c14fba8a1fe",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"bced143b7f3d",
"55ef5154f27b",
"14949c71727e",
"04f53bdc9dca",
"e492cb3deb38",
"dae567a6f8ac",
"e0a9defd9b13"
"cc2ece9478f0",
"eda130337c99",
"3abc893d377b",
"9dc1f136772e",
"b1f0308d3795",
"b8a8e13fff32",
"44efd00fa69f",
"104bf14d3af8",
"11b6302399f9",
"5bb480ca469c",
"e0a9defd9b13",
"bce8f337fd46",
"29cadc65bcbb",
"4dd9211bea32",
"3b3ee1b48010",
"3accbb2a4fcb"
]
}
},
{
"id": "sub-issue-create-settled",
"observation": {
"sender": ["4c07ee77d270", "b9efa9d17fe7", "7fa172662b38"],
"payloads": ["e24c62500e8a", "d5866a3b75ed", "a3172021f067"],
"sender": ["c99df17a93d5", "9c2ca99506b2", "039c2b59e061"],
"payloads": ["760659bea59b", "8e34e506a7f8", "88dbfd66d809"],
"settlements": {
"mount": "eb79a9b3682a",
"comment-0": "eb79a9b3682a",
@@ -545,20 +639,27 @@
},
"state": "48107958be60",
"effects": [
"fd2fad47bec2",
"ed3a7d6bc894",
"bced143b7f3d",
"55ef5154f27b",
"14949c71727e",
"04f53bdc9dca",
"e492cb3deb38",
"dae567a6f8ac",
"cc2ece9478f0",
"eda130337c99",
"3abc893d377b",
"9dc1f136772e",
"b1f0308d3795",
"b8a8e13fff32",
"44efd00fa69f",
"104bf14d3af8",
"11b6302399f9",
"5bb480ca469c",
"e0a9defd9b13",
"cc26835ea96d",
"bce8f337fd46",
"29cadc65bcbb",
"41b1d67e2d48",
"11da347c285d",
"3accbb2a4fcb"
"4dd9211bea32",
"3b3ee1b48010",
"3accbb2a4fcb",
"029bb83f402f",
"3fcdcfa261ee",
"7b614cf87045",
"3f24b734fd8e",
"fa2f2de4dfe7"
]
}
}
@@ -4,39 +4,108 @@
"family": "tasks.linear-team-context",
"namedDeltas": [],
"values": {
"045de1beb41b": {
"name": "prFileCommentDrafts",
"ordinal": 16,
"value": {}
"098b62bff4eb": {
"name": "linear.listTeams#1",
"ordinal": 9,
"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"
}
]
}
}
},
"0b7bf56895e2": {
"name": "linearStatesLoading",
"ordinal": 24,
"value": true
"0fe33250c709": {
"name": "linearCommentDraft",
"ordinal": 15,
"value": ""
},
"0e2affb510a1": {
"name": "linearStatesLoading",
"ordinal": 31,
"1dbe98fbb739": {
"name": "linearSubIssueTitle",
"ordinal": 6,
"value": ""
},
"1e69a1a7db08": {
"name": "linear.teamStates#1",
"ordinal": 18,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.teamStates\",\"params\":{\"teamId\":\"team-1\",\"workspaceId\":\"linear-workspace\"}}"
},
"22b3840f0657": {
"name": "linear.listTeams#1",
"ordinal": 10,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listTeams\"}"
},
"2afc4b1311c1": {
"createTeamId": "team-1",
"states": [],
"statesLoading": false,
"teams": [
{
"id": "team-1",
"key": "ENG",
"name": "Engineering",
"workspaceId": "linear-workspace"
}
]
},
"3abc893d377b": {
"name": "mutatingStatus",
"ordinal": 3,
"value": false
},
"1f713dfa6ceb": {
"name": "linearStatesError",
"ordinal": 25,
"value": ""
"57ca0f9b3746": {
"name": "linearStatesLoading",
"ordinal": 13,
"value": true
},
"2046fde1d46c": {
"name": "linearCommentDraft",
"ordinal": 26,
"value": ""
"69150d468b1d": {
"name": "linearTeams",
"ordinal": 11,
"value": [
{
"id": "team-1",
"key": "ENG",
"name": "Engineering",
"workspaceId": "linear-workspace"
}
]
},
"2388b2964070": {
"name": "linearCommentDraft",
"ordinal": 2,
"value": ""
"6a7e0f718508": {
"name": "linearStates",
"ordinal": 4,
"value": []
},
"26211ba14bbc": {
"6ed3c36afe66": {
"name": "linear.teamStates#1",
"ordinal": 28,
"ordinal": 17,
"args": [
{
"name": "method",
@@ -74,34 +143,9 @@
}
}
},
"269660c94afa": {
"name": "expandedPrFilePath",
"ordinal": 13,
"value": {
"$rpc": "null"
}
},
"2afc4b1311c1": {
"createTeamId": "team-1",
"states": [],
"statesLoading": false,
"teams": [
{
"id": "team-1",
"key": "ENG",
"name": "Engineering",
"workspaceId": "linear-workspace"
}
]
},
"2d7c523e8a27": {
"name": "itemCommentDraft",
"ordinal": 6,
"value": ""
},
"2db83018b217": {
"8a944cf153a8": {
"name": "linearStates",
"ordinal": 30,
"ordinal": 19,
"value": [
{
"color": "#000000",
@@ -111,57 +155,10 @@
}
]
},
"337ce7504f5b": {
"a467061ae4b3": {
"name": "createTeamId",
"ordinal": 23,
"value": "team-1"
},
"3e0c86d3ff78": {
"name": "prFileLoadingPath",
"ordinal": 15,
"value": {
"$rpc": "null"
}
},
"4b607e97a8f6": {
"name": "linearSubIssueTitle",
"ordinal": 27,
"value": ""
},
"4b830d961da2": {
"name": "itemReplyDrafts",
"ordinal": 12,
"value": {}
},
"542704953557": {
"name": "linear.listTeams#1",
"ordinal": 21,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listTeams\"}"
},
"58780d31c844": {
"name": "linearSubIssueTitle",
"ordinal": 3,
"value": ""
},
"70cbb5292625": {
"name": "linearStates",
"ordinal": 1,
"value": []
},
"715b8a858916": {
"name": "itemRemoveAssigneesDraft",
"ordinal": 10,
"value": ""
},
"96b613832e2d": {
"name": "expandedResolvedCommentGroups",
"ordinal": 17,
"value": []
},
"9ffa64bfd433": {
"name": "itemAddLabelsDraft",
"ordinal": 7,
"value": ""
"value": "team-1"
},
"b6bf81e9e237": {
"createTeamId": "team-1",
@@ -183,94 +180,33 @@
}
]
},
"c69b02881ede": {
"name": "createTeamId",
"ordinal": 19,
"bced143b7f3d": {
"name": "linearCommentDraft",
"ordinal": 5,
"value": ""
},
"bea513339811": {
"name": "linearStatesError",
"ordinal": 14,
"value": ""
},
"cc2ece9478f0": {
"name": "actionItem",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"c94e95b05aae": {
"name": "itemTitleDraft",
"ordinal": 4,
"e3df62f330c9": {
"name": "linearSubIssueTitle",
"ordinal": 16,
"value": ""
},
"d4e3e2ea2ca4": {
"name": "itemReviewersDraft",
"ordinal": 11,
"value": ""
},
"d79a27912054": {
"name": "itemRemoveLabelsDraft",
"ordinal": 8,
"value": ""
},
"ddf392ecde5d": {
"name": "linear.listTeams#1",
"ordinal": 20,
"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"
}
]
}
}
},
"e0fdfc89107a": {
"name": "itemBodyDraft",
"ordinal": 5,
"value": ""
},
"e986d1eb07e5": {
"e9a162defc32": {
"name": "creatingTask",
"ordinal": 18,
"ordinal": 7,
"value": false
},
"e9df19e2ad7e": {
"name": "linearTeams",
"ordinal": 22,
"value": [
{
"id": "team-1",
"key": "ENG",
"name": "Engineering",
"workspaceId": "linear-workspace"
}
]
},
"eabd45d970b7": {
"name": "prFileContents",
"ordinal": 14,
"value": {}
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -279,15 +215,24 @@
"$rpc": "undefined"
}
},
"ef99ee625bd8": {
"name": "itemAddAssigneesDraft",
"ordinal": 9,
"value": ""
"eda130337c99": {
"name": "detailPayload",
"ordinal": 2,
"value": {
"$rpc": "null"
}
},
"f86dec954117": {
"name": "linear.teamStates#1",
"ordinal": 29,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"linear.teamStates\",\"params\":{\"teamId\":\"team-1\",\"workspaceId\":\"linear-workspace\"}}"
"eea24500bdb9": {
"name": "linearStatesLoading",
"ordinal": 20,
"value": false
},
"fabd812eeef1": {
"name": "createTeamId",
"ordinal": 8,
"value": {
"$rpc": "null"
}
}
},
"recording": {
@@ -296,43 +241,32 @@
{
"id": "open-composer-settled",
"observation": {
"sender": ["ddf392ecde5d"],
"payloads": ["542704953557"],
"sender": ["098b62bff4eb"],
"payloads": ["22b3840f0657"],
"settlements": {
"mount": "eb79a9b3682a",
"open-composer-0": "eb79a9b3682a"
},
"state": "2afc4b1311c1",
"effects": [
"70cbb5292625",
"2388b2964070",
"58780d31c844",
"c94e95b05aae",
"e0fdfc89107a",
"2d7c523e8a27",
"9ffa64bfd433",
"d79a27912054",
"ef99ee625bd8",
"715b8a858916",
"d4e3e2ea2ca4",
"4b830d961da2",
"269660c94afa",
"eabd45d970b7",
"3e0c86d3ff78",
"045de1beb41b",
"96b613832e2d",
"e986d1eb07e5",
"c69b02881ede",
"e9df19e2ad7e",
"337ce7504f5b"
"cc2ece9478f0",
"eda130337c99",
"3abc893d377b",
"6a7e0f718508",
"bced143b7f3d",
"1dbe98fbb739",
"e9a162defc32",
"fabd812eeef1",
"69150d468b1d",
"a467061ae4b3"
]
}
},
{
"id": "select-metadata-item-settled",
"observation": {
"sender": ["ddf392ecde5d", "26211ba14bbc"],
"payloads": ["542704953557", "f86dec954117"],
"sender": ["098b62bff4eb", "6ed3c36afe66"],
"payloads": ["22b3840f0657", "1e69a1a7db08"],
"settlements": {
"mount": "eb79a9b3682a",
"open-composer-0": "eb79a9b3682a",
@@ -340,33 +274,22 @@
},
"state": "b6bf81e9e237",
"effects": [
"70cbb5292625",
"2388b2964070",
"58780d31c844",
"c94e95b05aae",
"e0fdfc89107a",
"2d7c523e8a27",
"9ffa64bfd433",
"d79a27912054",
"ef99ee625bd8",
"715b8a858916",
"d4e3e2ea2ca4",
"4b830d961da2",
"269660c94afa",
"eabd45d970b7",
"3e0c86d3ff78",
"045de1beb41b",
"96b613832e2d",
"e986d1eb07e5",
"c69b02881ede",
"e9df19e2ad7e",
"337ce7504f5b",
"0b7bf56895e2",
"1f713dfa6ceb",
"2046fde1d46c",
"4b607e97a8f6",
"2db83018b217",
"0e2affb510a1"
"cc2ece9478f0",
"eda130337c99",
"3abc893d377b",
"6a7e0f718508",
"bced143b7f3d",
"1dbe98fbb739",
"e9a162defc32",
"fabd812eeef1",
"69150d468b1d",
"a467061ae4b3",
"57ca0f9b3746",
"bea513339811",
"0fe33250c709",
"e3df62f330c9",
"8a944cf153a8",
"eea24500bdb9"
]
}
}
@@ -4,23 +4,11 @@
"family": "tasks.project-row-detail",
"namedDeltas": [],
"values": {
"0216abb9c43b": {
"name": "projectTitleDraft",
"ordinal": 1,
"value": {
"$rpc": "undefined"
}
},
"0679b27a119b": {
"name": "projectFieldDrafts",
"ordinal": 11,
"value": {}
},
"0ad63b01155a": {
"name": "prFileContents",
"ordinal": 8,
"value": {}
},
"118d9662d37f": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 16,
@@ -47,13 +35,6 @@
"reviewRequests": []
}
},
"2e6edf535ef3": {
"name": "prFileLoadingPath",
"ordinal": 9,
"value": {
"$rpc": "null"
}
},
"2ee1c7329449": {
"name": "projectRowDetail",
"ordinal": 12,
@@ -61,9 +42,31 @@
"$rpc": "null"
}
},
"4ad8bb2f6308": {
"name": "projectReviewersDraft",
"31fcc93f02da": {
"name": "projectEditingCommentDraft",
"ordinal": 9,
"value": ""
},
"368311fc2981": {
"name": "projectCommentDraft",
"ordinal": 7,
"value": ""
},
"3a42a92c5487": {
"name": "projectBodyDraft",
"ordinal": 6,
"value": "Project issue body"
},
"3b9902cb94f1": {
"name": "expandedPrFilePath",
"ordinal": 1,
"value": {
"$rpc": "null"
}
},
"4f23116da7f6": {
"name": "projectReviewersDraft",
"ordinal": 10,
"value": ""
},
"561861a537bb": {
@@ -71,47 +74,24 @@
"ordinal": 18,
"value": false
},
"6545686833e4": {
"name": "expandedPrFilePath",
"ordinal": 7,
"value": {
"$rpc": "null"
}
},
"742985d99709": {
"name": "projectEditingCommentDraft",
"ordinal": 5,
"value": ""
},
"9f0108368fff": {
"name": "projectEditingCommentId",
"5cebe6c14680": {
"name": "prFileLoadingPath",
"ordinal": 4,
"value": {
"$rpc": "null"
}
},
"b2a01ad6d4fe": {
"detail": {
"assignees": [],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"labels": [],
"latestReviews": [],
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": {
"$rpc": "undefined"
},
"reviewRequests": []
},
"error": "",
"loading": false
"60012e7abb60": {
"name": "prFileCommentDrafts",
"ordinal": 2,
"value": {}
},
"b4e65ea8b72c": {
"7ca2bb47ab1c": {
"name": "prFileContents",
"ordinal": 3,
"value": {}
},
"899221be28d8": {
"name": "github.project.workItemDetailsBySlug#1",
"ordinal": 15,
"args": [
@@ -153,7 +133,17 @@
"files": [],
"headSha": "head-sha",
"item": {
"labels": []
"author": {
"$rpc": "null"
},
"id": "issue:1",
"labels": [],
"number": 1,
"state": "open",
"title": "Project issue",
"type": "issue",
"updatedAt": "2026-10-30T00:00:00Z",
"url": "https://github.enterprise.test/owner/repo/issues/1"
},
"pullRequestId": "PR_kwDO"
},
@@ -162,15 +152,43 @@
}
}
},
"9911dd53d1d7": {
"name": "projectTitleDraft",
"ordinal": 5,
"value": "Project issue"
},
"b2a01ad6d4fe": {
"detail": {
"assignees": [],
"baseSha": "base-sha",
"body": "body",
"checks": [],
"comments": [],
"files": [],
"headSha": "head-sha",
"labels": [],
"latestReviews": [],
"provider": "github",
"pullRequestId": "PR_kwDO",
"reviewDecision": {
"$rpc": "undefined"
},
"reviewRequests": []
},
"error": "",
"loading": false
},
"b63d5911050c": {
"name": "projectRowDetailError",
"ordinal": 13,
"value": ""
},
"da1a7926872e": {
"name": "projectBodyDraft",
"ordinal": 2,
"value": ""
"c0e2c37d8abf": {
"name": "projectEditingCommentId",
"ordinal": 8,
"value": {
"$rpc": "null"
}
},
"eb79a9b3682a": {
"status": "fulfilled",
@@ -180,20 +198,10 @@
"$rpc": "undefined"
}
},
"eec8081f6290": {
"name": "projectCommentDraft",
"ordinal": 3,
"value": ""
},
"f6a5085dd8e9": {
"name": "projectRowDetailLoading",
"ordinal": 14,
"value": true
},
"fdcd0ea3f000": {
"name": "prFileCommentDrafts",
"ordinal": 10,
"value": {}
}
},
"recording": {
@@ -202,23 +210,23 @@
{
"id": "mounted",
"observation": {
"sender": ["b4e65ea8b72c"],
"sender": ["899221be28d8"],
"payloads": ["118d9662d37f"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b2a01ad6d4fe",
"effects": [
"0216abb9c43b",
"da1a7926872e",
"eec8081f6290",
"9f0108368fff",
"742985d99709",
"4ad8bb2f6308",
"6545686833e4",
"0ad63b01155a",
"2e6edf535ef3",
"fdcd0ea3f000",
"3b9902cb94f1",
"60012e7abb60",
"7ca2bb47ab1c",
"5cebe6c14680",
"9911dd53d1d7",
"3a42a92c5487",
"368311fc2981",
"c0e2c37d8abf",
"31fcc93f02da",
"4f23116da7f6",
"0679b27a119b",
"2ee1c7329449",
"b63d5911050c",
File diff suppressed because it is too large Load Diff
+556 -54
View File
@@ -1058,7 +1058,7 @@
"displayName": "Emoji",
"repoIcon": {
"type": "emoji",
"emoji": "🐳"
"emoji": "\ud83d\udc33"
},
"connectionId": "ssh-1"
},
@@ -7897,7 +7897,7 @@
"ok": false,
"error": {
"code": "worktree_archive_hook_failed",
"message": "Archive hook failed for worktree: /repos/marlin/wt-1 — exited 1.",
"message": "Archive hook failed for worktree: /repos/marlin/wt-1 \u2014 exited 1.",
"data": {
"worktreePath": "/repos/marlin/wt-1",
"outcome": "exited",
@@ -8155,26 +8155,102 @@
},
{
"action": "assignable",
"id": "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"
"repo": "id:repo-9",
"ownerRepo": {
"owner": "fork-owner",
"repo": "fork-repo",
"host": "github.enterprise.test"
}
},
"reply": {
"ok": true,
"result": [
{
"login": "octocat",
"name": "Octo Cat"
"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"]
}
]
},
{
@@ -11392,12 +11468,33 @@
"action": "mount",
"id": "mount"
},
{
"complete": "status.get#1",
"params": {
"$undefined": true
},
"reply": {
"ok": true,
"result": {
"runtimeId": "detail-runtime",
"hostDescriptor": {
"installationId": "detail-host"
},
"capabilities": ["github.exact-work-item-target.v1"]
}
}
},
{
"complete": "github.workItemDetails#1",
"params": {
"number": 12,
"repo": "id:repo-1",
"type": "pr"
"number": 12,
"type": "pr",
"ownerRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -11405,6 +11502,19 @@
"body": "body",
"comments": [],
"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": [],
@@ -11417,11 +11527,102 @@
"checks": [],
"files": []
}
},
"transport": "native",
"site": "github.workItemDetails#1"
},
{
"transport": "bridge",
"complete": "github.workItemDetails#1.native-1",
"site": "github.workItemDetails#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.workItemDetails#1.native-2",
"params": {
"repo": "id:repo-1",
"number": 12,
"type": "pr",
"ownerRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
"result": {
"body": "body",
"comments": [],
"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": []
}
},
"transport": "bridge",
"site": "github.workItemDetails#1"
},
{
"checkpoint": "mounted"
}
],
"bridgeOperations": [
{
"request": "github.workItemDetails#1",
"probeSite": "github.workItemDetails#1.native-1",
"methods": ["status.get", "github.workItemDetails"]
}
],
"replyBranches": [
{
"site": "status.get#1",
"partitions": [
"inner-ok-missing",
"inner-false-string-error",
"inner-false-object-error"
],
"request": "github.workItemDetails#1",
"params": {
"number": 12,
"repo": "id:repo-1",
"type": "pr"
}
}
]
},
{
@@ -11435,6 +11636,21 @@
"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": {
@@ -11467,6 +11683,19 @@
}
],
"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": [],
@@ -11613,9 +11842,9 @@
"reply": {
"ok": true,
"result": {
"id": "issue-2",
"identifier": "ENG-2",
"title": "A sub-issue",
"id": "issue-1",
"identifier": "ENG-1",
"title": "A Linear issue",
"url": "",
"description": "a description",
"state": {
@@ -11672,32 +11901,6 @@
"action": "mount",
"id": "mount"
},
{
"complete": "github.listLabels#1",
"params": {
"repo": "id:repo-1"
},
"reply": {
"ok": true,
"result": ["bug", "chore"]
}
},
{
"complete": "github.listAssignableUsers#1",
"params": {
"repo": "id:repo-1"
},
"reply": {
"ok": true,
"result": [
{
"login": "octocat",
"name": "Octo",
"avatarUrl": null
}
]
}
},
{
"checkpoint": "mounted"
}
@@ -12282,7 +12485,12 @@
"body": "a comment",
"number": 9,
"repo": "id:repo-1",
"type": "issue"
"type": "issue",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12322,7 +12530,12 @@
"params": {
"prNumber": 12,
"repo": "id:repo-1",
"reviewers": ["octocat"]
"reviewers": ["octocat"],
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12344,7 +12557,12 @@
"headSha": "head-sha",
"noCache": true,
"prNumber": 12,
"repo": "id:repo-1"
"repo": "id:repo-1",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12472,7 +12690,12 @@
"failedOnly": true,
"headSha": "head-sha",
"prNumber": 12,
"repo": "id:repo-1"
"repo": "id:repo-1",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12494,7 +12717,12 @@
"path": "src/index.ts",
"pullRequestId": "PR_kwDO",
"repo": "id:repo-1",
"viewed": true
"viewed": true,
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12513,7 +12741,12 @@
"params": {
"repo": "id:repo-1",
"resolve": true,
"threadId": "thread-1"
"threadId": "thread-1",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12538,7 +12771,12 @@
"path": "src/index.ts",
"prNumber": 12,
"repo": "id:repo-1",
"status": "modified"
"status": "modified",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12548,7 +12786,35 @@
"originalIsBinary": false,
"modifiedIsBinary": false
}
}
},
"transport": "native"
},
{
"complete": "github.prFileContents#1.native-1",
"params": {
"baseSha": "base-sha",
"headSha": "head-sha",
"path": "src/index.ts",
"prNumber": 12,
"repo": "id:repo-1",
"status": "modified",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
"result": {
"original": "a",
"modified": "b",
"originalIsBinary": false,
"modifiedIsBinary": false
}
},
"site": "github.prFileContents#1",
"transport": "bridge"
},
{
"checkpoint": "expand-settled"
@@ -12565,7 +12831,12 @@
"line": 12,
"path": "src/index.ts",
"prNumber": 12,
"repo": "id:repo-1"
"repo": "id:repo-1",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12611,7 +12882,12 @@
"path": "src/index.ts",
"prNumber": 12,
"repo": "id:repo-1",
"threadId": "thread-1"
"threadId": "thread-1",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12642,7 +12918,12 @@
"body": "@octocat a reply",
"number": 12,
"repo": "id:repo-1",
"type": "pr"
"type": "pr",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12669,7 +12950,12 @@
"params": {
"method": "squash",
"prNumber": 12,
"repo": "id:repo-1"
"repo": "id:repo-1",
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
"ok": true,
@@ -12786,15 +13072,36 @@
"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": {
"number": 9,
"repo": "id:repo-1",
"number": 9,
"updates": {
"title": "Renamed",
"addLabels": ["triage"],
"removeLabels": ["bug"],
"title": "Renamed"
"removeLabels": ["bug"]
},
"ownerRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
}
},
"reply": {
@@ -12802,11 +13109,64 @@
"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"]
}
]
},
{
@@ -12870,6 +13230,11 @@
"updates": {
"body": "new body",
"title": "Renamed"
},
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
@@ -12965,7 +13330,31 @@
"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"
@@ -13291,6 +13680,14 @@
"body": "body",
"comments": [],
"item": {
"id": "issue:1",
"type": "issue",
"number": 1,
"title": "Project issue",
"url": "https://github.enterprise.test/owner/repo/issues/1",
"state": "open",
"updatedAt": "2026-10-30T00:00:00Z",
"author": null,
"labels": []
},
"assignees": [],
@@ -13887,7 +14284,35 @@
"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"
@@ -13959,13 +14384,34 @@
"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": {
"number": 9,
"repo": "id:repo-1",
"number": 9,
"updates": {
"state": "closed"
},
"ownerRepo": {
"host": "github.com",
"owner": "owner",
"repo": "repo"
}
},
"reply": {
@@ -13973,8 +14419,52 @@
"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"
},
@@ -13989,6 +14479,11 @@
"repo": "id:repo-1",
"updates": {
"state": "closed"
},
"prRepo": {
"owner": "owner",
"repo": "repo",
"host": "github.com"
}
},
"reply": {
@@ -14001,6 +14496,13 @@
{
"checkpoint": "pr-state-settled"
}
],
"bridgeOperations": [
{
"request": "github.updateIssue#1",
"probeSite": "github.updateIssue#1.native-1",
"methods": ["status.get", "github.updateIssue"]
}
]
},
{
@@ -0,0 +1,192 @@
import { runProcessSync } from '@orca/process-host'
import fs from 'node:fs'
import path from 'node:path'
import process from 'node:process'
import { fileURLToPath, pathToFileURL } from 'node:url'
import { resolveProjectCompilerInfo } from '../../config/scripts/run-typecheck-projects-in-parallel.mjs'
// Phone tests that drive real desktop sources cannot join the RN test program: RN's global timers
// and Expo's process.env augmentation break the desktop graph. Each source graph emits genuine
// declarations under its own existing compiler options, and one strict Node program checks the test
// bodies against those declarations. Vitest still runs the tests against the original sources.
const repoRoot = fileURLToPath(new URL('../..', import.meta.url))
export const NODE_TEST_PROJECT = 'mobile/tsconfig.test.node.json'
// Mobile first, host second: the host owner rewrites every root src declaration, shared types included.
export const DECLARATION_PROJECTS = [
'mobile/tsconfig.test.mobile-declarations.json',
'config/tsconfig.test.mobile-host-declarations.json'
]
export const DECLARATION_OUTPUT = 'mobile/node_modules/.cache/phone-host-contract-types'
const DIAGNOSTIC = /error TS\d+:/
// Either file in the final program means the public declaration closure reached RN/Expo again.
const LEAKED_NATIVE_GLOBALS = [
/\/react-native\/src\/types\/globals\.d\.ts$/,
/\/expo\/types\/metro-require\.d\.ts$/
]
const toPosix = (filePath) => filePath.replaceAll('\\', '/')
// The two test bodies are the roots of the node test config, so no second list names them.
export function readNodeTestRoots(root = repoRoot) {
const config = JSON.parse(fs.readFileSync(path.join(root, NODE_TEST_PROJECT), 'utf8'))
return config.files.filter((file) => /\.test\.tsx?$/.test(file)).sort()
}
export function parseCompilerPass(output, code) {
const lines = output.split('\n').map((line) => line.trim())
const diagnostics = lines.filter((line) => DIAGNOSTIC.test(line))
const files = lines
.filter((line) => /\.(?:tsx?|json)$/.test(line) && !DIAGNOSTIC.test(line))
.filter((line) => path.isAbsolute(line))
.map(toPosix)
return { ok: code === 0 && diagnostics.length === 0, code, diagnostics, files }
}
// Membership is the proof: both bodies, nothing else repository-owned that is not a declaration,
// and no RN/Expo global file. Returns the problems; an empty list is a clean program.
export function checkNodeTestProgram(files, { realRoot, expected }) {
const prefix = `${toPosix(realRoot).replace(/\/$/, '')}/`
const owned = files
.filter((file) => file.startsWith(prefix) && !file.includes('/node_modules/'))
.map((file) => file.slice(prefix.length))
const expectedPaths = expected.map((file) => `mobile/${file}`)
const problems = []
for (const file of expectedPaths) {
if (!owned.includes(file)) {
problems.push(`checked test body is missing from the program: ${file}`)
}
}
for (const file of owned) {
if (/\.tsx?$/.test(file) && !file.endsWith('.d.ts') && !expectedPaths.includes(file)) {
problems.push(`implementation source re-entered the test program: ${file}`)
}
}
for (const file of files) {
if (LEAKED_NATIVE_GLOBALS.some((pattern) => pattern.test(file))) {
problems.push(`native global declarations leaked into the test program: ${file}`)
}
}
return problems
}
function compile(project, args, root, run) {
const { program } = resolveProjectCompilerInfo(project, root)
const result = run({
program: process.execPath,
args: [
program,
'-p',
path.join(root, project),
'--pretty',
'false',
'--listFiles',
'--checkers',
'8',
...args
],
cwd: root,
timeoutMs: null,
maxOutputBytes: 64 * 1024 * 1024
})
return {
project,
...parseCompilerPass(`${result.stdout ?? ''}${result.stderr ?? ''}`, result.code)
}
}
function ownOutputDirectory(root) {
const output = path.join(root, DECLARATION_OUTPUT)
const parent = path.dirname(output)
fs.mkdirSync(parent, { recursive: true })
const realRoot = fs.realpathSync(root)
const realParent = fs.realpathSync(parent)
if (!`${toPosix(realParent)}/`.startsWith(`${toPosix(realRoot)}/`)) {
throw new Error(`Declaration output escapes the repository: ${realParent}`)
}
if (fs.existsSync(output) && fs.lstatSync(output).isSymbolicLink()) {
throw new Error(`Declaration output is an unexpected symlink: ${output}`)
}
fs.rmSync(output, { recursive: true, force: true })
fs.mkdirSync(output)
return output
}
// Emitted declarations keep relative imports of original .d.ts/JSON inputs; mirror exactly those
// the producers actually compiled, byte for byte, beside them.
function mirrorDeclarationInputs(passes, root, output) {
const prefix = `${toPosix(fs.realpathSync(root))}/`
for (const file of new Set(passes.flatMap((pass) => pass.files))) {
if (
!file.startsWith(prefix) ||
file.includes('/node_modules/') ||
!(file.endsWith('.d.ts') || file.endsWith('.json'))
) {
continue
}
const target = path.join(output, file.slice(prefix.length))
if (!fs.existsSync(target)) {
fs.mkdirSync(path.dirname(target), { recursive: true })
fs.copyFileSync(file, target)
}
}
}
// Sequential: two declaration producers, then the strict check of the test bodies.
export function runNodeTestsTypecheck({ root = repoRoot, run = runProcessSync } = {}) {
const expected = readNodeTestRoots(root)
const output = ownOutputDirectory(root)
try {
const producers = []
for (const project of DECLARATION_PROJECTS) {
const pass = compile(project, [], root, run)
producers.push(pass)
if (!pass.ok) {
return { ok: false, expected, programTestFiles: [], failures: [pass], problems: [] }
}
}
mirrorDeclarationInputs(producers, root, output)
const check = compile(NODE_TEST_PROJECT, ['--noEmit'], root, run)
const problems = checkNodeTestProgram(check.files, {
realRoot: fs.realpathSync(root),
expected
})
const prefix = `${toPosix(fs.realpathSync(root))}/mobile/`
return {
ok: check.ok && problems.length === 0,
expected,
programTestFiles: check.files
.filter((file) => file.startsWith(prefix))
.map((file) => file.slice(prefix.length))
.filter((file) => expected.includes(file)),
failures: check.ok ? [] : [check],
problems
}
} finally {
fs.rmSync(output, { recursive: true, force: true })
}
}
export function printNodeTestsFailure(result) {
for (const failure of result.failures) {
console.error(`::error::${failure.project} failed (exit ${failure.code})`)
for (const diagnostic of failure.diagnostics) {
console.error(diagnostic)
}
}
for (const problem of result.problems) {
console.error(`::error::${problem}`)
}
console.error('')
console.error(' Phone/host contract tests are checked through emitted declarations.')
console.error(' Reproduce with: node scripts/check-node-tests-typecheck.mjs')
console.error('')
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
const result = runNodeTestsTypecheck()
if (!result.ok) {
printNodeTestsFailure(result)
process.exit(1)
}
console.log(`phone/host contract tests check: ${result.programTestFiles.join(', ')}`)
}
@@ -4,6 +4,7 @@ import path from 'node:path'
import process from 'node:process'
import { pathToFileURL } from 'node:url'
import { resolveMobileTypecheckCommand } from './mobile-typecheck-compiler.mjs'
import { printNodeTestsFailure, runNodeTestsTypecheck } from './check-node-tests-typecheck.mjs'
// Mobile release tsconfig excludes tests and Vitest does not typecheck; separate test program freezes existing errors with a shrink-only baseline.
@@ -11,35 +12,40 @@ const BASELINE_PATH = 'tests-typecheck-baseline.txt'
const PROJECT = 'tsconfig.test.json'
const ERROR_LINE = /^(\S.*?)\(\d+,\d+\): error TS\d+:/
// Require every on-disk test in program except these explicit exclusions: error-only diff cannot see excluded/shadowed tests.
// Tests outside the RN program. Checked transfers are the roots of tsconfig.test.node.json and must pass
// that strict program; the rest are legacy runtime-only allowances whose bodies nothing typechecks.
export const TESTS_OUTSIDE_PROGRAM = new Map([
[
'src/components/WorktreeAgentList.runtime-lineage.test.tsx',
'Node-side: renders the mobile consumer of real desktop SQLite assignment projection, against Node rather than RN libs'
'Legacy runtime-only: the test body is not typechecked anywhere; it imports the desktop SQLite assignment projection, which does not check against RN libs, and its implementation sources keep their normal checks'
],
[
'src/components/pr-sidebar/reviewer-picker.target-contract.test.tsx',
'Checked transfer: strict Node program over emitted phone/host declarations (tsconfig.test.node.json)'
],
[
'src/session/mobile-native-command-discovery.test.tsx',
'Node-side: imports the desktop ACP command discovery source, checked against @types/node rather than RN libs'
'Legacy runtime-only: the test body is not typechecked anywhere; it imports desktop ACP command discovery, which does not check against RN libs, and its implementation sources keep their normal checks'
],
[
'src/tasks/agent-launch-mobile-replay.test.ts',
'Node-side: imports the desktop main process, checked against @types/node rather than RN libs'
'Legacy runtime-only: the test body is not typechecked anywhere; it imports the desktop main process, which does not check against RN libs, and its implementation sources keep their normal checks'
],
[
'src/tasks/mobile-agent-launch-architecture.test.ts',
'Node-side: imports the desktop main process, checked against @types/node rather than RN libs'
'Legacy runtime-only: the test body is not typechecked anywhere; it imports the desktop main process, which does not check against RN libs, and its implementation sources keep their normal checks'
],
[
'src/test-support/rpc-recording/recorded-request-params.test.ts',
'Node-side: imports the desktop RPC dispatcher, checked against @types/node rather than RN libs'
'Checked transfer: strict Node program over emitted phone/host declarations (tsconfig.test.node.json)'
],
[
'src/transport/mobile-relay-browser-cancel-budget.test.ts',
'Node-side: imports @orca/process-host, checked against @types/node rather than RN libs'
'Legacy runtime-only: the test body is not typechecked anywhere; it imports @orca/process-host, which does not check against RN libs, and its implementation sources keep their normal checks'
],
[
'src/transport/web-bundle/mobile-web-bundle-host-slow-link.test.ts',
'Node-side: imports the desktop bundle RPC handlers, checked against @types/node rather than RN libs'
'Legacy runtime-only: the test body is not typechecked anywhere; it imports the desktop bundle RPC handlers, which does not check against RN libs, and its implementation sources keep their normal checks'
]
])
@@ -126,6 +132,29 @@ export function diffCensus(onDisk, inProgram, allowed = TESTS_OUTSIDE_PROGRAM) {
}
}
// A reason string never satisfies a transfer: its strict program must have passed with the body in it.
export function checkTransfers(result, allowed = TESTS_OUTSIDE_PROGRAM, nocheck = []) {
const problems = []
if (!result.ok) {
problems.push('the phone/host contract program did not pass')
}
if (result.expected.length === 0) {
problems.push('tsconfig.test.node.json names no checked transfer')
}
for (const file of result.expected) {
if (!allowed.has(file)) {
problems.push(`checked transfer is not excluded from the RN program: ${file}`)
}
if (!result.programTestFiles.includes(file)) {
problems.push(`checked transfer is absent from its program: ${file}`)
}
if (nocheck.includes(file)) {
problems.push(`checked transfer opts out with @ts-nocheck: ${file}`)
}
}
return problems
}
export function parseBaseline(text) {
return new Set(
text
@@ -260,7 +289,7 @@ function printCensusFailure(missing, staleAllowance, nocheck = []) {
}
}
export function main(root = process.cwd()) {
export function main(root = process.cwd(), runNodeTests = () => runNodeTestsTypecheck()) {
const baselineFile = path.join(root, BASELINE_PATH)
if (!fs.existsSync(baselineFile)) {
console.error(
@@ -279,6 +308,19 @@ export function main(root = process.cwd()) {
const baseline = parseBaseline(fs.readFileSync(baselineFile, 'utf8'))
const current = pass.failing
const { added, stale } = diffBaseline(current, baseline)
// The RN baseline does not apply here: transferred bodies and their declaration producers must be clean.
const node = runNodeTests()
const transferProblems = checkTransfers(
node,
TESTS_OUTSIDE_PROGRAM,
findTsNocheckFiles(root, node.expected)
)
if (transferProblems.length > 0) {
printNodeTestsFailure(node)
for (const problem of transferProblems) {
console.error(`::error::${problem}`)
}
}
if (added.length > 0) {
printAddedFailure(added)
@@ -294,8 +336,12 @@ export function main(root = process.cwd()) {
printStaleFailure(stale)
return 1
}
if (transferProblems.length > 0) {
return 1
}
const legacy = TESTS_OUTSIDE_PROGRAM.size - node.expected.length
console.log(
`mobile tests typecheck ratchet OK — ${pass.programTestFiles.length} test file(s) in the program (${TESTS_OUTSIDE_PROGRAM.size} excluded on purpose, none @ts-nocheck), ${current.length} grandfathered file(s), every other test file checks.`
`mobile tests typecheck ratchet OK — ${pass.programTestFiles.length} test file(s) checked in the RN program (${current.length} grandfathered), ${node.expected.length} checked in the phone/host contract program, ${legacy} legacy runtime-only allowance(s) whose bodies are not typechecked; none @ts-nocheck.`
)
return 0
}
@@ -4,7 +4,9 @@ import os from 'node:os'
import path from 'node:path'
import { describe, expect, it, vi } from 'vitest'
import { removeTreeSync } from '../../src/shared/windows-transient-lock-removal'
import { parseCompilerPass } from './check-node-tests-typecheck.mjs'
import {
checkTransfers,
diffBaseline,
diffCensus,
hasTsNocheckDirective,
@@ -24,6 +26,18 @@ vi.mock('./mobile-typecheck-compiler.mjs', () => ({
})
}))
const transfers = [
'src/components/pr-sidebar/reviewer-picker.target-contract.test.tsx',
'src/test-support/rpc-recording/recorded-request-params.test.ts'
]
const cleanTransfers = () => ({
ok: true,
expected: transfers,
programTestFiles: transfers,
failures: [],
problems: []
})
describe('ratchet failure diagnostics', () => {
it.each([
{ name: 'new failure', baseline: '', failed: true, exit: 1, printsDiagnostics: true },
@@ -65,8 +79,12 @@ describe('ratchet failure diagnostics', () => {
stderr: failed ? `${stderrDiagnostic}\n` : ''
})
expect(main(root)).toBe(exit)
expect(runProcessSync).toHaveBeenCalledExactlyOnceWith({
expect(main(root, cleanTransfers)).toBe(exit)
// A clean RN pass still fails when the transferred bodies' own program does not pass.
if (exit === 0) {
expect(main(root, () => ({ ...cleanTransfers(), ok: false }))).toBe(1)
}
expect(runProcessSync).toHaveBeenCalledWith({
program: 'compiler',
args: ['--project', 'tsconfig.test.json', '--listFiles'],
cwd: root,
@@ -245,3 +263,31 @@ describe('the @ts-nocheck guard', () => {
expect(hasTsNocheckDirective('// Tests the reply schema.\nexport {}\n')).toBe(false)
})
})
describe('checked transfers', () => {
const allowed = new Map(transfers.map((file) => [file, 'checked transfer']))
it('fails an allowed transfer that is absent from its final program', () => {
expect(
checkTransfers({ ...cleanTransfers(), programTestFiles: [transfers[1]] }, allowed)
).toEqual([`checked transfer is absent from its program: ${transfers[0]}`])
})
it('never reads a failed declaration producer or final compiler as clean output', () => {
expect(parseCompilerPass('/repo/mobile/src/a.test.ts\n', 2).ok).toBe(false)
expect(
parseCompilerPass('/repo/mobile/src/a.test.ts\nsrc/a.test.ts(1,1): error TS2322: x\n', 0).ok
).toBe(false)
expect(checkTransfers({ ...cleanTransfers(), ok: false }, allowed)).toEqual([
'the phone/host contract program did not pass'
])
})
it('accepts a complete clean transfer without a baseline entry', () => {
expect(parseCompilerPass('/repo/mobile/src/a.test.ts\n', 0)).toMatchObject({
ok: true,
files: ['/repo/mobile/src/a.test.ts']
})
expect(checkTransfers(cleanTransfers(), allowed)).toEqual([])
})
})
@@ -23,13 +23,15 @@ import { mobileDiffReviewPositionLabel } from '../session/mobile-diff-review-scr
import { getRuntimePathBasename } from '../../../src/shared/cross-platform-path'
import { mobileDiffReviewStyles as styles } from './mobile-diff-review-screen-styles'
import { useMobileColorScheme } from '../theme/use-mobile-color-scheme'
import type { HostConnectionInputs } from '../transport/client-context-connection-metrics'
type Props = {
controller: ReturnType<typeof useMobileDiffReviewController>
hostConnection: HostConnectionInputs
onBack: () => void
}
export function MobileDiffReviewScreenView({ controller, onBack }: Props) {
export function MobileDiffReviewScreenView({ controller, hostConnection, onBack }: Props) {
useMobileColorScheme()
const { isWideLayout } = useResponsiveLayout()
const insets = useSafeAreaInsets()
@@ -171,6 +173,7 @@ export function MobileDiffReviewScreenView({ controller, onBack }: Props) {
client={controller.client}
connState={controller.connState}
worktreeId={controller.worktreeId}
hostConnection={hostConnection}
gitBranch={controller.prSidebarBranch}
gitStatus={gitStatus}
headSha={controller.prSidebarHeadSha}
@@ -194,6 +197,7 @@ export function MobileDiffReviewScreenView({ controller, onBack }: Props) {
client={controller.client}
connState={controller.connState}
worktreeId={controller.worktreeId}
hostConnection={hostConnection}
gitBranch={controller.prSidebarBranch}
gitStatus={gitStatus}
headSha={controller.prSidebarHeadSha}
+25 -2
View File
@@ -1,5 +1,5 @@
import { useCallback, useMemo, useRef, useState, type ReactNode } from 'react'
import { ActivityIndicator, ScrollView, Text, View } from 'react-native'
import { ActivityIndicator, Pressable, ScrollView, Text, View } from 'react-native'
import {
ArrowRight,
CircleCheck,
@@ -9,6 +9,7 @@ import {
LoaderCircle,
MessageCircle,
MoreHorizontal,
RotateCw,
type LucideIcon
} from 'lucide-react-native'
import { MobileLoadErrorState, MobileStateView } from './MobileStateView'
@@ -41,6 +42,7 @@ import { NavBarButton } from './nav-bar/NavBarButton'
import { PullDownMenu } from './nav-bar/PullDownMenu'
import { useBackClaim } from '../navigation/use-back-claim'
import { prTabStyles as styles } from './pr-sidebar/pr-tab-styles'
import { mobilePrSidebarStyles as sidebarStyles } from './pr-sidebar/mobile-pr-sidebar-styles'
type BranchCompare = { commitsAhead?: number; baseRef: string } | null
@@ -98,10 +100,29 @@ export function MobilePrTabBody({
</View>
)
}
// A failed refresh keeps the accepted result; its line sits above the content so nothing below remounts.
const refreshFailed =
(state.kind === 'ready' || state.kind === 'none') && state.refreshFailed === true ? (
<View style={sidebarStyles.refreshFailedRow}>
<Text style={sidebarStyles.refreshFailedText}>
{t('session.prActionsEngine.refreshFailed', 'Failed to refresh pull request.')}
</Text>
<Pressable
style={sidebarStyles.retryButton}
onPress={onRetry}
accessibilityRole="button"
accessibilityLabel={t('components.prSidebar.retryLoading', 'Retry loading pull request')}
>
<RotateCw size={14} color={colors.textPrimary} strokeWidth={2.2} />
<Text style={sidebarStyles.retryText}>{t('common.retry', 'Retry')}</Text>
</Pressable>
</View>
) : null
if (branch === 'none') {
return (
<View style={styles.container}>
<ScrollView style={styles.scroll} contentContainerStyle={styles.content}>
{refreshFailed}
<PrTabEmptyState tab={tab} branchCompare={branchCompare} />
</ScrollView>
{footer}
@@ -118,6 +139,7 @@ export function MobilePrTabBody({
contentContainerStyle={[styles.content, !footer && { paddingBottom: bottomInset }]}
showsVerticalScrollIndicator={false}
>
{refreshFailed}
<PrTabSections tab={tab} data={state.data} onOpenChanges={onOpenChanges} />
</ScrollView>
{footer}
@@ -295,7 +317,8 @@ export function MobilePRSidebar({ onRetry, bottomInset = 0, ...input }: SidebarP
onCreateSettled,
live: screen === 'comments' ? 'details' : 'checks'
})
const refresh = () => refetch({ includeDetails: true })
// The user's explicit Refresh asks the server for the canonical details.
const refresh = () => refetch({ includeDetails: true, refresh: true })
const prMenuGroups = usePrTabMenuGroups(tab, refresh)
// Without a PR the dock still needs Refresh, e.g. after a PR is opened on the web.
const menuGroups = prMenuGroups ?? [
@@ -14,7 +14,12 @@ import { ConfirmModal } from '../ConfirmModal'
import { presentPrMerge } from './pr-actions-state'
import { PrCreateSheet } from './PrCreateSheet'
import { PrReviewersSheet } from './PrReviewersSheet'
import { livePrDetails, readyPrData, type MobilePrTab, type PrTabSheet } from './use-mobile-pr-tab'
import {
livePrDetails,
readyPrData,
type MobilePrTab,
type PrTabSheetRequest
} from './use-mobile-pr-tab'
import { prSheetStyles as sheetStyles } from './pr-tab-styles'
import { FieldTextInput } from '../composer-input/FieldTextInput'
@@ -25,23 +30,28 @@ export function MobilePrTabSheets({ tab }: { tab: MobilePrTab }) {
return (
<>
<KeyedBottomDrawer
sheet={tab.sheet}
sheetKey={(sheet: PrTabSheet) => sheet}
sheet={tab.sheetRequest}
// Each opened request is its own presentation, so a PR switch never refreshes one sheet into another PR's.
sheetKey={(request: PrTabSheetRequest) => `${request.kind}\u0000${request.id}`}
onClose={tab.closeSheet}
onAfterClose={tab.onSheetAfterClose}
dismissible={!tab.creatingPr}
dragContentToDismiss={false}
>
{(sheet) => {
switch (sheet) {
{(request) => {
// An outgoing request whose PR departed renders nothing; it never sees the new PR's actions.
if (!tab.sheetInScope(request)) {
return null
}
switch (request.kind) {
case 'merge':
return <PrMergeSheet tab={tab} />
return <PrMergeSheet tab={tab} request={request} />
case 'reviewers':
return <PrReviewersSheet tab={tab} />
return <PrReviewersSheet tab={tab} request={request} />
case 'editTitle':
return <PrEditTextSheet tab={tab} field="title" />
return <PrEditTextSheet tab={tab} request={request} field="title" />
case 'editDescription':
return <PrEditTextSheet tab={tab} field="body" />
return <PrEditTextSheet tab={tab} request={request} field="body" />
case 'createPr':
return <PrCreateSheet tab={tab} />
}
@@ -79,7 +89,7 @@ function mergeMethodCopy(
}
// Lists only the methods the repo allows, starting on its default; mobile used to merge with the default only.
function PrMergeSheet({ tab }: { tab: MobilePrTab }) {
function PrMergeSheet({ tab, request }: { tab: MobilePrTab; request: PrTabSheetRequest }) {
useMobileColorScheme()
const t = useMobileTranslation()
const data = readyPrData(tab)
@@ -95,9 +105,13 @@ function PrMergeSheet({ tab }: { tab: MobilePrTab }) {
const merge = presentPrMerge({ ...pr, state: tab.actions.resolveState(pr.state) }, method)
const busy = tab.actions.isBusy({ kind: 'merge' })
const run = async () => {
// A click from an outgoing presentation sends nothing.
if (!tab.ownsSheet(request)) {
return
}
setSubmitted(true)
if (await tab.actions.merge(method)) {
tab.closeSheetIf('merge')
tab.closeSheetIf(request)
}
}
return (
@@ -143,7 +157,15 @@ function PrMergeSheet({ tab }: { tab: MobilePrTab }) {
)
}
function PrEditTextSheet({ tab, field }: { tab: MobilePrTab; field: 'title' | 'body' }) {
function PrEditTextSheet({
tab,
request,
field
}: {
tab: MobilePrTab
request: PrTabSheetRequest
field: 'title' | 'body'
}) {
useMobileColorScheme()
const t = useMobileTranslation()
const data = readyPrData(tab)
@@ -153,8 +175,11 @@ function PrEditTextSheet({ tab, field }: { tab: MobilePrTab; field: 'title' | 'b
const [draft, setDraft] = useState(current)
const { textAction } = tab
const save = async () => {
if (!tab.ownsSheet(request)) {
return
}
if (await textAction.save(field, draft, current)) {
tab.closeSheetIf(field === 'title' ? 'editTitle' : 'editDescription')
tab.closeSheetIf(request)
}
}
const cancel = () => {
@@ -235,14 +260,7 @@ function PrTabConfirm({ tab, t }: { tab: MobilePrTab; t: Translate }) {
message={copy.message}
confirmLabel={copy.confirmLabel}
destructive={tab.confirm === 'close'}
onConfirm={() => {
if (tab.confirm === 'unlink') {
void tab.unlink()
} else if (tab.confirm) {
tab.actions.updateState(tab.confirm === 'close' ? 'closed' : 'open')
}
tab.setConfirm(null)
}}
onConfirm={tab.runConfirm}
onCancel={() => tab.setConfirm(null)}
/>
)
@@ -1,18 +1,24 @@
import { useEffect, useMemo, useRef, useState } from 'react'
import { useMemo, useState } from 'react'
import { ActivityIndicator, Pressable, Text, View } from 'react-native'
import { Search, X } from 'lucide-react-native'
import { colors, pressedStyle } from '../../theme/mobile-theme'
import { useMobileColorScheme } from '../../theme/use-mobile-color-scheme'
import { useMobileTranslation } from '../../i18n/use-mobile-translation'
import type { Translate } from '../../i18n/mobile-i18n'
import type { GitHubAssignableUser } from '../../../../src/shared/github/pull-request-types'
import type { GitHubWorkItemDetails } from '../../../../src/shared/github/work-item-types'
import { getGitHubPRReviewerRows } from '../../../../src/shared/github/pr-reviewer-display'
import { fetchAssignableUsers } from '../../session/github-pr-rpc'
import { useCalmConnectionState } from '../../transport/calm-connection-state'
import { classifyConnection, verdictDisplayLabel } from '../../transport/connection-health'
import { useReviewerPeople } from './use-reviewer-people'
import { SheetHeader } from '../nav-bar/SheetHeader'
import { ListGroup, ListRow } from '../list/ListGroup'
import { TextField } from '../composer-input/TextField'
import { livePrDetails, readyPrData, type MobilePrTab } from './use-mobile-pr-tab'
import {
livePrDetails,
readyPrData,
type MobilePrTab,
type PrTabSheetRequest
} from './use-mobile-pr-tab'
import { prSheetStyles as sheetStyles } from './pr-tab-styles'
function reviewerStateLabel(
@@ -46,13 +52,14 @@ function reviewerStateLabel(
}
}
type PeopleLoad =
| { status: 'idle' | 'loading' }
| { status: 'error'; message: string | null }
| { status: 'loaded'; users: GitHubAssignableUser[] }
// Reviewers with remove, and a search that requests a new one; same add/remove as the old section.
export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
export function PrReviewersSheet({
tab,
request
}: {
tab: MobilePrTab
request: PrTabSheetRequest
}) {
useMobileColorScheme()
const t = useMobileTranslation()
const { actions, client, worktreeId } = tab
@@ -61,8 +68,23 @@ export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
// A placeholder means the read failed; only null is still loading.
const detailsFailed = rawDetails !== null && details === null
const [query, setQuery] = useState('')
const [people, setPeople] = useState<PeopleLoad>({ status: 'idle' })
const searching = query.trim().length > 0
// Candidates belong to this open request's repository; closing or a PR departure ends their visit at once.
const people = useReviewerPeople({
client,
worktreeId,
prRepo: readyPrData(tab)?.pr.prRepo ?? null,
request: tab.sheetRequest === request ? request : null,
search: searching
})
const { users, error } = people
const { hostConnection } = tab
const presentedConnState = useCalmConnectionState(people.state, hostConnection.lastConnectedAt)
// Without candidates, an outage the calm presentation reveals explains the wait with the header's verdict.
const connectionLabel =
!users && !error && people.state !== 'connected' && presentedConnState !== 'connected'
? verdictDisplayLabel(classifyConnection({ state: people.state, ...hostConnection }))
: null
const rows = useMemo(
() =>
@@ -78,41 +100,33 @@ export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
const isRequested = (login: string) =>
actions.resolveReviewerRequested(login, authoritative.has(login.toLowerCase()))
const visibleRows = rows.filter((row) => isRequested(row.login))
// A click from an outgoing or departed presentation sends nothing.
const requestReviewer = (login: string) => {
if (tab.ownsSheet(request)) {
actions.requestReviewer(login)
}
}
const removeReviewer = (login: string) => {
if (tab.ownsSheet(request)) {
actions.removeReviewer(login)
}
}
const approvals = rows.filter((row) => row.approved).length
// Load people once, on the first search; the loading state must not re-run and cancel this read.
const peopleRequestedRef = useRef(false)
useEffect(() => {
if (!searching || peopleRequestedRef.current || !client) {
return
}
peopleRequestedRef.current = true
setPeople({ status: 'loading' })
void fetchAssignableUsers(client, worktreeId)
.then((outcome) =>
setPeople(
outcome.ok
? { status: 'loaded', users: outcome.result }
: { status: 'error', message: outcome.error }
)
)
.catch(() => setPeople({ status: 'error', message: null }))
}, [client, searching, worktreeId])
const matches = useMemo(() => {
if (people.status !== 'loaded') {
if (!users) {
return []
}
const q = query.trim().toLowerCase()
const author = details?.item.author?.toLowerCase()
return people.users
return users
.filter((user) => user.login.toLowerCase() !== author)
.filter(
(user) =>
user.login.toLowerCase().includes(q) || (user.name ?? '').toLowerCase().includes(q)
)
.slice(0, 20)
}, [details, people, query])
}, [details, users, query])
return (
<View>
@@ -139,7 +153,7 @@ export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
autoCorrect={false}
/>
{searching ? (
people.status === 'loaded' ? (
users ? (
matches.length > 0 ? (
<ListGroup>
{matches.map((user) => {
@@ -151,9 +165,7 @@ export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
selected={requested}
busy={actions.isBusy({ kind: 'reviewer', login: user.login })}
onPress={() =>
requested
? actions.removeReviewer(user.login)
: actions.requestReviewer(user.login)
requested ? removeReviewer(user.login) : requestReviewer(user.login)
}
/>
)
@@ -164,11 +176,13 @@ export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
{t('pullRequest.reviewerPickerDrawer.noMatches', 'No matching people')}
</Text>
)
) : people.status === 'error' ? (
) : error ? (
<Text style={sheetStyles.error}>
{people.message ??
{error.message ??
t('pullRequest.reviewerPickerDrawer.loadFailed', 'Failed to load people')}
</Text>
) : connectionLabel ? (
<Text style={sheetStyles.note}>{connectionLabel}</Text>
) : (
<ActivityIndicator color={colors.textSecondary} />
)
@@ -200,7 +214,7 @@ export function PrReviewersSheet({ tab }: { tab: MobilePrTab }) {
}
accessory={
<Pressable
onPress={() => actions.removeReviewer(row.login)}
onPress={() => removeReviewer(row.login)}
disabled={actions.isBusy({ kind: 'reviewer', login: row.login })}
hitSlop={8}
accessibilityRole="button"
@@ -99,5 +99,32 @@ export const mobilePrSidebarStyles = themedStyleSheet(() => ({
fontSize: typography.metaSize,
fontFamily: typography.monoFamily,
lineHeight: 16
},
refreshFailedRow: {
flexDirection: 'row',
alignItems: 'center',
gap: spacing.md,
paddingHorizontal: spacing.lg,
paddingVertical: spacing.sm
},
refreshFailedText: {
flex: 1,
color: colors.textSecondary,
fontSize: typography.bodySize,
lineHeight: 20
},
retryButton: {
minHeight: 44,
flexDirection: 'row',
alignItems: 'center',
gap: spacing.xs,
paddingHorizontal: spacing.md,
borderRadius: radii.control,
backgroundColor: colors.bgRaised
},
retryText: {
color: colors.textPrimary,
fontSize: typography.bodySize,
fontWeight: '700'
}
}))
@@ -0,0 +1,93 @@
import { useCallback, useLayoutEffect, useRef, useState } from 'react'
import type { RpcClient } from '../../transport/rpc-client'
export type PrTabSheet = 'merge' | 'reviewers' | 'createPr' | 'editTitle' | 'editDescription'
export type PrTabConfirm = 'close' | 'reopen' | 'unlink'
/**
* One incarnation of what a tab request belongs to: the complete PR resource (or, for Create, the branch) in this
* client and worktree. Equal PR numbers or branch strings do not make two incarnations equal; object identity does.
*/
export type PrTabScope = {
readonly client: RpcClient | null
readonly worktreeId: string
readonly branch: string | null
readonly resource: string | null
}
// Selected during render: equal fields keep the object, and any departure selects a fresh one, so A -> B -> A is A2.
export function useSelectedScope(next: PrTabScope): PrTabScope {
const [scope, setScope] = useState(next)
if (
scope.client === next.client &&
scope.worktreeId === next.worktreeId &&
scope.branch === next.branch &&
scope.resource === next.resource
) {
return scope
}
setScope(next)
return next
}
/** One opened sheet; its record is the presentation incarnation a late save or click is checked against. */
export type PrTabSheetRequest = {
readonly kind: PrTabSheet
readonly scope: PrTabScope
readonly id: number
}
type ConfirmRequest = { readonly kind: PrTabConfirm; readonly scope: PrTabScope }
// Sheets and confirmations belong to the scope they opened for; a departure makes them ineligible at once and never
// retargets them, so the outgoing body, a late save or a stale confirm cannot act for the new PR.
export function usePrTabRequests(prScope: PrTabScope, branchScope: PrTabScope) {
const scopeFor = (kind: PrTabSheet) => (kind === 'createPr' ? branchScope : prScope)
const [opened, setOpened] = useState<PrTabSheetRequest | null>(null)
const sheetRequest = opened && opened.scope === scopeFor(opened.kind) ? opened : null
const [confirmRequest, setConfirmRequest] = useState<ConfirmRequest | null>(null)
const confirmed = confirmRequest && confirmRequest.scope === prScope ? confirmRequest : null
const latest = useRef({ sheetRequest, confirmed, scopeFor })
useLayoutEffect(() => {
latest.current = { sheetRequest, confirmed, scopeFor }
})
const nextId = useRef(0)
const setSheet = useCallback((kind: PrTabSheet | null) => {
nextId.current += 1
setOpened(kind ? { kind, scope: latest.current.scopeFor(kind), id: nextId.current } : null)
}, [])
return {
sheetRequest,
sheet: sheetRequest?.kind ?? null,
setSheet,
/** The request is the committed open one; an outgoing or departed presentation owns nothing. */
ownsSheet: useCallback(
(request: PrTabSheetRequest) => latest.current.sheetRequest === request,
[]
),
/** The request still belongs to the current resource, so its body may render while it animates closed. */
inScope: (request: PrTabSheetRequest) => request.scope === scopeFor(request.kind),
// A save or merge that lands late closes only its own request, never one opened since.
closeSheetIf: useCallback((request: PrTabSheetRequest) => {
if (latest.current.sheetRequest === request) {
setOpened(null)
}
}, []),
// A sheet closed by a departure must not come back when the user switches back.
retireDepartedSheet: useCallback(() => {
setOpened((current) =>
current && current.scope === latest.current.scopeFor(current.kind) ? current : null
)
}, []),
hasSheet: useCallback(() => latest.current.sheetRequest !== null, []),
confirm: confirmed?.kind ?? null,
setConfirm: useCallback((kind: PrTabConfirm | null) => {
setConfirmRequest(kind ? { kind, scope: latest.current.scopeFor('merge') } : null)
}, []),
/** The confirmation still current at the click, or null for one its PR departed from. */
takeConfirm: useCallback((): PrTabConfirm | null => {
const current = latest.current.confirmed
setConfirmRequest(null)
return current?.kind ?? null
}, [])
}
}
@@ -0,0 +1,597 @@
// @vitest-environment happy-dom
import React, { act } from 'react'
import { createRoot } from 'react-dom/client'
import { afterEach, expect, it, vi } from 'vitest'
import { MobilePRSidebar } from '@orca/test-mobile/components/MobilePRSidebar'
import {
createFakeRpcClient,
rpcSuccess
} from '@orca/test-mobile/mobile-web-shell/bridge-host-test-fakes'
import { createStableLogicalRpcClient } from '@orca/test-mobile/transport/stable-logical-rpc-client'
import type { HostConnectionInputs } from '@orca/test-mobile/transport/client-context-connection-metrics'
import { RuntimeGitHubRepositoryQueryCommands } from '@orca/test-host/main/runtime/runtime-github-repository-query-commands'
import { GITHUB_REPO_WORK_ITEM_METHODS } from '@orca/test-host/main/runtime/rpc/methods/github-repo-work-item-methods'
import type { OrcaRuntimeService } from '@orca/test-host/main/runtime/orca-runtime'
import { eraseRpcMethods } from '@orca/test-host/main/runtime/rpc/core'
import type { GitHubWorkItemDetails } from '@orca/test-host/shared/github/work-item-types'
import type { Repo } from '@orca/test-host/shared/repo-types'
// Typed here: the field's own props name native types this Node-checked program must not load.
type SearchField = { value?: string; placeholder?: string; onChangeText?: (text: string) => void }
const io = vi.hoisted(
(): {
gh: ReturnType<typeof vi.fn>
resolved: ReturnType<typeof vi.fn>
requestReviewer: ReturnType<typeof vi.fn>
// The sheet's real search field, as the thin native adapter last received it.
search: SearchField | null
} => ({ gh: vi.fn(), resolved: vi.fn(), requestReviewer: vi.fn(), search: null })
)
vi.mock('react-native', () => ({
StyleSheet: { create: <T,>(styles: T) => styles, hairlineWidth: 1 },
AppState: { currentState: 'active', addEventListener: () => ({ remove: () => {} }) },
View: ({ children }: React.PropsWithChildren) => <div>{children}</div>,
ScrollView: ({ children }: React.PropsWithChildren) => <div>{children}</div>,
Text: ({ children }: React.PropsWithChildren) => <span>{children}</span>,
TextInput: () => <input />,
ActivityIndicator: () => <span role="progressbar" />,
Pressable: ({
children,
onPress,
accessibilityLabel,
disabled
}: React.PropsWithChildren<{
onPress: () => void
accessibilityLabel?: string
disabled?: boolean
}>) => (
<button aria-label={accessibilityLabel} disabled={disabled} onClick={onPress}>
{children}
</button>
)
}))
vi.mock('lucide-react-native', () =>
Object.fromEntries(
[
'ArrowRight',
'CircleCheck',
'CircleDashed',
'CircleMinus',
'CircleX',
'GitMerge',
'LoaderCircle',
'MessageCircle',
'MoreHorizontal',
'RotateCw',
'Search',
'X'
].map((name) => [name, () => null])
)
)
// Thin native adapters: the drawer finishes its hide at once, rows and the header forward presses.
vi.mock('../../components/bottom-drawer/mounted-bottom-drawer', async () => {
const { useLayoutEffect } = await import('react')
return {
MountedBottomDrawer: ({
visible,
children,
onHidden
}: React.PropsWithChildren<{ visible: boolean; onHidden: () => void }>) => {
useLayoutEffect(() => {
if (!visible) {
onHidden()
}
}, [visible, onHidden])
return <div data-sheet="">{children}</div>
}
}
})
vi.mock('../../components/list/ListGroup', () => ({
LIST_LEADING_INSET: 0,
ListGroup: ({ children }: React.PropsWithChildren) => <div>{children}</div>,
ListRow: ({
title,
onPress,
detail,
accessory
}: {
title: string
onPress?: () => void
detail?: React.ReactNode
accessory?: React.ReactNode
}) => (
<div>
<button aria-label={title} onClick={onPress}>
{title}
</button>
{detail}
{accessory}
</div>
)
}))
vi.mock('../../components/nav-bar/SheetHeader', () => ({
SheetHeader: ({
title,
trailing
}: {
title: string
trailing?: { label: string; onPress: () => void }
}) => (
<div>
<span>{title}</span>
{trailing ? <button aria-label={trailing.label} onClick={trailing.onPress} /> : null}
</div>
)
}))
vi.mock('../../components/composer-input/TextField', () => ({
TextField: (props: SearchField) => {
io.search = props
return <input readOnly value={props.value} placeholder={props.placeholder} />
}
}))
vi.mock('../../components/nav-bar/NavBarButton', () => ({ NavBarButton: () => null }))
vi.mock('../../components/nav-bar/PullDownMenu', () => ({ PullDownMenu: () => null }))
vi.mock('../../components/pr-sidebar/use-pr-tab-menu', () => ({ usePrTabMenuGroups: () => null }))
vi.mock('../../components/pr-sidebar/PrTabEmptyState', () => ({ PrTabEmptyState: () => null }))
vi.mock('../../components/pr-sidebar/PrTabOverviewCards', () => ({
PrChangesCard: () => null,
PrDescription: () => null
}))
vi.mock('../../components/pr-sidebar/PrTabBottomAction', () => ({ PrTabBottomAction: () => null }))
vi.mock('../../components/pr-sidebar/PrTabScreenView', () => ({ PrTabScreenView: () => null }))
vi.mock('../../components/pr-sidebar/PrCreateSheet', () => ({ PrCreateSheet: () => null }))
vi.mock('../../components/ConfirmModal', () => ({ ConfirmModal: () => null }))
vi.mock('../../components/SheetPrimaryButton', () => ({ SheetPrimaryButton: () => null }))
vi.mock('../../components/composer-input/FieldTextInput', () => ({ FieldTextInput: () => null }))
vi.mock('../../components/MobileStateView', () => ({
MobileStateView: () => null,
MobileLoadErrorState: () => null
}))
vi.mock('../../components/mobile-pr-url', () => ({ openMobilePrUrl: () => {} }))
vi.mock('../../navigation/use-back-claim', () => ({ useBackClaim: () => {} }))
vi.mock('../../hooks/use-now', () => ({ useNow: () => 0, useAppActive: () => true }))
vi.mock('expo-router', async () => {
const { useEffect } = await import('react')
return { useFocusEffect: (effect: () => void) => useEffect(effect, [effect]) }
})
vi.mock('../../components/pr-sidebar/mobile-pr-sidebar-styles', () => ({
mobilePrSidebarStyles: {}
}))
vi.mock('../../theme/use-mobile-color-scheme', () => ({ useMobileColorScheme: () => 'dark' }))
vi.mock('../../i18n/use-mobile-translation', () => ({
useMobileTranslation:
() => (_key: string, fallback: string, args?: Record<string, string | number>) =>
fallback.replace(/\{\{(\w+)\}\}/g, (_match, name: string) => String(args?.[name] ?? ''))
}))
vi.mock(
'../../../../src/main/github/client',
async () => import('@orca/test-host/main/github/issue-field-options')
)
vi.mock('../../../../src/main/github/gh-utils', () => ({
ghExecFileAsync: io.gh,
acquire: async () => {},
release: () => {}
}))
vi.mock('../../../../src/main/github/github-api-repository', () => ({
resolveGitHubRepoExecution: io.resolved
}))
vi.mock('../../../../src/main/github/gh-account-binding-inventory', () => ({}))
vi.mock('../../../../src/main/github/account-binding-required-host', () => ({}))
vi.mock('../../../../src/main/github/rate-limit', () => ({}))
vi.mock('../../../../src/main/github/work-item-details', () => ({}))
vi.mock('../../session/use-mobile-pr-actions', () => ({
useMobilePrActions: () => ({
blocked: null,
error: null,
resolveReviewerRequested: (_login: string, value: boolean) => value,
resolveState: (state: string) => state,
isBusy: () => false,
requestReviewer: io.requestReviewer,
removeReviewer: vi.fn()
})
}))
vi.mock('../../session/use-mobile-pr-comment-actions', () => ({
useMobilePrCommentActions: () => ({})
}))
vi.mock('../../session/use-mobile-pr-text-action', () => ({
useMobilePrTextAction: () => ({ clearError: () => {}, saving: false, error: null })
}))
vi.mock('../../session/use-mobile-pr-ai-triage', () => ({
useMobilePrAiTriage: () => ({ isBusy: () => false, noticeFor: () => ({}), availability: 'ready' })
}))
vi.mock('../../components/host-protocol-gates-context', () => ({
useHostProtocolGates: () => ({ hostCapabilities: [], statusPending: false, statusReadable: true })
}))
vi.mock('../../session/use-pr-bot-author-overrides', () => ({
usePRBotAuthorOverrides: () => new Set()
}))
let root: ReturnType<typeof createRoot> | undefined
afterEach(() => {
if (root) {
act(() => root!.unmount())
}
root = undefined
io.search = null
vi.unstubAllGlobals()
})
it('real tab/sheet sends a searched fork to the runtime provider with original worktree/account, supports refusal/reopen/migration, and keeps one visit rows across connection changes', async () => {
vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true)
const prRepo = { owner: 'fork', repo: 'widgets', host: 'github.corp' }
const repo: Repo = {
id: 'clone',
path: '/clone',
displayName: 'clone',
badgeColor: '',
addedAt: 0,
connectionId: 'nested-ssh',
ghAccount: { host: 'github.corp', user: 'selected-account' },
issueSourcePreference: 'upstream'
}
const resolved = vi.fn(async (selector: string) => {
expect(selector).toBe('id:clone')
return repo
})
const commands = new RuntimeGitHubRepositoryQueryCommands({
resolveRepo: resolved,
getLocalGitArgs: (selected) => [{ ghAccount: selected.ghAccount }]
})
io.resolved.mockImplementation(async (_path, target, connection, options) => {
expect(connection).toBe('nested-ssh')
expect(options.ghAccount).toEqual(repo.ghAccount)
return { ownerRepo: target, ghOptions: options }
})
io.gh.mockReset().mockImplementation(async (args: string[]) => ({
stdout: JSON.stringify({
login: args.some((arg) => arg.includes('repos/fork/')) ? 'fork-only' : 'upstream-only',
avatar_url: ''
})
}))
const physical = createFakeRpcClient()
let capable = false
const frames: string[] = []
let hold = false
const held: { release: () => void; fail: () => void }[] = []
const method = eraseRpcMethods(GITHUB_REPO_WORK_ITEM_METHODS).find(
(entry) => entry.name === 'github.listAssignableUsers'
)!
if (!method.params) {
throw new Error('missing list schema')
}
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the selected production method uses only listRepoAssignableUsers on this runtime boundary.
const runtime = {
listRepoAssignableUsers: commands.listRepoAssignableUsers.bind(commands)
} as unknown as OrcaRuntimeService
physical.sendRequest = async (name, params, options) => {
options?.beforeSend?.()
frames.push(name)
if (name === 'status.get') {
return rpcSuccess('status', {
runtimeId: 'S',
hostDescriptor: { installationId: 'S' },
capabilities: capable ? ['github.exact-work-item-target.v1'] : []
})
}
if (name !== 'github.listAssignableUsers') {
throw new Error(`unexpected ${name}`)
}
const reply = async () =>
rpcSuccess('users', await method.handler(method.params!.parse(params), { runtime }))
if (!hold) {
return reply()
}
// A held list reply runs the provider only when released, so each release picks its own gh output.
return new Promise<ReturnType<typeof rpcSuccess>>((resolve, reject) => {
held.push({
release: () => void reply().then(resolve, reject),
fail: () => reject(new Error('socket closed'))
})
})
}
const logical = createStableLogicalRpcClient(physical, 'relay')
io.requestReviewer.mockReset()
const details: GitHubWorkItemDetails = {
item: {
id: 'pr:93',
type: 'pr',
number: 93,
title: 'fork',
url: 'https://github.corp/fork/widgets/pull/93',
prRepo,
state: 'open',
labels: [],
author: null,
updatedAt: ''
},
body: '',
comments: []
}
const container = document.createElement('div')
root = createRoot(container)
// The screen header's verdict inputs; a relay verdict overrides them where a step sets one.
let relay: Partial<HostConnectionInputs> = {}
const renderSidebar = (target: typeof prRepo, worktreeId: string) =>
root!.render(
<MobilePRSidebar
client={logical}
hostConnection={{
reconnectAttempts: 0,
lastConnectedAt: null,
pendingPath: null,
pairingRejected: false,
relayHostReachability: 'connecting',
...relay
}}
state={{
kind: 'ready',
data: {
pr: {
number: 93,
state: 'open',
title: 'fork',
url: `https://github.corp/${target.owner}/widgets/pull/93`,
prRepo: target,
checksStatus: 'success',
updatedAt: '',
mergeable: 'MERGEABLE'
},
details: { ...details, item: { ...details.item, prRepo: target } },
checks: [],
checksError: null,
pushTarget: null
}
}}
connState="connected"
onRetry={() => {}}
refetch={() => {}}
rereadAfterWrite={() => Promise.resolve()}
worktreeId={worktreeId}
gitBranch="feature"
gitStatus={null}
headSha={null}
workspaceLabel="fixture"
/>
)
await act(async () => renderSidebar(prRepo, 'clone::/worktree'))
const sheet = () => container.querySelector('[data-sheet]')
const press = async (label: string) => {
const button = container.querySelector<HTMLButtonElement>(`[aria-label="${label}"]`)
if (!button) {
throw new Error(`missing ${label}`)
}
await act(async () => button.click())
}
const spinner = () => sheet()?.querySelector('[role="progressbar"]') ?? null
const text = () => sheet()?.textContent ?? ''
const typeSearch = (value: string) => act(async () => io.search!.onChangeText!(value))
// The approvals gate row is the tab's way into the reviewers sheet; the sheet's Done closes it.
const openSheet = () => press('No approvals yet')
const closeSheet = () => press('Done')
// Sends since the last check, at the status and list boundaries.
const sent = () => frames.splice(0)
const settle = () => act(async () => new Promise((resolve) => setTimeout(resolve, 0)))
// Opening alone does no candidate work; the first search is the demand.
await openSheet()
await settle()
expect(sheet()).not.toBeNull()
expect(sent()).toEqual([])
expect(text()).not.toContain('Disconnected')
await typeSearch('o')
await settle()
expect(text()).toContain('Update Orca')
expect(sent()).toEqual(['status.get'])
expect(io.gh).not.toHaveBeenCalled()
await closeSheet()
expect(sheet()).toBeNull()
capable = true
await openSheet()
await settle()
expect(sent()).toEqual([])
expect(text()).not.toContain('Update Orca')
await typeSearch('o')
await settle()
expect(text()).toContain('fork-only')
expect(text()).not.toContain('upstream-only')
expect(io.gh.mock.calls[0][0]).toContain('repos/fork/widgets/assignees?per_page=100')
await press('fork-only')
expect(io.requestReviewer).toHaveBeenCalledWith('fork-only')
expect(sent()).toEqual(['status.get', 'github.listAssignableUsers'])
// Clearing the search shows the requested view and keeps the visit's candidates without another read.
await typeSearch('')
await settle()
expect(text()).toContain('No reviewers requested')
await typeSearch('o')
await settle()
expect(text()).toContain('fork-only')
expect(sent()).toEqual([])
await closeSheet()
let session = physical
const migrate = async () => {
session = createFakeRpcClient()
session.sendRequest = physical.sendRequest
await act(async () => logical.migrateTo(session, 'lan'))
await settle()
}
const openAndSearch = async () => {
await openSheet()
await typeSearch('o')
await settle()
}
// 1. A connected-to-connected migration mid-load starts a successor instead of a false empty list.
let late!: (value: { stdout: string }) => void
io.gh.mockImplementationOnce(
() =>
new Promise((resolve) => {
late = resolve
})
)
await openAndSearch()
expect(spinner()).not.toBeNull()
await migrate()
expect(text()).not.toContain('No matching people')
expect(text()).toContain('fork-only')
await act(async () => late({ stdout: '{"login":"retired-person"}' }))
await settle()
expect(text()).not.toContain('retired-person')
expect(sent()).toEqual([
'status.get',
'github.listAssignableUsers',
'status.get',
'github.listAssignableUsers'
])
// 2. Loaded rows and the search stay in place through a disconnect and the refresh reconnecting starts.
hold = true
await act(async () => session.pushState('disconnected'))
expect(spinner()).toBeNull()
expect(text()).toContain('fork-only')
expect(sent()).toEqual([])
await act(async () => session.pushState('connected'))
await settle()
expect(sent()).toEqual(['status.get', 'github.listAssignableUsers'])
expect(spinner()).toBeNull()
expect(text()).toContain('fork-only')
expect(io.search!.value).toBe('o')
io.gh.mockImplementationOnce(async () => ({
stdout: '{"login":"fork-only"}\n{"login":"fork-second"}'
}))
await act(async () => held.shift()!.release())
await settle()
expect(text()).toContain('fork-second')
// A loaded migration refreshes silently, and a failed background read keeps accepted rows.
await migrate()
expect(sent()).toEqual(['status.get', 'github.listAssignableUsers'])
expect(spinner()).toBeNull()
await act(async () => held.shift()!.fail())
await settle()
expect(text()).toContain('fork-second')
expect(text()).not.toContain('socket closed')
// Reopening is fresh demand; a down-up pair in one render still retires the first attempt.
await closeSheet()
await openSheet()
await settle()
expect(sent()).toEqual([])
await typeSearch('o')
await settle()
expect(text()).not.toContain('fork-second')
expect(spinner()).not.toBeNull()
expect(sent()).toEqual(['status.get', 'github.listAssignableUsers'])
await act(async () => {
session.pushState('disconnected')
session.pushState('connected')
})
await settle()
expect(sent()).toEqual(['status.get', 'github.listAssignableUsers'])
await act(async () => held.shift()!.fail())
await settle()
expect(text()).not.toContain('socket closed')
expect(spinner()).not.toBeNull()
await act(async () => held.shift()!.release())
await settle()
expect(text()).toContain('fork-only')
// A first search while reconnecting sends nothing offline, explains the outage, and completes on recovery.
await closeSheet()
await act(async () => session.pushState('reconnecting'))
io.gh.mockClear()
await openAndSearch()
expect(text()).not.toContain('fork-only')
expect(text()).toContain('Reconnecting')
await act(async () => session.pushState('disconnected'))
expect(text()).toContain('Disconnected')
// The header's relay verdict explains the wait rather than the bare dial state.
relay = { relayHostReachability: 'unreachable' }
await act(async () => renderSidebar(prRepo, 'clone::/worktree'))
expect(text()).toContain("Can't reach Relay")
relay = {}
await act(async () => renderSidebar(prRepo, 'clone::/worktree'))
await act(async () => session.pushState('auth-failed'))
expect(text()).toContain('Pairing invalid — re-pair with your desktop')
expect(sent()).toEqual([])
expect(io.gh).not.toHaveBeenCalled()
await act(async () => session.pushState('connected'))
await settle()
// Exactly one recovery read, pending with the search kept and no error published.
expect(sent()).toEqual(['status.get', 'github.listAssignableUsers'])
expect(io.search!.value).toBe('o')
expect(spinner()).not.toBeNull()
expect(text()).not.toContain('Pairing invalid')
expect(text()).not.toContain('Failed to load people')
await act(async () => held.shift()!.release())
await settle()
expect(io.gh).toHaveBeenCalledTimes(1)
expect(text()).toContain('fork-only')
expect(sent()).toEqual([])
// A to B to A: a repository departure closes the open request; each target is a new visit, and no earlier visit's
// reply can paint the current one.
const upstream = { owner: 'upstream', repo: 'widgets', host: 'github.corp' }
await closeSheet()
await openAndSearch()
await act(async () => renderSidebar(upstream, 'clone::/worktree'))
await settle()
expect(sheet()).toBeNull()
await openAndSearch()
expect(spinner()).not.toBeNull()
await act(async () => renderSidebar(prRepo, 'clone::/worktree'))
await settle()
// The departed request never comes back on return.
expect(sheet()).toBeNull()
await openAndSearch()
expect(spinner()).not.toBeNull()
expect(sent()).toEqual([
'status.get',
'github.listAssignableUsers',
'status.get',
'github.listAssignableUsers',
'status.get',
'github.listAssignableUsers'
])
const [firstVisit, upstreamVisit, returnVisit] = held.splice(0)
io.gh.mockClear()
io.gh.mockImplementationOnce(async () => ({ stdout: '{"login":"retired-person"}' }))
await act(async () => firstVisit.release())
await settle()
await act(async () => upstreamVisit.release())
await settle()
expect(io.gh.mock.calls[1][0]).toContain('repos/upstream/widgets/assignees?per_page=100')
expect(text()).not.toContain('retired-person')
expect(text()).not.toContain('upstream-only')
expect(spinner()).not.toBeNull()
await act(async () => returnVisit.release())
await settle()
expect(text()).toContain('fork-only')
// A worktree change and a close/reopen while its reply is pending start fresh visits too.
await act(async () => renderSidebar(prRepo, 'clone::/other'))
await settle()
expect(sheet()).toBeNull()
await openAndSearch()
expect(spinner()).not.toBeNull()
await closeSheet()
await openAndSearch()
expect(sent()).toEqual([
'status.get',
'github.listAssignableUsers',
'status.get',
'github.listAssignableUsers'
])
const [worktreeVisit, reopenedVisit] = held.splice(0)
io.gh.mockImplementationOnce(async () => ({ stdout: '{"login":"retired-person"}' }))
await act(async () => worktreeVisit.release())
await settle()
expect(text()).not.toContain('retired-person')
expect(spinner()).not.toBeNull()
await act(async () => reopenedVisit.release())
await settle()
expect(text()).toContain('fork-only')
// A genuine empty reply is the only way to reach the empty state.
hold = false
await closeSheet()
io.gh.mockImplementationOnce(async () => ({ stdout: '' }))
await openAndSearch()
expect(text()).toContain('No matching people')
})
@@ -0,0 +1,114 @@
import { createElement } from 'react'
import { act, create, type ReactTestRenderer } from 'react-test-renderer'
import { afterEach, beforeEach, expect, it, vi } from 'vitest'
import type { PrSidebarState } from '../../session/mobile-pr-sidebar-state'
import type { PrSidebarLoadResult } from '../../session/pr-sidebar-load-result'
import type { PrTabScope } from './pr-tab-requests'
import { useMobilePrPolling } from './use-mobile-pr-polling'
vi.mock('expo-router', async () => {
const { useEffect } = await import('react')
return { useFocusEffect: (effect: () => void) => useEffect(effect, [effect]) }
})
vi.mock('../../hooks/use-now', () => ({ useAppActive: () => true }))
let renderer: ReactTestRenderer | undefined
beforeEach(() => {
vi.useFakeTimers()
})
afterEach(() => {
act(() => renderer?.unmount())
renderer = undefined
vi.useRealTimers()
})
const repo = (owner: string) => ({ owner, repo: 'widgets', host: 'github.corp' })
// One accepted state per PR, so a re-render with the same PR does not look like new checks.
const ready = (owner: string): PrSidebarState => ({
kind: 'ready',
data: {
pr: {
number: 93,
state: 'open',
title: owner,
url: `https://github.corp/${owner}/widgets/pull/93`,
prRepo: repo(owner),
checksStatus: 'pending',
updatedAt: '',
mergeable: 'MERGEABLE'
},
details: null,
checks: [{ name: 'ci', status: 'in_progress', conclusion: null, url: null }],
checksError: null,
pushTarget: null
}
})
// The tab selects a fresh scope object for every PR incarnation, so fork -> upstream -> fork is a third owner.
const scope = (owner: string): PrTabScope => ({
client: null,
worktreeId: 'clone::/wt',
branch: 'feat',
resource: `github.corp/${owner}/widgets#pr:93`
})
it("keeps each PR incarnation's poll, backoff and cadence its own across fork -> upstream -> fork", async () => {
const polls: ((result: PrSidebarLoadResult) => void)[] = []
const refetch = vi.fn(
(_options?: unknown) => new Promise<PrSidebarLoadResult>((resolve) => polls.push(resolve))
)
function Probe({ state, owner }: { state: PrSidebarState; owner: PrTabScope }) {
useMobilePrPolling({ state, refetch, live: 'checks', connected: true, owner })
return null
}
const show = (state: PrSidebarState, owner: PrTabScope) =>
act(() => {
const element = createElement(Probe, { state, owner })
if (renderer) {
renderer.update(element)
} else {
renderer = create(element)
}
})
const advance = (ms: number) => act(async () => void vi.advanceTimersByTime(ms))
const settle = (index: number, result: PrSidebarLoadResult) =>
act(async () => polls[index](result))
const fork = ready('fork')
const upstream = ready('upstream')
show(fork, scope('fork'))
await advance(59_999)
expect(refetch).not.toHaveBeenCalled()
await advance(1)
expect(refetch).toHaveBeenCalledTimes(1)
expect(refetch).toHaveBeenLastCalledWith({ includeDetails: false, background: true })
// Upstream #93 starts its own cadence a full interval after it arrives; the fork's held poll does not block it.
show(upstream, scope('upstream'))
await advance(59_999)
expect(refetch).toHaveBeenCalledTimes(1)
await advance(1)
expect(refetch).toHaveBeenCalledTimes(2)
// The fork's poll failing late neither backs upstream off nor releases upstream's own poll in flight.
await settle(0, 'failed')
await advance(60_000)
expect(refetch).toHaveBeenCalledTimes(2)
// Upstream's poll landing re-arms at its own unchanged one-minute cadence, already due.
await settle(1, 'applied')
await advance(0)
expect(refetch).toHaveBeenCalledTimes(3)
// Back to the fork is a new incarnation: a fresh full interval, not blocked by upstream's poll in flight.
show(fork, scope('fork'))
await advance(59_999)
expect(refetch).toHaveBeenCalledTimes(3)
await advance(1)
expect(refetch).toHaveBeenCalledTimes(4)
// Upstream's late failure leaves the fork's cadence alone: its next poll is one interval on, not a backed-off two.
await settle(2, 'failed')
await settle(3, 'applied')
await advance(59_999)
expect(refetch).toHaveBeenCalledTimes(4)
await advance(1)
expect(refetch).toHaveBeenCalledTimes(5)
})
@@ -9,6 +9,7 @@ import { useAppActive } from '../../hooks/use-now'
import type { PrSidebarState } from '../../session/mobile-pr-sidebar-state'
import type { PrSidebarLoadOptions } from '../../session/use-mobile-pr-sidebar-controller'
import type { PrSidebarLoadResult } from '../../session/pr-sidebar-load-result'
import type { PrTabScope } from './pr-tab-requests'
/** What is on screen: nothing to keep fresh, the PR and its checks, or its comments too. */
export type PrTabLive = false | 'checks' | 'details'
@@ -18,12 +19,14 @@ type Input = {
refetch: (options?: PrSidebarLoadOptions) => Promise<PrSidebarLoadResult> | void
live: PrTabLive
connected: boolean
/** The complete PR incarnation (client, worktree, resource) whose cadence this is. */
owner: PrTabScope
}
// Desktop's checks-panel cadence (shared policy): 1 min while open, backing off to 2 min when nothing
// changes and up to 15 min on failures, stopping once a merged PR's checks settle. It runs only while
// the PR is on screen, its route is focused, the host is connected and the app is in the foreground.
export function useMobilePrPolling({ state, refetch, live, connected }: Input): {
export function useMobilePrPolling({ state, refetch, live, connected, owner }: Input): {
/** Polling is running for an open PR, so the screen can say "Live" instead of offering Refresh. */
polling: boolean
} {
@@ -42,8 +45,9 @@ export function useMobilePrPolling({ state, refetch, live, connected }: Input):
const backoffRef = useRef(60_000)
const signatureRef = useRef<string | null>(null)
const lastAttemptRef = useRef<number | null>(null)
const inFlightRef = useRef(false)
// Each PR is its own generation, so a read started for the last PR cannot steer this one's cadence.
// The generation whose poll is in flight; a departed PR's unresolved poll never blocks this one's.
const inFlightRef = useRef<number | null>(null)
// Each PR incarnation is its own generation, so a read started for the last one cannot steer this one's cadence.
const generationRef = useRef(0)
const [tick, setTick] = useState(0)
const refetchRef = useRef(refetch)
@@ -51,14 +55,13 @@ export function useMobilePrPolling({ state, refetch, live, connected }: Input):
refetchRef.current = refetch
})
const prNumber = pr?.number ?? null
useEffect(() => {
generationRef.current += 1
policy.reset()
backoffRef.current = 60_000
signatureRef.current = null
lastAttemptRef.current = null
}, [policy, prNumber])
}, [policy, owner])
// Every read that lands feeds the backoff: unchanged checks slow it, changes reset it, a failed checks read fails it.
useEffect(() => {
@@ -82,7 +85,7 @@ export function useMobilePrPolling({ state, refetch, live, connected }: Input):
const prState = pr?.state
const checksStatus = pr?.checksStatus
useEffect(() => {
if (!running || !prState || inFlightRef.current) {
if (!running || !prState || inFlightRef.current === generationRef.current) {
return
}
const interval = policy.delayMs(prState, checksStatus, backoffRef.current)
@@ -99,7 +102,7 @@ export function useMobilePrPolling({ state, refetch, live, connected }: Input):
const generation = generationRef.current
const timer = setTimeout(() => {
lastAttemptRef.current = Date.now()
inFlightRef.current = true
inFlightRef.current = generation
void Promise.resolve(
refetchRef.current({ includeDetails: live === 'details', background: true })
)
@@ -114,13 +117,17 @@ export function useMobilePrPolling({ state, refetch, live, connected }: Input):
}
})
.finally(() => {
inFlightRef.current = false
// A departed incarnation's finish neither releases nor re-arms its successor.
if (generation !== generationRef.current) {
return
}
inFlightRef.current = null
setTick((value) => value + 1)
})
}, delay)
return () => clearTimeout(timer)
// New data from any read (a manual refresh too) re-arms the timer with the backoff it just set.
}, [checks, checksError, checksStatus, live, policy, prNumber, prState, running, tick])
}, [checks, checksError, checksStatus, live, owner, policy, prState, running, tick])
return { polling: running && (prState === 'open' || prState === 'draft') }
}
@@ -1,8 +1,10 @@
import { useCallback, useLayoutEffect, useRef, useState } from 'react'
import type { ConnectionState } from '../../transport/types'
import type { RpcClient } from '../../transport/rpc-client'
import type { HostConnectionInputs } from '../../transport/client-context-connection-metrics'
import {
isPrSidebarDetailsPlaceholder,
prSidebarResourceKey,
type PrSidebarData,
type PrSidebarState
} from '../../session/mobile-pr-sidebar-state'
@@ -23,12 +25,17 @@ import type { PRCheckDetail } from '../../../../src/shared/github/check-types'
import { fetchPRCheckDetails } from '../../session/github-pr-rpc'
import type { DetailEntry } from './PRCheckDetail'
import { prCheckKey } from './pr-checks-presentation'
import {
useSelectedScope,
usePrTabRequests,
type PrTabConfirm,
type PrTabScope
} from './pr-tab-requests'
const NO_DETAILS: Record<string, DetailEntry> = {}
export type PrTabScreen = 'checks' | 'comments'
export type PrTabSheet = 'merge' | 'reviewers' | 'createPr' | 'editTitle' | 'editDescription'
export type PrTabConfirm = 'close' | 'reopen' | 'unlink'
export type { PrTabConfirm, PrTabSheet, PrTabSheetRequest } from './pr-tab-requests'
type Input = {
state: PrSidebarState
@@ -39,6 +46,8 @@ type Input = {
live?: PrTabLive
client: RpcClient | null
connState: ConnectionState
/** The screen header's own verdict inputs, so a sheet's no-data wait reads as the header does. */
hostConnection: HostConnectionInputs
worktreeId: string
gitBranch: string | null
gitStatus: MobileGitStatusResult | null
@@ -84,6 +93,20 @@ export function useMobilePrTab(input: Input) {
const prNumber = state.kind === 'ready' ? state.data.pr.number : 0
// Keep stable PRInfo.prRepo identity; cloning owner/repo thrashes mutation/comment/title hooks.
const prRepo = state.kind === 'ready' ? (state.data.pr.prRepo ?? null) : null
// The complete PR resource, not its number: fork #N and upstream #N are different owners of every cache and sheet.
const prScope = useSelectedScope({
client,
worktreeId,
branch: gitBranch,
resource: state.kind === 'ready' ? prSidebarResourceKey(state.data.pr) : null
})
const branchScope = useSelectedScope({ client, worktreeId, branch: gitBranch, resource: null })
const requests = usePrTabRequests(prScope, branchScope)
const { setSheet } = requests
// Every attempted write rereads once; the write's own outcome stays the only feedback.
const refetchAfterMutation = useCallback(async (): Promise<void> => {
await rereadAfterWrite()
}, [rereadAfterWrite])
const ownActions = useMobilePrActions({
client,
connState,
@@ -91,7 +114,7 @@ export function useMobilePrTab(input: Input) {
prNumber,
headSha: input.headSha,
prRepo,
refetch: rereadAfterWrite
refetch: refetchAfterMutation
})
const commentActions = useMobilePrCommentActions({
client,
@@ -99,7 +122,7 @@ export function useMobilePrTab(input: Input) {
worktreeId,
prNumber,
prRepo,
refetch: rereadAfterWrite
refetch: refetchAfterMutation
})
const textAction = useMobilePrTextAction({
client,
@@ -107,14 +130,15 @@ export function useMobilePrTab(input: Input) {
worktreeId,
prNumber,
prRepo,
refetch: rereadAfterWrite
refetch: refetchAfterMutation
})
const clearTextError = textAction.clearError
const { polling } = useMobilePrPolling({
state,
refetch,
live: input.live ?? false,
connected: connState === 'connected'
connected: connState === 'connected',
owner: prScope
})
const { hostCapabilities, statusPending, statusReadable } = useHostProtocolGates()
const ownTriage = useMobilePrAiTriage({
@@ -135,10 +159,11 @@ export function useMobilePrTab(input: Input) {
state.kind === 'ready' ? state.data.details : null
)
// Check details outlive the Checks screen, so going back and in again does not refetch them; they belong to one PR.
const detailsOwner = `${worktreeId}\u0000${prNumber}`
// Check details outlive the Checks screen, so going back and in again does not refetch them; they belong to one
// PR incarnation, so a held read for fork A can never fill upstream B or a later A again.
const detailsOwner: PrTabScope = prScope
const [detailsState, setDetailsState] = useState<{
owner: string
owner: PrTabScope
entries: Record<string, DetailEntry>
}>({ owner: detailsOwner, entries: {} })
const checkDetails = detailsState.owner === detailsOwner ? detailsState.entries : NO_DETAILS
@@ -185,38 +210,24 @@ export function useMobilePrTab(input: Input) {
[client, detailsOwner, prRepo, worktreeId]
)
// A sheet belongs to the PR (or, for Create, the branch) it opened for; a switch closes it rather than retargeting a save.
const sheetOwner = (kind: PrTabSheet) =>
kind === 'createPr'
? `${worktreeId}\u0000${gitBranch}`
: `${worktreeId}\u0000${gitBranch}\u0000${prNumber}`
const [opened, setOpened] = useState<{ kind: PrTabSheet; owner: string } | null>(null)
const sheet = opened && opened.owner === sheetOwner(opened.kind) ? opened.kind : null
const sheetOwnerRef = useRef(sheetOwner)
useLayoutEffect(() => {
sheetOwnerRef.current = sheetOwner
})
const setSheet = useCallback((kind: PrTabSheet | null) => {
setOpened(kind ? { kind, owner: sheetOwnerRef.current(kind) } : null)
}, [])
const sheetRef = useRef(sheet)
useLayoutEffect(() => {
sheetRef.current = sheet
})
const afterSheetCloseRef = useRef<(() => void) | null>(null)
// A running Create holds its sheet up (the drawer refuses dismissal), so the run's result has somewhere to land.
const [creatingPr, setCreatingPr] = useState(false)
const [confirm, setConfirm] = useState<PrTabConfirm | null>(null)
const [unlinking, setUnlinking] = useState(false)
// An unlink failure belongs to the PR it was for, and the next menu action replaces it.
const [unlinkFailure, setUnlinkFailure] = useState<{ owner: string; message: string } | null>(
null
)
const [unlinkFailure, setUnlinkFailure] = useState<{
owner: PrTabScope
message: string
} | null>(null)
const unlinkError = unlinkFailure?.owner === detailsOwner ? unlinkFailure.message : null
const openConfirm = useCallback((next: PrTabConfirm | null) => {
setUnlinkFailure(null)
setConfirm(next)
}, [])
const { setConfirm, takeConfirm } = requests
const openConfirm = useCallback(
(next: PrTabConfirm | null) => {
setUnlinkFailure(null)
setConfirm(next)
},
[setConfirm]
)
const unlink = useCallback(async (): Promise<void> => {
if (!client || unlinking || prNumber === 0) {
@@ -255,27 +266,22 @@ export function useMobilePrTab(input: Input) {
textAction,
triage,
botAuthorOverrides,
sheet,
sheet: requests.sheet,
sheetRequest: requests.sheetRequest,
ownsSheet: requests.ownsSheet,
sheetInScope: requests.inScope,
closeSheet: useCallback(() => setSheet(null), [setSheet]),
// A save or merge that lands late closes only its own sheet, never one opened since.
closeSheetIf: useCallback(
(kind: PrTabSheet) => {
if (sheetRef.current === kind) {
setSheet(null)
}
},
[setSheet]
),
closeSheetIf: requests.closeSheetIf,
closeSheetThen: useCallback(
(next: () => void) => {
if (sheetRef.current === null) {
if (!requests.hasSheet()) {
next()
return
}
afterSheetCloseRef.current = next
setSheet(null)
},
[setSheet]
[requests.hasSheet, setSheet]
),
polling,
creatingPr,
@@ -283,14 +289,11 @@ export function useMobilePrTab(input: Input) {
checkDetails,
ensureCheckDetail,
onSheetAfterClose: useCallback(() => {
// A sheet closed by a PR switch must not come back if the user switches back.
setOpened((current) =>
current && current.owner === sheetOwnerRef.current(current.kind) ? current : null
)
requests.retireDepartedSheet()
const next = afterSheetCloseRef.current
afterSheetCloseRef.current = null
next?.()
}, []),
}, [requests.retireDepartedSheet]),
openMergeSheet: useCallback(() => setSheet('merge'), [setSheet]),
openReviewersSheet: useCallback(() => setSheet('reviewers'), [setSheet]),
openCreatePrSheet: useCallback(() => setSheet('createPr'), [setSheet]),
@@ -304,8 +307,17 @@ export function useMobilePrTab(input: Input) {
}, [clearTextError, setSheet]),
openChecksScreen: useCallback(() => onOpenScreen('checks'), [onOpenScreen]),
openCommentsScreen: useCallback(() => onOpenScreen('comments'), [onOpenScreen]),
confirm,
confirm: requests.confirm,
setConfirm: openConfirm,
// A confirmation whose PR departed closes without acting; a current one acts on the PR it opened for.
runConfirm: useCallback(() => {
const kind = takeConfirm()
if (kind === 'unlink') {
void unlink()
} else if (kind) {
actions.updateState(kind === 'close' ? 'closed' : 'open')
}
}, [actions, takeConfirm, unlink]),
unlink,
unlinking,
unlinkError
@@ -0,0 +1,146 @@
import { githubRepoIdentityKey } from '../../../../src/shared/github/repository-identity-key'
import { useEffect, useLayoutEffect, useState } from 'react'
import type {
GitHubAssignableUser,
GitHubOwnerRepo
} from '../../../../src/shared/github/pull-request-types'
import type { RpcClient } from '../../transport/rpc-client'
import type { ConnectionState } from '../../transport/types'
import { fetchAssignableUsers } from '../../session/github-pr-rpc'
export type ReviewerPeople = {
// Undefined until this visit accepts a reply; [] is an accepted empty list.
users: GitHubAssignableUser[] | undefined
error: { message: string | null } | null
state: ConnectionState
}
// One open sheet request for one client/worktree/repository; closing, retargeting or reopening starts a new visit.
type PeopleVisit = {
client: RpcClient | null
worktreeId: string
prRepo: GitHubOwnerRepo | null
targetKey: string | null
request: unknown
live: boolean
attempt: number
observed: { state: ConnectionState; generation: number | undefined } | null
latest: ReviewerPeople
}
type Target = {
client: RpcClient | null
worktreeId: string
prRepo: GitHubOwnerRepo | null
/** The open sheet request this visit serves, or null once it closed or its PR departed. */
request: unknown
}
function createPeopleVisit(target: Target): PeopleVisit {
return {
...target,
targetKey: target.prRepo ? githubRepoIdentityKey(target.prRepo) : null,
live: false,
attempt: 0,
observed: null,
latest: { users: undefined, error: null, state: target.client?.getState() ?? 'disconnected' }
}
}
// The candidate list for the reviewers sheet: demanded by the first search of an open visit and kept for that
// visit, read only while connected, with every real state or generation change retiring the attempt in flight.
export function useReviewerPeople(target: Target & { search: boolean }): ReviewerPeople & {
demanded: boolean
} {
const targetKey = target.prRepo ? githubRepoIdentityKey(target.prRepo) : null
const [selection, setSelection] = useState(() => {
const visit = createPeopleVisit(target)
return { visit, snapshot: visit.latest, demanded: false }
})
let selected = selection
if (
selection.visit.client !== target.client ||
selection.visit.worktreeId !== target.worktreeId ||
selection.visit.targetKey !== targetKey ||
selection.visit.request !== target.request
) {
const visit = createPeopleVisit(target)
selected = { visit, snapshot: visit.latest, demanded: false }
}
// Demand starts with the first search of an open visit and stays until the visit ends, even if search clears.
if (target.search && selected.visit.request !== null && !selected.demanded) {
selected = { ...selected, demanded: true }
}
if (selected !== selection) {
setSelection(selected)
}
const { visit, snapshot, demanded } = selected
useLayoutEffect(() => {
visit.live = true
return () => {
visit.live = false
visit.attempt += 1
}
}, [visit])
useEffect(() => {
const visitClient = visit.client
if (!demanded || visit.request === null || !visitClient) {
return
}
const publish = (patch: Partial<ReviewerPeople>) => {
const next = { ...visit.latest, ...patch }
visit.latest = next
setSelection((current) =>
current.visit === visit ? { ...current, snapshot: next } : current
)
}
// Every real state or generation change retires the active attempt before the notification returns;
// accepted rows stay, and a connected session starts the one attempt allowed to publish.
const reconcile = (state: ConnectionState) => {
if (!visit.live) {
return
}
const generation = visitClient.getGeneration?.()
const observed = visit.observed
if (observed?.state === state && Object.is(observed.generation, generation)) {
return
}
visit.observed = { state, generation }
const attempt = ++visit.attempt
publish({ state, error: null })
if (state !== 'connected') {
return
}
const owns = () => visit.live && visit.attempt === attempt
void fetchAssignableUsers(visitClient, visit.worktreeId, visit.prRepo).then(
(outcome) => {
if (!owns()) {
return
}
if (outcome.ok) {
publish({ users: outcome.result, error: null })
} else if (!visit.latest.users) {
publish({ error: { message: outcome.error } })
}
},
() => {
if (owns() && !visit.latest.users) {
publish({ error: { message: null } })
}
}
)
}
const stop = visitClient.onStateChange(reconcile)
reconcile(visitClient.getState())
return () => {
stop()
// A resubscription of this visit reconciles from scratch rather than matching a retired attempt.
visit.observed = null
visit.attempt += 1
}
}, [visit, demanded])
return { ...snapshot, demanded }
}
-4
View File
@@ -280,10 +280,6 @@
"queuedMessageCardRow": {
"images_one": "{{count}} image",
"images_other": "{{count}} images"
},
"structuredOpen": {
"worktreeDeleted": "The worktree was deleted.",
"folderWorkspaceRemoved": "The folder workspace was removed."
}
},
"settings": {
+2 -1
View File
@@ -803,7 +803,8 @@
},
"prSidebar": {
"loading": "Pull Request wird geladen…",
"notPermitted": "Nicht erlaubt – das GitHub-Konto ist nicht verbunden."
"notPermitted": "Nicht erlaubt – das GitHub-Konto ist nicht verbunden.",
"retryLoading": "Pull Request erneut laden"
},
"protocolBlockScreen": {
"backToHosts": "Zurück zu Hosts",
+4 -2
View File
@@ -1059,7 +1059,8 @@
},
"prSidebar": {
"loading": "Loading pull request…",
"notPermitted": "Not permitted — your GitHub account is not connected."
"notPermitted": "Not permitted — your GitHub account is not connected.",
"retryLoading": "Retry loading pull request"
},
"richMarkdownEditor": {
"linkUrl": "Link URL",
@@ -2302,7 +2303,8 @@
"notesSent": "Notes sent"
},
"prActionsEngine": {
"mergeFailed": "Failed to merge pull request."
"mergeFailed": "Failed to merge pull request.",
"refreshFailed": "Failed to refresh pull request."
},
"prAiTriageLaunch": {
"promptNotSent": "The agent started, but the prompt wasn't sent.",
+2 -1
View File
@@ -840,7 +840,8 @@
},
"prSidebar": {
"loading": "Cargando pull request…",
"notPermitted": "Acceso no permitido: tu cuenta de GitHub no está conectada."
"notPermitted": "Acceso no permitido: tu cuenta de GitHub no está conectada.",
"retryLoading": "Reintentar cargar la pull request"
},
"protocolBlockScreen": {
"backToHosts": "Volver a hosts",
+2 -1
View File
@@ -840,7 +840,8 @@
},
"prSidebar": {
"loading": "Chargement de la pull request…",
"notPermitted": "Accès refusé — votre compte GitHub n'est pas connecté."
"notPermitted": "Accès refusé — votre compte GitHub n'est pas connecté.",
"retryLoading": "Réessayer de charger la pull request"
},
"protocolBlockScreen": {
"backToHosts": "Retour aux hôtes",
+2 -1
View File
@@ -799,7 +799,8 @@
},
"prSidebar": {
"loading": "PR を読み込み中…",
"notPermitted": "GitHub アカウントが接続されていないため、アクセスできません。"
"notPermitted": "GitHub アカウントが接続されていないため、アクセスできません。",
"retryLoading": "PR の読み込みを再試行"
},
"protocolBlockScreen": {
"backToHosts": "ホストに戻る",
+2 -1
View File
@@ -799,7 +799,8 @@
},
"prSidebar": {
"loading": "PR 로드 중…",
"notPermitted": "GitHub 계정이 연결되지 않아 접근이 허용되지 않습니다."
"notPermitted": "GitHub 계정이 연결되지 않아 접근이 허용되지 않습니다.",
"retryLoading": "PR 로드 다시 시도"
},
"protocolBlockScreen": {
"backToHosts": "호스트로 돌아가기",
+2 -1
View File
@@ -840,7 +840,8 @@
},
"prSidebar": {
"loading": "Carregando pull request…",
"notPermitted": "Não permitido — sua conta do GitHub não está conectada."
"notPermitted": "Não permitido — sua conta do GitHub não está conectada.",
"retryLoading": "Tentar carregar o pull request novamente"
},
"protocolBlockScreen": {
"backToHosts": "Voltar para hosts",
+2 -1
View File
@@ -877,7 +877,8 @@
},
"prSidebar": {
"loading": "Загрузка пул-реквеста…",
"notPermitted": "Доступ запрещён — ваша учётная запись GitHub не подключена."
"notPermitted": "Доступ запрещён — ваша учётная запись GitHub не подключена.",
"retryLoading": "Повторить загрузку пул-реквеста"
},
"protocolBlockScreen": {
"backToHosts": "Вернуться к серверам",

Some files were not shown because too many files have changed in this diff Show More