@ai-matrx/agents 0.10.3 → 0.10.4

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.
@@ -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
- if (streamSeq !== null && streamSeq <= current.lastTransportSeq) return current;
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 ?? current.lastTransportSeq,
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
- if (streamSeq !== null && streamSeq <= current.lastTransportSeq) return current;
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 ?? current.lastTransportSeq,
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":";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":[]}
@@ -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
- if (streamSeq !== null && streamSeq <= current.lastTransportSeq) return current;
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 ?? current.lastTransportSeq,
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
- return { event: "chunk", data: { text: value.t } };
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
- return { event: "reasoning_chunk", data: { text: value.t } };
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
  }