@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.
- package/dist-embed/chunks/{AgentDetails-DZyyuD5F.js → AgentDetails-B6vekLFY.js} +1 -1
- package/dist-embed/chunks/{AgentDetailsDialog-DaQyQxlm.js → AgentDetailsDialog-C-o8qFsS.js} +1 -1
- package/dist-embed/chunks/{AgentInspector-CBNiiRtv.js → AgentInspector-EiBHJgc9.js} +1 -1
- package/dist-embed/chunks/{AgentInspectorDialog-BxMOAc7K.js → AgentInspectorDialog-3fbLXnLP.js} +1 -1
- package/dist-embed/chunks/{CellSidebarExtension-Dwe7PfXi.js → CellSidebarExtension-BBXRIRgA.js} +7 -7
- package/dist-embed/chunks/ChatView-BjZ993Ch.js +32 -0
- package/dist-embed/chunks/{ContextPie-n1y886z-.js → ContextPie-Daf19Ivt.js} +1 -1
- package/dist-embed/chunks/{DeckComponent-BSeEBNHt.js → DeckComponent-C76a8LYD.js} +2 -2
- package/dist-embed/chunks/{DocumentView-OIdQEk_n.js → DocumentView-BZhbQkbP.js} +1 -1
- package/dist-embed/chunks/{EphemeralDocument-C-uLD1W7.js → EphemeralDocument-Bzv1mPpG.js} +1 -1
- package/dist-embed/chunks/{EphemeralNotebook-C_peDfqf.js → EphemeralNotebook-C4_wmSgk.js} +1 -1
- package/dist-embed/chunks/{ExcalidrawComponent-DHSxnPc9.js → ExcalidrawComponent-DVOnRDkN.js} +1 -1
- package/dist-embed/chunks/{ExcalidrawModal-BpsfNG-u.js → ExcalidrawModal-B0h_-M3l.js} +1 -1
- package/dist-embed/chunks/{JupyterLexicalExtension-BUSLnJVL.js → JupyterLexicalExtension-B2PQrLXS.js} +9 -9
- package/dist-embed/chunks/{KernelVariables-Cu7UeFhT.js → KernelVariables-trZsXNAi.js} +1 -1
- package/dist-embed/chunks/{LexicalToolRegistry-CNg1T5sQ.js → LexicalToolRegistry-8wJyLumb.js} +4 -4
- package/dist-embed/chunks/{NotebookToolSurfaces-Cm6-oE_W.js → NotebookToolSurfaces-BuKcXArX.js} +1 -1
- package/dist-embed/chunks/{NotebookView-Be2lNZjS.js → NotebookView-Em4y6Een.js} +1 -1
- package/dist-embed/chunks/{Output-OIgTyxpD.js → Output-DA8Udq91.js} +1 -1
- package/dist-embed/chunks/{SandboxDetailsDialog-BMq0tlcE.js → SandboxDetailsDialog-o2z6YFyb.js} +1 -1
- package/dist-embed/chunks/{SchemaForm-D3mmq2C1.js → SchemaForm-DCt_mqR1.js} +1 -1
- package/dist-embed/chunks/{WidgetVariableView-DnuwkCHl.js → WidgetVariableView-CDEFi0p0.js} +1 -1
- package/dist-embed/chunks/{YouTubePlugin-Bum16ua6.js → YouTubePlugin-DxRPFzvS.js} +1 -1
- package/dist-embed/chunks/{abnfDiagram-VCTEODGH-Dac38D-P.js → abnfDiagram-VCTEODGH-Cit223SC.js} +1 -1
- package/dist-embed/chunks/{abnfDiagram-VCTEODGH-BMkFygW4.js → abnfDiagram-VCTEODGH-CsoEWluu.js} +1 -1
- package/dist-embed/chunks/{ar-SA-G6X2FPQ2-JDFjD_Dk.js → ar-SA-G6X2FPQ2-CjJtC55z.js} +1 -1
- package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-D7VBU0uf.js → architectureDiagram-5GKGNRK7-DfqpfKOB.js} +1 -1
- package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-DXJTBh9S.js → architectureDiagram-5GKGNRK7-DyQuZM-c.js} +1 -1
- package/dist-embed/chunks/{az-AZ-76LH7QW2-AbN1w5Zy.js → az-AZ-76LH7QW2-B7KkL6wt.js} +1 -1
- package/dist-embed/chunks/{bg-BG-XCXSNQG7-BULkJsTf.js → bg-BG-XCXSNQG7-D7UwtEhO.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-868be97b-Bk9MNjmt.js → blockDiagram-868be97b-jJKAH_Up.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-I7D4REHJ-CKjKQ6Dq.js → blockDiagram-I7D4REHJ-BcQwB7-r.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-I7D4REHJ-BwenaP7n.js → blockDiagram-I7D4REHJ-z3xnLtdG.js} +1 -1
- package/dist-embed/chunks/{bn-BD-2XOGV67Q-B6EtUyIk.js → bn-BD-2XOGV67Q-pDDWE9Mn.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-3f4bdde3-BGoSdP5p.js → c4Diagram-3f4bdde3-DU_-LipO.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-7LVT6UL2-DlkcVfDa.js → c4Diagram-7LVT6UL2-BeMfCOG_.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-7LVT6UL2-BZRokUDB.js → c4Diagram-7LVT6UL2-DjfnLrWZ.js} +1 -1
- package/dist-embed/chunks/{ca-ES-6MX7JW3Y-BZ0wzUck.js → ca-ES-6MX7JW3Y-By1uEeFx.js} +1 -1
- package/dist-embed/chunks/{celltoolbartracker-CCRqu43G.js → celltoolbartracker-DcYHi8Du.js} +1 -1
- package/dist-embed/chunks/{chunk-2Q5K7J3B-DLu9zZx0.js → chunk-2Q5K7J3B-BGvvv_gg.js} +1 -1
- package/dist-embed/chunks/{chunk-2Q5K7J3B-CfYiHpfd.js → chunk-2Q5K7J3B-YWpfqKnX.js} +1 -1
- package/dist-embed/chunks/{chunk-5VM5RSS4-yHAygNq4.js → chunk-5VM5RSS4-4bCWL_eZ.js} +1 -1
- package/dist-embed/chunks/{chunk-5VM5RSS4-dV5IUPYK.js → chunk-5VM5RSS4-t-8mwHFb.js} +1 -1
- package/dist-embed/chunks/{chunk-F27PBJKO-BArvzx7H.js → chunk-F27PBJKO-3yGsHIDd.js} +1 -1
- package/dist-embed/chunks/{chunk-F27PBJKO-BeY8iI19.js → chunk-F27PBJKO-De9ONU-g.js} +1 -1
- package/dist-embed/chunks/{chunk-IMKFNOWR-BJRUyuXy.js → chunk-IMKFNOWR-Bvbi7lre.js} +1 -1
- package/dist-embed/chunks/{chunk-IMKFNOWR-iUeFNxCU.js → chunk-IMKFNOWR-DA2KJGep.js} +1 -1
- package/dist-embed/chunks/{chunk-JWPE2WC7-BDUBU4vN.js → chunk-JWPE2WC7-CVkDZh_H.js} +1 -1
- package/dist-embed/chunks/{chunk-JWPE2WC7-Djk-1JPJ.js → chunk-JWPE2WC7-w_AaYpEU.js} +1 -1
- package/dist-embed/chunks/{chunk-POPQ4Y6H-E4731IOt.js → chunk-POPQ4Y6H-C1mg0obI.js} +1 -1
- package/dist-embed/chunks/{chunk-POPQ4Y6H-CibXbz_c.js → chunk-POPQ4Y6H-DnstozKC.js} +1 -1
- package/dist-embed/chunks/{chunk-SVP7TREG-o7JviCXQ.js → chunk-SVP7TREG-CVLd6GtA.js} +1 -1
- package/dist-embed/chunks/{chunk-SVP7TREG-DeRyA6Ek.js → chunk-SVP7TREG-DmKkKduL.js} +1 -1
- package/dist-embed/chunks/{chunk-TICWLB2K-Zk_gUXIu.js → chunk-TICWLB2K-C-lEt3p0.js} +1 -1
- package/dist-embed/chunks/{chunk-TICWLB2K-BIhZcpwn.js → chunk-TICWLB2K-xv7MPgmq.js} +1 -1
- package/dist-embed/chunks/{chunk-XXDRQBXY-DATpHkZD.js → chunk-XXDRQBXY-Cq8wF2xQ.js} +1 -1
- package/dist-embed/chunks/{chunk-XXDRQBXY-Cp6f69YK.js → chunk-XXDRQBXY-j7xuWjIK.js} +1 -1
- package/dist-embed/chunks/{classDiagram-ZZMXUADV-BfpWJKcC.js → classDiagram-ZZMXUADV-DRPRMTvC.js} +1 -1
- package/dist-embed/chunks/{classDiagram-ZZMXUADV-DcutslOq.js → classDiagram-ZZMXUADV-Dvh08RMu.js} +1 -1
- package/dist-embed/chunks/{classDiagram-f62afe4f-BVLyWZwA.js → classDiagram-f62afe4f-B8-b8b-t.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-604399ef-CgcAzr_L.js → classDiagram-v2-604399ef-CHogX84-.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-BfpWJKcC.js → classDiagram-v2-VYDZK3BY-DRPRMTvC.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-DcutslOq.js → classDiagram-v2-VYDZK3BY-Dvh08RMu.js} +1 -1
- package/dist-embed/chunks/{code-block-IT6T5CEO-D5_yhrdD.js → code-block-IT6T5CEO-Dbm1cj5T.js} +1 -1
- package/dist-embed/chunks/{component-DoyMsR16.js → component-CsXw-w1P.js} +3 -3
- package/dist-embed/chunks/{cose-bilkent-JH36ORCC-B-LvsoyE.js → cose-bilkent-JH36ORCC-BrisaBwh.js} +1 -1
- package/dist-embed/chunks/{cose-bilkent-JH36ORCC-DhPsWJev.js → cose-bilkent-JH36ORCC-DGpwW9PH.js} +1 -1
- package/dist-embed/chunks/{createText-aed3d8b3-CnP7VdTn.js → createText-aed3d8b3-C8C5hNtS.js} +1 -1
- package/dist-embed/chunks/{cs-CZ-2BRQDIVT-CHIiQJ-9.js → cs-CZ-2BRQDIVT-TB9QxoL2.js} +1 -1
- package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-B4k-OykO.js → cynefinDiagram-5FMLGOSQ-B37BRKcq.js} +1 -1
- package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-D4zzGd7W.js → cynefinDiagram-5FMLGOSQ-NXny6Mot.js} +1 -1
- package/dist-embed/chunks/{da-DK-5WZEPLOC-dfN2SAKQ.js → da-DK-5WZEPLOC-CLl8TZ2P.js} +1 -1
- package/dist-embed/chunks/{dagre-GXQ25YYZ-BlWkzzlo.js → dagre-GXQ25YYZ-b03jeXc5.js} +1 -1
- package/dist-embed/chunks/{dagre-GXQ25YYZ-DUrWhbsC.js → dagre-GXQ25YYZ-mM6SsGs8.js} +1 -1
- package/dist-embed/chunks/{de-DE-XR44H4JA-BKsKfmfo.js → de-DE-XR44H4JA-6gY_Hl4H.js} +1 -1
- package/dist-embed/chunks/{diagram-S7CK7UJ4-BuRBzTwI.js → diagram-S7CK7UJ4-C8TF_Y_V.js} +1 -1
- package/dist-embed/chunks/{diagram-S7CK7UJ4-FxHXDIYr.js → diagram-S7CK7UJ4-fpaH_1xM.js} +1 -1
- package/dist-embed/chunks/{diagram-UQ7AKVKN-CeDT8Vz4.js → diagram-UQ7AKVKN-CcqaQfbU.js} +1 -1
- package/dist-embed/chunks/{diagram-UQ7AKVKN-FxYHrvzF.js → diagram-UQ7AKVKN-G8fspx37.js} +1 -1
- package/dist-embed/chunks/{diagram-VSXAHHWV-C2icUdkA.js → diagram-VSXAHHWV-B3Q41FOl.js} +1 -1
- package/dist-embed/chunks/{diagram-VSXAHHWV-Cv0WAiv8.js → diagram-VSXAHHWV-DLhWEHn-.js} +1 -1
- package/dist-embed/chunks/{diagram-VX7I27RA-AoxkG7BW.js → diagram-VX7I27RA-Dnbm3teD.js} +1 -1
- package/dist-embed/chunks/{diagram-VX7I27RA-D6VPVMhu.js → diagram-VX7I27RA-Dy-IHeZr.js} +1 -1
- package/dist-embed/chunks/{diagram-Z3DM3KII-DxunLDOr.js → diagram-Z3DM3KII-BkiB9_Ay.js} +1 -1
- package/dist-embed/chunks/{diagram-Z3DM3KII-CHxtPQ6F.js → diagram-Z3DM3KII-hE5FTtNp.js} +1 -1
- package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-CfsTBJc5.js → ebnfDiagram-PWID7BFC-DJhj6Mbd.js} +1 -1
- package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-CmJlfM6d.js → ebnfDiagram-PWID7BFC-DZiCEGSK.js} +1 -1
- package/dist-embed/chunks/{edges-b2856ca0-Cl5rq6T8.js → edges-b2856ca0-DuBY_rn3.js} +1 -1
- package/dist-embed/chunks/{el-GR-BZB4AONW-Cs0zPSU1.js → el-GR-BZB4AONW-CFGi_gqP.js} +1 -1
- package/dist-embed/chunks/{erDiagram-5d81789a-C0jmz-br.js → erDiagram-5d81789a-BYOejxuX.js} +1 -1
- package/dist-embed/chunks/{erDiagram-RLTQ6QDP-Dyljy6tN.js → erDiagram-RLTQ6QDP-Bg2UfSBM.js} +1 -1
- package/dist-embed/chunks/{erDiagram-RLTQ6QDP-FFD_URlX.js → erDiagram-RLTQ6QDP-v1tF2vX5.js} +1 -1
- package/dist-embed/chunks/{es-ES-U4NZUMDT-fGOqRf0o.js → es-ES-U4NZUMDT-D_HQumEp.js} +1 -1
- package/dist-embed/chunks/{eu-ES-A7QVB2H4-CLZ09rVe.js → eu-ES-A7QVB2H4-CvUID20p.js} +1 -1
- package/dist-embed/chunks/{fa-IR-HGAKTJCU-Cjimbc8n.js → fa-IR-HGAKTJCU-C7_Vi5QP.js} +1 -1
- package/dist-embed/chunks/{fi-FI-Z5N7JZ37-ZXNEW916.js → fi-FI-Z5N7JZ37-SBYxKS7Q.js} +1 -1
- package/dist-embed/chunks/{flowDb-185abca5-Cden9aoH.js → flowDb-185abca5-C_IywhMB.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-1629c991-Bar9YxSW.js → flowDiagram-1629c991-C8JQo90r.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-HODETNUW-bg09n0_F.js → flowDiagram-HODETNUW-BigtRRvu.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-HODETNUW-02Xo2-6n.js → flowDiagram-HODETNUW-Cd1y1bVx.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-v2-1d953310-C6FnOAb2.js → flowDiagram-v2-1d953310-DTH8N-sj.js} +1 -1
- package/dist-embed/chunks/{flowchart-elk-definition-6df44142-DcmMV2Wi.js → flowchart-elk-definition-6df44142-W8s7oFgJ.js} +1 -1
- package/dist-embed/chunks/{fr-FR-RHASNOE6-DQaq_g67.js → fr-FR-RHASNOE6-fAErz4Nf.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-3b0b3873-BN61xNrz.js → ganttDiagram-3b0b3873-D_XwfPDh.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-BCLyiaOJ.js → ganttDiagram-EL5Y4UJY-BIsU1Bcw.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-JviVPOnF.js → ganttDiagram-EL5Y4UJY-VT_s02F9.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CzBMuAvA.js → gitGraphDiagram-WWUBYQGX-BDdr_2gq.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CNc3l-2t.js → gitGraphDiagram-WWUBYQGX-BvxzF9hn.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-f01e8bc2-7ecaKDp7.js → gitGraphDiagram-f01e8bc2-UBa5a0HV.js} +1 -1
- package/dist-embed/chunks/{gl-ES-HMX3MZ6V-BlrLF7Sk.js → gl-ES-HMX3MZ6V-DCciQOEM.js} +1 -1
- package/dist-embed/chunks/{he-IL-6SHJWFNN-DLfo2nov.js → he-IL-6SHJWFNN-CuQhQVb2.js} +1 -1
- package/dist-embed/chunks/{hi-IN-IWLTKZ5I-BcbS0I1h.js → hi-IN-IWLTKZ5I-BlH8AK2z.js} +1 -1
- package/dist-embed/chunks/{hu-HU-A5ZG7DT2-B_-3TehM.js → hu-HU-A5ZG7DT2-BaBGhZVQ.js} +1 -1
- package/dist-embed/chunks/{id-ID-SAP4L64H-C920eBs5.js → id-ID-SAP4L64H-Dkm1zS1g.js} +1 -1
- package/dist-embed/chunks/{index-9bae90f3-_mZDJyzh.js → index-9bae90f3-CvHGNDGk.js} +1 -1
- package/dist-embed/chunks/{index-W-qUA31l.js → index-B9aqZrHy.js} +1 -1
- package/dist-embed/chunks/{index-DbHMJ-IM.js → index-BDs-ntTo.js} +1 -1
- package/dist-embed/chunks/{index-D1CRwrf9.js → index-BQp4l7hT.js} +2 -2
- package/dist-embed/chunks/{index-D_-7qr4x.js → index-BcdbHyzT.js} +1 -1
- package/dist-embed/chunks/{index-DmKOrT_f.js → index-BqDJ3hYN.js} +1 -1
- package/dist-embed/chunks/{index-CuqMWXgT.js → index-CFP9psRB.js} +3 -3
- package/dist-embed/chunks/{index-C8N5z7FZ.js → index-CUAnjzKL.js} +1 -1
- package/dist-embed/chunks/{index-k3ISgWrJ.js → index-CWwj0zW9.js} +1 -1
- package/dist-embed/chunks/{index-DV2fNvY7.js → index-CecqH6mN.js} +1 -1
- package/dist-embed/chunks/{index-C3zGthUI.js → index-CoxYszKx.js} +1 -1
- package/dist-embed/chunks/{index-7V4MgoX0.js → index-CozDzMOf.js} +1 -1
- package/dist-embed/chunks/{index-C2UmIEOV.js → index-CrL-deXT.js} +1 -1
- package/dist-embed/chunks/{index-CW0DxnfF.js → index-CtEseCtc.js} +1 -1
- package/dist-embed/chunks/{index-OZDJ7kli.js → index-D2vkNPmG.js} +1 -1
- package/dist-embed/chunks/{index-MNZ1LVAM.js → index-D5xVRNk8.js} +1 -1
- package/dist-embed/chunks/{index-DmYrjwOw.js → index-D8wHLHbt.js} +1 -1
- package/dist-embed/chunks/{index-B0VC_nl2.js → index-DAZUOPnd.js} +1 -1
- package/dist-embed/chunks/{index-BbtA7ppb.js → index-DE_JTiwB.js} +1 -1
- package/dist-embed/chunks/{index-CLojGXLe.js → index-DMll0Yzi.js} +1 -1
- package/dist-embed/chunks/{index-DcbXB4Ou.js → index-DN-cizG6.js} +1 -1
- package/dist-embed/chunks/{index-DMTXHmrU.js → index-DPHM1WLM.js} +1 -1
- package/dist-embed/chunks/{index-Dyv67BU9.js → index-DSN70XMH.js} +2 -2
- package/dist-embed/chunks/{index-CGhVy6OJ.js → index-Dc5AqaeZ.js} +1 -1
- package/dist-embed/chunks/{index-B3qU5V3s.js → index-DdmqZZnv.js} +1 -1
- package/dist-embed/chunks/{index-BST3vALX.js → index-DlYw1KQn.js} +5 -5
- package/dist-embed/chunks/{index-C3p2Hbbg.js → index-Dobs-OKl.js} +1 -1
- package/dist-embed/chunks/{index-oJ3M8HYJ.js → index-Dp3JEvYy.js} +1 -1
- package/dist-embed/chunks/{index-D95mZTII.js → index-DsMBsL3g.js} +1 -1
- package/dist-embed/chunks/{index-BVdp0AG7.js → index-DvyxBamA.js} +4 -4
- package/dist-embed/chunks/{index-BMqDh5WU.js → index-SsFECYMb.js} +1 -1
- package/dist-embed/chunks/{index-DqwL86GY.js → index-YVrQYH-H.js} +12 -12
- package/dist-embed/chunks/{index-DSts8s_N.js → index-a9o1fYab.js} +1 -1
- package/dist-embed/chunks/{index-BVkaRzYN.js → index-bC_5dTbf.js} +4 -4
- package/dist-embed/chunks/{index--rbc1jdS.js → index-jJxXKHoT.js} +1 -1
- package/dist-embed/chunks/{index.esm-Dy7cyZyH.js → index.esm-p0OnSU9h.js} +1 -1
- package/dist-embed/chunks/{index.esm-jFa95d0B.js → index.esm-q_fIJH5v.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-27XIBGKW-CuQ0a02I.js → infoDiagram-27XIBGKW-DIeaDzEK.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-27XIBGKW-CDc0DV-6.js → infoDiagram-27XIBGKW-DZ6Xhv3K.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-a29d40f1-BKWmVk4B.js → infoDiagram-a29d40f1-B9PMyz4X.js} +1 -1
- package/dist-embed/chunks/{isEqual-SWNqZJZT.js → isEqual-Cwjr2skl.js} +1 -1
- package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-CPu6wHAG.js → ishikawaDiagram-5VMMS53U-BP4Q8nEu.js} +1 -1
- package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-BY7eKNmA.js → ishikawaDiagram-5VMMS53U-CwrdITPn.js} +1 -1
- package/dist-embed/chunks/{it-IT-JPQ66NNP-CsJELR-H.js → it-IT-JPQ66NNP-BrcctIsI.js} +1 -1
- package/dist-embed/chunks/{ja-JP-DBVTYXUO-Bh4bW0cv.js → ja-JP-DBVTYXUO-CKuJ3Sod.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-6CRYfcQL.js → journeyDiagram-3NMN7TZE-iJrCUeL0.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-Cv_KZqY3.js → journeyDiagram-3NMN7TZE-wI34jsXX.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-95396277-yJruA0Fm.js → journeyDiagram-95396277-B6WhL2Fl.js} +1 -1
- package/dist-embed/chunks/{kaa-6HZHGXH3-BmDtc0g0.js → kaa-6HZHGXH3-ChFYZBwI.js} +1 -1
- package/dist-embed/chunks/{kab-KAB-ZGHBKWFO-Bluox3dD.js → kab-KAB-ZGHBKWFO-C7C7EuVk.js} +1 -1
- package/dist-embed/chunks/{kanban-definition-UXKFOSKX-Biauy1A4.js → kanban-definition-UXKFOSKX-B8AB0LN4.js} +1 -1
- package/dist-embed/chunks/{kanban-definition-UXKFOSKX-Dps45ZlJ.js → kanban-definition-UXKFOSKX-gqU76cK9.js} +1 -1
- package/dist-embed/chunks/{kk-KZ-P5N5QNE5-EZjFhsK8.js → kk-KZ-P5N5QNE5-Bff18CC1.js} +1 -1
- package/dist-embed/chunks/{km-KH-HSX4SM5Z-BpZu76AC.js → km-KH-HSX4SM5Z-DU2YQt8I.js} +1 -1
- package/dist-embed/chunks/{ko-KR-MTYHY66A-C5JZPTHd.js → ko-KR-MTYHY66A-CQruDlRn.js} +1 -1
- package/dist-embed/chunks/{ku-TR-6OUDTVRD-BUaf6TOB.js → ku-TR-6OUDTVRD-DoySMeIi.js} +1 -1
- package/dist-embed/chunks/{layout-C8INuwYa.js → layout-CJFemkl6.js} +1 -1
- package/dist-embed/chunks/{layout-CEbgEIwd.js → layout-DbdaqszO.js} +1 -1
- package/dist-embed/chunks/{lexicalHooks-DFMSPigW.js → lexicalHooks-Pqoe8h_O.js} +1 -1
- package/dist-embed/chunks/{lt-LT-XHIRWOB4-CuGmKRQr.js → lt-LT-XHIRWOB4-72Vmr8iW.js} +1 -1
- package/dist-embed/chunks/{lv-LV-5QDEKY6T-EYERw_NP.js → lv-LV-5QDEKY6T-CxtO97qO.js} +1 -1
- package/dist-embed/chunks/{mermaid.core-BeAq5EQp.js → mermaid.core-CAzPWd8O.js} +3 -3
- package/dist-embed/chunks/{mermaid.core-hzdTpjmh.js → mermaid.core-DaZxhAXO.js} +5 -5
- package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-iB7eW5x9.js → mindmap-definition-YA3MSWOX-D8W0sJ7P.js} +1 -1
- package/dist-embed/chunks/{mindmap-definition-YA3MSWOX--O06aygF.js → mindmap-definition-YA3MSWOX-DPl-uWpT.js} +1 -1
- package/dist-embed/chunks/{mindmap-definition-e4c1d938-DCwgMhNw.js → mindmap-definition-e4c1d938-CGXwlH4A.js} +1 -1
- package/dist-embed/chunks/{mr-IN-CRQNXWMA-SKx4bMeU.js → mr-IN-CRQNXWMA-BNGEl_QE.js} +1 -1
- package/dist-embed/chunks/{my-MM-5M5IBNSE-BG-vgEXz.js → my-MM-5M5IBNSE-4wIAMvGF.js} +1 -1
- package/dist-embed/chunks/{nb-NO-T6EIAALU-BbW-11AI.js → nb-NO-T6EIAALU-z-1s9yX9.js} +1 -1
- package/dist-embed/chunks/{nl-NL-IS3SIHDZ-CSKGpuSJ.js → nl-NL-IS3SIHDZ-CYKGEVB8.js} +1 -1
- package/dist-embed/chunks/{nn-NO-6E72VCQL-P1tnp9TQ.js → nn-NO-6E72VCQL-DwQFIFpO.js} +1 -1
- package/dist-embed/chunks/{oc-FR-POXYY2M6-vpu8tuQT.js → oc-FR-POXYY2M6-mH2n3eM_.js} +1 -1
- package/dist-embed/chunks/{pa-IN-N4M65BXN-CIpdGll2.js → pa-IN-N4M65BXN-DbixE6jQ.js} +1 -1
- package/dist-embed/chunks/{pegDiagram-XKGWAZYB-Bon6jQ3L.js → pegDiagram-XKGWAZYB-D3qs3UBw.js} +1 -1
- package/dist-embed/chunks/{pegDiagram-XKGWAZYB-ZPizxhEX.js → pegDiagram-XKGWAZYB-DJmZupPa.js} +1 -1
- package/dist-embed/chunks/{percentages-BXMCSKIN-hVEpOtFm.js → percentages-BXMCSKIN-5Q9KX_WU.js} +5 -5
- package/dist-embed/chunks/{pieDiagram-E7YTZNPT-C0Pc9GUi.js → pieDiagram-E7YTZNPT-C58cd6s7.js} +1 -1
- package/dist-embed/chunks/{pieDiagram-E7YTZNPT-Di8dEHt9.js → pieDiagram-E7YTZNPT-CrZQ-dOy.js} +1 -1
- package/dist-embed/chunks/{pieDiagram-c941bede-C--hwbRv.js → pieDiagram-c941bede-Dn3GMx6q.js} +1 -1
- package/dist-embed/chunks/{pl-PL-T2D74RX3-Ckyj0Mzv.js → pl-PL-T2D74RX3-jOVonFYe.js} +1 -1
- package/dist-embed/chunks/{pt-BR-5N22H2LF-3jDc9_Aa.js → pt-BR-5N22H2LF-Cx4MrqgK.js} +1 -1
- package/dist-embed/chunks/{pt-PT-UZXXM6DQ-lhLbXf7Q.js → pt-PT-UZXXM6DQ-B2PzNwuF.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-D0QYtpIp.js → quadrantDiagram-AXDQQJYC-CJn8hkR8.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-Ffo3hgR0.js → quadrantDiagram-AXDQQJYC-haT-kxqE.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-cf8b8fe0-Bqmed-0s.js → quadrantDiagram-cf8b8fe0-B3wudq14.js} +1 -1
- package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-BMC9Ldnh.js → railroadDiagram-O6MQD6OU-T23yIHww.js} +1 -1
- package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-aTc7bF4I.js → railroadDiagram-O6MQD6OU-Ty6XXjBy.js} +1 -1
- package/dist-embed/chunks/{renderer-CR6Lxa3d.js → renderer-Au1S-H5k.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-53bda41b-DExdw0ey.js → requirementDiagram-53bda41b-B-eAYQ6c.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-DBj1iVv5.js → requirementDiagram-BXWQKSXE-CgkHdmYF.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-mBFLHcqA.js → requirementDiagram-BXWQKSXE-fpBmgh7Q.js} +1 -1
- package/dist-embed/chunks/{ro-RO-JPDTUUEW-Dy9oeW3b.js → ro-RO-JPDTUUEW-BCQxuLcc.js} +1 -1
- package/dist-embed/chunks/{ru-RU-B4JR7IUQ-CK16-wfD.js → ru-RU-B4JR7IUQ-CqSiHvqj.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-9W9X5V7a.js → sankeyDiagram-P5KCCOFB-DEGMK43Q.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-DzaadHXz.js → sankeyDiagram-P5KCCOFB-hDbZE81L.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-c3ef121a-B6u8wnkU.js → sankeyDiagram-c3ef121a-O14jOeqO.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-82a5b84f-Bq8bvLh8.js → sequenceDiagram-82a5b84f-BFFzLElQ.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-BNfJw8_y.js → sequenceDiagram-WJ2MYXX4-MrC4K4SC.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-B76NTf4c.js → sequenceDiagram-WJ2MYXX4-wongMGVN.js} +1 -1
- package/dist-embed/chunks/{sessions-XxjScqnJ.js → sessions-BRALW9Yv.js} +1 -1
- package/dist-embed/chunks/{si-LK-N5RQ5JYF-AJdaUbzl.js → si-LK-N5RQ5JYF-Dbgk5YHt.js} +1 -1
- package/dist-embed/chunks/{sizeCapture-INFHLROL-KZBUxNmb.js → sizeCapture-INFHLROL-CiOiAAo5.js} +1 -1
- package/dist-embed/chunks/{sizeCapture-INFHLROL-DQ5s0TIW.js → sizeCapture-INFHLROL-j4-sCda0.js} +1 -1
- package/dist-embed/chunks/{sk-SK-C5VTKIMK-Bk82hIVU.js → sk-SK-C5VTKIMK-OBAaNvVw.js} +1 -1
- package/dist-embed/chunks/{sl-SI-NN7IZMDC-DSFcvf6W.js → sl-SI-NN7IZMDC-DqLxi4IM.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-43e79a5f-BiTTNI1Z.js → stateDiagram-43e79a5f-BZm5gFdu.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-D77RDMKH-lndPMO3D.js → stateDiagram-D77RDMKH-D7_xyy8n.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-D77RDMKH-D4hQpdZ2.js → stateDiagram-D77RDMKH-DXrbH1aM.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-2041ed4f-BbFiQEfG.js → stateDiagram-v2-2041ed4f-DiXOgJsK.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-pqcRT12A.js → stateDiagram-v2-MP3YSRHH-DLsY6ysL.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-C-kIBdBJ.js → stateDiagram-v2-MP3YSRHH-ngWpJn6k.js} +1 -1
- package/dist-embed/chunks/{styles-455b33cd-U9lx7mAf.js → styles-455b33cd-CrHizSU7.js} +1 -1
- package/dist-embed/chunks/{styles-f932cba9-S-lYZYdK.js → styles-f932cba9-YuCN7fSa.js} +1 -1
- package/dist-embed/chunks/{styles-fcc2142b-DfudfB3j.js → styles-fcc2142b-tjrOPOh4.js} +1 -1
- package/dist-embed/chunks/{subset-shared.chunk-f2gmZjeG.js → subset-shared.chunk-Du2agLgk.js} +1 -1
- package/dist-embed/chunks/{subset-worker.chunk-De1CPIQ6.js → subset-worker.chunk-BXR8pgHc.js} +1 -1
- package/dist-embed/chunks/{sv-SE-XGPEYMSR-BbGfLHIi.js → sv-SE-XGPEYMSR-BbgHKxhC.js} +1 -1
- package/dist-embed/chunks/{svgDrawCommon-148a3cd9-ClgHG0vb.js → svgDrawCommon-148a3cd9-DTqtvo5_.js} +1 -1
- package/dist-embed/chunks/{swimlanes-42K2YHIH-OqZ4t-07.js → swimlanes-42K2YHIH-B289Mbni.js} +1 -1
- package/dist-embed/chunks/{swimlanes-42K2YHIH-CjV1bdPk.js → swimlanes-42K2YHIH-B3H_wpMu.js} +1 -1
- package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-9twpvQtj.js → swimlanesDiagram-VR7AAH4N-D0ZHzw-_.js} +1 -1
- package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-BdS4NGOx.js → swimlanesDiagram-VR7AAH4N-qWg-2xN_.js} +1 -1
- package/dist-embed/chunks/{ta-IN-2NMHFXQM-BWMJgnI2.js → ta-IN-2NMHFXQM-0pH7gQyu.js} +1 -1
- package/dist-embed/chunks/{th-TH-HPSO5L25-DiP_CZXl.js → th-TH-HPSO5L25-Dvbu09CU.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-24CTP7MA-B7uSaXDu.js → timeline-definition-24CTP7MA-DUc18SdK.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-24CTP7MA-Cs4Bwobu.js → timeline-definition-24CTP7MA-DpMq7g2g.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-7545f45a-CHrBluu1.js → timeline-definition-7545f45a--4ypi4BE.js} +1 -1
- package/dist-embed/chunks/{tr-TR-DEFEU3FU-CKMBvOkr.js → tr-TR-DEFEU3FU-B6YS3iEB.js} +1 -1
- package/dist-embed/chunks/{uk-UA-QMV73CPH-CQL0E0jU.js → uk-UA-QMV73CPH-DMG9vIVp.js} +1 -1
- package/dist-embed/chunks/{vennDiagram-4TSXK5OY-uwWpr4uC.js → vennDiagram-4TSXK5OY-CS12EGJw.js} +1 -1
- package/dist-embed/chunks/{vennDiagram-4TSXK5OY-CHSyRZN_.js → vennDiagram-4TSXK5OY-CvEXE1xX.js} +1 -1
- package/dist-embed/chunks/{vi-VN-M7AON7JQ-BpvEBNJo.js → vi-VN-M7AON7JQ-DB3ZrpeP.js} +1 -1
- package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-0UuvD-IO.js → wardleyDiagram-VM6X3IG4-8LfGni9_.js} +1 -1
- package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-zIfOyYBf.js → wardleyDiagram-VM6X3IG4-Bj02LzjH.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-3f383b91-ChbRPzo8.js → xychartDiagram-3f383b91-CE_OY5QR.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-hCGgyjir.js → xychartDiagram-S5SC5T6Z-BdZi5x4a.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-q9gcUSF1.js → xychartDiagram-S5SC5T6Z-DXqC0l3r.js} +1 -1
- package/dist-embed/chunks/{zh-CN-LNUGB5OW-DWmzAIjK.js → zh-CN-LNUGB5OW-VV-lg83H.js} +1 -1
- package/dist-embed/chunks/{zh-HK-E62DVLB3-CQ-xPzHX.js → zh-HK-E62DVLB3-DLoyC6Q9.js} +1 -1
- package/dist-embed/chunks/{zh-TW-RAJ6MFWO-DvlSTykD.js → zh-TW-RAJ6MFWO-DhFllgOW.js} +1 -1
- package/dist-embed/datalayer-app-main.js +54 -54
- package/lib/apps/apps/records.d.ts +0 -29
- package/lib/apps/apps/records.js +11 -34
- package/lib/apps/apps/threads.d.ts +2 -21
- package/lib/apps/apps/threads.js +0 -75
- package/lib/apps/embed/embedSession.d.ts +0 -8
- package/lib/apps/embed/embedSession.js +1 -38
- package/lib/apps/embed/visitorApp.d.ts +23 -4
- package/lib/apps/embed/visitorApp.js +43 -5
- package/lib/apps/plugins/chat/ChatView.js +15 -3
- package/lib/chat/ChatFloating.js +4 -1
- package/lib/chat/base/ChatBase.js +12 -4
- package/lib/chat/base/fullContextMessages.js +1 -1
- package/lib/chat/prompt/InputPrompt.d.ts +6 -1
- package/lib/chat/prompt/InputPrompt.js +12 -2
- package/lib/hooks/useAgUi.js +1 -1
- package/lib/hooks/useToolApprovals.d.ts +1 -1
- package/lib/hooks/useToolApprovals.js +1 -1
- package/lib/{protocols → portable}/agUiRefusal.d.ts +1 -1
- package/lib/{protocols → portable}/agUiRefusal.js +1 -1
- package/lib/portable/agui.d.ts +72 -0
- package/lib/portable/agui.js +174 -0
- package/lib/portable/conversation.d.ts +124 -0
- package/lib/portable/conversation.js +357 -0
- package/lib/portable/index.d.ts +11 -6
- package/lib/portable/index.js +14 -11
- package/lib/portable/records.d.ts +27 -0
- package/lib/portable/records.js +46 -0
- package/lib/portable/sessions.d.ts +92 -0
- package/lib/portable/sessions.js +134 -0
- package/lib/portable/thread.d.ts +41 -0
- package/lib/portable/thread.js +102 -0
- package/lib/protocols/AGUIAdapter.d.ts +0 -2
- package/lib/protocols/AGUIAdapter.js +39 -74
- package/lib/voice/ComposerVoice.d.ts +15 -2
- package/lib/voice/ComposerVoice.js +23 -17
- package/lib/voice/VoiceMenu.d.ts +27 -0
- package/lib/voice/VoiceMenu.js +32 -0
- package/lib/voice/chatVoice.js +2 -2
- package/lib/voice/choices.d.ts +33 -0
- package/lib/voice/choices.js +70 -0
- package/lib/voice/index.d.ts +4 -0
- package/lib/voice/index.js +3 -0
- package/lib/voice/settings.d.ts +17 -1
- package/lib/voice/settings.js +64 -1
- package/lib/voice/useVoiceSettings.d.ts +6 -0
- package/lib/voice/useVoiceSettings.js +25 -0
- package/package.json +1 -1
- package/dist-embed/chunks/ChatView-C2La9033.js +0 -32
- /package/lib/{utils → portable}/approvals.d.ts +0 -0
- /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
|
/**
|
package/lib/apps/apps/records.js
CHANGED
|
@@ -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
|
-
*
|
|
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[]>;
|
package/lib/apps/apps/threads.js
CHANGED
|
@@ -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 {
|
|
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/
|
|
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
|
-
/**
|
|
66
|
-
|
|
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/
|
|
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
|
-
/**
|
|
24
|
-
|
|
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 {
|
|
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,
|
|
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
|
-
|
|
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?.(),
|
|
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;
|
package/lib/chat/ChatFloating.js
CHANGED
|
@@ -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
|
-
|
|
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 '../../
|
|
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
|
-
|
|
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,
|
|
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 '../../
|
|
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
|
|
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
|
package/lib/hooks/useAgUi.js
CHANGED
|
@@ -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 '../
|
|
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 '../
|
|
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 '../
|
|
24
|
+
import { normalizeApproval } from '../portable/approvals';
|
|
25
25
|
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
26
26
|
const APPROVALS_ROOT_KEY = ['tool-approvals'];
|
|
27
27
|
function matchesFilter(a, filters) {
|