@assistant-ui/react 0.11.49 → 0.11.50

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 (69) hide show
  1. package/dist/client/AssistantClient.d.ts.map +1 -1
  2. package/dist/client/AssistantClient.js +1 -2
  3. package/dist/client/AssistantClient.js.map +1 -1
  4. package/dist/client/ModelContextClient.d.ts +1 -1
  5. package/dist/client/ThreadMessageClient.d.ts.map +1 -1
  6. package/dist/client/ThreadMessageClient.js +8 -9
  7. package/dist/client/ThreadMessageClient.js.map +1 -1
  8. package/dist/client/util-hooks/tapLookupResources.d.ts +2 -2
  9. package/dist/client/util-hooks/tapLookupResources.d.ts.map +1 -1
  10. package/dist/client/util-hooks/tapLookupResources.js +13 -4
  11. package/dist/client/util-hooks/tapLookupResources.js.map +1 -1
  12. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  13. package/dist/context/providers/MessageProvider.js +1 -2
  14. package/dist/context/providers/MessageProvider.js.map +1 -1
  15. package/dist/context/providers/TextMessagePartProvider.d.ts.map +1 -1
  16. package/dist/context/providers/TextMessagePartProvider.js +1 -2
  17. package/dist/context/providers/TextMessagePartProvider.js.map +1 -1
  18. package/dist/context/react/AssistantApiContext.d.ts +1 -2
  19. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  20. package/dist/context/react/AssistantApiContext.js +1 -12
  21. package/dist/context/react/AssistantApiContext.js.map +1 -1
  22. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts.map +1 -1
  23. package/dist/legacy-runtime/client/ComposerRuntimeClient.js +4 -6
  24. package/dist/legacy-runtime/client/ComposerRuntimeClient.js.map +1 -1
  25. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +1 -1
  26. package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts.map +1 -1
  27. package/dist/legacy-runtime/client/MessageRuntimeClient.js +8 -6
  28. package/dist/legacy-runtime/client/MessageRuntimeClient.js.map +1 -1
  29. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts.map +1 -1
  30. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js +4 -3
  31. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js.map +1 -1
  32. package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts.map +1 -1
  33. package/dist/legacy-runtime/client/ThreadRuntimeClient.js +4 -6
  34. package/dist/legacy-runtime/client/ThreadRuntimeClient.js.map +1 -1
  35. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  36. package/dist/primitives/composer/ComposerInput.js +4 -2
  37. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  38. package/dist/tests/setup.js +7 -7
  39. package/dist/tests/setup.js.map +1 -1
  40. package/dist/utils/tap-store/derived-scopes.d.ts +3 -10
  41. package/dist/utils/tap-store/derived-scopes.d.ts.map +1 -1
  42. package/dist/utils/tap-store/derived-scopes.js +14 -20
  43. package/dist/utils/tap-store/derived-scopes.js.map +1 -1
  44. package/dist/utils/tap-store/index.d.ts +1 -1
  45. package/dist/utils/tap-store/index.d.ts.map +1 -1
  46. package/dist/utils/tap-store/index.js.map +1 -1
  47. package/dist/utils/tap-store/store.d.ts +1 -7
  48. package/dist/utils/tap-store/store.d.ts.map +1 -1
  49. package/dist/utils/tap-store/store.js +2 -2
  50. package/dist/utils/tap-store/store.js.map +1 -1
  51. package/dist/utils/tap-store/tap-api.d.ts.map +1 -1
  52. package/dist/utils/tap-store/tap-api.js +13 -7
  53. package/dist/utils/tap-store/tap-api.js.map +1 -1
  54. package/package.json +5 -5
  55. package/src/client/AssistantClient.ts +0 -1
  56. package/src/client/ThreadMessageClient.tsx +10 -9
  57. package/src/client/util-hooks/tapLookupResources.ts +26 -11
  58. package/src/context/providers/MessageProvider.tsx +0 -1
  59. package/src/context/providers/TextMessagePartProvider.tsx +0 -1
  60. package/src/context/react/AssistantApiContext.tsx +1 -18
  61. package/src/legacy-runtime/client/ComposerRuntimeClient.ts +4 -6
  62. package/src/legacy-runtime/client/MessageRuntimeClient.ts +10 -6
  63. package/src/legacy-runtime/client/ThreadListRuntimeClient.ts +4 -3
  64. package/src/legacy-runtime/client/ThreadRuntimeClient.ts +4 -6
  65. package/src/primitives/composer/ComposerInput.tsx +4 -2
  66. package/src/utils/tap-store/derived-scopes.ts +17 -28
  67. package/src/utils/tap-store/index.ts +1 -2
  68. package/src/utils/tap-store/store.ts +2 -7
  69. package/src/utils/tap-store/tap-api.ts +12 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRuntimeClient.d.ts","sourceRoot":"","sources":["../../../src/legacy-runtime/client/ThreadRuntimeClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAezD,OAAO,EAAqB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAuB/E,eAAO,MAAM,YAAY;;;;;aACE,aAAa;EA0GvC,CAAC"}
