@ai-matrx/agents 0.10.3 → 0.10.5
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 +12 -0
- package/dist/index.cjs +26 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/mandates/index.cjs +2 -2
- package/dist/mandates/index.cjs.map +1 -1
- package/dist/mandates/index.d.cts +4 -4
- package/dist/mandates/index.d.ts +4 -4
- package/dist/mandates/index.js +2 -2
- package/dist/mandates/index.js.map +1 -1
- package/dist/matrx/index.cjs +18 -2
- package/dist/matrx/index.cjs.map +1 -1
- package/dist/matrx/index.js +18 -2
- package/dist/matrx/index.js.map +1 -1
- package/dist/projection/request.cjs +8 -2
- package/dist/projection/request.cjs.map +1 -1
- package/dist/projection/request.d.cts +2 -0
- package/dist/projection/request.d.ts +2 -0
- package/dist/projection/request.js +8 -2
- package/dist/projection/request.js.map +1 -1
- package/dist/react/index.cjs +26 -4
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +3 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.js +26 -4
- package/dist/react/index.js.map +1 -1
- package/dist/stream/ndjson.cjs +18 -2
- package/dist/stream/ndjson.cjs.map +1 -1
- package/dist/stream/ndjson.d.cts +2 -0
- package/dist/stream/ndjson.d.ts +2 -0
- package/dist/stream/ndjson.js +18 -2
- package/dist/stream/ndjson.js.map +1 -1
- package/mandates/snapshots/keys.0.10.3.json +469 -0
- package/mandates/snapshots/keys.0.10.4.json +469 -0
- package/package.json +3 -3
|
@@ -45,6 +45,7 @@ function createAgentRequestProjection(input) {
|
|
|
45
45
|
completion: null,
|
|
46
46
|
error: null,
|
|
47
47
|
lastTransportSeq: 0,
|
|
48
|
+
transportStreamId: null,
|
|
48
49
|
eventCount: 0
|
|
49
50
|
};
|
|
50
51
|
}
|
|
@@ -68,12 +69,17 @@ function toolStatus(event) {
|
|
|
68
69
|
}
|
|
69
70
|
function projectAgentEvent(current, event) {
|
|
70
71
|
const streamSeq = asNumber(event.stream_seq);
|
|
71
|
-
|
|
72
|
+
const streamId = asString(event.stream_id);
|
|
73
|
+
const sameSegment = streamId === null || streamId === current.transportStreamId;
|
|
74
|
+
if (sameSegment && streamSeq !== null && streamSeq <= current.lastTransportSeq) {
|
|
75
|
+
return current;
|
|
76
|
+
}
|
|
72
77
|
const data = asRecord(event.data);
|
|
73
78
|
const next = {
|
|
74
79
|
...current,
|
|
75
80
|
status: current.status === "pending" ? "streaming" : current.status,
|
|
76
|
-
lastTransportSeq: streamSeq
|
|
81
|
+
lastTransportSeq: streamSeq === null ? current.lastTransportSeq : sameSegment ? Math.max(current.lastTransportSeq, streamSeq) : streamSeq,
|
|
82
|
+
transportStreamId: streamId ?? current.transportStreamId,
|
|
77
83
|
eventCount: current.eventCount + 1
|
|
78
84
|
};
|
|
79
85
|
switch (event.event) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../projection/request.ts"],"sourcesContent":["export type AgentProjectionStatus =\n | \"pending\"\n | \"streaming\"\n | \"awaiting-tools\"\n | \"complete\"\n | \"error\"\n | \"cancelled\";\n\nexport interface AgentProjectionOperation {\n operationId: string;\n operation: string;\n parentOperationId: string | null;\n status: \"active\" | \"success\" | \"failed\" | \"cancelled\";\n metadata: Record<string, unknown> | null;\n result: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionTool {\n callId: string;\n toolName: string;\n status:\n | \"started\"\n | \"progress\"\n | \"step\"\n | \"preview\"\n | \"completed\"\n | \"error\"\n | \"delegated\";\n message: string | null;\n data: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionRenderBlock {\n blockId: string;\n blockIndex: number;\n type: string;\n status: \"streaming\" | \"complete\" | \"error\";\n content: string | null;\n data: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n}\n\nexport interface AgentRequestProjection {\n requestId: string;\n conversationId: string | null;\n status: AgentProjectionStatus;\n answer: string;\n reasoning: string;\n reasoningActive: boolean;\n phase: string | null;\n phaseHistory: string[];\n operations: Record<string, AgentProjectionOperation>;\n tools: Record<string, AgentProjectionTool>;\n renderBlocks: Record<string, AgentProjectionRenderBlock>;\n renderBlockOrder: string[];\n completion: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n lastTransportSeq: number;\n eventCount: number;\n}\n\nexport interface AgentProjectionEvent {\n event: string;\n data?: unknown;\n stream_seq?: number;\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nconst asString = (value: unknown): string | null =>\n typeof value === \"string\" ? value : null;\n\nconst asNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nexport function createAgentRequestProjection(input: {\n requestId: string;\n conversationId?: string | null;\n}): AgentRequestProjection {\n return {\n requestId: input.requestId,\n conversationId: input.conversationId ?? null,\n status: \"pending\",\n answer: \"\",\n reasoning: \"\",\n reasoningActive: false,\n phase: null,\n phaseHistory: [],\n operations: {},\n tools: {},\n renderBlocks: {},\n renderBlockOrder: [],\n completion: null,\n error: null,\n lastTransportSeq: 0,\n eventCount: 0,\n };\n}\n\nfunction toolStatus(event: string): AgentProjectionTool[\"status\"] {\n switch (event) {\n case \"tool_started\":\n return \"started\";\n case \"tool_step\":\n return \"step\";\n case \"tool_result_preview\":\n return \"preview\";\n case \"tool_completed\":\n return \"completed\";\n case \"tool_error\":\n return \"error\";\n case \"tool_delegated\":\n return \"delegated\";\n default:\n return \"progress\";\n }\n}\n\nexport function projectAgentEvent(\n current: AgentRequestProjection,\n event: AgentProjectionEvent,\n): AgentRequestProjection {\n const streamSeq = asNumber(event.stream_seq);\n if (streamSeq !== null && streamSeq <= current.lastTransportSeq) return current;\n\n const data = asRecord(event.data);\n const next: AgentRequestProjection = {\n ...current,\n status: current.status === \"pending\" ? \"streaming\" : current.status,\n lastTransportSeq: streamSeq ?? current.lastTransportSeq,\n eventCount: current.eventCount + 1,\n };\n\n switch (event.event) {\n case \"chunk\": {\n const text = asString(data.text);\n return text === null ? next : { ...next, answer: current.answer + text };\n }\n case \"reasoning_chunk\": {\n const text = asString(data.text);\n return text === null\n ? next\n : {\n ...next,\n reasoning: current.reasoning + text,\n reasoningActive: true,\n };\n }\n case \"reasoning\":\n return {\n ...next,\n reasoningActive: data.state === \"started\",\n };\n case \"phase\": {\n const phase = asString(data.phase);\n if (phase === null) return next;\n return {\n ...next,\n phase,\n phaseHistory: [...current.phaseHistory, phase],\n };\n }\n case \"init\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n if (operationId === null || operation === null) return next;\n return {\n ...next,\n operations: {\n ...current.operations,\n [operationId]: {\n operationId,\n operation,\n parentOperationId: asString(data.parent_operation_id),\n status: \"active\",\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n result: null,\n },\n },\n };\n }\n case \"completion\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n const rawStatus = asString(data.status);\n const status: AgentProjectionOperation[\"status\"] =\n rawStatus === \"failed\" || rawStatus === \"cancelled\"\n ? rawStatus\n : \"success\";\n const result = asRecord(data.result);\n const operations = operationId\n ? {\n ...current.operations,\n [operationId]: {\n ...(current.operations[operationId] ?? {\n operationId,\n operation: operation ?? \"unknown\",\n parentOperationId: null,\n metadata: null,\n }),\n status,\n result,\n },\n }\n : current.operations;\n if (operation === \"user_request\") {\n return {\n ...next,\n operations,\n completion: data,\n status:\n status === \"success\"\n ? \"complete\"\n : status === \"cancelled\"\n ? \"cancelled\"\n : \"error\",\n };\n }\n return { ...next, operations };\n }\n case \"tool_event\": {\n const callId = asString(data.call_id);\n const toolName = asString(data.tool_name);\n const lifecycle = asString(data.event);\n if (callId === null || toolName === null || lifecycle === null) return next;\n const status = toolStatus(lifecycle);\n return {\n ...next,\n status:\n status === \"delegated\"\n ? \"awaiting-tools\"\n : status === \"completed\" || status === \"error\"\n ? \"streaming\"\n : next.status,\n tools: {\n ...current.tools,\n [callId]: {\n callId,\n toolName,\n status,\n message: asString(data.message),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n },\n },\n };\n }\n case \"render_block\": {\n const blockId = asString(data.blockId);\n const blockIndex = asNumber(data.blockIndex);\n const type = asString(data.type);\n if (blockId === null || blockIndex === null || type === null) return next;\n const alreadyKnown = Object.hasOwn(current.renderBlocks, blockId);\n return {\n ...next,\n renderBlocks: {\n ...current.renderBlocks,\n [blockId]: {\n blockId,\n blockIndex,\n type,\n status:\n data.status === \"complete\" || data.status === \"error\"\n ? data.status\n : \"streaming\",\n content: asString(data.content),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n },\n },\n renderBlockOrder: alreadyKnown\n ? current.renderBlockOrder\n : [...current.renderBlockOrder, blockId],\n };\n }\n case \"error\":\n return { ...next, status: \"error\", error: data };\n case \"end\":\n return {\n ...next,\n status:\n current.status === \"error\" || current.status === \"cancelled\"\n ? current.status\n : \"complete\",\n reasoningActive: false,\n };\n case \"data\": {\n const conversationId =\n data.type === \"conversation_id\" ? asString(data.conversation_id) : null;\n return conversationId === null ? next : { ...next, conversationId };\n }\n default:\n return next;\n }\n}\n\nexport function projectAgentEvents(\n initial: AgentRequestProjection,\n events: readonly AgentProjectionEvent[],\n): AgentRequestProjection {\n return events.reduce(projectAgentEvent, initial);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../projection/request.ts"],"sourcesContent":["export type AgentProjectionStatus =\n | \"pending\"\n | \"streaming\"\n | \"awaiting-tools\"\n | \"complete\"\n | \"error\"\n | \"cancelled\";\n\nexport interface AgentProjectionOperation {\n operationId: string;\n operation: string;\n parentOperationId: string | null;\n status: \"active\" | \"success\" | \"failed\" | \"cancelled\";\n metadata: Record<string, unknown> | null;\n result: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionTool {\n callId: string;\n toolName: string;\n status:\n | \"started\"\n | \"progress\"\n | \"step\"\n | \"preview\"\n | \"completed\"\n | \"error\"\n | \"delegated\";\n message: string | null;\n data: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionRenderBlock {\n blockId: string;\n blockIndex: number;\n type: string;\n status: \"streaming\" | \"complete\" | \"error\";\n content: string | null;\n data: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n}\n\nexport interface AgentRequestProjection {\n requestId: string;\n conversationId: string | null;\n status: AgentProjectionStatus;\n answer: string;\n reasoning: string;\n reasoningActive: boolean;\n phase: string | null;\n phaseHistory: string[];\n operations: Record<string, AgentProjectionOperation>;\n tools: Record<string, AgentProjectionTool>;\n renderBlocks: Record<string, AgentProjectionRenderBlock>;\n renderBlockOrder: string[];\n completion: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n lastTransportSeq: number;\n transportStreamId: string | null;\n eventCount: number;\n}\n\nexport interface AgentProjectionEvent {\n event: string;\n data?: unknown;\n stream_seq?: number;\n stream_id?: string;\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nconst asString = (value: unknown): string | null =>\n typeof value === \"string\" ? value : null;\n\nconst asNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nexport function createAgentRequestProjection(input: {\n requestId: string;\n conversationId?: string | null;\n}): AgentRequestProjection {\n return {\n requestId: input.requestId,\n conversationId: input.conversationId ?? null,\n status: \"pending\",\n answer: \"\",\n reasoning: \"\",\n reasoningActive: false,\n phase: null,\n phaseHistory: [],\n operations: {},\n tools: {},\n renderBlocks: {},\n renderBlockOrder: [],\n completion: null,\n error: null,\n lastTransportSeq: 0,\n transportStreamId: null,\n eventCount: 0,\n };\n}\n\nfunction toolStatus(event: string): AgentProjectionTool[\"status\"] {\n switch (event) {\n case \"tool_started\":\n return \"started\";\n case \"tool_step\":\n return \"step\";\n case \"tool_result_preview\":\n return \"preview\";\n case \"tool_completed\":\n return \"completed\";\n case \"tool_error\":\n return \"error\";\n case \"tool_delegated\":\n return \"delegated\";\n default:\n return \"progress\";\n }\n}\n\nexport function projectAgentEvent(\n current: AgentRequestProjection,\n event: AgentProjectionEvent,\n): AgentRequestProjection {\n const streamSeq = asNumber(event.stream_seq);\n const streamId = asString(event.stream_id);\n const sameSegment = streamId === null || streamId === current.transportStreamId;\n if (\n sameSegment &&\n streamSeq !== null &&\n streamSeq <= current.lastTransportSeq\n ) {\n return current;\n }\n\n const data = asRecord(event.data);\n const next: AgentRequestProjection = {\n ...current,\n status: current.status === \"pending\" ? \"streaming\" : current.status,\n lastTransportSeq:\n streamSeq === null\n ? current.lastTransportSeq\n : sameSegment\n ? Math.max(current.lastTransportSeq, streamSeq)\n : streamSeq,\n transportStreamId: streamId ?? current.transportStreamId,\n eventCount: current.eventCount + 1,\n };\n\n switch (event.event) {\n case \"chunk\": {\n const text = asString(data.text);\n return text === null ? next : { ...next, answer: current.answer + text };\n }\n case \"reasoning_chunk\": {\n const text = asString(data.text);\n return text === null\n ? next\n : {\n ...next,\n reasoning: current.reasoning + text,\n reasoningActive: true,\n };\n }\n case \"reasoning\":\n return {\n ...next,\n reasoningActive: data.state === \"started\",\n };\n case \"phase\": {\n const phase = asString(data.phase);\n if (phase === null) return next;\n return {\n ...next,\n phase,\n phaseHistory: [...current.phaseHistory, phase],\n };\n }\n case \"init\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n if (operationId === null || operation === null) return next;\n return {\n ...next,\n operations: {\n ...current.operations,\n [operationId]: {\n operationId,\n operation,\n parentOperationId: asString(data.parent_operation_id),\n status: \"active\",\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n result: null,\n },\n },\n };\n }\n case \"completion\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n const rawStatus = asString(data.status);\n const status: AgentProjectionOperation[\"status\"] =\n rawStatus === \"failed\" || rawStatus === \"cancelled\"\n ? rawStatus\n : \"success\";\n const result = asRecord(data.result);\n const operations = operationId\n ? {\n ...current.operations,\n [operationId]: {\n ...(current.operations[operationId] ?? {\n operationId,\n operation: operation ?? \"unknown\",\n parentOperationId: null,\n metadata: null,\n }),\n status,\n result,\n },\n }\n : current.operations;\n if (operation === \"user_request\") {\n return {\n ...next,\n operations,\n completion: data,\n status:\n status === \"success\"\n ? \"complete\"\n : status === \"cancelled\"\n ? \"cancelled\"\n : \"error\",\n };\n }\n return { ...next, operations };\n }\n case \"tool_event\": {\n const callId = asString(data.call_id);\n const toolName = asString(data.tool_name);\n const lifecycle = asString(data.event);\n if (callId === null || toolName === null || lifecycle === null) return next;\n const status = toolStatus(lifecycle);\n return {\n ...next,\n status:\n status === \"delegated\"\n ? \"awaiting-tools\"\n : status === \"completed\" || status === \"error\"\n ? \"streaming\"\n : next.status,\n tools: {\n ...current.tools,\n [callId]: {\n callId,\n toolName,\n status,\n message: asString(data.message),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n },\n },\n };\n }\n case \"render_block\": {\n const blockId = asString(data.blockId);\n const blockIndex = asNumber(data.blockIndex);\n const type = asString(data.type);\n if (blockId === null || blockIndex === null || type === null) return next;\n const alreadyKnown = Object.hasOwn(current.renderBlocks, blockId);\n return {\n ...next,\n renderBlocks: {\n ...current.renderBlocks,\n [blockId]: {\n blockId,\n blockIndex,\n type,\n status:\n data.status === \"complete\" || data.status === \"error\"\n ? data.status\n : \"streaming\",\n content: asString(data.content),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n },\n },\n renderBlockOrder: alreadyKnown\n ? current.renderBlockOrder\n : [...current.renderBlockOrder, blockId],\n };\n }\n case \"error\":\n return { ...next, status: \"error\", error: data };\n case \"end\":\n return {\n ...next,\n status:\n current.status === \"error\" || current.status === \"cancelled\"\n ? current.status\n : \"complete\",\n reasoningActive: false,\n };\n case \"data\": {\n const conversationId =\n data.type === \"conversation_id\" ? asString(data.conversation_id) : null;\n return conversationId === null ? next : { ...next, conversationId };\n }\n default:\n return next;\n }\n}\n\nexport function projectAgentEvents(\n initial: AgentRequestProjection,\n events: readonly AgentProjectionEvent[],\n): AgentRequestProjection {\n return events.reduce(projectAgentEvent, initial);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqEA,IAAM,WAAW,CAAC,UAChB,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC9D,QACD,CAAC;AAEP,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,WAAW,QAAQ;AAEtC,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AAEzD,SAAS,6BAA6B,OAGlB;AACzB,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,gBAAgB,MAAM,kBAAkB;AAAA,IACxC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,cAAc,CAAC;AAAA,IACf,YAAY,CAAC;AAAA,IACb,OAAO,CAAC;AAAA,IACR,cAAc,CAAC;AAAA,IACf,kBAAkB,CAAC;AAAA,IACnB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACd;AACF;AAEA,SAAS,WAAW,OAA8C;AAChE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kBACd,SACA,OACwB;AACxB,QAAM,YAAY,SAAS,MAAM,UAAU;AAC3C,QAAM,WAAW,SAAS,MAAM,SAAS;AACzC,QAAM,cAAc,aAAa,QAAQ,aAAa,QAAQ;AAC9D,MACE,eACA,cAAc,QACd,aAAa,QAAQ,kBACrB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,SAAS,MAAM,IAAI;AAChC,QAAM,OAA+B;AAAA,IACnC,GAAG;AAAA,IACH,QAAQ,QAAQ,WAAW,YAAY,cAAc,QAAQ;AAAA,IAC7D,kBACE,cAAc,OACV,QAAQ,mBACR,cACE,KAAK,IAAI,QAAQ,kBAAkB,SAAS,IAC5C;AAAA,IACR,mBAAmB,YAAY,QAAQ;AAAA,IACvC,YAAY,QAAQ,aAAa;AAAA,EACnC;AAEA,UAAQ,MAAM,OAAO;AAAA,IACnB,KAAK,SAAS;AACZ,YAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,aAAO,SAAS,OAAO,OAAO,EAAE,GAAG,MAAM,QAAQ,QAAQ,SAAS,KAAK;AAAA,IACzE;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,aAAO,SAAS,OACZ,OACA;AAAA,QACE,GAAG;AAAA,QACH,WAAW,QAAQ,YAAY;AAAA,QAC/B,iBAAiB;AAAA,MACnB;AAAA,IACN;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,KAAK,UAAU;AAAA,MAClC;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,UAAI,UAAU,KAAM,QAAO;AAC3B,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,cAAc,CAAC,GAAG,QAAQ,cAAc,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,cAAc,SAAS,KAAK,YAAY;AAC9C,YAAM,YAAY,SAAS,KAAK,SAAS;AACzC,UAAI,gBAAgB,QAAQ,cAAc,KAAM,QAAO;AACvD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY;AAAA,UACV,GAAG,QAAQ;AAAA,UACX,CAAC,WAAW,GAAG;AAAA,YACb;AAAA,YACA;AAAA,YACA,mBAAmB,SAAS,KAAK,mBAAmB;AAAA,YACpD,QAAQ;AAAA,YACR,UAAU,OAAO,KAAK,SAAS,KAAK,QAAQ,CAAC,EAAE,SAC3C,SAAS,KAAK,QAAQ,IACtB;AAAA,YACJ,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,cAAc,SAAS,KAAK,YAAY;AAC9C,YAAM,YAAY,SAAS,KAAK,SAAS;AACzC,YAAM,YAAY,SAAS,KAAK,MAAM;AACtC,YAAM,SACJ,cAAc,YAAY,cAAc,cACpC,YACA;AACN,YAAM,SAAS,SAAS,KAAK,MAAM;AACnC,YAAM,aAAa,cACf;AAAA,QACE,GAAG,QAAQ;AAAA,QACX,CAAC,WAAW,GAAG;AAAA,UACb,GAAI,QAAQ,WAAW,WAAW,KAAK;AAAA,YACrC;AAAA,YACA,WAAW,aAAa;AAAA,YACxB,mBAAmB;AAAA,YACnB,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,IACA,QAAQ;AACZ,UAAI,cAAc,gBAAgB;AAChC,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,YAAY;AAAA,UACZ,QACE,WAAW,YACP,aACA,WAAW,cACT,cACA;AAAA,QACV;AAAA,MACF;AACA,aAAO,EAAE,GAAG,MAAM,WAAW;AAAA,IAC/B;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,SAAS,SAAS,KAAK,OAAO;AACpC,YAAM,WAAW,SAAS,KAAK,SAAS;AACxC,YAAM,YAAY,SAAS,KAAK,KAAK;AACrC,UAAI,WAAW,QAAQ,aAAa,QAAQ,cAAc,KAAM,QAAO;AACvE,YAAM,SAAS,WAAW,SAAS;AACnC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QACE,WAAW,cACP,mBACA,WAAW,eAAe,WAAW,UACnC,cACA,KAAK;AAAA,QACb,OAAO;AAAA,UACL,GAAG,QAAQ;AAAA,UACX,CAAC,MAAM,GAAG;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS,SAAS,KAAK,OAAO;AAAA,YAC9B,MAAM,OAAO,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,SAAS,SAAS,KAAK,IAAI,IAAI;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,UAAU,SAAS,KAAK,OAAO;AACrC,YAAM,aAAa,SAAS,KAAK,UAAU;AAC3C,YAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,UAAI,YAAY,QAAQ,eAAe,QAAQ,SAAS,KAAM,QAAO;AACrE,YAAM,eAAe,OAAO,OAAO,QAAQ,cAAc,OAAO;AAChE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc;AAAA,UACZ,GAAG,QAAQ;AAAA,UACX,CAAC,OAAO,GAAG;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA,QACE,KAAK,WAAW,cAAc,KAAK,WAAW,UAC1C,KAAK,SACL;AAAA,YACN,SAAS,SAAS,KAAK,OAAO;AAAA,YAC9B,MAAM,OAAO,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,SAAS,SAAS,KAAK,IAAI,IAAI;AAAA,YACtE,UAAU,OAAO,KAAK,SAAS,KAAK,QAAQ,CAAC,EAAE,SAC3C,SAAS,KAAK,QAAQ,IACtB;AAAA,UACN;AAAA,QACF;AAAA,QACA,kBAAkB,eACd,QAAQ,mBACR,CAAC,GAAG,QAAQ,kBAAkB,OAAO;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,QAAQ,SAAS,OAAO,KAAK;AAAA,IACjD,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QACE,QAAQ,WAAW,WAAW,QAAQ,WAAW,cAC7C,QAAQ,SACR;AAAA,QACN,iBAAiB;AAAA,MACnB;AAAA,IACF,KAAK,QAAQ;AACX,YAAM,iBACJ,KAAK,SAAS,oBAAoB,SAAS,KAAK,eAAe,IAAI;AACrE,aAAO,mBAAmB,OAAO,OAAO,EAAE,GAAG,MAAM,eAAe;AAAA,IACpE;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,mBACd,SACA,QACwB;AACxB,SAAO,OAAO,OAAO,mBAAmB,OAAO;AACjD;","names":[]}
|
|
@@ -39,12 +39,14 @@ interface AgentRequestProjection {
|
|
|
39
39
|
completion: Record<string, unknown> | null;
|
|
40
40
|
error: Record<string, unknown> | null;
|
|
41
41
|
lastTransportSeq: number;
|
|
42
|
+
transportStreamId: string | null;
|
|
42
43
|
eventCount: number;
|
|
43
44
|
}
|
|
44
45
|
interface AgentProjectionEvent {
|
|
45
46
|
event: string;
|
|
46
47
|
data?: unknown;
|
|
47
48
|
stream_seq?: number;
|
|
49
|
+
stream_id?: string;
|
|
48
50
|
}
|
|
49
51
|
declare function createAgentRequestProjection(input: {
|
|
50
52
|
requestId: string;
|
|
@@ -39,12 +39,14 @@ interface AgentRequestProjection {
|
|
|
39
39
|
completion: Record<string, unknown> | null;
|
|
40
40
|
error: Record<string, unknown> | null;
|
|
41
41
|
lastTransportSeq: number;
|
|
42
|
+
transportStreamId: string | null;
|
|
42
43
|
eventCount: number;
|
|
43
44
|
}
|
|
44
45
|
interface AgentProjectionEvent {
|
|
45
46
|
event: string;
|
|
46
47
|
data?: unknown;
|
|
47
48
|
stream_seq?: number;
|
|
49
|
+
stream_id?: string;
|
|
48
50
|
}
|
|
49
51
|
declare function createAgentRequestProjection(input: {
|
|
50
52
|
requestId: string;
|
|
@@ -19,6 +19,7 @@ function createAgentRequestProjection(input) {
|
|
|
19
19
|
completion: null,
|
|
20
20
|
error: null,
|
|
21
21
|
lastTransportSeq: 0,
|
|
22
|
+
transportStreamId: null,
|
|
22
23
|
eventCount: 0
|
|
23
24
|
};
|
|
24
25
|
}
|
|
@@ -42,12 +43,17 @@ function toolStatus(event) {
|
|
|
42
43
|
}
|
|
43
44
|
function projectAgentEvent(current, event) {
|
|
44
45
|
const streamSeq = asNumber(event.stream_seq);
|
|
45
|
-
|
|
46
|
+
const streamId = asString(event.stream_id);
|
|
47
|
+
const sameSegment = streamId === null || streamId === current.transportStreamId;
|
|
48
|
+
if (sameSegment && streamSeq !== null && streamSeq <= current.lastTransportSeq) {
|
|
49
|
+
return current;
|
|
50
|
+
}
|
|
46
51
|
const data = asRecord(event.data);
|
|
47
52
|
const next = {
|
|
48
53
|
...current,
|
|
49
54
|
status: current.status === "pending" ? "streaming" : current.status,
|
|
50
|
-
lastTransportSeq: streamSeq
|
|
55
|
+
lastTransportSeq: streamSeq === null ? current.lastTransportSeq : sameSegment ? Math.max(current.lastTransportSeq, streamSeq) : streamSeq,
|
|
56
|
+
transportStreamId: streamId ?? current.transportStreamId,
|
|
51
57
|
eventCount: current.eventCount + 1
|
|
52
58
|
};
|
|
53
59
|
switch (event.event) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../projection/request.ts"],"sourcesContent":["export type AgentProjectionStatus =\n | \"pending\"\n | \"streaming\"\n | \"awaiting-tools\"\n | \"complete\"\n | \"error\"\n | \"cancelled\";\n\nexport interface AgentProjectionOperation {\n operationId: string;\n operation: string;\n parentOperationId: string | null;\n status: \"active\" | \"success\" | \"failed\" | \"cancelled\";\n metadata: Record<string, unknown> | null;\n result: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionTool {\n callId: string;\n toolName: string;\n status:\n | \"started\"\n | \"progress\"\n | \"step\"\n | \"preview\"\n | \"completed\"\n | \"error\"\n | \"delegated\";\n message: string | null;\n data: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionRenderBlock {\n blockId: string;\n blockIndex: number;\n type: string;\n status: \"streaming\" | \"complete\" | \"error\";\n content: string | null;\n data: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n}\n\nexport interface AgentRequestProjection {\n requestId: string;\n conversationId: string | null;\n status: AgentProjectionStatus;\n answer: string;\n reasoning: string;\n reasoningActive: boolean;\n phase: string | null;\n phaseHistory: string[];\n operations: Record<string, AgentProjectionOperation>;\n tools: Record<string, AgentProjectionTool>;\n renderBlocks: Record<string, AgentProjectionRenderBlock>;\n renderBlockOrder: string[];\n completion: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n lastTransportSeq: number;\n eventCount: number;\n}\n\nexport interface AgentProjectionEvent {\n event: string;\n data?: unknown;\n stream_seq?: number;\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nconst asString = (value: unknown): string | null =>\n typeof value === \"string\" ? value : null;\n\nconst asNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nexport function createAgentRequestProjection(input: {\n requestId: string;\n conversationId?: string | null;\n}): AgentRequestProjection {\n return {\n requestId: input.requestId,\n conversationId: input.conversationId ?? null,\n status: \"pending\",\n answer: \"\",\n reasoning: \"\",\n reasoningActive: false,\n phase: null,\n phaseHistory: [],\n operations: {},\n tools: {},\n renderBlocks: {},\n renderBlockOrder: [],\n completion: null,\n error: null,\n lastTransportSeq: 0,\n eventCount: 0,\n };\n}\n\nfunction toolStatus(event: string): AgentProjectionTool[\"status\"] {\n switch (event) {\n case \"tool_started\":\n return \"started\";\n case \"tool_step\":\n return \"step\";\n case \"tool_result_preview\":\n return \"preview\";\n case \"tool_completed\":\n return \"completed\";\n case \"tool_error\":\n return \"error\";\n case \"tool_delegated\":\n return \"delegated\";\n default:\n return \"progress\";\n }\n}\n\nexport function projectAgentEvent(\n current: AgentRequestProjection,\n event: AgentProjectionEvent,\n): AgentRequestProjection {\n const streamSeq = asNumber(event.stream_seq);\n if (streamSeq !== null && streamSeq <= current.lastTransportSeq) return current;\n\n const data = asRecord(event.data);\n const next: AgentRequestProjection = {\n ...current,\n status: current.status === \"pending\" ? \"streaming\" : current.status,\n lastTransportSeq: streamSeq ?? current.lastTransportSeq,\n eventCount: current.eventCount + 1,\n };\n\n switch (event.event) {\n case \"chunk\": {\n const text = asString(data.text);\n return text === null ? next : { ...next, answer: current.answer + text };\n }\n case \"reasoning_chunk\": {\n const text = asString(data.text);\n return text === null\n ? next\n : {\n ...next,\n reasoning: current.reasoning + text,\n reasoningActive: true,\n };\n }\n case \"reasoning\":\n return {\n ...next,\n reasoningActive: data.state === \"started\",\n };\n case \"phase\": {\n const phase = asString(data.phase);\n if (phase === null) return next;\n return {\n ...next,\n phase,\n phaseHistory: [...current.phaseHistory, phase],\n };\n }\n case \"init\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n if (operationId === null || operation === null) return next;\n return {\n ...next,\n operations: {\n ...current.operations,\n [operationId]: {\n operationId,\n operation,\n parentOperationId: asString(data.parent_operation_id),\n status: \"active\",\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n result: null,\n },\n },\n };\n }\n case \"completion\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n const rawStatus = asString(data.status);\n const status: AgentProjectionOperation[\"status\"] =\n rawStatus === \"failed\" || rawStatus === \"cancelled\"\n ? rawStatus\n : \"success\";\n const result = asRecord(data.result);\n const operations = operationId\n ? {\n ...current.operations,\n [operationId]: {\n ...(current.operations[operationId] ?? {\n operationId,\n operation: operation ?? \"unknown\",\n parentOperationId: null,\n metadata: null,\n }),\n status,\n result,\n },\n }\n : current.operations;\n if (operation === \"user_request\") {\n return {\n ...next,\n operations,\n completion: data,\n status:\n status === \"success\"\n ? \"complete\"\n : status === \"cancelled\"\n ? \"cancelled\"\n : \"error\",\n };\n }\n return { ...next, operations };\n }\n case \"tool_event\": {\n const callId = asString(data.call_id);\n const toolName = asString(data.tool_name);\n const lifecycle = asString(data.event);\n if (callId === null || toolName === null || lifecycle === null) return next;\n const status = toolStatus(lifecycle);\n return {\n ...next,\n status:\n status === \"delegated\"\n ? \"awaiting-tools\"\n : status === \"completed\" || status === \"error\"\n ? \"streaming\"\n : next.status,\n tools: {\n ...current.tools,\n [callId]: {\n callId,\n toolName,\n status,\n message: asString(data.message),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n },\n },\n };\n }\n case \"render_block\": {\n const blockId = asString(data.blockId);\n const blockIndex = asNumber(data.blockIndex);\n const type = asString(data.type);\n if (blockId === null || blockIndex === null || type === null) return next;\n const alreadyKnown = Object.hasOwn(current.renderBlocks, blockId);\n return {\n ...next,\n renderBlocks: {\n ...current.renderBlocks,\n [blockId]: {\n blockId,\n blockIndex,\n type,\n status:\n data.status === \"complete\" || data.status === \"error\"\n ? data.status\n : \"streaming\",\n content: asString(data.content),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n },\n },\n renderBlockOrder: alreadyKnown\n ? current.renderBlockOrder\n : [...current.renderBlockOrder, blockId],\n };\n }\n case \"error\":\n return { ...next, status: \"error\", error: data };\n case \"end\":\n return {\n ...next,\n status:\n current.status === \"error\" || current.status === \"cancelled\"\n ? current.status\n : \"complete\",\n reasoningActive: false,\n };\n case \"data\": {\n const conversationId =\n data.type === \"conversation_id\" ? asString(data.conversation_id) : null;\n return conversationId === null ? next : { ...next, conversationId };\n }\n default:\n return next;\n }\n}\n\nexport function projectAgentEvents(\n initial: AgentRequestProjection,\n events: readonly AgentProjectionEvent[],\n): AgentRequestProjection {\n return events.reduce(projectAgentEvent, initial);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../projection/request.ts"],"sourcesContent":["export type AgentProjectionStatus =\n | \"pending\"\n | \"streaming\"\n | \"awaiting-tools\"\n | \"complete\"\n | \"error\"\n | \"cancelled\";\n\nexport interface AgentProjectionOperation {\n operationId: string;\n operation: string;\n parentOperationId: string | null;\n status: \"active\" | \"success\" | \"failed\" | \"cancelled\";\n metadata: Record<string, unknown> | null;\n result: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionTool {\n callId: string;\n toolName: string;\n status:\n | \"started\"\n | \"progress\"\n | \"step\"\n | \"preview\"\n | \"completed\"\n | \"error\"\n | \"delegated\";\n message: string | null;\n data: Record<string, unknown> | null;\n}\n\nexport interface AgentProjectionRenderBlock {\n blockId: string;\n blockIndex: number;\n type: string;\n status: \"streaming\" | \"complete\" | \"error\";\n content: string | null;\n data: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n}\n\nexport interface AgentRequestProjection {\n requestId: string;\n conversationId: string | null;\n status: AgentProjectionStatus;\n answer: string;\n reasoning: string;\n reasoningActive: boolean;\n phase: string | null;\n phaseHistory: string[];\n operations: Record<string, AgentProjectionOperation>;\n tools: Record<string, AgentProjectionTool>;\n renderBlocks: Record<string, AgentProjectionRenderBlock>;\n renderBlockOrder: string[];\n completion: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n lastTransportSeq: number;\n transportStreamId: string | null;\n eventCount: number;\n}\n\nexport interface AgentProjectionEvent {\n event: string;\n data?: unknown;\n stream_seq?: number;\n stream_id?: string;\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nconst asString = (value: unknown): string | null =>\n typeof value === \"string\" ? value : null;\n\nconst asNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nexport function createAgentRequestProjection(input: {\n requestId: string;\n conversationId?: string | null;\n}): AgentRequestProjection {\n return {\n requestId: input.requestId,\n conversationId: input.conversationId ?? null,\n status: \"pending\",\n answer: \"\",\n reasoning: \"\",\n reasoningActive: false,\n phase: null,\n phaseHistory: [],\n operations: {},\n tools: {},\n renderBlocks: {},\n renderBlockOrder: [],\n completion: null,\n error: null,\n lastTransportSeq: 0,\n transportStreamId: null,\n eventCount: 0,\n };\n}\n\nfunction toolStatus(event: string): AgentProjectionTool[\"status\"] {\n switch (event) {\n case \"tool_started\":\n return \"started\";\n case \"tool_step\":\n return \"step\";\n case \"tool_result_preview\":\n return \"preview\";\n case \"tool_completed\":\n return \"completed\";\n case \"tool_error\":\n return \"error\";\n case \"tool_delegated\":\n return \"delegated\";\n default:\n return \"progress\";\n }\n}\n\nexport function projectAgentEvent(\n current: AgentRequestProjection,\n event: AgentProjectionEvent,\n): AgentRequestProjection {\n const streamSeq = asNumber(event.stream_seq);\n const streamId = asString(event.stream_id);\n const sameSegment = streamId === null || streamId === current.transportStreamId;\n if (\n sameSegment &&\n streamSeq !== null &&\n streamSeq <= current.lastTransportSeq\n ) {\n return current;\n }\n\n const data = asRecord(event.data);\n const next: AgentRequestProjection = {\n ...current,\n status: current.status === \"pending\" ? \"streaming\" : current.status,\n lastTransportSeq:\n streamSeq === null\n ? current.lastTransportSeq\n : sameSegment\n ? Math.max(current.lastTransportSeq, streamSeq)\n : streamSeq,\n transportStreamId: streamId ?? current.transportStreamId,\n eventCount: current.eventCount + 1,\n };\n\n switch (event.event) {\n case \"chunk\": {\n const text = asString(data.text);\n return text === null ? next : { ...next, answer: current.answer + text };\n }\n case \"reasoning_chunk\": {\n const text = asString(data.text);\n return text === null\n ? next\n : {\n ...next,\n reasoning: current.reasoning + text,\n reasoningActive: true,\n };\n }\n case \"reasoning\":\n return {\n ...next,\n reasoningActive: data.state === \"started\",\n };\n case \"phase\": {\n const phase = asString(data.phase);\n if (phase === null) return next;\n return {\n ...next,\n phase,\n phaseHistory: [...current.phaseHistory, phase],\n };\n }\n case \"init\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n if (operationId === null || operation === null) return next;\n return {\n ...next,\n operations: {\n ...current.operations,\n [operationId]: {\n operationId,\n operation,\n parentOperationId: asString(data.parent_operation_id),\n status: \"active\",\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n result: null,\n },\n },\n };\n }\n case \"completion\": {\n const operationId = asString(data.operation_id);\n const operation = asString(data.operation);\n const rawStatus = asString(data.status);\n const status: AgentProjectionOperation[\"status\"] =\n rawStatus === \"failed\" || rawStatus === \"cancelled\"\n ? rawStatus\n : \"success\";\n const result = asRecord(data.result);\n const operations = operationId\n ? {\n ...current.operations,\n [operationId]: {\n ...(current.operations[operationId] ?? {\n operationId,\n operation: operation ?? \"unknown\",\n parentOperationId: null,\n metadata: null,\n }),\n status,\n result,\n },\n }\n : current.operations;\n if (operation === \"user_request\") {\n return {\n ...next,\n operations,\n completion: data,\n status:\n status === \"success\"\n ? \"complete\"\n : status === \"cancelled\"\n ? \"cancelled\"\n : \"error\",\n };\n }\n return { ...next, operations };\n }\n case \"tool_event\": {\n const callId = asString(data.call_id);\n const toolName = asString(data.tool_name);\n const lifecycle = asString(data.event);\n if (callId === null || toolName === null || lifecycle === null) return next;\n const status = toolStatus(lifecycle);\n return {\n ...next,\n status:\n status === \"delegated\"\n ? \"awaiting-tools\"\n : status === \"completed\" || status === \"error\"\n ? \"streaming\"\n : next.status,\n tools: {\n ...current.tools,\n [callId]: {\n callId,\n toolName,\n status,\n message: asString(data.message),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n },\n },\n };\n }\n case \"render_block\": {\n const blockId = asString(data.blockId);\n const blockIndex = asNumber(data.blockIndex);\n const type = asString(data.type);\n if (blockId === null || blockIndex === null || type === null) return next;\n const alreadyKnown = Object.hasOwn(current.renderBlocks, blockId);\n return {\n ...next,\n renderBlocks: {\n ...current.renderBlocks,\n [blockId]: {\n blockId,\n blockIndex,\n type,\n status:\n data.status === \"complete\" || data.status === \"error\"\n ? data.status\n : \"streaming\",\n content: asString(data.content),\n data: Object.keys(asRecord(data.data)).length ? asRecord(data.data) : null,\n metadata: Object.keys(asRecord(data.metadata)).length\n ? asRecord(data.metadata)\n : null,\n },\n },\n renderBlockOrder: alreadyKnown\n ? current.renderBlockOrder\n : [...current.renderBlockOrder, blockId],\n };\n }\n case \"error\":\n return { ...next, status: \"error\", error: data };\n case \"end\":\n return {\n ...next,\n status:\n current.status === \"error\" || current.status === \"cancelled\"\n ? current.status\n : \"complete\",\n reasoningActive: false,\n };\n case \"data\": {\n const conversationId =\n data.type === \"conversation_id\" ? asString(data.conversation_id) : null;\n return conversationId === null ? next : { ...next, conversationId };\n }\n default:\n return next;\n }\n}\n\nexport function projectAgentEvents(\n initial: AgentRequestProjection,\n events: readonly AgentProjectionEvent[],\n): AgentRequestProjection {\n return events.reduce(projectAgentEvent, initial);\n}\n"],"mappings":"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","names":[]}
|
package/dist/react/index.cjs
CHANGED
|
@@ -50,6 +50,7 @@ function createAgentRequestProjection(input) {
|
|
|
50
50
|
completion: null,
|
|
51
51
|
error: null,
|
|
52
52
|
lastTransportSeq: 0,
|
|
53
|
+
transportStreamId: null,
|
|
53
54
|
eventCount: 0
|
|
54
55
|
};
|
|
55
56
|
}
|
|
@@ -73,12 +74,17 @@ function toolStatus(event) {
|
|
|
73
74
|
}
|
|
74
75
|
function projectAgentEvent(current, event) {
|
|
75
76
|
const streamSeq = asNumber(event.stream_seq);
|
|
76
|
-
|
|
77
|
+
const streamId = asString(event.stream_id);
|
|
78
|
+
const sameSegment = streamId === null || streamId === current.transportStreamId;
|
|
79
|
+
if (sameSegment && streamSeq !== null && streamSeq <= current.lastTransportSeq) {
|
|
80
|
+
return current;
|
|
81
|
+
}
|
|
77
82
|
const data = asRecord(event.data);
|
|
78
83
|
const next = {
|
|
79
84
|
...current,
|
|
80
85
|
status: current.status === "pending" ? "streaming" : current.status,
|
|
81
|
-
lastTransportSeq: streamSeq
|
|
86
|
+
lastTransportSeq: streamSeq === null ? current.lastTransportSeq : sameSegment ? Math.max(current.lastTransportSeq, streamSeq) : streamSeq,
|
|
87
|
+
transportStreamId: streamId ?? current.transportStreamId,
|
|
82
88
|
eventCount: current.eventCount + 1
|
|
83
89
|
};
|
|
84
90
|
switch (event.event) {
|
|
@@ -361,17 +367,33 @@ function normalizeMatrxStreamEnvelope(value) {
|
|
|
361
367
|
if (!isRecord2(value)) return null;
|
|
362
368
|
if (typeof value.event === "string") {
|
|
363
369
|
const streamSeq = typeof value.stream_seq === "number" && Number.isFinite(value.stream_seq) ? value.stream_seq : void 0;
|
|
370
|
+
const streamId = typeof value.stream_id === "string" ? value.stream_id : void 0;
|
|
364
371
|
return {
|
|
365
372
|
event: value.event,
|
|
366
373
|
data: value.data,
|
|
374
|
+
...streamId === void 0 ? {} : { stream_id: streamId },
|
|
367
375
|
...streamSeq === void 0 ? {} : { stream_seq: streamSeq }
|
|
368
376
|
};
|
|
369
377
|
}
|
|
370
378
|
if (value.e === "c" && typeof value.t === "string") {
|
|
371
|
-
|
|
379
|
+
const streamId = typeof value.stream_id === "string" ? value.stream_id : void 0;
|
|
380
|
+
const streamSeq = typeof value.stream_seq === "number" && Number.isFinite(value.stream_seq) ? value.stream_seq : void 0;
|
|
381
|
+
return {
|
|
382
|
+
event: "chunk",
|
|
383
|
+
data: { text: value.t },
|
|
384
|
+
...streamId === void 0 ? {} : { stream_id: streamId },
|
|
385
|
+
...streamSeq === void 0 ? {} : { stream_seq: streamSeq }
|
|
386
|
+
};
|
|
372
387
|
}
|
|
373
388
|
if (value.e === "r" && typeof value.t === "string") {
|
|
374
|
-
|
|
389
|
+
const streamId = typeof value.stream_id === "string" ? value.stream_id : void 0;
|
|
390
|
+
const streamSeq = typeof value.stream_seq === "number" && Number.isFinite(value.stream_seq) ? value.stream_seq : void 0;
|
|
391
|
+
return {
|
|
392
|
+
event: "reasoning_chunk",
|
|
393
|
+
data: { text: value.t },
|
|
394
|
+
...streamId === void 0 ? {} : { stream_id: streamId },
|
|
395
|
+
...streamSeq === void 0 ? {} : { stream_seq: streamSeq }
|
|
396
|
+
};
|
|
375
397
|
}
|
|
376
398
|
return null;
|
|
377
399
|
}
|