@voxagent/bridge 0.3.6 → 0.4.1

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 (55) hide show
  1. package/README.md +30 -0
  2. package/dist/cli.js +35 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +26 -2
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +46 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/drivers/claude.d.ts.map +1 -1
  9. package/dist/drivers/claude.js +6 -1
  10. package/dist/drivers/claude.js.map +1 -1
  11. package/dist/drivers/codex.d.ts.map +1 -1
  12. package/dist/drivers/codex.js +5 -1
  13. package/dist/drivers/codex.js.map +1 -1
  14. package/dist/drivers/types.d.ts +9 -0
  15. package/dist/drivers/types.d.ts.map +1 -1
  16. package/dist/pair.d.ts +6 -0
  17. package/dist/pair.d.ts.map +1 -1
  18. package/dist/pair.js +1 -0
  19. package/dist/pair.js.map +1 -1
  20. package/dist/protocol.d.ts +103 -2
  21. package/dist/protocol.d.ts.map +1 -1
  22. package/dist/protocol.js.map +1 -1
  23. package/dist/room.d.ts +20 -0
  24. package/dist/room.d.ts.map +1 -1
  25. package/dist/room.js +220 -8
  26. package/dist/room.js.map +1 -1
  27. package/dist/trigger/addressing.d.ts +40 -0
  28. package/dist/trigger/addressing.d.ts.map +1 -0
  29. package/dist/trigger/addressing.js +90 -0
  30. package/dist/trigger/addressing.js.map +1 -0
  31. package/dist/trigger/decide.d.ts +33 -0
  32. package/dist/trigger/decide.d.ts.map +1 -0
  33. package/dist/trigger/decide.js +133 -0
  34. package/dist/trigger/decide.js.map +1 -0
  35. package/dist/trigger/effort.d.ts +26 -0
  36. package/dist/trigger/effort.d.ts.map +1 -0
  37. package/dist/trigger/effort.js +66 -0
  38. package/dist/trigger/effort.js.map +1 -0
  39. package/dist/trigger/engine.d.ts +120 -0
  40. package/dist/trigger/engine.d.ts.map +1 -0
  41. package/dist/trigger/engine.js +515 -0
  42. package/dist/trigger/engine.js.map +1 -0
  43. package/dist/trigger/jev.d.ts +52 -0
  44. package/dist/trigger/jev.d.ts.map +1 -0
  45. package/dist/trigger/jev.js +204 -0
  46. package/dist/trigger/jev.js.map +1 -0
  47. package/dist/trigger/questions.d.ts +43 -0
  48. package/dist/trigger/questions.d.ts.map +1 -0
  49. package/dist/trigger/questions.js +243 -0
  50. package/dist/trigger/questions.js.map +1 -0
  51. package/dist/trigger/types.d.ts +175 -0
  52. package/dist/trigger/types.d.ts.map +1 -0
  53. package/dist/trigger/types.js +29 -0
  54. package/dist/trigger/types.js.map +1 -0
  55. package/package.json +11 -10
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/trigger/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,515 @@
1
+ /**
2
+ * @file Trigger engine — turns a stream of finalized transcript lines into
3
+ * agent actions.
4
+ *
5
+ * Owns the state a pure function can't: the transcript window, the utterance
6
+ * being held while a speaker finishes a thought, the pending nudge, and the
7
+ * classifier circuit breaker. All judgment lives in `decide.ts`; all I/O goes
8
+ * through the injected `Classifier` and `TriggerHost`, so this file has no
9
+ * transport or network imports and runs under fake timers in tests.
10
+ *
11
+ * Ordering: lines are processed one at a time through a promise chain. A
12
+ * speaker's second fragment must see the hold created by their first, and a
13
+ * classifier call takes 100-500 ms — without serialization "Hey Vox, can you"
14
+ * + "check the logs" would race into two runs. Hard stops bypass the chain.
15
+ */
16
+ import { randomUUID } from 'node:crypto';
17
+ import { log } from '../logging.js';
18
+ import { createInitialAddressingState, evaluateAddressing, isAffirmative, isHardStop, isNegative, mentionsAgentName, noteAgentRunEnded, } from './addressing.js';
19
+ import { decide } from './decide.js';
20
+ import { planRun } from './effort.js';
21
+ import { DEFAULT_TRIGGER_SETTINGS, } from './types.js';
22
+ /** Lines kept for classifier context. */
23
+ const WINDOW_CAPACITY = 60;
24
+ /** Lines handed to the LLM with a prompt — matches the legacy browser path. */
25
+ const PROMPT_WINDOW_LINES = 12;
26
+ const SEEN_ENTRY_CAPACITY = 256;
27
+ /** Speech seen this recently means the held speaker is still talking. */
28
+ const ACTIVITY_GRACE_MS = 1200;
29
+ const ACTIVITY_RECHECK_MS = 900;
30
+ /** A hold never outlives this, however long the speaker keeps going. */
31
+ const MAX_TOTAL_HOLD_MS = 12_000;
32
+ const BREAKER_FAILURES = 3;
33
+ const BREAKER_OPEN_MS = 30_000;
34
+ const DECISION_TEXT_CHARS = 160;
35
+ const REAL_TIMERS = {
36
+ set: (callback, ms) => setTimeout(callback, ms),
37
+ clear: (handle) => clearTimeout(handle),
38
+ };
39
+ function round2(value) {
40
+ return Math.round(value * 100) / 100;
41
+ }
42
+ function flattenSignals(answers) {
43
+ const signals = {
44
+ 'addressee.agent': round2(answers.addressee.probabilities.agent ?? 0),
45
+ thought_complete: round2(answers.thoughtComplete),
46
+ is_request: round2(answers.isRequest),
47
+ agent_capable: round2(answers.agentCapable),
48
+ hypothetical: round2(answers.hypotheticalOrQuoted),
49
+ effort: round2(answers.effort.score),
50
+ risk: round2(answers.risk.score),
51
+ humans_disagree: round2(answers.humansDisagree),
52
+ };
53
+ if (answers.addressee.choice !== 'agent') {
54
+ signals[`addressee.${answers.addressee.choice}`] = round2(answers.addressee.probabilities[answers.addressee.choice] ?? 0);
55
+ }
56
+ if (answers.relation) {
57
+ signals[`relation.${answers.relation.choice}`] = round2(answers.relation.probabilities[answers.relation.choice] ?? 0);
58
+ }
59
+ return signals;
60
+ }
61
+ function mergeLines(lines) {
62
+ const last = lines[lines.length - 1];
63
+ if (lines.length === 1)
64
+ return last;
65
+ const confidences = lines
66
+ .map((line) => line.confidence)
67
+ .filter((value) => value !== undefined);
68
+ return {
69
+ ...last,
70
+ text: lines.map((line) => line.text.trim()).join(' '),
71
+ ...(confidences.length > 0 ? { confidence: Math.min(...confidences) } : {}),
72
+ };
73
+ }
74
+ export class TriggerEngine {
75
+ options;
76
+ settings;
77
+ now;
78
+ timers;
79
+ newId;
80
+ window = [];
81
+ seenEntryIds = new Set();
82
+ chain = Promise.resolve();
83
+ hold = null;
84
+ pendingNudge = null;
85
+ lastNudgeAtMs = Number.NEGATIVE_INFINITY;
86
+ lastActivityAtMs = new Map();
87
+ lastAgentText = null;
88
+ lastAgentSpokeAtMs = null;
89
+ addressingState = createInitialAddressingState();
90
+ consecutiveFailures = 0;
91
+ breakerOpenUntilMs = 0;
92
+ disposed = false;
93
+ constructor(options) {
94
+ this.options = options;
95
+ this.settings = { ...DEFAULT_TRIGGER_SETTINGS, ...options.settings };
96
+ this.now = options.now ?? Date.now;
97
+ this.timers = options.timers ?? REAL_TIMERS;
98
+ this.newId = options.newId ?? randomUUID;
99
+ }
100
+ /** Resolves once this line (and everything queued before it) is handled. */
101
+ onFinal(input) {
102
+ const text = input.text.trim();
103
+ if (this.disposed || text.length === 0)
104
+ return this.chain;
105
+ if (!this.rememberEntry(input.entryId))
106
+ return this.chain;
107
+ const line = {
108
+ entryId: input.entryId,
109
+ speaker: input.speaker,
110
+ speakerIdentity: input.speakerIdentity,
111
+ text,
112
+ timestampMs: input.timestampMs,
113
+ ...(input.confidence !== undefined ? { confidence: input.confidence } : {}),
114
+ };
115
+ // A spoken "stop" must never wait behind a classifier call or depend on
116
+ // one being available.
117
+ if (this.options.host.getRunSnapshot().status !== 'idle' && isHardStop(text)) {
118
+ this.pushWindow(line);
119
+ this.clearHold();
120
+ this.options.host.abort();
121
+ this.publishDecision(line, { kind: 'abort', reason: 'spoken stop command' }, 'rule', null);
122
+ return this.chain;
123
+ }
124
+ this.chain = this.chain
125
+ .then(() => this.process(line, input.room))
126
+ .catch((error) => {
127
+ log.error('trigger_process_failed', {
128
+ message: error instanceof Error ? error.message : String(error),
129
+ });
130
+ });
131
+ return this.chain;
132
+ }
133
+ /** Interim speech from a speaker — keeps their hold open while they talk. */
134
+ onSpeechActivity(speakerIdentity) {
135
+ this.lastActivityAtMs.set(speakerIdentity, this.now());
136
+ }
137
+ onNudgeResponse(nudgeId, decision) {
138
+ const nudge = this.pendingNudge;
139
+ if (!nudge || nudge.id !== nudgeId)
140
+ return;
141
+ if (decision === 'accept')
142
+ this.acceptNudge();
143
+ else
144
+ this.endNudge();
145
+ }
146
+ /** The agent finished saying something; keeps it in the classifier's view. */
147
+ noteAgentSaid(text) {
148
+ const trimmed = text.trim();
149
+ if (trimmed.length === 0)
150
+ return;
151
+ const nowMs = this.now();
152
+ this.lastAgentText = trimmed;
153
+ this.lastAgentSpokeAtMs = nowMs;
154
+ this.pushWindow({
155
+ entryId: `agent-${this.newId()}`,
156
+ speaker: this.options.agent.names[0] ?? 'Agent',
157
+ speakerIdentity: 'agent',
158
+ text: trimmed,
159
+ timestampMs: nowMs,
160
+ fromAgent: true,
161
+ });
162
+ }
163
+ noteRunEnded() {
164
+ const nowMs = this.now();
165
+ this.lastAgentSpokeAtMs = nowMs;
166
+ this.addressingState = noteAgentRunEnded(this.addressingState, nowMs);
167
+ }
168
+ dispose() {
169
+ this.disposed = true;
170
+ this.clearHold();
171
+ if (this.pendingNudge)
172
+ this.timers.clear(this.pendingNudge.timer);
173
+ this.pendingNudge = null;
174
+ }
175
+ rememberEntry(entryId) {
176
+ if (this.seenEntryIds.has(entryId))
177
+ return false;
178
+ this.seenEntryIds.add(entryId);
179
+ while (this.seenEntryIds.size > SEEN_ENTRY_CAPACITY) {
180
+ const oldest = this.seenEntryIds.values().next().value;
181
+ if (oldest === undefined)
182
+ break;
183
+ this.seenEntryIds.delete(oldest);
184
+ }
185
+ return true;
186
+ }
187
+ pushWindow(line) {
188
+ this.window.push(line);
189
+ if (this.window.length > WINDOW_CAPACITY) {
190
+ this.window = this.window.slice(this.window.length - WINDOW_CAPACITY);
191
+ }
192
+ }
193
+ async process(line, room) {
194
+ if (this.disposed)
195
+ return;
196
+ const nudge = this.pendingNudge;
197
+ if (nudge && nudge.utterance.speakerIdentity === line.speakerIdentity) {
198
+ if (isAffirmative(line.text)) {
199
+ this.pushWindow(line);
200
+ this.publishDecision(line, { kind: 'run', reason: 'spoken yes to the nudge' }, 'rule', null);
201
+ this.acceptNudge();
202
+ return;
203
+ }
204
+ if (isNegative(line.text)) {
205
+ this.pushWindow(line);
206
+ this.publishDecision(line, { kind: 'ignore', reason: 'spoken no to the nudge' }, 'rule', null);
207
+ this.endNudge();
208
+ return;
209
+ }
210
+ }
211
+ // Same speaker continuing a held thought → judge the merged burst.
212
+ const held = this.hold && this.hold.speakerIdentity === line.speakerIdentity ? this.hold : null;
213
+ const lines = held ? [...held.lines, line] : [line];
214
+ if (held)
215
+ this.timers.clear(held.timer);
216
+ const heldIds = new Set(lines.map((entry) => entry.entryId));
217
+ const context = this.window.filter((entry) => !heldIds.has(entry.entryId));
218
+ this.pushWindow(line);
219
+ const utterance = mergeLines(lines);
220
+ const result = await this.classify(utterance, context, room);
221
+ if (this.disposed)
222
+ return;
223
+ const { action, source, shadowAction } = this.chooseAction(utterance, line, room, result, false);
224
+ this.publishDecision(utterance, action, source, result, shadowAction);
225
+ this.apply(action, {
226
+ utterance,
227
+ lines,
228
+ room,
229
+ result: source === 'jev' ? result : null,
230
+ startedAtMs: held?.startedAtMs ?? this.now(),
231
+ });
232
+ }
233
+ classifierUsable() {
234
+ if (this.options.mode === 'regex' || !this.options.classifier)
235
+ return false;
236
+ return this.now() >= this.breakerOpenUntilMs;
237
+ }
238
+ async classify(utterance, context, room) {
239
+ const classifier = this.options.classifier;
240
+ if (!classifier || !this.classifierUsable())
241
+ return null;
242
+ try {
243
+ const result = await classifier.classify({
244
+ utterance,
245
+ window: context,
246
+ room,
247
+ run: this.options.host.getRunSnapshot(),
248
+ agent: this.options.agent,
249
+ pendingNudgeText: this.pendingNudge?.utterance.text ?? null,
250
+ lastAgentText: this.lastAgentText,
251
+ lastAgentSpokeAtMs: this.lastAgentSpokeAtMs,
252
+ nowMs: this.now(),
253
+ });
254
+ this.consecutiveFailures = 0;
255
+ return result;
256
+ }
257
+ catch (error) {
258
+ this.consecutiveFailures += 1;
259
+ const opened = this.consecutiveFailures >= BREAKER_FAILURES;
260
+ if (opened) {
261
+ this.breakerOpenUntilMs = this.now() + BREAKER_OPEN_MS;
262
+ this.consecutiveFailures = 0;
263
+ }
264
+ log.warn('trigger_classifier_failed', {
265
+ message: error instanceof Error ? error.message : String(error),
266
+ fallback: 'wake phrase',
267
+ ...(opened ? { pausedForMs: BREAKER_OPEN_MS } : {}),
268
+ });
269
+ return null;
270
+ }
271
+ }
272
+ chooseAction(utterance, newestLine, room, result, forceComplete) {
273
+ // Re-read: the run may have started or ended while the classifier ran.
274
+ const run = this.options.host.getRunSnapshot();
275
+ const jevAction = result
276
+ ? decide({
277
+ answers: result.answers,
278
+ run,
279
+ nameMentioned: mentionsAgentName(utterance.text),
280
+ humanCount: Math.max(1, room.participants.length),
281
+ forceComplete,
282
+ canNudge: this.canNudge(),
283
+ settings: this.settings,
284
+ })
285
+ : null;
286
+ if (jevAction && this.options.mode === 'jev')
287
+ return { action: jevAction, source: 'jev' };
288
+ const regexAction = this.decideByRegex(newestLine, run);
289
+ return {
290
+ action: regexAction,
291
+ source: 'regex',
292
+ ...(jevAction ? { shadowAction: jevAction.kind } : {}),
293
+ };
294
+ }
295
+ decideByRegex(line, run) {
296
+ const decision = evaluateAddressing({
297
+ text: line.text,
298
+ speakerId: line.speakerIdentity,
299
+ state: this.addressingState,
300
+ nowMs: this.now(),
301
+ });
302
+ this.addressingState = decision.nextState;
303
+ if (!decision.addressed)
304
+ return { kind: 'ignore', reason: `wake phrase: ${decision.reason}` };
305
+ return run.status === 'idle'
306
+ ? { kind: 'run', reason: `wake phrase: ${decision.reason}` }
307
+ : { kind: 'supersede', reason: `wake phrase: ${decision.reason}` };
308
+ }
309
+ canNudge() {
310
+ return (this.pendingNudge === null &&
311
+ this.now() - this.lastNudgeAtMs >= this.settings.nudgeCooldownMs);
312
+ }
313
+ apply(action, ctx) {
314
+ const hadHold = this.hold !== null && this.hold.speakerIdentity === ctx.utterance.speakerIdentity;
315
+ switch (action.kind) {
316
+ case 'hold': {
317
+ // One hold at a time. A second speaker addressing the agent
318
+ // mid-hold takes over; the first speaker's fragment stays in the
319
+ // transcript window as context.
320
+ if (this.hold && !hadHold)
321
+ this.timers.clear(this.hold.timer);
322
+ const id = this.newId();
323
+ const elapsed = this.now() - ctx.startedAtMs;
324
+ const waitMs = Math.max(0, Math.min(action.waitMs, MAX_TOTAL_HOLD_MS - elapsed));
325
+ this.hold = {
326
+ id,
327
+ speakerIdentity: ctx.utterance.speakerIdentity,
328
+ lines: ctx.lines,
329
+ room: ctx.room,
330
+ result: ctx.result,
331
+ startedAtMs: ctx.startedAtMs,
332
+ timer: this.timers.set(() => this.onHoldTimer(id), waitMs),
333
+ };
334
+ this.options.host.publishAttention({
335
+ state: 'listening',
336
+ speaker: ctx.utterance.speaker,
337
+ text: ctx.utterance.text,
338
+ });
339
+ return;
340
+ }
341
+ case 'run':
342
+ case 'append':
343
+ case 'supersede':
344
+ case 'queue': {
345
+ if (hadHold)
346
+ this.hold = null;
347
+ if (this.pendingNudge)
348
+ this.endNudge();
349
+ this.startRun(ctx.utterance, ctx.room, ctx.result, action.kind === 'run' ? 'supersede' : action.kind);
350
+ return;
351
+ }
352
+ case 'nudge': {
353
+ if (hadHold)
354
+ this.releaseHold();
355
+ this.startNudge(action.nudgeKind, ctx.utterance, ctx.room, ctx.result);
356
+ return;
357
+ }
358
+ case 'stop_talking':
359
+ if (hadHold)
360
+ this.releaseHold();
361
+ this.options.host.stopTalking();
362
+ return;
363
+ case 'abort':
364
+ this.clearHold();
365
+ this.options.host.abort();
366
+ return;
367
+ default:
368
+ if (hadHold)
369
+ this.releaseHold();
370
+ }
371
+ }
372
+ onHoldTimer(holdId) {
373
+ this.chain = this.chain
374
+ .then(() => this.resolveHold(holdId))
375
+ .catch((error) => {
376
+ log.error('trigger_hold_failed', {
377
+ message: error instanceof Error ? error.message : String(error),
378
+ });
379
+ });
380
+ }
381
+ resolveHold(holdId) {
382
+ const hold = this.hold;
383
+ if (this.disposed || !hold || hold.id !== holdId)
384
+ return;
385
+ const nowMs = this.now();
386
+ const lastActivity = this.lastActivityAtMs.get(hold.speakerIdentity) ?? Number.NEGATIVE_INFINITY;
387
+ const stillTalking = nowMs - lastActivity < ACTIVITY_GRACE_MS;
388
+ if (stillTalking && nowMs - hold.startedAtMs < MAX_TOTAL_HOLD_MS) {
389
+ hold.timer = this.timers.set(() => this.onHoldTimer(holdId), ACTIVITY_RECHECK_MS);
390
+ return;
391
+ }
392
+ // Silence: the speaker isn't going to finish. Act on what we have.
393
+ const utterance = mergeLines(hold.lines);
394
+ const newest = hold.lines[hold.lines.length - 1];
395
+ const { action, source } = hold.result
396
+ ? this.chooseAction(utterance, newest, hold.room, hold.result, true)
397
+ : { action: { kind: 'run', reason: 'hold timed out' }, source: 'regex' };
398
+ this.publishDecision(utterance, { ...action, reason: `hold timed out → ${action.reason}` }, source, hold.result);
399
+ this.apply(action, {
400
+ utterance,
401
+ lines: hold.lines,
402
+ room: hold.room,
403
+ result: hold.result,
404
+ startedAtMs: hold.startedAtMs,
405
+ });
406
+ }
407
+ clearHold() {
408
+ if (!this.hold)
409
+ return;
410
+ this.timers.clear(this.hold.timer);
411
+ this.releaseHold();
412
+ }
413
+ /** Drops the hold and retires the Listening state on every browser. */
414
+ releaseHold() {
415
+ this.hold = null;
416
+ if (!this.pendingNudge)
417
+ this.options.host.publishAttention({ state: 'idle' });
418
+ }
419
+ buildPlan(utterance, result) {
420
+ const plan = planRun({
421
+ effort: result?.answers.effort ?? null,
422
+ backend: this.options.backend,
423
+ autoModel: this.options.autoModel,
424
+ modelOverrides: this.options.modelOverrides ?? null,
425
+ ack: this.options.ack,
426
+ });
427
+ if (result && result.answers.humansDisagree >= this.settings.disagreeThreshold) {
428
+ const hostName = this.options.agent.hostName;
429
+ const speakerIsHost = this.options.hostIdentity !== null &&
430
+ utterance.speakerIdentity === this.options.hostIdentity;
431
+ plan.addendum = [
432
+ speakerIsHost
433
+ ? `Participants disagree about what you should do. ${hostName} is the host and gave this instruction, so follow it — but say in one sentence what the other view was.`
434
+ : `Participants disagree about what you should do. Do not pick a side silently: lay out the options in a sentence each and ask who decides. ${hostName} is the host if someone needs to break the tie.`,
435
+ ];
436
+ }
437
+ return plan;
438
+ }
439
+ startRun(utterance, room, result, disposition, plan = this.buildPlan(utterance, result)) {
440
+ this.options.host.startRun({
441
+ promptId: this.newId(),
442
+ speaker: utterance.speaker,
443
+ speakerIdentity: utterance.speakerIdentity,
444
+ text: utterance.text,
445
+ window: this.window.slice(-PROMPT_WINDOW_LINES),
446
+ room,
447
+ disposition,
448
+ plan,
449
+ });
450
+ }
451
+ startNudge(nudgeKind, utterance, room, result) {
452
+ const id = this.newId();
453
+ const nowMs = this.now();
454
+ this.lastNudgeAtMs = nowMs;
455
+ this.pendingNudge = {
456
+ id,
457
+ utterance,
458
+ room,
459
+ plan: this.buildPlan(utterance, result),
460
+ timer: this.timers.set(() => {
461
+ if (this.pendingNudge?.id === id)
462
+ this.endNudge();
463
+ }, this.settings.nudgeTtlMs),
464
+ };
465
+ this.options.host.publishAttention({
466
+ state: 'nudge',
467
+ nudgeId: id,
468
+ nudgeKind,
469
+ speaker: utterance.speaker,
470
+ text: utterance.text,
471
+ expiresAtMs: nowMs + this.settings.nudgeTtlMs,
472
+ });
473
+ }
474
+ acceptNudge() {
475
+ const nudge = this.pendingNudge;
476
+ if (!nudge)
477
+ return;
478
+ this.timers.clear(nudge.timer);
479
+ this.pendingNudge = null;
480
+ this.options.host.publishAttention({ state: 'idle' });
481
+ // Never let an accepted offer cut off work already in progress.
482
+ const busy = this.options.host.getRunSnapshot().status !== 'idle';
483
+ this.startRun(nudge.utterance, nudge.room, null, busy ? 'queue' : 'supersede', nudge.plan);
484
+ }
485
+ endNudge() {
486
+ const nudge = this.pendingNudge;
487
+ if (!nudge)
488
+ return;
489
+ this.timers.clear(nudge.timer);
490
+ this.pendingNudge = null;
491
+ this.options.host.publishAttention({ state: 'idle' });
492
+ }
493
+ publishDecision(utterance, action, source, result, shadowAction) {
494
+ log.debug('trigger_decision', {
495
+ action: action.kind,
496
+ source,
497
+ reason: action.reason,
498
+ ...(result ? { latencyMs: result.latencyMs } : {}),
499
+ ...(shadowAction ? { shadowAction } : {}),
500
+ });
501
+ this.options.host.publishDecision({
502
+ entryId: utterance.entryId,
503
+ speaker: utterance.speaker,
504
+ text: utterance.text.length > DECISION_TEXT_CHARS
505
+ ? `${utterance.text.slice(0, DECISION_TEXT_CHARS - 1)}…`
506
+ : utterance.text,
507
+ action: action.kind,
508
+ source,
509
+ reason: action.reason,
510
+ ...(result ? { latencyMs: result.latencyMs, signals: flattenSignals(result.answers) } : {}),
511
+ ...(shadowAction ? { shadowAction } : {}),
512
+ });
513
+ }
514
+ }
515
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/trigger/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @file TypeSafe jev ("System One") client.
3
+ *
4
+ * Raw HTTP on purpose: the bridge is launched via `npx`, `undici` is already
5
+ * a dependency, and the wire format is three fields in, one map out.
6
+ *
7
+ * POST https://api.typesafe.ai/v1/systemone
8
+ * { model, state, questions } → { model, answers, usage }
9
+ *
10
+ * All questions in one request are evaluated in parallel server-side, so the
11
+ * whole question set costs one round-trip.
12
+ */
13
+ import type { Classifier, ClassifyInput, ClassifyResult, TriggerAnswers } from './types.js';
14
+ export declare const DEFAULT_JEV_BASE_URL = "https://api.typesafe.ai";
15
+ /**
16
+ * Pinned, not `jev-latest`: thresholds in `decide.ts` are tuned against one
17
+ * version's calibration. Bump deliberately and re-run the eval.
18
+ */
19
+ export declare const DEFAULT_JEV_MODEL = "jev-1.13.0";
20
+ export declare const DEFAULT_JEV_TIMEOUT_MS = 900;
21
+ export interface JevClassifierOptions {
22
+ apiKey: string;
23
+ baseUrl?: string;
24
+ model?: string;
25
+ timeoutMs?: number;
26
+ }
27
+ type RawAnswer = Record<string, unknown> | undefined;
28
+ /** Exported for tests and the eval script. */
29
+ export declare function parseAnswers(answers: Record<string, RawAnswer>, runActive: boolean): TriggerAnswers;
30
+ export declare class JevClassifier implements Classifier {
31
+ private readonly options;
32
+ private readonly baseUrl;
33
+ private readonly model;
34
+ private readonly timeoutMs;
35
+ constructor(options: JevClassifierOptions);
36
+ classify(input: ClassifyInput, timeoutMs?: number): Promise<ClassifyResult>;
37
+ /** Repeats a throwaway classify until one lands inside the live budget. */
38
+ private warmClassifyPath;
39
+ /**
40
+ * Checks the key, then warms the REAL classify path before anyone speaks.
41
+ *
42
+ * Measured against the live API: the first ~3 `/v1/systemone` calls of a
43
+ * process take 0.7-2 s, then settle around 300 ms. Pinging `/v1/models`
44
+ * alone does not fix that. Left cold, the first utterances of every meeting
45
+ * would blow the timeout, and three in a row trip the engine's circuit
46
+ * breaker — so the agent would open each session deaf to everything but
47
+ * the wake phrase. Costs a few thousand input tokens, once.
48
+ */
49
+ warmUp(): Promise<boolean>;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=jev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../src/trigger/jev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,OAAO,KAAK,EAEV,UAAU,EACV,aAAa,EACb,cAAc,EAEd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAC9D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;AAoErD,8CAA8C;AAC9C,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAClC,SAAS,EAAE,OAAO,GACjB,cAAc,CAchB;AAED,qBAAa,aAAc,YAAW,UAAU;IAKlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,OAAO,EAAE,oBAAoB;IAMpD,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,GAAE,MAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuCjG,2EAA2E;YAC7D,gBAAgB;IAiB9B;;;;;;;;;OASG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CA6BjC"}