@datalayer/agent-runtimes 1.4.0 → 1.5.1

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 (337) hide show
  1. package/dist-embed/chunks/{AgentDetails-Bo0dD1KS.js → AgentDetails-KezohVQI.js} +1 -1
  2. package/dist-embed/chunks/{AgentDetailsDialog-JjCHYxMG.js → AgentDetailsDialog-CklhMnk7.js} +1 -1
  3. package/dist-embed/chunks/{AgentInspector-37Onz4of.js → AgentInspector-CtCaRc1L.js} +1 -1
  4. package/dist-embed/chunks/{AgentInspectorDialog-CCzGVAtX.js → AgentInspectorDialog-DB9cx3Gd.js} +1 -1
  5. package/dist-embed/chunks/Avatar-9MpXENSs.js +1 -0
  6. package/dist-embed/chunks/{CellSidebarExtension-CQlXdanG.js → CellSidebarExtension-CfaJL6DQ.js} +6 -6
  7. package/dist-embed/chunks/ChatView-Dc1x4aBR.js +32 -0
  8. package/dist-embed/chunks/{ContextPie-DBIUoPrq.js → ContextPie-1vP4f-3N.js} +1 -1
  9. package/dist-embed/chunks/DatalayerAgentBridge-D54Z9BZ3.js +1 -0
  10. package/dist-embed/chunks/{DeckComponent-CuRWiARr.js → DeckComponent-82GVdsoi.js} +2 -2
  11. package/dist-embed/chunks/{DocumentView-BYU2HREd.js → DocumentView-SrJloJDo.js} +2 -2
  12. package/dist-embed/chunks/{EphemeralDocument-BjFSuQKH.js → EphemeralDocument-t1KulOH8.js} +1 -1
  13. package/dist-embed/chunks/{EphemeralNotebook-DbS4f6yr.js → EphemeralNotebook-Co-WQWCc.js} +2 -2
  14. package/dist-embed/chunks/{ExcalidrawComponent-CFLnMPnf.js → ExcalidrawComponent-5NeLUYVB.js} +1 -1
  15. package/dist-embed/chunks/{ExcalidrawModal-CB9d5Vpk.js → ExcalidrawModal-9ZnOB03n.js} +1 -1
  16. package/dist-embed/chunks/{JupyterLexicalExtension-CYnZrelh.js → JupyterLexicalExtension-Cize8RXy.js} +29 -29
  17. package/dist-embed/chunks/{KernelVariables-KCUfxhF4.js → KernelVariables-Cl57Zze1.js} +2 -2
  18. package/dist-embed/chunks/{LexicalToolRegistry-CXLITkMD.js → LexicalToolRegistry-CoM9ROsx.js} +3 -3
  19. package/dist-embed/chunks/{NotebookSkeleton-HdM76lOj.js → NotebookSkeleton-CI7ovjNW.js} +1 -1
  20. package/dist-embed/chunks/{NotebookToolSurfaces-D62q-lbb.js → NotebookToolSurfaces-CWfppxBN.js} +1 -1
  21. package/dist-embed/chunks/{NotebookToolbar-DMKCe3c2.js → NotebookToolbar-rtMQZWHQ.js} +1 -1
  22. package/dist-embed/chunks/{NotebookView-Pps9dPZ7.js → NotebookView-DOf_K74b.js} +1 -1
  23. package/dist-embed/chunks/{Output-2KxoKu5F.js → Output-9DKTscSv.js} +10 -10
  24. package/dist-embed/chunks/{SandboxDetailsDialog-pkvlbdM2.js → SandboxDetailsDialog-BCfDm6MB.js} +1 -1
  25. package/dist-embed/chunks/{SchemaForm-Bqor7hh8.js → SchemaForm-BOYPrvf8.js} +1 -1
  26. package/dist-embed/chunks/{Toolbar-6Hdi_m3T.js → Toolbar-CGQDY041.js} +1 -1
  27. package/dist-embed/chunks/{WidgetVariableView-CJTAKqh1.js → WidgetVariableView-BTOwHP78.js} +1 -1
  28. package/dist-embed/chunks/YouTubePlugin-Bs4zZIB1.js +1 -0
  29. package/dist-embed/chunks/{abnfDiagram-VCTEODGH-CWj4pFxo.js → abnfDiagram-VCTEODGH-D5p59vS_.js} +1 -1
  30. package/dist-embed/chunks/{abnfDiagram-VCTEODGH-B4x7mfou.js → abnfDiagram-VCTEODGH-DRYbUvhc.js} +1 -1
  31. package/dist-embed/chunks/{ar-SA-G6X2FPQ2-C-zAYgA-.js → ar-SA-G6X2FPQ2-D6XRzkBS.js} +1 -1
  32. package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-CRIN999O.js → architectureDiagram-5GKGNRK7-B7ITKDup.js} +1 -1
  33. package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-B2D6lZbf.js → architectureDiagram-5GKGNRK7-DQGv0imf.js} +1 -1
  34. package/dist-embed/chunks/{az-AZ-76LH7QW2-BHq5js6U.js → az-AZ-76LH7QW2-DBTdUiqp.js} +1 -1
  35. package/dist-embed/chunks/{bg-BG-XCXSNQG7-BTcNNcTc.js → bg-BG-XCXSNQG7-DuhcsaSL.js} +1 -1
  36. package/dist-embed/chunks/{blockDiagram-868be97b-bBp9uGVj.js → blockDiagram-868be97b-DYe-XTjy.js} +1 -1
  37. package/dist-embed/chunks/{blockDiagram-I7D4REHJ-DNdo_mUi.js → blockDiagram-I7D4REHJ-IltJXCd6.js} +1 -1
  38. package/dist-embed/chunks/{blockDiagram-I7D4REHJ-CPHEppLa.js → blockDiagram-I7D4REHJ-y7tEFo3j.js} +1 -1
  39. package/dist-embed/chunks/{bn-BD-2XOGV67Q-DXRk27u1.js → bn-BD-2XOGV67Q-CPFeLVSN.js} +1 -1
  40. package/dist-embed/chunks/{c4Diagram-3f4bdde3-cYZlcE7E.js → c4Diagram-3f4bdde3-Bybp0wky.js} +1 -1
  41. package/dist-embed/chunks/{c4Diagram-7LVT6UL2-DTmVwmmb.js → c4Diagram-7LVT6UL2-CizxVqqX.js} +1 -1
  42. package/dist-embed/chunks/{c4Diagram-7LVT6UL2-BM2g5U7R.js → c4Diagram-7LVT6UL2-DpaHndz8.js} +1 -1
  43. package/dist-embed/chunks/{ca-ES-6MX7JW3Y-D-0J9rqp.js → ca-ES-6MX7JW3Y-gDR_kEC6.js} +1 -1
  44. package/dist-embed/chunks/{celltoolbartracker-D67W4XWx.js → celltoolbartracker-DLF4PWyW.js} +1 -1
  45. package/dist-embed/chunks/{chunk-2Q5K7J3B-CsB-r261.js → chunk-2Q5K7J3B-BI6lURun.js} +1 -1
  46. package/dist-embed/chunks/{chunk-2Q5K7J3B-CuegvedF.js → chunk-2Q5K7J3B-DWoLSrj9.js} +1 -1
  47. package/dist-embed/chunks/{chunk-5VM5RSS4-D4Ed2_vW.js → chunk-5VM5RSS4-CDh4wYym.js} +1 -1
  48. package/dist-embed/chunks/{chunk-5VM5RSS4-MJQ9uhYe.js → chunk-5VM5RSS4-SleuNqDC.js} +1 -1
  49. package/dist-embed/chunks/{chunk-F27PBJKO-DnjXjdOV.js → chunk-F27PBJKO-AvWsNGYY.js} +1 -1
  50. package/dist-embed/chunks/{chunk-F27PBJKO-BKTrewOm.js → chunk-F27PBJKO-h_FwJMTr.js} +1 -1
  51. package/dist-embed/chunks/{chunk-IMKFNOWR-Bf7PlvQM.js → chunk-IMKFNOWR-DGRceKiU.js} +1 -1
  52. package/dist-embed/chunks/{chunk-IMKFNOWR-BiXdYxxk.js → chunk-IMKFNOWR-Hx4a5yny.js} +1 -1
  53. package/dist-embed/chunks/{chunk-JWPE2WC7-DcVyhh3j.js → chunk-JWPE2WC7-A4gy2qc4.js} +1 -1
  54. package/dist-embed/chunks/{chunk-JWPE2WC7-DmWR08qa.js → chunk-JWPE2WC7-BuJactJo.js} +1 -1
  55. package/dist-embed/chunks/{chunk-POPQ4Y6H-Bw6JH9TT.js → chunk-POPQ4Y6H-CFM-817s.js} +1 -1
  56. package/dist-embed/chunks/{chunk-POPQ4Y6H-snvBGTqY.js → chunk-POPQ4Y6H-CmRF80iG.js} +1 -1
  57. package/dist-embed/chunks/{chunk-SVP7TREG-DLZdx--b.js → chunk-SVP7TREG-CryZx9JE.js} +1 -1
  58. package/dist-embed/chunks/{chunk-SVP7TREG-dE58fUkJ.js → chunk-SVP7TREG-DSNzmytH.js} +1 -1
  59. package/dist-embed/chunks/{chunk-TICWLB2K-DNXzQOV5.js → chunk-TICWLB2K-CEaDF8ZJ.js} +1 -1
  60. package/dist-embed/chunks/{chunk-TICWLB2K-4NdGhPfF.js → chunk-TICWLB2K-DyGS3fIj.js} +1 -1
  61. package/dist-embed/chunks/{chunk-XXDRQBXY-OKsVfhjO.js → chunk-XXDRQBXY-8Cnzpdjz.js} +1 -1
  62. package/dist-embed/chunks/{chunk-XXDRQBXY-D57w8SHP.js → chunk-XXDRQBXY-DxQBcVOz.js} +1 -1
  63. package/dist-embed/chunks/{classDiagram-ZZMXUADV-oYXGLbJe.js → classDiagram-ZZMXUADV-BQkO1UYr.js} +1 -1
  64. package/dist-embed/chunks/{classDiagram-ZZMXUADV-D35oEC_r.js → classDiagram-ZZMXUADV-yvP3zMO3.js} +1 -1
  65. package/dist-embed/chunks/{classDiagram-f62afe4f-DWY2Ws4r.js → classDiagram-f62afe4f-AYfpYKtp.js} +1 -1
  66. package/dist-embed/chunks/{classDiagram-v2-604399ef-By5ijR28.js → classDiagram-v2-604399ef-BWyNcT_y.js} +1 -1
  67. package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-oYXGLbJe.js → classDiagram-v2-VYDZK3BY-BQkO1UYr.js} +1 -1
  68. package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-D35oEC_r.js → classDiagram-v2-VYDZK3BY-yvP3zMO3.js} +1 -1
  69. package/dist-embed/chunks/{code-block-IT6T5CEO-DvUhQbDq.js → code-block-IT6T5CEO-F4BSIGY6.js} +1 -1
  70. package/dist-embed/chunks/{component-DquJEKgN.js → component-DMQ8W8n1.js} +3 -3
  71. package/dist-embed/chunks/{cose-bilkent-JH36ORCC-j33onHvG.js → cose-bilkent-JH36ORCC-C3HC0XIY.js} +1 -1
  72. package/dist-embed/chunks/{cose-bilkent-JH36ORCC-CfuJvtzg.js → cose-bilkent-JH36ORCC-MVxlcfpd.js} +1 -1
  73. package/dist-embed/chunks/{createText-aed3d8b3-DvlG46OI.js → createText-aed3d8b3-CEJODAXJ.js} +1 -1
  74. package/dist-embed/chunks/{cs-CZ-2BRQDIVT-CgN3I-57.js → cs-CZ-2BRQDIVT-BXQxcYp6.js} +1 -1
  75. package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-YhGHtmc4.js → cynefinDiagram-5FMLGOSQ-D87ENxS0.js} +1 -1
  76. package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-CPb2yRsU.js → cynefinDiagram-5FMLGOSQ-DNRKTIHx.js} +1 -1
  77. package/dist-embed/chunks/{da-DK-5WZEPLOC-CHQloSoX.js → da-DK-5WZEPLOC-Ck3vidj3.js} +1 -1
  78. package/dist-embed/chunks/{dagre-GXQ25YYZ-CSSSVwOB.js → dagre-GXQ25YYZ-BOhThFKd.js} +1 -1
  79. package/dist-embed/chunks/{dagre-GXQ25YYZ-bjTeZGWE.js → dagre-GXQ25YYZ-DscCD5Uq.js} +1 -1
  80. package/dist-embed/chunks/{de-DE-XR44H4JA-C-Hq84pe.js → de-DE-XR44H4JA-CPZgrOuc.js} +1 -1
  81. package/dist-embed/chunks/{diagram-S7CK7UJ4-CFdSwdyc.js → diagram-S7CK7UJ4-CUhme3Bl.js} +1 -1
  82. package/dist-embed/chunks/{diagram-S7CK7UJ4-CFDVHfda.js → diagram-S7CK7UJ4-zDQduoQy.js} +1 -1
  83. package/dist-embed/chunks/{diagram-UQ7AKVKN-DDaeau23.js → diagram-UQ7AKVKN-BxhQPjAM.js} +1 -1
  84. package/dist-embed/chunks/{diagram-UQ7AKVKN-GZbDy6ob.js → diagram-UQ7AKVKN-Byi-v8UN.js} +1 -1
  85. package/dist-embed/chunks/{diagram-VSXAHHWV-nXDiS81a.js → diagram-VSXAHHWV-CqihYkDH.js} +1 -1
  86. package/dist-embed/chunks/{diagram-VSXAHHWV-C6q67wko.js → diagram-VSXAHHWV-au-v2v9D.js} +1 -1
  87. package/dist-embed/chunks/{diagram-VX7I27RA-DQUkfMrD.js → diagram-VX7I27RA-Cd5PaF_n.js} +1 -1
  88. package/dist-embed/chunks/{diagram-VX7I27RA-CYLfpYa4.js → diagram-VX7I27RA-ETzwrw79.js} +1 -1
  89. package/dist-embed/chunks/{diagram-Z3DM3KII-DZziYptV.js → diagram-Z3DM3KII-AcMuRFo5.js} +1 -1
  90. package/dist-embed/chunks/{diagram-Z3DM3KII-v-9naUk_.js → diagram-Z3DM3KII-DkbsvY2A.js} +1 -1
  91. package/dist-embed/chunks/{document-BpXPH_dr.js → document-Dluvp7zl.js} +1 -1
  92. package/dist-embed/chunks/{drivecontents-Bg9_6Kmo.js → drivecontents-CxwZz_5W.js} +1 -1
  93. package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-EvDUmZgJ.js → ebnfDiagram-PWID7BFC-BrEs-SB2.js} +1 -1
  94. package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-CDmryeYY.js → ebnfDiagram-PWID7BFC-DuWfMZcD.js} +1 -1
  95. package/dist-embed/chunks/{edges-b2856ca0-CTakYT6h.js → edges-b2856ca0-Czd3-xvj.js} +1 -1
  96. package/dist-embed/chunks/{el-GR-BZB4AONW-MTzGcSsP.js → el-GR-BZB4AONW-CjQSkw0P.js} +1 -1
  97. package/dist-embed/chunks/{erDiagram-5d81789a-CpiBBm7t.js → erDiagram-5d81789a-JegaF4gy.js} +1 -1
  98. package/dist-embed/chunks/{erDiagram-RLTQ6QDP-B2QZDDaO.js → erDiagram-RLTQ6QDP-Cpn6_cd1.js} +1 -1
  99. package/dist-embed/chunks/{erDiagram-RLTQ6QDP-hsnql-YF.js → erDiagram-RLTQ6QDP-xubaXuKR.js} +1 -1
  100. package/dist-embed/chunks/{es-ES-U4NZUMDT-Thj-4Rwn.js → es-ES-U4NZUMDT-CQz3Tsxk.js} +1 -1
  101. package/dist-embed/chunks/{eu-ES-A7QVB2H4-BEEyNQo-.js → eu-ES-A7QVB2H4-DPwxHXvP.js} +1 -1
  102. package/dist-embed/chunks/{fa-IR-HGAKTJCU-CtUGmNBZ.js → fa-IR-HGAKTJCU-DlQyRFJP.js} +1 -1
  103. package/dist-embed/chunks/{fi-FI-Z5N7JZ37-6GMgpkSu.js → fi-FI-Z5N7JZ37-BL9Dv0rT.js} +1 -1
  104. package/dist-embed/chunks/{flowDb-185abca5-D4uRRPhl.js → flowDb-185abca5-BN_8lgCO.js} +1 -1
  105. package/dist-embed/chunks/{flowDiagram-1629c991-B999anFV.js → flowDiagram-1629c991-YRlRqB59.js} +1 -1
  106. package/dist-embed/chunks/{flowDiagram-HODETNUW-DY4I6lzA.js → flowDiagram-HODETNUW-CzRvxVGK.js} +1 -1
  107. package/dist-embed/chunks/{flowDiagram-HODETNUW-D4E8W9uH.js → flowDiagram-HODETNUW-lW-icIxi.js} +1 -1
  108. package/dist-embed/chunks/{flowDiagram-v2-1d953310-2W9bzV_S.js → flowDiagram-v2-1d953310-DBFSFroi.js} +1 -1
  109. package/dist-embed/chunks/{flowchart-elk-definition-6df44142-Cz-ICcxz.js → flowchart-elk-definition-6df44142-RjL83g27.js} +1 -1
  110. package/dist-embed/chunks/{fr-FR-RHASNOE6-BakNCbxj.js → fr-FR-RHASNOE6-xB7HyFVv.js} +1 -1
  111. package/dist-embed/chunks/{ganttDiagram-3b0b3873-CR9gwUWB.js → ganttDiagram-3b0b3873-Dowe9cKl.js} +1 -1
  112. package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-CoCfE73i.js → ganttDiagram-EL5Y4UJY-CLaynGwe.js} +1 -1
  113. package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-cZgkz4jA.js → ganttDiagram-EL5Y4UJY-CNQPBdAP.js} +1 -1
  114. package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CZEgVaQ_.js → gitGraphDiagram-WWUBYQGX-CDuBbPX3.js} +1 -1
  115. package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-xXoxdFf9.js → gitGraphDiagram-WWUBYQGX-CupHqYWl.js} +1 -1
  116. package/dist-embed/chunks/{gitGraphDiagram-f01e8bc2-NdofvPL5.js → gitGraphDiagram-f01e8bc2-C06Sje1n.js} +1 -1
  117. package/dist-embed/chunks/{gl-ES-HMX3MZ6V-Cwkb9OPk.js → gl-ES-HMX3MZ6V-BX50ltap.js} +1 -1
  118. package/dist-embed/chunks/{he-IL-6SHJWFNN-BaMmvCkr.js → he-IL-6SHJWFNN-DR3hLzYG.js} +1 -1
  119. package/dist-embed/chunks/{hi-IN-IWLTKZ5I-1aWewhep.js → hi-IN-IWLTKZ5I-C3bSDqVc.js} +1 -1
  120. package/dist-embed/chunks/{hu-HU-A5ZG7DT2-BIHI23BQ.js → hu-HU-A5ZG7DT2--mRUDQG6.js} +1 -1
  121. package/dist-embed/chunks/{id-ID-SAP4L64H-CYpgmx8X.js → id-ID-SAP4L64H-D6psdwdp.js} +1 -1
  122. package/dist-embed/chunks/{index-W7TVoWP5.js → index-3O3ob63z.js} +15 -15
  123. package/dist-embed/chunks/{index-KgE-JGae.js → index-7F_pA42X.js} +4 -4
  124. package/dist-embed/chunks/{index-9bae90f3-D4JbZiwv.js → index-9bae90f3-BY7E8HZU.js} +1 -1
  125. package/dist-embed/chunks/{index-CMYyiALV.js → index-Azo_wV3K.js} +1 -1
  126. package/dist-embed/chunks/{index-BFPUYxvD.js → index-B063q-PC.js} +4 -4
  127. package/dist-embed/chunks/index-B0KVfQGJ.js +1 -0
  128. package/dist-embed/chunks/{index-BRBFWMMG.js → index-B2He8CnP.js} +1 -1
  129. package/dist-embed/chunks/{index-BAr0Q6NS.js → index-BExwmtFS.js} +1 -1
  130. package/dist-embed/chunks/{index-B3WvcNQa.js → index-BJhxZF_K.js} +1 -1
  131. package/dist-embed/chunks/{index-CXL3UCHy.js → index-BYMZi_1t.js} +1 -1
  132. package/dist-embed/chunks/{index-wovGU2zp.js → index-BblwlEJB.js} +1 -1
  133. package/dist-embed/chunks/{index-Fzz2KjFM.js → index-BdvS7Q4t.js} +1 -1
  134. package/dist-embed/chunks/{index-BbucLMre.js → index-BhU2ra4k.js} +3 -3
  135. package/dist-embed/chunks/{index-j-oeqTuo.js → index-BipXK1tF.js} +1 -1
  136. package/dist-embed/chunks/{index-1wTrAXI1.js → index-BlWZloLe.js} +3 -3
  137. package/dist-embed/chunks/{index-b1yzCiTq.js → index-BzXMsI1v.js} +1 -1
  138. package/dist-embed/chunks/{index-CPY91aGL.js → index-BzxtV5-v.js} +1 -1
  139. package/dist-embed/chunks/{index-C17RrmNV.js → index-C01nR1dW.js} +1 -1
  140. package/dist-embed/chunks/{index-t_gNTVoL.js → index-C643Hfu1.js} +1 -1
  141. package/dist-embed/chunks/{index-DMKsCn-y.js → index-C6wF35Kk.js} +10 -10
  142. package/dist-embed/chunks/{index-BhSMzuKq.js → index-C8IekrmL.js} +1 -1
  143. package/dist-embed/chunks/{index-BxjlpSy4.js → index-C9CpG6Nf.js} +1 -1
  144. package/dist-embed/chunks/{index-BUhqZVtg.js → index-CA8D7U2s.js} +2 -2
  145. package/dist-embed/chunks/{index-EmZm7_bH.js → index-CUL9WiLS.js} +5 -5
  146. package/dist-embed/chunks/{index-DeVZ-nmF.js → index-Cknn3VQD.js} +1 -1
  147. package/dist-embed/chunks/{index-BJ7Yskx5.js → index-CpcHHQd7.js} +1 -1
  148. package/dist-embed/chunks/{index-wzK_9qZx.js → index-CvBxCcaE.js} +1 -1
  149. package/dist-embed/chunks/{index-DkUimZI8.js → index-CzXnKkqM.js} +1 -1
  150. package/dist-embed/chunks/{index-Ck-wonpc.js → index-D0DBuFMt.js} +1 -1
  151. package/dist-embed/chunks/{index-CC-Ht79i.js → index-D1lY79hS.js} +4 -4
  152. package/dist-embed/chunks/{index-BFLtEBuP.js → index-DB46n9Tf.js} +2 -2
  153. package/dist-embed/chunks/{index-B7nmHsEo.js → index-DToDguC3.js} +1 -1
  154. package/dist-embed/chunks/{index-Bi5hexj-.js → index-DVDREi21.js} +1 -1
  155. package/dist-embed/chunks/{index-D18sf241.js → index-DVUMPcVw.js} +1 -1
  156. package/dist-embed/chunks/{index-ZZnjmFwm.js → index-DcZQ2Oqj.js} +1 -1
  157. package/dist-embed/chunks/{index-bRwN_nxZ.js → index-DvWWLOj6.js} +1 -1
  158. package/dist-embed/chunks/{index-Clp8quV1.js → index-Dv_XGY6Q.js} +1 -1
  159. package/dist-embed/chunks/{index-C3oDHYfa.js → index-DxsDy6PY.js} +1 -1
  160. package/dist-embed/chunks/{index-en9Yf1Yz.js → index-EpYurdzk.js} +6 -6
  161. package/dist-embed/chunks/{index-DIOcQUrz.js → index-MTdX216X.js} +1 -1
  162. package/dist-embed/chunks/{index-B2OWWcCj.js → index-YqGHzM2S.js} +1 -1
  163. package/dist-embed/chunks/{index-BvvaLLhn.js → index-a51XM5L8.js} +3 -3
  164. package/dist-embed/chunks/{index-CsZ2HycN.js → index-jy9kOmqu.js} +1 -1
  165. package/dist-embed/chunks/{index-e5PkgYFg.js → index-kpqZuE4J.js} +1 -1
  166. package/dist-embed/chunks/{index-DtlUttQj.js → index-qsUgit40.js} +1 -1
  167. package/dist-embed/chunks/{index-Cq19rGjf.js → index-rfsiH_M6.js} +1 -1
  168. package/dist-embed/chunks/{index-BYQwy0Zx.js → index-s3hayhRS.js} +2 -2
  169. package/dist-embed/chunks/{index.esm-RCuogyl2.js → index.esm-CWygaJYM.js} +1 -1
  170. package/dist-embed/chunks/{index.esm-CVNfNVDy.js → index.esm-DYeUXS4c.js} +1 -1
  171. package/dist-embed/chunks/{infoDiagram-27XIBGKW-DpFWmHEH.js → infoDiagram-27XIBGKW-Ctm-zk09.js} +1 -1
  172. package/dist-embed/chunks/{infoDiagram-27XIBGKW-DRf2y76w.js → infoDiagram-27XIBGKW-DRzH33_4.js} +1 -1
  173. package/dist-embed/chunks/{infoDiagram-a29d40f1-CehVkLUM.js → infoDiagram-a29d40f1-c78-ZMuT.js} +1 -1
  174. package/dist-embed/chunks/{isEqual-BybBNsZK.js → isEqual-niFNV5MZ.js} +1 -1
  175. package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-C_d1mmp3.js → ishikawaDiagram-5VMMS53U-CILSTTqm.js} +1 -1
  176. package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-B534qRQJ.js → ishikawaDiagram-5VMMS53U-DKv5KL85.js} +1 -1
  177. package/dist-embed/chunks/{it-IT-JPQ66NNP-CLcqplyX.js → it-IT-JPQ66NNP-BfrG_atL.js} +1 -1
  178. package/dist-embed/chunks/{ja-JP-DBVTYXUO-u8Qe6tR7.js → ja-JP-DBVTYXUO-sahpmNGY.js} +1 -1
  179. package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-DEeA8WJr.js → journeyDiagram-3NMN7TZE-CSMQRlsr.js} +1 -1
  180. package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-C0GQLJYz.js → journeyDiagram-3NMN7TZE-DlMPiHSP.js} +1 -1
  181. package/dist-embed/chunks/{journeyDiagram-95396277-Cwx_BI95.js → journeyDiagram-95396277-VzHClVrX.js} +1 -1
  182. package/dist-embed/chunks/{kaa-6HZHGXH3-BG2kx50I.js → kaa-6HZHGXH3-BrkhtXQj.js} +1 -1
  183. package/dist-embed/chunks/{kab-KAB-ZGHBKWFO-CSYUpRxd.js → kab-KAB-ZGHBKWFO-DwtFIV_I.js} +1 -1
  184. package/dist-embed/chunks/{kanban-definition-UXKFOSKX-DucvIyR1.js → kanban-definition-UXKFOSKX-BkxvAXq2.js} +1 -1
  185. package/dist-embed/chunks/{kanban-definition-UXKFOSKX-Dww2l0wQ.js → kanban-definition-UXKFOSKX-esf1amn7.js} +1 -1
  186. package/dist-embed/chunks/{kk-KZ-P5N5QNE5-CpBMgHAz.js → kk-KZ-P5N5QNE5-UxN1LGH5.js} +1 -1
  187. package/dist-embed/chunks/{km-KH-HSX4SM5Z-CoMUUQMb.js → km-KH-HSX4SM5Z-B7lolfpy.js} +1 -1
  188. package/dist-embed/chunks/{ko-KR-MTYHY66A-DwxY8CGI.js → ko-KR-MTYHY66A-CnxefCaN.js} +1 -1
  189. package/dist-embed/chunks/{ku-TR-6OUDTVRD-UoNYUfm0.js → ku-TR-6OUDTVRD-Bt7bmFnv.js} +1 -1
  190. package/dist-embed/chunks/{layout-DiAMrtPi.js → layout-D7Mk1riq.js} +1 -1
  191. package/dist-embed/chunks/{layout-LNJhMVxV.js → layout-Sl9Lf6Ae.js} +1 -1
  192. package/dist-embed/chunks/{lexicalHooks-DEzWXVZY.js → lexicalHooks-DKF-DsxG.js} +1 -1
  193. package/dist-embed/chunks/{lt-LT-XHIRWOB4-Dr4uXaEj.js → lt-LT-XHIRWOB4-D6qkXs9m.js} +1 -1
  194. package/dist-embed/chunks/{lv-LV-5QDEKY6T-CNC56J-_.js → lv-LV-5QDEKY6T-D8g27j86.js} +1 -1
  195. package/dist-embed/chunks/{mermaid.core-huvnfV8t.js → mermaid.core-BhiOhb5K.js} +3 -3
  196. package/dist-embed/chunks/{mermaid.core-Dw1n-Hii.js → mermaid.core-CRlujv29.js} +5 -5
  197. package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-DWUezf-k.js → mindmap-definition-YA3MSWOX-BJQsz4H1.js} +1 -1
  198. package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-DKQu2lXp.js → mindmap-definition-YA3MSWOX-eCxs0BsL.js} +1 -1
  199. package/dist-embed/chunks/{mindmap-definition-e4c1d938-DSDPusnk.js → mindmap-definition-e4c1d938-DoGG9eDO.js} +1 -1
  200. package/dist-embed/chunks/{model-BHONoBA6.js → model-BziAhKNp.js} +1 -1
  201. package/dist-embed/chunks/{mr-IN-CRQNXWMA-BKWa9nzZ.js → mr-IN-CRQNXWMA-CMbVGyJm.js} +1 -1
  202. package/dist-embed/chunks/{my-MM-5M5IBNSE-bwAzOWhV.js → my-MM-5M5IBNSE-B-KPsx1j.js} +1 -1
  203. package/dist-embed/chunks/{nb-NO-T6EIAALU-CkpsChor.js → nb-NO-T6EIAALU-Cl7QLAt7.js} +1 -1
  204. package/dist-embed/chunks/{nl-NL-IS3SIHDZ-COVk4rlb.js → nl-NL-IS3SIHDZ-Brzte_o2.js} +1 -1
  205. package/dist-embed/chunks/{nn-NO-6E72VCQL-DlyFF-C1.js → nn-NO-6E72VCQL-CzCKEx02.js} +1 -1
  206. package/dist-embed/chunks/{oc-FR-POXYY2M6-CFDosV2C.js → oc-FR-POXYY2M6-DA72PkVY.js} +1 -1
  207. package/dist-embed/chunks/{pa-IN-N4M65BXN-BKRB3O0U.js → pa-IN-N4M65BXN-CzkFYtL0.js} +1 -1
  208. package/dist-embed/chunks/{pegDiagram-XKGWAZYB-ChXFZFas.js → pegDiagram-XKGWAZYB-CD3xZvKE.js} +1 -1
  209. package/dist-embed/chunks/{pegDiagram-XKGWAZYB-BUPTGFu3.js → pegDiagram-XKGWAZYB-CV-d6HkK.js} +1 -1
  210. package/dist-embed/chunks/{percentages-BXMCSKIN-D7pnqUsZ.js → percentages-BXMCSKIN-mjCCp4uI.js} +6 -6
  211. package/dist-embed/chunks/{pica-BQREYloS.js → pica-5TeyVfIV.js} +1 -1
  212. package/dist-embed/chunks/{pieDiagram-E7YTZNPT-DAuVz3z-.js → pieDiagram-E7YTZNPT-DipS--g7.js} +1 -1
  213. package/dist-embed/chunks/{pieDiagram-E7YTZNPT-BORvsKK0.js → pieDiagram-E7YTZNPT-toANOh_O.js} +1 -1
  214. package/dist-embed/chunks/{pieDiagram-c941bede-FM1PHjj3.js → pieDiagram-c941bede-DytniBrW.js} +1 -1
  215. package/dist-embed/chunks/{pl-PL-T2D74RX3-C5r2Tds7.js → pl-PL-T2D74RX3-F4ebFTYK.js} +1 -1
  216. package/dist-embed/chunks/{plugin-BoxsYxwM.js → plugin-Cf3g-jak.js} +1 -1
  217. package/dist-embed/chunks/plugin-DA_NCYQX.js +1 -0
  218. package/dist-embed/chunks/{pt-BR-5N22H2LF-CDnT98bW.js → pt-BR-5N22H2LF-B5i8LuE4.js} +1 -1
  219. package/dist-embed/chunks/{pt-PT-UZXXM6DQ-C6c4SPk1.js → pt-PT-UZXXM6DQ-BQ7hfRRg.js} +1 -1
  220. package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-DpGcSrR9.js → quadrantDiagram-AXDQQJYC-D_j5dzK-.js} +1 -1
  221. package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-CZe_C7e2.js → quadrantDiagram-AXDQQJYC-DlhtjZ-k.js} +1 -1
  222. package/dist-embed/chunks/{quadrantDiagram-cf8b8fe0-DZNznYqD.js → quadrantDiagram-cf8b8fe0-BQ2yjLYu.js} +1 -1
  223. package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-CuL_zbZ8.js → railroadDiagram-O6MQD6OU-CZFkdwSz.js} +1 -1
  224. package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-BnCn-tIV.js → railroadDiagram-O6MQD6OU-aWlxxhLc.js} +1 -1
  225. package/dist-embed/chunks/{renderer-lVFw9lw7.js → renderer-2D5v6hpK.js} +1 -1
  226. package/dist-embed/chunks/{requirementDiagram-53bda41b-BLToEv8I.js → requirementDiagram-53bda41b-CWV_b9FE.js} +1 -1
  227. package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-KU7DW76t.js → requirementDiagram-BXWQKSXE-BSF51uZZ.js} +1 -1
  228. package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-W6Oaw9v0.js → requirementDiagram-BXWQKSXE-EVwiX2gg.js} +1 -1
  229. package/dist-embed/chunks/{ro-RO-JPDTUUEW-CW6pbzEZ.js → ro-RO-JPDTUUEW-BdcZRS6h.js} +1 -1
  230. package/dist-embed/chunks/{ru-RU-B4JR7IUQ-CbaAJG0w.js → ru-RU-B4JR7IUQ-Cta1z8f6.js} +1 -1
  231. package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-y5tPDHfE.js → sankeyDiagram-P5KCCOFB-BqD6w06O.js} +1 -1
  232. package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-1UXJ4wHP.js → sankeyDiagram-P5KCCOFB-t6rHaBZJ.js} +1 -1
  233. package/dist-embed/chunks/{sankeyDiagram-c3ef121a-6gF3bcjb.js → sankeyDiagram-c3ef121a-C9O52Zx9.js} +1 -1
  234. package/dist-embed/chunks/{sequenceDiagram-82a5b84f-CglVrG1T.js → sequenceDiagram-82a5b84f-Dga-BwWi.js} +1 -1
  235. package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-CG-4aOyN.js → sequenceDiagram-WJ2MYXX4-DphVeQVS.js} +1 -1
  236. package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-DVcXqRnq.js → sequenceDiagram-WJ2MYXX4-ih6W0378.js} +1 -1
  237. package/dist-embed/chunks/{sessions-3PQsLINe.js → sessions-APuuDN3K.js} +2 -2
  238. package/dist-embed/chunks/{si-LK-N5RQ5JYF-BZkUjpXF.js → si-LK-N5RQ5JYF-DYy_OKHx.js} +1 -1
  239. package/dist-embed/chunks/{sizeCapture-INFHLROL-e294GOp7.js → sizeCapture-INFHLROL-CxIMCruL.js} +1 -1
  240. package/dist-embed/chunks/{sizeCapture-INFHLROL-CCZ7JXfm.js → sizeCapture-INFHLROL-o0dzt8-T.js} +1 -1
  241. package/dist-embed/chunks/{sk-SK-C5VTKIMK-DsfWgpPU.js → sk-SK-C5VTKIMK-B4A8rgzq.js} +1 -1
  242. package/dist-embed/chunks/{sl-SI-NN7IZMDC-Kx0FqxKU.js → sl-SI-NN7IZMDC-Dn2yU1RA.js} +1 -1
  243. package/dist-embed/chunks/{stateDiagram-43e79a5f-DktiQR1L.js → stateDiagram-43e79a5f-RBFnM6HD.js} +1 -1
  244. package/dist-embed/chunks/{stateDiagram-D77RDMKH-Czz7slb9.js → stateDiagram-D77RDMKH-DUbaZs3a.js} +1 -1
  245. package/dist-embed/chunks/{stateDiagram-D77RDMKH-DvgDxPXs.js → stateDiagram-D77RDMKH-R5RRRvFY.js} +1 -1
  246. package/dist-embed/chunks/{stateDiagram-v2-2041ed4f-CGEkaZYz.js → stateDiagram-v2-2041ed4f-O5FpnsEz.js} +1 -1
  247. package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-CbzbC1qh.js → stateDiagram-v2-MP3YSRHH-CxTXB7mT.js} +1 -1
  248. package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-DGG9ROyK.js → stateDiagram-v2-MP3YSRHH-xKTLvXGN.js} +1 -1
  249. package/dist-embed/chunks/{styles-455b33cd-BpfBULhz.js → styles-455b33cd-D4Xv2qYx.js} +1 -1
  250. package/dist-embed/chunks/{styles-f932cba9-DsM5quNh.js → styles-f932cba9-BRIqeB8k.js} +1 -1
  251. package/dist-embed/chunks/{styles-fcc2142b-bC7I59Fx.js → styles-fcc2142b-CSNd2DtU.js} +1 -1
  252. package/dist-embed/chunks/{subset-shared.chunk-DM3l9OuH.js → subset-shared.chunk-SugOGKH0.js} +1 -1
  253. package/dist-embed/chunks/{subset-worker.chunk-4w4yibm3.js → subset-worker.chunk-CHn-RJwQ.js} +1 -1
  254. package/dist-embed/chunks/{sv-SE-XGPEYMSR-DY0ryO-L.js → sv-SE-XGPEYMSR-DIGNKjA1.js} +1 -1
  255. package/dist-embed/chunks/{svgDrawCommon-148a3cd9-OC_CIhNw.js → svgDrawCommon-148a3cd9-ioBjWI45.js} +1 -1
  256. package/dist-embed/chunks/{swimlanes-42K2YHIH-DLiqjxvc.js → swimlanes-42K2YHIH-BPXSOfWl.js} +1 -1
  257. package/dist-embed/chunks/{swimlanes-42K2YHIH-nfpJsGfW.js → swimlanes-42K2YHIH-DID4P1mJ.js} +1 -1
  258. package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-DVkRheaE.js → swimlanesDiagram-VR7AAH4N-B216TpFb.js} +1 -1
  259. package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-DjeQ0TlI.js → swimlanesDiagram-VR7AAH4N-C5LAWW5q.js} +1 -1
  260. package/dist-embed/chunks/{ta-IN-2NMHFXQM-CWpIs0i0.js → ta-IN-2NMHFXQM-h5n2V9ms.js} +1 -1
  261. package/dist-embed/chunks/{th-TH-HPSO5L25-Cwkcfb3u.js → th-TH-HPSO5L25-DPUFV7b6.js} +1 -1
  262. package/dist-embed/chunks/{timeline-definition-24CTP7MA-CapVlXMl.js → timeline-definition-24CTP7MA-CsrTDzso.js} +1 -1
  263. package/dist-embed/chunks/{timeline-definition-24CTP7MA-eOK0mNc7.js → timeline-definition-24CTP7MA-Y3tUsmSp.js} +1 -1
  264. package/dist-embed/chunks/{timeline-definition-7545f45a-afx9iuZR.js → timeline-definition-7545f45a-Dwe7O50H.js} +1 -1
  265. package/dist-embed/chunks/{tokens-BfuLIPUq.js → tokens-DTIgYcNS.js} +1 -1
  266. package/dist-embed/chunks/{tr-TR-DEFEU3FU-BqJZZl-Y.js → tr-TR-DEFEU3FU-BezJkdMx.js} +1 -1
  267. package/dist-embed/chunks/{uk-UA-QMV73CPH-Dg213mG4.js → uk-UA-QMV73CPH-CqILlosm.js} +1 -1
  268. package/dist-embed/chunks/{usePrimerThemeBridge-D_1NuGKb.js → usePrimerThemeBridge-CoHussa9.js} +1 -1
  269. package/dist-embed/chunks/{vennDiagram-4TSXK5OY-D12hHdDQ.js → vennDiagram-4TSXK5OY-BhVdyHxt.js} +1 -1
  270. package/dist-embed/chunks/{vennDiagram-4TSXK5OY-CJ0VIZqI.js → vennDiagram-4TSXK5OY-ClTlC2ql.js} +1 -1
  271. package/dist-embed/chunks/{vi-VN-M7AON7JQ-DY94NKxF.js → vi-VN-M7AON7JQ-CnkPVQ0a.js} +1 -1
  272. package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-B1FfO2GD.js → wardleyDiagram-VM6X3IG4-DbWIMpvU.js} +1 -1
  273. package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-BfuBJbTV.js → wardleyDiagram-VM6X3IG4-kS16z5iB.js} +1 -1
  274. package/dist-embed/chunks/{xychartDiagram-3f383b91-BMDhPCCG.js → xychartDiagram-3f383b91-DYoT_EjG.js} +1 -1
  275. package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-xLO3w9Bz.js → xychartDiagram-S5SC5T6Z-CdwuwQAF.js} +1 -1
  276. package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-DZ-XUHKl.js → xychartDiagram-S5SC5T6Z-KeQp-cQ1.js} +1 -1
  277. package/dist-embed/chunks/{zh-CN-LNUGB5OW-B6I9A7sA.js → zh-CN-LNUGB5OW-CNdfctAT.js} +1 -1
  278. package/dist-embed/chunks/{zh-HK-E62DVLB3-D3oqgDOt.js → zh-HK-E62DVLB3-DEXwa5-T.js} +1 -1
  279. package/dist-embed/chunks/{zh-TW-RAJ6MFWO-CYwgY0Jo.js → zh-TW-RAJ6MFWO-BF7cCYAK.js} +1 -1
  280. package/dist-embed/datalayer-app-main.js +49 -49
  281. package/lib/apps/apps/appspec.js +22 -0
  282. package/lib/apps/core/index.d.ts +8 -0
  283. package/lib/apps/embed/AppEmbed.js +10 -13
  284. package/lib/apps/embed/hostBridge.d.ts +47 -13
  285. package/lib/apps/embed/hostBridge.js +135 -18
  286. package/lib/apps/index.d.ts +2 -2
  287. package/lib/apps/index.js +2 -2
  288. package/lib/apps/plugins/agents/DatalayerAgentBridge.js +9 -14
  289. package/lib/apps/plugins/agents/index.d.ts +1 -1
  290. package/lib/apps/plugins/agents/index.js +1 -1
  291. package/lib/apps/plugins/agents/plugin.d.ts +10 -0
  292. package/lib/apps/plugins/agents/plugin.js +10 -0
  293. package/lib/apps/plugins/app-elements/QuestionView.d.ts +5 -3
  294. package/lib/apps/plugins/app-elements/QuestionView.js +15 -2
  295. package/lib/apps/plugins/app-page/appPageModel.d.ts +6 -8
  296. package/lib/apps/plugins/app-page/appPageModel.js +0 -2
  297. package/lib/apps/plugins/app-page/pageRun.d.ts +2 -2
  298. package/lib/apps/plugins/app-page/pageRun.js +3 -3
  299. package/lib/apps/plugins/chat/ChatView.js +22 -3
  300. package/lib/chat/base/ChatBase.js +33 -3
  301. package/lib/chat/base/uiFiles.d.ts +29 -0
  302. package/lib/chat/base/uiFiles.js +69 -0
  303. package/lib/chat/messages/ChatMessageList.d.ts +7 -2
  304. package/lib/chat/messages/ChatMessageList.js +2 -2
  305. package/lib/examples/ProtocolSignedRequestsExample.d.ts +10 -0
  306. package/lib/examples/ProtocolSignedRequestsExample.js +41 -0
  307. package/lib/examples/ProtocolUcpCheckoutExample.d.ts +10 -0
  308. package/lib/examples/ProtocolUcpCheckoutExample.js +59 -0
  309. package/lib/examples/example-selector.js +2 -0
  310. package/lib/examples/exampleGroups.d.ts +1 -1
  311. package/lib/examples/exampleGroups.js +4 -0
  312. package/lib/examples/index.d.ts +2 -0
  313. package/lib/examples/index.js +2 -0
  314. package/lib/examples/protocols/signedRequestsDemo.d.ts +27 -0
  315. package/lib/examples/protocols/signedRequestsDemo.js +59 -0
  316. package/lib/examples/protocols/ucpCheckoutDemo.d.ts +36 -0
  317. package/lib/examples/protocols/ucpCheckoutDemo.js +68 -0
  318. package/lib/protocols/a2a/index.js +1 -0
  319. package/lib/protocols/agentic-commerce/index.js +1 -0
  320. package/lib/protocols/core.d.ts +6 -0
  321. package/lib/protocols/mcp/index.js +1 -0
  322. package/lib/protocols/pact/index.js +1 -0
  323. package/lib/protocols/ucp/index.js +1 -0
  324. package/lib/protocols/ucp/merchant.d.ts +15 -0
  325. package/lib/protocols/ucp/merchant.js +257 -0
  326. package/lib/protocols/web-bot-auth/index.js +1 -0
  327. package/lib/specs/apps.js +87 -6
  328. package/lib/specs/appspecSchema.js +43 -0
  329. package/lib/types/agentspecs.d.ts +18 -0
  330. package/lib/types/protocol.d.ts +7 -0
  331. package/package.json +2 -2
  332. package/dist-embed/chunks/Avatar-DbU3YP4x.js +0 -1
  333. package/dist-embed/chunks/ChatView-BpKZPdcp.js +0 -32
  334. package/dist-embed/chunks/DatalayerAgentBridge-Bz2KWRXK.js +0 -1
  335. package/dist-embed/chunks/YouTubePlugin-CjODyxZ2.js +0 -1
  336. package/dist-embed/chunks/index-DlK9qLPz.js +0 -1
  337. package/dist-embed/chunks/plugin-Dz5L6Xn8.js +0 -1
