assistant-stream 0.2.10 → 0.2.12
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/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +2 -1
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.js +1 -3
- package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
- package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamResponse.js +18 -4
- package/dist/core/object/ObjectStreamResponse.js.map +1 -1
- package/package.json +1 -1
- package/src/core/modules/tool-call.ts +3 -1
- package/src/core/object/ObjectStreamAccumulator.ts +1 -3
- package/src/core/object/ObjectStreamResponse.ts +36 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../../src/core/modules/tool-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAoB,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAEhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,oBAAoB,CAAC;IAE/B,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACjE,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../../src/core/modules/tool-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAoB,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAEhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,oBAAoB,CAAC;IAE/B,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACjE,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAyEF,eAAO,MAAM,oBAAoB,GAC/B,UAAU,kBAAkB,CAAC,wBAAwB,CAAC,KACrD,eAYF,CAAC;AAEF,eAAO,MAAM,8BAA8B,4DAQ1C,CAAC"}
|
|
@@ -34,8 +34,9 @@ var ToolCallStreamControllerImpl = class {
|
|
|
34
34
|
return this._argsTextController;
|
|
35
35
|
}
|
|
36
36
|
_argsTextController;
|
|
37
|
-
setResponse(response) {
|
|
37
|
+
async setResponse(response) {
|
|
38
38
|
this._argsTextController.close();
|
|
39
|
+
await Promise.resolve();
|
|
39
40
|
this._controller.enqueue({
|
|
40
41
|
type: "result",
|
|
41
42
|
path: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/modules/tool-call.ts"],"sourcesContent":["import { AssistantStream } from \"../AssistantStream\";\nimport { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport { ToolResponseInit } from \"../tool/ToolResponse\";\nimport { ReadonlyJSONValue } from \"../../utils/json/json-value\";\nimport { UnderlyingReadable } from \"../utils/stream/UnderlyingReadable\";\nimport { createTextStream, TextStreamController } from \"./text\";\n\nexport type ToolCallStreamController = {\n argsText: TextStreamController;\n\n setResponse(response: ToolResponseInit<ReadonlyJSONValue>): void;\n close(): void;\n};\n\nclass ToolCallStreamControllerImpl implements ToolCallStreamController {\n private _isClosed = false;\n\n private _mergeTask: Promise<void>;\n constructor(\n private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,\n ) {\n const stream = createTextStream({\n start: (c) => {\n this._argsTextController = c;\n },\n });\n this._mergeTask = stream.pipeTo(\n new WritableStream({\n write: (chunk) => {\n switch (chunk.type) {\n case \"text-delta\":\n this._controller.enqueue(chunk);\n break;\n\n case \"part-finish\":\n this._controller.enqueue({\n type: \"tool-call-args-text-finish\",\n path: [],\n });\n break;\n\n default:\n throw new Error(`Unexpected chunk type: ${chunk.type}`);\n }\n },\n }),\n );\n }\n\n get argsText() {\n return this._argsTextController;\n }\n\n private _argsTextController!: TextStreamController;\n\n setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {\n this._argsTextController.close();\n this._controller.enqueue({\n type: \"result\",\n path: [],\n ...(response.artifact !== undefined\n ? { artifact: response.artifact }\n : {}),\n result: response.result,\n isError: response.isError ?? false,\n });\n }\n\n async close() {\n if (this._isClosed) return;\n\n this._isClosed = true;\n this._argsTextController.close();\n await this._mergeTask;\n\n this._controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n this._controller.close();\n }\n}\n\nexport const createToolCallStream = (\n readable: UnderlyingReadable<ToolCallStreamController>,\n): AssistantStream => {\n return new ReadableStream({\n start(c) {\n return readable.start?.(new ToolCallStreamControllerImpl(c));\n },\n pull(c) {\n return readable.pull?.(new ToolCallStreamControllerImpl(c));\n },\n cancel(c) {\n return readable.cancel?.(c);\n },\n });\n};\n\nexport const createToolCallStreamController = () => {\n let controller!: ToolCallStreamController;\n const stream = createToolCallStream({\n start(c) {\n controller = c;\n },\n });\n return [stream, controller] as const;\n};\n"],"mappings":";AAKA,SAAS,wBAA8C;AASvD,IAAM,+BAAN,MAAuE;AAAA,EAIrE,YACU,aACR;AADQ;AAER,UAAM,SAAS,iBAAiB;AAAA,MAC9B,OAAO,CAAC,MAAM;AACZ,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF,CAAC;AACD,SAAK,aAAa,OAAO;AAAA,MACvB,IAAI,eAAe;AAAA,QACjB,OAAO,CAAC,UAAU;AAChB,kBAAQ,MAAM,MAAM;AAAA,YAClB,KAAK;AACH,mBAAK,YAAY,QAAQ,KAAK;AAC9B;AAAA,YAEF,KAAK;AACH,mBAAK,YAAY,QAAQ;AAAA,gBACvB,MAAM;AAAA,gBACN,MAAM,CAAC;AAAA,cACT,CAAC;AACD;AAAA,YAEF;AACE,oBAAM,IAAI,MAAM,0BAA0B,MAAM,IAAI,EAAE;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAhCQ,YAAY;AAAA,EAEZ;AAAA,EAgCR,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ;AAAA,EAER,YAAY,UAA+C;
|
|
1
|
+
{"version":3,"sources":["../../../src/core/modules/tool-call.ts"],"sourcesContent":["import { AssistantStream } from \"../AssistantStream\";\nimport { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport { ToolResponseInit } from \"../tool/ToolResponse\";\nimport { ReadonlyJSONValue } from \"../../utils/json/json-value\";\nimport { UnderlyingReadable } from \"../utils/stream/UnderlyingReadable\";\nimport { createTextStream, TextStreamController } from \"./text\";\n\nexport type ToolCallStreamController = {\n argsText: TextStreamController;\n\n setResponse(response: ToolResponseInit<ReadonlyJSONValue>): void;\n close(): void;\n};\n\nclass ToolCallStreamControllerImpl implements ToolCallStreamController {\n private _isClosed = false;\n\n private _mergeTask: Promise<void>;\n constructor(\n private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,\n ) {\n const stream = createTextStream({\n start: (c) => {\n this._argsTextController = c;\n },\n });\n this._mergeTask = stream.pipeTo(\n new WritableStream({\n write: (chunk) => {\n switch (chunk.type) {\n case \"text-delta\":\n this._controller.enqueue(chunk);\n break;\n\n case \"part-finish\":\n this._controller.enqueue({\n type: \"tool-call-args-text-finish\",\n path: [],\n });\n break;\n\n default:\n throw new Error(`Unexpected chunk type: ${chunk.type}`);\n }\n },\n }),\n );\n }\n\n get argsText() {\n return this._argsTextController;\n }\n\n private _argsTextController!: TextStreamController;\n\n async setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {\n this._argsTextController.close();\n await Promise.resolve(); // flush microtask queue\n // TODO switch argsTextController to be something that doesn'#t require this\n this._controller.enqueue({\n type: \"result\",\n path: [],\n ...(response.artifact !== undefined\n ? { artifact: response.artifact }\n : {}),\n result: response.result,\n isError: response.isError ?? false,\n });\n }\n\n async close() {\n if (this._isClosed) return;\n\n this._isClosed = true;\n this._argsTextController.close();\n await this._mergeTask;\n\n this._controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n this._controller.close();\n }\n}\n\nexport const createToolCallStream = (\n readable: UnderlyingReadable<ToolCallStreamController>,\n): AssistantStream => {\n return new ReadableStream({\n start(c) {\n return readable.start?.(new ToolCallStreamControllerImpl(c));\n },\n pull(c) {\n return readable.pull?.(new ToolCallStreamControllerImpl(c));\n },\n cancel(c) {\n return readable.cancel?.(c);\n },\n });\n};\n\nexport const createToolCallStreamController = () => {\n let controller!: ToolCallStreamController;\n const stream = createToolCallStream({\n start(c) {\n controller = c;\n },\n });\n return [stream, controller] as const;\n};\n"],"mappings":";AAKA,SAAS,wBAA8C;AASvD,IAAM,+BAAN,MAAuE;AAAA,EAIrE,YACU,aACR;AADQ;AAER,UAAM,SAAS,iBAAiB;AAAA,MAC9B,OAAO,CAAC,MAAM;AACZ,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF,CAAC;AACD,SAAK,aAAa,OAAO;AAAA,MACvB,IAAI,eAAe;AAAA,QACjB,OAAO,CAAC,UAAU;AAChB,kBAAQ,MAAM,MAAM;AAAA,YAClB,KAAK;AACH,mBAAK,YAAY,QAAQ,KAAK;AAC9B;AAAA,YAEF,KAAK;AACH,mBAAK,YAAY,QAAQ;AAAA,gBACvB,MAAM;AAAA,gBACN,MAAM,CAAC;AAAA,cACT,CAAC;AACD;AAAA,YAEF;AACE,oBAAM,IAAI,MAAM,0BAA0B,MAAM,IAAI,EAAE;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAhCQ,YAAY;AAAA,EAEZ;AAAA,EAgCR,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ;AAAA,EAER,MAAM,YAAY,UAA+C;AAC/D,SAAK,oBAAoB,MAAM;AAC/B,UAAM,QAAQ,QAAQ;AAEtB,SAAK,YAAY,QAAQ;AAAA,MACvB,MAAM;AAAA,MACN,MAAM,CAAC;AAAA,MACP,GAAI,SAAS,aAAa,SACtB,EAAE,UAAU,SAAS,SAAS,IAC9B,CAAC;AAAA,MACL,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS,WAAW;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ;AACZ,QAAI,KAAK,UAAW;AAEpB,SAAK,YAAY;AACjB,SAAK,oBAAoB,MAAM;AAC/B,UAAM,KAAK;AAEX,SAAK,YAAY,QAAQ;AAAA,MACvB,MAAM;AAAA,MACN,MAAM,CAAC;AAAA,IACT,CAAC;AACD,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;AAEO,IAAM,uBAAuB,CAClC,aACoB;AACpB,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,GAAG;AACP,aAAO,SAAS,QAAQ,IAAI,6BAA6B,CAAC,CAAC;AAAA,IAC7D;AAAA,IACA,KAAK,GAAG;AACN,aAAO,SAAS,OAAO,IAAI,6BAA6B,CAAC,CAAC;AAAA,IAC5D;AAAA,IACA,OAAO,GAAG;AACR,aAAO,SAAS,SAAS,CAAC;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;AAEO,IAAM,iCAAiC,MAAM;AAClD,MAAI;AACJ,QAAM,SAAS,qBAAqB;AAAA,IAClC,MAAM,GAAG;AACP,mBAAa;AAAA,IACf;AAAA,EACF,CAAC;AACD,SAAO,CAAC,QAAQ,UAAU;AAC5B;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectStreamAccumulator.d.ts","sourceRoot":"","sources":["../../../src/core/object/ObjectStreamAccumulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAoB;gBAEtB,YAAY,GAAE,iBAAwB;IAIlD,IAAI,KAAK,sBAER;IAED,MAAM,CAAC,GAAG,EAAE,SAAS,qBAAqB,EAAE;IAO5C,OAAO,CAAC,MAAM,CAAC,KAAK;IAuBpB,OAAO,CAAC,MAAM,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"ObjectStreamAccumulator.d.ts","sourceRoot":"","sources":["../../../src/core/object/ObjectStreamAccumulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAoB;gBAEtB,YAAY,GAAE,iBAAwB;IAIlD,IAAI,KAAK,sBAER;IAED,MAAM,CAAC,GAAG,EAAE,SAAS,qBAAqB,EAAE;IAO5C,OAAO,CAAC,MAAM,CAAC,KAAK;IAuBpB,OAAO,CAAC,MAAM,CAAC,UAAU;CAiC1B"}
|
|
@@ -36,9 +36,7 @@ var ObjectStreamAccumulator = class _ObjectStreamAccumulator {
|
|
|
36
36
|
}
|
|
37
37
|
static updatePath(state, path, updater) {
|
|
38
38
|
if (path.length === 0) return updater(state);
|
|
39
|
-
|
|
40
|
-
state = {};
|
|
41
|
-
}
|
|
39
|
+
state ??= {};
|
|
42
40
|
if (typeof state !== "object") {
|
|
43
41
|
throw new Error(`Invalid path: [${path.join(", ")}]`);
|
|
44
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/object/ObjectStreamAccumulator.ts"],"sourcesContent":["import { ReadonlyJSONValue, ReadonlyJSONObject } from \"../../utils\";\nimport { ObjectStreamOperation } from \"./types\";\n\nexport class ObjectStreamAccumulator {\n private _state: ReadonlyJSONValue;\n\n constructor(initialValue: ReadonlyJSONValue = null) {\n this._state = initialValue;\n }\n\n get state() {\n return this._state;\n }\n\n append(ops: readonly ObjectStreamOperation[]) {\n this._state = ops.reduce(\n (state, op) => ObjectStreamAccumulator.apply(state, op),\n this._state,\n );\n }\n\n private static apply(state: ReadonlyJSONValue, op: ObjectStreamOperation) {\n const type = op.type;\n switch (type) {\n case \"set\":\n return ObjectStreamAccumulator.updatePath(\n state,\n op.path,\n () => op.value,\n );\n case \"append-text\":\n return ObjectStreamAccumulator.updatePath(state, op.path, (current) => {\n if (typeof current !== \"string\")\n throw new Error(`Expected string at path [${op.path.join(\", \")}]`);\n return current + op.value;\n });\n\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Invalid operation type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n private static updatePath(\n state: ReadonlyJSONValue | undefined,\n path: readonly string[],\n updater: (current: ReadonlyJSONValue | undefined) => ReadonlyJSONValue,\n ): ReadonlyJSONValue {\n if (path.length === 0) return updater(state);\n\n // Initialize state as empty object if it's null and we're trying to set a property\n
|
|
1
|
+
{"version":3,"sources":["../../../src/core/object/ObjectStreamAccumulator.ts"],"sourcesContent":["import { ReadonlyJSONValue, ReadonlyJSONObject } from \"../../utils\";\nimport { ObjectStreamOperation } from \"./types\";\n\nexport class ObjectStreamAccumulator {\n private _state: ReadonlyJSONValue;\n\n constructor(initialValue: ReadonlyJSONValue = null) {\n this._state = initialValue;\n }\n\n get state() {\n return this._state;\n }\n\n append(ops: readonly ObjectStreamOperation[]) {\n this._state = ops.reduce(\n (state, op) => ObjectStreamAccumulator.apply(state, op),\n this._state,\n );\n }\n\n private static apply(state: ReadonlyJSONValue, op: ObjectStreamOperation) {\n const type = op.type;\n switch (type) {\n case \"set\":\n return ObjectStreamAccumulator.updatePath(\n state,\n op.path,\n () => op.value,\n );\n case \"append-text\":\n return ObjectStreamAccumulator.updatePath(state, op.path, (current) => {\n if (typeof current !== \"string\")\n throw new Error(`Expected string at path [${op.path.join(\", \")}]`);\n return current + op.value;\n });\n\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Invalid operation type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n private static updatePath(\n state: ReadonlyJSONValue | undefined,\n path: readonly string[],\n updater: (current: ReadonlyJSONValue | undefined) => ReadonlyJSONValue,\n ): ReadonlyJSONValue {\n if (path.length === 0) return updater(state);\n\n // Initialize state as empty object if it's null and we're trying to set a property\n state ??= {};\n\n if (typeof state !== \"object\") {\n throw new Error(`Invalid path: [${path.join(\", \")}]`);\n }\n\n const [key, ...rest] = path as [string, ...(readonly string[])];\n if (Array.isArray(state)) {\n const idx = Number(key);\n if (isNaN(idx))\n throw new Error(`Expected array index at [${path.join(\", \")}]`);\n if (idx > state.length || idx < 0)\n throw new Error(`Insert array index out of bounds`);\n\n const nextState = [...state];\n nextState[idx] = this.updatePath(nextState[idx], rest, updater);\n\n return nextState;\n }\n\n const nextState = { ...(state as ReadonlyJSONObject) };\n nextState[key] = this.updatePath(nextState[key], rest, updater);\n\n return nextState;\n }\n}\n"],"mappings":";AAGO,IAAM,0BAAN,MAAM,yBAAwB;AAAA,EAC3B;AAAA,EAER,YAAY,eAAkC,MAAM;AAClD,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,KAAuC;AAC5C,SAAK,SAAS,IAAI;AAAA,MAChB,CAAC,OAAO,OAAO,yBAAwB,MAAM,OAAO,EAAE;AAAA,MACtD,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,OAAe,MAAM,OAA0B,IAA2B;AACxE,UAAM,OAAO,GAAG;AAChB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,yBAAwB;AAAA,UAC7B;AAAA,UACA,GAAG;AAAA,UACH,MAAM,GAAG;AAAA,QACX;AAAA,MACF,KAAK;AACH,eAAO,yBAAwB,WAAW,OAAO,GAAG,MAAM,CAAC,YAAY;AACrE,cAAI,OAAO,YAAY;AACrB,kBAAM,IAAI,MAAM,4BAA4B,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG;AACnE,iBAAO,UAAU,GAAG;AAAA,QACtB,CAAC;AAAA,MAEH,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,2BAA2B,gBAAgB,EAAE;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,WACb,OACA,MACA,SACmB;AACnB,QAAI,KAAK,WAAW,EAAG,QAAO,QAAQ,KAAK;AAG3C,cAAU,CAAC;AAEX,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,kBAAkB,KAAK,KAAK,IAAI,CAAC,GAAG;AAAA,IACtD;AAEA,UAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AACvB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,MAAM,OAAO,GAAG;AACtB,UAAI,MAAM,GAAG;AACX,cAAM,IAAI,MAAM,4BAA4B,KAAK,KAAK,IAAI,CAAC,GAAG;AAChE,UAAI,MAAM,MAAM,UAAU,MAAM;AAC9B,cAAM,IAAI,MAAM,kCAAkC;AAEpD,YAAMA,aAAY,CAAC,GAAG,KAAK;AAC3B,MAAAA,WAAU,GAAG,IAAI,KAAK,WAAWA,WAAU,GAAG,GAAG,MAAM,OAAO;AAE9D,aAAOA;AAAA,IACT;AAEA,UAAM,YAAY,EAAE,GAAI,MAA6B;AACrD,cAAU,GAAG,IAAI,KAAK,WAAW,UAAU,GAAG,GAAG,MAAM,OAAO;AAE9D,WAAO;AAAA,EACT;AACF;","names":["nextState"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectStreamResponse.d.ts","sourceRoot":"","sources":["../../../src/core/object/ObjectStreamResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAyB,MAAM,SAAS,CAAC;AAEnE,qBAAa,mBAAoB,SAAQ,uBAAuB,CAC9D,iBAAiB,EACjB,UAAU,CACX;;
|
|
1
|
+
{"version":3,"file":"ObjectStreamResponse.d.ts","sourceRoot":"","sources":["../../../src/core/object/ObjectStreamResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAyB,MAAM,SAAS,CAAC;AAEnE,qBAAa,mBAAoB,SAAQ,uBAAuB,CAC9D,iBAAiB,EACjB,UAAU,CACX;;CA6CA;AAED,qBAAa,mBAAoB,SAAQ,uBAAuB,CAC9D,UAAU,EACV,iBAAiB,CAClB;;CAsBA;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,IAAI,EAAE,cAAc,CAAC,iBAAiB,CAAC;CAUpD;AAED,eAAO,MAAM,wBAAwB,GACnC,UAAU,QAAQ,KACjB,cAAc,CAAC,iBAAiB,CAWlC,CAAC"}
|
|
@@ -6,11 +6,25 @@ var ObjectStreamEncoder = class extends PipeableTransformStream {
|
|
|
6
6
|
constructor() {
|
|
7
7
|
super(
|
|
8
8
|
(readable) => readable.pipeThrough(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
(() => {
|
|
10
|
+
class ObjectStreamTransformer {
|
|
11
|
+
#isFirstChunk = true;
|
|
12
|
+
start() {
|
|
13
|
+
}
|
|
14
|
+
transform(chunk, controller) {
|
|
15
|
+
if (this.#isFirstChunk && chunk.snapshot && Object.keys(chunk.snapshot).length > 0) {
|
|
16
|
+
controller.enqueue([
|
|
17
|
+
{ type: "set", path: [], value: chunk.snapshot },
|
|
18
|
+
...chunk.operations
|
|
19
|
+
]);
|
|
20
|
+
} else {
|
|
21
|
+
controller.enqueue(chunk.operations);
|
|
22
|
+
}
|
|
23
|
+
this.#isFirstChunk = false;
|
|
24
|
+
}
|
|
12
25
|
}
|
|
13
|
-
|
|
26
|
+
return new TransformStream(new ObjectStreamTransformer());
|
|
27
|
+
})()
|
|
14
28
|
).pipeThrough(new SSEEncoder())
|
|
15
29
|
);
|
|
16
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/object/ObjectStreamResponse.ts"],"sourcesContent":["import { PipeableTransformStream } from \"../utils/stream/PipeableTransformStream\";\nimport { ObjectStreamAccumulator } from \"./ObjectStreamAccumulator\";\nimport { SSEDecoder, SSEEncoder } from \"../utils/stream/SSE\";\nimport { ObjectStreamChunk, ObjectStreamOperation } from \"./types\";\n\nexport class ObjectStreamEncoder extends PipeableTransformStream<\n ObjectStreamChunk,\n Uint8Array\n> {\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(\n
|
|
1
|
+
{"version":3,"sources":["../../../src/core/object/ObjectStreamResponse.ts"],"sourcesContent":["import { PipeableTransformStream } from \"../utils/stream/PipeableTransformStream\";\nimport { ObjectStreamAccumulator } from \"./ObjectStreamAccumulator\";\nimport { SSEDecoder, SSEEncoder } from \"../utils/stream/SSE\";\nimport { ObjectStreamChunk, ObjectStreamOperation } from \"./types\";\n\nexport class ObjectStreamEncoder extends PipeableTransformStream<\n ObjectStreamChunk,\n Uint8Array\n> {\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(\n (() => {\n class ObjectStreamTransformer\n implements\n Transformer<ObjectStreamChunk, readonly ObjectStreamOperation[]>\n {\n #isFirstChunk = true;\n\n start() {\n // Nothing needed here since we initialize in the field declaration\n }\n\n transform(\n chunk: ObjectStreamChunk,\n controller: TransformStreamDefaultController<\n readonly ObjectStreamOperation[]\n >,\n ) {\n if (\n this.#isFirstChunk &&\n chunk.snapshot &&\n Object.keys(chunk.snapshot).length > 0\n ) {\n // For the first chunk, if there's an initial state that's not empty,\n // prepend a set operation for the initial state\n controller.enqueue([\n { type: \"set\", path: [], value: chunk.snapshot },\n ...chunk.operations,\n ]);\n } else {\n controller.enqueue(chunk.operations);\n }\n this.#isFirstChunk = false;\n }\n }\n return new TransformStream(new ObjectStreamTransformer());\n })(),\n )\n .pipeThrough(new SSEEncoder()),\n );\n }\n}\n\nexport class ObjectStreamDecoder extends PipeableTransformStream<\n Uint8Array,\n ObjectStreamChunk\n> {\n constructor() {\n const accumulator = new ObjectStreamAccumulator();\n super((readable) =>\n readable\n .pipeThrough(new SSEDecoder<readonly ObjectStreamOperation[]>())\n .pipeThrough(\n new TransformStream<\n readonly ObjectStreamOperation[],\n ObjectStreamChunk\n >({\n transform(operations, controller) {\n accumulator.append(operations);\n controller.enqueue({\n snapshot: accumulator.state,\n operations,\n });\n },\n }),\n ),\n );\n }\n}\n\nexport class ObjectStreamResponse extends Response {\n constructor(body: ReadableStream<ObjectStreamChunk>) {\n super(body.pipeThrough(new ObjectStreamEncoder()), {\n headers: new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Assistant-Stream-Format\": \"object-stream/v0\",\n }),\n });\n }\n}\n\nexport const fromObjectStreamResponse = (\n response: Response,\n): ReadableStream<ObjectStreamChunk> => {\n if (!response.ok)\n throw new Error(`Response failed, status ${response.status}`);\n if (!response.body) throw new Error(\"Response body is null\");\n if (response.headers.get(\"Content-Type\") !== \"text/event-stream\") {\n throw new Error(\"Response is not an event stream\");\n }\n if (response.headers.get(\"Assistant-Stream-Format\") !== \"object-stream/v0\") {\n throw new Error(\"Unsupported Assistant-Stream-Format header\");\n }\n return response.body.pipeThrough(new ObjectStreamDecoder());\n};\n"],"mappings":";AAAA,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AACxC,SAAS,YAAY,kBAAkB;AAGhC,IAAM,sBAAN,cAAkC,wBAGvC;AAAA,EACA,cAAc;AACZ;AAAA,MAAM,CAAC,aACL,SACG;AAAA,SACE,MAAM;AAAA,UACL,MAAM,wBAGN;AAAA,YACE,gBAAgB;AAAA,YAEhB,QAAQ;AAAA,YAER;AAAA,YAEA,UACE,OACA,YAGA;AACA,kBACE,KAAK,iBACL,MAAM,YACN,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS,GACrC;AAGA,2BAAW,QAAQ;AAAA,kBACjB,EAAE,MAAM,OAAO,MAAM,CAAC,GAAG,OAAO,MAAM,SAAS;AAAA,kBAC/C,GAAG,MAAM;AAAA,gBACX,CAAC;AAAA,cACH,OAAO;AACL,2BAAW,QAAQ,MAAM,UAAU;AAAA,cACrC;AACA,mBAAK,gBAAgB;AAAA,YACvB;AAAA,UACF;AACA,iBAAO,IAAI,gBAAgB,IAAI,wBAAwB,CAAC;AAAA,QAC1D,GAAG;AAAA,MACL,EACC,YAAY,IAAI,WAAW,CAAC;AAAA,IACjC;AAAA,EACF;AACF;AAEO,IAAM,sBAAN,cAAkC,wBAGvC;AAAA,EACA,cAAc;AACZ,UAAM,cAAc,IAAI,wBAAwB;AAChD;AAAA,MAAM,CAAC,aACL,SACG,YAAY,IAAI,WAA6C,CAAC,EAC9D;AAAA,QACC,IAAI,gBAGF;AAAA,UACA,UAAU,YAAY,YAAY;AAChC,wBAAY,OAAO,UAAU;AAC7B,uBAAW,QAAQ;AAAA,cACjB,UAAU,YAAY;AAAA,cACtB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF;AAEO,IAAM,uBAAN,cAAmC,SAAS;AAAA,EACjD,YAAY,MAAyC;AACnD,UAAM,KAAK,YAAY,IAAI,oBAAoB,CAAC,GAAG;AAAA,MACjD,SAAS,IAAI,QAAQ;AAAA,QACnB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,2BAA2B;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEO,IAAM,2BAA2B,CACtC,aACsC;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,EAAE;AAC9D,MAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAC3D,MAAI,SAAS,QAAQ,IAAI,cAAc,MAAM,qBAAqB;AAChE,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACA,MAAI,SAAS,QAAQ,IAAI,yBAAyB,MAAM,oBAAoB;AAC1E,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO,SAAS,KAAK,YAAY,IAAI,oBAAoB,CAAC;AAC5D;","names":[]}
|
package/package.json
CHANGED
|
@@ -53,8 +53,10 @@ class ToolCallStreamControllerImpl implements ToolCallStreamController {
|
|
|
53
53
|
|
|
54
54
|
private _argsTextController!: TextStreamController;
|
|
55
55
|
|
|
56
|
-
setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {
|
|
56
|
+
async setResponse(response: ToolResponseInit<ReadonlyJSONValue>) {
|
|
57
57
|
this._argsTextController.close();
|
|
58
|
+
await Promise.resolve(); // flush microtask queue
|
|
59
|
+
// TODO switch argsTextController to be something that doesn'#t require this
|
|
58
60
|
this._controller.enqueue({
|
|
59
61
|
type: "result",
|
|
60
62
|
path: [],
|
|
@@ -50,9 +50,7 @@ export class ObjectStreamAccumulator {
|
|
|
50
50
|
if (path.length === 0) return updater(state);
|
|
51
51
|
|
|
52
52
|
// Initialize state as empty object if it's null and we're trying to set a property
|
|
53
|
-
|
|
54
|
-
state = {};
|
|
55
|
-
}
|
|
53
|
+
state ??= {};
|
|
56
54
|
|
|
57
55
|
if (typeof state !== "object") {
|
|
58
56
|
throw new Error(`Invalid path: [${path.join(", ")}]`);
|
|
@@ -11,14 +11,42 @@ export class ObjectStreamEncoder extends PipeableTransformStream<
|
|
|
11
11
|
super((readable) =>
|
|
12
12
|
readable
|
|
13
13
|
.pipeThrough(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
(() => {
|
|
15
|
+
class ObjectStreamTransformer
|
|
16
|
+
implements
|
|
17
|
+
Transformer<ObjectStreamChunk, readonly ObjectStreamOperation[]>
|
|
18
|
+
{
|
|
19
|
+
#isFirstChunk = true;
|
|
20
|
+
|
|
21
|
+
start() {
|
|
22
|
+
// Nothing needed here since we initialize in the field declaration
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
transform(
|
|
26
|
+
chunk: ObjectStreamChunk,
|
|
27
|
+
controller: TransformStreamDefaultController<
|
|
28
|
+
readonly ObjectStreamOperation[]
|
|
29
|
+
>,
|
|
30
|
+
) {
|
|
31
|
+
if (
|
|
32
|
+
this.#isFirstChunk &&
|
|
33
|
+
chunk.snapshot &&
|
|
34
|
+
Object.keys(chunk.snapshot).length > 0
|
|
35
|
+
) {
|
|
36
|
+
// For the first chunk, if there's an initial state that's not empty,
|
|
37
|
+
// prepend a set operation for the initial state
|
|
38
|
+
controller.enqueue([
|
|
39
|
+
{ type: "set", path: [], value: chunk.snapshot },
|
|
40
|
+
...chunk.operations,
|
|
41
|
+
]);
|
|
42
|
+
} else {
|
|
43
|
+
controller.enqueue(chunk.operations);
|
|
44
|
+
}
|
|
45
|
+
this.#isFirstChunk = false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return new TransformStream(new ObjectStreamTransformer());
|
|
49
|
+
})(),
|
|
22
50
|
)
|
|
23
51
|
.pipeThrough(new SSEEncoder()),
|
|
24
52
|
);
|