refactor(mobile): read host capabilities from one status read per connection (#39157)

This commit is contained in:
Kelvin Amoaba
2026-11-07 04:04:19 +00:00
committed by GitHub
parent cc6a66ed01
commit 22f09f4257
20 changed files with 2105 additions and 2889 deletions
@@ -35,70 +35,6 @@
"startedAt": 0
}
},
"0ddf5d4952fd": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-5",
"ok": true,
"result": {
"issues": [],
"sessions": [
{
"agent": "claude",
"branch": "feature",
"codexHome": {
"$rpc": "null"
},
"createdAt": "2025-12-31T23:00:00.000Z",
"cwd": "/repo/feature",
"executionHostId": "local",
"filePath": "/repo/feature/.claude/sess-1.jsonl",
"id": "s1",
"messageCount": 4,
"model": "opus",
"modifiedAt": "2025-12-31T23:30:00.000Z",
"previewMessages": [
{
"role": "user",
"text": "fix it",
"timestamp": "2025-12-31T23:00:00.000Z"
}
],
"sessionId": "sess-1",
"title": "Fix the explorer",
"totalTokens": 1200,
"updatedAt": "2025-12-31T23:30:00.000Z"
}
]
}
}
}
},
"222a3ba1d974": {
"name": "worktree.ps#1",
"ordinal": 3,
@@ -144,26 +80,43 @@
}
}
},
"40fa6811eb00": {
"name": "streams-registered-at-teardown",
"ordinal": 10,
"value": [
{
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
]
},
"4d68bff46cff": {
"name": "status.get#1",
"ordinal": 4,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
},
"613355526cb5": {
"595e6c3bbfed": {
"name": "aiVault.listSessions#1",
"ordinal": 9,
"json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
},
"6cd39311d5ec": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"7368414c8786": {
"name": "worktree.ps#1",
@@ -207,72 +160,16 @@
"labels": ["Back", "Refresh agent sessions"],
"text": ["Agent Session History", "orca-history", "Loading agent sessions…"]
},
"7a008ca8521f": {
"name": "status.get#2",
"ordinal": 6,
"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-4",
"ok": true,
"result": {
"capabilities": ["aiVault.v1"]
}
}
}
},
"98d7022b1300": {
"name": "aiVault.listSessions#1",
"7e8b2964ad63": {
"name": "streams-registered-at-teardown",
"ordinal": 8,
"args": [
"value": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"a26eb8ffaa7c": {
"name": "status.get#2",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
]
},
"acf501fa9958": {
"name": "status.get#1",
@@ -338,6 +235,70 @@
],
"text": ["Agent Session History", "orca-history", "Workspace", "Project", "All"]
},
"c630476f4fd3": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-4",
"ok": true,
"result": {
"issues": [],
"sessions": [
{
"agent": "claude",
"branch": "feature",
"codexHome": {
"$rpc": "null"
},
"createdAt": "2025-12-31T23:00:00.000Z",
"cwd": "/repo/feature",
"executionHostId": "local",
"filePath": "/repo/feature/.claude/sess-1.jsonl",
"id": "s1",
"messageCount": 4,
"model": "opus",
"modifiedAt": "2025-12-31T23:30:00.000Z",
"previewMessages": [
{
"role": "user",
"text": "fix it",
"timestamp": "2025-12-31T23:00:00.000Z"
}
],
"sessionId": "sess-1",
"title": "Fix the explorer",
"totalTokens": 1200,
"updatedAt": "2025-12-31T23:30:00.000Z"
}
]
}
}
}
},
"e28c488ce6b2": {
"name": "agentSession.subscribeStatus#1",
"ordinal": 1,
@@ -370,14 +331,8 @@
{
"id": "worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "6cd39311d5ec"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -388,14 +343,8 @@
{
"id": "ready",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "0ddf5d4952fd"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "c630476f4fd3"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -406,19 +355,13 @@
{
"id": "cleanup",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "0ddf5d4952fd"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "c630476f4fd3"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "b7a7af14c8a5",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
}
]
@@ -80,26 +80,77 @@
}
}
},
"40fa6811eb00": {
"name": "streams-registered-at-teardown",
"ordinal": 10,
"value": [
{
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
]
},
"4d68bff46cff": {
"name": "status.get#1",
"ordinal": 4,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
},
"613355526cb5": {
"4f7d48d96db6": {
"name": "aiVault.listSessions#1",
"ordinal": 9,
"json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"595e6c3bbfed": {
"name": "aiVault.listSessions#1",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
},
"6cd39311d5ec": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"7368414c8786": {
"name": "worktree.ps#1",
@@ -143,106 +194,16 @@
"labels": ["Back", "Refresh agent sessions"],
"text": ["Agent Session History", "orca-history", "Loading agent sessions…"]
},
"79fc75a7b709": {
"name": "aiVault.listSessions#1",
"7e8b2964ad63": {
"name": "streams-registered-at-teardown",
"ordinal": 8,
"args": [
"value": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"7a008ca8521f": {
"name": "status.get#2",
"ordinal": 6,
"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-4",
"ok": true,
"result": {
"capabilities": ["aiVault.v1"]
}
}
}
},
"98d7022b1300": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"a26eb8ffaa7c": {
"name": "status.get#2",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
]
},
"acf501fa9958": {
"name": "status.get#1",
@@ -310,14 +271,8 @@
{
"id": "worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "6cd39311d5ec"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -328,19 +283,13 @@
{
"id": "cleanup",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "4f7d48d96db6"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
}
]
File diff suppressed because it is too large Load Diff
@@ -115,17 +115,6 @@
}
}
},
"40fa6811eb00": {
"name": "streams-registered-at-teardown",
"ordinal": 10,
"value": [
{
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
]
},
"471bd606315a": {
"name": "status.get#1",
"ordinal": 2,
@@ -165,6 +154,40 @@
"ordinal": 4,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
},
"4f7d48d96db6": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"51e670a85520": {
"name": "status.get#1",
"ordinal": 2,
@@ -228,10 +251,38 @@
}
}
},
"613355526cb5": {
"595e6c3bbfed": {
"name": "aiVault.listSessions#1",
"ordinal": 9,
"json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
},
"6cd39311d5ec": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"7368414c8786": {
"name": "worktree.ps#1",
@@ -259,6 +310,17 @@
"startedAt": 0
}
},
"758b3fde1948": {
"name": "streams-registered-at-teardown",
"ordinal": 6,
"value": [
{
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
]
},
"7623e8b568b1": {
"crash": {
"$rpc": "null"
@@ -275,74 +337,6 @@
"labels": ["Back", "Refresh agent sessions"],
"text": ["Agent Session History", "orca-history", "Loading agent sessions…"]
},
"79fc75a7b709": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"7a008ca8521f": {
"name": "status.get#2",
"ordinal": 6,
"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-4",
"ok": true,
"result": {
"capabilities": ["aiVault.v1"]
}
}
}
},
"7b715c94cd95": {
"name": "status.get#1",
"ordinal": 2,
@@ -424,33 +418,43 @@
}
}
},
"98d7022b1300": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
"8502a1cdf759": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"CircleAlert": 1,
"Pressable": 3,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 5,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": ["Agent Session History", "orca-history", "Unable to Load", "outer refused", "Retry"]
},
"89ca6152d289": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"CircleAlert": 1,
"Pressable": 3,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 5,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": [
"Agent Session History",
"orca-history",
"Unable to Load",
"The host sent a reply this app could not read (status.get)",
"Retry"
]
},
"9b8c00f534c6": {
"name": "status.get#1",
@@ -550,10 +554,27 @@
}
}
},
"a26eb8ffaa7c": {
"name": "status.get#2",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
"a1cee1ec8f4c": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"CircleAlert": 1,
"Pressable": 3,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 5,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": [
"Agent Session History",
"orca-history",
"Unable to Load",
"transport failure",
"Retry"
]
},
"a5e3c1935fd2": {
"name": "status.get#1",
@@ -624,37 +645,21 @@
}
}
},
"ba8394a4ce03": {
"name": "status.get#2",
"ordinal": 6,
"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": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
"c3d0a79c37c8": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"CircleAlert": 1,
"Pressable": 3,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 5,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": ["Agent Session History", "orca-history", "Unable to Load", "Unknown method", "Retry"]
},
"d302f4eada82": {
"name": "status.get#1",
@@ -693,11 +698,54 @@
}
}
},
"ddc03a109a53": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"History": 1,
"Pressable": 2,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 4,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": [
"Agent Session History",
"orca-history",
"Agent Session History Unavailable",
"Update Orca on this host to browse agent session history."
]
},
"e28c488ce6b2": {
"name": "agentSession.subscribeStatus#1",
"ordinal": 1,
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"agentSession.subscribeStatus\",\"params\":{}}"
},
"e2d097a144bc": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"CircleAlert": 1,
"Pressable": 3,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 5,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": [
"Agent Session History",
"orca-history",
"Unable to Load",
"Something went wrong. Try again.",
"Retry"
]
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
@@ -705,6 +753,28 @@
"value": {
"$rpc": "undefined"
}
},
"f975325adbf9": {
"crash": {
"$rpc": "null"
},
"elements": {
"ChevronLeft": 1,
"CircleAlert": 1,
"Pressable": 3,
"RefreshCw": 1,
"SafeAreaView": 1,
"Text": 5,
"View": 8
},
"labels": ["Back", "Refresh agent sessions"],
"text": [
"Agent Session History",
"orca-history",
"Unable to Load",
"Unable to reach host",
"Retry"
]
}
},
"recording": {
@@ -725,26 +795,20 @@
{
"id": "aivault-history-screen-worktrees.prelude:cleanup",
"observation": {
"sender": ["9b8c00f534c6", "222a3ba1d974", "ba8394a4ce03"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "a26eb8ffaa7c"],
"sender": ["9b8c00f534c6", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["7e8b2964ad63"]
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.normal:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "6cd39311d5ec"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -755,379 +819,253 @@
{
"id": "aivault-history-screen-worktrees.normal:cleanup",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "4f7d48d96db6"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.result-absent:worktrees-listed",
"observation": {
"sender": ["59290155f27a", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["59290155f27a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "89ca6152d289",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.result-absent:cleanup",
"observation": {
"sender": ["59290155f27a", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["59290155f27a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "89ca6152d289",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.result-null:worktrees-listed",
"observation": {
"sender": ["471bd606315a", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["471bd606315a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "89ca6152d289",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.result-null:cleanup",
"observation": {
"sender": ["471bd606315a", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["471bd606315a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "89ca6152d289",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.inner-ok-missing:worktrees-listed",
"observation": {
"sender": ["9efd8381401a", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["9efd8381401a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "ddc03a109a53",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.inner-ok-missing:cleanup",
"observation": {
"sender": ["9efd8381401a", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["9efd8381401a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "ddc03a109a53",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.inner-false-string-error:worktrees-listed",
"observation": {
"sender": ["7b715c94cd95", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["7b715c94cd95", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "ddc03a109a53",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.inner-false-string-error:cleanup",
"observation": {
"sender": ["7b715c94cd95", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["7b715c94cd95", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "ddc03a109a53",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.inner-false-object-error:worktrees-listed",
"observation": {
"sender": ["d302f4eada82", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["d302f4eada82", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "ddc03a109a53",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.inner-false-object-error:cleanup",
"observation": {
"sender": ["d302f4eada82", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["d302f4eada82", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "ddc03a109a53",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.outer-refused:worktrees-listed",
"observation": {
"sender": ["824e7d747f2a", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["824e7d747f2a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "8502a1cdf759",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.outer-refused:cleanup",
"observation": {
"sender": ["824e7d747f2a", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["824e7d747f2a", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "8502a1cdf759",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.outer-refused-no-message:worktrees-listed",
"observation": {
"sender": ["a5e3c1935fd2", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["a5e3c1935fd2", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "f975325adbf9",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.outer-refused-no-message:cleanup",
"observation": {
"sender": ["a5e3c1935fd2", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["a5e3c1935fd2", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "f975325adbf9",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.method-not-found:worktrees-listed",
"observation": {
"sender": ["1675b1df2d81", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["1675b1df2d81", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "c3d0a79c37c8",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.method-not-found:cleanup",
"observation": {
"sender": ["1675b1df2d81", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["1675b1df2d81", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "c3d0a79c37c8",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.transport-rejection:worktrees-listed",
"observation": {
"sender": ["51e670a85520", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["51e670a85520", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "a1cee1ec8f4c",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.transport-rejection:cleanup",
"observation": {
"sender": ["51e670a85520", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["51e670a85520", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "a1cee1ec8f4c",
"effects": ["758b3fde1948"]
}
},
{
"id": "aivault-history-screen-worktrees.transport-rejection-no-message:worktrees-listed",
"observation": {
"sender": ["9cfa291517f9", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["9cfa291517f9", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"state": "e2d097a144bc",
"effects": []
}
},
{
"id": "aivault-history-screen-worktrees.transport-rejection-no-message:cleanup",
"observation": {
"sender": ["9cfa291517f9", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["9cfa291517f9", "222a3ba1d974"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"state": "e2d097a144bc",
"effects": ["758b3fde1948"]
}
}
]
File diff suppressed because it is too large Load Diff
@@ -137,34 +137,6 @@
}
}
},
"1ff410f2eb07": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": []
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"222a3ba1d974": {
"name": "worktree.ps#1",
"ordinal": 3,
@@ -244,26 +216,49 @@
}
}
},
"40fa6811eb00": {
"name": "streams-registered-at-teardown",
"ordinal": 10,
"value": [
{
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
]
},
"4d68bff46cff": {
"name": "status.get#1",
"ordinal": 4,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
},
"613355526cb5": {
"4f7d48d96db6": {
"name": "aiVault.listSessions#1",
"ordinal": 9,
"json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"595e6c3bbfed": {
"name": "aiVault.listSessions#1",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[\"/repo/feature\"]}}"
},
"6405fa9d6a94": {
"name": "worktree.ps#1",
@@ -300,6 +295,34 @@
}
}
},
"6cd39311d5ec": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"7182750ca2d1": {
"name": "worktree.ps#1",
"ordinal": 3,
@@ -335,6 +358,11 @@
}
}
},
"7312d72e532d": {
"name": "aiVault.listSessions#1",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[]}}"
},
"7368414c8786": {
"name": "worktree.ps#1",
"ordinal": 3,
@@ -361,6 +389,34 @@
"startedAt": 0
}
},
"739d442628ed": {
"name": "aiVault.listSessions#1",
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": []
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"758b3fde1948": {
"name": "streams-registered-at-teardown",
"ordinal": 6,
@@ -388,107 +444,16 @@
"labels": ["Back", "Refresh agent sessions"],
"text": ["Agent Session History", "orca-history", "Loading agent sessions…"]
},
"79fc75a7b709": {
"name": "aiVault.listSessions#1",
"7e8b2964ad63": {
"name": "streams-registered-at-teardown",
"ordinal": 8,
"args": [
"value": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
"cancelled": false,
"method": "agentSession.subscribeStatus",
"payload": "agentSession.subscribeStatus#1"
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"7a008ca8521f": {
"name": "status.get#2",
"ordinal": 6,
"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-4",
"ok": true,
"result": {
"capabilities": ["aiVault.v1"]
}
}
}
},
"8123e6fb3b52": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": []
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
]
},
"858c23d8f3ef": {
"name": "worktree.ps#1",
@@ -554,34 +519,6 @@
}
}
},
"98d7022b1300": {
"name": "aiVault.listSessions#1",
"ordinal": 8,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": ["/repo/feature"]
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "pending",
"startedAt": 0
}
},
"9a209a9534f9": {
"name": "worktree.ps#1",
"ordinal": 3,
@@ -649,11 +586,6 @@
}
}
},
"a26eb8ffaa7c": {
"name": "status.get#2",
"ordinal": 7,
"json": "{\"id\":\"frame-4\",\"deviceToken\":\"recording-device\",\"method\":\"status.get\"}"
},
"acf501fa9958": {
"name": "status.get#1",
"ordinal": 2,
@@ -720,10 +652,39 @@
}
}
},
"ddb026ba4968": {
"c8a1368e170b": {
"name": "aiVault.listSessions#1",
"ordinal": 9,
"json": "{\"id\":\"frame-5\",\"deviceToken\":\"recording-device\",\"method\":\"aiVault.listSessions\",\"params\":{\"limit\":500,\"force\":false,\"scopePaths\":[]}}"
"ordinal": 6,
"args": [
{
"name": "method",
"value": "aiVault.listSessions"
},
{
"name": "params",
"value": {
"force": false,
"limit": 500,
"scopePaths": []
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 0,
"settledAt": 0,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"de6f51a372a1": {
"name": "worktree.ps#1",
@@ -804,14 +765,8 @@
{
"id": "aivault-history-screen-worktrees.normal:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "98d7022b1300"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "6cd39311d5ec"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -822,32 +777,20 @@
{
"id": "aivault-history-screen-worktrees.normal:cleanup",
"observation": {
"sender": ["acf501fa9958", "222a3ba1d974", "7a008ca8521f", "79fc75a7b709"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"613355526cb5"
],
"sender": ["acf501fa9958", "222a3ba1d974", "4f7d48d96db6"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "595e6c3bbfed"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.result-absent:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "19cf1a6a7639", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "19cf1a6a7639", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -858,32 +801,20 @@
{
"id": "aivault-history-screen-worktrees.result-absent:cleanup",
"observation": {
"sender": ["acf501fa9958", "19cf1a6a7639", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "19cf1a6a7639", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.result-null:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "30b5ef327e47", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "30b5ef327e47", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -894,32 +825,20 @@
{
"id": "aivault-history-screen-worktrees.result-null:cleanup",
"observation": {
"sender": ["acf501fa9958", "30b5ef327e47", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "30b5ef327e47", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.inner-ok-missing:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "00b7efbaf87f", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "00b7efbaf87f", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -930,32 +849,20 @@
{
"id": "aivault-history-screen-worktrees.inner-ok-missing:cleanup",
"observation": {
"sender": ["acf501fa9958", "00b7efbaf87f", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "00b7efbaf87f", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.inner-false-string-error:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "7182750ca2d1", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "7182750ca2d1", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -966,32 +873,20 @@
{
"id": "aivault-history-screen-worktrees.inner-false-string-error:cleanup",
"observation": {
"sender": ["acf501fa9958", "7182750ca2d1", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "7182750ca2d1", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.inner-false-object-error:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "0569ef4f06ba", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "0569ef4f06ba", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -1002,32 +897,20 @@
{
"id": "aivault-history-screen-worktrees.inner-false-object-error:cleanup",
"observation": {
"sender": ["acf501fa9958", "0569ef4f06ba", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "0569ef4f06ba", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.outer-refused:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "9a209a9534f9", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "9a209a9534f9", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -1038,32 +921,20 @@
{
"id": "aivault-history-screen-worktrees.outer-refused:cleanup",
"observation": {
"sender": ["acf501fa9958", "9a209a9534f9", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "9a209a9534f9", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.outer-refused-no-message:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "de6f51a372a1", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "de6f51a372a1", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -1074,32 +945,20 @@
{
"id": "aivault-history-screen-worktrees.outer-refused-no-message:cleanup",
"observation": {
"sender": ["acf501fa9958", "de6f51a372a1", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "de6f51a372a1", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.method-not-found:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "6405fa9d6a94", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "6405fa9d6a94", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -1110,32 +969,20 @@
{
"id": "aivault-history-screen-worktrees.method-not-found:cleanup",
"observation": {
"sender": ["acf501fa9958", "6405fa9d6a94", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "6405fa9d6a94", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.transport-rejection:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "c4a0ee2acc32", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "c4a0ee2acc32", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -1146,32 +993,20 @@
{
"id": "aivault-history-screen-worktrees.transport-rejection:cleanup",
"observation": {
"sender": ["acf501fa9958", "c4a0ee2acc32", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "c4a0ee2acc32", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
},
{
"id": "aivault-history-screen-worktrees.transport-rejection-no-message:worktrees-listed",
"observation": {
"sender": ["acf501fa9958", "858c23d8f3ef", "7a008ca8521f", "1ff410f2eb07"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "858c23d8f3ef", "739d442628ed"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
@@ -1182,19 +1017,13 @@
{
"id": "aivault-history-screen-worktrees.transport-rejection-no-message:cleanup",
"observation": {
"sender": ["acf501fa9958", "858c23d8f3ef", "7a008ca8521f", "8123e6fb3b52"],
"payloads": [
"e28c488ce6b2",
"4d68bff46cff",
"0180d22edc2e",
"a26eb8ffaa7c",
"ddb026ba4968"
],
"sender": ["acf501fa9958", "858c23d8f3ef", "c8a1368e170b"],
"payloads": ["e28c488ce6b2", "4d68bff46cff", "0180d22edc2e", "7312d72e532d"],
"settlements": {
"mount": "eb79a9b3682a"
},
"state": "7623e8b568b1",
"effects": ["40fa6811eb00"]
"effects": ["7e8b2964ad63"]
}
}
]
File diff suppressed because it is too large Load Diff
@@ -3119,18 +3119,6 @@
{
"checkpoint": "refresh-pending"
},
{
"complete": "status.get#2",
"params": {
"$undefined": true
},
"reply": {
"ok": true,
"result": {
"capabilities": ["mobile.tasks.v1"]
}
}
},
{
"complete": "settings.get#2",
"params": {
@@ -20351,18 +20339,6 @@
}
}
},
{
"complete": "status.get#2",
"params": {
"$undefined": true
},
"reply": {
"ok": true,
"result": {
"capabilities": ["aiVault.v1"]
}
}
},
{
"checkpoint": "worktrees-listed"
}
@@ -20425,18 +20401,6 @@
}
}
},
{
"complete": "status.get#2",
"params": {
"$undefined": true
},
"reply": {
"ok": true,
"result": {
"capabilities": ["aiVault.v1"]
}
}
},
{
"checkpoint": "worktrees-listed"
},
@@ -1,5 +1,6 @@
import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation'
import { rpcResultVariant } from '../transport/rpc-operation-result-reader'
import { connectionHostStatusRead } from '../query/host-status-query'
import {
agentHistoryHostStatusSchema,
agentHistorySessionScanSchema,
@@ -10,14 +11,18 @@ import {
// History capability/scan reads run on open; resume workspace metadata waits for explicit user intent.
// Keep status capability family separate from Tasks hydration: both raise host message via same reader, but fail different screen/barrier states.
export const agentHistoryHostStatusRead = bindDeferredRpcOperation(
defineRpcOperation({
name: 'status.agent-history',
method: 'status.get',
acceptance: 'require-result-or-throw-message',
barrier: 'after-caller-barrier',
read: rpcResultVariant('host-status', agentHistoryHostStatusSchema)
})
// Live: resume quotes for the desktop's Windows shell setting, which can change while connected.
export const agentHistoryHostStatusRead = connectionHostStatusRead(
bindDeferredRpcOperation(
defineRpcOperation({
name: 'status.agent-history',
method: 'status.get',
acceptance: 'require-result-or-throw-message',
barrier: 'after-caller-barrier',
read: rpcResultVariant('host-status', agentHistoryHostStatusSchema)
})
),
'live'
)
export const agentHistorySessionScan = bindDeferredRpcOperation(
@@ -10,6 +10,7 @@ import { AppState } from 'react-native'
import type { RpcResponse } from '../transport/types'
import type { RpcClient } from '../transport/rpc-client'
import { hostStatusProbe } from '../transport/host-status-probe-operations'
import { readHostStatusReply } from '../query/host-status-query'
import { subscribeConnectionRevival } from '../transport/connection-revival-signal'
import { subscribeSharedClientEvents } from '../transport/shared-client-events'
import { automationListRead } from './automation-operations'
@@ -115,9 +116,7 @@ export function useAutomationCatalog(client: RpcClient | null, server: boolean)
try {
const listRequest = automationListRead.request(client, {}, { signal: controller.signal })
requests.push(listRequest)
const statusRequest = hostStatusProbe.request(client, undefined, {
signal: controller.signal
})
const statusRequest = readHostStatusReply(client, { signal: controller.signal })
requests.push(statusRequest)
const [parsed, host] = await Promise.all([
listRequest.then(automationListRead.interpret),
@@ -1,5 +1,6 @@
import { sharedPromiseSettlementWaiters } from '../../../src/shared/promise-settlement-waiters'
import { hostStatusProbe } from '../transport/host-status-probe-operations'
import { readHostStatusReply } from '../query/host-status-query'
import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation'
import { rpcResultVariant } from '../transport/rpc-operation-result-reader'
import {
@@ -30,7 +31,7 @@ export function createMobileChatAttachmentReader(
): AttachmentTextRead {
const connectedAt = client?.getLastConnectedAt()
const generation = client?.getGeneration?.()
let status: ReturnType<typeof hostStatusProbe.request> | undefined
let status: ReturnType<typeof readHostStatusReply> | undefined
const assertCurrent = () => {
if (
!client ||
@@ -48,7 +49,7 @@ export function createMobileChatAttachmentReader(
if (!request.expectedSnapshot) {
status = undefined
}
status ??= hostStatusProbe.request(client!, undefined, {
status ??= readHostStatusReply(client!, {
signal,
timeoutMs: 15_000,
failWhenDisconnected: true,
+135
View File
@@ -0,0 +1,135 @@
import { hostStatusProbe, readProbedHostStatus } from '../transport/host-status-probe-operations'
import type { HostStatusReply } from '../transport/host-status-reply-schema'
import type { RpcClient, SendRequestOptions } from '../transport/rpc-client'
import type { RpcResponse } from '../transport/types'
import type { UnvalidatedRpcRequestPort } from '../transport/unvalidated-rpc-request-port'
export type HostStatusClient = UnvalidatedRpcRequestPort &
Partial<Pick<RpcClient, 'getState' | 'getGeneration' | 'getLastConnectedAt' | 'requestRoute'>>
type LandedStatus = { reply: RpcResponse; status: HostStatusReply }
type ConnectionStatus = { epoch: string; landed?: LandedStatus; pending?: Promise<RpcResponse> }
// Keyed by client, so each JS world (native heap, each page document) holds its own.
const statuses = new WeakMap<object, ConnectionStatus>()
export const hostConnectionEpoch = (client: HostStatusClient) =>
`${client.getGeneration?.()}:${client.getLastConnectedAt?.()}`
// Why: a routed view answers status.get from a server behind the desktop, which can restart or reconnect while
// this connection stays up, and a client with no connect time has no epoch to hold an answer to.
export function directConnectionEpoch(client: HostStatusClient): string | null {
return client.requestRoute === undefined && typeof client.getLastConnectedAt?.() === 'number'
? hostConnectionEpoch(client)
: null
}
const decodedReplies = new WeakMap<RpcResponse, ReturnType<typeof readProbedHostStatus>>()
/** Decodes a status.get reply once; decoding reports salvaged fields, and joined readers share one reply. */
export function decodeHostStatusReply(reply: RpcResponse): ReturnType<typeof readProbedHostStatus> {
if (decodedReplies.has(reply)) {
return decodedReplies.get(reply) ?? null
}
const decoded = readProbedHostStatus(reply)
decodedReplies.set(reply, decoded)
return decoded
}
// Keep each caller's own call shape: recordings pin the arguments a read was sent with.
function sendStatusGet(client: HostStatusClient, options: SendRequestOptions | undefined) {
return options
? hostStatusProbe.request(client, undefined, options)
: hostStatusProbe.request(client)
}
// The live direct connection that answers this client's status.get, or null when none may hold an answer.
// status.get carries no params, so a view that routes by params sends it where its base client would.
function statusConnection(
client: HostStatusClient
): { connection: HostStatusClient; epoch: string } | null {
const route = client.requestRoute?.(undefined)
if (route) {
return route.intermediary || route.client === client ? null : statusConnection(route.client)
}
const epoch = client.getState?.() === 'connected' ? directConnectionEpoch(client) : null
return epoch === null ? null : { connection: client, epoch }
}
/** The status this connection already received; undefined when it has none or may not reuse one. */
export function connectionHostStatus(client: HostStatusClient): LandedStatus | undefined {
const live = statusConnection(client)
if (!live) {
return undefined
}
const entry = statuses.get(live.connection)
return entry?.epoch === live.epoch ? entry.landed : undefined
}
/** Sends status.get, joining one already out on this connection; a readable answer becomes the connection's status. */
export function sendHostStatusRead(
client: HostStatusClient,
options?: SendRequestOptions
): Promise<RpcResponse> {
const live = statusConnection(client)
if (!live) {
return sendStatusGet(client, options)
}
const { connection, epoch } = live
let entry = statuses.get(connection)
if (entry?.epoch !== epoch) {
entry = { epoch }
statuses.set(connection, entry)
}
if (entry.pending) {
return entry.pending
}
const owner = entry
// Other readers join this send, so one reader's abort or fence must not fail theirs; it is a read, so sending is safe.
const { signal: _signal, beforeSend: _beforeSend, ...shared } = options ?? {}
const pending = sendStatusGet(client, options && shared).then((reply) => {
const status = decodeHostStatusReply(reply)?.status
const now = statusConnection(client)
if (status && now?.connection === connection && now.epoch === epoch) {
owner.landed = { reply, status }
}
return reply
})
owner.pending = pending
const settle = () => {
if (owner.pending === pending) {
owner.pending = undefined
}
}
void pending.then(settle, settle)
return pending
}
/**
* The connection's status, read at most once per connection. Only for fields fixed for the desktop process's life
* (protocol window, non-browser capabilities, platform, runtime id); a restart is a new connection. Live fields
* (screencast capability, floating workspace flag, Windows shell) need a fresh read: the host gate reads on every mount.
*/
export function readHostStatusReply(
client: HostStatusClient,
options?: SendRequestOptions
): Promise<RpcResponse> {
const landed = connectionHostStatus(client)
return landed ? Promise.resolve(landed.reply) : sendHostStatusRead(client, options)
}
/**
* A status.get operation whose requests take the connection's status instead of sending their own.
* `live` readers need a field the desktop can change while connected, so they only join a read already out.
*/
export function connectionHostStatusRead<Verdict>(
read: { operation: { method: 'status.get' }; interpret: (reply: RpcResponse) => Verdict },
reuse: 'landed' | 'live' = 'landed'
) {
const send = reuse === 'live' ? sendHostStatusRead : readHostStatusReply
return Object.freeze({
interpret: read.interpret,
request: (client: HostStatusClient, _params?: undefined, options?: SendRequestOptions) =>
send(client, options)
})
}
@@ -94,6 +94,7 @@ function scenario(
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the logical client reaches these transport methods; each mutation uses the production dispatcher.
return {
getState: () => 'connected',
getLastConnectedAt: () => null,
onStateChange: () => () => {},
close: () => rejectFirst?.(markRpcDeliveryUnknown(new Error('Connection lost'))),
sendRequest: async (method: string, params: unknown) => {
@@ -1,5 +1,6 @@
import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation'
import { rpcResultVariant } from '../transport/rpc-operation-result-reader'
import { connectionHostStatusRead } from '../query/host-status-query'
import {
taskLinearStatusSchema,
taskPreferenceWriteSchema,
@@ -9,14 +10,16 @@ import {
} from './task-runtime-reply-schema'
// Task hydration requires status; create-time capability probing may skip the same method’s refusal.
export const taskRuntimeStatusRead = bindDeferredRpcOperation(
defineRpcOperation({
name: 'status.task-runtime',
method: 'status.get',
acceptance: 'require-result-or-throw-message',
barrier: 'after-caller-barrier',
read: rpcResultVariant('runtime-status', taskRuntimeStatusSchema)
})
export const taskRuntimeStatusRead = connectionHostStatusRead(
bindDeferredRpcOperation(
defineRpcOperation({
name: 'status.task-runtime',
method: 'status.get',
acceptance: 'require-result-or-throw-message',
barrier: 'after-caller-barrier',
read: rpcResultVariant('runtime-status', taskRuntimeStatusSchema)
})
)
)
// Persisted UI state is advisory; refusal retains screen defaults.
@@ -5,6 +5,7 @@ import {
} from '../../../src/shared/agent-launch/contracts/agent-launch-intent'
import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-operation'
import { rpcResultVariant } from '../transport/rpc-operation-result-reader'
import { connectionHostStatusRead } from '../query/host-status-query'
import {
agentLaunchCreateReceiptSchema,
worktreeCreateReceiptSchema,
@@ -67,14 +68,16 @@ export const worktreeMrBaseResolve = bindDeferredRpcOperation(
)
// Create-time status is advisory and may skip refusal; Tasks hydration requires the same reply to succeed.
export const worktreeCreateCapabilityRead = bindDeferredRpcOperation(
defineRpcOperation({
name: 'status.create-capabilities-or-skip',
method: 'status.get',
acceptance: 'success-result-or-skip',
barrier: 'after-caller-barrier',
read: rpcResultVariant('runtime-status', taskRuntimeStatusSchema)
})
export const worktreeCreateCapabilityRead = connectionHostStatusRead(
bindDeferredRpcOperation(
defineRpcOperation({
name: 'status.create-capabilities-or-skip',
method: 'status.get',
acceptance: 'success-result-or-skip',
barrier: 'after-caller-barrier',
read: rpcResultVariant('runtime-status', taskRuntimeStatusSchema)
})
)
)
// Warmup refusal only loses a speed-up, including on older hosts without the method.
@@ -15,7 +15,6 @@ export const C5_PAGE_CLOSURE: PageClosurePins = {
'aivault-history-screen-listed': 'write-ordinal',
'aivault-history-screen-worktrees': 'write-ordinal',
'matrix-aivault.history-screen-platform-status': 'result-absent-settlement',
'matrix-aivault.history-screen-status.get-2': 'result-absent-settlement',
'matrix-aivault.history-screen-worktree.ps-1': 'result-absent-settlement'
},
'aiVault.resume-launch': {
@@ -118,7 +118,7 @@ export const BRIDGED_PARITY_EXCLUSIONS: Readonly<Partial<Record<BridgedParityCla
export const BRIDGED_PARITY_BASELINE: Readonly<Record<BridgedParityClass | 'identical', number>> = {
identical: 387,
'reply-meta-required': 0,
'result-absent-settlement': 336,
'result-absent-settlement': 335,
'result-absent-observation': 3,
'result-absent-stream-release': 6,
'params-undefined': 27,
+1 -8
View File
@@ -74,10 +74,6 @@ export function hostStatusGatesFromStatus(
// Keyed by the cached answer so a connection's proven gates keep one identity across renders.
const gatesByProbedStatus = new WeakMap<HostStatusReply, HostStatusGates>()
const PROBED_UNREADABLE_GATES: HostStatusGates = {
...UNREADABLE_STATUS_GATES,
statusPending: false
}
// Draw at once from the status this connection already proved; the gate's own read still refreshes live capabilities.
function readProbedGates(
@@ -85,12 +81,9 @@ function readProbedGates(
connState: ConnectionState
): HostStatusGates | null {
const status = client && connState === 'connected' ? readConnectionStatusProbe(client) : undefined
if (status === undefined) {
if (!status) {
return null
}
if (status === null) {
return PROBED_UNREADABLE_GATES
}
let gates = gatesByProbedStatus.get(status)
if (!gates) {
gates = { ...hostStatusGatesFromStatus(status), statusPending: false }
@@ -10,7 +10,7 @@ type ProbeOutcome = RpcResponse | Error
function makeClient(outcomes: ProbeOutcome[]): {
client: UnvalidatedRpcRequestPort
calls: () => number
requests: () => Parameters<UnvalidatedRpcRequestPort['sendRequest']>[]
methods: () => string[]
} {
let calls = 0
const client = {
@@ -20,7 +20,11 @@ function makeClient(outcomes: ProbeOutcome[]): {
return outcome instanceof Error ? Promise.reject(outcome) : Promise.resolve(outcome)
})
}
return { client, calls: () => calls, requests: () => client.sendRequest.mock.calls }
return {
client,
calls: () => calls,
methods: () => client.sendRequest.mock.calls.map(([method]) => method)
}
}
const ok = (result: unknown): RpcResponse => ({
@@ -47,7 +51,7 @@ describe('startRuntimeStatusProbe', () => {
})
it('delivers the parsed status once and stops', async () => {
const { client, calls, requests } = makeClient([
const { client, calls, methods } = makeClient([
ok({ machineName: 'm4airs-Air', hostPlatform: 'darwin', capabilities: ['a.v1'] })
])
const seen: (HostStatusReply | null)[] = []
@@ -59,7 +63,7 @@ describe('startRuntimeStatusProbe', () => {
hostPlatform: 'darwin',
capabilities: ['a.v1']
})
expect(requests()).toEqual([['status.get']])
expect(methods()).toEqual(['status.get'])
expect(calls()).toBe(1)
await vi.advanceTimersByTimeAsync(60_000)
expect(calls()).toBe(1)
@@ -67,7 +71,7 @@ describe('startRuntimeStatusProbe', () => {
})
it('delivers null for an answer this build cannot decode, without retrying', async () => {
const { client, calls, requests } = makeClient([ok(null)])
const { client, calls, methods } = makeClient([ok(null)])
const seen: (HostStatusReply | null)[] = []
const failed = vi.fn()
cancelProbe = startRuntimeStatusProbe(client, (status) => seen.push(status), failed)
@@ -76,7 +80,7 @@ describe('startRuntimeStatusProbe', () => {
await vi.advanceTimersByTimeAsync(60_000)
expect(seen).toEqual([null])
expect(failed).not.toHaveBeenCalled()
expect(requests()).toEqual([['status.get']])
expect(methods()).toEqual(['status.get'])
expect(vi.getTimerCount()).toBe(0)
expect(calls()).toBe(1)
cancelProbe()
@@ -89,7 +93,7 @@ describe('startRuntimeStatusProbe', () => {
error: { code: 'unavailable', message: 'no' },
_meta: { runtimeId: 'r1' }
}
const { client, calls, requests } = makeClient([
const { client, calls, methods } = makeClient([
refusal,
new LogicalClientCutoverError(),
ok({ machineName: 'Studio' })
@@ -112,13 +116,13 @@ describe('startRuntimeStatusProbe', () => {
expect(seen).toHaveLength(1)
expect(seen[0]).toMatchObject({ machineName: 'Studio' })
expect(calls()).toBe(3)
expect(requests()).toEqual([['status.get'], ['status.get'], ['status.get']])
expect(methods()).toEqual(['status.get', 'status.get', 'status.get'])
expect(vi.getTimerCount()).toBe(0)
cancelProbe()
})
it('reports failed attempts after scheduling retries and cancels pending work', async () => {
const { client, calls, requests } = makeClient([
const { client, calls, methods } = makeClient([
new Error('request timed out'),
new LogicalClientCutoverError()
])
@@ -149,6 +153,6 @@ describe('startRuntimeStatusProbe', () => {
expect(failed).toBe(2)
expect(failedTimerCounts).toEqual([1, 1])
expect(calls()).toBe(2)
expect(requests()).toEqual([['status.get'], ['status.get']])
expect(methods()).toEqual(['status.get', 'status.get'])
})
})
+23 -33
View File
@@ -1,11 +1,14 @@
import type { RpcClient } from './rpc-client'
import type { UnvalidatedRpcRequestPort } from './unvalidated-rpc-request-port'
import { hostStatusProbe, readProbedHostStatus } from './host-status-probe-operations'
import type { HostStatusReply } from './host-status-reply-schema'
import { isLogicalClientCutoverError } from './stable-logical-rpc-client'
import {
connectionHostStatus,
decodeHostStatusReply,
directConnectionEpoch,
hostConnectionEpoch,
sendHostStatusRead,
type HostStatusClient
} from '../query/host-status-query'
type ProbeClient = UnvalidatedRpcRequestPort &
Partial<Pick<RpcClient, 'getGeneration' | 'getLastConnectedAt' | 'requestRoute'>>
type ProbeListener = {
onStatus: (status: HostStatusReply | null) => void
onAttemptFailed?: () => void
@@ -18,33 +21,22 @@ type SharedProbe = {
}
type EpochStatus = { epoch: string; status: HostStatusReply | null }
const observed = new WeakMap<object, EpochStatus>()
// Only answers this probe received; recorded proofs may merge in capabilities from an earlier read.
const probed = new WeakMap<object, EpochStatus>()
const sharedProbes = new WeakMap<object, SharedProbe>()
export const runtimeStatusProbeEpoch = (client: ProbeClient) =>
`${client.getGeneration?.()}:${client.getLastConnectedAt?.()}`
export function readRuntimeStatusProbe(client: ProbeClient): HostStatusReply | null | undefined {
export const runtimeStatusProbeEpoch = hostConnectionEpoch
export function readRuntimeStatusProbe(
client: HostStatusClient
): HostStatusReply | null | undefined {
const entry = observed.get(client)
return entry?.epoch === runtimeStatusProbeEpoch(client) ? entry.status : undefined
}
// Why: a routed view answers status.get from a server behind the desktop, which can restart or reconnect while
// this connection stays up, and a client with no connect time has no epoch to hold an answer to.
function connectionEpoch(client: ProbeClient): string | null {
return client.requestRoute === undefined && typeof client.getLastConnectedAt?.() === 'number'
? runtimeStatusProbeEpoch(client)
: null
}
/** The status this connection already proved, or undefined when it may not stand in for a new read. */
export function readConnectionStatusProbe(client: ProbeClient): HostStatusReply | null | undefined {
const epoch = connectionEpoch(client)
const entry = probed.get(client)
return epoch !== null && entry?.epoch === epoch ? entry.status : undefined
/** The status this connection already received, or undefined when it may not stand in for a new read. */
export function readConnectionStatusProbe(client: HostStatusClient): HostStatusReply | undefined {
return connectionHostStatus(client)?.status
}
export function recordRuntimeStatusProbe(
client: ProbeClient,
client: HostStatusClient,
status: HostStatusReply | null
): void {
observed.set(client, { epoch: runtimeStatusProbeEpoch(client), status })
@@ -58,11 +50,11 @@ const FAILURE_RETRY_MAX_DELAY_MS = 15_000
// Deliver unreadable answers as null without retry; refusals/rejections retry and notify onAttemptFailed after scheduling.
// Accept the raw sender type because capability callers need not hold a full client.
export function startRuntimeStatusProbe(
client: ProbeClient,
client: HostStatusClient,
onStatus: (status: HostStatusReply | null) => void,
onAttemptFailed?: () => void
): () => void {
const epoch = connectionEpoch(client)
const epoch = directConnectionEpoch(client)
if (epoch === null) {
return runProbe(client, { onStatus, onAttemptFailed }).stop
}
@@ -87,7 +79,7 @@ export function startRuntimeStatusProbe(
}
}
function startSharedProbe(client: ProbeClient, epoch: string): SharedProbe {
function startSharedProbe(client: HostStatusClient, epoch: string): SharedProbe {
const listeners = new Set<ProbeListener>()
const each = (notify: (listener: ProbeListener) => void) => [...listeners].forEach(notify)
const probe: SharedProbe = {
@@ -108,7 +100,7 @@ function startSharedProbe(client: ProbeClient, epoch: string): SharedProbe {
}
function runProbe(
client: ProbeClient,
client: HostStatusClient,
listener: ProbeListener
): { retryNow: () => void; stop: () => void } {
const epoch = runtimeStatusProbeEpoch(client)
@@ -118,20 +110,18 @@ function runProbe(
function attempt(): void {
retryTimer = null
void hostStatusProbe.request(client).then(
void sendHostStatusRead(client).then(
(reply) => {
if (cancelled) {
return
}
const landed = readProbedHostStatus(reply)
const landed = decodeHostStatusReply(reply)
if (!landed) {
scheduleRetry(false)
return
}
if (epoch === runtimeStatusProbeEpoch(client)) {
const entry = { epoch, status: landed.status }
observed.set(client, entry)
probed.set(client, entry)
observed.set(client, { epoch, status: landed.status })
}
listener.onStatus(landed.status)
},