diff --git a/config/patches/node-pty@1.1.0.patch b/config/patches/node-pty@1.1.0.patch index 961e750da6b..d36bf36b63f 100644 --- a/config/patches/node-pty@1.1.0.patch +++ b/config/patches/node-pty@1.1.0.patch @@ -165,7 +165,7 @@ index e2f9bc9131077b53ebc32d207207ad82804ff185..6c63bfaaf75128d88f9a2efece134763 Terminal.prototype._parseEnv = function (env) { var keys = Object.keys(env || {}); diff --git a/lib/unixTerminal.js b/lib/unixTerminal.js -index 1ec12f796a822c78fba9ad7f6448c3987e325c23..d838d795ecb9ea72e3bcc31113344947c006af7e 100644 +index 1ec12f796a822c78fba9ad7f6448c3987e325c23..1779098c54ff4be8c0d4dc9a93e96e71ededb01f 100644 --- a/lib/unixTerminal.js +++ b/lib/unixTerminal.js @@ -28,8 +28,12 @@ var native = utils_1.loadNativeModule('pty'); @@ -207,9 +207,26 @@ index 1ec12f796a822c78fba9ad7f6448c3987e325c23..d838d795ecb9ea72e3bcc31113344947 pty.resize(this._fd, cols, rows); this._cols = cols; this._rows = rows; -@@ -287,8 +301,15 @@ var CustomWriteStream = /** @class */ (function () { +@@ -273,6 +287,13 @@ var UnixTerminal = /** @class */ (function (_super) { + return UnixTerminal; + }(terminal_1.Terminal)); + exports.UnixTerminal = UnixTerminal; ++/** ++ * Orca: upstream retries EAGAIN with `setImmediate`, which re-attempts within microseconds ++ * and pins a core on the daemon thread when a reader stops draining. 1ms keeps ~97% of that ++ * CPU saving; longer delays cost 2-3x delivery time to a reader that drains in bursts (an ++ * agent). Re-measure both before changing. ++ */ ++var EAGAIN_RETRY_DELAY_MS = 1; + /** + * A custom write stream that writes directly to a file descriptor with proper + * handling of backpressure and errors. This avoids some event loop exhaustion +@@ -285,10 +306,17 @@ var CustomWriteStream = /** @class */ (function () { + this._writeQueue = []; + } CustomWriteStream.prototype.dispose = function () { - clearImmediate(this._writeImmediate); +- clearImmediate(this._writeImmediate); ++ clearTimeout(this._writeImmediate); this._writeImmediate = undefined; + // Orca: retire this stream's own copy of the master fd and drop what has + // not shipped, so nothing queued here reaches a reused descriptor. @@ -223,7 +240,7 @@ index 1ec12f796a822c78fba9ad7f6448c3987e325c23..d838d795ecb9ea72e3bcc31113344947 // Writes are put in a queue and processed asynchronously in order to handle // backpressure from the kernel buffer. var buffer = typeof data === 'string' -@@ -304,7 +325,8 @@ var CustomWriteStream = /** @class */ (function () { +@@ -304,7 +332,8 @@ var CustomWriteStream = /** @class */ (function () { CustomWriteStream.prototype._processWriteQueue = function () { var _this = this; this._writeImmediate = undefined; @@ -233,6 +250,19 @@ index 1ec12f796a822c78fba9ad7f6448c3987e325c23..d838d795ecb9ea72e3bcc31113344947 return; } var task = this._writeQueue[0]; +@@ -314,9 +343,9 @@ var CustomWriteStream = /** @class */ (function () { + fs.write(this._fd, task.buffer, task.offset, function (err, written) { + if (err) { + if ('code' in err && err.code === 'EAGAIN') { +- // `setImmediate` is used to yield to the event loop and re-attempt +- // the write later. +- _this._writeImmediate = setImmediate(function () { return _this._processWriteQueue(); }); ++ // Paced, not `setImmediate`: a stalled reader keeps this branch EAGAIN-ing, and an ++ // immediate re-attempt turns the retry into a busy-loop on the daemon thread. ++ _this._writeImmediate = setTimeout(function () { return _this._processWriteQueue(); }, EAGAIN_RETRY_DELAY_MS); + } + else { + // Stop processing immediately on unexpected error and log diff --git a/src/conpty_console_list_agent.ts b/src/conpty_console_list_agent.ts index 181ccabbbe9c4948a9725fb1db907a68e9de01fc..67f31facf85562b67adbfbd04ce28ddd8eeb4a79 100644 --- a/src/conpty_console_list_agent.ts @@ -602,6 +632,80 @@ index 7b4b9e1f990fbf95b51528bb56dc9717f5b87532..2ae787c5bd4f3eba470584dc658a01a5 } } #endif +diff --git a/src/unixTerminal.ts b/src/unixTerminal.ts +index 98733dc0cd752b554bd94e45904ca341ad141bba..3dd5ad9b3124dbd5ba7f76679b26650dad503ec6 100644 +--- a/src/unixTerminal.ts ++++ b/src/unixTerminal.ts +@@ -306,6 +306,14 @@ interface IWriteTask { + offset: number; + } + ++/** ++ * Orca: upstream retries EAGAIN with `setImmediate`, which re-attempts within microseconds ++ * and pins a core on the daemon thread when a reader stops draining. 1ms keeps ~97% of that ++ * CPU saving; longer delays cost 2-3x delivery time to a reader that drains in bursts (an ++ * agent). Re-measure both before changing. ++ */ ++const EAGAIN_RETRY_DELAY_MS = 1; ++ + /** + * A custom write stream that writes directly to a file descriptor with proper + * handling of backpressure and errors. This avoids some event loop exhaustion +@@ -314,20 +322,28 @@ interface IWriteTask { + class CustomWriteStream implements IDisposable { + + private readonly _writeQueue: IWriteTask[] = []; +- private _writeImmediate: NodeJS.Immediate | undefined; ++ private _writeImmediate: NodeJS.Timeout | undefined; + + constructor( +- private readonly _fd: number, ++ private _fd: number, + private readonly _encoding: BufferEncoding + ) { + } + + dispose(): void { +- clearImmediate(this._writeImmediate); ++ clearTimeout(this._writeImmediate); + this._writeImmediate = undefined; ++ // Orca: retire this stream's own copy of the master fd and drop what has ++ // not shipped, so nothing queued here reaches a reused descriptor. ++ this._fd = -1; ++ this._writeQueue.length = 0; + } + + write(data: string | Buffer): void { ++ if (this._fd < 0) { ++ return; ++ } ++ + // Writes are put in a queue and processed asynchronously in order to handle + // backpressure from the kernel buffer. + const buffer = typeof data === 'string' +@@ -345,7 +361,8 @@ class CustomWriteStream implements IDisposable { + private _processWriteQueue(): void { + this._writeImmediate = undefined; + +- if (this._writeQueue.length === 0) { ++ // Orca: an in-flight fs.write can re-enter here after dispose(). ++ if (this._fd < 0 || this._writeQueue.length === 0) { + return; + } + +@@ -357,9 +374,9 @@ class CustomWriteStream implements IDisposable { + fs.write(this._fd, task.buffer, task.offset, (err, written) => { + if (err) { + if ('code' in err && err.code === 'EAGAIN') { +- // `setImmediate` is used to yield to the event loop and re-attempt +- // the write later. +- this._writeImmediate = setImmediate(() => this._processWriteQueue()); ++ // Paced, not `setImmediate`: a stalled reader keeps this branch EAGAIN-ing, and an ++ // immediate re-attempt turns the retry into a busy-loop on the daemon thread. ++ this._writeImmediate = setTimeout(() => this._processWriteQueue(), EAGAIN_RETRY_DELAY_MS); + } else { + // Stop processing immediately on unexpected error and log + this._writeQueue.length = 0; diff --git a/src/win/conpty.cc b/src/win/conpty.cc index 7b286d3d644c26141df516929703aa6e129df4b2..4b06d18576c807c3d1181a7bd714140c6678cf86 100644 --- a/src/win/conpty.cc diff --git a/docs/assets/readme-downloads.svg b/docs/assets/readme-downloads.svg index 08237c15016..7a0586b8b1e 100644 --- a/docs/assets/readme-downloads.svg +++ b/docs/assets/readme-downloads.svg @@ -1,5 +1,5 @@ - - downloads: 51m + + downloads: 53m @@ -15,7 +15,7 @@ downloads downloads - 51m - 51m + 53m + 53m diff --git a/mobile/rpc-foundation/goldens/b1.json b/mobile/rpc-foundation/goldens/b1.json index 1e0a26e1893..6e3aee261b6 100644 --- a/mobile/rpc-foundation/goldens/b1.json +++ b/mobile/rpc-foundation/goldens/b1.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "23ffc912a432dcd3ff70be1903a8d518cf85634f27a2be6d21585963e338e7e3", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0d903486cbe8": { "name": "files.list#2", diff --git a/mobile/rpc-foundation/goldens/b2.json b/mobile/rpc-foundation/goldens/b2.json index b379fd05b0f..d53dc06a053 100644 --- a/mobile/rpc-foundation/goldens/b2.json +++ b/mobile/rpc-foundation/goldens/b2.json @@ -3,13 +3,14 @@ "family": "project-explicit-false", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b31992be2f91bd61fbe1b8a5400da3b7a56753564b0b0b2b38bc5d549812d693", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0c4dced3e005": { "error": "", diff --git a/mobile/rpc-foundation/goldens/b3.json b/mobile/rpc-foundation/goldens/b3.json index 42be10f7e07..8fa86acb2cf 100644 --- a/mobile/rpc-foundation/goldens/b3.json +++ b/mobile/rpc-foundation/goldens/b3.json @@ -3,13 +3,14 @@ "family": "linear-detail-barrier", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "130e493fcd7765e037405f59e6cc78a0cc1793b1ae092cad933ff9d5a9df8b7a", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "034a83431f03": { "name": "linear.getIssue#1", diff --git a/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json b/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json index f997f179ee1..7e06d275855 100644 --- a/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json +++ b/mobile/rpc-foundation/goldens/interruptions-inventory-lifecycle.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "d6c57a5153d915f0a0c0fd9e305cac70b41b7eb8be226fc865227ebf1821e5d1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "2837f481a843": { "name": "files.list#1", diff --git a/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json b/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json index 8588d3d73c3..bc632784698 100644 --- a/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json +++ b/mobile/rpc-foundation/goldens/interruptions-settings-bot-overrides-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2d5c6dea28aa1a7bb9e4aa14a4c8441527d9ad401ad30161f05ea1f8da836bb2", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06eff8247d02": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/inventory-lifecycle.json b/mobile/rpc-foundation/goldens/inventory-lifecycle.json index cbfc520def2..f794d497b8e 100644 --- a/mobile/rpc-foundation/goldens/inventory-lifecycle.json +++ b/mobile/rpc-foundation/goldens/inventory-lifecycle.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3471f5bcd6923c7b8ba3a737bb45b5239689deb78c00e85a828f38a6d6d68a05", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "2837f481a843": { "name": "files.list#1", diff --git a/mobile/rpc-foundation/goldens/inventory-repeat-query.json b/mobile/rpc-foundation/goldens/inventory-repeat-query.json index 3cd516d14c6..8c8a21feb45 100644 --- a/mobile/rpc-foundation/goldens/inventory-repeat-query.json +++ b/mobile/rpc-foundation/goldens/inventory-repeat-query.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "73a468d5c7a51c2dbb7af2642f0050d05d861fce29295460c48d7c51f86bf57f", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "003a57e2bf31": { "files": ["alpha.ts"] diff --git a/mobile/rpc-foundation/goldens/lifecycle-b3.json b/mobile/rpc-foundation/goldens/lifecycle-b3.json index d4ece9e9165..e847f82f811 100644 --- a/mobile/rpc-foundation/goldens/lifecycle-b3.json +++ b/mobile/rpc-foundation/goldens/lifecycle-b3.json @@ -3,13 +3,14 @@ "family": "linear-detail-barrier", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "8be12d116865d27e8dfd37921d2c723d63da101ec1197b1f5b2d9510838e1943", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "034a83431f03": { "name": "linear.getIssue#1", diff --git a/mobile/rpc-foundation/goldens/lifecycle-inventory-lifecycle.json b/mobile/rpc-foundation/goldens/lifecycle-inventory-lifecycle.json index 05b4799c653..55736257efd 100644 --- a/mobile/rpc-foundation/goldens/lifecycle-inventory-lifecycle.json +++ b/mobile/rpc-foundation/goldens/lifecycle-inventory-lifecycle.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "46bbafcc57fe2e3aee41a14bc26a0375b7b56e58030705fe4c28841a272b2560", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "2837f481a843": { "name": "files.list#1", diff --git a/mobile/rpc-foundation/goldens/lifecycle-settings-bot-overrides-fulfilled.json b/mobile/rpc-foundation/goldens/lifecycle-settings-bot-overrides-fulfilled.json index e158171f45a..e55ef1e8476 100644 --- a/mobile/rpc-foundation/goldens/lifecycle-settings-bot-overrides-fulfilled.json +++ b/mobile/rpc-foundation/goldens/lifecycle-settings-bot-overrides-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "eb80283956c93849778f23cbabf1dbf83b72744197af4f6f50335b2fc1590d87", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/lifecycle-settings-task-hydration-fulfilled.json b/mobile/rpc-foundation/goldens/lifecycle-settings-task-hydration-fulfilled.json index 1cbd5f00e29..ac6785a567e 100644 --- a/mobile/rpc-foundation/goldens/lifecycle-settings-task-hydration-fulfilled.json +++ b/mobile/rpc-foundation/goldens/lifecycle-settings-task-hydration-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3a8eab831602443d320ca0aa0f35dc269d8d511e76bdae8fd025c433561d068d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/lifecycle-settings-workspace-context-fulfilled.json b/mobile/rpc-foundation/goldens/lifecycle-settings-workspace-context-fulfilled.json index b7ab8a13598..7d9aff28b52 100644 --- a/mobile/rpc-foundation/goldens/lifecycle-settings-workspace-context-fulfilled.json +++ b/mobile/rpc-foundation/goldens/lifecycle-settings-workspace-context-fulfilled.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "136fb1d8d5925ad12ba22f4dd6c72573a9ad03b6a6ec8308668f0d9cd71aa36d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06425d8da2e6": { "name": "linear.status#2", diff --git a/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.baserefdefault-1.json b/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.baserefdefault-1.json index 7eb20ce8402..ba3eab1b2f6 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.baserefdefault-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.baserefdefault-1.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5605a2984d7692aa80e5e38f804bdfed4b1ce8ac2102def5dc728b1a79dc1acf", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0208d586a748": { "name": "repo.baseRefDefault#1", diff --git a/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.list-1.json b/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.list-1.json index b3c815527be..5f41233ede5 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-repo.list-1.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ed0e97ead1aad0b45bdfc48f5fe4e498810d0cfee88f07d3c6228db56fda1dd9", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "089d79f002a1": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-worktree.show-1.json b/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-worktree.show-1.json index 1e772a5f28a..41d913f3426 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-worktree.show-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.base-ref-chain-worktree.show-1.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "1db6919b94df3b8548838ff4c206fafa3a09ea096b17c04483f78f9321ccb1ba", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "089d79f002a1": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/matrix-git.commit-message-ai-git.generatecommitmessage-1.json b/mobile/rpc-foundation/goldens/matrix-git.commit-message-ai-git.generatecommitmessage-1.json index e6d8bcf5bd5..fe43bc5d401 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.commit-message-ai-git.generatecommitmessage-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.commit-message-ai-git.generatecommitmessage-1.json @@ -3,13 +3,14 @@ "family": "git.commit-message-ai", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "22ea5279155ecf749aaab521ffd570221ac3169b177fc1daf85ef93a49d38260", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "125fbea5f50a": { "name": "git.generateCommitMessage#1", diff --git a/mobile/rpc-foundation/goldens/matrix-git.history-read-git.history-1.json b/mobile/rpc-foundation/goldens/matrix-git.history-read-git.history-1.json index 829090d2a8e..529df6444b3 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.history-read-git.history-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.history-read-git.history-1.json @@ -3,13 +3,14 @@ "family": "git.history-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "86254ed87ad3427d6ee4631d7348075039ba2d4d7496d59f27f03f78580f35a1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "155f61ed496f": { "status": "rejected", diff --git a/mobile/rpc-foundation/goldens/matrix-git.remote-prerequisite-git.push-1.json b/mobile/rpc-foundation/goldens/matrix-git.remote-prerequisite-git.push-1.json index ecf44b15709..bf6290b001a 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.remote-prerequisite-git.push-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.remote-prerequisite-git.push-1.json @@ -3,13 +3,14 @@ "family": "git.remote-prerequisite", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5009c22df7e74a850bcea41fc110ea7d7eb4bdada623837279f32eaa5149a9b8", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "00e8a3bac22f": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/matrix-git.review-preparation-git.status-1.json b/mobile/rpc-foundation/goldens/matrix-git.review-preparation-git.status-1.json index 999ad75768f..b584a8ea2f1 100644 --- a/mobile/rpc-foundation/goldens/matrix-git.review-preparation-git.status-1.json +++ b/mobile/rpc-foundation/goldens/matrix-git.review-preparation-git.status-1.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "485b2751006ee8fb4df28b228ea7adda85779feae83974eb0f7e795e31c500a1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-git.push-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-git.push-1.json index 24dad2ff410..f216ef38c7e 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-git.push-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-git.push-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "fcf5cdc7388457156dd81fe28a470f42fbabac7435ec5572cb19e209f410ca84", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06a94a810e5f": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-hostedreview.create-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-hostedreview.create-1.json index b56a4585c45..da6223966d8 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-hostedreview.create-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-hostedreview.create-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "26e666a57805f354602a5b3906a691b10c8d6db66c77acc96c67153279c515a7", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06a94a810e5f": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-worktree.set-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-worktree.set-1.json index b32aface165..46096225d3e 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-worktree.set-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-chain-worktree.set-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "08c25b6cb5bc12a7f67e858f229d15cf66b98b2ad4601b11f18c4c03f4a59669", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "03696d515352": { "name": "worktree.set#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.bulkstage-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.bulkstage-1.json index 2c32a21683d..f78da080d66 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.bulkstage-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.bulkstage-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ff9d1bfd6337607f3d3e8162692b589ecea4a32ae01b5ebb3c602f8f0a55642c", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02652fe244f8": { "name": "git.bulkStage#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.commit-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.commit-1.json index ad5c21d71cb..58bb6579d1d 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.commit-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.commit-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "efeb9b248aeb98fac71c043d50afe0036cf804d3c11edfccd4e050fe8f3d8f9b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", @@ -536,60 +537,6 @@ "name": "git.bulkStage#1", "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"git.bulkStage\",\"params\":{\"worktree\":\"id:repo42::/p\",\"filePaths\":[\"src/new.ts\"]}}" }, - "33282210f096": { - "outcome": { - "commitMessage": "feat: recorded", - "committed": false, - "error": { - "message": "inner refused" - }, - "ok": false, - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [ - { - "added": { - "$rpc": "undefined" - }, - "area": "staged", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/app.ts", - "removed": { - "$rpc": "undefined" - }, - "status": "modified" - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - } - } - }, "368b0b9ce80a": { "name": "progress", "value": "staging" @@ -1322,63 +1269,6 @@ } } }, - "85e126c40505": { - "status": "fulfilled", - "startedAt": 0, - "settledAt": 0, - "value": { - "commitMessage": "feat: recorded", - "committed": false, - "error": { - "message": "inner refused" - }, - "ok": false, - "status": { - "branch": "feature", - "conflictOperation": "unknown", - "entries": [ - { - "added": { - "$rpc": "undefined" - }, - "area": "staged", - "conflictKind": { - "$rpc": "undefined" - }, - "conflictStatus": { - "$rpc": "undefined" - }, - "conflictStatusSource": { - "$rpc": "undefined" - }, - "oldPath": { - "$rpc": "undefined" - }, - "path": "src/app.ts", - "removed": { - "$rpc": "undefined" - }, - "status": "modified" - } - ], - "head": "abc1234", - "upstreamStatus": { - "ahead": 1, - "behind": 0, - "behindCommitsArePatchEquivalent": { - "$rpc": "undefined" - }, - "hasConfiguredPushTarget": { - "$rpc": "undefined" - }, - "hasUpstream": true, - "upstreamName": { - "$rpc": "undefined" - } - } - } - } - }, "8b784bb9dff5": { "status": "fulfilled", "startedAt": 0, @@ -2691,9 +2581,9 @@ "2af3debae21a" ], "settlements": { - "run": "85e126c40505" + "run": "2e35579e2fc7" }, - "state": "33282210f096", + "state": "2c921c059023", "effects": ["368b0b9ce80a", "6a5c9570c542", "7778d4c43a58"] } }, @@ -2715,9 +2605,9 @@ "2af3debae21a" ], "settlements": { - "run": "85e126c40505" + "run": "2e35579e2fc7" }, - "state": "33282210f096", + "state": "2c921c059023", "effects": ["368b0b9ce80a", "6a5c9570c542", "7778d4c43a58"] } }, @@ -2739,9 +2629,9 @@ "2af3debae21a" ], "settlements": { - "run": "85e126c40505" + "run": "2e35579e2fc7" }, - "state": "33282210f096", + "state": "2c921c059023", "effects": ["368b0b9ce80a", "6a5c9570c542", "7778d4c43a58"] } }, @@ -2763,9 +2653,9 @@ "2af3debae21a" ], "settlements": { - "run": "85e126c40505" + "run": "2e35579e2fc7" }, - "state": "33282210f096", + "state": "2c921c059023", "effects": ["368b0b9ce80a", "6a5c9570c542", "7778d4c43a58"] } }, diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.generatecommitmessage-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.generatecommitmessage-1.json index fcd22440108..10d47a76df4 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.generatecommitmessage-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.generatecommitmessage-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "7b0d9ddcb8df83fc4e465aa6b0dcf05aa0d8f266cd4bb8651969cb8321bcf549", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.push-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.push-1.json index 25a7e8e32ab..956e07af5bc 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.push-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.push-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "72c1f08739db1c0dfcd48adffaca582a3596116c1c377f95f7dab8b08b7e6cdc", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-1.json index 8a96a264a4f..5853244f4c4 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "1f002f900c1a3c92e8f7c72261579ee5015ec1529c003a1b32bcf3eaf98b672d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0179846b4707": { "name": "git.status#2", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-2.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-2.json index e3c9d795e92..6f62bbf402f 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-2.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-2.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3a6487a07457e0e5aa6fc3fccfa43687acfb06d94334e621081728de937e4e8d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "006d7b20ed48": { "name": "git.status#2", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-3.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-3.json index 87be6209cf9..fcd4af54182 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-3.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-3.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "7355c45a707fa8a31f0999c4805a5b1dace4c65b727e711231f784b2f92c05ff", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "01bc4ad46170": { "outcome": { diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-4.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-4.json index a9c8b83b1b9..b9208854e45 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-4.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-git.status-4.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "45cda6757b76399d282d4b07992dab21bbb8236faadedba5e92eab8818e886bf", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "01bc4ad46170": { "outcome": { diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.create-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.create-1.json index 5051fd51ac1..cf2c57ed343 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.create-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.create-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "0ca08d5e70e1780a6ee5c919491dcddb062a22623f803e9960a329825f274cbe", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "000efa3053f3": { "outcome": { diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-1.json index f85869dbf43..07de81c2d40 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "658eb7bbf63b3a4b38eca0b1733e523962b6b6943644d65aab6f5c7e62534d6a", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-2.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-2.json index 94560aaaf90..604d0e4e0b9 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-2.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-hostedreview.getcreationeligibility-2.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "75ba135731290bf734a5eef0b65f9ad8b7cac453c4e2006faac88a5da9dbe3a3", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-worktree.set-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-worktree.set-1.json index 034f30b9b0c..6a662ac9ef4 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-worktree.set-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.create-intent-worktree.set-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "beb1161b98ffde8c5f1128e843766a1da3182d195f1f0a9012e12e5318ae01bc", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-hostedreview.eligibility-hostedreview.getcreationeligibility-1.json b/mobile/rpc-foundation/goldens/matrix-hostedreview.eligibility-hostedreview.getcreationeligibility-1.json index ccd1bd2bd4f..5a1d7479587 100644 --- a/mobile/rpc-foundation/goldens/matrix-hostedreview.eligibility-hostedreview.getcreationeligibility-1.json +++ b/mobile/rpc-foundation/goldens/matrix-hostedreview.eligibility-hostedreview.getcreationeligibility-1.json @@ -3,13 +3,14 @@ "family": "hostedReview.eligibility", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "6c4de90e2617d204e82ca5e65eb17fc397acbcbb9dc0ec18594d2a7739e3528b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "099a55e691ed": { "name": "hostedReview.getCreationEligibility#1", diff --git a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-1.json b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-1.json index 030b834cd85..436aff9d0ca 100644 --- a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-1.json +++ b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-1.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4f6472fb7add960be9bcc8596a748264d7cb0755a782ebe9e85753ab1d1d5710", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "003a57e2bf31": { "files": ["alpha.ts"] diff --git a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-2.json b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-2.json index 0410d032a5a..c689669bdb2 100644 --- a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-2.json +++ b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-files.searchpaths-2.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "048c3ec55ec67d09d9b02e17822f1154adca577e57ffe6d3059102d552d2f759", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02a03f44e95f": { "name": "files.searchPaths#2", diff --git a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-fresh-inventory.json b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-fresh-inventory.json index 39d9f50a31a..6249c1cc7a6 100644 --- a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-fresh-inventory.json +++ b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-fresh-inventory.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ad458a3407e3f1303343b46a1308b43535abef2c9ed2f68db59157db5b91daa1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0d903486cbe8": { "name": "files.list#2", diff --git a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-old-inventory.json b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-old-inventory.json index 4ac40f4e7b5..5a283c73742 100644 --- a/mobile/rpc-foundation/goldens/matrix-legacy-inventory-old-inventory.json +++ b/mobile/rpc-foundation/goldens/matrix-legacy-inventory-old-inventory.json @@ -3,13 +3,14 @@ "family": "legacy-inventory", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "52742d894d0ea53db89729101664a393b10794d9c2d2fe7b40b020643a13af81", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0d903486cbe8": { "name": "files.list#2", diff --git a/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.getissue-1.json b/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.getissue-1.json index cb5e22b1f25..a9ba0073130 100644 --- a/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.getissue-1.json +++ b/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.getissue-1.json @@ -3,13 +3,14 @@ "family": "linear-detail-barrier", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "8e00afc85e5b82d75bedecea0c748a3c8658cfc8545650e755c03f51fdc932d6", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1696f2f90218": { "name": "detailError", diff --git a/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.issuecomments-1.json b/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.issuecomments-1.json index 66b7b237bca..967000e9bfc 100644 --- a/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.issuecomments-1.json +++ b/mobile/rpc-foundation/goldens/matrix-linear-detail-barrier-linear.issuecomments-1.json @@ -3,13 +3,14 @@ "family": "linear-detail-barrier", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "40289acce4a3542773f74681d255d67cfddadf6c42317928d6728f26a76f6cfb", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "034a83431f03": { "name": "linear.getIssue#1", diff --git a/mobile/rpc-foundation/goldens/matrix-project-explicit-false-github.project.updateissuebyslug-1.json b/mobile/rpc-foundation/goldens/matrix-project-explicit-false-github.project.updateissuebyslug-1.json index c51d82d7bb4..9b991b64f7d 100644 --- a/mobile/rpc-foundation/goldens/matrix-project-explicit-false-github.project.updateissuebyslug-1.json +++ b/mobile/rpc-foundation/goldens/matrix-project-explicit-false-github.project.updateissuebyslug-1.json @@ -3,13 +3,14 @@ "family": "project-explicit-false", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "926f0d8c37a33d465bf3a04f056600cfc9f1669b1eca7e968aa1a1f797a74c61", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "057a0b5a420b": { "name": "projectRowDetailError", diff --git a/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.activate-1.json b/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.activate-1.json index da5847f5874..8fafc9beff9 100644 --- a/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.activate-1.json +++ b/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.activate-1.json @@ -3,13 +3,14 @@ "family": "session.tab-reveal", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "73366226aeaec1581aeeb47219fc703917143cfd7f6a2eb01d7bd703a7c7612d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0f9f4df04699": { "name": "session.tabs.activate#1", diff --git a/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.list-1.json b/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.list-1.json index bf2bf6082aa..8b5cd2c1fab 100644 --- a/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-session.tab-reveal-session.tabs.list-1.json @@ -3,13 +3,14 @@ "family": "session.tab-reveal", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "c38f2bc5c9faca0774dfe202137877bada9deba165c5e9c955cbe67eae0cbdd9", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0f9f4df04699": { "name": "session.tabs.activate#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings-agent-read-preflight.detectremoteagents-1.json b/mobile/rpc-foundation/goldens/matrix-settings-agent-read-preflight.detectremoteagents-1.json index cdc97e82af9..7505109479a 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings-agent-read-preflight.detectremoteagents-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings-agent-read-preflight.detectremoteagents-1.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a0effc9a0be519ccd18c1b1abfc8b497cd3858b89ea8d345ac0f8bd6d195cf21", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "07d4c9b0eaf2": { "name": "preflight.detectRemoteAgents#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings-agent-read-repo.list-1.json b/mobile/rpc-foundation/goldens/matrix-settings-agent-read-repo.list-1.json index 0a187865dc5..dfde62ab602 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings-agent-read-repo.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings-agent-read-repo.list-1.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "c21b2e0e97fab86664f634cc99d77dd587df4af4d02e6286c8380e09844096b2", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06b63e0d9986": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings-agent-read-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings-agent-read-settings.get-1.json index effd65b83a9..e6f450c3d25 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings-agent-read-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings-agent-read-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "46c4e32a921612c736c8cf45ff72ed513431c917ed3dd03f289c0ba4c28d6adb", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings-best-effort-settings.update-1.json b/mobile/rpc-foundation/goldens/matrix-settings-best-effort-settings.update-1.json index 9197c37cd94..ee5fbf6c1e7 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings-best-effort-settings.update-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings-best-effort-settings.update-1.json @@ -3,13 +3,14 @@ "family": "settings-best-effort", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "cf671da175d50a4c2e1336f4e8338c24c4752db111e1eafd226bee6ff3582b1d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "178d4ef77ad7": { "name": "settings.update#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.bot-overrides-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.bot-overrides-settings.get-1.json index d6076f02626..9dfa1058b3f 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.bot-overrides-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.bot-overrides-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "01408cebcc193f8e30119381c8acf494fa5e29850fe010809deb330c2f9bcb36", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.home-providers-linear.status-1.json b/mobile/rpc-foundation/goldens/matrix-settings.home-providers-linear.status-1.json index 7e85d9235b2..b765e4a4eb9 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.home-providers-linear.status-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.home-providers-linear.status-1.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "19b445b39da98d28bcbcdab6f70e47ce208ca68f165e7b62c5fe9762eee67c8d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0e7c79cad23f": { "name": "linear.status#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.home-providers-preflight.check-1.json b/mobile/rpc-foundation/goldens/matrix-settings.home-providers-preflight.check-1.json index e6cfe226ed1..029719ef81e 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.home-providers-preflight.check-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.home-providers-preflight.check-1.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4953dd0de509ce620b9840d7f460e472dc74f54d53636694d12cba2e3bb51da8", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0dcc6f40d62e": { "name": "preflight.check#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.home-providers-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.home-providers-settings.get-1.json index 33f572a839d..9eb7464df6e 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.home-providers-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.home-providers-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "70f601caeaee957bd3b172fc0fc12e85d6e2d6bed7683c86869559c6c9f25834", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090d7111bcf7": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-host.platform-1.json b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-host.platform-1.json index c186d6125e7..b7ee4ec8711 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-host.platform-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-host.platform-1.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "687b109bd2bcc0c85b7c858d553e68e2fc4cb5b281d9f8b32836dbacc4bdc8f2", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-repo.list-1.json b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-repo.list-1.json index 8dfd2f51d2d..39027b3569d 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-repo.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-repo.list-1.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3199c745e22973b432b0a36c34bb0bdda994334a4a0cd7ad2daf8b172625ce8d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-settings.get-1.json index 4bce7998ce5..a12a8e3ec0e 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5e9c3ff57cf432b24a17ee046636b61b94116a687cfa506cd79dee464542b76b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-ssh.listtargetsummaries-1.json b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-ssh.listtargetsummaries-1.json index 89915146449..33488a5f028 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-ssh.listtargetsummaries-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.repo-metadata-ssh.listtargetsummaries-1.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a88061d3d1f03074b0ed2b663b523f1602362bc317ba614106f1f646d037d6e3", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-folderworkspace.list-1.json b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-folderworkspace.list-1.json index 2c8c593e51a..3c390724097 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-folderworkspace.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-folderworkspace.list-1.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "50ba7c7963cb494e4b3d484eb334977d21cc69018da57d75a7b6fd0c92860bd2", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "14a657727096": { "name": "worktree.ps#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-projectgroup.list-1.json b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-projectgroup.list-1.json index f53788ef9c8..d34f364bd50 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-projectgroup.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-projectgroup.list-1.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "8dfd4550b39f0cfcb9aaa72fab0631b11f9e776ed389b206b326359d7f4c2d6e", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "01bc8208ba89": { "name": "projectGroup.list#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-repo.list-1.json b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-repo.list-1.json index b1633d81741..61422bd128f 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-repo.list-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-repo.list-1.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "85dc526201f66409dd6a411c5e14615b82389791ec210efb9889078f5d580373", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0ae64c827aea": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-settings.get-1.json index 52f02304203..81cb1e44276 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "080e10ae774ef097082267da0c8b6d0ebacae582d57b04a189c123258d0e5131", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "14a657727096": { "name": "worktree.ps#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-worktree.ps-1.json b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-worktree.ps-1.json index a8b52f0aaec..a56126483d7 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-worktree.ps-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.resume-metadata-worktree.ps-1.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5988fa5ce0bf6b8585f7ec66918123ee086d5cdf1185a4eeff2e88904985064c", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0620c0819077": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-linear.status-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-linear.status-1.json index e1adbce9025..c99fdf77613 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-linear.status-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-linear.status-1.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f5033a7a3567cc9e016bf09ac8bcd8ff381c3054c041dbccc773f7011918bf1d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-preflight.check-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-preflight.check-1.json index f1a5a0b5513..33d8f68499e 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-preflight.check-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-preflight.check-1.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "0931b3d35868e5452cb550962f2408b6ce7cd6c89e90a9cf2897425edbb4b42d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-settings.get-1.json index 1712f46acdd..f906996b6b9 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "d0f8d9bfe0e1469af3b0dab8b5c9799d91cc2234e72f0e031d6872059654077d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-status.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-status.get-1.json index 1f50266e65c..287f8acd339 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-status.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-status.get-1.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3f448feff463b59c3927dae020ecd8d4931bb4a6036df6d6af080de2ec5fcf2b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-ui.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-ui.get-1.json index 8cf20f5f9ad..a889d4ef078 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-ui.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-hydration-ui.get-1.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4438f9fd62876333bb980157612aaf457c5a9b9115659c8c941c3b373ad071dd", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-create-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-create-settings.get-1.json new file mode 100644 index 00000000000..979228bca1f --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-create-settings.get-1.json @@ -0,0 +1,860 @@ +{ + "operation": "settings.task-workspace-create", + "family": "settings.task-workspace-create", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "7e4c5bb29e0f630cda8a09233575b9295e485f3d3e315ebdc0458c69515fcfc7", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "067cef118d9f": { + "name": "runtimeTaskSettings", + "value": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "090c88478661": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "0f72e7ee78c9": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "worktree": { + "displayName": "ORC-1 Recorded issue", + "id": "wt-1" + } + } + } + } + }, + "0fc3e204e7ba": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "127ad2bdc042": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "180125f5d1a6": { + "name": "workspaceCreateDraft", + "value": { + "$rpc": "null" + } + }, + "2473f12c7cdd": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + } + } + } + }, + "2b3aa0da0852": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "33e3b949d4c5": { + "creating": { + "$rpc": "null" + }, + "error": "", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "3405a06dce84": { + "name": "error", + "value": "Selected agent is disabled. Choose an enabled agent before creating." + }, + "3f453dd79b03": { + "name": "workspaceAgent", + "value": "codex" + }, + "6a98511b6371": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "6eb4e79ad99a": { + "name": "setupPrompt", + "value": { + "$rpc": "null" + } + }, + "730f92993963": { + "name": "creatingKey", + "value": "linear:1" + }, + "7abdfe20af50": { + "creating": "linear:1", + "error": "", + "settings": { + "disabledTuiAgents": ["claude"] + } + }, + "7ddcb1852b39": { + "name": "settings.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" + }, + "7ee99993a895": { + "name": "navigation", + "value": "/h/host-1/session/wt-1?name=ORC-1+Recorded+issue&created=1" + }, + "82cd71d524c8": { + "name": "error", + "value": "" + }, + "8b77098df0c3": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "8f8296303a77": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "ac9996319e05": { + "name": "actionItem", + "value": { + "$rpc": "null" + } + }, + "adec34c2065c": { + "creating": { + "$rpc": "null" + }, + "error": "", + "settings": {} + }, + "b759ab27e4dd": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "baa74a0ec378": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"orc-1\",\"displayName\":\"ORC-1 Recorded issue\",\"displayNameKind\":\"generated\",\"linkedLinearIssue\":\"ORC-1\",\"setupDecision\":\"inherit\",\"activate\":true,\"startupDraft\":\"https://linear.app/orca/issue/ORC-1\",\"createdWithAgent\":\"claude\"}}" + }, + "c9cb32059b8d": { + "name": "creatingKey", + "value": { + "$rpc": "null" + } + }, + "d27ce798af34": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "d5df3f6b123a": { + "creating": { + "$rpc": "null" + }, + "error": "Selected agent is disabled. Choose an enabled agent before creating.", + "settings": { + "disabledTuiAgents": ["claude"] + } + }, + "dae7907f03cc": { + "name": "runtimeTaskSettings", + "value": {} + }, + "e0cf1af55a54": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "e1bd8b4a5d70": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "f84a8688af61": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection closed", + "isRpcDeliveryUnknown": true + } + } + } + }, + "recording": { + "scenario": "matrix-settings.task-workspace-create-settings.get-1", + "checkpoints": [ + { + "id": "settings-task-workspace-create-linear.prelude:settings-pending", + "observation": { + "sender": ["090c88478661"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "9270aeb7d9c6" + }, + "state": "7abdfe20af50", + "effects": ["730f92993963", "82cd71d524c8"] + } + }, + { + "id": "settings-task-workspace-create-linear.prelude:cleanup", + "observation": { + "sender": ["f84a8688af61"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "7abdfe20af50", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.normal:created", + "observation": { + "sender": ["2473f12c7cdd", "0f72e7ee78c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "33e3b949d4c5", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "7ee99993a895", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.result-absent:created", + "observation": { + "sender": ["e0cf1af55a54"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.result-null:created", + "observation": { + "sender": ["e1bd8b4a5d70"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.inner-ok-missing:created", + "observation": { + "sender": ["0fc3e204e7ba", "0f72e7ee78c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "adec34c2065c", + "effects": [ + "730f92993963", + "82cd71d524c8", + "dae7907f03cc", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "7ee99993a895", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.inner-false-string-error:created", + "observation": { + "sender": ["d27ce798af34", "0f72e7ee78c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "adec34c2065c", + "effects": [ + "730f92993963", + "82cd71d524c8", + "dae7907f03cc", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "7ee99993a895", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.inner-false-object-error:created", + "observation": { + "sender": ["127ad2bdc042", "0f72e7ee78c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "adec34c2065c", + "effects": [ + "730f92993963", + "82cd71d524c8", + "dae7907f03cc", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "7ee99993a895", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.outer-refused:created", + "observation": { + "sender": ["8f8296303a77"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.outer-refused-no-message:created", + "observation": { + "sender": ["6a98511b6371"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.method-not-found:created", + "observation": { + "sender": ["b759ab27e4dd"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.transport-rejection:created", + "observation": { + "sender": ["8b77098df0c3"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.transport-rejection-no-message:created", + "observation": { + "sender": ["2b3aa0da0852"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "d5df3f6b123a", + "effects": [ + "730f92993963", + "82cd71d524c8", + "3f453dd79b03", + "ea709e13f0f0", + "3405a06dce84", + "c9cb32059b8d" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-create-worktree.create-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-create-worktree.create-1.json new file mode 100644 index 00000000000..1ccd90e4c6e --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-create-worktree.create-1.json @@ -0,0 +1,1010 @@ +{ + "operation": "settings.task-workspace-create", + "family": "settings.task-workspace-create", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "1d7713cf4c23d053105c2abb02340d81d5eb689f4311a0984932d8ebd031b4ce", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "067cef118d9f": { + "name": "runtimeTaskSettings", + "value": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "090c88478661": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "0ca3bb7ac195": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "0f72e7ee78c9": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "worktree": { + "displayName": "ORC-1 Recorded issue", + "id": "wt-1" + } + } + } + } + }, + "12b9d0436b8a": { + "name": "error", + "value": "Cannot read properties of undefined (reading 'displayName')" + }, + "180125f5d1a6": { + "name": "workspaceCreateDraft", + "value": { + "$rpc": "null" + } + }, + "186f44bc465a": { + "name": "error", + "value": "Unknown method" + }, + "1bb065c2a768": { + "creating": { + "$rpc": "null" + }, + "error": "Unknown method", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "2473f12c7cdd": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + } + } + } + }, + "2e80de97dd3b": { + "name": "error", + "value": "Cannot read properties of null (reading 'worktree')" + }, + "2f13b6f74cc6": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "2fac0da15fae": { + "creating": { + "$rpc": "null" + }, + "error": "transport failure", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "31738898988e": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "33e3b949d4c5": { + "creating": { + "$rpc": "null" + }, + "error": "", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "37345621a939": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "5b8e61be1638": { + "name": "error", + "value": "Cannot read properties of undefined (reading 'worktree')" + }, + "67b44e804cc9": { + "creating": { + "$rpc": "null" + }, + "error": "Cannot read properties of null (reading 'worktree')", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "6eb4e79ad99a": { + "name": "setupPrompt", + "value": { + "$rpc": "null" + } + }, + "730f92993963": { + "name": "creatingKey", + "value": "linear:1" + }, + "7abdfe20af50": { + "creating": "linear:1", + "error": "", + "settings": { + "disabledTuiAgents": ["claude"] + } + }, + "7b27297e7f2d": { + "creating": { + "$rpc": "null" + }, + "error": "outer refused", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "7ddcb1852b39": { + "name": "settings.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" + }, + "7ee99993a895": { + "name": "navigation", + "value": "/h/host-1/session/wt-1?name=ORC-1+Recorded+issue&created=1" + }, + "82cd71d524c8": { + "name": "error", + "value": "" + }, + "841ba02855c9": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "89456eae5a16": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "945ea389c1ef": { + "name": "error", + "value": "transport failure" + }, + "97348f3fe285": { + "creating": { + "$rpc": "null" + }, + "error": "Cannot read properties of undefined (reading 'worktree')", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "97dc8fc98386": { + "creating": { + "$rpc": "null" + }, + "error": "Cannot read properties of undefined (reading 'displayName')", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "9f82f10075a3": { + "name": "error", + "value": "Connection closed" + }, + "ac9996319e05": { + "name": "actionItem", + "value": { + "$rpc": "null" + } + }, + "adfc4e9a82be": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "ba65a7abe43b": { + "name": "error", + "value": "outer refused" + }, + "baa74a0ec378": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"orc-1\",\"displayName\":\"ORC-1 Recorded issue\",\"displayNameKind\":\"generated\",\"linkedLinearIssue\":\"ORC-1\",\"setupDecision\":\"inherit\",\"activate\":true,\"startupDraft\":\"https://linear.app/orca/issue/ORC-1\",\"createdWithAgent\":\"claude\"}}" + }, + "c7d9517809c8": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "c9cb32059b8d": { + "name": "creatingKey", + "value": { + "$rpc": "null" + } + }, + "eb44ca9ac41f": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection closed", + "isRpcDeliveryUnknown": true + } + } + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "eecc0c1b6490": { + "creating": "linear:1", + "error": "", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "f73b6faeedba": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "ff28e2c78e1b": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + } + }, + "recording": { + "scenario": "matrix-settings.task-workspace-create-worktree.create-1", + "checkpoints": [ + { + "id": "settings-task-workspace-create-linear.prelude:settings-pending", + "observation": { + "sender": ["090c88478661"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "9270aeb7d9c6" + }, + "state": "7abdfe20af50", + "effects": ["730f92993963", "82cd71d524c8"] + } + }, + { + "id": "settings-task-workspace-create-linear.prelude:cleanup", + "observation": { + "sender": ["2473f12c7cdd", "eb44ca9ac41f"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "eecc0c1b6490", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "9f82f10075a3", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.normal:created", + "observation": { + "sender": ["2473f12c7cdd", "0f72e7ee78c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "33e3b949d4c5", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "7ee99993a895", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.result-absent:created", + "observation": { + "sender": ["2473f12c7cdd", "841ba02855c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "97348f3fe285", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "5b8e61be1638", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.result-null:created", + "observation": { + "sender": ["2473f12c7cdd", "0ca3bb7ac195"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "67b44e804cc9", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "2e80de97dd3b", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.inner-ok-missing:created", + "observation": { + "sender": ["2473f12c7cdd", "ff28e2c78e1b"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "97dc8fc98386", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "12b9d0436b8a", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.inner-false-string-error:created", + "observation": { + "sender": ["2473f12c7cdd", "89456eae5a16"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "97dc8fc98386", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "12b9d0436b8a", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.inner-false-object-error:created", + "observation": { + "sender": ["2473f12c7cdd", "f73b6faeedba"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "97dc8fc98386", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "12b9d0436b8a", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.outer-refused:created", + "observation": { + "sender": ["2473f12c7cdd", "c7d9517809c8"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "7b27297e7f2d", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ba65a7abe43b", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.outer-refused-no-message:created", + "observation": { + "sender": ["2473f12c7cdd", "2f13b6f74cc6"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "33e3b949d4c5", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "82cd71d524c8", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.method-not-found:created", + "observation": { + "sender": ["2473f12c7cdd", "adfc4e9a82be"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "1bb065c2a768", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "186f44bc465a", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.transport-rejection:created", + "observation": { + "sender": ["2473f12c7cdd", "31738898988e"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "2fac0da15fae", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "945ea389c1ef", + "c9cb32059b8d" + ] + } + }, + { + "id": "settings-task-workspace-create-linear.transport-rejection-no-message:created", + "observation": { + "sender": ["2473f12c7cdd", "37345621a939"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "33e3b949d4c5", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "82cd71d524c8", + "c9cb32059b8d" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-settings.get-1.json index 148c70b1147..acd992a7643 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.task-workspace-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.task-workspace", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "994ea8b4ddb05774a8c2d5902bb68bf5e8f25399a787262b8f23f458f2790698", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-linear.status-1.json b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-linear.status-1.json index 18e7e37627b..362a218cdad 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-linear.status-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-linear.status-1.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "30b3f8d79589e9fb3d7ef804233554fa231f68ab88e5130ddfa78e79221e3c78", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-preflight.check-1.json b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-preflight.check-1.json index 78f6745beed..45564a167e7 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-preflight.check-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-preflight.check-1.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a5366cbd31d899feeb7e1901edd0c78191c2c8c8179ad5d5b24b7ca22bd538f8", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02eac6141a1f": { "name": "preflight.check#1", diff --git a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-settings.get-1.json index 9322f1ad6a7..e26dc16d6ad 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-settings.get-1.json @@ -1,24 +1,17 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "797ea410af6536410335ebe93b8bc354cd633cf980eb95efbb10bc46f5516cb7", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { - "045f11564884": { - "name": "unhandled-rejection", - "value": { - "category": "TypeError", - "isRpcDeliveryUnknown": false, - "message": "Cannot read properties of null (reading 'settings')" - } - }, "090c88478661": { "name": "settings.get#1", "args": [ @@ -293,14 +286,6 @@ } } }, - "4fdb20ad5654": { - "name": "unhandled-rejection", - "value": { - "category": "TypeError", - "isRpcDeliveryUnknown": false, - "message": "Cannot read properties of undefined (reading 'settings')" - } - }, "563e4c82b345": { "name": "preflight.check#1", "args": [ @@ -682,8 +667,8 @@ "settlements": { "mount": "eb79a9b3682a" }, - "state": "f6a09f8c5b85", - "effects": ["4fdb20ad5654"] + "state": "3a834cb85dd8", + "effects": [] } }, { @@ -694,8 +679,8 @@ "settlements": { "mount": "eb79a9b3682a" }, - "state": "f6a09f8c5b85", - "effects": ["045f11564884"] + "state": "3a834cb85dd8", + "effects": [] } }, { diff --git a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-ui.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-ui.get-1.json index 3f2e02be3fc..94da15df846 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-ui.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.workspace-context-ui.get-1.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3cd29e7b6a1cdfd99796a58cf6ad6f9aa3dbac75dd6e989ea99ba6027c210028", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0039f2221403": { "name": "ui.get#1", @@ -97,14 +98,6 @@ } } }, - "0d56880d8286": { - "name": "unhandled-rejection", - "value": { - "category": "TypeError", - "isRpcDeliveryUnknown": false, - "message": "Cannot read properties of undefined (reading 'ui')" - } - }, "0fb6ff3590e2": { "name": "preflight.check#1", "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.check\"}" @@ -377,14 +370,6 @@ } } }, - "78b8435a485f": { - "name": "unhandled-rejection", - "value": { - "category": "TypeError", - "isRpcDeliveryUnknown": false, - "message": "Cannot read properties of null (reading 'ui')" - } - }, "822040616fbb": { "name": "settings.get#1", "args": [ @@ -461,17 +446,6 @@ } } }, - "8a63b85fee0c": { - "providers": [], - "settings": { - "defaultTuiAgent": "codex", - "disabledTuiAgents": ["claude"], - "hostSettingOverrides": {}, - "prBotAuthorOverrides": ["bot-user"], - "visibleTaskProviders": ["github", "linear"] - }, - "trust": {} - }, "8be416d0b1ef": { "name": "ui.get#1", "args": [ @@ -686,8 +660,8 @@ "settlements": { "mount": "eb79a9b3682a" }, - "state": "8a63b85fee0c", - "effects": ["0d56880d8286"] + "state": "2a7485a88169", + "effects": [] } }, { @@ -698,8 +672,8 @@ "settlements": { "mount": "eb79a9b3682a" }, - "state": "8a63b85fee0c", - "effects": ["78b8435a485f"] + "state": "2a7485a88169", + "effects": [] } }, { diff --git a/mobile/rpc-foundation/goldens/matrix-settings.workspace-submit-settings.get-1.json b/mobile/rpc-foundation/goldens/matrix-settings.workspace-submit-settings.get-1.json index faadddb002e..170d452ac51 100644 --- a/mobile/rpc-foundation/goldens/matrix-settings.workspace-submit-settings.get-1.json +++ b/mobile/rpc-foundation/goldens/matrix-settings.workspace-submit-settings.get-1.json @@ -3,13 +3,14 @@ "family": "settings.workspace-submit", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a89bdf93df71a958810aba72c80e42f663644781a29e934898e2ddf86c5dd5d5", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.reposlug-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.reposlug-1.json new file mode 100644 index 00000000000..e408bae4119 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.reposlug-1.json @@ -0,0 +1,1081 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "749f877ac0c08860f74fc56e34b07f51960dda5bd1fdcf9df847b5200bf67779", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "09b235c17bb0": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "0e9d6525a582": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "11ab96fde6c9": { + "name": "gitlab.workItemByPath#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemByPath\",\"params\":{\"repo\":\"id:repo-1\",\"host\":\"gitlab.com\",\"path\":\"group/project\",\"iid\":7,\"type\":\"issue\"}}" + }, + "135faf86ace7": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "error": "inner refused", + "ok": false + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "1c3567f57943": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true + } + } + }, + "2113a0cc7708": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "285ceb964a96": { + "name": "github.repoSlug#2", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-2" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "398515139d34": { + "name": "github.repoSlug#2", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-2\"}}" + }, + "46e234697d93": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'toLowerCase')", + "isRpcDeliveryUnknown": false + } + }, + "4a3429622287": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "4eec4620374a": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "error": { + "message": "inner refused" + }, + "ok": false + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "5248ebd8f08a": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "65342779da15": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + }, + "6662fbe6a28e": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-4", + "ok": false + } + } + }, + "731507dd2e23": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + } + }, + "7445a582a9c8": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "owner": "owner", + "repo": "repo" + } + } + } + }, + "8f410b944069": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-4", + "ok": false + } + } + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "9e6675f5d017": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "a091594f56e6": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "$rpc": "null" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "a3d7eef0da8a": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-4", + "ok": false + } + } + }, + "a45a7dd68af6": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "aaad292bbd1b": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "aaf80675fc49": { + "name": "github.workItem#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItem\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12}}" + }, + "b303200fec39": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "bd533f6b0b40": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "cded841b4a1b": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "d48fa181d583": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "error": "refused" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "e1f537905a65": { + "name": "github.workItemByOwnerRepo#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemByOwnerRepo\",\"params\":{\"repo\":\"id:repo-1\",\"owner\":\"owner\",\"ownerRepo\":\"repo\",\"number\":12,\"type\":\"issue\"}}" + }, + "e29333b1693f": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "iid": 7, + "title": "seven" + } + } + } + }, + "e2af62b90b0b": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "$rpc": "null" + } + ], + [ + "repo-2", + { + "$rpc": "null" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "$rpc": "null" + } + }, + "e970eb27f5ca": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "ee20a1dc39e7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "null" + } + }, + "f0486ebd441c": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "f9ea1f747023": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.paste-lookup-github.reposlug-1", + "checkpoints": [ + { + "id": "tw-paste-lookup-resolved.prelude:by-number", + "observation": { + "sender": ["65342779da15"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "731507dd2e23" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.prelude:by-slug", + "observation": { + "sender": ["65342779da15", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.prelude:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "4a3429622287", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "2113a0cc7708", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:repo-slug-matched", + "observation": { + "sender": [ + "65342779da15", + "f9ea1f747023", + "e29333b1693f", + "1c3567f57943", + "285ceb964a96" + ], + "payloads": [ + "aaf80675fc49", + "e1f537905a65", + "11ab96fde6c9", + "a45a7dd68af6", + "398515139d34" + ], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "9270aeb7d9c6" + }, + "state": "a091594f56e6", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:repo-slug-matched", + "observation": { + "sender": [ + "65342779da15", + "f9ea1f747023", + "e29333b1693f", + "aaad292bbd1b", + "285ceb964a96" + ], + "payloads": [ + "aaf80675fc49", + "e1f537905a65", + "11ab96fde6c9", + "a45a7dd68af6", + "398515139d34" + ], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "9270aeb7d9c6" + }, + "state": "a091594f56e6", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "f0486ebd441c"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "46e234697d93" + }, + "state": "d48fa181d583", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "9e6675f5d017"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "46e234697d93" + }, + "state": "135faf86ace7", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "cded841b4a1b"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "46e234697d93" + }, + "state": "4eec4620374a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:repo-slug-matched", + "observation": { + "sender": [ + "65342779da15", + "f9ea1f747023", + "e29333b1693f", + "a3d7eef0da8a", + "285ceb964a96" + ], + "payloads": [ + "aaf80675fc49", + "e1f537905a65", + "11ab96fde6c9", + "a45a7dd68af6", + "398515139d34" + ], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "9270aeb7d9c6" + }, + "state": "a091594f56e6", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:repo-slug-matched", + "observation": { + "sender": [ + "65342779da15", + "f9ea1f747023", + "e29333b1693f", + "8f410b944069", + "285ceb964a96" + ], + "payloads": [ + "aaf80675fc49", + "e1f537905a65", + "11ab96fde6c9", + "a45a7dd68af6", + "398515139d34" + ], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "9270aeb7d9c6" + }, + "state": "a091594f56e6", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "6662fbe6a28e"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "ee20a1dc39e7" + }, + "state": "e2af62b90b0b", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:repo-slug-matched", + "observation": { + "sender": [ + "65342779da15", + "f9ea1f747023", + "e29333b1693f", + "5248ebd8f08a", + "285ceb964a96" + ], + "payloads": [ + "aaf80675fc49", + "e1f537905a65", + "11ab96fde6c9", + "a45a7dd68af6", + "398515139d34" + ], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "9270aeb7d9c6" + }, + "state": "a091594f56e6", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:repo-slug-matched", + "observation": { + "sender": [ + "65342779da15", + "f9ea1f747023", + "e29333b1693f", + "b303200fec39", + "285ceb964a96" + ], + "payloads": [ + "aaf80675fc49", + "e1f537905a65", + "11ab96fde6c9", + "a45a7dd68af6", + "398515139d34" + ], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "9270aeb7d9c6" + }, + "state": "a091594f56e6", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.workitem-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.workitem-1.json new file mode 100644 index 00000000000..4993b35565a --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.workitem-1.json @@ -0,0 +1,1645 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2a11156b7b6d3cf0773c8dc02a72e126bc187dcf62ad7d1bf5f30d7b27192b03", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "06c63d693b0e": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "09b235c17bb0": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "0e9d6525a582": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "11ab96fde6c9": { + "name": "gitlab.workItemByPath#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemByPath\",\"params\":{\"repo\":\"id:repo-1\",\"host\":\"gitlab.com\",\"path\":\"group/project\",\"iid\":7,\"type\":\"issue\"}}" + }, + "19bc74accf11": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "1e7d56be018c": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "2113a0cc7708": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "21981303c684": { + "by-number": { + "$rpc": "null" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "38e35cd6299a": { + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "3bae2da7492a": { + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "3c03bbd195d8": { + "by-number": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "3e4f8a2833ba": { + "by-number": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "4267f9cc3919": { + "by-number": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "46daeacd502c": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "refused", + "repoId": "repo-1" + } + }, + "4a3429622287": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "5827c760c69a": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "5b601868bb59": { + "by-number": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "65342779da15": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + }, + "731507dd2e23": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + } + }, + "73fe68f6a6fc": { + "by-number": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "cache": [] + }, + "7445a582a9c8": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "owner": "owner", + "repo": "repo" + } + } + } + }, + "870d10fe8de9": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "894b40a0b814": { + "by-number": { + "$rpc": "null" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "896610e0c4e7": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "8aa944d2f7a1": { + "cache": [] + }, + "8f8ff0f7d554": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "90de73e52a3d": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "9dcdd903c10f": { + "by-number": { + "error": "refused", + "repoId": "repo-1" + }, + "cache": [] + }, + "9e9f15f7df58": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + } + }, + "a45a7dd68af6": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "a7f4472cdb70": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "aaf80675fc49": { + "name": "github.workItem#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItem\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12}}" + }, + "ad658847a638": { + "by-number": { + "error": "refused", + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "b19c59c5ee88": { + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "b70f6ec811e0": { + "by-number": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "bd533f6b0b40": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "c392cc9aa63a": { + "by-number": { + "$rpc": "null" + }, + "cache": [] + }, + "c57df09a398c": { + "by-number": { + "error": "refused", + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "c6646b64fc57": { + "by-number": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "cache": [] + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "c9a1abec42e3": { + "by-number": { + "$rpc": "null" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "d0150efe4124": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "d65cceb204a7": { + "by-number": { + "error": "refused", + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "de772915aa03": { + "by-number": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "e1f537905a65": { + "name": "github.workItemByOwnerRepo#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemByOwnerRepo\",\"params\":{\"repo\":\"id:repo-1\",\"owner\":\"owner\",\"ownerRepo\":\"repo\",\"number\":12,\"type\":\"issue\"}}" + }, + "e29333b1693f": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "iid": 7, + "title": "seven" + } + } + } + }, + "e970eb27f5ca": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "ee20a1dc39e7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "null" + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f9ea1f747023": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + }, + "fb69e80392e8": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.paste-lookup-github.workitem-1", + "checkpoints": [ + { + "id": "tw-paste-lookup-resolved.normal:by-number", + "observation": { + "sender": ["65342779da15"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "731507dd2e23" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:by-slug", + "observation": { + "sender": ["65342779da15", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "4a3429622287", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "2113a0cc7708", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:by-number", + "observation": { + "sender": ["fb69e80392e8"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "ee20a1dc39e7" + }, + "state": "c392cc9aa63a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:by-slug", + "observation": { + "sender": ["fb69e80392e8", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "ee20a1dc39e7", + "by-slug": "731507dd2e23" + }, + "state": "21981303c684", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:gitlab-path", + "observation": { + "sender": ["fb69e80392e8", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "ee20a1dc39e7", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "c9a1abec42e3", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:repo-slug-matched", + "observation": { + "sender": ["fb69e80392e8", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "ee20a1dc39e7", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "894b40a0b814", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:by-number", + "observation": { + "sender": ["5827c760c69a"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "ee20a1dc39e7" + }, + "state": "c392cc9aa63a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:by-slug", + "observation": { + "sender": ["5827c760c69a", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "ee20a1dc39e7", + "by-slug": "731507dd2e23" + }, + "state": "21981303c684", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:gitlab-path", + "observation": { + "sender": ["5827c760c69a", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "ee20a1dc39e7", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "c9a1abec42e3", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:repo-slug-matched", + "observation": { + "sender": ["5827c760c69a", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "ee20a1dc39e7", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "894b40a0b814", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:by-number", + "observation": { + "sender": ["19bc74accf11"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "46daeacd502c" + }, + "state": "9dcdd903c10f", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:by-slug", + "observation": { + "sender": ["19bc74accf11", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "46daeacd502c", + "by-slug": "731507dd2e23" + }, + "state": "d65cceb204a7", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:gitlab-path", + "observation": { + "sender": ["19bc74accf11", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "46daeacd502c", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "c57df09a398c", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:repo-slug-matched", + "observation": { + "sender": ["19bc74accf11", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "46daeacd502c", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "ad658847a638", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:by-number", + "observation": { + "sender": ["d0150efe4124"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "9e9f15f7df58" + }, + "state": "73fe68f6a6fc", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:by-slug", + "observation": { + "sender": ["d0150efe4124", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "9e9f15f7df58", + "by-slug": "731507dd2e23" + }, + "state": "b70f6ec811e0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:gitlab-path", + "observation": { + "sender": ["d0150efe4124", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "9e9f15f7df58", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "3e4f8a2833ba", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:repo-slug-matched", + "observation": { + "sender": ["d0150efe4124", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "9e9f15f7df58", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "3c03bbd195d8", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:by-number", + "observation": { + "sender": ["896610e0c4e7"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "a7f4472cdb70" + }, + "state": "c6646b64fc57", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:by-slug", + "observation": { + "sender": ["896610e0c4e7", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "a7f4472cdb70", + "by-slug": "731507dd2e23" + }, + "state": "4267f9cc3919", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:gitlab-path", + "observation": { + "sender": ["896610e0c4e7", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "a7f4472cdb70", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "5b601868bb59", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:repo-slug-matched", + "observation": { + "sender": ["896610e0c4e7", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "a7f4472cdb70", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "de772915aa03", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:by-number", + "observation": { + "sender": ["90de73e52a3d"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "32a7c0ae7918" + }, + "state": "8aa944d2f7a1", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:by-slug", + "observation": { + "sender": ["90de73e52a3d", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "32a7c0ae7918", + "by-slug": "731507dd2e23" + }, + "state": "b19c59c5ee88", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:gitlab-path", + "observation": { + "sender": ["90de73e52a3d", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "32a7c0ae7918", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "38e35cd6299a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:repo-slug-matched", + "observation": { + "sender": ["90de73e52a3d", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "32a7c0ae7918", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "3bae2da7492a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:by-number", + "observation": { + "sender": ["870d10fe8de9"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "f3b516f62081" + }, + "state": "8aa944d2f7a1", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:by-slug", + "observation": { + "sender": ["870d10fe8de9", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "f3b516f62081", + "by-slug": "731507dd2e23" + }, + "state": "b19c59c5ee88", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:gitlab-path", + "observation": { + "sender": ["870d10fe8de9", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "f3b516f62081", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "38e35cd6299a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:repo-slug-matched", + "observation": { + "sender": ["870d10fe8de9", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "f3b516f62081", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "3bae2da7492a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:by-number", + "observation": { + "sender": ["06c63d693b0e"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "b948e8307e81" + }, + "state": "8aa944d2f7a1", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:by-slug", + "observation": { + "sender": ["06c63d693b0e", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "b948e8307e81", + "by-slug": "731507dd2e23" + }, + "state": "b19c59c5ee88", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:gitlab-path", + "observation": { + "sender": ["06c63d693b0e", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "b948e8307e81", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "38e35cd6299a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:repo-slug-matched", + "observation": { + "sender": ["06c63d693b0e", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "b948e8307e81", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "3bae2da7492a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:by-number", + "observation": { + "sender": ["1e7d56be018c"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "a947768bc0ed" + }, + "state": "8aa944d2f7a1", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:by-slug", + "observation": { + "sender": ["1e7d56be018c", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "a947768bc0ed", + "by-slug": "731507dd2e23" + }, + "state": "b19c59c5ee88", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:gitlab-path", + "observation": { + "sender": ["1e7d56be018c", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "a947768bc0ed", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "38e35cd6299a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:repo-slug-matched", + "observation": { + "sender": ["1e7d56be018c", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "a947768bc0ed", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "3bae2da7492a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:by-number", + "observation": { + "sender": ["8f8ff0f7d554"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "c7584e82c72f" + }, + "state": "8aa944d2f7a1", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:by-slug", + "observation": { + "sender": ["8f8ff0f7d554", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "c7584e82c72f", + "by-slug": "731507dd2e23" + }, + "state": "b19c59c5ee88", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:gitlab-path", + "observation": { + "sender": ["8f8ff0f7d554", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "c7584e82c72f", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "38e35cd6299a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:repo-slug-matched", + "observation": { + "sender": ["8f8ff0f7d554", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "c7584e82c72f", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "3bae2da7492a", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.workitembyownerrepo-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.workitembyownerrepo-1.json new file mode 100644 index 00000000000..f425da8f3fa --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-github.workitembyownerrepo-1.json @@ -0,0 +1,1513 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4c2560ac236a1cc1ef239b7c97a0436e115b19a6ad3ddd96b3b77970aa631ae3", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "043383809888": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "09b235c17bb0": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "0e35851dfc19": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "0e9d6525a582": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "11ab96fde6c9": { + "name": "gitlab.workItemByPath#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemByPath\",\"params\":{\"repo\":\"id:repo-1\",\"host\":\"gitlab.com\",\"path\":\"group/project\",\"iid\":7,\"type\":\"issue\"}}" + }, + "1930e5b10aa4": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "2113a0cc7708": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "27ddfa6b2efa": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "cache": [] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "34d2c8648702": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "36efe7e0f4f2": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": "refused", + "repoId": "repo-1" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "3b70826f7fe6": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "3c4b264bef1c": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "$rpc": "null" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "46daeacd502c": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "refused", + "repoId": "repo-1" + } + }, + "49054e5c9fe8": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "4a3429622287": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "518d26b50905": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "65342779da15": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + }, + "6ec2e8b6f903": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "$rpc": "null" + }, + "cache": [] + }, + "731507dd2e23": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + } + }, + "7445a582a9c8": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "owner": "owner", + "repo": "repo" + } + } + } + }, + "825e80908bc2": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "873ee3388e70": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "90adb9377343": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "9221b9a7a4b0": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "92bb68fe4007": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "9e9f15f7df58": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + } + }, + "9fe9e3dcad5b": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "a45a7dd68af6": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "a7f4472cdb70": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "aaf80675fc49": { + "name": "github.workItem#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItem\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12}}" + }, + "ab24157c895e": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": "refused", + "repoId": "repo-1" + }, + "cache": [] + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "bd533f6b0b40": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "bf5c299a7c14": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "$rpc": "null" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "c2fb4513d62f": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": "refused", + "repoId": "repo-1" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "c4a429577522": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d58cca0b1bf7": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "dffa1578b2eb": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "e1f537905a65": { + "name": "github.workItemByOwnerRepo#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemByOwnerRepo\",\"params\":{\"repo\":\"id:repo-1\",\"owner\":\"owner\",\"ownerRepo\":\"repo\",\"number\":12,\"type\":\"issue\"}}" + }, + "e29333b1693f": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "iid": 7, + "title": "seven" + } + } + } + }, + "e970eb27f5ca": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "ebc4e477d2ce": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "cache": [] + }, + "ee20a1dc39e7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "null" + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f9ea1f747023": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.paste-lookup-github.workitembyownerrepo-1", + "checkpoints": [ + { + "id": "tw-paste-lookup-resolved.prelude:by-number", + "observation": { + "sender": ["65342779da15"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "731507dd2e23" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:by-slug", + "observation": { + "sender": ["65342779da15", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "4a3429622287", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "2113a0cc7708", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:by-slug", + "observation": { + "sender": ["65342779da15", "3b70826f7fe6"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "ee20a1dc39e7" + }, + "state": "6ec2e8b6f903", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:gitlab-path", + "observation": { + "sender": ["65342779da15", "3b70826f7fe6", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "ee20a1dc39e7", + "gitlab-path": "bd533f6b0b40" + }, + "state": "3c4b264bef1c", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "3b70826f7fe6", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "ee20a1dc39e7", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "bf5c299a7c14", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:by-slug", + "observation": { + "sender": ["65342779da15", "d58cca0b1bf7"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "ee20a1dc39e7" + }, + "state": "6ec2e8b6f903", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:gitlab-path", + "observation": { + "sender": ["65342779da15", "d58cca0b1bf7", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "ee20a1dc39e7", + "gitlab-path": "bd533f6b0b40" + }, + "state": "3c4b264bef1c", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "d58cca0b1bf7", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "ee20a1dc39e7", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "bf5c299a7c14", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:by-slug", + "observation": { + "sender": ["65342779da15", "c4a429577522"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "46daeacd502c" + }, + "state": "ab24157c895e", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:gitlab-path", + "observation": { + "sender": ["65342779da15", "c4a429577522", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "46daeacd502c", + "gitlab-path": "bd533f6b0b40" + }, + "state": "c2fb4513d62f", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "c4a429577522", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "46daeacd502c", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "36efe7e0f4f2", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:by-slug", + "observation": { + "sender": ["65342779da15", "90adb9377343"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "9e9f15f7df58" + }, + "state": "ebc4e477d2ce", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:gitlab-path", + "observation": { + "sender": ["65342779da15", "90adb9377343", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "9e9f15f7df58", + "gitlab-path": "bd533f6b0b40" + }, + "state": "92bb68fe4007", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "90adb9377343", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "9e9f15f7df58", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "873ee3388e70", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:by-slug", + "observation": { + "sender": ["65342779da15", "9221b9a7a4b0"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "a7f4472cdb70" + }, + "state": "27ddfa6b2efa", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:gitlab-path", + "observation": { + "sender": ["65342779da15", "9221b9a7a4b0", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "a7f4472cdb70", + "gitlab-path": "bd533f6b0b40" + }, + "state": "dffa1578b2eb", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "9221b9a7a4b0", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "a7f4472cdb70", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "043383809888", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:by-slug", + "observation": { + "sender": ["65342779da15", "34d2c8648702"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "32a7c0ae7918" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:gitlab-path", + "observation": { + "sender": ["65342779da15", "34d2c8648702", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "32a7c0ae7918", + "gitlab-path": "bd533f6b0b40" + }, + "state": "49054e5c9fe8", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "34d2c8648702", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "32a7c0ae7918", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "1930e5b10aa4", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:by-slug", + "observation": { + "sender": ["65342779da15", "9fe9e3dcad5b"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "f3b516f62081" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:gitlab-path", + "observation": { + "sender": ["65342779da15", "9fe9e3dcad5b", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "f3b516f62081", + "gitlab-path": "bd533f6b0b40" + }, + "state": "49054e5c9fe8", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "9fe9e3dcad5b", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "f3b516f62081", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "1930e5b10aa4", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:by-slug", + "observation": { + "sender": ["65342779da15", "0e35851dfc19"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "b948e8307e81" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:gitlab-path", + "observation": { + "sender": ["65342779da15", "0e35851dfc19", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "b948e8307e81", + "gitlab-path": "bd533f6b0b40" + }, + "state": "49054e5c9fe8", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "0e35851dfc19", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "b948e8307e81", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "1930e5b10aa4", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:by-slug", + "observation": { + "sender": ["65342779da15", "518d26b50905"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "a947768bc0ed" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:gitlab-path", + "observation": { + "sender": ["65342779da15", "518d26b50905", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "a947768bc0ed", + "gitlab-path": "bd533f6b0b40" + }, + "state": "49054e5c9fe8", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "518d26b50905", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "a947768bc0ed", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "1930e5b10aa4", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:by-slug", + "observation": { + "sender": ["65342779da15", "825e80908bc2"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "c7584e82c72f" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:gitlab-path", + "observation": { + "sender": ["65342779da15", "825e80908bc2", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "c7584e82c72f", + "gitlab-path": "bd533f6b0b40" + }, + "state": "49054e5c9fe8", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "825e80908bc2", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "c7584e82c72f", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "1930e5b10aa4", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-gitlab.workitembypath-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-gitlab.workitembypath-1.json new file mode 100644 index 00000000000..5214024b62a --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.paste-lookup-gitlab.workitembypath-1.json @@ -0,0 +1,1319 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ab5511fa34181dc9de590df2fe57a0d061a261e7b204a6ef830c03bc53923d65", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "06c1311be9ff": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "$rpc": "null" + } + }, + "09b235c17bb0": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "0b3a62a33eb9": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "error": "refused", + "repoId": "repo-1" + } + }, + "0c4bd9fe5448": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "0e9d6525a582": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "11ab96fde6c9": { + "name": "gitlab.workItemByPath#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemByPath\",\"params\":{\"repo\":\"id:repo-1\",\"host\":\"gitlab.com\",\"path\":\"group/project\",\"iid\":7,\"type\":\"issue\"}}" + }, + "2113a0cc7708": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "22a0e7139433": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "237ac027130f": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + } + }, + "2c926252e701": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "46daeacd502c": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "refused", + "repoId": "repo-1" + } + }, + "4a3429622287": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "4ef10450d3fc": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-3", + "ok": false + } + } + }, + "5f9434462f8a": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true + } + } + }, + "65342779da15": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + }, + "6945ba429114": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "error": "refused", + "repoId": "repo-1" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "70f924b6a03a": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "731507dd2e23": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + } + }, + "737574c61e8d": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-3", + "ok": false + } + } + }, + "7445a582a9c8": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "owner": "owner", + "repo": "repo" + } + } + } + }, + "754e655d6508": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + } + }, + "7a02e1f7b185": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "9e9f15f7df58": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + } + }, + "a1e6f2b40722": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "$rpc": "null" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "a346acfeb887": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "a45a7dd68af6": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "a7f4472cdb70": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "message": "inner refused" + }, + "ok": false, + "repoId": "repo-1" + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "aaf80675fc49": { + "name": "github.workItem#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItem\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12}}" + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "bd533f6b0b40": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d1f460d3c414": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "error": "inner refused", + "ok": false, + "repoId": "repo-1" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "dfcabc236ad7": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "e1f537905a65": { + "name": "github.workItemByOwnerRepo#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemByOwnerRepo\",\"params\":{\"repo\":\"id:repo-1\",\"owner\":\"owner\",\"ownerRepo\":\"repo\",\"number\":12,\"type\":\"issue\"}}" + }, + "e29333b1693f": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "iid": 7, + "title": "seven" + } + } + } + }, + "e970eb27f5ca": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "ee20a1dc39e7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "null" + } + }, + "f0766555428a": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-3", + "ok": false + } + } + }, + "f215cf4a0ca3": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f9ea1f747023": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.paste-lookup-gitlab.workitembypath-1", + "checkpoints": [ + { + "id": "tw-paste-lookup-resolved.prelude:by-number", + "observation": { + "sender": ["65342779da15"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "731507dd2e23" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.prelude:by-slug", + "observation": { + "sender": ["65342779da15", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "4a3429622287", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.normal:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "2113a0cc7708", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "5f9434462f8a"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "ee20a1dc39e7" + }, + "state": "06c1311be9ff", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-absent:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "5f9434462f8a", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "ee20a1dc39e7", + "repo-slug": "0e9d6525a582" + }, + "state": "a1e6f2b40722", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "f215cf4a0ca3"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "ee20a1dc39e7" + }, + "state": "06c1311be9ff", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.result-null:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "f215cf4a0ca3", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "ee20a1dc39e7", + "repo-slug": "0e9d6525a582" + }, + "state": "a1e6f2b40722", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "22a0e7139433"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "46daeacd502c" + }, + "state": "0b3a62a33eb9", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-ok-missing:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "22a0e7139433", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "46daeacd502c", + "repo-slug": "0e9d6525a582" + }, + "state": "6945ba429114", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "0c4bd9fe5448"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "9e9f15f7df58" + }, + "state": "237ac027130f", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-string-error:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "0c4bd9fe5448", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "9e9f15f7df58", + "repo-slug": "0e9d6525a582" + }, + "state": "d1f460d3c414", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "dfcabc236ad7"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "a7f4472cdb70" + }, + "state": "754e655d6508", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.inner-false-object-error:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "dfcabc236ad7", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "a7f4472cdb70", + "repo-slug": "0e9d6525a582" + }, + "state": "70f924b6a03a", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "4ef10450d3fc"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "32a7c0ae7918" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "4ef10450d3fc", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "32a7c0ae7918", + "repo-slug": "0e9d6525a582" + }, + "state": "7a02e1f7b185", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "f0766555428a"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "f3b516f62081" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.outer-refused-no-message:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "f0766555428a", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "f3b516f62081", + "repo-slug": "0e9d6525a582" + }, + "state": "7a02e1f7b185", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "737574c61e8d"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "b948e8307e81" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.method-not-found:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "737574c61e8d", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "b948e8307e81", + "repo-slug": "0e9d6525a582" + }, + "state": "7a02e1f7b185", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "2c926252e701"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "a947768bc0ed" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "2c926252e701", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "a947768bc0ed", + "repo-slug": "0e9d6525a582" + }, + "state": "7a02e1f7b185", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "a346acfeb887"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "c7584e82c72f" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "tw-paste-lookup-resolved.transport-rejection-no-message:repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "a346acfeb887", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "c7584e82c72f", + "repo-slug": "0e9d6525a582" + }, + "state": "7a02e1f7b185", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-github.listworkitems-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-github.listworkitems-1.json new file mode 100644 index 00000000000..4c21157e14c --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-github.listworkitems-1.json @@ -0,0 +1,1885 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ea5c32c4dbb67aae1ebaf809a28104d52d189e5153d9b28285f4d8a6d78753ea", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "05e9b743fb1d": { + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "13833f2512ec": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "13ebc07aa6fe": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "155f61ed496f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of null (reading 'items')", + "isRpcDeliveryUnknown": false + } + }, + "253629bd0d20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "25716369cd8f": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [] + }, + "25f88995b39a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + } + }, + "26dc3b7c8299": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-3" + } + ] + }, + "2cfd107b9660": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "36290ab254a4": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "37c4b6aa154e": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "3828d5880c35": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "41d2452d4ebe": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "42f4c910f308": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "44136fa355b3": {}, + "50263a3726f9": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "518e8334f7d3": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "51a271295555": { + "github": [], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "5bce68072dc3": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + } + }, + "6107c951646f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + } + }, + "61210ae02f8d": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "6e2d75e3bbd7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "71764b0214a9": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "80cc566cdd55": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "867ee0f6f5d8": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "96555ad1314a": { + "github": [] + }, + "a4ee5d16b4f6": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-1" + } + ] + }, + "a85937f48d97": { + "github": [], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "a92cd1dd05af": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "b015aaf3a53a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ] + }, + "b8b02a30b6b8": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c2bf4ae27078": { + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "c43e80126d82": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "ce28e5229996": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "e97e5a589476": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "ead829dd6d03": { + "name": "linear.searchIssues#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" + }, + "ee6fe4f97b01": { + "name": "github.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" + }, + "ef416ca3ea2c": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "f32ad26605d0": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "missing", + "type": "not_found" + }, + "items": [ + { + "iid": 2, + "title": "two" + } + ] + } + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f51f34589c7a": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'items')", + "isRpcDeliveryUnknown": false + } + }, + "f7877799c609": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "f8f245caedb5": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "fe7f60b5d785": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.smart-source-search-github.listworkitems-1", + "checkpoints": [ + { + "id": "tw-smart-search-all-providers.normal:github-items", + "observation": { + "sender": ["5bce68072dc3"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "36290ab254a4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:github-items", + "observation": { + "sender": ["f8f245caedb5"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "f51f34589c7a" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:gitlab-items", + "observation": { + "sender": ["f8f245caedb5", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "f51f34589c7a", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-search", + "observation": { + "sender": ["f8f245caedb5", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "f51f34589c7a", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:branch-refs", + "observation": { + "sender": ["f8f245caedb5", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "f51f34589c7a", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-assigned-listed", + "observation": { + "sender": [ + "f8f245caedb5", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "f51f34589c7a", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:github-items", + "observation": { + "sender": ["ef416ca3ea2c"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "155f61ed496f" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:gitlab-items", + "observation": { + "sender": ["ef416ca3ea2c", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "155f61ed496f", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-search", + "observation": { + "sender": ["ef416ca3ea2c", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "155f61ed496f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:branch-refs", + "observation": { + "sender": ["ef416ca3ea2c", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "155f61ed496f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-assigned-listed", + "observation": { + "sender": [ + "ef416ca3ea2c", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "155f61ed496f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:github-items", + "observation": { + "sender": ["f7877799c609"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "25716369cd8f" + }, + "state": "96555ad1314a", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:gitlab-items", + "observation": { + "sender": ["f7877799c609", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7" + }, + "state": "51a271295555", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-search", + "observation": { + "sender": ["f7877799c609", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "a85937f48d97", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:branch-refs", + "observation": { + "sender": ["f7877799c609", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "867ee0f6f5d8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-assigned-listed", + "observation": { + "sender": [ + "f7877799c609", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "518e8334f7d3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:github-items", + "observation": { + "sender": ["13833f2512ec"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "25716369cd8f" + }, + "state": "96555ad1314a", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:gitlab-items", + "observation": { + "sender": ["13833f2512ec", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7" + }, + "state": "51a271295555", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-search", + "observation": { + "sender": ["13833f2512ec", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "a85937f48d97", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:branch-refs", + "observation": { + "sender": ["13833f2512ec", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "867ee0f6f5d8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-assigned-listed", + "observation": { + "sender": [ + "13833f2512ec", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "518e8334f7d3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:github-items", + "observation": { + "sender": ["61210ae02f8d"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "25716369cd8f" + }, + "state": "96555ad1314a", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:gitlab-items", + "observation": { + "sender": ["61210ae02f8d", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7" + }, + "state": "51a271295555", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-search", + "observation": { + "sender": ["61210ae02f8d", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "a85937f48d97", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:branch-refs", + "observation": { + "sender": ["61210ae02f8d", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "867ee0f6f5d8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-assigned-listed", + "observation": { + "sender": [ + "61210ae02f8d", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "25716369cd8f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "518e8334f7d3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:github-items", + "observation": { + "sender": ["50263a3726f9"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "32a7c0ae7918" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:gitlab-items", + "observation": { + "sender": ["50263a3726f9", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "32a7c0ae7918", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-search", + "observation": { + "sender": ["50263a3726f9", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "32a7c0ae7918", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:branch-refs", + "observation": { + "sender": ["50263a3726f9", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "32a7c0ae7918", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-assigned-listed", + "observation": { + "sender": [ + "50263a3726f9", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "32a7c0ae7918", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:github-items", + "observation": { + "sender": ["ce28e5229996"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "f3b516f62081" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:gitlab-items", + "observation": { + "sender": ["ce28e5229996", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "f3b516f62081", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-search", + "observation": { + "sender": ["ce28e5229996", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "f3b516f62081", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:branch-refs", + "observation": { + "sender": ["ce28e5229996", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "f3b516f62081", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "ce28e5229996", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "f3b516f62081", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:github-items", + "observation": { + "sender": ["80cc566cdd55"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "b948e8307e81" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:gitlab-items", + "observation": { + "sender": ["80cc566cdd55", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "b948e8307e81", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-search", + "observation": { + "sender": ["80cc566cdd55", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "b948e8307e81", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:branch-refs", + "observation": { + "sender": ["80cc566cdd55", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "b948e8307e81", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-assigned-listed", + "observation": { + "sender": [ + "80cc566cdd55", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "b948e8307e81", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:github-items", + "observation": { + "sender": ["37c4b6aa154e"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "a947768bc0ed" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:gitlab-items", + "observation": { + "sender": ["37c4b6aa154e", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "a947768bc0ed", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-search", + "observation": { + "sender": ["37c4b6aa154e", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "a947768bc0ed", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:branch-refs", + "observation": { + "sender": ["37c4b6aa154e", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "a947768bc0ed", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-assigned-listed", + "observation": { + "sender": [ + "37c4b6aa154e", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "a947768bc0ed", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:github-items", + "observation": { + "sender": ["42f4c910f308"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "c7584e82c72f" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:gitlab-items", + "observation": { + "sender": ["42f4c910f308", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "c7584e82c72f", + "gitlab": "6e2d75e3bbd7" + }, + "state": "c2bf4ae27078", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-search", + "observation": { + "sender": ["42f4c910f308", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "c7584e82c72f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "05e9b743fb1d", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:branch-refs", + "observation": { + "sender": ["42f4c910f308", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "c7584e82c72f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "71764b0214a9", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "42f4c910f308", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "c7584e82c72f", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "13ebc07aa6fe", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-gitlab.listworkitems-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-gitlab.listworkitems-1.json new file mode 100644 index 00000000000..93b17c0671d --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-gitlab.listworkitems-1.json @@ -0,0 +1,1772 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "541a282829d3aa5d6b66eeba06e783368f397178ff0d2bdf3e87bccdc62b690f", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "24e67c350a20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [] + }, + "253629bd0d20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "25716369cd8f": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [] + }, + "25f88995b39a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + } + }, + "26dc3b7c8299": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-3" + } + ] + }, + "2cfd107b9660": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "36290ab254a4": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "3698dc9e21e5": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "3828d5880c35": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "41d2452d4ebe": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "5b5689593188": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "5bce68072dc3": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + } + }, + "6107c951646f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + } + }, + "67ba0246dbf8": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "6c647ccd3cff": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "6e2d75e3bbd7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "6f4bd0fc6d8b": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "74bc6b65cdef": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "76fa023e535f": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "82f9caba201c": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "8eb709e28997": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "94d9f7a1e105": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "9f9af59ae576": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "a25ac3f73d46": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of null (reading 'error')", + "isRpcDeliveryUnknown": false + } + }, + "a4ee5d16b4f6": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-1" + } + ] + }, + "a92cd1dd05af": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "b015aaf3a53a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ] + }, + "b236fc09fef7": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "b8b02a30b6b8": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "be85b10635d4": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'error')", + "isRpcDeliveryUnknown": false + } + }, + "c43e80126d82": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "e2325a86e69b": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "e97e5a589476": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "ead829dd6d03": { + "name": "linear.searchIssues#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" + }, + "ee6fe4f97b01": { + "name": "github.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" + }, + "f01419051ddf": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "f0a975a83b87": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "f32ad26605d0": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "missing", + "type": "not_found" + }, + "items": [ + { + "iid": 2, + "title": "two" + } + ] + } + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "fb884a9370b1": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "fe7f60b5d785": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.smart-source-search-gitlab.listworkitems-1", + "checkpoints": [ + { + "id": "tw-smart-search-all-providers.prelude:github-items", + "observation": { + "sender": ["5bce68072dc3"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "36290ab254a4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "b236fc09fef7"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "be85b10635d4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-search", + "observation": { + "sender": ["5bce68072dc3", "b236fc09fef7", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "be85b10635d4", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "b236fc09fef7", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "be85b10635d4", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "b236fc09fef7", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "be85b10635d4", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "76fa023e535f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a25ac3f73d46" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-search", + "observation": { + "sender": ["5bce68072dc3", "76fa023e535f", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a25ac3f73d46", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "76fa023e535f", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a25ac3f73d46", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "76fa023e535f", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a25ac3f73d46", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "94d9f7a1e105"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f" + }, + "state": "24e67c350a20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-search", + "observation": { + "sender": ["5bce68072dc3", "94d9f7a1e105", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6" + }, + "state": "6c647ccd3cff", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "94d9f7a1e105", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "9f9af59ae576", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "94d9f7a1e105", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "74bc6b65cdef", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "8eb709e28997"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f" + }, + "state": "24e67c350a20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-search", + "observation": { + "sender": ["5bce68072dc3", "8eb709e28997", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6" + }, + "state": "6c647ccd3cff", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "8eb709e28997", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "9f9af59ae576", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "8eb709e28997", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "74bc6b65cdef", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "3698dc9e21e5"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f" + }, + "state": "24e67c350a20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-search", + "observation": { + "sender": ["5bce68072dc3", "3698dc9e21e5", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6" + }, + "state": "6c647ccd3cff", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "3698dc9e21e5", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "9f9af59ae576", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "3698dc9e21e5", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "25716369cd8f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "74bc6b65cdef", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "fb884a9370b1"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "32a7c0ae7918" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-search", + "observation": { + "sender": ["5bce68072dc3", "fb884a9370b1", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "32a7c0ae7918", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "fb884a9370b1", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "32a7c0ae7918", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "fb884a9370b1", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "32a7c0ae7918", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "5b5689593188"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "f3b516f62081" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-search", + "observation": { + "sender": ["5bce68072dc3", "5b5689593188", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "f3b516f62081", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "5b5689593188", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "f3b516f62081", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "5b5689593188", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "f3b516f62081", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "e2325a86e69b"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "b948e8307e81" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-search", + "observation": { + "sender": ["5bce68072dc3", "e2325a86e69b", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "b948e8307e81", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "e2325a86e69b", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "b948e8307e81", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "e2325a86e69b", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "b948e8307e81", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "67ba0246dbf8"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a947768bc0ed" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-search", + "observation": { + "sender": ["5bce68072dc3", "67ba0246dbf8", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a947768bc0ed", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "67ba0246dbf8", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a947768bc0ed", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "67ba0246dbf8", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "a947768bc0ed", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f01419051ddf"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "c7584e82c72f" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f01419051ddf", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "c7584e82c72f", + "linear": "a4ee5d16b4f6" + }, + "state": "6f4bd0fc6d8b", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f01419051ddf", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "c7584e82c72f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "82f9caba201c", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f01419051ddf", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "c7584e82c72f", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "f0a975a83b87", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-linear.listissues-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-linear.listissues-1.json new file mode 100644 index 00000000000..2979643ea9c --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-linear.listissues-1.json @@ -0,0 +1,1199 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "767044526344237daee0a3f981a10615fbb9ebc3f45c2f6f41f9b8b16d362082", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "090ea9e6ac63": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "253629bd0d20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "25f88995b39a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + } + }, + "26dc3b7c8299": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-3" + } + ] + }, + "2cfd107b9660": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "36290ab254a4": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "3828d5880c35": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "3c5eceeb8463": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-5", + "ok": false + } + } + }, + "41d2452d4ebe": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "5bce68072dc3": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + } + }, + "6107c951646f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + } + }, + "6e2d75e3bbd7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "7a91e9a2c1bb": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "957cc0c5ead6": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unexpected Linear tasks response", + "isRpcDeliveryUnknown": false + } + }, + "a4ee5d16b4f6": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-1" + } + ] + }, + "a92cd1dd05af": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "adb630f7c310": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-5", + "ok": false + } + } + }, + "b015aaf3a53a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ] + }, + "b68d510a9e89": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "b8b02a30b6b8": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c43e80126d82": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d7c2c3caeb26": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-5", + "ok": false + } + } + }, + "e97e5a589476": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "ead829dd6d03": { + "name": "linear.searchIssues#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" + }, + "ec10770e2214": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "ee6fe4f97b01": { + "name": "github.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" + }, + "f32ad26605d0": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "missing", + "type": "not_found" + }, + "items": [ + { + "iid": 2, + "title": "two" + } + ] + } + } + } + }, + "f3a7d3f5dc3c": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f64e4725150b": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "f7b4f4fa8d5a": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "fe7f60b5d785": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.smart-source-search-linear.listissues-1", + "checkpoints": [ + { + "id": "tw-smart-search-all-providers.prelude:github-items", + "observation": { + "sender": ["5bce68072dc3"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "36290ab254a4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.prelude:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.prelude:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.prelude:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "f3a7d3f5dc3c" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "957cc0c5ead6" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "7a91e9a2c1bb" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "957cc0c5ead6" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "ec10770e2214" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "957cc0c5ead6" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "f7b4f4fa8d5a" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "957cc0c5ead6" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "b68d510a9e89" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "957cc0c5ead6" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "3c5eceeb8463" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "32a7c0ae7918" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "adb630f7c310" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "f3b516f62081" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "d7c2c3caeb26" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "b948e8307e81" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "f64e4725150b" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "a947768bc0ed" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "090ea9e6ac63" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "c7584e82c72f" + }, + "state": "c43e80126d82", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-linear.searchissues-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-linear.searchissues-1.json new file mode 100644 index 00000000000..d45e0fb6df5 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-linear.searchissues-1.json @@ -0,0 +1,1495 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "40a8ea6a916d4266bd80148e40fd817bbe80cefa02465b88d37c42cebed44f22", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0914e9c666b1": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "253629bd0d20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "25f88995b39a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + } + }, + "26dc3b7c8299": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-3" + } + ] + }, + "27fa02820da8": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "2cfd107b9660": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "3351dd9fcc16": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-3", + "ok": false + } + } + }, + "36290ab254a4": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "3828d5880c35": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "41d2452d4ebe": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "5a41c0588421": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true + } + } + }, + "5bce68072dc3": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + } + }, + "6107c951646f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + } + }, + "619f7466012f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "6e2d75e3bbd7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "78f8899bda05": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "957cc0c5ead6": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unexpected Linear tasks response", + "isRpcDeliveryUnknown": false + } + }, + "99e5be0a1b11": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "a4ee5d16b4f6": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-1" + } + ] + }, + "a92cd1dd05af": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "b015aaf3a53a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ] + }, + "b4185f815a19": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-3", + "ok": false + } + } + }, + "b8b02a30b6b8": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c2b41e1dbaf8": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "c43e80126d82": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "c770655d7a45": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "e97e5a589476": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "ead829dd6d03": { + "name": "linear.searchIssues#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" + }, + "ee6fe4f97b01": { + "name": "github.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" + }, + "f32ad26605d0": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "missing", + "type": "not_found" + }, + "items": [ + { + "iid": 2, + "title": "two" + } + ] + } + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "fb4807630e1d": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-3", + "ok": false + } + } + }, + "fe7f60b5d785": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.smart-source-search-linear.searchissues-1", + "checkpoints": [ + { + "id": "tw-smart-search-all-providers.prelude:github-items", + "observation": { + "sender": ["5bce68072dc3"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "36290ab254a4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.prelude:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "5a41c0588421"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "5a41c0588421", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "5a41c0588421", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "78f8899bda05"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "78f8899bda05", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "78f8899bda05", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "27fa02820da8"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "27fa02820da8", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "27fa02820da8", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "c770655d7a45"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "c770655d7a45", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "c770655d7a45", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "619f7466012f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "619f7466012f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "619f7466012f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "957cc0c5ead6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "3351dd9fcc16"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "32a7c0ae7918" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "3351dd9fcc16", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "32a7c0ae7918", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "3351dd9fcc16", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "32a7c0ae7918", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "fb4807630e1d"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "f3b516f62081" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "fb4807630e1d", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "f3b516f62081", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "fb4807630e1d", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "f3b516f62081", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "b4185f815a19"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "b948e8307e81" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "b4185f815a19", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "b948e8307e81", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "b4185f815a19", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "b948e8307e81", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "99e5be0a1b11"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a947768bc0ed" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "99e5be0a1b11", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a947768bc0ed", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "99e5be0a1b11", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a947768bc0ed", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "0914e9c666b1"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "c7584e82c72f" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "0914e9c666b1", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "c7584e82c72f", + "branches": "b015aaf3a53a" + }, + "state": "c2b41e1dbaf8", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "0914e9c666b1", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "c7584e82c72f", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-repo.searchrefs-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-repo.searchrefs-1.json new file mode 100644 index 00000000000..b0629033f9b --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.smart-source-search-repo.searchrefs-1.json @@ -0,0 +1,1410 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "aa06630cd902fd5dde5181bddd38f5478ae5b48044a3105b090728158aa9a621", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "071e0e8e68dc": { + "branches": [], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "253629bd0d20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "25716369cd8f": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [] + }, + "25f88995b39a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + } + }, + "26dc3b7c8299": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-3" + } + ] + }, + "2cfd107b9660": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "36290ab254a4": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "3828d5880c35": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "3842f5bcd677": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "39576819ef3f": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "41d2452d4ebe": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "553cf244460a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "59e25358865a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-4", + "ok": false + } + } + }, + "5bce68072dc3": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + } + }, + "5d85e47efa46": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-4", + "ok": false + } + } + }, + "5ff512429b6c": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true + } + } + }, + "6107c951646f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + } + }, + "6e2d75e3bbd7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "a4263a13d324": { + "branches": [], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "a4ee5d16b4f6": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-1" + } + ] + }, + "a92cd1dd05af": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "b015aaf3a53a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ] + }, + "b2d9361f1d3d": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "b721d1733537": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "b8b02a30b6b8": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c30c54d734bc": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'refDetails')", + "isRpcDeliveryUnknown": false + } + }, + "c43e80126d82": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d1572a7d1ddb": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "d4061d056a75": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-4", + "ok": false + } + } + }, + "e6d2fd7367d3": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "e97e5a589476": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "ead829dd6d03": { + "name": "linear.searchIssues#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" + }, + "ee6fe4f97b01": { + "name": "github.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" + }, + "f32ad26605d0": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "missing", + "type": "not_found" + }, + "items": [ + { + "iid": 2, + "title": "two" + } + ] + } + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f582af356003": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of null (reading 'refDetails')", + "isRpcDeliveryUnknown": false + } + }, + "fe7f60b5d785": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.smart-source-search-repo.searchrefs-1", + "checkpoints": [ + { + "id": "tw-smart-search-all-providers.prelude:github-items", + "observation": { + "sender": ["5bce68072dc3"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "36290ab254a4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.prelude:gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.prelude:linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.normal:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "5ff512429b6c"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "c30c54d734bc" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-absent:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "5ff512429b6c", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "c30c54d734bc", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "553cf244460a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "f582af356003" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.result-null:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "553cf244460a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "f582af356003", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "b2d9361f1d3d"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "25716369cd8f" + }, + "state": "a4263a13d324", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-ok-missing:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "b2d9361f1d3d", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "25716369cd8f", + "linear-assigned": "26dc3b7c8299" + }, + "state": "071e0e8e68dc", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "b721d1733537"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "25716369cd8f" + }, + "state": "a4263a13d324", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-string-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "b721d1733537", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "25716369cd8f", + "linear-assigned": "26dc3b7c8299" + }, + "state": "071e0e8e68dc", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "3842f5bcd677"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "25716369cd8f" + }, + "state": "a4263a13d324", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.inner-false-object-error:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "3842f5bcd677", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "25716369cd8f", + "linear-assigned": "26dc3b7c8299" + }, + "state": "071e0e8e68dc", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "59e25358865a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "32a7c0ae7918" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "59e25358865a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "32a7c0ae7918", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "d4061d056a75"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "f3b516f62081" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.outer-refused-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "d4061d056a75", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "f3b516f62081", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "5d85e47efa46"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b948e8307e81" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.method-not-found:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "5d85e47efa46", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b948e8307e81", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "39576819ef3f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "a947768bc0ed" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "39576819ef3f", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "a947768bc0ed", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "e6d2fd7367d3"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "c7584e82c72f" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "tw-smart-search-all-providers.transport-rejection-no-message:linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "e6d2fd7367d3", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "c7584e82c72f", + "linear-assigned": "26dc3b7c8299" + }, + "state": "d1572a7d1ddb", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-source-repo.searchrefs-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-source-repo.searchrefs-1.json new file mode 100644 index 00000000000..4840f31a2b0 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-source-repo.searchrefs-1.json @@ -0,0 +1,976 @@ +{ + "operation": "tasks.workspace-source", + "family": "tasks.workspace-source", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "9e91d46870cd69279cc7d8ebfd317ab8b13136ccff9662876c7601a3a83ecafe", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0045016f4149": { + "branchError": "Cannot read properties of null (reading 'refDetails')", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "1d9a7d969446": { + "name": "workspaceSparsePresetsLoaded", + "value": true + }, + "273f4074a9b5": { + "name": "workspaceSparsePresetsLoaded", + "value": false + }, + "28f23529596e": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "2bd164983c10": { + "branchError": "outer refused", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "2e554aeab5d0": { + "branchError": "transport failure", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "35afa5cb107f": { + "name": "workspaceBaseBranchLoading", + "value": false + }, + "395368dea8ff": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "refs": ["main"] + } + } + } + }, + "46027e62015d": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"main\",\"limit\":20}}" + }, + "46f2f1c9bc6a": { + "name": "workspaceBaseBranchError", + "value": "transport failure" + }, + "4856f62b3650": { + "name": "workspaceSparsePresets", + "value": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + }, + "4cedb91a2f7a": { + "name": "repo.sparsePresets#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.sparsePresets\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "52925a303ed6": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "5485811c08ca": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "57f06e6e349e": { + "branchError": "", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "58cb95babab2": { + "name": "workspaceBaseBranchLoading", + "value": true + }, + "5b0e628f442c": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "5f1c84e00d4f": { + "name": "workspaceBaseBranchResults", + "value": [] + }, + "6c344c5f4ac0": { + "name": "workspaceBaseBranchError", + "value": "" + }, + "7444e76d58f7": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "8353b8e1a426": { + "name": "workspaceSparsePresetsLoading", + "value": true + }, + "846e910f6579": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "8dbe7ea87a41": { + "name": "workspaceBaseBranchResults", + "value": [ + { + "localBranchName": "main", + "refName": "main" + } + ] + }, + "914268bb0636": { + "name": "workspaceBaseBranchError", + "value": "outer refused" + }, + "9357f7ea8445": { + "name": "workspaceSparsePresetId", + "value": { + "$rpc": "null" + } + }, + "94cafc85a34d": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "b78bcf7ca596": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "bb1a94f8cb3f": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "bd26306458d2": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "bd93f3a9862f": { + "branchError": "Unknown method", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "c8d4d05367d6": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + } + } + } + }, + "cfc8af2a7169": { + "name": "workspaceSparsePresetsLoading", + "value": false + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "e4bad139cb5f": { + "branchError": "Cannot read properties of undefined (reading 'refDetails')", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "e883c3f737f1": { + "name": "workspaceBaseBranchError", + "value": "Unknown method" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ec51e489da58": { + "name": "workspaceBaseBranchError", + "value": "Cannot read properties of null (reading 'refDetails')" + }, + "f6f9a9765c0c": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "fcca5f73b480": { + "name": "workspaceBaseBranchError", + "value": "Cannot read properties of undefined (reading 'refDetails')" + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-source-repo.searchrefs-1", + "checkpoints": [ + { + "id": "tw-workspace-source-presets.prelude:presets-loaded", + "observation": { + "sender": ["c8d4d05367d6"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.normal:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "b78bcf7ca596", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.result-absent:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "846e910f6579"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "e4bad139cb5f", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "fcca5f73b480", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.result-null:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "28f23529596e"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "0045016f4149", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "ec51e489da58", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-ok-missing:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "5485811c08ca"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-false-string-error:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "f6f9a9765c0c"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-false-object-error:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "94cafc85a34d"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.outer-refused:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "bb1a94f8cb3f"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "2bd164983c10", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "914268bb0636", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.outer-refused-no-message:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "7444e76d58f7"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "6c344c5f4ac0", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.method-not-found:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "bd26306458d2"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "bd93f3a9862f", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "e883c3f737f1", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.transport-rejection:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "5b0e628f442c"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "2e554aeab5d0", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "46f2f1c9bc6a", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.transport-rejection-no-message:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "52925a303ed6"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "5f1c84e00d4f", + "6c344c5f4ac0", + "35afa5cb107f" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-source-repo.sparsepresets-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-source-repo.sparsepresets-1.json new file mode 100644 index 00000000000..6ef143268c6 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-source-repo.sparsepresets-1.json @@ -0,0 +1,1265 @@ +{ + "operation": "tasks.workspace-source", + "family": "tasks.workspace-source", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2d4a681bffbc5ff9d3040ea0d6bb2603ee940c3c497269d0b63caca564fb25e1", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0e0e1c74c796": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "transport failure", + "presetsLoaded": false + }, + "1d9a7d969446": { + "name": "workspaceSparsePresetsLoaded", + "value": true + }, + "2399e995a370": { + "name": "workspaceSparsePresets", + "value": [] + }, + "273f4074a9b5": { + "name": "workspaceSparsePresetsLoaded", + "value": false + }, + "2d69fe330484": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "35afa5cb107f": { + "name": "workspaceBaseBranchLoading", + "value": false + }, + "395368dea8ff": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "refs": ["main"] + } + } + } + }, + "3dcbacca6ef0": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "46027e62015d": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"main\",\"limit\":20}}" + }, + "4856f62b3650": { + "name": "workspaceSparsePresets", + "value": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + }, + "4c7522c66d03": { + "name": "workspaceSparsePresetsError", + "value": "transport failure" + }, + "4cedb91a2f7a": { + "name": "repo.sparsePresets#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.sparsePresets\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "51396e45f193": { + "name": "workspaceSparsePresetsError", + "value": "Cannot read properties of undefined (reading 'presets')" + }, + "513bb01f2f25": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "", + "presetsLoaded": true + }, + "57f06e6e349e": { + "branchError": "", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "58cb95babab2": { + "name": "workspaceBaseBranchLoading", + "value": true + }, + "5cc2ef1617e8": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "5e895d7d4949": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "transport failure", + "presetsLoaded": false + }, + "5f1c84e00d4f": { + "name": "workspaceBaseBranchResults", + "value": [] + }, + "62bc28c39ffc": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "", + "presetsLoaded": false + }, + "6c344c5f4ac0": { + "name": "workspaceBaseBranchError", + "value": "" + }, + "83043f6bd49a": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "8353b8e1a426": { + "name": "workspaceSparsePresetsLoading", + "value": true + }, + "841927d71fc6": { + "name": "workspaceSparsePresetsError", + "value": "outer refused" + }, + "844c1ccf1f9a": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "Cannot read properties of undefined (reading 'presets')", + "presetsLoaded": false + }, + "8b4d034d6e9e": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "8dbe7ea87a41": { + "name": "workspaceBaseBranchResults", + "value": [ + { + "localBranchName": "main", + "refName": "main" + } + ] + }, + "90bd9a937fe0": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "", + "presetsLoaded": false + }, + "9357f7ea8445": { + "name": "workspaceSparsePresetId", + "value": { + "$rpc": "null" + } + }, + "96f5a578e45b": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "981cb584cfe3": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "982d70c476ea": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "a18f0cdbc6fe": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "aaaeee84b4d2": { + "name": "workspaceSparsePresetsError", + "value": "Cannot read properties of null (reading 'presets')" + }, + "b78bcf7ca596": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "bf004df2bf3d": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "Cannot read properties of null (reading 'presets')", + "presetsLoaded": false + }, + "c58cdfec29bd": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "", + "presetsLoaded": true + }, + "c8d4d05367d6": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + } + } + } + }, + "c909c6a474d9": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "Cannot read properties of undefined (reading 'presets')", + "presetsLoaded": false + }, + "c9379c8a3ba8": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "outer refused", + "presetsLoaded": false + }, + "c9e6bb8f5e61": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "Cannot read properties of null (reading 'presets')", + "presetsLoaded": false + }, + "ce4aab89eed0": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "Unknown method", + "presetsLoaded": false + }, + "ce7d06abf495": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "Unknown method", + "presetsLoaded": false + }, + "cfc8af2a7169": { + "name": "workspaceSparsePresetsLoading", + "value": false + }, + "d075e587b820": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [], + "presetsError": "outer refused", + "presetsLoaded": false + }, + "db27fad68ce2": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "ea260eacb1db": { + "name": "workspaceSparsePresetsError", + "value": "Unknown method" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-source-repo.sparsepresets-1", + "checkpoints": [ + { + "id": "tw-workspace-source-presets.normal:presets-loaded", + "observation": { + "sender": ["c8d4d05367d6"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.normal:branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "b78bcf7ca596", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.result-absent:presets-loaded", + "observation": { + "sender": ["981cb584cfe3"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "c909c6a474d9", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "51396e45f193", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.result-absent:branches-loaded", + "observation": { + "sender": ["981cb584cfe3", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "844c1ccf1f9a", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "51396e45f193", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.result-null:presets-loaded", + "observation": { + "sender": ["a18f0cdbc6fe"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "c9e6bb8f5e61", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "aaaeee84b4d2", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.result-null:branches-loaded", + "observation": { + "sender": ["a18f0cdbc6fe", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "bf004df2bf3d", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "aaaeee84b4d2", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-ok-missing:presets-loaded", + "observation": { + "sender": ["3dcbacca6ef0"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "c58cdfec29bd", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-ok-missing:branches-loaded", + "observation": { + "sender": ["3dcbacca6ef0", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "513bb01f2f25", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-false-string-error:presets-loaded", + "observation": { + "sender": ["982d70c476ea"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "c58cdfec29bd", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-false-string-error:branches-loaded", + "observation": { + "sender": ["982d70c476ea", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "513bb01f2f25", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-false-object-error:presets-loaded", + "observation": { + "sender": ["8b4d034d6e9e"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "c58cdfec29bd", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.inner-false-object-error:branches-loaded", + "observation": { + "sender": ["8b4d034d6e9e", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "513bb01f2f25", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.outer-refused:presets-loaded", + "observation": { + "sender": ["5cc2ef1617e8"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "c9379c8a3ba8", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "841927d71fc6", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.outer-refused:branches-loaded", + "observation": { + "sender": ["5cc2ef1617e8", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "d075e587b820", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "841927d71fc6", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.outer-refused-no-message:presets-loaded", + "observation": { + "sender": ["db27fad68ce2"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "62bc28c39ffc", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "dba381378b08", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.outer-refused-no-message:branches-loaded", + "observation": { + "sender": ["db27fad68ce2", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "90bd9a937fe0", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "dba381378b08", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.method-not-found:presets-loaded", + "observation": { + "sender": ["83043f6bd49a"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "ce4aab89eed0", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "ea260eacb1db", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.method-not-found:branches-loaded", + "observation": { + "sender": ["83043f6bd49a", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "ce7d06abf495", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "ea260eacb1db", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.transport-rejection:presets-loaded", + "observation": { + "sender": ["96f5a578e45b"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "0e0e1c74c796", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "4c7522c66d03", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.transport-rejection:branches-loaded", + "observation": { + "sender": ["96f5a578e45b", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "5e895d7d4949", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "4c7522c66d03", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + }, + { + "id": "tw-workspace-source-presets.transport-rejection-no-message:presets-loaded", + "observation": { + "sender": ["2d69fe330484"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "62bc28c39ffc", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "dba381378b08", + "cfc8af2a7169" + ] + } + }, + { + "id": "tw-workspace-source-presets.transport-rejection-no-message:branches-loaded", + "observation": { + "sender": ["2d69fe330484", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "90bd9a937fe0", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "dba381378b08", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-sparse-repo.savesparsepreset-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-sparse-repo.savesparsepreset-1.json new file mode 100644 index 00000000000..7ac2c78b995 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-sparse-repo.savesparsepreset-1.json @@ -0,0 +1,940 @@ +{ + "operation": "tasks.workspace-sparse", + "family": "tasks.workspace-sparse", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3d4637406e2d658b72f73153f0a5e176cb8b143593b72bce0cdf979bc6e4cbdd", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "1923ab7dba76": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "1d9a7d969446": { + "name": "workspaceSparsePresetsLoaded", + "value": true + }, + "1f453ea83df7": { + "presets": [], + "presetsError": "transport failure", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "23e798f4b47c": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "312ed3cbf468": { + "name": "workspaceSparsePresetId", + "value": "p1" + }, + "404305aa2e3a": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "42bbd034563e": { + "name": "workspaceSparseDraft", + "value": { + "$rpc": "null" + } + }, + "4856f62b3650": { + "name": "workspaceSparsePresets", + "value": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + }, + "4c7522c66d03": { + "name": "workspaceSparsePresetsError", + "value": "transport failure" + }, + "4d66e995ff47": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection closed", + "isRpcDeliveryUnknown": true + } + } + }, + "4e1228f5e0a8": { + "name": "workspaceSparsePresetsError", + "value": "Cannot read properties of null (reading 'preset')" + }, + "5c44ff5f6877": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "preset": { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + } + } + } + }, + "74c1230400a6": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "7993762437ad": { + "name": "workspaceSparsePresetsError", + "value": "Connection closed" + }, + "7fd0cde62993": { + "name": "workspaceSparseSaving", + "value": false + }, + "841927d71fc6": { + "name": "workspaceSparsePresetsError", + "value": "outer refused" + }, + "89aa7a3bd619": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "8e410711e308": { + "presets": [], + "presetsError": "Cannot read properties of undefined (reading 'preset')", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "92b857799ffd": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "95295c6eaa8d": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "990a149dc1be": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "bcfc7df6e4f2": { + "presets": [], + "presetsError": "", + "saving": true, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "bd0266b23771": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "befb68fa6c76": { + "presets": [], + "presetsError": "Failed to save sparse preset.", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "c33fee0d8294": { + "presets": [], + "presetsError": "Unknown method", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "c5a3f70f9b02": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "cea9d7e8986e": { + "name": "workspaceSparseSaving", + "value": true + }, + "d14de7ce4d84": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "d74bc3778ca8": { + "presets": [], + "presetsError": "outer refused", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "da3a01640280": { + "name": "workspaceSparsePresetsError", + "value": "Failed to save sparse preset." + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "dd63325a7802": { + "name": "workspaceSparsePresetsError", + "value": "Cannot read properties of undefined (reading 'preset')" + }, + "e52233a9ff71": { + "presets": [], + "presetsError": "Cannot read properties of null (reading 'preset')", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "ea260eacb1db": { + "name": "workspaceSparsePresetsError", + "value": "Unknown method" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ee3a941d5e9c": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "f4d4ba362712": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "f9dfbe0c0ea7": { + "name": "ssh.getState#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "fd758406cc2c": { + "name": "repo.saveSparsePreset#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.saveSparsePreset\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"docs\",\"directories\":[\"docs\"]}}" + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-sparse-repo.savesparsepreset-1", + "checkpoints": [ + { + "id": "tw-workspace-sparse-saved.prelude:ssh-state-read", + "observation": { + "sender": ["89aa7a3bd619"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "ee3a941d5e9c", + "effects": ["921f72d7827e"] + } + }, + { + "id": "tw-workspace-sparse-saved.prelude:cleanup", + "observation": { + "sender": ["89aa7a3bd619", "4d66e995ff47"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "bcfc7df6e4f2", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "7993762437ad", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.normal:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "404305aa2e3a", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.result-absent:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "95295c6eaa8d"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "8e410711e308", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "dd63325a7802", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.result-null:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "d14de7ce4d84"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "e52233a9ff71", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "4e1228f5e0a8", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-ok-missing:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "92b857799ffd"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "befb68fa6c76", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "da3a01640280", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-false-string-error:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "bd0266b23771"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "befb68fa6c76", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "da3a01640280", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-false-object-error:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "c5a3f70f9b02"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "befb68fa6c76", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "da3a01640280", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.outer-refused:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "1923ab7dba76"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "d74bc3778ca8", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "841927d71fc6", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.outer-refused-no-message:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "990a149dc1be"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "ee3a941d5e9c", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "dba381378b08", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.method-not-found:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "74c1230400a6"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "c33fee0d8294", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "ea260eacb1db", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.transport-rejection:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "f4d4ba362712"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "1f453ea83df7", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "4c7522c66d03", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.transport-rejection-no-message:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "23e798f4b47c"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "ee3a941d5e9c", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "dba381378b08", + "7fd0cde62993" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-sparse-ssh.getstate-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-sparse-ssh.getstate-1.json new file mode 100644 index 00000000000..aad4c7d9fe7 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-sparse-ssh.getstate-1.json @@ -0,0 +1,1164 @@ +{ + "operation": "tasks.workspace-sparse", + "family": "tasks.workspace-sparse", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3453024581230908d1e0e9335f5310e7b4ae03faf50d93654b9ff28c464fb95f", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0a16839c6f87": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "0eabd872f405": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "14db652edf02": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "1703db1e81e4": { + "name": "workspaceSshState", + "value": { + "error": "Cannot read properties of undefined (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "1d9a7d969446": { + "name": "workspaceSparsePresetsLoaded", + "value": true + }, + "25352a4de532": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + }, + "2d910059043a": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "312ed3cbf468": { + "name": "workspaceSparsePresetId", + "value": "p1" + }, + "404305aa2e3a": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "42bbd034563e": { + "name": "workspaceSparseDraft", + "value": { + "$rpc": "null" + } + }, + "44ca8518769a": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": "Cannot read properties of undefined (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "4856f62b3650": { + "name": "workspaceSparsePresets", + "value": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + }, + "57be9babbecd": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": "Unknown method", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "5c44ff5f6877": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "preset": { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + } + } + } + }, + "68ca812c8120": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + }, + "6daeb33f37f8": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": "transport failure", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "7a26c9dceb4c": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": "Cannot read properties of undefined (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "7e5ba73897a1": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": "Unknown method", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "7fd0cde62993": { + "name": "workspaceSparseSaving", + "value": false + }, + "80431b2fc9cd": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": "Cannot read properties of null (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "813df5a46a4a": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "81af687a998a": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": "Cannot read properties of null (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "86cc01b1e541": { + "name": "workspaceSshState", + "value": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "89aa7a3bd619": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "9164e806ca12": { + "name": "workspaceSshState", + "value": { + "error": "Cannot read properties of null (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "9367b086d487": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": "outer refused", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "93dfd351c771": { + "name": "workspaceSshState", + "value": { + "error": "outer refused", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "a16210531185": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": "outer refused", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "a209f2c7160e": { + "name": "workspaceSshState", + "value": { + "error": "Unknown method", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "b09dd4915f43": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "b705ba88a562": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "b7fa4557dcfa": { + "name": "workspaceSshState", + "value": { + "error": "transport failure", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "cd050477e049": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "cea9d7e8986e": { + "name": "workspaceSparseSaving", + "value": true + }, + "d0fad8f739ca": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "e18278fce524": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ee3a941d5e9c": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "ef27a7ecb258": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": "transport failure", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "f36f17f8d448": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "f7885da6b9c0": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + }, + "f9dfbe0c0ea7": { + "name": "ssh.getState#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "fd758406cc2c": { + "name": "repo.saveSparsePreset#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.saveSparsePreset\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"docs\",\"directories\":[\"docs\"]}}" + }, + "ff6c3161dcc7": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-sparse-ssh.getstate-1", + "checkpoints": [ + { + "id": "tw-workspace-sparse-saved.normal:ssh-state-read", + "observation": { + "sender": ["89aa7a3bd619"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "ee3a941d5e9c", + "effects": ["921f72d7827e"] + } + }, + { + "id": "tw-workspace-sparse-saved.normal:preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "404305aa2e3a", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.result-absent:ssh-state-read", + "observation": { + "sender": ["14db652edf02"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "44ca8518769a", + "effects": ["1703db1e81e4"] + } + }, + { + "id": "tw-workspace-sparse-saved.result-absent:preset-saved", + "observation": { + "sender": ["14db652edf02", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "7a26c9dceb4c", + "effects": [ + "1703db1e81e4", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.result-null:ssh-state-read", + "observation": { + "sender": ["0eabd872f405"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "81af687a998a", + "effects": ["9164e806ca12"] + } + }, + { + "id": "tw-workspace-sparse-saved.result-null:preset-saved", + "observation": { + "sender": ["0eabd872f405", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "80431b2fc9cd", + "effects": [ + "9164e806ca12", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-ok-missing:ssh-state-read", + "observation": { + "sender": ["0a16839c6f87"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "68ca812c8120", + "effects": ["25352a4de532"] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-ok-missing:preset-saved", + "observation": { + "sender": ["0a16839c6f87", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "f7885da6b9c0", + "effects": [ + "25352a4de532", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-false-string-error:ssh-state-read", + "observation": { + "sender": ["b09dd4915f43"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "68ca812c8120", + "effects": ["25352a4de532"] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-false-string-error:preset-saved", + "observation": { + "sender": ["b09dd4915f43", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "f7885da6b9c0", + "effects": [ + "25352a4de532", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-false-object-error:ssh-state-read", + "observation": { + "sender": ["e18278fce524"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "68ca812c8120", + "effects": ["25352a4de532"] + } + }, + { + "id": "tw-workspace-sparse-saved.inner-false-object-error:preset-saved", + "observation": { + "sender": ["e18278fce524", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "f7885da6b9c0", + "effects": [ + "25352a4de532", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.outer-refused:ssh-state-read", + "observation": { + "sender": ["d0fad8f739ca"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "a16210531185", + "effects": ["93dfd351c771"] + } + }, + { + "id": "tw-workspace-sparse-saved.outer-refused:preset-saved", + "observation": { + "sender": ["d0fad8f739ca", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "9367b086d487", + "effects": [ + "93dfd351c771", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.outer-refused-no-message:ssh-state-read", + "observation": { + "sender": ["ff6c3161dcc7"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "813df5a46a4a", + "effects": ["86cc01b1e541"] + } + }, + { + "id": "tw-workspace-sparse-saved.outer-refused-no-message:preset-saved", + "observation": { + "sender": ["ff6c3161dcc7", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "cd050477e049", + "effects": [ + "86cc01b1e541", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.method-not-found:ssh-state-read", + "observation": { + "sender": ["b705ba88a562"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "7e5ba73897a1", + "effects": ["a209f2c7160e"] + } + }, + { + "id": "tw-workspace-sparse-saved.method-not-found:preset-saved", + "observation": { + "sender": ["b705ba88a562", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "57be9babbecd", + "effects": [ + "a209f2c7160e", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.transport-rejection:ssh-state-read", + "observation": { + "sender": ["2d910059043a"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "6daeb33f37f8", + "effects": ["b7fa4557dcfa"] + } + }, + { + "id": "tw-workspace-sparse-saved.transport-rejection:preset-saved", + "observation": { + "sender": ["2d910059043a", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "ef27a7ecb258", + "effects": [ + "b7fa4557dcfa", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + }, + { + "id": "tw-workspace-sparse-saved.transport-rejection-no-message:ssh-state-read", + "observation": { + "sender": ["f36f17f8d448"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "813df5a46a4a", + "effects": ["86cc01b1e541"] + } + }, + { + "id": "tw-workspace-sparse-saved.transport-rejection-no-message:preset-saved", + "observation": { + "sender": ["f36f17f8d448", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "cd050477e049", + "effects": [ + "86cc01b1e541", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-local-preflight.detectagents-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-local-preflight.detectagents-1.json new file mode 100644 index 00000000000..9ae9fe3d7d8 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-local-preflight.detectagents-1.json @@ -0,0 +1,566 @@ +{ + "operation": "tasks.workspace-ssh-local", + "family": "tasks.workspace-ssh-local", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "28f7ba289c188bfc121ef7b969133711189e887fbfc7b37c8a5401ea7f30b56a", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "00d70c40c34c": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "0846bea730cf": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "1317fc33bdbe": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "163b91b6fe9c": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "327b46fb8bef": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "6e5fcf24648d": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "70d128c20ae4": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "71225024ccf5": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "7400f4eebe66": { + "agent": "claude", + "connecting": false, + "detected": ["codex", "claude"], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "87d7d24a30d2": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "9f152ed6e897": { + "name": "workspaceDetectedAgentIds", + "value": [] + }, + "cb93b17470e8": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": ["codex", "claude"] + } + } + }, + "cbb858a786ac": { + "name": "workspaceDetectedAgentIds", + "value": ["codex", "claude"] + }, + "cf32edc950ac": { + "name": "preflight.detectAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectAgents\"}" + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "fb640b2bca4c": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "fbb9eef78275": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-ssh-local-preflight.detectagents-1", + "checkpoints": [ + { + "id": "tw-workspace-ssh-local-agents.normal:local-agents-detected", + "observation": { + "sender": ["cb93b17470e8"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "7400f4eebe66", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "cbb858a786ac"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.result-absent:local-agents-detected", + "observation": { + "sender": ["6e5fcf24648d"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.result-null:local-agents-detected", + "observation": { + "sender": ["1317fc33bdbe"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.inner-ok-missing:local-agents-detected", + "observation": { + "sender": ["327b46fb8bef"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.inner-false-string-error:local-agents-detected", + "observation": { + "sender": ["0846bea730cf"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.inner-false-object-error:local-agents-detected", + "observation": { + "sender": ["00d70c40c34c"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.outer-refused:local-agents-detected", + "observation": { + "sender": ["fb640b2bca4c"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.outer-refused-no-message:local-agents-detected", + "observation": { + "sender": ["163b91b6fe9c"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.method-not-found:local-agents-detected", + "observation": { + "sender": ["87d7d24a30d2"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.transport-rejection:local-agents-detected", + "observation": { + "sender": ["fbb9eef78275"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-local-agents.transport-rejection-no-message:local-agents-detected", + "observation": { + "sender": ["70d128c20ae4"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-preflight.detectremoteagents-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-preflight.detectremoteagents-1.json new file mode 100644 index 00000000000..ea84ad9ce8a --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-preflight.detectremoteagents-1.json @@ -0,0 +1,1268 @@ +{ + "operation": "tasks.workspace-ssh", + "family": "tasks.workspace-ssh", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "35771ab92d0d4ff44a1dd6e5f1e5d3137570a2e013bddea5ca77ecac7989ed53", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "02a3532637b4": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "07d4c9b0eaf2": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "0ba2cee4b538": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + }, + "162a699815c1": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "1739575ac53e": { + "name": "workspaceSshConnecting", + "value": true + }, + "17e35b25d15d": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": ["codex"] + } + } + }, + "18e6a3ac6471": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "19b6093097ff": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "227c671c491b": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "3571f351281f": { + "name": "workspaceDetectedAgentIds", + "value": ["codex"] + }, + "37921d9fdeb7": { + "name": "preflight.detectRemoteAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "43ead075ce12": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "43fd3e2f4b53": { + "name": "workspaceSshConnecting", + "value": false + }, + "71225024ccf5": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "71d817ffdd81": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "7a1b524f17d0": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "7c9498659f58": { + "name": "ssh.connect#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "80a4af19f556": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": " pnpm install " + } + }, + "setupRunPolicy": "ask", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + } + } + }, + "860046b4ce30": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "90dce4861972": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "95dee1165f95": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "9f0676ba0d67": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "9f152ed6e897": { + "name": "workspaceDetectedAgentIds", + "value": [] + }, + "a1f755a38636": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "c5eeac27af29": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "f0a9f62da106": { + "name": "repo.hooks#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "fbfdbb919268": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connecting", + "targetId": "ssh-1" + } + }, + "fd04a7852302": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-ssh-preflight.detectremoteagents-1", + "checkpoints": [ + { + "id": "tw-workspace-ssh-connected.normal:agents-detected", + "observation": { + "sender": ["17e35b25d15d"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "18e6a3ac6471", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "3571f351281f"] + } + }, + { + "id": "tw-workspace-ssh-connected.normal:connected", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.normal:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-absent:agents-detected", + "observation": { + "sender": ["90dce4861972"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.result-absent:connected", + "observation": { + "sender": ["90dce4861972", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-absent:setup-prompted", + "observation": { + "sender": ["90dce4861972", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-null:agents-detected", + "observation": { + "sender": ["02a3532637b4"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.result-null:connected", + "observation": { + "sender": ["02a3532637b4", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-null:setup-prompted", + "observation": { + "sender": ["02a3532637b4", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-ok-missing:agents-detected", + "observation": { + "sender": ["227c671c491b"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-ok-missing:connected", + "observation": { + "sender": ["227c671c491b", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-ok-missing:setup-prompted", + "observation": { + "sender": ["227c671c491b", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-string-error:agents-detected", + "observation": { + "sender": ["fd04a7852302"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-string-error:connected", + "observation": { + "sender": ["fd04a7852302", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-string-error:setup-prompted", + "observation": { + "sender": ["fd04a7852302", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-object-error:agents-detected", + "observation": { + "sender": ["162a699815c1"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-object-error:connected", + "observation": { + "sender": ["162a699815c1", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-object-error:setup-prompted", + "observation": { + "sender": ["162a699815c1", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused:agents-detected", + "observation": { + "sender": ["c5eeac27af29"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused:connected", + "observation": { + "sender": ["c5eeac27af29", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused:setup-prompted", + "observation": { + "sender": ["c5eeac27af29", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused-no-message:agents-detected", + "observation": { + "sender": ["19b6093097ff"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused-no-message:connected", + "observation": { + "sender": ["19b6093097ff", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused-no-message:setup-prompted", + "observation": { + "sender": ["19b6093097ff", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.method-not-found:agents-detected", + "observation": { + "sender": ["860046b4ce30"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.method-not-found:connected", + "observation": { + "sender": ["860046b4ce30", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.method-not-found:setup-prompted", + "observation": { + "sender": ["860046b4ce30", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection:agents-detected", + "observation": { + "sender": ["07d4c9b0eaf2"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection:connected", + "observation": { + "sender": ["07d4c9b0eaf2", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection:setup-prompted", + "observation": { + "sender": ["07d4c9b0eaf2", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection-no-message:agents-detected", + "observation": { + "sender": ["95dee1165f95"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "71225024ccf5", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "9f152ed6e897"] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection-no-message:connected", + "observation": { + "sender": ["95dee1165f95", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "9f0676ba0d67", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection-no-message:setup-prompted", + "observation": { + "sender": ["95dee1165f95", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "7a1b524f17d0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-repo.hooks-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-repo.hooks-1.json new file mode 100644 index 00000000000..70861e8c3e5 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-repo.hooks-1.json @@ -0,0 +1,975 @@ +{ + "operation": "tasks.workspace-ssh", + "family": "tasks.workspace-ssh", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "39451d3c811068754f91ac243fe1208f4ce742df53261314345d8209ba761e94", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "02800add9d11": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "0ba2cee4b538": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + }, + "1712c415bebf": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "decision": "inherit", + "kind": "decision" + } + }, + "1739575ac53e": { + "name": "workspaceSshConnecting", + "value": true + }, + "17e35b25d15d": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": ["codex"] + } + } + }, + "18e6a3ac6471": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "1fcb0efb54e8": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-3", + "ok": false + } + } + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "33cfd55c1890": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "3571f351281f": { + "name": "workspaceDetectedAgentIds", + "value": ["codex"] + }, + "37921d9fdeb7": { + "name": "preflight.detectRemoteAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "43ead075ce12": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "43fd3e2f4b53": { + "name": "workspaceSshConnecting", + "value": false + }, + "5278c299d57a": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "6139c7d2716a": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of null (reading 'hooks')", + "isRpcDeliveryUnknown": false + } + }, + "70a84db3f870": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-3", + "ok": false + } + } + }, + "71d817ffdd81": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "7c7a826833e0": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-3", + "ok": false + } + } + }, + "7c9498659f58": { + "name": "ssh.connect#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "7e1d82e5b5ed": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "decision": "inherit", + "kind": "decision" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "80a4af19f556": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": " pnpm install " + } + }, + "setupRunPolicy": "ask", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + } + } + }, + "8c3bb432df5b": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "941b6aeb0d6f": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "a1f755a38636": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "f0a9f62da106": { + "name": "repo.hooks#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "f21c4f69fe5a": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'hooks')", + "isRpcDeliveryUnknown": false + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f7b1983b91e9": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true + } + } + }, + "fbfdbb919268": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connecting", + "targetId": "ssh-1" + } + }, + "ff43290f6836": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-ssh-repo.hooks-1", + "checkpoints": [ + { + "id": "tw-workspace-ssh-connected.prelude:agents-detected", + "observation": { + "sender": ["17e35b25d15d"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "18e6a3ac6471", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "3571f351281f"] + } + }, + { + "id": "tw-workspace-ssh-connected.prelude:connected", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.normal:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-absent:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "f7b1983b91e9"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "f21c4f69fe5a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-null:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "ff43290f6836"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "6139c7d2716a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-ok-missing:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "5278c299d57a"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "1712c415bebf" + }, + "state": "7e1d82e5b5ed", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-string-error:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "02800add9d11"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "1712c415bebf" + }, + "state": "7e1d82e5b5ed", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-object-error:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "8c3bb432df5b"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "1712c415bebf" + }, + "state": "7e1d82e5b5ed", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "7c7a826833e0"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "32a7c0ae7918" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused-no-message:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "1fcb0efb54e8"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "f3b516f62081" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.method-not-found:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "70a84db3f870"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "b948e8307e81" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "941b6aeb0d6f"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "a947768bc0ed" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection-no-message:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "33cfd55c1890"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "c7584e82c72f" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-ssh.connect-1.json b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-ssh.connect-1.json new file mode 100644 index 00000000000..3cfc59c03b2 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-tasks.workspace-ssh-ssh.connect-1.json @@ -0,0 +1,1421 @@ +{ + "operation": "tasks.workspace-ssh", + "family": "tasks.workspace-ssh", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5cc1773d06d49d2616da72f2790753322edda6d67e12b5e41116971d34787391", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "09c18a29abf3": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "0ba2cee4b538": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + }, + "11181309201b": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "1703db1e81e4": { + "name": "workspaceSshState", + "value": { + "error": "Cannot read properties of undefined (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "1739575ac53e": { + "name": "workspaceSshConnecting", + "value": true + }, + "17e35b25d15d": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": ["codex"] + } + } + }, + "18e6a3ac6471": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "3571f351281f": { + "name": "workspaceDetectedAgentIds", + "value": ["codex"] + }, + "37921d9fdeb7": { + "name": "preflight.detectRemoteAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "42fb94e15a80": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": "transport failure", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "43ead075ce12": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "43fd3e2f4b53": { + "name": "workspaceSshConnecting", + "value": false + }, + "4a24b4b276fa": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": "outer refused", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "4ca864d39d04": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": "outer refused", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "50b0f369719b": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "5313715e0fbb": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "654de1224bc2": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection closed", + "isRpcDeliveryUnknown": true + } + } + }, + "671db70f932a": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "6d2db0d7fee0": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": "transport failure", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "71d817ffdd81": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "7c9498659f58": { + "name": "ssh.connect#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "80a4af19f556": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": " pnpm install " + } + }, + "setupRunPolicy": "ask", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + } + } + }, + "86cc01b1e541": { + "name": "workspaceSshState", + "value": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "8a5755fd3ffa": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "8dc4620dc1de": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": "Unknown method", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "9164e806ca12": { + "name": "workspaceSshState", + "value": { + "error": "Cannot read properties of null (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "93dfd351c771": { + "name": "workspaceSshState", + "value": { + "error": "outer refused", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "9eb40e943577": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": "Unknown method", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "a1f755a38636": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "a209f2c7160e": { + "name": "workspaceSshState", + "value": { + "error": "Unknown method", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "aa15b77aca73": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "aad86573b0be": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "b7fa4557dcfa": { + "name": "workspaceSshState", + "value": { + "error": "transport failure", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "c5608f9dd27c": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "c81e3c5c4429": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "cabfead2f0ff": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": "Cannot read properties of null (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "ce4a98c7ed2f": { + "name": "workspaceSshState", + "value": { + "error": "Connection closed", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "ce5554d7557b": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": "Cannot read properties of undefined (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "d86f0ed68c40": { + "agent": "claude", + "connecting": true, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connecting", + "targetId": "ssh-1" + } + }, + "e17430747d93": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": "Cannot read properties of null (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "e29464ad65fd": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "e62fd21eb764": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "f066aa754e25": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": "Cannot read properties of undefined (reading 'state')", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "f0a9f62da106": { + "name": "repo.hooks#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "fbfdbb919268": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connecting", + "targetId": "ssh-1" + } + } + }, + "recording": { + "scenario": "matrix-tasks.workspace-ssh-ssh.connect-1", + "checkpoints": [ + { + "id": "tw-workspace-ssh-connected.prelude:agents-detected", + "observation": { + "sender": ["17e35b25d15d"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "18e6a3ac6471", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "3571f351281f"] + } + }, + { + "id": "tw-workspace-ssh-connected.prelude:cleanup", + "observation": { + "sender": ["17e35b25d15d", "654de1224bc2"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "d86f0ed68c40", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "ce4a98c7ed2f", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.normal:connected", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.normal:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-absent:connected", + "observation": { + "sender": ["17e35b25d15d", "50b0f369719b"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "f066aa754e25", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "1703db1e81e4", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-absent:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "50b0f369719b", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "ce5554d7557b", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "1703db1e81e4", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-null:connected", + "observation": { + "sender": ["17e35b25d15d", "09c18a29abf3"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "cabfead2f0ff", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "9164e806ca12", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.result-null:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "09c18a29abf3", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "e17430747d93", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "9164e806ca12", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-ok-missing:connected", + "observation": { + "sender": ["17e35b25d15d", "11181309201b"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-ok-missing:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "11181309201b", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-string-error:connected", + "observation": { + "sender": ["17e35b25d15d", "c81e3c5c4429"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-string-error:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "c81e3c5c4429", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-object-error:connected", + "observation": { + "sender": ["17e35b25d15d", "e62fd21eb764"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.inner-false-object-error:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "e62fd21eb764", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused:connected", + "observation": { + "sender": ["17e35b25d15d", "e29464ad65fd"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "4ca864d39d04", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "93dfd351c771", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "e29464ad65fd", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "4a24b4b276fa", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "93dfd351c771", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused-no-message:connected", + "observation": { + "sender": ["17e35b25d15d", "aad86573b0be"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "5313715e0fbb", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "86cc01b1e541", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.outer-refused-no-message:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "aad86573b0be", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "aa15b77aca73", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "86cc01b1e541", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.method-not-found:connected", + "observation": { + "sender": ["17e35b25d15d", "8a5755fd3ffa"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "8dc4620dc1de", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "a209f2c7160e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.method-not-found:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "8a5755fd3ffa", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "9eb40e943577", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "a209f2c7160e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection:connected", + "observation": { + "sender": ["17e35b25d15d", "c5608f9dd27c"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "6d2db0d7fee0", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "b7fa4557dcfa", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "c5608f9dd27c", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "42fb94e15a80", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "b7fa4557dcfa", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection-no-message:connected", + "observation": { + "sender": ["17e35b25d15d", "671db70f932a"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "5313715e0fbb", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "86cc01b1e541", + "43fd3e2f4b53" + ] + } + }, + { + "id": "tw-workspace-ssh-connected.transport-rejection-no-message:setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "671db70f932a", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "aa15b77aca73", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "86cc01b1e541", + "43fd3e2f4b53" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-worktree.create-retry-worktree.create-1.json b/mobile/rpc-foundation/goldens/matrix-worktree.create-retry-worktree.create-1.json new file mode 100644 index 00000000000..6368fb4cf12 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-worktree.create-retry-worktree.create-1.json @@ -0,0 +1,652 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "e93a36ef900de27e1a566cdb2389ba4f900a330eadbb476b9bfb1ef05707b352", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0938d32a2ec2": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "12ace8a26229": { + "outcome": { + "error": "outer refused" + } + }, + "151fd59f40cd": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "199931225ca2": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'displayName')", + "isRpcDeliveryUnknown": false + } + }, + "240b0b1c72b2": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "" + } + }, + "2588fd63a157": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of undefined (reading 'worktree')", + "isRpcDeliveryUnknown": false + } + }, + "292579caa07d": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "2e78a1dad2ea": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "3f946ad0279c": { + "outcome": "uncreated" + }, + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "489c189aebca": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "worktree": { + "displayName": "kestrel", + "id": "repo-1::/w" + } + } + } + } + }, + "6bf7db287168": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "7665e4eb5ce2": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "outer refused" + } + }, + "7d651cae8837": { + "outcome": { + "error": "" + } + }, + "7fbbbeb1902c": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "Unknown method" + } + }, + "8cf7217b02de": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "96a4c62e654d": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "b32227fdb10b": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "name": "kestrel", + "worktreeId": "repo-1::/w" + } + }, + "b5447f4dd931": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot read properties of null (reading 'worktree')", + "isRpcDeliveryUnknown": false + } + }, + "b6ebedadd49b": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "c26dcf914d04": { + "outcome": { + "error": "Unknown method" + } + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "c8b7b7e4da75": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "cf574d8c995b": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "df162b95f465": { + "outcome": { + "name": "kestrel", + "worktreeId": "repo-1::/w" + } + } + }, + "recording": { + "scenario": "matrix-worktree.create-retry-worktree.create-1", + "checkpoints": [ + { + "id": "tw-create-retry-created.normal:created", + "observation": { + "sender": ["489c189aebca"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "b32227fdb10b" + }, + "state": "df162b95f465", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.result-absent:created", + "observation": { + "sender": ["cf574d8c995b"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "2588fd63a157" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.result-null:created", + "observation": { + "sender": ["0938d32a2ec2"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "b5447f4dd931" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.inner-ok-missing:created", + "observation": { + "sender": ["6bf7db287168"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "199931225ca2" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.inner-false-string-error:created", + "observation": { + "sender": ["96a4c62e654d"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "199931225ca2" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.inner-false-object-error:created", + "observation": { + "sender": ["2e78a1dad2ea"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "199931225ca2" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.outer-refused:created", + "observation": { + "sender": ["c8b7b7e4da75"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "7665e4eb5ce2" + }, + "state": "12ace8a26229", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.outer-refused-no-message:created", + "observation": { + "sender": ["b6ebedadd49b"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "240b0b1c72b2" + }, + "state": "7d651cae8837", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.method-not-found:created", + "observation": { + "sender": ["151fd59f40cd"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "7fbbbeb1902c" + }, + "state": "c26dcf914d04", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.transport-rejection:created", + "observation": { + "sender": ["292579caa07d"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "a947768bc0ed" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "tw-create-retry-created.transport-rejection-no-message:created", + "observation": { + "sender": ["8cf7217b02de"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "c7584e82c72f" + }, + "state": "3f946ad0279c", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-worktree.hosted-base-worktree.resolvemrbase-1.json b/mobile/rpc-foundation/goldens/matrix-worktree.hosted-base-worktree.resolvemrbase-1.json new file mode 100644 index 00000000000..39cec3ffb81 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-worktree.hosted-base-worktree.resolvemrbase-1.json @@ -0,0 +1,738 @@ +{ + "operation": "tasks.composer-hosted-base", + "family": "worktree.hosted-base", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a84f8a5acfd428eb77b5c02a3de0fa8b780c666db31bbe574ecf76cdf84adeb2", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "08ecbab921e6": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "0e24d2a37a0d": { + "name": "worktree.resolvePrBase#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolvePrBase\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"headRefName\":\"feature\"}}" + }, + "156f5e61efd3": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "17ae65496a72": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-2", + "ok": false + } + } + }, + "201cea1f9864": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-2", + "ok": false + } + } + }, + "22f024eeb07c": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "236529aa012d": { + "mrBase": "unresolved", + "prBase": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "2aaea8ee523e": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "refused", + "isRpcDeliveryUnknown": false + } + }, + "2c7f810cc819": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "[object Object]", + "isRpcDeliveryUnknown": false + } + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "336e99424dd0": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "382c27f806f2": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "3cca8119f144": { + "mrBase": { + "baseBranch": "develop" + }, + "prBase": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "4febe923ceea": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + } + } + }, + "5428de0f5130": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "69afcaf1cb72": { + "name": "worktree.resolveMrBase#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolveMrBase\",\"params\":{\"repo\":\"id:repo-1\",\"mrIid\":7,\"sourceBranch\":\"feature\"}}" + }, + "7214459608bf": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot use 'in' operator to search for 'error' in null", + "isRpcDeliveryUnknown": false + } + }, + "93bb7cfeae89": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true + } + } + }, + "96b186d42430": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "aad8e7ddeea2": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "baseBranch": "develop" + } + } + } + }, + "ae5862eb7a20": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot use 'in' operator to search for 'error' in undefined", + "isRpcDeliveryUnknown": false + } + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "bd721565327b": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d05b2d417b9c": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "inner refused", + "isRpcDeliveryUnknown": false + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "fd552ecb03da": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "baseBranch": "develop" + } + } + }, + "recording": { + "scenario": "matrix-worktree.hosted-base-worktree.resolvemrbase-1", + "checkpoints": [ + { + "id": "tw-hosted-base-resolved.prelude:pr-base-resolved", + "observation": { + "sender": ["4febe923ceea"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "5428de0f5130" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.normal:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "fd552ecb03da" + }, + "state": "3cca8119f144", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.result-absent:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "93bb7cfeae89"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "ae5862eb7a20" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.result-null:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "336e99424dd0"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "7214459608bf" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-ok-missing:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "08ecbab921e6"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "2aaea8ee523e" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-false-string-error:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "96b186d42430"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "d05b2d417b9c" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-false-object-error:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "156f5e61efd3"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "2c7f810cc819" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.outer-refused:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "201cea1f9864"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "32a7c0ae7918" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.outer-refused-no-message:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "382c27f806f2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "f3b516f62081" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.method-not-found:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "17ae65496a72"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "b948e8307e81" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.transport-rejection:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "bd721565327b"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "a947768bc0ed" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.transport-rejection-no-message:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "22f024eeb07c"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "c7584e82c72f" + }, + "state": "236529aa012d", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-worktree.hosted-base-worktree.resolveprbase-1.json b/mobile/rpc-foundation/goldens/matrix-worktree.hosted-base-worktree.resolveprbase-1.json new file mode 100644 index 00000000000..ad114ee98a3 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-worktree.hosted-base-worktree.resolveprbase-1.json @@ -0,0 +1,868 @@ +{ + "operation": "tasks.composer-hosted-base", + "family": "worktree.hosted-base", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "45783a7cbb44b04dbbd6bfd6735799bb4c75e503f43f1821cf8640d11f7464ad", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0ace0141301c": { + "mrBase": { + "baseBranch": "develop" + }, + "prBase": "unresolved" + }, + "0e24d2a37a0d": { + "name": "worktree.resolvePrBase#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolvePrBase\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"headRefName\":\"feature\"}}" + }, + "236529aa012d": { + "mrBase": "unresolved", + "prBase": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "28b232b6369b": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "2aaea8ee523e": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "refused", + "isRpcDeliveryUnknown": false + } + }, + "2c7f810cc819": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "[object Object]", + "isRpcDeliveryUnknown": false + } + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "388eebbe7dca": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "3cca8119f144": { + "mrBase": { + "baseBranch": "develop" + }, + "prBase": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "4febe923ceea": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + } + } + }, + "5428de0f5130": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "5ce5558cd2f1": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "60f898896e1a": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "62d33be71d4d": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "658dfb6d27f2": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "69afcaf1cb72": { + "name": "worktree.resolveMrBase#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolveMrBase\",\"params\":{\"repo\":\"id:repo-1\",\"mrIid\":7,\"sourceBranch\":\"feature\"}}" + }, + "7214459608bf": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot use 'in' operator to search for 'error' in null", + "isRpcDeliveryUnknown": false + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "aad8e7ddeea2": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "baseBranch": "develop" + } + } + } + }, + "ae5862eb7a20": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "TypeError", + "message": "Cannot use 'in' operator to search for 'error' in undefined", + "isRpcDeliveryUnknown": false + } + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c57e06c96492": { + "mrBase": "unresolved", + "prBase": "unresolved" + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d05b2d417b9c": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "inner refused", + "isRpcDeliveryUnknown": false + } + }, + "d778e31ef5f7": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "e3d0229e3cdb": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "f19c03489128": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + }, + "f4bbce06e9b6": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "fd552ecb03da": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "baseBranch": "develop" + } + } + }, + "recording": { + "scenario": "matrix-worktree.hosted-base-worktree.resolveprbase-1", + "checkpoints": [ + { + "id": "tw-hosted-base-resolved.normal:pr-base-resolved", + "observation": { + "sender": ["4febe923ceea"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "5428de0f5130" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.normal:mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "fd552ecb03da" + }, + "state": "3cca8119f144", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.result-absent:pr-base-resolved", + "observation": { + "sender": ["60f898896e1a"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "ae5862eb7a20" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.result-absent:mr-base-resolved", + "observation": { + "sender": ["60f898896e1a", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "ae5862eb7a20", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.result-null:pr-base-resolved", + "observation": { + "sender": ["f4bbce06e9b6"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "7214459608bf" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.result-null:mr-base-resolved", + "observation": { + "sender": ["f4bbce06e9b6", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "7214459608bf", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-ok-missing:pr-base-resolved", + "observation": { + "sender": ["658dfb6d27f2"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "2aaea8ee523e" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-ok-missing:mr-base-resolved", + "observation": { + "sender": ["658dfb6d27f2", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "2aaea8ee523e", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-false-string-error:pr-base-resolved", + "observation": { + "sender": ["62d33be71d4d"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "d05b2d417b9c" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-false-string-error:mr-base-resolved", + "observation": { + "sender": ["62d33be71d4d", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "d05b2d417b9c", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-false-object-error:pr-base-resolved", + "observation": { + "sender": ["5ce5558cd2f1"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "2c7f810cc819" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.inner-false-object-error:mr-base-resolved", + "observation": { + "sender": ["5ce5558cd2f1", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "2c7f810cc819", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.outer-refused:pr-base-resolved", + "observation": { + "sender": ["f19c03489128"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "32a7c0ae7918" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.outer-refused:mr-base-resolved", + "observation": { + "sender": ["f19c03489128", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "32a7c0ae7918", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.outer-refused-no-message:pr-base-resolved", + "observation": { + "sender": ["e3d0229e3cdb"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "f3b516f62081" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.outer-refused-no-message:mr-base-resolved", + "observation": { + "sender": ["e3d0229e3cdb", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "f3b516f62081", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.method-not-found:pr-base-resolved", + "observation": { + "sender": ["28b232b6369b"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "b948e8307e81" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.method-not-found:mr-base-resolved", + "observation": { + "sender": ["28b232b6369b", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "b948e8307e81", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.transport-rejection:pr-base-resolved", + "observation": { + "sender": ["d778e31ef5f7"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "a947768bc0ed" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.transport-rejection:mr-base-resolved", + "observation": { + "sender": ["d778e31ef5f7", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "a947768bc0ed", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.transport-rejection-no-message:pr-base-resolved", + "observation": { + "sender": ["388eebbe7dca"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "c7584e82c72f" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "tw-hosted-base-resolved.transport-rejection-no-message:mr-base-resolved", + "observation": { + "sender": ["388eebbe7dca", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "c7584e82c72f", + "mr": "fd552ecb03da" + }, + "state": "0ace0141301c", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-worktree.review-link-worktree.set-1.json b/mobile/rpc-foundation/goldens/matrix-worktree.review-link-worktree.set-1.json index b86fd4be1fa..b67232b5be4 100644 --- a/mobile/rpc-foundation/goldens/matrix-worktree.review-link-worktree.set-1.json +++ b/mobile/rpc-foundation/goldens/matrix-worktree.review-link-worktree.set-1.json @@ -3,13 +3,14 @@ "family": "worktree.review-link", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2fc093ec505bfac04a4ff0adab991baeba985253486dbe9e3ec9884b8d5f0920", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0d39ad71ac82": { "linkedPR": "unread", diff --git a/mobile/rpc-foundation/goldens/matrix-worktree.runtime-capabilities-status.get-1.json b/mobile/rpc-foundation/goldens/matrix-worktree.runtime-capabilities-status.get-1.json new file mode 100644 index 00000000000..3f93f9c546d --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-worktree.runtime-capabilities-status.get-1.json @@ -0,0 +1,570 @@ +{ + "operation": "tasks.worktree-capabilities", + "family": "worktree.runtime-capabilities", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f70c6b1753377b5a502bf7d1e69dc95617f24c42137471320eb393567efbe735", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "16cd464bf664": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "1e5b32902af7": { + "name": "status.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" + }, + "2698c9770ad3": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "4451bb95a76e": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "5242fad3532f": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "capabilities": ["mobile.tasks.v1", "worktree.create-idempotency.v1"], + "platform": "linux", + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + } + } + } + } + }, + "62aaf19f0b16": { + "capabilities": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": true, + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + } + } + }, + "7d3dd7f9381b": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "86f7fa8089fe": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": false, + "worktreeCreateIdempotency": false + } + }, + "88200d49083c": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "89236e432861": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "944bf432f199": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "9cdf3c107e7b": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "b33d34bddc4e": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": true, + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + } + } + }, + "c71b2f8a6993": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "de87f6266897": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "f80e92134eb1": { + "capabilities": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": false, + "worktreeCreateIdempotency": false + } + } + }, + "recording": { + "scenario": "matrix-worktree.runtime-capabilities-status.get-1", + "checkpoints": [ + { + "id": "tw-capabilities-advertised.normal:probed", + "observation": { + "sender": ["5242fad3532f"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "b33d34bddc4e" + }, + "state": "62aaf19f0b16", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.result-absent:probed", + "observation": { + "sender": ["7d3dd7f9381b"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.result-null:probed", + "observation": { + "sender": ["88200d49083c"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.inner-ok-missing:probed", + "observation": { + "sender": ["4451bb95a76e"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.inner-false-string-error:probed", + "observation": { + "sender": ["944bf432f199"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.inner-false-object-error:probed", + "observation": { + "sender": ["89236e432861"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.outer-refused:probed", + "observation": { + "sender": ["16cd464bf664"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.outer-refused-no-message:probed", + "observation": { + "sender": ["9cdf3c107e7b"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.method-not-found:probed", + "observation": { + "sender": ["c71b2f8a6993"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.transport-rejection:probed", + "observation": { + "sender": ["de87f6266897"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + }, + { + "id": "tw-capabilities-advertised.transport-rejection-no-message:probed", + "observation": { + "sender": ["2698c9770ad3"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "86f7fa8089fe" + }, + "state": "f80e92134eb1", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/matrix-worktree.setup-hook-trust-ui.set-1.json b/mobile/rpc-foundation/goldens/matrix-worktree.setup-hook-trust-ui.set-1.json new file mode 100644 index 00000000000..51dc69ecef9 --- /dev/null +++ b/mobile/rpc-foundation/goldens/matrix-worktree.setup-hook-trust-ui.set-1.json @@ -0,0 +1,673 @@ +{ + "operation": "tasks.setup-hook-trust", + "family": "worktree.setup-hook-trust", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "8487fd14ed779708415b264e2b80b26b0d5094e379a04f4f32c2cd75ec469182", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0f68ccbfb8e9": { + "name": "ui.set#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"trustedOrcaHooks\":{\"repo-1\":{\"setup\":{\"contentHash\":\"hash-1\",\"approvedAt\":1767225600000}}}}}" + }, + "229c35d1a4ba": { + "trust": "unapproved" + }, + "255cdc090b8a": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "2905cce95e1c": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "inner refused" + }, + "ok": false + } + } + } + }, + "29fc0c5de3b0": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + } + }, + "32a7c0ae7918": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "outer refused", + "isRpcDeliveryUnknown": false + } + }, + "32af950a57cc": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "6f009f61d89f": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "ok": true + } + } + } + }, + "9deb505f7915": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "a406b068aeca": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + }, + "a947768bc0ed": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "transport failure", + "isRpcDeliveryUnknown": true + } + }, + "abd752b10f76": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + } + }, + "ac7d2d4aa85c": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "refused" + } + } + } + }, + "b2aa9ff12623": { + "trust": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + }, + "b948e8307e81": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Unknown method", + "isRpcDeliveryUnknown": false + } + }, + "c7584e82c72f": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": true + } + }, + "d1113bd291a2": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "inner refused", + "ok": false + } + } + } + }, + "e3e6506e1ed0": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "refused", + "message": "outer refused" + }, + "id": "frame-1", + "ok": false + } + } + }, + "e9c010ad58d3": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + } + }, + "recording": { + "scenario": "matrix-worktree.setup-hook-trust-ui.set-1", + "checkpoints": [ + { + "id": "tw-setup-hook-trust-approved.normal:approved", + "observation": { + "sender": ["6f009f61d89f"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.result-absent:approved", + "observation": { + "sender": ["e9c010ad58d3"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.result-null:approved", + "observation": { + "sender": ["9deb505f7915"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.inner-ok-missing:approved", + "observation": { + "sender": ["ac7d2d4aa85c"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.inner-false-string-error:approved", + "observation": { + "sender": ["d1113bd291a2"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.inner-false-object-error:approved", + "observation": { + "sender": ["2905cce95e1c"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.outer-refused:approved", + "observation": { + "sender": ["e3e6506e1ed0"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "32a7c0ae7918" + }, + "state": "229c35d1a4ba", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.outer-refused-no-message:approved", + "observation": { + "sender": ["32af950a57cc"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "f3b516f62081" + }, + "state": "229c35d1a4ba", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.method-not-found:approved", + "observation": { + "sender": ["255cdc090b8a"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "b948e8307e81" + }, + "state": "229c35d1a4ba", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.transport-rejection:approved", + "observation": { + "sender": ["29fc0c5de3b0"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a947768bc0ed" + }, + "state": "229c35d1a4ba", + "effects": [] + } + }, + { + "id": "tw-setup-hook-trust-approved.transport-rejection-no-message:approved", + "observation": { + "sender": ["abd752b10f76"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "c7584e82c72f" + }, + "state": "229c35d1a4ba", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/probe-new-tab-both-refused.json b/mobile/rpc-foundation/goldens/probe-new-tab-both-refused.json index e162af1a201..84448b023a8 100644 --- a/mobile/rpc-foundation/goldens/probe-new-tab-both-refused.json +++ b/mobile/rpc-foundation/goldens/probe-new-tab-both-refused.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "819fa73c7700b4d526da91c37558a6498008d745d1debcc26e6bb757550ebf99", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/probe-new-tab-null-sibling-refused.json b/mobile/rpc-foundation/goldens/probe-new-tab-null-sibling-refused.json index a8661486565..4a8275e7f2c 100644 --- a/mobile/rpc-foundation/goldens/probe-new-tab-null-sibling-refused.json +++ b/mobile/rpc-foundation/goldens/probe-new-tab-null-sibling-refused.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "500396d72abd2f73d11ef066bca3f88798c8cbdaef09fa7c1c8d1fbaf0b3b85a", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/probe-new-tab-refused-sibling-rejects.json b/mobile/rpc-foundation/goldens/probe-new-tab-refused-sibling-rejects.json index a9d59429b6a..4302f0e7730 100644 --- a/mobile/rpc-foundation/goldens/probe-new-tab-refused-sibling-rejects.json +++ b/mobile/rpc-foundation/goldens/probe-new-tab-refused-sibling-rejects.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "daf68df8840ea6872521d823cc17e1e5de3f3a74a8855465fcf40cc276e9c2ce", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/probe-new-tab-rejects-sibling-refused.json b/mobile/rpc-foundation/goldens/probe-new-tab-rejects-sibling-refused.json index d1eef4a3c31..454f9e80ae4 100644 --- a/mobile/rpc-foundation/goldens/probe-new-tab-rejects-sibling-refused.json +++ b/mobile/rpc-foundation/goldens/probe-new-tab-rejects-sibling-refused.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "61e36caf6b3bb01c3ad0db282b7f0fbc0f300d40184f9cf3d7e4e3a3194a4f2a", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/sc-base-ref-default.json b/mobile/rpc-foundation/goldens/sc-base-ref-default.json index 5db55685a29..ebfc023c308 100644 --- a/mobile/rpc-foundation/goldens/sc-base-ref-default.json +++ b/mobile/rpc-foundation/goldens/sc-base-ref-default.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "374129def6baa0e06b808c067831820966638d79d7a782e96c1f2f891cc9dc86", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "089d79f002a1": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/sc-base-ref-repo-fallback.json b/mobile/rpc-foundation/goldens/sc-base-ref-repo-fallback.json index 5af5b4f1296..a8691ccbd5a 100644 --- a/mobile/rpc-foundation/goldens/sc-base-ref-repo-fallback.json +++ b/mobile/rpc-foundation/goldens/sc-base-ref-repo-fallback.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "97a8b8f5b9a7c7467745666becee07f5dfc57fb283d4e80dcbe7941509177598", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "594101d24d72": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/sc-base-ref-unavailable.json b/mobile/rpc-foundation/goldens/sc-base-ref-unavailable.json index a7bc4b6b138..16a2202e4b1 100644 --- a/mobile/rpc-foundation/goldens/sc-base-ref-unavailable.json +++ b/mobile/rpc-foundation/goldens/sc-base-ref-unavailable.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "25a4762d735dfb4979e6ef31b9fdb380941a824a54b45b3d08ddb2cde25c2eb7", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "594101d24d72": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/sc-base-ref-worktree-hit.json b/mobile/rpc-foundation/goldens/sc-base-ref-worktree-hit.json index 89064dffb11..ad01210efd2 100644 --- a/mobile/rpc-foundation/goldens/sc-base-ref-worktree-hit.json +++ b/mobile/rpc-foundation/goldens/sc-base-ref-worktree-hit.json @@ -3,13 +3,14 @@ "family": "git.base-ref-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f3b193f93f6c9de41d11e706ecbd99648eb2ed41ccb7c66cdb80c934e780ed7c", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "26accd69bc48": { "name": "repo.list#1", diff --git a/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json b/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json index a9f618e2b54..b6666d9ec9c 100644 --- a/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json +++ b/mobile/rpc-foundation/goldens/sc-commit-message-cancel-rejected.json @@ -3,13 +3,14 @@ "family": "git.commit-message-ai", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "013db25622b180a8333bb1ef27c22a5b1f8e04148201201e5cc3413a10640781", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "029ea2c16f05": { "name": "git.cancelGenerateCommitMessage#1", diff --git a/mobile/rpc-foundation/goldens/sc-commit-message-canceled.json b/mobile/rpc-foundation/goldens/sc-commit-message-canceled.json index 043d31da9d6..d70e7682eca 100644 --- a/mobile/rpc-foundation/goldens/sc-commit-message-canceled.json +++ b/mobile/rpc-foundation/goldens/sc-commit-message-canceled.json @@ -3,13 +3,14 @@ "family": "git.commit-message-ai", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "15bf6c17f4b524dfbf5373b2eeed61ee2e659421cf8b6e3cff6c0378c7692cc1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0aeb6552c58a": { "name": "git.generateCommitMessage#1", diff --git a/mobile/rpc-foundation/goldens/sc-commit-message-generated.json b/mobile/rpc-foundation/goldens/sc-commit-message-generated.json index 8553ac2c8b8..31319ebc375 100644 --- a/mobile/rpc-foundation/goldens/sc-commit-message-generated.json +++ b/mobile/rpc-foundation/goldens/sc-commit-message-generated.json @@ -3,13 +3,14 @@ "family": "git.commit-message-ai", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "540f05d84d1cbffd566af933c547838c75500bb5d708e8558c21fe8131d724e3", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "125fbea5f50a": { "name": "git.generateCommitMessage#1", diff --git a/mobile/rpc-foundation/goldens/sc-create-existing-review.json b/mobile/rpc-foundation/goldens/sc-create-existing-review.json index 4f714babe7d..181f8a1b23d 100644 --- a/mobile/rpc-foundation/goldens/sc-create-existing-review.json +++ b/mobile/rpc-foundation/goldens/sc-create-existing-review.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "7d6099248aa6a2ef19f2e169ff917af794649d9d64d139aa9ffeea6a41355ddc", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1617f98dc371": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json b/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json index 4334e60261f..f05449a2b3b 100644 --- a/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json +++ b/mobile/rpc-foundation/goldens/sc-create-intent-stage-commit-push-create.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-intent", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "447f9b3d697dbfe21cb7fb6e12d1bf5fa94b023b7e1697bdc2dc82ce7072183f", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/sc-create-link-failure-is-non-fatal.json b/mobile/rpc-foundation/goldens/sc-create-link-failure-is-non-fatal.json index 4fa79747bdb..a5778ad675a 100644 --- a/mobile/rpc-foundation/goldens/sc-create-link-failure-is-non-fatal.json +++ b/mobile/rpc-foundation/goldens/sc-create-link-failure-is-non-fatal.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2deb0435ef63a3e0102e28f2f3f331039486d193d1e1ffdfb53ad86d3ff039f0", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "122ef8a1f0b9": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json b/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json index 7731fd78fea..d21d3a1a61f 100644 --- a/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json +++ b/mobile/rpc-foundation/goldens/sc-create-pushes-then-creates.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "0f86b3e6059c48cd327c55df2452a9bc6ea85584ffbeacafad496f600c20e06f", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06a94a810e5f": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json b/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json index 3367315375a..d59ebbd5baf 100644 --- a/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json +++ b/mobile/rpc-foundation/goldens/sc-create-refused-empty-message.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5008e69a8e396b1deccd98712d92650a630f971cd76a02862a461afb8617b8a4", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1617f98dc371": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json b/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json index 7e4a85c7807..bdcca8a6bc5 100644 --- a/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json +++ b/mobile/rpc-foundation/goldens/sc-create-rejected-empty-message.json @@ -3,13 +3,14 @@ "family": "hostedReview.create-chain", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ea71081982a101d0f8624707b59c99de9981e9b1d1bafa25c66d575e3f876ff4", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1617f98dc371": { "name": "hostedReview.create#1", diff --git a/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json b/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json index 42479b8d881..391a867ba41 100644 --- a/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json +++ b/mobile/rpc-foundation/goldens/sc-eligibility-fetched.json @@ -3,13 +3,14 @@ "family": "hostedReview.eligibility", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f6a1595073abe11b33973e8865900a1d849f44221961da5c12ea13aa696f6490", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "24bd84c9fb40": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-history-loaded.json b/mobile/rpc-foundation/goldens/sc-history-loaded.json index eb98e12f8bb..1b56488029a 100644 --- a/mobile/rpc-foundation/goldens/sc-history-loaded.json +++ b/mobile/rpc-foundation/goldens/sc-history-loaded.json @@ -3,13 +3,14 @@ "family": "git.history-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "83f61085a91458bad529905ecc6fe240c598cddfe44a56dd497b8aed9fb8a7e5", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "17bc1e177fe1": { "name": "git.history#1", diff --git a/mobile/rpc-foundation/goldens/sc-pr-link-hosted-review.json b/mobile/rpc-foundation/goldens/sc-pr-link-hosted-review.json index c81fb9f324c..f06f0924835 100644 --- a/mobile/rpc-foundation/goldens/sc-pr-link-hosted-review.json +++ b/mobile/rpc-foundation/goldens/sc-pr-link-hosted-review.json @@ -3,13 +3,14 @@ "family": "worktree.review-link", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "42b0304b2fdce08b7ff52ec979dd9f199f368e5e4ef0b5370acc417909b592b3", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1852c739af4f": { "linkedPR": "unread", diff --git a/mobile/rpc-foundation/goldens/sc-pr-link-read.json b/mobile/rpc-foundation/goldens/sc-pr-link-read.json index 350c6ff06b9..9a66cde21df 100644 --- a/mobile/rpc-foundation/goldens/sc-pr-link-read.json +++ b/mobile/rpc-foundation/goldens/sc-pr-link-read.json @@ -3,13 +3,14 @@ "family": "worktree.review-link", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4520bd54a55eabfe6ec64a4b2f824f095f98b2fffd1bf22fe4f9ec7f63cbfa3f", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "17ab8ab0a9f4": { "linkedPR": 7, diff --git a/mobile/rpc-foundation/goldens/sc-pr-link-set.json b/mobile/rpc-foundation/goldens/sc-pr-link-set.json index 891b55fa1cb..a21493d5720 100644 --- a/mobile/rpc-foundation/goldens/sc-pr-link-set.json +++ b/mobile/rpc-foundation/goldens/sc-pr-link-set.json @@ -3,13 +3,14 @@ "family": "worktree.review-link", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b65bad4f8c0ae0b686f6c3db93bd43ffa072ae426f978f1a86ad8008fb24fa24", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1852c739af4f": { "linkedPR": "unread", diff --git a/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-refusal.json b/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-refusal.json index f56ad5b0719..0d760a946e1 100644 --- a/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-refusal.json +++ b/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-refusal.json @@ -3,13 +3,14 @@ "family": "hostedReview.eligibility", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "9de96287a4dfa6cf5c9a8b683cc696fdc2cd387f86f231e22ee3f100a2e778e3", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0710fc7e2b71": { "name": "hostedReview.getCreationEligibility#1", diff --git a/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json b/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json index 408c547a998..5d49f9b9773 100644 --- a/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json +++ b/mobile/rpc-foundation/goldens/sc-prefill-unavailable-on-rejection.json @@ -3,13 +3,14 @@ "family": "hostedReview.eligibility", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "adbdfcc3895cc04d830900de518e689c9e63f6f75569127e1fde24488658e8a0", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "2f56274e5397": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-prerequisite-force-with-lease.json b/mobile/rpc-foundation/goldens/sc-prerequisite-force-with-lease.json index 3cd399e645c..bff1bf885a6 100644 --- a/mobile/rpc-foundation/goldens/sc-prerequisite-force-with-lease.json +++ b/mobile/rpc-foundation/goldens/sc-prerequisite-force-with-lease.json @@ -3,13 +3,14 @@ "family": "git.remote-prerequisite", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ec2847b4af357d8564d8e0a9a1072713c1afd7ff86ba69e9c83c056a6841ee39", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "00e8a3bac22f": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-prerequisite-publish.json b/mobile/rpc-foundation/goldens/sc-prerequisite-publish.json index f89f6433c9f..7d369247287 100644 --- a/mobile/rpc-foundation/goldens/sc-prerequisite-publish.json +++ b/mobile/rpc-foundation/goldens/sc-prerequisite-publish.json @@ -3,13 +3,14 @@ "family": "git.remote-prerequisite", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "6cf6ebd20adc4cc76a12d3424863ee9db2b24f36593664a1f4e0e05de9a53d39", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "00e8a3bac22f": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-prerequisite-push.json b/mobile/rpc-foundation/goldens/sc-prerequisite-push.json index 92ae6703db9..e656c95ac90 100644 --- a/mobile/rpc-foundation/goldens/sc-prerequisite-push.json +++ b/mobile/rpc-foundation/goldens/sc-prerequisite-push.json @@ -3,13 +3,14 @@ "family": "git.remote-prerequisite", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "e6e8197a541cd73e5811a1f28b0dbfc414a4d34c1ae6929fc1bbae1213820674", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "00e8a3bac22f": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-prerequisite-skipped.json b/mobile/rpc-foundation/goldens/sc-prerequisite-skipped.json index 5ceb47f5809..79a72c580a3 100644 --- a/mobile/rpc-foundation/goldens/sc-prerequisite-skipped.json +++ b/mobile/rpc-foundation/goldens/sc-prerequisite-skipped.json @@ -3,13 +3,14 @@ "family": "git.remote-prerequisite", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "523d1ee21e3871a4dffc32f48d2e28c31ecea48cbf3f842acffc8355be06b14b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "69f421c50546": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-reveal-first-poll.json b/mobile/rpc-foundation/goldens/sc-reveal-first-poll.json index 509d1be2e70..b838e980702 100644 --- a/mobile/rpc-foundation/goldens/sc-reveal-first-poll.json +++ b/mobile/rpc-foundation/goldens/sc-reveal-first-poll.json @@ -3,13 +3,14 @@ "family": "session.tab-reveal", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "00b26cb279b0a934df98d93ba98a4a0c79e302c7690c582e778dc0156ab4f235", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0f9f4df04699": { "name": "session.tabs.activate#1", diff --git a/mobile/rpc-foundation/goldens/sc-reveal-timeout.json b/mobile/rpc-foundation/goldens/sc-reveal-timeout.json index 780aab803c4..b7f54a2ead1 100644 --- a/mobile/rpc-foundation/goldens/sc-reveal-timeout.json +++ b/mobile/rpc-foundation/goldens/sc-reveal-timeout.json @@ -3,13 +3,14 @@ "family": "session.tab-reveal", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "fcd61f1ef46c42889827a87876239534b851c425f8ef7a9405ea95b8d07d2363", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "3dbdccea1da9": { "name": "session.tabs.list#3", diff --git a/mobile/rpc-foundation/goldens/sc-review-commit-inner-failure.json b/mobile/rpc-foundation/goldens/sc-review-commit-inner-failure.json index 8ea6d83bb2c..7eac89525b2 100644 --- a/mobile/rpc-foundation/goldens/sc-review-commit-inner-failure.json +++ b/mobile/rpc-foundation/goldens/sc-review-commit-inner-failure.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "db1fb2a584cd806028b9be861283a63aa4836c83f61558f3d518ddbb7a59498d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "88185276c233": { "status": "fulfilled", diff --git a/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json b/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json index e430c438492..9e6b8323541 100644 --- a/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json +++ b/mobile/rpc-foundation/goldens/sc-review-commit-refused-empty-message.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "dba1676583dc832ef059285a6bd4c3eefe6be0230e42100cb9d7a125755d136b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "45f289a0f3ae": { "committed": { diff --git a/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json b/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json index 336769ebb6c..e7d9722de05 100644 --- a/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json +++ b/mobile/rpc-foundation/goldens/sc-review-commit-rejected.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "de079de9cc21bfb40da6e1431273b10c3e2a5b5402b91b2b8a85c8d7ac41bc97", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "01bab795ab1e": { "name": "git.commit#1", diff --git a/mobile/rpc-foundation/goldens/sc-review-commit.json b/mobile/rpc-foundation/goldens/sc-review-commit.json index 86d07d748e2..c4c3f82463c 100644 --- a/mobile/rpc-foundation/goldens/sc-review-commit.json +++ b/mobile/rpc-foundation/goldens/sc-review-commit.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a29d518b2d075e8e4811404e0fcbf8948fbfe53a3aefbf0948cb2f2e622e8cbb", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "17bb401abe83": { "committed": { diff --git a/mobile/rpc-foundation/goldens/sc-review-status-entries-not-array.json b/mobile/rpc-foundation/goldens/sc-review-status-entries-not-array.json index 0203f9b7787..2bbfe9a168d 100644 --- a/mobile/rpc-foundation/goldens/sc-review-status-entries-not-array.json +++ b/mobile/rpc-foundation/goldens/sc-review-status-entries-not-array.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "37ba7780ca9525ab313c0a9c781ce5bb26344e63af9272c32ae889621f383b2b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "5e330d49c396": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/sc-review-status-normalized.json b/mobile/rpc-foundation/goldens/sc-review-status-normalized.json index b0797df544e..c29943be50c 100644 --- a/mobile/rpc-foundation/goldens/sc-review-status-normalized.json +++ b/mobile/rpc-foundation/goldens/sc-review-status-normalized.json @@ -3,13 +3,14 @@ "family": "git.review-preparation", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "93193acd57d6f00abc8e6c22ec3a8f1ca6ce7c5808d906d0aa7c11e41dab4635", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0278e0f0d6cf": { "name": "git.status#1", diff --git a/mobile/rpc-foundation/goldens/schedules-b3.json b/mobile/rpc-foundation/goldens/schedules-b3.json index 7ae2b532e89..220b4ee8813 100644 --- a/mobile/rpc-foundation/goldens/schedules-b3.json +++ b/mobile/rpc-foundation/goldens/schedules-b3.json @@ -3,13 +3,14 @@ "family": "linear-detail-barrier", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b59fb599dd3a5fbc79bb8602dcec4b1c51a392c662efab7efc8324fc718ce8de", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "034a83431f03": { "name": "linear.getIssue#1", diff --git a/mobile/rpc-foundation/goldens/schedules-settings-home-providers-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-home-providers-fulfilled.json index dc48a1055db..5196a2f12ae 100644 --- a/mobile/rpc-foundation/goldens/schedules-settings-home-providers-fulfilled.json +++ b/mobile/rpc-foundation/goldens/schedules-settings-home-providers-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "fbd311a377672a9335521c30734880eea1b04bab0aff367854c1deebcf66b105", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "1081ce76cc68": { "name": "linear.status#1", diff --git a/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json b/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json index a0596c4ed5b..6a5c107d83e 100644 --- a/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json +++ b/mobile/rpc-foundation/goldens/schedules-settings-new-tab-ssh.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2726d71130f623e3ad02c168c13269979ca6f84703bf1c5aaf36bd4432dfb516", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06eff8247d02": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json index 057b688d8a1..cc21cab7281 100644 --- a/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json +++ b/mobile/rpc-foundation/goldens/schedules-settings-repo-metadata-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "664eba1468e229f9ac2dced262e7ad896ead01688dff4c570f397c3f8594efd7", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json index a840f5cf913..8c7eafde756 100644 --- a/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json +++ b/mobile/rpc-foundation/goldens/schedules-settings-resume-metadata-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "7bfba3fae1dc33acf40e8a955bbfccf28580b3daee3270dec6a15e6cefd45a84", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0447fbb835ad": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json index 417c0067e98..0aae40845dd 100644 --- a/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json +++ b/mobile/rpc-foundation/goldens/schedules-settings-task-hydration-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "02e3ca10296704b5478185e9d3dc0136596a2ee57580d7f9268672568dab4cd4", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json b/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json index c94c51bc451..9f3f14035d7 100644 --- a/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json +++ b/mobile/rpc-foundation/goldens/schedules-settings-workspace-context-fulfilled.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "eb980fc027ca0200212ba6ad3bf9a1ab3460936a7bb4b04353a9462eecd287a1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "06eff8247d02": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-bot-overrides-fulfilled.json b/mobile/rpc-foundation/goldens/settings-bot-overrides-fulfilled.json index b09ca2cf30d..7da556a808a 100644 --- a/mobile/rpc-foundation/goldens/settings-bot-overrides-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-bot-overrides-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4b4b4a8d1acaaec1c8dde0233dc49a696ffe53466578477efcbcdb7263dbd617", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-bot-overrides-refresh-refused.json b/mobile/rpc-foundation/goldens/settings-bot-overrides-refresh-refused.json index 998b1f243de..711d1e294f9 100644 --- a/mobile/rpc-foundation/goldens/settings-bot-overrides-refresh-refused.json +++ b/mobile/rpc-foundation/goldens/settings-bot-overrides-refresh-refused.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "cac4980465661fba372e187699741123a4edeb9270125a0a1cad7bbb6a6adebd", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json b/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json index 948f3d3a3e5..1662fe79f25 100644 --- a/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json +++ b/mobile/rpc-foundation/goldens/settings-bot-overrides-refused.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f8ebd2348373b2b39c167735e0c418dfe868511fb5306ecba90cb6f2a905b95e", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json b/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json index 14c653fbd73..85a8bc0de4b 100644 --- a/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-bot-overrides-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.bot-overrides", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f7e63144421a689f05cc50ad87ec901a9eaeb3163165656887be12a5f2753005", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-home-coalesced.json b/mobile/rpc-foundation/goldens/settings-home-coalesced.json index 25a79b32d1d..3edbbc93f40 100644 --- a/mobile/rpc-foundation/goldens/settings-home-coalesced.json +++ b/mobile/rpc-foundation/goldens/settings-home-coalesced.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "d8d6f738ee11d84d6e9e546624f4babcb42476432f6bddbc74e8519d9ca18370", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "0241b27b279c": { "name": "settings.get#3", diff --git a/mobile/rpc-foundation/goldens/settings-home-providers-fulfilled.json b/mobile/rpc-foundation/goldens/settings-home-providers-fulfilled.json index 78875f4d390..f198b0ace0a 100644 --- a/mobile/rpc-foundation/goldens/settings-home-providers-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-home-providers-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a32b2fc99e830c58460e6f7c857aed0048738a55501e508eb236604680b9c235", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "24054d93a95f": { "name": "providers", diff --git a/mobile/rpc-foundation/goldens/settings-home-providers-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-home-providers-refuse-after-data.json index 338286ccbf7..35edc70f458 100644 --- a/mobile/rpc-foundation/goldens/settings-home-providers-refuse-after-data.json +++ b/mobile/rpc-foundation/goldens/settings-home-providers-refuse-after-data.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "78c48025c4af6cc0f1f136448c0ede9f76b7485d7b33b1356d11dec017bd9053", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "078b082b9b55": { "name": "linear.status#2", diff --git a/mobile/rpc-foundation/goldens/settings-home-providers-refused.json b/mobile/rpc-foundation/goldens/settings-home-providers-refused.json index b09870dddbb..5cbb59b2775 100644 --- a/mobile/rpc-foundation/goldens/settings-home-providers-refused.json +++ b/mobile/rpc-foundation/goldens/settings-home-providers-refused.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "c22f33a0ed28622d4d53ae31e934056f87d2c10e8dc4475831ae1ee5fd3a9b8b", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "24054d93a95f": { "name": "providers", diff --git a/mobile/rpc-foundation/goldens/settings-home-providers-transport-error.json b/mobile/rpc-foundation/goldens/settings-home-providers-transport-error.json index 21844890384..25d6642a6e0 100644 --- a/mobile/rpc-foundation/goldens/settings-home-providers-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-home-providers-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.home-providers", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4f16b43dddfb9257828342b0297317868df24b03fd98a89c66f5cd1897829d73", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "163d57ce469e": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-new-tab-refused.json b/mobile/rpc-foundation/goldens/settings-new-tab-refused.json index 362c5b957a2..f7e57aaf56e 100644 --- a/mobile/rpc-foundation/goldens/settings-new-tab-refused.json +++ b/mobile/rpc-foundation/goldens/settings-new-tab-refused.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b6fb40be3bb92d7d9f1a79d99dee077cf95097077917679dc99702f912241fa4", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-new-tab-ssh.json b/mobile/rpc-foundation/goldens/settings-new-tab-ssh.json index 9f2e02cf282..3e3729245bf 100644 --- a/mobile/rpc-foundation/goldens/settings-new-tab-ssh.json +++ b/mobile/rpc-foundation/goldens/settings-new-tab-ssh.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "31f8a348322551738b14207b3477bae492d48d45c5d51be4d97ffaca2fe2b6e1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json b/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json index 0bd5db38fc4..0f79d30fa41 100644 --- a/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-new-tab-transport-error.json @@ -3,13 +3,14 @@ "family": "settings-agent-read", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "1347663aba0ada1eee8e88fac306757dc0d29fe21f0d062ac2d3968a30a2f214", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-repo-cache-expiry.json b/mobile/rpc-foundation/goldens/settings-repo-cache-expiry.json index c59b0444a5a..b7bfa5ab580 100644 --- a/mobile/rpc-foundation/goldens/settings-repo-cache-expiry.json +++ b/mobile/rpc-foundation/goldens/settings-repo-cache-expiry.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "adebd553e2648278d719a1d7299cb36683fce714682a1ab7b49d4c9027eea34e", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-fulfilled.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-fulfilled.json index 2ad0d736e54..1dcaccdec53 100644 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-repo-metadata-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b45eba2007e8e2668f524cd7503b8a711eba67816c9c35af5c3725a1afe32d8d", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json index abc8bf40330..27bd3159e29 100644 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json +++ b/mobile/rpc-foundation/goldens/settings-repo-metadata-refuse-after-data.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b1c0b957b828c32e7ec388ec6668273fe84bbe5d11d8286b9a246fa92395a26e", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json index c98c25b2a45..20475c72af4 100644 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json +++ b/mobile/rpc-foundation/goldens/settings-repo-metadata-refused.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "867b6905c8a533ddd1c7c8174bf4aadd5fd725cc72bdddbcb2ea8af26e219078", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-single-host.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-single-host.json index 2e01d9e1fbe..b889cc0db12 100644 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-single-host.json +++ b/mobile/rpc-foundation/goldens/settings-repo-metadata-single-host.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "d8a00a72849f1ed254c3b35ebcc330dd1bb15b189f006bd1517853a19e53de6c", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "2bd489a9fa29": { "repoColorsByName": [ diff --git a/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json b/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json index f609f422ddc..e3f86b71eb6 100644 --- a/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-repo-metadata-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.repo-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "741db13a84dbcec2e97e80605d742e69558954657c72f8450f3f8bc177dd01b6", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02449e890487": { "name": "host.platform#1", diff --git a/mobile/rpc-foundation/goldens/settings-resume-metadata-fulfilled.json b/mobile/rpc-foundation/goldens/settings-resume-metadata-fulfilled.json index f759c38ef00..3d29c1d46ea 100644 --- a/mobile/rpc-foundation/goldens/settings-resume-metadata-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-resume-metadata-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "7a8d0a5305aafea56733c229989b6e825fe9b8a681f48f6cef405350304520b6", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "14a657727096": { "name": "worktree.ps#1", diff --git a/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json index f821dbfcbd9..6330d39ab1d 100644 --- a/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json +++ b/mobile/rpc-foundation/goldens/settings-resume-metadata-refuse-after-data.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a11756ecaf7c2d3955b9512aa7479ca55d810341f1492f472985abb538e140e8", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "14a657727096": { "name": "worktree.ps#1", diff --git a/mobile/rpc-foundation/goldens/settings-resume-metadata-refused.json b/mobile/rpc-foundation/goldens/settings-resume-metadata-refused.json index 33f1ab3a526..1899a1fc06d 100644 --- a/mobile/rpc-foundation/goldens/settings-resume-metadata-refused.json +++ b/mobile/rpc-foundation/goldens/settings-resume-metadata-refused.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "def0640be601a8013f9537f161b60d8c14ac9551931e5ee4d4cc2acd3c2baf2a", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "14a657727096": { "name": "worktree.ps#1", diff --git a/mobile/rpc-foundation/goldens/settings-resume-metadata-transport-error.json b/mobile/rpc-foundation/goldens/settings-resume-metadata-transport-error.json index a1a288f7ed4..00ee88aa448 100644 --- a/mobile/rpc-foundation/goldens/settings-resume-metadata-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-resume-metadata-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.resume-metadata", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "17c31d0c2b7ae5322fd59bafcfa1d2779ae9eff841e12c0cf16b27e454b49f13", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "14a657727096": { "name": "worktree.ps#1", diff --git a/mobile/rpc-foundation/goldens/settings-task-hydration-fulfilled.json b/mobile/rpc-foundation/goldens/settings-task-hydration-fulfilled.json index 66fe1ba3511..01f7a6dedaf 100644 --- a/mobile/rpc-foundation/goldens/settings-task-hydration-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-task-hydration-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "c08cce5d1f71761dbf504863b736e5546abb42b9ff4ab8ced65c7c42e3d66c0e", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/settings-task-hydration-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-task-hydration-refuse-after-data.json index 0884fd84580..fb613fe5bdc 100644 --- a/mobile/rpc-foundation/goldens/settings-task-hydration-refuse-after-data.json +++ b/mobile/rpc-foundation/goldens/settings-task-hydration-refuse-after-data.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b23c3076081901c89e8a8fb8d20028e03f030db040c9cd793b6f2c7cd49d8f25", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json b/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json index 87a0cc045cb..9d12b5ec505 100644 --- a/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json +++ b/mobile/rpc-foundation/goldens/settings-task-hydration-refused.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a510ff7505cddbd6dad3c7e5a2dcde206a5dab1940901511d72c97aca576a6f1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/settings-task-hydration-transport-error.json b/mobile/rpc-foundation/goldens/settings-task-hydration-transport-error.json index 690c83c62c9..643f2b34501 100644 --- a/mobile/rpc-foundation/goldens/settings-task-hydration-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-task-hydration-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.task-hydration", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "d4a2fef3aefb78bdb4aed94fda982124f24a3af3832227654d324735f44aaeeb", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "002ad269dd44": { "name": "showLinearConnect", diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json b/mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json new file mode 100644 index 00000000000..6b528d49409 --- /dev/null +++ b/mobile/rpc-foundation/goldens/settings-task-workspace-create-linear.json @@ -0,0 +1,241 @@ +{ + "operation": "settings.task-workspace-create", + "family": "settings.task-workspace-create", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "662c3e04e31bce5757f09f91e3e3739fb9d57767b7443be4dc936705b64b1432", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "067cef118d9f": { + "name": "runtimeTaskSettings", + "value": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "090c88478661": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "0f72e7ee78c9": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "createdWithAgent": "claude", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "name": "orc-1", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://linear.app/orca/issue/ORC-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "worktree": { + "displayName": "ORC-1 Recorded issue", + "id": "wt-1" + } + } + } + } + }, + "180125f5d1a6": { + "name": "workspaceCreateDraft", + "value": { + "$rpc": "null" + } + }, + "2473f12c7cdd": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + } + } + } + }, + "33e3b949d4c5": { + "creating": { + "$rpc": "null" + }, + "error": "", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "6eb4e79ad99a": { + "name": "setupPrompt", + "value": { + "$rpc": "null" + } + }, + "730f92993963": { + "name": "creatingKey", + "value": "linear:1" + }, + "7abdfe20af50": { + "creating": "linear:1", + "error": "", + "settings": { + "disabledTuiAgents": ["claude"] + } + }, + "7ddcb1852b39": { + "name": "settings.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" + }, + "7ee99993a895": { + "name": "navigation", + "value": "/h/host-1/session/wt-1?name=ORC-1+Recorded+issue&created=1" + }, + "82cd71d524c8": { + "name": "error", + "value": "" + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "ac9996319e05": { + "name": "actionItem", + "value": { + "$rpc": "null" + } + }, + "baa74a0ec378": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"orc-1\",\"displayName\":\"ORC-1 Recorded issue\",\"displayNameKind\":\"generated\",\"linkedLinearIssue\":\"ORC-1\",\"setupDecision\":\"inherit\",\"activate\":true,\"startupDraft\":\"https://linear.app/orca/issue/ORC-1\",\"createdWithAgent\":\"claude\"}}" + }, + "c9cb32059b8d": { + "name": "creatingKey", + "value": { + "$rpc": "null" + } + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + } + }, + "recording": { + "scenario": "settings-task-workspace-create-linear", + "checkpoints": [ + { + "id": "settings-pending", + "observation": { + "sender": ["090c88478661"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "9270aeb7d9c6" + }, + "state": "7abdfe20af50", + "effects": ["730f92993963", "82cd71d524c8"] + } + }, + { + "id": "created", + "observation": { + "sender": ["2473f12c7cdd", "0f72e7ee78c9"], + "payloads": ["7ddcb1852b39", "baa74a0ec378"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "33e3b949d4c5", + "effects": [ + "730f92993963", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "7ee99993a895", + "c9cb32059b8d" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-create-pr-start-point.json b/mobile/rpc-foundation/goldens/settings-task-workspace-create-pr-start-point.json new file mode 100644 index 00000000000..ebdfc322c9a --- /dev/null +++ b/mobile/rpc-foundation/goldens/settings-task-workspace-create-pr-start-point.json @@ -0,0 +1,335 @@ +{ + "operation": "settings.task-workspace-create", + "family": "settings.task-workspace-create", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "8ae9e1dbb32d404eac9e01f71dacf1c37497030220a8e988c0093bb7ed2d159b", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "067cef118d9f": { + "name": "runtimeTaskSettings", + "value": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "090c88478661": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "180125f5d1a6": { + "name": "workspaceCreateDraft", + "value": { + "$rpc": "null" + } + }, + "2473f12c7cdd": { + "name": "settings.get#1", + "args": [ + { + "name": "method", + "value": "settings.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + } + } + } + }, + "33e3b949d4c5": { + "creating": { + "$rpc": "null" + }, + "error": "", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "3dc266b1bda1": { + "creating": "github:7", + "error": "", + "settings": { + "defaultTuiAgent": "codex", + "disabledTuiAgents": [] + } + }, + "52051fd3214e": { + "creating": "github:7", + "error": "", + "settings": { + "disabledTuiAgents": ["claude"] + } + }, + "6eb4e79ad99a": { + "name": "setupPrompt", + "value": { + "$rpc": "null" + } + }, + "7ddcb1852b39": { + "name": "settings.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"settings.get\"}" + }, + "82cd71d524c8": { + "name": "error", + "value": "" + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "9e9f36142bbd": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "baseBranch": "main", + "createdWithAgent": "claude", + "displayName": "Recorded pull request", + "displayNameKind": "generated", + "linkedPR": 7, + "name": "pr-7", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://github.com/o/r/pull/7" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "warning": "shallow clone", + "worktree": { + "id": "wt-2" + } + } + } + } + }, + "a49b109c46d4": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "activate": true, + "baseBranch": "main", + "createdWithAgent": "claude", + "displayName": "Recorded pull request", + "displayNameKind": "generated", + "linkedPR": 7, + "name": "pr-7", + "repo": "id:repo-1", + "setupDecision": "inherit", + "startupDraft": "https://github.com/o/r/pull/7" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "ac9996319e05": { + "name": "actionItem", + "value": { + "$rpc": "null" + } + }, + "b66f6d1958b9": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"pr-7\",\"displayName\":\"Recorded pull request\",\"displayNameKind\":\"generated\",\"setupDecision\":\"inherit\",\"activate\":true,\"startupDraft\":\"https://github.com/o/r/pull/7\",\"createdWithAgent\":\"claude\",\"baseBranch\":\"main\",\"linkedPR\":7}}" + }, + "be0ebed89b2b": { + "name": "navigation", + "value": "/h/host-1/session/wt-2?name=Recorded+pull+request&created=1&warning=shallow+clone" + }, + "c9cb32059b8d": { + "name": "creatingKey", + "value": { + "$rpc": "null" + } + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ecc2acd4d70d": { + "name": "worktree.resolvePrBase#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolvePrBase\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":7}}" + }, + "ecefc28694cb": { + "name": "creatingKey", + "value": "github:7" + }, + "f9e183f427ee": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "prNumber": 7, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "baseBranch": "main" + } + } + } + } + }, + "recording": { + "scenario": "settings-task-workspace-create-pr-start-point", + "checkpoints": [ + { + "id": "settings-pending", + "observation": { + "sender": ["090c88478661"], + "payloads": ["7ddcb1852b39"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "9270aeb7d9c6" + }, + "state": "52051fd3214e", + "effects": ["ecefc28694cb", "82cd71d524c8"] + } + }, + { + "id": "pr-base-resolved", + "observation": { + "sender": ["2473f12c7cdd", "f9e183f427ee", "a49b109c46d4"], + "payloads": ["7ddcb1852b39", "ecc2acd4d70d", "b66f6d1958b9"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "9270aeb7d9c6" + }, + "state": "3dc266b1bda1", + "effects": ["ecefc28694cb", "82cd71d524c8", "067cef118d9f"] + } + }, + { + "id": "created-from-pr-base", + "observation": { + "sender": ["2473f12c7cdd", "f9e183f427ee", "9e9f36142bbd"], + "payloads": ["7ddcb1852b39", "ecc2acd4d70d", "b66f6d1958b9"], + "settlements": { + "mount": "eb79a9b3682a", + "submit": "eb79a9b3682a" + }, + "state": "33e3b949d4c5", + "effects": [ + "ecefc28694cb", + "82cd71d524c8", + "067cef118d9f", + "ac9996319e05", + "180125f5d1a6", + "6eb4e79ad99a", + "be0ebed89b2b", + "c9cb32059b8d" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-fulfilled.json b/mobile/rpc-foundation/goldens/settings-task-workspace-fulfilled.json index fa1e27c96f4..b5f33c9b894 100644 --- a/mobile/rpc-foundation/goldens/settings-task-workspace-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-task-workspace-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.task-workspace", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "5c4c890e4c71e80fa8847a5e29700fc9df3ac3bd634bad6289db37522fadd621", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json b/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json index 6a1fb0525ed..4801e2a0d73 100644 --- a/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json +++ b/mobile/rpc-foundation/goldens/settings-task-workspace-refused.json @@ -3,13 +3,14 @@ "family": "settings.task-workspace", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a699a0a5b128fa422dab0c7557b5aa18599b2d23fa6685cdcc02e17edf328af1", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json b/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json index 4b9c5290912..98854fc1c5d 100644 --- a/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-task-workspace-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.task-workspace", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a5e812cd508826b3f01ec3798c621ab4303de6536a364113f01a4770dd197bb5", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-task-write.json b/mobile/rpc-foundation/goldens/settings-task-write.json index 97b0ac7936f..db1240222c2 100644 --- a/mobile/rpc-foundation/goldens/settings-task-write.json +++ b/mobile/rpc-foundation/goldens/settings-task-write.json @@ -3,13 +3,14 @@ "family": "settings-best-effort", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "bbcdefe16b07068a81f3c46ae60df01ccb0fbe5a7c1eade3f584f6f0130c23fe", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "2369258c9999": { "name": "settings.update#1", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-context-fulfilled.json b/mobile/rpc-foundation/goldens/settings-workspace-context-fulfilled.json index 639330f0aa7..dae8f376485 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-context-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-context-fulfilled.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "287f94e469548f28c9d5591ff6ffb916fa22caa18776b091542b75704c9e1fee", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-context-refuse-after-data.json b/mobile/rpc-foundation/goldens/settings-workspace-context-refuse-after-data.json index 8b03d8f17ff..9999437344d 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-context-refuse-after-data.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-context-refuse-after-data.json @@ -3,13 +3,14 @@ "family": "settings.workspace-context", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "76793a56e7b9e596d8c42e9a5a1c47337db32d7437bec2e41d6e7253943f3fd8", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "02f9384f5305": { "name": "settings.get#2", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-context-refused.json b/mobile/rpc-foundation/goldens/settings-workspace-context-refused.json index 4f4031319f6..a8dc6c01abb 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-context-refused.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-context-refused.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "ad19fc24973b49ee7d14bc31460a7e4af5d207db6a2375b52b5a0aa878e09205", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json b/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json index 4a83c6a3f5c..e8b23a18e38 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-context-transport-error.json @@ -1,15 +1,16 @@ { "operation": "settings.workspace-context", "family": "settings.workspace-context", - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"], + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a2c80c9cdbb631f3a8fa648dfbb9e691418467d6ead8fe769d72e7e1d8b552b4", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-submit-fulfilled.json b/mobile/rpc-foundation/goldens/settings-workspace-submit-fulfilled.json index 1e4586b37ee..6e0ec7222de 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-submit-fulfilled.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-submit-fulfilled.json @@ -3,13 +3,14 @@ "family": "settings.workspace-submit", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b10ff86086c134284cb0446e8857cd4b55f5ff2bd0507388ec659a95f25e2a19", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json b/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json index 64245dead80..098936d586b 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-submit-refused.json @@ -3,13 +3,14 @@ "family": "settings.workspace-submit", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "373ea3743dac4e0845df01d5c8f75c909563b8c517f3858293a478234dc9ca5c", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json b/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json index ff6f1d3b8fc..38b79386d3e 100644 --- a/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json +++ b/mobile/rpc-foundation/goldens/settings-workspace-submit-transport-error.json @@ -3,13 +3,14 @@ "family": "settings.workspace-submit", "namedDeltas": [], "runnerVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", - "recorderSha256": "6a12160a87ceab04e74198f6dd35b8cf9125794222ee95cf6ca1872f29849960", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "dfbacbd6392ae8e8199550952fe917e7c01182349df6c99a06eb0682cfd9175c", "platform": "darwin", "scenarioVersion": 1, "projectionVersion": 2, - "goldenFormatVersion": 3, + "goldenFormatVersion": 4, "values": { "090c88478661": { "name": "settings.get#1", diff --git a/mobile/rpc-foundation/goldens/tw-capabilities-advertised.json b/mobile/rpc-foundation/goldens/tw-capabilities-advertised.json new file mode 100644 index 00000000000..8ee2df59655 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-capabilities-advertised.json @@ -0,0 +1,99 @@ +{ + "operation": "tasks.worktree-capabilities", + "family": "worktree.runtime-capabilities", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "9d79bcfd6957d11d5ce8c3296f1038a3cfab81eedad7f990b44071104dfd0f91", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "1e5b32902af7": { + "name": "status.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" + }, + "5242fad3532f": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "capabilities": ["mobile.tasks.v1", "worktree.create-idempotency.v1"], + "platform": "linux", + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + } + } + } + } + }, + "62aaf19f0b16": { + "capabilities": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": true, + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + } + } + }, + "b33d34bddc4e": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": true, + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + } + } + } + }, + "recording": { + "scenario": "tw-capabilities-advertised", + "checkpoints": [ + { + "id": "probed", + "observation": { + "sender": ["5242fad3532f"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "b33d34bddc4e" + }, + "state": "62aaf19f0b16", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-capabilities-cutover-retried.json b/mobile/rpc-foundation/goldens/tw-capabilities-cutover-retried.json new file mode 100644 index 00000000000..d5e2b80de00 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-capabilities-cutover-retried.json @@ -0,0 +1,185 @@ +{ + "operation": "tasks.worktree-capabilities", + "family": "worktree.runtime-capabilities", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "fb9c0e4b7c34f9bd1bd355b606c6ba75a7583cff3788000b7ed013612f5574fe", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "1e5b32902af7": { + "name": "status.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" + }, + "32354557bece": { + "capabilities": "unprobed" + }, + "4e6e53404f59": { + "capabilities": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": true, + "worktreeCreateIdempotency": false + } + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "a8bcef1e95ed": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": true, + "worktreeCreateIdempotency": false + } + }, + "ae9ff6b74ec1": { + "name": "status.get#2", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "capabilities": ["mobile.tasks.v1"] + } + } + } + }, + "c0c86e67c300": { + "name": "status.get#2", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" + }, + "c9c0513fdcb9": { + "name": "status.get#2", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "edf54746317d": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "LogicalClientCutoverError", + "message": "RPC interrupted by connection migration", + "isRpcDeliveryUnknown": true, + "cause": { + "category": "Error", + "message": "Connection closed", + "isRpcDeliveryUnknown": true + } + } + } + } + }, + "recording": { + "scenario": "tw-capabilities-cutover-retried", + "checkpoints": [ + { + "id": "reprobing-after-cutover", + "observation": { + "sender": ["edf54746317d", "c9c0513fdcb9"], + "payloads": ["1e5b32902af7", "c0c86e67c300"], + "settlements": { + "probe": "9270aeb7d9c6", + "migrate": "eb79a9b3682a" + }, + "state": "32354557bece", + "effects": [] + } + }, + { + "id": "probed-on-replacement", + "observation": { + "sender": ["edf54746317d", "ae9ff6b74ec1"], + "payloads": ["1e5b32902af7", "c0c86e67c300"], + "settlements": { + "probe": "a8bcef1e95ed", + "migrate": "eb79a9b3682a" + }, + "state": "4e6e53404f59", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json b/mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json new file mode 100644 index 00000000000..a761daaf96d --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-capabilities-legacy-idempotency.json @@ -0,0 +1,95 @@ +{ + "operation": "tasks.worktree-capabilities", + "family": "worktree.runtime-capabilities", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "d73fed49e0a7e3e054d5c2fa75780f98bf78b6fa7e02f1ccb2fdc49465cf2fe5", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "03f6a4ac937a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": false, + "worktreeCreateIdempotency": { + "dedupeTtlMs": 60000 + } + } + }, + "1e5b32902af7": { + "name": "status.get#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}" + }, + "3b0c9705ec9a": { + "capabilities": { + "hostPlatform": { + "$rpc": "null" + }, + "tasksSupported": false, + "worktreeCreateIdempotency": { + "dedupeTtlMs": 60000 + } + } + }, + "488c988b5918": { + "name": "status.get#1", + "args": [ + { + "name": "method", + "value": "status.get" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "capabilities": ["worktree.create-idempotency.v1"] + } + } + } + } + }, + "recording": { + "scenario": "tw-capabilities-legacy-idempotency", + "checkpoints": [ + { + "id": "legacy-host-window", + "observation": { + "sender": ["488c988b5918"], + "payloads": ["1e5b32902af7"], + "settlements": { + "probe": "03f6a4ac937a" + }, + "state": "3b0c9705ec9a", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-after-drop.json b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-after-drop.json new file mode 100644 index 00000000000..37bb5937cf6 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-after-drop.json @@ -0,0 +1,109 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "a99bb80a5826af1df8d74114fcc5654aa42c9208747b512cea9bd5ca65b64ccb", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "3b42c7d5a39b": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection lost", + "isRpcDeliveryUnknown": true + } + } + }, + "3f946ad0279c": { + "outcome": "uncreated" + }, + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "f0d75436c3f2": { + "status": "rejected", + "startedAt": 0, + "settledAt": 20000, + "error": { + "category": "Error", + "message": "Connection lost", + "isRpcDeliveryUnknown": true + } + } + }, + "recording": { + "scenario": "tw-create-retry-ambiguous-after-drop", + "checkpoints": [ + { + "id": "waiting-for-reconnect", + "observation": { + "sender": ["3b42c7d5a39b"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "9270aeb7d9c6", + "drop": "eb79a9b3682a" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "replay-window-abandoned", + "observation": { + "sender": ["3b42c7d5a39b"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "f0d75436c3f2", + "drop": "eb79a9b3682a" + }, + "state": "3f946ad0279c", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-while-connected.json b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-while-connected.json new file mode 100644 index 00000000000..c684e951815 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-while-connected.json @@ -0,0 +1,83 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3cda09e4a4ad4092f5f9a48b7c9715a99a51eb3bc4bed00f7054537a9e21cea9", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "3f946ad0279c": { + "outcome": "uncreated" + }, + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "4b9d2713abf2": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Request timed out", + "isRpcDeliveryUnknown": true + } + }, + "50eee544463d": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Request timed out", + "isRpcDeliveryUnknown": true + } + } + } + }, + "recording": { + "scenario": "tw-create-retry-ambiguous-while-connected", + "checkpoints": [ + { + "id": "unknown-not-failed", + "observation": { + "sender": ["50eee544463d"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "4b9d2713abf2" + }, + "state": "3f946ad0279c", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json new file mode 100644 index 00000000000..ab56121335a --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-ambiguous-without-idempotency.json @@ -0,0 +1,82 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "61097c13b262a4454510936fa9c9554a07865b610f18407f1b67bdd74476df08", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "3f946ad0279c": { + "outcome": "uncreated" + }, + "6d0209806267": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection lost", + "isRpcDeliveryUnknown": true + } + }, + "99d539e63c12": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\"}}" + }, + "a179866627c5": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection lost", + "isRpcDeliveryUnknown": true + } + } + } + }, + "recording": { + "scenario": "tw-create-retry-ambiguous-without-idempotency", + "checkpoints": [ + { + "id": "unstamped-create-is-not-replayed", + "observation": { + "sender": ["a179866627c5"], + "payloads": ["99d539e63c12"], + "settlements": { + "create": "6d0209806267" + }, + "state": "3f946ad0279c", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-created.json b/mobile/rpc-foundation/goldens/tw-create-retry-created.json new file mode 100644 index 00000000000..a217bd898bc --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-created.json @@ -0,0 +1,90 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "0278216fee698c00118bb0e73a7fe755dc59c3b8e2b0459153edae64f155774c", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "489c189aebca": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "worktree": { + "displayName": "kestrel", + "id": "repo-1::/w" + } + } + } + } + }, + "b32227fdb10b": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "name": "kestrel", + "worktreeId": "repo-1::/w" + } + }, + "df162b95f465": { + "outcome": { + "name": "kestrel", + "worktreeId": "repo-1::/w" + } + } + }, + "recording": { + "scenario": "tw-create-retry-created", + "checkpoints": [ + { + "id": "created", + "observation": { + "sender": ["489c189aebca"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "b32227fdb10b" + }, + "state": "df162b95f465", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-name-collision.json b/mobile/rpc-foundation/goldens/tw-create-retry-name-collision.json new file mode 100644 index 00000000000..89512856323 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-name-collision.json @@ -0,0 +1,176 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "6cb658dadc9e146c4f36c6ce643451e72300b8cdda19cc684ffa9fb2b0822c0a", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "2b7c07c2d2af": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "conflict", + "message": "Branch \"kestrel\" already exists." + }, + "id": "frame-1", + "ok": false + } + } + }, + "3f946ad0279c": { + "outcome": "uncreated" + }, + "3fa75e508233": { + "name": "worktree.create#2", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel-2\",\"clientMutationId\":\"mutation-2\"}}" + }, + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "9270aeb7d9c6": { + "status": "pending", + "startedAt": 0 + }, + "96ffe866d064": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "name": "kestrel-2", + "worktreeId": "repo-1::/w2" + } + }, + "c277d86477c3": { + "name": "worktree.create#2", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-2", + "name": "kestrel-2", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "pending", + "startedAt": 0 + } + }, + "d0c9ecd48c97": { + "name": "worktree.create#2", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-2", + "name": "kestrel-2", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "worktree": { + "displayName": "kestrel-2", + "id": "repo-1::/w2" + } + } + } + } + }, + "db70004d62eb": { + "outcome": { + "name": "kestrel-2", + "worktreeId": "repo-1::/w2" + } + } + }, + "recording": { + "scenario": "tw-create-retry-name-collision", + "checkpoints": [ + { + "id": "retrying", + "observation": { + "sender": ["2b7c07c2d2af", "c277d86477c3"], + "payloads": ["43a221c63628", "3fa75e508233"], + "settlements": { + "create": "9270aeb7d9c6" + }, + "state": "3f946ad0279c", + "effects": [] + } + }, + { + "id": "created-suffixed", + "observation": { + "sender": ["2b7c07c2d2af", "d0c9ecd48c97"], + "payloads": ["43a221c63628", "3fa75e508233"], + "settlements": { + "create": "96ffe866d064" + }, + "state": "db70004d62eb", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json b/mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json new file mode 100644 index 00000000000..ed6e4c5b69d --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-unretryable-refusal.json @@ -0,0 +1,86 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "16abe9e1a8d4cff17b3ea29d40277ae30a3d555a4a9efa08b2745c3a85b02740", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "240b0b1c72b2": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": "" + } + }, + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "43e8315bc2fe": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "internal", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "7d651cae8837": { + "outcome": { + "error": "" + } + } + }, + "recording": { + "scenario": "tw-create-retry-unretryable-refusal", + "checkpoints": [ + { + "id": "refused-empty-message", + "observation": { + "sender": ["43e8315bc2fe"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "240b0b1c72b2" + }, + "state": "7d651cae8837", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json b/mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json new file mode 100644 index 00000000000..bccc6cbc9c0 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-create-retry-warning-kept.json @@ -0,0 +1,92 @@ +{ + "operation": "tasks.worktree-create-retry", + "family": "worktree.create-retry", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f469b2b7d61e7fc500fa97b5548f5a3732b0dbcdb405412a514a609f786dfbb5", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "43a221c63628": { + "name": "worktree.create#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.create\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"kestrel\",\"clientMutationId\":\"mutation-1\"}}" + }, + "6ad759c47a41": { + "name": "worktree.create#1", + "args": [ + { + "name": "method", + "value": "worktree.create" + }, + { + "name": "params", + "value": { + "clientMutationId": "mutation-1", + "name": "kestrel", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 600000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "warning": " startup terminal failed ", + "worktree": { + "id": "repo-1::/w" + } + } + } + } + }, + "97555d579c32": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "name": "kestrel", + "warning": "startup terminal failed", + "worktreeId": "repo-1::/w" + } + }, + "f800fc04633e": { + "outcome": { + "name": "kestrel", + "warning": "startup terminal failed", + "worktreeId": "repo-1::/w" + } + } + }, + "recording": { + "scenario": "tw-create-retry-warning-kept", + "checkpoints": [ + { + "id": "created-with-warning", + "observation": { + "sender": ["6ad759c47a41"], + "payloads": ["43a221c63628"], + "settlements": { + "create": "97555d579c32" + }, + "state": "f800fc04633e", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json b/mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json new file mode 100644 index 00000000000..dc96fe98d76 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-hosted-base-resolved.json @@ -0,0 +1,158 @@ +{ + "operation": "tasks.composer-hosted-base", + "family": "worktree.hosted-base", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "b3734c24f8a083d3efcdd995ea6a57e608d3d3ae3bbbd514db19dcf69448fa48", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0e24d2a37a0d": { + "name": "worktree.resolvePrBase#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolvePrBase\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"headRefName\":\"feature\"}}" + }, + "236529aa012d": { + "mrBase": "unresolved", + "prBase": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "3cca8119f144": { + "mrBase": { + "baseBranch": "develop" + }, + "prBase": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "4febe923ceea": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + } + } + }, + "5428de0f5130": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + }, + "69afcaf1cb72": { + "name": "worktree.resolveMrBase#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolveMrBase\",\"params\":{\"repo\":\"id:repo-1\",\"mrIid\":7,\"sourceBranch\":\"feature\"}}" + }, + "aad8e7ddeea2": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "baseBranch": "develop" + } + } + } + }, + "fd552ecb03da": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "baseBranch": "develop" + } + } + }, + "recording": { + "scenario": "tw-hosted-base-resolved", + "checkpoints": [ + { + "id": "pr-base-resolved", + "observation": { + "sender": ["4febe923ceea"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "5428de0f5130" + }, + "state": "236529aa012d", + "effects": [] + } + }, + { + "id": "mr-base-resolved", + "observation": { + "sender": ["4febe923ceea", "aad8e7ddeea2"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "5428de0f5130", + "mr": "fd552ecb03da" + }, + "state": "3cca8119f144", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-hosted-base-soft-error.json b/mobile/rpc-foundation/goldens/tw-hosted-base-soft-error.json new file mode 100644 index 00000000000..4801966ea3f --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-hosted-base-soft-error.json @@ -0,0 +1,148 @@ +{ + "operation": "tasks.composer-hosted-base", + "family": "worktree.hosted-base", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "451e74a430d2549976fa360a0e43e76a8d855b1470b8e313797019770ceca4cb", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0e24d2a37a0d": { + "name": "worktree.resolvePrBase#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolvePrBase\",\"params\":{\"repo\":\"id:repo-1\",\"prNumber\":12,\"headRefName\":\"feature\"}}" + }, + "69afcaf1cb72": { + "name": "worktree.resolveMrBase#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"worktree.resolveMrBase\",\"params\":{\"repo\":\"id:repo-1\",\"mrIid\":7,\"sourceBranch\":\"feature\"}}" + }, + "723a115a3810": { + "name": "worktree.resolveMrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolveMrBase" + }, + { + "name": "params", + "value": { + "mrIid": 7, + "repo": "id:repo-1", + "sourceBranch": "feature" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": "" + } + } + } + }, + "ae0c82b12f2a": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "pull request not found", + "isRpcDeliveryUnknown": false + } + }, + "c57e06c96492": { + "mrBase": "unresolved", + "prBase": "unresolved" + }, + "eb01c2306db5": { + "name": "worktree.resolvePrBase#1", + "args": [ + { + "name": "method", + "value": "worktree.resolvePrBase" + }, + { + "name": "params", + "value": { + "headRefName": "feature", + "prNumber": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": "pull request not found" + } + } + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + } + }, + "recording": { + "scenario": "tw-hosted-base-soft-error", + "checkpoints": [ + { + "id": "in-band-error", + "observation": { + "sender": ["eb01c2306db5"], + "payloads": ["0e24d2a37a0d"], + "settlements": { + "pr": "ae0c82b12f2a" + }, + "state": "c57e06c96492", + "effects": [] + } + }, + { + "id": "in-band-empty-error", + "observation": { + "sender": ["eb01c2306db5", "723a115a3810"], + "payloads": ["0e24d2a37a0d", "69afcaf1cb72"], + "settlements": { + "pr": "ae0c82b12f2a", + "mr": "f3b516f62081" + }, + "state": "c57e06c96492", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json b/mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json new file mode 100644 index 00000000000..4f3ca9bd3e4 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-paste-lookup-resolved.json @@ -0,0 +1,340 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "1fb1cdc8a2544e25547175760143a61355900a3ed4b87e08a1fa0dd2409e317d", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "09b235c17bb0": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "0e9d6525a582": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "11ab96fde6c9": { + "name": "gitlab.workItemByPath#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.workItemByPath\",\"params\":{\"repo\":\"id:repo-1\",\"host\":\"gitlab.com\",\"path\":\"group/project\",\"iid\":7,\"type\":\"issue\"}}" + }, + "2113a0cc7708": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [ + [ + "repo-1", + { + "owner": "owner", + "repo": "repo" + } + ] + ], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + }, + "repo-slug": { + "displayName": "Repo", + "id": "repo-1", + "slug": { + "$rpc": "null" + } + } + }, + "4a3429622287": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [], + "gitlab-path": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "65342779da15": { + "name": "github.workItem#1", + "args": [ + { + "name": "method", + "value": "github.workItem" + }, + { + "name": "params", + "value": { + "number": 12, + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + }, + "731507dd2e23": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + } + }, + "7445a582a9c8": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "owner": "owner", + "repo": "repo" + } + } + } + }, + "a45a7dd68af6": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "aaf80675fc49": { + "name": "github.workItem#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItem\",\"params\":{\"repo\":\"id:repo-1\",\"number\":12}}" + }, + "bd533f6b0b40": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "iid": 7, + "repoId": "repo-1", + "title": "seven" + } + }, + "e1f537905a65": { + "name": "github.workItemByOwnerRepo#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.workItemByOwnerRepo\",\"params\":{\"repo\":\"id:repo-1\",\"owner\":\"owner\",\"ownerRepo\":\"repo\",\"number\":12,\"type\":\"issue\"}}" + }, + "e29333b1693f": { + "name": "gitlab.workItemByPath#1", + "args": [ + { + "name": "method", + "value": "gitlab.workItemByPath" + }, + { + "name": "params", + "value": { + "host": "gitlab.com", + "iid": 7, + "path": "group/project", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "iid": 7, + "title": "seven" + } + } + } + }, + "e970eb27f5ca": { + "by-number": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "by-slug": { + "number": 12, + "repoId": "repo-1", + "title": "twelve" + }, + "cache": [] + }, + "f9ea1f747023": { + "name": "github.workItemByOwnerRepo#1", + "args": [ + { + "name": "method", + "value": "github.workItemByOwnerRepo" + }, + { + "name": "params", + "value": { + "number": 12, + "owner": "owner", + "ownerRepo": "repo", + "repo": "id:repo-1", + "type": "issue" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + } + } + }, + "recording": { + "scenario": "tw-paste-lookup-resolved", + "checkpoints": [ + { + "id": "by-number", + "observation": { + "sender": ["65342779da15"], + "payloads": ["aaf80675fc49"], + "settlements": { + "by-number": "731507dd2e23" + }, + "state": "09b235c17bb0", + "effects": [] + } + }, + { + "id": "by-slug", + "observation": { + "sender": ["65342779da15", "f9ea1f747023"], + "payloads": ["aaf80675fc49", "e1f537905a65"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23" + }, + "state": "e970eb27f5ca", + "effects": [] + } + }, + { + "id": "gitlab-path", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40" + }, + "state": "4a3429622287", + "effects": [] + } + }, + { + "id": "repo-slug-matched", + "observation": { + "sender": ["65342779da15", "f9ea1f747023", "e29333b1693f", "7445a582a9c8"], + "payloads": ["aaf80675fc49", "e1f537905a65", "11ab96fde6c9", "a45a7dd68af6"], + "settlements": { + "by-number": "731507dd2e23", + "by-slug": "731507dd2e23", + "gitlab-path": "bd533f6b0b40", + "repo-slug": "0e9d6525a582" + }, + "state": "2113a0cc7708", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json b/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json new file mode 100644 index 00000000000..d4518e0002d --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-refused.json @@ -0,0 +1,135 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "e9d85c576adf93063a8f56d49d28869c402cad38122732b46b8ec021d25db5e3", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0b81b65669e6": { + "name": "github.repoSlug#2", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-2" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "$rpc": "null" + } + } + } + }, + "2d9e475c68c7": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "no access" + }, + "id": "frame-1", + "ok": false + } + } + }, + "35f3e39a1c50": { + "cache": [ + [ + "repo-1", + { + "$rpc": "null" + } + ], + [ + "repo-2", + { + "$rpc": "null" + } + ] + ], + "repo-slug": { + "$rpc": "null" + } + }, + "5f7cab1e0f03": { + "name": "github.repoSlug#2", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-2\"}}" + }, + "6530ef4dbd15": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "ee20a1dc39e7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "null" + } + } + }, + "recording": { + "scenario": "tw-paste-lookup-slug-refused", + "checkpoints": [ + { + "id": "refusal-is-per-repo", + "observation": { + "sender": ["2d9e475c68c7", "0b81b65669e6"], + "payloads": ["6530ef4dbd15", "5f7cab1e0f03"], + "settlements": { + "repo-slug": "ee20a1dc39e7" + }, + "state": "35f3e39a1c50", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json b/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json new file mode 100644 index 00000000000..63595fb6223 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-paste-lookup-slug-unsupported.json @@ -0,0 +1,133 @@ +{ + "operation": "tasks.paste-lookup", + "family": "tasks.paste-lookup", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "14509b4c1cc3beb00cc329b6bae46913f59b3938f76c0bd3bf3e374f34fb680d", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0f35c09b3d1e": { + "name": "github.repoSlug#1", + "args": [ + { + "name": "method", + "value": "github.repoSlug" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "method_not_found", + "message": "Unknown method" + }, + "id": "frame-1", + "ok": false + } + } + }, + "176039835400": { + "cache": [ + [ + "repo-1", + { + "$rpc": "null" + } + ], + [ + "repo-2", + { + "$rpc": "null" + } + ] + ], + "repo-slug": { + "$rpc": "null" + }, + "repo-slug-again": { + "$rpc": "null" + } + }, + "35f3e39a1c50": { + "cache": [ + [ + "repo-1", + { + "$rpc": "null" + } + ], + [ + "repo-2", + { + "$rpc": "null" + } + ] + ], + "repo-slug": { + "$rpc": "null" + } + }, + "6530ef4dbd15": { + "name": "github.repoSlug#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.repoSlug\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "ee20a1dc39e7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "null" + } + } + }, + "recording": { + "scenario": "tw-paste-lookup-slug-unsupported", + "checkpoints": [ + { + "id": "host-wide-probe-cached", + "observation": { + "sender": ["0f35c09b3d1e"], + "payloads": ["6530ef4dbd15"], + "settlements": { + "repo-slug": "ee20a1dc39e7" + }, + "state": "35f3e39a1c50", + "effects": [] + } + }, + { + "id": "no-second-probe", + "observation": { + "sender": ["0f35c09b3d1e"], + "payloads": ["6530ef4dbd15"], + "settlements": { + "repo-slug": "ee20a1dc39e7", + "repo-slug-again": "ee20a1dc39e7" + }, + "state": "176039835400", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json b/mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json new file mode 100644 index 00000000000..6197696ed6d --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-setup-hook-trust-always.json @@ -0,0 +1,90 @@ +{ + "operation": "tasks.setup-hook-trust", + "family": "worktree.setup-hook-trust", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "0d2e3f48aadf45abbf6927b72ed5fef4caa8e3eb2efd1046339a3fbfab6f9f18", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "229c35d1a4ba": { + "trust": "unapproved" + }, + "2fde86b1acca": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "all": { + "approvedAt": 1767225600000 + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "341f646a48a2": { + "name": "ui.set#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"trustedOrcaHooks\":{\"repo-1\":{\"all\":{\"approvedAt\":1767225600000}}}}}" + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + } + }, + "recording": { + "scenario": "tw-setup-hook-trust-always", + "checkpoints": [ + { + "id": "refused-empty-message", + "observation": { + "sender": ["2fde86b1acca"], + "payloads": ["341f646a48a2"], + "settlements": { + "approve": "f3b516f62081" + }, + "state": "229c35d1a4ba", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json b/mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json new file mode 100644 index 00000000000..6c27989310b --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-setup-hook-trust-approved.json @@ -0,0 +1,100 @@ +{ + "operation": "tasks.setup-hook-trust", + "family": "worktree.setup-hook-trust", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "f54f5c6dbbe7dbcf8e85e9bd36b27ca9bea7de65d5e35dabace49b3fc766a403", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0f68ccbfb8e9": { + "name": "ui.set#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"trustedOrcaHooks\":{\"repo-1\":{\"setup\":{\"contentHash\":\"hash-1\",\"approvedAt\":1767225600000}}}}}" + }, + "6f009f61d89f": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "ok": true + } + } + } + }, + "a406b068aeca": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + }, + "b2aa9ff12623": { + "trust": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + "recording": { + "scenario": "tw-setup-hook-trust-approved", + "checkpoints": [ + { + "id": "approved", + "observation": { + "sender": ["6f009f61d89f"], + "payloads": ["0f68ccbfb8e9"], + "settlements": { + "approve": "a406b068aeca" + }, + "state": "b2aa9ff12623", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json b/mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json new file mode 100644 index 00000000000..c8b2709e36e --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-smart-search-all-providers.json @@ -0,0 +1,489 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "283849e17fb47ad5f9c128cef37a18e869a132357b332b40bec955292db2af3f", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "253629bd0d20": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "25f88995b39a": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-4", + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + } + }, + "26dc3b7c8299": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-3" + } + ] + }, + "2cfd107b9660": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "36290ab254a4": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ] + }, + "3828d5880c35": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "41d2452d4ebe": { + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "5bce68072dc3": { + "name": "github.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "github.listWorkItems" + }, + { + "name": "params", + "value": { + "limit": 36, + "query": "bug", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + } + }, + "6107c951646f": { + "name": "linear.searchIssues#1", + "args": [ + { + "name": "method", + "value": "linear.searchIssues" + }, + { + "name": "params", + "value": { + "limit": 50, + "query": "bug", + "workspaceId": "linear-workspace" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + } + }, + "6e2d75e3bbd7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ] + }, + "a4ee5d16b4f6": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-1" + } + ] + }, + "a92cd1dd05af": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-3" + } + ] + }, + "b015aaf3a53a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ] + }, + "b8b02a30b6b8": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"bug\",\"limit\":20}}" + }, + "c43e80126d82": { + "branches": [ + { + "localBranchName": "main", + "refName": "main" + }, + { + "localBranchName": "release", + "refName": "release" + } + ], + "github": [ + { + "number": 1, + "repoId": "repo-1", + "title": "one" + } + ], + "gitlab": [ + { + "iid": 2, + "repoId": "repo-1", + "title": "two" + } + ], + "linear": [ + { + "id": "issue-1" + } + ] + }, + "e97e5a589476": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "ead829dd6d03": { + "name": "linear.searchIssues#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"linear.searchIssues\",\"params\":{\"query\":\"bug\",\"limit\":50,\"workspaceId\":\"linear-workspace\"}}" + }, + "ee6fe4f97b01": { + "name": "github.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"github.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"limit\":36,\"query\":\"bug\"}}" + }, + "f32ad26605d0": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "error": { + "message": "missing", + "type": "not_found" + }, + "items": [ + { + "iid": 2, + "title": "two" + } + ] + } + } + } + }, + "fe7f60b5d785": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-5", + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + } + } + }, + "recording": { + "scenario": "tw-smart-search-all-providers", + "checkpoints": [ + { + "id": "github-items", + "observation": { + "sender": ["5bce68072dc3"], + "payloads": ["ee6fe4f97b01"], + "settlements": { + "github": "36290ab254a4" + }, + "state": "253629bd0d20", + "effects": [] + } + }, + { + "id": "gitlab-items", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0"], + "payloads": ["ee6fe4f97b01", "3828d5880c35"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7" + }, + "state": "2cfd107b9660", + "effects": [] + } + }, + { + "id": "linear-search", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6" + }, + "state": "41d2452d4ebe", + "effects": [] + } + }, + { + "id": "branch-refs", + "observation": { + "sender": ["5bce68072dc3", "f32ad26605d0", "6107c951646f", "25f88995b39a"], + "payloads": ["ee6fe4f97b01", "3828d5880c35", "ead829dd6d03", "b8b02a30b6b8"], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a" + }, + "state": "c43e80126d82", + "effects": [] + } + }, + { + "id": "linear-assigned-listed", + "observation": { + "sender": [ + "5bce68072dc3", + "f32ad26605d0", + "6107c951646f", + "25f88995b39a", + "fe7f60b5d785" + ], + "payloads": [ + "ee6fe4f97b01", + "3828d5880c35", + "ead829dd6d03", + "b8b02a30b6b8", + "e97e5a589476" + ], + "settlements": { + "github": "36290ab254a4", + "gitlab": "6e2d75e3bbd7", + "linear": "a4ee5d16b4f6", + "branches": "b015aaf3a53a", + "linear-assigned": "26dc3b7c8299" + }, + "state": "a92cd1dd05af", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json b/mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json new file mode 100644 index 00000000000..a7112240524 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-smart-search-gitlab-provider-error.json @@ -0,0 +1,165 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "4537bf83f7a030521eec549adf4490da5be183471d5a9f9e58b71815b29481ff", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "44136fa355b3": {}, + "46027e62015d": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"main\",\"limit\":20}}" + }, + "51e012c25ebf": { + "branches": [ + { + "localBranchName": "main", + "refName": "origin/main" + } + ] + }, + "522d9e5c292e": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "refDetails": [ + { + "localBranchName": "main", + "refName": "origin/main" + } + ] + } + } + } + }, + "791f6fc629fc": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "localBranchName": "main", + "refName": "origin/main" + } + ] + }, + "86057be07bd0": { + "name": "gitlab.listWorkItems#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"gitlab.listWorkItems\",\"params\":{\"repo\":\"id:repo-1\",\"state\":\"opened\",\"page\":1,\"perPage\":50,\"query\":\"bug\"}}" + }, + "97c2301d5d8c": { + "name": "gitlab.listWorkItems#1", + "args": [ + { + "name": "method", + "value": "gitlab.listWorkItems" + }, + { + "name": "params", + "value": { + "page": 1, + "perPage": 50, + "query": "bug", + "repo": "id:repo-1", + "state": "opened" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "error": { + "message": "rate limited", + "type": "quota" + }, + "items": [] + } + } + } + }, + "bf7ab976b200": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "rate limited", + "isRpcDeliveryUnknown": false + } + } + }, + "recording": { + "scenario": "tw-smart-search-gitlab-provider-error", + "checkpoints": [ + { + "id": "in-band-provider-error", + "observation": { + "sender": ["97c2301d5d8c"], + "payloads": ["86057be07bd0"], + "settlements": { + "gitlab": "bf7ab976b200" + }, + "state": "44136fa355b3", + "effects": [] + } + }, + { + "id": "branch-ref-details", + "observation": { + "sender": ["97c2301d5d8c", "522d9e5c292e"], + "payloads": ["86057be07bd0", "46027e62015d"], + "settlements": { + "gitlab": "bf7ab976b200", + "branches": "791f6fc629fc" + }, + "state": "51e012c25ebf", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json b/mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json new file mode 100644 index 00000000000..00a74986bbe --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-smart-search-linear-listed.json @@ -0,0 +1,93 @@ +{ + "operation": "tasks.smart-source-search", + "family": "tasks.smart-source-search", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "34ab4edb621856980c8678629bd809c100d27dcd0747db5abbf4508c7231b7e5", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "4e3aac46030e": { + "name": "linear.listIssues#1", + "args": [ + { + "name": "method", + "value": "linear.listIssues" + }, + { + "name": "params", + "value": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$rpc": "undefined" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": [ + { + "id": "issue-2" + } + ] + } + } + }, + "a95bdb94e589": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": [ + { + "id": "issue-2" + } + ] + }, + "b107467b4d7c": { + "name": "linear.listIssues#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"linear.listIssues\",\"params\":{\"filter\":\"assigned\",\"limit\":50}}" + }, + "f2b981b0b281": { + "linear": [ + { + "id": "issue-2" + } + ] + } + }, + "recording": { + "scenario": "tw-smart-search-linear-listed", + "checkpoints": [ + { + "id": "linear-assigned", + "observation": { + "sender": ["4e3aac46030e"], + "payloads": ["b107467b4d7c"], + "settlements": { + "linear": "a95bdb94e589" + }, + "state": "f2b981b0b281", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-task-preferences-resume-write.json b/mobile/rpc-foundation/goldens/tw-task-preferences-resume-write.json new file mode 100644 index 00000000000..131cccfa495 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-task-preferences-resume-write.json @@ -0,0 +1,154 @@ +{ + "operation": "settings.task-preferences", + "family": "settings-best-effort", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "31bfa49f888b0eb3f72873bf4a3af26129e78c23126e8fc8fe45b952caa60904", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "43a97b36b849": { + "name": "ui.set#2", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"trustedOrcaHooks\":{\"repo-1\":{\"setup\":{\"contentHash\":\"hash-1\",\"approvedAt\":1767225600000}}}}}" + }, + "8214f29cee6d": { + "name": "ui.set#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ui.set\",\"params\":{\"taskResumeState\":{\"githubItemsPreset\":\"issues\"}}}" + }, + "a569eb8ebbdd": { + "name": "ui.set#1", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "taskResumeState": { + "githubItemsPreset": "issues" + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "no access" + }, + "id": "frame-1", + "ok": false + } + } + }, + "ae0c8e22f430": { + "preset": "all" + }, + "bea815de84ac": { + "name": "ui.set#2", + "args": [ + { + "name": "method", + "value": "ui.set" + }, + { + "name": "params", + "value": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "approvedAt": 1767225600000, + "contentHash": "hash-1" + } + } + } + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "f3b516f62081": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "", + "isRpcDeliveryUnknown": false + } + } + }, + "recording": { + "scenario": "tw-task-preferences-resume-write", + "checkpoints": [ + { + "id": "best-effort-resume-write", + "observation": { + "sender": ["a569eb8ebbdd"], + "payloads": ["8214f29cee6d"], + "settlements": { + "mount": "eb79a9b3682a", + "resume": "eb79a9b3682a" + }, + "state": "ae0c8e22f430", + "effects": [] + } + }, + { + "id": "awaited-trust-write-refused", + "observation": { + "sender": ["a569eb8ebbdd", "bea815de84ac"], + "payloads": ["8214f29cee6d", "43a97b36b849"], + "settlements": { + "mount": "eb79a9b3682a", + "resume": "eb79a9b3682a", + "trust": "f3b516f62081" + }, + "state": "ae0c8e22f430", + "effects": [] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json b/mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json new file mode 100644 index 00000000000..be5d800dfa5 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-source-presets-refused.json @@ -0,0 +1,136 @@ +{ + "operation": "tasks.workspace-source", + "family": "tasks.workspace-source", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "2cd1e8972f226572744dad7da82afffbdf0452a121c1cd8c3334d5c3fde5d57c", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "2399e995a370": { + "name": "workspaceSparsePresets", + "value": [] + }, + "273f4074a9b5": { + "name": "workspaceSparsePresetsLoaded", + "value": false + }, + "35afa5cb107f": { + "name": "workspaceBaseBranchLoading", + "value": false + }, + "4cedb91a2f7a": { + "name": "repo.sparsePresets#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.sparsePresets\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "5bad21b1e042": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "5f1c84e00d4f": { + "name": "workspaceBaseBranchResults", + "value": [] + }, + "62bc28c39ffc": { + "branchError": "", + "branches": [], + "presets": [], + "presetsError": "", + "presetsLoaded": false + }, + "6c344c5f4ac0": { + "name": "workspaceBaseBranchError", + "value": "" + }, + "8353b8e1a426": { + "name": "workspaceSparsePresetsLoading", + "value": true + }, + "9357f7ea8445": { + "name": "workspaceSparsePresetId", + "value": { + "$rpc": "null" + } + }, + "cfc8af2a7169": { + "name": "workspaceSparsePresetsLoading", + "value": false + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + } + }, + "recording": { + "scenario": "tw-workspace-source-presets-refused", + "checkpoints": [ + { + "id": "presets-refused-empty-message", + "observation": { + "sender": ["5bad21b1e042"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "62bc28c39ffc", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "2399e995a370", + "273f4074a9b5", + "9357f7ea8445", + "dba381378b08", + "cfc8af2a7169" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-source-presets.json b/mobile/rpc-foundation/goldens/tw-workspace-source-presets.json new file mode 100644 index 00000000000..c740ccb382e --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-source-presets.json @@ -0,0 +1,254 @@ +{ + "operation": "tasks.workspace-source", + "family": "tasks.workspace-source", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "046dd3a125a3c9abcf5a0dd122818939b516adb91cbda2554b3409d4bb3a7980", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "1d9a7d969446": { + "name": "workspaceSparsePresetsLoaded", + "value": true + }, + "273f4074a9b5": { + "name": "workspaceSparsePresetsLoaded", + "value": false + }, + "35afa5cb107f": { + "name": "workspaceBaseBranchLoading", + "value": false + }, + "395368dea8ff": { + "name": "repo.searchRefs#1", + "args": [ + { + "name": "method", + "value": "repo.searchRefs" + }, + { + "name": "params", + "value": { + "limit": 20, + "query": "main", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 30000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "refs": ["main"] + } + } + } + }, + "46027e62015d": { + "name": "repo.searchRefs#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.searchRefs\",\"params\":{\"repo\":\"id:repo-1\",\"query\":\"main\",\"limit\":20}}" + }, + "4856f62b3650": { + "name": "workspaceSparsePresets", + "value": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + }, + "4cedb91a2f7a": { + "name": "repo.sparsePresets#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"repo.sparsePresets\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "57f06e6e349e": { + "branchError": "", + "branches": [], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "58cb95babab2": { + "name": "workspaceBaseBranchLoading", + "value": true + }, + "5f1c84e00d4f": { + "name": "workspaceBaseBranchResults", + "value": [] + }, + "6c344c5f4ac0": { + "name": "workspaceBaseBranchError", + "value": "" + }, + "8353b8e1a426": { + "name": "workspaceSparsePresetsLoading", + "value": true + }, + "8dbe7ea87a41": { + "name": "workspaceBaseBranchResults", + "value": [ + { + "localBranchName": "main", + "refName": "main" + } + ] + }, + "9357f7ea8445": { + "name": "workspaceSparsePresetId", + "value": { + "$rpc": "null" + } + }, + "b78bcf7ca596": { + "branchError": "", + "branches": [ + { + "localBranchName": "main", + "refName": "main" + } + ], + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "presetsLoaded": true + }, + "c8d4d05367d6": { + "name": "repo.sparsePresets#1", + "args": [ + { + "name": "method", + "value": "repo.sparsePresets" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + } + } + } + }, + "cfc8af2a7169": { + "name": "workspaceSparsePresetsLoading", + "value": false + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + } + }, + "recording": { + "scenario": "tw-workspace-source-presets", + "checkpoints": [ + { + "id": "presets-loaded", + "observation": { + "sender": ["c8d4d05367d6"], + "payloads": ["4cedb91a2f7a"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "57f06e6e349e", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169" + ] + } + }, + { + "id": "branches-loaded", + "observation": { + "sender": ["c8d4d05367d6", "395368dea8ff"], + "payloads": ["4cedb91a2f7a", "46027e62015d"], + "settlements": { + "mount": "eb79a9b3682a", + "branch-query": "eb79a9b3682a" + }, + "state": "b78bcf7ca596", + "effects": [ + "8353b8e1a426", + "273f4074a9b5", + "dba381378b08", + "5f1c84e00d4f", + "35afa5cb107f", + "6c344c5f4ac0", + "4856f62b3650", + "1d9a7d969446", + "9357f7ea8445", + "cfc8af2a7169", + "58cb95babab2", + "6c344c5f4ac0", + "8dbe7ea87a41", + "35afa5cb107f" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json b/mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json new file mode 100644 index 00000000000..f6f7cb190d4 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-sparse-missing-preset.json @@ -0,0 +1,159 @@ +{ + "operation": "tasks.workspace-sparse", + "family": "tasks.workspace-sparse", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "865a659012dd882fd6073813585e2911a1d6252404fbf5a5e273f062b89fc91d", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "193c0bc3cf2a": { + "presets": [], + "presetsError": "Failed to save sparse preset.", + "saving": false, + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "7fd0cde62993": { + "name": "workspaceSparseSaving", + "value": false + }, + "86cc01b1e541": { + "name": "workspaceSshState", + "value": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "a6bf06ff84e0": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": {} + } + } + }, + "cea9d7e8986e": { + "name": "workspaceSparseSaving", + "value": true + }, + "da3a01640280": { + "name": "workspaceSparsePresetsError", + "value": "Failed to save sparse preset." + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "f22d3216eb8d": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "" + }, + "id": "frame-1", + "ok": false + } + } + }, + "f9dfbe0c0ea7": { + "name": "ssh.getState#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "fd758406cc2c": { + "name": "repo.saveSparsePreset#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.saveSparsePreset\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"docs\",\"directories\":[\"docs\"]}}" + } + }, + "recording": { + "scenario": "tw-workspace-sparse-missing-preset", + "checkpoints": [ + { + "id": "saved-without-preset", + "observation": { + "sender": ["f22d3216eb8d", "a6bf06ff84e0"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "193c0bc3cf2a", + "effects": [ + "86cc01b1e541", + "cea9d7e8986e", + "dba381378b08", + "da3a01640280", + "7fd0cde62993" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json b/mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json new file mode 100644 index 00000000000..a2d609dc7b5 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-sparse-saved.json @@ -0,0 +1,229 @@ +{ + "operation": "tasks.workspace-sparse", + "family": "tasks.workspace-sparse", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "124f664e339bfd83a1d892e1cd953a78fdf0dc4b20c4272356d24079c72a3e04", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "1d9a7d969446": { + "name": "workspaceSparsePresetsLoaded", + "value": true + }, + "312ed3cbf468": { + "name": "workspaceSparsePresetId", + "value": "p1" + }, + "404305aa2e3a": { + "presets": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "42bbd034563e": { + "name": "workspaceSparseDraft", + "value": { + "$rpc": "null" + } + }, + "4856f62b3650": { + "name": "workspaceSparsePresets", + "value": [ + { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + ] + }, + "5c44ff5f6877": { + "name": "repo.saveSparsePreset#1", + "args": [ + { + "name": "method", + "value": "repo.saveSparsePreset" + }, + { + "name": "params", + "value": { + "directories": ["docs"], + "name": "docs", + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "preset": { + "directories": ["docs"], + "id": "p1", + "name": "docs" + } + } + } + } + }, + "7fd0cde62993": { + "name": "workspaceSparseSaving", + "value": false + }, + "89aa7a3bd619": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "cea9d7e8986e": { + "name": "workspaceSparseSaving", + "value": true + }, + "dba381378b08": { + "name": "workspaceSparsePresetsError", + "value": "" + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ee3a941d5e9c": { + "presets": [], + "presetsError": "", + "saving": false, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "f9dfbe0c0ea7": { + "name": "ssh.getState#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "fd758406cc2c": { + "name": "repo.saveSparsePreset#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"repo.saveSparsePreset\",\"params\":{\"repo\":\"id:repo-1\",\"name\":\"docs\",\"directories\":[\"docs\"]}}" + } + }, + "recording": { + "scenario": "tw-workspace-sparse-saved", + "checkpoints": [ + { + "id": "ssh-state-read", + "observation": { + "sender": ["89aa7a3bd619"], + "payloads": ["f9dfbe0c0ea7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "ee3a941d5e9c", + "effects": ["921f72d7827e"] + } + }, + { + "id": "preset-saved", + "observation": { + "sender": ["89aa7a3bd619", "5c44ff5f6877"], + "payloads": ["f9dfbe0c0ea7", "fd758406cc2c"], + "settlements": { + "mount": "eb79a9b3682a", + "save": "eb79a9b3682a" + }, + "state": "404305aa2e3a", + "effects": [ + "921f72d7827e", + "cea9d7e8986e", + "dba381378b08", + "4856f62b3650", + "1d9a7d969446", + "312ed3cbf468", + "42bbd034563e", + "7fd0cde62993" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json new file mode 100644 index 00000000000..0ae438cc3a3 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-ssh-connect-refused.json @@ -0,0 +1,277 @@ +{ + "operation": "tasks.workspace-ssh", + "family": "tasks.workspace-ssh", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "dd25391fdd3dc864ae493f72d013e789884a21e9c71522edc79323bc2b6c7f76", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "12826f529c2a": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "ssh_failed", + "message": "" + }, + "id": "frame-2", + "ok": false + } + } + }, + "1739575ac53e": { + "name": "workspaceSshConnecting", + "value": true + }, + "27b09a2898b9": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connection lost", + "isRpcDeliveryUnknown": true + } + } + }, + "2d313c57ddf7": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "decision": "skip", + "kind": "decision", + "setupTrust": { + "$rpc": "undefined" + } + } + }, + "37921d9fdeb7": { + "name": "preflight.detectRemoteAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "43fd3e2f4b53": { + "name": "workspaceSshConnecting", + "value": false + }, + "55904d40a00f": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": { + "decision": "skip", + "kind": "decision", + "setupTrust": { + "$rpc": "undefined" + } + }, + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "7c9498659f58": { + "name": "ssh.connect#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "8509334ad6ae": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": "unresolved", + "ssh": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "86cc01b1e541": { + "name": "workspaceSshState", + "value": { + "error": "", + "reconnectAttempt": 0, + "status": "error", + "targetId": "ssh-1" + } + }, + "9f152ed6e897": { + "name": "workspaceDetectedAgentIds", + "value": [] + }, + "b302d21e1567": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": "pnpm i" + } + }, + "setupRunPolicy": "never" + } + } + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "f0a9f62da106": { + "name": "repo.hooks#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "fbfdbb919268": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connecting", + "targetId": "ssh-1" + } + } + }, + "recording": { + "scenario": "tw-workspace-ssh-connect-refused", + "checkpoints": [ + { + "id": "connect-refused-empty-message", + "observation": { + "sender": ["27b09a2898b9", "12826f529c2a"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "8509334ad6ae", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "86cc01b1e541", + "43fd3e2f4b53" + ] + } + }, + { + "id": "setup-skipped", + "observation": { + "sender": ["27b09a2898b9", "12826f529c2a", "b302d21e1567"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "2d313c57ddf7" + }, + "state": "55904d40a00f", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "1739575ac53e", + "fbfdbb919268", + "86cc01b1e541", + "43fd3e2f4b53" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json new file mode 100644 index 00000000000..6f042aac899 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-ssh-connected.json @@ -0,0 +1,319 @@ +{ + "operation": "tasks.workspace-ssh", + "family": "tasks.workspace-ssh", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "495f51d9c2f7f3d71f53a53e88786b8d1f767a5bf66b8655c28222d2909a964c", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0ba2cee4b538": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + }, + "1739575ac53e": { + "name": "workspaceSshConnecting", + "value": true + }, + "17e35b25d15d": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": ["codex"] + } + } + }, + "18e6a3ac6471": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "3571f351281f": { + "name": "workspaceDetectedAgentIds", + "value": ["codex"] + }, + "37921d9fdeb7": { + "name": "preflight.detectRemoteAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "43ead075ce12": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": { + "command": "pnpm install", + "kind": "prompt", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "43fd3e2f4b53": { + "name": "workspaceSshConnecting", + "value": false + }, + "71d817ffdd81": { + "name": "ssh.connect#1", + "args": [ + { + "name": "method", + "value": "ssh.connect" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "timeoutMs": 120000 + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + } + } + } + }, + "7c9498659f58": { + "name": "ssh.connect#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.connect\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "80a4af19f556": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": " pnpm install " + } + }, + "setupRunPolicy": "ask", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + }, + "source": "repo" + } + } + } + }, + "921f72d7827e": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "a1f755a38636": { + "agent": "claude", + "connecting": false, + "detected": ["codex"], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connected", + "targetId": "ssh-1" + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "f0a9f62da106": { + "name": "repo.hooks#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" + }, + "fbfdbb919268": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "connecting", + "targetId": "ssh-1" + } + } + }, + "recording": { + "scenario": "tw-workspace-ssh-connected", + "checkpoints": [ + { + "id": "agents-detected", + "observation": { + "sender": ["17e35b25d15d"], + "payloads": ["37921d9fdeb7"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "18e6a3ac6471", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "3571f351281f"] + } + }, + { + "id": "connected", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81"], + "payloads": ["37921d9fdeb7", "7c9498659f58"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a" + }, + "state": "a1f755a38636", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + }, + { + "id": "setup-prompted", + "observation": { + "sender": ["17e35b25d15d", "71d817ffdd81", "80a4af19f556"], + "payloads": ["37921d9fdeb7", "7c9498659f58", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "connect": "eb79a9b3682a", + "setup": "0ba2cee4b538" + }, + "state": "43ead075ce12", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "3571f351281f", + "1739575ac53e", + "fbfdbb919268", + "921f72d7827e", + "43fd3e2f4b53" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json new file mode 100644 index 00000000000..7a345df3eb3 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-ssh-local-agents.json @@ -0,0 +1,103 @@ +{ + "operation": "tasks.workspace-ssh-local", + "family": "tasks.workspace-ssh-local", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "af0623c2d106d2ed18ef9149d4990539f9ed82146ae091a872a3e1d792efeffe", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "7400f4eebe66": { + "agent": "claude", + "connecting": false, + "detected": ["codex", "claude"], + "setup": "unresolved", + "ssh": { + "$rpc": "null" + } + }, + "cb93b17470e8": { + "name": "preflight.detectAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectAgents" + }, + { + "name": "params", + "value": { + "$rpc": "absent" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-1", + "ok": true, + "result": ["codex", "claude"] + } + } + }, + "cbb858a786ac": { + "name": "workspaceDetectedAgentIds", + "value": ["codex", "claude"] + }, + "cf32edc950ac": { + "name": "preflight.detectAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectAgents\"}" + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + } + }, + "recording": { + "scenario": "tw-workspace-ssh-local-agents", + "checkpoints": [ + { + "id": "local-agents-detected", + "observation": { + "sender": ["cb93b17470e8"], + "payloads": ["cf32edc950ac"], + "settlements": { + "mount": "eb79a9b3682a" + }, + "state": "7400f4eebe66", + "effects": ["ed6189938d78", "ea709e13f0f0", "41b0d115f434", "cbb858a786ac"] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json b/mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json new file mode 100644 index 00000000000..0cd6feff928 --- /dev/null +++ b/mobile/rpc-foundation/goldens/tw-workspace-ssh-not-ready.json @@ -0,0 +1,268 @@ +{ + "operation": "tasks.workspace-ssh", + "family": "tasks.workspace-ssh", + "namedDeltas": [], + "runnerVersion": 1, + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", + "lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571", + "recorderSha256": "5ec2faffa944097d2916e2e9e2259b9d0c68e364c5f865bafd8a9600faedbdc7", + "scenarioSha256": "3aa23f15da8fe9972e47c767db454b41750ca353ab10797082fde4514ffe9da0", + "platform": "darwin", + "scenarioVersion": 1, + "projectionVersion": 2, + "goldenFormatVersion": 4, + "values": { + "0adf11d42d1a": { + "name": "ssh.getState#1", + "json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"ssh.getState\",\"params\":{\"targetId\":\"ssh-1\"}}" + }, + "0f1cf505ed63": { + "status": "rejected", + "startedAt": 0, + "settledAt": 0, + "error": { + "category": "Error", + "message": "Connect Repo before creating a workspace.", + "isRpcDeliveryUnknown": false + } + }, + "15d9dbcfd2ce": { + "name": "repo.hooks#1", + "args": [ + { + "name": "method", + "value": "repo.hooks" + }, + { + "name": "params", + "value": { + "repo": "id:repo-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-3", + "ok": true, + "result": { + "hooks": { + "scripts": {} + } + } + } + } + }, + "1712c415bebf": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "decision": "inherit", + "kind": "decision" + } + }, + "25352a4de532": { + "name": "workspaceSshState", + "value": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + }, + "28be8cfc5f01": { + "name": "preflight.detectRemoteAgents#1", + "args": [ + { + "name": "method", + "value": "preflight.detectRemoteAgents" + }, + { + "name": "params", + "value": { + "connectionId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "error": { + "code": "forbidden", + "message": "no access" + }, + "id": "frame-1", + "ok": false + } + } + }, + "37921d9fdeb7": { + "name": "preflight.detectRemoteAgents#1", + "json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"preflight.detectRemoteAgents\",\"params\":{\"connectionId\":\"ssh-1\"}}" + }, + "41b0d115f434": { + "name": "workspaceDetectedAgentIds", + "value": { + "$rpc": "null" + } + }, + "8ecc31aa9892": { + "name": "ssh.getState#1", + "args": [ + { + "name": "method", + "value": "ssh.getState" + }, + { + "name": "params", + "value": { + "targetId": "ssh-1" + } + }, + { + "name": "options", + "value": { + "$rpc": "absent" + } + } + ], + "settlement": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "id": "frame-2", + "ok": true, + "result": { + "state": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + } + } + } + }, + "9a9cd2877569": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": { + "decision": "inherit", + "kind": "decision" + }, + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + }, + "9f152ed6e897": { + "name": "workspaceDetectedAgentIds", + "value": [] + }, + "d3698fc526a8": { + "agent": "claude", + "connecting": false, + "detected": [], + "setup": "unresolved", + "ssh": { + "error": { + "$rpc": "null" + }, + "reconnectAttempt": 0, + "status": "disconnected", + "targetId": "ssh-1" + } + }, + "ea709e13f0f0": { + "name": "workspaceAgentOverridden", + "value": false + }, + "eb79a9b3682a": { + "status": "fulfilled", + "startedAt": 0, + "settledAt": 0, + "value": { + "$rpc": "undefined" + } + }, + "ed6189938d78": { + "name": "workspaceAgent", + "value": "claude" + }, + "f0a9f62da106": { + "name": "repo.hooks#1", + "json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"repo.hooks\",\"params\":{\"repo\":\"id:repo-1\"}}" + } + }, + "recording": { + "scenario": "tw-workspace-ssh-not-ready", + "checkpoints": [ + { + "id": "ensure-rejected", + "observation": { + "sender": ["28be8cfc5f01", "8ecc31aa9892"], + "payloads": ["37921d9fdeb7", "0adf11d42d1a"], + "settlements": { + "mount": "eb79a9b3682a", + "ensure": "0f1cf505ed63" + }, + "state": "d3698fc526a8", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "25352a4de532" + ] + } + }, + { + "id": "no-setup-script", + "observation": { + "sender": ["28be8cfc5f01", "8ecc31aa9892", "15d9dbcfd2ce"], + "payloads": ["37921d9fdeb7", "0adf11d42d1a", "f0a9f62da106"], + "settlements": { + "mount": "eb79a9b3682a", + "ensure": "0f1cf505ed63", + "setup": "1712c415bebf" + }, + "state": "9a9cd2877569", + "effects": [ + "ed6189938d78", + "ea709e13f0f0", + "41b0d115f434", + "9f152ed6e897", + "25352a4de532" + ] + } + } + ] + } +} diff --git a/mobile/rpc-foundation/pilot-scenarios.json b/mobile/rpc-foundation/pilot-scenarios.json index 216da99ca16..1692faeaac4 100644 --- a/mobile/rpc-foundation/pilot-scenarios.json +++ b/mobile/rpc-foundation/pilot-scenarios.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "baseline": "16d1ab81d3fd08e342b2f0ac0cc6f9e4aea4aaee", + "baseline": "50e752fc66a84638b0a8c1f4bdbbd5fdc708c3e9", "scenarios": [ { "id": "b1", @@ -514,7 +514,7 @@ "checkpoint": "settled" } ], - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"] + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"] }, { "id": "settings-workspace-context-refused", @@ -586,7 +586,7 @@ "checkpoint": "settled" } ], - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"] + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"] }, { "id": "settings-workspace-context-transport-error", @@ -655,7 +655,7 @@ "checkpoint": "settled" } ], - "namedDeltas": ["new-workspace-runtime-context-null-settings-typeerror"] + "namedDeltas": ["new-workspace-runtime-context-null-results-degrade-to-absent"] }, { "id": "settings-home-providers-fulfilled", @@ -1830,6 +1830,173 @@ } ] }, + { + "id": "settings-task-workspace-create-linear", + "operation": "settings.task-workspace-create", + "version": 1, + "family": "settings.task-workspace-create", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "action": "submit", + "id": "submit", + "args": { + "item": { + "key": "linear:1", + "provider": "linear", + "title": "Recorded issue", + "source": { + "identifier": "ORC-1", + "title": "Recorded issue", + "url": "https://linear.app/orca/issue/ORC-1" + } + } + } + }, + { + "checkpoint": "settings-pending" + }, + { + "complete": "settings.get#1", + "params": { + "$undefined": true + }, + "reply": { + "ok": true, + "result": { + "settings": { + "disabledTuiAgents": [], + "defaultTuiAgent": "codex" + } + } + } + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "orc-1", + "displayName": "ORC-1 Recorded issue", + "displayNameKind": "generated", + "linkedLinearIssue": "ORC-1", + "setupDecision": "inherit", + "activate": true, + "startupDraft": "https://linear.app/orca/issue/ORC-1", + "createdWithAgent": "claude" + }, + "reply": { + "ok": true, + "result": { + "worktree": { + "id": "wt-1", + "displayName": "ORC-1 Recorded issue" + } + } + } + }, + { + "checkpoint": "created" + } + ] + }, + { + "id": "settings-task-workspace-create-pr-start-point", + "operation": "settings.task-workspace-create", + "version": 1, + "family": "settings.task-workspace-create", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "action": "submit", + "id": "submit", + "args": { + "item": { + "key": "github:7", + "provider": "github", + "title": "Recorded pull request", + "source": { + "type": "pr", + "repoId": "repo-1", + "number": 7, + "title": "Recorded pull request", + "url": "https://github.com/o/r/pull/7" + } + } + } + }, + { + "checkpoint": "settings-pending" + }, + { + "complete": "settings.get#1", + "params": { + "$undefined": true + }, + "reply": { + "ok": true, + "result": { + "settings": { + "disabledTuiAgents": [], + "defaultTuiAgent": "codex" + } + } + } + }, + { + "complete": "worktree.resolvePrBase#1", + "params": { + "repo": "id:repo-1", + "prNumber": 7 + }, + "reply": { + "ok": true, + "result": { + "baseBranch": "main" + } + } + }, + { + "checkpoint": "pr-base-resolved" + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "pr-7", + "displayName": "Recorded pull request", + "displayNameKind": "generated", + "setupDecision": "inherit", + "activate": true, + "startupDraft": "https://github.com/o/r/pull/7", + "createdWithAgent": "claude", + "baseBranch": "main", + "linkedPR": 7 + }, + "reply": { + "ok": true, + "result": { + "worktree": { + "id": "wt-2" + }, + "warning": "shallow clone" + } + } + }, + { + "checkpoint": "created-from-pr-base" + } + ] + }, { "id": "settings-new-tab-refused", "operation": "settings.new-tab-agents", @@ -5137,6 +5304,1455 @@ "checkpoint": "settled" } ] + }, + { + "id": "tw-create-retry-created", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create" + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "kestrel", + "clientMutationId": "mutation-1" + }, + "reply": { + "ok": true, + "result": { + "worktree": { + "id": "repo-1::/w", + "displayName": "kestrel" + } + } + } + }, + { + "checkpoint": "created" + } + ] + }, + { + "id": "tw-create-retry-warning-kept", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create" + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "kestrel", + "clientMutationId": "mutation-1" + }, + "reply": { + "ok": true, + "result": { + "worktree": { + "id": "repo-1::/w" + }, + "warning": " startup terminal failed " + } + } + }, + { + "checkpoint": "created-with-warning" + } + ] + }, + { + "id": "tw-create-retry-name-collision", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create" + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "kestrel", + "clientMutationId": "mutation-1" + }, + "reply": { + "ok": false, + "error": { + "code": "conflict", + "message": "Branch \"kestrel\" already exists." + } + } + }, + { + "checkpoint": "retrying" + }, + { + "complete": "worktree.create#2", + "params": { + "repo": "id:repo-1", + "name": "kestrel-2", + "clientMutationId": "mutation-2" + }, + "reply": { + "ok": true, + "result": { + "worktree": { + "id": "repo-1::/w2", + "displayName": "kestrel-2" + } + } + } + }, + { + "checkpoint": "created-suffixed" + } + ] + }, + { + "id": "tw-create-retry-unretryable-refusal", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create" + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "kestrel", + "clientMutationId": "mutation-1" + }, + "reply": { + "ok": false, + "error": { + "code": "internal", + "message": "" + } + } + }, + { + "checkpoint": "refused-empty-message" + } + ] + }, + { + "id": "tw-create-retry-ambiguous-while-connected", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create" + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "kestrel", + "clientMutationId": "mutation-1" + }, + "reject": { + "message": "Request timed out", + "deliveryUnknown": true + } + }, + { + "checkpoint": "unknown-not-failed" + } + ] + }, + { + "id": "tw-create-retry-ambiguous-after-drop", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create" + }, + { + "action": "disconnect", + "id": "drop" + }, + { + "checkpoint": "waiting-for-reconnect" + }, + { + "advance": 20000 + }, + { + "checkpoint": "replay-window-abandoned" + } + ] + }, + { + "id": "tw-create-retry-ambiguous-without-idempotency", + "operation": "tasks.worktree-create-retry", + "version": 1, + "family": "worktree.create-retry", + "sites": ["mobile/src/tasks/worktree-create-retry.ts"], + "schedules": [], + "steps": [ + { + "action": "create", + "id": "create", + "args": { + "idempotency": false + } + }, + { + "complete": "worktree.create#1", + "params": { + "repo": "id:repo-1", + "name": "kestrel" + }, + "reject": { + "message": "Connection lost", + "deliveryUnknown": true + } + }, + { + "checkpoint": "unstamped-create-is-not-replayed" + } + ] + }, + { + "id": "tw-capabilities-advertised", + "operation": "tasks.worktree-capabilities", + "version": 1, + "family": "worktree.runtime-capabilities", + "sites": ["mobile/src/tasks/worktree-create-capability.ts"], + "schedules": [], + "steps": [ + { + "action": "probe", + "id": "probe" + }, + { + "complete": "status.get#1", + "params": { + "$undefined": true + }, + "reply": { + "ok": true, + "result": { + "capabilities": ["mobile.tasks.v1", "worktree.create-idempotency.v1"], + "worktreeCreateIdempotency": { + "dedupeTtlMs": 45000 + }, + "platform": "linux" + } + } + }, + { + "checkpoint": "probed" + } + ] + }, + { + "id": "tw-capabilities-legacy-idempotency", + "operation": "tasks.worktree-capabilities", + "version": 1, + "family": "worktree.runtime-capabilities", + "sites": ["mobile/src/tasks/worktree-create-capability.ts"], + "schedules": [], + "steps": [ + { + "action": "probe", + "id": "probe" + }, + { + "complete": "status.get#1", + "params": { + "$undefined": true + }, + "reply": { + "ok": true, + "result": { + "capabilities": ["worktree.create-idempotency.v1"] + } + } + }, + { + "checkpoint": "legacy-host-window" + } + ] + }, + { + "id": "tw-capabilities-cutover-retried", + "operation": "tasks.worktree-capabilities", + "version": 1, + "family": "worktree.runtime-capabilities", + "sites": ["mobile/src/tasks/worktree-create-capability.ts"], + "schedules": [], + "steps": [ + { + "action": "probe", + "id": "probe" + }, + { + "action": "cutover", + "id": "migrate" + }, + { + "bind": "status-after-cutover", + "request": "status.get#2", + "params": { + "$undefined": true + } + }, + { + "checkpoint": "reprobing-after-cutover" + }, + { + "complete": "status-after-cutover", + "params": { + "$undefined": true + }, + "reply": { + "ok": true, + "result": { + "capabilities": ["mobile.tasks.v1"] + } + } + }, + { + "checkpoint": "probed-on-replacement" + } + ] + }, + { + "id": "tw-hosted-base-resolved", + "operation": "tasks.composer-hosted-base", + "version": 1, + "family": "worktree.hosted-base", + "sites": ["mobile/src/tasks/composer-source-base-resolve.ts"], + "schedules": [], + "steps": [ + { + "action": "pr-base", + "id": "pr" + }, + { + "complete": "worktree.resolvePrBase#1", + "params": { + "repo": "id:repo-1", + "prNumber": 12, + "headRefName": "feature" + }, + "reply": { + "ok": true, + "result": { + "baseBranch": "main", + "compareBaseRef": "origin/main" + } + } + }, + { + "checkpoint": "pr-base-resolved" + }, + { + "action": "mr-base", + "id": "mr" + }, + { + "complete": "worktree.resolveMrBase#1", + "params": { + "repo": "id:repo-1", + "mrIid": 7, + "sourceBranch": "feature" + }, + "reply": { + "ok": true, + "result": { + "baseBranch": "develop" + } + } + }, + { + "checkpoint": "mr-base-resolved" + } + ] + }, + { + "id": "tw-hosted-base-soft-error", + "operation": "tasks.composer-hosted-base", + "version": 1, + "family": "worktree.hosted-base", + "sites": ["mobile/src/tasks/composer-source-base-resolve.ts"], + "schedules": [], + "steps": [ + { + "action": "pr-base", + "id": "pr" + }, + { + "complete": "worktree.resolvePrBase#1", + "params": { + "repo": "id:repo-1", + "prNumber": 12, + "headRefName": "feature" + }, + "reply": { + "ok": true, + "result": { + "error": "pull request not found" + } + } + }, + { + "checkpoint": "in-band-error" + }, + { + "action": "mr-base", + "id": "mr" + }, + { + "complete": "worktree.resolveMrBase#1", + "params": { + "repo": "id:repo-1", + "mrIid": 7, + "sourceBranch": "feature" + }, + "reply": { + "ok": true, + "result": { + "error": "" + } + } + }, + { + "checkpoint": "in-band-empty-error" + } + ] + }, + { + "id": "tw-setup-hook-trust-approved", + "operation": "tasks.setup-hook-trust", + "version": 1, + "family": "worktree.setup-hook-trust", + "sites": ["mobile/src/tasks/setup-hook-trust.ts"], + "schedules": [], + "steps": [ + { + "action": "approve", + "id": "approve" + }, + { + "complete": "ui.set#1", + "params": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "contentHash": "hash-1", + "approvedAt": 1767225600000 + } + } + } + }, + "reply": { + "ok": true, + "result": { + "ok": true + } + } + }, + { + "checkpoint": "approved" + } + ] + }, + { + "id": "tw-setup-hook-trust-always", + "operation": "tasks.setup-hook-trust", + "version": 1, + "family": "worktree.setup-hook-trust", + "sites": ["mobile/src/tasks/setup-hook-trust.ts"], + "schedules": [], + "steps": [ + { + "action": "approve", + "id": "approve", + "args": { + "always": true + } + }, + { + "complete": "ui.set#1", + "params": { + "trustedOrcaHooks": { + "repo-1": { + "all": { + "approvedAt": 1767225600000 + } + } + } + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "" + } + } + }, + { + "checkpoint": "refused-empty-message" + } + ] + }, + { + "id": "tw-smart-search-all-providers", + "operation": "tasks.smart-source-search", + "version": 1, + "family": "tasks.smart-source-search", + "sites": ["mobile/src/tasks/smart-source-search-requests.ts"], + "schedules": [], + "steps": [ + { + "action": "github", + "id": "github" + }, + { + "complete": "github.listWorkItems#1", + "params": { + "repo": "id:repo-1", + "limit": 36, + "query": "bug" + }, + "reply": { + "ok": true, + "result": { + "items": [ + { + "number": 1, + "title": "one" + } + ] + } + } + }, + { + "checkpoint": "github-items" + }, + { + "action": "gitlab", + "id": "gitlab" + }, + { + "complete": "gitlab.listWorkItems#1", + "params": { + "repo": "id:repo-1", + "state": "opened", + "page": 1, + "perPage": 50, + "query": "bug" + }, + "reply": { + "ok": true, + "result": { + "items": [ + { + "iid": 2, + "title": "two" + } + ], + "error": { + "type": "not_found", + "message": "missing" + } + } + } + }, + { + "checkpoint": "gitlab-items" + }, + { + "action": "linear", + "id": "linear" + }, + { + "complete": "linear.searchIssues#1", + "params": { + "query": "bug", + "limit": 50, + "workspaceId": "linear-workspace" + }, + "reply": { + "ok": true, + "result": { + "items": [ + { + "id": "issue-1" + } + ] + } + } + }, + { + "checkpoint": "linear-search" + }, + { + "action": "branches", + "id": "branches" + }, + { + "complete": "repo.searchRefs#1", + "params": { + "repo": "id:repo-1", + "query": "bug", + "limit": 20 + }, + "reply": { + "ok": true, + "result": { + "refs": ["main", "release"] + } + } + }, + { + "checkpoint": "branch-refs" + }, + { + "action": "linear", + "id": "linear-assigned", + "args": { + "query": " ", + "workspace": null + } + }, + { + "complete": "linear.listIssues#1", + "params": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$undefined": true + } + }, + "reply": { + "ok": true, + "result": [ + { + "id": "issue-3" + } + ] + } + }, + { + "checkpoint": "linear-assigned-listed" + } + ] + }, + { + "id": "tw-smart-search-linear-listed", + "operation": "tasks.smart-source-search", + "version": 1, + "family": "tasks.smart-source-search", + "sites": ["mobile/src/tasks/smart-source-search-requests.ts"], + "schedules": [], + "steps": [ + { + "action": "linear", + "id": "linear", + "args": { + "query": " ", + "workspace": null + } + }, + { + "complete": "linear.listIssues#1", + "params": { + "filter": "assigned", + "limit": 50, + "workspaceId": { + "$undefined": true + } + }, + "reply": { + "ok": true, + "result": [ + { + "id": "issue-2" + } + ] + } + }, + { + "checkpoint": "linear-assigned" + } + ] + }, + { + "id": "tw-smart-search-gitlab-provider-error", + "operation": "tasks.smart-source-search", + "version": 1, + "family": "tasks.smart-source-search", + "sites": ["mobile/src/tasks/smart-source-search-requests.ts"], + "schedules": [], + "steps": [ + { + "action": "gitlab", + "id": "gitlab" + }, + { + "complete": "gitlab.listWorkItems#1", + "params": { + "repo": "id:repo-1", + "state": "opened", + "page": 1, + "perPage": 50, + "query": "bug" + }, + "reply": { + "ok": true, + "result": { + "items": [], + "error": { + "type": "quota", + "message": "rate limited" + } + } + } + }, + { + "checkpoint": "in-band-provider-error" + }, + { + "action": "branches", + "id": "branches", + "args": { + "query": " main " + } + }, + { + "complete": "repo.searchRefs#1", + "params": { + "repo": "id:repo-1", + "query": "main", + "limit": 20 + }, + "reply": { + "ok": true, + "result": { + "refDetails": [ + { + "refName": "origin/main", + "localBranchName": "main" + } + ] + } + } + }, + { + "checkpoint": "branch-ref-details" + } + ] + }, + { + "id": "tw-paste-lookup-resolved", + "operation": "tasks.paste-lookup", + "version": 1, + "family": "tasks.paste-lookup", + "sites": ["mobile/src/tasks/smart-source-paste-intent.ts"], + "schedules": [], + "steps": [ + { + "action": "by-number", + "id": "by-number" + }, + { + "complete": "github.workItem#1", + "params": { + "repo": "id:repo-1", + "number": 12 + }, + "reply": { + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + }, + { + "checkpoint": "by-number" + }, + { + "action": "by-slug", + "id": "by-slug" + }, + { + "complete": "github.workItemByOwnerRepo#1", + "params": { + "repo": "id:repo-1", + "owner": "owner", + "ownerRepo": "repo", + "number": 12, + "type": "issue" + }, + "reply": { + "ok": true, + "result": { + "number": 12, + "title": "twelve" + } + } + }, + { + "checkpoint": "by-slug" + }, + { + "action": "gitlab-path", + "id": "gitlab-path" + }, + { + "complete": "gitlab.workItemByPath#1", + "params": { + "repo": "id:repo-1", + "host": "gitlab.com", + "path": "group/project", + "iid": 7, + "type": "issue" + }, + "reply": { + "ok": true, + "result": { + "iid": 7, + "title": "seven" + } + } + }, + { + "checkpoint": "gitlab-path" + }, + { + "action": "repo-slug", + "id": "repo-slug" + }, + { + "complete": "github.repoSlug#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": true, + "result": { + "owner": "owner", + "repo": "repo" + } + } + }, + { + "checkpoint": "repo-slug-matched" + } + ] + }, + { + "id": "tw-paste-lookup-slug-unsupported", + "operation": "tasks.paste-lookup", + "version": 1, + "family": "tasks.paste-lookup", + "sites": ["mobile/src/tasks/smart-source-paste-intent.ts"], + "schedules": [], + "steps": [ + { + "action": "repo-slug", + "id": "repo-slug" + }, + { + "complete": "github.repoSlug#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": false, + "error": { + "code": "method_not_found", + "message": "Unknown method" + } + } + }, + { + "checkpoint": "host-wide-probe-cached" + }, + { + "action": "repo-slug-again", + "id": "repo-slug-again" + }, + { + "checkpoint": "no-second-probe" + } + ] + }, + { + "id": "tw-paste-lookup-slug-refused", + "operation": "tasks.paste-lookup", + "version": 1, + "family": "tasks.paste-lookup", + "sites": ["mobile/src/tasks/smart-source-paste-intent.ts"], + "schedules": [], + "steps": [ + { + "action": "repo-slug", + "id": "repo-slug" + }, + { + "complete": "github.repoSlug#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "no access" + } + } + }, + { + "complete": "github.repoSlug#2", + "params": { + "repo": "id:repo-2" + }, + "reply": { + "ok": true, + "result": null + } + }, + { + "checkpoint": "refusal-is-per-repo" + } + ] + }, + { + "id": "tw-workspace-source-presets", + "operation": "tasks.workspace-source", + "version": 1, + "family": "tasks.workspace-source", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "repo.sparsePresets#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": true, + "result": { + "presets": [ + { + "id": "p1", + "name": "docs", + "directories": ["docs"] + } + ] + } + } + }, + { + "checkpoint": "presets-loaded" + }, + { + "action": "branch-query", + "id": "branch-query" + }, + { + "complete": "repo.searchRefs#1", + "params": { + "repo": "id:repo-1", + "query": "main", + "limit": 20 + }, + "reply": { + "ok": true, + "result": { + "refs": ["main"] + } + } + }, + { + "checkpoint": "branches-loaded" + } + ] + }, + { + "id": "tw-workspace-source-presets-refused", + "operation": "tasks.workspace-source", + "version": 1, + "family": "tasks.workspace-source", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "repo.sparsePresets#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "" + } + } + }, + { + "checkpoint": "presets-refused-empty-message" + } + ] + }, + { + "id": "tw-workspace-sparse-saved", + "operation": "tasks.workspace-sparse", + "version": 1, + "family": "tasks.workspace-sparse", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "ssh.getState#1", + "params": { + "targetId": "ssh-1" + }, + "reply": { + "ok": true, + "result": { + "state": { + "targetId": "ssh-1", + "status": "connected", + "error": null, + "reconnectAttempt": 0 + } + } + } + }, + { + "checkpoint": "ssh-state-read" + }, + { + "action": "save-preset", + "id": "save" + }, + { + "complete": "repo.saveSparsePreset#1", + "params": { + "repo": "id:repo-1", + "name": "docs", + "directories": ["docs"] + }, + "reply": { + "ok": true, + "result": { + "preset": { + "id": "p1", + "name": "docs", + "directories": ["docs"] + } + } + } + }, + { + "checkpoint": "preset-saved" + } + ] + }, + { + "id": "tw-workspace-sparse-missing-preset", + "operation": "tasks.workspace-sparse", + "version": 1, + "family": "tasks.workspace-sparse", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "ssh.getState#1", + "params": { + "targetId": "ssh-1" + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "" + } + } + }, + { + "action": "save-preset", + "id": "save" + }, + { + "complete": "repo.saveSparsePreset#1", + "params": { + "repo": "id:repo-1", + "name": "docs", + "directories": ["docs"] + }, + "reply": { + "ok": true, + "result": {} + } + }, + { + "checkpoint": "saved-without-preset" + } + ] + }, + { + "id": "tw-workspace-ssh-connected", + "operation": "tasks.workspace-ssh", + "version": 1, + "family": "tasks.workspace-ssh", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "preflight.detectRemoteAgents#1", + "params": { + "connectionId": "ssh-1" + }, + "reply": { + "ok": true, + "result": ["codex"] + } + }, + { + "checkpoint": "agents-detected" + }, + { + "action": "connect", + "id": "connect" + }, + { + "complete": "ssh.connect#1", + "params": { + "targetId": "ssh-1" + }, + "reply": { + "ok": true, + "result": { + "state": { + "targetId": "ssh-1", + "status": "connected", + "error": null, + "reconnectAttempt": 0 + } + } + } + }, + { + "checkpoint": "connected" + }, + { + "action": "resolve-setup", + "id": "setup" + }, + { + "complete": "repo.hooks#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": " pnpm install " + } + }, + "setupRunPolicy": "ask", + "source": "repo", + "setupTrust": { + "contentHash": "hash-1", + "scriptContent": "pnpm install" + } + } + } + }, + { + "checkpoint": "setup-prompted" + } + ] + }, + { + "id": "tw-workspace-ssh-not-ready", + "operation": "tasks.workspace-ssh", + "version": 1, + "family": "tasks.workspace-ssh", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "preflight.detectRemoteAgents#1", + "params": { + "connectionId": "ssh-1" + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "no access" + } + } + }, + { + "action": "ensure-ready", + "id": "ensure" + }, + { + "complete": "ssh.getState#1", + "params": { + "targetId": "ssh-1" + }, + "reply": { + "ok": true, + "result": { + "state": { + "targetId": "ssh-1", + "status": "disconnected", + "error": null, + "reconnectAttempt": 0 + } + } + } + }, + { + "checkpoint": "ensure-rejected" + }, + { + "action": "resolve-setup", + "id": "setup" + }, + { + "complete": "repo.hooks#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": true, + "result": { + "hooks": { + "scripts": {} + } + } + } + }, + { + "checkpoint": "no-setup-script" + } + ] + }, + { + "id": "tw-workspace-ssh-connect-refused", + "operation": "tasks.workspace-ssh", + "version": 1, + "family": "tasks.workspace-ssh", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "preflight.detectRemoteAgents#1", + "params": { + "connectionId": "ssh-1" + }, + "reject": { + "message": "Connection lost", + "deliveryUnknown": true + } + }, + { + "action": "connect", + "id": "connect" + }, + { + "complete": "ssh.connect#1", + "params": { + "targetId": "ssh-1" + }, + "reply": { + "ok": false, + "error": { + "code": "ssh_failed", + "message": "" + } + } + }, + { + "checkpoint": "connect-refused-empty-message" + }, + { + "action": "resolve-setup", + "id": "setup" + }, + { + "complete": "repo.hooks#1", + "params": { + "repo": "id:repo-1" + }, + "reply": { + "ok": true, + "result": { + "hooks": { + "scripts": { + "setup": "pnpm i" + } + }, + "setupRunPolicy": "never" + } + } + }, + { + "checkpoint": "setup-skipped" + } + ] + }, + { + "id": "tw-workspace-ssh-local-agents", + "operation": "tasks.workspace-ssh-local", + "version": 1, + "family": "tasks.workspace-ssh-local", + "sites": ["mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "complete": "preflight.detectAgents#1", + "params": { + "$undefined": true + }, + "reply": { + "ok": true, + "result": ["codex", "claude"] + } + }, + { + "checkpoint": "local-agents-detected" + } + ] + }, + { + "id": "tw-task-preferences-resume-write", + "operation": "settings.task-preferences", + "version": 1, + "family": "settings-best-effort", + "sites": ["mobile/src/tasks/use-mobile-tasks-client-settings-actions.tsx"], + "schedules": [], + "steps": [ + { + "action": "mount", + "id": "mount" + }, + { + "action": "resume", + "id": "resume" + }, + { + "complete": "ui.set#1", + "params": { + "taskResumeState": { + "githubItemsPreset": "issues" + } + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "no access" + } + } + }, + { + "checkpoint": "best-effort-resume-write" + }, + { + "action": "trust", + "id": "trust" + }, + { + "complete": "ui.set#2", + "params": { + "trustedOrcaHooks": { + "repo-1": { + "setup": { + "contentHash": "hash-1", + "approvedAt": 1767225600000 + } + } + } + }, + "reply": { + "ok": false, + "error": { + "code": "forbidden", + "message": "" + } + } + }, + { + "checkpoint": "awaited-trust-write-refused" + } + ] } ] } diff --git a/mobile/src/components/use-new-workspace-runtime-context.test.ts b/mobile/src/components/use-new-workspace-runtime-context.test.ts new file mode 100644 index 00000000000..f189d52e3b0 --- /dev/null +++ b/mobile/src/components/use-new-workspace-runtime-context.test.ts @@ -0,0 +1,115 @@ +import { createElement } from 'react' +import { act, create, type ReactTestRenderer } from 'react-test-renderer' +import { afterEach, describe, expect, it } from 'vitest' +import { FakeSession } from '../transport/mobile-endpoint-supervisor-test-fakes' +import type { RpcClient } from '../transport/rpc-client' +import type { RpcResponse } from '../transport/types' +import { useNewWorkspaceRuntimeContext } from './use-new-workspace-runtime-context' + +type RuntimeContext = ReturnType +type PublishedState = Pick< + RuntimeContext, + 'runtimeSettings' | 'trustedOrcaHooks' | 'availableProviders' +> + +const TRUSTED_HOOKS = { '/repo/orca.yaml': 'sha-1' } +const UI_WITH_TRUST = { ui: { trustedOrcaHooks: TRUSTED_HOOKS } } +const SETTINGS = { defaultTuiAgent: 'codex', visibleTaskProviders: ['github', 'linear'] } + +function reply(result: unknown): RpcResponse { + return { id: 'r', ok: true, result, _meta: { runtimeId: 'runtime-1' } } +} + +/** Every prerequisite answers normally; only the two reads under test vary. */ +function clientAnswering(settingsResult: unknown, uiResult: unknown): RpcClient { + const client = new FakeSession('connected') + client.sendRequest.mockImplementation(async (method: string) => { + switch (method) { + case 'settings.get': + return reply(settingsResult) + case 'ui.get': + return reply(uiResult) + case 'preflight.check': + return reply({ glab: { installed: false } }) + default: + return reply({ connected: false }) + } + }) + return client +} + +describe('useNewWorkspaceRuntimeContext', () => { + let renderer: ReactTestRenderer | null = null + let context: RuntimeContext | null = null + + afterEach(() => { + act(() => renderer?.unmount()) + renderer = null + context = null + }) + + function Harness({ client }: { client: RpcClient }): null { + context = useNewWorkspaceRuntimeContext(client, true) + return null + } + + /** Answering twice re-renders the live harness, so the second call is a host swap, not a remount. */ + async function answer(settingsResult: unknown, uiResult: unknown): Promise { + const element = createElement(Harness, { client: clientAnswering(settingsResult, uiResult) }) + await act(async () => { + if (renderer) { + renderer.update(element) + } else { + renderer = create(element) + } + }) + await act(async () => {}) + const { runtimeSettings, trustedOrcaHooks, availableProviders } = context! + return { runtimeSettings, trustedOrcaHooks, availableProviders } + } + + // A null result used to throw the `settings` property read out of the effect, skipping the + // provider commit the absent case still reached. + it.each([ + ['null', null], + ['absent', undefined], + ['without a settings member', {}] + ])('degrades a %s settings result to absent settings', async (_label, settingsResult) => { + expect(await answer(settingsResult, UI_WITH_TRUST)).toEqual({ + runtimeSettings: null, + trustedOrcaHooks: TRUSTED_HOOKS, + availableProviders: ['github'] + }) + }) + + // Same defect on the sibling leg: `reading 'ui'` threw after the settings commit and before + // the provider commit. + it.each([ + ['null', null], + ['absent', undefined], + ['without a ui member', {}] + ])('degrades a %s ui result to untrusted hooks', async (_label, uiResult) => { + expect(await answer({ settings: SETTINGS }, uiResult)).toEqual({ + runtimeSettings: SETTINGS, + trustedOrcaHooks: {}, + availableProviders: ['github'] + }) + }) + + // The blank, not just the absence of a throw: trustedOrcaHooks gates the setup-hook approval + // prompt in use-new-workspace-create-submit.ts, so a stale value would skip it. + it('blanks the trust an earlier host published when the next ui result is null', async () => { + expect((await answer({ settings: SETTINGS }, UI_WITH_TRUST)).trustedOrcaHooks).toEqual( + TRUSTED_HOOKS + ) + expect((await answer({ settings: SETTINGS }, null)).trustedOrcaHooks).toEqual({}) + }) + + it('publishes the settings and trust a host does send', async () => { + expect(await answer({ settings: SETTINGS }, UI_WITH_TRUST)).toEqual({ + runtimeSettings: SETTINGS, + trustedOrcaHooks: TRUSTED_HOOKS, + availableProviders: ['github'] + }) + }) +}) diff --git a/mobile/src/components/use-new-workspace-runtime-context.ts b/mobile/src/components/use-new-workspace-runtime-context.ts index e178d714ce8..b7d3b142675 100644 --- a/mobile/src/components/use-new-workspace-runtime-context.ts +++ b/mobile/src/components/use-new-workspace-runtime-context.ts @@ -1,4 +1,4 @@ -import { settingsRead } from '../transport/settings-read-operations' +import { optionalSettingsRead } from '../transport/settings-read-operations' import { useEffect, useState } from 'react' import type { PersistedTrustedOrcaHooks } from '../../../src/shared/orca-yaml-hook-types' import type { RpcClient } from '../transport/rpc-client' @@ -10,6 +10,8 @@ import { } from '../tasks/mobile-task-providers' import type { NewWorktreeRuntimeSettings } from './new-worktree-agent-selection' +type UiGetResult = { ui?: { trustedOrcaHooks?: PersistedTrustedOrcaHooks } } | null | undefined + function settledSuccess(entry: PromiseSettledResult): RpcSuccess | null { return entry.status === 'fulfilled' && entry.value.ok ? (entry.value as RpcSuccess) : null } @@ -40,7 +42,7 @@ export function useNewWorkspaceRuntimeContext( client.sendRequest('linear.status') ]) const [settingsRes, uiRes] = await Promise.allSettled([ - settingsRead.request(client), + optionalSettingsRead.request(client), client.sendRequest('ui.get') ]) if (stale) { @@ -48,7 +50,9 @@ export function useNewWorkspaceRuntimeContext( } const settingsResult = - settingsRes.status === 'fulfilled' ? settingsRead.interpret(settingsRes.value) : null + settingsRes.status === 'fulfilled' + ? optionalSettingsRead.interpret(settingsRes.value) + : null const settingsValue = settingsResult?.accepted ? // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. (settingsResult.value as NewWorktreeRuntimeSettings & { visibleTaskProviders?: unknown }) @@ -58,7 +62,8 @@ export function useNewWorkspaceRuntimeContext( } const uiResult = settledSuccess(uiRes) if (uiResult) { - const ui = (uiResult.result as { ui?: { trustedOrcaHooks?: PersistedTrustedOrcaHooks } }).ui + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary; a missing result reads as untrusted. + const ui = (uiResult.result as UiGetResult)?.ui setTrustedOrcaHooks(ui?.trustedOrcaHooks ?? {}) } diff --git a/mobile/src/source-control/mobile-git-read-operations.ts b/mobile/src/source-control/mobile-git-read-operations.ts index e611abe982c..3b815f3eb5b 100644 --- a/mobile/src/source-control/mobile-git-read-operations.ts +++ b/mobile/src/source-control/mobile-git-read-operations.ts @@ -1,6 +1,9 @@ import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation' import type { RpcCompatibleReader } from '../transport/rpc-operation-contract' -import { rpcPayloadMember, rpcUncheckedPayloadReader } from '../transport/rpc-reader-payload' +import { + rpcUncheckedMemberReader, + rpcUncheckedPayloadReader +} from '../transport/rpc-reader-payload' import { readMobileGitStatusResult } from '../session/mobile-diff-review-rpc' import type { MobileGitStatusResult } from './mobile-git-status' @@ -58,27 +61,18 @@ export const gitHistoryRead = bindDeferredRpcOperation( }) ) -const commitCompareEntriesReader: RpcCompatibleReader< - unknown, - 'commit-compare-entries', - unknown -> = (raw) => ({ - compatible: true, - variant: 'commit-compare-entries', - // Keeps the property-read exception the expanded-commit list already relies on: a null result - // throws inside the load, which is what leaves an already-loaded file list alone. - value: rpcPayloadMember(raw, 'entries'), - salvage: { droppedPaths: [], droppedCount: 0 } -}) - -/** A refused compare leaves the row's file list untouched, so refusal is a skip, not a throw. */ +/** + * A refused compare leaves the row's file list untouched, so refusal is a skip, not a throw. The + * member read keeps the property-read exception a null result throws, which is what leaves an + * already-loaded file list alone. + */ export const gitCommitCompareRead = bindDeferredRpcOperation( defineRpcOperation({ name: 'git.commit-compare-entries-or-skip', method: 'git.commitCompare', acceptance: 'success-result-or-skip', barrier: 'after-caller-barrier', - read: commitCompareEntriesReader + read: rpcUncheckedMemberReader('commit-compare-entries', 'entries') }) ) diff --git a/mobile/src/tasks/blank-workspace-create.ts b/mobile/src/tasks/blank-workspace-create.ts index 3c38ac37447..ea3c827c3b9 100644 --- a/mobile/src/tasks/blank-workspace-create.ts +++ b/mobile/src/tasks/blank-workspace-create.ts @@ -4,6 +4,7 @@ import { createWorktreeWithNameRetry, type WorktreeCreateResult } from './worktr import type { WorktreeCreateIdempotencyProbe } from './worktree-create-idempotency-policy' import { agentLaunchCreateFields, + type WorkspaceCreateParams, type WorkspaceCreateSetupDecision } from './workspace-create-params' @@ -28,7 +29,7 @@ export async function createBlankWorkspace(args: { nameWasGenerated: args.nameWasGenerated, worktreeCreateIdempotency: args.worktreeCreateIdempotency, buildParams: (name) => { - const params: Record = { + const params: WorkspaceCreateParams = { repo: `id:${args.repoId}`, setupDecision: args.setupDecision, name, diff --git a/mobile/src/tasks/composer-source-base-resolve.ts b/mobile/src/tasks/composer-source-base-resolve.ts index 423c3b05294..40419993970 100644 --- a/mobile/src/tasks/composer-source-base-resolve.ts +++ b/mobile/src/tasks/composer-source-base-resolve.ts @@ -1,6 +1,6 @@ import type { RpcClient } from '../transport/rpc-client' -import type { RpcSuccess } from '../transport/types' import type { GitHubPrStartPoint } from '../../../src/shared/worktree/types' +import { worktreeMrBaseResolve, worktreePrBaseResolve } from './mobile-workspace-create-operations' // The resolved start point for a linked PR/MR: the base branch to create from // plus the optional review-compare ref, push target, and exact branch name. @@ -23,8 +23,8 @@ export async function resolveComposerPrBase(args: { isCrossRepository?: boolean }): Promise { const { client, repoId, prNumber, headRefName, baseRefName, isCrossRepository } = args - const response = await client.sendRequest( - 'worktree.resolvePrBase', + const reply = await worktreePrBaseResolve.request( + client, { repo: `id:${repoId}`, prNumber, @@ -34,10 +34,8 @@ export async function resolveComposerPrBase(args: { }, { timeoutMs: 30_000 } ) - if (!response.ok) { - throw new Error(response.error.message) - } - const result = (response as RpcSuccess).result as GitHubPrStartPoint | { error: string } + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = worktreePrBaseResolve.interpret(reply) as GitHubPrStartPoint | { error: string } if ('error' in result) { throw new Error(result.error) } @@ -54,8 +52,8 @@ export async function resolveComposerMrBase(args: { isCrossRepository?: boolean }): Promise { const { client, repoId, mrIid, sourceBranch, targetBranch, isCrossRepository } = args - const response = await client.sendRequest( - 'worktree.resolveMrBase', + const reply = await worktreeMrBaseResolve.request( + client, { repo: `id:${repoId}`, mrIid, @@ -65,10 +63,8 @@ export async function resolveComposerMrBase(args: { }, { timeoutMs: 30_000 } ) - if (!response.ok) { - throw new Error(response.error.message) - } - const result = (response as RpcSuccess).result as HostedBaseResult + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = worktreeMrBaseResolve.interpret(reply) as HostedBaseResult if ('error' in result) { throw new Error(result.error) } diff --git a/mobile/src/tasks/mobile-task-runtime-operations.ts b/mobile/src/tasks/mobile-task-runtime-operations.ts new file mode 100644 index 00000000000..c69651af666 --- /dev/null +++ b/mobile/src/tasks/mobile-task-runtime-operations.ts @@ -0,0 +1,87 @@ +import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation' +import { + rpcUncheckedMemberReader, + rpcUncheckedPayloadReader +} from '../transport/rpc-reader-payload' + +// What the Tasks screen reads once per host to hydrate, and the preferences it writes back. + +/** + * status.get read for task hydration, the first of two policies on this method. A refused status + * stops hydration with the host's own message; the create-time probe in + * mobile-workspace-create-operations.ts degrades instead. One reader serves both. + */ +export const taskRuntimeStatusRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'status.task-runtime', + method: 'status.get', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('runtime-status') + }) +) + +/** + * Persisted UI state, read at the hydration barrier alongside preflight and Linear status. A + * refused read leaves the screen on its defaults rather than failing hydration, so it is a skip. + */ +export const taskUiStateRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'ui.task-state-or-skip', + method: 'ui.get', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedMemberReader('ui-state-member', 'ui') + }) +) + +/** Whether `glab` is installed, which gates the GitLab provider. Advisory, so refusal skips. */ +export const taskPreflightRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'preflight.task-tooling-or-skip', + method: 'preflight.check', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('task-preflight') + }) +) + +/** Whether Linear is connected. Also advisory: an unanswered probe means "not connected". */ +export const taskLinearStatusRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'linear.task-status-or-skip', + method: 'linear.status', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('linear-status') + }) +) + +/** + * Writing persisted UI state. Two of its three call sites await it and surface the host's refusal + * message; the third is fire-and-forget and never interprets the reply, so no acceptance applies + * there. The payload is unread either way. + */ +export const taskUiStateWrite = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'ui.set-task-state', + method: 'ui.set', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('ui-state-written') + }) +) + +/** + * Writing a host setting from the Tasks screen. Every call site is best-effort — the in-memory + * picker already reflects the change — so a refusal is a skip, and none of them reads the payload. + */ +export const taskSettingsWrite = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'settings.update-task-preference-or-skip', + method: 'settings.update', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('setting-written') + }) +) diff --git a/mobile/src/tasks/mobile-task-source-search-operations.ts b/mobile/src/tasks/mobile-task-source-search-operations.ts new file mode 100644 index 00000000000..7460c42bfad --- /dev/null +++ b/mobile/src/tasks/mobile-task-source-search-operations.ts @@ -0,0 +1,100 @@ +import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation' +import type { RpcCompatibleReader } from '../transport/rpc-operation-contract' +import { rpcReadUnchecked, rpcUncheckedPayloadReader } from '../transport/rpc-reader-payload' +import { extractLinearIssueReadItems } from './linear-mobile-issue-read' + +// The Smart workspace-source picker's provider reads: per-repo search, and the single-item lookups +// a pasted link or number resolves to. Provider-specific fallbacks stay at their own call sites. + +export const githubWorkItemSearchRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'github.work-item-search', + method: 'github.listWorkItems', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('github-work-items') + }) +) + +/** GitLab answers in-band too: an accepted reply can carry a provider `error` the caller raises. */ +export const gitlabWorkItemSearchRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'gitlab.work-item-search', + method: 'gitlab.listWorkItems', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('gitlab-work-items') + }) +) + +// Linear replies either as a bare array or as an `{ items }` envelope, and the picker has always +// accepted both through this projection. Two operations share it because the empty-query path asks +// a different method, not because the two answers differ. +const linearIssueReader: RpcCompatibleReader = (raw) => + rpcReadUnchecked('linear-issues', extractLinearIssueReadItems(raw)) + +export const linearIssueSearchRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'linear.issue-search', + method: 'linear.searchIssues', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: linearIssueReader + }) +) + +export const linearAssignedIssueListRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'linear.assigned-issue-list', + method: 'linear.listIssues', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: linearIssueReader + }) +) + +/** + * A repo's owner/repo slug, asked per repo so a pasted cross-repo URL can be matched without + * assuming github.com syntax. A refusal means "this repo cannot answer", which the caller caches + * as no slug rather than failing the paste — so refusal is a skip. The caller still reads the + * refusal code directly, because `method_not_found` is host-wide and retires the whole probe. + */ +export const githubRepoSlugRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'github.repo-slug-or-skip', + method: 'github.repoSlug', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('repo-slug') + }) +) + +export const githubWorkItemByNumberRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'github.work-item-by-number', + method: 'github.workItem', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('github-work-item') + }) +) + +export const githubWorkItemBySlugRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'github.work-item-by-owner-repo', + method: 'github.workItemByOwnerRepo', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('github-work-item') + }) +) + +export const gitlabWorkItemByPathRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'gitlab.work-item-by-path', + method: 'gitlab.workItemByPath', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('gitlab-work-item') + }) +) diff --git a/mobile/src/tasks/mobile-tasks-refactor-parity.test.ts b/mobile/src/tasks/mobile-tasks-refactor-parity.test.ts index 111b119db8e..dcd84ba1656 100644 --- a/mobile/src/tasks/mobile-tasks-refactor-parity.test.ts +++ b/mobile/src/tasks/mobile-tasks-refactor-parity.test.ts @@ -16,12 +16,17 @@ const hash = (parts: string[] | string): string => .update(Array.isArray(parts) ? parts.join('\n') : parts) .digest('hex') -// Bound settings requests change source signatures; their behavior is covered by settings-read-operations.test.ts. -const SETTINGS_RPC_SCREEN_HOOKS = 'fb2d873e06001fbae7cee78d079b3df9dc2eedb56ab2f03c7ffb431bc8666191' +// Bound workspace-creation requests change source signatures the same way bound settings requests +// did: the method string and the envelope read leave the screen and an operation name arrives. The +// behaviour they used to pin is pinned by the recordings in mobile/rpc-foundation/goldens instead, +// which did not move. Statement, declaration, render and style counts are unchanged; `semantics` +// loses exactly the 22 `rpc:` signatures and 22 method literals the migration deleted. +const WORKSPACE_RPC_SCREEN_HOOKS = + '26ed5700089a9de13ea984274eb10ddea62f72b28135992514e3c16ef8e47e30' const PRE_REFACTOR_DIFF_HOOKS = '93c7189b32bed8456cc51814fffa8ce80cf62011ef968a9d53ddec2b9686f58f' -const SETTINGS_RPC_STATEMENTS = '1c99d6382f74c37c0ff896dfa634fb503c9fe8062e2280328d0b82f79f658fdb' +const WORKSPACE_RPC_STATEMENTS = 'c25179660e089fd602b06e8c235e5f92d62e63d6d4add4c33ff89a4b5f9493cc' const MAIN_REBASED_DECLARATIONS = '6ad0397123e59fc1047a14049c86ff31d81723673a7a7f5c41677471aec58415' -const SETTINGS_RPC_SEMANTICS = '2431b1c07dfe9a9c94f5d3f4e91415ed99bd9e1bce3794f8bd5f094a29134d77' +const WORKSPACE_RPC_SEMANTICS = '7a00e700fe7293df9b5b68470185197c56a27007d89038a183153b29326113c0' const PRE_REFACTOR_STYLES = '1db6af69c791d9963928541ad5310942fcbda6d984b422c90b6eb92b6816579a' const PRE_REFACTOR_RENDER_TREE = '2111145136b1e4fbca150d4792d735a90e992488e9934cfc1a8b8f3be981f39f' @@ -29,7 +34,7 @@ describe('Mobile Tasks refactor parity', () => { it('preserves recursively flattened hook and dependency order', () => { const screenHooks = readFlattenedMobileTasksHookSignatures('MobileTasksScreen') expect(screenHooks).toHaveLength(350) - expect(hash(screenHooks)).toBe(SETTINGS_RPC_SCREEN_HOOKS) + expect(hash(screenHooks)).toBe(WORKSPACE_RPC_SCREEN_HOOKS) const diffHooks = readFlattenedMobileTasksHookSignatures('GitHubPrFileDiff') expect(diffHooks).toHaveLength(3) @@ -39,7 +44,7 @@ describe('Mobile Tasks refactor parity', () => { it('preserves every screen statement in execution order', () => { const statements = readFlattenedMobileTasksCoreStatements() expect(statements).toHaveLength(417) - expect(hash(statements)).toBe(SETTINGS_RPC_STATEMENTS) + expect(hash(statements)).toBe(WORKSPACE_RPC_STATEMENTS) }) it('preserves every moved top-level declaration', () => { @@ -50,8 +55,8 @@ describe('Mobile Tasks refactor parity', () => { it('preserves RPC calls, runtime strings, and JSX host signatures', () => { const semantics = readMobileTasksSemanticSource() - expect(semantics.split('\n')).toHaveLength(3_496) - expect(hash(semantics)).toBe(SETTINGS_RPC_SEMANTICS) + expect(semantics.split('\n')).toHaveLength(3_452) + expect(hash(semantics)).toBe(WORKSPACE_RPC_SEMANTICS) }) it('preserves render expressions and event handlers in tree order', () => { diff --git a/mobile/src/tasks/mobile-workspace-create-operations.ts b/mobile/src/tasks/mobile-workspace-create-operations.ts new file mode 100644 index 00000000000..55cad2f373f --- /dev/null +++ b/mobile/src/tasks/mobile-workspace-create-operations.ts @@ -0,0 +1,64 @@ +import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation' +import { rpcUncheckedPayloadReader } from '../transport/rpc-reader-payload' + +// Creating a workspace from a task. Every reply here is one the call site only re-typed, so the +// readers are unchecked: moving a shape check in would be a validation change, not a migration. + +/** + * worktree.create. A lost reply is *unknown*, never failed — `worktree-create-retry.ts` replays on + * the same clientMutationId — so this operation never interprets a transport rejection: `request` + * hands back the transport promise itself and the delivery-unknown mark reaches the retry loop on + * the original rejection object. + */ +export const worktreeCreateRun = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'worktree.create', + method: 'worktree.create', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('created-worktree') + }) +) + +/** + * The start point for a workspace created from a linked pull request. Refusal throws the host's + * message; an accepted reply can still carry a soft `{ error }` the caller raises itself. + */ +export const worktreePrBaseResolve = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'worktree.resolve-pr-base', + method: 'worktree.resolvePrBase', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('pr-start-point') + }) +) + +/** The GitLab merge-request equivalent; same acceptance, same soft-error convention. */ +export const worktreeMrBaseResolve = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'worktree.resolve-mr-base', + method: 'worktree.resolveMrBase', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('mr-start-point') + }) +) + +/** + * status.get read for create-time capabilities, the second of two policies on this method. + * + * Both policies named because the two callers disagree about what a refused status means: the + * Tasks screen cannot hydrate without it and surfaces the host's message (`taskRuntimeStatusRead`), + * while create-time capability probing degrades to "no capabilities" and creates anyway, so here a + * refusal is a skip. One reader serves both — the payload is unchecked in each. + */ +export const worktreeCreateCapabilityRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'status.create-capabilities-or-skip', + method: 'status.get', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('runtime-status') + }) +) diff --git a/mobile/src/tasks/mobile-workspace-source-operations.ts b/mobile/src/tasks/mobile-workspace-source-operations.ts new file mode 100644 index 00000000000..3126682c9a1 --- /dev/null +++ b/mobile/src/tasks/mobile-workspace-source-operations.ts @@ -0,0 +1,101 @@ +import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation' +import { + rpcUncheckedMemberReader, + rpcUncheckedPayloadReader +} from '../transport/rpc-reader-payload' + +// The repo and SSH reads the workspace-create drawer runs: connection state, agent detection, +// repo-owned setup hooks, sparse presets and base-branch search. + +const sshConnectionStateReader = rpcUncheckedMemberReader('ssh-connection-state', 'state') + +/** Connecting an SSH repo before create. The reply's only read field is `state`. */ +export const sshRepoConnectRun = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'ssh.connect-repo', + method: 'ssh.connect', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: sshConnectionStateReader + }) +) + +/** The same field, read by the drawer's state effect and by the pre-create readiness check. */ +export const sshRepoStateRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'ssh.repo-state', + method: 'ssh.getState', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: sshConnectionStateReader + }) +) + +// Agent detection is advisory: a refused or failed probe leaves the drawer with an empty set and +// the runtime still validates availability before spawning, so refusal is a skip. +export const remoteAgentDetectionRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'preflight.detect-remote-agents-or-skip', + method: 'preflight.detectRemoteAgents', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('detected-agent-ids') + }) +) + +/** The local host's agents, for a repo with no SSH connection. */ +export const localAgentDetectionRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'preflight.detect-agents-or-skip', + method: 'preflight.detectAgents', + acceptance: 'success-result-or-skip', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('detected-agent-ids') + }) +) + +/** The repo's orca.yaml hooks, which decide whether create must ask before running setup. */ +export const repoSetupHooksRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'repo.setup-hooks', + method: 'repo.hooks', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('repo-hooks') + }) +) + +export const repoSparsePresetListRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'repo.sparse-preset-list', + method: 'repo.sparsePresets', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedMemberReader('sparse-presets', 'presets') + }) +) + +export const repoSparsePresetSaveRun = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'repo.save-sparse-preset', + method: 'repo.saveSparsePreset', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedMemberReader('saved-sparse-preset', 'preset') + }) +) + +/** + * Base-branch search. The payload is unchecked: both callers — the drawer's picker effect and the + * Smart source picker — spell their own `refDetails ?? refs.map(...)` fallback, and reproducing + * that in the reader would need a type assertion the operation fence rightly bans. + */ +export const repoBaseRefSearchRead = bindDeferredRpcOperation( + defineRpcOperation({ + name: 'repo.base-ref-search', + method: 'repo.searchRefs', + acceptance: 'require-result-or-throw-message', + barrier: 'after-caller-barrier', + read: rpcUncheckedPayloadReader('base-ref-search') + }) +) diff --git a/mobile/src/tasks/setup-hook-trust.ts b/mobile/src/tasks/setup-hook-trust.ts index 72381393989..e6cb492e617 100644 --- a/mobile/src/tasks/setup-hook-trust.ts +++ b/mobile/src/tasks/setup-hook-trust.ts @@ -1,5 +1,6 @@ import type { PersistedTrustedOrcaHooks } from '../../../src/shared/orca-yaml-hook-types' import type { RpcClient } from '../transport/rpc-client' +import { taskUiStateWrite } from './mobile-task-runtime-operations' export type SetupHookTrust = { contentHash: string @@ -45,10 +46,9 @@ export async function persistSetupHookTrustApproval(args: { alwaysTrust: boolean }): Promise { const next = trustedOrcaHooksWithSetupApproval(args) - const response = await args.client.sendRequest('ui.set', { trustedOrcaHooks: next }) - if (!response.ok) { - throw new Error(response.error.message) - } + taskUiStateWrite.interpret( + await taskUiStateWrite.request(args.client, { trustedOrcaHooks: next }) + ) return next } diff --git a/mobile/src/tasks/smart-source-paste-intent.ts b/mobile/src/tasks/smart-source-paste-intent.ts index 21afd4157de..87715eab039 100644 --- a/mobile/src/tasks/smart-source-paste-intent.ts +++ b/mobile/src/tasks/smart-source-paste-intent.ts @@ -9,7 +9,13 @@ import { import { parseGitLabIssueOrMRLink } from '../../../src/shared/new-workspace/gitlab-links' import { isSmartWorkspaceSourceQueryWithinLimit } from '../../../src/shared/new-workspace/smart-workspace-source-results' import type { RpcClient } from '../transport/rpc-client' -import type { RpcSuccess } from '../transport/types' +import { isMethodNotFoundRefusal } from '../transport/rpc-acceptance-policies' +import { + githubRepoSlugRead, + githubWorkItemByNumberRead, + githubWorkItemBySlugRead, + gitlabWorkItemByPathRead +} from './mobile-task-source-search-operations' import { githubRepoIdentityKey } from '../../../src/shared/github/repository-identity-key' // A repo the picker can switch to for a cross-repo GitHub paste. Slug is derived @@ -108,14 +114,18 @@ export async function findRepoMatchingSlugForPaste( let resolved = cache.get(repo.id) if (!cache.has(repo.id)) { try { - const response = await client.sendRequest('github.repoSlug', { repo: `id:${repo.id}` }) - if (!response.ok && response.error.code === 'method_not_found') { + const reply = await githubRepoSlugRead.request(client, { repo: `id:${repo.id}` }) + // Why the raw refusal: a missing method retires the probe host-wide, and the acceptance + // policy reports only that the reply was refused, not with which code. + if (isMethodNotFoundRefusal(reply)) { // Why: RPC availability is host-wide; avoid repeating an unsupported // probe for every repo or on the next paste attempt. repos.forEach((candidate) => cache.set(candidate.id, null)) return null } - resolved = response.ok ? ((response as RpcSuccess).result as RepoSlug | null) : null + const slug = githubRepoSlugRead.interpret(reply) + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + resolved = slug.accepted ? (slug.value as RepoSlug | null) : null } catch { resolved = null } @@ -133,11 +143,12 @@ export async function lookupGitHubItemByNumber( repoId: string, number: number ): Promise { - const response = await client.sendRequest('github.workItem', { repo: `id:${repoId}`, number }) - if (!response.ok) { - throw new Error(response.error.message) - } - const item = (response as RpcSuccess).result as GitHubWorkItem | null + const reply = await githubWorkItemByNumberRead.request(client, { + repo: `id:${repoId}`, + number + }) + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const item = githubWorkItemByNumberRead.interpret(reply) as GitHubWorkItem | null return item ? { ...item, repoId } : null } @@ -148,7 +159,7 @@ export async function lookupGitHubItemByOwnerRepo( number: number, type: 'issue' | 'pr' ): Promise { - const response = await client.sendRequest('github.workItemByOwnerRepo', { + const reply = await githubWorkItemBySlugRead.request(client, { repo: `id:${repoId}`, owner: slug.owner, ownerRepo: slug.repo, @@ -156,10 +167,8 @@ export async function lookupGitHubItemByOwnerRepo( number, type }) - if (!response.ok) { - throw new Error(response.error.message) - } - const item = (response as RpcSuccess).result as GitHubWorkItem | null + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const item = githubWorkItemBySlugRead.interpret(reply) as GitHubWorkItem | null return item ? { ...item, repoId } : null } @@ -168,16 +177,14 @@ export async function lookupGitLabItemByPath( repoId: string, link: NonNullable> ): Promise { - const response = await client.sendRequest('gitlab.workItemByPath', { + const reply = await gitlabWorkItemByPathRead.request(client, { repo: `id:${repoId}`, host: link.slug.host, path: link.slug.path, iid: link.number, type: link.type }) - if (!response.ok) { - throw new Error(response.error.message) - } - const item = (response as RpcSuccess).result as GitLabWorkItem | null + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const item = gitlabWorkItemByPathRead.interpret(reply) as GitLabWorkItem | null return item ? { ...item, repoId } : null } diff --git a/mobile/src/tasks/smart-source-search-requests.ts b/mobile/src/tasks/smart-source-search-requests.ts index 876e2ef1a20..432e6f1c6bc 100644 --- a/mobile/src/tasks/smart-source-search-requests.ts +++ b/mobile/src/tasks/smart-source-search-requests.ts @@ -3,8 +3,13 @@ import type { GitLabWorkItem } from '../../../src/shared/gitlab-types' import type { LinearIssue } from '../../../src/shared/linear/issue-types' import type { BaseRefSearchResult } from '../../../src/shared/repo-types' import type { RpcClient } from '../transport/rpc-client' -import type { RpcSuccess } from '../transport/types' -import { extractLinearIssueReadItems } from './linear-mobile-issue-read' +import { repoBaseRefSearchRead } from './mobile-workspace-source-operations' +import { + githubWorkItemSearchRead, + gitlabWorkItemSearchRead, + linearAssignedIssueListRead, + linearIssueSearchRead +} from './mobile-task-source-search-operations' import { PER_REPO_FETCH_LIMIT } from './mobile-work-items' import type { MrStateFilter } from './mobile-composer-source-types' @@ -26,15 +31,13 @@ export async function searchGitHubItems( repoId: string, query: string ): Promise { - const response = await client.sendRequest('github.listWorkItems', { + const reply = await githubWorkItemSearchRead.request(client, { repo: `id:${repoId}`, limit: PER_REPO_FETCH_LIMIT, query: scopeGitHubQuery(query) }) - if (!response.ok) { - throw new Error(response.error.message) - } - const envelope = (response as RpcSuccess).result as { items: GitHubWorkItem[] } + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const envelope = githubWorkItemSearchRead.interpret(reply) as { items: GitHubWorkItem[] } // Stamp repoId so the shared row builder + create flow can attribute each item // to the searched repo (the runtime omits it, like the desktop fetcher). return (envelope.items ?? []).map((item) => ({ ...item, repoId })) @@ -46,17 +49,15 @@ export async function searchGitLabItems( query: string, state: MrStateFilter ): Promise { - const response = await client.sendRequest('gitlab.listWorkItems', { + const reply = await gitlabWorkItemSearchRead.request(client, { repo: `id:${repoId}`, state, page: 1, perPage: GITLAB_PER_PAGE, query: query.trim() || undefined }) - if (!response.ok) { - throw new Error(response.error.message) - } - const envelope = (response as RpcSuccess).result as { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const envelope = gitlabWorkItemSearchRead.interpret(reply) as { items: GitLabWorkItem[] error?: { type?: string; message: string } } @@ -72,25 +73,27 @@ export async function searchLinearIssues( linearWorkspaceId: string | null | undefined ): Promise { const trimmed = query.trim() - const response = trimmed - ? await client.sendRequest('linear.searchIssues', { - query: trimmed, - limit: LINEAR_LIMIT, - workspaceId: linearWorkspaceId ?? undefined - }) - : await client.sendRequest('linear.listIssues', { - // Empty query lists the viewer's assigned issues, matching desktop's - // Smart picker default (SmartWorkspaceNameField uses listLinearIssues('assigned')). - filter: 'assigned', - limit: LINEAR_LIMIT, - workspaceId: linearWorkspaceId ?? undefined - }) - if (!response.ok) { - throw new Error(response.error.message) - } - // extractLinearIssueReadItems yields the mobile issue-read shape; the fields the - // row builder/create flow read (id/identifier/title/url/state/team) are a subset. - return extractLinearIssueReadItems((response as RpcSuccess).result) as unknown as LinearIssue[] + // The reader yields the mobile issue-read shape; the fields the row builder/create flow read + // (id/identifier/title/url/state/team) are a subset. + const issues = trimmed + ? linearIssueSearchRead.interpret( + await linearIssueSearchRead.request(client, { + query: trimmed, + limit: LINEAR_LIMIT, + workspaceId: linearWorkspaceId ?? undefined + }) + ) + : linearAssignedIssueListRead.interpret( + await linearAssignedIssueListRead.request(client, { + // Empty query lists the viewer's assigned issues, matching desktop's + // Smart picker default (SmartWorkspaceNameField uses listLinearIssues('assigned')). + filter: 'assigned', + limit: LINEAR_LIMIT, + workspaceId: linearWorkspaceId ?? undefined + }) + ) + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + return issues as LinearIssue[] } export async function searchBranches( @@ -98,15 +101,13 @@ export async function searchBranches( repoId: string, query: string ): Promise { - const response = await client.sendRequest( - 'repo.searchRefs', + const reply = await repoBaseRefSearchRead.request( + client, { repo: `id:${repoId}`, query: query.trim(), limit: BRANCH_LIMIT }, { timeoutMs: 30_000 } ) - if (!response.ok) { - throw new Error(response.error.message) - } - const result = (response as RpcSuccess).result as { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = repoBaseRefSearchRead.interpret(reply) as { refDetails?: BaseRefSearchResult[] refs?: string[] } diff --git a/mobile/src/tasks/source-workspace-create.ts b/mobile/src/tasks/source-workspace-create.ts index 6e666005ac3..30dd16f89fb 100644 --- a/mobile/src/tasks/source-workspace-create.ts +++ b/mobile/src/tasks/source-workspace-create.ts @@ -9,6 +9,7 @@ import type { WorkspaceAgentChoice } from './workspace-agent-selection' import { agentLaunchCreateFields, buildTaskWorkspaceCreateParams, + type WorkspaceCreateParams, type WorkspaceCreateSetupDecision, type WorkspaceCreateTaskItem } from './workspace-create-params' @@ -167,7 +168,7 @@ async function createBranchWorkspace(args: { const createdWithAgentId = agent.choice === 'blank' ? undefined : agent.choice const comment = note?.trim() const manualDisplayName = nameIsAutoManaged === true ? undefined : workspaceName?.trim() - const applyCommon = (params: Record): Record => { + const applyCommon = (params: WorkspaceCreateParams): WorkspaceCreateParams => { Object.assign(params, agentLaunchCreateFields(createdWithAgentId)) if (comment) { params.comment = comment @@ -213,7 +214,7 @@ async function createBranchWorkspace(args: { baseName, worktreeCreateIdempotency: args.worktreeCreateIdempotency, buildParams: (candidate) => { - const params: Record = { + const params: WorkspaceCreateParams = { repo: `id:${targetRepoId}`, name: candidate, setupDecision, @@ -263,7 +264,7 @@ async function createNewBranchWorkspace(args: { baseName: selection.branchName, worktreeCreateIdempotency: args.worktreeCreateIdempotency, buildParams: (candidate) => { - const params: Record = { + const params: WorkspaceCreateParams = { repo: `id:${targetRepoId}`, name: candidate, setupDecision, diff --git a/mobile/src/tasks/use-mobile-tasks-client-settings-actions.tsx b/mobile/src/tasks/use-mobile-tasks-client-settings-actions.tsx index fe048e7a5b7..ade7b46cb8f 100644 --- a/mobile/src/tasks/use-mobile-tasks-client-settings-actions.tsx +++ b/mobile/src/tasks/use-mobile-tasks-client-settings-actions.tsx @@ -7,12 +7,8 @@ import { useLayoutEffect, useState } from './mobile-tasks-dependencies' -import { - type GitHubPreset, - type RepoSummary, - type TaskResumeState, - isSuccess -} from './mobile-tasks-legacy-foundation' +import type { GitHubPreset, RepoSummary, TaskResumeState } from './mobile-tasks-legacy-foundation' +import { taskSettingsWrite, taskUiStateWrite } from './mobile-task-runtime-operations' export function useMobileTasksClientSettingsActions(model: ProjectRepositoryResolutionModel) { const { @@ -106,7 +102,7 @@ export function useMobileTasksClientSettingsActions(model: ProjectRepositoryReso } const next = { ...taskResumeRef.current, ...updates } taskResumeRef.current = next - void client.sendRequest('ui.set', { taskResumeState: next }).catch(() => { + void taskUiStateWrite.request(client, { taskResumeState: next }).catch(() => { // Best-effort: desktop treats task resume as a convenience preference. }) }, @@ -143,7 +139,7 @@ export function useMobileTasksClientSettingsActions(model: ProjectRepositoryReso if (!client || !taskUiReady) { return } - void client.sendRequest('settings.update', { defaultTaskSource: nextProvider }).catch(() => { + void taskSettingsWrite.request(client, { defaultTaskSource: nextProvider }).catch(() => { // Best-effort: a failed settings write should not block switching views. }) }, @@ -158,11 +154,9 @@ export function useMobileTasksClientSettingsActions(model: ProjectRepositoryReso const nextSelection = selection.size === 0 || selection.size === allRepos.length ? null : [...selection] defaultRepoSelectionRef.current = nextSelection - void client - .sendRequest('settings.update', { defaultRepoSelection: nextSelection }) - .catch(() => { - // Best-effort: the in-memory repo picker already reflects the change. - }) + void taskSettingsWrite.request(client, { defaultRepoSelection: nextSelection }).catch(() => { + // Best-effort: the in-memory repo picker already reflects the change. + }) }, [client, taskUiReady] ) @@ -173,7 +167,7 @@ export function useMobileTasksClientSettingsActions(model: ProjectRepositoryReso if (!client || !taskUiReady) { return } - void client.sendRequest('settings.update', { defaultTaskViewPreset: preset }).catch(() => { + void taskSettingsWrite.request(client, { defaultTaskViewPreset: preset }).catch(() => { // Best-effort: the current session still uses the selected preset. }) }, @@ -186,7 +180,7 @@ export function useMobileTasksClientSettingsActions(model: ProjectRepositoryReso if (!client || !taskUiReady) { return } - void client.sendRequest('settings.update', { githubProjects: nextSettings }).catch(() => { + void taskSettingsWrite.request(client, { githubProjects: nextSettings }).catch(() => { // Best-effort: project selection can still work for the current session. }) }, @@ -204,10 +198,7 @@ export function useMobileTasksClientSettingsActions(model: ProjectRepositoryReso contentHash, alwaysTrust }) - const response = await client.sendRequest('ui.set', { trustedOrcaHooks: next }) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } + taskUiStateWrite.interpret(await taskUiStateWrite.request(client, { trustedOrcaHooks: next })) setTrustedOrcaHooks(next) }, [client, trustedOrcaHooks] diff --git a/mobile/src/tasks/use-mobile-tasks-runtime-hydration.tsx b/mobile/src/tasks/use-mobile-tasks-runtime-hydration.tsx index 1ededc361bc..2372ea272c9 100644 --- a/mobile/src/tasks/use-mobile-tasks-runtime-hydration.tsx +++ b/mobile/src/tasks/use-mobile-tasks-runtime-hydration.tsx @@ -1,5 +1,11 @@ import { settingsRead } from '../transport/settings-read-operations' import type { ClientSettingsActionsModel } from './use-mobile-tasks-client-settings-actions' +import { + taskLinearStatusRead, + taskPreflightRead, + taskRuntimeStatusRead, + taskUiStateRead +} from './mobile-task-runtime-operations' import { MOBILE_TASKS_CAPABILITY, type PersistedTrustedOrcaHooks, @@ -18,7 +24,6 @@ import { type TaskRuntimeStatus, getTaskPresetQuery, githubKindFromQuery, - isSuccess, isTaskProvider, normalizeGitHubPreset, normalizeLinearFilter, @@ -192,14 +197,14 @@ export function useMobileTasksRuntimeHydration(model: ClientSettingsActionsModel resetWorkspaceCreateState() const hydrateTaskState = async (): Promise => { - const statusResponse = await client.sendRequest('status.get') + const statusReply = await taskRuntimeStatusRead.request(client) if (stale) { return } - if (!isSuccess(statusResponse)) { - throw new Error(statusResponse.error.message) - } - const status = statusResponse.result as TaskRuntimeStatus + // The guard stays between the request and the interpretation: a screen that has moved on + // must not raise a refusal it no longer owns. + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const status = taskRuntimeStatusRead.interpret(statusReply) as TaskRuntimeStatus if (!status.capabilities?.includes(MOBILE_TASKS_CAPABILITY)) { // Why: Tasks is additive RPC surface, so old desktop builds can still // pair but must not receive the newer task-specific method calls. @@ -249,13 +254,15 @@ export function useMobileTasksRuntimeHydration(model: ClientSettingsActionsModel } setTasksSupportState({ kind: 'supported', client }) setError('') - const [settingsResponse, uiResponse, preflightResponse, linearStatusResponse] = - await Promise.all([ - settingsRead.request(client), - client.sendRequest('ui.get'), - client.sendRequest('preflight.check'), - client.sendRequest('linear.status') - ]) + // Why raw requests in the group and not startRpcOperation: main's Promise.all rejects as soon + // as one leg rejects, and interpreting at an all-settled barrier would instead wait for the + // slowest peer and let a later policy surface a different error. + const [settingsResponse, uiReply, preflightReply, linearStatusReply] = await Promise.all([ + settingsRead.request(client), + taskUiStateRead.request(client), + taskPreflightRead.request(client), + taskLinearStatusRead.request(client) + ]) if (stale) { return } @@ -266,26 +273,30 @@ export function useMobileTasksRuntimeHydration(model: ClientSettingsActionsModel ((settingsResult.value ?? {}) as RuntimeTaskSettings) : {} setRuntimeTaskSettings(settings) - const uiState = isSuccess(uiResponse) - ? ( - uiResponse.result as { - ui?: { + const uiRead = taskUiStateRead.interpret(uiReply) + const uiState = uiRead.accepted + ? // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + (uiRead.value as + | { taskResumeState?: TaskResumeState trustedOrcaHooks?: PersistedTrustedOrcaHooks } - } - ).ui + | undefined) : null setTrustedOrcaHooks(uiState?.trustedOrcaHooks ?? {}) const resume = uiState?.taskResumeState ?? {} taskResumeRef.current = resume setGithubProjectHiddenFieldIdsByView(resume.githubProjectHiddenFieldIdsByView ?? {}) - const preflight = isSuccess(preflightResponse) - ? (preflightResponse.result as { glab?: { installed?: boolean } }) + const preflightRead = taskPreflightRead.interpret(preflightReply) + const preflight = preflightRead.accepted + ? // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + (preflightRead.value as { glab?: { installed?: boolean } }) : null - const linearStatus = isSuccess(linearStatusResponse) - ? (linearStatusResponse.result as LinearStatusResponse) + const linearRead = taskLinearStatusRead.interpret(linearStatusReply) + const linearStatus = linearRead.accepted + ? // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + (linearRead.value as LinearStatusResponse) : null const preferredProviders = normalizeVisibleTaskProviders(settings.visibleTaskProviders) const linearIsConnected = linearStatus?.connected === true diff --git a/mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx b/mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx index 5befaddaebd..0cfaa2e3d42 100644 --- a/mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx +++ b/mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx @@ -11,13 +11,18 @@ import { useCallback, wasSetupHookPreviouslyApproved } from './mobile-tasks-dependencies' -import { - type ActionableTaskItem, - type GitPushTarget, - type RuntimeTaskSettings, - type SetupDecision, - isSuccess +import type { + ActionableTaskItem, + GitPushTarget, + RuntimeTaskSettings, + SetupDecision } from './mobile-tasks-legacy-foundation' +import type { WorkspaceCreateParams } from './workspace-create-params' +import { + worktreeCreateRun, + worktreeMrBaseResolve, + worktreePrBaseResolve +} from './mobile-workspace-create-operations' export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateModel) { const { @@ -154,7 +159,7 @@ export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateMod const trimmedWorkspaceName = workspaceNameOverride?.trim() ?? '' const nameIsAutoManaged = !trimmedWorkspaceName || trimmedWorkspaceName === workspaceLastAutoName - let params: Record + let params: WorkspaceCreateParams if (item.provider === 'github') { const source = item.source let prStartPoint: { baseBranch: string; pushTarget?: GitPushTarget } | undefined @@ -164,8 +169,8 @@ export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateMod baseBranchOverride }) ) { - const response = await client.sendRequest( - 'worktree.resolvePrBase', + const reply = await worktreePrBaseResolve.request( + client, { repo: `id:${source.repoId}`, prNumber: source.number, @@ -176,10 +181,8 @@ export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateMod }, { timeoutMs: 30_000 } ) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const result = response.result as + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = worktreePrBaseResolve.interpret(reply) as | { baseBranch: string; pushTarget?: GitPushTarget } | { error: string } if ('error' in result) { @@ -209,8 +212,8 @@ export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateMod baseBranchOverride }) ) { - const response = await client.sendRequest( - 'worktree.resolveMrBase', + const reply = await worktreeMrBaseResolve.request( + client, { repo: `id:${source.repoId}`, mrIid: source.number, @@ -221,10 +224,8 @@ export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateMod }, { timeoutMs: 30_000 } ) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const result = response.result as + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = worktreeMrBaseResolve.interpret(reply) as | { baseBranch: string; pushTarget?: GitPushTarget } | { error: string } if ('error' in result) { @@ -259,13 +260,11 @@ export function useMobileTasksWorkspaceCreateActions(model: WorkspaceSshStateMod nameIsAutoManaged }) } - const response = await client.sendRequest('worktree.create', params, { + const createReply = await worktreeCreateRun.request(client, params, { timeoutMs: WORKTREE_CREATE_TIMEOUT_MS }) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const result = response.result as { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = worktreeCreateRun.interpret(createReply) as { worktree: { id: string; displayName?: string } warning?: string } diff --git a/mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx b/mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx index 93d0d45de09..ea780216170 100644 --- a/mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx +++ b/mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx @@ -1,6 +1,9 @@ import type { WorkspaceCreateProjectionModel } from './use-mobile-tasks-workspace-create-projection' import { type BaseRefSearchResult, type SparsePreset, useEffect } from './mobile-tasks-dependencies' -import { isSuccess } from './mobile-tasks-legacy-foundation' +import { + repoBaseRefSearchRead, + repoSparsePresetListRead +} from './mobile-workspace-source-operations' export function useMobileTasksWorkspaceSourceEffects(model: WorkspaceCreateProjectionModel) { const { @@ -45,16 +48,15 @@ export function useMobileTasksWorkspaceSourceEffects(model: WorkspaceCreateProje setWorkspaceSparsePresetsLoading(true) setWorkspaceSparsePresetsLoaded(false) setWorkspaceSparsePresetsError('') - void client - .sendRequest('repo.sparsePresets', { repo: `id:${workspaceCreateTargetRepo.id}` }) - .then((response) => { + void repoSparsePresetListRead + .request(client, { repo: `id:${workspaceCreateTargetRepo.id}` }) + .then((reply) => { if (stale) { return } - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const presets = (response.result as { presets?: SparsePreset[] }).presets ?? [] + const presets = + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + (repoSparsePresetListRead.interpret(reply) as SparsePreset[] | undefined) ?? [] setWorkspaceSparsePresets(presets) setWorkspaceSparsePresetsLoaded(true) setWorkspaceSparsePresetId((current) => @@ -112,20 +114,18 @@ export function useMobileTasksWorkspaceSourceEffects(model: WorkspaceCreateProje let stale = false setWorkspaceBaseBranchLoading(true) setWorkspaceBaseBranchError('') - void client - .sendRequest( - 'repo.searchRefs', + void repoBaseRefSearchRead + .request( + client, { repo: `id:${workspaceCreateTargetRepo.id}`, query, limit: 20 }, { timeoutMs: 30_000 } ) - .then((response) => { + .then((reply) => { if (stale) { return } - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const result = response.result as { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = repoBaseRefSearchRead.interpret(reply) as { refDetails?: BaseRefSearchResult[] refs?: string[] } diff --git a/mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx b/mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx index d2b9551032f..ef2ecabd4fe 100644 --- a/mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx +++ b/mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx @@ -5,7 +5,8 @@ import { useCallback, useEffect } from './mobile-tasks-dependencies' -import { isSuccess, sortSparsePresetsByName } from './mobile-tasks-legacy-foundation' +import { sortSparsePresetsByName } from './mobile-tasks-legacy-foundation' +import { repoSparsePresetSaveRun, sshRepoStateRead } from './mobile-workspace-source-operations' export function useMobileTasksWorkspaceSparseActions(model: WorkspaceSourceEffectsModel) { const { @@ -82,16 +83,14 @@ export function useMobileTasksWorkspaceSparseActions(model: WorkspaceSourceEffec setWorkspaceSparseSaving(true) setWorkspaceSparsePresetsError('') try { - const response = await client.sendRequest('repo.saveSparsePreset', { + const reply = await repoSparsePresetSaveRun.request(client, { repo: `id:${workspaceCreateTargetRepo.id}`, ...(workspaceSparseDraft.presetId ? { id: workspaceSparseDraft.presetId } : {}), name: workspaceSparseDraftName, directories: workspaceSparseDraftParsed.directories }) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const saved = (response.result as { preset?: SparsePreset }).preset + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const saved = repoSparsePresetSaveRun.interpret(reply) as SparsePreset | undefined if (!saved) { throw new Error('Failed to save sparse preset.') } @@ -130,16 +129,15 @@ export function useMobileTasksWorkspaceSparseActions(model: WorkspaceSourceEffec } let stale = false - void client - .sendRequest('ssh.getState', { targetId: workspaceCreateTargetConnectionId }) - .then((response) => { + void sshRepoStateRead + .request(client, { targetId: workspaceCreateTargetConnectionId }) + .then((reply) => { if (stale) { return } - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const state = (response.result as { state?: SshConnectionState | null }).state ?? null + const state = + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + (sshRepoStateRead.interpret(reply) as SshConnectionState | null | undefined) ?? null setWorkspaceSshState( state ?? { targetId: workspaceCreateTargetConnectionId, diff --git a/mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx b/mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx index d1a408aed22..5e0966ca9ba 100644 --- a/mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx +++ b/mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx @@ -8,12 +8,18 @@ import { useEffect, useMemo } from './mobile-tasks-dependencies' -import { - type RepoHooksResponse, - type RepoSummary, - type SetupDecision, - isSuccess +import type { + RepoHooksResponse, + RepoSummary, + SetupDecision } from './mobile-tasks-legacy-foundation' +import { + localAgentDetectionRead, + remoteAgentDetectionRead, + repoSetupHooksRead, + sshRepoConnectRun, + sshRepoStateRead +} from './mobile-workspace-source-operations' export function useMobileTasksWorkspaceSshState(model: WorkspaceSparseActionsModel) { const { @@ -47,15 +53,13 @@ export function useMobileTasksWorkspaceSshState(model: WorkspaceSparseActionsMod reconnectAttempt: 0 }) try { - const response = await client.sendRequest( - 'ssh.connect', + const reply = await sshRepoConnectRun.request( + client, { targetId: workspaceCreateTargetConnectionId }, { timeoutMs: 120_000 } ) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const state = (response.result as { state?: SshConnectionState | null }).state + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const state = sshRepoConnectRun.interpret(reply) as SshConnectionState | null | undefined setWorkspaceSshState( state ?? { targetId: workspaceCreateTargetConnectionId, @@ -87,11 +91,10 @@ export function useMobileTasksWorkspaceSshState(model: WorkspaceSparseActionsMod ) { return } - const response = await client.sendRequest('ssh.getState', { targetId: repo.connectionId }) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const state = (response.result as { state?: SshConnectionState | null }).state ?? null + const reply = await sshRepoStateRead.request(client, { targetId: repo.connectionId }) + const state = + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + (sshRepoStateRead.interpret(reply) as SshConnectionState | null | undefined) ?? null if (state) { setWorkspaceSshState(state) } @@ -115,18 +118,23 @@ export function useMobileTasksWorkspaceSshState(model: WorkspaceSparseActionsMod } let stale = false setWorkspaceDetectedAgentIds(null) - const request = workspaceCreateTargetRepo.connectionId - ? client.sendRequest('preflight.detectRemoteAgents', { - connectionId: workspaceCreateTargetRepo.connectionId - }) - : client.sendRequest('preflight.detectAgents') - void request - .then((response) => { + const detection = workspaceCreateTargetRepo.connectionId + ? { + operation: remoteAgentDetectionRead, + reply: remoteAgentDetectionRead.request(client, { + connectionId: workspaceCreateTargetRepo.connectionId + }) + } + : { operation: localAgentDetectionRead, reply: localAgentDetectionRead.request(client) } + void detection.reply + .then((reply) => { if (stale) { return } + const detected = detection.operation.interpret(reply) setWorkspaceDetectedAgentIds( - isSuccess(response) ? new Set(response.result as string[]) : new Set() + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + detected.accepted ? new Set(detected.value as string[]) : new Set() ) }) .catch(() => { @@ -190,11 +198,9 @@ export function useMobileTasksWorkspaceSshState(model: WorkspaceSparseActionsMod if (!client || !tasksSupported) { return { kind: 'decision', decision: override ?? 'inherit' } } - const response = await client.sendRequest('repo.hooks', { repo: `id:${repo.id}` }) - if (!isSuccess(response)) { - throw new Error(response.error.message) - } - const result = response.result as RepoHooksResponse + const reply = await repoSetupHooksRead.request(client, { repo: `id:${repo.id}` }) + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = repoSetupHooksRead.interpret(reply) as RepoHooksResponse const setupCommand = result.hooks?.scripts?.setup?.trim() const setupTrust = normalizeSetupHookTrust(result.setupTrust) ?? undefined if (!setupCommand) { diff --git a/mobile/src/tasks/workspace-create-params.ts b/mobile/src/tasks/workspace-create-params.ts index 218c4fe37b0..5f5adbecf5f 100644 --- a/mobile/src/tasks/workspace-create-params.ts +++ b/mobile/src/tasks/workspace-create-params.ts @@ -4,6 +4,7 @@ import type { SetupDecision } from '../../../src/shared/worktree/create-types' import type { GitPushTarget } from '../../../src/shared/worktree/types' +import type { RpcSendParams } from '../transport/rpc-params-contract' import { getWorkspaceSourceName } from '../../../src/shared/new-workspace/workspace-source' import { resolveMobileWorkspaceCreateName } from './mobile-workspace-name' import type { WorkspaceAgentChoice } from './workspace-agent-selection' @@ -55,7 +56,8 @@ export type WorkspaceCreateTaskItem = | WorkspaceCreateGitLabItem | WorkspaceCreateLinearItem -export type WorkspaceCreateParams = Record +/** The outgoing worktree.create params, so the builder and the operation agree by type. */ +export type WorkspaceCreateParams = RpcSendParams<'worktree.create'> /** * `worktree.create` fields for launching the picked agent in a fresh session. diff --git a/mobile/src/tasks/worktree-create-capability.ts b/mobile/src/tasks/worktree-create-capability.ts index c4ca8170312..63a67dda2e8 100644 --- a/mobile/src/tasks/worktree-create-capability.ts +++ b/mobile/src/tasks/worktree-create-capability.ts @@ -1,8 +1,8 @@ import { useCallback, useEffect, useRef, useState } from 'react' import type { RpcClient } from '../transport/rpc-client' import { isLogicalClientCutoverError } from '../transport/stable-logical-rpc-client' -import type { RpcSuccess } from '../transport/types' import { readMobileRuntimeHostPlatform } from '../transport/mobile-runtime-host-platform' +import { worktreeCreateCapabilityRead } from './mobile-workspace-create-operations' import { MOBILE_TASKS_CAPABILITY } from './mobile-tasks-capability' import { WORKTREE_CREATE_DEDUPE_TTL_LEGACY_HOST_MS, @@ -36,11 +36,14 @@ export async function readNewWorktreeRuntimeCapabilities( ): Promise { for (let migrationRetry = 0; ; migrationRetry += 1) { try { - const response = await client.sendRequest('status.get') - if (!response.ok) { + const status = worktreeCreateCapabilityRead.interpret( + await worktreeCreateCapabilityRead.request(client) + ) + if (!status.accepted) { return UNSUPPORTED_CAPABILITIES } - const result = (response as RpcSuccess).result as { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = status.value as { capabilities?: string[] worktreeCreateIdempotency?: unknown } diff --git a/mobile/src/tasks/worktree-create-retry.test.ts b/mobile/src/tasks/worktree-create-retry.test.ts index 1611ed74c19..b61ab20c30e 100644 --- a/mobile/src/tasks/worktree-create-retry.test.ts +++ b/mobile/src/tasks/worktree-create-retry.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest' import type { RpcClient } from '../transport/rpc-client' -import { markRpcDeliveryUnknown } from '../transport/rpc-delivery-ambiguity' +import { isRpcDeliveryUnknown, markRpcDeliveryUnknown } from '../transport/rpc-delivery-ambiguity' import { LogicalClientCutoverError } from '../transport/stable-logical-rpc-client' import type { ConnectionState } from '../transport/types' import { @@ -789,6 +789,49 @@ describe('createWorktreeWithNameRetry', () => { expect(attempts).toHaveLength(1) }) + // The delivery-unknown mark is a WeakSet keyed on the rejection object, so the create must reach + // the caller as the very object the transport rejected with. `worktreeCreateRun.request` returns + // the transport promise itself for exactly this reason; an operation that wrapped, re-threw or + // re-created the error would turn "the host may have built it" into "it failed". + it('rethrows the transport rejection object itself, mark and all', async () => { + const attempts: Attempt[] = [] + const connection = connectionController() + const marked = markRpcDeliveryUnknown(new Error('Connection lost')) + const client = scriptedClient([{ throws: marked }], attempts, connection) + // Idempotency off, so the resilient sender rethrows on the first ambiguity instead of replaying + // and the object under test is the one the transport produced, not a later attempt's. + const caught = await createWorktreeWithNameRetry({ + client, + baseName: 'kestrel', + buildParams: (name) => ({ repo: 'id:r', name }), + worktreeCreateIdempotency: false + }).then( + () => null, + (error: unknown) => error + ) + expect(caught).toBe(marked) + expect(isRpcDeliveryUnknown(caught)).toBe(true) + }) + + // The other direction: a definite failure must not acquire a mark on the way out, or a create the + // host never received would be replayed as a reconciliation and build a second worktree. + it('does not mark a rejection the transport left unmarked', async () => { + const attempts: Attempt[] = [] + const unmarked = new Error('Socket closed before send') + const client = scriptedClient([{ throws: unmarked }], attempts, connectionController()) + const caught = await createWorktreeWithNameRetry({ + client, + baseName: 'kestrel', + buildParams: (name) => ({ repo: 'id:r', name }), + worktreeCreateIdempotency: IDEMPOTENT_CREATE_SUPPORT + }).then( + () => null, + (error: unknown) => error + ) + expect(caught).toBe(unmarked) + expect(isRpcDeliveryUnknown(caught)).toBe(false) + }) + it('keeps the replay window strictly inside the host dedupe TTL', () => { // The window is measured from a lower bound on when the host could have resolved, so // it has to leave the record room for the replay to still be in flight. Widening it diff --git a/mobile/src/tasks/worktree-create-retry.ts b/mobile/src/tasks/worktree-create-retry.ts index b0f8f618773..fae847367d0 100644 --- a/mobile/src/tasks/worktree-create-retry.ts +++ b/mobile/src/tasks/worktree-create-retry.ts @@ -1,6 +1,7 @@ import type { RpcClient } from '../transport/rpc-client' -import type { RpcResponse, RpcSuccess } from '../transport/types' +import type { RpcResponse } from '../transport/types' import { isRpcDeliveryUnknown } from '../transport/rpc-delivery-ambiguity' +import { worktreeCreateRun } from './mobile-workspace-create-operations' import { waitForRpcClientReconnected } from '../transport/rpc-client-reconnect-wait' import { isLogicalClientCutoverError } from '../transport/stable-logical-rpc-client' import { @@ -10,6 +11,7 @@ import { isRetryableWorktreeCreateConflict } from '../../../src/shared/new-workspace/worktree-create-retry-policy' import { WORKTREE_CREATE_TIMEOUT_MS } from './workspace-create-timeout' +import type { WorkspaceCreateParams } from './workspace-create-params' import { getWorktreeCreateReplayWindowMs, type WorktreeCreateIdempotencyProbe, @@ -49,7 +51,7 @@ export type CreateWorktreeWithNameRetryArgs = { client: RpcClient baseName: string nameWasGenerated?: boolean - buildParams: (name: string) => Record + buildParams: (name: string) => WorkspaceCreateParams worktreeCreateIdempotency: WorktreeCreateIdempotencyProbe maxAttempts?: number // Injected in tests; production mints a fresh idempotency key per candidate. @@ -83,8 +85,11 @@ export async function createWorktreeWithNameRetry( ? { ...candidateParams, clientMutationId: mintMutationId() } : candidateParams const response = await sendWorktreeCreateResilient(client, params, worktreeCreateIdempotency) + // Why the raw refusal: the retry decision below is `isRetryableWorktreeCreateConflict` over the + // host's message, and no acceptance policy carries a refusal message through without throwing. if (response.ok) { - const result = (response as RpcSuccess).result as { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary. + const result = worktreeCreateRun.interpret(response) as { worktree: { id: string; displayName?: string } warning?: string } @@ -116,7 +121,7 @@ export async function createWorktreeWithNameRetry( // is returned to the caller untouched. async function sendWorktreeCreateResilient( client: RpcClient, - params: Record, + params: WorkspaceCreateParams, worktreeCreateIdempotency: WorktreeCreateIdempotencySupport | false ): Promise { let migrationRetry = 0 @@ -125,7 +130,9 @@ async function sendWorktreeCreateResilient( let replayDeadlineAt: number | null = null for (;;) { try { - return await client.sendRequest('worktree.create', params, { + // `request` is the transport promise itself, so a delivery-unknown rejection reaches the + // catch below as the object the transport marked — the WeakSet cannot see through a wrapper. + return await worktreeCreateRun.request(client, params, { timeoutMs: WORKTREE_CREATE_TIMEOUT_MS }) } catch (error) { diff --git a/mobile/src/test-support/rpc-recording/README.md b/mobile/src/test-support/rpc-recording/README.md index 7870eb239bf..7dd7d87b602 100644 --- a/mobile/src/test-support/rpc-recording/README.md +++ b/mobile/src/test-support/rpc-recording/README.md @@ -58,21 +58,39 @@ visible, it does not make the reduction itself observable. ## Golden schema Each file records `runnerVersion`, `baseline`, `lockfileSha256` (mobile's lockfile), -`recorderSha256`, `platform`, `scenarioVersion`, `projectionVersion`, `goldenFormatVersion`, -`operation`, `family`, and `namedDeltas`. `platform` and `lockfileSha256` are provenance and are -not compared: a dependency or OS that changes behaviour changes the trace itself, so comparing -them would only fail candidates on unrelated bumps. The rest are pinned. `recorderSha256` covers every non-markdown file under -this directory plus `pilot-scenarios.json`, so the runner that produced a golden is as pinned as -the product baseline: editing an adapter projection, a fixture or a scenario fails candidate mode -on the header and forces a deliberate re-record. Checkpoints -contain ordered sender calls and serialized physical application payloads, action and request -settlements, projected state, and ordered external effects. Sender args have three positional -slots; absent, undefined and null are distinct `$rpc` tags. Literal objects containing `$rpc` -are escaped. Only object keys are sorted; array/effect order, options, budgets, settlement times -and errors stay observable. Errors contain category, message and `isRpcDeliveryUnknown`, never +`recorderSha256`, `scenarioSha256`, `platform`, `scenarioVersion`, `projectionVersion`, +`goldenFormatVersion`, `operation`, `family`, and `namedDeltas`. `platform` and `lockfileSha256` +are provenance and are not compared: a dependency or OS that changes behaviour changes the trace +itself, so comparing them would only fail candidates on unrelated bumps. The rest are pinned. + +`recorderSha256` covers every non-markdown file under this directory, so the runner that produced a +golden is as pinned as the product baseline: editing an adapter projection or a fixture fails +candidate mode on the header and forces a deliberate re-record of everything. + +`scenarioSha256` covers the scenario input _that golden_ was recorded from — one manifest scenario +for a pilot golden, the generated variants and any hoisted prelude for a matrix or schedule golden, +canonicalised by `captureValue` so an explicit-undefined param stays distinct from an absent one. +Editing a scenario still fails candidate mode on the header, but only for the goldens derived from +it. The manifest used to be an input to `recorderSha256` instead, which made every golden's header +a function of every other family's scenarios: adding one domain's family re-digested all 153 files +and put a conflict on that line in every domain branch in flight. Which goldens a manifest derives +lives in `derived-goldens.ts`, so the digest is a function of the same derivation that records the +file rather than of a restatement of it; `golden-header-digest.test.ts` pins the four properties +that separation buys. + +Checkpoints contain ordered sender calls and serialized physical application payloads, action and +request settlements, projected state, and ordered external effects. Sender args have three +positional slots; absent, undefined and null are distinct `$rpc` tags. Literal objects containing +`$rpc` are escaped. Only object keys are sorted; array/effect order, options, budgets, settlement +times and errors stay observable. Errors contain category, message and `isRpcDeliveryUnknown`, never stack paths, plus `code` and a recursively captured `cause` when the thrown error carries them. Platform is provenance; candidate comparison does not require the same operating system. +Format version 4 adds `scenarioSha256`. A version-3 golden would already fail this reader's byte +compare, so the bump buys the diagnosis rather than the rejection: `readGolden` names the stale +format and says to re-record, instead of reporting an opaque `(encoding)` difference. The bump moved +no observation. + ### Value pool Format version 3 stores each distinct observation _entry_ once under `values`, keyed by the first @@ -163,8 +181,12 @@ recorded success is the shipped null result; and `settings.update`, a best-effor body no call site reads. Detached unhandled rejections are captured as effects in a sequential process-scoped window, -with prior process listeners restored afterward. This preserves the known main bug recorded -as `new-workspace-runtime-context-null-settings-typeerror`; it does not repair the effect. +with prior process listeners restored afterward. The known main bug it first recorded is fixed on +both legs: `new-workspace-runtime-context-null-results-degrade-to-absent` now records a null or +absent `settings.get` or `ui.get` result degrading the way a reply missing that member does, so +neither matrix golden carries a property-read TypeError effect any more. That leaves no golden +recording an unhandled rejection at all, so `unhandled-recording.test.ts` is what pins the capture: +without it a refactor could stop emitting the effect and every golden would still compare clean. Task-model projections record setter invocations and resulting model values, not native UI. ## Commands and checker contract @@ -197,7 +219,7 @@ families because no reference states are defined for them. ## What this oracle does and does not see -It replays 78 scenarios against frozen goldens and fails on any divergence: 153 goldens over 200 +It replays 78 scenarios against frozen goldens and fails on any divergence: 153 goldens over 210 tests, all inside `pnpm --dir mobile test`. For a migration it answers one question — does the rewritten call site produce the same sender calls, settlements, state and effects as main did? @@ -236,11 +258,15 @@ observes only sender calls and settlements. ### Recorded finding: a refused refresh is not handled the same way twice -The five refuse-after-data probes record `settingsRead` refusing a _refresh_ after a success. -Four call sites retain what they had. `use-mobile-tasks-runtime-hydration.tsx` does not: it -publishes `{}`, so a refused refresh wipes the runtime task settings. That divergence is recorded, -not repaired — `settings-task-hydration-refuse-after-data.json` is the observation, and changing -the behaviour is a product change with its own re-record. +The five refuse-after-data probes record a `settings.get` read refusing a _refresh_ after a +success: home providers and task hydration read through `settingsRead`, workspace context, resume +metadata and repo metadata through `optionalSettingsRead`. Which one a site uses does not change +what these probes record — the two share an acceptance and differ only in how they read a null +result, and a refusal never reaches the reader. Four call sites retain what they had. +`use-mobile-tasks-runtime-hydration.tsx` does not: it publishes `{}`, so a refused refresh wipes +the runtime task settings. That divergence is recorded, not repaired — +`settings-task-hydration-refuse-after-data.json` is the observation, and changing the behaviour is +a product change with its own re-record. ### Running it for a step-4 migration diff --git a/mobile/src/test-support/rpc-recording/derived-goldens.test.ts b/mobile/src/test-support/rpc-recording/derived-goldens.test.ts new file mode 100644 index 00000000000..adaac841bc7 --- /dev/null +++ b/mobile/src/test-support/rpc-recording/derived-goldens.test.ts @@ -0,0 +1,25 @@ +import { readdirSync } from 'node:fs' +import { resolve } from 'node:path' +import { describe, expect, it } from 'vitest' +import { derivedGoldens } from './derived-goldens' +import { readScenarios } from './scenario-input' + +const root = resolve(import.meta.dirname, '../../../..') +const input = readScenarios( + process.env.RPC_FOUNDATION_SCENARIOS ?? + resolve(root, 'mobile/rpc-foundation/pilot-scenarios.json') +) +const directory = + process.env.RPC_FOUNDATION_GOLDENS ?? resolve(root, 'mobile/rpc-foundation/goldens') + +describe('derived goldens', () => { + // Fails closed both ways: a golden the derivation dropped stays frozen with nothing certifying or + // digesting it, and one it derives with no file on disk was never recorded. + it('derives exactly the goldens on disk', () => { + const derived = derivedGoldens(input.scenarios).map((golden) => golden.id) + const onDisk = readdirSync(directory) + .filter((file) => file.endsWith('.json')) + .map((file) => file.replace(/\.json$/, '')) + expect(derived.sort()).toEqual(onDisk.sort()) + }) +}) diff --git a/mobile/src/test-support/rpc-recording/derived-goldens.ts b/mobile/src/test-support/rpc-recording/derived-goldens.ts new file mode 100644 index 00000000000..d372436b8d3 --- /dev/null +++ b/mobile/src/test-support/rpc-recording/derived-goldens.ts @@ -0,0 +1,155 @@ +import { hoistPreludeCheckpoints } from './prelude-checkpoints' +import { driveReplyMatrix, replyMatrixGoldenId, replyMatrixSites } from './reply-matrix' +import { replyMatrixNormalResult } from './reply-matrix-normal-result' +import { + bindCompletions, + interruptionSchedules, + lifecycleSchedules, + siblingSchedules +} from './schedule-driver' +import type { RecordingScenario } from './recording-scenario' + +/** + * One frozen golden and the scenarios it is recorded from. Derived here rather than inside the + * suites so `scenarioSha256` is a function of the same derivation that records the file: a test + * that restated how a matrix or schedule expands could agree with itself while disagreeing with + * what was recorded. + */ +export type DerivedGolden = { + id: string + title: string + family: string + /** The matrix site this golden drives; absent for a pilot or schedule golden. */ + site?: string + /** Lazy, so a family with no replayable success fails its own test instead of collection. */ + scenarios: () => RecordingScenario[] + timeoutMs?: number +} + +const SIBLING_SCHEDULE_BASES = [ + 'b3', + 'settings-new-tab-ssh', + 'settings-home-providers-fulfilled', + 'settings-workspace-context-fulfilled', + 'settings-resume-metadata-fulfilled', + 'settings-task-hydration-fulfilled', + 'settings-repo-metadata-fulfilled' +] +const INTERRUPTION_BASES = ['inventory-lifecycle', 'settings-bot-overrides-fulfilled'] +const LIFECYCLE_BASES = [ + 'inventory-lifecycle', + 'b3', + 'settings-bot-overrides-fulfilled', + 'settings-workspace-context-fulfilled', + 'settings-task-hydration-fulfilled' +] + +function baseScenario(manifest: readonly RecordingScenario[], id: string): RecordingScenario { + const found = manifest.find((scenario) => scenario.id === id) + if (!found) { + throw new Error(`No scenario named ${id}`) + } + return found +} + +/** The manifest scenario a pilot golden expands from, which its suite also mounts and mutates. */ +export type PilotGolden = DerivedGolden & { scenario: RecordingScenario } + +/** One golden per manifest scenario: frozen main parity for the scenario as written. */ +export function pilotGoldens(manifest: readonly RecordingScenario[]): PilotGolden[] { + return manifest.map((scenario) => ({ + id: scenario.id, + title: `${scenario.id}: frozen main parity and determinism`, + family: scenario.family, + scenario, + scenarios: () => [scenario] + })) +} + +/** Every golden generated from a family's base scenario: reply matrices and owned schedules. */ +export function familyGoldens(manifest: readonly RecordingScenario[]): DerivedGolden[] { + const families = new Map() + for (const scenario of manifest) { + families.set(scenario.family, [...(families.get(scenario.family) ?? []), scenario]) + } + const goldens: DerivedGolden[] = [] + const ids = new Set() + for (const [family, scenarios] of families) { + const [base] = scenarios + if (!base) { + throw new Error(`Family has no scenario: ${family}`) + } + for (const site of replyMatrixSites(base)) { + const id = replyMatrixGoldenId(family, site) + if (ids.has(id)) { + throw new Error(`Two matrix sites share a golden: ${id}`) + } + ids.add(id) + goldens.push({ + id, + title: `${family}: reply partitions at ${site}`, + family, + site, + timeoutMs: 30_000, + scenarios: () => + driveReplyMatrix(base, site, replyMatrixNormalResult(family, scenarios, site)) + }) + } + } + for (const id of SIBLING_SCHEDULE_BASES) { + const base = baseScenario(manifest, id) + const replies = base.steps.flatMap((step) => ('complete' in step ? [step] : [])) + // Complete prerequisites before permuting the sibling barrier. + const first = replies.find((step) => + step.complete.startsWith(id === 'b3' ? 'linear.getIssue' : 'settings.get') + ) + if (!first) { + throw new Error(`No prerequisite completion to order siblings against: ${id}`) + } + const second = replies[replies.indexOf(first) + 1] + if (!second) { + continue + } + goldens.push({ + id: `schedules-${id}`, + title: `${id}: completion orders and correlated faults`, + family: base.family, + scenarios: () => siblingSchedules(base, first, second) + }) + } + for (const id of INTERRUPTION_BASES) { + const base = baseScenario(manifest, id) + goldens.push({ + id: `interruptions-${id}`, + title: `${id}: timeout, disconnect and stable-client cutover`, + family: base.family, + scenarios: () => interruptionSchedules(base) + }) + } + for (const id of LIFECYCLE_BASES) { + const base = baseScenario(manifest, id) + const actions: readonly ('reset' | 'unmount' | 'blur')[] = id.includes('hydration') + ? ['unmount'] + : id.includes('context') + ? ['unmount', 'blur'] + : ['reset', 'unmount', 'blur'] + goldens.push({ + id: `lifecycle-${id}`, + title: `${id}: lifecycle boundaries`, + family: base.family, + scenarios: () => + hoistPreludeCheckpoints( + { ...base, steps: bindCompletions(base.steps) }, + actions + .flatMap((action) => lifecycleSchedules(base, action)) + .filter(({ scenario }) => !id.includes('hydration') || !scenario.id.endsWith('-1')) + ) + }) + } + return goldens +} + +/** Every golden the oracle freezes, pilot and family alike. */ +export function derivedGoldens(manifest: readonly RecordingScenario[]): DerivedGolden[] { + return [...pilotGoldens(manifest), ...familyGoldens(manifest)] +} diff --git a/mobile/src/test-support/rpc-recording/family-recordings.test.ts b/mobile/src/test-support/rpc-recording/family-recordings.test.ts index 0fcac72a068..e7c971810d6 100644 --- a/mobile/src/test-support/rpc-recording/family-recordings.test.ts +++ b/mobile/src/test-support/rpc-recording/family-recordings.test.ts @@ -1,18 +1,8 @@ import { resolve } from 'node:path' import { describe, expect, it } from 'vitest' import { readScenarios } from './scenario-input' -import { driveReplyMatrix, replyMatrixGoldenId, replyMatrixSites } from './reply-matrix' -import { - REPLY_MATRIX_NORMAL_RESULT_INVENTORY, - replyMatrixNormalResult -} from './reply-matrix-normal-result' -import { - bindCompletions, - interruptionSchedules, - lifecycleSchedules, - siblingSchedules -} from './schedule-driver' -import { hoistPreludeCheckpoints } from './prelude-checkpoints' +import { familyGoldens } from './derived-goldens' +import { REPLY_MATRIX_NORMAL_RESULT_INVENTORY } from './reply-matrix-normal-result' import { runRecording } from './run-recording' import { pilotMountAdapters } from './pilot-mount-adapters' import { vitestRecordingScheduler } from './vitest-recording-scheduler' @@ -48,7 +38,7 @@ async function certify(id: string, scenarios: RecordingScenario[]) { checkpoints.push({ ...checkpoint, id: `${scenario.id}:${checkpoint.id}` }) } } - const golden = goldenRecording(root, input.baseline, scenarios[0], { + const golden = goldenRecording(root, input.baseline, scenarios, { scenario: id, checkpoints }) @@ -66,95 +56,29 @@ async function certify(id: string, scenarios: RecordingScenario[]) { } describe('family reply partitions and owned schedules', () => { - const families = new Map() - for (const scenario of input.scenarios) { - families.set(scenario.family, [...(families.get(scenario.family) ?? []), scenario]) - } - const goldenIds = new Set() - // Filled only when a site actually generates a test, so the census below is independent of - // replyMatrixSites throwing on an empty list: the mechanism this replaced skipped families. - const matrixed = new Set() - const liveSites = new Set() + const goldens = familyGoldens(input.scenarios) + const families = [...new Set(input.scenarios.map((scenario) => scenario.family))] + // Read off the goldens that actually generate a test, so the census is independent of whether + // replyMatrixSites would throw on an empty list: the mechanism this replaced skipped families. + const sites = goldens.flatMap((golden) => (golden.site ? [golden] : [])) it('matrices every family in the manifest', () => { - expect([...matrixed]).toEqual([...families.keys()]) + expect([...new Set(sites.map((golden) => golden.family))]).toEqual(families) }) // The inventory is only consulted for a live site, so a stale entry would retire silently. it('lists only live matrix sites in the normal-result inventory', () => { + const live = new Set(sites.map((golden) => `${golden.family}\0${golden.site}`)) const stale = REPLY_MATRIX_NORMAL_RESULT_INVENTORY.filter( - (entry) => !liveSites.has(`${entry.family}\0${entry.request}`) + (entry) => !live.has(`${entry.family}\0${entry.request}`) ).map((entry) => `${entry.family} ${entry.request}`) expect(stale).toEqual([]) }) - for (const [family, scenarios] of families) { - const base = scenarios[0]! - for (const request of replyMatrixSites(base)) { - const id = replyMatrixGoldenId(family, request) - if (goldenIds.has(id)) { - throw new Error(`Two matrix sites share a golden: ${id}`) - } - goldenIds.add(id) - matrixed.add(family) - liveSites.add(`${family}\0${request}`) - it(`${family}: reply partitions at ${request}`, async () => { - await certify( - id, - driveReplyMatrix(base, request, replyMatrixNormalResult(family, scenarios, request)) - ) - }, 30_000) - } - } - for (const id of [ - 'b3', - 'settings-new-tab-ssh', - 'settings-home-providers-fulfilled', - 'settings-workspace-context-fulfilled', - 'settings-resume-metadata-fulfilled', - 'settings-task-hydration-fulfilled', - 'settings-repo-metadata-fulfilled' - ]) { - const base = input.scenarios.find((scenario) => scenario.id === id)! - const replies = base.steps.filter((step) => 'complete' in step) - // Complete prerequisites before permuting the sibling barrier. - const first = replies.find((step) => - step.complete.startsWith(id === 'b3' ? 'linear.getIssue' : 'settings.get') - )! - const second = replies[replies.indexOf(first) + 1] - if (!second) { - continue - } - it(`${id}: completion orders and correlated faults`, async () => { - await certify(`schedules-${id}`, siblingSchedules(base, first, second)) - }) - } - for (const id of ['inventory-lifecycle', 'settings-bot-overrides-fulfilled']) { - const base = input.scenarios.find((scenario) => scenario.id === id)! - it(`${id}: timeout, disconnect and stable-client cutover`, async () => { - await certify(`interruptions-${id}`, interruptionSchedules(base)) - }) - } - for (const id of [ - 'inventory-lifecycle', - 'b3', - 'settings-bot-overrides-fulfilled', - 'settings-workspace-context-fulfilled', - 'settings-task-hydration-fulfilled' - ]) { - const base = input.scenarios.find((scenario) => scenario.id === id)! - const actions = id.includes('hydration') - ? (['unmount'] as const) - : id.includes('context') - ? (['unmount', 'blur'] as const) - : (['reset', 'unmount', 'blur'] as const) - it(`${id}: lifecycle boundaries`, async () => { - await certify( - `lifecycle-${id}`, - hoistPreludeCheckpoints( - { ...base, steps: bindCompletions(base.steps) }, - actions - .flatMap((action) => lifecycleSchedules(base, action)) - .filter(({ scenario }) => !id.includes('hydration') || !scenario.id.endsWith('-1')) - ) - ) - }) + for (const golden of goldens) { + it( + golden.title, + async () => { + await certify(golden.id, golden.scenarios()) + }, + golden.timeoutMs + ) } }) diff --git a/mobile/src/test-support/rpc-recording/golden-header-digest.test.ts b/mobile/src/test-support/rpc-recording/golden-header-digest.test.ts new file mode 100644 index 00000000000..cf05b38cfca --- /dev/null +++ b/mobile/src/test-support/rpc-recording/golden-header-digest.test.ts @@ -0,0 +1,175 @@ +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join, resolve } from 'node:path' +import { afterAll, describe, expect, it } from 'vitest' +import { derivedGoldens } from './derived-goldens' +import { goldenRecording, type GoldenRecording } from './golden-recording' +import { RECORDER_DIRECTORY } from './recorder-digest' +import { readScenarios } from './scenario-input' +import type { RecordingScenario, ScenarioStep } from './recording-scenario' + +const root = resolve(import.meta.dirname, '../../../..') +const manifest = readScenarios( + process.env.RPC_FOUNDATION_SCENARIOS ?? + resolve(root, 'mobile/rpc-foundation/pilot-scenarios.json') +).scenarios +const BASELINE = 'a'.repeat(40) +const EDITED_SCENARIO = 'b1' +const EDITED_SITE = 'files.searchPaths#1' +/** The only `legacy-inventory` scenario with a fulfilled reply at `EDITED_SITE`. */ +const REPLAYED_SCENARIO = 'inventory-repeat-query' +const REPLAYED_GOLDEN = 'matrix-legacy-inventory-files.searchpaths-1' +/** + * Every golden derived from `b1`: its own, and its family's four matrix sites, which expand from it + * as the family's base. The two other `legacy-inventory` scenarios and the interruption and + * lifecycle goldens that expand from `inventory-lifecycle` are deliberately absent. + */ +const EDITED_GOLDENS = [ + 'b1', + 'matrix-legacy-inventory-files.searchpaths-1', + 'matrix-legacy-inventory-files.searchpaths-2', + 'matrix-legacy-inventory-fresh-inventory', + 'matrix-legacy-inventory-old-inventory' +] +type Header = Omit + +const created: string[] = [] +afterAll(() => { + for (const directory of created) { + rmSync(directory, { recursive: true, force: true }) + } +}) + +/** The two files a root contributes to a header, plus the manifest the old digest also read. */ +function stubRoot(recorder: string, scenarioFile: string): string { + const directory = mkdtempSync(join(tmpdir(), 'rpc-header-')) + created.push(directory) + mkdirSync(join(directory, RECORDER_DIRECTORY), { recursive: true }) + writeFileSync(join(directory, RECORDER_DIRECTORY, 'runner.ts'), recorder) + writeFileSync(join(directory, 'mobile/pnpm-lock.yaml'), 'lockfile: stub\n') + mkdirSync(join(directory, 'mobile/rpc-foundation'), { recursive: true }) + writeFileSync(join(directory, 'mobile/rpc-foundation/pilot-scenarios.json'), scenarioFile) + return directory +} + +/** Every golden's header for one recorder revision and one manifest, both written to a stub root. */ +function headers(recorder: string, scenarios: readonly RecordingScenario[]): Map { + const stub = stubRoot(recorder, JSON.stringify({ baseline: BASELINE, scenarios })) + return new Map( + derivedGoldens(scenarios).map((golden) => { + const { recording: _recording, ...header } = goldenRecording( + stub, + BASELINE, + golden.scenarios(), + { scenario: golden.id, checkpoints: [] } + ) + return [golden.id, header] + }) + ) +} + +function moved(before: Map, after: Map): string[] { + return [...before] + .filter(([id, header]) => JSON.stringify(after.get(id)) !== JSON.stringify(header)) + .map(([id]) => id) + .sort() +} + +/** A family no other golden consumes, with one reply the matrix can replay as its success. */ +const ADDED_FAMILY: RecordingScenario = { + id: 'digest-probe', + operation: 'digest.probe', + version: 1, + family: 'digest-probe', + sites: [], + schedules: ['probe'], + steps: [ + { + complete: 'probe.read#1', + params: { worktree: 'id:A' }, + reply: { ok: true, result: { probed: true } } + }, + { checkpoint: 'settled' } + ] +} + +type Completion = Extract + +/** Rewrites one named completion, and fails loudly if the step it names has moved or multiplied. */ +function editCompletion( + scenarios: readonly RecordingScenario[], + scenarioId: string, + request: string, + rewrite: (step: Completion) => Completion +): RecordingScenario[] { + let edits = 0 + const edited = scenarios.map((scenario) => + scenario.id !== scenarioId + ? scenario + : { + ...scenario, + steps: scenario.steps.map((step) => { + if (!('complete' in step) || step.complete !== request) { + return step + } + edits++ + return rewrite(step) + }) + } + ) + if (edits !== 1) { + throw new Error(`Expected one ${request} completion in ${scenarioId}, edited ${edits}`) + } + return edited +} + +describe('golden header digests', () => { + it('re-digests nothing when the manifest gains a family', () => { + const before = headers('export const runner = 1', manifest) + const after = headers('export const runner = 1', [...manifest, ADDED_FAMILY]) + expect(moved(before, after)).toEqual([]) + // The added family did derive goldens of its own: a pilot golden and one matrix site. + expect(after.size).toBe(before.size + 2) + }) + + it('re-digests exactly the goldens derived from an edited scenario', () => { + const before = headers('export const runner = 1', manifest) + const after = headers( + 'export const runner = 1', + editCompletion(manifest, EDITED_SCENARIO, EDITED_SITE, (step) => ({ + ...step, + params: { worktree: 'id:A', query: 'old', limit: 17 } + })) + ) + expect(moved(before, after)).toEqual([...EDITED_GOLDENS].sort()) + for (const id of EDITED_GOLDENS) { + expect(after.get(id)?.recorderSha256).toBe(before.get(id)?.recorderSha256) + expect(after.get(id)?.scenarioSha256).not.toBe(before.get(id)?.scenarioSha256) + } + }) + + // The generated variants are hashed, not the base they expand from, and this is what that buys: + // the `normal` partition replays a sibling's recorded reply, so the sibling is a real input to a + // matrix golden that its own scenario never appears in. + it('re-digests a matrix golden whose replayed success comes from an edited sibling', () => { + const before = headers('export const runner = 1', manifest) + const after = headers( + 'export const runner = 1', + editCompletion(manifest, REPLAYED_SCENARIO, EDITED_SITE, (step) => ({ + ...step, + reply: { ok: true, result: { files: [{ relativePath: 'edited.ts' }] } } + })) + ) + expect(moved(before, after)).toEqual([REPLAYED_SCENARIO, REPLAYED_GOLDEN].sort()) + }) + + it('re-digests every golden when a recorder file changes', () => { + const before = headers('export const runner = 1', manifest) + const after = headers('export const runner = 2', manifest) + expect(moved(before, after)).toEqual([...before.keys()].sort()) + for (const [id, header] of before) { + expect(after.get(id)?.recorderSha256).not.toBe(header.recorderSha256) + expect(after.get(id)?.scenarioSha256).toBe(header.scenarioSha256) + } + }) +}) diff --git a/mobile/src/test-support/rpc-recording/golden-recording.ts b/mobile/src/test-support/rpc-recording/golden-recording.ts index e7ae72c60b1..911da5997b0 100644 --- a/mobile/src/test-support/rpc-recording/golden-recording.ts +++ b/mobile/src/test-support/rpc-recording/golden-recording.ts @@ -11,14 +11,16 @@ import { type ValuePool } from './golden-value-pool' import { recorderSha256 } from './recorder-digest' +import { scenarioSha256 } from './scenario-digest' import type { Recording, RecordingScenario } from './recording-scenario' import type { RecordedValue } from './recording-values' export const RUNNER_VERSION = 1 // 2 stamps every settlement with startedAt/settledAt on the pinned virtual clock. export const PROJECTION_VERSION = 2 -// 3 interns each entry of a list or map field, not the whole field; an older file is not comparable. -export const GOLDEN_FORMAT_VERSION = 3 +// 4 pins scenarioSha256 per golden. The byte compare would fail a version-3 golden anyway; the bump +// buys the diagnosis, reporting the stale format instead of an opaque `(encoding)` difference. +export const GOLDEN_FORMAT_VERSION = 4 export type GoldenRecording = { operation: string family: string @@ -27,6 +29,7 @@ export type GoldenRecording = { baseline: string lockfileSha256: string recorderSha256: string + scenarioSha256: string platform: string scenarioVersion: number projectionVersion: number @@ -40,9 +43,13 @@ type GoldenFile = Omit & { export function goldenRecording( root: string, baseline: string, - scenario: RecordingScenario, + scenarios: readonly RecordingScenario[], recording: Recording ): GoldenRecording { + const [scenario] = scenarios + if (!scenario) { + throw new Error('A golden records at least one scenario') + } return { operation: scenario.operation, family: scenario.family, @@ -53,6 +60,7 @@ export function goldenRecording( .update(readFileSync(join(root, 'mobile/pnpm-lock.yaml'))) .digest('hex'), recorderSha256: recorderSha256(root), + scenarioSha256: scenarioSha256(scenarios), platform: process.platform, scenarioVersion: scenario.version, projectionVersion: PROJECTION_VERSION, diff --git a/mobile/src/test-support/rpc-recording/operation-module-loader.ts b/mobile/src/test-support/rpc-recording/operation-module-loader.ts index 03c31a4f707..aade578406a 100644 --- a/mobile/src/test-support/rpc-recording/operation-module-loader.ts +++ b/mobile/src/test-support/rpc-recording/operation-module-loader.ts @@ -4,13 +4,20 @@ import { dirname, resolve } from 'node:path' import * as React from 'react' import ts from 'typescript' import { OPERATION_EXPOSURES, OPERATION_MUTATIONS, type Mutation } from './operation-mutations' +import * as deliveryAmbiguity from '../../transport/rpc-delivery-ambiguity' export type { Mutation } export type OperationModule = Record unknown> +// Why shared rather than evaluated: the delivery-unknown mark is a WeakSet keyed on the rejection +// object, so a second copy of the module has a second, empty registry and every marked rejection +// reads as a definite failure inside the mounted operation. Same reason React is shared. +const SHARED_MODULE = 'mobile/src/transport/rpc-delivery-ambiguity.ts' + // Only mounting boundaries are substituted; every operation and projection is loaded from source. export function operationModuleLoader(root: string, mutation?: Mutation) { const cache = new Map() + const sharedModulePath = resolve(root, SHARED_MODULE) let mutationCount = 0 function pathFor(base: string): string { const file = ['', '.ts', '.tsx', '/index.ts'] @@ -25,6 +32,9 @@ export function operationModuleLoader(root: string, mutation?: Mutation) { if (name === 'react') { return React } + if (name.startsWith('.') && pathFor(resolve(dirname(base), name)) === sharedModulePath) { + return deliveryAmbiguity + } if (!name.startsWith('.')) { return new Proxy( {}, diff --git a/mobile/src/test-support/rpc-recording/operation-mutations.ts b/mobile/src/test-support/rpc-recording/operation-mutations.ts index cd760f0004f..e543a14e398 100644 --- a/mobile/src/test-support/rpc-recording/operation-mutations.ts +++ b/mobile/src/test-support/rpc-recording/operation-mutations.ts @@ -70,22 +70,19 @@ export const OPERATION_MUTATIONS = { before: '((settingsResult.value ?? {}) as RuntimeTaskSettings)', after: '((settingsResponse.result ?? {}) as RuntimeTaskSettings)' }, - // Applies the preset only after the write settles, dropping the optimistic update. + // Moves the optimistic preset write behind the guard that only an unusable client takes, so the + // preset the screen shows never follows the tap. Anchored above the send so the step-4 migration + // of this file does not move it; the projection it proves load-bearing is the same one. 'task-preferences-optimistic': { file: 'use-mobile-tasks-client-settings-actions.tsx', before: ` setDefaultGitHubPreset(preset) if (!client || !taskUiReady) { return - } - void client.sendRequest('settings.update', { defaultTaskViewPreset: preset }).catch(() => {`, + }`, after: ` if (!client || !taskUiReady) { setDefaultGitHubPreset(preset) return - } - void client - .sendRequest('settings.update', { defaultTaskViewPreset: preset }) - .then(() => setDefaultGitHubPreset(preset)) - .catch(() => {` + }` }, // Publishes the settings envelope as the refreshed workspace runtime settings. 'workspace-submit-envelope': { diff --git a/mobile/src/test-support/rpc-recording/pilot-mount-adapters.ts b/mobile/src/test-support/rpc-recording/pilot-mount-adapters.ts index a1dd2b61174..dad00135eb7 100644 --- a/mobile/src/test-support/rpc-recording/pilot-mount-adapters.ts +++ b/mobile/src/test-support/rpc-recording/pilot-mount-adapters.ts @@ -2,6 +2,8 @@ import { observableModel } from './observable-model' import { hostedReviewMountAdapters } from './hosted-review-mount-adapters' import { settingsMountAdapters } from './settings-mount-adapters' import { sourceControlMountAdapters } from './source-control-mount-adapters' +import { taskWorkspaceHookMountAdapters } from './task-workspace-hook-mount-adapters' +import { taskWorkspaceSenderMountAdapters } from './task-workspace-sender-mount-adapters' import { workspaceSettingsMounts } from './workspace-settings-mounts' import type { MountAdapter } from './recording-scenario' import { hookMount, performHookAction } from './hook-mount' @@ -16,6 +18,8 @@ export function pilotMountAdapters( ...settingsMountAdapters(modules), ...workspaceSettingsMounts(modules), ...sourceControlMountAdapters(modules), + ...taskWorkspaceSenderMountAdapters(modules), + ...taskWorkspaceHookMountAdapters(modules), ...hostedReviewMountAdapters(modules), 'workspace.file-inventory': ({ client }) => { const useSearch = modules.load< @@ -220,6 +224,12 @@ export function pilotMountAdapters( args.preset as Parameters[0] ) } + if (name === 'resume') { + return actions.persistTaskResumeState({ githubItemsPreset: 'issues' }) + } + if (name === 'trust') { + return actions.persistSetupHookTrust('repo-1', 'hash-1', false) + } throw new Error(`Unknown preferences action: ${name}`) }, state: () => ({ preset: model.defaultGitHubPreset }), diff --git a/mobile/src/test-support/rpc-recording/pilot-recordings.test.ts b/mobile/src/test-support/rpc-recording/pilot-recordings.test.ts index b3ac0688539..87aa9dfc6ef 100644 --- a/mobile/src/test-support/rpc-recording/pilot-recordings.test.ts +++ b/mobile/src/test-support/rpc-recording/pilot-recordings.test.ts @@ -1,4 +1,5 @@ import { readScenarios } from './scenario-input' +import { pilotGoldens } from './derived-goldens' import { resolve } from 'node:path' import { describe, expect, it } from 'vitest' import { runRecording, runRecordingMutant } from './run-recording' @@ -66,8 +67,9 @@ function visibleState(recording: Recording): RecordedValue { } describe('RPC main recordings', () => { - for (const scenario of input.scenarios) { - it(`${scenario.id}: frozen main parity and determinism`, async () => { + for (const pilot of pilotGoldens(input.scenarios)) { + const { id, scenario } = pilot + it(pilot.title, async () => { let first = '' for (let run = 0; run < determinismRuns(); run++) { const { adapters } = pilotMountAdapters(root) @@ -76,21 +78,21 @@ describe('RPC main recordings', () => { adapters[scenario.operation], vitestRecordingScheduler() ) - if (scenario.id === 'b1') { + if (id === 'b1') { expect(visibleState(recording)).toEqual({ files: ['third.ts'] }) } - if (scenario.id === 'b2') { + if (id === 'b2') { expect(visibleState(recording)).toMatchObject({ error: "Cannot read properties of null (reading 'ok')" }) } - if (scenario.id === 'b3') { + if (id === 'b3') { expect(visibleState(recording)).toMatchObject({ error: 'comments transport error', loading: false }) } - const golden = goldenRecording(root, input.baseline, scenario, recording) + const golden = goldenRecording(root, input.baseline, pilot.scenarios(), recording) const bytes = goldenBytes(golden) if (run) { expect(bytes).toBe(first) @@ -99,44 +101,41 @@ describe('RPC main recordings', () => { if (process.env.RPC_FOUNDATION_MODE === '--record') { await writeGolden(goldens, golden, '--record') } else { - compareGolden(readGolden(goldens, scenario.id), golden) + compareGolden(readGolden(goldens, id), golden) } } }) - const mutation = mutants[scenario.id] + const mutation = mutants[id] if (!mutation) { continue } - it(`${scenario.id}: kills ${mutation}`, async () => { + it(`${id}: kills ${mutation}`, async () => { const { adapters, assertMutationApplied } = pilotMountAdapters(root, { mutation }) const result = await runRecordingMutant( scenario, adapters[scenario.operation], vitestRecordingScheduler(), - readGolden(goldens, scenario.id).recording, + readGolden(goldens, id).recording, visibleState ) assertMutationApplied() expect(result.verdict).toBe('killed') }) - const reference = referenceStates[scenario.id] + const reference = referenceStates[id] if (!reference) { continue } - it.skipIf(!process.env.RPC_FOUNDATION_REFERENCE_ROOT)( - `${scenario.id}: rejects bcba08b3e4`, - async () => { - const { adapters } = pilotMountAdapters(process.env.RPC_FOUNDATION_REFERENCE_ROOT!, { - reference: true - }) - const result = await runRecording( - scenario, - adapters[scenario.operation], - vitestRecordingScheduler() - ) - expect(visibleState(result)).toEqual(reference) - expect(reference).not.toEqual(visibleState(readGolden(goldens, scenario.id).recording)) - } - ) + it.skipIf(!process.env.RPC_FOUNDATION_REFERENCE_ROOT)(`${id}: rejects bcba08b3e4`, async () => { + const { adapters } = pilotMountAdapters(process.env.RPC_FOUNDATION_REFERENCE_ROOT!, { + reference: true + }) + const result = await runRecording( + scenario, + adapters[scenario.operation], + vitestRecordingScheduler() + ) + expect(visibleState(result)).toEqual(reference) + expect(reference).not.toEqual(visibleState(readGolden(goldens, id).recording)) + }) } }) diff --git a/mobile/src/test-support/rpc-recording/recorder-digest.ts b/mobile/src/test-support/rpc-recording/recorder-digest.ts index af25eb1f5fd..b2a5e893a70 100644 --- a/mobile/src/test-support/rpc-recording/recorder-digest.ts +++ b/mobile/src/test-support/rpc-recording/recorder-digest.ts @@ -3,7 +3,6 @@ import { readFileSync, readdirSync } from 'node:fs' import { join, posix } from 'node:path' export const RECORDER_DIRECTORY = 'mobile/src/test-support/rpc-recording' -export const RECORDER_SCENARIO_INPUT = 'mobile/rpc-foundation/pilot-scenarios.json' const digests = new Map() function collect(root: string, relative: string, files: string[]): void { @@ -20,9 +19,14 @@ function collect(root: string, relative: string, files: string[]): void { } /** - * Every executable recorder input, so a golden is attributable to one runner and one scenario file. - * Prose is excluded because it cannot change a recording; a candidate run recomputes this and - * `compareGolden` fails the header, which forces a recorder edit to re-record deliberately. + * Every executable recorder input, so a golden is attributable to one runner. Prose is excluded + * because it cannot change a recording; a candidate run recomputes this and `compareGolden` fails + * the header, which forces a recorder edit to re-record deliberately. + * + * The scenario manifest is deliberately not an input. It used to be, which made every golden's + * header a function of every other family's scenarios: adding one family re-digested all 153 files + * and put a conflict on that line in every domain branch. `scenarioSha256` pins each golden to the + * scenarios it was actually recorded from instead. */ export function recorderSha256(root: string): string { const cached = digests.get(root) @@ -31,7 +35,6 @@ export function recorderSha256(root: string): string { } const files: string[] = [] collect(root, RECORDER_DIRECTORY, files) - files.push(RECORDER_SCENARIO_INPUT) const digest = createHash('sha256') .update( files diff --git a/mobile/src/test-support/rpc-recording/recording-runner.test.ts b/mobile/src/test-support/rpc-recording/recording-runner.test.ts index b81597248ae..867a1aefcd5 100644 --- a/mobile/src/test-support/rpc-recording/recording-runner.test.ts +++ b/mobile/src/test-support/rpc-recording/recording-runner.test.ts @@ -390,8 +390,6 @@ describe('recording boundaries', () => { try { const directory = join(root, RECORDER_DIRECTORY) mkdirSync(directory, { recursive: true }) - mkdirSync(join(root, 'mobile/rpc-foundation'), { recursive: true }) - writeFileSync(join(root, 'mobile/rpc-foundation/pilot-scenarios.json'), '{}') writeFileSync(join(directory, 'runner.ts'), 'export const runner = 1') const original = recorderSha256(root) writeFileSync(join(directory, 'README.md'), 'prose') @@ -466,6 +464,7 @@ function sampleGolden(id: string): GoldenRecording { baseline: 'a'.repeat(40), lockfileSha256: 'b'.repeat(64), recorderSha256: 'c'.repeat(64), + scenarioSha256: 'd'.repeat(64), platform: process.platform, scenarioVersion: 1, projectionVersion: PROJECTION_VERSION, diff --git a/mobile/src/test-support/rpc-recording/scenario-digest.ts b/mobile/src/test-support/rpc-recording/scenario-digest.ts new file mode 100644 index 00000000000..a83ebe32002 --- /dev/null +++ b/mobile/src/test-support/rpc-recording/scenario-digest.ts @@ -0,0 +1,24 @@ +import { createHash } from 'node:crypto' +import { canonicalJson } from './golden-value-pool' +import { captureValue } from './recording-values' +import type { RecordingScenario } from './recording-scenario' + +/** + * The scenario input one golden was recorded from: every scenario the runner consumed for it, in + * order — one manifest scenario for a pilot golden, the generated variants (and any hoisted + * prelude) for a matrix or schedule golden. + * + * Pinned per golden rather than over the whole manifest so a family added for one domain moves only + * its own goldens, while a field edited inside a scenario moves every golden derived from it. The + * variants are hashed rather than the base they came from because they are what `runRecording` + * consumed: a matrix site, its replayed normal result and its partition replies are all visible + * here without the derivation having to be restated. + * + * `captureValue` sorts object keys and tags an explicit-undefined param, which `JSON.stringify` + * would drop and so conflate with an absent one. + */ +export function scenarioSha256(scenarios: readonly RecordingScenario[]): string { + return createHash('sha256') + .update(canonicalJson(captureValue(scenarios))) + .digest('hex') +} diff --git a/mobile/src/test-support/rpc-recording/task-workspace-hook-mount-adapters.ts b/mobile/src/test-support/rpc-recording/task-workspace-hook-mount-adapters.ts new file mode 100644 index 00000000000..6b51300f843 --- /dev/null +++ b/mobile/src/test-support/rpc-recording/task-workspace-hook-mount-adapters.ts @@ -0,0 +1,193 @@ +import type { MountAdapter } from './recording-scenario' +import { hookMount, performHookAction } from './hook-mount' +import { observableModel, projectObservable } from './observable-model' +import type { operationModuleLoader } from './operation-module-loader' + +const REPO = 'repo-1' + +/** + * The workspace-create drawer's three model-chained hooks, mounted the way the settings adapters + * mount theirs: a fixture model supplying only the members the hook destructures, with every setter + * recorded as an effect. + */ +export function taskWorkspaceHookMountAdapters( + modules: ReturnType +): Record { + // The drawer's SSH hook. `connectionId` picks the arm the detection effect takes: a repo on + // an SSH connection detects remote agents, one without it detects local agents. + function sshStateAdapter(connectionId: string | undefined): MountAdapter { + return (context) => { + const useSsh = modules.load< + typeof import('../../tasks/use-mobile-tasks-workspace-ssh-state') + >('mobile/src/tasks/use-mobile-tasks-workspace-ssh-state.tsx').useMobileTasksWorkspaceSshState + const repo = { id: REPO, displayName: 'Repo', connectionId } + const model = observableModel(context, { + client: context.client, + tasksSupported: true, + runtimeTaskSettings: { disabledTuiAgents: [] }, + workspaceAgent: null, + workspaceAgentOverridden: false, + workspaceCreateDraft: { key: 'linear:1' }, + workspaceCreateRequiresSshConnection: false, + workspaceCreateSshStatus: connectionId ? 'connected' : 'idle', + workspaceCreateTargetConnectionId: connectionId, + workspaceCreateTargetRepo: repo, + workspaceDetectedAgentIds: null, + workspaceSshState: null, + workspaceSshConnecting: false + }) + let actions: ReturnType + const hook = hookMount(() => { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies only the members the hook reads. + actions = useSsh(model as unknown as Parameters[0]) + }) + let setup: unknown = 'unresolved' + return { + action(name) { + if (name === 'mount') { + return hook.mount() + } + if (name === 'connect') { + return performHookAction(() => actions.connectWorkspaceSshRepo()) + } + if (name === 'ensure-ready') { + return actions.ensureWorkspaceSshReady( + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the hook reads only id, displayName and connectionId. + repo as Parameters[0] + ) + } + if (name === 'resolve-setup') { + return actions + .resolveCreateSetupDecision( + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: as above. + repo as Parameters[0] + ) + .then((value: unknown) => { + setup = value + return value + }) + } + throw new Error(`Unknown workspace ssh action: ${name}`) + }, + state: () => + projectObservable({ + ssh: model.workspaceSshState, + connecting: model.workspaceSshConnecting, + detected: model.workspaceDetectedAgentIds, + agent: model.workspaceAgent, + setup + }), + dispose: hook.unmount + } + } + } + + return { + 'tasks.workspace-source': (context) => { + const useEffects = modules.load< + typeof import('../../tasks/use-mobile-tasks-workspace-source-effects') + >( + 'mobile/src/tasks/use-mobile-tasks-workspace-source-effects.tsx' + ).useMobileTasksWorkspaceSourceEffects + const model = observableModel(context, { + client: context.client, + tasksSupported: true, + workspaceCreateDraft: { key: 'linear:1' }, + workspaceCreateTargetRepo: { id: REPO, displayName: 'Repo' }, + workspaceSparseReloadKey: 0, + workspaceBaseBranchQuery: '', + showWorkspaceBaseBranchPicker: false, + workspaceSparsePresets: [], + workspaceSparsePresetsLoaded: false, + workspaceSparsePresetsLoading: false, + workspaceSparsePresetsError: '', + workspaceSparsePresetId: null, + workspaceSparseDraft: null, + workspaceBaseBranchResults: [], + workspaceBaseBranchLoading: false, + workspaceBaseBranchError: '' + }) + const hook = hookMount(() => { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies only the members the hook reads. + useEffects(model as unknown as Parameters[0]) + }) + return { + action(name, args) { + if (name === 'mount') { + return hook.mount() + } + if (name === 'branch-query') { + model.showWorkspaceBaseBranchPicker = true + model.workspaceBaseBranchQuery = String(args.query ?? 'main') + return hook.update() + } + throw new Error(`Unknown workspace source action: ${name}`) + }, + state: () => + projectObservable({ + presets: model.workspaceSparsePresets, + presetsLoaded: model.workspaceSparsePresetsLoaded, + presetsError: model.workspaceSparsePresetsError, + branches: model.workspaceBaseBranchResults, + branchError: model.workspaceBaseBranchError + }), + dispose: hook.unmount + } + }, + 'tasks.workspace-sparse': (context) => { + const useSparse = modules.load< + typeof import('../../tasks/use-mobile-tasks-workspace-sparse-actions') + >( + 'mobile/src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx' + ).useMobileTasksWorkspaceSparseActions + const model = observableModel(context, { + client: context.client, + tasksSupported: true, + canSaveWorkspaceSparseDraft: true, + workspaceCreateDraft: { key: 'linear:1' }, + workspaceCreateTargetConnectionId: 'ssh-1', + workspaceCreateTargetRepo: { id: REPO, displayName: 'Repo' }, + workspaceSparseCheckoutAvailable: true, + workspaceSparseDraft: { mode: 'new', name: 'docs', directoriesText: 'docs' }, + workspaceSparseDraftName: 'docs', + workspaceSparseDraftParsed: { directories: ['docs'] }, + workspaceSparsePresetId: null, + workspaceSparsePresets: [], + workspaceSparsePresetsLoaded: false, + workspaceSparsePresetsLoading: false, + workspaceSparsePresetsError: '', + workspaceSparseSaving: false, + workspaceSshState: null, + workspaceSshConnecting: false, + showWorkspaceSparsePicker: false + }) + let actions: ReturnType + const hook = hookMount(() => { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies only the members the hook reads. + actions = useSparse(model as unknown as Parameters[0]) + }) + return { + action(name) { + if (name === 'mount') { + return hook.mount() + } + if (name === 'save-preset') { + return performHookAction(() => actions.saveWorkspaceSparsePreset()) + } + throw new Error(`Unknown workspace sparse action: ${name}`) + }, + state: () => + projectObservable({ + presets: model.workspaceSparsePresets, + presetsError: model.workspaceSparsePresetsError, + saving: model.workspaceSparseSaving, + ssh: model.workspaceSshState + }), + dispose: hook.unmount + } + }, + 'tasks.workspace-ssh': sshStateAdapter('ssh-1'), + // The local arm: no connectionId, so the effect calls preflight.detectAgents. + 'tasks.workspace-ssh-local': sshStateAdapter(undefined) + } +} diff --git a/mobile/src/test-support/rpc-recording/task-workspace-sender-mount-adapters.ts b/mobile/src/test-support/rpc-recording/task-workspace-sender-mount-adapters.ts new file mode 100644 index 00000000000..1cfa3911358 --- /dev/null +++ b/mobile/src/test-support/rpc-recording/task-workspace-sender-mount-adapters.ts @@ -0,0 +1,180 @@ +import type { MountAdapter } from './recording-scenario' +import type { operationModuleLoader } from './operation-module-loader' + +const REPO = 'repo-1' +const REPO_SELECTOR = `id:${REPO}` + +/** + * The task workspace-creation senders that are exported async functions taking a client: create and + * its retry loop, the create-time capability probe, hosted-base resolution, the setup-hook trust + * write and the Smart source picker's provider reads. No React host is needed, so the recorded + * state is the function's own answer. + */ +export function taskWorkspaceSenderMountAdapters( + modules: ReturnType +): Record { + return { + 'tasks.worktree-create-retry': ({ client }) => { + const create = modules.load( + 'mobile/src/tasks/worktree-create-retry.ts' + ).createWorktreeWithNameRetry + let outcome: unknown = 'uncreated' + let minted = 0 + return { + action: (_name, args) => + create({ + client, + baseName: String(args.name ?? 'kestrel'), + buildParams: (candidate: string) => ({ repo: REPO_SELECTOR, name: candidate }), + // A resolved probe, because the create path awaits it before the first send. + worktreeCreateIdempotency: Promise.resolve( + args.idempotency === false ? false : { dedupeTtlMs: 60_000 } + ), + ...(args.maxAttempts === undefined ? {} : { maxAttempts: Number(args.maxAttempts) }), + mintMutationId: () => `mutation-${++minted}` + }).then((value: unknown) => { + outcome = value + return value + }), + state: () => ({ outcome }), + dispose: () => {} + } + }, + 'tasks.worktree-capabilities': ({ client }) => { + const read = modules.load( + 'mobile/src/tasks/worktree-create-capability.ts' + ).readNewWorktreeRuntimeCapabilities + let capabilities: unknown = 'unprobed' + return { + action: () => + read(client).then((value: unknown) => { + capabilities = value + return value + }), + state: () => ({ capabilities }), + dispose: () => {} + } + }, + 'tasks.composer-hosted-base': ({ client }) => { + const resolve = modules.load( + 'mobile/src/tasks/composer-source-base-resolve.ts' + ) + let prBase: unknown = 'unresolved' + let mrBase: unknown = 'unresolved' + return { + action(name) { + if (name === 'mr-base') { + return resolve + .resolveComposerMrBase({ client, repoId: REPO, mrIid: 7, sourceBranch: 'feature' }) + .then((value: unknown) => { + mrBase = value + return value + }) + } + return resolve + .resolveComposerPrBase({ client, repoId: REPO, prNumber: 12, headRefName: 'feature' }) + .then((value: unknown) => { + prBase = value + return value + }) + }, + state: () => ({ prBase, mrBase }), + dispose: () => {} + } + }, + 'tasks.setup-hook-trust': ({ client }) => { + const persist = modules.load( + 'mobile/src/tasks/setup-hook-trust.ts' + ).persistSetupHookTrustApproval + let trust: unknown = 'unapproved' + return { + action: (_name, args) => + persist({ + client, + trust: {}, + repoId: REPO, + contentHash: 'hash-1', + alwaysTrust: args.always === true + }).then((value: unknown) => { + trust = value + return value + }), + state: () => ({ trust }), + dispose: () => {} + } + }, + 'tasks.smart-source-search': ({ client }) => { + const search = modules.load( + 'mobile/src/tasks/smart-source-search-requests.ts' + ) + const results: Record = {} + return { + action(name, args) { + const query = String(args.query ?? 'bug') + const request = + name === 'gitlab' + ? search.searchGitLabItems(client, REPO, query, 'opened') + : name === 'linear' + ? search.searchLinearIssues( + client, + query, + args.workspace === null ? null : String(args.workspace ?? 'linear-workspace') + ) + : name === 'branches' + ? search.searchBranches(client, REPO, query) + : search.searchGitHubItems(client, REPO, query) + return request.then((value: unknown) => { + results[name] = value + return value + }) + }, + state: () => ({ ...results }), + dispose: () => {} + } + }, + 'tasks.paste-lookup': ({ client }) => { + const paste = modules.load( + 'mobile/src/tasks/smart-source-paste-intent.ts' + ) + const slugCache = new Map() + const repos = [ + { id: REPO, displayName: 'Repo', slug: null }, + { id: 'repo-2', displayName: 'Other', slug: null } + ] + const results: Record = {} + return { + action(name) { + const request = + name === 'by-number' + ? paste.lookupGitHubItemByNumber(client, REPO, 12) + : name === 'by-slug' + ? paste.lookupGitHubItemByOwnerRepo( + client, + REPO, + { owner: 'owner', repo: 'repo' }, + 12, + 'issue' + ) + : name === 'gitlab-path' + ? paste.lookupGitLabItemByPath(client, REPO, { + slug: { host: 'gitlab.com', path: 'group/project' }, + number: 7, + type: 'issue' + }) + : paste.findRepoMatchingSlugForPaste( + client, + repos, + { owner: 'owner', repo: 'repo' }, + slugCache + ) + return request.then((value: unknown) => { + results[name] = value + return value + }) + }, + state: () => ({ ...results, cache: [...slugCache] }), + dispose: () => {} + } + } + } +} diff --git a/mobile/src/test-support/rpc-recording/unhandled-recording.test.ts b/mobile/src/test-support/rpc-recording/unhandled-recording.test.ts new file mode 100644 index 00000000000..6e89846add4 --- /dev/null +++ b/mobile/src/test-support/rpc-recording/unhandled-recording.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from 'vitest' +import { recordUnhandledRejections } from './unhandled-recording' + +// No golden records an unhandled rejection any more, so this is the only thing pinning the capture. +describe('recordUnhandledRejections', () => { + it('records a detached rejection as an effect and restores the prior listeners', async () => { + const before = process.rawListeners('unhandledRejection') + const effects: { name: string; value: unknown }[] = [] + + const stop = recordUnhandledRejections((name, value) => effects.push({ name, value })) + void Promise.reject(new TypeError("Cannot read properties of null (reading 'ui')")) + await new Promise((resolve) => setImmediate(resolve)) + stop() + + expect(effects).toEqual([ + { + name: 'unhandled-rejection', + value: { + category: 'TypeError', + message: "Cannot read properties of null (reading 'ui')", + isRpcDeliveryUnknown: false + } + } + ]) + expect(process.rawListeners('unhandledRejection')).toEqual(before) + }) +}) diff --git a/mobile/src/test-support/rpc-recording/workspace-settings-mounts.ts b/mobile/src/test-support/rpc-recording/workspace-settings-mounts.ts index d37c3d40935..730a75736cf 100644 --- a/mobile/src/test-support/rpc-recording/workspace-settings-mounts.ts +++ b/mobile/src/test-support/rpc-recording/workspace-settings-mounts.ts @@ -6,6 +6,75 @@ import { operationModuleLoader } from './operation-module-loader' export function workspaceSettingsMounts( modules: ReturnType ): Record { + // `settings.task-workspace` stops at the setup prompt, which is the branch that scenario set + // exercises. A second registration resolves setup instead, so createWorkspace runs to + // worktree.create and the reply matrix reaches that call's acceptance policy. + function taskWorkspaceAdapter(setupResolution: { + kind: string + command?: string + source?: string + decision?: string + }): MountAdapter { + return (context) => { + const useCreate = modules.load< + typeof import('../../tasks/use-mobile-tasks-workspace-create-actions') + >( + 'mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx' + ).useMobileTasksWorkspaceCreateActions + const model = observableModel(context, { + client: context.client, + hostId: 'host-1', + tasksSupported: true, + taskStateHydrated: true, + runtimeTaskSettings: { disabledTuiAgents: ['claude'] }, + trustedOrcaHooks: {}, + workspaceDetectedAgentIds: new Set(['codex']), + workspaceLastAutoName: '', + ensureWorkspaceSshReady: async () => {}, + getWorkspaceTargetRepo: () => ({ + id: 'repo-1', + displayName: 'Repo', + connectionId: 'ssh-1' + }), + resolveCreateSetupDecision: async () => setupResolution, + router: { push: (value: unknown) => context.effect('navigation', value) } + }) + let actions: ReturnType + const hook = hookMount(() => { + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies only the members the hook reads. + actions = useCreate(model as unknown as Parameters[0]) + }) + return { + action(name, args) { + if (name === 'mount') { + return hook.mount() + } + if (name === 'submit') { + return actions.createWorkspace( + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the scenario supplies the action item as JSON, not as a typed model. + (args.item ?? { + key: 'linear:1', + provider: 'linear', + source: { id: 'issue-1' } + }) as Parameters[0], + undefined, + undefined, + 'claude' + ) + } + throw new Error(`Unknown task workspace action: ${name}`) + }, + state: () => + projectObservable({ + settings: model.runtimeTaskSettings, + error: model.error, + creating: model.creatingKey + }), + dispose: hook.unmount + } + } + } + return { 'settings.workspace-submit': (context) => { const useSubmit = modules.load< @@ -56,65 +125,14 @@ export function workspaceSettingsMounts( dispose: hook.unmount } }, - 'settings.task-workspace': (context) => { - const useCreate = modules.load< - typeof import('../../tasks/use-mobile-tasks-workspace-create-actions') - >( - 'mobile/src/tasks/use-mobile-tasks-workspace-create-actions.tsx' - ).useMobileTasksWorkspaceCreateActions - const model = observableModel(context, { - client: context.client, - hostId: 'host-1', - tasksSupported: true, - taskStateHydrated: true, - runtimeTaskSettings: { disabledTuiAgents: ['claude'] }, - trustedOrcaHooks: {}, - workspaceDetectedAgentIds: new Set(['codex']), - workspaceLastAutoName: '', - ensureWorkspaceSshReady: async () => {}, - getWorkspaceTargetRepo: () => ({ - id: 'repo-1', - displayName: 'Repo', - connectionId: 'ssh-1' - }), - resolveCreateSetupDecision: async () => ({ - kind: 'prompt', - command: 'setup', - source: 'repo' - }), - router: { push: (value: unknown) => context.effect('navigation', value) } - }) - let actions: ReturnType - const hook = hookMount(() => { - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies only the members the hook reads. - actions = useCreate(model as unknown as Parameters[0]) - }) - return { - action(name) { - if (name === 'mount') { - return hook.mount() - } - if (name === 'submit') { - return actions.createWorkspace( - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the scenario supplies the action item as JSON, not as a typed model. - { key: 'linear:1', provider: 'linear', source: { id: 'issue-1' } } as Parameters< - typeof actions.createWorkspace - >[0], - undefined, - undefined, - 'claude' - ) - } - throw new Error(`Unknown task workspace action: ${name}`) - }, - state: () => - projectObservable({ - settings: model.runtimeTaskSettings, - error: model.error, - creating: model.creatingKey - }), - dispose: hook.unmount - } - } + 'settings.task-workspace': taskWorkspaceAdapter({ + kind: 'prompt', + command: 'setup', + source: 'repo' + }), + 'settings.task-workspace-create': taskWorkspaceAdapter({ + kind: 'decision', + decision: 'inherit' + }) } } diff --git a/mobile/src/transport/rpc-operation.ts b/mobile/src/transport/rpc-operation.ts index f4ee18d9dfe..97f27143e93 100644 --- a/mobile/src/transport/rpc-operation.ts +++ b/mobile/src/transport/rpc-operation.ts @@ -247,11 +247,19 @@ export async function interpretAtRpcBarrier< ) as RpcBarrierVerdicts } -/** Preserves omitted sender arguments as well as explicit undefined. */ +/** + * Preserves omitted sender arguments as well as explicit undefined. + * + * A params type with no required field may be omitted too, because the raw port always allowed it + * and several hosts' schemas are entirely optional (`preflight.check`). Forcing `{}` there would + * put a new object on the wire where main sent no params at all. + */ type RpcSendArguments = void extends RpcSendParams ? [params?: RpcSendParams, options?: SendRequestOptions] - : [params: RpcSendParams, options?: SendRequestOptions] + : Record extends RpcSendParams + ? [params?: RpcSendParams, options?: SendRequestOptions] + : [params: RpcSendParams, options?: SendRequestOptions] /** Binds sending and interpretation while preserving the transport promise identity. */ export function bindDeferredRpcOperation< diff --git a/mobile/src/transport/rpc-reader-payload.ts b/mobile/src/transport/rpc-reader-payload.ts index 07cdebc16a5..4d6a8635007 100644 --- a/mobile/src/transport/rpc-reader-payload.ts +++ b/mobile/src/transport/rpc-reader-payload.ts @@ -25,3 +25,11 @@ export function rpcUncheckedPayloadReader( ): RpcCompatibleReader { return (raw) => rpcReadUnchecked(variant, raw) } + +/** One property off the payload, unchecked. The shape for a call site that cast `result.field`. */ +export function rpcUncheckedMemberReader( + variant: Variant, + key: string +): RpcCompatibleReader { + return (raw) => rpcReadUnchecked(variant, rpcPayloadMember(raw, key)) +} diff --git a/mobile/src/transport/rpc-refusal-message.test.ts b/mobile/src/transport/rpc-refusal-message.test.ts new file mode 100644 index 00000000000..2003c155b59 --- /dev/null +++ b/mobile/src/transport/rpc-refusal-message.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest' +import { summarizeCommitFailure } from '../../../src/shared/source-control-commit-failure' +import { hostReplyErrorTextOrFallback, refusedRpcMessageOrFallback } from './rpc-refusal-message' + +describe('refusedRpcMessageOrFallback', () => { + it('falls back for a message-less refusal and for a non-Error throw', () => { + const messageless = new Error('cleared below') + messageless.message = '' + expect(refusedRpcMessageOrFallback(new Error('refused'), 'Commit failed')).toBe('refused') + expect(refusedRpcMessageOrFallback(messageless, 'Commit failed')).toBe('Commit failed') + expect(refusedRpcMessageOrFallback('refused', 'Commit failed')).toBe('Commit failed') + }) +}) + +describe('hostReplyErrorTextOrFallback', () => { + it('keeps a non-empty host string', () => { + expect(hostReplyErrorTextOrFallback('nothing staged', 'Commit failed')).toBe('nothing staged') + }) + + it('falls back for an absent, null or empty host error', () => { + expect(hostReplyErrorTextOrFallback(undefined, 'Commit failed')).toBe('Commit failed') + expect(hostReplyErrorTextOrFallback(null, 'Commit failed')).toBe('Commit failed') + expect(hostReplyErrorTextOrFallback('', 'Commit failed')).toBe('Commit failed') + }) + + it('falls back for a truthy non-string, which the host contract does not allow', () => { + expect(hostReplyErrorTextOrFallback({ message: 'inner refused' }, 'Commit failed')).toBe( + 'Commit failed' + ) + expect(hostReplyErrorTextOrFallback(['a'], 'Commit failed')).toBe('Commit failed') + expect(hostReplyErrorTextOrFallback(7, 'Commit failed')).toBe('Commit failed') + expect(hostReplyErrorTextOrFallback(true, 'Commit failed')).toBe('Commit failed') + }) + + // The consumer that main's pass-through broke: `.slice` on an object, `.replace` on an array. + it('yields text the commit-failure summarizer can read', () => { + for (const malformed of [{ message: 'inner refused' }, ['inner refused'], 7]) { + expect(summarizeCommitFailure(hostReplyErrorTextOrFallback(malformed, 'Commit failed'))).toBe( + 'Commit failed' + ) + } + }) +}) diff --git a/mobile/src/transport/rpc-refusal-message.ts b/mobile/src/transport/rpc-refusal-message.ts index ceb17792746..1cc1f6fc592 100644 --- a/mobile/src/transport/rpc-refusal-message.ts +++ b/mobile/src/transport/rpc-refusal-message.ts @@ -1,11 +1,6 @@ /** - * A refused operation's message, or the screen's own copy when the host sent none. - * - * Call sites spelled this as `response.error?.message || fallback`. Once the refusal arrives as - * the acceptance policy's thrown Error, the `||` has to live somewhere — and it must not also - * cover a transport rejection, whose message main surfaced verbatim, empty string included. So - * a migrated call site keeps two catches where it had two paths, and only the refusal one calls - * this. + * A refused operation's message, or the screen's own copy when the host sent none. Only the + * refusal catch may call this: a transport rejection's message is surfaced verbatim, empty included. */ export function refusedRpcMessageOrFallback(error: unknown, fallback: string): string { return (error instanceof Error ? error.message : '') || fallback @@ -14,12 +9,10 @@ export function refusedRpcMessageOrFallback(error: unknown, fallback: string): s /** * An error a host reported inside an accepted reply, or the screen's copy when it sent none. * - * Exactly `result?.error || fallback`, including for a truthy non-string: main passed that value - * through under a `string` annotation, and a downstream `.replace` then threw. Stringifying it - * here would be an improvement, but an unannounced one inside a migration whose contract is that - * no behaviour changes — so the pass-through stays and the latent throw is ticketed separately. + * The host contract declares `error` as a string, so a non-string is a malformed reply and reads + * as absent — every consumer is display or prompt text, and main's pass-through made + * `summarizeCommitFailure` throw on `.slice`. */ export function hostReplyErrorTextOrFallback(value: unknown, fallback: string): string { - // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: reproduces main's own annotation of an unvalidated host field. - return ((value as string | undefined) || fallback) as string + return (typeof value === 'string' ? value : '') || fallback } diff --git a/mobile/src/transport/settings-read-operations.ts b/mobile/src/transport/settings-read-operations.ts index c98c87798b3..549b512c87c 100644 --- a/mobile/src/transport/settings-read-operations.ts +++ b/mobile/src/transport/settings-read-operations.ts @@ -38,7 +38,7 @@ const botOverridesReader: RpcCompatibleReader = } } -/** Workspace context, submit, task hydration/create and home providers share this acceptance. */ +/** Submit, task hydration/create and home providers: a null result throws the settings read. */ export const settingsRead = bindDeferredRpcOperation( defineRpcOperation({ name: 'settings.member-or-skip', @@ -49,7 +49,7 @@ export const settingsRead = bindDeferredRpcOperation( }) ) -/** History resume and repo labels historically tolerate an absent or null result. */ +/** Workspace context, history resume and repo metadata: a null result reads as absent settings. */ export const optionalSettingsRead = bindDeferredRpcOperation( defineRpcOperation({ name: 'settings.optional-member-or-skip', diff --git a/mobile/src/transport/unvalidated-rpc-request-port-inventory.ts b/mobile/src/transport/unvalidated-rpc-request-port-inventory.ts index 3e09655c5a1..722c4e58310 100644 --- a/mobile/src/transport/unvalidated-rpc-request-port-inventory.ts +++ b/mobile/src/transport/unvalidated-rpc-request-port-inventory.ts @@ -159,14 +159,18 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques // and mobile-git-mutation-operations.ts for the operations the rest of the domain now sends. { file: 'src/source-control/use-mobile-git-requests.ts', references: 1 }, - // src/tasks/ — task lists, filters and mutations - { file: 'src/tasks/composer-source-base-resolve.ts', references: 2 }, + // src/tasks/ — task lists, filters and mutations. The workspace-creation half migrated in + // step 4: create, hosted-base resolution, SSH/agent preflight, sparse presets, the Smart + // source picker's provider reads and the screen's own preference writes. See + // mobile-workspace-create-operations.ts, mobile-workspace-source-operations.ts, + // mobile-task-runtime-operations.ts and mobile-task-source-search-operations.ts. What is left + // is the provider item/detail/mutation half, plus two files that cannot reach zero: + // mobile-tasks-source-family.test-support.ts matches the literal in a source scanner rather + // than sending anything, and use-mobile-tasks-project-file-merge-actions.tsx and + // use-mobile-tasks-hosted-metadata-actions.tsx each multiplex a `{ method, params }` step the + // pickers hand them at runtime. { file: 'src/tasks/mobile-tasks-filter-pickers.tsx', references: 1 }, { file: 'src/tasks/mobile-tasks-source-family.test-support.ts', references: 1 }, - { file: 'src/tasks/setup-hook-trust.ts', references: 1 }, - { file: 'src/tasks/smart-source-paste-intent.ts', references: 4 }, - { file: 'src/tasks/smart-source-search-requests.ts', references: 5 }, - { file: 'src/tasks/use-mobile-tasks-client-settings-actions.tsx', references: 6 }, { file: 'src/tasks/use-mobile-tasks-github-check-file-actions.tsx', references: 5 }, { file: 'src/tasks/use-mobile-tasks-github-reply-merge-actions.tsx', references: 5 }, { file: 'src/tasks/use-mobile-tasks-gitlab-github-status-actions.tsx', references: 3 }, @@ -187,16 +191,9 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques { file: 'src/tasks/use-mobile-tasks-project-workspace-comment-actions.tsx', references: 3 }, { file: 'src/tasks/use-mobile-tasks-provider-load-actions.tsx', references: 5 }, { file: 'src/tasks/use-mobile-tasks-route-and-item-state.tsx', references: 1 }, - { file: 'src/tasks/use-mobile-tasks-runtime-hydration.tsx', references: 4 }, { file: 'src/tasks/use-mobile-tasks-task-create-actions.tsx', references: 3 }, { file: 'src/tasks/use-mobile-tasks-task-list-loading.tsx', references: 4 }, { file: 'src/tasks/use-mobile-tasks-task-pagination-actions.tsx', references: 1 }, - { file: 'src/tasks/use-mobile-tasks-workspace-create-actions.tsx', references: 3 }, - { file: 'src/tasks/use-mobile-tasks-workspace-source-effects.tsx', references: 2 }, - { file: 'src/tasks/use-mobile-tasks-workspace-sparse-actions.tsx', references: 2 }, - { file: 'src/tasks/use-mobile-tasks-workspace-ssh-state.tsx', references: 5 }, - { file: 'src/tasks/worktree-create-capability.ts', references: 1 }, - { file: 'src/tasks/worktree-create-retry.ts', references: 1 }, // src/terminal/ — terminal input, viewport and queries { file: 'src/terminal/mobile-terminal-query-reply.ts', references: 2 }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 586c9449212..d93fec995ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,7 +116,7 @@ patchedDependencies: '@xterm/addon-webgl@0.20.0-beta.299': 94687e89a0115e6e6aa102837f986debdc029c091527ee5eb4a4e17ceaf9473e '@xterm/xterm@6.1.0-beta.303': 1f36ce689bc50c703ae09aeda0e064f107e18e4a5ecba19e746fa5edc4b02ef4 lint-staged@16.4.0: 7333b3837f80a7fbd045964db6d76ba4fc118e49134bdbabb00585b6b7b60673 - node-pty@1.1.0: bac3a53fb15efc9b3b944fbe3c4718b5174a0b3bd6ead84e21975edad4bc6615 + node-pty@1.1.0: 346cb29d33dd6eeb14910ff411c7584b0b2ff9a4b271c4b6d23c3b48e6548f74 importers: @@ -160,7 +160,7 @@ importers: version: 3.3.1 node-pty: specifier: ^1.1.0 - version: 1.1.0(patch_hash=bac3a53fb15efc9b3b944fbe3c4718b5174a0b3bd6ead84e21975edad4bc6615) + version: 1.1.0(patch_hash=346cb29d33dd6eeb14910ff411c7584b0b2ff9a4b271c4b6d23c3b48e6548f74) posthog-node: specifier: ^5.33.3 version: 5.33.3 @@ -12274,7 +12274,7 @@ snapshots: node-int64@0.4.0: {} - node-pty@1.1.0(patch_hash=bac3a53fb15efc9b3b944fbe3c4718b5174a0b3bd6ead84e21975edad4bc6615): + node-pty@1.1.0(patch_hash=346cb29d33dd6eeb14910ff411c7584b0b2ff9a4b271c4b6d23c3b48e6548f74): dependencies: node-addon-api: 7.1.1 diff --git a/src/main/agent-hooks/hook-stdin-contract.ts b/src/main/agent-hooks/hook-stdin-contract.ts index de77b2f3e9f..eeec395b578 100644 --- a/src/main/agent-hooks/hook-stdin-contract.ts +++ b/src/main/agent-hooks/hook-stdin-contract.ts @@ -7,15 +7,111 @@ export type PosixHookEmptyPayloadPolicy = 'exit' | 'empty-object' export const POSIX_HOOK_STDIN_READER = '{ command -p cat 2>/dev/null || cat; }' export const POSIX_HOOK_STDIN_DRAIN_COMMAND = `${POSIX_HOOK_STDIN_READER} >/dev/null 2>&1 || :` +/** Seconds the JSON reader waits for the writer's first byte before giving up. + * Comfortably inside Grok's 10s hook timeout, and far enough above process + * startup that a loaded or remote host cannot lose a payload that is merely late. */ +export const POSIX_HOOK_JSON_STDIN_FIRST_BYTE_TIMEOUT_SECONDS = 5 +/** Seconds of silence that end a payload which never parses as JSON (the `cat` shape). */ +export const POSIX_HOOK_JSON_STDIN_IDLE_TIMEOUT_SECONDS = 1.5 + +// Why: Grok SessionStart writes one JSON object and then waits for the hook to +// exit without closing stdin, so reading to EOF deadlocks until Grok's 10s +// timeout. Return as soon as the first complete JSON value has arrived. +// +// Three invariants this script must hold, because the shell chains a second +// reader behind it and a reader that consumed bytes cannot be retried: +// 1. A non-zero exit implies stdin was never read, so the `||` fallback still +// sees the whole stream. Everything after the imports is therefore guarded. +// 2. Decoding is incremental. A multi-byte character straddling two reads must +// not raise, or a CJK/emoji payload falls through to `cat` and hangs. +// 3. The payload is emitted unchanged. Re-serialising would rewrite non-ASCII +// as \uXXXX and reorder keys behind the agent's back. +const POSIX_HOOK_JSON_STDIN_PYTHON = [ + 'import codecs, json, os, select', + 'text = ""', + 'try:', + ' decoder = codecs.getincrementaldecoder("utf-8")("replace")', + ` timeout = ${POSIX_HOOK_JSON_STDIN_FIRST_BYTE_TIMEOUT_SECONDS}.0`, + ' while 1:', + ' if not select.select([0], [], [], timeout)[0]:', + ' text += decoder.decode(b"", True)', + ' break', + ' chunk = os.read(0, 65536)', + ' if not chunk:', + ' text += decoder.decode(b"", True)', + ' break', + ` timeout = ${POSIX_HOOK_JSON_STDIN_IDLE_TIMEOUT_SECONDS}`, + ' text += decoder.decode(chunk)', + // raw_decode does not skip leading whitespace, so a padded payload would + // otherwise never complete and would wait out the idle timeout. + ' value = text.lstrip()', + ' if not value:', + ' continue', + ' try:', + ' end = json.JSONDecoder().raw_decode(value)[1]', + ' except ValueError:', + ' continue', + ' text = value[:end]', + ' break', + 'except Exception:', + ' pass', + 'try:', + // os.write skips the locale-dependent stdout encoder, which raises under + // LC_ALL=C for a non-ASCII payload. + ' data = text.encode("utf-8")', + ' written = 0', + ' while written < len(data):', + ' written += os.write(1, data[written:])', + 'except Exception:', + ' pass' +].join('\n') + +// Why a variable rather than two inline copies: the script is embedded twice in +// the reader chain, and `-c '<600 chars>'` twice is an EDR oversized-command-line +// signal as well as unreadable in the generated hook. +const POSIX_HOOK_JSON_STDIN_PYTHON_VAR = 'orca_hook_json_stdin_py' +export const POSIX_HOOK_JSON_STDIN_PRELUDE: readonly string[] = [ + `${POSIX_HOOK_JSON_STDIN_PYTHON_VAR}='${POSIX_HOOK_JSON_STDIN_PYTHON}'` +] + +const jsonStdinInterpreter = (name: string): string => + `command -p ${name} -c "$${POSIX_HOOK_JSON_STDIN_PYTHON_VAR}" 2>/dev/null` + +// Why: macOS ships /usr/bin/python3 as an Xcode stub that re-resolves the real +// interpreter on every run when it cannot reach its cache under $HOME. A HOME +// that does not exist costs ~6.6s per spawn there, which alone overruns Grok's +// 10s hook budget. Unsetting it brings that back to ~95ms and is what a +// home-less process sees anyway. Safe to mutate: the reader only ever runs +// inside the `payload=$(...)` subshell, so the hook's own HOME is untouched. +const POSIX_HOOK_JSON_STDIN_HOME_GUARD = '{ [ -d "${HOME:-}" ] || unset HOME; }' + +// Why `python` too: the script avoids py3-only syntax (verified on 2.7) so a host +// that only ships `python` does not drop straight to the `cat` hang. +export const POSIX_HOOK_JSON_STDIN_READER = `${POSIX_HOOK_JSON_STDIN_HOME_GUARD}; ${jsonStdinInterpreter('python3')} || ${jsonStdinInterpreter('python')} || ${POSIX_HOOK_STDIN_READER}` + +/** Optional reader override for an agent whose caller keeps stdin open after the payload. + * `prelude` must be emitted before the capture line; keep them together. */ +export type PosixHookStdinReader = { + readonly reader: string + readonly prelude: readonly string[] +} + +export const POSIX_HOOK_JSON_STDIN: PosixHookStdinReader = { + reader: POSIX_HOOK_JSON_STDIN_READER, + prelude: POSIX_HOOK_JSON_STDIN_PRELUDE +} + // Why: every POSIX hook must own stdin before any no-op exit; sharing this // prelude prevents agent templates from inventing different drain semantics. export function buildPosixHookPayloadCapture( - emptyPayloadPolicy: PosixHookEmptyPayloadPolicy = 'exit' + emptyPayloadPolicy: PosixHookEmptyPayloadPolicy = 'exit', + stdinReader: PosixHookStdinReader = { reader: POSIX_HOOK_STDIN_READER, prelude: [] } ): string[] { const emptyPayloadLines = emptyPayloadPolicy === 'empty-object' ? [" payload='{}'"] : [' exit 0'] return [ - `payload=$(${POSIX_HOOK_STDIN_READER})`, + ...stdinReader.prelude, + `payload=$(${stdinReader.reader})`, 'if [ -z "$payload" ]; then', ...emptyPayloadLines, 'fi' diff --git a/src/main/agent-hooks/managed-hook-stdin-lifecycle.test.ts b/src/main/agent-hooks/managed-hook-stdin-lifecycle.test.ts index dea4545ad11..cd6c336e751 100644 --- a/src/main/agent-hooks/managed-hook-stdin-lifecycle.test.ts +++ b/src/main/agent-hooks/managed-hook-stdin-lifecycle.test.ts @@ -64,6 +64,8 @@ import { KimiHookService } from '../kimi/hook-service' import { openClaudeHookService } from '../openclaude/hook-service' import { wrapPosixHookCommand, wrapWindowsHookCommand } from './installer-utils' import { + POSIX_HOOK_JSON_STDIN_PRELUDE, + POSIX_HOOK_JSON_STDIN_READER, POSIX_HOOK_STDIN_READER, WINDOWS_POWERSHELL_HOOK_ENVIRONMENT_GUARD } from './hook-stdin-contract' @@ -561,10 +563,22 @@ describe.skipIf(process.platform === 'win32')('managed hook stdin lifecycle', () it('captures stdin before every possible whole-script success exit', async () => { const scripts = await generatePosixScripts() for (const [agent, script] of scripts) { - const captureIndex = script.indexOf(`payload=$(${POSIX_HOOK_STDIN_READER})`) + const captureIndex = Math.max( + script.indexOf(`payload=$(${POSIX_HOOK_STDIN_READER})`), + script.indexOf(`payload=$(${POSIX_HOOK_JSON_STDIN_READER})`) + ) const firstExitIndex = script.indexOf('exit 0') expect(captureIndex, `${agent} payload capture`).toBeGreaterThanOrEqual(0) expect(firstExitIndex, `${agent} first success exit`).toBeGreaterThan(captureIndex) + // Why: the JSON reader dereferences a variable the prelude sets, so a script + // that carries the reader must carry its prelude above the capture line. + if (script.includes(POSIX_HOOK_JSON_STDIN_READER)) { + const prelude = POSIX_HOOK_JSON_STDIN_PRELUDE.join('\n') + expect(script.indexOf(prelude), `${agent} JSON reader prelude`).toBeGreaterThanOrEqual(0) + expect(script.indexOf(prelude), `${agent} prelude before capture`).toBeLessThan( + captureIndex + ) + } } }) diff --git a/src/main/agent-hooks/posix-hook-json-stdin-reader.test.ts b/src/main/agent-hooks/posix-hook-json-stdin-reader.test.ts new file mode 100644 index 00000000000..587346ec55e --- /dev/null +++ b/src/main/agent-hooks/posix-hook-json-stdin-reader.test.ts @@ -0,0 +1,262 @@ +// Why an executable suite rather than shape assertions: the reader is a Python +// program embedded in a shell string, so only running it catches a decode that +// raises on a chunk boundary — the shape looked correct while a CJK payload +// crashed the interpreter and fell through to the `cat` hang it exists to avoid. +import { execFile, spawn } from 'node:child_process' +import { promisify } from 'node:util' +import { describe, expect, it } from 'vitest' +import { + buildPosixHookPayloadCapture, + POSIX_HOOK_JSON_STDIN, + POSIX_HOOK_JSON_STDIN_FIRST_BYTE_TIMEOUT_SECONDS, + POSIX_HOOK_JSON_STDIN_PRELUDE, + POSIX_HOOK_JSON_STDIN_IDLE_TIMEOUT_SECONDS +} from './hook-stdin-contract' + +const execFileAsync = promisify(execFile) + +/** The reader plus a line that prints what it captured, so the payload is observable. */ +const READER_SCRIPT = [ + ...buildPosixHookPayloadCapture('empty-object', POSIX_HOOK_JSON_STDIN).slice(0, -3), + 'printf %s "$payload"' +].join('\n') + +const REPLACEMENT_CHARACTER = '�' +const KILL_AFTER_MS = 9_000 + +type ReaderRun = { + readonly exitCode: number | null + readonly stdout: string + readonly stderr: string + readonly durationMs: number + readonly timedOut: boolean +} + +/** Feeds `chunks` with `gapMs` between them. `closeStdin: false` is the Grok + * SessionStart shape: the payload is written and the pipe is left open. */ +function runReader( + chunks: readonly Buffer[], + { + gapMs = 5, + closeStdin = false, + env + }: { gapMs?: number; closeStdin?: boolean; env?: NodeJS.ProcessEnv } = {} +): Promise { + return new Promise((resolve, reject) => { + const startedAt = Date.now() + const child = spawn('/bin/sh', ['-c', READER_SCRIPT], { + stdio: ['pipe', 'pipe', 'pipe'], + env: env ?? process.env + }) + let stdout = Buffer.alloc(0) + let stderr = '' + let timedOut = false + child.stdout.on('data', (chunk: Buffer) => { + stdout = Buffer.concat([stdout, chunk]) + }) + child.stderr.on('data', (chunk: Buffer) => { + stderr += chunk.toString() + }) + // A reader that never returns leaves the writer's pipe unread; ignore the tear-down error. + child.stdin.on('error', () => {}) + const timer = setTimeout(() => { + timedOut = true + child.kill('SIGKILL') + }, KILL_AFTER_MS) + child.on('error', (error) => { + clearTimeout(timer) + reject(error) + }) + child.on('close', (exitCode) => { + clearTimeout(timer) + resolve({ + exitCode, + stdout: stdout.toString('utf8'), + stderr, + durationMs: Date.now() - startedAt, + timedOut + }) + }) + void (async () => { + for (const chunk of chunks) { + child.stdin.write(chunk) + await new Promise((resolveGap) => setTimeout(resolveGap, gapMs)) + } + if (closeStdin) { + child.stdin.end() + } + })() + }) +} + +async function resolveDefaultPathPython(): Promise { + try { + const { stdout } = await execFileAsync('/bin/sh', [ + '-c', + 'command -pv python3 || command -pv python' + ]) + return stdout.trim().length > 0 + } catch { + return false + } +} + +const hasPython = process.platform === 'win32' ? false : await resolveDefaultPathPython() + +describe('POSIX hook JSON stdin reader shape', () => { + // Why: the Python program is carried in a single-quoted shell assignment, so one + // apostrophe would end the string and splice the rest of it into the hook as code. + it('carries no single quote that would escape its shell quoting', () => { + const prelude = POSIX_HOOK_JSON_STDIN_PRELUDE.join('\n') + expect(prelude.split("'")).toHaveLength(3) + }) + + it('guards HOME before the interpreter runs', () => { + expect(POSIX_HOOK_JSON_STDIN.reader.indexOf('unset HOME')).toBeLessThan( + POSIX_HOOK_JSON_STDIN.reader.indexOf('python3') + ) + }) +}) + +describe.skipIf(process.platform === 'win32')('POSIX hook JSON stdin reader', () => { + // Why skipped rather than failed: without an interpreter the chain falls back to + // `cat`, whose read-to-EOF genuinely cannot return while the writer holds the pipe. + const itWithPython = it.skipIf(!hasPython) + + itWithPython( + 'keeps a multi-byte character intact when it is split across reads', + async () => { + const payload = '{"hook_event_name":"session_start","cwd":"/tmp/漢字","tool":"🚀"}' + // One byte per write: every multi-byte sequence therefore straddles a read. + const chunks = [...Buffer.from(`${payload}\n`, 'utf8')].map((byte) => Buffer.from([byte])) + + const result = await runReader(chunks) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.exitCode).toBe(0) + expect(result.stdout).not.toContain(REPLACEMENT_CHARACTER) + expect(result.stdout).toBe(payload) + }, + KILL_AFTER_MS + 1_000 + ) + + // Why: the chain is `python3 || python || cat`, and a reader that died after + // consuming bytes would hand the next one a truncated stream. A non-zero exit + // must therefore imply nothing was read. + itWithPython( + 'never hands a partially consumed stream to the fallback reader', + async () => { + const payload = `{"hook_event_name":"session_start","pad":"${'p'.repeat(200_000)}","cwd":"/漢"}` + const bytes = Buffer.from(`${payload}\n`, 'utf8') + // Split inside the 3-byte sequence, with a gap long enough that the first + // read has already completed before the continuation bytes are written. + const splitAt = bytes.length - 4 + const chunks = [bytes.subarray(0, splitAt), bytes.subarray(splitAt)] + + const result = await runReader(chunks, { gapMs: 400, closeStdin: true }) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.exitCode).toBe(0) + const parsePayload = (): unknown => JSON.parse(result.stdout) + expect(parsePayload).not.toThrow() + expect(result.stdout).toBe(payload) + }, + KILL_AFTER_MS + 1_000 + ) + + // Why: re-serialising the object would rewrite non-ASCII as \uXXXX and reorder + // keys, so the hook server would no longer see what the agent actually sent. + itWithPython( + 'emits the payload text unchanged rather than re-serialising it', + async () => { + const payload = '{"z":"日本語","a":1,"nested":{"b":[1,2]}}' + + const result = await runReader([Buffer.from(`${payload}\n`, 'utf8')]) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.stdout).not.toContain('\\u') + expect(result.stdout).toBe(payload) + }, + KILL_AFTER_MS + 1_000 + ) + + // Why: raw_decode does not skip leading whitespace, so a padded payload would + // otherwise never complete and would sit out the idle timeout before returning. + itWithPython( + 'returns immediately for a payload preceded by whitespace', + async () => { + const payload = '{"hook_event_name":"session_start"}' + + const result = await runReader([Buffer.from(`\n ${payload}\n`, 'utf8')]) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.stdout).toBe(payload) + expect(result.durationMs).toBeLessThan(POSIX_HOOK_JSON_STDIN_IDLE_TIMEOUT_SECONDS * 1_000) + }, + KILL_AFTER_MS + 1_000 + ) + + // Why: the first-byte wait is not the idle wait. A host that is slow to schedule + // the writer must not have its payload silently dropped. + itWithPython( + 'waits past the idle timeout for a writer that has not sent its first byte', + async () => { + const payload = '{"hook_event_name":"session_start"}' + + const result = await runReader([Buffer.alloc(0), Buffer.from(`${payload}\n`)], { + gapMs: 2_500 + }) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.stdout).toBe(payload) + expect(result.durationMs).toBeLessThan( + POSIX_HOOK_JSON_STDIN_FIRST_BYTE_TIMEOUT_SECONDS * 1_000 + ) + }, + KILL_AFTER_MS + 1_000 + ) + + // Why: not every hook payload is JSON, and the reader replaces `cat` for Grok — + // it still has to hand back everything a closed stream contained. + itWithPython( + 'reads a non-JSON payload through to EOF', + async () => { + const result = await runReader([Buffer.from('not json at all\nsecond line\n')], { + closeStdin: true + }) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.stdout).toBe('not json at all\nsecond line') + }, + KILL_AFTER_MS + 1_000 + ) + + // Why: macOS resolves /usr/bin/python3 through an Xcode stub that re-runs its + // whole tool lookup when it cannot reach a cache under $HOME. A HOME pointing + // nowhere cost ~6.6s per spawn, which on its own overran Grok's 10s budget. + itWithPython( + 'stays fast when HOME points at a directory that does not exist', + async () => { + const payload = '{"hook_event_name":"session_start"}' + + const result = await runReader([Buffer.from(`${payload}\n`, 'utf8')], { + env: { ...process.env, HOME: '/nonexistent/orca-hook-home' } + }) + + expect(result.timedOut, 'reader returned').toBe(false) + expect(result.stdout).toBe(payload) + expect(result.durationMs).toBeLessThan(2_000) + }, + KILL_AFTER_MS + 1_000 + ) + + itWithPython( + 'reports nothing on stderr on any of these paths', + async () => { + const result = await runReader([Buffer.from('{"a":"漢"}\n', 'utf8')]) + + expect(result.stderr).toBe('') + }, + KILL_AFTER_MS + 1_000 + ) +}) diff --git a/src/main/ai-vault/session-scanner-agent-root-overrides.test.ts b/src/main/ai-vault/session-scanner-agent-root-overrides.test.ts new file mode 100644 index 00000000000..a75a437611a --- /dev/null +++ b/src/main/ai-vault/session-scanner-agent-root-overrides.test.ts @@ -0,0 +1,117 @@ +import { homedir } from 'node:os' +import { join } from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { AiVaultScanOptions } from './session-scanner-types' + +/** + * The six env-derived scan roots must ignore a non-absolute value (#13082). + * + * These assert at the *call sites*, not on the shared helper: four of the roots are module-level + * consts evaluated at import time, so a helper that exists but is no longer wired into one of them + * is exactly the regression a helper-only test cannot see. + */ + +const NO_OPTIONS: AiVaultScanOptions = {} +const NO_WSL: readonly string[] = [] + +async function rootDirsFor( + agent: 'codex' | 'copilot' | 'devin' | 'openclaw' | 'kimi' | 'grok', + env: Record +): Promise { + vi.resetModules() + for (const [key, value] of Object.entries(env)) { + vi.stubEnv(key, value) + } + const sources = await import('./session-scanner-agent-sources.js') + const source = sources.AI_VAULT_AGENT_SOURCES[agent] + if (!source) { + throw new Error(`no source table entry for ${agent}`) + } + return source.rootDirs(NO_OPTIONS, NO_WSL) +} + +// Every shape a relative value can take, including the two Windows drive-relative ones. +const RELATIVE_VALUES = ['.', '..', 'rel/path', '~/sessions', 'C:foo', 'C:'] as const + +const CASES = [ + { + agent: 'codex', + envVar: 'CODEX_HOME', + absolute: '/srv/codex', + absoluteRoot: join('/srv/codex', 'sessions'), + defaultRoot: () => join(homedir(), '.codex', 'sessions') + }, + { + agent: 'copilot', + envVar: 'COPILOT_HOME', + absolute: '/srv/copilot', + absoluteRoot: join('/srv/copilot', 'session-state'), + defaultRoot: () => join(homedir(), '.copilot', 'session-state') + }, + { + agent: 'devin', + envVar: 'DEVIN_HOME', + absolute: '/srv/devin', + absoluteRoot: join('/srv/devin', 'transcripts'), + defaultRoot: () => join(homedir(), '.local', 'share', 'devin', 'cli', 'transcripts') + }, + { + agent: 'openclaw', + envVar: 'OPENCLAW_STATE_DIR', + absolute: '/srv/openclaw', + absoluteRoot: join('/srv/openclaw', 'agents'), + defaultRoot: () => join(homedir(), '.openclaw', 'agents') + }, + { + agent: 'kimi', + envVar: 'KIMI_CODE_HOME', + absolute: '/srv/kimi', + absoluteRoot: join('/srv/kimi', 'sessions'), + defaultRoot: () => join(homedir(), '.kimi-code', 'sessions') + }, + { + agent: 'grok', + envVar: 'GROK_HOME', + absolute: '/srv/grok', + absoluteRoot: join('/srv/grok', 'sessions'), + defaultRoot: () => join(homedir(), '.grok', 'sessions') + } +] as const + +describe('agent scan roots from environment overrides', () => { + afterEach(() => { + vi.unstubAllEnvs() + vi.resetModules() + }) + + for (const testCase of CASES) { + describe(testCase.envVar, () => { + it('uses an absolute override', async () => { + const roots = await rootDirsFor(testCase.agent, { [testCase.envVar]: testCase.absolute }) + expect(roots[0]).toBe(testCase.absoluteRoot) + }) + + it('tolerates whitespace around an absolute override', async () => { + const roots = await rootDirsFor(testCase.agent, { + [testCase.envVar]: ` ${testCase.absolute} ` + }) + expect(roots[0]).toBe(testCase.absoluteRoot) + }) + + it.each(RELATIVE_VALUES)('falls back to the default root for %j', async (value) => { + const roots = await rootDirsFor(testCase.agent, { [testCase.envVar]: value }) + expect(roots[0]).toBe(testCase.defaultRoot()) + }) + + // A relative root is the actual #13082 failure: it resolves against whichever Orca process + // reads it, so the walk starts somewhere arbitrary and has no depth, entry or time cap. + it.each(RELATIVE_VALUES)('never yields a relative root for %j', async (value) => { + const roots = await rootDirsFor(testCase.agent, { [testCase.envVar]: value }) + for (const root of roots) { + expect(root).toBe(join(root)) + expect(root.startsWith('/') || /^[A-Za-z]:[\\/]/.test(root)).toBe(true) + } + }) + }) + } +}) diff --git a/src/main/ai-vault/session-scanner-agent-sources.ts b/src/main/ai-vault/session-scanner-agent-sources.ts index 957d8d680a6..ff3abaddae9 100644 --- a/src/main/ai-vault/session-scanner-agent-sources.ts +++ b/src/main/ai-vault/session-scanner-agent-sources.ts @@ -1,5 +1,6 @@ import { homedir } from 'node:os' import { basename, dirname, extname, join, relative } from 'node:path' +import { resolveAbsoluteDirOverride } from '../../shared/absolute-dir-override' import type { AiVaultAgent } from '../../shared/ai-vault-types' import type { AiVaultDeletableAgent } from '../../shared/ai-vault-session-deletion' import { resolveGrokSessionsDir } from '../../shared/grok-session-paths' @@ -18,18 +19,21 @@ import { normalizeAgentSessionsDir, primeAgentSessionsDirFromEnv } from './sessi export const DEFAULT_CODEX_HOME_DIR = join(homedir(), '.codex') const CODEX_SESSIONS_DIR = join( - process.env.CODEX_HOME?.trim() || DEFAULT_CODEX_HOME_DIR, + resolveAbsoluteDirOverride(process.env.CODEX_HOME, DEFAULT_CODEX_HOME_DIR), 'sessions' ) const GEMINI_SESSIONS_DIR = join(homedir(), '.gemini', 'tmp') const COPILOT_SESSIONS_DIR = join( - process.env.COPILOT_HOME?.trim() || join(homedir(), '.copilot'), + resolveAbsoluteDirOverride(process.env.COPILOT_HOME, join(homedir(), '.copilot')), 'session-state' ) const CURSOR_PROJECTS_DIR = join(homedir(), '.cursor', 'projects') const HERMES_SESSIONS_DIR = join(homedir(), '.hermes', 'sessions') const ROVO_SESSIONS_DIR = join(homedir(), '.rovodev', 'sessions') -const OPENCLAW_STATE_DIR = process.env.OPENCLAW_STATE_DIR?.trim() || join(homedir(), '.openclaw') +const OPENCLAW_STATE_DIR = resolveAbsoluteDirOverride( + process.env.OPENCLAW_STATE_DIR, + join(homedir(), '.openclaw') +) const PI_SESSIONS_DIR = normalizeAgentSessionsDir( process.env.PI_CODING_AGENT_DIR?.trim() || join(homedir(), '.pi', 'agent', 'sessions'), '.pi' @@ -40,7 +44,10 @@ const PI_SESSIONS_DIR = normalizeAgentSessionsDir( const PRIME_AGENT_SESSIONS_DIR = primeAgentSessionsDirFromEnv() // Why: Devin ATIF transcripts are stored under /transcripts. const DEVIN_TRANSCRIPTS_DIR = join( - process.env.DEVIN_HOME?.trim() || join(homedir(), '.local', 'share', 'devin', 'cli'), + resolveAbsoluteDirOverride( + process.env.DEVIN_HOME, + join(homedir(), '.local', 'share', 'devin', 'cli') + ), 'transcripts' ) const DROID_SESSIONS_DIR = join(homedir(), '.factory', 'sessions') diff --git a/src/main/ai-vault/session-scanner-kimi-paths.ts b/src/main/ai-vault/session-scanner-kimi-paths.ts index 590e4aee814..d55061eac68 100644 --- a/src/main/ai-vault/session-scanner-kimi-paths.ts +++ b/src/main/ai-vault/session-scanner-kimi-paths.ts @@ -1,6 +1,7 @@ import { homedir } from 'node:os' import { basename, dirname, join } from 'node:path' import { createInterface } from 'node:readline' +import { resolveAbsoluteDirOverride } from '../../shared/absolute-dir-override' import { openTranscriptReadStream, wslGatedStat } from '../native-chat/wsl-transcript-fs-access' import { WslTranscriptFsError } from '../native-chat/wsl-transcript-fs-gate' import { asRecord, extractString } from './session-scanner-values' @@ -18,7 +19,7 @@ export function resolveKimiSessionsDir(override?: string): string { if (override?.trim()) { return override.trim() } - const home = process.env.KIMI_CODE_HOME?.trim() || join(homedir(), '.kimi-code') + const home = resolveAbsoluteDirOverride(process.env.KIMI_CODE_HOME, join(homedir(), '.kimi-code')) return join(home, 'sessions') } diff --git a/src/main/ai-vault/session-scanner-values.ts b/src/main/ai-vault/session-scanner-values.ts index f7d62611adb..a2f3b633be5 100644 --- a/src/main/ai-vault/session-scanner-values.ts +++ b/src/main/ai-vault/session-scanner-values.ts @@ -1,5 +1,6 @@ import { homedir } from 'node:os' -import { basename, dirname, isAbsolute, join } from 'node:path' +import { basename, dirname, join } from 'node:path' +import { resolveAbsoluteDirOverride } from '../../shared/absolute-dir-override' import { wslGatedReadFile } from '../native-chat/wsl-transcript-fs-access' import { WslTranscriptFsError } from '../native-chat/wsl-transcript-fs-gate' import { asRecord } from './session-scanner-record-value' @@ -165,14 +166,14 @@ function defaultPrimeAgentSessionsDir(): string { return join(homedir(), '.prime', 'agent', 'sessions') } -// Why: the CLI expands a leading `~` itself, so a value set outside a shell -// (config file, plist, quoted assignment) still resolves against the home dir. -// Returns null for anything that is not an absolute root, since a relative value -// ('', '.', '..', 'sessions') would resolve against the main-process cwd. +// Why: the Pi/Prime CLIs expand a leading `~` themselves, so a value set outside a +// shell (config file, plist, quoted assignment) still resolves against the home dir. +// That expansion is per-CLI and deliberately not in the shared absolute check — Grok, +// for one, creates a literal `~` directory instead. function absoluteConfiguredDir(rawValue: string): string | null { const expanded = rawValue === '~' ? homedir() : rawValue.replace(/^~(?=[\\/])/, homedir()) const normalized = expanded.replace(/[\\/]+$/, '') - return normalized && isAbsolute(normalized) ? normalized : null + return resolveAbsoluteDirOverride(normalized, '') || null } // Prime Agent takes PRIME_AGENT_CODING_AGENT_DIR verbatim as its agent config dir diff --git a/src/main/browser/agent-browser-bridge-command-transport.test.ts b/src/main/browser/agent-browser-bridge-command-transport.test.ts index 733cd966ce7..dd2899469b4 100644 --- a/src/main/browser/agent-browser-bridge-command-transport.test.ts +++ b/src/main/browser/agent-browser-bridge-command-transport.test.ts @@ -117,12 +117,12 @@ describe('AgentBrowserBridge', () => { expect((snapshotCall![1] as string[])[cdpIdx + 1]).toBe('9222') await bridge.click('@e1') - await bridge.mouseMove(10, 20) + await bridge.scroll('down') await bridge.setOffline('on') await bridge.consoleLog() await bridge.exec('get title') - for (const command of ['click', 'mouse', 'set', 'console', 'get']) { + for (const command of ['click', 'scroll', 'set', 'console', 'get']) { const call = execFileMock.mock.calls.find((candidate: unknown[]) => (candidate[1] as string[]).includes(command) ) diff --git a/src/main/browser/agent-browser-bridge-mouse-commands.ts b/src/main/browser/agent-browser-bridge-mouse-commands.ts index 36697978748..80c1ebeccb3 100644 --- a/src/main/browser/agent-browser-bridge-mouse-commands.ts +++ b/src/main/browser/agent-browser-bridge-mouse-commands.ts @@ -2,37 +2,16 @@ import type { BrowserMouseModifier } from './agent-browser-bridge-types' import { BrowserError } from './cdp-bridge' import { normalizeCdpMouseButton, - cdpMouseButtonMask, + cdpPointerButtonMask, cdpMouseModifierMask, resolveMobileTouchClickPoint } from './agent-browser-bridge-mouse' import { acquireElectronDebugger } from './electron-debugger-lease' -import { AgentBrowserBridgeInputCommands } from './agent-browser-bridge-input-commands' +import { AgentBrowserBridgePointerCommands } from './agent-browser-bridge-pointer-commands' -export abstract class AgentBrowserBridgeMouseCommands extends AgentBrowserBridgeInputCommands { +export abstract class AgentBrowserBridgeMouseCommands extends AgentBrowserBridgePointerCommands { // ── Mouse commands ── - async mouseMove( - x: number, - y: number, - worktreeId?: string, - browserPageId?: string - ): Promise { - return this.enqueueTargetedCommand(worktreeId, browserPageId, async (sessionName) => { - return await this.execAgentBrowser(sessionName, ['mouse', 'move', String(x), String(y)]) - }) - } - - async mouseDown(button?: string, worktreeId?: string, browserPageId?: string): Promise { - return this.enqueueTargetedCommand(worktreeId, browserPageId, async (sessionName) => { - const args = ['mouse', 'down'] - if (button) { - args.push(button) - } - return await this.execAgentBrowser(sessionName, args) - }) - } - async mouseClick( x: number, y: number, @@ -54,7 +33,7 @@ export abstract class AgentBrowserBridgeMouseCommands extends AgentBrowserBridge ) } const cdpButton = normalizeCdpMouseButton(button) - const buttons = cdpMouseButtonMask(cdpButton) + const buttons = cdpPointerButtonMask(cdpButton) const cdpModifiers = cdpMouseModifierMask(modifiers) const lease = acquireElectronDebugger(wc) try { @@ -103,31 +82,6 @@ export abstract class AgentBrowserBridgeMouseCommands extends AgentBrowserBridge ) } - async mouseUp(button?: string, worktreeId?: string, browserPageId?: string): Promise { - return this.enqueueTargetedCommand(worktreeId, browserPageId, async (sessionName) => { - const args = ['mouse', 'up'] - if (button) { - args.push(button) - } - return await this.execAgentBrowser(sessionName, args) - }) - } - - async mouseWheel( - dy: number, - dx?: number, - worktreeId?: string, - browserPageId?: string - ): Promise { - return this.enqueueTargetedCommand(worktreeId, browserPageId, async (sessionName) => { - const args = ['mouse', 'wheel', String(dy)] - if (dx != null) { - args.push(String(dx)) - } - return await this.execAgentBrowser(sessionName, args) - }) - } - // ── Find (semantic locators) ── async find( diff --git a/src/main/browser/agent-browser-bridge-mouse.ts b/src/main/browser/agent-browser-bridge-mouse.ts index db2ba55d150..a2119adf12c 100644 --- a/src/main/browser/agent-browser-bridge-mouse.ts +++ b/src/main/browser/agent-browser-bridge-mouse.ts @@ -3,6 +3,21 @@ import type { BrowserMouseModifier } from './agent-browser-bridge-types' type CdpMouseButton = 'left' | 'middle' | 'right' +// Why: bit positions and iteration order are CDP's `buttons` mask, not arbitrary. +const CDP_POINTER_BUTTON_ORDER = ['left', 'right', 'middle', 'back', 'forward'] as const + +// Why: coordinate down/up carries X1/X2 through as real back/forward presses; the +// element-click path below deliberately coerces them to left instead. +export type CdpPointerButton = (typeof CDP_POINTER_BUTTON_ORDER)[number] + +const CDP_POINTER_BUTTON_MASKS = { + left: 1, + right: 2, + middle: 4, + back: 8, + forward: 16 +} as const satisfies Record + type BrowserClickPoint = { x: number y: number @@ -14,14 +29,21 @@ export function normalizeCdpMouseButton(button?: string): CdpMouseButton { return button === 'middle' || button === 'right' ? button : 'left' } -export function cdpMouseButtonMask(button: CdpMouseButton): number { - if (button === 'right') { - return 2 +export function normalizeCdpPointerButton(button?: string): CdpPointerButton { + return button === 'back' || button === 'forward' ? button : normalizeCdpMouseButton(button) +} + +export function cdpPointerButtonMask(button: CdpPointerButton): number { + return CDP_POINTER_BUTTON_MASKS[button] +} + +export function cdpPointerButtonFromMask(buttons: number): CdpPointerButton | 'none' { + for (const button of CDP_POINTER_BUTTON_ORDER) { + if ((buttons & CDP_POINTER_BUTTON_MASKS[button]) !== 0) { + return button + } } - if (button === 'middle') { - return 4 - } - return 1 + return 'none' } export function cdpMouseModifierMask(modifiers: BrowserMouseModifier[] | undefined): number { diff --git a/src/main/browser/agent-browser-bridge-pointer-commands.ts b/src/main/browser/agent-browser-bridge-pointer-commands.ts new file mode 100644 index 00000000000..34b6ac07572 --- /dev/null +++ b/src/main/browser/agent-browser-bridge-pointer-commands.ts @@ -0,0 +1,198 @@ +import type { ResolvedBrowserCommandTarget } from './agent-browser-bridge-types' +import { BrowserError } from './cdp-bridge' +import { normalizeCdpPointerButton } from './agent-browser-bridge-mouse' +import { + assertFinitePointerValues, + cdpPointerStateFor, + pressCdpPointerButton, + releaseCdpPointerButton, + resolveCdpPointerReleaseButton, + type CdpPointerState +} from './cdp-pointer-input' +import { acquireElectronDebugger } from './electron-debugger-lease' +import { AgentBrowserBridgeInputCommands } from './agent-browser-bridge-input-commands' + +type CdpPointerEventParams = { + type: 'mouseMoved' | 'mousePressed' | 'mouseReleased' | 'mouseWheel' + x: number + y: number + button?: string + buttons?: number + clickCount?: number + deltaX?: number + deltaY?: number +} + +/** + * Coordinate pointer input (move/down/up/wheel), dispatched over the Electron debugger. + * + * Element-ref interactions stay on the agent-browser helper because they need its + * accessibility snapshot; these four carry their own coordinates and need nothing from it. + */ +export abstract class AgentBrowserBridgePointerCommands extends AgentBrowserBridgeInputCommands { + // Why: coordinate pointer input needs no accessibility snapshot, so it dispatches over + // the debugger `mouseClick` already uses instead of spawning a helper per event. + private async dispatchPointerEvent( + sessionName: string, + target: ResolvedBrowserCommandTarget, + describe: string, + build: (state: CdpPointerState) => { + params: CdpPointerEventParams + focus?: boolean + result: T + } + ): Promise { + const wc = this.getWebContents(target.webContentsId) + if (!wc || wc.isDestroyed()) { + throw new BrowserError( + 'browser_tab_not_found', + `Browser page ${target.browserPageId} is no longer available` + ) + } + const state = cdpPointerStateFor(wc) + // Why: build() mutates the tracked state before the event is on the wire; a rejected + // dispatch changed nothing in the page, so the pre-dispatch state is what is real — + // keeping the mutation would leave a phantom held button on every later event. + const preDispatch = { ...state } + let releaseDebugger = (): void => {} + try { + releaseDebugger = acquireElectronDebugger(wc).release + const { params, focus, result } = build(state) + if (focus) { + wc.focus() + } + await wc.debugger.sendCommand('Input.dispatchMouseEvent', params) + return result + } catch (error) { + Object.assign(state, preDispatch) + // Why: attach/dispatch reject with plain Errors, which the RPC layer would report as + // runtime_error — the helper path this replaced always produced a browser_* code, and + // the pane only reclaims a dead page when it sees one. + if (error instanceof BrowserError) { + throw error + } + if (!this.getWebContents(target.webContentsId)) { + throw this.createPageUnavailableError(sessionName) + } + throw new BrowserError( + 'browser_error', + `Failed to ${describe} in browser page ${target.browserPageId}: ${error instanceof Error ? error.message : String(error)}` + ) + } finally { + releaseDebugger() + } + } + + async mouseMove( + x: number, + y: number, + worktreeId?: string, + browserPageId?: string + ): Promise { + return this.enqueueTargetedCommand( + worktreeId, + browserPageId, + async (sessionName, target) => + this.dispatchPointerEvent(sessionName, target, 'move the pointer', (state) => { + assertFinitePointerValues({ x, y }) + state.x = x + state.y = y + return { + params: { + type: 'mouseMoved', + x, + y, + button: state.button, + buttons: state.buttons + }, + result: { moved: true } + } + }), + { ensureSession: false } + ) + } + + async mouseDown(button?: string, worktreeId?: string, browserPageId?: string): Promise { + return this.enqueueTargetedCommand( + worktreeId, + browserPageId, + async (sessionName, target) => + this.dispatchPointerEvent(sessionName, target, 'press the pointer', (state) => { + const cdpButton = normalizeCdpPointerButton(button) + pressCdpPointerButton(state, cdpButton) + return { + // Why: mirrors mouseClick — a press that does not focus the guest leaves + // keyboard input going to whatever held focus before. + focus: true, + params: { + type: 'mousePressed', + x: state.x, + y: state.y, + button: cdpButton, + buttons: state.buttons, + clickCount: state.clickCount + }, + result: { pressed: true } + } + }), + { ensureSession: false } + ) + } + + async mouseUp(button?: string, worktreeId?: string, browserPageId?: string): Promise { + return this.enqueueTargetedCommand( + worktreeId, + browserPageId, + async (sessionName, target) => + this.dispatchPointerEvent(sessionName, target, 'release the pointer', (state) => { + const cdpButton = normalizeCdpPointerButton( + button ?? resolveCdpPointerReleaseButton(state) + ) + releaseCdpPointerButton(state, cdpButton) + return { + params: { + type: 'mouseReleased', + x: state.x, + y: state.y, + button: cdpButton, + buttons: state.buttons, + clickCount: state.clickCount + }, + result: { released: true } + } + }), + { ensureSession: false } + ) + } + + async mouseWheel( + dy: number, + dx?: number, + worktreeId?: string, + browserPageId?: string + ): Promise { + return this.enqueueTargetedCommand( + worktreeId, + browserPageId, + async (sessionName, target) => + this.dispatchPointerEvent(sessionName, target, 'scroll', (state) => { + assertFinitePointerValues({ dy, ...(dx == null ? {} : { dx }) }) + const deltaX = dx ?? 0 + return { + // Why: dispatch at the tracked position so the scrollable under the cursor + // scrolls; the helper always dispatched wheel at (0,0). + params: { + type: 'mouseWheel', + x: state.x, + y: state.y, + deltaX, + deltaY: dy, + buttons: state.buttons + }, + result: { scrolled: true, deltaX, deltaY: dy } + } + }), + { ensureSession: false } + ) + } +} diff --git a/src/main/browser/agent-browser-bridge-pointer-input.test.ts b/src/main/browser/agent-browser-bridge-pointer-input.test.ts new file mode 100644 index 00000000000..4e8cdf22123 --- /dev/null +++ b/src/main/browser/agent-browser-bridge-pointer-input.test.ts @@ -0,0 +1,446 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' + +const { execFileMock, webContentsFromIdMock, existsSyncMock, readFileSyncMock, stdinWrites } = + vi.hoisted(() => ({ + execFileMock: vi.fn(), + webContentsFromIdMock: vi.fn(), + existsSyncMock: vi.fn(() => false), + readFileSyncMock: vi.fn(() => Buffer.from('')), + stdinWrites: [] as string[] + })) + +vi.mock('child_process', () => ({ execFile: execFileMock })) +vi.mock('fs', () => ({ + existsSync: existsSyncMock, + readFileSync: readFileSyncMock, + accessSync: vi.fn(), + chmodSync: vi.fn(), + constants: { X_OK: 1 } +})) +vi.mock('os', () => ({ platform: () => 'darwin', arch: () => 'arm64' })) +vi.mock('electron', () => { + return { + app: { + getPath: vi.fn(() => '/app'), + getAppPath: vi.fn(() => '/project'), + isPackaged: false + }, + webContents: { fromId: webContentsFromIdMock } + } +}) +const { CdpWsProxyMock } = vi.hoisted(() => { + const instances: unknown[] = [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const MockClass = vi.fn().mockImplementation(function (this: any, _wc: unknown) { + this._wc = _wc + this.start = vi.fn(async () => 'ws://127.0.0.1:9222') + this.stop = vi.fn(async () => {}) + this.getPort = vi.fn(() => 9222) + instances.push(this) + }) + return { CdpWsProxyMock: Object.assign(MockClass, { instances }) } +}) + +vi.mock('./cdp-ws-proxy', () => ({ + CdpWsProxy: CdpWsProxyMock +})) +vi.mock('./cdp-bridge', () => ({ + BrowserError: class BrowserError extends Error { + code: string + constructor(code: string, message: string) { + super(message) + this.code = code + } + } +})) + +import { AgentBrowserBridge } from './agent-browser-bridge' +import { + mockBrowserManager, + mockWebContents, + overrideBridgeWebContentsLookup, + resetAgentBrowserBridgeMocks +} from './agent-browser-bridge-test-harness' + +overrideBridgeWebContentsLookup(AgentBrowserBridge.prototype, webContentsFromIdMock) + +function recordDispatchedEvents( + wc: ReturnType, + sink: Record[] +): void { + wc.debugger.sendCommand.mockImplementation(async (method, params) => { + if (method === 'Input.dispatchMouseEvent' && typeof params === 'object' && params !== null) { + sink.push({ ...params }) + } + return {} + }) +} + +describe('AgentBrowserBridge coordinate pointer input', () => { + let bridge: AgentBrowserBridge + let wc: ReturnType + let dispatchedEvents: Record[] + + const dispatched = (): Record[] => dispatchedEvents + + beforeEach(() => { + resetAgentBrowserBridgeMocks({ + webContentsFromIdMock, + existsSyncMock, + readFileSyncMock, + stdinWrites, + cdpWsProxyInstances: CdpWsProxyMock.instances + }) + bridge = new AgentBrowserBridge(mockBrowserManager()) + bridge.setActiveTab(100) + wc = mockWebContents(100) + dispatchedEvents = [] + recordDispatchedEvents(wc, dispatchedEvents) + webContentsFromIdMock.mockReturnValue(wc) + }) + + // ── Transport ── + + it('dispatches move, down, up and wheel over CDP without spawning the helper', async () => { + await expect(bridge.mouseMove(10, 20)).resolves.toEqual({ moved: true }) + await expect(bridge.mouseDown('left')).resolves.toEqual({ pressed: true }) + await expect(bridge.mouseUp('left')).resolves.toEqual({ released: true }) + await expect(bridge.mouseWheel(120, 30)).resolves.toEqual({ + scrolled: true, + deltaX: 30, + deltaY: 120 + }) + + expect(execFileMock).not.toHaveBeenCalled() + expect(dispatched()).toHaveLength(4) + }) + + it('sends CDP payloads matching a real pointer press and release', async () => { + await bridge.mouseMove(10, 20) + await bridge.mouseDown('left') + await bridge.mouseUp('left') + + expect(dispatched()).toEqual([ + { type: 'mouseMoved', x: 10, y: 20, button: 'none', buttons: 0 }, + { + type: 'mousePressed', + x: 10, + y: 20, + button: 'left', + buttons: 1, + clickCount: 1 + }, + { + type: 'mouseReleased', + x: 10, + y: 20, + button: 'left', + buttons: 0, + clickCount: 1 + } + ]) + }) + + // ── Position tracking ── + + it('drags from the tracked position while the button stays held', async () => { + await bridge.mouseMove(10, 20) + await bridge.mouseDown('left') + await bridge.mouseMove(60, 80) + + expect(dispatched()[2]).toEqual({ + type: 'mouseMoved', + x: 60, + y: 80, + button: 'left', + buttons: 1 + }) + }) + + it('scrolls at the tracked pointer position, not the origin', async () => { + await bridge.mouseMove(300, 400) + await bridge.mouseWheel(120) + + expect(dispatched()[1]).toEqual({ + type: 'mouseWheel', + x: 300, + y: 400, + deltaX: 0, + deltaY: 120, + buttons: 0 + }) + }) + + it('keeps pointer state per tab', async () => { + const other = mockWebContents(200) + recordDispatchedEvents(other, []) + + await bridge.mouseMove(10, 20) + webContentsFromIdMock.mockReturnValue(other) + await bridge.mouseMove(90, 90) + webContentsFromIdMock.mockReturnValue(wc) + await bridge.mouseDown('left') + + expect(dispatched()[1]).toMatchObject({ + type: 'mousePressed', + x: 10, + y: 20 + }) + }) + + // ── Click cadence ── + + it('escalates clickCount for a repeat press at the same point', async () => { + // Why: real wall-clock makes this flake — a >500ms stall under load resets the cadence. + vi.useFakeTimers() + try { + await bridge.mouseMove(10, 20) + for (let i = 0; i < 4; i += 1) { + await bridge.mouseDown('left') + await bridge.mouseUp('left') + } + } finally { + vi.useRealTimers() + } + + expect( + dispatched() + .filter((event) => event.type === 'mousePressed') + .map((event) => event.clickCount) + ).toEqual([1, 2, 3, 1]) + }) + + it('restarts clickCount when the second press lands elsewhere', async () => { + vi.useFakeTimers() + try { + await bridge.mouseMove(10, 20) + await bridge.mouseDown('left') + await bridge.mouseUp('left') + await bridge.mouseMove(400, 400) + await bridge.mouseDown('left') + } finally { + vi.useRealTimers() + } + + expect(dispatched().at(-1)).toMatchObject({ + type: 'mousePressed', + clickCount: 1 + }) + }) + + it('restarts clickCount when the repeat press uses another button', async () => { + vi.useFakeTimers() + try { + await bridge.mouseMove(10, 20) + await bridge.mouseDown('left') + await bridge.mouseUp('left') + await bridge.mouseDown('right') + } finally { + vi.useRealTimers() + } + + expect(dispatched().at(-1)).toMatchObject({ + type: 'mousePressed', + button: 'right', + clickCount: 1 + }) + }) + + it('restarts clickCount once the repeat lands outside the double-click interval', async () => { + vi.useFakeTimers() + try { + await bridge.mouseMove(10, 20) + await bridge.mouseDown('left') + await bridge.mouseUp('left') + vi.setSystemTime(Date.now() + 501) + await bridge.mouseDown('left') + } finally { + vi.useRealTimers() + } + + expect(dispatched().at(-1)).toMatchObject({ + type: 'mousePressed', + clickCount: 1 + }) + }) + + // ── Buttons mask ── + + it('carries back and forward through as X1 and X2 presses', async () => { + await bridge.mouseDown('back') + await bridge.mouseUp('back') + await bridge.mouseDown('forward') + + expect(dispatched()).toEqual([ + { + type: 'mousePressed', + x: 0, + y: 0, + button: 'back', + buttons: 8, + clickCount: 1 + }, + { + type: 'mouseReleased', + x: 0, + y: 0, + button: 'back', + buttons: 0, + clickCount: 1 + }, + { + type: 'mousePressed', + x: 0, + y: 0, + button: 'forward', + buttons: 16, + clickCount: 1 + } + ]) + }) + + it('releases the held button when mouseUp names none', async () => { + await bridge.mouseDown('right') + await bridge.mouseUp() + + expect(dispatched().at(-1)).toMatchObject({ + type: 'mouseReleased', + button: 'right', + buttons: 0 + }) + }) + + it('keeps the remaining held button addressable after a chorded release', async () => { + await bridge.mouseDown('left') + await bridge.mouseDown('right') + await bridge.mouseUp('right') + await bridge.mouseUp() + + expect(dispatched()[2]).toMatchObject({ + type: 'mouseReleased', + button: 'right', + buttons: 1 + }) + expect(dispatched()[3]).toMatchObject({ + type: 'mouseReleased', + button: 'left', + buttons: 0 + }) + }) + + it('defaults to left when nothing is held and mouseUp names no button', async () => { + await bridge.mouseUp() + + expect(dispatched()[0]).toMatchObject({ + type: 'mouseReleased', + button: 'left', + buttons: 0 + }) + }) + + // ── Failures ── + + it('rejects non-finite coordinates and deltas before dispatching', async () => { + await expect(bridge.mouseMove(Number.NaN, 20)).rejects.toMatchObject({ + code: 'browser_error' + }) + await expect(bridge.mouseWheel(Number.POSITIVE_INFINITY)).rejects.toMatchObject({ + code: 'browser_error' + }) + + expect(dispatched()).toHaveLength(0) + }) + + it('reports a dispatch failure as browser_error on the call that failed', async () => { + wc.debugger.sendCommand.mockRejectedValueOnce(new Error('boom')) + + await expect(bridge.mouseMove(10, 20)).rejects.toMatchObject({ + code: 'browser_error' + }) + }) + + it('reports a page that dies mid-dispatch as browser_tab_not_found', async () => { + wc.debugger.sendCommand.mockImplementation(async () => { + webContentsFromIdMock.mockReturnValue(null) + throw new Error('Debugger is not attached to the target') + }) + + await expect(bridge.mouseDown('left')).rejects.toMatchObject({ + code: 'browser_tab_not_found' + }) + }) + + it('leaves no phantom held button when a press fails to dispatch', async () => { + await bridge.mouseMove(10, 20) + wc.debugger.sendCommand.mockRejectedValueOnce(new Error('boom')) + await expect(bridge.mouseDown('left')).rejects.toThrow() + await bridge.mouseMove(30, 40) + + expect(dispatched().at(-1)).toEqual({ + type: 'mouseMoved', + x: 30, + y: 40, + button: 'none', + buttons: 0 + }) + }) + + it('rewinds the tracked position when a move fails to dispatch', async () => { + await bridge.mouseMove(10, 20) + wc.debugger.sendCommand.mockRejectedValueOnce(new Error('boom')) + await expect(bridge.mouseMove(300, 400)).rejects.toThrow() + await bridge.mouseWheel(120) + + expect(dispatched().at(-1)).toMatchObject({ type: 'mouseWheel', x: 10, y: 20 }) + }) + + it('does not count a failed press toward the double-click cadence', async () => { + await bridge.mouseMove(10, 20) + wc.debugger.sendCommand.mockRejectedValueOnce(new Error('boom')) + await expect(bridge.mouseDown('left')).rejects.toThrow() + await bridge.mouseDown('left') + + expect(dispatched().at(-1)).toMatchObject({ type: 'mousePressed', clickCount: 1 }) + }) + + // ── Lifecycle ── + + it('attaches and detaches the debugger around each dispatch', async () => { + let attached = false + wc.debugger.isAttached.mockImplementation(() => attached) + wc.debugger.attach.mockImplementation(() => { + attached = true + }) + + await bridge.mouseMove(10, 20) + + expect(wc.debugger.attach).toHaveBeenCalledWith('1.3') + expect(wc.debugger.detach).toHaveBeenCalled() + }) + + it('leaves a debugger it did not attach alone', async () => { + await bridge.mouseMove(10, 20) + + expect(wc.debugger.attach).not.toHaveBeenCalled() + expect(wc.debugger.detach).not.toHaveBeenCalled() + }) + + it('focuses the guest on press, as mouseClick does', async () => { + await bridge.mouseDown('left') + + expect(wc.focus).toHaveBeenCalled() + }) + + it('drops empty command queues after pointer commands finish', async () => { + await bridge.mouseMove(10, 20) + await bridge.mouseWheel(120) + + // oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: reads the bridge's own private queue bookkeeping, mirroring agent-browser-bridge-mouse-input.test.ts. + const internals = bridge as unknown as { + commandQueues: Map + processingQueues: Set + } + expect(internals.commandQueues.size).toBe(0) + expect(internals.processingQueues.size).toBe(0) + }) +}) diff --git a/src/main/browser/cdp-pointer-input.ts b/src/main/browser/cdp-pointer-input.ts new file mode 100644 index 00000000000..15af23ad370 --- /dev/null +++ b/src/main/browser/cdp-pointer-input.ts @@ -0,0 +1,92 @@ +import type { WebContents } from 'electron' +import { BrowserError } from './cdp-bridge' +import { + type CdpPointerButton, + cdpPointerButtonMask, + cdpPointerButtonFromMask +} from './agent-browser-bridge-mouse' + +const MULTI_CLICK_INTERVAL_MS = 500 +const MULTI_CLICK_SLOP_PX = 2 + +type LastPointerClick = { + button: CdpPointerButton + x: number + y: number + at: number + count: number +} + +export type CdpPointerState = { + x: number + y: number + button: CdpPointerButton | 'none' + buttons: number + clickCount: number + lastClick: LastPointerClick | null +} + +// Why: keyed by the WebContents so per-tab pointer state can never leak across tabs and +// dies with the tab instead of needing teardown hooks. +const pointerStates = new WeakMap() + +export function cdpPointerStateFor(webContents: WebContents): CdpPointerState { + let state = pointerStates.get(webContents) + if (!state) { + state = { + x: 0, + y: 0, + button: 'none', + buttons: 0, + clickCount: 1, + lastClick: null + } + pointerStates.set(webContents, state) + } + return state +} + +// Why: Chromium only fires dblclick when the second press reports clickCount 2, so a +// repeat at the same spot inside the interval escalates. Cycles 1, 2, 3, 1 like a real mouse. +export function trackCdpClickCount(state: CdpPointerState, button: CdpPointerButton): number { + const now = Date.now() + const previous = state.lastClick + const repeated = + previous !== null && + previous.button === button && + Math.abs(previous.x - state.x) <= MULTI_CLICK_SLOP_PX && + Math.abs(previous.y - state.y) <= MULTI_CLICK_SLOP_PX && + now - previous.at <= MULTI_CLICK_INTERVAL_MS + const count = repeated ? (previous.count >= 3 ? 1 : previous.count + 1) : 1 + state.lastClick = { button, x: state.x, y: state.y, at: now, count } + return count +} + +// Why: the helper rejected a non-finite coordinate outright and silently coerced a +// non-finite wheel delta to 100; CDP would reject with an invalid-params error naming no +// argument. Reject both here so the caller learns which value was bad. +export function assertFinitePointerValues(values: Record): void { + for (const [name, value] of Object.entries(values)) { + if (!Number.isFinite(value)) { + throw new BrowserError('browser_error', `Pointer input requires a finite ${name}`) + } + } +} + +export function pressCdpPointerButton(state: CdpPointerState, button: CdpPointerButton): void { + state.button = button + state.buttons |= cdpPointerButtonMask(button) + state.clickCount = trackCdpClickCount(state, button) +} + +export function releaseCdpPointerButton(state: CdpPointerState, button: CdpPointerButton): void { + state.buttons &= ~cdpPointerButtonMask(button) + // Why: a chorded release leaves the still-held button addressable by a later + // unqualified mouseUp instead of falling back to left. + state.button = cdpPointerButtonFromMask(state.buttons) +} + +// Why: the helper always released left, so a right-button press stayed stuck forever. +export function resolveCdpPointerReleaseButton(state: CdpPointerState): string | undefined { + return state.button === 'none' ? undefined : state.button +} diff --git a/src/main/claude/claude-prompt-journaling.ts b/src/main/claude/claude-prompt-journaling.ts new file mode 100644 index 00000000000..99b163fe197 --- /dev/null +++ b/src/main/claude/claude-prompt-journaling.ts @@ -0,0 +1,46 @@ +// Journaling an approval or question prompt, and remembering the rows it wrote +// so a cancellation can tombstone exactly those. + +import type { AgentJournalItemIdentity } from '../../shared/agent-session-journal-types' +import { agentJournalItemKey } from '../../shared/agent-session-journal-item-key' +import type { StructuredAgentSessionEventSink } from '../native-chat/agent-session-wire/structured-agent-session-event-sink' +import type { ClaudeStructuredSessionEvent } from './claude-structured-session-state' +import { + claudeApprovalItem, + claudePromptIdentity, + claudeQuestionItems +} from './claude-structured-prompt-items' + +export type ClaudePromptJournalDeps = { + sink: StructuredAgentSessionEventSink + bindPromptItemId?: (journalItemId: string, promptKey: string, questionId?: string) => void + /** Prompt key → the rows it wrote, owned by the translator so a cancel can sweep them. */ + promptItems: Map +} + +export function journalClaudePrompt( + deps: ClaudePromptJournalDeps, + event: Extract +): void { + const identities: AgentJournalItemIdentity[] = [] + if (event.prompt.kind === 'question') { + for (const question of claudeQuestionItems({ + sessionId: event.sessionId, + prompt: event.prompt + })) { + identities.push(question.identity) + deps.sink.appendItem(question.identity, question.body) + deps.bindPromptItemId?.(agentJournalItemKey(question.identity), event.prompt.promptKey) + } + } else { + const identity = claudePromptIdentity({ + sessionId: event.sessionId, + promptKey: event.prompt.promptKey + }) + identities.push(identity) + deps.sink.appendItem(identity, claudeApprovalItem(event.prompt)) + deps.bindPromptItemId?.(agentJournalItemKey(identity), event.prompt.promptKey) + } + deps.promptItems.set(event.prompt.promptKey, identities) + deps.sink.publish() +} diff --git a/src/main/claude/claude-structured-journal-translation.test.ts b/src/main/claude/claude-structured-journal-translation.test.ts index 7a8ecf54344..65be68bb05f 100644 --- a/src/main/claude/claude-structured-journal-translation.test.ts +++ b/src/main/claude/claude-structured-journal-translation.test.ts @@ -220,10 +220,15 @@ describe('Claude structured journal translation', () => { for (const event of turn.start) { translator.handle(event) } + expect(lifecycleAppends(state.items)).toEqual([ + ['turn-lifecycle:msg_01-message-start', 'running'] + ]) + expect(assistantMessages(state.items)).toEqual([]) + for (const delta of turn.deltas) { translator.handle(delta) } - expect(state.items).toEqual([]) + expect(assistantMessages(state.items)).toEqual([]) const run = scheduled as (() => void) | null run?.() @@ -568,7 +573,11 @@ describe('Claude structured journal translation', () => { translator.handle(message('assistant', 'assistant-thinking', [{ type: 'thinking', thinking }])) - expect(state.items.at(-1)?.body).toEqual({ + // The frame also opens the turn it produced in, so pick the reasoning row itself. + const reasoning = state.items.find( + (item) => item.body.kind === 'message' && item.body.role === 'reasoning' + ) + expect(reasoning?.body).toEqual({ kind: 'message', role: 'reasoning', blocks: [ diff --git a/src/main/claude/claude-structured-journal-translation.ts b/src/main/claude/claude-structured-journal-translation.ts index 8b71149cba2..702ff5f6b26 100644 --- a/src/main/claude/claude-structured-journal-translation.ts +++ b/src/main/claude/claude-structured-journal-translation.ts @@ -10,7 +10,6 @@ import type { ClaudeStructuredSessionEvent } from './claude-structured-session-s import { claudeMessageBody, claudeMessageIdentity, - claudeHasReplayContent, claudeOutputEnvelope, claudeStreamingMessageBody, claudeThinkingIdentity, @@ -22,15 +21,11 @@ import { readClaudeMessageEnvelope, type ClaudeToolUse } from './claude-structured-item-translation' -import { - claudeApprovalItem, - claudePromptIdentity, - claudeQuestionItems -} from './claude-structured-prompt-items' +import { journalClaudePrompt } from './claude-prompt-journaling' import type { ClaudePromptRegistry } from './claude-structured-prompt-replies' import { claudeProviderFrameActivity } from '../native-chat/agent-session-wire/provider-frame-activity' import { - appendUnmodeledClaudeContent, + appendUnmodeledContent, claudeProviderFrameKind, claudeResultFailure, createClaudeProviderFrameFallback, @@ -39,6 +34,14 @@ import { import { ClaudeSubagentRoster } from './claude-subagent-roster' import { createClaudeStreamedBlockRegistry } from './claude-streamed-block-identity' import { createClaudeStreamedTextCheckpoints } from './claude-streamed-text-checkpoints' +import { + claudeStreamTurnStartSource, + claudeStreamTurnSource, + claudeTurnOpenedBySendEcho, + createClaudeTurnOpener, + isRootClaudeFrame, + type ClaudeTurnSource +} from './claude-turn-opening' import { claudeTurnEndForResult, claudeTurnLifecycleItem, @@ -84,6 +87,10 @@ export function createClaudeJournalTranslator( const promptItems = new Map() const streamedBlocks = createClaudeStreamedBlockRegistry() let currentTurn: ClaudeCurrentTurn | null = null + /** Provider output may not reopen a turn after the session ended or a turn + * failed: nothing would ever close the turn it opened, and the row would read + * working for the life of the session. Only an accepted send lifts it. */ + let reopenSuppressed = false const groupKeyOf = (turn: ClaudeCurrentTurn | null): string | null => turn ? `${turn.sessionId}:${turn.turnId}` : null const providerFallback = createClaudeProviderFrameFallback( @@ -110,6 +117,28 @@ export function createClaudeJournalTranslator( deps.sink.publish({ coalescingKey: item.publishCoalescingKey }) } + /** Open a turn, ending whichever one was still open. A new turn starting is the + * only end the previous one gets when its result never arrives; settling it + * later would sweep THIS turn. */ + const openTurn = (turn: ClaudeCurrentTurn, observedAt: number): void => { + if (currentTurn) { + subagents.settleTurn(groupKeyOf(currentTurn)) + publishLifecycle(currentTurn, { state: 'interrupted', completedAt: observedAt }) + } + currentTurn = turn + publishLifecycle(turn) + deps.sink.setActivity?.(null) + } + + /** The provider produced, so a turn is running. Idempotent: every frame of one + * reply stays inside the turn its first frame opened. A subagent's output is + * its parent turn's work and never a turn of its own. */ + const ensureTurnOpen = createClaudeTurnOpener({ + isTurnOpen: () => currentTurn !== null, + isSuppressed: () => reopenSuppressed, + open: openTurn + }) + const publishActivity = (kind: string, payload: unknown): void => { if (!currentTurn) { return @@ -120,8 +149,12 @@ export function createClaudeJournalTranslator( } } - const handleStream = (message: Record): boolean => { + const handleStream = (message: Record, observedAt: number): boolean => { const delta = streamedBlocks.observe(message) + // `message_start` is the provider's turn boundary. Keep the first text + // delta as a compatibility fallback for streams that omit it. + const source = delta ? claudeStreamTurnSource(message) : claudeStreamTurnStartSource(message) + ensureTurnOpen(message, source, observedAt) if (!delta) { return false } @@ -149,11 +182,23 @@ export function createClaudeJournalTranslator( (body && envelope.role === 'assistant' ? streamedBlocks.reconcile(envelope) : null) ?? claudeMessageIdentity(envelope) streamedText.forget(agentJournalItemKey(identity)) + const thinking = claudeThinkingText(outputEnvelope) + const source: ClaudeTurnSource = { + sessionId: envelope.sessionId, + uuid: envelope.uuid, + assistant: envelope.role === 'assistant' + } + const openOutputTurn = (): void => ensureTurnOpen(message, source, observedAt) if (body) { + // Opening before the append is what brackets a turn around its own first + // output; a reader that scans back to the turn record and stops would + // otherwise look straight past the row that opened it. + ensureTurnOpen(message, source, observedAt) deps.sink.appendItem(identity, body) changed = true } for (const tool of claudeToolUses(outputEnvelope)) { + ensureTurnOpen(message, source, observedAt) tools.set(tool.id, tool) deps.sink.appendItem( claudeToolIdentity(envelope.sessionId, tool.id), @@ -177,8 +222,8 @@ export function createClaudeJournalTranslator( tools.delete(result.toolUseId) changed = true } - const thinking = claudeThinkingText(outputEnvelope) if (thinking) { + ensureTurnOpen(message, source, observedAt) deps.sink.appendItem(claudeThinkingIdentity(envelope.sessionId, envelope.uuid), { kind: 'message', role: 'reasoning', @@ -188,28 +233,19 @@ export function createClaudeJournalTranslator( }) changed = true } - changed = appendUnmodeledClaudeContent(providerFallback, outputEnvelope, message) || changed - if ( - envelope.role === 'user' && - startsTurn && - claudeHasReplayContent(envelope) && - message.parent_tool_use_id === null - ) { - if (currentTurn) { - // A new turn starting is the only end the previous one gets when its - // result never arrives; settling it later would sweep THIS turn. - subagents.settleTurn(groupKeyOf(currentTurn)) - publishLifecycle(currentTurn, { state: 'interrupted', completedAt: observedAt }) - } - currentTurn = { - sessionId: envelope.sessionId, - turnId: envelope.uuid, - startedAt: observedAt, - // A user echo lands on its own message identity, so this is the user row's key. - userItemId: agentJournalItemKey(identity) - } - publishLifecycle(currentTurn) - deps.sink.setActivity?.(null) + changed = + appendUnmodeledContent(providerFallback, outputEnvelope, message, openOutputTurn) || changed + // The send's turn is anchored to the user row journaled just above it. + const sendEchoTurn = claudeTurnOpenedBySendEcho({ + envelope, + frame: message, + startsTurn, + observedAt, + userItemId: agentJournalItemKey(identity) + }) + if (sendEchoTurn) { + reopenSuppressed = false + openTurn(sendEchoTurn, observedAt) } if (changed) { deps.sink.publish() @@ -217,30 +253,6 @@ export function createClaudeJournalTranslator( return true } - const handlePrompt = (event: Extract): void => { - const identities: AgentJournalItemIdentity[] = [] - if (event.prompt.kind === 'question') { - for (const question of claudeQuestionItems({ - sessionId: event.sessionId, - prompt: event.prompt - })) { - identities.push(question.identity) - deps.sink.appendItem(question.identity, question.body) - deps.bindPromptItemId?.(agentJournalItemKey(question.identity), event.prompt.promptKey) - } - } else { - const identity = claudePromptIdentity({ - sessionId: event.sessionId, - promptKey: event.prompt.promptKey - }) - identities.push(identity) - deps.sink.appendItem(identity, claudeApprovalItem(event.prompt)) - deps.bindPromptItemId?.(agentJournalItemKey(identity), event.prompt.promptKey) - } - promptItems.set(event.prompt.promptKey, identities) - deps.sink.publish() - } - return { handle: (event) => { if (event.type === 'ended') { @@ -255,15 +267,18 @@ export function createClaudeJournalTranslator( }) currentTurn = null } + // A frame that arrives after the child is gone must not open a turn no + // event can close. + reopenSuppressed = true deps.sink.setActivity?.(null) return } - if (event.type === 'message' && handleStream(event.message)) { + if (event.type === 'message' && handleStream(event.message, event.observedAt ?? Date.now())) { return } streamedText.flush() if (event.type === 'prompt') { - handlePrompt(event) + journalClaudePrompt({ ...deps, promptItems }, event) } else if (event.type === 'prompt-cancelled') { for (const identity of promptItems.get(event.promptKey) ?? []) { deps.sink.appendTombstone(identity) @@ -271,22 +286,33 @@ export function createClaudeJournalTranslator( promptItems.delete(event.promptKey) deps.sink.publish() } else if (event.type === 'message' && event.message.type === 'result') { - // The turn is over however it ended, so a foreground child still - // reported as working will never be settled by an event. - subagents.settleTurn(groupKeyOf(currentTurn)) - if (currentTurn) { - publishLifecycle( - currentTurn, - claudeTurnEndForResult(event.message, event.observedAt ?? Date.now()) - ) - currentTurn = null + // Every turn this translator opens is root by construction, so a nested + // result settles the child that produced it and never the turn. The + // diagnostic below still runs: a child's failure is reportable even when + // it ends no turn. + const settlesTurn = isRootClaudeFrame(event.message) + if (settlesTurn) { + // The turn is over however it ended, so a foreground child still + // reported as working will never be settled by an event. + // A turn that failed, or that the user stopped, is not resumed by + // whatever the provider says next; the next send is what resumes it. + // The latch only ever sets here; an accepted send is what lifts it. + reopenSuppressed ||= event.message.is_error === true + subagents.settleTurn(groupKeyOf(currentTurn)) + if (currentTurn) { + publishLifecycle( + currentTurn, + claudeTurnEndForResult(event.message, event.observedAt ?? Date.now()) + ) + currentTurn = null + } + deps.sink.setActivity?.(null) + // The turn is over. A block still awaiting its final keeps the text the + // flush above journaled, but its live state goes: an interrupted turn + // would otherwise retain that text for the life of the session. + streamedBlocks.clear() + streamedText.settle() } - deps.sink.setActivity?.(null) - // The turn is over. A block still awaiting its final keeps the text the - // flush above journaled, but its live state goes: an interrupted turn - // would otherwise retain that text for the life of the session. - streamedBlocks.clear() - streamedText.settle() const kind = claudeProviderFrameKind(event.message) // Ordinary turn bookkeeping stays suppressed; a reported failure never does. const failure = claudeResultFailure(event.message) diff --git a/src/main/claude/claude-structured-provider-fallback.ts b/src/main/claude/claude-structured-provider-fallback.ts index 68aec07976b..167ab37ce98 100644 --- a/src/main/claude/claude-structured-provider-fallback.ts +++ b/src/main/claude/claude-structured-provider-fallback.ts @@ -106,16 +106,22 @@ export function createClaudeProviderFrameFallback( acquisitionId: string ): { /** `displayText` leads the row when Claude knows the sentence the frame itself does not name. */ - append: (kind: string, payload: unknown, displayText?: string | null) => void + append: ( + kind: string, + payload: unknown, + displayText?: string | null, + beforeAppend?: () => void + ) => boolean } { let sequence = 0 return { - append: (kind, payload, displayText) => { + append: (kind, payload, displayText, beforeAppend) => { sequence += 1 const translated = unhandledProviderFrameJournalItem('claude', kind, payload) if (!translated) { - return + return false } + beforeAppend?.() const bounded = displayText ? boundInlineText(displayText, DEFAULT_JOURNAL_PAYLOAD_LIMITS).text : null @@ -127,6 +133,7 @@ export function createClaudeProviderFrameFallback( bounded ? { ...translated.body, text: bounded } : translated.body ) sink.publish() + return true } } } @@ -136,24 +143,27 @@ export type ClaudeProviderFrameFallback = ReturnType + message: Record, + beforeAppend: () => void ): boolean { let changed = false for (const part of envelope.content.filter((part) => !isModeledClaudeContent(part))) { const partType = claudeText(claudeRecord(part)?.type) ?? 'unknown' - fallback.append( - `message:${envelope.role}:content:${partType}`, - part, - readableProviderFrameText(part) ?? CLAUDE_UNRENDERABLE_CONTENT_TEXT - ) - changed = true + changed = + fallback.append( + `message:${envelope.role}:content:${partType}`, + part, + readableProviderFrameText(part) ?? CLAUDE_UNRENDERABLE_CONTENT_TEXT, + beforeAppend + ) || changed } if (envelope.content.length === 0 && envelope.role === 'assistant') { - fallback.append(`message:${envelope.role}:empty`, message) - changed = true + // Empty provider placeholders do not prove work began, and may have no + // later result capable of closing a turn. + changed = fallback.append(`message:${envelope.role}:empty`, message) || changed } return changed } diff --git a/src/main/claude/claude-turn-lifecycle-item.ts b/src/main/claude/claude-turn-lifecycle-item.ts index 00d7c4dd65e..664a06f0898 100644 --- a/src/main/claude/claude-turn-lifecycle-item.ts +++ b/src/main/claude/claude-turn-lifecycle-item.ts @@ -2,6 +2,7 @@ import type { AgentJournalItemIdentity, AgentJournalTurnItem } from '../../shared/agent-session-journal-types' +import { agentJournalItemKey } from '../../shared/agent-session-journal-item-key' import { agentJournalTurnBody } from '../../shared/agent-session-turn-record' import type { StructuredAgentSessionAppendOptions } from '../native-chat/agent-session-wire/structured-agent-session-event-sink' import { claudeText } from './claude-structured-item-translation' @@ -10,7 +11,8 @@ export type ClaudeCurrentTurn = { sessionId: string turnId: string startedAt: number - /** Provider key of the user echo that opened the turn. */ + /** Provider key of the user echo, or the lifecycle row itself when provider + * output opened a turn with no user row to receive its timing. */ userItemId: string } @@ -50,6 +52,12 @@ export function claudeTurnLifecycleIdentity( } } +/** Keep provider-resumed timing off the preceding prompt on clients that treat + * a missing user key as an older-host lifecycle row. */ +export function claudeProviderResumedTurnTimingAnchor(sessionId: string, turnId: string): string { + return agentJournalItemKey(claudeTurnLifecycleIdentity(sessionId, turnId)) +} + /** The lifecycle row is revised to its terminal state, never tombstoned, so the * turn's host-clock endpoints outlive the turn. */ export function claudeTurnLifecycleItem( diff --git a/src/main/claude/claude-turn-opening.ts b/src/main/claude/claude-turn-opening.ts new file mode 100644 index 00000000000..9b4be37eb8e --- /dev/null +++ b/src/main/claude/claude-turn-opening.ts @@ -0,0 +1,104 @@ +// Whether Orca's own send echo opens a turn. +// +// The provider's own output opens one too — see `ensureTurnOpen` in the +// translator, which the content sites call as they journal. Orca's turn used to +// open only here, while any `result` frame closed it, and that asymmetry is what +// leaves a working session reading idle: the provider resumes on its own when a +// background task reports in and wakes the agent, and nothing Orca sent ever +// arrives to reopen a turn. + +import { + claudeHasReplayContent, + claudeRecord, + claudeText, + type ClaudeMessageEnvelope +} from './claude-structured-item-translation' +import { + claudeProviderResumedTurnTimingAnchor, + type ClaudeCurrentTurn +} from './claude-turn-lifecycle-item' + +export type ClaudeSendEchoTurnInput = { + envelope: ClaudeMessageEnvelope + /** The raw frame: an absent `parent_tool_use_id` is not the same claim as an + * explicit `null`, and only a root frame carries a root turn. */ + frame: Record + /** Orca dispatched this send and the provider is replaying it back. */ + startsTurn: boolean + observedAt: number + /** Provider key of the user row this turn is anchored to. */ + userItemId: string +} + +/** The turn a replayed send echo opens, or null when this frame is not one. */ +export function claudeTurnOpenedBySendEcho( + input: ClaudeSendEchoTurnInput +): ClaudeCurrentTurn | null { + const { envelope } = input + return envelope.role === 'user' && + input.startsTurn && + claudeHasReplayContent(envelope) && + input.frame.parent_tool_use_id === null + ? { + sessionId: envelope.sessionId, + turnId: envelope.uuid, + startedAt: input.observedAt, + userItemId: input.userItemId + } + : null +} + +/** Whether a frame is the root turn's own, rather than a child's. An absent + * `parent_tool_use_id` is a root frame: only a string names a parent, and a + * build that omits the field on root frames must not silently stop opening + * turns. */ +export function isRootClaudeFrame(frame: Record): boolean { + return typeof frame.parent_tool_use_id !== 'string' +} + +export type ClaudeTurnSource = { sessionId: string; uuid: string; assistant: boolean } + +/** Reads a turn source off a raw frame, for the streamed path that has no envelope. */ +export function claudeStreamTurnSource(frame: Record): ClaudeTurnSource | null { + const sessionId = claudeText(frame.session_id) + const uuid = claudeText(frame.uuid) + // A streamed delta only ever carries model output. + return sessionId && uuid ? { sessionId, uuid, assistant: true } : null +} + +/** A streamed assistant message has begun, before its first content delta. */ +export function claudeStreamTurnStartSource( + frame: Record +): ClaudeTurnSource | null { + const event = claudeRecord(frame.event) + return frame.type === 'stream_event' && event?.type === 'message_start' + ? claudeStreamTurnSource(frame) + : null +} + +/** The provider produced, so a turn is running. Root-ness first, then the + * suppression latch, then idempotency — every frame of one reply stays inside + * the turn its first frame opened. */ +export function createClaudeTurnOpener(deps: { + isTurnOpen: () => boolean + isSuppressed: () => boolean + open: (turn: ClaudeCurrentTurn, observedAt: number) => void +}): (frame: Record, source: ClaudeTurnSource | null, observedAt: number) => void { + return (frame, source, observedAt) => { + if (!source?.assistant || !isRootClaudeFrame(frame)) { + return + } + if (deps.isSuppressed() || deps.isTurnOpen()) { + return + } + deps.open( + { + sessionId: source.sessionId, + turnId: source.uuid, + startedAt: observedAt, + userItemId: claudeProviderResumedTurnTimingAnchor(source.sessionId, source.uuid) + }, + observedAt + ) + } +} diff --git a/src/main/claude/claude-turn-resumption.test.ts b/src/main/claude/claude-turn-resumption.test.ts new file mode 100644 index 00000000000..96d364f91a5 --- /dev/null +++ b/src/main/claude/claude-turn-resumption.test.ts @@ -0,0 +1,428 @@ +// Regression for a structured Claude session that reported idle while it was +// working. Reproduced from the journal of the reported session +// (962e6f25…/epoch 3d214e6f…, 2026-09-13): a `result` settled the turn at +// 13:56:06, a background task reported in at 13:58:59, and the agent then ran +// tool calls until 14:05:18 — nine minutes in which the shared projector, and +// so the sidebar row and the chat indicator, read `idle`. + +import { describe, expect, it, vi } from 'vitest' +import type { + AgentJournalItemBody, + AgentJournalItemIdentity, + AgentJournalRenderItem +} from '../../shared/agent-session-journal-types' +import { agentJournalItemKey } from '../../shared/agent-session-journal-item-key' +import { + legacyAgentJournalTurnStatusBody, + readAgentJournalTurn +} from '../../shared/agent-session-turn-record' +import { selectStructuredAgentSettledTurns } from '../../shared/structured-agent-session-turn-timing' +import { + hasUnansweredStructuredAgentSessionDispatch, + projectStructuredAgentSessionStatus, + projectStructuredAgentSessionStatusSummary +} from '../../shared/structured-agent-session-projection' +import { activeStructuredAgentSessionToolCall } from '../../shared/structured-agent-session-live-turn' +import type { StructuredAgentSessionEventSink } from '../native-chat/agent-session-wire/structured-agent-session-event-sink' +import { createClaudeJournalTranslator } from './claude-structured-journal-translation' + +const SESSION = 'claude-session' + +function harness() { + const appended: { identity: AgentJournalItemIdentity; body: AgentJournalItemBody }[] = [] + const sink: StructuredAgentSessionEventSink = { + appendItem: (identity, body) => appended.push({ identity, body }), + appendTombstone: () => {}, + publish: vi.fn() + } + const translator = createClaudeJournalTranslator({ sink, fallbackIdPrefix: 'test' }) + // The reducer keys items by identity and orders them by first append, so the + // render list the projector reads is the deduplicated append order. + const items = (): AgentJournalRenderItem[] => { + const byKey = new Map() + appended.forEach(({ identity, body }, index) => { + const key = agentJournalItemKey(identity) + const existing = byKey.get(key) + byKey.set(key, { + itemId: key, + revision: (existing?.revision ?? 0) + 1, + body, + sequence: existing?.sequence ?? index, + observedAt: index + }) + }) + return [...byKey.values()].sort((a, b) => a.sequence - b.sequence) + } + return { translator, items, appended } +} + +function frame( + type: 'assistant' | 'user', + uuid: string, + content: unknown[], + parentToolUseId: string | null = null +) { + return { + type: 'message' as const, + sessionId: 'orca-session', + ...(type === 'user' && parentToolUseId === null ? { startsTurn: true as const } : {}), + message: { + type, + uuid, + session_id: SESSION, + parent_tool_use_id: parentToolUseId, + message: { role: type, content } + } + } +} + +/** The captured `task-notification` wake-up: a main-thread user frame Orca never + * dispatched, so it carries no replay waiter and cannot start a turn. */ +function taskNotification(uuid: string) { + return { + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'user', + uuid, + session_id: SESSION, + parent_tool_use_id: null, + message: { + role: 'user', + content: [{ type: 'text', text: 'bfnmj08v6' }] + } + } + } +} + +/** A partial-message text delta. `--include-partial-messages` is a pinned launch + * contract, so this is the shape a resumed turn's first output usually takes. */ +function textDelta(uuid: string, messageId: string, text: string) { + return { + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'stream_event', + uuid, + session_id: SESSION, + parent_tool_use_id: null, + event: { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } }, + message: { id: messageId } + } + } +} + +function streamMessageStart(uuid: string, parentToolUseId: string | null = null) { + return { + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'stream_event', + uuid, + session_id: SESSION, + parent_tool_use_id: parentToolUseId, + event: { type: 'message_start', message: { id: `msg-${uuid}`, role: 'assistant' } } + } + } +} + +function result(uuid: string, parentToolUseId: string | null = null, durationMs = 322_937) { + return { + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'result', + subtype: 'success', + uuid, + session_id: SESSION, + parent_tool_use_id: parentToolUseId, + duration_ms: durationMs + } + } +} + +function projected(items: readonly AgentJournalRenderItem[]): string { + // No submission is outstanding: the send was acknowledged long ago, which is + // exactly the state in which the reported session fell back to idle. + expect(hasUnansweredStructuredAgentSessionDispatch([], null)).toBe(false) + return projectStructuredAgentSessionStatus(items, [], null) +} + +describe('a Claude turn the provider resumed on its own', () => { + it('reports working while the agent runs tool calls after a result settled the turn', () => { + const { translator, items } = harness() + + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + expect(projected(items())).toBe('working') + + translator.handle(result('r1')) + // The agent really did stop here, so idle is correct. + expect(projected(items())).toBe('idle') + + // A background task reports in and wakes the agent; it starts working again. + translator.handle(taskNotification('n1')) + translator.handle(frame('assistant', 'a1', [{ type: 'text', text: 'Back on it.' }])) + expect(projected(items())).toBe('working') + + translator.handle( + frame('assistant', 'a2', [ + { type: 'tool_use', id: 'toolu_1', name: 'Bash', input: { command: 'rg foo' } } + ]) + ) + expect(projected(items())).toBe('working') + + // The next result settles the turn the provider opened, so nothing over-claims. + translator.handle(result('r2')) + expect(projected(items())).toBe('idle') + }) + + it('gives the resumed turn its own record, anchored away from the preceding user row', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(result('r1')) + translator.handle(frame('assistant', 'a1', [{ type: 'text', text: 'Back on it.' }])) + + const turns = items().flatMap((item) => { + const turn = readAgentJournalTurn(item.body) + return turn ? [turn] : [] + }) + expect(turns.map((turn) => turn.state)).toEqual(['completed', 'running']) + expect(turns[1]?.turnId).toBe('a1') + expect(turns[1]?.userItemId).toBe('legacy:claude:claude-session:turn-lifecycle%3Aa1') + }) + + it('does not replace the preceding prompt timing with provider-resumed work', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(result('r1', null, 1_000)) + translator.handle(frame('assistant', 'a1', [{ type: 'text', text: 'Back on it.' }])) + translator.handle(result('r2', null, 9_000)) + + const translatedItems = items() + const originalTurn = translatedItems + .map((item) => readAgentJournalTurn(item.body)) + .find((turn) => turn?.turnId === 'u1') + expect(originalTurn?.userItemId).toBeDefined() + if (!originalTurn?.userItemId) { + throw new Error('expected the original turn to name its user row') + } + const userItem: AgentJournalRenderItem = { + itemId: originalTurn.userItemId, + revision: 1, + sequence: -1, + observedAt: 0, + body: { kind: 'message', role: 'user', blocks: [{ type: 'text', text: 'go' }] } + } + const currentItems = [userItem, ...translatedItems] + expect(selectStructuredAgentSettledTurns(currentItems).get(userItem.itemId)).toMatchObject({ + workedSeconds: 1 + }) + + const legacyItems = currentItems.map((item) => { + const turn = readAgentJournalTurn(item.body) + return item.body.kind === 'turn' && turn + ? { ...item, body: legacyAgentJournalTurnStatusBody(turn, item.itemId) } + : item + }) + expect(selectStructuredAgentSettledTurns(legacyItems).get(userItem.itemId)).toMatchObject({ + workedSeconds: 1 + }) + }) + + it('leaves a settled turn settled when only a subagent is still producing', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(result('r1')) + + // Children outlive the turn that spawned them; their streams are not a turn. + translator.handle(streamMessageStart('child-start', 'toolu_parent')) + expect(projected(items())).toBe('idle') + }) + + it('does not reopen a turn that is already running', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a1', [{ type: 'text', text: 'one' }])) + translator.handle(frame('assistant', 'a2', [{ type: 'text', text: 'two' }])) + + const running = items().filter((item) => readAgentJournalTurn(item.body)?.state === 'running') + expect(running).toHaveLength(1) + expect(readAgentJournalTurn(running[0]!.body)?.turnId).toBe('u1') + expect(projected(items())).toBe('working') + }) + + it('reports the first tool call of a resumed turn as the live tool', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + // A real first turn leaves prose behind, which is what makes the session listable. + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'Launched it.' }])) + translator.handle(result('r1')) + + // The provider resumes straight into a tool call, with no prose first. The + // turn has to bracket its own first output or every reader that stops at the + // turn record looks straight past it. + translator.handle( + frame('assistant', 'a1', [ + { type: 'tool_use', id: 'toolu_1', name: 'Bash', input: { command: 'rg foo' } } + ]) + ) + + expect(projected(items())).toBe('working') + expect(activeStructuredAgentSessionToolCall(items())?.name).toBe('Bash') + expect(projectStructuredAgentSessionStatusSummary(items(), [], null).toolName).toBe('Bash') + }) + + it('leaves the turn running when a nested result settles a child', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'working on it' }])) + + // A child's result ends the child, not the turn that spawned it. No real + // stream has been observed carrying one; this holds the symmetry with the + // open path, which already refuses to open a turn from nested output. + translator.handle(result('r-child', 'toolu_parent')) + expect(projected(items())).toBe('working') + + translator.handle(result('r-root')) + expect(projected(items())).toBe('idle') + }) + + it('never opens a turn from a frame that arrives after the session ended', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'on it' }])) + translator.handle({ type: 'ended', sessionId: 'orca-session', reason: 'exit', observedAt: 1 }) + expect(projected(items())).toBe('idle') + + // Nothing can close a turn opened now, so nothing may open one. + translator.handle(streamMessageStart('late-start')) + expect(projected(items())).toBe('idle') + }) + + it('does not let provider chatter resume a turn the provider failed', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'on it' }])) + translator.handle({ + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'result', + subtype: 'error', + uuid: 'r-fail', + session_id: SESSION, + parent_tool_use_id: null, + is_error: true + } + }) + expect(projected(items())).toBe('idle') + + translator.handle(frame('assistant', 'a1', [{ type: 'text', text: 'still talking' }])) + expect(projected(items())).toBe('idle') + + // The next accepted send is what resumes it. + translator.handle(frame('user', 'u2', [{ type: 'text', text: 'again' }])) + expect(projected(items())).toBe('working') + }) + + it('reports working from the first streamed delta of a resumed turn', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'on it' }])) + translator.handle(result('r1')) + expect(projected(items())).toBe('idle') + + // The resumed reply streams in before any whole assistant frame lands. + translator.handle(textDelta('d1', 'msg-1', 'Back ')) + translator.handle(textDelta('d2', 'msg-1', 'on it.')) + expect(projected(items())).toBe('working') + }) + + it('opens before a resumed stream produces its first content delta', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(result('r1')) + + translator.handle(streamMessageStart('message-start-1')) + + expect(projected(items())).toBe('working') + expect(readAgentJournalTurn(items().at(-1)?.body)?.turnId).toBe('message-start-1') + expect(items().some((item) => item.body.kind === 'status')).toBe(false) + }) + + it('opens before journaling substantive fallback output', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(result('r1')) + + translator.handle( + frame('assistant', 'a1', [{ type: 'future_content', message: 'new provider output' }]) + ) + + const resumed = items().slice(-2) + expect(readAgentJournalTurn(resumed[0]?.body)?.state).toBe('running') + expect(resumed[1]?.body).toMatchObject({ + kind: 'status', + providerFrame: { kind: 'message:assistant:content:future_content' } + }) + expect(projected(items())).toBe('working') + }) + + it('does not open a turn for an empty assistant placeholder', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(result('r1')) + + translator.handle(frame('assistant', 'empty-1', [])) + + expect(projected(items())).toBe('idle') + expect(items().at(-1)?.body).toMatchObject({ + kind: 'status', + providerFrame: { kind: 'message:assistant:empty' } + }) + }) + + it('still reports a nested result failure even though it settles no turn', () => { + const { translator, items, appended } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'on it' }])) + const before = appended.length + translator.handle({ + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'result', + subtype: 'error', + uuid: 'r-child-fail', + session_id: SESSION, + parent_tool_use_id: 'toolu_parent', + is_error: true, + result: 'child blew up' + } + }) + expect(projected(items())).toBe('working') + expect(appended.length).toBeGreaterThan(before) + }) + + it('keeps the failure latch set when a later root result succeeds', () => { + const { translator, items } = harness() + translator.handle(frame('user', 'u1', [{ type: 'text', text: 'go' }])) + translator.handle(frame('assistant', 'a0', [{ type: 'text', text: 'on it' }])) + translator.handle({ + type: 'message' as const, + sessionId: 'orca-session', + message: { + type: 'result', + subtype: 'error', + uuid: 'r-fail', + session_id: SESSION, + parent_tool_use_id: null, + is_error: true + } + }) + // A clean result arriving afterwards must not lift the latch. + translator.handle(result('r-late-ok')) + translator.handle(frame('assistant', 'a1', [{ type: 'text', text: 'still talking' }])) + expect(projected(items())).toBe('idle') + }) +}) diff --git a/src/main/codex/codex-structured-journal-settlement.ts b/src/main/codex/codex-structured-journal-settlement.ts index 5785b273e92..5aa158fafc7 100644 --- a/src/main/codex/codex-structured-journal-settlement.ts +++ b/src/main/codex/codex-structured-journal-settlement.ts @@ -9,10 +9,7 @@ import type { StructuredAgentSessionEventSink, StructuredAgentSessionSinkAdmission } from '../native-chat/agent-session-wire/structured-agent-session-event-sink' -import { - boundJournalStatusText, - cancelledJournalPromptBody -} from '../native-chat/agent-session-journal/journal-prompt-body-bounds' +import { cancelledJournalPromptBody } from '../native-chat/agent-session-journal/journal-prompt-body-bounds' import { codexJournalItem, codexStreamingJournalItem, @@ -75,16 +72,6 @@ export function settleCodexJournalSession(input: { }) } } - if (!('cause' in input.event) || input.event.cause === 'unexpected-exit') { - mutations.push({ - kind: 'item', - identity: { provider: 'orca', clientMessageId: exitSettlementId(input.event) }, - body: { - kind: 'status', - text: boundJournalStatusText(`Provider exited: ${input.event.reason}`) - } - }) - } for (const [threadId, turnIds] of input.currentTurnIds) { if (input.primaryThreadId !== threadId) { continue diff --git a/src/main/codex/codex-structured-journal-translation-settlement.test.ts b/src/main/codex/codex-structured-journal-translation-settlement.test.ts index b5e60699ce1..ab0e602e955 100644 --- a/src/main/codex/codex-structured-journal-translation-settlement.test.ts +++ b/src/main/codex/codex-structured-journal-translation-settlement.test.ts @@ -270,7 +270,6 @@ describe('codex journal translation', () => { kind: 'approval', resolution: expect.objectContaining({ state: 'cancelled' }) }), - { kind: 'status', text: 'Provider exited: lost child' }, expect.objectContaining({ kind: 'turn', turnId: TURN_ID, state: 'interrupted' }) ]) expect(publishes).toHaveLength(2) @@ -342,9 +341,6 @@ describe('codex journal translation', () => { resolution: expect.objectContaining({ state: 'cancelled' }) }) }), - expect.objectContaining({ - body: { kind: 'status', text: 'Provider exited: lost child' } - }), expect.objectContaining({ kind: 'item', body: expect.objectContaining({ kind: 'turn', turnId: TURN_ID, state: 'interrupted' }) @@ -416,11 +412,7 @@ describe('codex journal translation', () => { `provider-exit:${SESSION_ID}:7:generation-1:${index + 1}/${batches.length}` ) ) - expect(flattened).toHaveLength(122) - expect(flattened.at(-2)).toMatchObject({ - kind: 'item', - body: { kind: 'status', text: 'Provider exited: lost child' } - }) + expect(flattened).toHaveLength(121) expect(flattened.at(-1)).toMatchObject({ kind: 'item', body: { kind: 'turn', state: 'interrupted' } diff --git a/src/main/codex/codex-structured-journal-translation.test.ts b/src/main/codex/codex-structured-journal-translation.test.ts index 7e2b2f45bea..443d61a8e27 100644 --- a/src/main/codex/codex-structured-journal-translation.test.ts +++ b/src/main/codex/codex-structured-journal-translation.test.ts @@ -268,7 +268,6 @@ describe('codex journal translation', () => { expect(tap.rows.map((row) => row.body)).toEqual([ expect.objectContaining({ kind: 'turn', turnId: 'turn-stale', state: 'running' }), expect.objectContaining({ kind: 'turn', turnId: 'turn-later', state: 'running' }), - expect.objectContaining({ text: 'Provider exited: app-server exited' }), expect.objectContaining({ kind: 'turn', turnId: 'turn-stale', state: 'interrupted' }), expect.objectContaining({ kind: 'turn', turnId: 'turn-later', state: 'interrupted' }) ]) @@ -440,14 +439,13 @@ describe('codex journal translation', () => { expect(tap.rows.map((row) => row.body)).toEqual( expect.arrayContaining([ - expect.objectContaining({ blocks: [{ type: 'text', text: 'half' }] }), - { kind: 'status', text: 'Provider exited: app-server exited' } + expect.objectContaining({ blocks: [{ type: 'text', text: 'half' }] }) ]) ) expect(window.idle()).toBe(true) }) - it('settles tools, prompts, exit status, and turn lifecycle in one ordered batch', () => { + it('settles tools, prompts, and turn lifecycle in one ordered batch', () => { const tap = recorder() const batches: { settlementId: string; mutations: unknown[] }[] = [] tap.sink.appendLifecycleBatch = (settlementId, mutations) => { @@ -500,10 +498,6 @@ describe('codex journal translation', () => { resolution: expect.objectContaining({ state: 'cancelled' }) }) }), - expect.objectContaining({ - kind: 'item', - body: { kind: 'status', text: 'Provider exited: lost child' } - }), expect.objectContaining({ kind: 'item', body: expect.objectContaining({ kind: 'turn', turnId: TURN_ID, state: 'interrupted' }) diff --git a/src/main/codex/codex-structured-session-background-tasks.test.ts b/src/main/codex/codex-structured-session-background-tasks.test.ts index 54282e3d107..97b6f4e47a5 100644 --- a/src/main/codex/codex-structured-session-background-tasks.test.ts +++ b/src/main/codex/codex-structured-session-background-tasks.test.ts @@ -198,7 +198,6 @@ describe('codex background tasks reach the strip', () => { await vi.waitFor(() => expect(adapter.backgroundTaskState('session-1')).toBeUndefined()) // The open turn's lifecycle row is revised to interrupted, never tombstoned. expect(appendItem.mock.calls.map((call) => call[1])).toEqual([ - { kind: 'status', text: 'Provider exited: notification admission failed (failed)' }, expect.objectContaining({ kind: 'turn', state: 'interrupted' }) ]) expect(observed).toEqual([ diff --git a/src/main/grok/grok-hook-script.ts b/src/main/grok/grok-hook-script.ts index 997bf7e64d4..4a9025fcfb1 100644 --- a/src/main/grok/grok-hook-script.ts +++ b/src/main/grok/grok-hook-script.ts @@ -5,7 +5,8 @@ import { } from '../agent-hooks/installer-utils' import { buildPosixHookPayloadCapture, - buildPosixHookSpoolLines + buildPosixHookSpoolLines, + POSIX_HOOK_JSON_STDIN } from '../agent-hooks/hook-stdin-contract' import { buildWindowsGrokHookScript, @@ -35,7 +36,7 @@ export function getGrokManagedScript(target: 'local' | 'posix' = 'local'): strin return [ '#!/bin/sh', - ...buildPosixHookPayloadCapture(), + ...buildPosixHookPayloadCapture('exit', POSIX_HOOK_JSON_STDIN), ...buildPosixHookSpoolLines('grok'), 'if [ -n "$ORCA_AGENT_HOOK_ENDPOINT" ] && [ -r "$ORCA_AGENT_HOOK_ENDPOINT" ]; then', ' . "$ORCA_AGENT_HOOK_ENDPOINT" 2>/dev/null || :', diff --git a/src/main/grok/grok-hook-stdin-no-eof.test.ts b/src/main/grok/grok-hook-stdin-no-eof.test.ts new file mode 100644 index 00000000000..c8b34ed3164 --- /dev/null +++ b/src/main/grok/grok-hook-stdin-no-eof.test.ts @@ -0,0 +1,92 @@ +import { spawn } from 'node:child_process' +import { mkdtempSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { getGrokManagedScript } from './grok-hook-script' + +// Grok's own hook timeout; the budget these cases have to stay well inside. +const GROK_HOOK_TIMEOUT_MS = 10_000 +const SESSION_START_BUDGET_MS = 1_500 + +describe.skipIf(process.platform === 'win32')('Grok POSIX hook stdin without EOF', () => { + let dir = '' + + afterEach(() => { + if (dir) { + rmSync(dir, { recursive: true, force: true }) + } + }) + + /** Writes the payload and leaves the pipe open, which is what Grok SessionStart does. */ + async function runHookWithoutEof( + chunks: readonly Buffer[] + ): Promise<{ exitCode: number | null; durationMs: number; stderr: string }> { + dir = mkdtempSync(join(tmpdir(), 'orca-grok-hook-no-eof-')) + const scriptPath = join(dir, 'grok-hook.sh') + writeFileSync(scriptPath, getGrokManagedScript('posix'), { mode: 0o755 }) + + const startedAt = Date.now() + const child = spawn('/bin/sh', [scriptPath], { + stdio: ['pipe', 'pipe', 'pipe'], + env: { + ...process.env, + ORCA_PANE_KEY: 'pane-1', + ORCA_AGENT_HOOK_PORT: '', + ORCA_AGENT_HOOK_TOKEN: '', + ORCA_AGENT_HOOK_ENDPOINT: '' + } + }) + let stderr = '' + child.stderr.on('data', (chunk: Buffer) => { + stderr += chunk.toString() + }) + child.stdin.on('error', () => {}) + + const exitCode = await new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + child.kill('SIGKILL') + reject(new Error(`hook still blocked on stdin after ${GROK_HOOK_TIMEOUT_MS}ms`)) + }, GROK_HOOK_TIMEOUT_MS) + child.on('error', (error) => { + clearTimeout(timeout) + reject(error) + }) + child.on('close', (code) => { + clearTimeout(timeout) + resolve(code) + }) + void (async () => { + for (const chunk of chunks) { + child.stdin.write(chunk) + await new Promise((resolveGap) => setTimeout(resolveGap, 5)) + } + })() + }) + + return { exitCode, durationMs: Date.now() - startedAt, stderr } + } + + it('returns after one JSON object when the caller never closes stdin (SessionStart)', async () => { + const result = await runHookWithoutEof([ + Buffer.from('{"hook_event_name":"session_start","session_id":"abc"}\n') + ]) + + expect(result.exitCode).toBe(0) + expect(result.durationMs).toBeLessThan(SESSION_START_BUDGET_MS) + }) + + // Why: a non-ASCII payload arriving in pieces used to crash the reader, which + // fell through to `cat` and reinstated the very 10s timeout this hook avoids. + it('returns just as fast when a multi-byte payload is split across writes', async () => { + const bytes = Buffer.from( + '{"hook_event_name":"session_start","cwd":"/tmp/漢字","tool":"🚀"}\n', + 'utf8' + ) + const result = await runHookWithoutEof([...bytes].map((byte) => Buffer.from([byte]))) + + expect(result.stderr).toBe('') + expect(result.exitCode).toBe(0) + expect(result.durationMs).toBeLessThan(SESSION_START_BUDGET_MS) + }, 20_000) +}) diff --git a/src/main/grok/hook-service.test.ts b/src/main/grok/hook-service.test.ts index 620966bd6ae..fe6d16a4664 100644 --- a/src/main/grok/hook-service.test.ts +++ b/src/main/grok/hook-service.test.ts @@ -29,7 +29,10 @@ vi.mock('os', async () => { import { getGrokToolEventMatcherForTests, GrokHookService } from './hook-service' import { buildWindowsGrokHookScript } from './windows-grok-hook-script' -import { POSIX_HOOK_STDIN_READER } from '../agent-hooks/hook-stdin-contract' +import { + POSIX_HOOK_JSON_STDIN_PRELUDE, + POSIX_HOOK_JSON_STDIN_READER +} from '../agent-hooks/hook-stdin-contract' const GROK_SCRIPT_FILE_NAME = process.platform === 'win32' ? 'grok-hook.cmd' : 'grok-hook.sh' const WINDOWS_POWERSHELL_LAUNCHER = @@ -298,7 +301,15 @@ describe('GrokHookService', () => { } else { // Why: payload is piped to curl via stdin (`payload@-`) so it never lands // on the curl command line (EDR oversized-command-line false positive). - expect(script).toContain(`payload=$(${POSIX_HOOK_STDIN_READER})`) + // Why the ordering: the reader chain dereferences the prelude's variable, so a + // prelude emitted after the capture would silently run `python -c ""` and + // hand back an empty payload. + const prelude = POSIX_HOOK_JSON_STDIN_PRELUDE.join('\n') + expect(script).toContain(prelude) + expect(script.indexOf(prelude)).toBeLessThan( + script.indexOf(`payload=$(${POSIX_HOOK_JSON_STDIN_READER})`) + ) + expect(script).toContain(`payload=$(${POSIX_HOOK_JSON_STDIN_READER})`) expect(script).toContain('printf \'%s\' "$payload" | curl') expect(script).toContain('--data-urlencode "payload@-"') expect(script).toContain('${#GROK_HOME}" -le 4096') diff --git a/src/main/native-chat/agent-session-wire/agent-session-retired-provider-exit-copy-ratchet.test.ts b/src/main/native-chat/agent-session-wire/agent-session-retired-provider-exit-copy-ratchet.test.ts new file mode 100644 index 00000000000..1145c30aa2d --- /dev/null +++ b/src/main/native-chat/agent-session-wire/agent-session-retired-provider-exit-copy-ratchet.test.ts @@ -0,0 +1,79 @@ +import { join, resolve } from 'node:path' +import { describe, expect, it } from 'vitest' +import { scanSourceTree, stripComments } from '../../../shared/source-scan/source-tree-scan' + +/** + * The retired copy has to stay retired. + * + * A bare `Provider exited: ` status row is the reported symptom: a chat the user could + * not act on, settled by a restart rather than by observed death. Both production writers of that + * copy are gone, replaced by outcome copy the death evidence decides. Nothing filters this string + * at read time, so a producer that resurrects it reaches the transcript directly — which is why + * the guard sits on the writing side. + * + * Deliberately narrow: only a literal that OPENS with the prefix. Prose about the retirement, and + * copy that merely mentions a provider exiting, are not producers. + */ + +const RETIRED_COPY_PREFIX = 'Provider exited' + +/** Line numbers of string literals whose first character begins the retired copy. */ +export function findRetiredProviderExitCopyLines(source: string): number[] { + const code = stripComments(source) + const pattern = new RegExp(`['"\`]${RETIRED_COPY_PREFIX}`, 'g') + return [...code.matchAll(pattern)].map((match) => code.slice(0, match.index).split('\n').length) +} + +describe('retired provider-exit copy ratchet', () => { + it('flags a literal that opens with the retired copy', () => { + const flagged = [ + `const text = 'Provider exited: recorded pid absent on host'`, + `appendStatus("Provider exited")`, + 'appendStatus(`Provider exited: ${reason}`)' + ] + for (const source of flagged) { + expect(findRetiredProviderExitCopyLines(source), source).toHaveLength(1) + } + }) + + it('reports the line the literal sits on', () => { + expect(findRetiredProviderExitCopyLines(`const a = 1\n\nconst b = 'Provider exited'`)).toEqual([ + 3 + ]) + }) + + it('leaves prose and unrelated copy alone', () => { + const allowed = [ + `// the old bare 'Provider exited: ' row`, + `/* wrote \`Provider exited\` once */`, + `const text = 'provider exited'`, + `const text = 'The provider exited unexpectedly'`, + `const text = 'Provider exit was not proven'`, + `if (text.startsWith(prefix)) {}` + ] + for (const source of allowed) { + expect(findRetiredProviderExitCopyLines(source), source).toEqual([]) + } + }) + + const repoRoot = resolve(__dirname, '..', '..', '..', '..') + // Tests assert on the retired copy on purpose; the walk skips them. + const files = scanSourceTree(join(repoRoot, 'src')) + + it('scans a plausible number of files', () => { + // A broken root or extension list would make the guard silently vacuous. + expect(files.length).toBeGreaterThan(500) + }) + + it('has no production writer of the retired copy', () => { + const offenders = files.flatMap(({ relativePath, source }) => + findRetiredProviderExitCopyLines(source).map((line) => `src/${relativePath}:${line}`) + ) + expect( + offenders, + `A status row whose copy opens with "${RETIRED_COPY_PREFIX}" lands in the user's transcript ` + + 'unfiltered, which is the symptom this chat surface was reported for. Write the outcome ' + + 'copy the death evidence decides instead of resurrecting the retired prefix.' + ).toEqual([]) + }) +}) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.test.ts index c6566083eac..e08c289c87a 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.test.ts @@ -1,18 +1,45 @@ import { describe, expect, it, vi } from 'vitest' -import type { StructuredAgentSessionAdapter } from './structured-agent-session-adapter' +import type { AgentSessionJournalIdentity } from '../../../shared/agent-session-journal-types' +import type { + AgentSessionAcquisition, + StructuredAgentSessionAdapter +} from './structured-agent-session-adapter' import { StructuredAgentSessionAdapterRouter } from './structured-agent-session-adapter-router' +function claudeIdentity(sessionId: string): AgentSessionJournalIdentity { + return { + sessionId, + workspaceId: 'workspace-1', + hostId: 'local', + agent: 'claude', + providerHandle: { kind: 'claude', sessionId: 'provider-session-1', leafUuid: null } + } +} + +function acquisition(fence: number, spawnToken: string): AgentSessionAcquisition { + return { + process: { hostId: 'local', pid: 1, processStartTimeMs: 1, spawnToken }, + link: { + linkId: `link-${fence}`, + handle: { provider: 'claude', sessionId: 'provider-session-1', leafUuid: null }, + origin: 'created', + mintedAtFence: fence, + observedAt: 1 + } + } +} + function adapterOf( releaseAcquisition: StructuredAgentSessionAdapter['releaseAcquisition'] ): StructuredAgentSessionAdapter { return { - acquire: vi.fn(async () => ({ process: { pid: 1 } }) as never), + acquire: vi.fn(async ({ fence, spawnToken }) => acquisition(fence, spawnToken)), releaseAcquisition, dispatch: vi.fn(), cancelTurn: vi.fn(), answerPrompt: vi.fn(), setOption: vi.fn() - } as unknown as StructuredAgentSessionAdapter + } } describe('StructuredAgentSessionAdapterRouter.releaseAcquisition', () => { @@ -21,7 +48,7 @@ describe('StructuredAgentSessionAdapterRouter.releaseAcquisition', () => { const claude = adapterOf(vi.fn().mockRejectedValueOnce(failure).mockResolvedValue(false)) const codex = adapterOf(vi.fn(async () => false)) const router = new StructuredAgentSessionAdapterRouter({ claude, codex }, async () => {}) - const identity = { sessionId: 'session-1', agent: 'claude' } as never + const identity = claudeIdentity('session-1') await router.acquire({ identity, fence: 1, spawnToken: 'spawn-1' }) await expect(router.releaseAcquisition({ sessionId: 'session-1' })).rejects.toBe(failure) @@ -41,7 +68,7 @@ describe('StructuredAgentSessionAdapterRouter.closeSession', () => { claude.dispatch = dispatch const codex = adapterOf(vi.fn(async () => false)) const router = new StructuredAgentSessionAdapterRouter({ claude, codex }, async () => {}) - const identity = { sessionId: 'session-1', agent: 'claude' } as never + const identity = claudeIdentity('session-1') await router.acquire({ identity, fence: 1, spawnToken: 'spawn-1' }) await expect(router.closeSession('session-1')).resolves.toBe(false) @@ -49,7 +76,7 @@ describe('StructuredAgentSessionAdapterRouter.closeSession', () => { router.dispatch({ sessionId: 'session-1', clientMessageId: 'client-1', - body: {} as never, + body: { kind: 'message', role: 'user', blocks: [] }, fence: 1 }) ).resolves.toMatchObject({ state: 'unknown' }) @@ -57,6 +84,32 @@ describe('StructuredAgentSessionAdapterRouter.closeSession', () => { expect(closeSession).toHaveBeenCalledTimes(2) expect(dispatch).toHaveBeenCalledTimes(1) }) + + it('retains a stop proof across journal-close failure until the host acknowledges release', async () => { + const closeSession = vi.fn(async () => true) + const closeJournal = vi.fn(async () => { + throw new Error('journal close failed') + }) + const claude = adapterOf(vi.fn(async () => true)) + claude.closeSession = closeSession + const router = new StructuredAgentSessionAdapterRouter( + { claude, codex: adapterOf(vi.fn(async () => false)) }, + async () => {} + ) + const identity = claudeIdentity('session-1') + await router.acquire({ identity, fence: 1, spawnToken: 'spawn-1' }) + + await expect(router.closeSession('session-1')).resolves.toBe(true) + await expect(closeJournal()).rejects.toThrow('journal close failed') + await expect(router.closeSession('session-1')).resolves.toBe(true) + expect(closeSession).toHaveBeenCalledOnce() + router.acknowledgeSessionRelease('session-1') + await expect(router.closeSession('session-1')).resolves.toBe(false) + + await router.acquire({ identity, fence: 2, spawnToken: 'spawn-2' }) + await expect(router.closeSession('session-1')).resolves.toBe(true) + expect(closeSession).toHaveBeenCalledTimes(2) + }) }) describe('StructuredAgentSessionAdapterRouter optional lifecycle methods', () => { @@ -73,7 +126,7 @@ describe('StructuredAgentSessionAdapterRouter optional lifecycle methods', () => claude.dispatch = dispatch const codex = adapterOf(vi.fn(async () => false)) const router = new StructuredAgentSessionAdapterRouter({ claude, codex }, async () => {}) - const identity = { sessionId: 'session-1', agent: 'claude' } as never + const identity = claudeIdentity('session-1') await router.acquire({ identity, fence: 1, spawnToken: 'spawn-1' }) const stopSession = router[method] @@ -82,7 +135,7 @@ describe('StructuredAgentSessionAdapterRouter optional lifecycle methods', () => router.dispatch({ sessionId: 'session-1', clientMessageId: 'client-1', - body: {} as never, + body: { kind: 'message', role: 'user', blocks: [] }, fence: 1 }) ).resolves.toMatchObject({ state: 'unknown' }) @@ -101,7 +154,7 @@ describe('StructuredAgentSessionAdapterRouter optional lifecycle methods', () => const codex = adapterOf(vi.fn(async () => false)) const router = new StructuredAgentSessionAdapterRouter({ claude, codex }, async () => {}) await router.acquire({ - identity: { sessionId: 'session-1', agent: 'claude' } as never, + identity: claudeIdentity('session-1'), fence: 1, spawnToken: 'spawn-1' }) @@ -112,3 +165,129 @@ describe('StructuredAgentSessionAdapterRouter optional lifecycle methods', () => } ) }) + +describe('StructuredAgentSessionAdapterRouter.closeAll', () => { + it('refuses to acquire once the global close proof is published', async () => { + const acquire = vi.fn(async ({ fence, spawnToken }) => acquisition(fence, spawnToken)) + const claude = adapterOf(vi.fn(async () => true)) + claude.acquire = acquire + const router = new StructuredAgentSessionAdapterRouter( + { claude, codex: adapterOf(vi.fn(async () => false)) }, + async () => undefined + ) + await router.closeAll() + + await expect( + router.acquire({ + identity: claudeIdentity('session-1'), + fence: 1, + spawnToken: 'spawn-1' + }) + ).rejects.toThrow('router is closed') + expect(acquire).not.toHaveBeenCalled() + }) + + it('keeps a per-session stop proof and reports no stop for a session it never routed', async () => { + const claude = adapterOf(vi.fn(async () => true)) + const closeAdapters = vi.fn(async () => undefined) + const router = new StructuredAgentSessionAdapterRouter( + { claude, codex: adapterOf(vi.fn(async () => false)) }, + closeAdapters + ) + await router.acquire({ + identity: claudeIdentity('session-1'), + fence: 1, + spawnToken: 'spawn-1' + }) + + await router.closeAll() + + // The routed session carries the shutdown's own exit proof; the other two are sessions this + // router has no record of, and an absent record is not a stop it can report. + await expect(router.closeSession('session-1')).resolves.toBe(true) + await expect(router.closeSession('never-routed')).resolves.toBe(false) + router.acknowledgeSessionRelease('session-1') + await expect(router.closeSession('session-1')).resolves.toBe(false) + await router.closeAll() + expect(closeAdapters).toHaveBeenCalledOnce() + }) + + it('asks the adapters to release an unrouted session rather than answering from the close proof', async () => { + const claudeRelease = vi.fn(async () => true) + const codexRelease = vi.fn(async () => false) + const router = new StructuredAgentSessionAdapterRouter( + { claude: adapterOf(claudeRelease), codex: adapterOf(codexRelease) }, + async () => undefined + ) + await router.closeAll() + + await expect(router.releaseAcquisition({ sessionId: 'never-routed' })).resolves.toBe(true) + expect(claudeRelease).toHaveBeenCalledWith({ sessionId: 'never-routed' }) + expect(codexRelease).toHaveBeenCalledWith({ sessionId: 'never-routed' }) + }) + + it('retains live routes and publishes no global proof when closeAll fails', async () => { + const failure = new Error('adapter shutdown failed') + const claude = adapterOf(vi.fn(async () => true)) + const dispatch = vi.fn().mockResolvedValue({ state: 'unknown', reason: 'test' }) + const closeSession = vi.fn(async () => true) + claude.dispatch = dispatch + claude.closeSession = closeSession + const router = new StructuredAgentSessionAdapterRouter( + { claude, codex: adapterOf(vi.fn(async () => false)) }, + vi.fn(async () => { + throw failure + }) + ) + await router.acquire({ + identity: claudeIdentity('session-1'), + fence: 1, + spawnToken: 'spawn-1' + }) + + await expect(router.closeAll()).rejects.toBe(failure) + + await expect(router.closeSession('never-routed')).resolves.toBe(false) + await expect( + router.dispatch({ + sessionId: 'session-1', + clientMessageId: 'client-1', + body: { kind: 'message', role: 'user', blocks: [] }, + fence: 1 + }) + ).resolves.toMatchObject({ state: 'unknown' }) + await expect(router.closeSession('session-1')).resolves.toBe(true) + expect(closeSession).toHaveBeenCalledOnce() + }) + + it('keeps the global proof when an acquisition lands mid-close', async () => { + let resolveAcquire!: (value: AgentSessionAcquisition) => void + const closeSession = vi.fn(async () => true) + const claude = adapterOf(vi.fn(async () => true)) + claude.closeSession = closeSession + claude.acquire = vi.fn( + () => + new Promise((resolve) => { + resolveAcquire = resolve + }) + ) + const router = new StructuredAgentSessionAdapterRouter( + { claude, codex: adapterOf(vi.fn(async () => false)) }, + async () => undefined + ) + const acquiring = router.acquire({ + identity: claudeIdentity('session-1'), + fence: 2, + spawnToken: 'spawn-2' + }) + + await router.closeAll() + resolveAcquire(acquisition(2, 'spawn-2')) + + // The route is NOT published behind a closed adapter, so nothing routes back out to it — and + // with no route the router has nothing to stop and no stop to report. + await expect(acquiring).rejects.toThrow('router is closed') + await expect(router.closeSession('session-1')).resolves.toBe(false) + expect(closeSession).not.toHaveBeenCalled() + }) +}) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.ts index e0f89a72afd..1cc571d39aa 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.ts @@ -6,9 +6,12 @@ import type { import type { StructuredAgentSessionAdapter } from './structured-agent-session-adapter' type RoutedAgent = 'claude' | 'codex' +type SessionRoute = { adapter: StructuredAgentSessionAdapter; state: 'live' | 'stopped' } export class StructuredAgentSessionAdapterRouter implements StructuredAgentSessionAdapter { - private readonly owners = new Map() + private readonly routes = new Map() + private allAdaptersClosed = false + private closePromise: Promise | null = null constructor( private readonly adapters: Record, @@ -23,20 +26,29 @@ export class StructuredAgentSessionAdapterRouter implements StructuredAgentSessi supportsLocation = (location: AgentSessionExecutionLocation): boolean => Object.values(this.adapters).some((adapter) => adapter.supportsLocation?.(location) ?? false) + /** Both adapters already gate their own shutdown, so the router only has to stop UNDOING that: + * a late acquire must not clear `allAdaptersClosed` and fan a session back out to closed + * adapters. Once closed, the router stays closed. */ async acquire(input: Parameters[0]) { + if (this.allAdaptersClosed) { + throw new Error('structured session adapter router is closed') + } const adapter = this.requireAgent(input.identity) const acquired = await adapter.acquire(input) - this.owners.set(input.identity.sessionId, adapter) + if (this.allAdaptersClosed) { + throw new Error('structured session adapter router is closed') + } + this.routes.set(input.identity.sessionId, { adapter, state: 'live' }) return acquired } async releaseAcquisition(input: { sessionId: string }): Promise { - const adapter = this.owners.get(input.sessionId) - if (adapter) { + const route = this.routes.get(input.sessionId) + if (route) { try { - return (await adapter.releaseAcquisition?.(input)) === true + return (await route.adapter.releaseAcquisition?.(input)) === true } finally { - this.owners.delete(input.sessionId) + this.routes.delete(input.sessionId) } } let released = false @@ -50,7 +62,7 @@ export class StructuredAgentSessionAdapterRouter implements StructuredAgentSessi this.owner(input.sessionId).dispatch(input) rewindSupport: NonNullable = (sessionId) => - this.owners.get(sessionId)?.rewindSupport?.(sessionId) ?? { + this.liveOwnerOrNull(sessionId)?.rewindSupport?.(sessionId) ?? { supported: false, reason: 'unsupported' } @@ -83,10 +95,10 @@ export class StructuredAgentSessionAdapterRouter implements StructuredAgentSessi backgroundTaskState: NonNullable = ( sessionId - ) => this.owners.get(sessionId)?.backgroundTaskState?.(sessionId) + ) => this.liveOwnerOrNull(sessionId)?.backgroundTaskState?.(sessionId) readCommands: NonNullable = (sessionId) => - this.owners.get(sessionId)?.readCommands?.(sessionId) + this.liveOwnerOrNull(sessionId)?.readCommands?.(sessionId) answerPrompt: StructuredAgentSessionAdapter['answerPrompt'] = (input) => this.owner(input.sessionId).answerPrompt(input) @@ -128,32 +140,68 @@ export class StructuredAgentSessionAdapterRouter implements StructuredAgentSessi adapter: StructuredAgentSessionAdapter ) => NonNullable | undefined ): Promise { - const adapter = this.owners.get(sessionId) - if (!adapter) { + const route = this.routes.get(sessionId) + if (!route) { + // No route is loss of contact, never proof of a stop. Answering `true` here would hand a + // caller a receipt for a session this router never acted on — and the caller spends that + // receipt by releasing the durable lease. return false } - const stop = selectStop(adapter) - const stopped = await stop?.call(adapter, sessionId) + if (route.state === 'stopped') { + return true + } + const stop = selectStop(route.adapter) + const stopped = await stop?.call(route.adapter, sessionId) if (stopped === true) { - this.owners.delete(sessionId) + route.state = 'stopped' return true } return false } async closeAll(): Promise { - this.owners.clear() - await this.closeAdapters() + if (this.allAdaptersClosed) { + return + } + if (this.closePromise) { + return this.closePromise + } + this.closePromise = (async () => { + try { + await this.closeAdapters() + // Adapter shutdown only resolves once every child is PROVEN stopped, so each routed + // session inherits that proof and keeps it per session. Clearing the map instead would + // leave one boolean as the only surviving evidence, and an empty map cannot tell a + // session this router stopped from one it never saw. + for (const route of this.routes.values()) { + route.state = 'stopped' + } + this.allAdaptersClosed = true + } finally { + this.closePromise = null + } + })() + return this.closePromise + } + + /** Drops a per-session stop receipt after the host releases its durable owner. */ + acknowledgeSessionRelease = (sessionId: string): void => { + this.routes.delete(sessionId) } private owner(sessionId: string): StructuredAgentSessionAdapter { - const adapter = this.owners.get(sessionId) + const adapter = this.liveOwnerOrNull(sessionId) if (!adapter) { throw new Error(`no live structured adapter owns ${sessionId}`) } return adapter } + private liveOwnerOrNull(sessionId: string): StructuredAgentSessionAdapter | null { + const route = this.routes.get(sessionId) + return route?.state === 'live' ? route.adapter : null + } + private requireAgent(identity: AgentSessionJournalIdentity): StructuredAgentSessionAdapter { const adapter = this.adapterForAgent(identity.agent) if (!adapter) { diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-adapter.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-adapter.ts index 54d3c15ae0e..6b12ba61c6c 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-adapter.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-adapter.ts @@ -238,6 +238,8 @@ export type StructuredAgentSessionAdapter = { forceCloseSession?(sessionId: string): Promise /** Stops a provider child for teardown without requiring a future-resume cursor. */ disposeSession?(sessionId: string): Promise + /** Host acknowledgement that the proven-dead child, lease and journal owner are released. */ + acknowledgeSessionRelease?(sessionId: string): void } export async function rethrowAfterAgentSessionAcquisitionCleanup( diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-dead-generation-settlement.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-dead-generation-settlement.test.ts new file mode 100644 index 00000000000..af51a9967d6 --- /dev/null +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-dead-generation-settlement.test.ts @@ -0,0 +1,315 @@ +import { mkdtemp, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { openAgentSessionJournal } from '../agent-session-journal/journal-store-factory' +import type { AgentJournalRenderItem } from '../../../shared/agent-session-journal-types' +import type { AgentSessionJournal } from '../agent-session-journal/journal-store' +import { + captureUnfinishedStructuredAgentSessionWork, + MAX_UNEXPECTED_EXIT_REASON_CHARS, + settleStructuredAgentSessionDeadGeneration, + UNEXPECTED_PROVIDER_EXIT_OUTCOME, + unfinishedStructuredAgentSessionWorkWasInterrupted +} from './structured-agent-session-dead-generation-settlement' + +const SESSION = 'session-dead-generation' +const THREAD = 'thread-1' +let root: string +let journal: AgentSessionJournal + +beforeEach(async () => { + root = await mkdtemp(join(tmpdir(), 'orca-dead-generation-')) + journal = await openAgentSessionJournal({ + identity: { + sessionId: SESSION, + workspaceId: 'workspace-1', + hostId: 'local', + agent: 'codex', + providerHandle: { kind: 'codex', threadId: THREAD } + }, + journalDir: root, + now: () => 1_000 + }) +}) + +afterEach(async () => { + await journal.close() + await rm(root, { recursive: true, force: true }) +}) + +async function seedUnfinishedWork(): Promise { + await journal.appendSubmission({ + clientMessageId: 'client-1', + payloadFingerprint: 'fingerprint', + body: { kind: 'message', role: 'user', blocks: [{ type: 'text', text: 'keep going' }] }, + fence: 7 + }) + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 1 }, + { kind: 'tool-call', name: 'shell', input: { command: 'pnpm test' }, state: 'running' }, + { fence: 7 } + ) + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 2 }, + { + kind: 'approval', + title: 'Run command?', + detail: null, + options: [{ id: 'yes', label: 'Allow' }], + resolution: { state: 'pending', selectedOptionId: null, resolvedBy: null, resolvedAt: null } + }, + { fence: 7 } + ) + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 3 }, + { + kind: 'question', + question: 'Which target?', + options: [{ id: 'web', label: 'Web' }], + resolution: { state: 'pending', selectedOptionId: null, resolvedBy: null, resolvedAt: null } + }, + { fence: 7 } + ) + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 4 }, + { kind: 'turn', turnId: 'turn-1', state: 'running', startedAt: 900 }, + { fence: 7 } + ) +} + +describe('dead structured-session generation settlement', () => { + it('settles probe-proven work as unverifiable without a technical chat row or fake end time', async () => { + await seedUnfinishedWork() + + await expect( + settleStructuredAgentSessionDeadGeneration({ + journal, + sessionId: SESSION, + fence: 8, + settlementId: `restart-eviction:${SESSION}:8`, + pendingSubmissionReason: 'provider_exited_before_acknowledgement', + verdict: { state: 'unverifiable' }, + showUnexpectedExitOutcome: false + }) + ).resolves.toBe(true) + + const snapshot = journal.snapshot() + expect(snapshot.submissions).toEqual([ + expect.objectContaining({ clientMessageId: 'client-1', dispatchState: 'unknown' }) + ]) + expect(snapshot.items.map((item) => item.body)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ kind: 'tool-call', state: 'failed' }), + expect.objectContaining({ + kind: 'approval', + resolution: expect.objectContaining({ state: 'cancelled' }) + }), + expect.objectContaining({ + kind: 'question', + resolution: expect.objectContaining({ state: 'cancelled' }) + }), + { kind: 'turn', turnId: 'turn-1', state: 'unverifiable', startedAt: 900 } + ]) + ) + expect(snapshot.items.some((item) => item.body.kind === 'status')).toBe(false) + }) + + it('adds one actionable outcome for observed active-work failure and is idempotent', async () => { + await seedUnfinishedWork() + const input = { + journal, + sessionId: SESSION, + fence: 7, + settlementId: `provider-exit:${SESSION}:7:generation-1`, + pendingSubmissionReason: 'provider_exited_before_acknowledgement', + verdict: { state: 'interrupted' as const, completedAt: 1_000 }, + showUnexpectedExitOutcome: true + } + + await expect(settleStructuredAgentSessionDeadGeneration(input)).resolves.toBe(true) + const settledCursor = journal.cursor() + await expect(settleStructuredAgentSessionDeadGeneration(input)).resolves.toBe(true) + + expect(journal.cursor()).toEqual(settledCursor) + expect( + journal + .snapshot() + .items.filter( + (item) => + item.body.kind === 'status' && item.body.text === UNEXPECTED_PROVIDER_EXIT_OUTCOME + ) + ).toHaveLength(1) + }) + + it('keeps the actionable tail when the provider dumps a stderr wall into its exit reason', async () => { + await seedUnfinishedWork() + + await expect( + settleStructuredAgentSessionDeadGeneration({ + journal, + sessionId: SESSION, + fence: 7, + settlementId: `provider-exit:${SESSION}:7:generation-1`, + pendingSubmissionReason: 'provider_exited_before_acknowledgement', + verdict: { state: 'interrupted', completedAt: 1_000 }, + showUnexpectedExitOutcome: true, + unexpectedExitReason: 'stack frame '.repeat(4_000) + }) + ).resolves.toBe(true) + + const statuses = journal + .snapshot() + .items.flatMap((item) => (item.body.kind === 'status' ? [item.body.text] : [])) + expect(statuses).toHaveLength(1) + // The cause is bounded before composing, so the row never reaches the byte cap that would + // truncate the sentence telling the user the conversation is still usable. + expect(statuses[0]).toContain('stack frame') + expect(statuses[0]).toMatch(/You can continue in this conversation\.$/) + expect(statuses[0]?.length).toBeLessThan(MAX_UNEXPECTED_EXIT_REASON_CHARS * 2) + }) + + it('retries an already settled expected close without writing through a closed journal gate', async () => { + const settledItem: AgentJournalRenderItem = { + itemId: 'codex:thread-1:turn-1:0', + revision: 2, + sequence: 2, + observedAt: 1_000, + body: { + kind: 'turn', + turnId: 'turn-1', + state: 'interrupted', + completedAt: 1_000 + } + } + const settledSnapshot = journal.snapshot() + const closedJournal: Pick< + AgentSessionJournal, + 'snapshot' | 'submissions' | 'markPendingSubmissionsUnknown' | 'appendLifecycleBatch' + > = { + snapshot: () => ({ + ...settledSnapshot, + items: [settledItem] + }), + submissions: () => [], + markPendingSubmissionsUnknown: async () => { + throw new Error('journal_closed') + }, + appendLifecycleBatch: async () => { + throw new Error('journal_closed') + } + } + + await expect( + settleStructuredAgentSessionDeadGeneration({ + journal: closedJournal, + sessionId: SESSION, + fence: 7, + settlementId: `expected-close:${SESSION}:7:generation-1`, + pendingSubmissionReason: 'provider_closed_before_acknowledgement', + verdict: { state: 'interrupted', completedAt: 1_000 }, + showUnexpectedExitOutcome: false + }) + ).resolves.toBe(true) + }) + + it('settles a live unknown submission even when no unfinished item remains', async () => { + await journal.appendSubmission({ + clientMessageId: 'client-unknown', + payloadFingerprint: 'fingerprint', + body: { kind: 'message', role: 'user', blocks: [{ type: 'text', text: 'did this land?' }] }, + fence: 7 + }) + await journal.resolveDispatch({ + clientMessageId: 'client-unknown', + state: 'unknown', + reason: 'provider write outcome unknown', + fence: 7 + }) + + await expect( + settleStructuredAgentSessionDeadGeneration({ + journal, + sessionId: SESSION, + fence: 7, + settlementId: `expected-close:${SESSION}:7:generation-1`, + pendingSubmissionReason: 'provider_closed_before_acknowledgement', + verdict: { state: 'interrupted', completedAt: 1_000 }, + showUnexpectedExitOutcome: false + }) + ).resolves.toBe(true) + + expect(journal.submissions()).toEqual([ + expect.objectContaining({ + clientMessageId: 'client-unknown', + dispatchState: 'unknown', + recovered: true, + reason: 'provider write outcome unknown' + }) + ]) + }) +}) + +describe('whether a dead generation interrupted anything', () => { + async function seedIdlePendingApproval(): Promise { + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 1 }, + { + kind: 'approval', + title: 'Run command?', + detail: null, + options: [{ id: 'yes', label: 'Allow' }], + resolution: { state: 'pending', selectedOptionId: null, resolvedBy: null, resolvedAt: null } + }, + { fence: 7 } + ) + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 2 }, + { kind: 'turn', turnId: 'turn-1', state: 'completed', startedAt: 900, completedAt: 950 }, + { fence: 7 } + ) + } + + it('says nothing was interrupted when the provider died waiting on an approval', async () => { + await seedIdlePendingApproval() + const before = captureUnfinishedStructuredAgentSessionWork(journal) + + expect(unfinishedStructuredAgentSessionWorkWasInterrupted(before, journal, 1_000)).toBe(false) + }) + + it('still reports an interruption when a turn was running', async () => { + await seedUnfinishedWork() + const before = captureUnfinishedStructuredAgentSessionWork(journal) + + expect(unfinishedStructuredAgentSessionWorkWasInterrupted(before, journal, 1_000)).toBe(true) + }) + + it('cancels the idle prompt without claiming a response was in progress', async () => { + await seedIdlePendingApproval() + + await expect( + settleStructuredAgentSessionDeadGeneration({ + journal, + sessionId: SESSION, + fence: 7, + settlementId: `provider-exit:${SESSION}:7:generation-1`, + pendingSubmissionReason: 'provider_exited_before_acknowledgement', + verdict: { state: 'interrupted', completedAt: 1_000 }, + showUnexpectedExitOutcome: unfinishedStructuredAgentSessionWorkWasInterrupted( + captureUnfinishedStructuredAgentSessionWork(journal), + journal, + 1_000 + ) + }) + ).resolves.toBe(true) + + const snapshot = journal.snapshot() + expect(snapshot.items.some((item) => item.body.kind === 'status')).toBe(false) + expect(snapshot.items.map((item) => item.body)).toContainEqual( + expect.objectContaining({ + kind: 'approval', + resolution: expect.objectContaining({ state: 'cancelled' }) + }) + ) + }) +}) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-dead-generation-settlement.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-dead-generation-settlement.ts new file mode 100644 index 00000000000..9a3f3a7c091 --- /dev/null +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-dead-generation-settlement.ts @@ -0,0 +1,204 @@ +import { parseAgentJournalItemKey } from '../../../shared/agent-session-journal-item-key' +import type { + AgentJournalItemBody, + AgentJournalRenderItem +} from '../../../shared/agent-session-journal-types' +import { readAgentJournalTurn } from '../../../shared/agent-session-turn-record' +import { partitionJournalLifecycleMutations } from '../agent-session-journal/journal-lifecycle-batch-partition' +import type { JournalLifecycleMutationInput } from '../agent-session-journal/journal-row-builders' +import { + boundJournalStatusText, + cancelledJournalPromptBody +} from '../agent-session-journal/journal-prompt-body-bounds' +import type { AgentSessionJournal } from '../agent-session-journal/journal-store' +import { + runningTurnLifecycleRevisions, + type StructuredAgentSessionTurnVerdict +} from './structured-agent-session-stale-turn-verdict' + +export const UNEXPECTED_PROVIDER_EXIT_OUTCOME = + 'The provider stopped while this response was in progress. You can continue in this conversation.' + +/** A provider may put a whole stderr dump in its exit reason; unbounded it would push the + * actionable tail past the row's byte cap and lose it to truncation. */ +export const MAX_UNEXPECTED_EXIT_REASON_CHARS = 512 + +/** The cause is the only thing separating an auth failure from an OOM kill, so it is carried + * into the copy rather than left in the durable record nothing renders. */ +export function unexpectedProviderExitOutcome(reason?: string): string { + const detail = reason + ?.slice(0, MAX_UNEXPECTED_EXIT_REASON_CHARS) + .trim() + .replace(/[.\s]+$/, '') + return detail + ? `The provider stopped while this response was in progress: ${detail}. You can continue in this conversation.` + : UNEXPECTED_PROVIDER_EXIT_OUTCOME +} + +type DeadGenerationSubmission = Pick< + ReturnType[number], + 'clientMessageId' | 'dispatchState' | 'recovered' +> + +export type DeadGenerationJournal = { + appendLifecycleBatch: AgentSessionJournal['appendLifecycleBatch'] + markPendingSubmissionsUnknown: AgentSessionJournal['markPendingSubmissionsUnknown'] + snapshot: () => Pick, 'items'> + pendingSubmissions?: AgentSessionJournal['pendingSubmissions'] + submissions?: () => DeadGenerationSubmission[] +} + +export type StructuredAgentSessionUnfinishedWork = { + items: AgentJournalRenderItem[] + hadUnsettledSubmissions: boolean +} + +export function captureUnfinishedStructuredAgentSessionWork( + journal: DeadGenerationJournal +): StructuredAgentSessionUnfinishedWork { + return { + items: journal.snapshot().items.filter(isUnfinishedItem), + hadUnsettledSubmissions: hasUnsettledSubmission(journal) + } +} + +function hasUnfinishedStructuredAgentSessionWork(journal: DeadGenerationJournal): boolean { + const work = captureUnfinishedStructuredAgentSessionWork(journal) + return work.hadUnsettledSubmissions || work.items.length > 0 +} + +export function unfinishedStructuredAgentSessionWorkWasInterrupted( + before: StructuredAgentSessionUnfinishedWork, + journal: DeadGenerationJournal, + observedExitAt: number +): boolean { + const currentSnapshot = journal.snapshot() + if (hasUnsettledSubmission(journal) || currentSnapshot.items.some(isInProgressItem)) { + return true + } + if ( + currentSnapshot.items.some((item) => { + const turn = readAgentJournalTurn(item.body) + return turn?.state === 'interrupted' && turn.completedAt === observedExitAt + }) + ) { + return true + } + const inProgressBefore = before.items.filter(isInProgressItem) + if (inProgressBefore.length === 0) { + return false + } + const currentItems = new Map(currentSnapshot.items.map((item) => [item.itemId, item])) + const runningTurns = inProgressBefore.filter( + (item) => readAgentJournalTurn(item.body)?.state === 'running' + ) + const outcomeItems = runningTurns.length > 0 ? runningTurns : inProgressBefore + return outcomeItems.some((item) => !isCleanlySettled(currentItems.get(item.itemId))) +} + +export async function settleStructuredAgentSessionDeadGeneration(input: { + journal: DeadGenerationJournal + sessionId: string + fence: number + settlementId: string + verdict: StructuredAgentSessionTurnVerdict + pendingSubmissionReason: string + showUnexpectedExitOutcome?: boolean + /** Why the provider stopped, when the host has it. Rendered with the outcome copy. */ + unexpectedExitReason?: string + onError?: (sessionId: string, error: unknown) => void +}): Promise { + try { + const hasUnfinishedWork = hasUnfinishedStructuredAgentSessionWork(input.journal) + const showUnexpectedExitOutcome = input.showUnexpectedExitOutcome ?? hasUnfinishedWork + if (!showUnexpectedExitOutcome && !hasUnfinishedWork) { + return true + } + await input.journal.markPendingSubmissionsUnknown(input.fence, input.pendingSubmissionReason) + const items = input.journal.snapshot().items + const mutations: JournalLifecycleMutationInput[] = [] + if (showUnexpectedExitOutcome) { + mutations.push({ + kind: 'item', + identity: { provider: 'orca', clientMessageId: input.settlementId }, + body: { + kind: 'status', + text: boundJournalStatusText(unexpectedProviderExitOutcome(input.unexpectedExitReason)) + } + }) + } + for (const item of items) { + const identity = parseAgentJournalItemKey(item.itemId) + const body = terminalDeadGenerationBody(item) + if (identity && body) { + mutations.push({ kind: 'item', identity, body }) + } + } + mutations.push(...runningTurnLifecycleRevisions(items, input.verdict)) + const batchId = `dead-generation:${input.settlementId}` + for (const chunk of partitionJournalLifecycleMutations(batchId, mutations)) { + await input.journal.appendLifecycleBatch({ + settlementId: chunk.settlementId, + fence: input.fence, + recovered: true, + mutations: chunk.mutations + }) + } + return true + } catch (error) { + input.onError?.(input.sessionId, error) + return false + } +} + +function terminalDeadGenerationBody(item: AgentJournalRenderItem): AgentJournalItemBody | null { + if (item.body.kind === 'tool-call' && item.body.state === 'running') { + return { ...item.body, state: 'failed' } + } + if (item.body.kind === 'approval' || item.body.kind === 'question') { + return item.body.resolution.state === 'pending' ? cancelledJournalPromptBody(item.body) : null + } + return null +} + +function isUnfinishedItem(item: AgentJournalRenderItem): boolean { + return ( + readAgentJournalTurn(item.body)?.state === 'running' || + terminalDeadGenerationBody(item) !== null + ) +} + +/** Work that means the provider was MID-RESPONSE. A pending approval or question is the provider + * waiting on the user, so dying while one sits there interrupted nothing — it still needs + * cancelling, but it must not claim a response was in progress. */ +function isInProgressItem(item: AgentJournalRenderItem): boolean { + return ( + readAgentJournalTurn(item.body)?.state === 'running' || + (item.body.kind === 'tool-call' && item.body.state === 'running') + ) +} + +function isCleanlySettled(item: AgentJournalRenderItem | undefined): boolean { + const turn = readAgentJournalTurn(item?.body) + if (turn) { + return turn.state === 'completed' + } + if (item?.body.kind === 'tool-call') { + return item.body.state === 'completed' + } + if (item?.body.kind === 'approval' || item?.body.kind === 'question') { + return item.body.resolution.state === 'resolved' + } + return false +} + +function hasUnsettledSubmission(journal: DeadGenerationJournal): boolean { + const submissions = journal.submissions?.() + return submissions + ? submissions.some( + (submission) => + submission.dispatchState === 'pending' || + (submission.dispatchState === 'unknown' && submission.recovered !== true) + ) + : (journal.pendingSubmissions?.().length ?? 0) > 0 +} diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.test.ts index 0d2c693c75f..90b50d3cb90 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.test.ts @@ -30,6 +30,9 @@ function context(): StructuredAgentSessionEvictionContext & { order: string[] } order.push('forget') }), discardSink: vi.fn(() => order.push('discardSink')), + settleWork: vi.fn(async () => { + order.push('settleWork') + }), releaseLease: vi.fn(async () => { order.push('releaseLease') }) @@ -50,6 +53,7 @@ describe('structured agent session eviction', () => { expect(ctx.order).toEqual([ 'closeSession', 'drained', + 'settleWork', 'unbind', 'close', 'discardSink', @@ -76,6 +80,7 @@ describe('structured agent session eviction', () => { expect(STRUCTURED_AGENT_SESSION_EVICTION_STEPS.map((step) => step.name)).toEqual([ 'stop-provider-child', 'drain-published', + 'settle-dead-generation', 'stop-publishing', 'close-sink', 'discard-sink', diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.ts index c2591bba567..7264ca4a338 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-eviction.ts @@ -31,6 +31,13 @@ export type StructuredAgentSessionEvictionContext = { forget: () => Promise /** Drops the cached sink so a later attach mints a fresh one. */ discardSink: () => void + /** Fires once the adapter has PROVEN the child gone, so host bookkeeping stops claiming one. */ + onProviderChildStopped?: () => void + /** Whether this host still owes the child's wind-down. Distinct from `hasProviderChild`, which a + * proven exit retires mid-run: the two disagree for exactly the steps a retry has to repeat. */ + owesProviderChildWindDown?: boolean + /** Settles work owned by the child after its final callbacks have drained. */ + settleWork?: () => Promise /** Hands the lease back now that this host's child is proven gone. No-ops when the record is * not this host's to release. */ releaseLease: () => Promise @@ -57,6 +64,7 @@ export const STRUCTURED_AGENT_SESSION_EVICTION_STEPS: readonly StructuredAgentSe throw new Error('provider child exit was not proven') } } + context.onProviderChildStopped?.() } }, { @@ -68,6 +76,11 @@ export const STRUCTURED_AGENT_SESSION_EVICTION_STEPS: readonly StructuredAgentSe } } }, + { + name: 'settle-dead-generation', + run: (context) => + context.owesProviderChildWindDown === false ? undefined : context.settleWork?.() + }, { name: 'stop-publishing', run: (context) => context.eventSink.unbind() }, { name: 'close-sink', run: (context) => context.eventSink.close() }, // Why: the runtime caches one sink per session id and hands the SAME instance to the next diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-forward.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-forward.ts index 53c5903197c..a73e8b21116 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-forward.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-forward.ts @@ -55,6 +55,7 @@ export async function handoffStructuredSessionToTui( operationId, now: deps.now() }) + deps.acknowledgeNativeRelease?.(sessionId) context.publishStage(record, 'to-tui') if (nativeSuspend.state === 'stopped-cleanup-failed') { await markStructuredHandoffManualRecovery(context, sessionId, operationId) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts index 218db8c539c..5a36c691098 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts @@ -70,6 +70,8 @@ export type StructuredAgentSessionHandoffDeps = { transport?: StructuredAgentSessionHandoffTransport session: (sessionId: string) => { journal: AgentSessionJournal; fence: number } suspendNative: (sessionId: string) => Promise + /** Consumes the router's stop proof after `old-owner-stopped` is durable. */ + acknowledgeNativeRelease?: (sessionId: string) => void acquireNative: (input: { sessionId: string fence: number diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff.test.ts index beca21cb63a..d92bdcd7957 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff.test.ts @@ -244,6 +244,9 @@ describe('structured session handoff failure handling', () => { it('parks a stopped native cleanup failure in manual recovery without launching TUI', async () => { const operation = operationId() const cleanupError = new Error('journal drain failed') + const acknowledgeNativeRelease = vi.fn((sessionId: string) => { + expect(store.getRecord(sessionId)?.lease.handoffStage).toBe('old-owner-stopped') + }) const retainOwner = vi.fn() const releaseOwner = vi.fn() const context = createStructuredHandoffFlowContext({ @@ -270,6 +273,7 @@ describe('structured session handoff failure handling', () => { state: 'stopped-cleanup-failed' as const, error: cleanupError })), + acknowledgeNativeRelease, acquireNative: vi.fn(async () => { throw new Error('native acquisition should not run') }), @@ -304,6 +308,7 @@ describe('structured session handoff failure handling', () => { expect(launchTui).not.toHaveBeenCalled() expect(retainOwner).not.toHaveBeenCalled() expect(releaseOwner).not.toHaveBeenCalled() + expect(acknowledgeNativeRelease).toHaveBeenCalledExactlyOnceWith(SESSION) expect(store.getRecord(SESSION)?.lease).toMatchObject({ runtimeKind: 'native', claimStatus: 'released', diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-host-handoff.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-host-handoff.ts index 113940ff0f4..9a3266541be 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-host-handoff.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-host-handoff.ts @@ -99,6 +99,7 @@ export function createStructuredAgentSessionHostHandoff( return { state: 'stopped-cleanup-failed', error } } }, + acknowledgeNativeRelease: (sessionId) => deps.adapter.acknowledgeSessionRelease?.(sessionId), acquireNative: (input) => acquireNativeHandoffOwner(deps, host, input), acquireNativeStop: async (sessionId, turnId, fence) => (await deps.adapter.cancelTurn({ sessionId, turnId, fence })).cancelled, diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-host-lifetime.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-host-lifetime.ts index e2f75297a5a..0cff20c831b 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-host-lifetime.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-host-lifetime.ts @@ -21,6 +21,7 @@ import type { import { releaseStoredStructuredAgentSessionOwner } from './structured-agent-session-lease-release' import { resumeHeldStructuredAgentSession } from './structured-agent-session-hold-resume' import type { AgentSessionWireRefusal } from '../../../shared/agent-session-wire' +import { settleStructuredAgentSessionDeadGeneration } from './structured-agent-session-dead-generation-settlement' export type StructuredAgentSessionLifetimeContext = { deps: StructuredAgentSessionHostDeps @@ -49,29 +50,75 @@ function hasProviderChild( return context.sessions.get(sessionId)?.hasProviderChild === true } +/** The wind-down this host owes for the session's child. A live child always owes one, whatever a + * previous childless eviction recorded — the same session object is re-acquired in place on a + * handoff back to native, so a remembered `false` must never outrank the child in front of it. */ +function owesProviderChildWindDown(session: StructuredAgentSessionHostSession): boolean { + return session.hasProviderChild || session.owesProviderChildWindDown === true +} + /** Runs the eviction steps under a deadline. A step that fails — or runs out of time — aborts the * rest, which leaves the session indexed and the child loaded so the next close is a real retry. */ export async function evictHeldStructuredAgentSession( context: StructuredAgentSessionLifetimeContext, sessionId: string ): Promise { - if (!context.sessions.has(sessionId)) { + const session = context.sessions.get(sessionId) + if (!session) { return } + // The obligation OUTLIVES the child. `hasProviderChild` is retired the instant the adapter + // proves the exit, so a step that aborts after that point would otherwise leave the retry + // reading "no child here" and skipping the settlement and the lease release it still owes. + const owesWindDown = owesProviderChildWindDown(session) + session.owesProviderChildWindDown = owesWindDown + let settlementError: unknown const eviction: StructuredAgentSessionEvictionContext = { sessionId, - hasProviderChild: hasProviderChild(context, sessionId), + // The retry must not re-stop a child the adapter already proved gone, so this stays honest. + hasProviderChild: session.hasProviderChild, + owesProviderChildWindDown: owesWindDown, eventSink: context.runtimeState.eventSinkFor(sessionId), adapter: context.deps.adapter, - forget: () => forgetStructuredAgentSession(context, sessionId), + // Host state must not disagree with the adapter for the seven steps in between. + onProviderChildStopped: () => { + session.hasProviderChild = false + }, + forget: async () => { + await forgetStructuredAgentSession(context, sessionId) + context.deps.adapter.acknowledgeSessionRelease?.(sessionId) + }, discardSink: () => context.runtimeState.discardEventSink(sessionId), - releaseLease: () => - releaseStoredStructuredAgentSessionOwner({ + settleWork: async () => { + const settled = await settleStructuredAgentSessionDeadGeneration({ + journal: session.journal, + sessionId, + fence: session.fence, + settlementId: `expected-close:${sessionId}:${session.fence}:${session.acquisitionGeneration ?? 'unknown'}`, + pendingSubmissionReason: 'provider_closed_before_acknowledgement', + verdict: { state: 'interrupted', completedAt: context.now() }, + showUnexpectedExitOutcome: false, + onError: (id, error) => { + settlementError = error + context.deps.onEventSinkError?.({ sessionId: id, error }) + } + }) + if (!settled) { + // Without the cause the quit log names the step and nothing else. + throw new Error('dead generation work settlement failed', { cause: settlementError }) + } + }, + releaseLease: async () => { + await releaseStoredStructuredAgentSessionOwner({ store: context.deps.store, sessionId, - hasProviderChild: hasProviderChild(context, sessionId), + hasProviderChild: owesWindDown, + expectedFence: session.fence, now: context.now() }) + session.owesProviderChildWindDown = false + context.forgetStatus(sessionId) + } } await evictStructuredAgentSession( eviction, @@ -79,6 +126,38 @@ export async function evictHeldStructuredAgentSession( ) } +/** Stops every provider child owned by this host while keeping failed evictions reachable. A + * session whose child is already stopped but whose wind-down aborted is still in scope — that is + * the retry. */ +export async function evictOwnedStructuredAgentSessions( + context: StructuredAgentSessionLifetimeContext, + retainOnFailure: Set +): Promise { + const ownedSessionIds = [...context.sessions] + .filter(([, session]) => owesProviderChildWindDown(session)) + .map(([sessionId]) => sessionId) + // Retained up front and cleared only once an eviction settles: the quit phase is bounded, and a + // timeout leaves these still running. Closing their journals underneath them is the one outcome + // the retain set exists to prevent. + for (const sessionId of ownedSessionIds) { + retainOnFailure.add(sessionId) + } + const failures: unknown[] = [] + await Promise.all( + ownedSessionIds.map(async (sessionId) => { + try { + await evictHeldStructuredAgentSession(context, sessionId) + retainOnFailure.delete(sessionId) + } catch (error) { + failures.push(error) + } + }) + ) + if (failures.length > 0) { + throw new AggregateError(failures, 'structured agent-session child eviction failed') + } +} + /** The first hold on a childless session: reconcile the lease, settle recovery, then attach. */ export async function resumeStructuredAgentSessionForHold( context: StructuredAgentSessionLifetimeContext & { diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-host-teardown.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-host-teardown.ts index b948ac08abd..a4e53d2f4c7 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-host-teardown.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-host-teardown.ts @@ -18,6 +18,26 @@ export type StructuredAgentSessionTeardownPhase = { /** Quit must not wait indefinitely on an in-flight handoff; see `drain-handoffs` below. */ const HANDOFF_DRAIN_TIMEOUT_MS = 5_000 +/** Eight steps at ten seconds each would outlast the global quit deadline, and a quit that dies + * mid-eviction leaves the lease unreleased — the exact state restart has to clean up. Bounded + * well below that deadline so the phases after this one still get to run. */ +const CHILD_EVICTION_TIMEOUT_MS = 8_000 + +/** Bounds a phase without swallowing its failure, which `withTimeout` alone would. */ +async function withPhaseTimeout(run: () => Promise, timeoutMs: number): Promise { + const settled = run().then( + () => ({ failed: false }) as const, + (error: unknown) => ({ failed: true, error }) as const + ) + const outcome = await withTimeout | null>(settled, timeoutMs, null) + if (outcome === null) { + throw new Error(`agent session host teardown phase did not finish within ${timeoutMs}ms`) + } + if (outcome.failed) { + throw outcome.error + } +} + /** * The quit-path phase order, which is load-bearing rather than incidental. * @@ -34,6 +54,7 @@ export function structuredAgentSessionHostTeardownPhases(collaborators: { } handoffs: { stopTuiHistoryCatchup: () => void; drain: () => Promise } tasks: { drainAttaches: () => Promise } + evictOwnedSessions: () => Promise }): StructuredAgentSessionTeardownPhase[] { return [ { name: 'dispose-holds', run: () => collaborators.holds.dispose() }, @@ -44,6 +65,10 @@ export function structuredAgentSessionHostTeardownPhases(collaborators: { run: () => withTimeout(collaborators.handoffs.drain(), HANDOFF_DRAIN_TIMEOUT_MS, undefined) }, { name: 'drain-attaches', run: () => collaborators.tasks.drainAttaches() }, + { + name: 'evict-owned-sessions', + run: () => withPhaseTimeout(collaborators.evictOwnedSessions, CHILD_EVICTION_TIMEOUT_MS) + }, { name: 'flush-event-sinks', run: () => collaborators.runtimeState.flushAllEventSinks() } ] } @@ -51,6 +76,8 @@ export function structuredAgentSessionHostTeardownPhases(collaborators: { export async function tearDownStructuredAgentSessionHost(input: { phases: readonly StructuredAgentSessionTeardownPhase[] sessions: Map + retainSessionIds?: ReadonlySet + acknowledgeSessionRelease?: (sessionId: string) => void }): Promise { const failures: unknown[] = [] for (const phase of input.phases) { @@ -61,7 +88,9 @@ export async function tearDownStructuredAgentSessionHost(input: { } } - const entries = [...input.sessions.entries()] + const entries = [...input.sessions.entries()].filter( + ([sessionId]) => !input.retainSessionIds?.has(sessionId) + ) // `allSettled`, so one rejected close cannot skip the others. const closed = await Promise.allSettled(entries.map(([, session]) => session.journal.close())) closed.forEach((result, index) => { @@ -71,6 +100,7 @@ export async function tearDownStructuredAgentSessionHost(input: { // which is what makes a later close a real retry rather than a no-op. if (sessionId !== undefined) { input.sessions.delete(sessionId) + input.acknowledgeSessionRelease?.(sessionId) } return } diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts index 50b913ee8bd..7131631f4ff 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts @@ -31,6 +31,11 @@ export type StructuredAgentSessionHostSession = { * restored for reading has none, and neither has a session a TUI owns — so neither may be * evicted to free a child, and neither may have its lease released as an observed exit. */ hasProviderChild: boolean + /** The wind-down this host still owes for a child it started: settling that generation's work + * and handing the lease back. A separate fact from `hasProviderChild`, which goes false the + * moment the adapter proves the exit — an eviction that aborts after that point must still be + * able to finish the wind-down on the next close. */ + owesProviderChildWindDown?: boolean /** Exact adapter acquisition behind `hasProviderChild`; retained after exit to fence recovery. */ acquisitionGeneration: string | null } diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts index 176cd66b674..c60d9e5db26 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts @@ -23,6 +23,7 @@ import { StructuredAgentSessionHostRuntimeState } from './structured-agent-sessi import { attachStructuredAgentSession } from './structured-agent-session-attach-orchestration' import { createStructuredAgentSessionHolds, + evictOwnedStructuredAgentSessions, evictHeldStructuredAgentSession, type StructuredAgentSessionLifetimeContext } from './structured-agent-session-host-lifetime' @@ -244,14 +245,20 @@ export class StructuredAgentSessionHost { this.runtimeState.flushEventSink(sessionId) async flushAllStreamedEvents(): Promise { + const retainSessionIds = new Set() await tearDownStructuredAgentSessionHost({ phases: structuredAgentSessionHostTeardownPhases({ holds: this.holds, runtimeState: this.runtimeState, handoffs: this.handoffs, - tasks: this.tasks + tasks: this.tasks, + evictOwnedSessions: () => + evictOwnedStructuredAgentSessions(this.lifetimeContext(), retainSessionIds) }), - sessions: this.sessions + sessions: this.sessions, + retainSessionIds, + acknowledgeSessionRelease: (sessionId) => + this.deps.adapter.acknowledgeSessionRelease?.(sessionId) }).finally(() => this.clientDelivery.closeAll()) } diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-journal-handles.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-journal-handles.test.ts index b1cfd81b2a5..ea32f171570 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-journal-handles.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-journal-handles.test.ts @@ -197,9 +197,15 @@ describe('site 11: host teardown is failure-complete', () => { it('closes every journal and clears the map on the happy path', async () => { const sessions = await twoSessions() - await tearDownStructuredAgentSessionHost({ phases: [], sessions }) + const acknowledgeSessionRelease = vi.fn() + await tearDownStructuredAgentSessionHost({ + phases: [], + sessions, + acknowledgeSessionRelease + }) expect(sessions.size).toBe(0) + expect(acknowledgeSessionRelease.mock.calls).toEqual([[SESSION], [`${SESSION}-b`]]) await expectNothingHoldsTheDirectory(journalDir) await expectNothingHoldsTheDirectory(join(root, 'journal-b')) }) @@ -231,6 +237,7 @@ describe('site 11: host teardown is failure-complete', () => { it('keeps the entry whose close rejected, and surfaces the rejection', async () => { const sessions = await twoSessions() + const acknowledgeSessionRelease = vi.fn() const failing = sessions.get(SESSION) const closeError = new Error('close rejected') if (failing) { @@ -240,11 +247,12 @@ describe('site 11: host teardown is failure-complete', () => { } await expect( - tearDownStructuredAgentSessionHost({ phases: [], sessions }) + tearDownStructuredAgentSessionHost({ phases: [], sessions, acknowledgeSessionRelease }) ).rejects.toMatchObject({ errors: [closeError] }) // Only the failure stays indexed — `status === 'fulfilled'`, not "settled". expect([...sessions.keys()]).toEqual([SESSION]) + expect(acknowledgeSessionRelease).toHaveBeenCalledExactlyOnceWith(`${SESSION}-b`) await expectNothingHoldsTheDirectory(join(root, 'journal-b')) }) }) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-lease-release.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-lease-release.ts index 8d6cfc39ae2..bacc56fbcaf 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-lease-release.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-lease-release.ts @@ -12,29 +12,39 @@ import { import type { AgentSessionRecordStore } from '../../runtime/agent-session-record-store' import type { AgentSessionRecord } from '../../../shared/agent-session-record' +export type StructuredAgentSessionLeaseStore = Pick< + AgentSessionRecordStore, + 'getRecord' | 'transitionHandoff' +> + export async function releaseStoredStructuredAgentSessionOwner(input: { - store: AgentSessionRecordStore + store: StructuredAgentSessionLeaseStore sessionId: string hasProviderChild: boolean + expectedFence: number now: number }): Promise { if (!input.hasProviderChild) { return } const record = input.store.getRecord(input.sessionId) - if (!record || !isSurfaceReleasableAgentSessionRecord(record)) { + if ( + !record || + record.lease.runtimeFence !== input.expectedFence || + !isSurfaceReleasableAgentSessionRecord(record) + ) { return } await releaseStoredAgentSessionOwnerAfterSurfaceClose(input.store, { sessionId: input.sessionId, - expectedFence: record.lease.runtimeFence, + expectedFence: input.expectedFence, now: input.now }) } /** Releases only the exact provider child whose exit the adapter positively observed. */ export async function releaseStoredStructuredAgentSessionOwnerAfterUnexpectedExit(input: { - store: AgentSessionRecordStore + store: StructuredAgentSessionLeaseStore sessionId: string expectedFence: number expectedAcquisitionGeneration: string diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-provider-restore.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-provider-restore.test.ts index cfcae081b88..c8a2e4bba14 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-provider-restore.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-provider-restore.test.ts @@ -58,8 +58,15 @@ function createHost( return host } +async function abandonHost(host: StructuredAgentSessionHost): Promise { + host['runtimeState'].stopLeaseRenewal() + host['holds'].dispose() + await Promise.all([...host['sessions'].values()].map((session) => session.journal.close())) + host['sessions'].clear() +} + afterEach(async () => { - await Promise.all(hosts.splice(0).map((host) => host.flushAllStreamedEvents())) + await Promise.all(hosts.splice(0).map(abandonHost)) await rm(root, { recursive: true, force: true }) root = '' }) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-recovery-exits.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-recovery-exits.test.ts index 5cd888cc5cc..7cd92bf521b 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-recovery-exits.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-recovery-exits.test.ts @@ -82,8 +82,17 @@ function openHost(overrides: Partial = {}): void }) } +async function abandonHost(abandonedHost: StructuredAgentSessionHost): Promise { + abandonedHost['runtimeState'].stopLeaseRenewal() + abandonedHost['holds'].dispose() + await Promise.all( + [...abandonedHost['sessions'].values()].map((session) => session.journal.close()) + ) + abandonedHost['sessions'].clear() +} + async function reopenStore(): Promise { - await host.flushAllStreamedEvents() + await abandonHost(host) store = await AgentSessionRecordStore.open({ directory: join(root, 'store'), hostId: 'local' }) } @@ -110,8 +119,8 @@ beforeEach(async () => { }) afterEach(async () => { - await host.flushAllStreamedEvents() - await Promise.all([...supersededHosts].map((superseded) => superseded.flushAllStreamedEvents())) + await abandonHost(host) + await Promise.all([...supersededHosts].map(abandonHost)) supersededHosts.clear() await Promise.all([...spawnedOwners].map((child) => stopOwner(child))) await rm(root, { recursive: true, force: true }) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-refusal-retry.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-refusal-retry.test.ts index f021689db08..ccad5f7225f 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-refusal-retry.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-refusal-retry.test.ts @@ -119,9 +119,16 @@ async function createHarness(options: { attached?: boolean; transport?: boolean return harness } +async function abandonHost(host: StructuredAgentSessionHost): Promise { + host['runtimeState'].stopLeaseRenewal() + host['holds'].dispose() + await Promise.all([...host['sessions'].values()].map((session) => session.journal.close())) + host['sessions'].clear() +} + afterEach(async () => { const completed = harnesses.splice(0) - await Promise.all(completed.map(async ({ host }) => host.flushAllStreamedEvents())) + await Promise.all(completed.map(async ({ host }) => abandonHost(host))) await Promise.all(completed.map(async ({ root }) => rm(root, { recursive: true }))) }) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.test.ts new file mode 100644 index 00000000000..c0d29f6b9ef --- /dev/null +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.test.ts @@ -0,0 +1,190 @@ +// The settlement latch governs EVERY unclean restart — SIGKILL, force quit, OOM, a quit that blew +// its deadline — so the evidence it reads decides whether the user sees a failure notice at all. + +import { mkdtemp, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import type { + AgentSessionDeathEvidence, + AgentSessionRecord +} from '../../../shared/agent-session-record' +import { agentSessionRecordFixture } from '../../../shared/agent-session-record.test-fixture' +import { openAgentSessionJournal } from '../agent-session-journal/journal-store-factory' +import type { AgentSessionJournal } from '../agent-session-journal/journal-store' +import type { StructuredAgentSessionLeaseStore } from './structured-agent-session-lease-release' +import { retryLoadedStructuredAgentSessionSettlement } from './structured-agent-session-settlement-retry' + +const SESSION = 'session-alpha-1' +const THREAD = 'thread-1' +const FENCE = 8 + +let root: string +let journal: AgentSessionJournal +let record: AgentSessionRecord + +function store(): StructuredAgentSessionLeaseStore { + return { + getRecord: () => record, + transitionHandoff: async (_sessionId, transition) => { + record = transition(record) + return record + } + } +} + +function retry(settlementId: string, deathEvidence: AgentSessionDeathEvidence) { + record = agentSessionRecordFixture({ + ...agentSessionRecordFixture().lease, + runtimeKind: 'native', + runtimeFence: FENCE, + deathEvidence, + settlementRetryRequired: true, + settlementRetryId: settlementId + }) + return retryLoadedStructuredAgentSessionSettlement({ + deps: { store: store() }, + sessionId: SESSION, + session: { journal, fence: FENCE, acquisitionGeneration: null }, + now: () => 2_000 + }) +} + +function statusTexts(): string[] { + return journal + .snapshot() + .items.flatMap((item) => (item.body.kind === 'status' ? [item.body.text] : [])) +} + +beforeEach(async () => { + root = await mkdtemp(join(tmpdir(), 'orca-settlement-retry-')) + journal = await openAgentSessionJournal({ + identity: { + sessionId: SESSION, + workspaceId: 'workspace-1', + hostId: 'local', + agent: 'codex', + providerHandle: { kind: 'codex', threadId: THREAD } + }, + journalDir: root, + now: () => 1_000 + }) +}) + +/** A turn the dead generation left running: work to settle either way. */ +async function seedRunningTurn(): Promise { + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 1 }, + { kind: 'turn', turnId: 'turn-1', state: 'running', startedAt: 900 }, + { fence: FENCE } + ) +} + +/** The provider died while the user, not the provider, held the conversation. */ +async function seedIdlePendingApproval(): Promise { + await journal.appendItem( + { provider: 'codex', threadId: THREAD, turnId: 'turn-1', ordinal: 1 }, + { + kind: 'approval', + title: 'Run command?', + detail: null, + options: [{ id: 'yes', label: 'Allow' }], + resolution: { state: 'pending', selectedOptionId: null, resolvedBy: null, resolvedAt: null } + }, + { fence: FENCE } + ) +} + +afterEach(async () => { + await journal.close() + await rm(root, { recursive: true, force: true }) +}) + +describe('pending settlement retry', () => { + it('writes no status row when the death was only adjudicated, not witnessed', async () => { + await seedRunningTurn() + + await expect( + retry(`restart-eviction:${SESSION}:${FENCE}`, { + kind: 'pid-absent', + detail: 'recorded pid absent on host', + observedAt: 1_500 + }) + ).resolves.toBe(true) + + expect(statusTexts()).toEqual([]) + expect(journal.snapshot().items.map((item) => item.body)).toContainEqual( + expect.objectContaining({ kind: 'turn', state: 'unverifiable' }) + ) + expect(record.lease.settlementRetryRequired).toBeUndefined() + }) + + it('writes no status row for an identity mismatch either', async () => { + await seedRunningTurn() + + await expect( + retry(`restart-eviction:${SESSION}:${FENCE}`, { + kind: 'identity-mismatch', + detail: 'mismatched spawn-token', + observedAt: 1_500 + }) + ).resolves.toBe(true) + + expect(statusTexts()).toEqual([]) + }) + + it('reads the evidence, not the settlement id, when deciding to speak', async () => { + // Pins the discriminator: the id shape that normally accompanies a witnessed exit must not + // earn the notice on its own. + await seedRunningTurn() + + await expect( + retry(`provider-exit:${SESSION}:${FENCE}:generation-1`, { + kind: 'pid-absent', + detail: 'recorded pid absent on host', + observedAt: 1_500 + }) + ).resolves.toBe(true) + + expect(statusTexts()).toEqual([]) + }) + + it('writes user-facing copy carrying the cause when the exit was observed', async () => { + await seedRunningTurn() + + await expect( + retry(`provider-exit:${SESSION}:${FENCE}:generation-1`, { + kind: 'exit-observed', + detail: 'transport closed', + observedAt: 1_500 + }) + ).resolves.toBe(true) + + expect(statusTexts()).toEqual([ + 'The provider stopped while this response was in progress: transport closed. You can continue in this conversation.' + ]) + expect(journal.snapshot().items.map((item) => item.body)).toContainEqual( + expect.objectContaining({ kind: 'turn', state: 'interrupted', completedAt: 1_500 }) + ) + }) + + it('stays silent about a witnessed exit that interrupted nothing but a waiting prompt', async () => { + await seedIdlePendingApproval() + + await expect( + retry(`provider-exit:${SESSION}:${FENCE}:generation-1`, { + kind: 'exit-observed', + detail: 'transport closed', + observedAt: 1_500 + }) + ).resolves.toBe(true) + + expect(statusTexts()).toEqual([]) + expect(journal.snapshot().items.map((item) => item.body)).toContainEqual( + expect.objectContaining({ + kind: 'approval', + resolution: expect.objectContaining({ state: 'cancelled' }) + }) + ) + }) +}) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.ts index 4e5de3f2566..120eeaeb635 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-settlement-retry.ts @@ -4,11 +4,13 @@ import type { StructuredAgentSessionHostDeps, StructuredAgentSessionHostSession } from './structured-agent-session-host-types' +import type { StructuredAgentSessionLeaseStore } from './structured-agent-session-lease-release' import { turnVerdictFromDeathEvidence } from './structured-agent-session-stale-turn-verdict' import { - retryUnexpectedExitSettlement, - type StructuredAgentSessionUnexpectedExitContext -} from './structured-agent-session-unexpected-exit' + captureUnfinishedStructuredAgentSessionWork, + settleStructuredAgentSessionDeadGeneration, + unfinishedStructuredAgentSessionWorkWasInterrupted +} from './structured-agent-session-dead-generation-settlement' export async function retryPendingStructuredAgentSessionSettlement(input: { deps: StructuredAgentSessionHostDeps @@ -56,7 +58,10 @@ export async function retryPendingStructuredAgentSessionSettlement(input: { } export async function retryLoadedStructuredAgentSessionSettlement(input: { - deps: Pick + deps: { + store: StructuredAgentSessionLeaseStore + onEventSinkError?: StructuredAgentSessionHostDeps['onEventSinkError'] + } sessionId: string session: Pick now: () => number @@ -67,23 +72,32 @@ export async function retryLoadedStructuredAgentSessionSettlement(input: { } const retrySession = input.session retrySession.fence = record.lease.runtimeFence - const context: Pick = { - onBarrierError: (id, error) => input.deps.onEventSinkError?.({ sessionId: id, error }) - } - const ok = await retryUnexpectedExitSettlement({ - context, - event: { - type: 'ended', - sessionId: input.sessionId, - reason: record.lease.deathEvidence?.detail ?? 'provider exited', - cause: 'unexpected-exit', - fence: record.lease.runtimeFence, - acquisitionGeneration: retrySession.acquisitionGeneration ?? 'recovery' - }, - session: retrySession, - stableSettlementId: record.lease.settlementRetryId, - // Only an observed exit earns an end time; a probe-proven death never saw one. - verdict: turnVerdictFromDeathEvidence(record.lease.deathEvidence) + const onError = (id: string, error: unknown): void => + input.deps.onEventSinkError?.({ sessionId: id, error }) + // Only an observed exit earns an end time; a probe-proven death never saw one. + const verdict = turnVerdictFromDeathEvidence(record.lease.deathEvidence) + const ok = await settleStructuredAgentSessionDeadGeneration({ + journal: retrySession.journal, + sessionId: input.sessionId, + fence: retrySession.fence, + settlementId: record.lease.settlementRetryId, + pendingSubmissionReason: 'provider_exited_before_acknowledgement', + verdict, + // The same evidence decides the copy: only a witnessed death is worth telling the user + // about. An unverifiable one is a restart artefact, and the session stays sendable. The + // work check matches the live exit path — a provider that died waiting on a prompt + // interrupted no response, so it must not claim one was in progress. + showUnexpectedExitOutcome: + verdict.state === 'interrupted' && + unfinishedStructuredAgentSessionWorkWasInterrupted( + captureUnfinishedStructuredAgentSessionWork(retrySession.journal), + retrySession.journal, + verdict.completedAt + ), + ...(record.lease.deathEvidence?.detail + ? { unexpectedExitReason: record.lease.deathEvidence.detail } + : {}), + onError }) if (!ok) { return false diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-surface-lifetime.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-surface-lifetime.test.ts index 678b790ed4e..2538b61c84b 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-surface-lifetime.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-surface-lifetime.test.ts @@ -3,13 +3,14 @@ // Two leaks meet here and each has to be tested against the real host, not a double: a chat that // closes without stopping its app-server, and a launch that starts one for every record on disk. -import { mkdtemp, rm } from 'node:fs/promises' +import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi, type Mock } from 'vitest' import type { AgentSessionOwnerProbe } from '../../../shared/agent-session-lease-adjudication' import { hasUnansweredStructuredAgentSessionDispatch } from '../../../shared/structured-agent-session-projection' import { computeAgentSessionPayloadFingerprint } from '../../../shared/agent-session-mutation-envelope' +import type { AgentJournalSubmission } from '../../../shared/agent-session-journal-types' import type { AgentSessionMutationEnvelope, AgentSessionSubscribeEvent @@ -19,7 +20,13 @@ import { AgentSessionRecordStore } from '../../runtime/agent-session-record-stor import type { StructuredAgentSessionAdapter } from './structured-agent-session-adapter' import type { StructuredAgentSessionEventSink } from './structured-agent-session-event-sink' import { StructuredAgentSessionHost } from './structured-agent-session-host' -import type { StructuredAgentSessionHandoffTransport } from './structured-agent-session-handoff-types' +import type { + StructuredAgentSessionHandoffTransport, + StructuredTuiOwner +} from './structured-agent-session-handoff-types' +import { StructuredHandoffTestRequests } from './structured-agent-session-handoff-test-requests' +import { unexpectedProviderExitOutcome } from './structured-agent-session-dead-generation-settlement' +import type { StructuredAgentSessionStatusSink } from './structured-agent-session-status-feed' import { HOST_TEST_NOW as NOW, HOST_TEST_SESSION as SESSION, @@ -43,6 +50,7 @@ let closeSession: Mock let sink: StructuredAgentSessionEventSink | null let hostErrors: unknown[] +let statusSink: StructuredAgentSessionStatusSink function adapter(): StructuredAgentSessionAdapter { return { acquire, @@ -68,6 +76,7 @@ function openHost( releaseGraceMs: GRACE_MS, now: () => NOW, onEventSinkError: ({ error }) => hostErrors.push(error), + statusSink, ...(probeOwner ? { probeOwner: probeOwner as never } : {}), ...(handoffTransport ? { handoffTransport } : {}) }) @@ -119,11 +128,111 @@ function waitOutSeveralGraceWindows(): Promise { return new Promise((resolve) => setTimeout(resolve, GRACE_MS * 20)) } +const handoffRequests = new StructuredHandoffTestRequests( + NOW, + SESSION, + () => store.getRecord(SESSION)?.lease.runtimeFence ?? 0 +) +/** Whether the terminal this host handed the session to can be reached again. */ +let tuiRecoverable: boolean + +/** One operation-id source with the rest of the suite, so the durable ledger sees no duplicate. */ +function handoffRequest(direction: 'to-tui' | 'to-native') { + return handoffRequests.request(direction, 'now', { operationId: hostTestOperationId() }) +} + +function tuiOwner(fence: number, spawnToken: string, transcriptPath: string): StructuredTuiOwner { + return { + terminal: { handle: 'term-tui', tabId: 'tab-tui', paneKey: 'pane-tui', ptyId: 'pty-tui' }, + process: { hostId: 'local', pid: 5200, processStartTimeMs: NOW, spawnToken }, + link: { + linkId: `tui-link-${fence}`, + handle: { provider: 'codex', threadId: THREAD }, + origin: 'resumed', + mintedAtFence: fence, + observedAt: NOW + }, + transcriptPath + } +} + +/** A codex rollout the return trip can import, so a real to-native handoff has history to read. */ +async function writeTuiTranscript(): Promise { + const sessionsDir = join(root, 'codex-home', 'sessions', '2026', '08', '12') + await mkdir(sessionsDir, { recursive: true }) + const transcriptPath = join(sessionsDir, `rollout-2026-08-12T10-00-00-${THREAD}.jsonl`) + await writeFile( + transcriptPath, + `${JSON.stringify({ + type: 'session_meta', + timestamp: '2026-08-12T10:00:00.000Z', + payload: { id: THREAD, session_id: THREAD } + })}\n`, + 'utf8' + ) + return transcriptPath +} + +/** Replaces the current host with one that can hand the session to a terminal and take it back. */ +function openHandoffHost(transcriptPath: string): void { + openHost(undefined, { + hostLabel: 'Test host', + launchTui: async ({ fence, spawnToken }) => tuiOwner(fence, spawnToken, transcriptPath), + reproveTuiOwner: async ({ owner }) => owner, + recoverTuiOwner: async (record) => { + if (!tuiRecoverable) { + throw new Error('the owning terminal could not be reached') + } + return tuiOwner( + record.lease.runtimeFence, + record.lease.reservedSpawnToken ?? 'recovered', + transcriptPath + ) + }, + stopRecoveredOwner: async () => undefined, + closeTuiOwner: async (owner) => ({ transcriptPath: owner.transcriptPath }), + waitForTuiExit: async (owner) => ({ transcriptPath: owner.transcriptPath }), + waitForTuiIdleOrExit: async () => 'idle', + tuiStatus: () => 'idle' + }) +} + +/** Fails the next eviction at `drain-published`, which leaves the session indexed for a retry. */ +function failNextDrain(): void { + vi.spyOn(host['runtimeState'].eventSinkFor(SESSION), 'drained').mockResolvedValueOnce({ + ok: false, + error: new Error('drain barrier lost') + }) +} + +/** The submissions as they stood when the session was forgotten; its journal is gone after that. */ +function captureSettledSubmissions(): { value: AgentJournalSubmission[] } { + const captured: { value: AgentJournalSubmission[] } = { value: [] } + const journal = host['sessions'].get(SESSION)!.journal + const closeJournal = journal.close.bind(journal) + vi.spyOn(journal, 'close').mockImplementation(async () => { + captured.value = journal.snapshot().submissions + await closeJournal() + }) + return captured +} + +async function sendPending(text: string): Promise { + dispatch.mockResolvedValueOnce({ state: 'admitted' }) + const body = hostTestMessage(text) + expect( + await host.send(CALLER, { envelope: envelope('agentSession.send', { body }), body }) + ).toMatchObject({ ok: true, value: { submission: { dispatchState: 'pending' } } }) +} + beforeEach(async () => { root = await mkdtemp(join(tmpdir(), 'orca-surface-lifetime-')) + handoffRequests.reset() + tuiRecoverable = true resetHostTestOperationIds() sink = null hostErrors = [] + statusSink = { publish: vi.fn(), forget: vi.fn() } let generation = 0 acquire = vi.fn(async ({ fence, spawnToken, events }) => { sink = events ?? null @@ -235,6 +344,66 @@ describe('a chat that closes', () => { await expect(settlement).resolves.toBeUndefined() }) + + it('retries teardown after journal close loses its result', async () => { + await attach() + const session = host['sessions'].get(SESSION) + expect(session).toBeDefined() + const closeJournal = session!.journal.close.bind(session!.journal) + vi.spyOn(session!.journal, 'close') + .mockImplementationOnce(async () => { + await closeJournal() + throw new Error('journal close result lost') + }) + .mockImplementation(closeJournal) + + await expect(host.close(SESSION)).rejects.toMatchObject({ + step: 'forget-session', + cause: expect.objectContaining({ message: 'journal close result lost' }) + }) + expect(host.hasSession(SESSION)).toBe(true) + expect(host['sessions'].get(SESSION)?.hasProviderChild).toBe(false) + expect(store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null + }) + expect(statusSink.forget).toHaveBeenCalledWith(SESSION) + + await expect(host.close(SESSION)).resolves.toBeUndefined() + expect(host.hasSession(SESSION)).toBe(false) + expect(closeSession).toHaveBeenCalledOnce() + }) + + it('settles and releases on the retry when a step after the child stopped aborts', async () => { + await attach() + dispatch.mockResolvedValueOnce({ state: 'admitted' }) + const body = hostTestMessage('pending across an aborted eviction') + const sent = await host.send(CALLER, { + envelope: envelope('agentSession.send', { body }), + body + }) + expect(sent).toMatchObject({ ok: true, value: { submission: { dispatchState: 'pending' } } }) + const session = host['sessions'].get(SESSION) + expect(session).toBeDefined() + vi.spyOn(host['runtimeState'].eventSinkFor(SESSION), 'drained').mockResolvedValueOnce({ + ok: false, + error: new Error('drain barrier lost') + }) + const settled = captureSettledSubmissions() + + await expect(host.close(SESSION)).rejects.toMatchObject({ step: 'drain-published' }) + // The child is proven gone, but the wind-down it owes is not done: nothing settled, no release. + expect(session!.hasProviderChild).toBe(false) + expect(store.getRecord(SESSION)?.lease.claimStatus).not.toBe('released') + + await expect(host.close(SESSION)).resolves.toBeUndefined() + expect(closeSession).toHaveBeenCalledOnce() + expect(store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null + }) + expect(hasUnansweredStructuredAgentSessionDispatch(settled.value)).toBe(false) + }) }) describe('a session with a turn in flight', () => { @@ -258,6 +427,35 @@ describe('a session with a turn in flight', () => { }) describe('startup', () => { + it('settles an idle absent owner without chat pollution and resumes the same provider identity', async () => { + await attach() + const beforeRestart = store.getRecord(SESSION) + host['runtimeState'].stopLeaseRenewal() + host['holds'].dispose() + await host['sessions'].get(SESSION)?.journal.close() + host['sessions'].clear() + + store = await AgentSessionRecordStore.open({ directory: join(root, 'store'), hostId: 'local' }) + openHost(async () => ({ outcome: 'pid-absent' })) + await host.restoreReadableSessions() + + const restored = host.history({ sessionId: SESSION, direction: 'tail' }) + expect(restored.ok && restored.page.items.some((item) => item.body.kind === 'status')).toBe( + false + ) + expect(store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null, + settlementRetryRequired: undefined + }) + + await host.hold(SESSION, SURFACE) + expect(store.getRecord(SESSION)?.providerHandleChain.at(-1)?.handle).toEqual( + beforeRestart?.providerHandleChain.at(-1)?.handle + ) + expect(store.getRecord(SESSION)?.providerHandleChain.at(-1)?.origin).toBe('resumed') + }) + it('restores a session for reading without spawning a provider child', async () => { await attach() await reboot() @@ -377,7 +575,7 @@ describe('an unexpected provider exit', () => { history.page.items.some( (item) => item.body.kind === 'status' && item.body.text.includes('journal sink failure') ) - ).toBe(true) + ).toBe(false) // Replace the failed cached sink so suite cleanup can drain the host. ;( @@ -525,13 +723,13 @@ describe('an unexpected provider exit', () => { expect(hostErrors).toContainEqual(expect.objectContaining({ message: 'journal failed' })) const history = host.history({ sessionId: SESSION, direction: 'tail' }) expect(history.ok && history.page.submissions[0]?.dispatchState).toBe('unknown') - expect( - history.ok && - history.page.items.some( - (item) => - item.body.kind === 'status' && item.body.text === 'Provider exited: provider exited' - ) - ).toBe(true) + // A send whose delivery outcome is unknown IS work in progress, so the reassuring outcome is + // written — carrying the cause, and never the old bare `Provider exited: ` row. + const statuses = history.ok + ? history.page.items.flatMap((item) => (item.body.kind === 'status' ? [item.body.text] : [])) + : [] + expect(statuses).toEqual([unexpectedProviderExitOutcome('provider exited')]) + expect(statuses.some((text) => text.startsWith('Provider exited'))).toBe(false) dispatch.mockResolvedValueOnce({ state: 'accepted', @@ -547,6 +745,8 @@ describe('an unexpected provider exit', () => { it('latches a failed exit settlement and blocks attach until the terminal batch is written', async () => { await attach() await host.hold(SESSION, SURFACE) + emitTurnLifecycle('running', 1) + await host.flushStreamedEvents(SESSION) const runtimeState = ( host as unknown as { runtimeState: { lifecycleBarrier: () => Promise<{ ok: false; error: Error }> } @@ -605,3 +805,82 @@ describe('an unexpected provider exit', () => { expect(acquire).toHaveBeenCalledTimes(2) }) }) + +describe('a chat handed to a terminal and taken back', () => { + // The wind-down a close owes belongs to the child in front of it, not to whatever the LAST + // eviction found. A session a terminal owns is indexed with no child of its own, so a close + // there records "nothing owed" — and the trip back re-acquires into that SAME session object. + it('settles and releases the child it was given back', async () => { + const transcriptPath = await writeTuiTranscript() + await host.flushAllStreamedEvents() + openHandoffHost(transcriptPath) + await attach() + expect(await host.requestHandoff(CALLER, handoffRequest('to-tui'))).toMatchObject({ ok: true }) + await vi.waitFor(async () => + expect(await host.handoffStatus(SESSION)).toMatchObject({ owner: 'tui' }) + ) + + // The app restarts and cannot reach the terminal, so this generation restores the session for + // reading and holds no handle to the owner it would otherwise stop on a close. + await host.flushAllStreamedEvents() + store = await AgentSessionRecordStore.open({ directory: join(root, 'store'), hostId: 'local' }) + tuiRecoverable = false + openHandoffHost(transcriptPath) + await host.restoreReadableSessions() + expect(store.getRecord(SESSION)?.lease).toMatchObject({ + runtimeKind: 'tui', + claimStatus: 'live' + }) + + failNextDrain() + await expect(host.close(SESSION)).rejects.toMatchObject({ step: 'drain-published' }) + expect(host.hasSession(SESSION)).toBe(true) + + // The terminal answers again, and the status read the reopened pane makes recovers the owner. + tuiRecoverable = true + expect(await host.handoffStatus(SESSION)).toMatchObject({ owner: 'tui' }) + expect(await host.requestHandoff(CALLER, handoffRequest('to-native'))).toMatchObject({ + ok: true + }) + await vi.waitFor(async () => + expect(await host.handoffStatus(SESSION)).toMatchObject({ owner: 'native' }) + ) + expect(host['sessions'].get(SESSION)?.hasProviderChild).toBe(true) + await sendPending('pending when the retaken chat closes') + const settled = captureSettledSubmissions() + + await expect(host.close(SESSION)).resolves.toBeUndefined() + + expect(store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null + }) + expect(hasUnansweredStructuredAgentSessionDispatch(settled.value)).toBe(false) + }) +}) + +describe('a quit over an eviction that never got its retry', () => { + // Nothing calls `close` a second time when the user quits instead of reopening the chat, so the + // quit sweep is the last thing that can hand the lease back — and it only reaches the session if + // it still counts a stopped child's unfinished wind-down as owed. + it('finishes the wind-down the aborted close left behind', async () => { + await attach() + await sendPending('pending across an abandoned eviction') + const settled = captureSettledSubmissions() + failNextDrain() + + await expect(host.close(SESSION)).rejects.toMatchObject({ step: 'drain-published' }) + expect(host['sessions'].get(SESSION)?.hasProviderChild).toBe(false) + expect(store.getRecord(SESSION)?.lease.claimStatus).not.toBe('released') + + await host.flushAllStreamedEvents() + + expect(closeSession).toHaveBeenCalledOnce() + expect(host.hasSession(SESSION)).toBe(false) + expect(store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null + }) + expect(hasUnansweredStructuredAgentSessionDispatch(settled.value)).toBe(false) + }) +}) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-teardown-handoff-drain.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-teardown-handoff-drain.test.ts index 340d45c05af..12d3e6dfe43 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-teardown-handoff-drain.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-teardown-handoff-drain.test.ts @@ -11,6 +11,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { AgentSessionRecordStore } from '../../runtime/agent-session-record-store' import type { StructuredAgentSessionAdapter } from './structured-agent-session-adapter' import { StructuredAgentSessionHost } from './structured-agent-session-host' +import { structuredAgentSessionHostTeardownPhases } from './structured-agent-session-host-teardown' import { HOST_TEST_NOW as NOW, HOST_TEST_SESSION as SESSION, @@ -147,6 +148,26 @@ describe('structured agent-session host teardown', () => { expect(host.hasSession(SESSION)).toBe(false) }) + it('names every phase, so the quit-path order is pinned rather than incidental', () => { + const noop = async (): Promise => undefined + const phases = structuredAgentSessionHostTeardownPhases({ + holds: { dispose: noop }, + runtimeState: { stopLeaseRenewal: () => undefined, flushAllEventSinks: noop }, + handoffs: { stopTuiHistoryCatchup: () => undefined, drain: noop }, + tasks: { drainAttaches: noop }, + evictOwnedSessions: noop + }) + expect(phases.map((phase) => phase.name)).toEqual([ + 'dispose-holds', + 'stop-lease-renewal', + 'stop-tui-catchup', + 'drain-handoffs', + 'drain-attaches', + 'evict-owned-sessions', + 'flush-event-sinks' + ]) + }) + it('gives up on a wedged handoff instead of holding the quit open', async () => { const request = requests.request('to-tui', 'now', { operationId: hostTestOperationId() }) expect(await host.requestHandoff(CALLER, request)).toMatchObject({ ok: true }) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.test.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.test.ts index 813e2f8f3e8..8dc2112b18a 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.test.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.test.ts @@ -2,11 +2,18 @@ import { describe, expect, it, vi } from 'vitest' import { agentJournalItemKey } from '../../../shared/agent-session-journal-item-key' import type { AgentJournalRenderItem } from '../../../shared/agent-session-journal-types' import type { AgentSessionRecord } from '../../../shared/agent-session-record' +import { + agentSessionLeaseFixture, + agentSessionRecordFixture +} from '../../../shared/agent-session-record.test-fixture' import type { StructuredAgentSessionHostSession } from './structured-agent-session-host-types' +import { unexpectedProviderExitOutcome } from './structured-agent-session-dead-generation-settlement' import { retryLoadedStructuredAgentSessionSettlement } from './structured-agent-session-settlement-retry' import { isStructuredAgentSessionRecoveryTicketCurrent, settleUnexpectedStructuredAgentSessionExit, + type StructuredAgentSessionUnexpectedExitContext, + type StructuredAgentSessionUnexpectedExitSession, type StructuredAgentSessionRecoveryTicket } from './structured-agent-session-unexpected-exit' @@ -17,8 +24,7 @@ const ticket: StructuredAgentSessionRecoveryTicket = { sessionId: SESSION, releasedFence: 8, deadAcquisitionGeneration: GENERATION, - stableSettlementId: 'settlement-1', - settlementRetryRequired: false + stableSettlementId: 'settlement-1' } function recoveryContext(input: { @@ -48,7 +54,11 @@ function recoveryContext(input: { function lifecycleItem( turnId: string, sequence: number, - turnLifecycle: { state: 'running' | 'completed'; startedAt: number; completedAt?: number } + turnLifecycle: { + state: 'running' | 'completed' | 'interrupted' + startedAt: number + completedAt?: number + } ): AgentJournalRenderItem { return { itemId: agentJournalItemKey({ provider: 'codex', threadId: 'thread-1', turnId, ordinal: 0 }), @@ -59,6 +69,39 @@ function lifecycleItem( } } +function liveRecord(): AgentSessionRecord { + return agentSessionRecordFixture( + agentSessionLeaseFixture({ + sessionId: SESSION, + runtimeKind: 'native', + runtimeFence: 7, + handoffStage: null, + ownerProcess: { + hostId: 'local', + pid: 4242, + processStartTimeMs: 1, + spawnToken: 'spawn-1' + }, + reservedSpawnToken: 'spawn-1', + claimStatus: 'live', + unreconciled: false + }) + ) +} + +function mutableStore() { + let record = liveRecord() + return { + store: { + getRecord: () => record, + transitionHandoff: async ( + _sessionId: string, + transition: (current: AgentSessionRecord) => AgentSessionRecord + ) => (record = transition(record)) + } + } +} + describe('provider-exit recovery tickets', () => { it.each([undefined, 2_000])('keeps exit receipt %s on retry', async (observedAt) => { let now = observedAt === undefined ? 2_000 : 30_000 @@ -200,7 +243,7 @@ describe('provider-exit recovery tickets', () => { } ) - expect(result).toMatchObject({ settlementRetryRequired: false, releasedFence: 8 }) + expect(result).toMatchObject({ releasedFence: 8 }) expect(session.journal.markPendingSubmissionsUnknown).toHaveBeenCalledWith( 7, 'provider_exited_before_acknowledgement' @@ -208,7 +251,7 @@ describe('provider-exit recovery tickets', () => { expect(session.hasProviderChild).toBe(false) // The running row is revised to interrupted at exit receipt, never tombstoned. expect(appendLifecycleBatch).toHaveBeenCalledExactlyOnceWith({ - settlementId: `provider-exit:${SESSION}:7:${GENERATION}`, + settlementId: `dead-generation:provider-exit:${SESSION}:7:${GENERATION}`, fence: 7, recovered: true, mutations: [ @@ -218,7 +261,7 @@ describe('provider-exit recovery tickets', () => { provider: 'orca', clientMessageId: `provider-exit:${SESSION}:7:${GENERATION}` }, - body: { kind: 'status', text: 'Provider exited: provider exited' } + body: { kind: 'status', text: unexpectedProviderExitOutcome('provider exited') } }, { kind: 'item', @@ -235,71 +278,149 @@ describe('provider-exit recovery tickets', () => { }) }) + it.each([ + { initialState: 'running' as const, terminalState: 'completed' as const, expectedOutcomes: 0 }, + { + initialState: 'running' as const, + terminalState: 'interrupted' as const, + expectedOutcomes: 1 + }, + { + initialState: 'interrupted' as const, + terminalState: 'interrupted' as const, + expectedOutcomes: 1 + } + ])( + 'reports $expectedOutcomes outcome(s) when the barrier sees $initialState then $terminalState', + async ({ initialState, terminalState, expectedOutcomes }) => { + let items = [ + lifecycleItem('turn-1', 1, { + state: initialState, + startedAt: 30, + ...(initialState === 'running' ? {} : { completedAt: 40 }) + }) + ] + const appendLifecycleBatch = vi.fn(async (_input: { mutations: readonly unknown[] }) => ({ + epoch: 'epoch-1', + sequence: 3 + })) + const session: StructuredAgentSessionUnexpectedExitSession = { + hasProviderChild: true, + fence: 7, + acquisitionGeneration: GENERATION, + journal: { + snapshot: () => ({ items }), + appendLifecycleBatch, + markPendingSubmissionsUnknown: vi.fn(async () => []) + } + } + + const { store } = mutableStore() + const context: StructuredAgentSessionUnexpectedExitContext = { + store, + sessions: new Map([[SESSION, session]]), + flushLifecycle: async () => { + items = [ + lifecycleItem('turn-1', 1, { + state: terminalState, + startedAt: 30, + completedAt: 40 + }) + ] + return { ok: true } + }, + publishFence: vi.fn(), + hasResumeCapableHolder: () => true, + serialize: async (_sessionId: string, task: () => Promise) => task(), + now: () => 1_234 + } + await settleUnexpectedStructuredAgentSessionExit(context, { + type: 'ended', + sessionId: SESSION, + reason: 'provider exited after completing the turn', + cause: 'unexpected-exit', + fence: 7, + acquisitionGeneration: GENERATION, + observedAt: 40 + }) + + expect(appendLifecycleBatch).toHaveBeenCalledTimes(expectedOutcomes) + if (expectedOutcomes > 0) { + expect(appendLifecycleBatch.mock.calls[0]?.[0].mutations).toEqual([ + expect.objectContaining({ + body: { + kind: 'status', + text: unexpectedProviderExitOutcome('provider exited after completing the turn') + } + }) + ]) + } + } + ) + it('settles a submission the dead child never acknowledged', async () => { const markPendingSubmissionsUnknown = vi.fn(async () => ['client-1']) - const session = { + const session: StructuredAgentSessionUnexpectedExitSession = { hasProviderChild: true, fence: 7, acquisitionGeneration: GENERATION, journal: { snapshot: () => ({ items: [] }), appendLifecycleBatch: vi.fn(async () => ({ epoch: 'epoch-1', sequence: 1 })), - markPendingSubmissionsUnknown + markPendingSubmissionsUnknown, + submissions: () => [{ clientMessageId: 'client-1', dispatchState: 'pending' }] } - } as unknown as StructuredAgentSessionHostSession + } - await settleUnexpectedStructuredAgentSessionExit( - { - store: { - getRecord: () => ({ - lease: { - handoffStage: null, - runtimeFence: 7, - runtimeKind: 'native', - claimStatus: 'live', - ownerProcess: 'provider', - reservedSpawnToken: null, - processlessAt: null - } - }), - transitionHandoff: async () => ({ lease: { runtimeFence: 8 } }) - }, - sessions: new Map([[SESSION, session]]), - flushLifecycle: async () => ({ ok: true }), - publishFence: vi.fn(), - hasResumeCapableHolder: () => true, - serialize: async (_sessionId, task: () => Promise) => task(), - now: () => 1 - } as never, - { - type: 'ended', - sessionId: SESSION, - reason: 'provider exited', - cause: 'unexpected-exit', - fence: 7, - acquisitionGeneration: GENERATION - } - ) + const { store } = mutableStore() + const context: StructuredAgentSessionUnexpectedExitContext = { + store, + sessions: new Map([[SESSION, session]]), + flushLifecycle: async () => ({ ok: true }), + publishFence: vi.fn(), + hasResumeCapableHolder: () => true, + serialize: async (_sessionId: string, task: () => Promise) => task(), + now: () => 1 + } + await settleUnexpectedStructuredAgentSessionExit(context, { + type: 'ended', + sessionId: SESSION, + reason: 'provider exited', + cause: 'unexpected-exit', + fence: 7, + acquisitionGeneration: GENERATION + }) expect(markPendingSubmissionsUnknown).toHaveBeenCalledWith( 7, 'provider_exited_before_acknowledgement' ) + expect(session.journal.appendLifecycleBatch).toHaveBeenCalledWith( + expect.objectContaining({ + mutations: [ + expect.objectContaining({ + body: { kind: 'status', text: unexpectedProviderExitOutcome('provider exited') } + }) + ] + }) + ) }) it('does not release or reacquire while terminal settlement retry is still failing', async () => { - const session = { + const session: StructuredAgentSessionUnexpectedExitSession = { hasProviderChild: true, fence: 7, acquisitionGeneration: GENERATION, journal: { markPendingSubmissionsUnknown: vi.fn(async () => []), - snapshot: () => ({ items: [] }), + snapshot: () => ({ + items: [lifecycleItem('turn-failing', 1, { state: 'running', startedAt: 1 })] + }), appendLifecycleBatch: vi.fn(async () => { throw new Error('journal still unavailable') }) } - } as unknown as StructuredAgentSessionHostSession + } const release = vi.fn() const publishFence = vi.fn() const event = { @@ -310,32 +431,18 @@ describe('provider-exit recovery tickets', () => { fence: 7, acquisitionGeneration: GENERATION } - const result = await settleUnexpectedStructuredAgentSessionExit( - { - store: { - getRecord: () => ({ - lease: { - handoffStage: null, - runtimeFence: 7, - runtimeKind: 'native', - claimStatus: 'live', - ownerProcess: 'provider', - reservedSpawnToken: null, - processlessAt: null - } - }), - transitionHandoff: async () => ({ lease: { runtimeFence: 8 } }) - }, - sessions: new Map([[SESSION, session]]), - flushLifecycle: async () => ({ ok: false, error: new Error('sink failed') }), - publishFence, - hasResumeCapableHolder: () => true, - serialize: async (_sessionId, task) => task(), - now: () => 1, - onBarrierError: release - } as never, - event - ) + const { store } = mutableStore() + const context: StructuredAgentSessionUnexpectedExitContext = { + store, + sessions: new Map([[SESSION, session]]), + flushLifecycle: async () => ({ ok: false, error: new Error('sink failed') }), + publishFence, + hasResumeCapableHolder: () => true, + serialize: async (_sessionId, task) => task(), + now: () => 1, + onBarrierError: release + } + const result = await settleUnexpectedStructuredAgentSessionExit(context, event) expect(result).toBeNull() expect(session.hasProviderChild).toBe(false) diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.ts index c4b32f71647..11d004089ca 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-unexpected-exit.ts @@ -1,23 +1,18 @@ -import { parseAgentJournalItemKey } from '../../../shared/agent-session-journal-item-key' -import { - runningTurnLifecycleRevisions, - type StructuredAgentSessionTurnVerdict -} from './structured-agent-session-stale-turn-verdict' -import type { - AgentJournalItemBody, - AgentJournalRenderItem -} from '../../../shared/agent-session-journal-types' -import type { AgentSessionRecordStore } from '../../runtime/agent-session-record-store' -import { partitionJournalLifecycleMutations } from '../agent-session-journal/journal-lifecycle-batch-partition' -import type { JournalLifecycleMutationInput } from '../agent-session-journal/journal-row-builders' -import { - boundJournalStatusText, - cancelledJournalPromptBody -} from '../agent-session-journal/journal-prompt-body-bounds' import type { StructuredAgentSessionLifecycleEvent } from './structured-agent-session-adapter' import type { StructuredAgentSessionHostSession } from './structured-agent-session-host-types' -import { releaseStoredStructuredAgentSessionOwnerAfterUnexpectedExit } from './structured-agent-session-lease-release' +import { + releaseStoredStructuredAgentSessionOwnerAfterUnexpectedExit, + type StructuredAgentSessionLeaseStore +} from './structured-agent-session-lease-release' import type { StructuredAgentSessionSinkBarrier } from './structured-agent-session-event-sink' +import { + captureUnfinishedStructuredAgentSessionWork, + MAX_UNEXPECTED_EXIT_REASON_CHARS, + settleStructuredAgentSessionDeadGeneration, + type DeadGenerationJournal, + unfinishedStructuredAgentSessionWorkWasInterrupted +} from './structured-agent-session-dead-generation-settlement' +import type { StructuredAgentSessionTurnVerdict } from './structured-agent-session-stale-turn-verdict' type UnexpectedExitLifecycleEvent = StructuredAgentSessionLifecycleEvent & { cause: 'unexpected-exit' @@ -28,14 +23,22 @@ export type StructuredAgentSessionRecoveryTicket = { releasedFence: number deadAcquisitionGeneration: string stableSettlementId: string - settlementRetryRequired: boolean } -export type StructuredAgentSessionUnexpectedExitContext = { - store: AgentSessionRecordStore - sessions: Map +export type StructuredAgentSessionUnexpectedExitSession = { + journal: DeadGenerationJournal + hasProviderChild: boolean + fence: number + acquisitionGeneration: string | null +} + +export type StructuredAgentSessionUnexpectedExitContext< + TSession extends StructuredAgentSessionUnexpectedExitSession = StructuredAgentSessionHostSession +> = { + store: StructuredAgentSessionLeaseStore + sessions: Map flushLifecycle: (sessionId: string) => Promise - publishFence: (sessionId: string, session: StructuredAgentSessionHostSession) => void + publishFence: (sessionId: string, session: TSession) => void publishStatus?: (sessionId: string) => void hasResumeCapableHolder: (sessionId: string) => boolean serialize: (sessionId: string, task: () => Promise) => Promise @@ -43,8 +46,10 @@ export type StructuredAgentSessionUnexpectedExitContext = { onBarrierError?: (sessionId: string, error: unknown) => void } -export async function settleUnexpectedStructuredAgentSessionExit( - context: StructuredAgentSessionUnexpectedExitContext, +export async function settleUnexpectedStructuredAgentSessionExit< + TSession extends StructuredAgentSessionUnexpectedExitSession +>( + context: StructuredAgentSessionUnexpectedExitContext, event: StructuredAgentSessionLifecycleEvent ): Promise { if (event.cause !== 'unexpected-exit') { @@ -70,9 +75,9 @@ export async function settleUnexpectedStructuredAgentSessionExit( return null } - let settlementRetryRequired = false let settlementFailed = false const stableSettlementId = providerExitSettlementId(unexpectedEvent) + const unfinishedWork = captureUnfinishedStructuredAgentSessionWork(session.journal) let released: Awaited< ReturnType > | null = null @@ -80,37 +85,23 @@ export async function settleUnexpectedStructuredAgentSessionExit( try { const barrier = await context.flushLifecycle(unexpectedEvent.sessionId) if (!barrier.ok) { - settlementRetryRequired = true context.onBarrierError?.(unexpectedEvent.sessionId, barrier.error) } } catch (error) { - settlementRetryRequired = true context.onBarrierError?.(unexpectedEvent.sessionId, error) } - try { - await session.journal.markPendingSubmissionsUnknown( - session.fence, - 'provider_exited_before_acknowledgement' + settlementFailed = !(await retryUnexpectedExitSettlement({ + context, + event: unexpectedEvent, + session, + stableSettlementId, + verdict: { state: 'interrupted', completedAt: observedAt }, + showUnexpectedExitOutcome: unfinishedStructuredAgentSessionWorkWasInterrupted( + unfinishedWork, + session.journal, + observedAt ) - } catch (error) { - settlementRetryRequired = true - context.onBarrierError?.(unexpectedEvent.sessionId, error) - } - if (unexpectedEvent.settlementRetryRequired || settlementRetryRequired) { - const retried = await retryUnexpectedExitSettlement({ - context, - event: unexpectedEvent, - session, - stableSettlementId, - verdict: { state: 'interrupted', completedAt: observedAt } - }) - if (!retried) { - settlementFailed = true - } - if (!settlementFailed) { - settlementRetryRequired = false - } - } + })) } finally { // Provider exit was positively observed, so release the owner even when // terminal settlement could not be durably accepted. @@ -127,7 +118,8 @@ export async function settleUnexpectedStructuredAgentSessionExit( ? { settlementRetry: { settlementId: stableSettlementId, - detail: `provider exited: ${unexpectedEvent.reason}`.slice(0, 512) + // Bare cause: the retry renders it, and `exit-observed` already says the rest. + detail: unexpectedEvent.reason.slice(0, MAX_UNEXPECTED_EXIT_REASON_CHARS) } } : {}) @@ -153,23 +145,28 @@ export async function settleUnexpectedStructuredAgentSessionExit( sessionId: unexpectedEvent.sessionId, releasedFence: released.lease.runtimeFence, deadAcquisitionGeneration: unexpectedEvent.acquisitionGeneration, - stableSettlementId, - settlementRetryRequired + stableSettlementId } }) } export function isStructuredAgentSessionRecoveryTicketCurrent( - context: Pick< - StructuredAgentSessionUnexpectedExitContext, - 'store' | 'sessions' | 'hasResumeCapableHolder' - >, + context: { + store: Pick + sessions: Map< + string, + Pick< + StructuredAgentSessionUnexpectedExitSession, + 'hasProviderChild' | 'fence' | 'acquisitionGeneration' + > + > + hasResumeCapableHolder: (sessionId: string) => boolean + }, ticket: StructuredAgentSessionRecoveryTicket ): boolean { const session = context.sessions.get(ticket.sessionId) const record = context.store.getRecord(ticket.sessionId) return ( - !ticket.settlementRetryRequired && session?.hasProviderChild === false && session.fence === ticket.releasedFence && session.acquisitionGeneration === ticket.deadAcquisitionGeneration && @@ -180,75 +177,25 @@ export function isStructuredAgentSessionRecoveryTicketCurrent( ) } -export async function retryUnexpectedExitSettlement(input: { +async function retryUnexpectedExitSettlement(input: { context: Pick event: UnexpectedExitLifecycleEvent - session: Pick + session: Pick stableSettlementId: string verdict: StructuredAgentSessionTurnVerdict + showUnexpectedExitOutcome?: boolean }): Promise { - try { - await input.session.journal.markPendingSubmissionsUnknown( - input.session.fence, - 'provider_exited_before_acknowledgement' - ) - const mutations = unexpectedExitFallbackMutations( - input.event, - input.session, - input.stableSettlementId, - input.verdict - ) - for (const chunk of partitionJournalLifecycleMutations(input.stableSettlementId, mutations)) { - await input.session.journal.appendLifecycleBatch({ - settlementId: chunk.settlementId, - fence: input.session.fence, - recovered: true, - mutations: chunk.mutations - }) - } - return true - } catch (error) { - input.context.onBarrierError?.(input.event.sessionId, error) - return false - } -} - -function unexpectedExitFallbackMutations( - event: UnexpectedExitLifecycleEvent, - session: Pick, - stableSettlementId: string, - verdict: StructuredAgentSessionTurnVerdict -): JournalLifecycleMutationInput[] { - const mutations: JournalLifecycleMutationInput[] = [] - const { items } = session.journal.snapshot() - for (const item of items) { - const identity = parseAgentJournalItemKey(item.itemId) - if (!identity) { - continue - } - const terminal = terminalExitBody(item) - if (terminal) { - mutations.push({ kind: 'item', identity, body: terminal }) - } - } - mutations.push({ - kind: 'item', - identity: { provider: 'orca', clientMessageId: stableSettlementId }, - body: { kind: 'status', text: boundJournalStatusText(`Provider exited: ${event.reason}`) } + return settleStructuredAgentSessionDeadGeneration({ + journal: input.session.journal, + sessionId: input.event.sessionId, + fence: input.session.fence, + settlementId: input.stableSettlementId, + verdict: input.verdict, + pendingSubmissionReason: 'provider_exited_before_acknowledgement', + showUnexpectedExitOutcome: input.showUnexpectedExitOutcome, + unexpectedExitReason: input.event.reason, + onError: input.context.onBarrierError }) - // Lifecycle rows settle last, in place: the turn's endpoints outlive the child. - mutations.push(...runningTurnLifecycleRevisions(items, verdict)) - return mutations -} - -function terminalExitBody(item: AgentJournalRenderItem): AgentJournalItemBody | null { - if (item.body.kind === 'tool-call' && item.body.state === 'running') { - return { ...item.body, state: 'failed' } - } - if (item.body.kind === 'approval' || item.body.kind === 'question') { - return item.body.resolution.state === 'pending' ? cancelledJournalPromptBody(item.body) : null - } - return null } function providerExitSettlementId(event: UnexpectedExitLifecycleEvent): string { diff --git a/src/main/runtime/agent-session-surface-release-transition.ts b/src/main/runtime/agent-session-surface-release-transition.ts index 9fd3ef9cfda..a59d5cb5141 100644 --- a/src/main/runtime/agent-session-surface-release-transition.ts +++ b/src/main/runtime/agent-session-surface-release-transition.ts @@ -12,6 +12,8 @@ import type { AgentSessionRecord } from '../../shared/agent-session-record' import { assertFence, withLease } from './agent-session-lease-transitions' import type { AgentSessionRecordStore } from './agent-session-record-store' +export type AgentSessionRecordTransitionStore = Pick + /** Whether this record is one THIS host may release on its own proof. A TUI owner, a session * mid-handoff, and a lease nobody holds are all somebody else's transition. */ export function isSurfaceReleasableAgentSessionRecord(record: AgentSessionRecord): boolean { @@ -57,7 +59,7 @@ export function releaseAgentSessionOwnerAfterSurfaceClose(args: { /** Applied through the store's generic transition, the same way handoff records move. */ export function releaseStoredAgentSessionOwnerAfterSurfaceClose( - store: AgentSessionRecordStore, + store: AgentSessionRecordTransitionStore, args: { sessionId: string expectedFence: number diff --git a/src/main/runtime/structured-agent-session-runtime-exit.test.ts b/src/main/runtime/structured-agent-session-runtime-exit.test.ts index a8be2af414e..7a3736b9009 100644 --- a/src/main/runtime/structured-agent-session-runtime-exit.test.ts +++ b/src/main/runtime/structured-agent-session-runtime-exit.test.ts @@ -205,6 +205,30 @@ describe('structured session runtime provider-exit wiring', () => { await new Promise((resolve) => setImmediate(resolve)) expect(connections).toHaveLength(1) + expect(host.deps.store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null, + handoffStage: null + }) + + const restarted = await ensureStructuredAgentSessionHost({ + stateDirectory: root, + hostId: 'local', + claimKeyId: 'key-1', + resolveWorkspacePath: async () => root!, + resolveClaudeAuthPolicy: () => ({ stripAuthEnv: true }), + resolveCodexCommand: () => 'codex', + resolveEnvironment: async () => ({ PATH: process.env.PATH }), + openCodexConnection: openConnection, + readProcessStartTime: async () => 1_700_000_000_000 + }) + await restarted.restoreReadableSessions() + const history = restarted.history({ sessionId: SESSION, direction: 'tail' }) + expect(history.ok && history.page.items.some((item) => item.body.kind === 'status')).toBe(false) + expect(restarted.deps.store.getRecord(SESSION)?.providerHandleChain.at(-1)?.handle).toEqual({ + provider: 'codex', + threadId: 'thread-runtime-close' + }) }) it('waits for an in-flight recovery before tearing down the runtime', async () => { @@ -290,4 +314,97 @@ describe('structured session runtime provider-exit wiring', () => { await stopping expect(stopped).toBe(true) }) + it('drains a final exit callback delivered by the adapter backstop and keeps the retry real', async () => { + // The first stop refuses, so host eviction cannot prove the child gone and aborts with the + // session still indexed. What finally stops it is `closeAll`, which delivers the exit + // callback AFTER host teardown has already run. + root = await mkdtemp(join(tmpdir(), 'orca-runtime-backstop-exit-')) + operations = 0 + const connections: { + connection: CodexAppServerConnection + handlers: CodexAppServerConnectionHandlers + }[] = [] + let closeAttempts = 0 + const openConnection: typeof openCodexAppServerConnection = async (_launch, handlers = {}) => { + const connection: CodexAppServerConnection = { + pid: 4321, + closed: false, + request: async (method, params) => { + if (method === 'thread/start') { + return { thread: { id: 'thread-runtime-backstop' } } + } + if (method === 'thread/resume') { + return { thread: { id: (params as { threadId: string }).threadId } } + } + if (method === 'turn/start') { + return { turn: { id: 'turn-backstop' } } + } + if (method === 'model/list') { + return { + data: [ + { + model: 'gpt-test', + displayName: 'GPT Test', + hidden: false, + supportedReasoningEfforts: [], + defaultReasoningEffort: null, + isDefault: true + } + ], + nextCursor: null + } + } + return {} + }, + notify: () => {}, + respond: () => {}, + respondWithError: () => {}, + close: async () => { + closeAttempts += 1 + if (closeAttempts === 1) { + return false + } + handlers.onExit?.(new Error('adapter backstop close')) + return true + } + } + connections.push({ connection, handlers }) + return connection + } + const host = await ensureStructuredAgentSessionHost({ + stateDirectory: root, + hostId: 'local', + claimKeyId: 'key-1', + resolveWorkspacePath: async () => root!, + resolveClaudeAuthPolicy: () => ({ stripAuthEnv: true }), + resolveCodexCommand: () => 'codex', + resolveEnvironment: async () => ({ PATH: process.env.PATH }), + openCodexConnection: openConnection, + readProcessStartTime: async () => 1_700_000_000_000 + }) + const attachParams = hostTestAttachParams(null, { providerHandle: undefined }) + attachParams.envelope.clientOperationId = operationId() + expect(await host.attach({ callerKey: 'runtime-test' }, attachParams)).toMatchObject({ + ok: true + }) + await host.hold(SESSION, 'desktop-chat:backstop') + + await expect(stopStructuredAgentSessionRuntime()).rejects.toThrow() + await new Promise((resolve) => setImmediate(resolve)) + + // The backstop, not host eviction, is what stopped the child. + expect(closeAttempts).toBeGreaterThanOrEqual(2) + // The callback it delivered neither reacquired nor wrote a technical row. + expect(connections).toHaveLength(1) + const history = host.history({ sessionId: SESSION, direction: 'tail' }) + expect(history.ok && history.page.items.some((item) => item.body.kind === 'status')).toBe(false) + + // The aborted eviction left the session reachable, so the next teardown is a real retry. + await stopStructuredAgentSessionRuntime() + expect(host.deps.store.getRecord(SESSION)?.lease).toMatchObject({ + claimStatus: 'released', + ownerProcess: null, + handoffStage: null + }) + }) }) diff --git a/src/main/runtime/structured-agent-session-runtime.ts b/src/main/runtime/structured-agent-session-runtime.ts index dfd2abffc7d..e437739a58b 100644 --- a/src/main/runtime/structured-agent-session-runtime.ts +++ b/src/main/runtime/structured-agent-session-runtime.ts @@ -172,13 +172,41 @@ async function tearDownRuntime(installed: InstalledRuntime): Promise { // Drain an in-flight recovery before stopping children; recovery may still // be writing lifecycle rows or acquiring a replacement child. await installed.waitForRecovery() + const failures: unknown[] = [] + // Host teardown runs FIRST, which inverts the older order. It is what stops this host's + // provider children now: it evicts each owned session through the adapter, and that eviction + // only releases the lease once `disposeSession` PROVES the child gone. Closing the adapter + // first would hand every one of those steps a vacuous receipt from an already-closed router, + // and would race the attach drain the host runs in the same teardown. + // + // Tail rows are protected by eviction's own per-session ordering — stop the child, drain what + // it already published, settle, then unbind the sink — not by which of the two teardowns runs + // first. `closeAll` is only a backstop for children eviction never took: an acquisition that + // failed before the host indexed it, or a session whose eviction was refused and left indexed. + // A row a child delivers during that backstop close is not captured, and was not captured + // under the old order either. The drain below keeps a late callback from outliving the runtime. try { - await installed.adapter.closeAll() - } finally { - // closeAll can itself deliver a final exit callback; observe that callback - // before flushing and releasing the host's journal resources. - await installed.waitForRecovery() await installed.host.flushAllStreamedEvents() + } catch (error) { + failures.push(error) + } + try { + // Backstop for children eviction never took: unindexed acquisitions and refused evictions. + await installed.adapter.closeAll() + } catch (error) { + failures.push(error) + } + // A backstop close can still deliver a final exit callback. + try { + await installed.waitForRecovery() + } catch (error) { + failures.push(error) + } + if (failures.length === 1) { + throw failures[0] + } + if (failures.length > 1) { + throw new AggregateError(failures, 'structured agent-session runtime teardown failed') } } diff --git a/src/renderer/src/components/github-project/ProjectRoadmap.test.tsx b/src/renderer/src/components/github-project/ProjectRoadmap.test.tsx index 24d04bcb239..2b4c799b861 100644 --- a/src/renderer/src/components/github-project/ProjectRoadmap.test.tsx +++ b/src/renderer/src/components/github-project/ProjectRoadmap.test.tsx @@ -64,7 +64,11 @@ function row(id: string, title: string, values: GitHubProjectFieldValue[]): GitH } } -function table(fields: GitHubProjectField[], rows: GitHubProjectRow[]): GitHubProjectTable { +function table( + fields: GitHubProjectField[], + rows: GitHubProjectRow[], + filter = '' +): GitHubProjectTable { return { project: { id: 'PVT_1', @@ -79,7 +83,7 @@ function table(fields: GitHubProjectField[], rows: GitHubProjectRow[]): GitHubPr number: 2, name: 'Roadmap', layout: 'ROADMAP_LAYOUT', - filter: '', + filter, fields, groupByFields: [], sortByFields: [] @@ -263,11 +267,22 @@ describe('ProjectRoadmap', () => { it('reports an empty filter result instead of drawing an empty grid', () => { render( list} /> ) expect(screen.getByText("No items match this view's filter.")).toBeTruthy() expect(screen.queryByText('list')).toBeNull() }) + + it('does not blame a filter an unfiltered roadmap does not have', () => { + render( + list} + /> + ) + expect(screen.getByText('This view has no items yet.')).toBeTruthy() + expect(screen.queryByText("No items match this view's filter.")).toBeNull() + }) }) diff --git a/src/renderer/src/components/github-project/ProjectRoadmap.tsx b/src/renderer/src/components/github-project/ProjectRoadmap.tsx index d06ef409dff..5e06e41d870 100644 --- a/src/renderer/src/components/github-project/ProjectRoadmap.tsx +++ b/src/renderer/src/components/github-project/ProjectRoadmap.tsx @@ -7,6 +7,7 @@ import { i18n, translate } from '@/i18n/i18n' import ProjectGroupHeader from './ProjectGroupHeader' import ProjectRoadmapBar from './ProjectRoadmapBar' import { ProjectTitleCell } from './ProjectCellIdentity' +import { ProjectItemsEmptyState } from './ProjectViewStates' import { formatRoadmapTick } from './roadmap-tick-format' import { loadRoadmapZoom, saveRoadmapZoom } from './roadmap-zoom-preference' import { groupRows, sortRows } from '../../../../shared/github/project-group-sort' @@ -145,14 +146,7 @@ export default function ProjectRoadmap({ } if (table.rows.length === 0) { - return ( -
- {translate( - 'auto.components.github.project.ProjectViewList.4f57d2e0b1', - "No items match this view's filter." - )} -
- ) + return } const undatedCount = table.rows.length - spans.size diff --git a/src/renderer/src/components/github-project/ProjectViewList.tsx b/src/renderer/src/components/github-project/ProjectViewList.tsx index e54493418d6..cdb9e2dc487 100644 --- a/src/renderer/src/components/github-project/ProjectViewList.tsx +++ b/src/renderer/src/components/github-project/ProjectViewList.tsx @@ -5,6 +5,7 @@ import { cn } from '@/lib/utils' import ColumnResizeHandle from './ColumnResizeHandle' import ProjectGroupHeader from './ProjectGroupHeader' import ProjectRow from './ProjectRow' +import { ProjectItemsEmptyState } from './ProjectViewStates' import { groupRows, sortRows } from '../../../../shared/github/project-group-sort' import { getAvailableColumns, loadHiddenColumns, saveHiddenColumns } from './columns' import { @@ -181,14 +182,7 @@ export default function ProjectViewList({ } if (table.rows.length === 0) { - return ( -
- {translate( - 'auto.components.github.project.ProjectViewList.4f57d2e0b1', - "No items match this view's filter." - )} -
- ) + return } // Why: the visible sort indicator reflects either the local override or the diff --git a/src/renderer/src/components/github-project/ProjectViewStates.test.tsx b/src/renderer/src/components/github-project/ProjectViewStates.test.tsx new file mode 100644 index 00000000000..84033b7d40b --- /dev/null +++ b/src/renderer/src/components/github-project/ProjectViewStates.test.tsx @@ -0,0 +1,28 @@ +// @vitest-environment happy-dom + +import { cleanup, render, screen } from '@testing-library/react' +import { afterEach, describe, expect, it } from 'vitest' +import { ProjectItemsEmptyState } from './ProjectViewStates' + +afterEach(cleanup) + +const FILTERED_COPY = "No items match this view's filter." +const UNFILTERED_COPY = 'This view has no items yet.' +const TRANSIENCE_HINT = 'Recently added items can take a while to appear.' + +describe('ProjectItemsEmptyState', () => { + it('blames the filter only when the view actually has one', () => { + render() + expect(screen.getByText(FILTERED_COPY)).toBeTruthy() + expect(screen.queryByText(UNFILTERED_COPY)).toBeNull() + }) + + // #12648: an unfiltered board that momentarily reads back empty must not be + // reported as a filter miss — that reads as data loss. + it.each(['', ' ', '\n\t'])('reports an unfiltered view as empty for filter %j', (filter) => { + render() + expect(screen.getByText(UNFILTERED_COPY)).toBeTruthy() + expect(screen.getByText(TRANSIENCE_HINT)).toBeTruthy() + expect(screen.queryByText(FILTERED_COPY)).toBeNull() + }) +}) diff --git a/src/renderer/src/components/github-project/ProjectViewStates.tsx b/src/renderer/src/components/github-project/ProjectViewStates.tsx index e3184878851..d2cb13bbfb4 100644 --- a/src/renderer/src/components/github-project/ProjectViewStates.tsx +++ b/src/renderer/src/components/github-project/ProjectViewStates.tsx @@ -225,3 +225,41 @@ export function ProjectTableSkeleton(): React.JSX.Element { ) } + +/** + * Empty result for a project view, worded from the view's own filter. + * + * Why: an unfiltered view has no filter to blame, so "no items match this + * view's filter" reads as data loss when a freshly populated board momentarily + * comes back empty (#12648). `ProjectV2.items(query:)` defaults to `""`, so + * there is no non-search request shape to fall back to — the honest remedy is + * to name the state correctly and say the emptiness may be transient. + */ +export function ProjectItemsEmptyState({ filter }: { filter: string }): React.JSX.Element { + if (filter.trim().length > 0) { + return ( +
+ {translate( + 'auto.components.github.project.ProjectViewList.4f57d2e0b1', + "No items match this view's filter." + )} +
+ ) + } + return ( +
+ + {translate( + 'auto.components.github.project.ProjectViewStates.3b9c1d5e47', + 'This view has no items yet.' + )} + + + {translate( + 'auto.components.github.project.ProjectViewStates.7e4a2f80c6', + 'Recently added items can take a while to appear.' + )} + +
+ ) +} diff --git a/src/renderer/src/components/native-chat/structured-agent-session-read-owner.ts b/src/renderer/src/components/native-chat/structured-agent-session-read-owner.ts index 82c231c9982..68e1e3bc250 100644 --- a/src/renderer/src/components/native-chat/structured-agent-session-read-owner.ts +++ b/src/renderer/src/components/native-chat/structured-agent-session-read-owner.ts @@ -29,7 +29,6 @@ export type StructuredAgentSessionReadOwner = { dispose: () => void getSnapshot: () => StructuredAgentSessionReadSnapshot loadOlder: () => Promise - refresh: () => void subscribe: (listener: () => void) => () => void } @@ -57,7 +56,6 @@ function createReadOwner( loadingOlder: false } let stopActiveRun: (() => void) | null = null - let refreshActiveRun = (): void => {} const retiredHistoryRead = (): boolean => true let captureActiveHistoryReadGuard = (): (() => boolean) => retiredHistoryRead const activations = new Set() @@ -91,7 +89,7 @@ function createReadOwner( setSnapshot({ ...snapshot, loadingOlder: false }) } } - const refreshTail = async (shouldStop: () => boolean): Promise => { + const hydrate = async (shouldStop: () => boolean): Promise => { const result = await callStructuredAgentSession( target, 'agentSession.history', @@ -120,7 +118,7 @@ function createReadOwner( if (shouldStop()) { return } - apply({ type: 'tail-page', page: result.page }) + apply({ type: 'history-page', page: result.page }) if (shouldStop()) { return } @@ -177,15 +175,13 @@ function createReadOwner( applyError: (message) => apply({ type: 'error', message }), getCursor: () => snapshot.state.cursor, onHistoryReadInvalidated: clearLoadingOlder, - refreshTail, + hydrate: snapshot.state.epoch === null ? hydrate : undefined, sessionId, target }) captureActiveHistoryReadGuard = transport.captureHistoryReadGuard - refreshActiveRun = transport.refresh stopActiveRun = () => { captureActiveHistoryReadGuard = () => retiredHistoryRead - refreshActiveRun = (): void => {} transport.dispose() stopActiveRun = null } @@ -266,7 +262,6 @@ function createReadOwner( } } }, - refresh: () => refreshActiveRun(), subscribe: (listener) => { listeners.add(listener) return () => { diff --git a/src/renderer/src/components/native-chat/structured-agent-session-read-transport.test.ts b/src/renderer/src/components/native-chat/structured-agent-session-read-transport.test.ts index 555c09acdc4..5e5be1b6b3b 100644 --- a/src/renderer/src/components/native-chat/structured-agent-session-read-transport.test.ts +++ b/src/renderer/src/components/native-chat/structured-agent-session-read-transport.test.ts @@ -1,4 +1,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' +import { + EMPTY_STRUCTURED_AGENT_SESSION, + reduceStructuredAgentSession +} from '../../../../shared/structured-agent-session-reducer' import type { AgentJournalCursor } from '../../../../shared/agent-session-journal-types' import type { AgentSessionHistoryPage, @@ -70,12 +74,56 @@ describe('structured agent-session read transport generations', () => { applyError, getCursor: () => null, onHistoryReadInvalidated: () => undefined, - refreshTail: async () => undefined, + hydrate: async () => undefined, sessionId: 'session-a', target }) } + it('flushes queued rows before reading the applied cursor for reconnect', async () => { + vi.useFakeTimers() + try { + let state = EMPTY_STRUCTURED_AGENT_SESSION + const transport = startStructuredAgentSessionReadTransport({ + applyEvent: (event) => { + state = reduceStructuredAgentSession(state, { type: 'event', event }) + }, + applyError: vi.fn(), + getCursor: () => state.cursor, + onHistoryReadInvalidated: () => undefined, + sessionId: 'session-a', + target + }) + attempts[0].onEvent(snapshot(100)) + attempts[0].closed.resolve({ unsubscribe: attempts[0].unsubscribe }) + await flushPromises() + attempts[0].onClose() + await vi.advanceTimersByTimeAsync(720) + attempts[0].onEvent({ + type: 'batch', + sessionId: 'session-a', + batch: { + cursor: { epoch: 'epoch-a', sequence: 101 }, + items: [], + removedItemIds: [], + submissions: [] + } + }) + expect(state.cursor?.sequence).toBe(100) + await vi.advanceTimersByTimeAsync(30) + expect(state.cursor?.sequence).toBe(101) + expect(mocks.subscribe.mock.calls[1]?.[1]).toEqual({ + sessionId: 'session-a', + cursor: { epoch: 'epoch-a', sequence: 101 } + }) + attempts[1].closed.resolve({ unsubscribe: attempts[1].unsubscribe }) + await flushPromises() + transport.dispose() + } finally { + vi.useRealTimers() + } + }) + it('ignores opening frames after disposal and a replacement transport starts', async () => { const applyEvent = vi.fn() const applyError = vi.fn() @@ -159,8 +207,8 @@ describe('structured agent-session read transport unattached refusals', () => { }) }) - function startWithTail( - refreshTail: () => Promise, + function startWithHydration( + hydrate: () => Promise, applyError: (message: string) => void, applyEvent = vi.fn() ) { @@ -169,7 +217,7 @@ describe('structured agent-session read transport unattached refusals', () => { applyError, getCursor: () => null, onHistoryReadInvalidated: () => undefined, - refreshTail, + hydrate, sessionId: 'session-a', target }) @@ -186,7 +234,7 @@ describe('structured agent-session read transport unattached refusals', () => { vi.useFakeTimers() try { const applyError = vi.fn() - const transport = startWithTail(async () => { + const transport = startWithHydration(async () => { throw rpcRefusal(UNATTACHED) }, applyError) await flushPromises() @@ -204,7 +252,7 @@ describe('structured agent-session read transport unattached refusals', () => { vi.useFakeTimers() try { const applyError = vi.fn() - const transport = startWithTail(async () => { + const transport = startWithHydration(async () => { throw rpcRefusal(UNATTACHED) }, applyError) await flushPromises() @@ -232,7 +280,7 @@ describe('structured agent-session read transport unattached refusals', () => { vi.useFakeTimers() try { const applyError = vi.fn() - const transport = startWithTail(async () => { + const transport = startWithHydration(async () => { throw new Error('journal read failed') }, applyError) await flushPromises() @@ -247,7 +295,7 @@ describe('structured agent-session read transport unattached refusals', () => { vi.useFakeTimers() try { const applyError = vi.fn() - const transport = startWithTail(async () => undefined, applyError) + const transport = startWithHydration(async () => undefined, applyError) await flushPromises() expect(attempts).toHaveLength(1) @@ -267,7 +315,7 @@ describe('structured agent-session read transport unattached refusals', () => { try { const applyError = vi.fn() const applyEvent = vi.fn() - const transport = startWithTail(async () => undefined, applyError, applyEvent) + const transport = startWithHydration(async () => undefined, applyError, applyEvent) await flushPromises() expect(attempts).toHaveLength(1) diff --git a/src/renderer/src/components/native-chat/structured-agent-session-read-transport.ts b/src/renderer/src/components/native-chat/structured-agent-session-read-transport.ts index b380c89d577..f4310cec890 100644 --- a/src/renderer/src/components/native-chat/structured-agent-session-read-transport.ts +++ b/src/renderer/src/components/native-chat/structured-agent-session-read-transport.ts @@ -5,7 +5,6 @@ import { AGENT_SESSION_UNATTACHED_READ_GRACE_MS, isUnattachedAgentSessionReadRefusal } from '../../../../shared/structured-agent-session-read-refusal' -import { shouldAdvanceStructuredResumeCursor } from '../../../../shared/structured-agent-session-reducer' import type { RuntimeClientTarget } from '@/runtime/runtime-rpc-client' import { subscribeStructuredAgentSession } from '@/runtime/structured-agent-session-client' @@ -37,13 +36,12 @@ export function startStructuredAgentSessionReadTransport(args: { applyError: (message: string) => void getCursor: () => AgentJournalCursor | null onHistoryReadInvalidated: () => void - refreshTail: (shouldStop: () => boolean) => Promise + hydrate?: (shouldStop: () => boolean) => Promise sessionId: string target: RuntimeClientTarget }): { captureHistoryReadGuard: () => () => boolean dispose: () => void - refresh: () => void } { let stopped = false let connected = false @@ -52,7 +50,6 @@ export function startStructuredAgentSessionReadTransport(args: { let openGeneration = 0 let stateGeneration = 0 let unsubscribe = (): void => {} - let resumeCursor = args.getCursor() let shouldStopCoalescedEvent = (): boolean => true const coalescer = createStructuredAgentSessionEventCoalescer((event) => { if (!shouldStopCoalescedEvent()) { @@ -112,12 +109,6 @@ export function startStructuredAgentSessionReadTransport(args: { if (!isCurrentOpenGeneration(eventOpenGeneration)) { return } - resumeCursor = event.page.liveCursor ?? event.page.window.nextCursor - } else if ( - event.type === 'batch' && - shouldAdvanceStructuredResumeCursor(resumeCursor, event.batch.cursor) - ) { - resumeCursor = event.batch.cursor } else if (event.type === 'end') { connected = false reconnectScheduler.schedule() @@ -148,9 +139,10 @@ export function startStructuredAgentSessionReadTransport(args: { return } let closedDuringOpen = false + const cursor = args.getCursor() const handle = await subscribeStructuredAgentSession( args.target, - { sessionId: args.sessionId, ...(resumeCursor ? { cursor: resumeCursor } : {}) }, + { sessionId: args.sessionId, ...(cursor ? { cursor } : {}) }, (event) => handleEvent(event, currentOpenGeneration), (error) => { if (!isCurrentOpenGeneration(currentOpenGeneration)) { @@ -192,43 +184,26 @@ export function startStructuredAgentSessionReadTransport(args: { } } } - const refresh = (): void => { - const shouldStop = captureHistoryReadGuard() + if (args.hydrate) { + const shouldStopInitialRead = captureHistoryReadGuard() void args - .refreshTail(shouldStop) + .hydrate(shouldStopInitialRead) .then(() => { - if (shouldStop()) { + if (shouldStopInitialRead()) { return } clearUnattachedReadGrace() - resumeCursor = args.getCursor() - if (!connected) { - reconnectScheduler.schedule(0) - } + return open() }) .catch((error) => { - if (!shouldStop()) { + if (!shouldStopInitialRead()) { reportReadFailure(error) + reconnectScheduler.schedule() } }) + } else { + void open() } - const shouldStopInitialRead = captureHistoryReadGuard() - void args - .refreshTail(shouldStopInitialRead) - .then(() => { - if (shouldStopInitialRead()) { - return - } - clearUnattachedReadGrace() - resumeCursor = args.getCursor() - return open() - }) - .catch((error) => { - if (!shouldStopInitialRead()) { - reportReadFailure(error) - reconnectScheduler.schedule() - } - }) return { captureHistoryReadGuard, dispose: () => { @@ -238,7 +213,6 @@ export function startStructuredAgentSessionReadTransport(args: { reconnectScheduler.dispose() coalescer.dispose() unsubscribe() - }, - refresh + } } } diff --git a/src/renderer/src/components/native-chat/use-structured-agent-session-read.test.tsx b/src/renderer/src/components/native-chat/use-structured-agent-session-read.test.tsx index cb42c013ac4..faf4e5f3b92 100644 --- a/src/renderer/src/components/native-chat/use-structured-agent-session-read.test.tsx +++ b/src/renderer/src/components/native-chat/use-structured-agent-session-read.test.tsx @@ -8,8 +8,7 @@ import type { } from '../../../../shared/agent-session-journal-types' import { AGENT_SESSION_HISTORY_MAX_LIMIT, - type AgentSessionHistoryPage, - type AgentSessionSubscribeEvent + type AgentSessionHistoryPage } from '../../../../shared/agent-session-wire' const mocks = vi.hoisted(() => ({ call: vi.fn(), subscribe: vi.fn() })) @@ -124,6 +123,17 @@ describe('useStructuredAgentSessionRead history window', () => { }) }) + it('does not invent a writable fence for a mixed-version history page', async () => { + mocks.call.mockResolvedValueOnce({ ok: true, page: page('tail', [], false) }) + + const { result } = renderHook(() => + useStructuredAgentSessionRead({ sessionId: 'session-a', target: LOCAL_TARGET }) + ) + + await waitFor(() => expect(result.current.state.status).toBe('ready')) + expect(result.current.state.fence).toBeNull() + }) + it('loads each earlier page at the wire maximum', async () => { const tailItems = Array.from({ length: 200 }, (_, index) => message(`tail-${index}`, 301 + index, 'assistant') @@ -162,7 +172,7 @@ describe('useStructuredAgentSessionRead history window', () => { expect(result.current.state.items[0]?.itemId).toBe('oldest') }) - it('refreshes only visible structured sessions when the app regains focus', async () => { + it('does no host work when the app regains focus', async () => { const hasFocus = vi.spyOn(document, 'hasFocus').mockReturnValue(true) mocks.call.mockResolvedValue({ ok: true, page: page('tail', [], false) }) const visible = renderHook(() => @@ -182,154 +192,15 @@ describe('useStructuredAgentSessionRead history window', () => { await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(1)) expect(mocks.subscribe).toHaveBeenCalledTimes(1) - act(() => window.dispatchEvent(new Event('focus'))) + await act(async () => window.dispatchEvent(new Event('focus'))) - await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2)) - expect(mocks.call).toHaveBeenLastCalledWith(LOCAL_TARGET, 'agentSession.history', { - sessionId: 'session-visible', - direction: 'tail', - limit: AGENT_SESSION_HISTORY_MAX_LIMIT - }) + expect(mocks.call).toHaveBeenCalledTimes(1) + expect(mocks.subscribe).toHaveBeenCalledTimes(1) visible.unmount() hidden.unmount() hasFocus.mockRestore() }) - it('drops a delayed refresh after reconnect without mutating state or provider session', async () => { - const hasFocus = vi.spyOn(document, 'hasFocus').mockReturnValue(true) - const delayedRefresh = Promise.withResolvers<{ - ok: true - page: AgentSessionHistoryPage - providerSession: { key: 'session_id'; id: string } - }>() - const closes: (() => void)[] = [] - const initialProviderSession = { key: 'session_id', id: 'provider-initial' } as const - mocks.call - .mockResolvedValueOnce({ - ok: true, - page: page('tail', [message('initial', 1, 'assistant')], false), - providerSession: initialProviderSession - }) - .mockReturnValueOnce(delayedRefresh.promise) - mocks.subscribe.mockImplementation((_target, _params, _onEvent, _onError, onClose) => { - closes.push(onClose) - return Promise.resolve({ unsubscribe: vi.fn() }) - }) - - const view = renderHook(() => - useStructuredAgentSessionRead({ sessionId: 'session-a', target: LOCAL_TARGET }) - ) - - try { - await waitFor(() => expect(mocks.subscribe).toHaveBeenCalledOnce()) - expect(view.result.current.state.items[0]?.itemId).toBe('initial') - expect(view.result.current.providerSession).toBe(initialProviderSession) - const stateBeforeRefresh = view.result.current.state - - act(() => window.dispatchEvent(new Event('focus'))) - await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2)) - - vi.useFakeTimers() - act(() => closes[0]?.()) - await act(async () => vi.advanceTimersByTimeAsync(750)) - expect(mocks.subscribe).toHaveBeenCalledTimes(2) - - await act(async () => { - delayedRefresh.resolve({ - ok: true, - page: page('tail', [message('stale', 2, 'assistant')], false), - providerSession: { key: 'session_id', id: 'provider-stale' } - }) - await delayedRefresh.promise - await Promise.resolve() - }) - - expect(view.result.current.state).toBe(stateBeforeRefresh) - expect(view.result.current.state.items[0]?.itemId).toBe('initial') - expect(view.result.current.providerSession).toBe(initialProviderSession) - } finally { - vi.useRealTimers() - view.unmount() - hasFocus.mockRestore() - } - }) - - it.each(['snapshot', 'reset'] as const)( - 'drops a delayed refresh after a same-stream %s advances the epoch', - async (eventType) => { - const hasFocus = vi.spyOn(document, 'hasFocus').mockReturnValue(true) - const delayedRefresh = Promise.withResolvers<{ - ok: true - page: AgentSessionHistoryPage - providerSession: { key: 'session_id'; id: string } - }>() - const onEvents: ((event: AgentSessionSubscribeEvent) => void)[] = [] - const initialProviderSession = { key: 'session_id', id: 'provider-initial' } as const - mocks.call - .mockResolvedValueOnce({ - ok: true, - page: page('tail', [message('initial', 1, 'assistant')], false), - providerSession: initialProviderSession - }) - .mockReturnValueOnce(delayedRefresh.promise) - mocks.subscribe.mockImplementation((_target, _params, onEvent) => { - onEvents.push(onEvent) - return Promise.resolve({ unsubscribe: vi.fn() }) - }) - - const view = renderHook(() => - useStructuredAgentSessionRead({ sessionId: 'session-a', target: LOCAL_TARGET }) - ) - - try { - await waitFor(() => expect(onEvents).toHaveLength(1)) - act(() => window.dispatchEvent(new Event('focus'))) - await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2)) - - const replacementPage = page( - 'tail', - [message('new-epoch', 2, 'assistant')], - false, - 'epoch-b' - ) - const replacementEvent: AgentSessionSubscribeEvent = - eventType === 'reset' - ? { - type: 'reset', - sessionId: 'session-a', - reset: 'epoch_changed', - page: replacementPage, - fence: 2 - } - : { type: 'snapshot', sessionId: 'session-a', page: replacementPage, fence: 2 } - act(() => onEvents[0]?.(replacementEvent)) - - expect(view.result.current.state.epoch).toBe('epoch-b') - expect(view.result.current.state.items[0]?.itemId).toBe('new-epoch') - expect(view.result.current.providerSession).toBe(initialProviderSession) - const stateAfterReplacement = view.result.current.state - - await act(async () => { - delayedRefresh.resolve({ - ok: true, - page: page('tail', [message('stale-refresh', 3, 'assistant')], false), - providerSession: { key: 'session_id', id: 'provider-stale' } - }) - await delayedRefresh.promise - await Promise.resolve() - }) - - expect(view.result.current.state).toBe(stateAfterReplacement) - expect(view.result.current.state.epoch).toBe('epoch-b') - expect(view.result.current.state.items[0]?.itemId).toBe('new-epoch') - expect(view.result.current.providerSession).toBe(initialProviderSession) - } finally { - view.unmount() - hasFocus.mockRestore() - } - } - ) - it('does no host work for retained inactive sessions', async () => { const first = renderHook(() => useStructuredAgentSessionRead({ @@ -354,7 +225,7 @@ describe('useStructuredAgentSessionRead history window', () => { second.unmount() }) - it('preserves cached state while switching away and refreshes once on re-entry', async () => { + it('preserves cached state and resumes at the applied cursor on re-entry', async () => { const unsubscribe = vi.fn() mocks.call.mockImplementation((_target, _method, params) => { const sessionId = (params as { sessionId: string }).sessionId @@ -395,7 +266,11 @@ describe('useStructuredAgentSessionRead history window', () => { view.rerender({ active: 'first' }) expect(view.result.current.first.state.items[0]?.itemId).toBe('session-switch-a-message') await waitFor(() => expect(mocks.subscribe).toHaveBeenCalledTimes(3)) - expect(mocks.call).toHaveBeenCalledTimes(3) + expect(mocks.call).toHaveBeenCalledTimes(2) + expect(mocks.subscribe.mock.calls[2]?.[1]).toEqual({ + sessionId: 'session-switch-a', + cursor: view.result.current.first.state.cursor + }) expect(unsubscribe).toHaveBeenCalledTimes(2) }) }) diff --git a/src/renderer/src/components/native-chat/use-structured-agent-session-read.ts b/src/renderer/src/components/native-chat/use-structured-agent-session-read.ts index 834d11d3fa1..25dc3777d16 100644 --- a/src/renderer/src/components/native-chat/use-structured-agent-session-read.ts +++ b/src/renderer/src/components/native-chat/use-structured-agent-session-read.ts @@ -30,19 +30,6 @@ export function useStructuredAgentSessionRead(args: { useEffect(() => (isVisible ? owner.activate() : undefined), [isVisible, owner]) - useEffect(() => { - if (!isVisible) { - return - } - const refresh = (): void => { - if (document.hasFocus()) { - owner.refresh() - } - } - window.addEventListener('focus', refresh) - return () => window.removeEventListener('focus', refresh) - }, [isVisible, owner]) - return { state: snapshot.state, loadingOlder: snapshot.loadingOlder, diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 94ebfc81af8..81700b22ff3 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -2584,7 +2584,9 @@ }, "ProjectViewStates": { "ac83c45672": "Switch to a Table or Roadmap view to work with this project in Orca.", - "e4cc8b14f2": "Orca renders table and roadmap project views. This view uses a layout it cannot render yet." + "e4cc8b14f2": "Orca renders table and roadmap project views. This view uses a layout it cannot render yet.", + "3b9c1d5e47": "This view has no items yet.", + "7e4a2f80c6": "Recently added items can take a while to appear." } }, "GitHubMarkdownComposer": { diff --git a/src/renderer/src/i18n/locales/es.json b/src/renderer/src/i18n/locales/es.json index 29ddcca9bb0..61c3f812f5f 100644 --- a/src/renderer/src/i18n/locales/es.json +++ b/src/renderer/src/i18n/locales/es.json @@ -2218,6 +2218,10 @@ "7c302f8174": "Sin título" } } + }, + "ProjectViewStates": { + "3b9c1d5e47": "Esta vista aún no tiene elementos.", + "7e4a2f80c6": "Los elementos añadidos recientemente pueden tardar un poco en aparecer." } }, "GitHubMarkdownComposer": { diff --git a/src/renderer/src/i18n/locales/fr.json b/src/renderer/src/i18n/locales/fr.json index 35bebb63736..c21e08e7a5a 100644 --- a/src/renderer/src/i18n/locales/fr.json +++ b/src/renderer/src/i18n/locales/fr.json @@ -2382,6 +2382,10 @@ "7c302f8174": "Sans titre" } } + }, + "ProjectViewStates": { + "3b9c1d5e47": "Cette vue ne contient encore aucun élément.", + "7e4a2f80c6": "Les éléments ajoutés récemment peuvent mettre un moment à apparaître." } }, "GitHubMarkdownComposer": { diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index 02bfa9a9eaf..422e2b39fbc 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -2218,6 +2218,10 @@ "7c302f8174": "無題" } } + }, + "ProjectViewStates": { + "3b9c1d5e47": "このビューにはまだ項目がありません。", + "7e4a2f80c6": "最近追加した項目は、表示されるまで少し時間がかかることがあります。" } }, "GitHubMarkdownComposer": { diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json index 1b87a3d3d37..45d2d30a225 100644 --- a/src/renderer/src/i18n/locales/ko.json +++ b/src/renderer/src/i18n/locales/ko.json @@ -2223,6 +2223,10 @@ "7c302f8174": "제목 없음" } } + }, + "ProjectViewStates": { + "3b9c1d5e47": "이 보기에는 아직 항목이 없습니다.", + "7e4a2f80c6": "최근에 추가한 항목은 표시되기까지 시간이 걸릴 수 있습니다." } }, "GitHubMarkdownComposer": { diff --git a/src/renderer/src/i18n/locales/zh.json b/src/renderer/src/i18n/locales/zh.json index bb8ecf5ac76..f64188d7201 100644 --- a/src/renderer/src/i18n/locales/zh.json +++ b/src/renderer/src/i18n/locales/zh.json @@ -2221,6 +2221,10 @@ "7c302f8174": "无标题" } } + }, + "ProjectViewStates": { + "3b9c1d5e47": "此视图暂无任何项目。", + "7e4a2f80c6": "最近添加的项目可能需要一段时间才会显示。" } }, "GitHubMarkdownComposer": { diff --git a/src/shared/absolute-dir-override.test.ts b/src/shared/absolute-dir-override.test.ts new file mode 100644 index 00000000000..26b2049a673 --- /dev/null +++ b/src/shared/absolute-dir-override.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, it } from 'vitest' +import { resolveAbsoluteDirOverride } from './absolute-dir-override' + +const FALLBACK = '/home/user/.agent' + +describe('resolveAbsoluteDirOverride', () => { + it('keeps an absolute override, trimming first', () => { + expect(resolveAbsoluteDirOverride('/srv/sessions', FALLBACK, 'linux')).toBe('/srv/sessions') + expect(resolveAbsoluteDirOverride(' /srv/sessions ', FALLBACK, 'linux')).toBe('/srv/sessions') + }) + + it.each([ + ['undefined', undefined], + ['null', null], + ['empty', ''], + ['whitespace only', ' '] + ])('falls back for %s', (_label, value) => { + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'linux')).toBe(FALLBACK) + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'win32')).toBe(FALLBACK) + }) + + it.each([ + ['a bare dot', '.'], + ['a parent reference', '..'], + ['a relative path', 'rel/path'], + // Grok 1.0.30 does not expand `~` — `GROK_HOME=~/x` makes it create a literal `~` dir under + // its own cwd — so expanding one here would point Orca at a directory no agent writes to. + ['an unexpanded tilde', '~/sessions'], + // Drive-*relative*: both resolve against that drive's current directory, not its root. + ['a drive-relative path', 'C:foo'], + ['a bare drive letter', 'C:'] + ])('falls back for %s on every platform', (_label, value) => { + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'linux')).toBe(FALLBACK) + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'darwin')).toBe(FALLBACK) + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'win32')).toBe(FALLBACK) + }) + + // Why: the check is platform-bound, so a POSIX CI box would silently "reject" every real + // Windows root if it ran the POSIX predicate. These pin the Windows shapes users actually set. + it.each([ + ['a drive-rooted path', 'C:\\Users\\ada\\.grok'], + ['a forward-slash drive root', 'C:/Users/ada/.grok'], + ['a UNC share', '\\\\server\\share\\grok'], + // Rooted but drive-relative; `path.resolve` still bounds it to the current drive. + ['a drive-current-root path', '\\grok'] + ])('keeps %s on Windows', (_label, value) => { + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'win32')).toBe(value) + }) + + it.each([['C:\\Users\\ada\\.grok'], ['\\\\server\\share\\grok'], ['\\grok']])( + 'falls back for the Windows path %j on POSIX', + (value) => { + expect(resolveAbsoluteDirOverride(value, FALLBACK, 'linux')).toBe(FALLBACK) + } + ) + + it('defaults to the host platform', () => { + const rooted = process.platform === 'win32' ? 'C:\\srv\\sessions' : '/srv/sessions' + expect(resolveAbsoluteDirOverride(rooted, FALLBACK)).toBe(rooted) + expect(resolveAbsoluteDirOverride('rel/path', FALLBACK)).toBe(FALLBACK) + }) +}) diff --git a/src/shared/absolute-dir-override.ts b/src/shared/absolute-dir-override.ts new file mode 100644 index 00000000000..a67f8ea0bde --- /dev/null +++ b/src/shared/absolute-dir-override.ts @@ -0,0 +1,19 @@ +import { posix, win32 } from 'node:path' + +/** + * An env-provided directory override, kept only when absolute (#13082). + * + * A relative value resolves against the *reading* process's cwd — `/` for a Finder-launched app, + * the user data dir for the terminal daemon — never against the cwd the agent CLI used to write + * it, so it names a different directory in every Orca process. Syntactic only: `/..` passes and + * collapses to `/`, so this is not a containment check. + */ +export function resolveAbsoluteDirOverride( + value: string | undefined | null, + fallback: string, + platform: NodeJS.Platform = process.platform +): string { + const trimmed = value?.trim() ?? '' + const isAbsolutePath = platform === 'win32' ? win32.isAbsolute : posix.isAbsolute + return trimmed && isAbsolutePath(trimmed) ? trimmed : fallback +} diff --git a/src/shared/agent-session-journal-types.ts b/src/shared/agent-session-journal-types.ts index 7ba5b277e6d..fc603fdca08 100644 --- a/src/shared/agent-session-journal-types.ts +++ b/src/shared/agent-session-journal-types.ts @@ -170,7 +170,8 @@ export type AgentJournalTurnLifecycle = { turnId: string state: AgentJournalTurnLifecycleState /** Provider key of the user item that opened the turn; clients resolve a - * submission alias through it. Absent on rows from older hosts. */ + * submission alias through it. A lifecycle row may key itself when provider + * output opened a turn with no user item; absent means an older host. */ userItemId?: string startedAt?: number completedAt?: number diff --git a/src/shared/github/project-types.ts b/src/shared/github/project-types.ts index 0d33dc5d976..1fcbc9e5d33 100644 --- a/src/shared/github/project-types.ts +++ b/src/shared/github/project-types.ts @@ -81,9 +81,10 @@ export type GitHubProjectView = { number: number name: string layout: GitHubProjectViewLayout - /** Normalized to '' when GitHub returns null. Why: passing null through as - * `$q` in the items query would change the query shape between filtered - * and unfiltered views; the empty string keeps the GraphQL shape stable. */ + /** Normalized to '' when GitHub returns null. `ProjectV2.items(query:)` is + * declared `String = ""`, so sending '' and omitting the argument are the + * same request — there is no non-search item field to fall back to. '' is + * therefore only a UI signal: it means "this view is unfiltered". */ filter: string fields: GitHubProjectField[] groupByFields: GitHubProjectField[] diff --git a/src/shared/grok-session-paths.test.ts b/src/shared/grok-session-paths.test.ts index 90d4cf69e1e..78b0a1fd52c 100644 --- a/src/shared/grok-session-paths.test.ts +++ b/src/shared/grok-session-paths.test.ts @@ -57,6 +57,23 @@ describe('grok-session-paths', () => { expect(resolveGrokHomeDir({}, '/home/ada')).toBe(join('/home/ada', '.grok')) }) + // Why: Grok itself accepts a relative GROK_HOME, but resolves it against *its own* cwd — a + // different directory per terminal. Orca's readers (main at `/` when Finder-launched, the + // daemon at the user data dir, the scan service inheriting main) would each resolve the same + // value somewhere else and walk it with no depth, entry or time cap (#13082). `~/…` is in the + // list because Grok 1.0.30 does not expand a tilde — it creates a literal `~` dir under its cwd. + it.each(['.', '..', 'rel/path', '~/grok', '~', 'C:foo', 'C:'])( + 'ignores the non-absolute GROK_HOME %j', + (relativeHome) => { + expect(resolveGrokHomeDir({ GROK_HOME: relativeHome }, '/home/ada')).toBe( + join('/home/ada', '.grok') + ) + expect(resolveGrokSessionsDir({ GROK_HOME: relativeHome }, '/home/ada')).toBe( + join('/home/ada', '.grok', 'sessions') + ) + } + ) + it('refuses to invent encodeURIComponent names longer than 255 bytes', () => { const longCwd = `/${'a'.repeat(200)}/${'b'.repeat(200)}` expect(Buffer.byteLength(encodeURIComponent(longCwd), 'utf8')).toBeGreaterThan( diff --git a/src/shared/grok-session-paths.ts b/src/shared/grok-session-paths.ts index e4d59c61f09..b40db0174b4 100644 --- a/src/shared/grok-session-paths.ts +++ b/src/shared/grok-session-paths.ts @@ -2,6 +2,7 @@ import { lstatSync } from 'node:fs' import { lstat, opendir } from 'node:fs/promises' import { homedir } from 'node:os' import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path' +import { resolveAbsoluteDirOverride } from './absolute-dir-override' import { GrokSessionPathLookupQueue, type GrokSessionPathScanner @@ -41,8 +42,7 @@ export function resolveGrokHomeDir( env: GrokSessionPathEnv = process.env, homeDir: string = homedir() ): string { - const fromEnv = env.GROK_HOME?.trim() - return fromEnv || join(homeDir, '.grok') + return resolveAbsoluteDirOverride(env.GROK_HOME, join(homeDir, '.grok')) } export function resolveGrokSessionsDir( diff --git a/src/shared/structured-agent-session-reducer.test.ts b/src/shared/structured-agent-session-reducer.test.ts index ca3c8774e0d..aa90749ffdf 100644 --- a/src/shared/structured-agent-session-reducer.test.ts +++ b/src/shared/structured-agent-session-reducer.test.ts @@ -144,186 +144,6 @@ describe('structured agent session reducer', () => { expect(restored.hasOlder).toBe(false) }) - it('does not let a stale focus refresh replace newer streamed state', () => { - const streamed = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'event', - event: { - type: 'snapshot', - sessionId: 'session-a', - fence: 1, - page: hydrationPage([item('streamed', 50)]) - } - }) - const afterRefresh = reduceStructuredAgentSession(streamed, { - type: 'tail-page', - page: { - sessionId: 'session-a', - epoch: 'epoch-a', - direction: 'tail', - items: [item('stale', 40)], - removedItemIds: [], - submissions: [], - window: { - oldest: { epoch: 'epoch-a', sequence: 40 }, - newest: { epoch: 'epoch-a', sequence: 40 }, - nextCursor: { epoch: 'epoch-a', sequence: 40 } - }, - liveCursor: { epoch: 'epoch-a', sequence: 40 }, - hasOlder: true, - hasNewer: false - } - }) - - expect(afterRefresh).toBe(streamed) - }) - - it('keeps paged-in older items when a focus refresh carries nothing new', () => { - const snapshot = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'event', - event: { - type: 'snapshot', - sessionId: 'session-a', - fence: 1, - page: hydrationPage([item('newest', 50)]) - } - }) - const withOlder = reduceStructuredAgentSession(snapshot, { - type: 'older-page', - requestedCursor: { epoch: 'epoch-a', sequence: 50 }, - page: { - sessionId: 'session-a', - epoch: 'epoch-a', - direction: 'before', - items: [item('older', 10)], - removedItemIds: [], - submissions: [], - window: { - oldest: { epoch: 'epoch-a', sequence: 10 }, - newest: { epoch: 'epoch-a', sequence: 10 }, - nextCursor: { epoch: 'epoch-a', sequence: 10 } - }, - hasOlder: false, - hasNewer: true - } - }) - const afterRefresh = reduceStructuredAgentSession(withOlder, { - type: 'tail-page', - page: { - sessionId: 'session-a', - epoch: 'epoch-a', - direction: 'tail', - items: [item('newest', 50)], - removedItemIds: [], - submissions: [], - window: { - oldest: { epoch: 'epoch-a', sequence: 50 }, - newest: { epoch: 'epoch-a', sequence: 50 }, - nextCursor: { epoch: 'epoch-a', sequence: 50 } - }, - liveCursor: { epoch: 'epoch-a', sequence: 50 }, - hasOlder: true, - hasNewer: false - } - }) - - expect(afterRefresh).toBe(withOlder) - expect(afterRefresh.items.map((entry) => entry.itemId)).toEqual(['older', 'newest']) - }) - - it('accepts a newer fence from an equal-cursor tail refresh', () => { - const initial = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'event', - event: { - type: 'snapshot', - sessionId: 'session-a', - fence: 1, - page: hydrationPage([item('newest', 50)]) - } - }) - const page = { ...hydrationPage([item('newest', 50)]), fence: 2 } - - const refreshed = reduceStructuredAgentSession(initial, { type: 'tail-page', page }) - - expect(refreshed.fence).toBe(2) - expect(refreshed.items).toBe(initial.items) - }) - - it('keeps rapid-send submissions when a newer tail refresh contains only the last one', () => { - const initial = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'event', - event: { - type: 'snapshot', - sessionId: 'session-a', - fence: 1, - page: hydrationPage( - [item('first', 10)], - Array.from({ length: 8 }, (_, index) => submission(index)) - ) - } - }) - const refreshed = reduceStructuredAgentSession(initial, { - type: 'tail-page', - page: { - sessionId: 'session-a', - epoch: 'epoch-a', - direction: 'tail', - items: [item('latest', 11)], - removedItemIds: [], - submissions: [submission(7)], - window: { - oldest: { epoch: 'epoch-a', sequence: 11 }, - newest: { epoch: 'epoch-a', sequence: 11 }, - nextCursor: { epoch: 'epoch-a', sequence: 11 } - }, - liveCursor: { epoch: 'epoch-a', sequence: 11 }, - hasOlder: true, - hasNewer: false - } - }) - - expect(refreshed.submissions.map((entry) => entry.clientMessageId)).toEqual( - Array.from({ length: 8 }, (_, index) => `client-${index}`) - ) - }) - - it('bounds retained submission identities across repeated tail refreshes', () => { - let state = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'event', - event: { - type: 'snapshot', - sessionId: 'session-a', - fence: 1, - page: hydrationPage([item('first', 1)]) - } - }) - - for (let index = 0; index < 300; index += 1) { - state = reduceStructuredAgentSession(state, { - type: 'tail-page', - page: { - sessionId: 'session-a', - epoch: 'epoch-a', - direction: 'tail', - items: [item(`item-${index}`, index + 2)], - removedItemIds: [], - submissions: [submission(index)], - window: { - oldest: { epoch: 'epoch-a', sequence: index + 2 }, - newest: { epoch: 'epoch-a', sequence: index + 2 }, - nextCursor: { epoch: 'epoch-a', sequence: index + 2 } - }, - liveCursor: { epoch: 'epoch-a', sequence: index + 2 }, - hasOlder: true, - hasNewer: false - } - }) - } - - expect(state.submissions).toHaveLength(256) - expect(state.submissions[0]?.clientMessageId).toBe('client-44') - expect(state.submissions.at(-1)?.clientMessageId).toBe('client-299') - }) - it('projects additive background task state without changing transcript identity', () => { const initial = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { type: 'event', @@ -625,38 +445,6 @@ describe('structured agent session reducer', () => { 9_800 ) expect(unstamped.hostClock).toEqual({ hostNow: 5_400, receivedAt: 9_400 }) - - const paged = reduceStructuredAgentSession( - unstamped, - { type: 'tail-page', page: { ...hydrationPage([item('fourth', 4)]), hostNow: 6_000 } }, - 10_000 - ) - expect(paged.hostClock).toEqual({ hostNow: 6_000, receivedAt: 10_000 }) - expect( - reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'tail-page', - page: hydrationPage([item('first', 1)]) - }).hostClock - ).toBeUndefined() - }) - - it('retains same-epoch activity across a newer journal tail refresh', () => { - const active = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { - type: 'event', - event: { - type: 'snapshot', - sessionId: 'session-a', - fence: 1, - page: hydrationPage([item('first', 1)]), - activity: { turnId: 'turn-1', text: 'Checking the renderer' } - } - }) - const refreshed = reduceStructuredAgentSession(active, { - type: 'tail-page', - page: hydrationPage([item('latest', 2)]) - }) - - expect(refreshed.activity).toEqual({ turnId: 'turn-1', text: 'Checking the renderer' }) }) }) diff --git a/src/shared/structured-agent-session-reducer.ts b/src/shared/structured-agent-session-reducer.ts index 15a2ad34608..b86e927c15d 100644 --- a/src/shared/structured-agent-session-reducer.ts +++ b/src/shared/structured-agent-session-reducer.ts @@ -45,7 +45,7 @@ export type StructuredAgentSessionAction = | { type: 'error'; message: string } | { type: 'handoff'; handoff: AgentSessionHandoffStatus } | { type: 'event'; event: AgentSessionSubscribeEvent } - | { type: 'tail-page'; page: AgentSessionHistoryPage } + | { type: 'history-page'; page: AgentSessionHistoryPage } | { type: 'older-page'; requestedCursor: AgentJournalCursor; page: AgentSessionHistoryPage } const MAX_RETAINED_SUBMISSIONS = 256 @@ -77,7 +77,7 @@ function hostClockField( function replacePage( page: AgentSessionHistoryPage, - fence: number, + fence: number | null, handoff?: AgentSessionHandoffStatus, backgroundTasks?: AgentSessionBackgroundTaskState | null, activity?: AgentSessionTurnActivity | null @@ -165,56 +165,16 @@ export function reduceStructuredAgentSession( if (action.type === 'handoff') { return { ...state, handoff: action.handoff } } - if (action.type === 'tail-page') { - const pageCursor = action.page.liveCursor ?? action.page.window.newest - // An equal cursor means the page holds nothing the stream has not already - // delivered; replacing would throw away paged-in older items mid-scroll. - if ( - state.epoch === action.page.epoch && - state.cursor && - (!pageCursor || pageCursor.sequence <= state.cursor.sequence) - ) { - const backgroundTasksChanged = - action.page.backgroundTasks !== undefined && - !backgroundTaskStatesEqual(action.page.backgroundTasks, state.backgroundTasks) - if ( - pageCursor?.sequence === state.cursor.sequence && - ((action.page.fence !== undefined && action.page.fence !== state.fence) || - backgroundTasksChanged) - ) { - return { - ...state, - ...(action.page.fence !== undefined ? { fence: action.page.fence } : {}), - ...(action.page.backgroundTasks !== undefined - ? { backgroundTasks: action.page.backgroundTasks } - : {}), - ...hostClockField(action.page.hostNow, receivedAt, state.hostClock), - status: 'ready', - error: undefined - } - } - return state - } - const sameEpoch = state.epoch === action.page.epoch + if (action.type === 'history-page') { return { - epoch: action.page.epoch, - cursor: action.page.liveCursor ?? null, - fence: action.page.fence ?? null, - items: action.page.items, - submissions: sameEpoch - ? mergeSubmissions(state.submissions, action.page.submissions, action.page.items) - : action.page.submissions, - retainedItemLimit: Math.max(MAX_RETAINED_ITEMS, action.page.items.length), - hasOlder: action.page.hasOlder, - status: 'ready', - handoff: state.handoff, - ...(sameEpoch ? { commands: state.commands } : {}), - ...(sameEpoch && state.activity !== undefined ? { activity: state.activity } : {}), - ...(action.page.backgroundTasks !== undefined - ? { backgroundTasks: action.page.backgroundTasks } - : state.backgroundTasks !== undefined - ? { backgroundTasks: state.backgroundTasks } - : {}), + ...replacePage( + action.page, + action.page.fence ?? null, + state.handoff ?? undefined, + state.backgroundTasks, + state.activity + ), + commands: state.commands, ...hostClockField(action.page.hostNow, receivedAt, state.hostClock) } } @@ -309,12 +269,3 @@ export function oldestStructuredAgentSessionCursor( const oldest = state.items[0] return state.epoch && oldest ? { epoch: state.epoch, sequence: oldest.sequence } : null } - -export function shouldAdvanceStructuredResumeCursor( - current: AgentJournalCursor | null, - incoming: AgentJournalCursor -): boolean { - return ( - current === null || (current.epoch === incoming.epoch && incoming.sequence >= current.sequence) - ) -} diff --git a/tests/e2e/browser-pointer-input-dispatch.spec.ts b/tests/e2e/browser-pointer-input-dispatch.spec.ts new file mode 100644 index 00000000000..3068d062680 --- /dev/null +++ b/tests/e2e/browser-pointer-input-dispatch.spec.ts @@ -0,0 +1,354 @@ +/** + * E2E coverage for coordinate pointer input (browser.mouseMove/Down/Up/Wheel). + * + * Drives the exact RPC sequences BrowserPane sends, measures their cost, and checks the + * gestures they must produce: click, double-click, right-click, drag-selection, and a + * wheel that scrolls the element under the cursor. + */ + +import { createServer, type Server } from 'node:http' +import type { Page } from '@stablyai/playwright-test' +import { test, expect } from './helpers/orca-app' +import { ensureTerminalVisible, getActiveWorktreeId, waitForActiveWorktree } from './helpers/store' + +type RuntimeResponse = { + ok: boolean + result?: unknown + error?: unknown +} + +function readProperty(value: unknown, key: string): unknown { + return value !== null && typeof value === 'object' && key in value + ? Object.getOwnPropertyDescriptor(value, key)?.value + : undefined +} + +function toRuntimeResponse(value: unknown): RuntimeResponse { + return { + ok: readProperty(value, 'ok') === true, + result: readProperty(value, 'result'), + error: readProperty(value, 'error') + } +} + +const PAGE_HTML = ` + + + + Pointer input probe + + + + +
alpha bravo charlie
+
+ + +` + +async function startProbeServer(): Promise<{ url: string; close: () => Promise }> { + const server: Server = createServer((_request, response) => { + response.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }) + response.end(PAGE_HTML) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const address = server.address() + if (address === null || typeof address === 'string') { + throw new Error('Probe server did not bind a TCP port') + } + const url = `http://127.0.0.1:${address.port}/` + return { + url, + close: () => + new Promise((resolve, reject) => + server.close((error) => (error ? reject(error) : resolve())) + ) + } +} + +async function createBrowserTab(page: Page, worktreeId: string, url: string): Promise { + const pageId = await page.evaluate( + ({ targetWorktreeId, targetUrl }) => { + const created = window.__store?.getState().createBrowserTab(targetWorktreeId, targetUrl, { + title: 'Pointer input probe', + activate: true + }) + return created?.activePageId ?? null + }, + { targetWorktreeId: worktreeId, targetUrl: url } + ) + if (!pageId) { + throw new Error('Failed to create the probe browser page') + } + return pageId +} + +async function rpc( + page: Page, + method: string, + params: Record +): Promise { + return toRuntimeResponse( + await page.evaluate( + ({ targetMethod, targetParams }) => + window.api.runtime.call({ method: targetMethod, params: targetParams }), + { targetMethod: method, targetParams: params } + ) + ) +} + +async function expectOk( + page: Page, + method: string, + params: Record +): Promise { + const response = await rpc(page, method, params) + expect(response, `${method} failed: ${JSON.stringify(response.error)}`).toMatchObject({ + ok: true + }) + return response.result +} + +async function evaluateInPage(page: Page, pageId: string, expression: string): Promise { + const result = await expectOk(page, 'browser.eval', { page: pageId, expression }) + return readProperty(result, 'result') +} + +// Why: Chromium's own multi-click interval; a pair wider than this is two single clicks. +const DOUBLE_CLICK_INTERVAL_MS = 500 + +type RpcStep = [string, Record] + +// Why: one Playwright round-trip for the whole gesture. Driving each RPC from Node instead +// puts ~750ms of harness IPC between events on a loaded CI runner, which pushes a click +// pair outside the 500ms double-click interval and makes the harness the thing under test. +async function driveRpcSequence(page: Page, pageId: string, steps: RpcStep[]): Promise { + const failure = await page.evaluate( + async ({ targetPage, sequence }) => { + for (const [method, params] of sequence) { + const response: unknown = await window.api.runtime.call({ + method, + params: { page: targetPage, ...params } + }) + if (response === null || typeof response !== 'object' || !('ok' in response)) { + return `${method} returned no response` + } + if (response.ok !== true) { + return `${method} failed: ${JSON.stringify(response)}` + } + } + return null + }, + { targetPage: pageId, sequence: steps } + ) + if (failure !== null) { + throw new Error(failure) + } +} + +// Why: the pane sends move+down+move+up for one click, serialized. +function clickSteps(x: number, y: number, button = 'left'): RpcStep[] { + return [ + ['browser.mouseMove', { x, y }], + ['browser.mouseDown', { button }], + ['browser.mouseMove', { x, y }], + ['browser.mouseUp', { button }] + ] +} + +test('dispatches coordinate pointer input fast enough for real gestures', async ({ orcaPage }) => { + // Why: the measurement loop plus the gesture checks drive a few hundred serialized RPCs; + // a loaded CI runner needs more than the default budget even when each one is fast. + test.setTimeout(240_000) + const server = await startProbeServer() + try { + await waitForActiveWorktree(orcaPage) + await ensureTerminalVisible(orcaPage) + const worktreeId = await getActiveWorktreeId(orcaPage) + expect(worktreeId).toBeTruthy() + const pageId = await createBrowserTab(orcaPage, worktreeId!, server.url) + + await expect + .poll(() => evaluateInPage(orcaPage, pageId, 'document.title'), { timeout: 20_000 }) + .toBe('Pointer input probe') + + // ── Latency ── + + // Why: every sample runs inside the renderer, so it times the RPC the pane awaits + // rather than the Playwright round-trip. The renderer's performance.now() is coarsened + // to ~16.6ms, so each operation is timed in bulk and averaged instead of per call. + const latency = await orcaPage.evaluate(async (targetPage) => { + const call = async (method: string, params: Record): Promise => { + const response: unknown = await window.api.runtime.call({ + method, + params: { page: targetPage, ...params } + }) + if (response === null || typeof response !== 'object' || !('ok' in response)) { + throw new Error(`${method} returned no response`) + } + if (response.ok !== true) { + throw new Error(`${method} failed: ${JSON.stringify(response)}`) + } + } + // Why: enough to amortize the renderer's ~16.6ms clock coarsening (<1.4ms error + // against a floor of tens of ms) without spending a CI runner's whole test budget. + const REPEATS = 12 + const meanMs = async (run: (index: number) => Promise): Promise => { + await run(0) + const started = performance.now() + for (let i = 0; i < REPEATS; i += 1) { + await run(i) + } + return (performance.now() - started) / REPEATS + } + + return { + // Why: the control — same socket, same queue, no pointer dispatch. Anything a + // pointer event costs above this is the dispatch itself. + evalControl: await meanMs(() => call('browser.eval', { expression: '1' })), + mouseMove: await meanMs((i) => call('browser.mouseMove', { x: 60 + (i % 20), y: 300 })), + mouseWheel: await meanMs(() => call('browser.mouseWheel', { dy: 1 })), + click: await meanMs(async (i) => { + await call('browser.mouseMove', { x: 400 + (i % 10), y: 400 }) + await call('browser.mouseDown', { button: 'left' }) + await call('browser.mouseMove', { x: 400 + (i % 10), y: 400 }) + await call('browser.mouseUp', { button: 'left' }) + }) + } + }, pageId) + const latencyReport = JSON.stringify(latency) + console.log(`POINTER_LATENCY ${latencyReport}`) + // Why: Playwright does not surface a passing test's stdout in the CI job log, so the + // numbers ride along in the annotation where the failure artifact will carry them. + test.info().annotations.push({ type: 'pointer-latency', description: latencyReport }) + + // Why: absolute milliseconds vary by host, so compare against browser.eval on the same + // socket and queue — a pointer event that spawns the helper costs that plus a process + // launch. Measured multiples of the control: in process 1.5x/1.5x/4x, via the helper + // 5.7x/5.5x/20.5x. These thresholds sit between the two, not near either. + expect(latency.mouseMove, latencyReport).toBeLessThan(latency.evalControl * 3) + expect(latency.mouseWheel, latencyReport).toBeLessThan(latency.evalControl * 3) + expect(latency.click, latencyReport).toBeLessThan(latency.evalControl * 10) + + // ── Gesture fidelity ── + + await evaluateInPage(orcaPage, pageId, 'window.__events = []; true') + const clickPairStarted = Date.now() + await driveRpcSequence(orcaPage, pageId, [...clickSteps(120, 60), ...clickSteps(120, 60)]) + const clickPairMs = Date.now() - clickPairStarted + + const pressTimes = JSON.parse( + String( + await evaluateInPage( + orcaPage, + pageId, + 'JSON.stringify(window.__events.filter((e) => e.type === "mousedown").map((e) => e.t))' + ) + ) + ) + const pressGapMs = Number(pressTimes[1]) - Number(pressTimes[0]) + const cadenceReport = `${latencyReport} clickPairMs=${clickPairMs} pressGapMs=${pressGapMs}` + console.log(`POINTER_CADENCE ${cadenceReport}`) + test.info().annotations.push({ type: 'pointer-cadence', description: cadenceReport }) + + const clickEvents = String( + await evaluateInPage( + orcaPage, + pageId, + 'JSON.stringify(window.__events.filter((e) => e.type === "click" || e.type === "dblclick"))' + ) + ) + const parsedClicks: unknown[] = JSON.parse(clickEvents) + const eventsOfType = (type: string): unknown[] => + parsedClicks.filter((event) => readProperty(event, 'type') === type) + console.log(`POINTER_CLICKS ${clickEvents}`) + expect(eventsOfType('click'), cadenceReport).toHaveLength(2) + + // Why: dblclick needs both presses inside Chromium's 500ms interval, which is a + // property of how fast the host can serve five RPCs, not of the dispatch path. A + // runner too slow to express a double-click at all reports that as unverified rather + // than as a missing dblclick — the clickCount cadence itself is covered deterministically + // by agent-browser-bridge-pointer-input.test.ts under fake timers. + if (pressGapMs >= DOUBLE_CLICK_INTERVAL_MS) { + test.info().annotations.push({ + type: 'pointer-dblclick-unverified', + description: `presses were ${pressGapMs}ms apart, outside the ${DOUBLE_CLICK_INTERVAL_MS}ms interval — ${cadenceReport}` + }) + } else { + expect(eventsOfType('dblclick'), cadenceReport).toHaveLength(1) + expect(readProperty(eventsOfType('dblclick')[0], 'detail'), cadenceReport).toBe(2) + } + + // ── Right click ── + + await evaluateInPage(orcaPage, pageId, 'window.__events = []; true') + await driveRpcSequence(orcaPage, pageId, [ + ['browser.mouseMove', { x: 120, y: 60 }], + ['browser.mouseDown', { button: 'right' }], + ['browser.mouseUp', { button: 'right' }] + ]) + await expect + .poll(() => + evaluateInPage(orcaPage, pageId, 'window.__events.some((e) => e.type === "contextmenu")') + ) + .toBe('true') + + // ── Drag selection ── + + await evaluateInPage(orcaPage, pageId, 'window.getSelection().removeAllRanges(); true') + await driveRpcSequence(orcaPage, pageId, [ + ['browser.mouseMove', { x: 42, y: 155 }], + ['browser.mouseDown', { button: 'left' }], + ...[80, 120, 160, 200].map((x): RpcStep => ['browser.mouseMove', { x, y: 155 }]), + ['browser.mouseUp', { button: 'left' }] + ]) + await expect + .poll(() => evaluateInPage(orcaPage, pageId, 'String(window.getSelection())')) + .toContain('alpha') + + // ── Wheel targets the element under the cursor ── + + await evaluateInPage( + orcaPage, + pageId, + 'document.querySelector("#scroller").scrollTop = 0; window.scrollTo(0, 0); true' + ) + await driveRpcSequence(orcaPage, pageId, [ + ['browser.mouseMove', { x: 180, y: 300 }], + ...Array.from({ length: 6 }, (): RpcStep => ['browser.mouseWheel', { dy: 120 }]) + ]) + await expect + .poll( + async () => + Number( + await evaluateInPage(orcaPage, pageId, 'document.querySelector("#scroller").scrollTop') + ), + { timeout: 10_000 } + ) + .toBeGreaterThan(0) + } finally { + await server.close() + } +}) diff --git a/tests/e2e/structured-agent-session-read-owner.unit.test.ts b/tests/e2e/structured-agent-session-read-owner.unit.test.ts new file mode 100644 index 00000000000..4e64a047efc --- /dev/null +++ b/tests/e2e/structured-agent-session-read-owner.unit.test.ts @@ -0,0 +1,251 @@ +import { mkdtemp, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { + AgentSessionHistoryRequest, + AgentSessionHistoryResult, + AgentSessionStatusSummary, + AgentSessionSubscribeEvent +} from '../../src/shared/agent-session-wire' +import type { AgentJournalCursor } from '../../src/shared/agent-session-journal-types' +import { + EMPTY_STRUCTURED_AGENT_SESSION, + reduceStructuredAgentSession +} from '../../src/shared/structured-agent-session-reducer' +import { + hasUnansweredStructuredAgentSessionDispatch, + projectStructuredAgentSessionStatus +} from '../../src/shared/structured-agent-session-projection' +import { createTrackedJournalOpener } from '../../src/main/native-chat/agent-session-journal/journal-store-test-open' +import { readAgentSessionHistory } from '../../src/main/native-chat/agent-session-wire/agent-session-history-page' +import { AgentSessionSubscribers } from '../../src/main/native-chat/agent-session-wire/structured-agent-session-subscribers' +import { StructuredAgentSessionStatusFeed } from '../../src/main/native-chat/agent-session-wire/structured-agent-session-status-feed' + +const mocks = vi.hoisted(() => ({ call: vi.fn(), subscribe: vi.fn() })) +vi.mock('@/runtime/structured-agent-session-client', () => ({ + callStructuredAgentSession: mocks.call, + subscribeStructuredAgentSession: mocks.subscribe +})) + +import { + getStructuredAgentSessionReadOwner, + resetStructuredAgentSessionReadOwnersForTests +} from '../../src/renderer/src/components/native-chat/structured-agent-session-read-owner' + +const SESSION = 'cursor-body-regression' +const target = { kind: 'local' } as const +const journals = createTrackedJournalOpener() +let root: string + +beforeEach(async () => { + vi.resetAllMocks() + root = await mkdtemp(join(tmpdir(), 'orca-cursor-body-')) +}) +afterEach(async () => { + resetStructuredAgentSessionReadOwnersForTests() + await journals.closeAll() + await rm(root, { recursive: true, force: true }) +}) + +async function fixture() { + const journal = await journals.open({ + identity: { + sessionId: SESSION, + workspaceId: 'folder-workspace', + hostId: 'local', + agent: 'codex', + providerHandle: { kind: 'codex', threadId: 'thread-1' } + }, + journalDir: join(root, 'journal') + }) + async function appendOutput(index: number) { + await journal.appendItem( + { provider: 'orca', clientMessageId: `output-${index}` }, + { kind: 'status', text: `Tool output ${index}` }, + { fence: 1 } + ) + } + for (let index = 1; index < 99; index += 1) { + await appendOutput(index) + } + await journal.appendSubmission({ + clientMessageId: 'pending-send', + payloadFingerprint: 'prompt', + body: { kind: 'message', role: 'user', blocks: [{ type: 'text', text: 'Run tools' }] }, + fence: 1 + }) + expect(journal.cursor().sequence).toBe(100) + const initial = structuredClone( + readAgentSessionHistory(journal, { sessionId: SESSION, direction: 'tail' }) + ) + const accept = () => + journal.resolveDispatch({ + clientMessageId: 'pending-send', + fence: 1, + state: 'accepted', + providerIdentity: { provider: 'codex', threadId: 'thread-1', turnId: 'turn-1', ordinal: 0 } + }) + return { journal, initial, appendOutput, accept } +} + +describe('structured session cursor/body regression', () => { + it('replaces retained pending submissions together with a real bounded snapshot at 140', async () => { + const { journal, initial, appendOutput, accept } = await fixture() + const retained = reduceStructuredAgentSession(EMPTY_STRUCTURED_AGENT_SESSION, { + type: 'event', + event: { type: 'snapshot', sessionId: SESSION, page: initial.page, fence: 1 } + }) + expect(retained.submissions[0]?.dispatchState).toBe('pending') + await accept() + for (let index = 102; index <= 140; index += 1) { + await appendOutput(index) + } + const bounded = readAgentSessionHistory(journal, { + sessionId: SESSION, + direction: 'tail', + limit: 1 + }).page + expect(bounded.liveCursor?.sequence).toBe(140) + expect(bounded.items).not.toContainEqual(retained.items.at(-1)) + expect(bounded.submissions).toEqual([]) + + const replaced = reduceStructuredAgentSession(retained, { + type: 'event', + event: { type: 'snapshot', sessionId: SESSION, page: bounded, fence: 1 } + }) + expect(replaced.cursor).toEqual(bounded.liveCursor) + expect(replaced.submissions).toEqual(bounded.submissions) + expect(hasUnansweredStructuredAgentSessionDispatch(replaced.submissions, 1)).toBe(false) + }) + + it.each([40, 401])( + 'replays an off-page dispatch after %i missed rows without stranding pending state', + async (missedRows) => { + const { journal, appendOutput, accept } = await fixture() + let hostSummary: AgentSessionStatusSummary | undefined + const feed = new StructuredAgentSessionStatusFeed({ + sessions: new Map([ + [ + SESSION, + { + journal, + fence: 1, + params: { location: { workspaceId: 'folder-workspace' }, provider: 'codex' } + } + ] + ]), + getRecord: () => null, + now: () => 1_000, + onStatusChanged: (summary) => { + hostSummary = summary + } + }) + const subscribers = new AgentSessionSubscribers({ + onJournalPublished: (sessionId, published) => feed.publish(sessionId, published) + }) + const delayedOlder = Promise.withResolvers() + let warm = false + mocks.call.mockImplementation((_target, _method, request: AgentSessionHistoryRequest) => { + // Hold the measured bounded page before its asynchronous older-page fill can mask it. + if (warm && missedRows === 40 && request.direction === 'before') { + return delayedOlder.promise + } + const result = readAgentSessionHistory(journal, { + ...request, + ...(warm && missedRows === 40 ? { limit: 1 } : {}) + }) + return Promise.resolve( + structuredClone({ + ...result, + page: { ...result.page, fence: 1, hostNow: 1234 }, + providerSession: { key: 'session_id', id: 'provider-1' } + }) + ) + }) + mocks.subscribe.mockImplementation( + ( + _target, + request: { cursor?: AgentJournalCursor }, + onEvent: (event: AgentSessionSubscribeEvent) => void + ) => + Promise.resolve({ + unsubscribe: subscribers.open({ + id: 'pane', + sessionId: SESSION, + journal, + fence: 1, + cursor: request.cursor, + emit: (event) => onEvent(structuredClone(event)) + }) + }) + ) + const owner = getStructuredAgentSessionReadOwner(SESSION, target) + const unlisten = owner.subscribe(() => {}) + const deactivate = owner.activate() + await vi.waitFor(() => expect(mocks.subscribe).toHaveBeenCalledTimes(1)) + expect(owner.getSnapshot().state.cursor?.sequence).toBe(100) + expect(owner.getSnapshot().state.items.at(-1)?.body).toMatchObject({ role: 'user' }) + expect(owner.getSnapshot().state.submissions[0]?.dispatchState).toBe('pending') + expect(owner.getSnapshot().providerSession).toEqual({ key: 'session_id', id: 'provider-1' }) + expect(owner.getSnapshot().state.hostClock?.hostNow).toBe(1234) + expect(mocks.call).toHaveBeenCalledTimes(1) + deactivate() + + await accept() + for (let index = 102; index <= 100 + missedRows; index += 1) { + await appendOutput(index) + } + const tail = readAgentSessionHistory(journal, { + sessionId: SESSION, + direction: 'tail', + limit: missedRows === 40 ? 1 : 200 + }).page + expect(tail.liveCursor?.sequence).toBe(100 + missedRows) + expect(tail.submissions).toEqual([]) + feed.publish(SESSION, journal) + // IPC/RPC copies values; the journal mutates its own submission records in place. + expect(owner.getSnapshot().state.submissions[0]?.dispatchState).toBe('pending') + warm = true + const stop = owner.activate() + + await vi.waitFor(() => expect(owner.getSnapshot().state.cursor).toEqual(journal.cursor())) + const caughtUp = owner.getSnapshot().state + if (missedRows === 40) { + expect({ + cursor: caughtUp.cursor?.sequence, + dispatch: caughtUp.submissions[0]?.dispatchState, + unansweredDispatch: hasUnansweredStructuredAgentSessionDispatch(caughtUp.submissions, 1) + }).toEqual({ cursor: 140, dispatch: 'accepted', unansweredDispatch: false }) + } + + await journal.appendItem( + { provider: 'orca', clientMessageId: 'completed-turn' }, + { kind: 'turn', turnId: 'turn-1', state: 'completed' }, + { fence: 1 } + ) + subscribers.publish(SESSION, journal) + await vi.waitFor(() => expect(owner.getSnapshot().state.cursor).toEqual(journal.cursor())) + const settled = owner.getSnapshot().state + expect(hostSummary?.status).toBe('idle') + expect( + projectStructuredAgentSessionStatus(settled.items, settled.submissions, settled.fence) + ).toBe(hostSummary?.status) + expect(settled.submissions).toEqual(journal.snapshot().submissions) + expect({ + cursor: caughtUp.cursor?.sequence, + dispatch: caughtUp.submissions[0]?.dispatchState, + unansweredDispatch: hasUnansweredStructuredAgentSessionDispatch(caughtUp.submissions, 1) + }).toEqual({ cursor: 100 + missedRows, dispatch: 'accepted', unansweredDispatch: false }) + expect(mocks.call).toHaveBeenCalledTimes(1) + expect(mocks.subscribe).toHaveBeenCalledTimes(2) + expect(mocks.subscribe.mock.calls[1]?.[1]).toEqual({ + sessionId: SESSION, + cursor: { epoch: journal.cursor().epoch, sequence: 100 } + }) + + stop() + unlisten() + } + ) +})