@assistant-ui/react 0.11.4 → 0.11.6

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 (106) hide show
  1. package/dist/client/AssistantClient.d.ts +2 -2
  2. package/dist/client/AssistantClient.d.ts.map +1 -1
  3. package/dist/client/AssistantClient.js +1 -2
  4. package/dist/client/AssistantClient.js.map +1 -1
  5. package/dist/client/ToolUIClient.d.ts +3 -2
  6. package/dist/client/ToolUIClient.d.ts.map +1 -1
  7. package/dist/client/ToolUIClient.js +1 -5
  8. package/dist/client/ToolUIClient.js.map +1 -1
  9. package/dist/client/types/ThreadList.d.ts +1 -1
  10. package/dist/client/types/ThreadList.d.ts.map +1 -1
  11. package/dist/context/providers/AttachmentProvider.js +3 -3
  12. package/dist/context/providers/AttachmentProvider.js.map +1 -1
  13. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  14. package/dist/context/providers/MessageProvider.js +2 -2
  15. package/dist/context/providers/MessageProvider.js.map +1 -1
  16. package/dist/context/providers/PartProvider.js +2 -2
  17. package/dist/context/providers/PartProvider.js.map +1 -1
  18. package/dist/context/providers/TextMessagePartProvider.d.ts.map +1 -1
  19. package/dist/context/providers/TextMessagePartProvider.js +6 -7
  20. package/dist/context/providers/TextMessagePartProvider.js.map +1 -1
  21. package/dist/context/providers/ThreadListItemProvider.d.ts.map +1 -1
  22. package/dist/context/providers/ThreadListItemProvider.js +5 -4
  23. package/dist/context/providers/ThreadListItemProvider.js.map +1 -1
  24. package/dist/context/react/AssistantApiContext.d.ts +3 -3
  25. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  26. package/dist/context/react/AssistantApiContext.js +4 -3
  27. package/dist/context/react/AssistantApiContext.js.map +1 -1
  28. package/dist/context/react/hooks/useAssistantEvent.d.ts +2 -2
  29. package/dist/context/react/hooks/useAssistantEvent.d.ts.map +1 -1
  30. package/dist/context/react/hooks/useAssistantEvent.js.map +1 -1
  31. package/dist/context/react/index.d.ts +1 -0
  32. package/dist/context/react/index.d.ts.map +1 -1
  33. package/dist/context/react/index.js +2 -0
  34. package/dist/context/react/index.js.map +1 -1
  35. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  36. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -5
  37. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  38. package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts +2 -4
  39. package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts.map +1 -1
  40. package/dist/legacy-runtime/client/AttachmentRuntimeClient.js +10 -10
  41. package/dist/legacy-runtime/client/AttachmentRuntimeClient.js.map +1 -1
  42. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +3 -2
  43. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts.map +1 -1
  44. package/dist/legacy-runtime/client/ComposerRuntimeClient.js +1 -5
  45. package/dist/legacy-runtime/client/ComposerRuntimeClient.js.map +1 -1
  46. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +6 -7
  47. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts.map +1 -1
  48. package/dist/legacy-runtime/client/EventManagerRuntimeClient.js +11 -3
  49. package/dist/legacy-runtime/client/EventManagerRuntimeClient.js.map +1 -1
  50. package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts +1 -1
  51. package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts.map +1 -1
  52. package/dist/legacy-runtime/client/MessagePartRuntimeClient.js +10 -10
  53. package/dist/legacy-runtime/client/MessagePartRuntimeClient.js.map +1 -1
  54. package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts +3 -3
  55. package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts.map +1 -1
  56. package/dist/legacy-runtime/client/MessageRuntimeClient.js +31 -31
  57. package/dist/legacy-runtime/client/MessageRuntimeClient.js.map +1 -1
  58. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts +2 -2
  59. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts.map +1 -1
  60. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.js +17 -17
  61. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.js.map +1 -1
  62. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts +3 -2
  63. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts.map +1 -1
  64. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js +2 -6
  65. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js.map +1 -1
  66. package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts +3 -2
  67. package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts.map +1 -1
  68. package/dist/legacy-runtime/client/ThreadRuntimeClient.js +1 -5
  69. package/dist/legacy-runtime/client/ThreadRuntimeClient.js.map +1 -1
  70. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
  71. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js +0 -1
  72. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js.map +1 -1
  73. package/dist/types/EventTypes.d.ts +15 -7
  74. package/dist/types/EventTypes.d.ts.map +1 -1
  75. package/dist/types/EventTypes.js.map +1 -1
  76. package/dist/types/index.d.ts +1 -1
  77. package/dist/types/index.d.ts.map +1 -1
  78. package/dist/utils/tap-store/tap-api.d.ts +9 -1
  79. package/dist/utils/tap-store/tap-api.d.ts.map +1 -1
  80. package/dist/utils/tap-store/tap-api.js +12 -2
  81. package/dist/utils/tap-store/tap-api.js.map +1 -1
  82. package/package.json +1 -1
  83. package/src/client/AssistantClient.ts +7 -13
  84. package/src/client/ToolUIClient.ts +1 -6
  85. package/src/client/types/ThreadList.ts +1 -1
  86. package/src/context/providers/AttachmentProvider.tsx +3 -3
  87. package/src/context/providers/MessageProvider.tsx +3 -8
  88. package/src/context/providers/PartProvider.tsx +2 -2
  89. package/src/context/providers/TextMessagePartProvider.tsx +5 -7
  90. package/src/context/providers/ThreadListItemProvider.tsx +9 -16
  91. package/src/context/react/AssistantApiContext.tsx +11 -5
  92. package/src/context/react/hooks/useAssistantEvent.ts +4 -3
  93. package/src/context/react/index.ts +2 -0
  94. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +1 -15
  95. package/src/legacy-runtime/client/AttachmentRuntimeClient.ts +10 -11
  96. package/src/legacy-runtime/client/ComposerRuntimeClient.ts +1 -6
  97. package/src/legacy-runtime/client/EventManagerRuntimeClient.ts +41 -18
  98. package/src/legacy-runtime/client/MessagePartRuntimeClient.ts +13 -14
  99. package/src/legacy-runtime/client/MessageRuntimeClient.ts +35 -36
  100. package/src/legacy-runtime/client/ThreadListItemRuntimeClient.ts +17 -18
  101. package/src/legacy-runtime/client/ThreadListRuntimeClient.ts +2 -7
  102. package/src/legacy-runtime/client/ThreadRuntimeClient.ts +1 -6
  103. package/src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx +0 -1
  104. package/src/types/EventTypes.ts +23 -12
  105. package/src/types/index.ts +3 -1
  106. package/src/utils/tap-store/tap-api.ts +19 -2
@@ -87,7 +87,7 @@ var ThreadClient = resource(
87
87
  messages: messages.state
88
88
  };
89
89
  }, [runtimeState, messages, composer.state]);
90
- const api = tapApi({
90
+ return tapApi({
91
91
  getState: () => state,
92
92
  composer: composer.api,
93
93
  append: runtime.append,
@@ -108,10 +108,6 @@ var ThreadClient = resource(
108
108
  },
109
109
  __internal_getRuntime: () => runtime
110
110
  });
111
- return {
112
- state,
113
- api
114
- };
115
111
  }
116
112
  );
