@agentuity/coder 1.0.37
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.
- package/README.md +57 -0
- package/dist/chain-preview.d.ts +55 -0
- package/dist/chain-preview.d.ts.map +1 -0
- package/dist/chain-preview.js +472 -0
- package/dist/chain-preview.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +402 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.d.ts +22 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +99 -0
- package/dist/commands.js.map +1 -0
- package/dist/footer.d.ts +34 -0
- package/dist/footer.d.ts.map +1 -0
- package/dist/footer.js +249 -0
- package/dist/footer.js.map +1 -0
- package/dist/handlers.d.ts +24 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +83 -0
- package/dist/handlers.js.map +1 -0
- package/dist/hub-overlay.d.ts +107 -0
- package/dist/hub-overlay.d.ts.map +1 -0
- package/dist/hub-overlay.js +1794 -0
- package/dist/hub-overlay.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1585 -0
- package/dist/index.js.map +1 -0
- package/dist/output-viewer.d.ts +49 -0
- package/dist/output-viewer.d.ts.map +1 -0
- package/dist/output-viewer.js +389 -0
- package/dist/output-viewer.js.map +1 -0
- package/dist/overlay.d.ts +40 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +225 -0
- package/dist/overlay.js.map +1 -0
- package/dist/protocol.d.ts +118 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +3 -0
- package/dist/protocol.js.map +1 -0
- package/dist/remote-session.d.ts +113 -0
- package/dist/remote-session.d.ts.map +1 -0
- package/dist/remote-session.js +645 -0
- package/dist/remote-session.js.map +1 -0
- package/dist/remote-tui.d.ts +40 -0
- package/dist/remote-tui.d.ts.map +1 -0
- package/dist/remote-tui.js +606 -0
- package/dist/remote-tui.js.map +1 -0
- package/dist/renderers.d.ts +34 -0
- package/dist/renderers.d.ts.map +1 -0
- package/dist/renderers.js +669 -0
- package/dist/renderers.js.map +1 -0
- package/dist/review.d.ts +15 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +154 -0
- package/dist/review.js.map +1 -0
- package/dist/titlebar.d.ts +3 -0
- package/dist/titlebar.d.ts.map +1 -0
- package/dist/titlebar.js +59 -0
- package/dist/titlebar.js.map +1 -0
- package/dist/todo/index.d.ts +3 -0
- package/dist/todo/index.d.ts.map +1 -0
- package/dist/todo/index.js +3 -0
- package/dist/todo/index.js.map +1 -0
- package/dist/todo/store.d.ts +6 -0
- package/dist/todo/store.d.ts.map +1 -0
- package/dist/todo/store.js +43 -0
- package/dist/todo/store.js.map +1 -0
- package/dist/todo/types.d.ts +13 -0
- package/dist/todo/types.d.ts.map +1 -0
- package/dist/todo/types.js +2 -0
- package/dist/todo/types.js.map +1 -0
- package/package.json +44 -0
- package/src/chain-preview.ts +621 -0
- package/src/client.ts +515 -0
- package/src/commands.ts +132 -0
- package/src/footer.ts +305 -0
- package/src/handlers.ts +113 -0
- package/src/hub-overlay.ts +2324 -0
- package/src/index.ts +1907 -0
- package/src/output-viewer.ts +480 -0
- package/src/overlay.ts +294 -0
- package/src/protocol.ts +157 -0
- package/src/remote-session.ts +800 -0
- package/src/remote-tui.ts +707 -0
- package/src/renderers.ts +740 -0
- package/src/review.ts +201 -0
- package/src/titlebar.ts +63 -0
- package/src/todo/index.ts +2 -0
- package/src/todo/store.ts +49 -0
- package/src/todo/types.ts +14 -0
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Session Bridge — TUI ↔ Hub ↔ Sandbox
|
|
3
|
+
*
|
|
4
|
+
* Handles the WebSocket connection and RPC protocol bridge for remote mode.
|
|
5
|
+
* In remote mode, the local Pi TUI connects to an existing sandbox session
|
|
6
|
+
* through the Hub, acting as a thin client:
|
|
7
|
+
* - User input → rpc_command → Hub → sandbox
|
|
8
|
+
* - Sandbox events → rpc_event → Hub → TUI rendering
|
|
9
|
+
* - Extension UI dialogs → rpc_ui_request/response → Hub ↔ TUI
|
|
10
|
+
*
|
|
11
|
+
* This module manages the connection lifecycle and provides an API
|
|
12
|
+
* for the extension to send commands and receive events.
|
|
13
|
+
*/
|
|
14
|
+
const DEBUG = !!process.env['AGENTUITY_DEBUG'];
|
|
15
|
+
function log(msg) {
|
|
16
|
+
if (DEBUG)
|
|
17
|
+
console.error(`[remote-session] ${msg}`);
|
|
18
|
+
}
|
|
19
|
+
// ── Remote Session Client ──
|
|
20
|
+
const RECONNECT_BASE_MS = 1_000;
|
|
21
|
+
const RECONNECT_MAX_MS = 30_000;
|
|
22
|
+
const MAX_RECONNECT_ATTEMPTS = 20;
|
|
23
|
+
export class RemoteSession {
|
|
24
|
+
ws = null;
|
|
25
|
+
connected = false;
|
|
26
|
+
intentionallyClosed = false;
|
|
27
|
+
hubWsUrl = '';
|
|
28
|
+
reconnectAttempts = 0;
|
|
29
|
+
reconnectTimer = null;
|
|
30
|
+
eventHandlers = [];
|
|
31
|
+
uiHandler = null;
|
|
32
|
+
responseHandlers = [];
|
|
33
|
+
connectionHandlers = [];
|
|
34
|
+
/** Session ID this client is connected to */
|
|
35
|
+
sessionId;
|
|
36
|
+
/** Session label (populated after connection) */
|
|
37
|
+
label = '';
|
|
38
|
+
/** API key for Hub authentication */
|
|
39
|
+
// TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
|
|
40
|
+
apiKey = null;
|
|
41
|
+
constructor(sessionId) {
|
|
42
|
+
this.sessionId = sessionId;
|
|
43
|
+
}
|
|
44
|
+
dispatchEvent(event) {
|
|
45
|
+
for (const handler of this.eventHandlers) {
|
|
46
|
+
try {
|
|
47
|
+
handler(event);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
log(`Event handler error: ${err instanceof Error ? err.message : String(err)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
dispatchResponse(response) {
|
|
55
|
+
for (const handler of this.responseHandlers) {
|
|
56
|
+
try {
|
|
57
|
+
handler(response);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
log(`Response handler error: ${err instanceof Error ? err.message : String(err)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Register a handler for RPC events from the sandbox */
|
|
65
|
+
onEvent(handler) {
|
|
66
|
+
this.eventHandlers.push(handler);
|
|
67
|
+
}
|
|
68
|
+
/** Register a handler for RPC responses from the sandbox */
|
|
69
|
+
onResponse(handler) {
|
|
70
|
+
this.responseHandlers.push(handler);
|
|
71
|
+
}
|
|
72
|
+
/** Register the UI dialog handler (select, confirm, input, editor) */
|
|
73
|
+
setUiHandler(handler) {
|
|
74
|
+
this.uiHandler = handler;
|
|
75
|
+
}
|
|
76
|
+
/** Register a connection state change handler */
|
|
77
|
+
onConnectionChange(handler) {
|
|
78
|
+
this.connectionHandlers.push(handler);
|
|
79
|
+
}
|
|
80
|
+
/** Connect to the Hub WebSocket as a controller for the remote session */
|
|
81
|
+
async connect(hubWsUrl) {
|
|
82
|
+
this.hubWsUrl = hubWsUrl;
|
|
83
|
+
this.intentionallyClosed = false;
|
|
84
|
+
this.reconnectAttempts = 0;
|
|
85
|
+
return this.doConnect();
|
|
86
|
+
}
|
|
87
|
+
doConnect() {
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const isReconnect = this.reconnectAttempts > 0;
|
|
90
|
+
// Build URL with controller params
|
|
91
|
+
const url = new URL(this.hubWsUrl);
|
|
92
|
+
url.searchParams.set('sessionId', this.sessionId);
|
|
93
|
+
url.searchParams.set('role', 'controller');
|
|
94
|
+
log(`${isReconnect ? 'Reconnecting' : 'Connecting'} to ${url.toString()}`);
|
|
95
|
+
// TODO: Remove/Change when we get Agentuity service level auth enabled, this is just temporary
|
|
96
|
+
this.ws = this.apiKey
|
|
97
|
+
? new WebSocket(url.toString(), {
|
|
98
|
+
headers: { 'x-agentuity-auth-api-key': this.apiKey },
|
|
99
|
+
})
|
|
100
|
+
: new WebSocket(url.toString());
|
|
101
|
+
const connectTimeout = setTimeout(() => {
|
|
102
|
+
reject(new Error('Remote session connection timed out'));
|
|
103
|
+
this.ws?.close();
|
|
104
|
+
}, 30_000);
|
|
105
|
+
this.ws.onopen = () => {
|
|
106
|
+
log('WebSocket connected');
|
|
107
|
+
};
|
|
108
|
+
this.ws.onmessage = (event) => {
|
|
109
|
+
let data;
|
|
110
|
+
try {
|
|
111
|
+
const raw = typeof event.data === 'string'
|
|
112
|
+
? event.data
|
|
113
|
+
: new TextDecoder().decode(event.data);
|
|
114
|
+
data = JSON.parse(raw);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const type = data.type;
|
|
120
|
+
// Init message — connection established
|
|
121
|
+
if (type === 'init') {
|
|
122
|
+
clearTimeout(connectTimeout);
|
|
123
|
+
this.connected = true;
|
|
124
|
+
this.reconnectAttempts = 0;
|
|
125
|
+
if (data.sessionId)
|
|
126
|
+
this.sessionId = data.sessionId;
|
|
127
|
+
log(`Connected to session ${this.sessionId}`);
|
|
128
|
+
this.notifyConnectionChange('connected');
|
|
129
|
+
resolve();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Connection rejected
|
|
133
|
+
if (type === 'connection_rejected') {
|
|
134
|
+
clearTimeout(connectTimeout);
|
|
135
|
+
const msg = data.message || 'Connection rejected';
|
|
136
|
+
reject(new Error(msg));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Broadcast-wrapped messages from Hub (LIVE events)
|
|
140
|
+
// Format: { type: 'broadcast', event: '<name>', data: { ...payload } }
|
|
141
|
+
if (type === 'broadcast') {
|
|
142
|
+
const broadcastEvent = data.event;
|
|
143
|
+
const broadcastData = data.data ?? {};
|
|
144
|
+
if (broadcastEvent === 'rpc_event') {
|
|
145
|
+
const rpcEvent = broadcastData.event;
|
|
146
|
+
if (rpcEvent)
|
|
147
|
+
this.dispatchEvent({ ...rpcEvent, _source: 'live' });
|
|
148
|
+
}
|
|
149
|
+
else if (broadcastEvent === 'rpc_response') {
|
|
150
|
+
const response = broadcastData.response;
|
|
151
|
+
if (response)
|
|
152
|
+
this.dispatchResponse(response);
|
|
153
|
+
}
|
|
154
|
+
else if (broadcastEvent === 'rpc_ui_request') {
|
|
155
|
+
this.handleUiRequest({
|
|
156
|
+
id: broadcastData.id,
|
|
157
|
+
method: broadcastData.method,
|
|
158
|
+
params: broadcastData.params ?? {},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// Lifecycle event broadcasts (agent_start, message_end, turn_start, etc.)
|
|
163
|
+
// The broadcastData IS the event payload with a `type` field matching broadcastEvent.
|
|
164
|
+
// Dispatch as a regular event so the TUI can render agent activity.
|
|
165
|
+
this.dispatchEvent({
|
|
166
|
+
type: broadcastEvent,
|
|
167
|
+
...broadcastData,
|
|
168
|
+
_source: 'live',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Raw RPC messages (from Durable Stream replay — historical, not live)
|
|
174
|
+
if (type === 'rpc_event') {
|
|
175
|
+
const rpcEvent = data.event;
|
|
176
|
+
if (rpcEvent)
|
|
177
|
+
this.dispatchEvent({ ...rpcEvent, _source: 'replay' });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (type === 'rpc_response') {
|
|
181
|
+
const response = data.response;
|
|
182
|
+
if (response)
|
|
183
|
+
this.dispatchResponse(response);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (type === 'rpc_ui_request') {
|
|
187
|
+
this.handleUiRequest({
|
|
188
|
+
id: data.id,
|
|
189
|
+
method: data.method,
|
|
190
|
+
params: data.params ?? {},
|
|
191
|
+
});
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Session hydration (conversation entries + task states from observer hydration)
|
|
195
|
+
if (type === 'session_hydration') {
|
|
196
|
+
// Pass through as an event so the extension can render it
|
|
197
|
+
for (const handler of this.eventHandlers) {
|
|
198
|
+
try {
|
|
199
|
+
handler({ type: 'session_hydration', ...data });
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
log(`Hydration handler error: ${err instanceof Error ? err.message : String(err)}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
log(`Unhandled message type: ${type}`);
|
|
208
|
+
};
|
|
209
|
+
this.ws.onerror = (err) => {
|
|
210
|
+
clearTimeout(connectTimeout);
|
|
211
|
+
if (!this.connected) {
|
|
212
|
+
const message = 'message' in err ? err.message : 'WebSocket error';
|
|
213
|
+
reject(new Error(message));
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
this.ws.onclose = () => {
|
|
217
|
+
clearTimeout(connectTimeout);
|
|
218
|
+
const wasConnected = this.connected;
|
|
219
|
+
this.connected = false;
|
|
220
|
+
if (!this.intentionallyClosed) {
|
|
221
|
+
if (wasConnected) {
|
|
222
|
+
log('WebSocket closed unexpectedly — scheduling reconnect');
|
|
223
|
+
this.notifyConnectionChange('reconnecting');
|
|
224
|
+
this.scheduleReconnect();
|
|
225
|
+
}
|
|
226
|
+
else if (!isReconnect) {
|
|
227
|
+
// Failed initial connect and not already in reconnect loop
|
|
228
|
+
log('WebSocket closed during initial connect');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
scheduleReconnect() {
|
|
235
|
+
if (this.intentionallyClosed)
|
|
236
|
+
return;
|
|
237
|
+
if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
|
|
238
|
+
log(`Max reconnect attempts (${MAX_RECONNECT_ATTEMPTS}) reached — giving up`);
|
|
239
|
+
this.notifyConnectionChange('disconnected');
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const delay = Math.min(RECONNECT_BASE_MS * Math.pow(2, this.reconnectAttempts), RECONNECT_MAX_MS);
|
|
243
|
+
this.reconnectAttempts++;
|
|
244
|
+
log(`Reconnect attempt ${this.reconnectAttempts} in ${delay}ms`);
|
|
245
|
+
this.reconnectTimer = setTimeout(async () => {
|
|
246
|
+
this.reconnectTimer = null;
|
|
247
|
+
try {
|
|
248
|
+
await this.doConnect();
|
|
249
|
+
// On successful reconnect, request fresh state
|
|
250
|
+
this.getState();
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
log(`Reconnect failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
254
|
+
this.scheduleReconnect();
|
|
255
|
+
}
|
|
256
|
+
}, delay);
|
|
257
|
+
}
|
|
258
|
+
notifyConnectionChange(state) {
|
|
259
|
+
for (const handler of this.connectionHandlers) {
|
|
260
|
+
try {
|
|
261
|
+
handler(state);
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
/* ignore */
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/** Send an RPC command to the sandbox (prompt, steer, abort, etc.) */
|
|
269
|
+
sendCommand(command) {
|
|
270
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
271
|
+
log('Cannot send command — not connected');
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
this.ws.send(JSON.stringify({
|
|
275
|
+
type: 'rpc_command',
|
|
276
|
+
command,
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
/** Send a user prompt to the remote sandbox */
|
|
280
|
+
prompt(message, images) {
|
|
281
|
+
this.sendCommand({
|
|
282
|
+
type: 'prompt',
|
|
283
|
+
message,
|
|
284
|
+
...(images?.length ? { images } : {}),
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/** Steer the agent mid-turn */
|
|
288
|
+
steer(message) {
|
|
289
|
+
this.sendCommand({ type: 'steer', message });
|
|
290
|
+
}
|
|
291
|
+
/** Abort current operation */
|
|
292
|
+
abort() {
|
|
293
|
+
this.sendCommand({ type: 'abort' });
|
|
294
|
+
}
|
|
295
|
+
/** Get current session state */
|
|
296
|
+
getState() {
|
|
297
|
+
this.sendCommand({ type: 'get_state', id: crypto.randomUUID() });
|
|
298
|
+
}
|
|
299
|
+
/** Get all messages in current session */
|
|
300
|
+
getMessages() {
|
|
301
|
+
this.sendCommand({ type: 'get_messages', id: crypto.randomUUID() });
|
|
302
|
+
}
|
|
303
|
+
/** Compact the session context */
|
|
304
|
+
compact() {
|
|
305
|
+
this.sendCommand({ type: 'compact' });
|
|
306
|
+
}
|
|
307
|
+
/** Close the connection */
|
|
308
|
+
close() {
|
|
309
|
+
this.intentionallyClosed = true;
|
|
310
|
+
if (this.reconnectTimer) {
|
|
311
|
+
clearTimeout(this.reconnectTimer);
|
|
312
|
+
this.reconnectTimer = null;
|
|
313
|
+
}
|
|
314
|
+
this.ws?.close();
|
|
315
|
+
this.ws = null;
|
|
316
|
+
}
|
|
317
|
+
get isConnected() {
|
|
318
|
+
return this.connected;
|
|
319
|
+
}
|
|
320
|
+
/** Handle UI request from sandbox — delegate to registered handler */
|
|
321
|
+
async handleUiRequest(request) {
|
|
322
|
+
if (!this.uiHandler) {
|
|
323
|
+
log(`No UI handler for ${request.method} — sending null response`);
|
|
324
|
+
this.sendUiResponse(request.id, null);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
const result = await this.uiHandler(request);
|
|
329
|
+
this.sendUiResponse(request.id, result);
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
log(`UI handler error for ${request.method}: ${err instanceof Error ? err.message : String(err)}`);
|
|
333
|
+
this.sendUiResponse(request.id, null);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/** Send UI response back to sandbox */
|
|
337
|
+
sendUiResponse(id, result) {
|
|
338
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
|
|
339
|
+
return;
|
|
340
|
+
this.ws.send(JSON.stringify({
|
|
341
|
+
type: 'rpc_ui_response',
|
|
342
|
+
id,
|
|
343
|
+
result,
|
|
344
|
+
}));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Set up remote mode for the Pi extension.
|
|
349
|
+
*
|
|
350
|
+
* Connects to an existing sandbox session through the Hub and bridges
|
|
351
|
+
* user input → RPC commands and sandbox events → TUI rendering.
|
|
352
|
+
*
|
|
353
|
+
* Uses Pi's extension APIs for rich rendering:
|
|
354
|
+
* - pi.sendMessage() for completed assistant messages
|
|
355
|
+
* - ctx.ui.setWidget() for streaming output
|
|
356
|
+
* - ctx.ui.setWorkingMessage() for tool execution status
|
|
357
|
+
* - ctx.ui.setStatus() for connection and agent state
|
|
358
|
+
*/
|
|
359
|
+
export async function setupRemoteMode(pi, hubWsUrl, sessionId) {
|
|
360
|
+
const remote = new RemoteSession(sessionId);
|
|
361
|
+
// Connect to Hub
|
|
362
|
+
await remote.connect(hubWsUrl);
|
|
363
|
+
log(`Remote mode active — session ${sessionId}`);
|
|
364
|
+
// ── Track streaming state for widget rendering ──
|
|
365
|
+
let messageBuffer = '';
|
|
366
|
+
let thinkingBuffer = '';
|
|
367
|
+
let isStreaming = false;
|
|
368
|
+
let currentTool = null;
|
|
369
|
+
let extensionCtxRef = null;
|
|
370
|
+
// Called by the extension setup to provide the rendering context
|
|
371
|
+
remote._setExtensionCtx = (ctx) => {
|
|
372
|
+
extensionCtxRef = ctx;
|
|
373
|
+
};
|
|
374
|
+
// ── Render streaming output as a widget ──
|
|
375
|
+
function updateStreamWidget() {
|
|
376
|
+
if (!extensionCtxRef?.hasUI)
|
|
377
|
+
return;
|
|
378
|
+
if (!isStreaming && !messageBuffer)
|
|
379
|
+
return;
|
|
380
|
+
// Show the most recent streaming text in a widget
|
|
381
|
+
const display = messageBuffer.length > 2000 ? `...${messageBuffer.slice(-2000)}` : messageBuffer;
|
|
382
|
+
if (display) {
|
|
383
|
+
extensionCtxRef.ui.setWidget('remote_stream', display.split('\n'));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function clearStreamWidget() {
|
|
387
|
+
if (!extensionCtxRef?.hasUI)
|
|
388
|
+
return;
|
|
389
|
+
extensionCtxRef.ui.setWidget('remote_stream', undefined);
|
|
390
|
+
}
|
|
391
|
+
// ── Set up UI handler (wired to Pi's UI later in setupRemoteModeExtension) ──
|
|
392
|
+
// Default handler — overridden by setupRemoteModeExtension once ctx is available
|
|
393
|
+
remote.setUiHandler(async (request) => {
|
|
394
|
+
log(`UI request: ${request.method} (${request.id}) — no ctx yet`);
|
|
395
|
+
const fireAndForget = ['notify', 'setStatus', 'setWidget', 'setTitle', 'set_editor_text'];
|
|
396
|
+
if (fireAndForget.includes(request.method))
|
|
397
|
+
return undefined;
|
|
398
|
+
return null;
|
|
399
|
+
});
|
|
400
|
+
// ── Handle RPC responses (get_state, get_messages results) ──
|
|
401
|
+
remote.onResponse((response) => {
|
|
402
|
+
if (!response.success) {
|
|
403
|
+
log(`RPC response error for ${response.command}: ${response.error ?? 'unknown'}`);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
switch (response.command) {
|
|
407
|
+
case 'get_state': {
|
|
408
|
+
const state = response.data;
|
|
409
|
+
if (state) {
|
|
410
|
+
isStreaming = !!state.isStreaming;
|
|
411
|
+
if (extensionCtxRef?.hasUI) {
|
|
412
|
+
if (state.isStreaming) {
|
|
413
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'agent working...');
|
|
414
|
+
}
|
|
415
|
+
else if (state.isWaitingForInput) {
|
|
416
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'waiting for input');
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'idle');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
log(`State hydrated: streaming=${state.isStreaming}, waiting=${state.isWaitingForInput}`);
|
|
423
|
+
}
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case 'get_messages': {
|
|
427
|
+
const messages = response.data;
|
|
428
|
+
if (messages?.length) {
|
|
429
|
+
hydrateMessages(messages);
|
|
430
|
+
}
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
// ── Hydrate message history into the TUI ──
|
|
436
|
+
function hydrateMessages(messages) {
|
|
437
|
+
// Show the last few messages as custom messages in the TUI
|
|
438
|
+
const recent = messages.slice(-20);
|
|
439
|
+
let hydrated = 0;
|
|
440
|
+
for (const msg of recent) {
|
|
441
|
+
const text = typeof msg.content === 'string'
|
|
442
|
+
? msg.content
|
|
443
|
+
: Array.isArray(msg.content)
|
|
444
|
+
? msg.content
|
|
445
|
+
.filter((c) => c.type === 'text' && typeof c.text === 'string')
|
|
446
|
+
.map((c) => c.text)
|
|
447
|
+
.join('\n')
|
|
448
|
+
: '';
|
|
449
|
+
if (!text)
|
|
450
|
+
continue;
|
|
451
|
+
const role = msg.role === 'assistant' ? 'assistant' : 'user';
|
|
452
|
+
pi.sendMessage({
|
|
453
|
+
customType: 'remote_history',
|
|
454
|
+
content: text,
|
|
455
|
+
display: true,
|
|
456
|
+
details: { role, timestamp: msg.timestamp, hydrated: true },
|
|
457
|
+
});
|
|
458
|
+
hydrated++;
|
|
459
|
+
}
|
|
460
|
+
log(`Hydrated ${hydrated} messages from history`);
|
|
461
|
+
}
|
|
462
|
+
// ── Handle RPC events for rendering ──
|
|
463
|
+
remote.onEvent((event) => {
|
|
464
|
+
const eventType = event.type;
|
|
465
|
+
switch (eventType) {
|
|
466
|
+
case 'message_start':
|
|
467
|
+
messageBuffer = '';
|
|
468
|
+
thinkingBuffer = '';
|
|
469
|
+
isStreaming = true;
|
|
470
|
+
if (extensionCtxRef?.hasUI) {
|
|
471
|
+
extensionCtxRef.ui.setWorkingMessage('Responding...');
|
|
472
|
+
}
|
|
473
|
+
break;
|
|
474
|
+
case 'message_update': {
|
|
475
|
+
const delta = event.text ?? '';
|
|
476
|
+
messageBuffer += delta;
|
|
477
|
+
updateStreamWidget();
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
case 'message_end': {
|
|
481
|
+
isStreaming = false;
|
|
482
|
+
clearStreamWidget();
|
|
483
|
+
if (extensionCtxRef?.hasUI) {
|
|
484
|
+
extensionCtxRef.ui.setWorkingMessage();
|
|
485
|
+
}
|
|
486
|
+
// Extract content — prefer streamed buffer, fall back to message_end payload
|
|
487
|
+
let finalContent = messageBuffer.trim();
|
|
488
|
+
if (!finalContent) {
|
|
489
|
+
// Lifecycle broadcasts include full message in the event payload
|
|
490
|
+
const msg = event.message;
|
|
491
|
+
if (msg) {
|
|
492
|
+
const content = msg.content;
|
|
493
|
+
if (typeof content === 'string') {
|
|
494
|
+
finalContent = content.trim();
|
|
495
|
+
}
|
|
496
|
+
else if (Array.isArray(content)) {
|
|
497
|
+
finalContent = content
|
|
498
|
+
.filter((c) => !!c &&
|
|
499
|
+
typeof c === 'object' &&
|
|
500
|
+
c.type === 'text' &&
|
|
501
|
+
typeof c.text === 'string')
|
|
502
|
+
.map((c) => c.text)
|
|
503
|
+
.join('\n')
|
|
504
|
+
.trim();
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
// Only display assistant messages (skip user message echoes)
|
|
509
|
+
const msgRole = event.message?.role;
|
|
510
|
+
if (finalContent && msgRole !== 'user') {
|
|
511
|
+
pi.sendMessage({
|
|
512
|
+
customType: 'remote_message',
|
|
513
|
+
content: finalContent,
|
|
514
|
+
display: true,
|
|
515
|
+
details: { role: 'assistant' },
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
messageBuffer = '';
|
|
519
|
+
log(`Message complete`);
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
case 'thinking_start':
|
|
523
|
+
thinkingBuffer = '';
|
|
524
|
+
break;
|
|
525
|
+
case 'thinking_update': {
|
|
526
|
+
const delta = event.text ?? '';
|
|
527
|
+
thinkingBuffer += delta;
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
case 'thinking_end':
|
|
531
|
+
// Thinking is internal — just log it
|
|
532
|
+
if (thinkingBuffer) {
|
|
533
|
+
log(`Thinking complete (${thinkingBuffer.length} chars)`);
|
|
534
|
+
}
|
|
535
|
+
thinkingBuffer = '';
|
|
536
|
+
break;
|
|
537
|
+
case 'agent_start': {
|
|
538
|
+
const agent = event.agentName ?? 'agent';
|
|
539
|
+
if (extensionCtxRef?.hasUI) {
|
|
540
|
+
extensionCtxRef.ui.setStatus('remote_activity', `${agent} working...`);
|
|
541
|
+
}
|
|
542
|
+
log(`Agent started: ${agent}`);
|
|
543
|
+
break;
|
|
544
|
+
}
|
|
545
|
+
case 'agent_end':
|
|
546
|
+
if (extensionCtxRef?.hasUI) {
|
|
547
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'idle');
|
|
548
|
+
}
|
|
549
|
+
clearStreamWidget();
|
|
550
|
+
log(`Agent ended`);
|
|
551
|
+
break;
|
|
552
|
+
case 'tool_execution_start': {
|
|
553
|
+
const tool = event.toolName ?? 'tool';
|
|
554
|
+
currentTool = tool;
|
|
555
|
+
if (extensionCtxRef?.hasUI) {
|
|
556
|
+
extensionCtxRef.ui.setWorkingMessage(`Running ${tool}...`);
|
|
557
|
+
extensionCtxRef.ui.setStatus('remote_activity', `Running ${tool}...`);
|
|
558
|
+
}
|
|
559
|
+
log(`Tool: ${tool}`);
|
|
560
|
+
break;
|
|
561
|
+
}
|
|
562
|
+
case 'tool_execution_end': {
|
|
563
|
+
const tool = event.toolName ?? currentTool ?? 'tool';
|
|
564
|
+
currentTool = null;
|
|
565
|
+
if (extensionCtxRef?.hasUI) {
|
|
566
|
+
extensionCtxRef.ui.setWorkingMessage();
|
|
567
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'agent working...');
|
|
568
|
+
}
|
|
569
|
+
log(`Tool done: ${tool}`);
|
|
570
|
+
break;
|
|
571
|
+
}
|
|
572
|
+
case 'turn_start':
|
|
573
|
+
if (extensionCtxRef?.hasUI) {
|
|
574
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'agent working...');
|
|
575
|
+
}
|
|
576
|
+
log('Turn started');
|
|
577
|
+
break;
|
|
578
|
+
case 'turn_end':
|
|
579
|
+
if (extensionCtxRef?.hasUI) {
|
|
580
|
+
extensionCtxRef.ui.setStatus('remote_activity', 'idle');
|
|
581
|
+
extensionCtxRef.ui.setWorkingMessage();
|
|
582
|
+
}
|
|
583
|
+
clearStreamWidget();
|
|
584
|
+
log('Turn ended');
|
|
585
|
+
break;
|
|
586
|
+
case 'session_hydration': {
|
|
587
|
+
// Hydrate conversation history from Hub
|
|
588
|
+
const entries = event.entries;
|
|
589
|
+
if (entries?.length) {
|
|
590
|
+
let hydrated = 0;
|
|
591
|
+
for (const entry of entries.slice(-30)) {
|
|
592
|
+
if (!entry.content)
|
|
593
|
+
continue;
|
|
594
|
+
const role = entry.type === 'message' ? 'assistant' : 'user';
|
|
595
|
+
pi.sendMessage({
|
|
596
|
+
customType: 'remote_history',
|
|
597
|
+
content: entry.content,
|
|
598
|
+
display: true,
|
|
599
|
+
details: { role, timestamp: entry.timestamp, hydrated: true },
|
|
600
|
+
});
|
|
601
|
+
hydrated++;
|
|
602
|
+
}
|
|
603
|
+
log(`Hydrated ${hydrated} entries from session_hydration`);
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
log('Received session_hydration with no entries');
|
|
607
|
+
}
|
|
608
|
+
break;
|
|
609
|
+
}
|
|
610
|
+
case 'auto_compaction_start':
|
|
611
|
+
if (extensionCtxRef?.hasUI) {
|
|
612
|
+
extensionCtxRef.ui.setWorkingMessage('Compacting context...');
|
|
613
|
+
}
|
|
614
|
+
break;
|
|
615
|
+
case 'auto_compaction_end':
|
|
616
|
+
if (extensionCtxRef?.hasUI) {
|
|
617
|
+
extensionCtxRef.ui.setWorkingMessage();
|
|
618
|
+
}
|
|
619
|
+
break;
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
// ── Connection state handling ──
|
|
623
|
+
remote.onConnectionChange((state) => {
|
|
624
|
+
if (!extensionCtxRef?.hasUI)
|
|
625
|
+
return;
|
|
626
|
+
switch (state) {
|
|
627
|
+
case 'connected':
|
|
628
|
+
extensionCtxRef.ui.setStatus('remote_connection', `Remote: ${sessionId.slice(0, 16)}...`);
|
|
629
|
+
break;
|
|
630
|
+
case 'reconnecting':
|
|
631
|
+
extensionCtxRef.ui.setStatus('remote_connection', 'Reconnecting...');
|
|
632
|
+
extensionCtxRef.ui.setWorkingMessage('Connection lost — reconnecting...');
|
|
633
|
+
break;
|
|
634
|
+
case 'disconnected':
|
|
635
|
+
extensionCtxRef.ui.setStatus('remote_connection', 'Disconnected');
|
|
636
|
+
extensionCtxRef.ui.setWorkingMessage('Connection lost');
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
// Request initial state from the sandbox
|
|
641
|
+
remote.getState();
|
|
642
|
+
remote.getMessages();
|
|
643
|
+
return remote;
|
|
644
|
+
}
|
|
645
|
+
//# sourceMappingURL=remote-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-session.js","sourceRoot":"","sources":["../src/remote-session.ts"],"names":[],"mappings":"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"}
|