@@ -7,8 +7,8 @@
7
7
  *
8
8
  * The page opens a session of the application's agent on its runtime
9
9
  * (`POST /api/v1/apps/sessions`), then, each time an input changes, sends
10
- * them all as the session's `page` action (`POST …/sessions/{uid}/actions`,
11
- * `{name: "page", payload: {inputs}}`). The runtime checks them against the
10
+ * them all to its page (`POST …/sessions/{uid}/page`, `{inputs}`) — not an
11
+ * action of its code (REACTOR_UI RU-5). The runtime checks them against the
12
12
  * page's form — refused with 422 and a sentence — runs its code's
13
13
  * `@app.page` on them, and answers its outputs as a `CUSTOM` event named
14
14
  * `loop.page`, `{inputs, outputs}`, which the page shows in place. Nothing is
@@ -98,7 +98,7 @@ export async function openPageSession(context) {
98
98
  */
99
99
  export async function runPageIn(context, uid, inputs) {
100
100
  try {
101
- const stream = await posted(context, `${base(context)}/${encodeURIComponent(uid)}/actions`, { name: 'page', payload: { inputs } });
101
+ const stream = await posted(context, `${base(context)}/${encodeURIComponent(uid)}/page`, { inputs });
102
102
  return pageTurnOf(stream);
103
103
  }
104
104
  catch (error) {
@@ -6,7 +6,7 @@ import { ScreenFullIcon, ScreenNormalIcon } from '@primer/octicons-react';
6
6
  import { computed, signal } from '@datalayer/reactor';
7
7
  /* A signal to read when the layout publishes no live stance: the hook needs one. */
8
8
  const NO_STANCE = signal(undefined);
9
- import { useContributions, useSignalValue, useGate, useReactorPlatform, ReactorLazy, ReactorSlot, useSlotComponents, } from '@datalayer/reactor/react';
9
+ import { useAgentToolBundles, useContributions, useSignalValue, useGate, useReactorPlatform, ReactorLazy, ReactorSlot, useSlotComponents, } from '@datalayer/reactor/react';
10
10
  import { ChatBase } from '../../../chat/base/ChatBase';
11
11
  import { useChatAvailability } from '../../../chat/base/ChatAvailability';
12
12
  import { offeredModels as offeredModelsFor, readServerCatalogue, readServerDecisions, } from '../../../chat/base/modelChoice';
@@ -45,7 +45,7 @@ import { AI_MODEL_CATALOGUE, isChatModel } from '../../../specs/models';
45
45
  import { LoopAgentBlueprint, LoopAgentGate, LoopChatComposer, LoopChatExtras, LoopChatHeader, LoopChatLayout, LoopChatSuggestion, LoopChatSurface, LoopChatTurn, LoopCommand, LoopFrontendTool, LoopRunProps, LoopSlots, agentServerOf, noRuntimeSaid, canOpenView, runForwardedProps, onPromptFocusRequest, onSurfaceRequest, useLoopPromptStore, } from '../../core';
46
46
  import { messageText, turnWritersOf } from './turnState';
47
47
  import { isInactiveSurfaceContribution, orderToolContributions, toolsForChatView, } from './chatViewTools';
48
- import { useAgentCommandTools } from '../../../tools/adapters/commands';
48
+ import { agentBundleToolDefinitions, useAgentCommandTools, } from '../../../tools/adapters/commands';
49
49
  import { NONE_EDITOR, seedEditorChoice, setEditorOptions, } from '../shell/editorChoice';
50
50
  import { generateMessageId } from '../../../types/messages';
51
51
  import { openThread, THREAD_WORDS } from '../../apps/threads';
@@ -982,6 +982,23 @@ export default function ChatView({ workspace }) {
982
982
  ...commandTools.filter(tool => !taken.has(tool.name)),
983
983
  ];
984
984
  }, [notebookTools, commandTools]);
985
+ /*
986
+ * The page's own tools for an agent on a server: a host example's, and
987
+ * the tools of the `AgentTools` bundles its extras name (REACTOR_UI RU-7:
988
+ * the host page's functions, `host_<name>`, each running its command on
989
+ * this reactor). An in-page agent has every bundle already (above).
990
+ */
991
+ const bundles = useAgentToolBundles();
992
+ const handedBundles = chatExtras.agentToolBundles;
993
+ const pageTools = useMemo(() => {
994
+ const own = chatExtras.frontendTools ?? [];
995
+ if (!handedBundles?.length) {
996
+ return chatExtras.frontendTools;
997
+ }
998
+ const handed = agentBundleToolDefinitions(bundles.filter(bundle => handedBundles.includes(bundle.id)), reactor);
999
+ const taken = new Set(own.map(tool => tool.name));
1000
+ return [...own, ...handed.filter(tool => !taken.has(tool.name))];
1001
+ }, [chatExtras.frontendTools, handedBundles, bundles, reactor]);
985
1002
  // The page's sandbox, while the agent turned here runs its code in it.
986
1003
  pageSandboxRef.current =
987
1004
  inPage && agentTools.some(tool => tool.name === BROWSER_CODE_TOOL)
@@ -1379,6 +1396,8 @@ export default function ChatView({ workspace }) {
1379
1396
  ...(runsApp
1380
1397
  ? {
1381
1398
  uiSocket: `${agentServerUrl.replace(/^http/, 'ws')}/api/v1/apps/ui`,
1399
+ // Its files, uploaded before what names them (RU-6).
1400
+ uiFiles: `${agentServerUrl}/api/v1/apps/agents/${encodeURIComponent(agentId)}/files`,
1382
1401
  }
1383
1402
  : {}),
1384
1403
  agentId,
@@ -1731,7 +1750,7 @@ export default function ChatView({ workspace }) {
1731
1750
  embedded application's run carried no tool at all (seen
1732
1751
  2026-10-10: `toolsForRequest: []`).
1733
1752
  */
1734
- frontendTools: inPage ? undefined : chatExtras.frontendTools,
1753
+ frontendTools: inPage ? undefined : pageTools,
1735
1754
  /*
1736
1755
  The model this view is on, as the chat's opening pick.
1737
1756
 
@@ -19,7 +19,7 @@ import { useContext } from 'react';
19
19
  import React, { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
20
20
  import { Text, Spinner, IconButton } from '@primer/react';
21
21
  import { ReactorLazy } from '@datalayer/reactor/react';
22
- import { ANSWER_ACTION, emptyUiModel, } from '@datalayer/reactor/ui';
22
+ import { ANSWER_ACTION, emptyUiModel, isFileRef, uploadFile, } from '@datalayer/reactor/ui';
23
23
  import { UiSocket } from '@datalayer/reactor/ui/ws';
24
24
  import { SkeletonText } from '@primer/react/experimental';
25
25
  import { SidebarExpandIcon } from '@primer/octicons-react';
@@ -76,6 +76,7 @@ import { isStepDisplay, withLoopStep } from './loopStep';
76
76
  import { applyLoopElement } from './loopElement';
77
77
  import { tellLoopWindow } from './loopWindow';
78
78
  import { displayPressOf, placeable, routeUiOp, withPress, withUiOp, } from './uiOps';
79
+ import { namesFiles, withUploadedFiles, } from './uiFiles';
79
80
  import { useChatWords } from '../ChatLanguage';
80
81
  // Tracks pending prompts already auto-sent for a given conversation scope.
81
82
  // This prevents layout-driven unmount/remount cycles from re-sending prompts.
@@ -1600,6 +1601,22 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
1600
1601
  const uiSocketUrl = protocol?.uiSocket;
1601
1602
  const uiSocketTokenRef = useRef(protocol?.authToken);
1602
1603
  uiSocketTokenRef.current = protocol?.authToken;
1604
+ /*
1605
+ * Its files (REACTOR_UI RU-6): uploaded to its runtime before the run or
1606
+ * the press that names them, the conversation's thread their scope; the
1607
+ * run carries the ref, never the bytes.
1608
+ */
1609
+ const uiFilesUrl = protocol?.uiFiles;
1610
+ const uploadToConversation = useCallback(file => {
1611
+ if (!uiFilesUrl) {
1612
+ return Promise.reject(new Error('This conversation takes no file.'));
1613
+ }
1614
+ return uploadFile(file, {
1615
+ url: uiFilesUrl,
1616
+ scope: threadIdRef.current,
1617
+ token: uiSocketTokenRef.current,
1618
+ });
1619
+ }, [uiFilesUrl]);
1603
1620
  const applyToMessages = useCallback((op) => {
1604
1621
  const apply = (items) => {
1605
1622
  try {
@@ -3088,6 +3105,16 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
3088
3105
  return;
3089
3106
  if (!adapterRef.current && !onSendMessage)
3090
3107
  return;
3108
+ // Its files are uploaded first: the run names their refs (RU-6).
3109
+ if (forwardedPropsGiven && namesFiles(forwardedPropsGiven)) {
3110
+ try {
3111
+ forwardedPropsGiven = await withUploadedFiles(forwardedPropsGiven, uploadToConversation);
3112
+ }
3113
+ catch (failure) {
3114
+ setError(failure instanceof Error ? failure : new Error(String(failure)));
3115
+ return;
3116
+ }
3117
+ }
3091
3118
  // A press of what a display offered goes up the ui socket, checked
3092
3119
  // there; the run that answers it names it only (REACTOR_UI RU-W).
3093
3120
  const pressed = displayPressOf(forwardedPropsGiven);
@@ -3260,6 +3287,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
3260
3287
  getEnabledSkillIds,
3261
3288
  noteThreadStarted,
3262
3289
  chatText,
3290
+ uploadToConversation,
3263
3291
  ]);
3264
3292
  // Send pending prompt once history loaded and adapter/handler available
3265
3293
  useEffect(() => {
@@ -3399,7 +3427,9 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
3399
3427
  const words = action.action === ANSWER_ACTION
3400
3428
  ? typeof value === 'string'
3401
3429
  ? value
3402
- : 'Answered.'
3430
+ : isFileRef(value)
3431
+ ? value.name
3432
+ : 'Answered.'
3403
3433
  : action.action;
3404
3434
  await handleSend(words, {
3405
3435
  loop: {
@@ -3809,7 +3839,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
3809
3839
  rows inside carry their own horizontal padding, which becomes the
3810
3840
  margin once the cap does bind.
3811
3841
  */
3812
- width: "100%", maxWidth: 920, mx: "auto", bg: "canvas.default", children: [_jsx(ChatMessageList, { displayItems: welcomedItems, actOn: protocol?.uiSocket ? actOnDisplay : undefined, isLoading: isLoading, isStreaming: isStreaming, showLoadingIndicator: showLoadingIndicator, hideMessagesAfterToolUI: hideMessagesAfterToolUI, avatarConfig: defaultAvatarConfig, padding: padding,
3842
+ width: "100%", maxWidth: 920, mx: "auto", bg: "canvas.default", children: [_jsx(ChatMessageList, { displayItems: welcomedItems, actOn: protocol?.uiSocket ? actOnDisplay : undefined, upload: protocol?.uiFiles ? uploadToConversation : undefined, isLoading: isLoading, isStreaming: isStreaming, showLoadingIndicator: showLoadingIndicator, hideMessagesAfterToolUI: hideMessagesAfterToolUI, avatarConfig: defaultAvatarConfig, padding: padding,
3813
3843
  // Tool calls are drawn by the page's Reactor plugins; a named
3814
3844
  // notebook's cell surfaces stand in for the default row of its tools,
3815
3845
  // so every chat with a headless notebook gets the same transcript.
@@ -0,0 +1,29 @@
1
+ /**
2
+ * A conversation's files as references (REACTOR_UI RU-6).
3
+ *
4
+ * What the page holds of a file it was given — File upload and the composer
5
+ * read it as `{name, type, data_url}` — is uploaded to the application's
6
+ * runtime before the run that names it (Reactor's `uploadFile`), and the run
7
+ * carries the ref it answers (`forwardedProps.loop.files`): a file's bytes
8
+ * never ride in the run.
9
+ *
10
+ * @module chat/base/uiFiles
11
+ */
12
+ import { type FileRef } from '@datalayer/reactor/ui';
13
+ /** How a file is uploaded to the conversation: its ref. */
14
+ export type UploadToConversation = (file: Blob & {
15
+ name: string;
16
+ }) => Promise<FileRef>;
17
+ /** A file's bytes from the data URL the page read it as. */
18
+ export declare function blobOfDataUrl(dataUrl: string, name: string, type?: string): Blob & {
19
+ name: string;
20
+ };
21
+ /** Whether a run's `forwardedProps` names files. */
22
+ export declare function namesFiles(forwardedProps: Record<string, unknown> | undefined): boolean;
23
+ /**
24
+ * The run's `forwardedProps` with its files uploaded: each file the page
25
+ * holds replaced by the ref its upload answered, a ref kept as it is.
26
+ *
27
+ * @throws for a file that is neither, or an upload refused (its sentence).
28
+ */
29
+ export declare function withUploadedFiles(forwardedProps: Record<string, unknown>, upload: UploadToConversation): Promise<Record<string, unknown>>;
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ /**
6
+ * A conversation's files as references (REACTOR_UI RU-6).
7
+ *
8
+ * What the page holds of a file it was given — File upload and the composer
9
+ * read it as `{name, type, data_url}` — is uploaded to the application's
10
+ * runtime before the run that names it (Reactor's `uploadFile`), and the run
11
+ * carries the ref it answers (`forwardedProps.loop.files`): a file's bytes
12
+ * never ride in the run.
13
+ *
14
+ * @module chat/base/uiFiles
15
+ */
16
+ import { isFileRef } from '@datalayer/reactor/ui';
17
+ /** A file's bytes from the data URL the page read it as. */
18
+ export function blobOfDataUrl(dataUrl, name, type) {
19
+ const [head, body] = [
20
+ dataUrl.slice(0, dataUrl.indexOf(',')),
21
+ dataUrl.slice(dataUrl.indexOf(',') + 1),
22
+ ];
23
+ if (!head.startsWith('data:') || dataUrl.indexOf(',') < 0) {
24
+ throw new Error(`${name} could not be read: it is not a data URL.`);
25
+ }
26
+ const mediaType = type || head.slice('data:'.length).split(';')[0];
27
+ // Backed by an ArrayBuffer, as Blob takes it (a SharedArrayBuffer-backed view it refuses).
28
+ let bytes;
29
+ if (head.endsWith(';base64')) {
30
+ const binary = atob(body);
31
+ bytes = new Uint8Array(binary.length);
32
+ for (let index = 0; index < binary.length; index += 1) {
33
+ bytes[index] = binary.charCodeAt(index);
34
+ }
35
+ }
36
+ else {
37
+ bytes = new TextEncoder().encode(decodeURIComponent(body));
38
+ }
39
+ return Object.assign(new Blob([bytes], { type: mediaType }), { name });
40
+ }
41
+ /** Whether a run's `forwardedProps` names files. */
42
+ export function namesFiles(forwardedProps) {
43
+ const files = forwardedProps?.loop
44
+ ?.files;
45
+ return Array.isArray(files) && files.length > 0;
46
+ }
47
+ /**
48
+ * The run's `forwardedProps` with its files uploaded: each file the page
49
+ * holds replaced by the ref its upload answered, a ref kept as it is.
50
+ *
51
+ * @throws for a file that is neither, or an upload refused (its sentence).
52
+ */
53
+ export async function withUploadedFiles(forwardedProps, upload) {
54
+ const loop = forwardedProps.loop;
55
+ const files = loop.files;
56
+ const refs = [];
57
+ for (const given of files) {
58
+ if (isFileRef(given)) {
59
+ refs.push(given);
60
+ continue;
61
+ }
62
+ const held = given;
63
+ if (typeof held.name !== 'string' || typeof held.data_url !== 'string') {
64
+ throw new Error('A file given is neither the page’s nor a ref.');
65
+ }
66
+ refs.push(await upload(blobOfDataUrl(held.data_url, held.name, typeof held.type === 'string' ? held.type : undefined)));
67
+ }
68
+ return { ...forwardedProps, loop: { ...loop, files: refs } };
69
+ }
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode, type RefObject } from 'react';
2
- import { type Display, type UiAct } from '@datalayer/reactor/ui';
2
+ import { type Display, type UiAct, type UiUpload } from '@datalayer/reactor/ui';
3
3
  import { type ChatDensity } from './ChatMarkdown';
4
4
  import { type MarkedMcpServer } from '../marks';
5
5
  import type { DisplayItem, AvatarConfig } from '../../types/chat';
@@ -20,6 +20,11 @@ export interface ChatMessageListProps {
20
20
  * displays offer nothing to press.
21
21
  */
22
22
  actOn?: (display: Display) => UiAct;
23
+ /**
24
+ * How a message's display uploads a file the person chose (REACTOR_UI
25
+ * RU-6): its ref, to press with. Absent, nothing is uploaded.
26
+ */
27
+ upload?: UiUpload;
23
28
  /** Whether the agent is loading */
24
29
  isLoading: boolean;
25
30
  /** Whether the agent is currently streaming */
@@ -104,5 +109,5 @@ export interface SubagentChatPanelProps {
104
109
  * approval decisions are sent over the shared monitoring socket.
105
110
  */
106
111
  export declare function SubagentChatPanel({ toolCallId, subagentName: subagentNameHint, height, avatarConfig, }: SubagentChatPanelProps): React.ReactElement | null;
107
- export declare function ChatMessageList({ displayItems, actOn, isLoading, isStreaming, showLoadingIndicator, hideMessagesAfterToolUI, avatarConfig, padding, notebookToolSurfacesId, emptyContent, messagesEndRef, onRespond, approvalConfig, showTurnFooters, agentUsage, onRemoveItems, renderMessageFooter, mcpServers, density, }: ChatMessageListProps): import("react").JSX.Element;
112
+ export declare function ChatMessageList({ displayItems, actOn, upload, isLoading, isStreaming, showLoadingIndicator, hideMessagesAfterToolUI, avatarConfig, padding, notebookToolSurfacesId, emptyContent, messagesEndRef, onRespond, approvalConfig, showTurnFooters, agentUsage, onRemoveItems, renderMessageFooter, mcpServers, density, }: ChatMessageListProps): import("react").JSX.Element;
108
113
  export {};
@@ -366,7 +366,7 @@ function DefaultToolCallRenderer({ item, onRespond, mcpServers, density, }) {
366
366
  // ---------------------------------------------------------------------------
367
367
  // Component
368
368
  // ---------------------------------------------------------------------------
369
- export function ChatMessageList({ displayItems, actOn, isLoading, isStreaming, showLoadingIndicator, hideMessagesAfterToolUI, avatarConfig, padding, notebookToolSurfacesId, emptyContent, messagesEndRef, onRespond, approvalConfig, showTurnFooters = false, agentUsage, onRemoveItems, renderMessageFooter, mcpServers, density = 'comfortable', }) {
369
+ export function ChatMessageList({ displayItems, actOn, upload, isLoading, isStreaming, showLoadingIndicator, hideMessagesAfterToolUI, avatarConfig, padding, notebookToolSurfacesId, emptyContent, messagesEndRef, onRespond, approvalConfig, showTurnFooters = false, agentUsage, onRemoveItems, renderMessageFooter, mcpServers, density = 'comfortable', }) {
370
370
  /*
371
371
  * Who draws a tool call: the Reactor plugins of the page, when it has a
372
372
  * platform. Each plugin binds its own tools (`ToolBindings`) and renders its
@@ -611,7 +611,7 @@ export function ChatMessageList({ displayItems, actOn, isLoading, isStreaming, s
611
611
  whiteSpace: 'pre-wrap',
612
612
  wordBreak: 'break-word',
613
613
  }, children: [message.metadata?.input === 'voice' ? (_jsx(Box, { as: "span", "data-spoken": "", title: "Said aloud", "aria-label": "Said aloud:", display: "inline-flex", verticalAlign: "text-bottom", mr: 1, opacity: 0.85, children: _jsx(MicrophoneIcon, { size: 14, "aria-hidden": "true" }) })) : null, text] }));
614
- })()) : message.live && !getMessageText(message) ? (_jsx(TypingDots, { size: 6 })) : (_jsx(ChatMarkdown, { density: density, text: getMessageText(message) || (isStreaming ? '...' : '') }))] }), message.displays?.length ? (_jsx(Box, { "data-chat-displays": "", display: "flex", flexDirection: "column", gap: 2, mt: 2, width: "100%", children: message.displays.map(display => platform ? (_jsx(ReactorDisplay, { display: display, act: actOn?.(display) }, display.id)) : (_jsx(DisplayText, { display: display }, display.id))) })) : null, renderMessageFooter ? (_jsx(Box, { display: "flex", gap: 2, alignItems: "center", mt: 1, flexWrap: "wrap", flexDirection: isUser ? 'row-reverse' : 'row', children: renderMessageFooter(message) })) : null] })] }) }, message.id));
614
+ })()) : message.live && !getMessageText(message) ? (_jsx(TypingDots, { size: 6 })) : (_jsx(ChatMarkdown, { density: density, text: getMessageText(message) || (isStreaming ? '...' : '') }))] }), message.displays?.length ? (_jsx(Box, { "data-chat-displays": "", display: "flex", flexDirection: "column", gap: 2, mt: 2, width: "100%", children: message.displays.map(display => platform ? (_jsx(ReactorDisplay, { display: display, act: actOn?.(display), upload: upload }, display.id)) : (_jsx(DisplayText, { display: display }, display.id))) })) : null, renderMessageFooter ? (_jsx(Box, { display: "flex", gap: 2, alignItems: "center", mt: 1, flexWrap: "wrap", flexDirection: isUser ? 'row-reverse' : 'row', children: renderMessageFooter(message) })) : null] })] }) }, message.id));
615
615
  };
616
616
  return (_jsxs(_Fragment, { children: [displayItems.map((item, index) => {
617
617
  const itemUI = renderItem(item, index);
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Signed requests (Web Bot Auth) in the browser (AGENT_PROTOCOLS EX-10): a
3
+ * key generated in the page signs one request; the page shows the three
4
+ * headers, the signature base the key signed, and what a website's check
5
+ * finds — verified, then the same request replayed and one with its path
6
+ * changed, both refused. The key never leaves the page and is never shown.
7
+ */
8
+ import React from 'react';
9
+ declare const ProtocolSignedRequestsExample: React.FC;
10
+ export default ProtocolSignedRequestsExample;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2025-2026 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ /**
7
+ * Signed requests (Web Bot Auth) in the browser (AGENT_PROTOCOLS EX-10): a
8
+ * key generated in the page signs one request; the page shows the three
9
+ * headers, the signature base the key signed, and what a website's check
10
+ * finds — verified, then the same request replayed and one with its path
11
+ * changed, both refused. The key never leaves the page and is never shown.
12
+ */
13
+ import { useCallback, useEffect, useState } from 'react';
14
+ import { Box, setupPrimerPortals } from '@datalayer/primer-addons';
15
+ import { Button, Flash, Heading, Label, Text } from '@primer/react';
16
+ import { ThemedProvider } from './utils/themedProvider';
17
+ import { signedRequestDemo, } from './protocols/signedRequestsDemo';
18
+ setupPrimerPortals();
19
+ const Mono = ({ children, label, }) => (_jsxs(Box, { mb: 3, children: [_jsx(Text, { as: "div", sx: { fontWeight: 'semibold', fontSize: 1, mb: 1 }, children: label }), _jsx(Box, { as: "pre", p: 2, m: 0, bg: "canvas.subtle", borderRadius: 2, sx: { fontSize: 0, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' }, children: children })] }));
20
+ const OUTCOME_VARIANT = {
21
+ verified: 'success',
22
+ invalid: 'danger',
23
+ unverified: 'attention',
24
+ };
25
+ const ProtocolSignedRequestsExample = () => {
26
+ const [demo, setDemo] = useState(null);
27
+ const [error, setError] = useState('');
28
+ const run = useCallback(() => {
29
+ setError('');
30
+ signedRequestDemo()
31
+ .then(setDemo)
32
+ .catch(failure => setError(String(failure?.message ?? failure)));
33
+ }, []);
34
+ useEffect(run, [run]);
35
+ return (_jsx(ThemedProvider, { children: _jsxs(Box, { p: 4, maxWidth: 880, mx: "auto", children: [_jsx(Heading, { as: "h2", sx: { fontSize: 3, mb: 1 }, children: "Signed requests" }), _jsx(Text, { as: "p", sx: { color: 'fg.muted', mt: 0 }, children: "Web Bot Auth (draft-ietf-webbotauth-httpsig-protocol-00): a key generated in this page signs a request to a shop; the shop checks it against the agent's key directory. The private key is never shown." }), _jsx(Button, { onClick: run, sx: { mb: 3 }, children: "Sign again with a new key" }), error ? _jsx(Flash, { variant: "danger", children: error }) : null, demo ? (_jsxs(_Fragment, { children: [_jsxs(Mono, { label: "Request", children: ["GET ", demo.url] }), _jsx(Mono, { label: "Signature-Agent", children: demo.headers['Signature-Agent'] }), _jsx(Mono, { label: "Signature-Input", children: demo.headers['Signature-Input'] }), _jsx(Mono, { label: "Signature", children: demo.headers.Signature }), _jsx(Mono, { label: "Signature base (what the key signed)", children: demo.base }), _jsx(Mono, { label: "Public key in the directory (keyid: its thumbprint)", children: JSON.stringify(demo.publicJwk, null, 2) }), _jsx(Box, { display: "grid", gap: 2, children: [
36
+ ['The shop checks it', demo.verified],
37
+ ['The same request again', demo.replayed],
38
+ ['Its path changed', demo.tampered],
39
+ ].map(([what, found]) => (_jsxs(Box, { display: "flex", gap: 2, alignItems: "baseline", children: [_jsx(Label, { variant: OUTCOME_VARIANT[found.outcome], children: found.outcome }), _jsxs(Text, { sx: { fontSize: 1 }, children: [what, found.reason ? `: ${found.reason}` : ''] })] }, what))) })] })) : null] }) }));
40
+ };
41
+ export default ProtocolSignedRequestsExample;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * A UCP checkout approved as a card (AGENT_PROTOCOLS EX-10, after EX-04):
3
+ * the UCP client buys from *Example Store*, the local test merchant running
4
+ * in the page. The exact purchase is proposed; completing it asks the
5
+ * approver — the card below — once; approving buys once, and the same
6
+ * proposal is refused after. The test payment's token is never shown.
7
+ */
8
+ import React from 'react';
9
+ declare const ProtocolUcpCheckoutExample: React.FC;
10
+ export default ProtocolUcpCheckoutExample;
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2025-2026 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ /**
7
+ * A UCP checkout approved as a card (AGENT_PROTOCOLS EX-10, after EX-04):
8
+ * the UCP client buys from *Example Store*, the local test merchant running
9
+ * in the page. The exact purchase is proposed; completing it asks the
10
+ * approver — the card below — once; approving buys once, and the same
11
+ * proposal is refused after. The test payment's token is never shown.
12
+ */
13
+ import { useMemo, useRef, useState } from 'react';
14
+ import { Box, setupPrimerPortals } from '@datalayer/primer-addons';
15
+ import { Button, Flash, Heading, Text } from '@primer/react';
16
+ import { ThemedProvider } from './utils/themedProvider';
17
+ import { buy, proposeTea, ucpCheckoutDemo } from './protocols/ucpCheckoutDemo';
18
+ setupPrimerPortals();
19
+ const ProtocolUcpCheckoutExample = () => {
20
+ const answer = useRef(null);
21
+ const [asking, setAsking] = useState(false);
22
+ const demo = useMemo(() => ucpCheckoutDemo(() => new Promise(resolve => {
23
+ answer.current = resolve;
24
+ setAsking(true);
25
+ })), []);
26
+ const [proposal, setProposal] = useState(null);
27
+ const [said, setSaid] = useState([]);
28
+ const [working, setWorking] = useState(false);
29
+ const propose = async () => {
30
+ setWorking(true);
31
+ try {
32
+ setProposal(await proposeTea(demo));
33
+ }
34
+ catch (error) {
35
+ setSaid(s => [
36
+ ...s,
37
+ { ok: false, says: String(error.message) },
38
+ ]);
39
+ }
40
+ finally {
41
+ setWorking(false);
42
+ }
43
+ };
44
+ const complete = async () => {
45
+ if (!proposal)
46
+ return;
47
+ setWorking(true);
48
+ const outcome = await buy(demo, proposal.proposal);
49
+ setSaid(s => [...s, outcome]);
50
+ setWorking(false);
51
+ };
52
+ const decide = (approved) => {
53
+ setAsking(false);
54
+ answer.current?.(approved);
55
+ answer.current = null;
56
+ };
57
+ return (_jsx(ThemedProvider, { children: _jsxs(Box, { p: 4, maxWidth: 720, mx: "auto", children: [_jsx(Heading, { as: "h2", sx: { fontSize: 3, mb: 1 }, children: "UCP checkout" }), _jsx(Text, { as: "p", sx: { color: 'fg.muted', mt: 0 }, children: "Universal Commerce Protocol 2026-08-25, against Example Store, a test merchant running in this page. Nothing is bought without the card below, and a proposal buys once." }), _jsxs(Box, { display: "flex", gap: 2, mb: 3, flexWrap: "wrap", children: [_jsx(Button, { onClick: propose, disabled: working || asking, children: "Propose 2 \u00D7 Sencha green tea" }), _jsx(Button, { variant: "primary", onClick: complete, disabled: !proposal || working, children: "Complete the purchase" })] }), proposal && asking ? (_jsxs(Box, { p: 3, mb: 3, border: "1px solid", borderColor: "attention.emphasis", borderRadius: 2, role: "dialog", "aria-label": "Approve this purchase", children: [_jsx(Text, { as: "p", sx: { fontWeight: 'semibold', mt: 0 }, children: "Approve this purchase?" }), _jsx(Text, { as: "p", children: proposal.says }), _jsxs(Text, { as: "p", sx: { color: 'fg.muted', fontSize: 0 }, children: ["Revision ", proposal.proposal.revision.slice(0, 12), "\u2026 \u2014 if the basket changes, it is proposed again."] }), _jsxs(Box, { display: "flex", gap: 2, children: [_jsx(Button, { variant: "primary", onClick: () => decide(true), children: "Approve" }), _jsx(Button, { onClick: () => decide(false), children: "Decline" })] })] })) : proposal ? (_jsxs(Text, { as: "p", sx: { fontSize: 1 }, children: ["Proposed: ", proposal.says] })) : null, said.map((each, index) => (_jsx(Flash, { variant: each.ok ? 'success' : 'warning', sx: { mb: 2 }, children: each.says }, index))), _jsxs(Text, { as: "p", sx: { color: 'fg.muted', fontSize: 0 }, children: ["Orders at the store: ", demo.orders.length] })] }) }));
58
+ };
59
+ export default ProtocolUcpCheckoutExample;
@@ -131,6 +131,8 @@ export const EXAMPLE_ENTRIES = [
131
131
  makeEntry('AgentSubagentsExample', () => import('./AgentSubagentsExample'), 'Multi-agent delegation with the in-repo subagents capability.'),
132
132
  makeEntry('AgentA2AExample', () => import('./AgentA2AExample'), 'Delegation to separate agents over the A2A protocol, launched locally or on Datalayer runtimes.'),
133
133
  makeEntry('AgentA2ATeamExample', () => import('./AgentA2ATeamExample'), 'Two applications as a team over A2A: Sales in the browser (@a2a-js/sdk) asks Accounting on a runtime (fasta2a, Odoo read only), each an Office Assistant character.'),
134
+ makeEntry('ProtocolSignedRequestsExample', () => import('./ProtocolSignedRequestsExample'), 'Web Bot Auth in the browser: a key made in the page signs a request — its three headers and the signature base — verified, then a replay and a changed path refused.'),
135
+ makeEntry('ProtocolUcpCheckoutExample', () => import('./ProtocolUcpCheckoutExample'), 'A UCP checkout at a test store in the page: the exact purchase proposed, approved on a card once, bought once.'),
134
136
  makeEntry('PapCompanyDiscoveryExample', () => import('./PapCompanyDiscoveryExample'), 'Validate a PAP company document and reduce it to the public capabilities safe for an agent or UI.'),
135
137
  makeEntry('PapAgentIdentityExample', () => import('./PapAgentIdentityExample'), 'Verify personal-agent client metadata and signing policy without exposing JWK coordinates.'),
136
138
  makeEntry('PapAuthorizationBoundaryExample', () => import('./PapAuthorizationBoundaryExample'), 'Generate real Session and Direct Sign-In security material while showing only safe policy status.'),
@@ -5,5 +5,5 @@
5
5
  *
6
6
  * @module examples/exampleGroups
7
7
  */
8
- export declare const EXAMPLE_GROUP_ORDER: readonly ["Apps", "Assistant", "A2UI", "A2A", "Personal Agent Protocol", "AG-UI", "Chat", "Document", "Notebook", "Capabilities", "Cell", "CopilotKit"];
8
+ export declare const EXAMPLE_GROUP_ORDER: readonly ["Apps", "Assistant", "A2UI", "A2A", "Personal Agent Protocol", "Agent protocols", "AG-UI", "Chat", "Document", "Notebook", "Capabilities", "Cell", "CopilotKit"];
9
9
  export declare const getExampleGroup: (id: string) => string;
@@ -15,6 +15,7 @@ export const EXAMPLE_GROUP_ORDER = [
15
15
  'A2UI',
16
16
  'A2A',
17
17
  'Personal Agent Protocol',
18
+ 'Agent protocols',
18
19
  'AG-UI',
19
20
  'Chat',
20
21
  'Document',
@@ -39,6 +40,9 @@ export const getExampleGroup = (id) => {
39
40
  return 'A2A';
40
41
  if (id.startsWith('Pap'))
41
42
  return 'Personal Agent Protocol';
43
+ // The other agent protocols' examples: signed requests, commerce (AGENT_PROTOCOLS EX-10).
44
+ if (id.startsWith('Protocol'))
45
+ return 'Agent protocols';
42
46
  if (id.startsWith('AgUi'))
43
47
  return 'AG-UI';
44
48
  if (id.startsWith('CopilotKit'))
@@ -27,6 +27,8 @@ export { default as AgentCodemodeExample } from './AgentCodemodeExample';
27
27
  export { default as AgentCodeSandboxesExample } from './AgentCodeSandboxesExample';
28
28
  export { default as AgentDecideExample } from './AgentDecideExample';
29
29
  export { default as AgentA2ATeamExample } from './AgentA2ATeamExample';
30
+ export { default as ProtocolSignedRequestsExample } from './ProtocolSignedRequestsExample';
31
+ export { default as ProtocolUcpCheckoutExample } from './ProtocolUcpCheckoutExample';
30
32
  export { default as PapCompanyDiscoveryExample } from './PapCompanyDiscoveryExample';
31
33
  export { default as PapAgentIdentityExample } from './PapAgentIdentityExample';
32
34
  export { default as PapAuthorizationBoundaryExample } from './PapAuthorizationBoundaryExample';
@@ -33,6 +33,8 @@ export { default as AgentCodemodeExample } from './AgentCodemodeExample';
33
33
  export { default as AgentCodeSandboxesExample } from './AgentCodeSandboxesExample';
34
34
  export { default as AgentDecideExample } from './AgentDecideExample';
35
35
  export { default as AgentA2ATeamExample } from './AgentA2ATeamExample';
36
+ export { default as ProtocolSignedRequestsExample } from './ProtocolSignedRequestsExample';
37
+ export { default as ProtocolUcpCheckoutExample } from './ProtocolUcpCheckoutExample';
36
38
  export { default as PapCompanyDiscoveryExample } from './PapCompanyDiscoveryExample';
37
39
  export { default as PapAgentIdentityExample } from './PapAgentIdentityExample';
38
40
  export { default as PapAuthorizationBoundaryExample } from './PapAuthorizationBoundaryExample';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The *Signed requests* gallery example's work (AGENT_PROTOCOLS EX-10): a
3
+ * fresh Ed25519 key generated in the page, one request signed with it
4
+ * (`signRequest`), the three headers and the signature base the signer was
5
+ * handed, then the request verified against the key's directory — and the
6
+ * same request replayed, and one with its path changed, both refused.
7
+ *
8
+ * The key never leaves the page and is never shown: only its public JWK and
9
+ * thumbprint are. No network: the directory is read from memory.
10
+ *
11
+ * @module examples/protocols/signedRequestsDemo
12
+ */
13
+ import { type PublicJwk, type SignedHeaders, type Verification } from '../../protocols/web-bot-auth';
14
+ export interface SignedRequestDemo {
15
+ /** The key's thumbprint, the `keyid` of the signature. */
16
+ keyid: string;
17
+ publicJwk: PublicJwk;
18
+ url: string;
19
+ headers: SignedHeaders;
20
+ /** The signature base, exactly as the signer signed it. */
21
+ base: string;
22
+ verified: Verification;
23
+ replayed: Verification;
24
+ tampered: Verification;
25
+ }
26
+ /** Sign one request with a fresh key, and verify it three ways. */
27
+ export declare function signedRequestDemo(url?: string, agent?: string): Promise<SignedRequestDemo>;
@@ -0,0 +1,59 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ /**
6
+ * The *Signed requests* gallery example's work (AGENT_PROTOCOLS EX-10): a
7
+ * fresh Ed25519 key generated in the page, one request signed with it
8
+ * (`signRequest`), the three headers and the signature base the signer was
9
+ * handed, then the request verified against the key's directory — and the
10
+ * same request replayed, and one with its path changed, both refused.
11
+ *
12
+ * The key never leaves the page and is never shown: only its public JWK and
13
+ * thumbprint are. No network: the directory is read from memory.
14
+ *
15
+ * @module examples/protocols/signedRequestsDemo
16
+ */
17
+ import { InMemoryNonceStore, generateLocalSigner, keyResolver, signRequest, verifyRequest, } from '../../protocols/web-bot-auth';
18
+ /** A signer that keeps what it was asked to sign: the signature base. */
19
+ function recording(signer) {
20
+ const bases = [];
21
+ return {
22
+ keyid: signer.keyid,
23
+ algorithm: signer.algorithm,
24
+ bases,
25
+ async sign(data) {
26
+ bases.push(new TextDecoder().decode(data));
27
+ return signer.sign(data);
28
+ },
29
+ };
30
+ }
31
+ /** Sign one request with a fresh key, and verify it three ways. */
32
+ export async function signedRequestDemo(url = 'https://shop.example/products?q=tea', agent = 'https://agent.example') {
33
+ const { signer, publicJwk } = await generateLocalSigner();
34
+ const keeping = recording(signer);
35
+ const headers = await signRequest(new Request(url), keeping, { agent });
36
+ // The shop finds the agent's keys in its directory: here, in memory.
37
+ const resolver = keyResolver({
38
+ directory: { keys: async () => [publicJwk] },
39
+ });
40
+ const nonceStore = new InMemoryNonceStore();
41
+ const sent = (to) => new Request(to, { headers: { ...headers } });
42
+ const verified = await verifyRequest(sent(url), resolver, { nonceStore });
43
+ const replayed = await verifyRequest(sent(url), resolver, { nonceStore });
44
+ const changed = new URL(url);
45
+ changed.pathname = '/checkout';
46
+ const tampered = await verifyRequest(sent(changed.toString()), resolver, {
47
+ nonceStore: new InMemoryNonceStore(),
48
+ });
49
+ return {
50
+ keyid: signer.keyid,
51
+ publicJwk,
52
+ url,
53
+ headers,
54
+ base: keeping.bases[0] ?? '',
55
+ verified,
56
+ replayed,
57
+ tampered,
58
+ };
59
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The *UCP checkout* gallery example's work (AGENT_PROTOCOLS EX-10, after
3
+ * EX-04): the UCP client buying from *Example Store*, the local test
4
+ * merchant running in the page (`protocols/ucp/merchant`). A checkout is
5
+ * proposed as an exact, revisioned purchase; completing it asks the host's
6
+ * approver — the page's card — once, and the proposal is spent whatever the
7
+ * answer. The payment is the test handler's; its token is never shown.
8
+ *
9
+ * @module examples/protocols/ucpCheckoutDemo
10
+ */
11
+ import { type ReactorPlatform } from '@datalayer/reactor';
12
+ import { UcpClient, type CheckoutProposal } from '../../protocols/ucp';
13
+ export declare const STORE = "https://store.example";
14
+ export declare const AGENT_PROFILE = "https://agent.example/.well-known/ucp";
15
+ /** The test payment's token: held by the host, never in a summary or a proposal. */
16
+ export declare const TEST_TOKEN = "tok_test_gallery_never_shown";
17
+ export interface UcpCheckoutDemo {
18
+ client: UcpClient;
19
+ reactor: ReactorPlatform;
20
+ orders: Array<{
21
+ order: string;
22
+ checkout: string;
23
+ }>;
24
+ }
25
+ /** The client, the store, and a host whose approver is `decide`. */
26
+ export declare function ucpCheckoutDemo(decide: (proposal: CheckoutProposal) => Promise<boolean>): UcpCheckoutDemo;
27
+ /** Find the tea, put `quantity` in a checkout with the buyer's email, and propose it. */
28
+ export declare function proposeTea(demo: UcpCheckoutDemo, quantity?: number, email?: string): Promise<{
29
+ proposal: CheckoutProposal;
30
+ says: string;
31
+ }>;
32
+ /** Complete the proposal: the approver is asked; the order, or why not. */
33
+ export declare function buy(demo: UcpCheckoutDemo, proposal: CheckoutProposal): Promise<{
34
+ ok: boolean;
35
+ says: string;
36
+ }>;