117
113
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/legacy-runtime/client/ThreadRuntimeClient.ts"],"sourcesContent":["import { ThreadRuntimeEventType } from \"../runtime-cores/core/ThreadRuntimeCore\";\nimport { ThreadRuntime } from \"../runtime/ThreadRuntime\";\nimport {\n resource,\n tapInlineResource,\n tapMemo,\n tapEffect,\n RefObject,\n} from \"@assistant-ui/tap\";\nimport { ComposerClient } from \"./ComposerRuntimeClient\";\nimport { MessageClient } from \"./MessageRuntimeClient\";\nimport { tapSubscribable } from \"../util-hooks/tapSubscribable\";\nimport { tapApi } from \"../../utils/tap-store\";\nimport { tapLookupResources } from \"../../client/util-hooks/tapLookupResources\";\nimport { Unsubscribe } from \"../../types\";\nimport { tapEvents } from \"../../client/EventContext\";\nimport { ThreadClientState, ThreadClientApi } from \"../../client/types/Thread\";\n\nconst MessageClientById = resource(\n ({\n runtime,\n id,\n threadIdRef,\n }: {\n runtime: ThreadRuntime;\n id: string;\n threadIdRef: RefObject<string>;\n }) => {\n const messageRuntime = tapMemo(\n () => runtime.getMessageById(id),\n [runtime, id],\n );\n\n return tapInlineResource(\n MessageClient({ runtime: messageRuntime, threadIdRef }),\n );\n },\n);\n\nexport const ThreadClient = resource(\n ({ runtime }: { runtime: ThreadRuntime }) => {\n const runtimeState = tapSubscribable(runtime);\n\n const events = tapEvents();\n\n // Bind thread events to event manager\n tapEffect(() => {\n const unsubscribers: Unsubscribe[] = [];\n\n // Subscribe to thread events\n const threadEvents: ThreadRuntimeEventType[] = [\n \"run-start\",\n \"run-end\",\n \"initialize\",\n \"model-context-update\",\n ];\n\n for (const event of threadEvents) {\n const unsubscribe = runtime.unstable_on(event, () => {\n const threadId = runtime.getState()?.threadId || \"unknown\";\n events.emit(`thread.${event}`, {\n threadId,\n });\n });\n unsubscribers.push(unsubscribe);\n }\n\n return () => {\n for (const unsub of unsubscribers) unsub();\n };\n }, [runtime]);\n\n const threadIdRef = tapMemo(\n () => ({\n get current() {\n return runtime.getState()!.threadId;\n },\n }),\n [runtime],\n );\n\n const composer = tapInlineResource(\n ComposerClient({\n runtime: runtime.composer,\n threadIdRef,\n }),\n );\n\n const messages = tapLookupResources(\n runtimeState.messages.map((m) =>\n MessageClientById(\n { runtime: runtime, id: m.id, threadIdRef },\n { key: m.id },\n ),\n ),\n );\n\n const state = tapMemo<ThreadClientState>(() => {\n return {\n isDisabled: runtimeState.isDisabled,\n isLoading: runtimeState.isLoading,\n isRunning: runtimeState.isRunning,\n capabilities: runtimeState.capabilities,\n state: runtimeState.state,\n suggestions: runtimeState.suggestions,\n extras: runtimeState.extras,\n speech: runtimeState.speech,\n\n composer: composer.state,\n messages: messages.state,\n };\n }, [runtimeState, messages, composer.state]);\n\n const api = tapApi<ThreadClientApi>({\n getState: () => state,\n\n composer: composer.api,\n\n append: runtime.append,\n startRun: runtime.startRun,\n unstable_resumeRun: runtime.unstable_resumeRun,\n cancelRun: runtime.cancelRun,\n getModelContext: runtime.getModelContext,\n export: runtime.export,\n import: runtime.import,\n reset: runtime.reset,\n stopSpeaking: runtime.stopSpeaking,\n\n message: (selector) => {\n if (\"id\" in selector) {\n return messages.api({ key: selector.id });\n } else {\n return messages.api(selector);\n }\n },\n\n __internal_getRuntime: () => runtime,\n });\n\n return {\n state,\n api,\n };\n },\n);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/legacy-runtime/client/ThreadRuntimeClient.ts"],"sourcesContent":["import { ThreadRuntimeEventType } from \"../runtime-cores/core/ThreadRuntimeCore\";\nimport { ThreadRuntime } from \"../runtime/ThreadRuntime\";\nimport {\n resource,\n tapInlineResource,\n tapMemo,\n tapEffect,\n RefObject,\n} from \"@assistant-ui/tap\";\nimport { ComposerClient } from \"./ComposerRuntimeClient\";\nimport { MessageClient } from \"./MessageRuntimeClient\";\nimport { tapSubscribable } from \"../util-hooks/tapSubscribable\";\nimport { tapApi } from \"../../utils/tap-store\";\nimport { tapLookupResources } from \"../../client/util-hooks/tapLookupResources\";\nimport { Unsubscribe } from \"../../types\";\nimport { tapEvents } from \"../../client/EventContext\";\nimport { ThreadClientState, ThreadClientApi } from \"../../client/types/Thread\";\n\nconst MessageClientById = resource(\n ({\n runtime,\n id,\n threadIdRef,\n }: {\n runtime: ThreadRuntime;\n id: string;\n threadIdRef: RefObject<string>;\n }) => {\n const messageRuntime = tapMemo(\n () => runtime.getMessageById(id),\n [runtime, id],\n );\n\n return tapInlineResource(\n MessageClient({ runtime: messageRuntime, threadIdRef }),\n );\n },\n);\n\nexport const ThreadClient = resource(\n ({ runtime }: { runtime: ThreadRuntime }) => {\n const runtimeState = tapSubscribable(runtime);\n\n const events = tapEvents();\n\n // Bind thread events to event manager\n tapEffect(() => {\n const unsubscribers: Unsubscribe[] = [];\n\n // Subscribe to thread events\n const threadEvents: ThreadRuntimeEventType[] = [\n \"run-start\",\n \"run-end\",\n \"initialize\",\n \"model-context-update\",\n ];\n\n for (const event of threadEvents) {\n const unsubscribe = runtime.unstable_on(event, () => {\n const threadId = runtime.getState()?.threadId || \"unknown\";\n events.emit(`thread.${event}`, {\n threadId,\n });\n });\n unsubscribers.push(unsubscribe);\n }\n\n return () => {\n for (const unsub of unsubscribers) unsub();\n };\n }, [runtime]);\n\n const threadIdRef = tapMemo(\n () => ({\n get current() {\n return runtime.getState()!.threadId;\n },\n }),\n [runtime],\n );\n\n const composer = tapInlineResource(\n ComposerClient({\n runtime: runtime.composer,\n threadIdRef,\n }),\n );\n\n const messages = tapLookupResources(\n runtimeState.messages.map((m) =>\n MessageClientById(\n { runtime: runtime, id: m.id, threadIdRef },\n { key: m.id },\n ),\n ),\n );\n\n const state = tapMemo<ThreadClientState>(() => {\n return {\n isDisabled: runtimeState.isDisabled,\n isLoading: runtimeState.isLoading,\n isRunning: runtimeState.isRunning,\n capabilities: runtimeState.capabilities,\n state: runtimeState.state,\n suggestions: runtimeState.suggestions,\n extras: runtimeState.extras,\n speech: runtimeState.speech,\n\n composer: composer.state,\n messages: messages.state,\n };\n }, [runtimeState, messages, composer.state]);\n\n return tapApi<ThreadClientApi>({\n getState: () => state,\n\n composer: composer.api,\n\n append: runtime.append,\n startRun: runtime.startRun,\n unstable_resumeRun: runtime.unstable_resumeRun,\n cancelRun: runtime.cancelRun,\n getModelContext: runtime.getModelContext,\n export: runtime.export,\n import: runtime.import,\n reset: runtime.reset,\n stopSpeaking: runtime.stopSpeaking,\n\n message: (selector) => {\n if (\"id\" in selector) {\n return messages.api({ key: selector.id });\n } else {\n return messages.api(selector);\n }\n },\n\n __internal_getRuntime: () => runtime,\n });\n },\n);\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"BaseComposerRuntimeCore.d.ts","sourceRoot":"","sources":["../../../../src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAK1E,8BAAsB,uBACpB,SAAQ,gBACR,YAAW,mBAAmB;IAE9B,SAAgB,SAAS,QAAQ;IAEjC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,iBAAiB,GAAG,SAAS;IAExE,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,OAAO,CAAC,YAAY,CAA6B;IACjD,IAAW,WAAW,0BAErB;IAED,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE;IAKrD,aAAoB,SAAS,IAAI,OAAO,CAAC;IAEzC,IAAW,OAAO,YAEjB;IAED,OAAO,CAAC,KAAK,CAAM;IAEnB,IAAI,IAAI,WAEP;IAED,OAAO,CAAC,KAAK,CAAuB;IAEpC,IAAI,IAAI,oCAEP;IAED,OAAO,CAAC,UAAU,CAAiB;IAEnC,IAAI,SAAS,cAEZ;IAEM,OAAO,CAAC,KAAK,EAAE,MAAM;IAOrB,OAAO,CAAC,IAAI,EAAE,WAAW;IAOzB,YAAY,CAAC,SAAS,EAAE,SAAS;IAOxC,OAAO,CAAC,wBAAwB;YAMlB,mBAAmB;IAOpB,KAAK;IAkBL,gBAAgB;IAOhB,IAAI;IA4BV,MAAM;IAIb,SAAS,CAAC,QAAQ,CAAC,UAAU,CAC3B,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,CAAC,GACpD,IAAI;IACP,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI;IAEjC,aAAa,CAAC,IAAI,EAAE,IAAI;IAmCxB,gBAAgB,CAAC,YAAY,EAAE,MAAM;IAkB3C,OAAO,CAAC,iBAAiB,CAGrB;IAEJ,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,wBAAwB;IAO1D,WAAW,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,IAAI;CAczE"}
1
+ {"version":3,"file":"BaseComposerRuntimeCore.d.ts","sourceRoot":"","sources":["../../../../src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAK1E,8BAAsB,uBACpB,SAAQ,gBACR,YAAW,mBAAmB;IAE9B,SAAgB,SAAS,QAAQ;IAEjC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,iBAAiB,GAAG,SAAS;IAExE,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,OAAO,CAAC,YAAY,CAA6B;IACjD,IAAW,WAAW,0BAErB;IAED,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE;IAKrD,aAAoB,SAAS,IAAI,OAAO,CAAC;IAEzC,IAAW,OAAO,YAEjB;IAED,OAAO,CAAC,KAAK,CAAM;IAEnB,IAAI,IAAI,WAEP;IAED,OAAO,CAAC,KAAK,CAAuB;IAEpC,IAAI,IAAI,oCAEP;IAED,OAAO,CAAC,UAAU,CAAiB;IAEnC,IAAI,SAAS,cAEZ;IAEM,OAAO,CAAC,KAAK,EAAE,MAAM;IAOrB,OAAO,CAAC,IAAI,EAAE,WAAW;IAOzB,YAAY,CAAC,SAAS,EAAE,SAAS;IAOxC,OAAO,CAAC,wBAAwB;YAMlB,mBAAmB;IAOpB,KAAK;IAkBL,gBAAgB;IAOhB,IAAI;IA4BV,MAAM;IAIb,SAAS,CAAC,QAAQ,CAAC,UAAU,CAC3B,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,CAAC,GACpD,IAAI;IACP,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI;IAEjC,aAAa,CAAC,IAAI,EAAE,IAAI;IAkCxB,gBAAgB,CAAC,YAAY,EAAE,MAAM;IAkB3C,OAAO,CAAC,iBAAiB,CAGrB;IAEJ,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,wBAAwB;IAO1D,WAAW,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,IAAI;CAczE"}
@@ -110,7 +110,6 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
110
110
  ];
111
111
  else {
112
112
  this._attachments = [...this._attachments, a];
113
- this._notifyEventSubscribers("attachment-add");
114
113
  }
115
114
  this._notifySubscribers();
116
115
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx"],"sourcesContent":["import {\n Attachment,\n CompleteAttachment,\n PendingAttachment,\n} from \"../../../types/AttachmentTypes\";\nimport { AppendMessage } from \"../../../types\";\nimport { AttachmentAdapter } from \"../adapters/attachment\";\nimport {\n ComposerRuntimeCore,\n ComposerRuntimeEventType,\n} from \"../core/ComposerRuntimeCore\";\nimport { MessageRole, RunConfig } from \"../../../types/AssistantTypes\";\nimport { BaseSubscribable } from \"../remote-thread-list/BaseSubscribable\";\n\nconst isAttachmentComplete = (a: Attachment): a is CompleteAttachment =>\n a.status.type === \"complete\";\n\nexport abstract class BaseComposerRuntimeCore\n extends BaseSubscribable\n implements ComposerRuntimeCore\n{\n public readonly isEditing = true;\n\n protected abstract getAttachmentAdapter(): AttachmentAdapter | undefined;\n\n public get attachmentAccept(): string {\n return this.getAttachmentAdapter()?.accept ?? \"*\";\n }\n\n private _attachments: readonly Attachment[] = [];\n public get attachments() {\n return this._attachments;\n }\n\n protected setAttachments(value: readonly Attachment[]) {\n this._attachments = value;\n this._notifySubscribers();\n }\n\n public abstract get canCancel(): boolean;\n\n public get isEmpty() {\n return !this.text.trim() && !this.attachments.length;\n }\n\n private _text = \"\";\n\n get text() {\n return this._text;\n }\n\n private _role: MessageRole = \"user\";\n\n get role() {\n return this._role;\n }\n\n private _runConfig: RunConfig = {};\n\n get runConfig() {\n return this._runConfig;\n }\n\n public setText(value: string) {\n if (this._text === value) return;\n\n this._text = value;\n this._notifySubscribers();\n }\n\n public setRole(role: MessageRole) {\n if (this._role === role) return;\n\n this._role = role;\n this._notifySubscribers();\n }\n\n public setRunConfig(runConfig: RunConfig) {\n if (this._runConfig === runConfig) return;\n\n this._runConfig = runConfig;\n this._notifySubscribers();\n }\n\n private _emptyTextAndAttachments() {\n this._attachments = [];\n this._text = \"\";\n this._notifySubscribers();\n }\n\n private async _onClearAttachments() {\n const adapter = this.getAttachmentAdapter();\n if (adapter) {\n await Promise.all(this._attachments.map((a) => adapter.remove(a)));\n }\n }\n\n public async reset() {\n if (\n this._attachments.length === 0 &&\n this._text === \"\" &&\n this._role === \"user\" &&\n Object.keys(this._runConfig).length === 0\n ) {\n return;\n }\n\n this._role = \"user\";\n this._runConfig = {};\n\n const task = this._onClearAttachments();\n this._emptyTextAndAttachments();\n await task;\n }\n\n public async clearAttachments() {\n const task = this._onClearAttachments();\n this.setAttachments([]);\n\n await task;\n }\n\n public async send() {\n const adapter = this.getAttachmentAdapter();\n const attachments =\n adapter && this.attachments.length > 0\n ? Promise.all(\n this.attachments.map(async (a) => {\n if (isAttachmentComplete(a)) return a;\n const result = await adapter.send(a);\n return result as CompleteAttachment;\n }),\n )\n : [];\n\n const text = this.text;\n this._emptyTextAndAttachments();\n const message: Omit<AppendMessage, \"parentId\" | \"sourceId\"> = {\n createdAt: new Date(),\n role: this.role,\n content: text ? [{ type: \"text\", text }] : [],\n attachments: await attachments,\n runConfig: this.runConfig,\n metadata: { custom: {} },\n };\n\n this.handleSend(message);\n this._notifyEventSubscribers(\"send\");\n }\n\n public cancel() {\n this.handleCancel();\n }\n\n protected abstract handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n ): void;\n protected abstract handleCancel(): void;\n\n async addAttachment(file: File) {\n const adapter = this.getAttachmentAdapter();\n if (!adapter) throw new Error(\"Attachments are not supported\");\n\n const upsertAttachment = (a: PendingAttachment) => {\n const idx = this._attachments.findIndex(\n (attachment) => attachment.id === a.id,\n );\n if (idx !== -1)\n this._attachments = [\n ...this._attachments.slice(0, idx),\n a,\n ...this._attachments.slice(idx + 1),\n ];\n else {\n this._attachments = [...this._attachments, a];\n this._notifyEventSubscribers(\"attachment-add\");\n }\n\n this._notifySubscribers();\n };\n\n const promiseOrGenerator = adapter.add({ file });\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n upsertAttachment(r);\n }\n } else {\n upsertAttachment(await promiseOrGenerator);\n }\n\n this._notifyEventSubscribers(\"attachment-add\");\n this._notifySubscribers();\n }\n\n async removeAttachment(attachmentId: string) {\n const adapter = this.getAttachmentAdapter();\n if (!adapter) throw new Error(\"Attachments are not supported\");\n\n const index = this._attachments.findIndex((a) => a.id === attachmentId);\n if (index === -1) throw new Error(\"Attachment not found\");\n const attachment = this._attachments[index]!;\n\n await adapter.remove(attachment);\n\n // this._attachments.toSpliced(index, 1); - not yet widely supported\n this._attachments = [\n ...this._attachments.slice(0, index),\n ...this._attachments.slice(index + 1),\n ];\n this._notifySubscribers();\n }\n\n private _eventSubscribers = new Map<\n ComposerRuntimeEventType,\n Set<() => void>\n >();\n\n protected _notifyEventSubscribers(event: ComposerRuntimeEventType) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback();\n }\n\n public unstable_on(event: ComposerRuntimeEventType, callback: () => void) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n this._eventSubscribers.set(event, new Set([callback]));\n } else {\n subscribers.add(callback);\n }\n\n return () => {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n subscribers.delete(callback);\n };\n }\n}\n"],"mappings":"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","names":["subscribers"]}
1
+ {"version":3,"sources":["../../../../src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx"],"sourcesContent":["import {\n Attachment,\n CompleteAttachment,\n PendingAttachment,\n} from \"../../../types/AttachmentTypes\";\nimport { AppendMessage } from \"../../../types\";\nimport { AttachmentAdapter } from \"../adapters/attachment\";\nimport {\n ComposerRuntimeCore,\n ComposerRuntimeEventType,\n} from \"../core/ComposerRuntimeCore\";\nimport { MessageRole, RunConfig } from \"../../../types/AssistantTypes\";\nimport { BaseSubscribable } from \"../remote-thread-list/BaseSubscribable\";\n\nconst isAttachmentComplete = (a: Attachment): a is CompleteAttachment =>\n a.status.type === \"complete\";\n\nexport abstract class BaseComposerRuntimeCore\n extends BaseSubscribable\n implements ComposerRuntimeCore\n{\n public readonly isEditing = true;\n\n protected abstract getAttachmentAdapter(): AttachmentAdapter | undefined;\n\n public get attachmentAccept(): string {\n return this.getAttachmentAdapter()?.accept ?? \"*\";\n }\n\n private _attachments: readonly Attachment[] = [];\n public get attachments() {\n return this._attachments;\n }\n\n protected setAttachments(value: readonly Attachment[]) {\n this._attachments = value;\n this._notifySubscribers();\n }\n\n public abstract get canCancel(): boolean;\n\n public get isEmpty() {\n return !this.text.trim() && !this.attachments.length;\n }\n\n private _text = \"\";\n\n get text() {\n return this._text;\n }\n\n private _role: MessageRole = \"user\";\n\n get role() {\n return this._role;\n }\n\n private _runConfig: RunConfig = {};\n\n get runConfig() {\n return this._runConfig;\n }\n\n public setText(value: string) {\n if (this._text === value) return;\n\n this._text = value;\n this._notifySubscribers();\n }\n\n public setRole(role: MessageRole) {\n if (this._role === role) return;\n\n this._role = role;\n this._notifySubscribers();\n }\n\n public setRunConfig(runConfig: RunConfig) {\n if (this._runConfig === runConfig) return;\n\n this._runConfig = runConfig;\n this._notifySubscribers();\n }\n\n private _emptyTextAndAttachments() {\n this._attachments = [];\n this._text = \"\";\n this._notifySubscribers();\n }\n\n private async _onClearAttachments() {\n const adapter = this.getAttachmentAdapter();\n if (adapter) {\n await Promise.all(this._attachments.map((a) => adapter.remove(a)));\n }\n }\n\n public async reset() {\n if (\n this._attachments.length === 0 &&\n this._text === \"\" &&\n this._role === \"user\" &&\n Object.keys(this._runConfig).length === 0\n ) {\n return;\n }\n\n this._role = \"user\";\n this._runConfig = {};\n\n const task = this._onClearAttachments();\n this._emptyTextAndAttachments();\n await task;\n }\n\n public async clearAttachments() {\n const task = this._onClearAttachments();\n this.setAttachments([]);\n\n await task;\n }\n\n public async send() {\n const adapter = this.getAttachmentAdapter();\n const attachments =\n adapter && this.attachments.length > 0\n ? Promise.all(\n this.attachments.map(async (a) => {\n if (isAttachmentComplete(a)) return a;\n const result = await adapter.send(a);\n return result as CompleteAttachment;\n }),\n )\n : [];\n\n const text = this.text;\n this._emptyTextAndAttachments();\n const message: Omit<AppendMessage, \"parentId\" | \"sourceId\"> = {\n createdAt: new Date(),\n role: this.role,\n content: text ? [{ type: \"text\", text }] : [],\n attachments: await attachments,\n runConfig: this.runConfig,\n metadata: { custom: {} },\n };\n\n this.handleSend(message);\n this._notifyEventSubscribers(\"send\");\n }\n\n public cancel() {\n this.handleCancel();\n }\n\n protected abstract handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n ): void;\n protected abstract handleCancel(): void;\n\n async addAttachment(file: File) {\n const adapter = this.getAttachmentAdapter();\n if (!adapter) throw new Error(\"Attachments are not supported\");\n\n const upsertAttachment = (a: PendingAttachment) => {\n const idx = this._attachments.findIndex(\n (attachment) => attachment.id === a.id,\n );\n if (idx !== -1)\n this._attachments = [\n ...this._attachments.slice(0, idx),\n a,\n ...this._attachments.slice(idx + 1),\n ];\n else {\n this._attachments = [...this._attachments, a];\n }\n\n this._notifySubscribers();\n };\n\n const promiseOrGenerator = adapter.add({ file });\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n upsertAttachment(r);\n }\n } else {\n upsertAttachment(await promiseOrGenerator);\n }\n\n this._notifyEventSubscribers(\"attachment-add\");\n this._notifySubscribers();\n }\n\n async removeAttachment(attachmentId: string) {\n const adapter = this.getAttachmentAdapter();\n if (!adapter) throw new Error(\"Attachments are not supported\");\n\n const index = this._attachments.findIndex((a) => a.id === attachmentId);\n if (index === -1) throw new Error(\"Attachment not found\");\n const attachment = this._attachments[index]!;\n\n await adapter.remove(attachment);\n\n // this._attachments.toSpliced(index, 1); - not yet widely supported\n this._attachments = [\n ...this._attachments.slice(0, index),\n ...this._attachments.slice(index + 1),\n ];\n this._notifySubscribers();\n }\n\n private _eventSubscribers = new Map<\n ComposerRuntimeEventType,\n Set<() => void>\n >();\n\n protected _notifyEventSubscribers(event: ComposerRuntimeEventType) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback();\n }\n\n public unstable_on(event: ComposerRuntimeEventType, callback: () => void) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n this._eventSubscribers.set(event, new Set([callback]));\n } else {\n subscribers.add(callback);\n }\n\n return () => {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n subscribers.delete(callback);\n };\n }\n}\n"],"mappings":"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","names":["subscribers"]}
@@ -1,18 +1,19 @@
1
- export type EventSource<T extends keyof AssistantEvents = keyof AssistantEvents> = T extends `${infer Source}.${string}` ? Source : never;
1
+ export type EventSource<T extends AssistantEvent = AssistantEvent> = T extends `${infer Source}.${string}` ? Source : never;
2
2
  type ScopeConfig = {
3
3
  composer: "thread" | "message";
4
4
  thread: never;
5
5
  "thread-list-item": never;
6
6
  };
