ag-ui-validate 0.3.0 → 0.4.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 +25 -26
- package/dist/{catalog-DqTI4VLt.js → catalog-3e6INLCp.js} +120 -2
- package/dist/catalog-3e6INLCp.js.map +1 -0
- package/dist/{catalog-AB5vuZ8j.cjs → catalog-DH5gDIbo.cjs} +120 -2
- package/dist/catalog-DH5gDIbo.cjs.map +1 -0
- package/dist/cli.js +639 -61
- package/dist/cli.js.map +1 -1
- package/dist/{index-Hmqj3r_r.d.cts → index-Cydfs-rB.d.ts} +4 -4
- package/dist/{index-oNG1kOp9.d.ts → index-DsVmjcLO.d.cts} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/report.cjs +11 -2
- package/dist/report.cjs.map +1 -1
- package/dist/report.d.cts +21 -12
- package/dist/report.d.ts +21 -12
- package/dist/report.js +11 -2
- package/dist/report.js.map +1 -1
- package/dist/{src-Dcuqz2QC.js → src-CezZ73Mm.js} +494 -59
- package/dist/src-CezZ73Mm.js.map +1 -0
- package/dist/{src-D04i3Vso.cjs → src-CyugLoks.cjs} +494 -59
- package/dist/src-CyugLoks.cjs.map +1 -0
- package/dist/transport.cjs +1 -1
- package/dist/transport.d.cts +1 -1
- package/dist/transport.d.ts +1 -1
- package/dist/transport.js +1 -1
- package/dist/{types-oH_QTnn2.d.ts → types-CUIgyj2N.d.cts} +3 -1
- package/dist/{types-oH_QTnn2.d.cts → types-CUIgyj2N.d.ts} +3 -1
- package/dist/vitest.js +614 -59
- package/dist/vitest.js.map +1 -1
- package/js/src/cli-args.ts +16 -0
- package/js/src/cli.ts +1 -1
- package/js/src/index.ts +5 -0
- package/js/src/protocol/event-table.ts +93 -2
- package/js/src/report/json.ts +14 -3
- package/js/src/report/sarif.ts +3 -6
- package/js/src/rules/catalog.ts +4 -0
- package/js/src/rules/checks/context.ts +48 -3
- package/js/src/rules/checks/lifecycle.ts +5 -2
- package/js/src/rules/checks/subagents.ts +78 -0
- package/js/src/rules/checks/text.ts +11 -3
- package/js/src/rules/checks/toolcalls.ts +8 -2
- package/package.json +2 -2
- package/spec/catalog.json +108 -1
- package/spec/event-categories.json +6 -2
- package/spec/fixtures/invalid/AGUI501-missing-data-prefix/scenario.json +3 -3
- package/spec/fixtures/invalid/AGUI502-payload-not-json/stream.jsonl +2 -2
- package/spec/fixtures/invalid/AGUI503-unknown-event-type/expected.json +1 -1
- package/spec/fixtures/invalid/AGUI503-unknown-event-type/stream.jsonl +3 -3
- package/spec/fixtures/invalid/AGUI504-schema-violation/stream.jsonl +4 -4
- package/spec/fixtures/invalid/AGUI505-unexpected-content-type/scenario.json +5 -5
- package/spec/fixtures/invalid/AGUI506-keepalive-gap/scenario.json +5 -5
- package/spec/fixtures/invalid/AGUI507-buffered-response/scenario.json +1 -1
- package/spec/fixtures/invalid/AGUI508-connection-dropped/scenario.json +1 -1
- package/spec/fixtures/invalid/AGUI601-duplicate-subagent-started/expected.json +12 -0
- package/spec/fixtures/invalid/AGUI601-duplicate-subagent-started/stream.jsonl +5 -0
- package/spec/fixtures/invalid/AGUI602-finished-without-start/expected.json +11 -0
- package/spec/fixtures/invalid/AGUI602-finished-without-start/stream.jsonl +3 -0
- package/spec/fixtures/invalid/AGUI603-error-without-start/expected.json +11 -0
- package/spec/fixtures/invalid/AGUI603-error-without-start/stream.jsonl +3 -0
- package/spec/fixtures/invalid/AGUI604-subagent-unterminated/expected.json +10 -0
- package/spec/fixtures/invalid/AGUI604-subagent-unterminated/stream.jsonl +3 -0
- package/spec/fixtures/invalid/AGUI605-unknown-parent-subagent-run-id/expected.json +11 -0
- package/spec/fixtures/invalid/AGUI605-unknown-parent-subagent-run-id/stream.jsonl +4 -0
- package/spec/fixtures/invalid/AGUI606-continuation-owner-mismatch/expected.json +11 -0
- package/spec/fixtures/invalid/AGUI606-continuation-owner-mismatch/stream.jsonl +6 -0
- package/spec/fixtures/invalid/AGUI901-raw-wraps-typed-event/stream.jsonl +3 -3
- package/spec/fixtures/invalid/AGUI903-custom-name-not-namespaced/stream.jsonl +3 -3
- package/dist/catalog-AB5vuZ8j.cjs.map +0 -1
- package/dist/catalog-DqTI4VLt.js.map +0 -1
- package/dist/src-D04i3Vso.cjs.map +0 -1
- package/dist/src-Dcuqz2QC.js.map +0 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Subagent lifecycle rules: AGUI601–AGUI605.
|
|
2
|
+
//
|
|
3
|
+
// Scope: the SUBAGENT_STARTED/FINISHED/ERROR lifecycle itself, per
|
|
4
|
+
// https://docs.ag-ui.com/concepts/subagents#rules-clients-enforce. Ownership
|
|
5
|
+
// consistency for events attributed to a subagent via their own optional
|
|
6
|
+
// subagentRunId field (text messages, tool calls, steps, ...) is a separate,
|
|
7
|
+
// broader concern not covered here.
|
|
8
|
+
|
|
9
|
+
import type { CheckApi, RunState, EmitFn } from "./context.js"
|
|
10
|
+
import { str } from "./context.js"
|
|
11
|
+
|
|
12
|
+
export function handleSubagentEvent(api: CheckApi): void {
|
|
13
|
+
const { type, event, run, emit, index } = api
|
|
14
|
+
|
|
15
|
+
switch (type) {
|
|
16
|
+
case "SUBAGENT_STARTED": {
|
|
17
|
+
const id = str(event, "subagentRunId")
|
|
18
|
+
if (id === undefined) return
|
|
19
|
+
run.knownSubagentRunIds.add(id)
|
|
20
|
+
|
|
21
|
+
const open = run.openSubagents.get(id)
|
|
22
|
+
if (open !== undefined) {
|
|
23
|
+
emit("AGUI601", { subagentRunId: id }, { pointer: "/subagentRunId", relatedEventIndex: open.startIndex })
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
const closed = run.closedSubagents.get(id)
|
|
27
|
+
if (closed !== undefined && !closed.resumable) {
|
|
28
|
+
emit("AGUI601", { subagentRunId: id }, { pointer: "/subagentRunId", relatedEventIndex: closed.index })
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Either brand new, or a legitimate resumption of a suspended subagent.
|
|
33
|
+
run.openSubagents.set(id, { startIndex: index })
|
|
34
|
+
if (closed !== undefined) run.closedSubagents.delete(id)
|
|
35
|
+
|
|
36
|
+
const parent = str(event, "parentSubagentRunId")
|
|
37
|
+
if (parent !== undefined && !run.knownSubagentRunIds.has(parent)) {
|
|
38
|
+
emit("AGUI605", { parentSubagentRunId: parent }, { pointer: "/parentSubagentRunId" })
|
|
39
|
+
}
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
case "SUBAGENT_FINISHED": {
|
|
44
|
+
const id = str(event, "subagentRunId")
|
|
45
|
+
if (id === undefined) return
|
|
46
|
+
const open = run.openSubagents.get(id)
|
|
47
|
+
if (open === undefined) {
|
|
48
|
+
emit("AGUI602", { subagentRunId: id }, { pointer: "/subagentRunId" })
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
run.openSubagents.delete(id)
|
|
52
|
+
const outcome = event.outcome
|
|
53
|
+
const resumable = typeof outcome === "object" && outcome !== null && (outcome as { type?: unknown }).type === "suspended"
|
|
54
|
+
run.closedSubagents.set(id, { index, resumable })
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
case "SUBAGENT_ERROR": {
|
|
59
|
+
const id = str(event, "subagentRunId")
|
|
60
|
+
if (id === undefined) return
|
|
61
|
+
const open = run.openSubagents.get(id)
|
|
62
|
+
if (open === undefined) {
|
|
63
|
+
emit("AGUI603", { subagentRunId: id }, { pointer: "/subagentRunId" })
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
run.openSubagents.delete(id)
|
|
67
|
+
run.closedSubagents.set(id, { index, resumable: false })
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** AGUI604 — open subagents when the run reaches a clean end. */
|
|
74
|
+
export function endOfRunSubagents(run: RunState, emit: EmitFn, atIndex: number): void {
|
|
75
|
+
for (const [id, open] of run.openSubagents) {
|
|
76
|
+
emit("AGUI604", { subagentRunId: id }, { eventIndex: atIndex, relatedEventIndex: open.startIndex })
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Text message rules: AGUI101–AGUI106, plus TEXT_MESSAGE_CHUNK stream handling.
|
|
2
2
|
|
|
3
3
|
import type { CheckApi, RunState, EmitFn } from "./context.js"
|
|
4
|
-
import { str } from "./context.js"
|
|
4
|
+
import { checkOwnerConsistency, str } from "./context.js"
|
|
5
5
|
|
|
6
6
|
export function handleTextEvent(api: CheckApi): void {
|
|
7
7
|
const { type, event, run, emit, index } = api
|
|
@@ -25,8 +25,10 @@ export function handleTextEvent(api: CheckApi): void {
|
|
|
25
25
|
})
|
|
26
26
|
return
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
const owner = str(event, "subagentRunId")
|
|
29
|
+
run.openMessages.set(id, { startIndex: index, owner })
|
|
29
30
|
run.knownMessageIds.add(id)
|
|
31
|
+
run.messageOwner.set(id, owner)
|
|
30
32
|
return
|
|
31
33
|
}
|
|
32
34
|
|
|
@@ -45,16 +47,19 @@ export function handleTextEvent(api: CheckApi): void {
|
|
|
45
47
|
if (event.delta === "") {
|
|
46
48
|
emit("AGUI105", { messageId: id }, { pointer: "/delta", relatedEventIndex: open.startIndex })
|
|
47
49
|
}
|
|
50
|
+
checkOwnerConsistency(emit, type, "messageId", id, event, open.owner)
|
|
48
51
|
return
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
case "TEXT_MESSAGE_END": {
|
|
52
55
|
const id = str(event, "messageId")
|
|
53
56
|
if (id === undefined) return
|
|
54
|
-
|
|
57
|
+
const open = run.openMessages.get(id)
|
|
58
|
+
if (open === undefined) {
|
|
55
59
|
emit("AGUI102", { messageId: id }, { pointer: "/messageId" })
|
|
56
60
|
return
|
|
57
61
|
}
|
|
62
|
+
checkOwnerConsistency(emit, type, "messageId", id, event, open.owner)
|
|
58
63
|
run.openMessages.delete(id)
|
|
59
64
|
run.closedMessages.set(id, index)
|
|
60
65
|
return
|
|
@@ -86,6 +91,9 @@ export function handleTextEvent(api: CheckApi): void {
|
|
|
86
91
|
}
|
|
87
92
|
run.textChunk = { messageId: id, startIndex: index }
|
|
88
93
|
run.knownMessageIds.add(id)
|
|
94
|
+
// Chunk attribution consistency is a known gap (SQ-15); still record
|
|
95
|
+
// the owner so a TOOL_CALL_START.parentMessageId can inherit it.
|
|
96
|
+
run.messageOwner.set(id, str(event, "subagentRunId"))
|
|
89
97
|
return
|
|
90
98
|
}
|
|
91
99
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Tool call rules: AGUI201–AGUI208, plus TOOL_CALL_CHUNK stream handling.
|
|
2
2
|
|
|
3
3
|
import type { CheckApi, RunState, EmitFn } from "./context.js"
|
|
4
|
-
import { str } from "./context.js"
|
|
4
|
+
import { checkOwnerConsistency, str } from "./context.js"
|
|
5
5
|
|
|
6
6
|
export function handleToolCallEvent(api: CheckApi): void {
|
|
7
7
|
const { type, event, run, emit, index } = api
|
|
@@ -16,8 +16,12 @@ export function handleToolCallEvent(api: CheckApi): void {
|
|
|
16
16
|
emit("AGUI205", { toolCallId: id }, { pointer: "/toolCallId", relatedEventIndex: related })
|
|
17
17
|
return
|
|
18
18
|
}
|
|
19
|
-
run.openToolCalls.set(id, { startIndex: index, args: "", sawArgs: false })
|
|
20
19
|
const parent = str(event, "parentMessageId")
|
|
20
|
+
// An untagged call inherits its parent message's owner (AGUI606's "an
|
|
21
|
+
// untagged tool call inherits the parent message's owner");
|
|
22
|
+
// ToolCallResult is deliberately exempt — it states its own owner.
|
|
23
|
+
const owner = str(event, "subagentRunId") ?? (parent !== undefined ? run.messageOwner.get(parent) : undefined)
|
|
24
|
+
run.openToolCalls.set(id, { startIndex: index, args: "", sawArgs: false, owner })
|
|
21
25
|
if (parent !== undefined && !run.knownMessageIds.has(parent)) {
|
|
22
26
|
emit("AGUI208", { parentMessageId: parent }, { pointer: "/parentMessageId" })
|
|
23
27
|
}
|
|
@@ -37,6 +41,7 @@ export function handleToolCallEvent(api: CheckApi): void {
|
|
|
37
41
|
open.args += delta
|
|
38
42
|
open.sawArgs = true
|
|
39
43
|
}
|
|
44
|
+
checkOwnerConsistency(emit, type, "toolCallId", id, event, open.owner)
|
|
40
45
|
return
|
|
41
46
|
}
|
|
42
47
|
|
|
@@ -48,6 +53,7 @@ export function handleToolCallEvent(api: CheckApi): void {
|
|
|
48
53
|
emit("AGUI202", { toolCallId: id }, { pointer: "/toolCallId" })
|
|
49
54
|
return
|
|
50
55
|
}
|
|
56
|
+
checkOwnerConsistency(emit, type, "toolCallId", id, event, open.owner)
|
|
51
57
|
run.openToolCalls.delete(id)
|
|
52
58
|
run.closedToolCalls.set(id, index)
|
|
53
59
|
checkArgsJson(id, open, emit, index)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ag-ui-validate",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Conformance validator for the AG-UI protocol. Feed it an event stream, get every violation with a rule ID, a severity, and a link to the governing spec section.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ag-ui",
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
}
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
|
-
"@ag-ui/core": "^0.0.
|
|
120
|
+
"@ag-ui/core": "^0.0.59",
|
|
121
121
|
"@changesets/cli": "^3.0.0",
|
|
122
122
|
"@types/node": "^26.2.0",
|
|
123
123
|
"tsdown": "^0.22.14",
|
package/spec/catalog.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "AG-UI conformance rule catalog. Data, not code: a Python/Go implementation shares these rules. Severities follow the working agreement that behaviour the spec does not clearly govern is at most 'info' — entries with 'specQuestion' were downgraded accordingly; see docs/spec-questions.md.",
|
|
3
|
-
"catalogVersion": "0.
|
|
3
|
+
"catalogVersion": "0.4.0",
|
|
4
4
|
"spec": "0.x",
|
|
5
5
|
"rules": [
|
|
6
6
|
{
|
|
7
7
|
"id": "AGUI001",
|
|
8
8
|
"severity": "error",
|
|
9
9
|
"title": "Run does not start with RUN_STARTED",
|
|
10
|
+
"category": "lifecycle",
|
|
10
11
|
"messageTemplate": "First event of the run is {type}; expected RUN_STARTED",
|
|
11
12
|
"specUrl": "https://docs.ag-ui.com/concepts/events#runstarted",
|
|
12
13
|
"specQuote": "The RunStarted event is the first event emitted when an agent begins processing a request.",
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
"id": "AGUI002",
|
|
18
19
|
"severity": "error",
|
|
19
20
|
"title": "Multiple RUN_STARTED in one run",
|
|
21
|
+
"category": "lifecycle",
|
|
20
22
|
"messageTemplate": "Duplicate RUN_STARTED (runId '{runId}') before the active run terminated",
|
|
21
23
|
"specUrl": "https://docs.ag-ui.com/concepts/events#lifecycle-events",
|
|
22
24
|
"specQuote": "The RunStarted and either RunFinished or RunError events are mandatory, forming the boundaries of an agent run.",
|
|
@@ -27,6 +29,7 @@
|
|
|
27
29
|
"id": "AGUI003",
|
|
28
30
|
"severity": "error",
|
|
29
31
|
"title": "Run not terminated",
|
|
32
|
+
"category": "lifecycle",
|
|
30
33
|
"messageTemplate": "Run '{runId}' ended without RUN_FINISHED or RUN_ERROR",
|
|
31
34
|
"specUrl": "https://docs.ag-ui.com/concepts/events#runfinished",
|
|
32
35
|
"specQuote": "Every run terminates with either RunFinished or RunError.",
|
|
@@ -37,6 +40,7 @@
|
|
|
37
40
|
"id": "AGUI004",
|
|
38
41
|
"severity": "error",
|
|
39
42
|
"title": "Event after terminal event",
|
|
43
|
+
"category": "lifecycle",
|
|
40
44
|
"messageTemplate": "{type} follows the run's terminal {terminalType}",
|
|
41
45
|
"specUrl": "https://docs.ag-ui.com/concepts/events#lifecycle-events",
|
|
42
46
|
"specQuote": "The RunStarted and either RunFinished or RunError events are mandatory, forming the boundaries of an agent run.",
|
|
@@ -47,6 +51,7 @@
|
|
|
47
51
|
"id": "AGUI005",
|
|
48
52
|
"severity": "error",
|
|
49
53
|
"title": "RUN_FINISHED and RUN_ERROR are mutually exclusive",
|
|
54
|
+
"category": "lifecycle",
|
|
50
55
|
"messageTemplate": "{type} emitted after the run already terminated with {terminalType}",
|
|
51
56
|
"specUrl": "https://docs.ag-ui.com/concepts/events#runfinished",
|
|
52
57
|
"specQuote": "Every run terminates with either RunFinished or RunError.",
|
|
@@ -57,6 +62,7 @@
|
|
|
57
62
|
"id": "AGUI006",
|
|
58
63
|
"severity": "error",
|
|
59
64
|
"title": "STEP_FINISHED without matching STEP_STARTED",
|
|
65
|
+
"category": "lifecycle",
|
|
60
66
|
"messageTemplate": "STEP_FINISHED '{stepName}' has no open STEP_STARTED",
|
|
61
67
|
"specUrl": "https://docs.ag-ui.com/concepts/events#stepfinished",
|
|
62
68
|
"specQuote": "The stepName must match the corresponding StepStarted event.",
|
|
@@ -67,6 +73,7 @@
|
|
|
67
73
|
"id": "AGUI007",
|
|
68
74
|
"severity": "error",
|
|
69
75
|
"title": "Step unterminated at run end",
|
|
76
|
+
"category": "lifecycle",
|
|
70
77
|
"messageTemplate": "STEP_STARTED '{stepName}' never finished",
|
|
71
78
|
"specUrl": "https://docs.ag-ui.com/concepts/events#stepstarted",
|
|
72
79
|
"specQuote": "The stepName must match the corresponding StepStarted event.",
|
|
@@ -77,6 +84,7 @@
|
|
|
77
84
|
"id": "AGUI008",
|
|
78
85
|
"severity": "warning",
|
|
79
86
|
"title": "Unstable threadId/runId across the run",
|
|
87
|
+
"category": "lifecycle",
|
|
80
88
|
"messageTemplate": "RUN_FINISHED {field} '{actual}' does not match RUN_STARTED {field} '{expected}'",
|
|
81
89
|
"specUrl": "https://docs.ag-ui.com/concepts/events#runstarted",
|
|
82
90
|
"specQuote": "It also provides crucial identifiers that can be used to associate subsequent events with this specific run.",
|
|
@@ -87,6 +95,7 @@
|
|
|
87
95
|
"id": "AGUI101",
|
|
88
96
|
"severity": "error",
|
|
89
97
|
"title": "TEXT_MESSAGE_CONTENT without start",
|
|
98
|
+
"category": "text",
|
|
90
99
|
"messageTemplate": "TEXT_MESSAGE_CONTENT for messageId '{messageId}' with no open TEXT_MESSAGE_START",
|
|
91
100
|
"specUrl": "https://docs.ag-ui.com/concepts/events#text-message-events",
|
|
92
101
|
"specQuote": "A message begins with a TextMessageStart event, followed by one or more TextMessageContent events that deliver chunks of text as they become available, and concludes with a TextMessageEnd event.",
|
|
@@ -98,6 +107,7 @@
|
|
|
98
107
|
"id": "AGUI102",
|
|
99
108
|
"severity": "error",
|
|
100
109
|
"title": "TEXT_MESSAGE_END without start",
|
|
110
|
+
"category": "text",
|
|
101
111
|
"messageTemplate": "TEXT_MESSAGE_END for messageId '{messageId}' with no open TEXT_MESSAGE_START",
|
|
102
112
|
"specUrl": "https://docs.ag-ui.com/concepts/events#textmessageend",
|
|
103
113
|
"specQuote": "messageId: Matches the ID from TextMessageStart",
|
|
@@ -109,6 +119,7 @@
|
|
|
109
119
|
"id": "AGUI103",
|
|
110
120
|
"severity": "error",
|
|
111
121
|
"title": "Text message unterminated at run end",
|
|
122
|
+
"category": "text",
|
|
112
123
|
"messageTemplate": "TEXT_MESSAGE_START messageId '{messageId}' never ended",
|
|
113
124
|
"specUrl": "https://docs.ag-ui.com/concepts/events#text-message-events",
|
|
114
125
|
"specQuote": "A message begins with a TextMessageStart event, followed by one or more TextMessageContent events that deliver chunks of text as they become available, and concludes with a TextMessageEnd event.",
|
|
@@ -120,6 +131,7 @@
|
|
|
120
131
|
"id": "AGUI104",
|
|
121
132
|
"severity": "error",
|
|
122
133
|
"title": "Duplicate messageId within a run",
|
|
134
|
+
"category": "text",
|
|
123
135
|
"messageTemplate": "messageId '{messageId}' was already used by a completed message",
|
|
124
136
|
"specUrl": "https://docs.ag-ui.com/concepts/events#textmessagestart",
|
|
125
137
|
"specQuote": "It establishes a unique messageId that will be referenced by subsequent content chunks and the end event.",
|
|
@@ -131,6 +143,7 @@
|
|
|
131
143
|
"id": "AGUI105",
|
|
132
144
|
"severity": "warning",
|
|
133
145
|
"title": "Empty content delta",
|
|
146
|
+
"category": "text",
|
|
134
147
|
"messageTemplate": "TEXT_MESSAGE_CONTENT for messageId '{messageId}' has an empty delta",
|
|
135
148
|
"specUrl": "https://docs.ag-ui.com/concepts/events#textmessagecontent",
|
|
136
149
|
"specQuote": "delta: Text content chunk (non-empty)",
|
|
@@ -143,6 +156,7 @@
|
|
|
143
156
|
"id": "AGUI106",
|
|
144
157
|
"severity": "error",
|
|
145
158
|
"title": "Interleaved message streams sharing a messageId",
|
|
159
|
+
"category": "text",
|
|
146
160
|
"messageTemplate": "TEXT_MESSAGE_START for messageId '{messageId}', which is already open",
|
|
147
161
|
"specUrl": "https://docs.ag-ui.com/concepts/events#implementation-considerations",
|
|
148
162
|
"specQuote": "Events with the same ID (e.g., messageId, toolCallId) belong to the same logical stream",
|
|
@@ -154,6 +168,7 @@
|
|
|
154
168
|
"id": "AGUI201",
|
|
155
169
|
"severity": "error",
|
|
156
170
|
"title": "TOOL_CALL_ARGS without start",
|
|
171
|
+
"category": "toolcall",
|
|
157
172
|
"messageTemplate": "TOOL_CALL_ARGS for toolCallId '{toolCallId}' with no open TOOL_CALL_START",
|
|
158
173
|
"specUrl": "https://docs.ag-ui.com/concepts/events#tool-call-events",
|
|
159
174
|
"specQuote": "When an agent needs to use a tool, it emits a ToolCallStart event, followed by one or more ToolCallArgs events that stream the arguments being passed to the tool, and concludes with a ToolCallEnd event.",
|
|
@@ -165,6 +180,7 @@
|
|
|
165
180
|
"id": "AGUI202",
|
|
166
181
|
"severity": "error",
|
|
167
182
|
"title": "TOOL_CALL_END without start",
|
|
183
|
+
"category": "toolcall",
|
|
168
184
|
"messageTemplate": "TOOL_CALL_END for toolCallId '{toolCallId}' with no open TOOL_CALL_START",
|
|
169
185
|
"specUrl": "https://docs.ag-ui.com/concepts/events#toolcallend",
|
|
170
186
|
"specQuote": "toolCallId: Matches the ID from ToolCallStart",
|
|
@@ -176,6 +192,7 @@
|
|
|
176
192
|
"id": "AGUI203",
|
|
177
193
|
"severity": "error",
|
|
178
194
|
"title": "Unterminated tool call",
|
|
195
|
+
"category": "toolcall",
|
|
179
196
|
"messageTemplate": "TOOL_CALL_START id '{toolCallId}' never terminated",
|
|
180
197
|
"specUrl": "https://docs.ag-ui.com/concepts/events#tool-call-events",
|
|
181
198
|
"specQuote": "When an agent needs to use a tool, it emits a ToolCallStart event, followed by one or more ToolCallArgs events that stream the arguments being passed to the tool, and concludes with a ToolCallEnd event.",
|
|
@@ -187,6 +204,7 @@
|
|
|
187
204
|
"id": "AGUI204",
|
|
188
205
|
"severity": "error",
|
|
189
206
|
"title": "Tool call arguments are not valid JSON",
|
|
207
|
+
"category": "toolcall",
|
|
190
208
|
"messageTemplate": "Concatenated TOOL_CALL_ARGS for toolCallId '{toolCallId}' do not parse as JSON: {error}",
|
|
191
209
|
"specUrl": "https://docs.ag-ui.com/concepts/events#toolcallargs",
|
|
192
210
|
"specQuote": "Frontends should concatenate these deltas in the order received to construct the complete arguments object.",
|
|
@@ -198,6 +216,7 @@
|
|
|
198
216
|
"id": "AGUI205",
|
|
199
217
|
"severity": "error",
|
|
200
218
|
"title": "Duplicate toolCallId within a run",
|
|
219
|
+
"category": "toolcall",
|
|
201
220
|
"messageTemplate": "toolCallId '{toolCallId}' was already used by a completed tool call",
|
|
202
221
|
"specUrl": "https://docs.ag-ui.com/concepts/events#toolcallstart",
|
|
203
222
|
"specQuote": "toolCallId: Unique identifier for the tool call",
|
|
@@ -209,6 +228,7 @@
|
|
|
209
228
|
"id": "AGUI206",
|
|
210
229
|
"severity": "warning",
|
|
211
230
|
"title": "TOOL_CALL_RESULT before TOOL_CALL_END",
|
|
231
|
+
"category": "toolcall",
|
|
212
232
|
"messageTemplate": "TOOL_CALL_RESULT for toolCallId '{toolCallId}' arrived while the call is still open",
|
|
213
233
|
"specUrl": "https://docs.ag-ui.com/concepts/events#toolcallresult",
|
|
214
234
|
"specQuote": "This event is sent after the tool has been executed by the system and contains the actual output generated by the tool.",
|
|
@@ -220,6 +240,7 @@
|
|
|
220
240
|
"id": "AGUI207",
|
|
221
241
|
"severity": "error",
|
|
222
242
|
"title": "TOOL_CALL_RESULT references unknown toolCallId",
|
|
243
|
+
"category": "toolcall",
|
|
223
244
|
"messageTemplate": "TOOL_CALL_RESULT references toolCallId '{toolCallId}', which was never started",
|
|
224
245
|
"specUrl": "https://docs.ag-ui.com/concepts/events#toolcallresult",
|
|
225
246
|
"specQuote": "toolCallId: Matches the ID from the corresponding ToolCallStart event",
|
|
@@ -231,6 +252,7 @@
|
|
|
231
252
|
"id": "AGUI208",
|
|
232
253
|
"severity": "info",
|
|
233
254
|
"title": "parentMessageId references unknown message",
|
|
255
|
+
"category": "toolcall",
|
|
234
256
|
"messageTemplate": "TOOL_CALL_START parentMessageId '{parentMessageId}' matches no message observed in this stream",
|
|
235
257
|
"specUrl": "https://docs.ag-ui.com/concepts/events#toolcallstart",
|
|
236
258
|
"specQuote": "The optional parentMessageId allows linking the tool call to a specific message in the conversation, providing context for why the tool is being used.",
|
|
@@ -243,6 +265,7 @@
|
|
|
243
265
|
"id": "AGUI301",
|
|
244
266
|
"severity": "info",
|
|
245
267
|
"title": "STATE_DELTA before any STATE_SNAPSHOT",
|
|
268
|
+
"category": "state",
|
|
246
269
|
"messageTemplate": "STATE_DELTA precedes any STATE_SNAPSHOT; the base it applies to is not observable on this stream",
|
|
247
270
|
"specUrl": "https://docs.ag-ui.com/concepts/events#statesnapshot",
|
|
248
271
|
"specQuote": "This event is typically sent at the beginning of an interaction or when synchronization is needed.",
|
|
@@ -255,6 +278,7 @@
|
|
|
255
278
|
"id": "AGUI302",
|
|
256
279
|
"severity": "error",
|
|
257
280
|
"title": "STATE_DELTA failed to apply",
|
|
281
|
+
"category": "state",
|
|
258
282
|
"messageTemplate": "STATE_DELTA failed to apply: {error}",
|
|
259
283
|
"specUrl": "https://docs.ag-ui.com/concepts/events#statedelta",
|
|
260
284
|
"specQuote": "Each delta represents specific changes to apply to the current state model.",
|
|
@@ -266,6 +290,7 @@
|
|
|
266
290
|
"id": "AGUI303",
|
|
267
291
|
"severity": "error",
|
|
268
292
|
"title": "STATE_DELTA is not a valid RFC 6902 patch document",
|
|
293
|
+
"category": "state",
|
|
269
294
|
"messageTemplate": "STATE_DELTA is not a valid RFC 6902 patch document: {error}",
|
|
270
295
|
"specUrl": "https://docs.ag-ui.com/concepts/events#statedelta",
|
|
271
296
|
"specQuote": "The StateDelta event contains incremental updates to the agent's state in the form of JSON Patch operations (as defined in RFC 6902).",
|
|
@@ -277,6 +302,7 @@
|
|
|
277
302
|
"id": "AGUI304",
|
|
278
303
|
"severity": "info",
|
|
279
304
|
"title": "Mid-run STATE_SNAPSHOT discards accumulated deltas",
|
|
305
|
+
"category": "state",
|
|
280
306
|
"messageTemplate": "STATE_SNAPSHOT replaces state previously built from {deltaCount} delta(s)",
|
|
281
307
|
"specUrl": "https://docs.ag-ui.com/concepts/events#statesnapshot",
|
|
282
308
|
"specQuote": "This event is typically sent at the beginning of an interaction or when synchronization is needed.",
|
|
@@ -288,6 +314,7 @@
|
|
|
288
314
|
"id": "AGUI305",
|
|
289
315
|
"severity": "warning",
|
|
290
316
|
"title": "Shared state declared but never established",
|
|
317
|
+
"category": "state",
|
|
291
318
|
"messageTemplate": "features include 'shared-state' but no STATE_SNAPSHOT was emitted",
|
|
292
319
|
"specUrl": "https://docs.ag-ui.com/concepts/events#state-management-events",
|
|
293
320
|
"specQuote": "These events are used to manage and synchronize the agent's state with the frontend.",
|
|
@@ -300,6 +327,7 @@
|
|
|
300
327
|
"id": "AGUI401",
|
|
301
328
|
"severity": "error",
|
|
302
329
|
"title": "REASONING_MESSAGE_CONTENT without start",
|
|
330
|
+
"category": "reasoning",
|
|
303
331
|
"messageTemplate": "REASONING_MESSAGE_CONTENT for messageId '{messageId}' with no open REASONING_MESSAGE_START",
|
|
304
332
|
"specUrl": "https://docs.ag-ui.com/concepts/events#reasoningmessagecontent",
|
|
305
333
|
"specQuote": "Multiple content events with the same messageId should be concatenated to form the complete visible reasoning.",
|
|
@@ -311,6 +339,7 @@
|
|
|
311
339
|
"id": "AGUI402",
|
|
312
340
|
"severity": "warning",
|
|
313
341
|
"title": "Reasoning unterminated at run end",
|
|
342
|
+
"category": "reasoning",
|
|
314
343
|
"messageTemplate": "{startType} messageId '{messageId}' never ended",
|
|
315
344
|
"specUrl": "https://docs.ag-ui.com/concepts/events#reasoning-events",
|
|
316
345
|
"specQuote": "Reasoning events support LLM reasoning visibility and continuity, enabling chain-of-thought reasoning while maintaining privacy.",
|
|
@@ -322,6 +351,7 @@
|
|
|
322
351
|
"id": "AGUI501",
|
|
323
352
|
"severity": "error",
|
|
324
353
|
"title": "Malformed SSE framing",
|
|
354
|
+
"category": "transport",
|
|
325
355
|
"messageTemplate": "Malformed SSE framing: {detail}",
|
|
326
356
|
"specUrl": "https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation",
|
|
327
357
|
"since": "0.x",
|
|
@@ -331,6 +361,7 @@
|
|
|
331
361
|
"id": "AGUI502",
|
|
332
362
|
"severity": "error",
|
|
333
363
|
"title": "Event payload is not valid JSON",
|
|
364
|
+
"category": "transport",
|
|
334
365
|
"messageTemplate": "Event payload is not valid JSON: {error}",
|
|
335
366
|
"specUrl": "https://docs.ag-ui.com/concepts/events#base-event-properties",
|
|
336
367
|
"specQuote": "All events share a common set of base properties.",
|
|
@@ -341,6 +372,7 @@
|
|
|
341
372
|
"id": "AGUI503",
|
|
342
373
|
"severity": "error",
|
|
343
374
|
"title": "Unknown event type",
|
|
375
|
+
"category": "transport",
|
|
344
376
|
"messageTemplate": "Unknown event type '{type}' (not in the installed AG-UI SDK v{sdkVersion}, and not RAW or CUSTOM)",
|
|
345
377
|
"specUrl": "https://docs.ag-ui.com/concepts/events#event-types-overview",
|
|
346
378
|
"specQuote": "Events in the protocol are categorized by their purpose.",
|
|
@@ -351,6 +383,7 @@
|
|
|
351
383
|
"id": "AGUI504",
|
|
352
384
|
"severity": "error",
|
|
353
385
|
"title": "Event fails schema validation for its declared type",
|
|
386
|
+
"category": "transport",
|
|
354
387
|
"messageTemplate": "{type}: {detail}",
|
|
355
388
|
"specUrl": "https://docs.ag-ui.com/concepts/events#base-event-properties",
|
|
356
389
|
"specQuote": "All events share a common set of base properties.",
|
|
@@ -361,6 +394,7 @@
|
|
|
361
394
|
"id": "AGUI505",
|
|
362
395
|
"severity": "warning",
|
|
363
396
|
"title": "Unexpected Content-Type",
|
|
397
|
+
"category": "transport",
|
|
364
398
|
"messageTemplate": "Content-Type '{contentType}' is neither text/event-stream nor application/x-ndjson",
|
|
365
399
|
"specUrl": "https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model",
|
|
366
400
|
"since": "0.x",
|
|
@@ -370,6 +404,7 @@
|
|
|
370
404
|
"id": "AGUI506",
|
|
371
405
|
"severity": "info",
|
|
372
406
|
"title": "No keepalive frame within the configured window",
|
|
407
|
+
"category": "transport",
|
|
373
408
|
"messageTemplate": "No event or keepalive frame for {seconds}s",
|
|
374
409
|
"specUrl": "https://docs.ag-ui.com/concepts/architecture#standard-http-client",
|
|
375
410
|
"since": "0.x",
|
|
@@ -380,6 +415,7 @@
|
|
|
380
415
|
"id": "AGUI507",
|
|
381
416
|
"severity": "info",
|
|
382
417
|
"title": "Response appears buffered rather than incrementally flushed",
|
|
418
|
+
"category": "transport",
|
|
383
419
|
"messageTemplate": "Response appears buffered: {detail}",
|
|
384
420
|
"specUrl": "https://docs.ag-ui.com/concepts/architecture#standard-http-client",
|
|
385
421
|
"since": "0.x",
|
|
@@ -390,16 +426,85 @@
|
|
|
390
426
|
"id": "AGUI508",
|
|
391
427
|
"severity": "error",
|
|
392
428
|
"title": "Stream ended without a terminal event",
|
|
429
|
+
"category": "transport",
|
|
393
430
|
"messageTemplate": "Connection ended mid-run '{runId}' without RUN_FINISHED or RUN_ERROR",
|
|
394
431
|
"specUrl": "https://docs.ag-ui.com/concepts/events#runfinished",
|
|
395
432
|
"specQuote": "Every run terminates with either RunFinished or RunError.",
|
|
396
433
|
"since": "0.x",
|
|
397
434
|
"checkedIn": "transport"
|
|
398
435
|
},
|
|
436
|
+
{
|
|
437
|
+
"id": "AGUI601",
|
|
438
|
+
"severity": "error",
|
|
439
|
+
"title": "Duplicate SUBAGENT_STARTED for a subagentRunId",
|
|
440
|
+
"category": "subagent",
|
|
441
|
+
"messageTemplate": "SUBAGENT_STARTED reuses subagentRunId '{subagentRunId}', which is already in use this run",
|
|
442
|
+
"specUrl": "https://docs.ag-ui.com/concepts/subagents#rules-clients-enforce",
|
|
443
|
+
"specQuote": "a subagent is not started twice within a run",
|
|
444
|
+
"since": "0.x",
|
|
445
|
+
"checkedIn": "core"
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
"id": "AGUI602",
|
|
449
|
+
"severity": "error",
|
|
450
|
+
"title": "SUBAGENT_FINISHED without matching SUBAGENT_STARTED",
|
|
451
|
+
"category": "subagent",
|
|
452
|
+
"messageTemplate": "SUBAGENT_FINISHED for subagentRunId '{subagentRunId}' with no open SUBAGENT_STARTED",
|
|
453
|
+
"specUrl": "https://docs.ag-ui.com/concepts/subagents#rules-clients-enforce",
|
|
454
|
+
"specQuote": "SubagentFinished and SubagentError name a subagent that is currently active",
|
|
455
|
+
"since": "0.x",
|
|
456
|
+
"checkedIn": "core"
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"id": "AGUI603",
|
|
460
|
+
"severity": "error",
|
|
461
|
+
"title": "SUBAGENT_ERROR without matching SUBAGENT_STARTED",
|
|
462
|
+
"category": "subagent",
|
|
463
|
+
"messageTemplate": "SUBAGENT_ERROR for subagentRunId '{subagentRunId}' with no open SUBAGENT_STARTED",
|
|
464
|
+
"specUrl": "https://docs.ag-ui.com/concepts/subagents#rules-clients-enforce",
|
|
465
|
+
"specQuote": "SubagentFinished and SubagentError name a subagent that is currently active",
|
|
466
|
+
"since": "0.x",
|
|
467
|
+
"checkedIn": "core"
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
"id": "AGUI604",
|
|
471
|
+
"severity": "error",
|
|
472
|
+
"title": "Subagent unterminated at run end",
|
|
473
|
+
"category": "subagent",
|
|
474
|
+
"messageTemplate": "SUBAGENT_STARTED subagentRunId '{subagentRunId}' never closed with SUBAGENT_FINISHED or SUBAGENT_ERROR",
|
|
475
|
+
"specUrl": "https://docs.ag-ui.com/concepts/subagents#rules-clients-enforce",
|
|
476
|
+
"specQuote": "Every started subagent is closed before RunFinished.",
|
|
477
|
+
"since": "0.x",
|
|
478
|
+
"checkedIn": "core"
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"id": "AGUI605",
|
|
482
|
+
"severity": "warning",
|
|
483
|
+
"title": "parentSubagentRunId references a subagent never started",
|
|
484
|
+
"category": "subagent",
|
|
485
|
+
"messageTemplate": "SUBAGENT_STARTED parentSubagentRunId '{parentSubagentRunId}' matches no subagent observed in this stream",
|
|
486
|
+
"specUrl": "https://docs.ag-ui.com/concepts/subagents#nesting-and-concurrency",
|
|
487
|
+
"specQuote": "parentSubagentRunId need only name a subagent that has been started, not one still active",
|
|
488
|
+
"since": "0.x",
|
|
489
|
+
"checkedIn": "core"
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"id": "AGUI606",
|
|
493
|
+
"severity": "warning",
|
|
494
|
+
"title": "Continuation event's subagentRunId disagrees with its entity's owner",
|
|
495
|
+
"category": "subagent",
|
|
496
|
+
"messageTemplate": "{type} declares subagentRunId '{actual}', but {entityType} '{entityId}' was opened under {expected}",
|
|
497
|
+
"specUrl": "https://docs.ag-ui.com/concepts/subagents#rules-clients-enforce",
|
|
498
|
+
"specQuote": "Continuation and close events agree with the owner their entity was created under.",
|
|
499
|
+
"since": "0.x",
|
|
500
|
+
"specQuestion": "SQ-15",
|
|
501
|
+
"checkedIn": "core"
|
|
502
|
+
},
|
|
399
503
|
{
|
|
400
504
|
"id": "AGUI901",
|
|
401
505
|
"severity": "info",
|
|
402
506
|
"title": "RAW event wraps a typed AG-UI event",
|
|
507
|
+
"category": "hygiene",
|
|
403
508
|
"messageTemplate": "RAW event wraps an event of type '{wrappedType}', which has a typed AG-UI equivalent",
|
|
404
509
|
"specUrl": "https://docs.ag-ui.com/concepts/events#raw",
|
|
405
510
|
"specQuote": "The Raw event acts as a container for events originating from external systems or sources that don't natively follow the Agent UI Protocol.",
|
|
@@ -410,6 +515,7 @@
|
|
|
410
515
|
"id": "AGUI902",
|
|
411
516
|
"severity": "info",
|
|
412
517
|
"title": "Events carry no timestamps",
|
|
518
|
+
"category": "hygiene",
|
|
413
519
|
"messageTemplate": "None of the {eventCount} events carry the optional timestamp property",
|
|
414
520
|
"specUrl": "https://docs.ag-ui.com/concepts/events#base-event-properties",
|
|
415
521
|
"specQuote": "timestamp: Optional timestamp indicating when the event was created",
|
|
@@ -420,6 +526,7 @@
|
|
|
420
526
|
"id": "AGUI903",
|
|
421
527
|
"severity": "info",
|
|
422
528
|
"title": "CUSTOM event name is not namespaced",
|
|
529
|
+
"category": "hygiene",
|
|
423
530
|
"messageTemplate": "CUSTOM event name '{name}' has no namespace prefix (e.g. 'vendor.event')",
|
|
424
531
|
"specUrl": "https://docs.ag-ui.com/concepts/events#custom",
|
|
425
532
|
"specQuote": "Teams should document their custom events to ensure consistent implementation across frontends and agents.",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"activity",
|
|
9
9
|
"reasoning",
|
|
10
10
|
"thinking",
|
|
11
|
-
"special"
|
|
11
|
+
"special",
|
|
12
|
+
"subagent"
|
|
12
13
|
],
|
|
13
14
|
"eventCategory": {
|
|
14
15
|
"RUN_STARTED": "lifecycle",
|
|
@@ -43,7 +44,10 @@
|
|
|
43
44
|
"THINKING_TEXT_MESSAGE_CONTENT": "thinking",
|
|
44
45
|
"THINKING_TEXT_MESSAGE_END": "thinking",
|
|
45
46
|
"RAW": "special",
|
|
46
|
-
"CUSTOM": "special"
|
|
47
|
+
"CUSTOM": "special",
|
|
48
|
+
"SUBAGENT_STARTED": "subagent",
|
|
49
|
+
"SUBAGENT_FINISHED": "subagent",
|
|
50
|
+
"SUBAGENT_ERROR": "subagent"
|
|
47
51
|
},
|
|
48
52
|
"$deprecatedComment": "@deprecated markers in @ag-ui/core's type definitions, 'Will be removed in 1.0.0'. Maps a deprecated wire type to its replacement.",
|
|
49
53
|
"deprecated": {
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
"chunks": [
|
|
4
4
|
{
|
|
5
5
|
"gapMs": 0,
|
|
6
|
-
"text": "data: {\"type\":\"RUN_STARTED\",\"threadId\":\"thread_001\",\"runId\":\"run_001\",\"timestamp\":
|
|
6
|
+
"text": "data: {\"type\":\"RUN_STARTED\",\"threadId\":\"thread_001\",\"runId\":\"run_001\",\"timestamp\":1755300022900}\n\n"
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
"gapMs": 0,
|
|
10
|
-
"text": "{\"type\":\"CUSTOM\",\"name\":\"acme.ping\",\"value\":1,\"timestamp\":
|
|
10
|
+
"text": "{\"type\":\"CUSTOM\",\"name\":\"acme.ping\",\"value\":1,\"timestamp\":1755300023000}\n\n"
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"gapMs": 0,
|
|
14
|
-
"text": "data: {\"type\":\"RUN_FINISHED\",\"threadId\":\"thread_001\",\"runId\":\"run_001\",\"outcome\":{\"type\":\"success\"},\"timestamp\":
|
|
14
|
+
"text": "data: {\"type\":\"RUN_FINISHED\",\"threadId\":\"thread_001\",\"runId\":\"run_001\",\"outcome\":{\"type\":\"success\"},\"timestamp\":1755300023100}\n\n"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{"type":"RUN_STARTED","threadId":"thread_001","runId":"run_001","timestamp":
|
|
1
|
+
{"type":"RUN_STARTED","threadId":"thread_001","runId":"run_001","timestamp":1755300021400}
|
|
2
2
|
{"type": broken json
|
|
3
|
-
{"type":"RUN_FINISHED","threadId":"thread_001","runId":"run_001","outcome":{"type":"success"},"timestamp":
|
|
3
|
+
{"type":"RUN_FINISHED","threadId":"thread_001","runId":"run_001","outcome":{"type":"success"},"timestamp":1755300021500}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
{
|
|
3
3
|
"rule": "AGUI503",
|
|
4
4
|
"severity": "error",
|
|
5
|
-
"message": "Unknown event type 'AGUI_PING' (not in the installed AG-UI SDK v0.0.
|
|
5
|
+
"message": "Unknown event type 'AGUI_PING' (not in the installed AG-UI SDK v0.0.59, and not RAW or CUSTOM)",
|
|
6
6
|
"eventIndex": 1,
|
|
7
7
|
"specUrl": "https://docs.ag-ui.com/concepts/events#event-types-overview",
|
|
8
8
|
"eventType": "AGUI_PING"
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{"type":"RUN_STARTED","threadId":"thread_001","runId":"run_001","timestamp":
|
|
2
|
-
{"type":"AGUI_PING","timestamp":
|
|
3
|
-
{"type":"RUN_FINISHED","threadId":"thread_001","runId":"run_001","outcome":{"type":"success"},"timestamp":
|
|
1
|
+
{"type":"RUN_STARTED","threadId":"thread_001","runId":"run_001","timestamp":1755300021600}
|
|
2
|
+
{"type":"AGUI_PING","timestamp":1755300021700}
|
|
3
|
+
{"type":"RUN_FINISHED","threadId":"thread_001","runId":"run_001","outcome":{"type":"success"},"timestamp":1755300021800}
|