@datalayer/agent-runtimes 1.5.20 → 1.5.22

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 (305) hide show
  1. package/dist-embed/chunks/{AgentDetails-DZyyuD5F.js → AgentDetails-B6vekLFY.js} +1 -1
  2. package/dist-embed/chunks/{AgentDetailsDialog-DaQyQxlm.js → AgentDetailsDialog-C-o8qFsS.js} +1 -1
  3. package/dist-embed/chunks/{AgentInspector-CBNiiRtv.js → AgentInspector-EiBHJgc9.js} +1 -1
  4. package/dist-embed/chunks/{AgentInspectorDialog-BxMOAc7K.js → AgentInspectorDialog-3fbLXnLP.js} +1 -1
  5. package/dist-embed/chunks/{CellSidebarExtension-Dwe7PfXi.js → CellSidebarExtension-BBXRIRgA.js} +7 -7
  6. package/dist-embed/chunks/ChatView-BjZ993Ch.js +32 -0
  7. package/dist-embed/chunks/{ContextPie-n1y886z-.js → ContextPie-Daf19Ivt.js} +1 -1
  8. package/dist-embed/chunks/{DeckComponent-BSeEBNHt.js → DeckComponent-C76a8LYD.js} +2 -2
  9. package/dist-embed/chunks/{DocumentView-OIdQEk_n.js → DocumentView-BZhbQkbP.js} +1 -1
  10. package/dist-embed/chunks/{EphemeralDocument-C-uLD1W7.js → EphemeralDocument-Bzv1mPpG.js} +1 -1
  11. package/dist-embed/chunks/{EphemeralNotebook-C_peDfqf.js → EphemeralNotebook-C4_wmSgk.js} +1 -1
  12. package/dist-embed/chunks/{ExcalidrawComponent-DHSxnPc9.js → ExcalidrawComponent-DVOnRDkN.js} +1 -1
  13. package/dist-embed/chunks/{ExcalidrawModal-BpsfNG-u.js → ExcalidrawModal-B0h_-M3l.js} +1 -1
  14. package/dist-embed/chunks/{JupyterLexicalExtension-BUSLnJVL.js → JupyterLexicalExtension-B2PQrLXS.js} +9 -9
  15. package/dist-embed/chunks/{KernelVariables-Cu7UeFhT.js → KernelVariables-trZsXNAi.js} +1 -1
  16. package/dist-embed/chunks/{LexicalToolRegistry-CNg1T5sQ.js → LexicalToolRegistry-8wJyLumb.js} +4 -4
  17. package/dist-embed/chunks/{NotebookToolSurfaces-Cm6-oE_W.js → NotebookToolSurfaces-BuKcXArX.js} +1 -1
  18. package/dist-embed/chunks/{NotebookView-Be2lNZjS.js → NotebookView-Em4y6Een.js} +1 -1
  19. package/dist-embed/chunks/{Output-OIgTyxpD.js → Output-DA8Udq91.js} +1 -1
  20. package/dist-embed/chunks/{SandboxDetailsDialog-BMq0tlcE.js → SandboxDetailsDialog-o2z6YFyb.js} +1 -1
  21. package/dist-embed/chunks/{SchemaForm-D3mmq2C1.js → SchemaForm-DCt_mqR1.js} +1 -1
  22. package/dist-embed/chunks/{WidgetVariableView-DnuwkCHl.js → WidgetVariableView-CDEFi0p0.js} +1 -1
  23. package/dist-embed/chunks/{YouTubePlugin-Bum16ua6.js → YouTubePlugin-DxRPFzvS.js} +1 -1
  24. package/dist-embed/chunks/{abnfDiagram-VCTEODGH-Dac38D-P.js → abnfDiagram-VCTEODGH-Cit223SC.js} +1 -1
  25. package/dist-embed/chunks/{abnfDiagram-VCTEODGH-BMkFygW4.js → abnfDiagram-VCTEODGH-CsoEWluu.js} +1 -1
  26. package/dist-embed/chunks/{ar-SA-G6X2FPQ2-JDFjD_Dk.js → ar-SA-G6X2FPQ2-CjJtC55z.js} +1 -1
  27. package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-D7VBU0uf.js → architectureDiagram-5GKGNRK7-DfqpfKOB.js} +1 -1
  28. package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-DXJTBh9S.js → architectureDiagram-5GKGNRK7-DyQuZM-c.js} +1 -1
  29. package/dist-embed/chunks/{az-AZ-76LH7QW2-AbN1w5Zy.js → az-AZ-76LH7QW2-B7KkL6wt.js} +1 -1
  30. package/dist-embed/chunks/{bg-BG-XCXSNQG7-BULkJsTf.js → bg-BG-XCXSNQG7-D7UwtEhO.js} +1 -1
  31. package/dist-embed/chunks/{blockDiagram-868be97b-Bk9MNjmt.js → blockDiagram-868be97b-jJKAH_Up.js} +1 -1
  32. package/dist-embed/chunks/{blockDiagram-I7D4REHJ-CKjKQ6Dq.js → blockDiagram-I7D4REHJ-BcQwB7-r.js} +1 -1
  33. package/dist-embed/chunks/{blockDiagram-I7D4REHJ-BwenaP7n.js → blockDiagram-I7D4REHJ-z3xnLtdG.js} +1 -1
  34. package/dist-embed/chunks/{bn-BD-2XOGV67Q-B6EtUyIk.js → bn-BD-2XOGV67Q-pDDWE9Mn.js} +1 -1
  35. package/dist-embed/chunks/{c4Diagram-3f4bdde3-BGoSdP5p.js → c4Diagram-3f4bdde3-DU_-LipO.js} +1 -1
  36. package/dist-embed/chunks/{c4Diagram-7LVT6UL2-DlkcVfDa.js → c4Diagram-7LVT6UL2-BeMfCOG_.js} +1 -1
  37. package/dist-embed/chunks/{c4Diagram-7LVT6UL2-BZRokUDB.js → c4Diagram-7LVT6UL2-DjfnLrWZ.js} +1 -1
  38. package/dist-embed/chunks/{ca-ES-6MX7JW3Y-BZ0wzUck.js → ca-ES-6MX7JW3Y-By1uEeFx.js} +1 -1
  39. package/dist-embed/chunks/{celltoolbartracker-CCRqu43G.js → celltoolbartracker-DcYHi8Du.js} +1 -1
  40. package/dist-embed/chunks/{chunk-2Q5K7J3B-DLu9zZx0.js → chunk-2Q5K7J3B-BGvvv_gg.js} +1 -1
  41. package/dist-embed/chunks/{chunk-2Q5K7J3B-CfYiHpfd.js → chunk-2Q5K7J3B-YWpfqKnX.js} +1 -1
  42. package/dist-embed/chunks/{chunk-5VM5RSS4-yHAygNq4.js → chunk-5VM5RSS4-4bCWL_eZ.js} +1 -1
  43. package/dist-embed/chunks/{chunk-5VM5RSS4-dV5IUPYK.js → chunk-5VM5RSS4-t-8mwHFb.js} +1 -1
  44. package/dist-embed/chunks/{chunk-F27PBJKO-BArvzx7H.js → chunk-F27PBJKO-3yGsHIDd.js} +1 -1
  45. package/dist-embed/chunks/{chunk-F27PBJKO-BeY8iI19.js → chunk-F27PBJKO-De9ONU-g.js} +1 -1
  46. package/dist-embed/chunks/{chunk-IMKFNOWR-BJRUyuXy.js → chunk-IMKFNOWR-Bvbi7lre.js} +1 -1
  47. package/dist-embed/chunks/{chunk-IMKFNOWR-iUeFNxCU.js → chunk-IMKFNOWR-DA2KJGep.js} +1 -1
  48. package/dist-embed/chunks/{chunk-JWPE2WC7-BDUBU4vN.js → chunk-JWPE2WC7-CVkDZh_H.js} +1 -1
  49. package/dist-embed/chunks/{chunk-JWPE2WC7-Djk-1JPJ.js → chunk-JWPE2WC7-w_AaYpEU.js} +1 -1
  50. package/dist-embed/chunks/{chunk-POPQ4Y6H-E4731IOt.js → chunk-POPQ4Y6H-C1mg0obI.js} +1 -1
  51. package/dist-embed/chunks/{chunk-POPQ4Y6H-CibXbz_c.js → chunk-POPQ4Y6H-DnstozKC.js} +1 -1
  52. package/dist-embed/chunks/{chunk-SVP7TREG-o7JviCXQ.js → chunk-SVP7TREG-CVLd6GtA.js} +1 -1
  53. package/dist-embed/chunks/{chunk-SVP7TREG-DeRyA6Ek.js → chunk-SVP7TREG-DmKkKduL.js} +1 -1
  54. package/dist-embed/chunks/{chunk-TICWLB2K-Zk_gUXIu.js → chunk-TICWLB2K-C-lEt3p0.js} +1 -1
  55. package/dist-embed/chunks/{chunk-TICWLB2K-BIhZcpwn.js → chunk-TICWLB2K-xv7MPgmq.js} +1 -1
  56. package/dist-embed/chunks/{chunk-XXDRQBXY-DATpHkZD.js → chunk-XXDRQBXY-Cq8wF2xQ.js} +1 -1
  57. package/dist-embed/chunks/{chunk-XXDRQBXY-Cp6f69YK.js → chunk-XXDRQBXY-j7xuWjIK.js} +1 -1
  58. package/dist-embed/chunks/{classDiagram-ZZMXUADV-BfpWJKcC.js → classDiagram-ZZMXUADV-DRPRMTvC.js} +1 -1
  59. package/dist-embed/chunks/{classDiagram-ZZMXUADV-DcutslOq.js → classDiagram-ZZMXUADV-Dvh08RMu.js} +1 -1
  60. package/dist-embed/chunks/{classDiagram-f62afe4f-BVLyWZwA.js → classDiagram-f62afe4f-B8-b8b-t.js} +1 -1
  61. package/dist-embed/chunks/{classDiagram-v2-604399ef-CgcAzr_L.js → classDiagram-v2-604399ef-CHogX84-.js} +1 -1
  62. package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-BfpWJKcC.js → classDiagram-v2-VYDZK3BY-DRPRMTvC.js} +1 -1
  63. package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-DcutslOq.js → classDiagram-v2-VYDZK3BY-Dvh08RMu.js} +1 -1
  64. package/dist-embed/chunks/{code-block-IT6T5CEO-D5_yhrdD.js → code-block-IT6T5CEO-Dbm1cj5T.js} +1 -1
  65. package/dist-embed/chunks/{component-DoyMsR16.js → component-CsXw-w1P.js} +3 -3
  66. package/dist-embed/chunks/{cose-bilkent-JH36ORCC-B-LvsoyE.js → cose-bilkent-JH36ORCC-BrisaBwh.js} +1 -1
  67. package/dist-embed/chunks/{cose-bilkent-JH36ORCC-DhPsWJev.js → cose-bilkent-JH36ORCC-DGpwW9PH.js} +1 -1
  68. package/dist-embed/chunks/{createText-aed3d8b3-CnP7VdTn.js → createText-aed3d8b3-C8C5hNtS.js} +1 -1
  69. package/dist-embed/chunks/{cs-CZ-2BRQDIVT-CHIiQJ-9.js → cs-CZ-2BRQDIVT-TB9QxoL2.js} +1 -1
  70. package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-B4k-OykO.js → cynefinDiagram-5FMLGOSQ-B37BRKcq.js} +1 -1
  71. package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-D4zzGd7W.js → cynefinDiagram-5FMLGOSQ-NXny6Mot.js} +1 -1
  72. package/dist-embed/chunks/{da-DK-5WZEPLOC-dfN2SAKQ.js → da-DK-5WZEPLOC-CLl8TZ2P.js} +1 -1
  73. package/dist-embed/chunks/{dagre-GXQ25YYZ-BlWkzzlo.js → dagre-GXQ25YYZ-b03jeXc5.js} +1 -1
  74. package/dist-embed/chunks/{dagre-GXQ25YYZ-DUrWhbsC.js → dagre-GXQ25YYZ-mM6SsGs8.js} +1 -1
  75. package/dist-embed/chunks/{de-DE-XR44H4JA-BKsKfmfo.js → de-DE-XR44H4JA-6gY_Hl4H.js} +1 -1
  76. package/dist-embed/chunks/{diagram-S7CK7UJ4-BuRBzTwI.js → diagram-S7CK7UJ4-C8TF_Y_V.js} +1 -1
  77. package/dist-embed/chunks/{diagram-S7CK7UJ4-FxHXDIYr.js → diagram-S7CK7UJ4-fpaH_1xM.js} +1 -1
  78. package/dist-embed/chunks/{diagram-UQ7AKVKN-CeDT8Vz4.js → diagram-UQ7AKVKN-CcqaQfbU.js} +1 -1
  79. package/dist-embed/chunks/{diagram-UQ7AKVKN-FxYHrvzF.js → diagram-UQ7AKVKN-G8fspx37.js} +1 -1
  80. package/dist-embed/chunks/{diagram-VSXAHHWV-C2icUdkA.js → diagram-VSXAHHWV-B3Q41FOl.js} +1 -1
  81. package/dist-embed/chunks/{diagram-VSXAHHWV-Cv0WAiv8.js → diagram-VSXAHHWV-DLhWEHn-.js} +1 -1
  82. package/dist-embed/chunks/{diagram-VX7I27RA-AoxkG7BW.js → diagram-VX7I27RA-Dnbm3teD.js} +1 -1
  83. package/dist-embed/chunks/{diagram-VX7I27RA-D6VPVMhu.js → diagram-VX7I27RA-Dy-IHeZr.js} +1 -1
  84. package/dist-embed/chunks/{diagram-Z3DM3KII-DxunLDOr.js → diagram-Z3DM3KII-BkiB9_Ay.js} +1 -1
  85. package/dist-embed/chunks/{diagram-Z3DM3KII-CHxtPQ6F.js → diagram-Z3DM3KII-hE5FTtNp.js} +1 -1
  86. package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-CfsTBJc5.js → ebnfDiagram-PWID7BFC-DJhj6Mbd.js} +1 -1
  87. package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-CmJlfM6d.js → ebnfDiagram-PWID7BFC-DZiCEGSK.js} +1 -1
  88. package/dist-embed/chunks/{edges-b2856ca0-Cl5rq6T8.js → edges-b2856ca0-DuBY_rn3.js} +1 -1
  89. package/dist-embed/chunks/{el-GR-BZB4AONW-Cs0zPSU1.js → el-GR-BZB4AONW-CFGi_gqP.js} +1 -1
  90. package/dist-embed/chunks/{erDiagram-5d81789a-C0jmz-br.js → erDiagram-5d81789a-BYOejxuX.js} +1 -1
  91. package/dist-embed/chunks/{erDiagram-RLTQ6QDP-Dyljy6tN.js → erDiagram-RLTQ6QDP-Bg2UfSBM.js} +1 -1
  92. package/dist-embed/chunks/{erDiagram-RLTQ6QDP-FFD_URlX.js → erDiagram-RLTQ6QDP-v1tF2vX5.js} +1 -1
  93. package/dist-embed/chunks/{es-ES-U4NZUMDT-fGOqRf0o.js → es-ES-U4NZUMDT-D_HQumEp.js} +1 -1
  94. package/dist-embed/chunks/{eu-ES-A7QVB2H4-CLZ09rVe.js → eu-ES-A7QVB2H4-CvUID20p.js} +1 -1
  95. package/dist-embed/chunks/{fa-IR-HGAKTJCU-Cjimbc8n.js → fa-IR-HGAKTJCU-C7_Vi5QP.js} +1 -1
  96. package/dist-embed/chunks/{fi-FI-Z5N7JZ37-ZXNEW916.js → fi-FI-Z5N7JZ37-SBYxKS7Q.js} +1 -1
  97. package/dist-embed/chunks/{flowDb-185abca5-Cden9aoH.js → flowDb-185abca5-C_IywhMB.js} +1 -1
  98. package/dist-embed/chunks/{flowDiagram-1629c991-Bar9YxSW.js → flowDiagram-1629c991-C8JQo90r.js} +1 -1
  99. package/dist-embed/chunks/{flowDiagram-HODETNUW-bg09n0_F.js → flowDiagram-HODETNUW-BigtRRvu.js} +1 -1
  100. package/dist-embed/chunks/{flowDiagram-HODETNUW-02Xo2-6n.js → flowDiagram-HODETNUW-Cd1y1bVx.js} +1 -1
  101. package/dist-embed/chunks/{flowDiagram-v2-1d953310-C6FnOAb2.js → flowDiagram-v2-1d953310-DTH8N-sj.js} +1 -1
  102. package/dist-embed/chunks/{flowchart-elk-definition-6df44142-DcmMV2Wi.js → flowchart-elk-definition-6df44142-W8s7oFgJ.js} +1 -1
  103. package/dist-embed/chunks/{fr-FR-RHASNOE6-DQaq_g67.js → fr-FR-RHASNOE6-fAErz4Nf.js} +1 -1
  104. package/dist-embed/chunks/{ganttDiagram-3b0b3873-BN61xNrz.js → ganttDiagram-3b0b3873-D_XwfPDh.js} +1 -1
  105. package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-BCLyiaOJ.js → ganttDiagram-EL5Y4UJY-BIsU1Bcw.js} +1 -1
  106. package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-JviVPOnF.js → ganttDiagram-EL5Y4UJY-VT_s02F9.js} +1 -1
  107. package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CzBMuAvA.js → gitGraphDiagram-WWUBYQGX-BDdr_2gq.js} +1 -1
  108. package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CNc3l-2t.js → gitGraphDiagram-WWUBYQGX-BvxzF9hn.js} +1 -1
  109. package/dist-embed/chunks/{gitGraphDiagram-f01e8bc2-7ecaKDp7.js → gitGraphDiagram-f01e8bc2-UBa5a0HV.js} +1 -1
  110. package/dist-embed/chunks/{gl-ES-HMX3MZ6V-BlrLF7Sk.js → gl-ES-HMX3MZ6V-DCciQOEM.js} +1 -1
  111. package/dist-embed/chunks/{he-IL-6SHJWFNN-DLfo2nov.js → he-IL-6SHJWFNN-CuQhQVb2.js} +1 -1
  112. package/dist-embed/chunks/{hi-IN-IWLTKZ5I-BcbS0I1h.js → hi-IN-IWLTKZ5I-BlH8AK2z.js} +1 -1
  113. package/dist-embed/chunks/{hu-HU-A5ZG7DT2-B_-3TehM.js → hu-HU-A5ZG7DT2-BaBGhZVQ.js} +1 -1
  114. package/dist-embed/chunks/{id-ID-SAP4L64H-C920eBs5.js → id-ID-SAP4L64H-Dkm1zS1g.js} +1 -1
  115. package/dist-embed/chunks/{index-9bae90f3-_mZDJyzh.js → index-9bae90f3-CvHGNDGk.js} +1 -1
  116. package/dist-embed/chunks/{index-W-qUA31l.js → index-B9aqZrHy.js} +1 -1
  117. package/dist-embed/chunks/{index-DbHMJ-IM.js → index-BDs-ntTo.js} +1 -1
  118. package/dist-embed/chunks/{index-D1CRwrf9.js → index-BQp4l7hT.js} +2 -2
  119. package/dist-embed/chunks/{index-D_-7qr4x.js → index-BcdbHyzT.js} +1 -1
  120. package/dist-embed/chunks/{index-DmKOrT_f.js → index-BqDJ3hYN.js} +1 -1
  121. package/dist-embed/chunks/{index-CuqMWXgT.js → index-CFP9psRB.js} +3 -3
  122. package/dist-embed/chunks/{index-C8N5z7FZ.js → index-CUAnjzKL.js} +1 -1
  123. package/dist-embed/chunks/{index-k3ISgWrJ.js → index-CWwj0zW9.js} +1 -1
  124. package/dist-embed/chunks/{index-DV2fNvY7.js → index-CecqH6mN.js} +1 -1
  125. package/dist-embed/chunks/{index-C3zGthUI.js → index-CoxYszKx.js} +1 -1
  126. package/dist-embed/chunks/{index-7V4MgoX0.js → index-CozDzMOf.js} +1 -1
  127. package/dist-embed/chunks/{index-C2UmIEOV.js → index-CrL-deXT.js} +1 -1
  128. package/dist-embed/chunks/{index-CW0DxnfF.js → index-CtEseCtc.js} +1 -1
  129. package/dist-embed/chunks/{index-OZDJ7kli.js → index-D2vkNPmG.js} +1 -1
  130. package/dist-embed/chunks/{index-MNZ1LVAM.js → index-D5xVRNk8.js} +1 -1
  131. package/dist-embed/chunks/{index-DmYrjwOw.js → index-D8wHLHbt.js} +1 -1
  132. package/dist-embed/chunks/{index-B0VC_nl2.js → index-DAZUOPnd.js} +1 -1
  133. package/dist-embed/chunks/{index-BbtA7ppb.js → index-DE_JTiwB.js} +1 -1
  134. package/dist-embed/chunks/{index-CLojGXLe.js → index-DMll0Yzi.js} +1 -1
  135. package/dist-embed/chunks/{index-DcbXB4Ou.js → index-DN-cizG6.js} +1 -1
  136. package/dist-embed/chunks/{index-DMTXHmrU.js → index-DPHM1WLM.js} +1 -1
  137. package/dist-embed/chunks/{index-Dyv67BU9.js → index-DSN70XMH.js} +2 -2
  138. package/dist-embed/chunks/{index-CGhVy6OJ.js → index-Dc5AqaeZ.js} +1 -1
  139. package/dist-embed/chunks/{index-B3qU5V3s.js → index-DdmqZZnv.js} +1 -1
  140. package/dist-embed/chunks/{index-BST3vALX.js → index-DlYw1KQn.js} +5 -5
  141. package/dist-embed/chunks/{index-C3p2Hbbg.js → index-Dobs-OKl.js} +1 -1
  142. package/dist-embed/chunks/{index-oJ3M8HYJ.js → index-Dp3JEvYy.js} +1 -1
  143. package/dist-embed/chunks/{index-D95mZTII.js → index-DsMBsL3g.js} +1 -1
  144. package/dist-embed/chunks/{index-BVdp0AG7.js → index-DvyxBamA.js} +4 -4
  145. package/dist-embed/chunks/{index-BMqDh5WU.js → index-SsFECYMb.js} +1 -1
  146. package/dist-embed/chunks/{index-DqwL86GY.js → index-YVrQYH-H.js} +12 -12
  147. package/dist-embed/chunks/{index-DSts8s_N.js → index-a9o1fYab.js} +1 -1
  148. package/dist-embed/chunks/{index-BVkaRzYN.js → index-bC_5dTbf.js} +4 -4
  149. package/dist-embed/chunks/{index--rbc1jdS.js → index-jJxXKHoT.js} +1 -1
  150. package/dist-embed/chunks/{index.esm-Dy7cyZyH.js → index.esm-p0OnSU9h.js} +1 -1
  151. package/dist-embed/chunks/{index.esm-jFa95d0B.js → index.esm-q_fIJH5v.js} +1 -1
  152. package/dist-embed/chunks/{infoDiagram-27XIBGKW-CuQ0a02I.js → infoDiagram-27XIBGKW-DIeaDzEK.js} +1 -1
  153. package/dist-embed/chunks/{infoDiagram-27XIBGKW-CDc0DV-6.js → infoDiagram-27XIBGKW-DZ6Xhv3K.js} +1 -1
  154. package/dist-embed/chunks/{infoDiagram-a29d40f1-BKWmVk4B.js → infoDiagram-a29d40f1-B9PMyz4X.js} +1 -1
  155. package/dist-embed/chunks/{isEqual-SWNqZJZT.js → isEqual-Cwjr2skl.js} +1 -1
  156. package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-CPu6wHAG.js → ishikawaDiagram-5VMMS53U-BP4Q8nEu.js} +1 -1
  157. package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-BY7eKNmA.js → ishikawaDiagram-5VMMS53U-CwrdITPn.js} +1 -1
  158. package/dist-embed/chunks/{it-IT-JPQ66NNP-CsJELR-H.js → it-IT-JPQ66NNP-BrcctIsI.js} +1 -1
  159. package/dist-embed/chunks/{ja-JP-DBVTYXUO-Bh4bW0cv.js → ja-JP-DBVTYXUO-CKuJ3Sod.js} +1 -1
  160. package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-6CRYfcQL.js → journeyDiagram-3NMN7TZE-iJrCUeL0.js} +1 -1
  161. package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-Cv_KZqY3.js → journeyDiagram-3NMN7TZE-wI34jsXX.js} +1 -1
  162. package/dist-embed/chunks/{journeyDiagram-95396277-yJruA0Fm.js → journeyDiagram-95396277-B6WhL2Fl.js} +1 -1
  163. package/dist-embed/chunks/{kaa-6HZHGXH3-BmDtc0g0.js → kaa-6HZHGXH3-ChFYZBwI.js} +1 -1
  164. package/dist-embed/chunks/{kab-KAB-ZGHBKWFO-Bluox3dD.js → kab-KAB-ZGHBKWFO-C7C7EuVk.js} +1 -1
  165. package/dist-embed/chunks/{kanban-definition-UXKFOSKX-Biauy1A4.js → kanban-definition-UXKFOSKX-B8AB0LN4.js} +1 -1
  166. package/dist-embed/chunks/{kanban-definition-UXKFOSKX-Dps45ZlJ.js → kanban-definition-UXKFOSKX-gqU76cK9.js} +1 -1
  167. package/dist-embed/chunks/{kk-KZ-P5N5QNE5-EZjFhsK8.js → kk-KZ-P5N5QNE5-Bff18CC1.js} +1 -1
  168. package/dist-embed/chunks/{km-KH-HSX4SM5Z-BpZu76AC.js → km-KH-HSX4SM5Z-DU2YQt8I.js} +1 -1
  169. package/dist-embed/chunks/{ko-KR-MTYHY66A-C5JZPTHd.js → ko-KR-MTYHY66A-CQruDlRn.js} +1 -1
  170. package/dist-embed/chunks/{ku-TR-6OUDTVRD-BUaf6TOB.js → ku-TR-6OUDTVRD-DoySMeIi.js} +1 -1
  171. package/dist-embed/chunks/{layout-C8INuwYa.js → layout-CJFemkl6.js} +1 -1
  172. package/dist-embed/chunks/{layout-CEbgEIwd.js → layout-DbdaqszO.js} +1 -1
  173. package/dist-embed/chunks/{lexicalHooks-DFMSPigW.js → lexicalHooks-Pqoe8h_O.js} +1 -1
  174. package/dist-embed/chunks/{lt-LT-XHIRWOB4-CuGmKRQr.js → lt-LT-XHIRWOB4-72Vmr8iW.js} +1 -1
  175. package/dist-embed/chunks/{lv-LV-5QDEKY6T-EYERw_NP.js → lv-LV-5QDEKY6T-CxtO97qO.js} +1 -1
  176. package/dist-embed/chunks/{mermaid.core-BeAq5EQp.js → mermaid.core-CAzPWd8O.js} +3 -3
  177. package/dist-embed/chunks/{mermaid.core-hzdTpjmh.js → mermaid.core-DaZxhAXO.js} +5 -5
  178. package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-iB7eW5x9.js → mindmap-definition-YA3MSWOX-D8W0sJ7P.js} +1 -1
  179. package/dist-embed/chunks/{mindmap-definition-YA3MSWOX--O06aygF.js → mindmap-definition-YA3MSWOX-DPl-uWpT.js} +1 -1
  180. package/dist-embed/chunks/{mindmap-definition-e4c1d938-DCwgMhNw.js → mindmap-definition-e4c1d938-CGXwlH4A.js} +1 -1
  181. package/dist-embed/chunks/{mr-IN-CRQNXWMA-SKx4bMeU.js → mr-IN-CRQNXWMA-BNGEl_QE.js} +1 -1
  182. package/dist-embed/chunks/{my-MM-5M5IBNSE-BG-vgEXz.js → my-MM-5M5IBNSE-4wIAMvGF.js} +1 -1
  183. package/dist-embed/chunks/{nb-NO-T6EIAALU-BbW-11AI.js → nb-NO-T6EIAALU-z-1s9yX9.js} +1 -1
  184. package/dist-embed/chunks/{nl-NL-IS3SIHDZ-CSKGpuSJ.js → nl-NL-IS3SIHDZ-CYKGEVB8.js} +1 -1
  185. package/dist-embed/chunks/{nn-NO-6E72VCQL-P1tnp9TQ.js → nn-NO-6E72VCQL-DwQFIFpO.js} +1 -1
  186. package/dist-embed/chunks/{oc-FR-POXYY2M6-vpu8tuQT.js → oc-FR-POXYY2M6-mH2n3eM_.js} +1 -1
  187. package/dist-embed/chunks/{pa-IN-N4M65BXN-CIpdGll2.js → pa-IN-N4M65BXN-DbixE6jQ.js} +1 -1
  188. package/dist-embed/chunks/{pegDiagram-XKGWAZYB-Bon6jQ3L.js → pegDiagram-XKGWAZYB-D3qs3UBw.js} +1 -1
  189. package/dist-embed/chunks/{pegDiagram-XKGWAZYB-ZPizxhEX.js → pegDiagram-XKGWAZYB-DJmZupPa.js} +1 -1
  190. package/dist-embed/chunks/{percentages-BXMCSKIN-hVEpOtFm.js → percentages-BXMCSKIN-5Q9KX_WU.js} +5 -5
  191. package/dist-embed/chunks/{pieDiagram-E7YTZNPT-C0Pc9GUi.js → pieDiagram-E7YTZNPT-C58cd6s7.js} +1 -1
  192. package/dist-embed/chunks/{pieDiagram-E7YTZNPT-Di8dEHt9.js → pieDiagram-E7YTZNPT-CrZQ-dOy.js} +1 -1
  193. package/dist-embed/chunks/{pieDiagram-c941bede-C--hwbRv.js → pieDiagram-c941bede-Dn3GMx6q.js} +1 -1
  194. package/dist-embed/chunks/{pl-PL-T2D74RX3-Ckyj0Mzv.js → pl-PL-T2D74RX3-jOVonFYe.js} +1 -1
  195. package/dist-embed/chunks/{pt-BR-5N22H2LF-3jDc9_Aa.js → pt-BR-5N22H2LF-Cx4MrqgK.js} +1 -1
  196. package/dist-embed/chunks/{pt-PT-UZXXM6DQ-lhLbXf7Q.js → pt-PT-UZXXM6DQ-B2PzNwuF.js} +1 -1
  197. package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-D0QYtpIp.js → quadrantDiagram-AXDQQJYC-CJn8hkR8.js} +1 -1
  198. package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-Ffo3hgR0.js → quadrantDiagram-AXDQQJYC-haT-kxqE.js} +1 -1
  199. package/dist-embed/chunks/{quadrantDiagram-cf8b8fe0-Bqmed-0s.js → quadrantDiagram-cf8b8fe0-B3wudq14.js} +1 -1
  200. package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-BMC9Ldnh.js → railroadDiagram-O6MQD6OU-T23yIHww.js} +1 -1
  201. package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-aTc7bF4I.js → railroadDiagram-O6MQD6OU-Ty6XXjBy.js} +1 -1
  202. package/dist-embed/chunks/{renderer-CR6Lxa3d.js → renderer-Au1S-H5k.js} +1 -1
  203. package/dist-embed/chunks/{requirementDiagram-53bda41b-DExdw0ey.js → requirementDiagram-53bda41b-B-eAYQ6c.js} +1 -1
  204. package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-DBj1iVv5.js → requirementDiagram-BXWQKSXE-CgkHdmYF.js} +1 -1
  205. package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-mBFLHcqA.js → requirementDiagram-BXWQKSXE-fpBmgh7Q.js} +1 -1
  206. package/dist-embed/chunks/{ro-RO-JPDTUUEW-Dy9oeW3b.js → ro-RO-JPDTUUEW-BCQxuLcc.js} +1 -1
  207. package/dist-embed/chunks/{ru-RU-B4JR7IUQ-CK16-wfD.js → ru-RU-B4JR7IUQ-CqSiHvqj.js} +1 -1
  208. package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-9W9X5V7a.js → sankeyDiagram-P5KCCOFB-DEGMK43Q.js} +1 -1
  209. package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-DzaadHXz.js → sankeyDiagram-P5KCCOFB-hDbZE81L.js} +1 -1
  210. package/dist-embed/chunks/{sankeyDiagram-c3ef121a-B6u8wnkU.js → sankeyDiagram-c3ef121a-O14jOeqO.js} +1 -1
  211. package/dist-embed/chunks/{sequenceDiagram-82a5b84f-Bq8bvLh8.js → sequenceDiagram-82a5b84f-BFFzLElQ.js} +1 -1
  212. package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-BNfJw8_y.js → sequenceDiagram-WJ2MYXX4-MrC4K4SC.js} +1 -1
  213. package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-B76NTf4c.js → sequenceDiagram-WJ2MYXX4-wongMGVN.js} +1 -1
  214. package/dist-embed/chunks/{sessions-XxjScqnJ.js → sessions-BRALW9Yv.js} +1 -1
  215. package/dist-embed/chunks/{si-LK-N5RQ5JYF-AJdaUbzl.js → si-LK-N5RQ5JYF-Dbgk5YHt.js} +1 -1
  216. package/dist-embed/chunks/{sizeCapture-INFHLROL-KZBUxNmb.js → sizeCapture-INFHLROL-CiOiAAo5.js} +1 -1
  217. package/dist-embed/chunks/{sizeCapture-INFHLROL-DQ5s0TIW.js → sizeCapture-INFHLROL-j4-sCda0.js} +1 -1
  218. package/dist-embed/chunks/{sk-SK-C5VTKIMK-Bk82hIVU.js → sk-SK-C5VTKIMK-OBAaNvVw.js} +1 -1
  219. package/dist-embed/chunks/{sl-SI-NN7IZMDC-DSFcvf6W.js → sl-SI-NN7IZMDC-DqLxi4IM.js} +1 -1
  220. package/dist-embed/chunks/{stateDiagram-43e79a5f-BiTTNI1Z.js → stateDiagram-43e79a5f-BZm5gFdu.js} +1 -1
  221. package/dist-embed/chunks/{stateDiagram-D77RDMKH-lndPMO3D.js → stateDiagram-D77RDMKH-D7_xyy8n.js} +1 -1
  222. package/dist-embed/chunks/{stateDiagram-D77RDMKH-D4hQpdZ2.js → stateDiagram-D77RDMKH-DXrbH1aM.js} +1 -1
  223. package/dist-embed/chunks/{stateDiagram-v2-2041ed4f-BbFiQEfG.js → stateDiagram-v2-2041ed4f-DiXOgJsK.js} +1 -1
  224. package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-pqcRT12A.js → stateDiagram-v2-MP3YSRHH-DLsY6ysL.js} +1 -1
  225. package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-C-kIBdBJ.js → stateDiagram-v2-MP3YSRHH-ngWpJn6k.js} +1 -1
  226. package/dist-embed/chunks/{styles-455b33cd-U9lx7mAf.js → styles-455b33cd-CrHizSU7.js} +1 -1
  227. package/dist-embed/chunks/{styles-f932cba9-S-lYZYdK.js → styles-f932cba9-YuCN7fSa.js} +1 -1
  228. package/dist-embed/chunks/{styles-fcc2142b-DfudfB3j.js → styles-fcc2142b-tjrOPOh4.js} +1 -1
  229. package/dist-embed/chunks/{subset-shared.chunk-f2gmZjeG.js → subset-shared.chunk-Du2agLgk.js} +1 -1
  230. package/dist-embed/chunks/{subset-worker.chunk-De1CPIQ6.js → subset-worker.chunk-BXR8pgHc.js} +1 -1
  231. package/dist-embed/chunks/{sv-SE-XGPEYMSR-BbGfLHIi.js → sv-SE-XGPEYMSR-BbgHKxhC.js} +1 -1
  232. package/dist-embed/chunks/{svgDrawCommon-148a3cd9-ClgHG0vb.js → svgDrawCommon-148a3cd9-DTqtvo5_.js} +1 -1
  233. package/dist-embed/chunks/{swimlanes-42K2YHIH-OqZ4t-07.js → swimlanes-42K2YHIH-B289Mbni.js} +1 -1
  234. package/dist-embed/chunks/{swimlanes-42K2YHIH-CjV1bdPk.js → swimlanes-42K2YHIH-B3H_wpMu.js} +1 -1
  235. package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-9twpvQtj.js → swimlanesDiagram-VR7AAH4N-D0ZHzw-_.js} +1 -1
  236. package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-BdS4NGOx.js → swimlanesDiagram-VR7AAH4N-qWg-2xN_.js} +1 -1
  237. package/dist-embed/chunks/{ta-IN-2NMHFXQM-BWMJgnI2.js → ta-IN-2NMHFXQM-0pH7gQyu.js} +1 -1
  238. package/dist-embed/chunks/{th-TH-HPSO5L25-DiP_CZXl.js → th-TH-HPSO5L25-Dvbu09CU.js} +1 -1
  239. package/dist-embed/chunks/{timeline-definition-24CTP7MA-B7uSaXDu.js → timeline-definition-24CTP7MA-DUc18SdK.js} +1 -1
  240. package/dist-embed/chunks/{timeline-definition-24CTP7MA-Cs4Bwobu.js → timeline-definition-24CTP7MA-DpMq7g2g.js} +1 -1
  241. package/dist-embed/chunks/{timeline-definition-7545f45a-CHrBluu1.js → timeline-definition-7545f45a--4ypi4BE.js} +1 -1
  242. package/dist-embed/chunks/{tr-TR-DEFEU3FU-CKMBvOkr.js → tr-TR-DEFEU3FU-B6YS3iEB.js} +1 -1
  243. package/dist-embed/chunks/{uk-UA-QMV73CPH-CQL0E0jU.js → uk-UA-QMV73CPH-DMG9vIVp.js} +1 -1
  244. package/dist-embed/chunks/{vennDiagram-4TSXK5OY-uwWpr4uC.js → vennDiagram-4TSXK5OY-CS12EGJw.js} +1 -1
  245. package/dist-embed/chunks/{vennDiagram-4TSXK5OY-CHSyRZN_.js → vennDiagram-4TSXK5OY-CvEXE1xX.js} +1 -1
  246. package/dist-embed/chunks/{vi-VN-M7AON7JQ-BpvEBNJo.js → vi-VN-M7AON7JQ-DB3ZrpeP.js} +1 -1
  247. package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-0UuvD-IO.js → wardleyDiagram-VM6X3IG4-8LfGni9_.js} +1 -1
  248. package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-zIfOyYBf.js → wardleyDiagram-VM6X3IG4-Bj02LzjH.js} +1 -1
  249. package/dist-embed/chunks/{xychartDiagram-3f383b91-ChbRPzo8.js → xychartDiagram-3f383b91-CE_OY5QR.js} +1 -1
  250. package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-hCGgyjir.js → xychartDiagram-S5SC5T6Z-BdZi5x4a.js} +1 -1
  251. package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-q9gcUSF1.js → xychartDiagram-S5SC5T6Z-DXqC0l3r.js} +1 -1
  252. package/dist-embed/chunks/{zh-CN-LNUGB5OW-DWmzAIjK.js → zh-CN-LNUGB5OW-VV-lg83H.js} +1 -1
  253. package/dist-embed/chunks/{zh-HK-E62DVLB3-CQ-xPzHX.js → zh-HK-E62DVLB3-DLoyC6Q9.js} +1 -1
  254. package/dist-embed/chunks/{zh-TW-RAJ6MFWO-DvlSTykD.js → zh-TW-RAJ6MFWO-DhFllgOW.js} +1 -1
  255. package/dist-embed/datalayer-app-main.js +54 -54
  256. package/lib/apps/apps/records.d.ts +0 -29
  257. package/lib/apps/apps/records.js +11 -34
  258. package/lib/apps/apps/threads.d.ts +2 -21
  259. package/lib/apps/apps/threads.js +0 -75
  260. package/lib/apps/embed/embedSession.d.ts +0 -8
  261. package/lib/apps/embed/embedSession.js +1 -38
  262. package/lib/apps/embed/visitorApp.d.ts +23 -4
  263. package/lib/apps/embed/visitorApp.js +43 -5
  264. package/lib/apps/plugins/chat/ChatView.js +15 -3
  265. package/lib/chat/ChatFloating.js +4 -1
  266. package/lib/chat/base/ChatBase.js +12 -4
  267. package/lib/chat/base/fullContextMessages.js +1 -1
  268. package/lib/chat/prompt/InputPrompt.d.ts +6 -1
  269. package/lib/chat/prompt/InputPrompt.js +12 -2
  270. package/lib/hooks/useAgUi.js +1 -1
  271. package/lib/hooks/useToolApprovals.d.ts +1 -1
  272. package/lib/hooks/useToolApprovals.js +1 -1
  273. package/lib/{protocols → portable}/agUiRefusal.d.ts +1 -1
  274. package/lib/{protocols → portable}/agUiRefusal.js +1 -1
  275. package/lib/portable/agui.d.ts +72 -0
  276. package/lib/portable/agui.js +174 -0
  277. package/lib/portable/conversation.d.ts +124 -0
  278. package/lib/portable/conversation.js +357 -0
  279. package/lib/portable/index.d.ts +11 -6
  280. package/lib/portable/index.js +14 -11
  281. package/lib/portable/records.d.ts +27 -0
  282. package/lib/portable/records.js +46 -0
  283. package/lib/portable/sessions.d.ts +92 -0
  284. package/lib/portable/sessions.js +134 -0
  285. package/lib/portable/thread.d.ts +41 -0
  286. package/lib/portable/thread.js +102 -0
  287. package/lib/protocols/AGUIAdapter.d.ts +0 -2
  288. package/lib/protocols/AGUIAdapter.js +39 -74
  289. package/lib/voice/ComposerVoice.d.ts +15 -2
  290. package/lib/voice/ComposerVoice.js +23 -17
  291. package/lib/voice/VoiceMenu.d.ts +27 -0
  292. package/lib/voice/VoiceMenu.js +32 -0
  293. package/lib/voice/chatVoice.js +2 -2
  294. package/lib/voice/choices.d.ts +33 -0
  295. package/lib/voice/choices.js +70 -0
  296. package/lib/voice/index.d.ts +4 -0
  297. package/lib/voice/index.js +3 -0
  298. package/lib/voice/settings.d.ts +17 -1
  299. package/lib/voice/settings.js +64 -1
  300. package/lib/voice/useVoiceSettings.d.ts +6 -0
  301. package/lib/voice/useVoiceSettings.js +25 -0
  302. package/package.json +1 -1
  303. package/dist-embed/chunks/ChatView-C2La9033.js +0 -32
  304. /package/lib/{utils → portable}/approvals.d.ts +0 -0
  305. /package/lib/{utils → portable}/approvals.js +0 -0
