assistant-stream 0.2.5 → 0.2.7

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.
Files changed (96) hide show
  1. package/dist/core/AssistantStreamChunk.d.ts +5 -1
  2. package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
  3. package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
  4. package/dist/core/accumulators/AssistantMessageStream.js +1 -0
  5. package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
  6. package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
  7. package/dist/core/accumulators/assistant-message-accumulator.js +19 -1
  8. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
  9. package/dist/core/index.d.ts +3 -0
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +9 -1
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/modules/tool-call.d.ts.map +1 -1
  14. package/dist/core/modules/tool-call.js +1 -1
  15. package/dist/core/modules/tool-call.js.map +1 -1
  16. package/dist/core/object/ObjectStream.test.d.ts +2 -0
  17. package/dist/core/object/ObjectStream.test.d.ts.map +1 -0
  18. package/dist/core/object/ObjectStreamAccumulator.d.ts +11 -0
  19. package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -0
  20. package/dist/core/object/ObjectStreamAccumulator.js +64 -0
  21. package/dist/core/object/ObjectStreamAccumulator.js.map +1 -0
  22. package/dist/core/object/ObjectStreamResponse.d.ts +13 -0
  23. package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -0
  24. package/dist/core/object/ObjectStreamResponse.js +66 -0
  25. package/dist/core/object/ObjectStreamResponse.js.map +1 -0
  26. package/dist/core/object/createObjectStream.d.ts +13 -0
  27. package/dist/core/object/createObjectStream.d.ts.map +1 -0
  28. package/dist/core/object/createObjectStream.js +63 -0
  29. package/dist/core/object/createObjectStream.js.map +1 -0
  30. package/dist/core/object/types.d.ts +15 -0
  31. package/dist/core/object/types.d.ts.map +1 -0
  32. package/dist/core/object/types.js +1 -0
  33. package/dist/core/object/types.js.map +1 -0
  34. package/dist/core/serialization/PlainText.d.ts.map +1 -1
  35. package/dist/core/serialization/PlainText.js.map +1 -1
  36. package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
  37. package/dist/core/serialization/data-stream/DataStream.js +14 -0
  38. package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
  39. package/dist/core/serialization/data-stream/chunk-types.d.ts +4 -1
  40. package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
  41. package/dist/core/serialization/data-stream/chunk-types.js +1 -0
  42. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
  43. package/dist/core/tool/ToolCallReader.d.ts +8 -7
  44. package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
  45. package/dist/core/tool/ToolCallReader.js +11 -4
  46. package/dist/core/tool/ToolCallReader.js.map +1 -1
  47. package/dist/core/tool/ToolExecutionStream.d.ts +3 -3
  48. package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
  49. package/dist/core/tool/ToolExecutionStream.js.map +1 -1
  50. package/dist/core/tool/ToolResponse.d.ts +2 -2
  51. package/dist/core/tool/ToolResponse.d.ts.map +1 -1
  52. package/dist/core/tool/ToolResponse.js +3 -1
  53. package/dist/core/tool/ToolResponse.js.map +1 -1
  54. package/dist/core/tool/tool-types.d.ts +4 -5
  55. package/dist/core/tool/tool-types.d.ts.map +1 -1
  56. package/dist/core/tool/toolResultStream.d.ts +2 -2
  57. package/dist/core/tool/toolResultStream.d.ts.map +1 -1
  58. package/dist/core/tool/toolResultStream.js +3 -2
  59. package/dist/core/tool/toolResultStream.js.map +1 -1
  60. package/dist/core/utils/stream/SSE.d.ts +10 -0
  61. package/dist/core/utils/stream/SSE.d.ts.map +1 -0
  62. package/dist/core/utils/stream/SSE.js +102 -0
  63. package/dist/core/utils/stream/SSE.js.map +1 -0
  64. package/dist/core/utils/types.d.ts +14 -3
  65. package/dist/core/utils/types.d.ts.map +1 -1
  66. package/dist/utils/index.d.ts +3 -0
  67. package/dist/utils/index.d.ts.map +1 -0
  68. package/dist/utils/index.js +8 -0
  69. package/dist/utils/index.js.map +1 -0
  70. package/dist/utils/json/index.d.ts +2 -0
  71. package/dist/utils/json/index.d.ts.map +1 -0
  72. package/dist/utils/json/index.js +1 -0
  73. package/dist/utils/json/index.js.map +1 -0
  74. package/package.json +7 -7
  75. package/src/core/AssistantStreamChunk.ts +6 -1
  76. package/src/core/accumulators/AssistantMessageStream.ts +1 -0
  77. package/src/core/accumulators/assistant-message-accumulator.ts +25 -1
  78. package/src/core/index.ts +7 -0
  79. package/src/core/modules/tool-call.ts +3 -1
  80. package/src/core/object/ObjectStream.test.ts +376 -0
  81. package/src/core/object/ObjectStreamAccumulator.ts +80 -0
  82. package/src/core/object/ObjectStreamResponse.ts +81 -0
  83. package/src/core/object/createObjectStream.ts +87 -0
  84. package/src/core/object/types.ts +18 -0
  85. package/src/core/serialization/PlainText.ts +2 -1
  86. package/src/core/serialization/data-stream/DataStream.ts +16 -0
  87. package/src/core/serialization/data-stream/chunk-types.ts +6 -0
  88. package/src/core/tool/ToolCallReader.ts +57 -36
  89. package/src/core/tool/ToolExecutionStream.ts +14 -5
  90. package/src/core/tool/ToolResponse.ts +7 -3
  91. package/src/core/tool/tool-types.ts +10 -5
  92. package/src/core/tool/toolResultStream.ts +19 -13
  93. package/src/core/utils/stream/SSE.ts +116 -0
  94. package/src/core/utils/types.ts +18 -3
  95. package/src/utils/index.ts +5 -0
  96. package/src/utils/json/index.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"toolResultStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/toolResultStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAuElD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,EACjD,WAAW,EAAE,WAAW,6BA6BzB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,EACjD,WAAW,EAAE,WAAW,uBAOzB"}
