@kuralle-syrinx/core 4.4.0 → 4.5.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/dist/audio/alaw.d.ts +3 -0
- package/dist/audio/alaw.d.ts.map +1 -0
- package/dist/audio/alaw.js +53 -0
- package/dist/audio/alaw.js.map +1 -0
- package/dist/audio/g722.d.ts +39 -0
- package/dist/audio/g722.d.ts.map +1 -0
- package/dist/audio/g722.js +286 -0
- package/dist/audio/g722.js.map +1 -0
- package/dist/audio/index.d.ts +7 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/loudness.d.ts +13 -0
- package/dist/audio/loudness.d.ts.map +1 -0
- package/dist/audio/loudness.js +65 -0
- package/dist/audio/loudness.js.map +1 -0
- package/dist/audio/mulaw.d.ts +3 -0
- package/dist/audio/mulaw.d.ts.map +1 -0
- package/dist/audio/mulaw.js +39 -0
- package/dist/audio/mulaw.js.map +1 -0
- package/dist/audio/pcm.d.ts +5 -0
- package/dist/audio/pcm.d.ts.map +1 -0
- package/dist/audio/pcm.js +40 -0
- package/dist/audio/pcm.js.map +1 -0
- package/dist/audio/resample.d.ts +12 -0
- package/dist/audio/resample.d.ts.map +1 -0
- package/dist/audio/resample.js +157 -0
- package/dist/audio/resample.js.map +1 -0
- package/dist/audio-envelope.d.ts +23 -0
- package/dist/audio-envelope.d.ts.map +1 -0
- package/dist/audio-envelope.js +114 -0
- package/dist/audio-envelope.js.map +1 -0
- package/dist/confidence-to-wait.d.ts +12 -0
- package/dist/confidence-to-wait.d.ts.map +1 -0
- package/dist/confidence-to-wait.js +18 -0
- package/dist/confidence-to-wait.js.map +1 -0
- package/dist/conversation-event.d.ts +19 -0
- package/dist/conversation-event.d.ts.map +1 -0
- package/dist/conversation-event.js +44 -0
- package/dist/conversation-event.js.map +1 -0
- package/dist/error-handler.d.ts +35 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +136 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/idle-timeout.d.ts +69 -0
- package/dist/idle-timeout.d.ts.map +1 -0
- package/dist/idle-timeout.js +149 -0
- package/dist/idle-timeout.js.map +1 -0
- package/dist/incremental-unit.d.ts +17 -0
- package/dist/incremental-unit.d.ts.map +1 -0
- package/dist/incremental-unit.js +5 -0
- package/dist/incremental-unit.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/init-chain.d.ts +35 -0
- package/dist/init-chain.d.ts.map +1 -0
- package/dist/init-chain.js +102 -0
- package/dist/init-chain.js.map +1 -0
- package/dist/init-stage-order.d.ts +5 -0
- package/dist/init-stage-order.d.ts.map +1 -0
- package/dist/init-stage-order.js +74 -0
- package/dist/init-stage-order.js.map +1 -0
- package/dist/interaction-coordinator.d.ts +45 -0
- package/dist/interaction-coordinator.d.ts.map +1 -0
- package/dist/interaction-coordinator.js +197 -0
- package/dist/interaction-coordinator.js.map +1 -0
- package/dist/interaction-policy.d.ts +103 -0
- package/dist/interaction-policy.d.ts.map +1 -0
- package/dist/interaction-policy.js +6 -0
- package/dist/interaction-policy.js.map +1 -0
- package/dist/iu-ledger.d.ts +39 -0
- package/dist/iu-ledger.d.ts.map +1 -0
- package/dist/iu-ledger.js +90 -0
- package/dist/iu-ledger.js.map +1 -0
- package/dist/latency-filler-fixtures.d.ts +7 -0
- package/dist/latency-filler-fixtures.d.ts.map +1 -0
- package/dist/latency-filler-fixtures.js +10 -0
- package/dist/latency-filler-fixtures.js.map +1 -0
- package/dist/latency-filler.d.ts +29 -0
- package/dist/latency-filler.d.ts.map +1 -0
- package/dist/latency-filler.js +102 -0
- package/dist/latency-filler.js.map +1 -0
- package/dist/mode-switcher.d.ts +24 -0
- package/dist/mode-switcher.d.ts.map +1 -0
- package/dist/mode-switcher.js +83 -0
- package/dist/mode-switcher.js.map +1 -0
- package/dist/observability-observer.d.ts +36 -0
- package/dist/observability-observer.d.ts.map +1 -0
- package/dist/observability-observer.js +141 -0
- package/dist/observability-observer.js.map +1 -0
- package/dist/observability.d.ts +68 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +70 -0
- package/dist/observability.js.map +1 -0
- package/dist/packet-factories.d.ts +58 -0
- package/dist/packet-factories.d.ts.map +1 -0
- package/dist/packet-factories.js +181 -0
- package/dist/packet-factories.js.map +1 -0
- package/dist/packets.d.ts +532 -0
- package/dist/packets.d.ts.map +1 -0
- package/dist/packets.js +51 -0
- package/dist/packets.js.map +1 -0
- package/dist/pipeline-bus.d.ts +92 -0
- package/dist/pipeline-bus.d.ts.map +1 -0
- package/dist/pipeline-bus.js +294 -0
- package/dist/pipeline-bus.js.map +1 -0
- package/dist/plugin-contract.d.ts +73 -0
- package/dist/plugin-contract.d.ts.map +1 -0
- package/dist/plugin-contract.js +30 -0
- package/dist/plugin-contract.js.map +1 -0
- package/dist/policies/defer.d.ts +11 -0
- package/dist/policies/defer.d.ts.map +1 -0
- package/dist/policies/defer.js +13 -0
- package/dist/policies/defer.js.map +1 -0
- package/dist/policies/rule-based.d.ts +35 -0
- package/dist/policies/rule-based.d.ts.map +1 -0
- package/dist/policies/rule-based.js +130 -0
- package/dist/policies/rule-based.js.map +1 -0
- package/dist/pricing.d.ts +34 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +108 -0
- package/dist/pricing.js.map +1 -0
- package/dist/primary-speaker-fixtures.d.ts +12 -0
- package/dist/primary-speaker-fixtures.d.ts.map +1 -0
- package/dist/primary-speaker-fixtures.js +37 -0
- package/dist/primary-speaker-fixtures.js.map +1 -0
- package/dist/primary-speaker-gate.d.ts +42 -0
- package/dist/primary-speaker-gate.d.ts.map +1 -0
- package/dist/primary-speaker-gate.js +178 -0
- package/dist/primary-speaker-gate.js.map +1 -0
- package/dist/provider-fallback.d.ts +28 -0
- package/dist/provider-fallback.d.ts.map +1 -0
- package/dist/provider-fallback.js +72 -0
- package/dist/provider-fallback.js.map +1 -0
- package/dist/reasoner-hedge.d.ts +21 -0
- package/dist/reasoner-hedge.d.ts.map +1 -0
- package/dist/reasoner-hedge.js +170 -0
- package/dist/reasoner-hedge.js.map +1 -0
- package/dist/reasoner-route.d.ts +24 -0
- package/dist/reasoner-route.d.ts.map +1 -0
- package/dist/reasoner-route.js +87 -0
- package/dist/reasoner-route.js.map +1 -0
- package/dist/reasoner-session-store.d.ts +18 -0
- package/dist/reasoner-session-store.d.ts.map +1 -0
- package/dist/reasoner-session-store.js +21 -0
- package/dist/reasoner-session-store.js.map +1 -0
- package/dist/reasoner.d.ts +97 -0
- package/dist/reasoner.d.ts.map +1 -0
- package/dist/reasoner.js +9 -0
- package/dist/reasoner.js.map +1 -0
- package/dist/retry.d.ts +31 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +83 -0
- package/dist/retry.js.map +1 -0
- package/dist/scheduler.d.ts +11 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +20 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/spend-cap.d.ts +27 -0
- package/dist/spend-cap.d.ts.map +1 -0
- package/dist/spend-cap.js +38 -0
- package/dist/spend-cap.js.map +1 -0
- package/dist/tts-playout-clock.d.ts +43 -0
- package/dist/tts-playout-clock.d.ts.map +1 -0
- package/dist/tts-playout-clock.js +125 -0
- package/dist/tts-playout-clock.js.map +1 -0
- package/dist/turn-arbiter.d.ts +41 -0
- package/dist/turn-arbiter.d.ts.map +1 -0
- package/dist/turn-arbiter.js +259 -0
- package/dist/turn-arbiter.js.map +1 -0
- package/dist/voice-agent-session-util.d.ts +60 -0
- package/dist/voice-agent-session-util.d.ts.map +1 -0
- package/dist/voice-agent-session-util.js +204 -0
- package/dist/voice-agent-session-util.js.map +1 -0
- package/dist/voice-agent-session.d.ts +435 -0
- package/dist/voice-agent-session.d.ts.map +1 -0
- package/dist/voice-agent-session.js +1597 -0
- package/dist/voice-agent-session.js.map +1 -0
- package/dist/voice-text.d.ts +46 -0
- package/dist/voice-text.d.ts.map +1 -0
- package/dist/voice-text.js +209 -0
- package/dist/voice-text.js.map +1 -0
- package/package.json +19 -6
- package/src/audio/alaw.test.ts +87 -0
- package/src/audio/audio.test.ts +285 -0
- package/src/audio/g722.test.ts +149 -0
- package/src/audio/loudness.test.ts +58 -0
- package/src/audio-envelope.test.ts +167 -0
- package/src/confidence-to-wait.test.ts +21 -0
- package/src/error-handler.test.ts +56 -0
- package/src/hedge-throwing-backend.test.ts +46 -0
- package/src/interaction-coordinator.test.ts +529 -0
- package/src/iu-ledger.test.ts +276 -0
- package/src/latency-filler.test.ts +62 -0
- package/src/observability-observer.test.ts +248 -0
- package/src/observability.test.ts +94 -0
- package/src/packet-factories.test.ts +126 -0
- package/src/pipeline-bus.g10.test.ts +145 -0
- package/src/pipeline-bus.test.ts +211 -0
- package/src/policies/defer.test.ts +86 -0
- package/src/policies/rule-based.test.ts +334 -0
- package/src/pricing.test.ts +226 -0
- package/src/primary-speaker-gate.test.ts +150 -0
- package/src/provider-fallback.test.ts +87 -0
- package/src/reasoner-hedge.test.ts +361 -0
- package/src/reasoner-route.test.ts +248 -0
- package/src/reasoner.test.ts +69 -0
- package/src/retry.test.ts +83 -0
- package/src/route-throwing-spec.test.ts +44 -0
- package/src/spend-cap.test.ts +114 -0
- package/src/tts-playout-clock.test.ts +125 -0
- package/src/turn-arbiter.characterization.test.ts +477 -0
- package/src/turn-arbiter.test.ts +762 -0
- package/src/voice-agent-session.test.ts +4165 -0
- package/src/voice-text.test.ts +156 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// Syrinx Kernel v2 — Error Handler
|
|
4
|
+
//
|
|
5
|
+
// Categorizes errors from external service providers and determines
|
|
6
|
+
// whether they are recoverable (retry with backoff) or fatal (terminate session).
|
|
7
|
+
//
|
|
8
|
+
// Each component (STT, TTS, LLM) has its own categorization logic.
|
|
9
|
+
// The session manager uses these to decide retry vs. terminate.
|
|
10
|
+
import { ErrorCategory } from "./packets.js";
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Error Categorization
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Categorize an error from the STT provider.
|
|
16
|
+
*
|
|
17
|
+
* Heuristic:
|
|
18
|
+
* - HTTP 429 → RateLimit (recoverable)
|
|
19
|
+
* - Network errors (ECONNRESET, ETIMEDOUT, ENOTFOUND) → NetworkTimeout (recoverable)
|
|
20
|
+
* - HTTP 401/403 → Authentication (fatal)
|
|
21
|
+
* - HTTP 400/422 → InvalidInput (fatal)
|
|
22
|
+
* - HTTP 402 → ResourceExhausted (fatal)
|
|
23
|
+
* - Everything else → InternalFault (fatal)
|
|
24
|
+
*/
|
|
25
|
+
export function categorizeSttError(err) {
|
|
26
|
+
const msg = extractMessage(err).toLowerCase();
|
|
27
|
+
const code = extractHttpStatus(err);
|
|
28
|
+
if (code === 429 ||
|
|
29
|
+
msg.includes("rate limit") ||
|
|
30
|
+
msg.includes("rate_limit") ||
|
|
31
|
+
msg.includes("too many requests") ||
|
|
32
|
+
// Provider concurrency limits (e.g. Cartesia) — recoverable, retry with backoff.
|
|
33
|
+
msg.includes("concurrency limit") ||
|
|
34
|
+
msg.includes("concurrency_limit") ||
|
|
35
|
+
msg.includes("concurrent limit") ||
|
|
36
|
+
msg.includes("too many concurrent") ||
|
|
37
|
+
msg.includes("max concurrency") ||
|
|
38
|
+
(msg.includes("concurren") && (msg.includes("exceed") || msg.includes("limit")))) {
|
|
39
|
+
return ErrorCategory.RateLimit;
|
|
40
|
+
}
|
|
41
|
+
if (code === 401 || code === 403 || msg.includes("unauthorized") || msg.includes("forbidden")) {
|
|
42
|
+
return ErrorCategory.Authentication;
|
|
43
|
+
}
|
|
44
|
+
if (code === 400 || code === 422 || msg.includes("invalid") || msg.includes("bad request")) {
|
|
45
|
+
return ErrorCategory.InvalidInput;
|
|
46
|
+
}
|
|
47
|
+
if (msg.includes("data-000")) {
|
|
48
|
+
return ErrorCategory.InvalidInput;
|
|
49
|
+
}
|
|
50
|
+
if (code === 402 || msg.includes("payment required") || msg.includes("insufficient")) {
|
|
51
|
+
return ErrorCategory.ResourceExhausted;
|
|
52
|
+
}
|
|
53
|
+
if (msg.includes("econnreset") ||
|
|
54
|
+
msg.includes("etimedout") ||
|
|
55
|
+
msg.includes("enotfound") ||
|
|
56
|
+
msg.includes("network") ||
|
|
57
|
+
msg.includes("net-000") ||
|
|
58
|
+
msg.includes("timeout") ||
|
|
59
|
+
msg.includes("timed out") ||
|
|
60
|
+
msg.includes("econnrefused") ||
|
|
61
|
+
msg.includes("socket hang up") ||
|
|
62
|
+
msg.includes("code=1011") ||
|
|
63
|
+
msg.includes("internal error has occurred") ||
|
|
64
|
+
(code !== null && code >= 500 && code <= 599)) {
|
|
65
|
+
return ErrorCategory.NetworkTimeout;
|
|
66
|
+
}
|
|
67
|
+
return ErrorCategory.InternalFault;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Categorize an error from the TTS provider.
|
|
71
|
+
* Same heuristic as STT — TTS providers have similar error patterns.
|
|
72
|
+
*/
|
|
73
|
+
export function categorizeTtsError(err) {
|
|
74
|
+
return categorizeSttError(err); // Same logic applies
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Categorize an error from the LLM provider.
|
|
78
|
+
*
|
|
79
|
+
* Additional LLM-specific heuristics:
|
|
80
|
+
* - "context length exceeded" → InvalidInput (fatal)
|
|
81
|
+
* - "content filter" / "safety" → InvalidInput (fatal)
|
|
82
|
+
*/
|
|
83
|
+
export function categorizeLlmError(err) {
|
|
84
|
+
const msg = extractMessage(err).toLowerCase();
|
|
85
|
+
if (msg.includes("context length") || msg.includes("token limit") || msg.includes("too many tokens")) {
|
|
86
|
+
return ErrorCategory.InvalidInput;
|
|
87
|
+
}
|
|
88
|
+
if (msg.includes("content filter") || msg.includes("safety") || msg.includes("blocked")) {
|
|
89
|
+
return ErrorCategory.InvalidInput;
|
|
90
|
+
}
|
|
91
|
+
if (msg.includes("malformed_function_call")) {
|
|
92
|
+
return ErrorCategory.NetworkTimeout;
|
|
93
|
+
}
|
|
94
|
+
return categorizeSttError(err); // Base logic for HTTP errors
|
|
95
|
+
}
|
|
96
|
+
// =============================================================================
|
|
97
|
+
// Recoverability
|
|
98
|
+
// =============================================================================
|
|
99
|
+
/**
|
|
100
|
+
* Returns true if the error category is recoverable (retry with backoff).
|
|
101
|
+
*/
|
|
102
|
+
export function isRecoverable(category) {
|
|
103
|
+
return category === ErrorCategory.RateLimit || category === ErrorCategory.NetworkTimeout;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns true if the error packet represents a fatal error.
|
|
107
|
+
*/
|
|
108
|
+
export function isFatalError(pkt) {
|
|
109
|
+
return !pkt.isRecoverable;
|
|
110
|
+
}
|
|
111
|
+
// =============================================================================
|
|
112
|
+
// Helpers
|
|
113
|
+
// =============================================================================
|
|
114
|
+
function extractMessage(err) {
|
|
115
|
+
if (err instanceof Error)
|
|
116
|
+
return err.message;
|
|
117
|
+
if (typeof err === "string")
|
|
118
|
+
return err;
|
|
119
|
+
if (err && typeof err === "object" && "message" in err) {
|
|
120
|
+
return String(err.message);
|
|
121
|
+
}
|
|
122
|
+
return String(err);
|
|
123
|
+
}
|
|
124
|
+
function extractHttpStatus(err) {
|
|
125
|
+
if (err && typeof err === "object") {
|
|
126
|
+
const e = err;
|
|
127
|
+
if (typeof e.status === "number")
|
|
128
|
+
return e.status;
|
|
129
|
+
if (typeof e.statusCode === "number")
|
|
130
|
+
return e.statusCode;
|
|
131
|
+
if (typeof e.code === "number")
|
|
132
|
+
return e.code;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { PipelineBus } from "./pipeline-bus.js";
|
|
2
|
+
import type { StartIdleTimeoutPacket, StopIdleTimeoutPacket } from "./packets.js";
|
|
3
|
+
import { type Scheduler } from "./scheduler.js";
|
|
4
|
+
export interface IdleTimeoutConfig {
|
|
5
|
+
/** Base duration before triggering idle behavior (ms). Default: 15000 */
|
|
6
|
+
durationMs: number;
|
|
7
|
+
/**
|
|
8
|
+
* Number of consecutive timeouts before disconnecting.
|
|
9
|
+
* 0 = never disconnect (just inject messages repeatedly).
|
|
10
|
+
* Default: 3
|
|
11
|
+
*/
|
|
12
|
+
maxConsecutive: number;
|
|
13
|
+
/**
|
|
14
|
+
* Messages to inject at each consecutive idle.
|
|
15
|
+
* Index 0 = first timeout, index 1 = second timeout, etc.
|
|
16
|
+
* If more timeouts occur than messages, the last message repeats.
|
|
17
|
+
* Default: ["Are you still there?", "I'll end this call soon."]
|
|
18
|
+
*/
|
|
19
|
+
escalationMessages: string[];
|
|
20
|
+
/**
|
|
21
|
+
* Whether to disconnect the session after maxConsecutive is reached.
|
|
22
|
+
* If false, the maxConsecutive counter stops incrementing and the
|
|
23
|
+
* last escalation message repeats indefinitely.
|
|
24
|
+
* Default: true
|
|
25
|
+
*/
|
|
26
|
+
disconnectAfterMax: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare const DEFAULT_IDLE_TIMEOUT_CONFIG: IdleTimeoutConfig;
|
|
29
|
+
export declare class IdleTimeoutManager {
|
|
30
|
+
private timerScheduled;
|
|
31
|
+
private count;
|
|
32
|
+
private readonly config;
|
|
33
|
+
private readonly bus;
|
|
34
|
+
private currentContextId;
|
|
35
|
+
private readonly scheduler;
|
|
36
|
+
constructor(bus: PipelineBus, config?: Partial<IdleTimeoutConfig>, scheduler?: Scheduler);
|
|
37
|
+
/** Set the current turn context ID (used for injected message context). */
|
|
38
|
+
setContextId(id: string): void;
|
|
39
|
+
/** Start (or restart) the idle timeout timer. */
|
|
40
|
+
start(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Stop the idle timeout timer.
|
|
43
|
+
* @param resetCount — If true, resets the consecutive idle counter.
|
|
44
|
+
* Use true when the user actively engages (speaks or types).
|
|
45
|
+
* Use false for system-driven stops (e.g., TTS still playing).
|
|
46
|
+
*/
|
|
47
|
+
stop(resetCount: boolean): void;
|
|
48
|
+
/**
|
|
49
|
+
* Extend the current timer by a duration (e.g., TTS audio playback time).
|
|
50
|
+
* Stops the current timer and restarts with the remaining time + extension.
|
|
51
|
+
*/
|
|
52
|
+
extend(ms: number): void;
|
|
53
|
+
/** Clean up — stop timer without side effects. */
|
|
54
|
+
dispose(): void;
|
|
55
|
+
private clearTimer;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a non-empty context id for injected idle turns. If no turn context has been seen yet
|
|
58
|
+
* (e.g. the idle timer fired before the first user turn completed), synthesize a stable one —
|
|
59
|
+
* an empty contextId propagates downstream and is rejected by providers that validate it
|
|
60
|
+
* (e.g. Cartesia TTS: "context_id must be alphanumeric/_/-").
|
|
61
|
+
*/
|
|
62
|
+
private ensureContextId;
|
|
63
|
+
private onTimeout;
|
|
64
|
+
/** Handle a StartIdleTimeoutPacket from the bus. */
|
|
65
|
+
handleStart(pkt: StartIdleTimeoutPacket): void;
|
|
66
|
+
/** Handle a StopIdleTimeoutPacket from the bus. */
|
|
67
|
+
handleStop(pkt: StopIdleTimeoutPacket): void;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=idle-timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-timeout.d.ts","sourceRoot":"","sources":["../src/idle-timeout.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EAGtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMhE,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAKzC,CAAC;AAMF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAGpC,GAAG,EAAE,WAAW,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,SAAS,CAAC,EAAE,SAAS;IAYvB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,iDAAiD;IACjD,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAO/B;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAUxB,kDAAkD;IAClD,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,UAAU;IAMlB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,SAAS;IA4CjB,oDAAoD;IACpD,WAAW,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAK9C,mDAAmD;IACnD,UAAU,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI;CAG7C"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// Syrinx Kernel v2 — Idle Timeout Manager
|
|
4
|
+
//
|
|
5
|
+
// Tracks user silence and escalates: inject message → inject warning → disconnect.
|
|
6
|
+
// Configurable duration, escalation messages, and consecutive backoff.
|
|
7
|
+
//
|
|
8
|
+
// Design decision (per RFC Q4 resolution): idle messages are injected as
|
|
9
|
+
// synthetic LlmDeltaPacket + LlmDonePacket through the normal TTS path.
|
|
10
|
+
// This keeps voice style, logging, interruption, and abort semantics consistent.
|
|
11
|
+
import { Route } from "./pipeline-bus.js";
|
|
12
|
+
import { TimerScheduler } from "./scheduler.js";
|
|
13
|
+
export const DEFAULT_IDLE_TIMEOUT_CONFIG = {
|
|
14
|
+
durationMs: 15_000,
|
|
15
|
+
maxConsecutive: 3,
|
|
16
|
+
escalationMessages: ["Are you still there?", "I'll end this call soon."],
|
|
17
|
+
disconnectAfterMax: true,
|
|
18
|
+
};
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Manager
|
|
21
|
+
// =============================================================================
|
|
22
|
+
export class IdleTimeoutManager {
|
|
23
|
+
timerScheduled = false;
|
|
24
|
+
count = 0;
|
|
25
|
+
config;
|
|
26
|
+
bus;
|
|
27
|
+
currentContextId;
|
|
28
|
+
scheduler;
|
|
29
|
+
constructor(bus, config, scheduler) {
|
|
30
|
+
this.bus = bus;
|
|
31
|
+
this.config = { ...DEFAULT_IDLE_TIMEOUT_CONFIG, ...config };
|
|
32
|
+
this.currentContextId = "";
|
|
33
|
+
this.scheduler = scheduler ?? new TimerScheduler();
|
|
34
|
+
}
|
|
35
|
+
// -------------------------------------------------------------------------
|
|
36
|
+
// Public API
|
|
37
|
+
// -------------------------------------------------------------------------
|
|
38
|
+
/** Set the current turn context ID (used for injected message context). */
|
|
39
|
+
setContextId(id) {
|
|
40
|
+
this.currentContextId = id;
|
|
41
|
+
}
|
|
42
|
+
/** Start (or restart) the idle timeout timer. */
|
|
43
|
+
start() {
|
|
44
|
+
this.clearTimer();
|
|
45
|
+
if (this.config.durationMs <= 0)
|
|
46
|
+
return;
|
|
47
|
+
this.timerScheduled = true;
|
|
48
|
+
this.scheduler.schedule("voice.idle_timeout", this.config.durationMs, () => {
|
|
49
|
+
this.timerScheduled = false;
|
|
50
|
+
this.onTimeout();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Stop the idle timeout timer.
|
|
55
|
+
* @param resetCount — If true, resets the consecutive idle counter.
|
|
56
|
+
* Use true when the user actively engages (speaks or types).
|
|
57
|
+
* Use false for system-driven stops (e.g., TTS still playing).
|
|
58
|
+
*/
|
|
59
|
+
stop(resetCount) {
|
|
60
|
+
this.clearTimer();
|
|
61
|
+
if (resetCount) {
|
|
62
|
+
this.count = 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Extend the current timer by a duration (e.g., TTS audio playback time).
|
|
67
|
+
* Stops the current timer and restarts with the remaining time + extension.
|
|
68
|
+
*/
|
|
69
|
+
extend(ms) {
|
|
70
|
+
this.clearTimer();
|
|
71
|
+
if (this.config.durationMs <= 0)
|
|
72
|
+
return;
|
|
73
|
+
this.timerScheduled = true;
|
|
74
|
+
this.scheduler.schedule("voice.idle_timeout", this.config.durationMs + ms, () => {
|
|
75
|
+
this.timerScheduled = false;
|
|
76
|
+
this.onTimeout();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Clean up — stop timer without side effects. */
|
|
80
|
+
dispose() {
|
|
81
|
+
this.clearTimer();
|
|
82
|
+
}
|
|
83
|
+
// -------------------------------------------------------------------------
|
|
84
|
+
// Private
|
|
85
|
+
// -------------------------------------------------------------------------
|
|
86
|
+
clearTimer() {
|
|
87
|
+
if (!this.timerScheduled)
|
|
88
|
+
return;
|
|
89
|
+
this.scheduler.cancel("voice.idle_timeout");
|
|
90
|
+
this.timerScheduled = false;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolve a non-empty context id for injected idle turns. If no turn context has been seen yet
|
|
94
|
+
* (e.g. the idle timer fired before the first user turn completed), synthesize a stable one —
|
|
95
|
+
* an empty contextId propagates downstream and is rejected by providers that validate it
|
|
96
|
+
* (e.g. Cartesia TTS: "context_id must be alphanumeric/_/-").
|
|
97
|
+
*/
|
|
98
|
+
ensureContextId() {
|
|
99
|
+
if (this.currentContextId === "") {
|
|
100
|
+
this.currentContextId = `idle-${String(Date.now())}`;
|
|
101
|
+
}
|
|
102
|
+
return this.currentContextId;
|
|
103
|
+
}
|
|
104
|
+
onTimeout() {
|
|
105
|
+
this.count++;
|
|
106
|
+
const contextId = this.ensureContextId();
|
|
107
|
+
// Check if we should disconnect
|
|
108
|
+
if (this.config.maxConsecutive > 0 &&
|
|
109
|
+
this.count >= this.config.maxConsecutive &&
|
|
110
|
+
this.config.disconnectAfterMax) {
|
|
111
|
+
const disconnect = {
|
|
112
|
+
kind: "session.disconnect",
|
|
113
|
+
contextId,
|
|
114
|
+
timestampMs: Date.now(),
|
|
115
|
+
reason: `idle_timeout: ${this.count} consecutive`,
|
|
116
|
+
};
|
|
117
|
+
this.bus.push(Route.Critical, disconnect);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Inject escalation message
|
|
121
|
+
const msgIdx = Math.min(this.count - 1, this.config.escalationMessages.length - 1);
|
|
122
|
+
const message = this.config.escalationMessages[msgIdx];
|
|
123
|
+
if (message) {
|
|
124
|
+
const inject = {
|
|
125
|
+
kind: "inject.message",
|
|
126
|
+
contextId,
|
|
127
|
+
timestampMs: Date.now(),
|
|
128
|
+
text: message,
|
|
129
|
+
};
|
|
130
|
+
this.bus.push(Route.Main, inject);
|
|
131
|
+
}
|
|
132
|
+
// Restart timer for next escalation
|
|
133
|
+
this.start();
|
|
134
|
+
}
|
|
135
|
+
// -------------------------------------------------------------------------
|
|
136
|
+
// Bus packet handlers (for integration with VoiceAgentSession)
|
|
137
|
+
// -------------------------------------------------------------------------
|
|
138
|
+
/** Handle a StartIdleTimeoutPacket from the bus. */
|
|
139
|
+
handleStart(pkt) {
|
|
140
|
+
if (pkt.contextId)
|
|
141
|
+
this.setContextId(pkt.contextId);
|
|
142
|
+
this.start();
|
|
143
|
+
}
|
|
144
|
+
/** Handle a StopIdleTimeoutPacket from the bus. */
|
|
145
|
+
handleStop(pkt) {
|
|
146
|
+
this.stop(pkt.resetCount);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=idle-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-timeout.js","sourceRoot":"","sources":["../src/idle-timeout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type IuState = "hypothesized" | "committed" | "revoked";
|
|
2
|
+
export interface IncrementalUnitId {
|
|
3
|
+
readonly contextId: string;
|
|
4
|
+
readonly iuId: string;
|
|
5
|
+
readonly epoch: number;
|
|
6
|
+
}
|
|
7
|
+
export interface IncrementalUnit {
|
|
8
|
+
readonly id: IncrementalUnitId;
|
|
9
|
+
readonly kind: "user_turn" | "assistant_response" | "tts_segment";
|
|
10
|
+
state: IuState;
|
|
11
|
+
/** For assistant/tts IUs: the committed character/ms prefix (heard). */
|
|
12
|
+
committedPrefix?: {
|
|
13
|
+
chars?: number;
|
|
14
|
+
ms?: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=incremental-unit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-unit.d.ts","sourceRoot":"","sources":["../src/incremental-unit.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,oBAAoB,GAAG,aAAa,CAAC;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,eAAe,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-unit.js","sourceRoot":"","sources":["../src/incremental-unit.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,sGAAsG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export { type AudioFormat, type VoicePacket, type AsyncPacket, type VoiceErrorPacket, ErrorCategory, SessionState, InitStage, type InitStepCompletedPacket, type InitializationFailedPacket, type InitializationCompletedPacket, } from "./packets.js";
|
|
2
|
+
export { type UserAudioReceivedPacket, type UserTextReceivedPacket, type DenoiseAudioPacket, type DenoisedAudioPacket, type VadAudioPacket, type VadSpeechStartedPacket, type VadSpeechEndedPacket, type VadSpeechActivityPacket, type SpeechToTextAudioPacket, type SttInterimPacket, type SttPartialPacket, type SttResultPacket, type FinalizeSttPacket, type SttReconfigurePacket, type SttErrorPacket, type EndOfSpeechAudioPacket, type EndOfSpeechPacket, type InterimEndOfSpeechPacket, type EndOfSpeechRetractedPacket, type TurnEndOwner, type TurnEndReason, type UserInputPacket, } from "./packets.js";
|
|
3
|
+
export { type InterruptionDetectedPacket, type InterruptTtsPacket, type InterruptLlmPacket, type InterruptSttPacket, type TurnChangePacket, } from "./packets.js";
|
|
4
|
+
export { type DtmfDigit, type DtmfReceivedPacket, type DtmfSendPacket, type CallTransferMode, type CallTransferPacket, } from "./packets.js";
|
|
5
|
+
export { parseDtmfDigit, dtmfReceived, dtmfSend, callTransfer } from "./packet-factories.js";
|
|
6
|
+
export { type LlmDeltaPacket, type LlmResponseDonePacket, type LlmErrorPacket, type LlmToolCallPacket, type LlmToolResultPacket, } from "./packets.js";
|
|
7
|
+
export { type ReasoningSuspendedPacket, type ReasoningResumePacket, } from "./packets.js";
|
|
8
|
+
export { type DelegateQueryPacket, type DelegateResultPacket, type DelegatePacket, type RealtimeResumptionHandlePacket, } from "./packets.js";
|
|
9
|
+
export { InMemoryReasonerSessionStore, type ReasonerSessionStore, } from "./reasoner-session-store.js";
|
|
10
|
+
export { type IuState, type IncrementalUnitId, type IncrementalUnit, } from "./incremental-unit.js";
|
|
11
|
+
export { type IuLedger, type IuLedgerAnomaly, InMemoryIuLedger, } from "./iu-ledger.js";
|
|
12
|
+
export { type TextToSpeechTextPacket, type TextToSpeechDonePacket, type TextToSpeechAudioPacket, type TextToSpeechEndPacket, type TextToSpeechPlayoutStartedPacket, type TextToSpeechPlayoutProgressPacket, type TextToSpeechWordTimestampsPacket, type TtsWordTimestamp, type TtsErrorPacket, } from "./packets.js";
|
|
13
|
+
export { type RecordAssistantAudioDataPacket, type RecordAssistantAudioPacket, type RecordAssistantAudioTruncatePacket, type RecordUserAudioPacket, type StartIdleTimeoutPacket, type StopIdleTimeoutPacket, type InjectMessagePacket, type DisconnectRequestedPacket, } from "./packets.js";
|
|
14
|
+
export { type ModeSwitchRequestedPacket, type ModeSwitchCompletedPacket, } from "./packets.js";
|
|
15
|
+
export { type MessageCreatePacket, type ConversationMetricPacket, type AcousticSignalPacket, type AcousticSignal, type TurnLocalizationPacket, type UsageStage, type UsageRecordedPacket, type TurnBoundaryKind, type TurnBoundaryEventPacket, type ObservabilityPacket, type PipelineErrorPacket, } from "./packets.js";
|
|
16
|
+
export { type SttPrice, type LlmPrice, type TtsPrice, type PriceCatalog, type CostResult, DEFAULT_PRICE_CATALOG, costOf, } from "./pricing.js";
|
|
17
|
+
export { SpendCapGuard, type SpendCapConfig, type SpendCapCheck, } from "./spend-cap.js";
|
|
18
|
+
export { monotonicNowMs, type MetricTags, type ObservabilityLayer, type TurnLocalizationVerdict, type TurnLocalizationSignals, localizeTurn, type SpanHandle, type MetricsExporter, noopMetricsExporter, InMemoryMetricsExporter, reconstructTurnTimeline, type TurnTimelineStep, } from "./observability.js";
|
|
19
|
+
export { ObservabilityObserver, type ObservabilityObserverDeps, type ObservabilityDims, } from "./observability-observer.js";
|
|
20
|
+
export { PipelineBusImpl, Route, type PipelineBus, type PipelineBusConfig, type PacketHandler } from "./pipeline-bus.js";
|
|
21
|
+
export { runInitChain, runFinalizeChain, type InitStep, InitializationError } from "./init-chain.js";
|
|
22
|
+
export { type VoicePlugin, type PluginConfig, type EndpointingOwner, type EndpointingCapability, type SttReconfigure, type SttReconfigurePartial, requireStringConfig, optionalStringConfig, } from "./plugin-contract.js";
|
|
23
|
+
export { categorizeSttError, categorizeTtsError, categorizeLlmError, isRecoverable, isFatalError } from "./error-handler.js";
|
|
24
|
+
export { DEFAULT_RETRY_CONFIG, VOICE_PROVIDER_RETRY_CONFIG, VOICE_PROVIDER_OUTAGE_RETRY_CONFIG, readRetryConfig, readProviderRetryConfig, retryDelayMs, waitForRetryDelay, type RetryConfig } from "./retry.js";
|
|
25
|
+
export { ProviderFallback, type FallbackProvider, type ProviderFallbackOptions } from "./provider-fallback.js";
|
|
26
|
+
export { TimerScheduler, type Scheduler, type ScheduledCallback } from "./scheduler.js";
|
|
27
|
+
export { IdleTimeoutManager, type IdleTimeoutConfig, DEFAULT_IDLE_TIMEOUT_CONFIG } from "./idle-timeout.js";
|
|
28
|
+
export { ModeSwitcher, type ModeSwitchHandlers } from "./mode-switcher.js";
|
|
29
|
+
export { type ConversationEvent, createConversationEventStream } from "./conversation-event.js";
|
|
30
|
+
export { SYRINX_AUDIO_ENVELOPE_NAME, SYRINX_AUDIO_ENVELOPE_MAGIC, assertAudioFormat, assertAudioPayload, encodeSyrinxAudioEnvelope, decodeSyrinxAudioEnvelope, hasSyrinxAudioEnvelope, type SyrinxAudioEnvelope, type SyrinxAudioEnvelopeHeader, } from "./audio-envelope.js";
|
|
31
|
+
export { StreamingPcm16Resampler, createLoudnessState, normalizeLoudness, type LoudnessConfig, type LoudnessState, } from "./audio/index.js";
|
|
32
|
+
export { type InteractionPolicy, type LifecycleInteractionPolicy, isLifecycleInteractionPolicy, type InteractionObservation, type InteractionDecision, type AcousticSignalObservation, type AcousticSignalSink, type WordTiming, } from "./interaction-policy.js";
|
|
33
|
+
export { confidenceToWaitMs, type ConfidenceToWaitConfig } from "./confidence-to-wait.js";
|
|
34
|
+
export { RuleBasedInteractionPolicy } from "./policies/rule-based.js";
|
|
35
|
+
export { DeferInteractionPolicy } from "./policies/defer.js";
|
|
36
|
+
export { InteractionCoordinator, type InteractionCaps } from "./interaction-coordinator.js";
|
|
37
|
+
export { type InteractionBackchannelPacket, type InteractionDuckPacket, type InteractionResumePacket, } from "./packets.js";
|
|
38
|
+
export { VoiceAgentSession, type VoiceAgentSessionConfig, type VoiceAgentSessionEvents, type SessionStageUsage, } from "./voice-agent-session.js";
|
|
39
|
+
export { PrimarySpeakerGate, extractSpeakerFingerprint, fingerprintSimilarity, type SpeakerFingerprint, type PrimarySpeakerGateDecision, type PrimarySpeakerGateConfig, } from "./primary-speaker-gate.js";
|
|
40
|
+
export { synthesizeTonePcm16, mixPcm16, PRIMARY_SPEAKER_TONE_HZ, BYSTANDER_SPEAKER_TONE_HZ, ASSISTANT_ECHO_TONE_HZ, } from "./primary-speaker-fixtures.js";
|
|
41
|
+
export { LatencyFillerController, selectLatencyFillerConnective, stripRedundantFillerPrefix, LATENCY_FILLER_CONNECTIVES, type LatencyFillerConfig, type LatencyFillerState, type LatencyFillerConnective, } from "./latency-filler.js";
|
|
42
|
+
export { LATENCY_FILLER_FIXTURES, type LatencyFillerFixture, } from "./latency-filler-fixtures.js";
|
|
43
|
+
export { normalizeForSpeech, stripLeakedToolCalls } from "./voice-text.js";
|
|
44
|
+
export { type Reasoner, type ReasonerTurn, type ReasonerMessage, type ReasonerUsage, type ReasoningPart, } from "./reasoner.js";
|
|
45
|
+
export { HedgedReasoner, type HedgedReasonerOptions } from "./reasoner-hedge.js";
|
|
46
|
+
export { RoutingReasoner, type RoutingReasonerOptions, type ReasonerRoute, } from "./reasoner-route.js";
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// Syrinx Kernel v2 — Public API
|
|
4
|
+
//
|
|
5
|
+
// Everything a consumer needs to build voice agents with the new kernel.
|
|
6
|
+
// Core types
|
|
7
|
+
export { ErrorCategory, SessionState, InitStage, } from "./packets.js";
|
|
8
|
+
export { parseDtmfDigit, dtmfReceived, dtmfSend, callTransfer } from "./packet-factories.js";
|
|
9
|
+
// Durable reasoner session state (G4)
|
|
10
|
+
export { InMemoryReasonerSessionStore, } from "./reasoner-session-store.js";
|
|
11
|
+
export { InMemoryIuLedger, } from "./iu-ledger.js";
|
|
12
|
+
// Metering: price catalog + spend-cap guard (standalone; session wires later)
|
|
13
|
+
export { DEFAULT_PRICE_CATALOG, costOf, } from "./pricing.js";
|
|
14
|
+
export { SpendCapGuard, } from "./spend-cap.js";
|
|
15
|
+
// Observability backbone (VE-07)
|
|
16
|
+
export { monotonicNowMs, localizeTurn, noopMetricsExporter, InMemoryMetricsExporter, reconstructTurnTimeline, } from "./observability.js";
|
|
17
|
+
export { ObservabilityObserver, } from "./observability-observer.js";
|
|
18
|
+
// PipelineBus
|
|
19
|
+
export { PipelineBusImpl, Route } from "./pipeline-bus.js";
|
|
20
|
+
// Init chain
|
|
21
|
+
export { runInitChain, runFinalizeChain, InitializationError } from "./init-chain.js";
|
|
22
|
+
// Plugin contract
|
|
23
|
+
export { requireStringConfig, optionalStringConfig, } from "./plugin-contract.js";
|
|
24
|
+
// Error handler
|
|
25
|
+
export { categorizeSttError, categorizeTtsError, categorizeLlmError, isRecoverable, isFatalError } from "./error-handler.js";
|
|
26
|
+
// Retry helpers
|
|
27
|
+
export { DEFAULT_RETRY_CONFIG, VOICE_PROVIDER_RETRY_CONFIG, VOICE_PROVIDER_OUTAGE_RETRY_CONFIG, readRetryConfig, readProviderRetryConfig, retryDelayMs, waitForRetryDelay } from "./retry.js";
|
|
28
|
+
// Provider fallback/degradation
|
|
29
|
+
export { ProviderFallback } from "./provider-fallback.js";
|
|
30
|
+
// Runtime scheduler seam
|
|
31
|
+
export { TimerScheduler } from "./scheduler.js";
|
|
32
|
+
// Idle timeout
|
|
33
|
+
export { IdleTimeoutManager, DEFAULT_IDLE_TIMEOUT_CONFIG } from "./idle-timeout.js";
|
|
34
|
+
// Mode switcher
|
|
35
|
+
export { ModeSwitcher } from "./mode-switcher.js";
|
|
36
|
+
// Conversation events
|
|
37
|
+
export { createConversationEventStream } from "./conversation-event.js";
|
|
38
|
+
// Websocket audio envelope
|
|
39
|
+
export { SYRINX_AUDIO_ENVELOPE_NAME, SYRINX_AUDIO_ENVELOPE_MAGIC, assertAudioFormat, assertAudioPayload, encodeSyrinxAudioEnvelope, decodeSyrinxAudioEnvelope, hasSyrinxAudioEnvelope, } from "./audio-envelope.js";
|
|
40
|
+
export { StreamingPcm16Resampler, createLoudnessState, normalizeLoudness, } from "./audio/index.js";
|
|
41
|
+
// Interaction policy seam (IP-C1)
|
|
42
|
+
export { isLifecycleInteractionPolicy, } from "./interaction-policy.js";
|
|
43
|
+
export { confidenceToWaitMs } from "./confidence-to-wait.js";
|
|
44
|
+
export { RuleBasedInteractionPolicy } from "./policies/rule-based.js";
|
|
45
|
+
export { DeferInteractionPolicy } from "./policies/defer.js";
|
|
46
|
+
export { InteractionCoordinator } from "./interaction-coordinator.js";
|
|
47
|
+
// VoiceAgentSession
|
|
48
|
+
export { VoiceAgentSession, } from "./voice-agent-session.js";
|
|
49
|
+
// Primary-speaker barge-in gate (VE-02)
|
|
50
|
+
export { PrimarySpeakerGate, extractSpeakerFingerprint, fingerprintSimilarity, } from "./primary-speaker-gate.js";
|
|
51
|
+
export { synthesizeTonePcm16, mixPcm16, PRIMARY_SPEAKER_TONE_HZ, BYSTANDER_SPEAKER_TONE_HZ, ASSISTANT_ECHO_TONE_HZ, } from "./primary-speaker-fixtures.js";
|
|
52
|
+
// Latency-hiding filler track (VE-03)
|
|
53
|
+
export { LatencyFillerController, selectLatencyFillerConnective, stripRedundantFillerPrefix, LATENCY_FILLER_CONNECTIVES, } from "./latency-filler.js";
|
|
54
|
+
export { LATENCY_FILLER_FIXTURES, } from "./latency-filler-fixtures.js";
|
|
55
|
+
// Voice text: markdown/formatting normalization + leaked-tool-call guard before TTS
|
|
56
|
+
export { normalizeForSpeech, stripLeakedToolCalls } from "./voice-text.js";
|
|
57
|
+
// Hedged reasoner (Lever C — reasoner-latency RFC)
|
|
58
|
+
export { HedgedReasoner } from "./reasoner-hedge.js";
|
|
59
|
+
// Routing reasoner (Lever B — reasoner-latency RFC)
|
|
60
|
+
export { RoutingReasoner, } from "./reasoner-route.js";
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PipelineBus } from "./pipeline-bus.js";
|
|
2
|
+
import type { InitStage } from "./packets.js";
|
|
3
|
+
export interface InitStep {
|
|
4
|
+
/** Human-readable name for logging and error messages. */
|
|
5
|
+
readonly name: string;
|
|
6
|
+
/** Which initialization stage this step represents. */
|
|
7
|
+
readonly stage: InitStage;
|
|
8
|
+
/** Run the initialization. Throws on failure. */
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
/** Clean up resources. Called during teardown (on failure) or finalize chain. */
|
|
11
|
+
cleanup?(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare class InitializationError extends Error {
|
|
14
|
+
readonly stage: InitStage;
|
|
15
|
+
readonly component: string;
|
|
16
|
+
constructor(stage: InitStage, component: string, cause: Error);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run a serial init chain. Each step runs in order. On failure:
|
|
20
|
+
* 1. Emits InitializationFailedPacket through the bus.
|
|
21
|
+
* 2. Tears down already-initialized steps in reverse order.
|
|
22
|
+
* 3. Throws InitializationError.
|
|
23
|
+
*
|
|
24
|
+
* On success:
|
|
25
|
+
* 1. Emits InitStepCompletedPacket for each step (with initMs).
|
|
26
|
+
* 2. Emits InitializationCompletedPacket.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runInitChain(bus: PipelineBus, steps: readonly InitStep[]): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Run a reverse finalize chain. Steps are torn down in reverse order.
|
|
31
|
+
* Errors during teardown are logged but do not stop the chain.
|
|
32
|
+
* All steps get their cleanup called regardless of earlier failures.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runFinalizeChain(steps: readonly InitStep[]): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=init-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-chain.d.ts","sourceRoot":"","sources":["../src/init-chain.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EACV,SAAS,EAIV,MAAM,cAAc,CAAC;AAOtB,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,iDAAiD;IACjD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,iFAAiF;IACjF,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAMD,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,KAAK,EAAE,SAAS;aAChB,SAAS,EAAE,MAAM;gBADjB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjC,KAAK,EAAE,KAAK;CAKf;AAMD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,QAAQ,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,QAAQ,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|