@@ -0,0 +1,134 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ import { readRunStream } from './agui';
6
+ import { agUiRefusal, refusalBody } from './agUiRefusal';
7
+ import { messagesOfThread } from './thread';
8
+ /** A route that refused: its status and the runtime's sentence. */
9
+ export class RuntimeRefusal extends Error {
10
+ status;
11
+ constructor(status, message) {
12
+ super(message);
13
+ this.status = status;
14
+ this.name = 'RuntimeRefusal';
15
+ }
16
+ }
17
+ function clientOf({ baseUrl, getAccessToken, fetch: fetcher, }) {
18
+ const root = baseUrl.replace(/\/+$/, '');
19
+ const headers = (extra = {}) => {
20
+ const token = getAccessToken();
21
+ return {
22
+ ...extra,
23
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
24
+ };
25
+ };
26
+ const refused = async (response) => {
27
+ throw new RuntimeRefusal(response.status, agUiRefusal(response.status, response.statusText, await refusalBody(response)));
28
+ };
29
+ const json = async (path, method = 'GET') => {
30
+ const response = await fetcher(`${root}${path}`, {
31
+ method,
32
+ headers: headers({ Accept: 'application/json' }),
33
+ });
34
+ if (!response.ok) {
35
+ return refused(response);
36
+ }
37
+ return (await response.json());
38
+ };
39
+ const stream = async (path, body, { onEvent, signal }, method = 'POST') => {
40
+ const response = await fetcher(`${root}${path}`, {
41
+ method,
42
+ headers: headers({
43
+ 'Content-Type': 'application/json',
44
+ Accept: 'text/event-stream',
45
+ }),
46
+ body: JSON.stringify(body),
47
+ signal,
48
+ });
49
+ if (!response.ok) {
50
+ return refused(response);
51
+ }
52
+ await readRunStream(response, onEvent);
53
+ };
54
+ return { json, stream, refused, headers, root, fetcher };
55
+ }
56
+ const at = (uid) => `/api/v1/apps/sessions/${encodeURIComponent(uid)}`;
57
+ /**
58
+ * An application's sessions on the runtime that runs it: start, message,
59
+ * settings, resume (streamed), and stop, end, read (JSON).
60
+ */
61
+ export function appSessionsClient(options) {
62
+ const { json, stream } = clientOf(options);
63
+ return {
64
+ /** Start a session with its first message. */
65
+ start: (start, streaming) => stream('/api/v1/apps/sessions', {
66
+ agent: start.agent,
67
+ ...(start.deploymentUid
68
+ ? { deployment_uid: start.deploymentUid }
69
+ : {}),
70
+ ...(start.appUid ? { app_uid: start.appUid } : {}),
71
+ ...(start.version ? { version: start.version } : {}),
72
+ ...(start.session ? { session: start.session } : {}),
73
+ opener: start.opener,
74
+ }, streaming),
75
+ /** The next turn, or the answer to what the application asked (text, a choice). */
76
+ message: (uid, text, streaming) => stream(`${at(uid)}/messages`, { text }, streaming),
77
+ /** A settings change: also what answers a form the application asked. */
78
+ changeSettings: (uid, values, streaming) => stream(`${at(uid)}/settings`, { values }, streaming, 'PUT'),
79
+ /** Resume a stopped session — or, with its agent, one the runtime no longer holds, from its record. */
80
+ resume: (uid, agent, streaming) => stream(`${at(uid)}/resume`, { agent }, streaming),
81
+ /** Stop: what runs is cancelled; the session waits to be resumed. */
82
+ stop: (uid) => json(`${at(uid)}/stop`, 'POST'),
83
+ /** End the conversation for good; its record stays. */
84
+ end: (uid) => json(`${at(uid)}/end`, 'POST'),
85
+ /** What the session is: its state (`open`, `running`, `waiting`, `stopped`) and what it asks. */
86
+ describe: (uid) => json(at(uid)),
87
+ /** Its conversation as a person reads it (`messagesOfThread`). */
88
+ messages: async (uid) => messagesOfThread((await json(`${at(uid)}/messages`)).messages),
89
+ };
90
+ }
91
+ /**
92
+ * A standalone agent over its AG-UI mount: a run carries the conversation so
93
+ * far, and stopping it terminates the thread's run on the runtime. A raw
94
+ * agent has no session, record or question of an application's.
95
+ */
96
+ export function agentRunClient(options) {
97
+ const { stream, refused, root, headers, fetcher } = clientOf(options);
98
+ return {
99
+ run: (threadId, runId, messages, streaming) => stream(`/api/v1/ag-ui/${encodeURIComponent(options.agent)}/`, {
100
+ threadId,
101
+ runId,
102
+ messages,
103
+ state: null,
104
+ tools: [],
105
+ context: [],
106
+ forwardedProps: null,
107
+ }, streaming),
108
+ /** Stop the thread's run on the runtime (`POST /api/v1/ag-ui/terminate`). */
109
+ terminate: async (threadId) => {
110
+ const response = await fetcher(`${root}/api/v1/ag-ui/terminate`, {
111
+ method: 'POST',
112
+ headers: headers({ 'Content-Type': 'application/json' }),
113
+ body: JSON.stringify({ thread_id: threadId }),
114
+ });
115
+ if (!response.ok) {
116
+ await refused(response);
117
+ }
118
+ },
119
+ };
120
+ }
121
+ /**
122
+ * A runtime's agent-runtimes address from its ingress, as the runtimes
123
+ * service gives it (`…/jupyter/server/<runtime>` → `…/agent-runtimes/<runtime>`,
124
+ * `build_agent_runtimes_base_url`). Refused when there is none.
125
+ */
126
+ export function agentRuntimesUrlOf(ingress) {
127
+ const base = ingress.trim().replace(/\/+$/, '');
128
+ if (!/^https?:\/\//.test(base)) {
129
+ throw new Error(`The runtime gave no address to reach its agents: ${ingress || 'none'}.`);
130
+ }
131
+ return base.includes('/jupyter/server/')
132
+ ? base.replace('/jupyter/server/', '/agent-runtimes/')
133
+ : base;
134
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * A person's conversation with an application, read again: the person-facing
3
+ * projection of a session's thread, and the thread opened from the runtime
4
+ * that holds it — or resumed from its record (LOOP P-24, D-13, R-04).
5
+ *
6
+ * The web chat (`ChatView`, an embed after its page reloads) and Datalayer
7
+ * Mobile open a thread with these, so that what a person reads of their own
8
+ * conversation is the same on each. Pure: the network is the `fetch` given.
9
+ *
10
+ * @module portable/thread
11
+ */
12
+ import type { ChatMessage } from '../types/messages';
13
+ /** What opening a thread says, in a person's words. */
14
+ export declare const THREAD_WORDS: {
15
+ readonly opening: "Opening your conversation…";
16
+ readonly notOpened: (detail: string) => string;
17
+ };
18
+ /**
19
+ * A session's conversation as a person reads it, from the AG-UI messages the
20
+ * runtime says (`GET …/sessions/{uid}/messages`, a `MESSAGES_SNAPSHOT`): what
21
+ * was said and answered, in words. A turn a personal agent asked is shown
22
+ * without what the runtime told the application before the person's words
23
+ * (`askedOf`, decided 2026-10-14). What its messages showed comes on the
24
+ * conversation's ui socket (REACTOR_UI RU-W), never here: a `reactor.ui`
25
+ * activity in a thread is refused.
26
+ */
27
+ export declare function messagesOfThread(messages: unknown): ChatMessage[];
28
+ /** The AG-UI messages a session-API stream's `MESSAGES_SNAPSHOT` carries, if one does. */
29
+ export declare function snapshotOfStream(text: string): unknown[] | undefined;
30
+ /**
31
+ * A thread's conversation, read from the runtime its application runs on:
32
+ * held there, or resumed from its record. Throws the runtime's sentence when
33
+ * neither answers.
34
+ */
35
+ export declare function openThread({ agentBaseUrl, agentId, uid, token, fetcher, }: {
36
+ agentBaseUrl: string;
37
+ agentId: string;
38
+ uid: string;
39
+ token?: string | null;
40
+ fetcher?: typeof fetch;
41
+ }): Promise<ChatMessage[]>;
@@ -0,0 +1,102 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ import { eventsOfStream, REACTOR_UI_NAME } from './agui';
6
+ import { askedOf } from './records';
7
+ /** What opening a thread says, in a person's words. */
8
+ export const THREAD_WORDS = {
9
+ opening: 'Opening your conversation…',
10
+ notOpened: (detail) => `Your conversation could not be opened, so this is a new one: ${detail}`,
11
+ };
12
+ /**
13
+ * A session's conversation as a person reads it, from the AG-UI messages the
14
+ * runtime says (`GET …/sessions/{uid}/messages`, a `MESSAGES_SNAPSHOT`): what
15
+ * was said and answered, in words. A turn a personal agent asked is shown
16
+ * without what the runtime told the application before the person's words
17
+ * (`askedOf`, decided 2026-10-14). What its messages showed comes on the
18
+ * conversation's ui socket (REACTOR_UI RU-W), never here: a `reactor.ui`
19
+ * activity in a thread is refused.
20
+ */
21
+ export function messagesOfThread(messages) {
22
+ if (!Array.isArray(messages)) {
23
+ return [];
24
+ }
25
+ const drawn = [];
26
+ for (const message of messages) {
27
+ if (!message || typeof message !== 'object') {
28
+ continue;
29
+ }
30
+ const { id, role, content, activityType } = message;
31
+ if (role === 'activity' && activityType === REACTOR_UI_NAME) {
32
+ throw new Error(`Activity ${String(id)}: what a message showed comes on the ui socket (REACTOR_UI RU-W)`);
33
+ }
34
+ if ((role === 'user' || role === 'assistant') &&
35
+ typeof id === 'string' &&
36
+ typeof content === 'string' &&
37
+ content.trim()) {
38
+ drawn.push({
39
+ id,
40
+ role,
41
+ content: role === 'user' ? askedOf(content) : content,
42
+ createdAt: new Date(),
43
+ });
44
+ }
45
+ }
46
+ return drawn;
47
+ }
48
+ /** The AG-UI messages a session-API stream's `MESSAGES_SNAPSHOT` carries, if one does. */
49
+ export function snapshotOfStream(text) {
50
+ let found;
51
+ for (const event of eventsOfStream(text)) {
52
+ if (event.type === 'MESSAGES_SNAPSHOT' && Array.isArray(event.messages)) {
53
+ found = event.messages;
54
+ }
55
+ }
56
+ return found;
57
+ }
58
+ async function detailOf(response) {
59
+ try {
60
+ const body = (await response.json());
61
+ if (typeof body.detail === 'string' && body.detail) {
62
+ return body.detail;
63
+ }
64
+ }
65
+ catch {
66
+ // No sentence: the status says it.
67
+ }
68
+ return `${response.status}`;
69
+ }
70
+ /**
71
+ * A thread's conversation, read from the runtime its application runs on:
72
+ * held there, or resumed from its record. Throws the runtime's sentence when
73
+ * neither answers.
74
+ */
75
+ export async function openThread({ agentBaseUrl, agentId, uid, token, fetcher = fetch, }) {
76
+ const base = `${agentBaseUrl.replace(/\/+$/, '')}/api/v1/apps/sessions/${encodeURIComponent(uid)}`;
77
+ const authorization = token
78
+ ? { Authorization: `Bearer ${token}` }
79
+ : {};
80
+ const held = await fetcher(`${base}/messages`, { headers: authorization });
81
+ if (held.ok) {
82
+ const body = (await held.json());
83
+ return messagesOfThread(body.messages);
84
+ }
85
+ if (held.status !== 404) {
86
+ throw new Error(await detailOf(held));
87
+ }
88
+ // Not held here: resumed from its record, under the same uid.
89
+ const resumed = await fetcher(`${base}/resume`, {
90
+ method: 'POST',
91
+ headers: { 'Content-Type': 'application/json', ...authorization },
92
+ body: JSON.stringify({ agent: agentId }),
93
+ });
94
+ if (!resumed.ok) {
95
+ throw new Error(await detailOf(resumed));
96
+ }
97
+ const snapshot = snapshotOfStream(await resumed.text());
98
+ if (!snapshot) {
99
+ throw new Error(`The runtime said nothing of session ${uid}.`);
100
+ }
101
+ return messagesOfThread(snapshot);
102
+ }
@@ -7,8 +7,6 @@ import type { ProtocolAdapterConfig } from '../types';
7
7
  import type { ChatMessage } from '../types/messages';
8
8
  import type { ToolDefinition, ToolExecutionResult } from '../types/tools';
9
9
  import { BaseProtocolAdapter } from './BaseProtocolAdapter';
10
- /** What the page says when a run's stream closes before the run said how it ended. */
11
- export declare const RUN_CUT_SHORT = "The run stopped before it finished, without an answer or an error: send it again.";
12
10
  /**
13
11
  * AG-UI specific configuration
14
12
  */
@@ -3,11 +3,9 @@
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
5
  import { generateMessageId, createAssistantMessage } from '../types/messages';
6
- import { agUiRefusal, refusalBody } from './agUiRefusal';
6
+ import { agUiRefusal, refusalBody } from '../portable/agUiRefusal';
7
+ import { AgUiFrames, endsRun, REACTOR_UI_NAME, RUN_CUT_SHORT, toolResultOf, UI_ON_RUN, } from '../portable/agui';
7
8
  import { BaseProtocolAdapter } from './BaseProtocolAdapter';
8
- import { AGUI_NAME } from '@datalayer/reactor/ui';
9
- /** What the page says when a run's stream closes before the run said how it ended. */
10
- export const RUN_CUT_SHORT = 'The run stopped before it finished, without an answer or an error: send it again.';
11
9
  /**
12
10
  * AG-UI protocol adapter
13
11
  * Uses HTTP POST with SSE streaming for responses
@@ -434,7 +432,8 @@ export class AGUIAdapter extends BaseProtocolAdapter {
434
432
  throw new Error('Response body is not readable');
435
433
  }
436
434
  const decoder = new TextDecoder();
437
- let buffer = '';
435
+ // The stream's frames, read as every client reads them (portable/agui).
436
+ const frames = new AgUiFrames(data => console.warn('[AGUIAdapter] Failed to parse event data:', data));
438
437
  // Always start fresh — each turn gets its own message bubble.
439
438
  // Continuations will naturally appear AFTER the tool calls in the
440
439
  // display because they create a new message that is appended at the
@@ -459,56 +458,41 @@ export class AGUIAdapter extends BaseProtocolAdapter {
459
458
  // or the network — and the page says so instead of waiting for an answer
460
459
  // that is not coming (a Preview gave no answer for minutes, 2026-10-12).
461
460
  let ended = false;
461
+ const handle = (events) => {
462
+ for (const event of events) {
463
+ if (endsRun(event)) {
464
+ ended = true;
465
+ }
466
+ this.handleAGUIEvent(event, {
467
+ getCurrentMessageId: () => currentMessageId,
468
+ setCurrentMessageId: id => {
469
+ currentMessageId = id;
470
+ },
471
+ getCurrentContent: () => currentContent,
472
+ appendContent: content => {
473
+ currentContent += content;
474
+ },
475
+ resetContent: () => {
476
+ currentContent = '';
477
+ },
478
+ appendTurnContent: content => {
479
+ currentTurnContent += content;
480
+ },
481
+ getCurrentTurnContent: () => currentTurnContent,
482
+ });
483
+ }
484
+ };
462
485
  try {
463
486
  while (true) {
464
487
  const { done, value } = await reader.read();
465
488
  if (done) {
489
+ handle(frames.end());
466
490
  if (!ended) {
467
491
  throw new Error(RUN_CUT_SHORT);
468
492
  }
469
493
  break;
470
494
  }
471
- buffer += decoder.decode(value, { stream: true });
472
- const lines = buffer.split('\n');
473
- buffer = lines.pop() || '';
474
- for (const line of lines) {
475
- if (line.startsWith('event: ')) {
476
- // Event type (currently unused)
477
- // const eventType = line.slice(7);
478
- // Handle event type if needed
479
- }
480
- else if (line.startsWith('data: ')) {
481
- const data = line.slice(6);
482
- try {
483
- const event = JSON.parse(data);
484
- const kind = event.type;
485
- if (kind === 'RUN_FINISHED' || kind === 'RUN_ERROR') {
486
- ended = true;
487
- }
488
- this.handleAGUIEvent(event, {
489
- getCurrentMessageId: () => currentMessageId,
490
- setCurrentMessageId: id => {
491
- currentMessageId = id;
492
- },
493
- getCurrentContent: () => currentContent,
494
- appendContent: content => {
495
- currentContent += content;
496
- },
497
- resetContent: () => {
498
- currentContent = '';
499
- },
500
- appendTurnContent: content => {
501
- currentTurnContent += content;
502
- },
503
- getCurrentTurnContent: () => currentTurnContent,
504
- });
505
- }
506
- catch (e) {
507
- // Non-JSON data, might be raw content
508
- console.warn('[AGUIAdapter] Failed to parse event data:', e);
509
- }
510
- }
511
- }
495
+ handle(frames.push(decoder.decode(value, { stream: true })));
512
496
  }
513
497
  }
514
498
  finally {
@@ -531,7 +515,7 @@ export class AGUIAdapter extends BaseProtocolAdapter {
531
515
  refuseUiOnRun() {
532
516
  this.emit({
533
517
  type: 'error',
534
- error: new Error('A reactor.ui op came on the run stream: it comes over the ui socket (REACTOR_UI RU-W).'),
518
+ error: new Error(UI_ON_RUN),
535
519
  timestamp: new Date(),
536
520
  });
537
521
  }
@@ -678,36 +662,17 @@ export class AGUIAdapter extends BaseProtocolAdapter {
678
662
  // Tool execution result with actual output
679
663
  // AG-UI uses camelCase (toolCallId)
680
664
  const toolCallId = event.toolCallId || event.tool_call_id;
681
- let content = event.content;
682
- // Parse JSON content if it's a string
683
- if (typeof content === 'string') {
684
- try {
685
- content = JSON.parse(content);
686
- }
687
- catch {
688
- // Keep as string if not valid JSON
689
- }
690
- }
691
665
  if (toolCallId) {
692
- // Check for execution errors in the result
693
- // ExecutionResult format: { execution_ok, execution_error, code_error, ... }
694
- const contentObj = content;
695
- const isError = contentObj?.execution_ok === false ||
696
- contentObj?.code_error != null ||
697
- (contentObj?.error != null && !contentObj?.success);
698
- const errorMessage = contentObj?.execution_error ||
699
- contentObj?.error ||
700
- (contentObj?.code_error
701
- ? `${contentObj.code_error?.name || 'Error'}: ${contentObj.code_error?.value || ''}`
702
- : undefined);
703
- // Emit tool result event with the actual content
666
+ // Read as every client reads it (portable/agui): JSON when it is,
667
+ // failed when the execution result says so.
668
+ const said = toolResultOf(event.content);
704
669
  this.emit({
705
670
  type: 'tool-result',
706
671
  toolResult: {
707
672
  toolCallId,
708
- success: !isError,
709
- result: content,
710
- error: isError ? errorMessage : undefined,
673
+ success: said.success,
674
+ result: said.result,
675
+ error: said.error,
711
676
  },
712
677
  timestamp: new Date(),
713
678
  });
@@ -741,14 +706,14 @@ export class AGUIAdapter extends BaseProtocolAdapter {
741
706
  // `reactor.ui` ops come over the conversation's ui socket, never
742
707
  // the run stream (REACTOR_UI RU-W): one here is refused. Any other
743
708
  // activity is nobody's here.
744
- if (event.activityType === AGUI_NAME) {
709
+ if (event.activityType === REACTOR_UI_NAME) {
745
710
  this.refuseUiOnRun();
746
711
  }
747
712
  break;
748
713
  }
749
714
  case 'CUSTOM': {
750
715
  const name = event.name;
751
- if (name === AGUI_NAME) {
716
+ if (name === REACTOR_UI_NAME) {
752
717
  this.refuseUiOnRun();
753
718
  break;
754
719
  }
@@ -4,7 +4,10 @@
4
4
  * whose composer is a plugin of its own). What the box held when the
5
5
  * microphone opened stays; the words heard go after it as they come, and the
6
6
  * whole of what was heard replaces them once it stops. Put there for the
7
- * person to edit and send — or sent at once with *Send what I say*.
7
+ * person to edit and send — or sent at once with *Send what I say*. While
8
+ * the words are still being heard the host is told (`onInterimChange`), to
9
+ * grey them until they are final (VO-11). Beside the microphone, the
10
+ * person's voice menu (`VoiceMenu`, VO-30).
8
11
  *
9
12
  * @module voice/ComposerVoice
10
13
  */
@@ -26,8 +29,18 @@ export interface ComposerVoiceProps {
26
29
  speaking?: boolean;
27
30
  /** Stops the agent's voice, also when the microphone opens (VO-13). */
28
31
  onStopSpeaking?: () => void;
32
+ /**
33
+ * The words in the box are still being heard (`true`), or final
34
+ * (`false`): the host greys them until they are (VO-11).
35
+ */
36
+ onInterimChange?: (interim: boolean) => void;
37
+ /**
38
+ * The application lets its answers be heard: the voice menu offers when,
39
+ * the voice, its speed and loudness (VO-21, VO-25, VO-30).
40
+ */
41
+ answers?: boolean;
29
42
  }
30
43
  /** Whether something rides on a run as a spoken message's metadata (VO-27). */
31
44
  export declare function spokenOf(value: unknown): SpokenMetadata | undefined;
32
- export declare function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled, speaking, onStopSpeaking, }: ComposerVoiceProps): JSX.Element | null;
45
+ export declare function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled, speaking, onStopSpeaking, onInterimChange, answers, }: ComposerVoiceProps): JSX.Element | null;
33
46
  export default ComposerVoice;
