From d5bf4b348aeca51b9043b94e058efa95cd484f36 Mon Sep 17 00:00:00 2001
From: imccyu <276526105+imccyu@users.noreply.github.com>
Date: Thu, 8 Oct 2026 22:19:42 +0800
Subject: [PATCH] refactor(remote): drop unrelated churn from the metadata
change
---
...26-10-05-working-directory-attribution.i18n.yaml | 4 ++--
.../2026-10-05-working-directory-attribution.md | 2 +-
.../2026-10-05-working-directory-attribution.zh.md | 2 +-
.../api/session-controller/src/client/transport.ts | 3 +++
.../tests/transport.client.spec.ts | 2 +-
.../api/workspace-controller/src/client/index.ts | 3 +++
.../tests/transport.client.spec.ts | 2 +-
packages/typert/generator/src/analyzer.ts | 13 +++----------
8 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/docs/persistence-changes/2026-10-05-working-directory-attribution.i18n.yaml b/docs/persistence-changes/2026-10-05-working-directory-attribution.i18n.yaml
index 080248eabe..1ae5d09e4f 100644
--- a/docs/persistence-changes/2026-10-05-working-directory-attribution.i18n.yaml
+++ b/docs/persistence-changes/2026-10-05-working-directory-attribution.i18n.yaml
@@ -21,8 +21,8 @@
en: 39494aa3af994e6f
zh: 07c2880503668176
/2026-10-05-working-directory-attribution/verification:
- en: 9b79379292881d10
- zh: 54d670c09ce1bfc7
+ en: 5963942c0d87e518
+ zh: 5dbb6ac0fca1f279
/2026-10-05-working-directory-attribution/dev-note:
en: b75c8458928b72b9
zh: 003ba4e17b4b5269
diff --git a/docs/persistence-changes/2026-10-05-working-directory-attribution.md b/docs/persistence-changes/2026-10-05-working-directory-attribution.md
index 6496413c37..80996eee5c 100644
--- a/docs/persistence-changes/2026-10-05-working-directory-attribution.md
+++ b/docs/persistence-changes/2026-10-05-working-directory-attribution.md
@@ -52,7 +52,7 @@ Existing records remain valid. The additive working-directory source kind is att
## Verification
-pnpm exec vitest run packages/session/working-directory/tests packages/shell/tool-bash/tests/tools.spec.ts packages/shell/tool-pwsh/tests/tools.spec.ts packages/subagent/subagent/tests/schedule-tools.spec.ts: 5 files and 207 tests passed.
+pnpm exec vitest run packages/session/working-directory/tests packages/shell/tool-bash/tests/tools.spec.ts packages/shell/tool-pwsh/tests/tools.spec.ts packages/subagent/subagent-in-process-driver/tests/schedule-tools.spec.ts: 4 files and 203 tests passed.
## Dev Note
diff --git a/docs/persistence-changes/2026-10-05-working-directory-attribution.zh.md b/docs/persistence-changes/2026-10-05-working-directory-attribution.zh.md
index 56157cc7d2..e7ed00e08f 100644
--- a/docs/persistence-changes/2026-10-05-working-directory-attribution.zh.md
+++ b/docs/persistence-changes/2026-10-05-working-directory-attribution.zh.md
@@ -52,7 +52,7 @@ changes:
## 验证
-pnpm exec vitest run packages/session/working-directory/tests packages/shell/tool-bash/tests/tools.spec.ts packages/shell/tool-pwsh/tests/tools.spec.ts packages/subagent/subagent/tests/schedule-tools.spec.ts:5 个文件、207 个测试通过。
+pnpm exec vitest run packages/session/working-directory/tests packages/shell/tool-bash/tests/tools.spec.ts packages/shell/tool-pwsh/tests/tools.spec.ts packages/subagent/subagent-in-process-driver/tests/schedule-tools.spec.ts:4 个文件、203 个测试通过。
## 开发备注
diff --git a/packages/api/session-controller/src/client/transport.ts b/packages/api/session-controller/src/client/transport.ts
index 5cb39c1514..fc2a11a0bb 100644
--- a/packages/api/session-controller/src/client/transport.ts
+++ b/packages/api/session-controller/src/client/transport.ts
@@ -119,6 +119,9 @@ export function createSessionControlStream(
const stream = remote.$stream({
name: 'session control stream',
open: signal => remote.session.control(signal),
+ ended: accepted => accepted
+ ? new RemoteStreamCarrierError('session control stream ended without a terminal result')
+ : new Error('session control stream ended before its opening snapshot'),
...(options.carrierFailed === undefined ? {} : { carrierFailed: options.carrierFailed }),
})
return new RemoteSnapshotStream(stream, {
diff --git a/packages/api/session-controller/tests/transport.client.spec.ts b/packages/api/session-controller/tests/transport.client.spec.ts
index 781fec4fa9..87d8fd7479 100644
--- a/packages/api/session-controller/tests/transport.client.spec.ts
+++ b/packages/api/session-controller/tests/transport.client.spec.ts
@@ -695,7 +695,7 @@ describe('Session Client stream adapters', () => {
before.start()
await vi.waitFor(() => { expect(beforeFailed).toHaveBeenCalledOnce() })
expect(beforeFailed.mock.calls[0]?.[0]).toMatchObject({
- message: 'session control stream ended before its opening item',
+ message: 'session control stream ended before its opening snapshot',
})
await before.dispose()
diff --git a/packages/api/workspace-controller/src/client/index.ts b/packages/api/workspace-controller/src/client/index.ts
index 304ee7899d..c3182102a7 100644
--- a/packages/api/workspace-controller/src/client/index.ts
+++ b/packages/api/workspace-controller/src/client/index.ts
@@ -82,6 +82,9 @@ export function createWorkspaceStateStream(
const stream = remote.$stream({
name: 'Workspace state stream',
open: signal => remote.workspace.follow(signal),
+ ended: accepted => accepted
+ ? new RemoteStreamCarrierError('Workspace state stream ended without a terminal result')
+ : new Error('Workspace state stream ended before its opening snapshot'),
...(options.carrierFailed === undefined ? {} : { carrierFailed: options.carrierFailed }),
})
return new RemoteSnapshotStream(stream, {
diff --git a/packages/api/workspace-controller/tests/transport.client.spec.ts b/packages/api/workspace-controller/tests/transport.client.spec.ts
index 5c38138c98..b74ddfb394 100644
--- a/packages/api/workspace-controller/tests/transport.client.spec.ts
+++ b/packages/api/workspace-controller/tests/transport.client.spec.ts
@@ -268,7 +268,7 @@ describe('Workspace state stream', () => {
{
name: 'a normal end before the baseline',
items: [] as WorkspaceFollowFrame[],
- message: 'ended before its opening item',
+ message: 'ended before its opening snapshot',
},
])('reports $name as a terminal failure', async ({ items, message }, { mock, start }) => {
const { remote } = await gatewayClient(mock, start)
diff --git a/packages/typert/generator/src/analyzer.ts b/packages/typert/generator/src/analyzer.ts
index 21b3cf58fc..90f901316b 100644
--- a/packages/typert/generator/src/analyzer.ts
+++ b/packages/typert/generator/src/analyzer.ts
@@ -673,13 +673,6 @@ interface FaceAnalyzerOptions {
readonly crossFaceLinks: Map
}
-/** Direct `@Remote` choices read from one decorator. */
-interface DirectRemoteMarker {
- readonly kind: 'direct'
- readonly exportName?: string
- readonly mode?: 'stream'
-}
-
class FaceAnalyzer {
private readonly root: string
private readonly face: TypertFace
@@ -1135,7 +1128,7 @@ class FaceAnalyzer {
binding: GatewayBinding,
method: ts.MethodDeclaration,
invocation:
- | DirectRemoteMarker
+ | { readonly kind: 'direct'; readonly exportName?: string; readonly mode?: 'stream' }
| { readonly kind: 'context'; readonly context: string; readonly exportName?: string },
): InvocationModel {
if (visibilityOf(method) !== 'public' || hasModifier(method, ts.SyntaxKind.StaticKeyword)) {
@@ -1392,11 +1385,11 @@ class FaceAnalyzer {
private remoteMarker(
member: ts.ClassElement,
):
- | DirectRemoteMarker
+ | { readonly kind: 'direct'; readonly exportName?: string; readonly mode?: 'stream' }
| { readonly kind: 'context'; readonly context: string; readonly exportName?: string }
| undefined {
let found:
- | DirectRemoteMarker
+ | { readonly kind: 'direct'; readonly exportName?: string; readonly mode?: 'stream' }
| { readonly kind: 'context'; readonly context: string; readonly exportName?: string }
| undefined
for (const decorator of ts.canHaveDecorators(member) ? ts.getDecorators(member) ?? [] : []) {