1
+ {"version":3,"file":"toolResultStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/toolResultStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA2ElD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,6BA+BzB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,uBAOzB"}
@@ -24,7 +24,8 @@ function getToolResponse(tools, abortSignal, toolCall) {
24
24
  toolCallId: toolCall.toolCallId,
25
25
  abortSignal
26
26
  });
27
- if (result instanceof ToolResponse) return result;
27
+ if (result instanceof ToolResponse)
28
+ return result;
28
29
  return new ToolResponse({
29
30
  result: result === void 0 ? "<no result>" : result
30
31
  });
@@ -48,7 +49,7 @@ async function unstable_runPendingTools(message, tools, abortSignal) {
48
49
  return {
49
50
  ...p,
50
51
  state: "result",
51
- artifact: result.artifact,
52
+ ...result.artifact !== void 0 ? { artifact: result.artifact } : {},
52
53
  result: result.result,
53
54
  isError: result.isError
54
55
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport { AssistantMessage } from \"../utils/types\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool<any, any>> | undefined,\n abortSignal: AbortSignal,\n toolCall: {\n toolCallId: string;\n toolName: string;\n args: unknown;\n },\n) {\n const tool = tools?.[toolCall.toolName];\n if (!tool || !tool.execute) return undefined;\n\n const getResult = async (toolExecute: ToolExecuteFunction<any, any>) => {\n let executeFn = toolExecute;\n\n if (isStandardSchemaV1(tool.parameters)) {\n let result = tool.parameters[\"~standard\"].validate(toolCall.args);\n if (result instanceof Promise) result = await result;\n\n if (result.issues) {\n executeFn =\n tool.experimental_onSchemaValidationError ??\n (() => {\n throw new Error(\n `Function parameter validation failed. ${JSON.stringify(result.issues)}`,\n );\n });\n }\n }\n\n const result = await executeFn(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n abortSignal,\n });\n if (result instanceof ToolResponse) return result;\n return new ToolResponse({\n result: result === undefined ? \"<no result>\" : result,\n });\n };\n\n return getResult(tool.execute);\n}\n\nfunction getToolStreamResponse<TArgs, TResult>(\n tools: Record<string, Tool<any, any>> | undefined,\n abortSignal: AbortSignal,\n reader: ToolCallReader<TArgs, TResult>,\n context: {\n toolCallId: string;\n toolName: string;\n },\n) {\n tools?.[context.toolName]?.streamCall?.(reader, {\n toolCallId: context.toolCallId,\n abortSignal,\n });\n}\n\nexport async function unstable_runPendingTools(\n message: AssistantMessage,\n tools: Record<string, Tool<any, any>> | undefined,\n abortSignal: AbortSignal,\n) {\n // TODO parallel tool calling\n for (const part of message.parts) {\n if (part.type === \"tool-call\") {\n const promiseOrUndefined = getToolResponse(tools, abortSignal, part);\n if (promiseOrUndefined) {\n const result = await promiseOrUndefined;\n const updatedParts = message.parts.map((p) => {\n if (p.type === \"tool-call\" && p.toolCallId === part.toolCallId) {\n return {\n ...p,\n state: \"result\" as const,\n artifact: result.artifact,\n result: result.result,\n isError: result.isError,\n };\n }\n return p;\n });\n message = {\n ...message,\n parts: updatedParts,\n content: updatedParts,\n };\n }\n }\n }\n return message;\n}\n\nexport function toolResultStream(\n tools: Record<string, Tool<any, any>> | undefined,\n abortSignal: AbortSignal,\n) {\n return new ToolExecutionStream({\n execute: (toolCall) => getToolResponse(tools, abortSignal, toolCall),\n streamCall: ({ reader, ...context }) =>\n getToolStreamResponse(tools, abortSignal, reader, context),\n });\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAGpC,IAAM,qBAAqB,CACzB,WACwC;AACxC,SACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACd,OAAqC,WAAW,EAAE,YAAY;AAEnE;AAEA,SAAS,gBACP,OACA,aACA,UAKA;AACA,QAAM,OAAO,QAAQ,SAAS,QAAQ;AACtC,MAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,QAAM,YAAY,OAAO,gBAA+C;AACtE,QAAI,YAAY;AAEhB,QAAI,mBAAmB,KAAK,UAAU,GAAG;AACvC,UAAIA,UAAS,KAAK,WAAW,WAAW,EAAE,SAAS,SAAS,IAAI;AAChE,UAAIA,mBAAkB,QAAS,CAAAA,UAAS,MAAMA;AAE9C,UAAIA,QAAO,QAAQ;AACjB,oBACE,KAAK,yCACJ,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,yCAAyC,KAAK,UAAUA,QAAO,MAAM,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAAA,MAC5C,YAAY,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,kBAAkB,aAAc,QAAO;AAC3C,WAAO,IAAI,aAAa;AAAA,MACtB,QAAQ,WAAW,SAAY,gBAAgB;AAAA,IACjD,CAAC;AAAA,EACH;AAEA,SAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,sBACP,OACA,aACA,QACA,SAIA;AACA,UAAQ,QAAQ,QAAQ,GAAG,aAAa,QAAQ;AAAA,IAC9C,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,yBACpB,SACA,OACA,aACA;AAEA,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,qBAAqB,gBAAgB,OAAO,aAAa,IAAI;AACnE,UAAI,oBAAoB;AACtB,cAAM,SAAS,MAAM;AACrB,cAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,MAAM;AAC5C,cAAI,EAAE,SAAS,eAAe,EAAE,eAAe,KAAK,YAAY;AAC9D,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU,OAAO;AAAA,cACjB,QAAQ,OAAO;AAAA,cACf,SAAS,OAAO;AAAA,YAClB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AACD,kBAAU;AAAA,UACR,GAAG;AAAA,UACH,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,OACA,aACA;AACA,SAAO,IAAI,oBAAoB;AAAA,IAC7B,SAAS,CAAC,aAAa,gBAAgB,OAAO,aAAa,QAAQ;AAAA,IACnE,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,MAChC,sBAAsB,OAAO,aAAa,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;","names":["result"]}
1
+ {"version":3,"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport { AssistantMessage } from \"../utils/types\";\nimport { ReadonlyJSONObject, ReadonlyJSONValue } from \"../../utils\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n toolCall: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n },\n) {\n const tool = tools?.[toolCall.toolName];\n if (!tool || !tool.execute) return undefined;\n\n const getResult = async (\n toolExecute: ToolExecuteFunction<ReadonlyJSONObject, unknown>,\n ): Promise<ToolResponse<ReadonlyJSONValue>> => {\n let executeFn = toolExecute;\n\n if (isStandardSchemaV1(tool.parameters)) {\n let result = tool.parameters[\"~standard\"].validate(toolCall.args);\n if (result instanceof Promise) result = await result;\n\n if (result.issues) {\n executeFn =\n tool.experimental_onSchemaValidationError ??\n (() => {\n throw new Error(\n `Function parameter validation failed. ${JSON.stringify(result.issues)}`,\n );\n });\n }\n }\n\n const result = (await executeFn(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n abortSignal,\n })) as unknown as ReadonlyJSONValue;\n if (result instanceof ToolResponse)\n return result as ToolResponse<ReadonlyJSONValue>;\n return new ToolResponse({\n result: result === undefined ? \"<no result>\" : result,\n });\n };\n\n return getResult(tool.execute);\n}\n\nfunction getToolStreamResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n reader: ToolCallReader<any, ReadonlyJSONValue>,\n context: {\n toolCallId: string;\n toolName: string;\n },\n) {\n tools?.[context.toolName]?.streamCall?.(reader, {\n toolCallId: context.toolCallId,\n abortSignal,\n });\n}\n\nexport async function unstable_runPendingTools(\n message: AssistantMessage,\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n) {\n // TODO parallel tool calling\n for (const part of message.parts) {\n if (part.type === \"tool-call\") {\n const promiseOrUndefined = getToolResponse(tools, abortSignal, part);\n if (promiseOrUndefined) {\n const result = await promiseOrUndefined;\n const updatedParts = message.parts.map((p) => {\n if (p.type === \"tool-call\" && p.toolCallId === part.toolCallId) {\n return {\n ...p,\n state: \"result\" as const,\n ...(result.artifact !== undefined\n ? { artifact: result.artifact }\n : {}),\n result: result.result as ReadonlyJSONValue,\n isError: result.isError,\n };\n }\n return p;\n });\n message = {\n ...message,\n parts: updatedParts,\n content: updatedParts,\n };\n }\n }\n }\n return message;\n}\n\nexport function toolResultStream(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n) {\n return new ToolExecutionStream({\n execute: (toolCall) => getToolResponse(tools, abortSignal, toolCall),\n streamCall: ({ reader, ...context }) =>\n getToolStreamResponse(tools, abortSignal, reader, context),\n });\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAIpC,IAAM,qBAAqB,CACzB,WACwC;AACxC,SACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACd,OAAqC,WAAW,EAAE,YAAY;AAEnE;AAEA,SAAS,gBACP,OACA,aACA,UAKA;AACA,QAAM,OAAO,QAAQ,SAAS,QAAQ;AACtC,MAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,QAAM,YAAY,OAChB,gBAC6C;AAC7C,QAAI,YAAY;AAEhB,QAAI,mBAAmB,KAAK,UAAU,GAAG;AACvC,UAAIA,UAAS,KAAK,WAAW,WAAW,EAAE,SAAS,SAAS,IAAI;AAChE,UAAIA,mBAAkB,QAAS,CAAAA,UAAS,MAAMA;AAE9C,UAAIA,QAAO,QAAQ;AACjB,oBACE,KAAK,yCACJ,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,yCAAyC,KAAK,UAAUA,QAAO,MAAM,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,UAAU,SAAS,MAAM;AAAA,MAC7C,YAAY,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,kBAAkB;AACpB,aAAO;AACT,WAAO,IAAI,aAAa;AAAA,MACtB,QAAQ,WAAW,SAAY,gBAAgB;AAAA,IACjD,CAAC;AAAA,EACH;AAEA,SAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,sBACP,OACA,aACA,QACA,SAIA;AACA,UAAQ,QAAQ,QAAQ,GAAG,aAAa,QAAQ;AAAA,IAC9C,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,yBACpB,SACA,OACA,aACA;AAEA,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,qBAAqB,gBAAgB,OAAO,aAAa,IAAI;AACnE,UAAI,oBAAoB;AACtB,cAAM,SAAS,MAAM;AACrB,cAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,MAAM;AAC5C,cAAI,EAAE,SAAS,eAAe,EAAE,eAAe,KAAK,YAAY;AAC9D,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,OAAO;AAAA,cACP,GAAI,OAAO,aAAa,SACpB,EAAE,UAAU,OAAO,SAAS,IAC5B,CAAC;AAAA,cACL,QAAQ,OAAO;AAAA,cACf,SAAS,OAAO;AAAA,YAClB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AACD,kBAAU;AAAA,UACR,GAAG;AAAA,UACH,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,OACA,aACA;AACA,SAAO,IAAI,oBAAoB;AAAA,IAC7B,SAAS,CAAC,aAAa,gBAAgB,OAAO,aAAa,QAAQ;AAAA,IACnE,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,MAChC,sBAAsB,OAAO,aAAa,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;","names":["result"]}
@@ -0,0 +1,10 @@
1
+ import { PipeableTransformStream } from "./PipeableTransformStream";
2
+ export declare class SSEEncoder<T> extends PipeableTransformStream<T, Uint8Array> {
3
+ static readonly headers: Headers;
4
+ headers: Headers;
5
+ constructor();
6
+ }
7
+ export declare class SSEDecoder<T> extends PipeableTransformStream<Uint8Array, T> {
8
+ constructor();
9
+ }
10
+ //# sourceMappingURL=SSE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSE.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/stream/SSE.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAC;IACvE,MAAM,CAAC,QAAQ,CAAC,OAAO,UAIpB;IAEH,OAAO,UAAsB;;CAe9B;AAoED,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,uBAAuB,CAAC,UAAU,EAAE,CAAC,CAAC;;CAsBxE"}
@@ -0,0 +1,102 @@
1
+ // src/core/utils/stream/SSE.ts
2
+ import { PipeableTransformStream } from "./PipeableTransformStream.js";
3
+ import { LineDecoderStream } from "./LineDecoderStream.js";
4
+ var SSEEncoder = class _SSEEncoder extends PipeableTransformStream {
5
+ static headers = new Headers({
6
+ "Content-Type": "text/event-stream",
7
+ "Cache-Control": "no-cache",
8
+ Connection: "keep-alive"
9
+ });
10
+ headers = _SSEEncoder.headers;
11
+ constructor() {
12
+ super(
13
+ (readable) => readable.pipeThrough(
14
+ new TransformStream({
15
+ transform(chunk, controller) {
16
+ controller.enqueue(`data: ${JSON.stringify(chunk)}
17
+
18
+ `);
19
+ }
20
+ })
21
+ ).pipeThrough(new TextEncoderStream())
22
+ );
23
+ }
24
+ };
25
+ var SSEEventStream = class extends TransformStream {
26
+ constructor() {
27
+ let eventBuffer = {};
28
+ let dataLines = [];
29
+ super({
30
+ start() {
31
+ eventBuffer = {};
32
+ dataLines = [];
33
+ },
34
+ transform(line, controller) {
35
+ if (line.startsWith(":")) return;
36
+ if (line === "") {
37
+ if (dataLines.length > 0) {
38
+ controller.enqueue({
39
+ event: eventBuffer.event || "message",
40
+ data: dataLines.join("\n"),
41
+ id: eventBuffer.id,
42
+ retry: eventBuffer.retry
43
+ });
44
+ }
45
+ eventBuffer = {};
46
+ dataLines = [];
47
+ return;
48
+ }
49
+ const [field, ...rest] = line.split(":");
50
+ const value = rest.join(":").trimStart();
51
+ switch (field) {
52
+ case "event":
53
+ eventBuffer.event = value;
54
+ break;
55
+ case "data":
56
+ dataLines.push(value);
57
+ break;
58
+ case "id":
59
+ eventBuffer.id = value;
60
+ break;
61
+ case "retry":
62
+ eventBuffer.retry = Number(value);
63
+ break;
64
+ }
65
+ },
66
+ flush(controller) {
67
+ if (dataLines.length > 0) {
68
+ controller.enqueue({
69
+ event: eventBuffer.event || "message",
70
+ data: dataLines.join("\n"),
71
+ id: eventBuffer.id,
72
+ retry: eventBuffer.retry
73
+ });
74
+ }
75
+ }
76
+ });
77
+ }
78
+ };
79
+ var SSEDecoder = class extends PipeableTransformStream {
80
+ constructor() {
81
+ super(
82
+ (readable) => readable.pipeThrough(new TextDecoderStream()).pipeThrough(new LineDecoderStream()).pipeThrough(new SSEEventStream()).pipeThrough(
83
+ new TransformStream({
84
+ transform(event, controller) {
85
+ switch (event.event) {
86
+ case "message":
87
+ controller.enqueue(JSON.parse(event.data));
88
+ break;
89
+ default:
90
+ throw new Error(`Unknown SSE event type: ${event.event}`);
91
+ }
92
+ }
93
+ })
94
+ )
95
+ );
96
+ }
97
+ };
98
+ export {
99
+ SSEDecoder,
100
+ SSEEncoder
101
+ };
102
+ //# sourceMappingURL=SSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/core/utils/stream/SSE.ts"],"sourcesContent":["import { PipeableTransformStream } from \"./PipeableTransformStream\";\nimport { LineDecoderStream } from \"./LineDecoderStream\";\n\nexport class SSEEncoder<T> extends PipeableTransformStream<T, Uint8Array> {\n static readonly headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n headers = SSEEncoder.headers;\n\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(\n new TransformStream<T, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n }),\n )\n .pipeThrough(new TextEncoderStream()),\n );\n }\n}\n\ntype SSEEvent = {\n event: string;\n data: string;\n id?: string | undefined;\n retry?: number | undefined;\n};\n\nclass SSEEventStream extends TransformStream<string, SSEEvent> {\n constructor() {\n let eventBuffer: Partial<SSEEvent> = {};\n let dataLines: string[] = [];\n\n super({\n start() {\n eventBuffer = {};\n dataLines = [];\n },\n transform(line, controller) {\n if (line.startsWith(\":\")) return; // Ignore comments\n\n if (line === \"\") {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n eventBuffer = {};\n dataLines = [];\n return;\n }\n\n const [field, ...rest] = line.split(\":\");\n const value = rest.join(\":\").trimStart();\n\n switch (field) {\n case \"event\":\n eventBuffer.event = value;\n break;\n case \"data\":\n dataLines.push(value);\n break;\n case \"id\":\n eventBuffer.id = value;\n break;\n case \"retry\":\n eventBuffer.retry = Number(value);\n break;\n }\n },\n flush(controller) {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n },\n });\n }\n}\n\nexport class SSEDecoder<T> extends PipeableTransformStream<Uint8Array, T> {\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new SSEEventStream())\n .pipeThrough(\n new TransformStream<SSEEvent, T>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n controller.enqueue(JSON.parse(event.data));\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n }),\n ),\n );\n }\n}\n"],"mappings":";AAAA,SAAS,+BAA+B;AACxC,SAAS,yBAAyB;AAE3B,IAAM,aAAN,MAAM,oBAAsB,wBAAuC;AAAA,EACxE,OAAgB,UAAU,IAAI,QAAQ;AAAA,IACpC,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd,CAAC;AAAA,EAED,UAAU,YAAW;AAAA,EAErB,cAAc;AACZ;AAAA,MAAM,CAAC,aACL,SACG;AAAA,QACC,IAAI,gBAA2B;AAAA,UAC7B,UAAU,OAAO,YAAY;AAC3B,uBAAW,QAAQ,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,UACzD;AAAA,QACF,CAAC;AAAA,MACH,EACC,YAAY,IAAI,kBAAkB,CAAC;AAAA,IACxC;AAAA,EACF;AACF;AASA,IAAM,iBAAN,cAA6B,gBAAkC;AAAA,EAC7D,cAAc;AACZ,QAAI,cAAiC,CAAC;AACtC,QAAI,YAAsB,CAAC;AAE3B,UAAM;AAAA,MACJ,QAAQ;AACN,sBAAc,CAAC;AACf,oBAAY,CAAC;AAAA,MACf;AAAA,MACA,UAAU,MAAM,YAAY;AAC1B,YAAI,KAAK,WAAW,GAAG,EAAG;AAE1B,YAAI,SAAS,IAAI;AACf,cAAI,UAAU,SAAS,GAAG;AACxB,uBAAW,QAAQ;AAAA,cACjB,OAAO,YAAY,SAAS;AAAA,cAC5B,MAAM,UAAU,KAAK,IAAI;AAAA,cACzB,IAAI,YAAY;AAAA,cAChB,OAAO,YAAY;AAAA,YACrB,CAAC;AAAA,UACH;AACA,wBAAc,CAAC;AACf,sBAAY,CAAC;AACb;AAAA,QACF;AAEA,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AACvC,cAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,UAAU;AAEvC,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,wBAAY,QAAQ;AACpB;AAAA,UACF,KAAK;AACH,sBAAU,KAAK,KAAK;AACpB;AAAA,UACF,KAAK;AACH,wBAAY,KAAK;AACjB;AAAA,UACF,KAAK;AACH,wBAAY,QAAQ,OAAO,KAAK;AAChC;AAAA,QACJ;AAAA,MACF;AAAA,MACA,MAAM,YAAY;AAChB,YAAI,UAAU,SAAS,GAAG;AACxB,qBAAW,QAAQ;AAAA,YACjB,OAAO,YAAY,SAAS;AAAA,YAC5B,MAAM,UAAU,KAAK,IAAI;AAAA,YACzB,IAAI,YAAY;AAAA,YAChB,OAAO,YAAY;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,IAAM,aAAN,cAA4B,wBAAuC;AAAA,EACxE,cAAc;AACZ;AAAA,MAAM,CAAC,aACL,SACG,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAI,eAAe,CAAC,EAChC;AAAA,QACC,IAAI,gBAA6B;AAAA,UAC/B,UAAU,OAAO,YAAY;AAC3B,oBAAQ,MAAM,OAAO;AAAA,cACnB,KAAK;AACH,2BAAW,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AACzC;AAAA,cACF;AACE,sBAAM,IAAI,MAAM,2BAA2B,MAAM,KAAK,EAAE;AAAA,YAC5D;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
@@ -31,18 +31,28 @@ type ToolCallStatus = {
31
31
  type: "incomplete";
32
32
  reason: "cancelled" | "length" | "content-filter" | "other";
33
33
  };
34
- export type ToolCallPart = {
34
+ type ToolCallPartBase = {
35
35
  type: "tool-call";
36
- state: "partial-call" | "call" | "result";
37
36
  status: ToolCallStatus;
38
37
  toolCallId: string;
39
38
  toolName: string;
40
39
  argsText: string;
41
40
  args: ReadonlyJSONObject;
42
- artifact?: unknown;
41
+ artifact?: ReadonlyJSONValue;
43
42
  result?: ReadonlyJSONValue;
44
43
  isError?: boolean;
45
44
  };
45
+ type ToolCallPartWithoutResult = ToolCallPartBase & {
46
+ state: "partial-call" | "call";
47
+ result?: undefined;
48
+ };
49
+ type ToolCallPartWithResult = ToolCallPartBase & {
50
+ state: "result";
51
+ result: ReadonlyJSONValue;
52
+ artifact?: ReadonlyJSONValue;
53
+ isError?: boolean;
54
+ };
55
+ export type ToolCallPart = ToolCallPartWithoutResult | ToolCallPartWithResult;
46
56
  export type SourcePart = {
47
57
  type: "source";
48
58
  sourceType: "url";
@@ -92,6 +102,7 @@ export type AssistantMessage = {
92
102
  */
93
103
  content: AssistantMessagePart[];
94
104
  metadata: {
105
+ unstable_state: ReadonlyJSONValue;
95
106
  unstable_data: ReadonlyJSONValue[];
96
107
  unstable_annotations: ReadonlyJSONValue[];
97
108
  steps: AssistantMessageStepMetadata[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/utils/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/utils/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { asAsyncIterableStream, type AsyncIterableStream, } from "./AsyncIterableStream";
2
+ export { type ReadonlyJSONObject, type ReadonlyJSONValue } from "./json";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,8 @@
1
+ // src/utils/index.ts
2
+ import {
3
+ asAsyncIterableStream
4
+ } from "./AsyncIterableStream.js";
5
+ export {
6
+ asAsyncIterableStream
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export {\n asAsyncIterableStream,\n type AsyncIterableStream,\n} from \"./AsyncIterableStream\";\nexport { type ReadonlyJSONObject, type ReadonlyJSONValue } from \"./json\";\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAEK;","names":[]}
@@ -0,0 +1,2 @@
1
+ export { type ReadonlyJSONObject, type ReadonlyJSONValue } from "./json-value";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/json/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "assistant-stream",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -30,13 +30,13 @@
30
30
  "sideEffects": false,
31
31
  "devDependencies": {
32
32
  "@standard-schema/spec": "^1.0.0",
33
- "ai": "^4.3.9",
34
- "@types/node": "^22.14.1",
33
+ "ai": "^4.3.15",
34
+ "@types/node": "^22.15.18",
35
35
  "eslint": "^9",
36
- "eslint-config-next": "15.3.1",
37
- "tsup": "8.4.0",
38
- "tsx": "^4.19.3",
39
- "vitest": "^3.1.2",
36
+ "eslint-config-next": "15.3.2",
37
+ "tsup": "8.5.0",
38
+ "tsx": "^4.19.4",
39
+ "vitest": "^3.1.3",
40
40
  "@assistant-ui/x-buildutils": "0.0.1"
41
41
  },
42
42
  "publishConfig": {
@@ -1,4 +1,5 @@
1
1
  import { ReadonlyJSONValue } from "../utils/json/json-value";
2
+ import { ObjectStreamOperation } from "./object/types";
2
3
 
3
4
  export type PartInit =
4
5
  | {
@@ -82,7 +83,7 @@ export type AssistantStreamChunk = { readonly path: readonly number[] } & (
82
83
  }
83
84
  | {
84
85
  readonly type: "result";
85
- readonly artifact?: ReadonlyJSONValue | undefined;
86
+ readonly artifact?: ReadonlyJSONValue;
86
87
  readonly result: ReadonlyJSONValue;
87
88
  readonly isError: boolean;
88
89
  }
@@ -90,4 +91,8 @@ export type AssistantStreamChunk = { readonly path: readonly number[] } & (
90
91
  readonly type: "error";
91
92
  readonly error: string;
92
93
  }
94
+ | {
95
+ readonly type: "update-state";
96
+ readonly operations: ObjectStreamOperation[];
97
+ }
93
98
  );
@@ -26,6 +26,7 @@ export class AssistantMessageStream {
26
26
  parts: [],
27
27
  content: [],
28
28
  metadata: {
29
+ unstable_state: null,
29
30
  unstable_data: [],
30
31
  unstable_annotations: [],
31
32
  steps: [],
@@ -11,6 +11,7 @@ import {
11
11
  ReasoningPart,
12
12
  FilePart,
13
13
  } from "../utils/types";
14
+ import { ObjectStreamAccumulator } from "../object/ObjectStreamAccumulator";
14
15
 
15
16
  const createInitialMessage = (): AssistantMessage => ({
16
17
  role: "assistant",
@@ -20,6 +21,7 @@ const createInitialMessage = (): AssistantMessage => ({
20
21
  return this.parts;
21
22
  },
22
23
  metadata: {
24
+ unstable_state: null,
23
25
  unstable_data: [],
24
26
  unstable_annotations: [],
25
27
  steps: [],
@@ -132,6 +134,9 @@ const handleToolCallArgsTextFinish = (
132
134
  if (part.type !== "tool-call") {
133
135
  throw new Error("Last is not a tool call");
134
136
  }
137
+ if (part.state !== "partial-call")
138
+ throw new Error("Last is not a partial call");
139
+
135
140
  return {
136
141
  ...part,
137
142
  state: "call",
@@ -180,7 +185,7 @@ const handleResult = (
180
185
  return {
181
186
  ...part,
182
187
  state: "result",
183
- artifact: chunk.artifact,
188
+ ...(chunk.artifact !== undefined ? { artifact: chunk.artifact } : {}),
184
189
  result: chunk.result,
185
190
  isError: chunk.isError ?? false,
186
191
  status: { type: "complete", reason: "stop" },
@@ -316,6 +321,22 @@ const handleErrorChunk = (
316
321
  };
317
322
  };
318
323
 
324
+ const handleUpdateState = (
325
+ message: AssistantMessage,
326
+ chunk: AssistantStreamChunk & { type: "update-state" },
327
+ ): AssistantMessage => {
328
+ const acc = new ObjectStreamAccumulator(message.metadata.unstable_state);
329
+ acc.append(chunk.operations);
330
+
331
+ return {
332
+ ...message,
333
+ metadata: {
334
+ ...message.metadata,
335
+ unstable_state: acc.state,
336
+ },
337
+ };
338
+ };
339
+
319
340
  export class AssistantMessageAccumulator extends TransformStream<
320
341
  AssistantStreamChunk,
321
342
  AssistantMessage
@@ -366,6 +387,9 @@ export class AssistantMessageAccumulator extends TransformStream<
366
387
  case "error":
367
388
  message = handleErrorChunk(message, chunk);
368
389
  break;
390
+ case "update-state":
391
+ message = handleUpdateState(message, chunk);
392
+ break;
369
393
  default: {
370
394
  const unhandledType: never = type;
371
395
  throw new Error(`Unsupported chunk type: ${unhandledType}`);
package/src/core/index.ts CHANGED
@@ -15,3 +15,10 @@ export { AssistantMessageStream } from "./accumulators/AssistantMessageStream";
15
15
  export type { AssistantMessage } from "./utils/types";
16
16
 
17
17
  export * from "./tool";
18
+
19
+ export { createObjectStream } from "./object/createObjectStream";
20
+ export {
21
+ ObjectStreamResponse,
22
+ fromObjectStreamResponse,
23
+ } from "./object/ObjectStreamResponse";
24
+ export type { ObjectStreamChunk } from "./object/types";
@@ -57,7 +57,9 @@ class ToolCallStreamControllerImpl implements ToolCallStreamController {
57
57
  this._controller.enqueue({
58
58
  type: "result",
59
59
  path: [],
60
- artifact: response.artifact,
60
+ ...(response.artifact !== undefined
61
+ ? { artifact: response.artifact }
62
+ : {}),
61
63
  result: response.result,
62
64
  isError: response.isError ?? false,
63
65
  });