Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
46ef7c4
Drain queued SQLite replies before faulting after a main-loop stall (…
nwparker Oct 8, 2026
69900f0
Share provider search between workspace creation and reference editing
nwparker Oct 8, 2026
a211489
Add saved force-delete preference to workspace deletion menu (#26425)
nwparker Oct 8, 2026
f052e2f
perf: skip unused Grok login-shell probe when installing agent hooks …
nwparker Oct 8, 2026
e97d18d
Avoid repeated session copies when deleting project groups (#26230)
nwparker Oct 8, 2026
10ac420
Release completed provider write payloads (#26208)
nwparker Oct 8, 2026
a4854ac
perf: skip the OpenCode reader worker when its database is absent (#2…
nwparker Oct 8, 2026
07c2379
Encode checkpoint strings in bounded native JSON chunks (#26177)
nwparker Oct 8, 2026
67dbd2f
perf: reuse chat tab ownership across unrelated app updates (#26150)
nwparker Oct 8, 2026
0eee1ce
Remove repeated row copying from terminal redraw ingestion (#26118)
nwparker Oct 8, 2026
952898b
Add always force delete dropdown to workspace recovery dialog (#26476)
nwparker Oct 8, 2026
a53967f
Native chat: add an inline visuals switch and simplify the skill (#26…
brennanb2025 Oct 8, 2026
b1cd858
Show multiple reviews and tasks in workspace cards and details
nwparker Oct 8, 2026
a747c1c
Allow another phone send after delivery is unconfirmed (#26392)
brennanb2025 Oct 8, 2026
216ef29
fix(terminal): avoid replaying completed strings after snapshots
nwparker Oct 8, 2026
6e39b8e
fix: admit relay bulk frames once under backpressure (#26333)
nwparker Oct 8, 2026
8ae5264
Record confirmed PR observations from their terminal pane
nwparker Oct 8, 2026
97a21f1
Merge remote-tracking branch 'origin/main' into OrcaWin/phase35-sync2
Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 49 additions & 73 deletions config/reliability-gates.jsonc

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion config/scripts/mobile-mirrored-storage-write-path.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ const MIRRORED_WRITERS = [
keys: ['TERMINAL_ACCESSORY_LAYOUT_STORAGE_KEY']
},
{ file: 'src/components/CustomKeyModal.tsx', keys: ['CUSTOM_ACCESSORY_KEYS_STORAGE_KEY'] },
{ file: 'src/session/mobile-structured-send-operation-journal.ts', keys: ['STORAGE_KEY'] },
{
file: 'src/worktree/last-visited-worktree-repo.ts',
keys: ['LAST_VISITED_WORKTREE_STORAGE_KEY']
Expand Down
5 changes: 2 additions & 3 deletions config/scripts/mobile-web-app-session-render.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,6 @@ describeRender(
* `mobile-web-app-screencast-lane-grant.test.mjs` derives from this closure.
*
* **The storage refusals a control makes.** The case above covers the writes a mount makes on its
* own; a refusal a user's own write earns still needs the control. That chain is
* `mobile/src/session/mobile-structured-send-page-storage-refusal.test.ts` end to end over the
* real `page-async-storage`.
* own; store-level write refusals are covered by
* `mobile/src/mobile-web-shell/bridge/page-async-storage.test.ts`.
*/
113 changes: 113 additions & 0 deletions config/scripts/terminal-partial-escape-native-continuation.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { createRequire } from 'node:module'
import { describe, expect, it } from 'vitest'
import { advancePartialEscapeTail } from '../../src/shared/terminal-partial-escape-tail'

const require = createRequire(import.meta.url)
const { Terminal } = require(process.env.ORCA_PARTIAL_ESCAPE_HEADLESS ?? '@xterm/headless')
const { SerializeAddon } = require('@xterm/addon-serialize')

function model() {
const terminal = new Terminal({ cols: 40, rows: 6, allowProposedApi: true, logLevel: 'off' })
const serializer = new SerializeAddon()
terminal.loadAddon(serializer)
const effects = []
for (const id of [2, 7, 8, 52, 1337]) {
terminal.parser.registerOscHandler(id, (data) => {
effects.push(['osc', id, data])
return true
})
}
terminal.parser.registerDcsHandler({ final: 'q' }, (data) => {
effects.push(['dcs', data])
return true
})
terminal.onData((data) => effects.push(['reply', data]))
return { terminal, serializer, effects }
}

const write = (h, data) => h.terminal._core.writeSync(data)
const state = (h) => h.terminal._core._inputHandler._parser.currentState
const screen = (h) => {
const buffer = h.terminal.buffer.active
return {
cursor: [buffer.cursorX, buffer.cursorY],
rows: Array.from({ length: buffer.length }, (_, row) => {
const line = buffer.getLine(row)
return Array.from({ length: line.length }, (_, column) => {
const cell = line.getCell(column)
return [cell.getChars(), cell.getWidth(), cell.getFgColor(), cell.getBgColor()]
})
})
}
}

function compareContinuation(source, restored, prefix, continuation) {
source.terminal.reset()
restored.terminal.reset()
source.effects.length = 0
restored.effects.length = 0
write(source, `BEFORE${prefix}\x1b`)
const serialized = source.serializer.serialize()
const pending = advancePartialEscapeTail('', `BEFORE${prefix}\x1b`)
source.effects.length = 0
write(restored, serialized + pending)
expect(restored.effects, JSON.stringify({ prefix, continuation })).toEqual([])
expect(state(restored)).toBe(state(source))
write(source, continuation)
write(restored, continuation)
expect(screen(restored), JSON.stringify({ prefix, continuation })).toEqual(screen(source))
expect(state(restored)).toBe(state(source))
expect(restored.effects).toEqual(source.effects)
}

const prefixes = [
'\x1b]2;title',
'\x1b]7;file:///original',
'\x1b]8;;https://example.com',
'\x1b]52;c;aGVsbG8=',
'\x1b]1337;File=inline=1:AAAA',
'\x1bPqpayload',
'\x1b_Gpayload',
'\x1bXpayload',
'\x1b^payload'
]

describe('completed string continuation against the native terminal parser', () => {
it.each(prefixes)('matches uninterrupted output for every following byte after %j', (prefix) => {
const source = model()
const restored = model()
try {
for (let byte = 0; byte < 256; byte++) {
compareContinuation(source, restored, prefix, `${String.fromCharCode(byte)}AFTER`)
}
} finally {
source.terminal.dispose()
restored.terminal.dispose()
}
})

it.each([0, 32, 4095, 4096, 4097, 8192])(
'does not repeat completed side effects for a %i-character payload',
(length) => {
const source = model()
const restored = model()
try {
for (const introducer of ['\x1b]2;', '\x1b]7;', '\x1b]52;', '\x1bPq']) {
for (const continuation of [
'\\AFTER',
'[32mAFTER',
'\x18AFTER',
'\x1aAFTER',
'\x1b]7;file:///next\x07AFTER',
'\x1bPqnext\x1b\\AFTER'
]) {
compareContinuation(source, restored, introducer + 'x'.repeat(length), continuation)
}
}
} finally {
source.terminal.dispose()
restored.terminal.dispose()
}
}
)
})
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@
"family": "nativeChat.image-upload",
"namedDeltas": [],
"values": {
"2ec71b490683": {
"name": "image-uploaded",
"ordinal": 8,
"value": {
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
},
"2fd17c25e4d0": {
"name": "clipboard.startImageUpload#2",
"ordinal": 9,
Expand Down Expand Up @@ -49,6 +40,14 @@
}
}
},
"31f4965e4ed4": {
"name": "image-uploaded",
"ordinal": 8,
"value": {
"path": "/tmp/img-1.png",
"previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
},
"6696a47819e1": {
"name": "clipboard.startImageUpload#1",
"ordinal": 3,
Expand Down Expand Up @@ -204,7 +203,7 @@
"two": "765ab192e1a5"
},
"state": "b2b1a4389f58",
"effects": ["994fccf9b305", "2ec71b490683"]
"effects": ["994fccf9b305", "31f4965e4ed4"]
}
}
]
Expand Down
47 changes: 22 additions & 25 deletions mobile/rpc-foundation/goldens/native-chat-image-upload-single.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,23 @@
"family": "nativeChat.image-upload",
"namedDeltas": [],
"values": {
"5c7ed03288e6": {
"0d87f193fb59": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": [
{
"path": "/tmp/img-1.png",
"previewUri": "file:///a.png"
}
]
},
"15d714ff61ff": {
"failure": {
"$rpc": "null"
},
"uploaded": [
{
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "file:///a.png"
}
Expand Down Expand Up @@ -71,17 +81,13 @@
"ordinal": 1,
"value": {}
},
"9a61808dee44": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": [
{
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "file:///a.png"
}
]
"dd123d00d140": {
"name": "image-uploaded",
"ordinal": 8,
"value": {
"path": "/tmp/img-1.png",
"previewUri": "file:///a.png"
}
},
"ec8f73d25f26": {
"name": "clipboard.commitImageUpload#1",
Expand Down Expand Up @@ -150,15 +156,6 @@
}
}
}
},
"f4c66fc96af9": {
"name": "image-uploaded",
"ordinal": 8,
"value": {
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "file:///a.png"
}
}
},
"recording": {
Expand All @@ -170,10 +167,10 @@
"sender": ["7c2e3ea286aa", "f05e4695ffa3", "ec8f73d25f26"],
"payloads": ["6696a47819e1", "814ccd56a769", "8452698ac11a"],
"settlements": {
"normal": "9a61808dee44"
"normal": "0d87f193fb59"
},
"state": "5c7ed03288e6",
"effects": ["994fccf9b305", "f4c66fc96af9"]
"state": "15d714ff61ff",
"effects": ["994fccf9b305", "dd123d00d140"]
}
}
]
Expand Down
70 changes: 32 additions & 38 deletions mobile/rpc-foundation/goldens/native-chat-image-upload-two.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,41 +4,14 @@
"family": "nativeChat.image-upload",
"namedDeltas": [],
"values": {
"147a6d6af2f1": {
"name": "image-uploaded",
"ordinal": 15,
"value": {
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-2.png",
"previewUri": "file:///b.png"
}
},
"2ec71b490683": {
"31f4965e4ed4": {
"name": "image-uploaded",
"ordinal": 8,
"value": {
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
},
"4a3413975ca6": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": [
{
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
},
{
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-2.png",
"previewUri": "file:///b.png"
}
]
},
"5c19acb9611e": {
"name": "clipboard.commitImageUpload#2",
"ordinal": 13,
Expand Down Expand Up @@ -121,18 +94,16 @@
"ordinal": 7,
"json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"clipboard.commitImageUpload\",\"params\":{\"uploadId\":\"upload-1\"}}"
},
"8d51e9899739": {
"failure": {
"$rpc": "null"
},
"uploaded": [
"87c17cf78a60": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": [
{
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-1.png",
"previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
},
{
"contentFingerprint": "f75f583c67e2aaf12284c94d09b56e3caa9d7b93b71565d2fd3e09ef635cef8d",
"path": "/tmp/img-2.png",
"previewUri": "file:///b.png"
}
Expand Down Expand Up @@ -224,6 +195,14 @@
}
}
},
"d7dc1460b465": {
"name": "image-uploaded",
"ordinal": 15,
"value": {
"path": "/tmp/img-2.png",
"previewUri": "file:///b.png"
}
},
"e74ddb684ed1": {
"name": "clipboard.startImageUpload#2",
"ordinal": 10,
Expand Down Expand Up @@ -296,6 +275,21 @@
}
}
}
},
"f6cdfabc3790": {
"failure": {
"$rpc": "null"
},
"uploaded": [
{
"path": "/tmp/img-1.png",
"previewUri": "data:image/png;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
},
{
"path": "/tmp/img-2.png",
"previewUri": "file:///b.png"
}
]
}
},
"recording": {
Expand All @@ -321,10 +315,10 @@
"a77c2409e01f"
],
"settlements": {
"two": "4a3413975ca6"
"two": "87c17cf78a60"
},
"state": "8d51e9899739",
"effects": ["994fccf9b305", "2ec71b490683", "147a6d6af2f1"]
"state": "f6cdfabc3790",
"effects": ["994fccf9b305", "31f4965e4ed4", "d7dc1460b465"]
}
}
]
Expand Down
2 changes: 1 addition & 1 deletion mobile/src/mobile-web-shell/page-storage-keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const PAGE_STORAGE_EXACT_KEYS = [
'orca:custom-accessory-keys',
/** Whether a supported agent session opens on the terminal or the native chat. */
'orca:defaultSessionView',
/** The durable send journal: which `agentSession.send` operation ids are still unsettled. */
/** Legacy journal access for embedded pages served by older hosts. */
'orca:mobileStructuredSendOperations:v1',
/** The terminal's text scale, which pinch-to-zoom writes. */
'orca:terminalTextScale',
Expand Down
1 change: 0 additions & 1 deletion mobile/src/platform/native-chat-image-fingerprint.ts

This file was deleted.

Loading
Loading