ds-harness-remote 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +35 -11
  2. package/cordis.patch.yml +3 -0
  3. package/dist/client-runtime.d.ts +28 -0
  4. package/dist/client-runtime.d.ts.map +1 -1
  5. package/dist/client-runtime.js +327 -5
  6. package/dist/client-runtime.js.map +1 -1
  7. package/dist/client-secure-transport.d.ts.map +1 -1
  8. package/dist/client-secure-transport.js +9 -2
  9. package/dist/client-secure-transport.js.map +1 -1
  10. package/dist/client.github.js +167 -48
  11. package/dist/client.js +167 -48
  12. package/dist/client.js.map +1 -1
  13. package/dist/codex/app-server.d.ts +71 -0
  14. package/dist/codex/app-server.d.ts.map +1 -0
  15. package/dist/codex/app-server.js +268 -0
  16. package/dist/codex/app-server.js.map +1 -0
  17. package/dist/codex/domain.d.ts +82 -0
  18. package/dist/codex/domain.d.ts.map +1 -0
  19. package/dist/codex/domain.js +893 -0
  20. package/dist/codex/domain.js.map +1 -0
  21. package/dist/codex/method-policy.d.ts +297 -0
  22. package/dist/codex/method-policy.d.ts.map +1 -0
  23. package/dist/codex/method-policy.js +103 -0
  24. package/dist/codex/method-policy.js.map +1 -0
  25. package/dist/codex/peer-bridge.d.ts +57 -0
  26. package/dist/codex/peer-bridge.d.ts.map +1 -0
  27. package/dist/codex/peer-bridge.js +300 -0
  28. package/dist/codex/peer-bridge.js.map +1 -0
  29. package/dist/codex/virtual-harness.d.ts +178 -0
  30. package/dist/codex/virtual-harness.d.ts.map +1 -0
  31. package/dist/codex/virtual-harness.js +2515 -0
  32. package/dist/codex/virtual-harness.js.map +1 -0
  33. package/dist/config.d.ts +10 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +12 -0
  36. package/dist/config.js.map +1 -1
  37. package/dist/control-runtime.d.ts +1 -0
  38. package/dist/control-runtime.d.ts.map +1 -1
  39. package/dist/control-runtime.js +22 -0
  40. package/dist/control-runtime.js.map +1 -1
  41. package/dist/harness-remote-bridge.d.ts +2 -2
  42. package/dist/harness-remote-bridge.d.ts.map +1 -1
  43. package/dist/harness-remote-bridge.js +2 -2
  44. package/dist/harness-remote-bridge.js.map +1 -1
  45. package/dist/index.d.ts +11 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +8550 -3884
  48. package/dist/index.js.map +4 -4
  49. package/dist/remote-typert-gateway.d.ts +1 -1
  50. package/dist/remote-typert-gateway.d.ts.map +1 -1
  51. package/dist/remote-typert-gateway.js +9 -2
  52. package/dist/remote-typert-gateway.js.map +1 -1
  53. package/dist/rpc-router.d.ts +5 -2
  54. package/dist/rpc-router.d.ts.map +1 -1
  55. package/dist/rpc-router.js +30 -1
  56. package/dist/rpc-router.js.map +1 -1
  57. package/dist/server-connection.d.ts +1 -0
  58. package/dist/server-connection.d.ts.map +1 -1
  59. package/dist/server-connection.js +69 -22
  60. package/dist/server-connection.js.map +1 -1
  61. package/dist/service.d.ts +20 -0
  62. package/dist/service.d.ts.map +1 -1
  63. package/dist/service.js +58 -2
  64. package/dist/service.js.map +1 -1
  65. package/dist/typert-gateway-contract.d.ts +2 -2
  66. package/dist/typert-gateway-contract.d.ts.map +1 -1
  67. package/dist/version.d.ts +1 -1
  68. package/dist/version.js +1 -1
  69. package/package.json +19 -23
  70. package/public.d.ts +4 -0