@@ -1,7 +1,8 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, useRef } from 'react';
3
3
  import { DeviceHearing } from './hearing';
4
4
  import { VoiceInput } from './VoiceInput';
5
+ import { VoiceMenu } from './VoiceMenu';
5
6
  /** Whether something rides on a run as a spoken message's metadata (VO-27). */
6
7
  export function spokenOf(value) {
7
8
  const said = value;
@@ -12,7 +13,7 @@ export function spokenOf(value) {
12
13
  ? said
13
14
  : undefined;
14
15
  }
15
- export function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled = false, speaking = false, onStopSpeaking, }) {
16
+ export function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled = false, speaking = false, onStopSpeaking, onInterimChange, answers = false, }) {
16
17
  const hearing = useMemo(() => voice.input !== 'off'
17
18
  ? new DeviceHearing(voice.modelsUrl, voice.engines)
18
19
  : undefined, [voice.input, voice.modelsUrl, voice.engines]);
@@ -22,20 +23,25 @@ export function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled
22
23
  if (!hearing) {
23
24
  return null;
24
25
  }
25
- return (_jsx(VoiceInput, { hearing: hearing, language: voice.language, consentKey: voice.consentKey ?? 'chat', silenceMs: voice.silenceMs, microphoneId: voice.microphoneId, disabled: disabled, speaking: speaking, onStopSpeaking: onStopSpeaking, onListen: () => {
26
- base.current = input.trim();
27
- onStopSpeaking?.();
28
- },
29
- // The words as they are heard, in the box (VO-11); '' gives it back.
30
- onInterim: (words) => setInput(afterBase(words)), onTranscript: (transcript) => {
31
- if (voice.sendWhatISay) {
32
- setInput(base.current);
33
- send(transcript.text, transcript.metadata);
34
- return;
35
- }
36
- // In the box, for the person to edit and send: never sent here.
37
- onSpoken(transcript.metadata);
38
- setInput(afterBase(transcript.text));
39
- } }));
26
+ return (_jsxs("span", { "data-composer-voice": "", style: { display: 'inline-flex', alignItems: 'center', gap: 2 }, children: [_jsx(VoiceMenu, { voice: voice, answers: answers, disabled: disabled }), _jsx(VoiceInput, { hearing: hearing, language: voice.language, consentKey: voice.consentKey ?? 'chat', silenceMs: voice.silenceMs, microphoneId: voice.microphoneId, disabled: disabled, speaking: speaking, onStopSpeaking: onStopSpeaking, onListen: () => {
27
+ base.current = input.trim();
28
+ onStopSpeaking?.();
29
+ },
30
+ // The words as they are heard, in the box (VO-11), greyed until
31
+ // final; '' gives it back.
32
+ onInterim: (words) => {
33
+ setInput(afterBase(words));
34
+ onInterimChange?.(words !== '');
35
+ }, onTranscript: (transcript) => {
36
+ onInterimChange?.(false);
37
+ if (voice.sendWhatISay) {
38
+ setInput(base.current);
39
+ send(transcript.text, transcript.metadata);
40
+ return;
41
+ }
42
+ // In the box, for the person to edit and send: never sent here.
43
+ onSpoken(transcript.metadata);
44
+ setInput(afterBase(transcript.text));
45
+ } })] }));
40
46
  }