7
- export type SourceByScope<TScope extends AssistantEventScope<keyof AssistantEvents>> = (TScope extends "*" ? EventSource : never) | (TScope extends keyof ScopeConfig ? TScope : never) | {
7
+ export type SourceByScope<TScope extends AssistantEventScope<AssistantEvent>> = (TScope extends "*" ? EventSource : never) | (TScope extends keyof ScopeConfig ? TScope : never) | {
8
8
  [K in keyof ScopeConfig]: TScope extends ScopeConfig[K] ? K : never;
9
9
  }[keyof ScopeConfig];
10
- export type AssistantEventScope<TEvent extends keyof AssistantEvents> = "*" | EventSource<TEvent> | ScopeConfig[EventSource<TEvent>];
11
- export type AssistantEventSelector<TEvent extends keyof AssistantEvents> = TEvent | {
10
+ export type AssistantEventScope<TEvent extends AssistantEvent> = "*" | EventSource<TEvent> | ScopeConfig[EventSource<TEvent>];
11
+ export type AssistantEventSelector<TEvent extends AssistantEvent> = TEvent | {
12
12
  scope: AssistantEventScope<TEvent>;
13
13
  event: TEvent;
14
14
  };
15
- export type AssistantEvents = {
15
+ export type AssistantEvent = keyof AssistantEventMap;
16
+ export type AssistantEventMap = {
16
17
  "thread.run-start": {
17
18
  threadId: string;
18
19
  };
@@ -39,11 +40,18 @@ export type AssistantEvents = {
39
40
  "thread-list-item.switched-away": {
40
41
  threadId: string;
41
42
  };
43
+ "*": {
44
+ [K in Exclude<keyof AssistantEventMap, "*">]: {
45
+ event: K;
46
+ payload: AssistantEventMap[K];
47
+ };
48
+ }[Exclude<keyof AssistantEventMap, "*">];
42
49
  };
43
- export declare const normalizeEventSelector: <TEvent extends keyof AssistantEvents>(selector: AssistantEventSelector<TEvent>) => {
50
+ export declare const normalizeEventSelector: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>) => {
44
51
  scope: AssistantEventScope<TEvent>;
45
52
  event: TEvent;
46
53
  };
47
- export declare const checkEventScope: <TEvent extends keyof AssistantEvents, TExpectedScope extends AssistantEventScope<keyof AssistantEvents>>(expectedScope: TExpectedScope, scope: AssistantEventScope<TEvent>, _event: TEvent) => _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`>;
54
+ export declare const checkEventScope: <TEvent extends AssistantEvent, TExpectedScope extends AssistantEventScope<AssistantEvent>>(expectedScope: TExpectedScope, scope: AssistantEventScope<TEvent>, _event: TEvent) => _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`>;
55
+ export type AssistantEventCallback<TEvent extends AssistantEvent> = (payload: AssistantEventMap[TEvent]) => void;
48
56
  export {};
49
57
  //# sourceMappingURL=EventTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventTypes.d.ts","sourceRoot":"","sources":["../../src/types/EventTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CACrB,CAAC,SAAS,MAAM,eAAe,GAAG,MAAM,eAAe,IACrD,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAE3D,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,KAAK,CAAC;IACd,kBAAkB,EAAE,KAAK,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,CACvB,MAAM,SAAS,mBAAmB,CAAC,MAAM,eAAe,CAAC,IAEvD,CAAC,MAAM,SAAS,GAAG,GAAG,WAAW,GAAG,KAAK,CAAC,GAC1C,CAAC,MAAM,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,GACnD;KACG,CAAC,IAAI,MAAM,WAAW,GAAG,MAAM,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACpE,CAAC,MAAM,WAAW,CAAC,CAAC;AAEzB,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,MAAM,eAAe,IAChE,GAAG,GACH,WAAW,CAAC,MAAM,CAAC,GACnB,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAErC,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,MAAM,eAAe,IACnE,MAAM,GACN;IACE,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG;IAE5B,kBAAkB,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gBAAgB,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,mBAAmB,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,6BAA6B,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAGF,eAAe,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,yBAAyB,EAAE;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAGF,8BAA8B,EAAE;QAC9B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gCAAgC,EAAE;QAChC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,MAAM,SAAS,MAAM,eAAe,EACzE,UAAU,sBAAsB,CAAC,MAAM,CAAC;;;CAczC,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,SAAS,MAAM,eAAe,EACpC,cAAc,SAAS,mBAAmB,CAAC,MAAM,eAAe,CAAC,EAEjE,eAAe,cAAc,EAC7B,OAAO,mBAAmB,CAAC,MAAM,CAAC,EAClC,QAAQ,MAAM,KACb,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,IAAI,MAAM,EAAE,CAExE,CAAC"}
1
+ {"version":3,"file":"EventTypes.d.ts","sourceRoot":"","sources":["../../src/types/EventTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAC/D,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,KAAK,CAAC;IACd,kBAAkB,EAAE,KAAK,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,mBAAmB,CAAC,cAAc,CAAC,IACxE,CAAC,MAAM,SAAS,GAAG,GAAG,WAAW,GAAG,KAAK,CAAC,GAC1C,CAAC,MAAM,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,GACnD;KACG,CAAC,IAAI,MAAM,WAAW,GAAG,MAAM,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACpE,CAAC,MAAM,WAAW,CAAC,CAAC;AAEzB,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,cAAc,IACzD,GAAG,GACH,WAAW,CAAC,MAAM,CAAC,GACnB,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAErC,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,cAAc,IAC5D,MAAM,GACN;IACE,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG;IAE9B,kBAAkB,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gBAAgB,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,mBAAmB,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,6BAA6B,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAGF,eAAe,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,yBAAyB,EAAE;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAGF,8BAA8B,EAAE;QAC9B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gCAAgC,EAAE;QAChC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAGF,GAAG,EAAE;SACF,CAAC,IAAI,OAAO,CAAC,MAAM,iBAAiB,EAAE,GAAG,CAAC,GAAG;YAC5C,KAAK,EAAE,CAAC,CAAC;YACT,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;SAC/B;KACF,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,MAAM,SAAS,cAAc,EAClE,UAAU,sBAAsB,CAAC,MAAM,CAAC;;;CAczC,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,SAAS,cAAc,EAC7B,cAAc,SAAS,mBAAmB,CAAC,cAAc,CAAC,EAE1D,eAAe,cAAc,EAC7B,OAAO,mBAAmB,CAAC,MAAM,CAAC,EAClC,QAAQ,MAAM,KACb,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,IAAI,MAAM,EAAE,CAExE,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,cAAc,IAAI,CAClE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAC/B,IAAI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/EventTypes.ts"],"sourcesContent":["export type EventSource<\n T extends keyof AssistantEvents = keyof AssistantEvents,\n> = T extends `${infer Source}.${string}` ? Source : never;\n\ntype ScopeConfig = {\n composer: \"thread\" | \"message\";\n thread: never;\n \"thread-list-item\": never;\n};\n\nexport type SourceByScope<\n TScope extends AssistantEventScope<keyof AssistantEvents>,\n> =\n | (TScope extends \"*\" ? EventSource : never)\n | (TScope extends keyof ScopeConfig ? TScope : never)\n | {\n [K in keyof ScopeConfig]: TScope extends ScopeConfig[K] ? K : never;\n }[keyof ScopeConfig];\n\nexport type AssistantEventScope<TEvent extends keyof AssistantEvents> =\n | \"*\"\n | EventSource<TEvent>\n | ScopeConfig[EventSource<TEvent>];\n\nexport type AssistantEventSelector<TEvent extends keyof AssistantEvents> =\n | TEvent\n | {\n scope: AssistantEventScope<TEvent>;\n event: TEvent;\n };\n\nexport type AssistantEvents = {\n // Thread events (from ThreadRuntimeEventType)\n \"thread.run-start\": {\n threadId: string;\n };\n \"thread.run-end\": {\n threadId: string;\n };\n \"thread.initialize\": {\n threadId: string;\n };\n \"thread.model-context-update\": {\n threadId: string;\n };\n\n // Composer events (from ComposerRuntimeEventType)\n \"composer.send\": {\n threadId: string;\n messageId?: string;\n };\n \"composer.attachment-add\": {\n threadId: string;\n messageId?: string;\n };\n\n // Thread list item events (from ThreadListItemEventType)\n \"thread-list-item.switched-to\": {\n threadId: string;\n };\n \"thread-list-item.switched-away\": {\n threadId: string;\n };\n};\n\nexport const normalizeEventSelector = <TEvent extends keyof AssistantEvents>(\n selector: AssistantEventSelector<TEvent>,\n) => {\n if (typeof selector === \"string\") {\n const source = selector.split(\".\")[0] as AssistantEventScope<TEvent>;\n return {\n scope: source,\n event: selector,\n };\n }\n\n return {\n scope: selector.scope,\n event: selector.event,\n };\n};\n\nexport const checkEventScope = <\n TEvent extends keyof AssistantEvents,\n TExpectedScope extends AssistantEventScope<keyof AssistantEvents>,\n>(\n expectedScope: TExpectedScope,\n scope: AssistantEventScope<TEvent>,\n _event: TEvent,\n): _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`> => {\n return scope === expectedScope;\n};\n"],"mappings":";AAiEO,IAAM,yBAAyB,CACpC,aACG;AACH,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AACpC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,EAClB;AACF;AAEO,IAAM,kBAAkB,CAI7B,eACA,OACA,WAC4E;AAC5E,SAAO,UAAU;AACnB;","names":[]}
1
+ {"version":3,"sources":["../../src/types/EventTypes.ts"],"sourcesContent":["export type EventSource<T extends AssistantEvent = AssistantEvent> =\n T extends `${infer Source}.${string}` ? Source : never;\n\ntype ScopeConfig = {\n composer: \"thread\" | \"message\";\n thread: never;\n \"thread-list-item\": never;\n};\n\nexport type SourceByScope<TScope extends AssistantEventScope<AssistantEvent>> =\n | (TScope extends \"*\" ? EventSource : never)\n | (TScope extends keyof ScopeConfig ? TScope : never)\n | {\n [K in keyof ScopeConfig]: TScope extends ScopeConfig[K] ? K : never;\n }[keyof ScopeConfig];\n\nexport type AssistantEventScope<TEvent extends AssistantEvent> =\n | \"*\"\n | EventSource<TEvent>\n | ScopeConfig[EventSource<TEvent>];\n\nexport type AssistantEventSelector<TEvent extends AssistantEvent> =\n | TEvent\n | {\n scope: AssistantEventScope<TEvent>;\n event: TEvent;\n };\n\nexport type AssistantEvent = keyof AssistantEventMap;\n\nexport type AssistantEventMap = {\n // Thread events (from ThreadRuntimeEventType)\n \"thread.run-start\": {\n threadId: string;\n };\n \"thread.run-end\": {\n threadId: string;\n };\n \"thread.initialize\": {\n threadId: string;\n };\n \"thread.model-context-update\": {\n threadId: string;\n };\n\n // Composer events (from ComposerRuntimeEventType)\n \"composer.send\": {\n threadId: string;\n messageId?: string;\n };\n \"composer.attachment-add\": {\n threadId: string;\n messageId?: string;\n };\n\n // Thread list item events (from ThreadListItemEventType)\n \"thread-list-item.switched-to\": {\n threadId: string;\n };\n \"thread-list-item.switched-away\": {\n threadId: string;\n };\n\n // Catch-all\n \"*\": {\n [K in Exclude<keyof AssistantEventMap, \"*\">]: {\n event: K;\n payload: AssistantEventMap[K];\n };\n }[Exclude<keyof AssistantEventMap, \"*\">];\n};\n\nexport const normalizeEventSelector = <TEvent extends AssistantEvent>(\n selector: AssistantEventSelector<TEvent>,\n) => {\n if (typeof selector === \"string\") {\n const source = selector.split(\".\")[0] as AssistantEventScope<TEvent>;\n return {\n scope: source,\n event: selector,\n };\n }\n\n return {\n scope: selector.scope,\n event: selector.event,\n };\n};\n\nexport const checkEventScope = <\n TEvent extends AssistantEvent,\n TExpectedScope extends AssistantEventScope<AssistantEvent>,\n>(\n expectedScope: TExpectedScope,\n scope: AssistantEventScope<TEvent>,\n _event: TEvent,\n): _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`> => {\n return scope === expectedScope;\n};\n\nexport type AssistantEventCallback<TEvent extends AssistantEvent> = (\n payload: AssistantEventMap[TEvent],\n) => void;\n"],"mappings":";AAwEO,IAAM,yBAAyB,CACpC,aACG;AACH,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AACpC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,EAClB;AACF;AAEO,IAAM,kBAAkB,CAI7B,eACA,OACA,WAC4E;AAC5E,SAAO,UAAU;AACnB;","names":[]}
@@ -3,5 +3,5 @@ export type { AppendMessage, TextMessagePart, ReasoningMessagePart, SourceMessag
3
3
  export type { EmptyMessagePartComponent, EmptyMessagePartProps, TextMessagePartComponent, TextMessagePartProps, ReasoningMessagePartComponent, ReasoningMessagePartProps, SourceMessagePartComponent, SourceMessagePartProps, ImageMessagePartComponent, ImageMessagePartProps, FileMessagePartComponent, FileMessagePartProps, Unstable_AudioMessagePartComponent, Unstable_AudioMessagePartProps, ToolCallMessagePartComponent, ToolCallMessagePartProps, } from "./MessagePartComponentTypes";
4
4
  export type { ThreadListItemStatus } from "../legacy-runtime/runtime/ThreadListItemRuntime";
5
5
  export type { Unsubscribe } from "./Unsubscribe";
6
- export type { AssistantEventScope, AssistantEventSelector, AssistantEvents, } from "./EventTypes";
6
+ export type { AssistantEventScope, AssistantEventSelector, AssistantEvent, AssistantEventMap, AssistantEventCallback, } from "./EventTypes";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EAGzB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,kCAAkC,EAClC,8BAA8B,EAC9B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AAE5F,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,GAChB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EAGzB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,kCAAkC,EAClC,8BAA8B,EAC9B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AAE5F,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,cAAc,CAAC"}
@@ -1,5 +1,13 @@
1
1
  export interface ApiObject {
2
2
  [key: string]: ((...args: any[]) => any) | ApiObject;
3
3
  }
4
- export declare const tapApi: <TApi extends ApiObject>(api: TApi) => TApi;
4
+ export declare const tapApi: <TApi extends ApiObject & {
5
+ getState: () => any;
6
+ }>(api: TApi, options?: {
7
+ key?: string | undefined;
8
+ }) => {
9
+ key: string | undefined;
10
+ state: any;
11
+ api: TApi;
12
+ };
5
13
  //# sourceMappingURL=tap-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-api.d.ts","sourceRoot":"","sources":["../../../src/utils/tap-store/tap-api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC;CACtD;AAgCD,eAAO,MAAM,MAAM,GAAI,IAAI,SAAS,SAAS,EAAE,KAAK,IAAI,SAWvD,CAAC"}
1
+ {"version":3,"file":"tap-api.d.ts","sourceRoot":"","sources":["../../../src/utils/tap-store/tap-api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC;CACtD;AAgCD,eAAO,MAAM,MAAM,GAAI,IAAI,SAAS,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,CAAA;CAAE,EACrE,KAAK,IAAI,EACT,UAAU;IACR,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;;;;CAwBF,CAAC"}
@@ -26,15 +26,25 @@ var ReadonlyApiHandler = class {
26
26
  return false;
27
27
  }
28
28
  };
29
- var tapApi = (api) => {
29
+ var tapApi = (api, options) => {
30
30
  const ref = tapRef(() => api);
31
31
  tapEffect(() => {
32
32
  ref.current = api;
33
33
  });
34
- return tapMemo(
34
+ const apiProxy = tapMemo(
35
35
  () => new Proxy({}, new ReadonlyApiHandler(() => ref.current)),
36
36
  []
37
37
  );
38
+ const key = options?.key;
39
+ const state = api.getState();
40
+ return tapMemo(
41
+ () => ({
42
+ key,
43
+ state,
44
+ api: apiProxy
45
+ }),
46
+ [state, key]
47
+ );
38
48
  };
39
49
  export {
40
50
  tapApi
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/tap-store/tap-api.ts"],"sourcesContent":["import { tapEffect, tapMemo, tapRef } from \"@assistant-ui/tap\";\n\nexport interface ApiObject {\n [key: string]: ((...args: any[]) => any) | ApiObject;\n}\n\nclass ReadonlyApiHandler<TApi extends ApiObject> implements ProxyHandler<TApi> {\n constructor(private readonly getApi: () => TApi) {}\n\n get(_: unknown, prop: string | symbol) {\n return this.getApi()[prop as keyof TApi];\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.getApi() as object);\n }\n\n has(_: unknown, prop: string | symbol) {\n return prop in (this.getApi() as object);\n }\n\n getOwnPropertyDescriptor(_: unknown, prop: string | symbol) {\n return Object.getOwnPropertyDescriptor(this.getApi(), prop);\n }\n\n set() {\n return false;\n }\n defineProperty() {\n return false;\n }\n deleteProperty() {\n return false;\n }\n}\n\nexport const tapApi = <TApi extends ApiObject>(api: TApi) => {\n const ref = tapRef(() => api);\n tapEffect(() => {\n ref.current = api;\n });\n\n return tapMemo(\n () =>\n new Proxy<TApi>({} as TApi, new ReadonlyApiHandler(() => ref.current)),\n [],\n );\n};\n"],"mappings":";AAAA,SAAS,WAAW,SAAS,cAAc;AAM3C,IAAM,qBAAN,MAA+E;AAAA,EAC7E,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,IAAI,GAAY,MAAuB;AACrC,WAAO,KAAK,OAAO,EAAE,IAAkB;AAAA,EACzC;AAAA,EAEA,UAAsC;AACpC,WAAO,OAAO,KAAK,KAAK,OAAO,CAAW;AAAA,EAC5C;AAAA,EAEA,IAAI,GAAY,MAAuB;AACrC,WAAO,QAAS,KAAK,OAAO;AAAA,EAC9B;AAAA,EAEA,yBAAyB,GAAY,MAAuB;AAC1D,WAAO,OAAO,yBAAyB,KAAK,OAAO,GAAG,IAAI;AAAA,EAC5D;AAAA,EAEA,MAAM;AACJ,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEO,IAAM,SAAS,CAAyB,QAAc;AAC3D,QAAM,MAAM,OAAO,MAAM,GAAG;AAC5B,YAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO;AAAA,IACL,MACE,IAAI,MAAY,CAAC,GAAW,IAAI,mBAAmB,MAAM,IAAI,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/utils/tap-store/tap-api.ts"],"sourcesContent":["import { tapEffect, tapMemo, tapRef } from \"@assistant-ui/tap\";\n\nexport interface ApiObject {\n [key: string]: ((...args: any[]) => any) | ApiObject;\n}\n\nclass ReadonlyApiHandler<TApi extends ApiObject> implements ProxyHandler<TApi> {\n constructor(private readonly getApi: () => TApi) {}\n\n get(_: unknown, prop: string | symbol) {\n return this.getApi()[prop as keyof TApi];\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.getApi() as object);\n }\n\n has(_: unknown, prop: string | symbol) {\n return prop in (this.getApi() as object);\n }\n\n getOwnPropertyDescriptor(_: unknown, prop: string | symbol) {\n return Object.getOwnPropertyDescriptor(this.getApi(), prop);\n }\n\n set() {\n return false;\n }\n defineProperty() {\n return false;\n }\n deleteProperty() {\n return false;\n }\n}\n\nexport const tapApi = <TApi extends ApiObject & { getState: () => any }>(\n api: TApi,\n options?: {\n key?: string | undefined;\n },\n) => {\n const ref = tapRef(() => api);\n tapEffect(() => {\n ref.current = api;\n });\n\n const apiProxy = tapMemo(\n () =>\n new Proxy<TApi>({} as TApi, new ReadonlyApiHandler(() => ref.current)),\n [],\n );\n\n const key = options?.key;\n const state = api.getState();\n\n return tapMemo(\n () => ({\n key,\n state,\n api: apiProxy,\n }),\n [state, key],\n );\n};\n"],"mappings":";AAAA,SAAS,WAAW,SAAS,cAAc;AAM3C,IAAM,qBAAN,MAA+E;AAAA,EAC7E,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,IAAI,GAAY,MAAuB;AACrC,WAAO,KAAK,OAAO,EAAE,IAAkB;AAAA,EACzC;AAAA,EAEA,UAAsC;AACpC,WAAO,OAAO,KAAK,KAAK,OAAO,CAAW;AAAA,EAC5C;AAAA,EAEA,IAAI,GAAY,MAAuB;AACrC,WAAO,QAAS,KAAK,OAAO;AAAA,EAC9B;AAAA,EAEA,yBAAyB,GAAY,MAAuB;AAC1D,WAAO,OAAO,yBAAyB,KAAK,OAAO,GAAG,IAAI;AAAA,EAC5D;AAAA,EAEA,MAAM;AACJ,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEO,IAAM,SAAS,CACpB,KACA,YAGG;AACH,QAAM,MAAM,OAAO,MAAM,GAAG;AAC5B,YAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,QAAM,WAAW;AAAA,IACf,MACE,IAAI,MAAY,CAAC,GAAW,IAAI,mBAAmB,MAAM,IAAI,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,SAAS;AACrB,QAAM,QAAQ,IAAI,SAAS;AAE3B,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAAA,IACA,CAAC,OAAO,GAAG;AAAA,EACb;AACF;","names":[]}
package/package.json CHANGED
@@ -28,7 +28,7 @@
28
28
  "conversational-ui",
29
29
  "conversational-ai"
30
30
  ],
31
- "version": "0.11.4",
31
+ "version": "0.11.6",
32
32
  "license": "MIT",
33
33
  "type": "module",
34
34
  "exports": {
@@ -13,8 +13,8 @@ import { asStore, Store, tapApi } from "../utils/tap-store";
13
13
  import { useResource } from "@assistant-ui/tap/react";
14
14
  import { useMemo } from "react";
15
15
  import {
16
- AssistantEventSelector,
17
- AssistantEvents,
16
+ AssistantEvent,
17
+ AssistantEventCallback,
18
18
  checkEventScope,
19
19
  normalizeEventSelector,
20
20
  } from "../types/EventTypes";
@@ -38,9 +38,9 @@ type AssistantClientApi = {
38
38
  readonly threads: ThreadListClientApi;
39
39
  readonly toolUIs: ToolUIApi;
40
40
 
41
- on<TEvent extends keyof AssistantEvents>(
42
- event: keyof AssistantEvents,
43
- callback: (e: AssistantEvents[TEvent]) => void,
41
+ on<TEvent extends AssistantEvent>(
42
+ event: TEvent,
43
+ callback: AssistantEventCallback<TEvent>,
44
44
  ): Unsubscribe;
45
45
 
46
46
  registerModelContextProvider(provider: ModelContextProvider): Unsubscribe;
@@ -72,7 +72,7 @@ const AssistantStore = resource(
72
72
  [threads.state, toolUIs.state],
73
73
  );
74
74
 
75
- const api = tapApi<AssistantClientApi>({
75
+ return tapApi<AssistantClientApi>({
76
76
  getState: () => state,
77
77
 
78
78
  threads: threads.api,
@@ -82,9 +82,6 @@ const AssistantStore = resource(
82
82
  registerModelContextProvider: registerModelContextProvider,
83
83
  __internal_getRuntime: () => __internal_runtime ?? null,
84
84
  });
85
-
86
- // notify the store of state changes
87
- return tapMemo(() => ({ api }), [state]);
88
85
  },
89
86
  );
90
87
 
@@ -124,10 +121,7 @@ const getClientFromStore = (client: Store<{ api: AssistantClientApi }>) => {
124
121
  __internal_getRuntime() {
125
122
  return client.getState().api.__internal_getRuntime();
126
123
  },
127
- on<TEvent extends keyof AssistantEvents>(
128
- selector: AssistantEventSelector<TEvent>,
129
- callback: (e: AssistantEvents[TEvent]) => void,
130
- ): Unsubscribe {
124
+ on(selector, callback) {
131
125
  const { event, scope } = normalizeEventSelector(selector);
132
126
  if (scope === "*") return client.getState().api.on(event, callback);
133
127
 
@@ -5,7 +5,7 @@ import { ToolUIState, ToolUIApi } from "./types/ToolUI";
5
5
  export const ToolUIClient = resource(() => {
6
6
  const [state, setState] = tapState<ToolUIState>(() => ({}));
7
7
 
8
- const api = tapApi<ToolUIApi>({
8
+ return tapApi<ToolUIApi>({
9
9
  getState: () => state,
10
10
 
11
11
  setToolUI: (toolName, render) => {
@@ -26,9 +26,4 @@ export const ToolUIClient = resource(() => {
26
26
  };
27
27
  },
28
28
  });
29
-
30
- return {
31
- state,
32
- api,
33
- };
34
29
  });
@@ -6,7 +6,7 @@ import { ThreadClientApi, ThreadClientState } from "./Thread";
6
6
 
7
7
  export type ThreadListClientState = {
8
8
  readonly mainThreadId: string;
9
- readonly newThreadId: string | undefined;
9
+ readonly newThreadId: string | null;
10
10
  readonly isLoading: boolean;
11
11
  readonly threadIds: readonly string[];
12
12
  readonly archivedThreadIds: readonly string[];
@@ -4,7 +4,7 @@ import { useMemo, type FC, type PropsWithChildren } from "react";
4
4
 
5
5
  import {
6
6
  AssistantApi,
7
- AssistantApiProvider,
7
+ AssistantProvider,
8
8
  useAssistantApi,
9
9
  createAssistantApiField,
10
10
  } from "../react/AssistantApiContext";
@@ -25,7 +25,7 @@ export const MessageAttachmentByIndexProvider: FC<
25
25
  } satisfies Partial<AssistantApi>;
26
26
  }, [api, index]);
27
27
 
28
- return <AssistantApiProvider api={api2}>{children}</AssistantApiProvider>;
28
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
29
29
  };
30
30
 
31
31
  export const ComposerAttachmentByIndexProvider: FC<
@@ -44,5 +44,5 @@ export const ComposerAttachmentByIndexProvider: FC<
44
44
  } satisfies Partial<AssistantApi>;
45
45
  }, [api, index]);
46
46
 
47
- return <AssistantApiProvider api={api2}>{children}</AssistantApiProvider>;
47
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
48
48
  };
@@ -3,12 +3,10 @@
3
3
  import { useMemo, type FC, type PropsWithChildren } from "react";
4
4
  import {
5
5
  AssistantApi,
6
- AssistantApiProvider,
6
+ AssistantProvider,
7
7
  useAssistantApi,
8
8
  createAssistantApiField,
9
9
  } from "../react/AssistantApiContext";
10
- import { AssistantEvents, AssistantEventSelector } from "../../types";
11
- import { Unsubscribe } from "@assistant-ui/tap";
12
10
  import {
13
11
  checkEventScope,
14
12
  normalizeEventSelector,
@@ -33,10 +31,7 @@ export const MessageByIndexProvider: FC<
33
31
  query: {},
34
32
  get: () => getMessage().composer,
35
33
  }),
36
- on<TEvent extends keyof AssistantEvents>(
37
- selector: AssistantEventSelector<TEvent>,
38
- callback: (e: AssistantEvents[TEvent]) => void,
39
- ): Unsubscribe {
34
+ on(selector, callback) {
40
35
  const { event, scope } = normalizeEventSelector(selector);
41
36
  if (
42
37
  !checkEventScope("composer", scope, event) &&
@@ -53,5 +48,5 @@ export const MessageByIndexProvider: FC<
53
48
  } satisfies Partial<AssistantApi>;
54
49
  }, [api, index]);
55
50
 
56
- return <AssistantApiProvider api={api2}>{children}</AssistantApiProvider>;
51
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
57
52
  };
@@ -3,7 +3,7 @@
3
3
  import { useMemo, type FC, type PropsWithChildren } from "react";
4
4
  import {
5
5
  AssistantApi,
6
- AssistantApiProvider,
6
+ AssistantProvider,
7
7
  useAssistantApi,
8
8
  createAssistantApiField,
9
9
  } from "../react/AssistantApiContext";
@@ -24,5 +24,5 @@ export const PartByIndexProvider: FC<
24
24
  } satisfies Partial<AssistantApi>;
25
25
  }, [api, index]);
26
26
 
27
- return <AssistantApiProvider api={api2}>{children}</AssistantApiProvider>;
27
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
28
28
  };
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useMemo, type FC, type PropsWithChildren } from "react";
4
4
  import {
5
- AssistantApiProvider,
5
+ AssistantProvider,
6
6
  AssistantApi,
7
7
  createAssistantApiField,
8
8
  } from "../react/AssistantApiContext";
