@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
@@ -1,13 +1,3 @@
1
- /**
2
- * The record of an application (LOOP R-07), as ai-agents keeps it: what it
3
- * did, session by session, written by the runtime it ran on — read here for
4
- * its activity feed (R-01b, R-15): the sessions, newest first, and what each
5
- * one did, step by step.
6
- *
7
- * Pure but for `fetch`: no React.
8
- *
9
- * @module apps/apps/records
10
- */
11
1
  /** What a record entry is. */
12
2
  export type RecordKind = 'session' | 'tool_call' | 'decision' | 'check' | 'approval' | 'output' | 'feedback'
13
3
  /** A turn of a conversation: what was asked, what it answered. */
@@ -38,29 +28,10 @@ export type RecordsContext = {
38
28
  export declare const RECORD_KIND_WORDS: Record<RecordKind, string>;
39
29
  /** An entry as ai-agents answers with it. */
40
30
  export declare function entryOf(raw: Record<string, unknown>): RecordEntry;
41
- /**
42
- * How a run ended, in the `output` entry every run ends with, kept whatever
43
- * the application's `record.include` says (PAP_DATALAYER R-01): its words
44
- * only when it keeps `outputs`.
45
- */
46
- export declare const RUN_END_WORDS: Record<string, string>;
47
31
  /** How the run an entry ends ended: `answered`, `stopped`, `gone`; `''` for any other entry. */
48
32
  export declare function runEndOf(entry: RecordEntry): string;
49
33
  /** An entry in words: its summary, or how its run ended when its words are not kept. */
50
34
  export declare function entrySaid(entry: RecordEntry): string;
51
- /**
52
- * The mark around what the runtime tells an application of a turn a personal
53
- * agent asked over PAP or PACT, before the request (`asked_for_said`,
54
- * `ASKED_FOR_TAG` in agent_runtimes.loop.apps.pap_company).
55
- */
56
- export declare const ASKED_FOR_TAG = "asked-for";
57
- /**
58
- * What a person asked, as they are shown it: without what the runtime told
59
- * the application before their words (PAP_DATALAYER, decided 2026-10-14).
60
- * The record keeps it for the application's builder; the person never wrote
61
- * it, so *Your conversations* and a thread opened again leave it out.
62
- */
63
- export declare function askedOf(text: string): string;
64
35
  /** A session in a sentence: how many calls, what stopped it, how it ended. */
65
36
  export declare function sessionSentence(entries: readonly RecordEntry[]): string;
66
37
  /**
@@ -2,6 +2,17 @@
2
2
  * Copyright (c) 2025-2026 Datalayer, Inc.
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
+ /**
6
+ * The record of an application (LOOP R-07), as ai-agents keeps it: what it
7
+ * did, session by session, written by the runtime it ran on — read here for
8
+ * its activity feed (R-01b, R-15): the sessions, newest first, and what each
9
+ * one did, step by step.
10
+ *
11
+ * Pure but for `fetch`: no React.
12
+ *
13
+ * @module apps/apps/records
14
+ */
15
+ import { RUN_END_WORDS } from '../../portable/records';
5
16
  /** Each kind in a word, as the feed labels it. */
6
17
  export const RECORD_KIND_WORDS = {
7
18
  session: 'Session',
@@ -30,16 +41,6 @@ export function entryOf(raw) {
30
41
  createdAt: String(raw.created_at ?? ''),
31
42
  };
32
43
  }
33
- /**
34
- * How a run ended, in the `output` entry every run ends with, kept whatever
35
- * the application's `record.include` says (PAP_DATALAYER R-01): its words
36
- * only when it keeps `outputs`.
37
- */
38
- export const RUN_END_WORDS = {
39
- answered: 'Answered',
40
- stopped: 'Stopped',
41
- gone: 'Its client went before the answer',
42
- };
43
44
  /** How the run an entry ends ended: `answered`, `stopped`, `gone`; `''` for any other entry. */
44
45
  export function runEndOf(entry) {
45
46
  const status = entry.kind === 'output' ? entry.payload.status : undefined;
@@ -49,30 +50,6 @@ export function runEndOf(entry) {
49
50
  export function entrySaid(entry) {
50
51
  return entry.summary || RUN_END_WORDS[runEndOf(entry)] || '';
51
52
  }
52
- /**
53
- * The mark around what the runtime tells an application of a turn a personal
54
- * agent asked over PAP or PACT, before the request (`asked_for_said`,
55
- * `ASKED_FOR_TAG` in agent_runtimes.loop.apps.pap_company).
56
- */
57
- export const ASKED_FOR_TAG = 'asked-for';
58
- /**
59
- * What a person asked, as they are shown it: without what the runtime told
60
- * the application before their words (PAP_DATALAYER, decided 2026-10-14).
61
- * The record keeps it for the application's builder; the person never wrote
62
- * it, so *Your conversations* and a thread opened again leave it out.
63
- */
64
- export function askedOf(text) {
65
- const open = `<${ASKED_FOR_TAG}>`;
66
- const close = `</${ASKED_FOR_TAG}>`;
67
- if (!text.startsWith(open)) {
68
- return text;
69
- }
70
- const end = text.indexOf(close);
71
- if (end < 0) {
72
- throw new Error(`What was asked opens <${ASKED_FOR_TAG}> and never closes it.`);
73
- }
74
- return text.slice(end + close.length).trimStart();
75
- }
76
53
  /** A session in a sentence: how many calls, what stopped it, how it ended. */
77
54
  export function sessionSentence(entries) {
78
55
  const calls = entries.filter(entry => entry.kind === 'tool_call').length;
@@ -9,17 +9,12 @@
9
9
  * stream's `MESSAGES_SNAPSHOT` says what it holds — and the chat draws it
10
10
  * and goes on with it on the same thread.
11
11
  *
12
- * Pure: the network is the `fetch` it is handed.
12
+ * Opening it is `openThread` (`portable/thread`), as every client opens one;
13
+ * here is what a deployment's chat decides of the thread it opens on.
13
14
  *
14
15
  * @module apps/apps/threads
15
16
  */
16
17
  import type { ResumedThread } from '../../types/chat';
17
- import type { ChatMessage } from '../../types/messages';
18
- /** What opening a thread says, in a person's words. */
19
- export declare const THREAD_WORDS: {
20
- readonly opening: "Opening your conversation…";
21
- readonly notOpened: (detail: string) => string;
22
- };
23
18
  /**
24
19
  * The deployment an application's agent is created for, as its create
25
20
  * payload names it (`app_instance.deployment_uid`, `appDatalayerCreatePayload`),
@@ -39,17 +34,3 @@ export declare function deploymentOfPayload(createPayload: Record<string, unknow
39
34
  * no deployment, keeps what it was given.
40
35
  */
41
36
  export declare function threadOfVisit(given: ResumedThread | undefined, deploymentUid: string, id: string): ResumedThread | undefined;
42
- /** The AG-UI messages a session-API stream's `MESSAGES_SNAPSHOT` carries, if one does. */
43
- export declare function snapshotOfStream(text: string): unknown[] | undefined;
44
- /**
45
- * A thread's conversation, read from the runtime its application runs on:
46
- * held there, or resumed from its record. Throws the runtime's sentence when
47
- * neither answers.
48
- */
49
- export declare function openThread({ agentBaseUrl, agentId, uid, token, fetcher, }: {
50
- agentBaseUrl: string;
51
- agentId: string;
52
- uid: string;
53
- token?: string | null;
54
- fetcher?: typeof fetch;
55
- }): Promise<ChatMessage[]>;
@@ -2,12 +2,6 @@
2
2
  * Copyright (c) 2025-2026 Datalayer, Inc.
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
- import { messagesOfThread } from '../embed/embedSession';
6
- /** What opening a thread says, in a person's words. */
7
- export const THREAD_WORDS = {
8
- opening: 'Opening your conversation…',
9
- notOpened: (detail) => `Your conversation could not be opened, so this is a new one: ${detail}`,
10
- };
11
5
  /**
12
6
  * The deployment an application's agent is created for, as its create
13
7
  * payload names it (`app_instance.deployment_uid`, `appDatalayerCreatePayload`),
@@ -39,72 +33,3 @@ export function threadOfVisit(given, deploymentUid, id) {
39
33
  }
40
34
  return { id, messages: [] };
41
35
  }
42
- /** The AG-UI messages a session-API stream's `MESSAGES_SNAPSHOT` carries, if one does. */
43
- export function snapshotOfStream(text) {
44
- let found;
45
- for (const block of text.split(/\r?\n\r?\n/)) {
46
- const data = block
47
- .split(/\r?\n/)
48
- .filter(line => line.startsWith('data:'))
49
- .map(line => line.slice('data:'.length).trim())
50
- .join('');
51
- if (!data) {
52
- continue;
53
- }
54
- try {
55
- const event = JSON.parse(data);
56
- if (event.type === 'MESSAGES_SNAPSHOT' && Array.isArray(event.messages)) {
57
- found = event.messages;
58
- }
59
- }
60
- catch {
61
- // Not an event: skipped.
62
- }
63
- }
64
- return found;
65
- }
66
- async function detailOf(response) {
67
- try {
68
- const body = (await response.json());
69
- if (typeof body.detail === 'string' && body.detail) {
70
- return body.detail;
71
- }
72
- }
73
- catch {
74
- // No sentence: the status says it.
75
- }
76
- return `${response.status}`;
77
- }
78
- /**
79
- * A thread's conversation, read from the runtime its application runs on:
80
- * held there, or resumed from its record. Throws the runtime's sentence when
81
- * neither answers.
82
- */
83
- export async function openThread({ agentBaseUrl, agentId, uid, token, fetcher = fetch, }) {
84
- const base = `${agentBaseUrl.replace(/\/+$/, '')}/api/v1/apps/sessions/${encodeURIComponent(uid)}`;
85
- const authorization = token
86
- ? { Authorization: `Bearer ${token}` }
87
- : {};
88
- const held = await fetcher(`${base}/messages`, { headers: authorization });
89
- if (held.ok) {
90
- const body = (await held.json());
91
- return messagesOfThread(body.messages);
92
- }
93
- if (held.status !== 404) {
94
- throw new Error(await detailOf(held));
95
- }
96
- // Not held here: resumed from its record, under the same uid.
97
- const resumed = await fetcher(`${base}/resume`, {
98
- method: 'POST',
99
- headers: { 'Content-Type': 'application/json', ...authorization },
100
- body: JSON.stringify({ agent: agentId }),
101
- });
102
- if (!resumed.ok) {
103
- throw new Error(await detailOf(resumed));
104
- }
105
- const snapshot = snapshotOfStream(await resumed.text());
106
- if (!snapshot) {
107
- throw new Error(`The runtime said nothing of session ${uid}.`);
108
- }
109
- return messagesOfThread(snapshot);
110
- }
@@ -48,14 +48,6 @@ export declare function sessionKeeper({ persist, storage, }: {
48
48
  }): SessionKeeper;
49
49
  /** Forget what this page holds in memory (a test). */
50
50
  export declare function forgetSessionsInMemory(): void;
51
- /**
52
- * A session's conversation as the chat draws it, from the AG-UI messages
53
- * the runtime says (`GET …/sessions/{uid}/messages`): what was said and
54
- * answered, in words. What its messages showed comes on the conversation's
55
- * ui socket once the chat opens it (REACTOR_UI RU-W), never here: a
56
- * `reactor.ui` activity in a thread is refused.
57
- */
58
- export declare function messagesOfThread(messages: unknown): ChatMessage[];
59
51
  /** What asking for a kept session found. */
60
52
  export type Reattached = {
61
53
  kind: 'resumed';
@@ -3,8 +3,7 @@
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
5
  import { windowTurnErrorOf } from '../../chat/base/loopWindow';
6
- import { AGUI_NAME } from '@datalayer/reactor/ui';
7
- import { askedOf } from '../apps/records';
6
+ import { messagesOfThread } from '../../portable/thread';
8
7
  /** Where a visit's session is kept in the host's storage: `<prefix>:<app>:<visit>`. */
9
8
  export const EMBED_SESSION_KEY_PREFIX = 'datalayer-app:session';
10
9
  /**
@@ -92,42 +91,6 @@ export function sessionKeeper({ persist, storage = hostStorage, }) {
92
91
  export function forgetSessionsInMemory() {
93
92
  IN_MEMORY.clear();
94
93
  }
95
- /**
96
- * A session's conversation as the chat draws it, from the AG-UI messages
97
- * the runtime says (`GET …/sessions/{uid}/messages`): what was said and
98
- * answered, in words. What its messages showed comes on the conversation's
99
- * ui socket once the chat opens it (REACTOR_UI RU-W), never here: a
100
- * `reactor.ui` activity in a thread is refused.
101
- */
102
- export function messagesOfThread(messages) {
103
- if (!Array.isArray(messages)) {
104
- return [];
105
- }
106
- const drawn = [];
107
- for (const message of messages) {
108
- if (!message || typeof message !== 'object') {
109
- continue;
110
- }
111
- const { id, role, content, activityType } = message;
112
- if (role === 'activity' && activityType === AGUI_NAME) {
113
- throw new Error(`Activity ${String(id)}: what a message showed comes on the ui socket (REACTOR_UI RU-W)`);
114
- }
115
- if ((role === 'user' || role === 'assistant') &&
116
- typeof id === 'string' &&
117
- typeof content === 'string' &&
118
- content.trim()) {
119
- // A turn a personal agent asked: what the runtime told the application
120
- // before the person's words is never shown to them (decided 2026-10-14).
121
- drawn.push({
122
- id,
123
- role,
124
- content: role === 'user' ? askedOf(content) : content,
125
- createdAt: new Date(),
126
- });
127
- }
128
- }
129
- return drawn;
130
- }
131
94
  /**
132
95
  * Ask the server that runs the application for a session's conversation,
133
96
  * with the visit's token. Anything but an answer — a session the runtime
@@ -13,7 +13,9 @@
13
13
  * `GET /apps/deployments/at/<slug>` without a token says what its page is
14
14
  * drawn from — the Appspec of the version it runs — and whether somebody
15
15
  * signed out may talk to it (`session.opens`); the visitors' runtime
16
- * answers `at:<slug>`, making the address's agent when first talked to;
16
+ * answers `at:<slug>`, making the address's agent when first talked to —
17
+ * or, for a version with code of its own (`runs_code`), the runtime its
18
+ * deployment is kept on (`kept.url`), which runs that code;
17
19
  * - **a decision**, named by its id (`01M…`): framed from Datalayer's run
18
20
  * page, as before.
19
21
  *
@@ -35,7 +37,7 @@
35
37
  import type { AppSpec } from '../../types/agentspecs';
36
38
  import type { DatalayerVisitors } from '../apps/visitorToken';
37
39
  /** Where the visitors' runtime is published, on ai-agents' host (its chart). */
38
- export declare const VISITORS_PATH = "/api/loop-visitors";
40
+ export declare const VISITORS_PATH = "/api/runtime-visitors";
39
41
  /** The examples the visitors' runtime keeps warm (its chart's `AGENT_RUNTIMES_VISITORS`). */
40
42
  export declare const VISITOR_EXAMPLES: readonly string[];
41
43
  /** The key of an application at its address, as a visitor's token names it. */
@@ -62,8 +64,12 @@ export type VisitorApp =
62
64
  kind: 'said';
63
65
  text: string;
64
66
  };
65
- /** Where a visitor's conversation with `app` runs: the visitors' runtime beside ai-agents, its token from ai-inference. */
66
- export declare function visitorsAt(api: string, app: string): DatalayerVisitors;
67
+ /**
68
+ * Where a visitor's conversation with `app` runs: the visitors' runtime beside
69
+ * ai-agents — or `runtime`, the one a deployment with code of its own is
70
+ * kept on (R-30) — its token from ai-inference.
71
+ */
72
+ export declare function visitorsAt(api: string, app: string, runtime?: string): DatalayerVisitors;
67
73
  /** What an embed without a token is told it takes. */
68
74
  export declare const TOKEN_HINT = "Embedded for a visitor it refuses, it takes its embed token (the \"token\" attribute).";
69
75
  /** The sentence for an example the visitors' runtime does not keep. */
@@ -85,3 +91,16 @@ export declare function readVisitorApp({ api, app, fetcher, catalogue, }: {
85
91
  fetcher?: typeof fetch;
86
92
  catalogue?: (ref: string) => AppSpec | undefined;
87
93
  }): Promise<VisitorApp>;
94
+ /**
95
+ * Where somebody without an account talks to an address, as ai-agents says
96
+ * it (R-30, decided 14 October 2026): written as a spec, on the visitors'
97
+ * runtime (`url` unsaid); with code of its own (`runs_code`), on the runtime
98
+ * its deployment is kept on (`kept.url`), which runs that code — never the
99
+ * visitors', where its plain agent would answer in its code's place. An
100
+ * answer that does not say, or says code with no runtime, is not run.
101
+ */
102
+ export declare function signedOutRuntime(body: Record<string, unknown>): {
103
+ url?: string;
104
+ } | {
105
+ said: string;
106
+ };
@@ -6,7 +6,7 @@ import { getApp } from '../../specs/apps';
6
6
  import { parseAppspec } from '../apps/appspec';
7
7
  import { runnable } from './embedConfig';
8
8
  /** Where the visitors' runtime is published, on ai-agents' host (its chart). */
9
- export const VISITORS_PATH = '/api/loop-visitors';
9
+ export const VISITORS_PATH = '/api/runtime-visitors';
10
10
  /** The examples the visitors' runtime keeps warm (its chart's `AGENT_RUNTIMES_VISITORS`). */
11
11
  export const VISITOR_EXAMPLES = [
12
12
  'web-research',
@@ -20,10 +20,18 @@ export const DEFAULT_API = 'https://prod1.datalayer.run';
20
20
  export const isAppUid = (value) => /^[0-9A-HJKMNP-TV-Z]{26}$/.test(value);
21
21
  /** An address, as ai-agents spells one. */
22
22
  const SLUG = /^[a-z0-9][a-z0-9-]{0,62}$/;
23
- /** Where a visitor's conversation with `app` runs: the visitors' runtime beside ai-agents, its token from ai-inference. */
24
- export function visitorsAt(api, app) {
23
+ /**
24
+ * Where a visitor's conversation with `app` runs: the visitors' runtime beside
25
+ * ai-agents — or `runtime`, the one a deployment with code of its own is
26
+ * kept on (R-30) — its token from ai-inference.
27
+ */
28
+ export function visitorsAt(api, app, runtime) {
25
29
  const base = api.replace(/\/+$/, '');
26
- return { url: `${base}${VISITORS_PATH}`, app, inferenceUrl: base };
30
+ return {
31
+ url: runtime ? runtime.replace(/\/+$/, '') : `${base}${VISITORS_PATH}`,
32
+ app,
33
+ inferenceUrl: base,
34
+ };
27
35
  }
28
36
  /** What an embed without a token is told it takes. */
29
37
  export const TOKEN_HINT = 'Embedded for a visitor it refuses, it takes its embed token (the "token" attribute).';
@@ -95,9 +103,39 @@ export async function readVisitorApp({ api = DEFAULT_API, app, fetcher = fetch,
95
103
  const name = typeof deployment.app_name === 'string' && deployment.app_name
96
104
  ? deployment.app_name
97
105
  : parsed.app.name;
106
+ const runtime = signedOutRuntime(body);
107
+ if ('said' in runtime) {
108
+ return { kind: 'said', text: refusedSentence(runtime.said) };
109
+ }
98
110
  return {
99
111
  kind: 'visitors',
100
112
  app: runnable({ app: { ...parsed.app, name }, problems: parsed.problems }),
101
- visitors: visitorsAt(api, `${AT_PREFIX}${named}`),
113
+ visitors: visitorsAt(api, `${AT_PREFIX}${named}`, runtime.url),
102
114
  };
103
115
  }
116
+ /**
117
+ * Where somebody without an account talks to an address, as ai-agents says
118
+ * it (R-30, decided 14 October 2026): written as a spec, on the visitors'
119
+ * runtime (`url` unsaid); with code of its own (`runs_code`), on the runtime
120
+ * its deployment is kept on (`kept.url`), which runs that code — never the
121
+ * visitors', where its plain agent would answer in its code's place. An
122
+ * answer that does not say, or says code with no runtime, is not run.
123
+ */
124
+ export function signedOutRuntime(body) {
125
+ if (typeof body.runs_code !== 'boolean') {
126
+ return {
127
+ said: 'Datalayer did not say whether it runs code of its own, so it is not run.',
128
+ };
129
+ }
130
+ if (!body.runs_code) {
131
+ return {};
132
+ }
133
+ const kept = (body.kept ?? {});
134
+ const url = typeof kept.url === 'string' ? kept.url.trim() : '';
135
+ if (!url) {
136
+ return {
137
+ said: 'It runs its own code on a runtime kept for it, and none is running now.',
138
+ };
139
+ }
140
+ return { url };
141
+ }
@@ -49,13 +49,15 @@ import { isInactiveSurfaceContribution, orderToolContributions, toolsForChatView
49
49
  import { agentBundleToolDefinitions, useAgentCommandTools, } from '../../../tools/adapters/commands';
50
50
  import { NONE_EDITOR, seedEditorChoice, setEditorOptions, } from '../shell/editorChoice';
51
51
  import { generateMessageId } from '../../../types/messages';
52
- import { deploymentOfPayload, openThread, THREAD_WORDS, threadOfVisit, } from '../../apps/threads';
52
+ import { deploymentOfPayload, threadOfVisit } from '../../apps/threads';
53
+ import { openThread, THREAD_WORDS } from '../../../portable/thread';
53
54
  import { FaceDrawing, PresenceFace, PresenceLine, } from '../../../chat/presence/Presence';
54
55
  import { presenceState, presenceToolOf, } from '../../../chat/presence/presenceStatus';
55
56
  import { latestSaying, newestIsAnswer, } from '../../../chat/assistant/state';
56
57
  import { useChatWords } from '../../../chat/ChatLanguage';
57
58
  import { ComposerVoice } from '../../../voice/ComposerVoice';
58
59
  import { settledVoice, voiceAskedAs } from '../../../voice/chatVoice';
60
+ import { useVoiceSettings } from '../../../voice/useVoiceSettings';
59
61
  /** No editor: the conversation on its own. */
60
62
  const NO_SURFACE = '';
61
63
  /**
@@ -1177,7 +1179,11 @@ export default function ChatView({ workspace }) {
1177
1179
  * workspace's composer, which this view holds — the words written in it as
1178
1180
  * they are heard. The chat speaks its answers itself (`voice` below).
1179
1181
  */
1180
- const voice = useMemo(() => (config?.voice ? settledVoice(config.voice) : undefined), [config?.voice]);
1182
+ // The person's own settings, followed as the voice menu changes them (VO-30).
1183
+ const [personVoice] = useVoiceSettings();
1184
+ const voice = useMemo(() => (config?.voice ? settledVoice(config.voice, personVoice) : undefined), [config?.voice, personVoice]);
1185
+ // The words in the box are still being heard: greyed until final (VO-11).
1186
+ const [voiceInterim, setVoiceInterim] = useState(false);
1181
1187
  /*
1182
1188
  * The model this conversation is on.
1183
1189
  *
@@ -1672,6 +1678,7 @@ export default function ChatView({ workspace }) {
1672
1678
  suggestions: chatSuggestions,
1673
1679
  disableInputPrompt: chatDisabled,
1674
1680
  connectionConfirmed: !chatDisabled,
1681
+ interim: voiceInterim,
1675
1682
  // Tighter on top: every pixel of the composer is a pixel of the editor
1676
1683
  // under it pushed down, and the bar reads as a command line at this size.
1677
1684
  // Both of the page layout's placements are that bar — one floating over
@@ -1693,7 +1700,12 @@ export default function ChatView({ workspace }) {
1693
1700
  footerExtras: promptActions.length > 0 || (voice && voice.input !== 'off') ? (_jsxs(_Fragment, { children: [promptActions.length > 0 ? (_jsx(ReactorSlot, { slot: LoopSlots.promptAction, props: { workspace } })) : null, voice && voice.input !== 'off' ? (_jsx(ComposerVoice, { voice: voice, input: draft, setInput: setDraft, disabled: chatDisabled,
1694
1701
  // The chat's own speaker, never a second one: the microphone
1695
1702
  // opening stops it, and *Stop speaking* while it speaks.
1696
- speaking: speaking, onStopSpeaking: () => controlsRef.current?.stopSpeaking?.(), onSpoken: metadata => {
1703
+ speaking: speaking, onStopSpeaking: () => controlsRef.current?.stopSpeaking?.(), onInterimChange: setVoiceInterim,
1704
+ // The menu offers when answers are heard where the
1705
+ // application lets them be (VO-21, VO-30).
1706
+ answers: Boolean(config?.voice?.output &&
1707
+ config.voice.output !== 'off' &&
1708
+ config.voice.speechUrl), onSpoken: metadata => {
1697
1709
  spokenRef.current = metadata;
1698
1710
  }, send: (text, metadata) => {
1699
1711
  spokenRef.current = metadata;
@@ -36,6 +36,7 @@ import { DecisionAsk } from './assistant/DecisionAsk';
36
36
  import { useSpokenAnswers } from '../voice/useSpokenAnswers';
37
37
  import { useVoiceSpeaker } from '../voice/useVoiceSpeaker';
38
38
  import { settledVoice } from '../voice/chatVoice';
39
+ import { useVoiceSettings } from '../voice/useVoiceSettings';
39
40
  import { BalloonApprovalMessage, CONVERSATION_BALLOON_WIDTH, ConversationBalloonClose, balloonTailAt, conversationBalloonHeight, conversationBalloonSx, CURRENT_BALLOON_HEIGHT, peekLine, } from './assistant/ConversationBalloon';
40
41
  import { ConversationBalloonHeader, CurrentBalloonBody, } from './assistant/BalloonParts';
41
42
  import { DEFAULT_BALLOON_DISPLAY, conversationCount, newestToolLine, toolLineText, } from './assistant/toolLine';
@@ -163,7 +164,9 @@ export function ChatFloating({ endpoint, protocol: protocolProp, useStore: useSt
163
164
  * they are written (VO-20), the state following the sound (VO-22).
164
165
  */
165
166
  const [voiceItems, setVoiceItems] = useState([]);
166
- const settledVoiceOf = useMemo(() => (voice ? settledVoice(voice) : undefined), [voice]);
167
+ // The person's own settings, followed as the voice menu changes them (VO-30).
168
+ const [personVoice] = useVoiceSettings();
169
+ const settledVoiceOf = useMemo(() => (voice ? settledVoice(voice, personVoice) : undefined), [voice, personVoice]);
167
170
  const { speaker, state: speakerState, stop: stopSpeaking, read: readAnswerAloud, level: mouthLevel, } = useVoiceSpeaker(settledVoiceOf);
168
171
  // `always`: each answer heard as it is written; `on_request`: a *Read
169
172
  // aloud* under each (VO-21).
@@ -32,7 +32,7 @@ import { useCoreStore } from '@datalayer/core';
32
32
  import { DEFAULT_SERVICE_URLS } from '@datalayer/core/lib/api/constants';
33
33
  import { useChatStore } from '../../stores/chatStore';
34
34
  import { useConversationStore } from '../../stores/conversationStore';
35
- import { askedOf } from '../../apps/apps/records';
35
+ import { askedOf } from '../../portable/records';
36
36
  import { extractChatMessagesFromFullContext } from './fullContextMessages';
37
37
  import { generateMessageId, createUserMessage, createAssistantMessage, } from '../../types/messages';
38
38
  import { AI_MODEL_CATALOGUE, DEFAULT_MODEL, isChatModel, } from '../../specs/models';
@@ -51,6 +51,7 @@ import { InputPrompt } from '../prompt/InputPrompt';
51
51
  import { ComposerVoice, spokenOf } from '../../voice/ComposerVoice';
52
52
  import { ReadAloud, readsAloud } from '../../voice/ReadAloud';
53
53
  import { settledVoice } from '../../voice/chatVoice';
54
+ import { useVoiceSettings } from '../../voice/useVoiceSettings';
54
55
  import { useVoiceSpeaker } from '../../voice/useVoiceSpeaker';
55
56
  import { useSpokenAnswers } from '../../voice/useSpokenAnswers';
56
57
  import { isFloatingChatViewMode } from '../viewModes';
@@ -3014,7 +3015,11 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
3014
3015
  // Voice (VOICE.md V1): what was said and put in the composer, until sent.
3015
3016
  const spokenRef = useRef(undefined);
3016
3017
  // Its voice with what it leaves unsaid filled in: Datalayer's models and packages.
3017
- const settled = useMemo(() => (voice ? settledVoice(voice) : undefined), [voice]);
3018
+ // The person's own settings, followed as the voice menu changes them (VO-30).
3019
+ const [personVoice] = useVoiceSettings();
3020
+ const settled = useMemo(() => (voice ? settledVoice(voice, personVoice) : undefined), [voice, personVoice]);
3021
+ // The words in the box are still being heard: greyed until final (VO-11).
3022
+ const [voiceInterim, setVoiceInterim] = useState(false);
3018
3023
  /*
3019
3024
  * Its answers heard (VO-20, VO-21), by Datalayer's speech service: the
3020
3025
  * host's speaker when it gives one (`ChatFloating`, whose assistant's mouth
@@ -3802,12 +3807,15 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
3802
3807
  // so every chat with a headless notebook gets the same transcript.
3803
3808
  notebookToolSurfacesId: notebookToolSurfacesId, approvalConfig: approvalConfig, messagesEndRef: messagesEndRef, onRespond: handleRespond, showTurnFooters: showTurnFooter, renderMessageFooter: readAloudFooter, agentUsage: agentUsage, onRemoveItems: handleRemoveItems, mcpServers: filteredMcpServers, emptyContent: launching ? null : (_jsx(ChatEmptyState, { emptyState: emptyState, brandIcon: brandIcon, description: resolvedDescription, suggestions: resolvedSuggestions, submitOnSuggestionClick: submitOnSuggestionClick, onSuggestionSubmit: handleSuggestionSubmit, onSuggestionFill: handleSuggestionFill })) }), trailingContent] }));
3804
3809
  // The microphone, in the composer's footer (VO-10, VO-11).
3805
- const voiceControl = settled && settled.input !== 'off' ? (_jsx(ComposerVoice, { voice: settled, input: input, setInput: setInput, disabled: disabled || launching, speaking: speakingNow, onStopSpeaking: stopSpeaking, onSpoken: metadata => {
3810
+ const voiceControl = settled && settled.input !== 'off' ? (_jsx(ComposerVoice, { voice: settled, input: input, setInput: setInput, disabled: disabled || launching, speaking: speakingNow, onStopSpeaking: stopSpeaking, onInterimChange: setVoiceInterim,
3811
+ // The menu offers when answers are heard where the application
3812
+ // lets them be (VO-21, VO-30).
3813
+ answers: Boolean(voice?.output && voice.output !== 'off' && voice.speechUrl), onSpoken: metadata => {
3806
3814
  spokenRef.current = metadata;
3807
3815
  }, send: (text, metadata) => void handleSend(text, undefined, metadata) })) : undefined;
3808
3816
  // Why an answer could not be heard, in a sentence, by the composer.
3809
3817
  const voiceRefused = !hostSpeaks && ownVoice.state.refused ? (_jsx(Text, { role: "alert", sx: { fontSize: 0, color: 'danger.fg', maxWidth: 260 }, "data-voice-refused": "", children: ownVoice.state.refused })) : null;
3810
- const inputToolbar = showInput ? (_jsx(InputPrompt, { footerExtras: voiceRefused ? (_jsxs(_Fragment, { children: [voiceRefused, voiceControl] })) : (voiceControl), input: input, setInput: setInput, isLoading: isLoading, kernelStatus: liveKernelStatus, connectionConfirmed: connectionConfirmed, placeholder: placeholder,
3818
+ const inputToolbar = showInput ? (_jsx(InputPrompt, { footerExtras: voiceRefused ? (_jsxs(_Fragment, { children: [voiceRefused, voiceControl] })) : (voiceControl), interim: voiceInterim, input: input, setInput: setInput, isLoading: isLoading, kernelStatus: liveKernelStatus, connectionConfirmed: connectionConfirmed, placeholder: placeholder,
3811
3819
  /*
3812
3820
  The same openers the empty state offers, typed into the box they would
3813
3821
  be typed into.
@@ -12,7 +12,7 @@
12
12
  * preamble the runtime told the application (`<asked-for>…</asked-for>`) is
13
13
  * kept in the record for the builder and never shown to the person.
14
14
  */
15
- import { askedOf } from '../../apps/apps/records';
15
+ import { askedOf } from '../../portable/records';
16
16
  export function extractChatMessagesFromFullContext(fullContext) {
17
17
  if (!fullContext) {
18
18
  return [];
@@ -50,6 +50,11 @@ export interface InputPromptProps {
50
50
  * additions rather than reshuffling the controls people know.
51
51
  */
52
52
  footerExtras?: ReactNode;
53
+ /**
54
+ * The words in the box are still being heard by the microphone (VOICE.md
55
+ * VO-11): shown greyed, in italics, until they are final.
56
+ */
57
+ interim?: boolean;
53
58
  /**
54
59
  * Panels inside the prompt's card, above and below the composer itself.
55
60
  *
@@ -226,4 +231,4 @@ export interface InputPromptProps {
226
231
  /** Pre-fetched MCP status from WebSocket — bypasses REST polling */
227
232
  mcpStatusData?: McpToolsetsStatusResponse | null;
228
233
  }
229
- export declare function InputPrompt({ input, setInput, isLoading, kernelStatus, connectionConfirmed, placeholder, typingSuggestions, autoFocus, focusTrigger, padding, placement, floatingAnchor, draggable, container, footerExtras, leadingPanel, trailingPanel, onSend, onStop, disableInputPrompt, promptVariant, mentionableAgents, promptCommands, promptHistory, headerContent, showAgentsMenu, showInlineAgentsMenu, agents, selectedAgentId, onSelectAgent, showTokenUsage, showContextRing, agentUsage, showModelSelector, showToolsMenu, showSkillsMenu, showSuggestionsMenu, suggestions, codemodeEnabled, onToggleCodemode, isA2AProtocol, hasConfigData, hasSkillsData, configLoading, models, decisions, selectedModel, onModelSelect, availableTools, availableFrontendTools, mcpServers, enabledMcpTools, enabledMcpToolCount, onToggleMcpTool, onToggleAllMcpServerTools, approvedMcpTools, onToggleMcpToolApproval, skills, skillsLoading, enabledSkills, onToggleSkill, onToggleAllSkills, approvedSkills, onToggleSkillApproval, apiBase, authToken, mcpStatusData, }: InputPromptProps): import("react").JSX.Element;
234
+ export declare function InputPrompt({ input, setInput, isLoading, kernelStatus, connectionConfirmed, placeholder, typingSuggestions, autoFocus, focusTrigger, padding, placement, floatingAnchor, draggable, container, footerExtras, interim, leadingPanel, trailingPanel, onSend, onStop, disableInputPrompt, promptVariant, mentionableAgents, promptCommands, promptHistory, headerContent, showAgentsMenu, showInlineAgentsMenu, agents, selectedAgentId, onSelectAgent, showTokenUsage, showContextRing, agentUsage, showModelSelector, showToolsMenu, showSkillsMenu, showSuggestionsMenu, suggestions, codemodeEnabled, onToggleCodemode, isA2AProtocol, hasConfigData, hasSkillsData, configLoading, models, decisions, selectedModel, onModelSelect, availableTools, availableFrontendTools, mcpServers, enabledMcpTools, enabledMcpToolCount, onToggleMcpTool, onToggleAllMcpServerTools, approvedMcpTools, onToggleMcpToolApproval, skills, skillsLoading, enabledSkills, onToggleSkill, onToggleAllSkills, approvedSkills, onToggleSkillApproval, apiBase, authToken, mcpStatusData, }: InputPromptProps): import("react").JSX.Element;
@@ -30,7 +30,7 @@ const EMPTY_ID_SET = new Set();
30
30
  // ---------------------------------------------------------------------------
31
31
  // Component
32
32
  // ---------------------------------------------------------------------------
33
- export function InputPrompt({ input, setInput, isLoading, kernelStatus, connectionConfirmed, placeholder, typingSuggestions, autoFocus, focusTrigger, padding, placement, floatingAnchor = 'bottom', draggable = false, container, footerExtras, leadingPanel, trailingPanel, onSend, onStop, disableInputPrompt = false, promptVariant, mentionableAgents, promptCommands, promptHistory, headerContent, showAgentsMenu = false, showInlineAgentsMenu = true, agents = [], selectedAgentId, onSelectAgent, showTokenUsage, showContextRing = false, agentUsage, showModelSelector, showToolsMenu, showSkillsMenu, showSuggestionsMenu = true, suggestions, codemodeEnabled, onToggleCodemode, isA2AProtocol, hasConfigData, hasSkillsData, configLoading = false, models = [], decisions, selectedModel = '', onModelSelect = () => { }, availableTools = [], availableFrontendTools = [], mcpServers = [], enabledMcpTools = EMPTY_TOOL_MAP, enabledMcpToolCount = 0, onToggleMcpTool = () => { }, onToggleAllMcpServerTools = () => { }, approvedMcpTools = EMPTY_TOOL_MAP, onToggleMcpToolApproval = () => { }, skills = [], skillsLoading = false, enabledSkills = EMPTY_ID_SET, onToggleSkill = () => { }, onToggleAllSkills = () => { }, approvedSkills = EMPTY_ID_SET, onToggleSkillApproval = () => { }, apiBase, authToken, mcpStatusData, }) {
33
+ export function InputPrompt({ input, setInput, isLoading, kernelStatus, connectionConfirmed, placeholder, typingSuggestions, autoFocus, focusTrigger, padding, placement, floatingAnchor = 'bottom', draggable = false, container, footerExtras, interim = false, leadingPanel, trailingPanel, onSend, onStop, disableInputPrompt = false, promptVariant, mentionableAgents, promptCommands, promptHistory, headerContent, showAgentsMenu = false, showInlineAgentsMenu = true, agents = [], selectedAgentId, onSelectAgent, showTokenUsage, showContextRing = false, agentUsage, showModelSelector, showToolsMenu, showSkillsMenu, showSuggestionsMenu = true, suggestions, codemodeEnabled, onToggleCodemode, isA2AProtocol, hasConfigData, hasSkillsData, configLoading = false, models = [], decisions, selectedModel = '', onModelSelect = () => { }, availableTools = [], availableFrontendTools = [], mcpServers = [], enabledMcpTools = EMPTY_TOOL_MAP, enabledMcpToolCount = 0, onToggleMcpTool = () => { }, onToggleAllMcpServerTools = () => { }, approvedMcpTools = EMPTY_TOOL_MAP, onToggleMcpToolApproval = () => { }, skills = [], skillsLoading = false, enabledSkills = EMPTY_ID_SET, onToggleSkill = () => { }, onToggleAllSkills = () => { }, approvedSkills = EMPTY_ID_SET, onToggleSkillApproval = () => { }, apiBase, authToken, mcpStatusData, }) {
34
34
  const chatText = useChatWords();
35
35
  const isKernelBusy = kernelStatus === 'busy';
36
36
  /*
@@ -107,7 +107,17 @@ export function InputPrompt({ input, setInput, isLoading, kernelStatus, connecti
107
107
  * from the start; this shows it.
108
108
  */
109
109
  const hasContext = Boolean(agentUsage && !agentUsage.error);
110
- const body = (_jsxs(Box, { children: [leadingPanel, _jsx(InputPromptBase, { variant: promptVariant, mentionableAgents: mentionableAgents, promptCommands: promptCommands, promptHistory: promptHistory,
110
+ const body = (_jsxs(Box
111
+ // Words still being heard, greyed until final (VO-11); the same Box
112
+ // either way, so the editor is never mounted again.
113
+ , { "data-voice-interim": interim ? '' : undefined, sx: interim
114
+ ? {
115
+ '& [contenteditable="true"], & textarea': {
116
+ color: 'fg.muted',
117
+ fontStyle: 'italic',
118
+ },
119
+ }
120
+ : undefined, children: [leadingPanel, _jsx(InputPromptBase, { variant: promptVariant, mentionableAgents: mentionableAgents, promptCommands: promptCommands, promptHistory: promptHistory,
111
121
  /*
112
122
  Whatever the host puts inside the prompt, and the agent chip beside
113
123
  it. Both, rather than either: a host contributing its own controls
@@ -3,7 +3,7 @@
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
5
  import { useCallback, useEffect, useState } from 'react';
6
- import { agUiRefusal, refusalBody } from '../protocols/agUiRefusal';
6
+ import { agUiRefusal, refusalBody } from '../portable/agUiRefusal';
7
7
  /**
8
8
  * Hook to manage chat state with AG-UI protocol.
9
9
  *
@@ -1,5 +1,5 @@
1
1
  import type { ToolApprovalFilters } from '../types/tool-approvals';
2
- import { type ApprovalRecord } from '../utils/approvals';
2
+ import { type ApprovalRecord } from '../portable/approvals';
3
3
  export type { ApprovalRecord };
4
4
  interface ApprovalsQueryData {
5
5
  approvals: ApprovalRecord[];
@@ -21,7 +21,7 @@
21
21
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
22
22
  import { useQuery, useQueryClient } from '@tanstack/react-query';
23
23
  import { useAIAgentsWebSocket } from './useAIAgentsWebSocket';
24
- import { normalizeApproval } from '../utils/approvals';
24
+ import { normalizeApproval } from '../portable/approvals';
25
25
  // ─── Helpers ─────────────────────────────────────────────────────────
26
26
  const APPROVALS_ROOT_KEY = ['tool-approvals'];
27
27
  function matchesFilter(a, filters) {