41
47
  export default ComposerVoice;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The composer's voice menu (VOICE.md VO-14, VO-21, VO-25, VO-30): beside
3
+ * the microphone, what a person chooses for themselves — the language they
4
+ * speak and hear, when answers are heard, the voice, its speed and loudness,
5
+ * *Send what I say*, the microphone, and *Keep speech on this device*. Each
6
+ * choice is kept in the person's settings and heard at once by every chat
7
+ * on the page; *Use the application's* forgets them all.
8
+ *
9
+ * When answers are heard is offered only where the application lets them be
10
+ * heard: a menu may not turn on what the application turned off.
11
+ *
12
+ * @module voice/VoiceMenu
13
+ */
14
+ import type { JSX } from 'react';
15
+ import type { SettledVoice } from './chatVoice';
16
+ export interface VoiceMenuProps {
17
+ /** The chat's voice as it is heard now (`settledVoice`). */
18
+ voice: SettledVoice;
19
+ /**
20
+ * The application lets its answers be heard (its own `output` is not
21
+ * `off`, and it names the speech service): the menu offers when.
22
+ */
23
+ answers: boolean;
24
+ disabled?: boolean;
25
+ }
26
+ export declare function VoiceMenu({ voice, answers, disabled, }: VoiceMenuProps): JSX.Element;
27
+ export default VoiceMenu;
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { ActionList, ActionMenu, IconButton } from '@primer/react';
4
+ import { GearIcon } from '@primer/octicons-react';
5
+ import { OUTPUT_CHOICES, RATE_CHOICES, VOLUME_CHOICES, catalogueVoiceSpeaks, voiceLanguages, voicesSpeaking, } from './choices';
6
+ import { withVoiceSetting } from './settings';
7
+ import { useVoiceSettings } from './useVoiceSettings';
8
+ /** The microphones the browser lists; named only once one was allowed. */
9
+ async function microphones() {
10
+ try {
11
+ const devices = await navigator.mediaDevices.enumerateDevices();
12
+ return devices.filter(device => device.kind === 'audioinput');
13
+ }
14
+ catch {
15
+ return [];
16
+ }
17
+ }
18
+ export function VoiceMenu({ voice, answers, disabled = false, }) {
19
+ const [settings, keep] = useVoiceSettings();
20
+ const [devices, setDevices] = useState([]);
21
+ const choose = (key, value) => keep(withVoiceSetting(settings, key, value, catalogueVoiceSpeaks));
22
+ const onDevice = Boolean(settings.onDeviceOnly);
23
+ const voices = voicesSpeaking(voice.language);
24
+ const named = devices.filter(device => device.label);
25
+ return (_jsxs(ActionMenu, { onOpenChange: open => {
26
+ if (open) {
27
+ void microphones().then(setDevices);
28
+ }
29
+ }, children: [_jsx(ActionMenu.Anchor, { children: _jsx(IconButton, { icon: GearIcon, size: "small", variant: "invisible", "aria-label": "Voice settings", "data-voice-menu": "", disabled: disabled }) }), _jsx(ActionMenu.Overlay, { width: "medium", children: _jsxs(ActionList, { children: [_jsxs(ActionList.Group, { selectionVariant: "single", children: [_jsx(ActionList.GroupHeading, { children: "Language" }), voiceLanguages().map(language => (_jsx(ActionList.Item, { selected: language.value === voice.language, onSelect: () => choose('language', language.value), "data-voice-language": language.value, children: language.label }, language.value)))] }), answers && !onDevice ? (_jsxs(_Fragment, { children: [_jsx(ActionList.Divider, {}), _jsxs(ActionList.Group, { selectionVariant: "single", children: [_jsx(ActionList.GroupHeading, { children: "Answers heard" }), OUTPUT_CHOICES.map(output => (_jsx(ActionList.Item, { selected: output.value === voice.output, onSelect: () => choose('output', output.value), "data-voice-output": output.value, children: output.label }, output.value)))] }), voices.length > 0 ? (_jsxs(ActionList.Group, { selectionVariant: "single", children: [_jsx(ActionList.GroupHeading, { children: "Voice" }), voices.map(spoken => (_jsx(ActionList.Item, { selected: spoken.id === voice.voice, onSelect: () => choose('voice', spoken.id), "data-voice-voice": spoken.id, children: spoken.name }, spoken.id)))] })) : null, _jsxs(ActionList.Group, { selectionVariant: "single", children: [_jsx(ActionList.GroupHeading, { children: "Speed" }), RATE_CHOICES.map(rate => (_jsx(ActionList.Item, { selected: rate.value === (voice.rate ?? 1), onSelect: () => choose('rate', rate.value), "data-voice-rate": rate.value, children: rate.label }, rate.value)))] }), _jsxs(ActionList.Group, { selectionVariant: "single", children: [_jsx(ActionList.GroupHeading, { children: "Loudness" }), VOLUME_CHOICES.map(volume => (_jsx(ActionList.Item, { selected: volume.value === (voice.volume ?? 1), onSelect: () => choose('volume', volume.value), "data-voice-volume": volume.value, children: volume.label }, volume.value)))] })] })) : null, named.length > 1 ? (_jsxs(_Fragment, { children: [_jsx(ActionList.Divider, {}), _jsxs(ActionList.Group, { selectionVariant: "single", children: [_jsx(ActionList.GroupHeading, { children: "Microphone" }), named.map(device => (_jsx(ActionList.Item, { selected: device.deviceId ===
30
+ (voice.microphoneId ?? named[0].deviceId), onSelect: () => choose('microphoneId', device.deviceId), "data-voice-microphone": device.deviceId, children: device.label }, device.deviceId)))] })] })) : null, _jsx(ActionList.Divider, {}), _jsxs(ActionList.Group, { selectionVariant: "multiple", children: [_jsxs(ActionList.Item, { selected: Boolean(voice.sendWhatISay), onSelect: () => choose('sendWhatISay', !voice.sendWhatISay), "data-voice-send-what-i-say": "", children: ["Send what I say", _jsx(ActionList.Description, { variant: "block", children: "Sent as soon as it is heard, not left in the box." })] }), _jsxs(ActionList.Item, { selected: onDevice, onSelect: () => choose('onDeviceOnly', !onDevice), "data-voice-on-device": "", children: ["Keep speech on this device", _jsx(ActionList.Description, { variant: "block", children: "Nothing is sent to Datalayer\u2019s speech service: you are heard in the browser, answers are not spoken." })] })] }), Object.keys(settings).length > 0 ? (_jsxs(_Fragment, { children: [_jsx(ActionList.Divider, {}), _jsx(ActionList.Item, { onSelect: () => keep({}), "data-voice-settings-reset": "", children: "Use the application\u2019s" })] })) : null] }) })] }));
31
+ }
32
+ export default VoiceMenu;
@@ -11,7 +11,7 @@
11
11
  * @module voice/chatVoice
12
12
  */
13
13
  import { voiceFor } from '../specs/voices';
14
- import { keptVoiceSettings, voiceForPerson, } from './settings';
14
+ import { heldVoiceSettings, voiceForPerson, } from './settings';
15
15
  /**
16
16
  * Datalayer's origin for the browser's speech models, as pinned
17
17
  * (`s3://datalayer-models-speech` behind its CDN; VO-48, VO-49): each model
@@ -88,7 +88,7 @@ export const SILENCE_MS = 1500;
88
88
  * Datalayer's models and packages, a silence of 1.5 s. Answers heard need
89
89
  * the speech service's address: refused without.
90
90
  */
91
- export function settledVoice(given, person = keptVoiceSettings()) {
91
+ export function settledVoice(given, person = heldVoiceSettings()) {
92
92
  const voice = voiceForPerson(given, person);
93
93
  const output = voice.output ?? 'off';
94
94
  if (output !== 'off' && !voice.speechUrl) {