1
+ {"version":3,"file":"ThreadRuntimeClient.d.ts","sourceRoot":"","sources":["../../../src/legacy-runtime/client/ThreadRuntimeClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAezD,OAAO,EAAqB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAuB/E,eAAO,MAAM,YAAY;;;;;aACE,aAAa;EAwGvC,CAAC"}
@@ -66,12 +66,10 @@ var ThreadClient = resource(
66
66
  })
67
67
  );
68
68
  const messages = tapLookupResources(
69
- runtimeState.messages.map(
70
- (m) => MessageClientById(
71
- { runtime, id: m.id, threadIdRef },
72
- { key: m.id }
73
- )
74
- )
69
+ runtimeState.messages.map((m) => [
70
+ m.id,
71
+ MessageClientById({ runtime, id: m.id, threadIdRef })
72
+ ])
75
73
  );
76
74
  const state = tapMemo(() => {
77
75
  return {
@@ -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 type tapRef,\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: tapRef.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 isEmpty: messages.state.length === 0 && !runtimeState.isLoading,\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 startVoice: async () => {\n throw new Error(\"startVoice is not supported in this runtime\");\n },\n stopVoice: async () => {\n throw new Error(\"stopVoice is not supported in this runtime\");\n },\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
+ {"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 type tapRef,\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: tapRef.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 m.id,\n MessageClientById({ runtime: runtime, id: m.id, threadIdRef }),\n ]),\n );\n\n const state = tapMemo<ThreadClientState>(() => {\n return {\n isEmpty: messages.state.length === 0 && !runtimeState.isLoading,\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 startVoice: async () => {\n throw new Error(\"startVoice is not supported in this runtime\");\n },\n stopVoice: async () => {\n throw new Error(\"stopVoice is not supported in this runtime\");\n },\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":";AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB,SAAS,0BAA0B;AAEnC,SAAS,iBAAiB;AAG1B,IAAM,oBAAoB;AAAA,EACxB,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIM;AACJ,UAAM,iBAAiB;AAAA,MACrB,MAAM,QAAQ,eAAe,EAAE;AAAA,MAC/B,CAAC,SAAS,EAAE;AAAA,IACd;AAEA,WAAO;AAAA,MACL,cAAc,EAAE,SAAS,gBAAgB,YAAY,CAAC;AAAA,IACxD;AAAA,EACF;AACF;AAEO,IAAM,eAAe;AAAA,EAC1B,CAAC,EAAE,QAAQ,MAAkC;AAC3C,UAAM,eAAe,gBAAgB,OAAO;AAE5C,UAAM,SAAS,UAAU;AAGzB,cAAU,MAAM;AACd,YAAM,gBAA+B,CAAC;AAGtC,YAAM,eAAyC;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,iBAAW,SAAS,cAAc;AAChC,cAAM,cAAc,QAAQ,YAAY,OAAO,MAAM;AACnD,gBAAM,WAAW,QAAQ,SAAS,GAAG,YAAY;AACjD,iBAAO,KAAK,UAAU,KAAK,IAAI;AAAA,YAC7B;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AACD,sBAAc,KAAK,WAAW;AAAA,MAChC;AAEA,aAAO,MAAM;AACX,mBAAW,SAAS,cAAe,OAAM;AAAA,MAC3C;AAAA,IACF,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,cAAc;AAAA,MAClB,OAAO;AAAA,QACL,IAAI,UAAU;AACZ,iBAAO,QAAQ,SAAS,EAAG;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AAEA,UAAM,WAAW;AAAA,MACf,eAAe;AAAA,QACb,SAAS,QAAQ;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,WAAW;AAAA,MACf,aAAa,SAAS,IAAI,CAAC,MAAM;AAAA,QAC/B,EAAE;AAAA,QACF,kBAAkB,EAAE,SAAkB,IAAI,EAAE,IAAI,YAAY,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,QAA2B,MAAM;AAC7C,aAAO;AAAA,QACL,SAAS,SAAS,MAAM,WAAW,KAAK,CAAC,aAAa;AAAA,QACtD,YAAY,aAAa;AAAA,QACzB,WAAW,aAAa;AAAA,QACxB,WAAW,aAAa;AAAA,QACxB,cAAc,aAAa;AAAA,QAC3B,OAAO,aAAa;AAAA,QACpB,aAAa,aAAa;AAAA,QAC1B,QAAQ,aAAa;AAAA,QACrB,QAAQ,aAAa;AAAA,QAErB,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,MACrB;AAAA,IACF,GAAG,CAAC,cAAc,UAAU,SAAS,KAAK,CAAC;AAE3C,WAAO,OAAwB;AAAA,MAC7B,UAAU,MAAM;AAAA,MAEhB,UAAU,SAAS;AAAA,MAEnB,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,oBAAoB,QAAQ;AAAA,MAC5B,WAAW,QAAQ;AAAA,MACnB,iBAAiB,QAAQ;AAAA,MACzB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,cAAc,QAAQ;AAAA,MACtB,YAAY,YAAY;AACtB,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAAA,MACA,WAAW,YAAY;AACrB,cAAM,IAAI,MAAM,4CAA4C;AAAA,MAC9D;AAAA,MAEA,SAAS,CAAC,aAAa;AACrB,YAAI,QAAQ,UAAU;AACpB,iBAAO,SAAS,IAAI,EAAE,KAAK,SAAS,GAAG,CAAC;AAAA,QAC1C,OAAO;AACL,iBAAO,SAAS,IAAI,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,MAEA,uBAAuB,MAAM;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerInput.d.ts","sourceRoot":"","sources":["../../../src/primitives/composer/ComposerInput.tsx"],"names":[],"mappings":"AAaA,OAAyB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAKjC,yBAAiB,sBAAsB,CAAC;IACtC,KAAY,OAAO,GAAG,mBAAmB,CAAC;IAC1C,KAAY,KAAK,GAAG,qBAAqB,GAAG;QAC1C;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC9B;;;WAGG;QACH,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACpC;;;WAGG;QACH,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACrC;;;WAGG;QACH,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC/C;;;WAGG;QACH,8BAA8B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACrD;;;WAGG;QACH,8BAA8B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACrD;;;WAGG;QACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAC5C,CAAC;CACH;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB;IAtD/B;;;OAGG;cACO,OAAO,GAAG,SAAS;IAC7B;;;OAGG;oBACa,OAAO,GAAG,SAAS;IACnC;;;OAGG;qBACc,OAAO,GAAG,SAAS;IACpC;;;OAGG;+BACwB,OAAO,GAAG,SAAS;IAC9C;;;OAGG;qCAC8B,OAAO,GAAG,SAAS;IACpD;;;OAGG;qCAC8B,OAAO,GAAG,SAAS;IACpD;;;OAGG;2BACoB,OAAO,GAAG,SAAS;uDAgK7C,CAAC"}
1
+ {"version":3,"file":"ComposerInput.d.ts","sourceRoot":"","sources":["../../../src/primitives/composer/ComposerInput.tsx"],"names":[],"mappings":"AAaA,OAAyB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAMjC,yBAAiB,sBAAsB,CAAC;IACtC,KAAY,OAAO,GAAG,mBAAmB,CAAC;IAC1C,KAAY,KAAK,GAAG,qBAAqB,GAAG;QAC1C;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC9B;;;WAGG;QACH,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACpC;;;WAGG;QACH,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACrC;;;WAGG;QACH,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC/C;;;WAGG;QACH,8BAA8B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACrD;;;WAGG;QACH,8BAA8B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACrD;;;WAGG;QACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAC5C,CAAC;CACH;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB;IAtD/B;;;OAGG;cACO,OAAO,GAAG,SAAS;IAC7B;;;OAGG;oBACa,OAAO,GAAG,SAAS;IACnC;;;OAGG;qBACc,OAAO,GAAG,SAAS;IACpC;;;OAGG;+BACwB,OAAO,GAAG,SAAS;IAC9C;;;OAGG;qCAC8B,OAAO,GAAG,SAAS;IACpD;;;OAGG;qCAC8B,OAAO,GAAG,SAAS;IACpD;;;OAGG;2BACoB,OAAO,GAAG,SAAS;uDAiK7C,CAAC"}
@@ -14,6 +14,7 @@ import TextareaAutosize from "react-textarea-autosize";
14
14
  import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
15
15
  import { useOnScrollToBottom } from "../../utils/hooks/useOnScrollToBottom.js";
16
16
  import { useAssistantState, useAssistantApi } from "../../context/index.js";
17
+ import { flushSync } from "@assistant-ui/tap";
17
18
  import { jsx } from "react/jsx-runtime";
18
19
  var ComposerPrimitiveInput = forwardRef(
19
20
  ({
@@ -108,8 +109,9 @@ var ComposerPrimitiveInput = forwardRef(
108
109
  disabled: isDisabled,
109
110
  onChange: composeEventHandlers(onChange, (e) => {
110
111
  if (!api.composer().getState().isEditing) return;
111
- api.composer().setText(e.target.value);
112
- api.flushSync();
112
+ flushSync(() => {
113
+ api.composer().setText(e.target.value);
114
+ });
113
115
  }),
114
116
  onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),
115
117
  onPaste: composeEventHandlers(onPaste, handlePaste)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n ClipboardEvent,\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useAssistantState, useAssistantApi } from \"../../context\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n export type Props = TextareaAutosizeProps & {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n */\n submitOnEnter?: boolean | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * addAttachmentOnPaste={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n submitOnEnter = true,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n addAttachmentOnPaste = true,\n ...rest\n },\n forwardedRef,\n ) => {\n const api = useAssistantApi();\n\n const value = useAssistantState(({ composer }) => {\n if (!composer.isEditing) return \"\";\n return composer.text;\n });\n\n const Component = asChild ? Slot : TextareaAutosize;\n\n const isDisabled =\n useAssistantState(({ thread }) => thread.isDisabled) || disabledProp;\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n\n useEscapeKeydown((e) => {\n if (!cancelOnEscape) return;\n\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n const composer = api.composer();\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled || !submitOnEnter) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n if (e.key === \"Enter\" && e.shiftKey === false) {\n const isRunning = api.thread().getState().isRunning;\n\n if (!isRunning) {\n e.preventDefault();\n\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = api.thread().getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n try {\n e.preventDefault();\n await Promise.all(\n files.map((file) => api.composer().addAttachment(file)),\n );\n } catch (error) {\n console.error(\"Error adding attachment:\", error);\n }\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n api.composer().getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n api.composer().getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return api.on(\"thread.run-start\", focus);\n }, [unstable_focusOnRunStart, focus, api]);\n\n useEffect(() => {\n if (\n api.composer().getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return api.on(\"thread-list-item.switched-to\", focus);\n }, [unstable_focusOnThreadSwitched, focus, api]);\n\n return (\n <Component\n name=\"input\"\n value={value}\n {...rest}\n ref={ref as React.ForwardedRef<HTMLTextAreaElement>}\n disabled={isDisabled}\n onChange={composeEventHandlers(onChange, (e) => {\n if (!api.composer().getState().isEditing) return;\n api.composer().setText(e.target.value);\n api.flushSync();\n })}\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyPress)}\n onPaste={composeEventHandlers(onPaste, handlePaste)}\n />\n );\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n ClipboardEvent,\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useAssistantState, useAssistantApi } from \"../../context\";\nimport { flushSync } from \"@assistant-ui/tap\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n export type Props = TextareaAutosizeProps & {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n */\n submitOnEnter?: boolean | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * addAttachmentOnPaste={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n submitOnEnter = true,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n addAttachmentOnPaste = true,\n ...rest\n },\n forwardedRef,\n ) => {\n const api = useAssistantApi();\n\n const value = useAssistantState(({ composer }) => {\n if (!composer.isEditing) return \"\";\n return composer.text;\n });\n\n const Component = asChild ? Slot : TextareaAutosize;\n\n const isDisabled =\n useAssistantState(({ thread }) => thread.isDisabled) || disabledProp;\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n\n useEscapeKeydown((e) => {\n if (!cancelOnEscape) return;\n\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n const composer = api.composer();\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled || !submitOnEnter) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n if (e.key === \"Enter\" && e.shiftKey === false) {\n const isRunning = api.thread().getState().isRunning;\n\n if (!isRunning) {\n e.preventDefault();\n\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = api.thread().getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n try {\n e.preventDefault();\n await Promise.all(\n files.map((file) => api.composer().addAttachment(file)),\n );\n } catch (error) {\n console.error(\"Error adding attachment:\", error);\n }\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n api.composer().getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n api.composer().getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return api.on(\"thread.run-start\", focus);\n }, [unstable_focusOnRunStart, focus, api]);\n\n useEffect(() => {\n if (\n api.composer().getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return api.on(\"thread-list-item.switched-to\", focus);\n }, [unstable_focusOnThreadSwitched, focus, api]);\n\n return (\n <Component\n name=\"input\"\n value={value}\n {...rest}\n ref={ref as React.ForwardedRef<HTMLTextAreaElement>}\n disabled={isDisabled}\n onChange={composeEventHandlers(onChange, (e) => {\n if (!api.composer().getState().isEditing) return;\n flushSync(() => {\n api.composer().setText(e.target.value);\n });\n })}\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyPress)}\n onPaste={composeEventHandlers(onPaste, handlePaste)}\n />\n );\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
1
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
2
2
  import { chai, equals, iterableEquality, subsetEquality, JestExtend, JestChaiExpect, JestAsymmetricMatchers, GLOBAL_EXPECT, ASYMMETRIC_MATCHERS_OBJECT, getState, setState, addCustomEqualityTesters, customMatchers } from "@vitest/expect.js";
3
3
  import { getCurrentTest } from "@vitest/runner.js";
4
4
 
5
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
5
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
6
6
  import { getSafeTimers } from "@vitest/utils/timers.js";
7
7
  var NAME_WORKER_STATE = "__vitest_worker__";
8
8
  function getWorkerState() {
@@ -43,7 +43,7 @@ async function waitForImportsToResolve() {
43
43
  await waitForImportsToResolve();
44
44
  }
45
45
 
46
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
46
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
47
47
  import { getSafeTimers as getSafeTimers2, delay } from "@vitest/utils/timers.js";
48
48
  import { getNames } from "@vitest/runner/utils.js";
49
49
  import { stripSnapshotIndentation, addSerializer, SnapshotClient } from "@vitest/snapshot.js";
@@ -53,10 +53,10 @@ import { fn, spyOn, restoreAllMocks, resetAllMocks, clearAllMocks, isMockFunctio
53
53
  import "@vitest/utils/offset.js";
54
54
  import { parseSingleStack } from "@vitest/utils/source-map.js";
55
55
 
56
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
56
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
57
57
  var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
58
58
 
59
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
59
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
60
60
  var RealDate = Date;
61
61
  var now = null;
62
62
  var MockDate = class _MockDate extends RealDate {
@@ -104,7 +104,7 @@ function resetDate() {
104
104
  globalThis.Date = RealDate;
105
105
  }
106
106
 
107
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
107
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
108
108
  var unsupported = [
109
109
  "matchSnapshot",
110
110
  "toMatchSnapshot",
@@ -2698,7 +2698,7 @@ function getImporter(name) {
2698
2698
  }) + 1])?.file || "";
2699
2699
  }
2700
2700
 
2701
- // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/index.js
2701
+ // ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@25.0.0_@vitest+ui@4.0.15_jiti@2.6.1__a905abac14c7ecb2319509a42a33135d/node_modules/vitest/dist/index.js
2702
2702
  import { expectTypeOf } from "expect-type.js";
2703
2703
  import { afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, recordArtifact, suite, test } from "@vitest/runner.js";
2704
2704
  import { chai as chai2 } from "@vitest/expect.js";