@@ -25,15 +25,13 @@ const TextMessagePartClient = resource(
25
25
  [text, isRunning],
26
26
  );
27
27
 
28
- const api = tapApi<MessagePartClientApi>({
28
+ return tapApi<MessagePartClientApi>({
29
29
  getState: () => state,
30
30
  addToolResult: () => {
31
31
  throw new Error("Not supported");
32
32
  },
33
33
  __internal_getRuntime: () => null,
34
34
  });
35
-
36
- return api;
37
35
  },
38
36
  );
39
37
 
@@ -51,12 +49,12 @@ export const TextMessagePartProvider: FC<
51
49
  part: createAssistantApiField({
52
50
  source: "root",
53
51
  query: {},
54
- get: () => store.getState(),
52
+ get: () => store.getState().api,
55
53
  }),
56
54
  subscribe: store.subscribe,
57
- // flushSync: store.flushSync,
55
+ flushSync: store.flushSync,
58
56
  } satisfies Partial<AssistantApi>;
59
57
  }, [store]);
60
58
 
61
- return <AssistantApiProvider api={api}>{children}</AssistantApiProvider>;
59
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
62
60
  };
@@ -3,12 +3,10 @@
3
3
  import { useMemo, type FC, type PropsWithChildren } from "react";
4
4
  import {
5
5
  AssistantApi,
6
- AssistantApiProvider,
6
+ AssistantProvider,
7
7
  useAssistantApi,
8
8
  createAssistantApiField,
9
9
  } from "../react/AssistantApiContext";
