@adonis-agora/agent 0.53.2 → 0.55.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/CHANGELOG.md +29 -0
- package/README.md +6 -0
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +55 -0
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/ag-ui/adapter.d.ts +26 -0
- package/dist/src/ag-ui/adapter.d.ts.map +1 -0
- package/dist/src/ag-ui/adapter.js +295 -0
- package/dist/src/ag-ui/adapter.js.map +1 -0
- package/dist/src/ag-ui/encoder.d.ts +107 -0
- package/dist/src/ag-ui/encoder.d.ts.map +1 -0
- package/dist/src/ag-ui/encoder.js +519 -0
- package/dist/src/ag-ui/encoder.js.map +1 -0
- package/dist/src/ag-ui/index.d.ts +12 -0
- package/dist/src/ag-ui/index.d.ts.map +1 -0
- package/dist/src/ag-ui/index.js +12 -0
- package/dist/src/ag-ui/index.js.map +1 -0
- package/dist/src/ag-ui/input.d.ts +72 -0
- package/dist/src/ag-ui/input.d.ts.map +1 -0
- package/dist/src/ag-ui/input.js +216 -0
- package/dist/src/ag-ui/input.js.map +1 -0
- package/dist/src/ag-ui/interrupt-id.d.ts +27 -0
- package/dist/src/ag-ui/interrupt-id.d.ts.map +1 -0
- package/dist/src/ag-ui/interrupt-id.js +42 -0
- package/dist/src/ag-ui/interrupt-id.js.map +1 -0
- package/dist/src/ag-ui/stream.d.ts +28 -0
- package/dist/src/ag-ui/stream.d.ts.map +1 -0
- package/dist/src/ag-ui/stream.js +68 -0
- package/dist/src/ag-ui/stream.js.map +1 -0
- package/dist/src/ag-ui/types.d.ts +202 -0
- package/dist/src/ag-ui/types.d.ts.map +1 -0
- package/dist/src/ag-ui/types.js +33 -0
- package/dist/src/ag-ui/types.js.map +1 -0
- package/dist/src/agent-loop.d.ts.map +1 -1
- package/dist/src/agent-loop.js +4 -0
- package/dist/src/agent-loop.js.map +1 -1
- package/dist/src/agent-service.d.ts +6 -0
- package/dist/src/agent-service.d.ts.map +1 -1
- package/dist/src/agent-service.js +1 -0
- package/dist/src/agent-service.js.map +1 -1
- package/dist/src/define_config.d.ts +8 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/spi/agent-store.d.ts +7 -0
- package/dist/src/spi/agent-store.d.ts.map +1 -1
- package/dist/src/spi/agent-store.js.map +1 -1
- package/dist/src/spi/protocol-adapter.d.ts +57 -0
- package/dist/src/spi/protocol-adapter.d.ts.map +1 -0
- package/dist/src/spi/protocol-adapter.js +2 -0
- package/dist/src/spi/protocol-adapter.js.map +1 -0
- package/dist/src/spi/tool.d.ts +21 -0
- package/dist/src/spi/tool.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +1 -1
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/stream-events.d.ts +2 -0
- package/dist/src/stream-events.d.ts.map +1 -1
- package/dist/src/testing/in-memory-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-store.js +4 -1
- package/dist/src/testing/in-memory-store.js.map +1 -1
- package/package.json +10 -1
- package/skills/agent-setup/SKILL.md +36 -0
- package/skills/agent-tools/SKILL.md +9 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { decodeInterruptId } from './interrupt-id.js';
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Read a request body as a `RunAgentInput`, or say why it is not one.
|
|
7
|
+
*
|
|
8
|
+
* Only what this producer acts on is checked, and a KNOWN member with a value the schema rejects is
|
|
9
|
+
* malformed (the run never starts). A member it does not recognise is not an error — the protocol's
|
|
10
|
+
* asymmetry: a newer consumer's input must not bounce off an older producer.
|
|
11
|
+
*/
|
|
12
|
+
export function parseRunInput(body) {
|
|
13
|
+
if (!isRecord(body))
|
|
14
|
+
return 'the body must be a RunAgentInput object';
|
|
15
|
+
if (typeof body.threadId !== 'string' || body.threadId.length === 0) {
|
|
16
|
+
return 'threadId must be a non-empty string';
|
|
17
|
+
}
|
|
18
|
+
if (body.threadId.length > 255)
|
|
19
|
+
return 'threadId must be at most 255 characters';
|
|
20
|
+
if (typeof body.runId !== 'string' || body.runId.length === 0) {
|
|
21
|
+
return 'runId must be a non-empty string';
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(body.messages))
|
|
24
|
+
return 'messages must be an array';
|
|
25
|
+
for (const message of body.messages) {
|
|
26
|
+
if (!isRecord(message) || typeof message.role !== 'string') {
|
|
27
|
+
return 'each message must be an object with a role';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (body.resume !== undefined) {
|
|
31
|
+
if (!Array.isArray(body.resume))
|
|
32
|
+
return 'resume must be an array';
|
|
33
|
+
for (const entry of body.resume) {
|
|
34
|
+
if (!isRecord(entry) ||
|
|
35
|
+
typeof entry.interruptId !== 'string' ||
|
|
36
|
+
(entry.status !== 'resolved' && entry.status !== 'cancelled')) {
|
|
37
|
+
return "each resume entry needs an interruptId and a status of 'resolved' or 'cancelled'";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (body.context !== undefined && !Array.isArray(body.context)) {
|
|
42
|
+
return 'context must be an array';
|
|
43
|
+
}
|
|
44
|
+
return body;
|
|
45
|
+
}
|
|
46
|
+
const EXTENSIONS = {
|
|
47
|
+
'image/png': 'png',
|
|
48
|
+
'image/jpeg': 'jpg',
|
|
49
|
+
'image/gif': 'gif',
|
|
50
|
+
'image/webp': 'webp',
|
|
51
|
+
'application/pdf': 'pdf',
|
|
52
|
+
'text/plain': 'txt',
|
|
53
|
+
};
|
|
54
|
+
function filenameOf(part, index, contentType) {
|
|
55
|
+
const metadata = part.metadata;
|
|
56
|
+
if (isRecord(metadata)) {
|
|
57
|
+
for (const key of ['filename', 'name', 'title']) {
|
|
58
|
+
const value = metadata[key];
|
|
59
|
+
if (typeof value === 'string' && value.trim().length > 0)
|
|
60
|
+
return value.trim().slice(0, 200);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const extension = EXTENSIONS[contentType];
|
|
64
|
+
return `${part.type}-${index + 1}${extension !== undefined ? `.${extension}` : ''}`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The turn a run answers: the LAST user message of the input. The library keeps each thread's
|
|
68
|
+
* history itself, so the earlier messages the consumer restates are not read back in — what the
|
|
69
|
+
* agent resumes from is what it stored.
|
|
70
|
+
*
|
|
71
|
+
* Multimodal parts: text parts are the message's text; a media part carried inline (`data`) becomes
|
|
72
|
+
* an attachment. A part by `url` or by provider `file` handle is dropped and said so — this producer
|
|
73
|
+
* hands the model only bytes it staged itself, never an address a caller supplied.
|
|
74
|
+
*/
|
|
75
|
+
export function readUserTurn(messages) {
|
|
76
|
+
let last;
|
|
77
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
78
|
+
if (messages[index]?.role === 'user') {
|
|
79
|
+
last = messages[index];
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (last === undefined)
|
|
84
|
+
return null;
|
|
85
|
+
if (typeof last.content === 'string')
|
|
86
|
+
return { text: last.content, media: [], dropped: [] };
|
|
87
|
+
if (!Array.isArray(last.content))
|
|
88
|
+
return { text: '', media: [], dropped: [] };
|
|
89
|
+
const texts = [];
|
|
90
|
+
const media = [];
|
|
91
|
+
const dropped = [];
|
|
92
|
+
last.content.forEach((part, index) => {
|
|
93
|
+
if (!isRecord(part))
|
|
94
|
+
return;
|
|
95
|
+
if (part.type === 'text') {
|
|
96
|
+
if (typeof part.text === 'string')
|
|
97
|
+
texts.push(part.text);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (part.type !== 'image' &&
|
|
101
|
+
part.type !== 'audio' &&
|
|
102
|
+
part.type !== 'video' &&
|
|
103
|
+
part.type !== 'document') {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const source = part.source;
|
|
107
|
+
if (!isRecord(source) || source.type !== 'data') {
|
|
108
|
+
const how = isRecord(source) && typeof source.type === 'string' ? source.type : 'unknown';
|
|
109
|
+
dropped.push(`The ${part.type} part ${index + 1} was not used: only inline data is accepted, not a ${how} source.`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (typeof source.value !== 'string' || typeof source.mimeType !== 'string') {
|
|
113
|
+
dropped.push(`The ${part.type} part ${index + 1} was not used: its inline data is malformed.`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const data = Buffer.from(source.value, 'base64');
|
|
117
|
+
if (data.length === 0) {
|
|
118
|
+
dropped.push(`The ${part.type} part ${index + 1} was not used: it carries no bytes.`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const contentType = source.mimeType.toLowerCase();
|
|
122
|
+
media.push({
|
|
123
|
+
kind: part.type,
|
|
124
|
+
contentType,
|
|
125
|
+
data,
|
|
126
|
+
filename: filenameOf(part, index, contentType),
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
return { text: texts.join('\n'), media, dropped };
|
|
130
|
+
}
|
|
131
|
+
/** `context` entries as the library's page context carries them, or `undefined` for none. */
|
|
132
|
+
export function readContext(context) {
|
|
133
|
+
if (context === undefined)
|
|
134
|
+
return undefined;
|
|
135
|
+
const entries = context.filter((entry) => isRecord(entry) && typeof entry.description === 'string' && typeof entry.value === 'string');
|
|
136
|
+
return entries.length > 0 ? entries : undefined;
|
|
137
|
+
}
|
|
138
|
+
export function readForwardedProps(forwarded) {
|
|
139
|
+
if (!isRecord(forwarded))
|
|
140
|
+
return {};
|
|
141
|
+
const pick = (key) => {
|
|
142
|
+
const value = forwarded[key];
|
|
143
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
144
|
+
};
|
|
145
|
+
const agent = pick('agent');
|
|
146
|
+
const model = pick('model');
|
|
147
|
+
const persona = pick('persona');
|
|
148
|
+
return {
|
|
149
|
+
...(agent !== undefined ? { agent } : {}),
|
|
150
|
+
...(model !== undefined ? { model } : {}),
|
|
151
|
+
...(persona !== undefined ? { persona } : {}),
|
|
152
|
+
...(isRecord(forwarded.pageContext) ? { pageContext: forwarded.pageContext } : {}),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Sort a resume list into what it answers. Every recognised entry must continue the SAME library
|
|
157
|
+
* run from the SAME point — they are the interrupts of one `RUN_FINISHED` — and a list that does not
|
|
158
|
+
* is malformed (a string says why).
|
|
159
|
+
*/
|
|
160
|
+
export function planResume(resume) {
|
|
161
|
+
const decisions = [];
|
|
162
|
+
const unrecognised = [];
|
|
163
|
+
for (const entry of resume) {
|
|
164
|
+
const address = decodeInterruptId(entry.interruptId);
|
|
165
|
+
if (address === null) {
|
|
166
|
+
unrecognised.push(entry.interruptId);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
decisions.push({ address, entry });
|
|
170
|
+
}
|
|
171
|
+
const first = decisions[0];
|
|
172
|
+
if (first === undefined)
|
|
173
|
+
return { decisions, unrecognised };
|
|
174
|
+
for (const { address } of decisions) {
|
|
175
|
+
if (address.stream !== first.address.stream || address.position !== first.address.position) {
|
|
176
|
+
return 'the resume entries answer interrupts of different runs';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const seen = new Set();
|
|
180
|
+
for (const { address } of decisions) {
|
|
181
|
+
if (seen.has(address.toolCallId))
|
|
182
|
+
return 'an interrupt is answered twice';
|
|
183
|
+
seen.add(address.toolCallId);
|
|
184
|
+
}
|
|
185
|
+
return { decisions, unrecognised };
|
|
186
|
+
}
|
|
187
|
+
/** `{ approved, reason?, remember? }` out of an approval's resume payload. A bare boolean is accepted. */
|
|
188
|
+
export function readApprovalPayload(payload) {
|
|
189
|
+
if (typeof payload === 'boolean')
|
|
190
|
+
return { approved: payload };
|
|
191
|
+
if (!isRecord(payload) || typeof payload.approved !== 'boolean')
|
|
192
|
+
return null;
|
|
193
|
+
return {
|
|
194
|
+
approved: payload.approved,
|
|
195
|
+
...(typeof payload.reason === 'string' ? { reason: payload.reason } : {}),
|
|
196
|
+
...(typeof payload.remember === 'boolean' ? { remember: payload.remember } : {}),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/** `questionId → string[]` out of an elicitation's resume payload (`{ answers }` or the map itself). */
|
|
200
|
+
export function readAnswersPayload(payload) {
|
|
201
|
+
const source = isRecord(payload) && isRecord(payload.answers) ? payload.answers : payload;
|
|
202
|
+
if (!isRecord(source))
|
|
203
|
+
return null;
|
|
204
|
+
const answers = {};
|
|
205
|
+
for (const [key, value] of Object.entries(source)) {
|
|
206
|
+
if (typeof value === 'string')
|
|
207
|
+
answers[key] = [value];
|
|
208
|
+
else if (Array.isArray(value) && value.every((item) => typeof item === 'string')) {
|
|
209
|
+
answers[key] = value;
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
return answers;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/ag-ui/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An interrupt's id carries everything a resuming request needs, so the producer keeps NOTHING
|
|
3
|
+
* between the run that stopped to ask and the run that answers — the statelessness AG-UI lets a
|
|
4
|
+
* producer have, and what lets any replica serve the resume.
|
|
5
|
+
*
|
|
6
|
+
* It names the library run the human is answering (`parked` — a delegated sub-agent parks its OWN
|
|
7
|
+
* run), the run whose stream carries the work (`stream`), the tool call, and how many of that
|
|
8
|
+
* stream's frames the interrupted AG-UI run already delivered (`position`), which is where the
|
|
9
|
+
* resuming run picks the stream up.
|
|
10
|
+
*
|
|
11
|
+
* It is an address, not a credential: the resume route checks the caller owns the run exactly as
|
|
12
|
+
* the native approve/answer routes do.
|
|
13
|
+
*/
|
|
14
|
+
export interface InterruptAddress {
|
|
15
|
+
kind: 'approval' | 'elicitation';
|
|
16
|
+
/** The run to settle the call on. */
|
|
17
|
+
parked: string;
|
|
18
|
+
/** The run whose buffered stream the resume re-attaches to. */
|
|
19
|
+
stream: string;
|
|
20
|
+
toolCallId: string;
|
|
21
|
+
/** Frames of `stream` already delivered when the run was reported interrupted. */
|
|
22
|
+
position: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function encodeInterruptId(address: InterruptAddress): string;
|
|
25
|
+
/** The address an id names, or `null` for an id this producer did not mint. */
|
|
26
|
+
export declare function decodeInterruptId(id: unknown): InterruptAddress | null;
|
|
27
|
+
//# sourceMappingURL=interrupt-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupt-id.d.ts","sourceRoot":"","sources":["../../../src/ag-ui/interrupt-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,GAAG,aAAa,CAAC;IACjC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CASnE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CA6BtE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const PREFIX = 'agora_';
|
|
2
|
+
export function encodeInterruptId(address) {
|
|
3
|
+
const compact = [
|
|
4
|
+
address.kind === 'approval' ? 'a' : 'e',
|
|
5
|
+
address.parked,
|
|
6
|
+
address.stream,
|
|
7
|
+
address.toolCallId,
|
|
8
|
+
address.position,
|
|
9
|
+
];
|
|
10
|
+
return PREFIX + Buffer.from(JSON.stringify(compact), 'utf8').toString('base64url');
|
|
11
|
+
}
|
|
12
|
+
/** The address an id names, or `null` for an id this producer did not mint. */
|
|
13
|
+
export function decodeInterruptId(id) {
|
|
14
|
+
if (typeof id !== 'string' || !id.startsWith(PREFIX))
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(Buffer.from(id.slice(PREFIX.length), 'base64url').toString('utf8'));
|
|
18
|
+
if (!Array.isArray(parsed) || parsed.length !== 5)
|
|
19
|
+
return null;
|
|
20
|
+
const [kind, parked, stream, toolCallId, position] = parsed;
|
|
21
|
+
if ((kind !== 'a' && kind !== 'e') ||
|
|
22
|
+
typeof parked !== 'string' ||
|
|
23
|
+
typeof stream !== 'string' ||
|
|
24
|
+
typeof toolCallId !== 'string' ||
|
|
25
|
+
typeof position !== 'number' ||
|
|
26
|
+
!Number.isSafeInteger(position) ||
|
|
27
|
+
position < 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
kind: kind === 'a' ? 'approval' : 'elicitation',
|
|
32
|
+
parked,
|
|
33
|
+
stream,
|
|
34
|
+
toolCallId,
|
|
35
|
+
position,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=interrupt-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupt-id.js","sourceRoot":"","sources":["../../../src/ag-ui/interrupt-id.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,GAAG,QAAQ,CAAC;AAExB,MAAM,UAAU,iBAAiB,CAAC,OAAyB;IACzD,MAAM,OAAO,GAAG;QACd,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACvC,OAAO,CAAC,MAAM;QACd,OAAO,CAAC,MAAM;QACd,OAAO,CAAC,UAAU;QAClB,OAAO,CAAC,QAAQ;KACjB,CAAC;IACF,OAAO,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACrF,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,EAAW;IAC3C,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAChC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CACnE,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAmB,CAAC;QACzE,IACE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;YAC9B,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAO,UAAU,KAAK,QAAQ;YAC9B,OAAO,QAAQ,KAAK,QAAQ;YAC5B,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/B,QAAQ,GAAG,CAAC,EACZ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;YAC/C,MAAM;YACN,MAAM;YACN,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StreamFrame } from '../spi/token-stream-sink.js';
|
|
2
|
+
import { type AgUiEncoderOptions } from './encoder.js';
|
|
3
|
+
import type { AgUiEvent } from './types.js';
|
|
4
|
+
export interface AgUiStreamOptions extends AgUiEncoderOptions {
|
|
5
|
+
/**
|
|
6
|
+
* How long the library stream may stay silent, while the run waits on a person AND has other work
|
|
7
|
+
* announced, before the AG-UI run is reported interrupted. Default 750 ms.
|
|
8
|
+
*
|
|
9
|
+
* Only that mixed case needs a clock. A run whose every open tool call is waiting on someone is
|
|
10
|
+
* reported at once; a run waiting on no one is never cut short.
|
|
11
|
+
*/
|
|
12
|
+
quietMs?: number;
|
|
13
|
+
/** Events to write right after `RUN_STARTED` (warnings about input that was dropped). */
|
|
14
|
+
preamble?: AgUiEvent[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* One AG-UI run over a library run's stream.
|
|
18
|
+
*
|
|
19
|
+
* AG-UI has no mid-run channel from the consumer: a run that needs an approval or an answer does not
|
|
20
|
+
* wait with the connection open — it ENDS, saying what it waits for, and a later run carries the
|
|
21
|
+
* answers. The library run underneath does wait (parked, durably when the runner is durable). So this
|
|
22
|
+
* stops reading when the run is waiting on someone and nothing else is moving, closes the AG-UI run
|
|
23
|
+
* with the interrupt outcome, and leaves the library run parked for the resume to pick up.
|
|
24
|
+
*/
|
|
25
|
+
export declare function agUiEvents(frames: AsyncIterable<StreamFrame>, options: AgUiStreamOptions): AsyncGenerator<AgUiEvent>;
|
|
26
|
+
/** One AG-UI event as an SSE frame: a single `data:` line, LF-terminated, as the binding pins. */
|
|
27
|
+
export declare function agUiSse(event: AgUiEvent): string;
|
|
28
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/ag-ui/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;CACxB;AAOD;;;;;;;;GAQG;AACH,wBAAuB,UAAU,CAC/B,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAClC,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAAC,SAAS,CAAC,CAmC3B;AAkBD,kGAAkG;AAClG,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEhD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AgUiEncoder } from './encoder.js';
|
|
2
|
+
const DEFAULT_QUIET_MS = 750;
|
|
3
|
+
const GRACE_MS = 50;
|
|
4
|
+
/**
|
|
5
|
+
* One AG-UI run over a library run's stream.
|
|
6
|
+
*
|
|
7
|
+
* AG-UI has no mid-run channel from the consumer: a run that needs an approval or an answer does not
|
|
8
|
+
* wait with the connection open — it ENDS, saying what it waits for, and a later run carries the
|
|
9
|
+
* answers. The library run underneath does wait (parked, durably when the runner is durable). So this
|
|
10
|
+
* stops reading when the run is waiting on someone and nothing else is moving, closes the AG-UI run
|
|
11
|
+
* with the interrupt outcome, and leaves the library run parked for the resume to pick up.
|
|
12
|
+
*/
|
|
13
|
+
export async function* agUiEvents(frames, options) {
|
|
14
|
+
const encoder = new AgUiEncoder(options);
|
|
15
|
+
const quietMs = options.quietMs ?? DEFAULT_QUIET_MS;
|
|
16
|
+
yield* encoder.start();
|
|
17
|
+
yield* options.preamble ?? [];
|
|
18
|
+
const iterator = frames[Symbol.asyncIterator]();
|
|
19
|
+
let upcoming;
|
|
20
|
+
let ended = false;
|
|
21
|
+
try {
|
|
22
|
+
for (;;) {
|
|
23
|
+
upcoming ??= iterator.next();
|
|
24
|
+
// Frames buffered before this reader attached are replayed without a pause between them, so
|
|
25
|
+
// "is it waiting?" is only asked of a stream that has caught up with what it already holds.
|
|
26
|
+
const caughtUp = encoder.consumed >= (options.skip ?? 0);
|
|
27
|
+
let next;
|
|
28
|
+
if (caughtUp && encoder.waiting) {
|
|
29
|
+
// Nothing else in flight: only a frame already on its way (a sink that reads in batches)
|
|
30
|
+
// can still arrive, so a short grace is enough. Otherwise wait out the quiet window.
|
|
31
|
+
next = await raceQuiet(upcoming, encoder.busy ? quietMs : Math.min(quietMs, GRACE_MS));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
next = await upcoming;
|
|
35
|
+
}
|
|
36
|
+
if (next === 'quiet')
|
|
37
|
+
break;
|
|
38
|
+
upcoming = undefined;
|
|
39
|
+
if (next.done === true) {
|
|
40
|
+
ended = true;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
yield* encoder.encode(next.value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
// Stop following the library stream; the run it carries is left exactly as it is.
|
|
48
|
+
void iterator.return?.();
|
|
49
|
+
}
|
|
50
|
+
yield* encoder.finish(ended);
|
|
51
|
+
}
|
|
52
|
+
function raceQuiet(upcoming, ms) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const timer = setTimeout(() => resolve('quiet'), ms);
|
|
55
|
+
upcoming.then((result) => {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
resolve(result);
|
|
58
|
+
}, (error) => {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
reject(error);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** One AG-UI event as an SSE frame: a single `data:` line, LF-terminated, as the binding pins. */
|
|
65
|
+
export function agUiSse(event) {
|
|
66
|
+
return `data: ${JSON.stringify(event)}\n\n`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/ag-ui/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AAgBpE,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC;AAIpB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,CAC/B,MAAkC,EAClC,OAA0B;IAE1B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACpD,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAChD,IAAI,QAA0D,CAAC;IAC/D,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,SAAS,CAAC;YACR,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,4FAA4F;YAC5F,4FAA4F;YAC5F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACzD,IAAI,IAAU,CAAC;YACf,IAAI,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChC,yFAAyF;gBACzF,qFAAqF;gBACrF,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACzF,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,QAAQ,CAAC;YACxB,CAAC;YACD,IAAI,IAAI,KAAK,OAAO;gBAAE,MAAM;YAC5B,QAAQ,GAAG,SAAS,CAAC;YACrB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,CAAC;YACD,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,kFAAkF;QAClF,KAAK,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,QAA8C,EAAE,EAAU;IAC3E,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,QAAQ,CAAC,IAAI,CACX,CAAC,MAAM,EAAE,EAAE;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,OAAO,CAAC,KAAgB;IACtC,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of AG-UI 1.0 (https://docs.ag-ui.com/spec/1.0) this producer writes and reads. Typed by
|
|
3
|
+
* hand rather than imported: the agent package takes no dependency on an AG-UI SDK, and the wire
|
|
4
|
+
* shape is pinned by the protocol's own JSON Schema, which the tests validate every emitted event
|
|
5
|
+
* against (`test/fixtures/ag-ui/schema-1.0.json`).
|
|
6
|
+
*
|
|
7
|
+
* Optional members are OMITTED when there is nothing to say, never `null` — the protocol's
|
|
8
|
+
* "absent means absent" rule.
|
|
9
|
+
*/
|
|
10
|
+
/** The protocol version this producer declares on `RUN_STARTED`. */
|
|
11
|
+
export declare const AG_UI_PROTOCOL_VERSION = "1.0";
|
|
12
|
+
export type AgUiMetadata = Record<string, unknown>;
|
|
13
|
+
/** One provider-and-model's token usage, in the protocol's single accounting. */
|
|
14
|
+
export interface AgUiTokenUsage {
|
|
15
|
+
provider?: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
/** Every prompt token, cached or not. */
|
|
18
|
+
inputTokens?: number;
|
|
19
|
+
/** Every generated token, reasoning included. */
|
|
20
|
+
outputTokens?: number;
|
|
21
|
+
totalTokens?: number;
|
|
22
|
+
/** Part of `outputTokens`. */
|
|
23
|
+
reasoningTokens?: number;
|
|
24
|
+
/** Cache reads — part of `inputTokens`. */
|
|
25
|
+
cachedInputTokens?: number;
|
|
26
|
+
/** Cache writes — part of `inputTokens`, disjoint from the reads. */
|
|
27
|
+
cacheWriteInputTokens?: number;
|
|
28
|
+
}
|
|
29
|
+
/** What an interrupted run is waiting for; a resume entry answers it by `id`. */
|
|
30
|
+
export interface AgUiInterrupt {
|
|
31
|
+
id: string;
|
|
32
|
+
/** Open string. This producer writes `tool_approval` and `input_required`. */
|
|
33
|
+
reason: string;
|
|
34
|
+
message?: string;
|
|
35
|
+
toolCallId?: string;
|
|
36
|
+
responseSchema?: Record<string, unknown>;
|
|
37
|
+
expiresAt?: string;
|
|
38
|
+
metadata?: AgUiMetadata;
|
|
39
|
+
}
|
|
40
|
+
export type AgUiRunOutcome = {
|
|
41
|
+
type: 'success';
|
|
42
|
+
pendingToolCallIds?: string[];
|
|
43
|
+
} | {
|
|
44
|
+
type: 'interrupt';
|
|
45
|
+
interrupts: AgUiInterrupt[];
|
|
46
|
+
} | {
|
|
47
|
+
type: 'cancelled';
|
|
48
|
+
};
|
|
49
|
+
interface Base {
|
|
50
|
+
metadata?: AgUiMetadata;
|
|
51
|
+
}
|
|
52
|
+
export type AgUiEvent = (Base & {
|
|
53
|
+
type: 'RUN_STARTED';
|
|
54
|
+
threadId: string;
|
|
55
|
+
runId: string;
|
|
56
|
+
protocolVersion?: string;
|
|
57
|
+
}) | (Base & {
|
|
58
|
+
type: 'RUN_FINISHED';
|
|
59
|
+
threadId: string;
|
|
60
|
+
runId: string;
|
|
61
|
+
outcome?: AgUiRunOutcome;
|
|
62
|
+
usage?: AgUiTokenUsage[];
|
|
63
|
+
}) | (Base & {
|
|
64
|
+
type: 'RUN_ERROR';
|
|
65
|
+
message: string;
|
|
66
|
+
code?: string;
|
|
67
|
+
usage?: AgUiTokenUsage[];
|
|
68
|
+
}) | (Base & {
|
|
69
|
+
type: 'STEP_STARTED';
|
|
70
|
+
stepName: string;
|
|
71
|
+
}) | (Base & {
|
|
72
|
+
type: 'STEP_FINISHED';
|
|
73
|
+
stepName: string;
|
|
74
|
+
}) | (Base & {
|
|
75
|
+
type: 'TEXT_MESSAGE_START';
|
|
76
|
+
messageId: string;
|
|
77
|
+
role: 'assistant';
|
|
78
|
+
}) | (Base & {
|
|
79
|
+
type: 'TEXT_MESSAGE_CONTENT';
|
|
80
|
+
messageId: string;
|
|
81
|
+
delta: string;
|
|
82
|
+
}) | (Base & {
|
|
83
|
+
type: 'TEXT_MESSAGE_END';
|
|
84
|
+
messageId: string;
|
|
85
|
+
}) | (Base & {
|
|
86
|
+
type: 'REASONING_START';
|
|
87
|
+
messageId: string;
|
|
88
|
+
}) | (Base & {
|
|
89
|
+
type: 'REASONING_MESSAGE_START';
|
|
90
|
+
messageId: string;
|
|
91
|
+
role: 'reasoning';
|
|
92
|
+
}) | (Base & {
|
|
93
|
+
type: 'REASONING_MESSAGE_CONTENT';
|
|
94
|
+
messageId: string;
|
|
95
|
+
delta: string;
|
|
96
|
+
}) | (Base & {
|
|
97
|
+
type: 'REASONING_MESSAGE_END';
|
|
98
|
+
messageId: string;
|
|
99
|
+
}) | (Base & {
|
|
100
|
+
type: 'REASONING_END';
|
|
101
|
+
messageId: string;
|
|
102
|
+
}) | (Base & {
|
|
103
|
+
type: 'TOOL_CALL_START';
|
|
104
|
+
toolCallId: string;
|
|
105
|
+
toolCallName: string;
|
|
106
|
+
parentMessageId?: string;
|
|
107
|
+
}) | (Base & {
|
|
108
|
+
type: 'TOOL_CALL_ARGS';
|
|
109
|
+
toolCallId: string;
|
|
110
|
+
delta: string;
|
|
111
|
+
}) | (Base & {
|
|
112
|
+
type: 'TOOL_CALL_END';
|
|
113
|
+
toolCallId: string;
|
|
114
|
+
}) | (Base & {
|
|
115
|
+
type: 'TOOL_CALL_RESULT';
|
|
116
|
+
messageId: string;
|
|
117
|
+
toolCallId: string;
|
|
118
|
+
content: string;
|
|
119
|
+
role: 'tool';
|
|
120
|
+
}) | (Base & {
|
|
121
|
+
type: 'CUSTOM';
|
|
122
|
+
name: string;
|
|
123
|
+
value: unknown;
|
|
124
|
+
});
|
|
125
|
+
/** Where a media part's bytes are. Closed set: an unknown `type` is malformed input. */
|
|
126
|
+
export type AgUiPartSource = {
|
|
127
|
+
type: 'data';
|
|
128
|
+
value: string;
|
|
129
|
+
mimeType: string;
|
|
130
|
+
} | {
|
|
131
|
+
type: 'url';
|
|
132
|
+
value: string;
|
|
133
|
+
mimeType?: string;
|
|
134
|
+
} | {
|
|
135
|
+
type: 'file';
|
|
136
|
+
value: string;
|
|
137
|
+
provider?: string;
|
|
138
|
+
mimeType?: string;
|
|
139
|
+
};
|
|
140
|
+
export type AgUiContentPart = {
|
|
141
|
+
type: 'text';
|
|
142
|
+
text: string;
|
|
143
|
+
id?: string;
|
|
144
|
+
metadata?: unknown;
|
|
145
|
+
} | {
|
|
146
|
+
type: 'image' | 'audio' | 'video' | 'document';
|
|
147
|
+
source: AgUiPartSource;
|
|
148
|
+
id?: string;
|
|
149
|
+
metadata?: unknown;
|
|
150
|
+
};
|
|
151
|
+
export interface AgUiMessage {
|
|
152
|
+
id: string;
|
|
153
|
+
role: string;
|
|
154
|
+
content?: string | AgUiContentPart[];
|
|
155
|
+
[key: string]: unknown;
|
|
156
|
+
}
|
|
157
|
+
export interface AgUiResumeEntry {
|
|
158
|
+
interruptId: string;
|
|
159
|
+
status: 'resolved' | 'cancelled';
|
|
160
|
+
payload?: unknown;
|
|
161
|
+
metadata?: AgUiMetadata;
|
|
162
|
+
}
|
|
163
|
+
export interface AgUiContext {
|
|
164
|
+
description: string;
|
|
165
|
+
value: string;
|
|
166
|
+
}
|
|
167
|
+
/** `RunAgentInput`: the one message that travels from the application to the agent. */
|
|
168
|
+
export interface AgUiRunInput {
|
|
169
|
+
threadId: string;
|
|
170
|
+
runId: string;
|
|
171
|
+
protocolVersion?: string;
|
|
172
|
+
parentRunId?: string;
|
|
173
|
+
state?: unknown;
|
|
174
|
+
messages: AgUiMessage[];
|
|
175
|
+
tools?: unknown[];
|
|
176
|
+
context?: AgUiContext[];
|
|
177
|
+
forwardedProps?: unknown;
|
|
178
|
+
resume?: AgUiResumeEntry[];
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The names of the `CUSTOM` events this producer writes for what AG-UI does not model. Prefixed, as
|
|
182
|
+
* the protocol asks of invented names; a consumer that does not know one ignores it.
|
|
183
|
+
*/
|
|
184
|
+
export declare const AG_UI_CUSTOM: {
|
|
185
|
+
/** `{ runId, threadId }` — the library's own ids for the run behind this stream (cancel, re-attach). */
|
|
186
|
+
readonly run: 'agora.run';
|
|
187
|
+
/** A generative-UI component (`AgentUiComponent`); a repeat `id` replaces. */
|
|
188
|
+
readonly ui: 'agora.ui';
|
|
189
|
+
readonly title: 'agora.title';
|
|
190
|
+
readonly queue: 'agora.queue';
|
|
191
|
+
/** The approval request as the native protocol carries it, for a consumer that renders it live. */
|
|
192
|
+
readonly approvalRequested: 'agora.approval-requested';
|
|
193
|
+
readonly approvalSettled: 'agora.approval-settled';
|
|
194
|
+
/** The whole question set of an elicitation (`ElicitationRequest`). */
|
|
195
|
+
readonly elicitation: 'agora.elicitation';
|
|
196
|
+
/** `{ usage, costUsd, reasoningMs }` of one model step. */
|
|
197
|
+
readonly stepUsage: 'agora.step-usage';
|
|
198
|
+
/** `{ message }` — input material this producer could not use and dropped. */
|
|
199
|
+
readonly warning: 'agora.warning';
|
|
200
|
+
};
|
|
201
|
+
export {};
|
|
202
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ag-ui/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of AG-UI 1.0 (https://docs.ag-ui.com/spec/1.0) this producer writes and reads. Typed by
|
|
3
|
+
* hand rather than imported: the agent package takes no dependency on an AG-UI SDK, and the wire
|
|
4
|
+
* shape is pinned by the protocol's own JSON Schema, which the tests validate every emitted event
|
|
5
|
+
* against (`test/fixtures/ag-ui/schema-1.0.json`).
|
|
6
|
+
*
|
|
7
|
+
* Optional members are OMITTED when there is nothing to say, never `null` — the protocol's
|
|
8
|
+
* "absent means absent" rule.
|
|
9
|
+
*/
|
|
10
|
+
/** The protocol version this producer declares on `RUN_STARTED`. */
|
|
11
|
+
export const AG_UI_PROTOCOL_VERSION = '1.0';
|
|
12
|
+
/**
|
|
13
|
+
* The names of the `CUSTOM` events this producer writes for what AG-UI does not model. Prefixed, as
|
|
14
|
+
* the protocol asks of invented names; a consumer that does not know one ignores it.
|
|
15
|
+
*/
|
|
16
|
+
export const AG_UI_CUSTOM = {
|
|
17
|
+
/** `{ runId, threadId }` — the library's own ids for the run behind this stream (cancel, re-attach). */
|
|
18
|
+
run: 'agora.run',
|
|
19
|
+
/** A generative-UI component (`AgentUiComponent`); a repeat `id` replaces. */
|
|
20
|
+
ui: 'agora.ui',
|
|
21
|
+
title: 'agora.title',
|
|
22
|
+
queue: 'agora.queue',
|
|
23
|
+
/** The approval request as the native protocol carries it, for a consumer that renders it live. */
|
|
24
|
+
approvalRequested: 'agora.approval-requested',
|
|
25
|
+
approvalSettled: 'agora.approval-settled',
|
|
26
|
+
/** The whole question set of an elicitation (`ElicitationRequest`). */
|
|
27
|
+
elicitation: 'agora.elicitation',
|
|
28
|
+
/** `{ usage, costUsd, reasoningMs }` of one model step. */
|
|
29
|
+
stepUsage: 'agora.step-usage',
|
|
30
|
+
/** `{ message }` — input material this producer could not use and dropped. */
|
|
31
|
+
warning: 'agora.warning',
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=types.js.map
|