@@ -0,0 +1,300 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { CODEX_APP_TRANSFER_CHUNK_BYTES, MAX_CODEX_APP_TRANSFER_BYTES, MAX_SECURE_MESSAGE_BYTES, } from '@dsh-remote/protocol';
3
+ import { z } from 'zod';
4
+ import { RpcError } from '../safe-error.js';
5
+ const streamOpenSchema = z.object({
6
+ streamId: z.string().min(1).max(128),
7
+ threadId: z.string().min(1).max(256),
8
+ }).strict();
9
+ const streamCloseSchema = z.object({ streamId: z.string().min(1).max(128) }).strict();
10
+ const transferOpenSchema = z.object({
11
+ transferId: z.string().uuid(),
12
+ totalBytes: z.number().int().positive().max(MAX_CODEX_APP_TRANSFER_BYTES),
13
+ totalChunks: z.number().int().positive(),
14
+ }).strict();
15
+ const transferChunkSchema = z.object({
16
+ transferId: z.string().uuid(),
17
+ index: z.number().int().nonnegative(),
18
+ data: z.string().min(1).max(Math.ceil(CODEX_APP_TRANSFER_CHUNK_BYTES / 3) * 4),
19
+ }).strict();
20
+ const transferIdSchema = z.object({ transferId: z.string().uuid() }).strict();
21
+ const transferReadSchema = z.object({ transferId: z.string().uuid(), index: z.number().int().nonnegative() }).strict();
22
+ const MAX_ACTIVE_STREAMS = 16;
23
+ const MAX_ACTIVE_TRANSFERS = 2;
24
+ const TRANSFER_IDLE_MS = 2 * 60_000;
25
+ const INLINE_TRANSFER_RESPONSE_BYTES = 2 * 1024 * 1024;
26
+ /** Per-authenticated-connection state for the Codex Remote domain. */
27
+ export class CodexPeerBridge {
28
+ domain;
29
+ context;
30
+ publish;
31
+ logger;
32
+ streams = new Map();
33
+ incomingTransfers = new Map();
34
+ outgoingTransfers = new Map();
35
+ closed = false;
36
+ constructor(domain, context, publish, logger) {
37
+ this.domain = domain;
38
+ this.context = context;
39
+ this.publish = publish;
40
+ this.logger = logger;
41
+ }
42
+ async call(input) {
43
+ return this.callDomain(input, true);
44
+ }
45
+ async callDomain(input, logFailure) {
46
+ this.requireOpen();
47
+ try {
48
+ return await this.domain.call(this.context.connectionId, input);
49
+ }
50
+ catch (error) {
51
+ if (logFailure) {
52
+ this.logger?.warn('Codex call failed', {
53
+ method: safeMethod(input),
54
+ code: safeErrorCode(error),
55
+ });
56
+ }
57
+ throw error;
58
+ }
59
+ }
60
+ respond(input) {
61
+ this.requireOpen();
62
+ return this.domain.respond(this.context.connectionId, input);
63
+ }
64
+ async openStream(input) {
65
+ this.requireOpen();
66
+ const params = streamOpenSchema.parse(input);
67
+ if (this.streams.has(params.streamId))
68
+ throw new RpcError('REQUEST_CONFLICT', 'The Codex stream id is already active.');
69
+ if (this.streams.size >= MAX_ACTIVE_STREAMS) {
70
+ throw new RpcError('RATE_LIMITED', 'Too many Codex streams are active for this connection.', undefined, true);
71
+ }
72
+ // A bounded summary call proves this connection may observe the thread.
73
+ await this.domain.call(this.context.connectionId, {
74
+ method: 'thread/read',
75
+ params: { threadId: params.threadId, includeTurns: false },
76
+ });
77
+ this.streams.set(params.streamId, params.threadId);
78
+ return { opened: true, streamId: params.streamId, threadId: params.threadId };
79
+ }
80
+ closeStream(input) {
81
+ const params = streamCloseSchema.parse(input);
82
+ this.streams.delete(params.streamId);
83
+ return { closed: true, streamId: params.streamId };
84
+ }
85
+ openTransfer(input) {
86
+ this.requireOpen();
87
+ this.pruneTransfers();
88
+ const params = transferOpenSchema.parse(input);
89
+ if (params.totalChunks !== Math.ceil(params.totalBytes / CODEX_APP_TRANSFER_CHUNK_BYTES)) {
90
+ throw new RpcError('INVALID_MESSAGE', 'The Codex transfer chunk count is invalid.');
91
+ }
92
+ if (this.incomingTransfers.has(params.transferId) || this.outgoingTransfers.has(params.transferId)) {
93
+ throw new RpcError('REQUEST_CONFLICT', 'The Codex transfer id is already active.');
94
+ }
95
+ if (this.incomingTransfers.size >= MAX_ACTIVE_TRANSFERS) {
96
+ throw new RpcError('RATE_LIMITED', 'Too many Codex transfers are active.', undefined, true);
97
+ }
98
+ this.incomingTransfers.set(params.transferId, {
99
+ totalBytes: params.totalBytes,
100
+ totalChunks: params.totalChunks,
101
+ chunks: [],
102
+ receivedBytes: 0,
103
+ touchedAt: Date.now(),
104
+ });
105
+ return { opened: true, transferId: params.transferId };
106
+ }
107
+ appendTransfer(input) {
108
+ this.requireOpen();
109
+ this.pruneTransfers();
110
+ const params = transferChunkSchema.parse(input);
111
+ const transfer = this.incomingTransfers.get(params.transferId);
112
+ if (transfer === undefined)
113
+ throw new RpcError('TRANSFER_NOT_FOUND', 'The Codex transfer is not active.');
114
+ if (params.index !== transfer.chunks.length || params.index >= transfer.totalChunks) {
115
+ this.incomingTransfers.delete(params.transferId);
116
+ throw new RpcError('INVALID_MESSAGE', 'Codex transfer chunks must arrive exactly once and in order.');
117
+ }
118
+ const chunk = decodeCanonicalBase64(params.data);
119
+ const expectedBytes = Math.min(CODEX_APP_TRANSFER_CHUNK_BYTES, transfer.totalBytes - params.index * CODEX_APP_TRANSFER_CHUNK_BYTES);
120
+ if (chunk.byteLength !== expectedBytes) {
121
+ this.incomingTransfers.delete(params.transferId);
122
+ throw new RpcError('INVALID_MESSAGE', 'The Codex transfer chunk size is invalid.');
123
+ }
124
+ transfer.chunks.push(chunk);
125
+ transfer.receivedBytes += chunk.byteLength;
126
+ transfer.touchedAt = Date.now();
127
+ return { accepted: true, transferId: params.transferId, index: params.index };
128
+ }
129
+ async commitTransfer(input) {
130
+ this.requireOpen();
131
+ this.pruneTransfers();
132
+ const params = transferIdSchema.parse(input);
133
+ const transfer = this.incomingTransfers.get(params.transferId);
134
+ if (transfer === undefined)
135
+ throw new RpcError('TRANSFER_NOT_FOUND', 'The Codex transfer is not active.');
136
+ this.incomingTransfers.delete(params.transferId);
137
+ if (transfer.chunks.length !== transfer.totalChunks || transfer.receivedBytes !== transfer.totalBytes) {
138
+ throw new RpcError('INVALID_MESSAGE', 'The Codex transfer is incomplete.');
139
+ }
140
+ let request;
141
+ try {
142
+ request = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(concatChunks(transfer.chunks, transfer.totalBytes)));
143
+ }
144
+ catch {
145
+ throw new RpcError('INVALID_MESSAGE', 'The Codex transfer does not contain a valid request.');
146
+ }
147
+ let response;
148
+ try {
149
+ response = await this.callDomain(request, false);
150
+ }
151
+ catch (error) {
152
+ this.logger?.warn('Codex transfer call failed', {
153
+ method: safeMethod(request),
154
+ code: safeErrorCode(error),
155
+ });
156
+ throw error;
157
+ }
158
+ const responseBytes = new TextEncoder().encode(JSON.stringify(response));
159
+ if (responseBytes.byteLength <= INLINE_TRANSFER_RESPONSE_BYTES)
160
+ return { kind: 'inline', response };
161
+ if (responseBytes.byteLength > MAX_CODEX_APP_TRANSFER_BYTES) {
162
+ throw new RpcError('RESPONSE_TOO_LARGE', 'The Codex response exceeds the bounded transfer limit.');
163
+ }
164
+ if (this.outgoingTransfers.size >= MAX_ACTIVE_TRANSFERS) {
165
+ throw new RpcError('RATE_LIMITED', 'Too many Codex response transfers are active.', undefined, true);
166
+ }
167
+ const totalChunks = Math.ceil(responseBytes.byteLength / CODEX_APP_TRANSFER_CHUNK_BYTES);
168
+ this.outgoingTransfers.set(params.transferId, {
169
+ bytes: responseBytes,
170
+ totalChunks,
171
+ nextIndex: 0,
172
+ touchedAt: Date.now(),
173
+ });
174
+ return { kind: 'chunked', transferId: params.transferId, totalBytes: responseBytes.byteLength, totalChunks };
175
+ }
176
+ readTransfer(input) {
177
+ this.requireOpen();
178
+ this.pruneTransfers();
179
+ const params = transferReadSchema.parse(input);
180
+ const transfer = this.outgoingTransfers.get(params.transferId);
181
+ if (transfer === undefined)
182
+ throw new RpcError('TRANSFER_NOT_FOUND', 'The Codex response transfer is not active.');
183
+ if (params.index !== transfer.nextIndex || params.index >= transfer.totalChunks) {
184
+ this.outgoingTransfers.delete(params.transferId);
185
+ throw new RpcError('INVALID_MESSAGE', 'Codex response chunks must be read exactly once and in order.');
186
+ }
187
+ const start = params.index * CODEX_APP_TRANSFER_CHUNK_BYTES;
188
+ const end = Math.min(start + CODEX_APP_TRANSFER_CHUNK_BYTES, transfer.bytes.byteLength);
189
+ transfer.nextIndex += 1;
190
+ transfer.touchedAt = Date.now();
191
+ return {
192
+ transferId: params.transferId,
193
+ index: params.index,
194
+ data: Buffer.from(transfer.bytes.subarray(start, end)).toString('base64'),
195
+ };
196
+ }
197
+ closeTransfer(input) {
198
+ const params = transferIdSchema.parse(input);
199
+ const closed = this.incomingTransfers.delete(params.transferId) || this.outgoingTransfers.delete(params.transferId);
200
+ return { closed, transferId: params.transferId };
201
+ }
202
+ hasThreadSubscription(threadId) {
203
+ return [...this.streams.values()].includes(threadId);
204
+ }
205
+ removeThreadSubscriptions(threadId) {
206
+ for (const [streamId, targetThreadId] of this.streams) {
207
+ if (targetThreadId === threadId)
208
+ this.streams.delete(streamId);
209
+ }
210
+ }
211
+ async publishInbound(threadId, frame) {
212
+ if (this.closed)
213
+ return;
214
+ const streamIds = [...this.streams.entries()]
215
+ .filter(([, targetThreadId]) => targetThreadId === threadId)
216
+ .map(([streamId]) => streamId);
217
+ for (const streamId of streamIds) {
218
+ const data = { streamId, frame };
219
+ if (new TextEncoder().encode(JSON.stringify(data)).byteLength > MAX_SECURE_MESSAGE_BYTES) {
220
+ this.streams.delete(streamId);
221
+ await this.publish('codex.app.stream.closed', { streamId, reason: 'failed' });
222
+ this.logger?.warn('Codex stream closed after oversized frame', { streamId });
223
+ continue;
224
+ }
225
+ await this.publish('codex.app.frame', data);
226
+ }
227
+ }
228
+ async failStreams(reason = 'failed') {
229
+ if (this.closed)
230
+ return;
231
+ const streamIds = [...this.streams.keys()];
232
+ this.streams.clear();
233
+ this.incomingTransfers.clear();
234
+ this.outgoingTransfers.clear();
235
+ await Promise.all(streamIds.map(streamId => this.publish('codex.app.stream.closed', {
236
+ streamId,
237
+ reason,
238
+ }).catch(() => undefined)));
239
+ }
240
+ async closeAll() {
241
+ if (this.closed)
242
+ return;
243
+ this.closed = true;
244
+ const streamIds = [...this.streams.keys()];
245
+ this.streams.clear();
246
+ this.incomingTransfers.clear();
247
+ this.outgoingTransfers.clear();
248
+ await Promise.all(streamIds.map(streamId => this.publish('codex.app.stream.closed', {
249
+ streamId,
250
+ reason: 'peer-disconnected',
251
+ }).catch(() => undefined)));
252
+ await this.domain.detachPeer(this.context.connectionId);
253
+ }
254
+ pruneTransfers() {
255
+ const staleBefore = Date.now() - TRANSFER_IDLE_MS;
256
+ for (const [id, transfer] of this.incomingTransfers) {
257
+ if (transfer.touchedAt < staleBefore)
258
+ this.incomingTransfers.delete(id);
259
+ }
260
+ for (const [id, transfer] of this.outgoingTransfers) {
261
+ if (transfer.touchedAt < staleBefore)
262
+ this.outgoingTransfers.delete(id);
263
+ }
264
+ }
265
+ requireOpen() {
266
+ if (this.closed)
267
+ throw new RpcError('CODEX_CONNECTION_CLOSED', 'The Codex connection is closed.');
268
+ }
269
+ }
270
+ function decodeCanonicalBase64(value) {
271
+ if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)) {
272
+ throw new RpcError('INVALID_MESSAGE', 'The Codex transfer chunk is not canonical base64.');
273
+ }
274
+ const decoded = Buffer.from(value, 'base64');
275
+ if (decoded.toString('base64') !== value) {
276
+ throw new RpcError('INVALID_MESSAGE', 'The Codex transfer chunk is not canonical base64.');
277
+ }
278
+ return decoded;
279
+ }
280
+ function isRecord(value) {
281
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
282
+ }
283
+ function safeErrorCode(error) {
284
+ if (isRecord(error) && typeof error.code === 'string')
285
+ return error.code;
286
+ return 'UNKNOWN';
287
+ }
288
+ function safeMethod(input) {
289
+ return isRecord(input) && typeof input.method === 'string' ? input.method : 'invalid';
290
+ }
291
+ function concatChunks(chunks, totalBytes) {
292
+ const output = new Uint8Array(totalBytes);
293
+ let offset = 0;
294
+ for (const chunk of chunks) {
295
+ output.set(chunk, offset);
296
+ offset += chunk.byteLength;
297
+ }
298
+ return output;
299
+ }
300
+ //# sourceMappingURL=peer-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-bridge.js","sourceRoot":"","sources":["../../src/codex/peer-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ import type { ApiProxy } from '@deepseek-ai/dsh-host-apiproxy/api';
2
+ import { CodexRemoteClient } from '@dsh-remote/client-core';
3
+ import type { RemoteTypertGatewayTarget, TypertGatewayRequest, TypertRpcResult } from '../typert-gateway-contract.js';
4
+ type JsonRecord = Record<string, unknown>;
5
+ export interface CodexVirtualWorkspaceView {
6
+ workspaceId: string;
7
+ path: string;
8
+ title: string;
9
+ sessionIds: string[];
10
+ sessionCount: number;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ interface CodexClientLike {
15
+ request(method: string, params: unknown, signal?: AbortSignal): Promise<unknown>;
16
+ subscribe(threadId: string, onFrame: (frame: {
17
+ method: string;
18
+ params: unknown;
19
+ }) => void, signal?: AbortSignal, onClose?: (reason: 'cancelled' | 'completed' | 'failed' | 'peer-disconnected') => void): Promise<{
20
+ close(): Promise<void>;
21
+ }>;
22
+ respond(requestHandle: string, decision: 'accept' | 'decline' | 'cancel', signal?: AbortSignal): Promise<void>;
23
+ }
24
+ interface NativeEvent {
25
+ type: string;
26
+ seq: number;
27
+ time: number;
28
+ data: unknown;
29
+ sourceEventSeqs?: number[];
30
+ surfaceOp?: 'append' | {
31
+ op: 'replace';
32
+ start: number;
33
+ end: number;
34
+ };
35
+ }
36
+ export interface CodexNativeHistory {
37
+ header: {
38
+ version: number;
39
+ id: string;
40
+ createdAt: number;
41
+ cwd?: string;
42
+ };
43
+ entries: Array<{
44
+ type: 'event';
45
+ event: NativeEvent;
46
+ view?: ToolEventView;
47
+ }>;
48
+ lastSeq: number;
49
+ nextTurn: number;
50
+ }
51
+ export interface CodexNativeHistoryPage {
52
+ header: CodexNativeHistory['header'];
53
+ cursor: number;
54
+ nextTurn: number;
55
+ records: CodexNativeHistory['entries'];
56
+ hasMore: boolean;
57
+ }
58
+ interface ToolEventView {
59
+ for: 'call' | 'result';
60
+ view: JsonRecord;
61
+ }
62
+ /** Discover the CodeX projects visible through the Host App Server. */
63
+ export declare function discoverCodexVirtualWorkspaces(client: CodexClientLike, signal?: AbortSignal): Promise<CodexVirtualWorkspaceView[]>;
64
+ /**
65
+ * A plugin-owned virtual Harness target. It projects CodeX Thread/Turn data at
66
+ * the existing ApiProxy/Typert carrier boundary, so every UI layer above the
67
+ * official Workspace and Session controllers remains native DSH.
68
+ */
69
+ export declare class CodexVirtualHarness implements RemoteTypertGatewayTarget {
70
+ private readonly client;
71
+ private readonly host;
72
+ readonly api: ApiProxy;
73
+ private catalog?;
74
+ private readonly workspaceStreams;
75
+ private readonly controlStreams;
76
+ private readonly eventStreams;
77
+ private readonly rcMuxStreams;
78
+ private readonly rcHostStreams;
79
+ private readonly follows;
80
+ private readonly pendingRequestIds;
81
+ private readonly pendingApprovals;
82
+ private readonly pendingThreads;
83
+ private readonly blankThreads;
84
+ private readonly selectedModels;
85
+ private readonly selectedPermissions;
86
+ private readonly imageAttachments;
87
+ private modelDirectory?;
88
+ private modelDirectoryPromise?;
89
+ private lastProjectionSeq;
90
+ private commandSeq;
91
+ private selectedWorkspaceId?;
92
+ private closed;
93
+ constructor(client: CodexClientLike, host: {
94
+ deviceId: string;
95
+ name: string;
96
+ });
97
+ static remote(core: ConstructorParameters<typeof CodexRemoteClient>[0], host: {
98
+ deviceId: string;
99
+ name: string;
100
+ }): CodexVirtualHarness;
101
+ workspaces(signal?: AbortSignal): Promise<CodexVirtualWorkspaceView[]>;
102
+ selectWorkspace(workspaceId: string, signal?: AbortSignal): Promise<CodexVirtualWorkspaceView>;
103
+ preferredSessionId(signal?: AbortSignal): Promise<string | undefined>;
104
+ invoke(request: TypertGatewayRequest): Promise<unknown>;
105
+ dispatch(endpoint: string, payload: unknown, signal: AbortSignal): Promise<TypertRpcResult>;
106
+ open(endpoint: string, payload: unknown, signal: AbortSignal): Promise<AsyncIterable<unknown>>;
107
+ close(): Promise<void>;
108
+ private refreshCatalog;
109
+ private currentCatalog;
110
+ private models;
111
+ private modelSelection;
112
+ private permissionSelection;
113
+ private commandList;
114
+ private executeCommand;
115
+ private sessionTitle;
116
+ private selectModel;
117
+ private publishProjection;
118
+ private nextProjectionSeq;
119
+ private updateThreadName;
120
+ private sessionSummaries;
121
+ private sessionSummary;
122
+ private searchSessions;
123
+ private workspaceFollow;
124
+ private sessionControl;
125
+ private remoteEvents;
126
+ private sessionFollow;
127
+ private acceptCodexFrame;
128
+ private acceptCompletedItem;
129
+ private pushEvent;
130
+ private cacheImageBlocks;
131
+ private ensureStreamBlock;
132
+ private appendStreamDelta;
133
+ private closeItemStreamBlocks;
134
+ private closeAllStreamBlocks;
135
+ private finishStream;
136
+ private ensureToolStarted;
137
+ private emitToolResult;
138
+ private pushToolResult;
139
+ private resetLiveTurn;
140
+ private emitRemoteEvent;
141
+ private emitApproval;
142
+ private answerRemoteEvent;
143
+ private createWorkspace;
144
+ private renameWorkspace;
145
+ private workspaceForSession;
146
+ private archiveSession;
147
+ private createSession;
148
+ private forkSession;
149
+ private prompt;
150
+ private attachment;
151
+ private hydrateImageAttachments;
152
+ private cancel;
153
+ private renameSession;
154
+ private sessionPage;
155
+ private activeTurnId;
156
+ private fetchThread;
157
+ private readHistoryPage;
158
+ private cacheHistoryImages;
159
+ private sessionHistory;
160
+ private ensureRcFollow;
161
+ private followsHas;
162
+ private closeFollowAfterRemoteStreamClosed;
163
+ private refreshAndPublishWorkspaces;
164
+ private publishWorkspaceBaseline;
165
+ private createApiProxy;
166
+ private rcMux;
167
+ private rcHost;
168
+ private broadcastRcMux;
169
+ private broadcastRcHost;
170
+ }
171
+ export declare function projectCodexNativeHistory(thread: JsonRecord, sessionId: string): CodexNativeHistory;
172
+ export declare function paginateCodexNativeHistory(history: CodexNativeHistory, request: {
173
+ beforeSeq?: number;
174
+ throughSeq?: number;
175
+ maxMessages?: number;
176
+ }): CodexNativeHistoryPage;
177
+ export {};
178
+ //# sourceMappingURL=virtual-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-harness.d.ts","sourceRoot":"","sources":["../../src/codex/virtual-harness.ts"],"names":[],"mappings":"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"}