10
- import { AssistantEventSelector, AssistantEvents } from "../../types";
11
- import { Unsubscribe } from "@assistant-ui/tap";
12
10
  import {
13
11
  checkEventScope,
14
12
  normalizeEventSelector,
@@ -30,14 +28,12 @@ export const ThreadListItemByIndexProvider: FC<
30
28
  query: { type: "index", index, archived },
31
29
  get: () => getItem(),
32
30
  }),
33
- on<TEvent extends keyof AssistantEvents>(
34
- selector: AssistantEventSelector<TEvent>,
35
- callback: (e: AssistantEvents[TEvent]) => void,
36
- ): Unsubscribe {
31
+ on(selector, callback) {
37
32
  const { event, scope } = normalizeEventSelector(selector);
38
- if (scope !== "thread-list-item") return api.on(selector, callback);
33
+ if (!checkEventScope("thread-list-item", scope, event))
34
+ return api.on(selector, callback);
39
35
 
40
- return api.on({ scope: "*", event }, (e: AssistantEvents[TEvent]) => {
36
+ return api.on({ scope: "*", event }, (e) => {
41
37
  if (e.threadId === getItem().getState().id) {
42
38
  callback(e);
43
39
  }
@@ -46,7 +42,7 @@ export const ThreadListItemByIndexProvider: FC<
46
42
  } satisfies Partial<AssistantApi>;
47
43
  }, [api, index, archived]);
48
44
 
49
- return <AssistantApiProvider api={api2}>{children}</AssistantApiProvider>;
45
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
50
46
  };
51
47
 
52
48
  export const ThreadListItemByIdProvider: FC<
@@ -64,15 +60,12 @@ export const ThreadListItemByIdProvider: FC<
64
60
  query: { type: "id", id },
65
61
  get: () => getItem(),
66
62
  }),
