@voicethere/agent 0.2.12 → 0.2.14
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/dist/agent.js +188 -45
- package/dist/runner.d.ts +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +1 -1
- package/dist/runner.js.map +1 -1
- package/dist/runtime.d.ts +13 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +119 -44
- package/dist/runtime.js.map +1 -1
- package/dist/session-serial-queue.d.ts +56 -3
- package/dist/session-serial-queue.d.ts.map +1 -1
- package/dist/session-serial-queue.js +128 -11
- package/dist/session-serial-queue.js.map +1 -1
- package/package.json +4 -4
package/dist/agent.js
CHANGED
|
@@ -6,25 +6,122 @@ const require = createRequire(import.meta.url);
|
|
|
6
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
7
|
|
|
8
8
|
// src/session-serial-queue.ts
|
|
9
|
+
var SessionSerialQueueCancellationError = class extends Error {
|
|
10
|
+
constructor(sessionId, generation) {
|
|
11
|
+
super(
|
|
12
|
+
`session serial queue cancelled (sessionId=${sessionId}, generation=${generation})`
|
|
13
|
+
);
|
|
14
|
+
this.sessionId = sessionId;
|
|
15
|
+
this.generation = generation;
|
|
16
|
+
this.name = "SessionSerialQueueCancellationError";
|
|
17
|
+
}
|
|
18
|
+
code = "SESSION_SERIAL_QUEUE_CANCELLED";
|
|
19
|
+
};
|
|
9
20
|
var SessionSerialQueue = class {
|
|
10
|
-
|
|
21
|
+
sessions = /* @__PURE__ */ new Map();
|
|
22
|
+
/** Monotonic token source — never reused across clear/enqueue cycles. */
|
|
23
|
+
nextGeneration = 1;
|
|
24
|
+
/**
|
|
25
|
+
* Enqueue work for `sessionId`. Returns a promise that settles when this
|
|
26
|
+
* task finishes, is skipped as stale, or is cancelled by {@link clear}.
|
|
27
|
+
* Fire-and-forget callers may ignore the return value (compat).
|
|
28
|
+
*/
|
|
11
29
|
enqueue(sessionId, task) {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
30
|
+
const state = this.ensureState(sessionId);
|
|
31
|
+
const captured = state;
|
|
32
|
+
const generation = captured.generation;
|
|
33
|
+
captured.pending += 1;
|
|
34
|
+
const previous = captured.tail;
|
|
35
|
+
let taskAbort = null;
|
|
36
|
+
const settled = previous.catch(() => void 0).then(async () => {
|
|
37
|
+
if (this.sessions.get(sessionId) !== captured) {
|
|
38
|
+
return "cancelled";
|
|
39
|
+
}
|
|
40
|
+
const abort = new AbortController();
|
|
41
|
+
taskAbort = abort;
|
|
42
|
+
captured.abort = abort;
|
|
43
|
+
const context = {
|
|
44
|
+
sessionId,
|
|
45
|
+
generation,
|
|
46
|
+
signal: abort.signal
|
|
47
|
+
};
|
|
48
|
+
try {
|
|
49
|
+
await Promise.resolve(
|
|
50
|
+
task(abort.signal, context)
|
|
51
|
+
);
|
|
52
|
+
if (this.sessions.get(sessionId) !== captured) {
|
|
53
|
+
return "cancelled";
|
|
54
|
+
}
|
|
55
|
+
return "completed";
|
|
56
|
+
} catch (error) {
|
|
57
|
+
if (abort.signal.aborted || this.sessions.get(sessionId) !== captured || error instanceof SessionSerialQueueCancellationError) {
|
|
58
|
+
return "cancelled";
|
|
59
|
+
}
|
|
60
|
+
return "failed";
|
|
61
|
+
} finally {
|
|
62
|
+
if (captured.abort === abort) {
|
|
63
|
+
captured.abort = null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}).finally(() => {
|
|
67
|
+
captured.pending = Math.max(0, captured.pending - 1);
|
|
68
|
+
if (taskAbort && captured.abort === taskAbort) {
|
|
69
|
+
captured.abort = null;
|
|
16
70
|
}
|
|
17
71
|
});
|
|
18
|
-
|
|
72
|
+
captured.tail = settled;
|
|
73
|
+
return settled;
|
|
19
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Invalidate queued + running work for `sessionId`. Aborts the live AbortSignal,
|
|
77
|
+
* drops the map entry, and leaves a fresh identity for the next enqueue.
|
|
78
|
+
* Old in-flight `finally` blocks only touch their captured state object.
|
|
79
|
+
*/
|
|
20
80
|
clear(sessionId) {
|
|
21
|
-
this.
|
|
81
|
+
const old = this.sessions.get(sessionId);
|
|
82
|
+
if (!old) return;
|
|
83
|
+
old.abort?.abort();
|
|
84
|
+
old.abort = null;
|
|
85
|
+
this.sessions.delete(sessionId);
|
|
22
86
|
}
|
|
23
87
|
clearAll() {
|
|
24
|
-
this.
|
|
88
|
+
for (const sessionId of [...this.sessions.keys()]) {
|
|
89
|
+
this.clear(sessionId);
|
|
90
|
+
}
|
|
25
91
|
}
|
|
26
92
|
hasPending(sessionId) {
|
|
27
|
-
return this.
|
|
93
|
+
return (this.sessions.get(sessionId)?.pending ?? 0) > 0;
|
|
94
|
+
}
|
|
95
|
+
/** Live generation token for a session, or `undefined` when cleared. */
|
|
96
|
+
generationOf(sessionId) {
|
|
97
|
+
return this.sessions.get(sessionId)?.generation;
|
|
98
|
+
}
|
|
99
|
+
/** True when `generation` is the live map entry for `sessionId`. */
|
|
100
|
+
isCurrentGeneration(sessionId, generation) {
|
|
101
|
+
return this.sessions.get(sessionId)?.generation === generation;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* True when a queue row exists for the session (registered since first
|
|
105
|
+
* enqueue, until {@link clear}). Not the same as {@link hasPending}.
|
|
106
|
+
*/
|
|
107
|
+
isLive(sessionId) {
|
|
108
|
+
return this.sessions.has(sessionId);
|
|
109
|
+
}
|
|
110
|
+
/** Registered session rows (must not grow without matching `clear` calls). */
|
|
111
|
+
get activeSessionCount() {
|
|
112
|
+
return this.sessions.size;
|
|
113
|
+
}
|
|
114
|
+
ensureState(sessionId) {
|
|
115
|
+
const existing = this.sessions.get(sessionId);
|
|
116
|
+
if (existing) return existing;
|
|
117
|
+
const created = {
|
|
118
|
+
generation: this.nextGeneration++,
|
|
119
|
+
tail: Promise.resolve(),
|
|
120
|
+
abort: null,
|
|
121
|
+
pending: 0
|
|
122
|
+
};
|
|
123
|
+
this.sessions.set(sessionId, created);
|
|
124
|
+
return created;
|
|
28
125
|
}
|
|
29
126
|
};
|
|
30
127
|
|
|
@@ -46,7 +143,9 @@ function parseDataChannelPayload(raw) {
|
|
|
46
143
|
}
|
|
47
144
|
var peerEnvBySessionId = /* @__PURE__ */ new Map();
|
|
48
145
|
var endedSessionIds = /* @__PURE__ */ new Set();
|
|
146
|
+
var sessionExecutionContext = new AsyncLocalStorage();
|
|
49
147
|
var agentLogSessionContext = new AsyncLocalStorage();
|
|
148
|
+
var inboundQueueAuthority = null;
|
|
50
149
|
var childUnhandledRejectionGuardInstalled = false;
|
|
51
150
|
function normalizeRejectionReason(reason) {
|
|
52
151
|
return reason instanceof Error ? reason : new Error(String(reason));
|
|
@@ -58,13 +157,17 @@ function installChildUnhandledRejectionGuard() {
|
|
|
58
157
|
childUnhandledRejectionGuardInstalled = true;
|
|
59
158
|
process.on("unhandledRejection", (reason) => {
|
|
60
159
|
const err = normalizeRejectionReason(reason);
|
|
61
|
-
const
|
|
160
|
+
const store = sessionExecutionContext.getStore();
|
|
161
|
+
const sessionId = store?.sessionId ?? agentLogSessionContext.getStore() ?? "";
|
|
162
|
+
if (!allowOutboundForSession(sessionId || void 0)) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
62
165
|
agentLog(
|
|
63
166
|
"error",
|
|
64
167
|
`unhandledRejection: ${err.message}`,
|
|
65
168
|
sessionId || void 0
|
|
66
169
|
);
|
|
67
|
-
|
|
170
|
+
sendParentMessage({
|
|
68
171
|
type: "agent_error",
|
|
69
172
|
sessionId,
|
|
70
173
|
message: err.message,
|
|
@@ -72,6 +175,25 @@ function installChildUnhandledRejectionGuard() {
|
|
|
72
175
|
});
|
|
73
176
|
});
|
|
74
177
|
}
|
|
178
|
+
function allowOutboundForSession(sessionId) {
|
|
179
|
+
if (!sessionId) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
const store = sessionExecutionContext.getStore();
|
|
183
|
+
const queue = inboundQueueAuthority;
|
|
184
|
+
if (store && store.sessionId === sessionId) {
|
|
185
|
+
if (!queue) return !endedSessionIds.has(sessionId);
|
|
186
|
+
return queue.isCurrentGeneration(sessionId, store.generation);
|
|
187
|
+
}
|
|
188
|
+
if (endedSessionIds.has(sessionId)) return false;
|
|
189
|
+
if (!queue) return true;
|
|
190
|
+
return queue.isLive(sessionId);
|
|
191
|
+
}
|
|
192
|
+
function sendParentMessage(message) {
|
|
193
|
+
const sessionId = message && typeof message === "object" && "sessionId" in message && typeof message.sessionId === "string" ? message.sessionId : void 0;
|
|
194
|
+
if (!allowOutboundForSession(sessionId)) return;
|
|
195
|
+
process.send?.(message);
|
|
196
|
+
}
|
|
75
197
|
function parseBooleanEnv(value, defaultValue) {
|
|
76
198
|
if (value === void 0) return defaultValue;
|
|
77
199
|
const normalized = value.trim().toLowerCase();
|
|
@@ -112,7 +234,7 @@ async function handleParentMessage(message, handlers) {
|
|
|
112
234
|
sessionId: message.sessionId,
|
|
113
235
|
env: message.env
|
|
114
236
|
});
|
|
115
|
-
|
|
237
|
+
sendParentMessage({
|
|
116
238
|
type: "session_start_ack",
|
|
117
239
|
sessionId: message.sessionId
|
|
118
240
|
});
|
|
@@ -161,37 +283,59 @@ async function handleParentMessage(message, handlers) {
|
|
|
161
283
|
function defineAgent(handlers) {
|
|
162
284
|
installChildUnhandledRejectionGuard();
|
|
163
285
|
const inboundBySession = new SessionSerialQueue();
|
|
286
|
+
inboundQueueAuthority = inboundBySession;
|
|
164
287
|
const agentStartReady = runAgentStartHook(handlers);
|
|
165
288
|
process.on("message", (message) => {
|
|
166
289
|
if (!isParentMessage(message)) return;
|
|
167
|
-
|
|
290
|
+
if (message.type === "session_end") {
|
|
291
|
+
endedSessionIds.add(message.sessionId);
|
|
292
|
+
inboundBySession.clear(message.sessionId);
|
|
293
|
+
}
|
|
294
|
+
if (message.type === "session_start") {
|
|
295
|
+
endedSessionIds.delete(message.sessionId);
|
|
296
|
+
inboundBySession.clear(message.sessionId);
|
|
297
|
+
}
|
|
298
|
+
inboundBySession.enqueue(message.sessionId, async (_signal, context) => {
|
|
168
299
|
await agentStartReady;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
endedSessionIds.add(message.sessionId);
|
|
173
|
-
inboundBySession.clear(message.sessionId);
|
|
174
|
-
}
|
|
175
|
-
await handleParentMessage(message, handlers);
|
|
176
|
-
} catch (error) {
|
|
177
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
178
|
-
const env = peerEnvBySessionId.get(message.sessionId) ?? buildIdleEnv(message.sessionId);
|
|
179
|
-
await runErrorHook(handlers, {
|
|
180
|
-
sessionId: message.sessionId,
|
|
181
|
-
projectId: env.PROJECT_ID,
|
|
182
|
-
buildId: env.BUILD_ID,
|
|
183
|
-
env,
|
|
184
|
-
error: err,
|
|
185
|
-
customerContext: parseCustomerContext(env.AGENT_CUSTOMER_CONTEXT)
|
|
186
|
-
});
|
|
187
|
-
process.send?.({
|
|
188
|
-
type: "agent_error",
|
|
300
|
+
try {
|
|
301
|
+
await sessionExecutionContext.run(
|
|
302
|
+
{
|
|
189
303
|
sessionId: message.sessionId,
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
304
|
+
generation: context.generation
|
|
305
|
+
},
|
|
306
|
+
async () => agentLogSessionContext.run(message.sessionId, async () => {
|
|
307
|
+
try {
|
|
308
|
+
await handleParentMessage(message, handlers);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
311
|
+
const env = peerEnvBySessionId.get(message.sessionId) ?? buildIdleEnv(message.sessionId);
|
|
312
|
+
await runErrorHook(handlers, {
|
|
313
|
+
sessionId: message.sessionId,
|
|
314
|
+
projectId: env.PROJECT_ID,
|
|
315
|
+
buildId: env.BUILD_ID,
|
|
316
|
+
env,
|
|
317
|
+
error: err,
|
|
318
|
+
customerContext: parseCustomerContext(
|
|
319
|
+
env.AGENT_CUSTOMER_CONTEXT
|
|
320
|
+
)
|
|
321
|
+
});
|
|
322
|
+
sendParentMessage({
|
|
323
|
+
type: "agent_error",
|
|
324
|
+
sessionId: message.sessionId,
|
|
325
|
+
message: err.message,
|
|
326
|
+
stack: err.stack
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
})
|
|
330
|
+
);
|
|
331
|
+
} finally {
|
|
332
|
+
if (message.type === "session_end" && inboundBySession.isCurrentGeneration(
|
|
333
|
+
message.sessionId,
|
|
334
|
+
context.generation
|
|
335
|
+
)) {
|
|
336
|
+
inboundBySession.clear(message.sessionId);
|
|
193
337
|
}
|
|
194
|
-
}
|
|
338
|
+
}
|
|
195
339
|
});
|
|
196
340
|
});
|
|
197
341
|
}
|
|
@@ -204,7 +348,7 @@ async function runAgentStartHook(handlers) {
|
|
|
204
348
|
} catch (error) {
|
|
205
349
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
206
350
|
agentLog("error", `onAgentStart failed: ${err.message}`);
|
|
207
|
-
|
|
351
|
+
sendParentMessage({
|
|
208
352
|
type: "agent_error",
|
|
209
353
|
sessionId: "",
|
|
210
354
|
message: err.message,
|
|
@@ -240,7 +384,7 @@ async function runIdleTimeoutHook(handlers, message) {
|
|
|
240
384
|
message.sessionId
|
|
241
385
|
);
|
|
242
386
|
if (!onIdleTimeout) {
|
|
243
|
-
|
|
387
|
+
sendParentMessage({
|
|
244
388
|
type: "idle_timeout_done",
|
|
245
389
|
sessionId: message.sessionId
|
|
246
390
|
});
|
|
@@ -267,7 +411,7 @@ async function runIdleTimeoutHook(handlers, message) {
|
|
|
267
411
|
error = hookError instanceof Error ? hookError.message : String(hookError);
|
|
268
412
|
agentLog("error", `onIdleTimeout failed: ${error}`, message.sessionId);
|
|
269
413
|
}
|
|
270
|
-
|
|
414
|
+
sendParentMessage({
|
|
271
415
|
type: "idle_timeout_done",
|
|
272
416
|
sessionId: message.sessionId,
|
|
273
417
|
error
|
|
@@ -287,11 +431,10 @@ function buildIdleEnv(sessionId) {
|
|
|
287
431
|
};
|
|
288
432
|
}
|
|
289
433
|
function speak(sessionId, text) {
|
|
290
|
-
|
|
291
|
-
process.send?.({ type: "speak", sessionId, text });
|
|
434
|
+
sendParentMessage({ type: "speak", sessionId, text });
|
|
292
435
|
}
|
|
293
436
|
function sendToClient(sessionId, payload) {
|
|
294
|
-
|
|
437
|
+
sendParentMessage({ type: "send_to_client", sessionId, payload });
|
|
295
438
|
}
|
|
296
439
|
var AGENT_LOG_MESSAGE_MAX_CHARS = 2048;
|
|
297
440
|
var AGENT_LOG_FIELDS_MAX_CHARS = 8192;
|
|
@@ -324,7 +467,7 @@ function sanitizeAgentLogFields(fields) {
|
|
|
324
467
|
}
|
|
325
468
|
}
|
|
326
469
|
function buildAgentLogPayload(level, message, fields, sessionId) {
|
|
327
|
-
const resolvedSessionId = sessionId ?? agentLogSessionContext.getStore();
|
|
470
|
+
const resolvedSessionId = sessionId ?? sessionExecutionContext.getStore()?.sessionId ?? agentLogSessionContext.getStore();
|
|
328
471
|
const sanitizedFields = fields ? sanitizeAgentLogFields(fields) : void 0;
|
|
329
472
|
return {
|
|
330
473
|
type: "log",
|
|
@@ -346,7 +489,7 @@ function agentLog(level, message, fieldsOrSessionId, sessionId) {
|
|
|
346
489
|
} else {
|
|
347
490
|
resolvedSessionId = sessionId;
|
|
348
491
|
}
|
|
349
|
-
|
|
492
|
+
sendParentMessage(
|
|
350
493
|
buildAgentLogPayload(level, message, fields, resolvedSessionId)
|
|
351
494
|
);
|
|
352
495
|
}
|
package/dist/runner.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { buildChildExecArgv, collectAllowFsReadDirs, } from "./sandbox/sandbox.js";
|
|
2
2
|
export { resolveBundlePath, startSandboxedChild, type SandboxedChild, type StartSandboxedChildOptions, } from "./sandbox/start-child.js";
|
|
3
|
-
export { SessionSerialQueue } from "./session-serial-queue.js";
|
|
3
|
+
export { SessionSerialQueue, SessionSerialQueueCancellationError, type SessionSerialTask, type SessionSerialTaskContext, } from "./session-serial-queue.js";
|
|
4
4
|
//# sourceMappingURL=runner.d.ts.map
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,0BAA0B,GAChC,MAAM,0BAA0B,CAAC;AAElC,OAAO,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,0BAA0B,GAChC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,mCAAmC,EACnC,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC"}
|
package/dist/runner.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { buildChildExecArgv, collectAllowFsReadDirs, } from "./sandbox/sandbox.js";
|
|
2
2
|
export { resolveBundlePath, startSandboxedChild, } from "./sandbox/start-child.js";
|
|
3
|
-
export { SessionSerialQueue } from "./session-serial-queue.js";
|
|
3
|
+
export { SessionSerialQueue, SessionSerialQueueCancellationError, } from "./session-serial-queue.js";
|
|
4
4
|
//# sourceMappingURL=runner.js.map
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,mCAAmC,GAGpC,MAAM,2BAA2B,CAAC"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -77,6 +77,19 @@ export interface AgentErrorContext {
|
|
|
77
77
|
error: Error;
|
|
78
78
|
customerContext?: Record<string, unknown>;
|
|
79
79
|
}
|
|
80
|
+
export type SessionExecutionStore = {
|
|
81
|
+
sessionId: string;
|
|
82
|
+
generation: number;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* True when outbound IPC/logs for `sessionId` are allowed under the current
|
|
86
|
+
* generation-aware ALS + live session registration.
|
|
87
|
+
*
|
|
88
|
+
* Detached sends (timers, Redis fan-out) run outside handler ALS. The inbound
|
|
89
|
+
* queue keeps a session row until `session_end` clears it — `isLive` means
|
|
90
|
+
* "still connected/registered", not "a handler is currently running".
|
|
91
|
+
*/
|
|
92
|
+
export declare function allowOutboundForSession(sessionId?: string): boolean;
|
|
80
93
|
/**
|
|
81
94
|
* Register IPC handlers for a customer agent child process.
|
|
82
95
|
* Call once at bundle entry; runner parent sends {@link ParentToChildMessage} events.
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,KAAK,EACV,aAAa,EAEb,eAAe,EAEhB,MAAM,eAAe,CAAC;AAGvB,eAAO,MAAM,oCAAoC,2CACP,CAAC;AAC3C,eAAO,MAAM,+BAA+B,sCACP,CAAC;AAGtC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,6EAA6E;IAC7E,aAAa,CAAC,EAAE,CACd,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,WAAW,KACf,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -23,10 +23,18 @@ function parseDataChannelPayload(raw) {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
const peerEnvBySessionId = new Map();
|
|
26
|
-
/** Sessions that received `session_end`; `speak()` becomes a no-op. */
|
|
26
|
+
/** Sessions that received `session_end`; `speak()` becomes a no-op when no live gen. */
|
|
27
27
|
const endedSessionIds = new Set();
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Generation-aware execution context for inbound handlers. Outbound helpers
|
|
30
|
+
* (`speak`, `sendToClient`, …) consult this so a late old-generation callback
|
|
31
|
+
* cannot emit after `clear` / session-id reuse.
|
|
32
|
+
*/
|
|
33
|
+
const sessionExecutionContext = new AsyncLocalStorage();
|
|
34
|
+
/** @deprecated Prefer {@link sessionExecutionContext}; kept for log session id. */
|
|
29
35
|
const agentLogSessionContext = new AsyncLocalStorage();
|
|
36
|
+
/** Live inbound queue for the child process (set by {@link defineAgent}). */
|
|
37
|
+
let inboundQueueAuthority = null;
|
|
30
38
|
/** Idempotent: at most one child-process `unhandledRejection` listener. */
|
|
31
39
|
let childUnhandledRejectionGuardInstalled = false;
|
|
32
40
|
function normalizeRejectionReason(reason) {
|
|
@@ -46,9 +54,13 @@ function installChildUnhandledRejectionGuard() {
|
|
|
46
54
|
childUnhandledRejectionGuardInstalled = true;
|
|
47
55
|
process.on("unhandledRejection", (reason) => {
|
|
48
56
|
const err = normalizeRejectionReason(reason);
|
|
49
|
-
const
|
|
57
|
+
const store = sessionExecutionContext.getStore();
|
|
58
|
+
const sessionId = store?.sessionId ?? agentLogSessionContext.getStore() ?? "";
|
|
59
|
+
if (!allowOutboundForSession(sessionId || undefined)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
50
62
|
agentLog("error", `unhandledRejection: ${err.message}`, sessionId || undefined);
|
|
51
|
-
|
|
63
|
+
sendParentMessage({
|
|
52
64
|
type: "agent_error",
|
|
53
65
|
sessionId,
|
|
54
66
|
message: err.message,
|
|
@@ -56,6 +68,45 @@ function installChildUnhandledRejectionGuard() {
|
|
|
56
68
|
});
|
|
57
69
|
});
|
|
58
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* True when outbound IPC/logs for `sessionId` are allowed under the current
|
|
73
|
+
* generation-aware ALS + live session registration.
|
|
74
|
+
*
|
|
75
|
+
* Detached sends (timers, Redis fan-out) run outside handler ALS. The inbound
|
|
76
|
+
* queue keeps a session row until `session_end` clears it — `isLive` means
|
|
77
|
+
* "still connected/registered", not "a handler is currently running".
|
|
78
|
+
*/
|
|
79
|
+
export function allowOutboundForSession(sessionId) {
|
|
80
|
+
if (!sessionId) {
|
|
81
|
+
// Process-wide logs without a session are always allowed.
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
const store = sessionExecutionContext.getStore();
|
|
85
|
+
const queue = inboundQueueAuthority;
|
|
86
|
+
if (store && store.sessionId === sessionId) {
|
|
87
|
+
if (!queue)
|
|
88
|
+
return !endedSessionIds.has(sessionId);
|
|
89
|
+
return queue.isCurrentGeneration(sessionId, store.generation);
|
|
90
|
+
}
|
|
91
|
+
// No ALS (or cross-session target): require a registered session that has
|
|
92
|
+
// not been marked ended. Stale same-id handlers are blocked via ALS above.
|
|
93
|
+
if (endedSessionIds.has(sessionId))
|
|
94
|
+
return false;
|
|
95
|
+
if (!queue)
|
|
96
|
+
return true;
|
|
97
|
+
return queue.isLive(sessionId);
|
|
98
|
+
}
|
|
99
|
+
function sendParentMessage(message) {
|
|
100
|
+
const sessionId = message &&
|
|
101
|
+
typeof message === "object" &&
|
|
102
|
+
"sessionId" in message &&
|
|
103
|
+
typeof message.sessionId === "string"
|
|
104
|
+
? message.sessionId
|
|
105
|
+
: undefined;
|
|
106
|
+
if (!allowOutboundForSession(sessionId))
|
|
107
|
+
return;
|
|
108
|
+
process.send?.(message);
|
|
109
|
+
}
|
|
59
110
|
function parseBooleanEnv(value, defaultValue) {
|
|
60
111
|
if (value === undefined)
|
|
61
112
|
return defaultValue;
|
|
@@ -95,7 +146,7 @@ async function handleParentMessage(message, handlers) {
|
|
|
95
146
|
sessionId: message.sessionId,
|
|
96
147
|
env: message.env,
|
|
97
148
|
});
|
|
98
|
-
|
|
149
|
+
sendParentMessage({
|
|
99
150
|
type: "session_start_ack",
|
|
100
151
|
sessionId: message.sessionId,
|
|
101
152
|
});
|
|
@@ -153,40 +204,63 @@ async function handleParentMessage(message, handlers) {
|
|
|
153
204
|
export function defineAgent(handlers) {
|
|
154
205
|
installChildUnhandledRejectionGuard();
|
|
155
206
|
const inboundBySession = new SessionSerialQueue();
|
|
207
|
+
inboundQueueAuthority = inboundBySession;
|
|
156
208
|
const agentStartReady = runAgentStartHook(handlers);
|
|
157
209
|
process.on("message", (message) => {
|
|
158
210
|
if (!isParentMessage(message))
|
|
159
211
|
return;
|
|
160
|
-
|
|
212
|
+
// Invalidate immediately on arrival — do not wait behind queued work that
|
|
213
|
+
// must be cancelled. session_end then enqueues on a fresh generation for
|
|
214
|
+
// the leave hook only.
|
|
215
|
+
if (message.type === "session_end") {
|
|
216
|
+
endedSessionIds.add(message.sessionId);
|
|
217
|
+
inboundBySession.clear(message.sessionId);
|
|
218
|
+
}
|
|
219
|
+
// session_start must not chain onto a dying session_end generation — clear
|
|
220
|
+
// first so enqueue always gets a new live row for the new connection.
|
|
221
|
+
if (message.type === "session_start") {
|
|
222
|
+
endedSessionIds.delete(message.sessionId);
|
|
223
|
+
inboundBySession.clear(message.sessionId);
|
|
224
|
+
}
|
|
225
|
+
inboundBySession.enqueue(message.sessionId, async (_signal, context) => {
|
|
161
226
|
await agentStartReady;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
227
|
+
try {
|
|
228
|
+
await sessionExecutionContext.run({
|
|
229
|
+
sessionId: message.sessionId,
|
|
230
|
+
generation: context.generation,
|
|
231
|
+
}, async () => agentLogSessionContext.run(message.sessionId, async () => {
|
|
232
|
+
try {
|
|
233
|
+
await handleParentMessage(message, handlers);
|
|
167
234
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
235
|
+
catch (error) {
|
|
236
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
237
|
+
const env = peerEnvBySessionId.get(message.sessionId) ??
|
|
238
|
+
buildIdleEnv(message.sessionId);
|
|
239
|
+
await runErrorHook(handlers, {
|
|
240
|
+
sessionId: message.sessionId,
|
|
241
|
+
projectId: env.PROJECT_ID,
|
|
242
|
+
buildId: env.BUILD_ID,
|
|
243
|
+
env,
|
|
244
|
+
error: err,
|
|
245
|
+
customerContext: parseCustomerContext(env.AGENT_CUSTOMER_CONTEXT),
|
|
246
|
+
});
|
|
247
|
+
sendParentMessage({
|
|
248
|
+
type: "agent_error",
|
|
249
|
+
sessionId: message.sessionId,
|
|
250
|
+
message: err.message,
|
|
251
|
+
stack: err.stack,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
// Leave-hook row is temporary. Drop it only if this generation is
|
|
258
|
+
// still current (a racing session_start already cleared + replaced).
|
|
259
|
+
if (message.type === "session_end" &&
|
|
260
|
+
inboundBySession.isCurrentGeneration(message.sessionId, context.generation)) {
|
|
261
|
+
inboundBySession.clear(message.sessionId);
|
|
188
262
|
}
|
|
189
|
-
}
|
|
263
|
+
}
|
|
190
264
|
});
|
|
191
265
|
});
|
|
192
266
|
}
|
|
@@ -201,7 +275,7 @@ async function runAgentStartHook(handlers) {
|
|
|
201
275
|
catch (error) {
|
|
202
276
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
203
277
|
agentLog("error", `onAgentStart failed: ${err.message}`);
|
|
204
|
-
|
|
278
|
+
sendParentMessage({
|
|
205
279
|
type: "agent_error",
|
|
206
280
|
sessionId: "",
|
|
207
281
|
message: err.message,
|
|
@@ -238,7 +312,7 @@ async function runIdleTimeoutHook(handlers, message) {
|
|
|
238
312
|
const onIdleTimeout = handlers.onIdleTimeout;
|
|
239
313
|
agentLog("info", `idle_timeout ipc received (maxGraceMs=${message.maxGraceMs}, onIdleTimeout=${typeof onIdleTimeout === "function"})`, message.sessionId);
|
|
240
314
|
if (!onIdleTimeout) {
|
|
241
|
-
|
|
315
|
+
sendParentMessage({
|
|
242
316
|
type: "idle_timeout_done",
|
|
243
317
|
sessionId: message.sessionId,
|
|
244
318
|
});
|
|
@@ -263,7 +337,7 @@ async function runIdleTimeoutHook(handlers, message) {
|
|
|
263
337
|
error = hookError instanceof Error ? hookError.message : String(hookError);
|
|
264
338
|
agentLog("error", `onIdleTimeout failed: ${error}`, message.sessionId);
|
|
265
339
|
}
|
|
266
|
-
|
|
340
|
+
sendParentMessage({
|
|
267
341
|
type: "idle_timeout_done",
|
|
268
342
|
sessionId: message.sessionId,
|
|
269
343
|
error,
|
|
@@ -286,21 +360,20 @@ function buildIdleEnv(sessionId) {
|
|
|
286
360
|
export function resetAgentIpcStateForTests() {
|
|
287
361
|
endedSessionIds.clear();
|
|
288
362
|
peerEnvBySessionId.clear();
|
|
363
|
+
inboundQueueAuthority = null;
|
|
289
364
|
}
|
|
290
365
|
/** Ask the runner parent to synthesize speech for the session. */
|
|
291
366
|
export function speak(sessionId, text) {
|
|
292
|
-
|
|
293
|
-
return;
|
|
294
|
-
process.send?.({ type: "speak", sessionId, text });
|
|
367
|
+
sendParentMessage({ type: "speak", sessionId, text });
|
|
295
368
|
}
|
|
296
369
|
/** Send a JSON payload to the browser peer via the runner parent. */
|
|
297
370
|
export function sendToClient(sessionId, payload) {
|
|
298
|
-
|
|
371
|
+
sendParentMessage({ type: "send_to_client", sessionId, payload });
|
|
299
372
|
}
|
|
300
373
|
/** Send raw bytes to the browser peer via the runner parent. */
|
|
301
374
|
export function sendBinaryToClient(sessionId, data, channel = "sync") {
|
|
302
375
|
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
303
|
-
|
|
376
|
+
sendParentMessage({
|
|
304
377
|
type: "send_binary_to_client",
|
|
305
378
|
sessionId,
|
|
306
379
|
data: buffer,
|
|
@@ -318,7 +391,7 @@ export function sendBinaryToClient(sessionId, data, channel = "sync") {
|
|
|
318
391
|
export function broadCastBinaryToClients(data, sessionIds, channel = "sync") {
|
|
319
392
|
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
320
393
|
for (const sessionId of sessionIds) {
|
|
321
|
-
|
|
394
|
+
sendParentMessage({
|
|
322
395
|
type: "send_binary_to_client",
|
|
323
396
|
sessionId,
|
|
324
397
|
data: buffer,
|
|
@@ -364,7 +437,9 @@ function sanitizeAgentLogFields(fields) {
|
|
|
364
437
|
}
|
|
365
438
|
}
|
|
366
439
|
function buildAgentLogPayload(level, message, fields, sessionId) {
|
|
367
|
-
const resolvedSessionId = sessionId ??
|
|
440
|
+
const resolvedSessionId = sessionId ??
|
|
441
|
+
sessionExecutionContext.getStore()?.sessionId ??
|
|
442
|
+
agentLogSessionContext.getStore();
|
|
368
443
|
const sanitizedFields = fields ? sanitizeAgentLogFields(fields) : undefined;
|
|
369
444
|
return {
|
|
370
445
|
type: "log",
|
|
@@ -388,11 +463,11 @@ export function agentLog(level, message, fieldsOrSessionId, sessionId) {
|
|
|
388
463
|
else {
|
|
389
464
|
resolvedSessionId = sessionId;
|
|
390
465
|
}
|
|
391
|
-
|
|
466
|
+
sendParentMessage(buildAgentLogPayload(level, message, fields, resolvedSessionId));
|
|
392
467
|
}
|
|
393
468
|
/** Ask the runner to disconnect a browser peer (customer-initiated). */
|
|
394
469
|
export function disconnectClient(sessionId, options) {
|
|
395
|
-
|
|
470
|
+
sendParentMessage({
|
|
396
471
|
type: "disconnect_client",
|
|
397
472
|
sessionId,
|
|
398
473
|
reason: options?.reason,
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,66 @@
|
|
|
3
3
|
* sessionId is processed strictly in enqueue order (no overlapping handlers).
|
|
4
4
|
*
|
|
5
5
|
* Task rejections are consumed at the queue tail so they do not surface as
|
|
6
|
-
* process `unhandledRejection` events. Later same-session tasks still run
|
|
6
|
+
* process `unhandledRejection` events. Later same-session tasks still run
|
|
7
|
+
* unless {@link clear} invalidated the generation.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle ordering:
|
|
10
|
+
* 1. First `enqueue` creates a live map row (generation token).
|
|
11
|
+
* 2. The row stays registered for the session lifetime — including when
|
|
12
|
+
* `pending === 0` between inbound handlers. Clients send continuously and
|
|
13
|
+
* agents fan out on timers; "no handler in flight" is not "session gone".
|
|
14
|
+
* 3. `clear(sessionId)` aborts live work and removes the row (session_end).
|
|
15
|
+
* 4. Old task `finally` only mutates the captured state object; it never
|
|
16
|
+
* deletes a newer generation's map entry.
|
|
17
|
+
* 5. No per-session tombstone map — callers must `clear` ended sessions so
|
|
18
|
+
* unique-ID churn leaves no residue.
|
|
19
|
+
*/
|
|
20
|
+
export declare class SessionSerialQueueCancellationError extends Error {
|
|
21
|
+
readonly sessionId: string;
|
|
22
|
+
readonly generation: number;
|
|
23
|
+
readonly code: "SESSION_SERIAL_QUEUE_CANCELLED";
|
|
24
|
+
constructor(sessionId: string, generation: number);
|
|
25
|
+
}
|
|
26
|
+
/** Context for generation-aware tasks (second enqueue argument; optional). */
|
|
27
|
+
export type SessionSerialTaskContext = {
|
|
28
|
+
sessionId: string;
|
|
29
|
+
generation: number;
|
|
30
|
+
signal: AbortSignal;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Tasks may observe AbortSignal (compat first arg) and optional context.
|
|
34
|
+
* Zero-arg / signal-only callbacks remain supported.
|
|
7
35
|
*/
|
|
36
|
+
export type SessionSerialTask = (signal: AbortSignal, context: SessionSerialTaskContext) => void | Promise<void>;
|
|
8
37
|
export declare class SessionSerialQueue {
|
|
9
|
-
private readonly
|
|
10
|
-
|
|
38
|
+
private readonly sessions;
|
|
39
|
+
/** Monotonic token source — never reused across clear/enqueue cycles. */
|
|
40
|
+
private nextGeneration;
|
|
41
|
+
/**
|
|
42
|
+
* Enqueue work for `sessionId`. Returns a promise that settles when this
|
|
43
|
+
* task finishes, is skipped as stale, or is cancelled by {@link clear}.
|
|
44
|
+
* Fire-and-forget callers may ignore the return value (compat).
|
|
45
|
+
*/
|
|
46
|
+
enqueue(sessionId: string, task: SessionSerialTask | ((signal: AbortSignal) => void | Promise<void>) | (() => void | Promise<void>)): Promise<"completed" | "cancelled" | "failed">;
|
|
47
|
+
/**
|
|
48
|
+
* Invalidate queued + running work for `sessionId`. Aborts the live AbortSignal,
|
|
49
|
+
* drops the map entry, and leaves a fresh identity for the next enqueue.
|
|
50
|
+
* Old in-flight `finally` blocks only touch their captured state object.
|
|
51
|
+
*/
|
|
11
52
|
clear(sessionId: string): void;
|
|
12
53
|
clearAll(): void;
|
|
13
54
|
hasPending(sessionId: string): boolean;
|
|
55
|
+
/** Live generation token for a session, or `undefined` when cleared. */
|
|
56
|
+
generationOf(sessionId: string): number | undefined;
|
|
57
|
+
/** True when `generation` is the live map entry for `sessionId`. */
|
|
58
|
+
isCurrentGeneration(sessionId: string, generation: number): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* True when a queue row exists for the session (registered since first
|
|
61
|
+
* enqueue, until {@link clear}). Not the same as {@link hasPending}.
|
|
62
|
+
*/
|
|
63
|
+
isLive(sessionId: string): boolean;
|
|
64
|
+
/** Registered session rows (must not grow without matching `clear` calls). */
|
|
65
|
+
get activeSessionCount(): number;
|
|
66
|
+
private ensureState;
|
|
14
67
|
}
|
|
15
68
|
//# sourceMappingURL=session-serial-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-serial-queue.d.ts","sourceRoot":"","sources":["../src/session-serial-queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-serial-queue.d.ts","sourceRoot":"","sources":["../src/session-serial-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,qBAAa,mCAAoC,SAAQ,KAAK;IAI1D,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM;IAJ7B,QAAQ,CAAC,IAAI,EAAG,gCAAgC,CAAU;gBAG/C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM;CAO9B;AAED,8EAA8E;AAC9E,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,wBAAwB,KAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAS1B,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,yEAAyE;IACzE,OAAO,CAAC,cAAc,CAAK;IAE3B;;;;OAIG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,IAAI,EACA,iBAAiB,GACjB,CAAC,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAC/C,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAC/B,OAAO,CAAC,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAgEhD;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAS9B,QAAQ,IAAI,IAAI;IAMhB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,wEAAwE;IACxE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,oEAAoE;IACpE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAInE;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIlC,8EAA8E;IAC9E,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,OAAO,CAAC,WAAW;CAapB"}
|
|
@@ -3,31 +3,148 @@
|
|
|
3
3
|
* sessionId is processed strictly in enqueue order (no overlapping handlers).
|
|
4
4
|
*
|
|
5
5
|
* Task rejections are consumed at the queue tail so they do not surface as
|
|
6
|
-
* process `unhandledRejection` events. Later same-session tasks still run
|
|
6
|
+
* process `unhandledRejection` events. Later same-session tasks still run
|
|
7
|
+
* unless {@link clear} invalidated the generation.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle ordering:
|
|
10
|
+
* 1. First `enqueue` creates a live map row (generation token).
|
|
11
|
+
* 2. The row stays registered for the session lifetime — including when
|
|
12
|
+
* `pending === 0` between inbound handlers. Clients send continuously and
|
|
13
|
+
* agents fan out on timers; "no handler in flight" is not "session gone".
|
|
14
|
+
* 3. `clear(sessionId)` aborts live work and removes the row (session_end).
|
|
15
|
+
* 4. Old task `finally` only mutates the captured state object; it never
|
|
16
|
+
* deletes a newer generation's map entry.
|
|
17
|
+
* 5. No per-session tombstone map — callers must `clear` ended sessions so
|
|
18
|
+
* unique-ID churn leaves no residue.
|
|
7
19
|
*/
|
|
20
|
+
export class SessionSerialQueueCancellationError extends Error {
|
|
21
|
+
sessionId;
|
|
22
|
+
generation;
|
|
23
|
+
code = "SESSION_SERIAL_QUEUE_CANCELLED";
|
|
24
|
+
constructor(sessionId, generation) {
|
|
25
|
+
super(`session serial queue cancelled (sessionId=${sessionId}, generation=${generation})`);
|
|
26
|
+
this.sessionId = sessionId;
|
|
27
|
+
this.generation = generation;
|
|
28
|
+
this.name = "SessionSerialQueueCancellationError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
8
31
|
export class SessionSerialQueue {
|
|
9
|
-
|
|
32
|
+
sessions = new Map();
|
|
33
|
+
/** Monotonic token source — never reused across clear/enqueue cycles. */
|
|
34
|
+
nextGeneration = 1;
|
|
35
|
+
/**
|
|
36
|
+
* Enqueue work for `sessionId`. Returns a promise that settles when this
|
|
37
|
+
* task finishes, is skipped as stale, or is cancelled by {@link clear}.
|
|
38
|
+
* Fire-and-forget callers may ignore the return value (compat).
|
|
39
|
+
*/
|
|
10
40
|
enqueue(sessionId, task) {
|
|
11
|
-
const
|
|
41
|
+
const state = this.ensureState(sessionId);
|
|
42
|
+
const captured = state;
|
|
43
|
+
const generation = captured.generation;
|
|
44
|
+
captured.pending += 1;
|
|
45
|
+
const previous = captured.tail;
|
|
46
|
+
let taskAbort = null;
|
|
12
47
|
const settled = previous
|
|
13
48
|
.catch(() => undefined)
|
|
14
|
-
.then(() =>
|
|
15
|
-
.
|
|
49
|
+
.then(async () => {
|
|
50
|
+
if (this.sessions.get(sessionId) !== captured) {
|
|
51
|
+
return "cancelled";
|
|
52
|
+
}
|
|
53
|
+
const abort = new AbortController();
|
|
54
|
+
taskAbort = abort;
|
|
55
|
+
captured.abort = abort;
|
|
56
|
+
const context = {
|
|
57
|
+
sessionId,
|
|
58
|
+
generation,
|
|
59
|
+
signal: abort.signal,
|
|
60
|
+
};
|
|
61
|
+
try {
|
|
62
|
+
await Promise.resolve(task(abort.signal, context));
|
|
63
|
+
if (this.sessions.get(sessionId) !== captured) {
|
|
64
|
+
return "cancelled";
|
|
65
|
+
}
|
|
66
|
+
return "completed";
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (abort.signal.aborted ||
|
|
70
|
+
this.sessions.get(sessionId) !== captured ||
|
|
71
|
+
error instanceof SessionSerialQueueCancellationError) {
|
|
72
|
+
return "cancelled";
|
|
73
|
+
}
|
|
74
|
+
return "failed";
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
if (captured.abort === abort) {
|
|
78
|
+
captured.abort = null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
})
|
|
16
82
|
.finally(() => {
|
|
17
|
-
|
|
18
|
-
|
|
83
|
+
// Only the captured state identity may be mutated by this task.
|
|
84
|
+
// Do not delete the map row when pending hits 0 — the session stays
|
|
85
|
+
// live until {@link clear} (session_end). Idle-delete broke timer
|
|
86
|
+
// fan-out / isLive for still-connected sessions.
|
|
87
|
+
captured.pending = Math.max(0, captured.pending - 1);
|
|
88
|
+
if (taskAbort && captured.abort === taskAbort) {
|
|
89
|
+
captured.abort = null;
|
|
19
90
|
}
|
|
20
91
|
});
|
|
21
|
-
|
|
92
|
+
captured.tail = settled;
|
|
93
|
+
return settled;
|
|
22
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Invalidate queued + running work for `sessionId`. Aborts the live AbortSignal,
|
|
97
|
+
* drops the map entry, and leaves a fresh identity for the next enqueue.
|
|
98
|
+
* Old in-flight `finally` blocks only touch their captured state object.
|
|
99
|
+
*/
|
|
23
100
|
clear(sessionId) {
|
|
24
|
-
this.
|
|
101
|
+
const old = this.sessions.get(sessionId);
|
|
102
|
+
if (!old)
|
|
103
|
+
return;
|
|
104
|
+
old.abort?.abort();
|
|
105
|
+
old.abort = null;
|
|
106
|
+
// Remove live identity — do not mutate old.generation / splice into old row.
|
|
107
|
+
this.sessions.delete(sessionId);
|
|
25
108
|
}
|
|
26
109
|
clearAll() {
|
|
27
|
-
this.
|
|
110
|
+
for (const sessionId of [...this.sessions.keys()]) {
|
|
111
|
+
this.clear(sessionId);
|
|
112
|
+
}
|
|
28
113
|
}
|
|
29
114
|
hasPending(sessionId) {
|
|
30
|
-
return this.
|
|
115
|
+
return (this.sessions.get(sessionId)?.pending ?? 0) > 0;
|
|
116
|
+
}
|
|
117
|
+
/** Live generation token for a session, or `undefined` when cleared. */
|
|
118
|
+
generationOf(sessionId) {
|
|
119
|
+
return this.sessions.get(sessionId)?.generation;
|
|
120
|
+
}
|
|
121
|
+
/** True when `generation` is the live map entry for `sessionId`. */
|
|
122
|
+
isCurrentGeneration(sessionId, generation) {
|
|
123
|
+
return this.sessions.get(sessionId)?.generation === generation;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* True when a queue row exists for the session (registered since first
|
|
127
|
+
* enqueue, until {@link clear}). Not the same as {@link hasPending}.
|
|
128
|
+
*/
|
|
129
|
+
isLive(sessionId) {
|
|
130
|
+
return this.sessions.has(sessionId);
|
|
131
|
+
}
|
|
132
|
+
/** Registered session rows (must not grow without matching `clear` calls). */
|
|
133
|
+
get activeSessionCount() {
|
|
134
|
+
return this.sessions.size;
|
|
135
|
+
}
|
|
136
|
+
ensureState(sessionId) {
|
|
137
|
+
const existing = this.sessions.get(sessionId);
|
|
138
|
+
if (existing)
|
|
139
|
+
return existing;
|
|
140
|
+
const created = {
|
|
141
|
+
generation: this.nextGeneration++,
|
|
142
|
+
tail: Promise.resolve(),
|
|
143
|
+
abort: null,
|
|
144
|
+
pending: 0,
|
|
145
|
+
};
|
|
146
|
+
this.sessions.set(sessionId, created);
|
|
147
|
+
return created;
|
|
31
148
|
}
|
|
32
149
|
}
|
|
33
150
|
//# sourceMappingURL=session-serial-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-serial-queue.js","sourceRoot":"","sources":["../src/session-serial-queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-serial-queue.js","sourceRoot":"","sources":["../src/session-serial-queue.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voicethere/agent",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"description": "VoiceThere customer agent SDK — IPC types and runtime helpers for sandboxed child bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -75,9 +75,9 @@
|
|
|
75
75
|
"@node-webrtc-rust/sdk": ">=0.6.5"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@node-webrtc-rust/helpers": "^0.6.
|
|
79
|
-
"@node-webrtc-rust/sdk": "0.6.
|
|
80
|
-
"@node-webrtc-rust/signaling": "0.6.
|
|
78
|
+
"@node-webrtc-rust/helpers": "^0.6.17",
|
|
79
|
+
"@node-webrtc-rust/sdk": "0.6.17",
|
|
80
|
+
"@node-webrtc-rust/signaling": "0.6.17",
|
|
81
81
|
"@types/node": "^22.10.0",
|
|
82
82
|
"http-server": "^14.1.1",
|
|
83
83
|
"ioredis": "^5.11.1",
|