@smooai/smooth-operator 0.1.0
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/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/client.d.ts +148 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +359 -0
- package/dist/client.js.map +1 -0
- package/dist/generated/types.d.ts +1273 -0
- package/dist/generated/types.d.ts.map +1 -0
- package/dist/generated/types.js +9 -0
- package/dist/generated/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/transport.d.ts +70 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +167 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +49 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +52 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +133 -0
- package/dist/validate.js.map +1 -0
- package/package.json +65 -0
- package/src/client.ts +435 -0
- package/src/generated/types.ts +1358 -0
- package/src/index.ts +31 -0
- package/src/transport.ts +194 -0
- package/src/types.ts +184 -0
- package/src/validate.ts +158 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmoothAgentClient — a minimal, idiomatic, transport-agnostic client for the
|
|
3
|
+
* smooth-operator WebSocket protocol.
|
|
4
|
+
*
|
|
5
|
+
* Design goals
|
|
6
|
+
* ------------
|
|
7
|
+
* - **Transport-agnostic.** The client never touches a real socket directly; it
|
|
8
|
+
* talks to an injectable {@link Transport}. The default ({@link WebSocketTransport})
|
|
9
|
+
* uses the global `WebSocket`, but tests inject a mock and Node can inject `ws`.
|
|
10
|
+
* - **Request/response correlation by `requestId`.** Every action gets a generated
|
|
11
|
+
* `requestId`; the client routes incoming events back to the originating call.
|
|
12
|
+
* - **Streaming as an async iterator.** `sendMessage` returns a {@link MessageTurn}
|
|
13
|
+
* that is both awaitable (resolves with the terminal `eventual_response`) and
|
|
14
|
+
* async-iterable (yields each `stream_token` / `stream_chunk` / HITL event in
|
|
15
|
+
* order). This models the `stream_token`/`stream_chunk` → `eventual_response`
|
|
16
|
+
* flow without forcing a callback style on the caller.
|
|
17
|
+
* - **No live server required.** Correctness is fully unit-testable with a mock
|
|
18
|
+
* transport (see `test/client.test.ts`).
|
|
19
|
+
*/
|
|
20
|
+
import { WebSocketTransport, } from './transport.js';
|
|
21
|
+
import { isServerEvent } from './types.js';
|
|
22
|
+
/** Events that terminate a streaming turn (success or error). */
|
|
23
|
+
const TURN_TERMINAL = new Set(['eventual_response', 'error']);
|
|
24
|
+
/** A timeout that yields no terminal event. */
|
|
25
|
+
class RequestTimeoutError extends Error {
|
|
26
|
+
constructor(requestId, ms) {
|
|
27
|
+
super(`Request ${requestId} timed out after ${ms}ms`);
|
|
28
|
+
this.name = 'RequestTimeoutError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A streaming turn that received no terminal `eventual_response` / `error` within the
|
|
33
|
+
* configured {@link SmoothAgentClientOptions.turnTimeout}. The turn rejects with this
|
|
34
|
+
* and its async iteration throws it, so a stuck server can never hang the caller.
|
|
35
|
+
*/
|
|
36
|
+
export class TurnTimeoutError extends Error {
|
|
37
|
+
requestId;
|
|
38
|
+
constructor(requestId, ms) {
|
|
39
|
+
super(`Turn ${requestId} timed out after ${ms}ms without a terminal response`);
|
|
40
|
+
this.name = 'TurnTimeoutError';
|
|
41
|
+
this.requestId = requestId;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** A protocol-level error event surfaced as a throwable. */
|
|
45
|
+
export class ProtocolError extends Error {
|
|
46
|
+
code;
|
|
47
|
+
requestId;
|
|
48
|
+
constructor(code, message, requestId) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = 'ProtocolError';
|
|
51
|
+
this.code = code;
|
|
52
|
+
this.requestId = requestId;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A streaming message turn. Await it for the terminal {@link EventualResponse},
|
|
57
|
+
* or async-iterate it to receive every intermediate event in arrival order.
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const turn = client.sendMessage({ sessionId, message: 'hi' });
|
|
61
|
+
* for await (const ev of turn) {
|
|
62
|
+
* if (ev.type === 'stream_token') process.stdout.write(ev.token ?? '');
|
|
63
|
+
* }
|
|
64
|
+
* const final = await turn; // EventualResponse
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export class MessageTurn {
|
|
68
|
+
/** The requestId this turn is correlated on. */
|
|
69
|
+
requestId;
|
|
70
|
+
queue = [];
|
|
71
|
+
waiter = null;
|
|
72
|
+
done = false;
|
|
73
|
+
finalEvent = null;
|
|
74
|
+
error = null;
|
|
75
|
+
settled;
|
|
76
|
+
settle;
|
|
77
|
+
fail;
|
|
78
|
+
onClose;
|
|
79
|
+
timeoutTimer;
|
|
80
|
+
constructor(requestId, onClose, turnTimeout = 0) {
|
|
81
|
+
this.requestId = requestId;
|
|
82
|
+
this.onClose = onClose;
|
|
83
|
+
this.settled = new Promise((resolve, reject) => {
|
|
84
|
+
this.settle = resolve;
|
|
85
|
+
this.fail = reject;
|
|
86
|
+
});
|
|
87
|
+
// Avoid unhandled-rejection noise if the caller only iterates and never awaits.
|
|
88
|
+
this.settled.catch(() => { });
|
|
89
|
+
// Bound the turn: a server that accepts the message but never emits a terminal
|
|
90
|
+
// event must not hang the caller forever.
|
|
91
|
+
if (turnTimeout > 0) {
|
|
92
|
+
this.timeoutTimer = setTimeout(() => {
|
|
93
|
+
this.finish(null, new TurnTimeoutError(this.requestId, turnTimeout));
|
|
94
|
+
}, turnTimeout);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Feed an event into the turn (called by the client's dispatcher). */
|
|
98
|
+
push(event) {
|
|
99
|
+
if (this.done)
|
|
100
|
+
return;
|
|
101
|
+
if (event.type === 'error') {
|
|
102
|
+
const code = event.data?.error?.code ?? 'INTERNAL_ERROR';
|
|
103
|
+
const message = event.data?.error?.message ?? 'Unknown protocol error';
|
|
104
|
+
this.deliver(event);
|
|
105
|
+
this.finish(null, new ProtocolError(code, message, this.requestId));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.deliver(event);
|
|
109
|
+
if (event.type === 'eventual_response') {
|
|
110
|
+
this.finish(event, null);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Force-close the turn (e.g. on disconnect) with an error. */
|
|
114
|
+
abort(err) {
|
|
115
|
+
if (this.done)
|
|
116
|
+
return;
|
|
117
|
+
this.finish(null, err);
|
|
118
|
+
}
|
|
119
|
+
deliver(event) {
|
|
120
|
+
if (this.waiter) {
|
|
121
|
+
const w = this.waiter;
|
|
122
|
+
this.waiter = null;
|
|
123
|
+
w.resolve({ value: event, done: false });
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.queue.push(event);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
finish(final, err) {
|
|
130
|
+
if (this.done)
|
|
131
|
+
return;
|
|
132
|
+
this.done = true;
|
|
133
|
+
this.finalEvent = final;
|
|
134
|
+
this.error = err;
|
|
135
|
+
if (this.timeoutTimer) {
|
|
136
|
+
clearTimeout(this.timeoutTimer);
|
|
137
|
+
this.timeoutTimer = undefined;
|
|
138
|
+
}
|
|
139
|
+
this.onClose();
|
|
140
|
+
if (err)
|
|
141
|
+
this.fail(err);
|
|
142
|
+
else if (final)
|
|
143
|
+
this.settle(final);
|
|
144
|
+
// Release any pending iterator waiter now that the stream has ended. On error
|
|
145
|
+
// the parked next() must *reject* (mirroring the queued-error path in next())
|
|
146
|
+
// so a pure `for await` consumer sees the terminal error thrown instead of a
|
|
147
|
+
// silent, indistinguishable `{ done: true }`.
|
|
148
|
+
if (this.waiter) {
|
|
149
|
+
const w = this.waiter;
|
|
150
|
+
this.waiter = null;
|
|
151
|
+
if (err) {
|
|
152
|
+
w.reject(err);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
w.resolve({ value: undefined, done: true });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
[Symbol.asyncIterator]() {
|
|
160
|
+
return {
|
|
161
|
+
next: () => {
|
|
162
|
+
if (this.queue.length > 0) {
|
|
163
|
+
return Promise.resolve({ value: this.queue.shift(), done: false });
|
|
164
|
+
}
|
|
165
|
+
if (this.done) {
|
|
166
|
+
if (this.error)
|
|
167
|
+
return Promise.reject(this.error);
|
|
168
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
169
|
+
}
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
this.waiter = { resolve, reject };
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// PromiseLike — `await turn` resolves with the EventualResponse.
|
|
177
|
+
then(onfulfilled, onrejected) {
|
|
178
|
+
return this.settled.then(onfulfilled, onrejected);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export class SmoothAgentClient {
|
|
182
|
+
transport;
|
|
183
|
+
generateRequestId;
|
|
184
|
+
requestTimeout;
|
|
185
|
+
turnTimeout;
|
|
186
|
+
/** requestId → single-response waiter (create_session, get_session, ping, …). */
|
|
187
|
+
pending = new Map();
|
|
188
|
+
/** requestId → active streaming turn (send_message, and HITL resumes). */
|
|
189
|
+
turns = new Map();
|
|
190
|
+
/** Unsolicited-event listeners (keepalive, server-push). */
|
|
191
|
+
listeners = new Set();
|
|
192
|
+
unsubscribe = [];
|
|
193
|
+
constructor(options) {
|
|
194
|
+
this.transport = options.transport ?? new WebSocketTransport(options.url, options.webSocketFactory);
|
|
195
|
+
this.requestTimeout = options.requestTimeout ?? 30_000;
|
|
196
|
+
this.turnTimeout = options.turnTimeout ?? 120_000;
|
|
197
|
+
this.generateRequestId =
|
|
198
|
+
options.generateRequestId ??
|
|
199
|
+
(() => `req-${(globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2))}`);
|
|
200
|
+
this.unsubscribe.push(this.transport.onMessage((data) => this.handleFrame(data)));
|
|
201
|
+
this.unsubscribe.push(this.transport.onClose(() => this.failAll(new Error('Transport closed'))));
|
|
202
|
+
}
|
|
203
|
+
/** Open the underlying transport. */
|
|
204
|
+
async connect() {
|
|
205
|
+
await this.transport.connect();
|
|
206
|
+
}
|
|
207
|
+
/** Close the transport and reject all in-flight work. */
|
|
208
|
+
disconnect(reason = 'client disconnect') {
|
|
209
|
+
this.failAll(new Error(reason));
|
|
210
|
+
for (const u of this.unsubscribe)
|
|
211
|
+
u();
|
|
212
|
+
this.unsubscribe = [];
|
|
213
|
+
this.transport.close(1000, reason);
|
|
214
|
+
}
|
|
215
|
+
/** Subscribe to unsolicited / uncorrelated server events (e.g. keepalive). */
|
|
216
|
+
onEvent(listener) {
|
|
217
|
+
this.listeners.add(listener);
|
|
218
|
+
return () => this.listeners.delete(listener);
|
|
219
|
+
}
|
|
220
|
+
// ───────────────────────────── Actions ─────────────────────────────────
|
|
221
|
+
/** Start a new conversation session. Resolves with the session descriptor. */
|
|
222
|
+
async createConversationSession(req) {
|
|
223
|
+
const event = await this.request({ action: 'create_conversation_session', ...req });
|
|
224
|
+
return extractImmediateData(event);
|
|
225
|
+
}
|
|
226
|
+
/** Fetch a session snapshot by ID. */
|
|
227
|
+
async getSession(req) {
|
|
228
|
+
const event = await this.request({ action: 'get_session', ...req });
|
|
229
|
+
return extractImmediateData(event);
|
|
230
|
+
}
|
|
231
|
+
/** Fetch a page of conversation messages. */
|
|
232
|
+
async getMessages(req) {
|
|
233
|
+
const event = await this.request({ action: 'get_conversation_messages', ...req });
|
|
234
|
+
return extractImmediateData(event);
|
|
235
|
+
}
|
|
236
|
+
/** Keepalive ping. Resolves with the server timestamp from the `pong` event. */
|
|
237
|
+
async ping() {
|
|
238
|
+
const event = await this.request({ action: 'ping' });
|
|
239
|
+
if (event.type === 'pong')
|
|
240
|
+
return event.timestamp ?? event.data?.timestamp ?? Date.now();
|
|
241
|
+
return Date.now();
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Submit a user message and return a {@link MessageTurn}: await it for the
|
|
245
|
+
* terminal `eventual_response`, or async-iterate it for the streaming events.
|
|
246
|
+
*/
|
|
247
|
+
sendMessage(req) {
|
|
248
|
+
const requestId = this.generateRequestId();
|
|
249
|
+
const turn = new MessageTurn(requestId, () => this.turns.delete(requestId), this.turnTimeout);
|
|
250
|
+
this.turns.set(requestId, turn);
|
|
251
|
+
try {
|
|
252
|
+
this.transport.send(JSON.stringify({ action: 'send_message', requestId, ...req }));
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
this.turns.delete(requestId);
|
|
256
|
+
turn.abort(err);
|
|
257
|
+
}
|
|
258
|
+
return turn;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Approve or reject a pending tool write, resuming the paused turn identified
|
|
262
|
+
* by `requestId`. The resumed streaming events flow back into the original
|
|
263
|
+
* {@link MessageTurn} for that `requestId`.
|
|
264
|
+
*/
|
|
265
|
+
confirmToolAction(req) {
|
|
266
|
+
this.transport.send(JSON.stringify({ action: 'confirm_tool_action', ...req }));
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Submit an OTP code, resuming the paused turn identified by `requestId`.
|
|
270
|
+
* The resumed streaming events flow back into the original {@link MessageTurn}.
|
|
271
|
+
*/
|
|
272
|
+
verifyOtp(req) {
|
|
273
|
+
this.transport.send(JSON.stringify({ action: 'verify_otp', ...req }));
|
|
274
|
+
}
|
|
275
|
+
// ─────────────────────────── Internals ─────────────────────────────────
|
|
276
|
+
/** Send an action that expects a single correlated response event. */
|
|
277
|
+
request(action) {
|
|
278
|
+
const requestId = action.requestId ?? this.generateRequestId();
|
|
279
|
+
const frame = { ...action, requestId };
|
|
280
|
+
return new Promise((resolve, reject) => {
|
|
281
|
+
const timer = this.requestTimeout > 0
|
|
282
|
+
? setTimeout(() => {
|
|
283
|
+
this.pending.delete(requestId);
|
|
284
|
+
reject(new RequestTimeoutError(requestId, this.requestTimeout));
|
|
285
|
+
}, this.requestTimeout)
|
|
286
|
+
: undefined;
|
|
287
|
+
this.pending.set(requestId, { resolve, reject, timer });
|
|
288
|
+
try {
|
|
289
|
+
this.transport.send(JSON.stringify(frame));
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
if (timer)
|
|
293
|
+
clearTimeout(timer);
|
|
294
|
+
this.pending.delete(requestId);
|
|
295
|
+
reject(err);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
/** Parse and route an incoming frame to the right consumer. */
|
|
300
|
+
handleFrame(data) {
|
|
301
|
+
let frame;
|
|
302
|
+
try {
|
|
303
|
+
frame = JSON.parse(data);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return; // ignore malformed frames
|
|
307
|
+
}
|
|
308
|
+
if (!isServerEvent(frame))
|
|
309
|
+
return;
|
|
310
|
+
const event = frame;
|
|
311
|
+
const requestId = event.requestId;
|
|
312
|
+
// 1. Streaming turn? Route every related event into it.
|
|
313
|
+
if (requestId && this.turns.has(requestId)) {
|
|
314
|
+
this.turns.get(requestId).push(event);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
// 2. Single-response request awaiting resolution?
|
|
318
|
+
if (requestId && this.pending.has(requestId)) {
|
|
319
|
+
const pending = this.pending.get(requestId);
|
|
320
|
+
this.pending.delete(requestId);
|
|
321
|
+
if (pending.timer)
|
|
322
|
+
clearTimeout(pending.timer);
|
|
323
|
+
if (event.type === 'error') {
|
|
324
|
+
const code = event.data?.error?.code ?? 'INTERNAL_ERROR';
|
|
325
|
+
const message = event.data?.error?.message ?? 'Unknown protocol error';
|
|
326
|
+
pending.reject(new ProtocolError(code, message, requestId));
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
pending.resolve(event);
|
|
330
|
+
}
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
// 3. Unsolicited / uncorrelated event (keepalive, server push).
|
|
334
|
+
for (const l of this.listeners)
|
|
335
|
+
l(event);
|
|
336
|
+
}
|
|
337
|
+
failAll(err) {
|
|
338
|
+
for (const [, p] of this.pending) {
|
|
339
|
+
if (p.timer)
|
|
340
|
+
clearTimeout(p.timer);
|
|
341
|
+
p.reject(err);
|
|
342
|
+
}
|
|
343
|
+
this.pending.clear();
|
|
344
|
+
for (const [, turn] of this.turns)
|
|
345
|
+
turn.abort(err);
|
|
346
|
+
this.turns.clear();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/** Pull the typed `data` payload out of an `immediate_response` event. */
|
|
350
|
+
function extractImmediateData(event) {
|
|
351
|
+
if (event.type === 'immediate_response')
|
|
352
|
+
return event.data;
|
|
353
|
+
// Some servers may answer a non-streaming action with the payload elsewhere;
|
|
354
|
+
// fall back to `data` if present.
|
|
355
|
+
if ('data' in event && event.data && typeof event.data === 'object')
|
|
356
|
+
return event.data;
|
|
357
|
+
throw new ProtocolError('UNEXPECTED_EVENT', `Expected immediate_response, got "${event.type}"`, event.requestId);
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|