67
- on<TEvent extends keyof AssistantEvents>(
68
- selector: AssistantEventSelector<TEvent>,
69
- callback: (e: AssistantEvents[TEvent]) => void,
70
- ): Unsubscribe {
63
+ on(selector, callback) {
71
64
  const { event, scope } = normalizeEventSelector(selector);
72
65
  if (!checkEventScope("thread-list-item", scope, event))
73
66
  return api.on(selector, callback);
74
67
 
75
- return api.on({ scope: "*", event }, (e: AssistantEvents[TEvent]) => {
68
+ return api.on({ scope: "*", event }, (e) => {
76
69
  if (e.threadId !== getItem().getState().id) return;
77
70
  callback(e);
78
71
  });
@@ -80,5 +73,5 @@ export const ThreadListItemByIdProvider: FC<
80
73
  } satisfies Partial<AssistantApi>;
81
74
  }, [api, id]);
82
75
 
83
- return <AssistantApiProvider api={api2}>{children}</AssistantApiProvider>;
76
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
84
77
  };
@@ -34,14 +34,16 @@ import { Unsubscribe } from "@assistant-ui/tap";
34
34
  import { ModelContextProvider } from "../../model-context";
35
35
  import { AssistantRuntime } from "../../legacy-runtime/runtime/AssistantRuntime";
