agents 0.22.0 → 0.23.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/README.md +20 -1
- package/dist/{agent-routing-CnkaHb-v.d.ts → agent-routing-DE5zmCQ8.d.ts} +1038 -394
- package/dist/agent-routing.d.ts +1 -1
- package/dist/agent-tool-types.d.ts +26 -26
- package/dist/{agent-tools-C0XJqWzB.d.ts → agent-tools-DtXMTDGM.d.ts} +7 -7
- package/dist/agent-tools.d.ts +21 -21
- package/dist/browser/ai.js +4 -1
- package/dist/browser/ai.js.map +1 -1
- package/dist/browser/tanstack-ai.js.map +1 -1
- package/dist/callable-decorator-DP__HhBA.d.ts +72 -0
- package/dist/callable-decorator.d.ts +18 -0
- package/dist/callable-decorator.js +71 -0
- package/dist/callable-decorator.js.map +1 -0
- package/dist/capability-BjSKYpzg.js.map +1 -1
- package/dist/capability-runner-Be_-PLR1.d.ts +459 -0
- package/dist/channel-Bnm4S7T2.d.ts +491 -0
- package/dist/channels/ai-sdk.d.ts +46 -0
- package/dist/channels/ai-sdk.js +120 -0
- package/dist/channels/ai-sdk.js.map +1 -0
- package/dist/channels/email.d.ts +95 -0
- package/dist/channels/email.js +323 -0
- package/dist/channels/email.js.map +1 -0
- package/dist/channels/index.d.ts +233 -0
- package/dist/channels/index.js +608 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/slack.d.ts +140 -0
- package/dist/channels/slack.js +614 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/tanstack-ai.d.ts +39 -0
- package/dist/channels/tanstack-ai.js +17 -0
- package/dist/channels/tanstack-ai.js.map +1 -0
- package/dist/channels/telegram.d.ts +106 -0
- package/dist/channels/telegram.js +427 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/voice.d.ts +45 -0
- package/dist/channels/voice.js +122 -0
- package/dist/channels/voice.js.map +1 -0
- package/dist/chat/index.d.ts +2325 -2019
- package/dist/chat/index.js +888 -518
- package/dist/chat/index.js.map +1 -1
- package/dist/chat-sdk/index.d.ts +7 -7
- package/dist/chat-sdk/index.js +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/context/index.d.ts +216 -0
- package/dist/context/index.js +454 -0
- package/dist/context/index.js.map +1 -0
- package/dist/{current-agent-CuMErtly.d.ts → current-agent-Da_C9a3b.d.ts} +90 -107
- package/dist/current-agent-DhoDkSnH.js.map +1 -1
- package/dist/{diagnostics-CaBjfz4J.js → diagnostics-BzvaX2UT.js} +5 -1
- package/dist/diagnostics-BzvaX2UT.js.map +1 -0
- package/dist/diagnostics-C4jcz3VK.js +360 -0
- package/dist/diagnostics-C4jcz3VK.js.map +1 -0
- package/dist/index-BB0kqhIz.d.ts +101 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-XDkuQ7zm.d.ts +89 -0
- package/dist/{index-DcSAZKsB.d.ts → index-YSKgfgg9.d.ts} +3 -1
- package/dist/index.d.ts +91 -82
- package/dist/index.js +3 -2
- package/dist/ingress-BfetZbMO.js +83 -0
- package/dist/ingress-BfetZbMO.js.map +1 -0
- package/dist/internal-CYlgHl1l.js +59 -0
- package/dist/internal-CYlgHl1l.js.map +1 -0
- package/dist/internal_context.d.ts +1 -1
- package/dist/lifecycle/index.d.ts +35 -17
- package/dist/lifecycle/index.js +1 -1
- package/dist/lifecycle-CMRGjZdw.js +1299 -0
- package/dist/lifecycle-CMRGjZdw.js.map +1 -0
- package/dist/mcp/client/index.d.ts +20 -20
- package/dist/mcp/index.d.ts +35 -35
- package/dist/mcp/index.js +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.js +1 -1
- package/dist/react.d.ts +4 -4
- package/dist/{retries-CAvxtG9d.d.ts → retries-D9Ds-1lz.d.ts} +17 -6
- package/dist/retries.d.ts +8 -6
- package/dist/retries.js +13 -1
- package/dist/retries.js.map +1 -1
- package/dist/routing/index.d.ts +137 -0
- package/dist/routing/index.js +244 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/sanitize-D9TujEK8.js +79 -0
- package/dist/sanitize-D9TujEK8.js.map +1 -0
- package/dist/scheduler-DD9NdYbF.js +665 -0
- package/dist/scheduler-DD9NdYbF.js.map +1 -0
- package/dist/{scheduler-DQoTGoAW.d.ts → scheduler-Dwh85ZGl.d.ts} +21 -22
- package/dist/schedules/index.d.ts +1 -1
- package/dist/schedules/index.js +1 -1
- package/dist/sentence-chunker-BAidJ4DA.d.ts +68 -0
- package/dist/serializable.d.ts +1 -1
- package/dist/sessions/index.d.ts +441 -0
- package/dist/sessions/index.js +2063 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/skills/index.d.ts +99 -0
- package/dist/skills/index.js +254 -5
- package/dist/skills/index.js.map +1 -1
- package/dist/{src-5W6JNKVb.js → src-DlSHshb2.js} +1460 -1110
- package/dist/src-DlSHshb2.js.map +1 -0
- package/dist/streams/index.d.ts +120 -0
- package/dist/streams/index.js +107 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams-D6tJ0NN9.d.ts +370 -0
- package/dist/streams-DZKgAj9b.js +709 -0
- package/dist/streams-DZKgAj9b.js.map +1 -0
- package/dist/sub-routing.d.ts +12 -12
- package/dist/surface-bZZJqBka.js +17 -0
- package/dist/surface-bZZJqBka.js.map +1 -0
- package/dist/tasks/index.d.ts +64 -0
- package/dist/tasks/index.js +2 -0
- package/dist/tasks-BRJ5zgya.d.ts +517 -0
- package/dist/tasks-ylZgBjhj.js +1656 -0
- package/dist/tasks-ylZgBjhj.js.map +1 -0
- package/dist/text-segment-joiner-BtAFQSA_.js +57 -0
- package/dist/text-segment-joiner-BtAFQSA_.js.map +1 -0
- package/dist/text-stream-CpdiKrJB.js +272 -0
- package/dist/text-stream-CpdiKrJB.js.map +1 -0
- package/dist/tokens-nHAKcN6M.js +52 -0
- package/dist/tokens-nHAKcN6M.js.map +1 -0
- package/dist/tool-schema-CBjGPrsQ.js +31 -0
- package/dist/tool-schema-CBjGPrsQ.js.map +1 -0
- package/dist/types-B7LojTe4.d.ts +202 -0
- package/dist/types-_Faxb570.d.ts +439 -0
- package/dist/voice/client.d.ts +226 -0
- package/dist/voice/client.js +932 -0
- package/dist/voice/client.js.map +1 -0
- package/dist/voice/errors.d.ts +43 -0
- package/dist/voice/errors.js +41 -0
- package/dist/voice/errors.js.map +1 -0
- package/dist/voice/index.d.ts +271 -0
- package/dist/voice/index.js +1812 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/react.d.ts +167 -0
- package/dist/voice/react.js +234 -0
- package/dist/voice/react.js.map +1 -0
- package/dist/voice/sfu.d.ts +71 -0
- package/dist/voice/sfu.js +157 -0
- package/dist/voice/sfu.js.map +1 -0
- package/dist/voice/text.d.ts +6 -0
- package/dist/voice/text.js +2 -0
- package/dist/voice/types.d.ts +58 -0
- package/dist/voice/types.js +18 -0
- package/dist/voice/types.js.map +1 -0
- package/dist/voice/workers-ai.d.ts +136 -0
- package/dist/voice/workers-ai.js +568 -0
- package/dist/voice/workers-ai.js.map +1 -0
- package/dist/websockets/index.d.ts +192 -0
- package/dist/websockets/index.js +2 -0
- package/dist/websockets-DUfRHPRq.js +502 -0
- package/dist/websockets-DUfRHPRq.js.map +1 -0
- package/dist/workflow-types.d.ts +25 -25
- package/dist/workflows.d.ts +21 -21
- package/dist/workflows.js +1 -1
- package/docs/agent-class.md +2 -2
- package/docs/agent-tools.md +2 -1
- package/docs/channels.md +323 -0
- package/docs/chat-agents.md +6 -13
- package/docs/context.md +131 -0
- package/docs/index.md +15 -12
- package/docs/lifecycle.md +102 -55
- package/docs/long-running-agents.md +2 -2
- package/docs/mcp-servers.md +5 -1
- package/docs/resumable-streaming.md +1 -1
- package/docs/routing.md +105 -0
- package/docs/sessions.md +237 -871
- package/docs/streams.md +213 -0
- package/docs/sub-agents.md +184 -124
- package/docs/tasks.md +246 -0
- package/docs/voice.md +745 -0
- package/package.json +115 -13
- package/dist/capability-runner-CvHGZqUu.d.ts +0 -150
- package/dist/compaction-helpers-iiKMr2TQ.js +0 -340
- package/dist/compaction-helpers-iiKMr2TQ.js.map +0 -1
- package/dist/compaction-helpers-wUz6M3us.d.ts +0 -621
- package/dist/diagnostics-CaBjfz4J.js.map +0 -1
- package/dist/durable-object-lifecycle-D6nNQJJd.js +0 -862
- package/dist/durable-object-lifecycle-D6nNQJJd.js.map +0 -1
- package/dist/experimental/memory/session/index.d.ts +0 -671
- package/dist/experimental/memory/session/index.js +0 -2379
- package/dist/experimental/memory/session/index.js.map +0 -1
- package/dist/experimental/memory/utils/index.d.ts +0 -96
- package/dist/experimental/memory/utils/index.js +0 -79
- package/dist/experimental/memory/utils/index.js.map +0 -1
- package/dist/scheduler-CR9RHGos.js +0 -857
- package/dist/scheduler-CR9RHGos.js.map +0 -1
- package/dist/src-5W6JNKVb.js.map +0 -1
- package/dist/tool-output-truncation-CNnnGZQ3.js +0 -98
- package/dist/tool-output-truncation-CNnnGZQ3.js.map +0 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { i as _classPrivateFieldInitSpec, n as _classPrivateFieldSet2, r as _assertClassBrand, t as _classPrivateFieldGet2 } from "./classPrivateFieldGet2-DZBYAB34.js";
|
|
2
|
+
import { t as _classPrivateMethodInitSpec } from "./classPrivateMethodInitSpec-qMjJ6sHQ.js";
|
|
3
|
+
import { VoiceProviderError } from "./voice/errors.js";
|
|
4
|
+
//#region src/voice/diagnostics.ts
|
|
5
|
+
const MAX_STRING_LENGTH = 160;
|
|
6
|
+
const PRIVATE_KEY = /(^|_)(audio|body|contents?|exceptions?|messages?|prompts?|query|results?|stack|text|tokens?|tools?|transcripts?|arguments?)(_|$)/i;
|
|
7
|
+
function boundedString(value, maxLength = MAX_STRING_LENGTH) {
|
|
8
|
+
const normalized = value.replace(/\s+/g, " ").trim();
|
|
9
|
+
return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1)}…`;
|
|
10
|
+
}
|
|
11
|
+
function diagnosticErrorData(error) {
|
|
12
|
+
const summary = {
|
|
13
|
+
name: boundedString(error.name || "Error"),
|
|
14
|
+
message: boundedString(error.message || "Unknown error")
|
|
15
|
+
};
|
|
16
|
+
if (error instanceof VoiceProviderError) {
|
|
17
|
+
if (error.code !== void 0) summary.code = error.code;
|
|
18
|
+
if (error.status !== void 0) summary.status = error.status;
|
|
19
|
+
if (error.closeCode !== void 0) summary.closeCode = error.closeCode;
|
|
20
|
+
if (error.closeReason !== void 0) summary.closeReason = boundedString(error.closeReason);
|
|
21
|
+
if (error.wasClean !== void 0) summary.wasClean = error.wasClean;
|
|
22
|
+
}
|
|
23
|
+
return summary;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Keep diagnostic metadata bounded and reject fields that could carry user or
|
|
27
|
+
* provider content. Instrumentation should still pass only known-safe values.
|
|
28
|
+
*/
|
|
29
|
+
function sanitizeDiagnosticData(data) {
|
|
30
|
+
if (!data) return void 0;
|
|
31
|
+
const sanitized = {};
|
|
32
|
+
for (const [key, value] of Object.entries(data)) {
|
|
33
|
+
if (PRIVATE_KEY.test(key)) continue;
|
|
34
|
+
sanitized[key] = value instanceof Error ? diagnosticErrorData(value) : typeof value === "string" ? boundedString(value) : value;
|
|
35
|
+
}
|
|
36
|
+
return Object.keys(sanitized).length > 0 ? sanitized : void 0;
|
|
37
|
+
}
|
|
38
|
+
function createDiagnosticEvent(event, data, timestamp = Date.now()) {
|
|
39
|
+
const safeData = sanitizeDiagnosticData(data);
|
|
40
|
+
return {
|
|
41
|
+
event,
|
|
42
|
+
timestamp,
|
|
43
|
+
...safeData ? { data: safeData } : {}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Server-only diagnostics. The sink is the reserved voice protocol message. */
|
|
47
|
+
var ServerDiagnostics = class {
|
|
48
|
+
constructor(browserConsole) {
|
|
49
|
+
this.browserConsole = browserConsole;
|
|
50
|
+
}
|
|
51
|
+
emit(connection, event, data) {
|
|
52
|
+
if (!this.browserConsole) return;
|
|
53
|
+
try {
|
|
54
|
+
connection.send(JSON.stringify({
|
|
55
|
+
type: "diagnostic",
|
|
56
|
+
...createDiagnosticEvent(event, data)
|
|
57
|
+
}));
|
|
58
|
+
} catch {}
|
|
59
|
+
}
|
|
60
|
+
turn(connection, turnId, source = "speech", now = Date.now) {
|
|
61
|
+
return new TurnDiagnostics(this, connection, turnId, source, now);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
function safeDuration(value) {
|
|
65
|
+
return Math.max(0, value);
|
|
66
|
+
}
|
|
67
|
+
var _turn = /* @__PURE__ */ new WeakMap();
|
|
68
|
+
var _startedAt = /* @__PURE__ */ new WeakMap();
|
|
69
|
+
/** One sentence attempt measured by its parent turn clock. */
|
|
70
|
+
var TtsSentenceTracker = class {
|
|
71
|
+
constructor(turn, startedAt) {
|
|
72
|
+
_classPrivateFieldInitSpec(this, _turn, void 0);
|
|
73
|
+
_classPrivateFieldInitSpec(this, _startedAt, void 0);
|
|
74
|
+
_classPrivateFieldSet2(_turn, this, turn);
|
|
75
|
+
_classPrivateFieldSet2(_startedAt, this, startedAt);
|
|
76
|
+
}
|
|
77
|
+
providerStarted() {
|
|
78
|
+
_classPrivateFieldGet2(_turn, this).recordTtsProviderStarted();
|
|
79
|
+
}
|
|
80
|
+
settle(outcome) {
|
|
81
|
+
return _classPrivateFieldGet2(_turn, this).recordTtsSentence(_classPrivateFieldGet2(_startedAt, this), outcome);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var _diagnostics = /* @__PURE__ */ new WeakMap();
|
|
85
|
+
var _connection = /* @__PURE__ */ new WeakMap();
|
|
86
|
+
var _now = /* @__PURE__ */ new WeakMap();
|
|
87
|
+
var _startedAt2 = /* @__PURE__ */ new WeakMap();
|
|
88
|
+
var _speechStartedAt = /* @__PURE__ */ new WeakMap();
|
|
89
|
+
var _firstInterimObserved = /* @__PURE__ */ new WeakMap();
|
|
90
|
+
var _finalInputAt = /* @__PURE__ */ new WeakMap();
|
|
91
|
+
var _firstTtsProviderAt = /* @__PURE__ */ new WeakMap();
|
|
92
|
+
var _firstAudioAt = /* @__PURE__ */ new WeakMap();
|
|
93
|
+
var _ttsFinished = /* @__PURE__ */ new WeakMap();
|
|
94
|
+
var _hasTtsFailures = /* @__PURE__ */ new WeakMap();
|
|
95
|
+
var _metrics = /* @__PURE__ */ new WeakMap();
|
|
96
|
+
/**
|
|
97
|
+
* One content-free turn lifecycle. Diagnostics and stable metrics are emitted
|
|
98
|
+
* from the same recorded landmarks; application metrics never parse event
|
|
99
|
+
* names or diagnostic metadata.
|
|
100
|
+
*/
|
|
101
|
+
var TurnDiagnostics = class {
|
|
102
|
+
constructor(diagnostics, connection, turnId, source, now) {
|
|
103
|
+
_classPrivateFieldInitSpec(this, _diagnostics, void 0);
|
|
104
|
+
_classPrivateFieldInitSpec(this, _connection, void 0);
|
|
105
|
+
_classPrivateFieldInitSpec(this, _now, void 0);
|
|
106
|
+
_classPrivateFieldInitSpec(this, _startedAt2, void 0);
|
|
107
|
+
_classPrivateFieldInitSpec(this, _speechStartedAt, void 0);
|
|
108
|
+
_classPrivateFieldInitSpec(this, _firstInterimObserved, false);
|
|
109
|
+
_classPrivateFieldInitSpec(this, _finalInputAt, void 0);
|
|
110
|
+
_classPrivateFieldInitSpec(this, _firstTtsProviderAt, void 0);
|
|
111
|
+
_classPrivateFieldInitSpec(this, _firstAudioAt, void 0);
|
|
112
|
+
_classPrivateFieldInitSpec(this, _ttsFinished, false);
|
|
113
|
+
_classPrivateFieldInitSpec(this, _hasTtsFailures, false);
|
|
114
|
+
_classPrivateFieldInitSpec(this, _metrics, {});
|
|
115
|
+
_classPrivateFieldSet2(_diagnostics, this, diagnostics);
|
|
116
|
+
_classPrivateFieldSet2(_connection, this, connection);
|
|
117
|
+
_classPrivateFieldSet2(_now, this, now);
|
|
118
|
+
_classPrivateFieldSet2(_startedAt2, this, now());
|
|
119
|
+
this.turnId = turnId;
|
|
120
|
+
this.source = source;
|
|
121
|
+
}
|
|
122
|
+
get hasTtsFailures() {
|
|
123
|
+
return _classPrivateFieldGet2(_hasTtsFailures, this);
|
|
124
|
+
}
|
|
125
|
+
get ttsWorkMs() {
|
|
126
|
+
return _classPrivateFieldGet2(_metrics, this).ttsWorkMs ?? 0;
|
|
127
|
+
}
|
|
128
|
+
emit(event, data) {
|
|
129
|
+
const scopedData = {
|
|
130
|
+
...data,
|
|
131
|
+
turn_id: this.turnId
|
|
132
|
+
};
|
|
133
|
+
_classPrivateFieldGet2(_diagnostics, this).emit(_classPrivateFieldGet2(_connection, this), event, scopedData);
|
|
134
|
+
}
|
|
135
|
+
startModel() {
|
|
136
|
+
return new ModelDiagnosticTracker(this, _classPrivateFieldGet2(_now, this));
|
|
137
|
+
}
|
|
138
|
+
markTextInput() {
|
|
139
|
+
_classPrivateFieldGet2(_finalInputAt, this) ?? _classPrivateFieldSet2(_finalInputAt, this, _classPrivateFieldGet2(_startedAt2, this));
|
|
140
|
+
}
|
|
141
|
+
speechStarted() {
|
|
142
|
+
_classPrivateFieldGet2(_speechStartedAt, this) ?? _classPrivateFieldSet2(_speechStartedAt, this, _classPrivateFieldGet2(_now, this).call(this));
|
|
143
|
+
this.emit("speech.started");
|
|
144
|
+
}
|
|
145
|
+
firstInterim(characters) {
|
|
146
|
+
if (_classPrivateFieldGet2(_firstInterimObserved, this)) return;
|
|
147
|
+
_classPrivateFieldSet2(_firstInterimObserved, this, true);
|
|
148
|
+
const elapsed = _classPrivateFieldGet2(_speechStartedAt, this) === void 0 ? void 0 : safeDuration(_classPrivateFieldGet2(_now, this).call(this) - _classPrivateFieldGet2(_speechStartedAt, this));
|
|
149
|
+
if (elapsed !== void 0) _classPrivateFieldGet2(_metrics, this).speechStartToFirstInterimMs = elapsed;
|
|
150
|
+
this.emit("stt.interim", {
|
|
151
|
+
...characters === void 0 ? {} : { characters },
|
|
152
|
+
...elapsed === void 0 ? {} : { speech_to_interim_ms: elapsed }
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
finalInput(characters) {
|
|
156
|
+
_classPrivateFieldSet2(_finalInputAt, this, _classPrivateFieldGet2(_now, this).call(this));
|
|
157
|
+
const elapsed = _classPrivateFieldGet2(_speechStartedAt, this) === void 0 ? void 0 : safeDuration(_classPrivateFieldGet2(_finalInputAt, this) - _classPrivateFieldGet2(_speechStartedAt, this));
|
|
158
|
+
if (elapsed !== void 0) _classPrivateFieldGet2(_metrics, this).speechStartToFinalMs = elapsed;
|
|
159
|
+
this.emit("stt.utterance", {
|
|
160
|
+
...characters === void 0 ? {} : { characters },
|
|
161
|
+
...elapsed === void 0 ? {} : { speech_to_final_ms: elapsed }
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
recordAfterTranscribe(durationMs, outcome, characters) {
|
|
165
|
+
_classPrivateFieldGet2(_metrics, this).afterTranscribeMs = safeDuration(durationMs);
|
|
166
|
+
this.emit("after_transcribe.completed", {
|
|
167
|
+
duration_ms: safeDuration(durationMs),
|
|
168
|
+
outcome,
|
|
169
|
+
characters
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
beginTtsSentence() {
|
|
173
|
+
_classPrivateFieldGet2(_metrics, this).ttsWorkMs ??= 0;
|
|
174
|
+
return new TtsSentenceTracker(this, _classPrivateFieldGet2(_now, this).call(this));
|
|
175
|
+
}
|
|
176
|
+
recordTtsProviderStarted() {
|
|
177
|
+
_classPrivateFieldGet2(_firstTtsProviderAt, this) ?? _classPrivateFieldSet2(_firstTtsProviderAt, this, _classPrivateFieldGet2(_now, this).call(this));
|
|
178
|
+
}
|
|
179
|
+
recordTtsSentence(startedAt, outcome) {
|
|
180
|
+
const duration = safeDuration(_classPrivateFieldGet2(_now, this).call(this) - startedAt);
|
|
181
|
+
_classPrivateFieldGet2(_metrics, this).ttsWorkMs = (_classPrivateFieldGet2(_metrics, this).ttsWorkMs ?? 0) + duration;
|
|
182
|
+
if (outcome === "failed") _classPrivateFieldSet2(_hasTtsFailures, this, true);
|
|
183
|
+
return duration;
|
|
184
|
+
}
|
|
185
|
+
finishTts() {
|
|
186
|
+
if (_classPrivateFieldGet2(_ttsFinished, this)) return;
|
|
187
|
+
_classPrivateFieldSet2(_ttsFinished, this, true);
|
|
188
|
+
if (_classPrivateFieldGet2(_firstTtsProviderAt, this) !== void 0) _classPrivateFieldGet2(_metrics, this).ttsWallMs = safeDuration(_classPrivateFieldGet2(_now, this).call(this) - _classPrivateFieldGet2(_firstTtsProviderAt, this));
|
|
189
|
+
}
|
|
190
|
+
audioSent() {
|
|
191
|
+
const now = _classPrivateFieldGet2(_now, this).call(this);
|
|
192
|
+
if (_classPrivateFieldGet2(_firstAudioAt, this) !== void 0) return;
|
|
193
|
+
_classPrivateFieldSet2(_firstAudioAt, this, now);
|
|
194
|
+
if (_classPrivateFieldGet2(_finalInputAt, this) !== void 0) _classPrivateFieldGet2(_metrics, this).finalInputToFirstAudioMs = safeDuration(now - _classPrivateFieldGet2(_finalInputAt, this));
|
|
195
|
+
if (_classPrivateFieldGet2(_firstTtsProviderAt, this) !== void 0) _classPrivateFieldGet2(_metrics, this).ttsToFirstAudioMs = safeDuration(now - _classPrivateFieldGet2(_firstTtsProviderAt, this));
|
|
196
|
+
}
|
|
197
|
+
recordModelFirstText(durationMs) {
|
|
198
|
+
_classPrivateFieldGet2(_metrics, this).modelToFirstTextMs = safeDuration(durationMs);
|
|
199
|
+
}
|
|
200
|
+
recordReasoning(durationMs) {
|
|
201
|
+
_classPrivateFieldGet2(_metrics, this).exposedReasoningMs = (_classPrivateFieldGet2(_metrics, this).exposedReasoningMs ?? 0) + safeDuration(durationMs);
|
|
202
|
+
}
|
|
203
|
+
recordModelTerminal(durationMs) {
|
|
204
|
+
_classPrivateFieldGet2(_metrics, this).modelStreamConsumptionMs = safeDuration(durationMs);
|
|
205
|
+
}
|
|
206
|
+
finish(outcome) {
|
|
207
|
+
this.finishTts();
|
|
208
|
+
const summary = {
|
|
209
|
+
turnId: this.turnId,
|
|
210
|
+
source: this.source,
|
|
211
|
+
outcome,
|
|
212
|
+
turnTotalMs: safeDuration(_classPrivateFieldGet2(_now, this).call(this) - _classPrivateFieldGet2(_startedAt2, this)),
|
|
213
|
+
..._classPrivateFieldGet2(_metrics, this)
|
|
214
|
+
};
|
|
215
|
+
this.emit("turn.ended", {
|
|
216
|
+
outcome,
|
|
217
|
+
duration_ms: summary.turnTotalMs
|
|
218
|
+
});
|
|
219
|
+
try {
|
|
220
|
+
_classPrivateFieldGet2(_connection, this).send(JSON.stringify({
|
|
221
|
+
type: "turn_metrics",
|
|
222
|
+
...summary
|
|
223
|
+
}));
|
|
224
|
+
} catch {}
|
|
225
|
+
return summary;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
var _turn2 = /* @__PURE__ */ new WeakMap();
|
|
229
|
+
var _now2 = /* @__PURE__ */ new WeakMap();
|
|
230
|
+
var _startedAt3 = /* @__PURE__ */ new WeakMap();
|
|
231
|
+
var _firstTextObserved = /* @__PURE__ */ new WeakMap();
|
|
232
|
+
var _reasoningActive = /* @__PURE__ */ new WeakMap();
|
|
233
|
+
var _reasoningStartedAt = /* @__PURE__ */ new WeakMap();
|
|
234
|
+
var _characters = /* @__PURE__ */ new WeakMap();
|
|
235
|
+
var _terminal = /* @__PURE__ */ new WeakMap();
|
|
236
|
+
var _ModelDiagnosticTracker_brand = /* @__PURE__ */ new WeakSet();
|
|
237
|
+
/**
|
|
238
|
+
* Tracks one model stream without retaining model or reasoning content.
|
|
239
|
+
* Lifecycle methods are idempotent so stale turn cleanup cannot affect a
|
|
240
|
+
* successor tracker.
|
|
241
|
+
*/
|
|
242
|
+
var ModelDiagnosticTracker = class {
|
|
243
|
+
constructor(turn, now) {
|
|
244
|
+
_classPrivateMethodInitSpec(this, _ModelDiagnosticTracker_brand);
|
|
245
|
+
_classPrivateFieldInitSpec(this, _turn2, void 0);
|
|
246
|
+
_classPrivateFieldInitSpec(this, _now2, void 0);
|
|
247
|
+
_classPrivateFieldInitSpec(this, _startedAt3, void 0);
|
|
248
|
+
_classPrivateFieldInitSpec(this, _firstTextObserved, false);
|
|
249
|
+
_classPrivateFieldInitSpec(this, _reasoningActive, false);
|
|
250
|
+
_classPrivateFieldInitSpec(this, _reasoningStartedAt, 0);
|
|
251
|
+
_classPrivateFieldInitSpec(this, _characters, 0);
|
|
252
|
+
_classPrivateFieldInitSpec(this, _terminal, false);
|
|
253
|
+
_classPrivateFieldSet2(_turn2, this, turn);
|
|
254
|
+
_classPrivateFieldSet2(_now2, this, now);
|
|
255
|
+
_classPrivateFieldSet2(_startedAt3, this, now());
|
|
256
|
+
_classPrivateFieldGet2(_turn2, this).emit("model.started");
|
|
257
|
+
}
|
|
258
|
+
observe(event) {
|
|
259
|
+
if (_classPrivateFieldGet2(_terminal, this)) return;
|
|
260
|
+
switch (event.type) {
|
|
261
|
+
case "text":
|
|
262
|
+
_classPrivateFieldSet2(_characters, this, _classPrivateFieldGet2(_characters, this) + event.text.length);
|
|
263
|
+
if (!_classPrivateFieldGet2(_firstTextObserved, this) && event.text.trim().length > 0) {
|
|
264
|
+
_classPrivateFieldSet2(_firstTextObserved, this, true);
|
|
265
|
+
const elapsed = safeDuration(_classPrivateFieldGet2(_now2, this).call(this) - _classPrivateFieldGet2(_startedAt3, this));
|
|
266
|
+
_classPrivateFieldGet2(_turn2, this).recordModelFirstText(elapsed);
|
|
267
|
+
_classPrivateFieldGet2(_turn2, this).emit("model.first_text", { elapsed_ms: elapsed });
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
case "reasoning-start":
|
|
271
|
+
_assertClassBrand(_ModelDiagnosticTracker_brand, this, _startReasoning).call(this);
|
|
272
|
+
break;
|
|
273
|
+
case "reasoning-end":
|
|
274
|
+
_assertClassBrand(_ModelDiagnosticTracker_brand, this, _completeReasoning).call(this, "completed");
|
|
275
|
+
break;
|
|
276
|
+
case "finish":
|
|
277
|
+
_assertClassBrand(_ModelDiagnosticTracker_brand, this, _completeReasoning).call(this, "stream_finished");
|
|
278
|
+
break;
|
|
279
|
+
case "error": break;
|
|
280
|
+
case "boundary": break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
complete(outcome, finishReason) {
|
|
284
|
+
if (_classPrivateFieldGet2(_terminal, this)) return;
|
|
285
|
+
_assertClassBrand(_ModelDiagnosticTracker_brand, this, _completeReasoning).call(this, "stream_completed");
|
|
286
|
+
_classPrivateFieldSet2(_terminal, this, true);
|
|
287
|
+
const duration = this.elapsedMs();
|
|
288
|
+
_classPrivateFieldGet2(_turn2, this).recordModelTerminal(duration);
|
|
289
|
+
_classPrivateFieldGet2(_turn2, this).emit("model.completed", {
|
|
290
|
+
duration_ms: duration,
|
|
291
|
+
outcome,
|
|
292
|
+
characters: _classPrivateFieldGet2(_characters, this),
|
|
293
|
+
...finishReason === void 0 ? {} : { finish_reason: finishReason }
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
fail(error) {
|
|
297
|
+
if (_classPrivateFieldGet2(_terminal, this)) return;
|
|
298
|
+
_assertClassBrand(_ModelDiagnosticTracker_brand, this, _completeReasoning).call(this, "error");
|
|
299
|
+
_classPrivateFieldSet2(_terminal, this, true);
|
|
300
|
+
_classPrivateFieldGet2(_turn2, this).recordModelTerminal(this.elapsedMs());
|
|
301
|
+
_classPrivateFieldGet2(_turn2, this).emit("model.failed", { error });
|
|
302
|
+
}
|
|
303
|
+
abort() {
|
|
304
|
+
if (_classPrivateFieldGet2(_terminal, this)) return;
|
|
305
|
+
_assertClassBrand(_ModelDiagnosticTracker_brand, this, _completeReasoning).call(this, "aborted");
|
|
306
|
+
_classPrivateFieldSet2(_terminal, this, true);
|
|
307
|
+
_classPrivateFieldGet2(_turn2, this).recordModelTerminal(this.elapsedMs());
|
|
308
|
+
}
|
|
309
|
+
elapsedMs() {
|
|
310
|
+
return safeDuration(_classPrivateFieldGet2(_now2, this).call(this) - _classPrivateFieldGet2(_startedAt3, this));
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
function _startReasoning() {
|
|
314
|
+
if (_classPrivateFieldGet2(_reasoningActive, this)) return;
|
|
315
|
+
_classPrivateFieldSet2(_reasoningActive, this, true);
|
|
316
|
+
_classPrivateFieldSet2(_reasoningStartedAt, this, _classPrivateFieldGet2(_now2, this).call(this));
|
|
317
|
+
_classPrivateFieldGet2(_turn2, this).emit("model.reasoning_started");
|
|
318
|
+
}
|
|
319
|
+
function _completeReasoning(outcome) {
|
|
320
|
+
if (!_classPrivateFieldGet2(_reasoningActive, this)) return;
|
|
321
|
+
_classPrivateFieldSet2(_reasoningActive, this, false);
|
|
322
|
+
const duration = safeDuration(_classPrivateFieldGet2(_now2, this).call(this) - _classPrivateFieldGet2(_reasoningStartedAt, this));
|
|
323
|
+
_classPrivateFieldGet2(_turn2, this).recordReasoning(duration);
|
|
324
|
+
_classPrivateFieldGet2(_turn2, this).emit("model.reasoning_completed", {
|
|
325
|
+
duration_ms: duration,
|
|
326
|
+
outcome
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
var _enabled = /* @__PURE__ */ new WeakMap();
|
|
330
|
+
var _ClientDiagnostics_brand = /* @__PURE__ */ new WeakSet();
|
|
331
|
+
/** Browser-only diagnostics. Activation always comes from the server welcome. */
|
|
332
|
+
var ClientDiagnostics = class {
|
|
333
|
+
constructor() {
|
|
334
|
+
_classPrivateMethodInitSpec(this, _ClientDiagnostics_brand);
|
|
335
|
+
_classPrivateFieldInitSpec(this, _enabled, false);
|
|
336
|
+
}
|
|
337
|
+
setEnabled(enabled) {
|
|
338
|
+
_classPrivateFieldSet2(_enabled, this, enabled);
|
|
339
|
+
}
|
|
340
|
+
emit(event, data) {
|
|
341
|
+
if (!_classPrivateFieldGet2(_enabled, this)) return;
|
|
342
|
+
_assertClassBrand(_ClientDiagnostics_brand, this, _log).call(this, "client", createDiagnosticEvent(event, data));
|
|
343
|
+
}
|
|
344
|
+
receive(event) {
|
|
345
|
+
if (!_classPrivateFieldGet2(_enabled, this)) return;
|
|
346
|
+
_assertClassBrand(_ClientDiagnostics_brand, this, _log).call(this, "server", event);
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
function _log(origin, event) {
|
|
350
|
+
try {
|
|
351
|
+
console.info(`[voice:${origin}] ${event.event}`, {
|
|
352
|
+
timestamp: event.timestamp,
|
|
353
|
+
...event.data ?? {}
|
|
354
|
+
});
|
|
355
|
+
} catch {}
|
|
356
|
+
}
|
|
357
|
+
//#endregion
|
|
358
|
+
export { ServerDiagnostics as n, ClientDiagnostics as t };
|
|
359
|
+
|
|
360
|
+
//# sourceMappingURL=diagnostics-C4jcz3VK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics-C4jcz3VK.js","names":[],"sources":["../src/voice/diagnostics.ts"],"sourcesContent":["import { VoiceProviderError } from \"./errors\";\nimport type { TextStreamEvent } from \"./text-stream\";\nimport type {\n VoiceDiagnosticEvent,\n VoiceModelFinishReason,\n VoiceTurnMetrics,\n VoiceTurnOutcome,\n VoiceTurnSource\n} from \"./types\";\n\nconst MAX_STRING_LENGTH = 160;\n\nconst PRIVATE_KEY =\n /(^|_)(audio|body|contents?|exceptions?|messages?|prompts?|query|results?|stack|text|tokens?|tools?|transcripts?|arguments?)(_|$)/i;\n\ntype DiagnosticValue = string | number | boolean | null | Error;\nexport type DiagnosticData = Record<string, DiagnosticValue>;\n\ntype DiagnosticConnection = {\n send(data: string | ArrayBuffer): void;\n};\n\nfunction boundedString(value: string, maxLength = MAX_STRING_LENGTH): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length <= maxLength\n ? normalized\n : `${normalized.slice(0, maxLength - 1)}…`;\n}\n\nfunction diagnosticErrorData(error: Error): Record<string, unknown> {\n const summary: Record<string, unknown> = {\n name: boundedString(error.name || \"Error\"),\n message: boundedString(error.message || \"Unknown error\")\n };\n\n if (error instanceof VoiceProviderError) {\n if (error.code !== undefined) summary.code = error.code;\n if (error.status !== undefined) summary.status = error.status;\n if (error.closeCode !== undefined) summary.closeCode = error.closeCode;\n if (error.closeReason !== undefined) {\n summary.closeReason = boundedString(error.closeReason);\n }\n if (error.wasClean !== undefined) summary.wasClean = error.wasClean;\n }\n\n return summary;\n}\n\n/**\n * Keep diagnostic metadata bounded and reject fields that could carry user or\n * provider content. Instrumentation should still pass only known-safe values.\n */\nexport function sanitizeDiagnosticData(\n data?: DiagnosticData\n): Record<string, unknown> | undefined {\n if (!data) return undefined;\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (PRIVATE_KEY.test(key)) continue;\n sanitized[key] =\n value instanceof Error\n ? diagnosticErrorData(value)\n : typeof value === \"string\"\n ? boundedString(value)\n : value;\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nfunction createDiagnosticEvent(\n event: string,\n data?: DiagnosticData,\n timestamp = Date.now()\n): VoiceDiagnosticEvent {\n const safeData = sanitizeDiagnosticData(data);\n return {\n event,\n timestamp,\n ...(safeData ? { data: safeData } : {})\n };\n}\n\n/** Server-only diagnostics. The sink is the reserved voice protocol message. */\nexport class ServerDiagnostics {\n readonly browserConsole: boolean;\n\n constructor(browserConsole: boolean) {\n this.browserConsole = browserConsole;\n }\n\n emit(\n connection: DiagnosticConnection,\n event: string,\n data?: DiagnosticData\n ): void {\n if (!this.browserConsole) return;\n\n try {\n connection.send(\n JSON.stringify({\n type: \"diagnostic\",\n ...createDiagnosticEvent(event, data)\n })\n );\n } catch {\n // Diagnostics must never alter call behavior.\n }\n }\n\n turn(\n connection: DiagnosticConnection,\n turnId: string,\n source: VoiceTurnSource = \"speech\",\n now: () => number = Date.now\n ): TurnDiagnostics {\n return new TurnDiagnostics(this, connection, turnId, source, now);\n }\n}\n\nfunction safeDuration(value: number): number {\n return Math.max(0, value);\n}\n\nexport type TtsSentenceOutcome = \"completed\" | \"skipped\" | \"failed\";\n\n/** One sentence attempt measured by its parent turn clock. */\nexport class TtsSentenceTracker {\n #turn: TurnDiagnostics;\n #startedAt: number;\n\n constructor(turn: TurnDiagnostics, startedAt: number) {\n this.#turn = turn;\n this.#startedAt = startedAt;\n }\n\n providerStarted(): void {\n this.#turn.recordTtsProviderStarted();\n }\n\n settle(outcome: TtsSentenceOutcome): number {\n return this.#turn.recordTtsSentence(this.#startedAt, outcome);\n }\n}\n\n/**\n * One content-free turn lifecycle. Diagnostics and stable metrics are emitted\n * from the same recorded landmarks; application metrics never parse event\n * names or diagnostic metadata.\n */\nexport class TurnDiagnostics {\n readonly turnId: string;\n readonly source: VoiceTurnSource;\n #diagnostics: ServerDiagnostics;\n #connection: DiagnosticConnection;\n #now: () => number;\n #startedAt: number;\n #speechStartedAt: number | undefined;\n #firstInterimObserved = false;\n #finalInputAt: number | undefined;\n #firstTtsProviderAt: number | undefined;\n #firstAudioAt: number | undefined;\n #ttsFinished = false;\n #hasTtsFailures = false;\n #metrics: Partial<VoiceTurnMetrics> = {};\n\n constructor(\n diagnostics: ServerDiagnostics,\n connection: DiagnosticConnection,\n turnId: string,\n source: VoiceTurnSource,\n now: () => number\n ) {\n this.#diagnostics = diagnostics;\n this.#connection = connection;\n this.#now = now;\n this.#startedAt = now();\n this.turnId = turnId;\n this.source = source;\n }\n\n get hasTtsFailures(): boolean {\n return this.#hasTtsFailures;\n }\n\n get ttsWorkMs(): number {\n return this.#metrics.ttsWorkMs ?? 0;\n }\n\n emit(event: string, data?: DiagnosticData): void {\n const scopedData: DiagnosticData = {\n ...data,\n turn_id: this.turnId\n };\n this.#diagnostics.emit(this.#connection, event, scopedData);\n }\n\n startModel(): ModelDiagnosticTracker {\n return new ModelDiagnosticTracker(this, this.#now);\n }\n\n markTextInput(): void {\n this.#finalInputAt ??= this.#startedAt;\n }\n\n speechStarted(): void {\n this.#speechStartedAt ??= this.#now();\n this.emit(\"speech.started\");\n }\n\n firstInterim(characters?: number): void {\n if (this.#firstInterimObserved) return;\n this.#firstInterimObserved = true;\n const elapsed =\n this.#speechStartedAt === undefined\n ? undefined\n : safeDuration(this.#now() - this.#speechStartedAt);\n if (elapsed !== undefined) {\n this.#metrics.speechStartToFirstInterimMs = elapsed;\n }\n this.emit(\"stt.interim\", {\n ...(characters === undefined ? {} : { characters }),\n ...(elapsed === undefined ? {} : { speech_to_interim_ms: elapsed })\n });\n }\n\n finalInput(characters?: number): void {\n this.#finalInputAt = this.#now();\n const elapsed =\n this.#speechStartedAt === undefined\n ? undefined\n : safeDuration(this.#finalInputAt - this.#speechStartedAt);\n if (elapsed !== undefined) this.#metrics.speechStartToFinalMs = elapsed;\n this.emit(\"stt.utterance\", {\n ...(characters === undefined ? {} : { characters }),\n ...(elapsed === undefined ? {} : { speech_to_final_ms: elapsed })\n });\n }\n\n recordAfterTranscribe(\n durationMs: number,\n outcome: \"accepted\" | \"skipped\",\n characters: number\n ): void {\n this.#metrics.afterTranscribeMs = safeDuration(durationMs);\n this.emit(\"after_transcribe.completed\", {\n duration_ms: safeDuration(durationMs),\n outcome,\n characters\n });\n }\n\n beginTtsSentence(): TtsSentenceTracker {\n this.#metrics.ttsWorkMs ??= 0;\n return new TtsSentenceTracker(this, this.#now());\n }\n\n recordTtsProviderStarted(): void {\n this.#firstTtsProviderAt ??= this.#now();\n }\n\n recordTtsSentence(startedAt: number, outcome: TtsSentenceOutcome): number {\n const duration = safeDuration(this.#now() - startedAt);\n this.#metrics.ttsWorkMs = (this.#metrics.ttsWorkMs ?? 0) + duration;\n if (outcome === \"failed\") this.#hasTtsFailures = true;\n return duration;\n }\n\n finishTts(): void {\n if (this.#ttsFinished) return;\n this.#ttsFinished = true;\n if (this.#firstTtsProviderAt !== undefined) {\n this.#metrics.ttsWallMs = safeDuration(\n this.#now() - this.#firstTtsProviderAt\n );\n }\n }\n\n audioSent(): void {\n const now = this.#now();\n if (this.#firstAudioAt !== undefined) return;\n this.#firstAudioAt = now;\n if (this.#finalInputAt !== undefined) {\n this.#metrics.finalInputToFirstAudioMs = safeDuration(\n now - this.#finalInputAt\n );\n }\n if (this.#firstTtsProviderAt !== undefined) {\n this.#metrics.ttsToFirstAudioMs = safeDuration(\n now - this.#firstTtsProviderAt\n );\n }\n }\n\n recordModelFirstText(durationMs: number): void {\n this.#metrics.modelToFirstTextMs = safeDuration(durationMs);\n }\n\n recordReasoning(durationMs: number): void {\n this.#metrics.exposedReasoningMs =\n (this.#metrics.exposedReasoningMs ?? 0) + safeDuration(durationMs);\n }\n\n recordModelTerminal(durationMs: number): void {\n this.#metrics.modelStreamConsumptionMs = safeDuration(durationMs);\n }\n\n finish(outcome: VoiceTurnOutcome): VoiceTurnMetrics {\n this.finishTts();\n\n const summary: VoiceTurnMetrics = {\n turnId: this.turnId,\n source: this.source,\n outcome,\n turnTotalMs: safeDuration(this.#now() - this.#startedAt),\n ...this.#metrics\n };\n\n this.emit(\"turn.ended\", {\n outcome,\n duration_ms: summary.turnTotalMs\n });\n try {\n this.#connection.send(\n JSON.stringify({ type: \"turn_metrics\", ...summary })\n );\n } catch {\n // A closing connection can make the terminal summary undeliverable.\n }\n return summary;\n }\n}\n\n/**\n * Tracks one model stream without retaining model or reasoning content.\n * Lifecycle methods are idempotent so stale turn cleanup cannot affect a\n * successor tracker.\n */\nexport class ModelDiagnosticTracker {\n #turn: TurnDiagnostics;\n #now: () => number;\n #startedAt: number;\n #firstTextObserved = false;\n #reasoningActive = false;\n #reasoningStartedAt = 0;\n #characters = 0;\n #terminal = false;\n\n constructor(turn: TurnDiagnostics, now: () => number) {\n this.#turn = turn;\n this.#now = now;\n this.#startedAt = now();\n this.#turn.emit(\"model.started\");\n }\n\n observe(event: TextStreamEvent): void {\n if (this.#terminal) return;\n\n switch (event.type) {\n case \"text\":\n this.#characters += event.text.length;\n if (!this.#firstTextObserved && event.text.trim().length > 0) {\n this.#firstTextObserved = true;\n const elapsed = safeDuration(this.#now() - this.#startedAt);\n this.#turn.recordModelFirstText(elapsed);\n this.#turn.emit(\"model.first_text\", { elapsed_ms: elapsed });\n }\n break;\n case \"reasoning-start\":\n this.#startReasoning();\n break;\n case \"reasoning-end\":\n this.#completeReasoning(\"completed\");\n break;\n case \"finish\":\n this.#completeReasoning(\"stream_finished\");\n break;\n case \"error\":\n break;\n case \"boundary\":\n break;\n }\n }\n\n complete(\n outcome: \"output\" | \"no_output\",\n finishReason?: VoiceModelFinishReason\n ): void {\n if (this.#terminal) return;\n this.#completeReasoning(\"stream_completed\");\n this.#terminal = true;\n const duration = this.elapsedMs();\n this.#turn.recordModelTerminal(duration);\n this.#turn.emit(\"model.completed\", {\n duration_ms: duration,\n outcome,\n characters: this.#characters,\n ...(finishReason === undefined ? {} : { finish_reason: finishReason })\n });\n }\n\n fail(error: Error): void {\n if (this.#terminal) return;\n this.#completeReasoning(\"error\");\n this.#terminal = true;\n this.#turn.recordModelTerminal(this.elapsedMs());\n this.#turn.emit(\"model.failed\", { error });\n }\n\n abort(): void {\n if (this.#terminal) return;\n this.#completeReasoning(\"aborted\");\n this.#terminal = true;\n this.#turn.recordModelTerminal(this.elapsedMs());\n }\n\n elapsedMs(): number {\n return safeDuration(this.#now() - this.#startedAt);\n }\n\n #startReasoning(): void {\n if (this.#reasoningActive) return;\n this.#reasoningActive = true;\n this.#reasoningStartedAt = this.#now();\n this.#turn.emit(\"model.reasoning_started\");\n }\n\n #completeReasoning(outcome: string): void {\n if (!this.#reasoningActive) return;\n this.#reasoningActive = false;\n const duration = safeDuration(this.#now() - this.#reasoningStartedAt);\n this.#turn.recordReasoning(duration);\n this.#turn.emit(\"model.reasoning_completed\", {\n duration_ms: duration,\n outcome\n });\n }\n}\n\n/** Browser-only diagnostics. Activation always comes from the server welcome. */\nexport class ClientDiagnostics {\n #enabled = false;\n\n setEnabled(enabled: boolean): void {\n this.#enabled = enabled;\n }\n\n emit(event: string, data?: DiagnosticData): void {\n if (!this.#enabled) return;\n this.#log(\"client\", createDiagnosticEvent(event, data));\n }\n\n receive(event: VoiceDiagnosticEvent): void {\n if (!this.#enabled) return;\n this.#log(\"server\", event);\n }\n\n #log(origin: \"client\" | \"server\", event: VoiceDiagnosticEvent): void {\n try {\n console.info(`[voice:${origin}] ${event.event}`, {\n timestamp: event.timestamp,\n ...(event.data ?? {})\n });\n } catch {\n // Console replacements and test spies are allowed to throw.\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
D as ChannelInboundMessage,
|
|
3
|
+
F as ChannelMessageSurface,
|
|
4
|
+
U as UserIdentity,
|
|
5
|
+
V as ChannelIdentity,
|
|
6
|
+
a as ChannelApprovalRequestOptions,
|
|
7
|
+
d as ChannelRoute,
|
|
8
|
+
h as DeliveryResult,
|
|
9
|
+
j as ChannelIngressEvent,
|
|
10
|
+
l as ChannelDeliveryOptions,
|
|
11
|
+
n as Channel,
|
|
12
|
+
p as ChannelStreamOptions,
|
|
13
|
+
s as ChannelChunkSource,
|
|
14
|
+
u as ChannelMessage,
|
|
15
|
+
w as ChannelEmailInput,
|
|
16
|
+
y as ChannelApprovalResponse
|
|
17
|
+
} from "./channel-Bnm4S7T2.js";
|
|
18
|
+
|
|
19
|
+
//#region src/channels/host/index.d.ts
|
|
20
|
+
type ChannelMessageEvent = {
|
|
21
|
+
channelKey: string;
|
|
22
|
+
route: string /** Stable identity derived only from the configured Channel and eventId. */;
|
|
23
|
+
dispatchId: string;
|
|
24
|
+
message: ChannelInboundMessage;
|
|
25
|
+
};
|
|
26
|
+
type ChannelApprovalResponseEvent = {
|
|
27
|
+
channelKey: string;
|
|
28
|
+
route: string /** Stable identity derived only from the configured Channel and eventId. */;
|
|
29
|
+
dispatchId: string;
|
|
30
|
+
response: ChannelApprovalResponse;
|
|
31
|
+
};
|
|
32
|
+
type ChannelRouteEvent = {
|
|
33
|
+
channelKey: string;
|
|
34
|
+
event: ChannelIngressEvent;
|
|
35
|
+
route:
|
|
36
|
+
| string
|
|
37
|
+
| null /** Stable identity derived only from the configured Channel and eventId. */;
|
|
38
|
+
dispatchId: string;
|
|
39
|
+
};
|
|
40
|
+
type ChannelHostOptions = {
|
|
41
|
+
channels: Record<
|
|
42
|
+
string,
|
|
43
|
+
Channel
|
|
44
|
+
> /** Used when a Channel does not provide a route. Default: event thread id. */;
|
|
45
|
+
defaultRoute?: ChannelRoute /** Resolve an existing, explicitly linked application user. */;
|
|
46
|
+
findUser?(
|
|
47
|
+
identity: ChannelIdentity
|
|
48
|
+
): Promise<UserIdentity | null> /** Observes every valid route outcome before application dispatch. */;
|
|
49
|
+
onRoute?(event: ChannelRouteEvent): void | Promise<void>;
|
|
50
|
+
onMessage?(event: ChannelMessageEvent): void | Promise<void>;
|
|
51
|
+
onApprovalResponse?(
|
|
52
|
+
event: ChannelApprovalResponseEvent
|
|
53
|
+
): void | Promise<void>;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Authenticates and normalizes ingress through configured Channel adapters,
|
|
57
|
+
* resolves outbound surfaces, and awaits the application's durable handoff.
|
|
58
|
+
*/
|
|
59
|
+
declare class ChannelHost {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: ChannelHostOptions);
|
|
62
|
+
handleRequest(request: Request): Promise<Response | undefined>;
|
|
63
|
+
handleEmail(email: ChannelEmailInput): Promise<boolean>;
|
|
64
|
+
/** Deliver through the configured Channel or composite named by the surface. */
|
|
65
|
+
deliver(
|
|
66
|
+
surface: ChannelMessageSurface,
|
|
67
|
+
message: ChannelMessage,
|
|
68
|
+
options?: ChannelDeliveryOptions
|
|
69
|
+
): Promise<DeliveryResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Deliver a progressively generated answer to the Channel or composite
|
|
72
|
+
* named by the surface.
|
|
73
|
+
*
|
|
74
|
+
* A Channel that can stream consumes the stream itself. A Channel that
|
|
75
|
+
* cannot never learns it was a stream, because the Host collects the answer
|
|
76
|
+
* and calls `deliver` once.
|
|
77
|
+
*/
|
|
78
|
+
stream(
|
|
79
|
+
surface: ChannelMessageSurface,
|
|
80
|
+
chunks: ChannelChunkSource,
|
|
81
|
+
options?: ChannelStreamOptions
|
|
82
|
+
): Promise<DeliveryResult>;
|
|
83
|
+
/** Request approval through the Channel or composite named by the surface. */
|
|
84
|
+
requestApproval(
|
|
85
|
+
surface: ChannelMessageSurface,
|
|
86
|
+
options: ChannelApprovalRequestOptions
|
|
87
|
+
): Promise<DeliveryResult>;
|
|
88
|
+
/** Return the identity's configured Channel destination, when supported. */
|
|
89
|
+
contactSurface(identity: ChannelIdentity): ChannelMessageSurface | null;
|
|
90
|
+
/** Resolve whether a surface can currently be selected without delivery. */
|
|
91
|
+
isAvailable(surface: ChannelMessageSurface): Promise<boolean>;
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export {
|
|
95
|
+
ChannelRouteEvent as a,
|
|
96
|
+
ChannelMessageEvent as i,
|
|
97
|
+
ChannelHost as n,
|
|
98
|
+
ChannelHostOptions as r,
|
|
99
|
+
ChannelApprovalResponseEvent as t
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=index-BB0kqhIz.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//#region src/tasks/errors.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Error classes for the Tasks capability. Each carries a stable `name` so
|
|
4
|
+
* hosts and tests can classify failures without depending on message text.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Thrown by a step callback to fail its run immediately, skipping any
|
|
8
|
+
* remaining retry attempts.
|
|
9
|
+
*
|
|
10
|
+
* Errors named `"NonRetryableError"` from other sources (for example
|
|
11
|
+
* `cloudflare:workflows`) are honored the same way.
|
|
12
|
+
*
|
|
13
|
+
* @experimental The API surface may change before stabilizing.
|
|
14
|
+
*/
|
|
15
|
+
declare class NonRetryableError extends Error {
|
|
16
|
+
constructor(
|
|
17
|
+
message: string,
|
|
18
|
+
options?: {
|
|
19
|
+
cause?: unknown;
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Thrown before executing user code when one replay uses the same step name
|
|
25
|
+
* twice. Step names are durable journal keys and must be unique within a run.
|
|
26
|
+
*
|
|
27
|
+
* @experimental The API surface may change before stabilizing.
|
|
28
|
+
*/
|
|
29
|
+
declare class DuplicateTaskStepError extends Error {
|
|
30
|
+
/** The step name used more than once. */
|
|
31
|
+
readonly stepName: string;
|
|
32
|
+
constructor(stepName: string);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Thrown when a replay observes a journal that this handler code cannot have
|
|
36
|
+
* written — a known step under a different kind, for example. The run fails
|
|
37
|
+
* rather than guessing; changing a definition's step layout for in-flight
|
|
38
|
+
* runs requires versioning the definition name.
|
|
39
|
+
*
|
|
40
|
+
* @experimental The API surface may change before stabilizing.
|
|
41
|
+
*/
|
|
42
|
+
declare class TaskReplayDivergedError extends Error {
|
|
43
|
+
/** The step name where replay diverged from the journal. */
|
|
44
|
+
readonly stepName: string;
|
|
45
|
+
constructor(stepName: string, detail: string);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Recorded against a run whose persisted definition name is no longer
|
|
49
|
+
* registered after a deployment. The run fails visibly; it is never silently
|
|
50
|
+
* deleted and never replayed against a different handler.
|
|
51
|
+
*
|
|
52
|
+
* @experimental The API surface may change before stabilizing.
|
|
53
|
+
*/
|
|
54
|
+
declare class MissingTaskDefinitionError extends Error {
|
|
55
|
+
/** The persisted definition name that no longer resolves. */
|
|
56
|
+
readonly definition: string;
|
|
57
|
+
constructor(definition: string);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Thrown when a Task input, step result, metadata value, or final result is
|
|
61
|
+
* not JSON-serializable or exceeds the serialized size limit.
|
|
62
|
+
*
|
|
63
|
+
* @experimental The API surface may change before stabilizing.
|
|
64
|
+
*/
|
|
65
|
+
declare class TaskSerializationError extends Error {
|
|
66
|
+
constructor(context: string, detail: string);
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region src/tasks/serialization.d.ts
|
|
70
|
+
/**
|
|
71
|
+
* Value serialization for the Tasks capability.
|
|
72
|
+
*
|
|
73
|
+
* Task inputs, step results, metadata, and final results persist as JSON
|
|
74
|
+
* text in SQLite. `undefined` (and a `void` handler result) is represented
|
|
75
|
+
* as SQL `NULL` rather than a JSON envelope, so the JSON column space stays
|
|
76
|
+
* plain: `"null"` is JSON `null`, column `NULL` is `undefined`.
|
|
77
|
+
*/
|
|
78
|
+
/** Default ceiling for one serialized value (1 MiB). */
|
|
79
|
+
declare const MAX_SERIALIZED_BYTES = 1048576;
|
|
80
|
+
//#endregion
|
|
81
|
+
export {
|
|
82
|
+
TaskReplayDivergedError as a,
|
|
83
|
+
NonRetryableError as i,
|
|
84
|
+
DuplicateTaskStepError as n,
|
|
85
|
+
TaskSerializationError as o,
|
|
86
|
+
MissingTaskDefinitionError as r,
|
|
87
|
+
MAX_SERIALIZED_BYTES as t
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=index-XDkuQ7zm.d.ts.map
|
|
@@ -785,6 +785,8 @@ declare const channels: {
|
|
|
785
785
|
readonly chat: Channel<any, any>;
|
|
786
786
|
readonly transcript: Channel<any, any>;
|
|
787
787
|
readonly fiber: Channel<any, any>;
|
|
788
|
+
readonly task: Channel<any, any>;
|
|
789
|
+
readonly stream: Channel<any, any>;
|
|
788
790
|
readonly agentTool: Channel<any, any>;
|
|
789
791
|
readonly schedule: Channel<any, any>;
|
|
790
792
|
readonly lifecycle: Channel<any, any>;
|
|
@@ -932,4 +934,4 @@ export {
|
|
|
932
934
|
MCPObservabilityEvent as s,
|
|
933
935
|
ChannelEventMap as t
|
|
934
936
|
};
|
|
935
|
-
//# sourceMappingURL=index-
|
|
937
|
+
//# sourceMappingURL=index-YSKgfgg9.d.ts.map
|