36
36
  import {
37
+ AssistantEvent,
38
+ AssistantEventCallback,
37
39
  AssistantEventSelector,
38
- AssistantEvents,
39
40
  normalizeEventSelector,
40
41
  } from "../../types/EventTypes";
41
42
  import {
42
43
  ThreadListClientApi,
43
44
  ThreadListClientState,
44
45
  } from "../../client/types/ThreadList";
46
+ import { ThreadViewportProvider } from "../providers/ThreadViewportProvider";
45
47
 
46
48
  export type AssistantState = {
47
49
  readonly threads: ThreadListClientState;
@@ -115,9 +117,9 @@ export type AssistantApi = {
115
117
  subscribe(listener: () => void): Unsubscribe;
116
118
  flushSync(): void;
117
119
 
118
- on<TEvent extends keyof AssistantEvents>(
120
+ on<TEvent extends AssistantEvent>(
119
121
  event: AssistantEventSelector<TEvent>,
120
- callback: (e: AssistantEvents[TEvent]) => void,
122
+ callback: AssistantEventCallback<TEvent>,
121
123
  ): Unsubscribe;
122
124
 
123
125
  // temp
@@ -279,13 +281,17 @@ const extendApi = (
279
281
  };
280
282
  };
281
283
 
282
- export const AssistantApiProvider: FC<
284
+ export const AssistantProvider: FC<
283
285
  PropsWithChildren<{ api: Partial<AssistantApi> }>
284
286
  > = ({ api: api2, children }) => {
285
287
  const api = useAssistantApi();
286
288
  const extendedApi = useMemo(() => extendApi(api, api2), [api, api2]);
287
289
 
288
290
  return (
289
- <AssistantApiContext value={extendedApi}>{children}</AssistantApiContext>
291
+ <AssistantApiContext value={extendedApi}>
292
+ {/* TODO temporarily allow accessing viewport state from outside the viewport */}
293
+ {/* TODO figure out if this behavior should be deprecated, since it is quite hacky */}
294
+ <ThreadViewportProvider>{children}</ThreadViewportProvider>
295
+ </AssistantApiContext>
290
296
  );
291
297
  };
@@ -1,14 +1,15 @@
1
1
  import { useEffect, useRef } from "react";
2
2
  import { useAssistantApi } from "../../react/AssistantApiContext";
3
3
  import {
4
+ AssistantEvent,
5
+ AssistantEventCallback,
4
6
  AssistantEventSelector,
5
- AssistantEvents,
6
7
  normalizeEventSelector,
7
8
  } from "../../../types/EventTypes";
8
9
 
9
- export const useAssistantEvent = <TEvent extends keyof AssistantEvents>(
10
+ export const useAssistantEvent = <TEvent extends AssistantEvent>(
10
11
  selector: AssistantEventSelector<TEvent>,
11
- callback: (e: AssistantEvents[TEvent]) => void,
12
+ callback: AssistantEventCallback<TEvent>,
12
13
  ) => {
13
14
  const api = useAssistantApi();
14
15
  const callbackRef = useRef(callback);