@datalayer/agent-runtimes 1.5.17 → 1.5.19
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-CMBy5o1q.js → AgentDetails-jDVTZOUO.js} +1 -1
- package/dist-embed/chunks/{AgentDetailsDialog-D2vH2Nrd.js → AgentDetailsDialog-BLC4yhCo.js} +1 -1
- package/dist-embed/chunks/{AgentInspector-Bd0oHNAX.js → AgentInspector-DBI8tAJ0.js} +1 -1
- package/dist-embed/chunks/{AgentInspectorDialog-BJUgBPAE.js → AgentInspectorDialog-xW2BjxJT.js} +1 -1
- package/dist-embed/chunks/{CellSidebarExtension-CYOVwk1t.js → CellSidebarExtension-D4_DkfUV.js} +1 -1
- package/dist-embed/chunks/ChatView-CpY0werd.js +32 -0
- package/dist-embed/chunks/{ContextPie-B9mAKJc2.js → ContextPie-Cebjx8jR.js} +1 -1
- package/dist-embed/chunks/{DeckComponent-CbmzVWcF.js → DeckComponent-B0pIJhTp.js} +2 -2
- package/dist-embed/chunks/{DocumentView-BqsGfNys.js → DocumentView-CS_ILd4O.js} +1 -1
- package/dist-embed/chunks/{EphemeralDocument-DLaNvwm_.js → EphemeralDocument-CwauqhmY.js} +1 -1
- package/dist-embed/chunks/{EphemeralNotebook-jnqAJFPI.js → EphemeralNotebook-BgC-YEtX.js} +1 -1
- package/dist-embed/chunks/{ExcalidrawComponent-Cb8yeXqu.js → ExcalidrawComponent-jOeuq53P.js} +1 -1
- package/dist-embed/chunks/{ExcalidrawModal-DaPSGYek.js → ExcalidrawModal-RsJGL2o8.js} +1 -1
- package/dist-embed/chunks/{JupyterLexicalExtension-BQINjIFV.js → JupyterLexicalExtension-BgcLmrzO.js} +9 -9
- package/dist-embed/chunks/{KernelVariables-CGQkS5EX.js → KernelVariables-cBMhcW1H.js} +1 -1
- package/dist-embed/chunks/{LexicalToolRegistry-BJ6mpMWn.js → LexicalToolRegistry-0QBhZnFO.js} +1 -1
- package/dist-embed/chunks/{NotebookToolSurfaces-DiPifvaW.js → NotebookToolSurfaces-D1GnK3rj.js} +1 -1
- package/dist-embed/chunks/{NotebookView-IX0wNuX8.js → NotebookView-CC5s4q0A.js} +1 -1
- package/dist-embed/chunks/{Output-B9XAhyoF.js → Output-B4b0TC6x.js} +1 -1
- package/dist-embed/chunks/{SandboxDetailsDialog-COCpmo8m.js → SandboxDetailsDialog-DhH0cSRN.js} +1 -1
- package/dist-embed/chunks/{SchemaForm-WIwdKnrk.js → SchemaForm-CPiM13ub.js} +1 -1
- package/dist-embed/chunks/{WidgetVariableView-BoGROi-A.js → WidgetVariableView-CUqRH-Wi.js} +1 -1
- package/dist-embed/chunks/{YouTubePlugin-BEQBWMwx.js → YouTubePlugin-CGKNamMP.js} +1 -1
- package/dist-embed/chunks/{abnfDiagram-VCTEODGH-D3_T0Lze.js → abnfDiagram-VCTEODGH-DRoYJDMb.js} +1 -1
- package/dist-embed/chunks/{abnfDiagram-VCTEODGH-CG18Hf18.js → abnfDiagram-VCTEODGH-DqGkvvLU.js} +1 -1
- package/dist-embed/chunks/{ar-SA-G6X2FPQ2-BDWXsTdt.js → ar-SA-G6X2FPQ2-BdYlCgqh.js} +1 -1
- package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-B1QPAYO8.js → architectureDiagram-5GKGNRK7-B4WL7dDA.js} +1 -1
- package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-B5kSsKje.js → architectureDiagram-5GKGNRK7-BfuR2k3K.js} +1 -1
- package/dist-embed/chunks/{az-AZ-76LH7QW2-BGchGiT7.js → az-AZ-76LH7QW2-BAJSVApS.js} +1 -1
- package/dist-embed/chunks/{bg-BG-XCXSNQG7-vCII6Zuq.js → bg-BG-XCXSNQG7-CutR4A8o.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-868be97b-BvM0ptp7.js → blockDiagram-868be97b-gX0yvAGO.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-I7D4REHJ-ClwWG8yx.js → blockDiagram-I7D4REHJ-BzMuNIFV.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-I7D4REHJ-B8BmxOM4.js → blockDiagram-I7D4REHJ-CI05Fmnw.js} +1 -1
- package/dist-embed/chunks/{bn-BD-2XOGV67Q-Beu9yUTu.js → bn-BD-2XOGV67Q-CjPnVerm.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-3f4bdde3-S92W2yOx.js → c4Diagram-3f4bdde3-CWKvySqQ.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-7LVT6UL2-CNWW_-u7.js → c4Diagram-7LVT6UL2-BVZdygZu.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-7LVT6UL2-nSCKKLuX.js → c4Diagram-7LVT6UL2-BfaHhF7Y.js} +1 -1
- package/dist-embed/chunks/{ca-ES-6MX7JW3Y-CnEo6YQi.js → ca-ES-6MX7JW3Y-D0HWiwHb.js} +1 -1
- package/dist-embed/chunks/{celltoolbartracker-CO6V5FhH.js → celltoolbartracker-DB7Qnu48.js} +1 -1
- package/dist-embed/chunks/{chunk-2Q5K7J3B--r8j4N5L.js → chunk-2Q5K7J3B-Ck5gIh4V.js} +1 -1
- package/dist-embed/chunks/{chunk-2Q5K7J3B-D3fTIaw3.js → chunk-2Q5K7J3B-DEZpvDtA.js} +1 -1
- package/dist-embed/chunks/{chunk-5VM5RSS4-D76mXyWz.js → chunk-5VM5RSS4-BFWTcAj1.js} +1 -1
- package/dist-embed/chunks/{chunk-5VM5RSS4-QmrgOATO.js → chunk-5VM5RSS4-DVfmoMLA.js} +1 -1
- package/dist-embed/chunks/{chunk-F27PBJKO-DvNrStTM.js → chunk-F27PBJKO-BjmQwwGl.js} +1 -1
- package/dist-embed/chunks/{chunk-F27PBJKO-DdSgBnK0.js → chunk-F27PBJKO-wR8Z4fpP.js} +1 -1
- package/dist-embed/chunks/{chunk-IMKFNOWR-DpxND1Ct.js → chunk-IMKFNOWR-DnYdav9f.js} +1 -1
- package/dist-embed/chunks/{chunk-IMKFNOWR-DwqmSZhU.js → chunk-IMKFNOWR-Dzk9sHxf.js} +1 -1
- package/dist-embed/chunks/{chunk-JWPE2WC7-i7V3vMtZ.js → chunk-JWPE2WC7-Ble97p_W.js} +1 -1
- package/dist-embed/chunks/{chunk-JWPE2WC7-jla8jvq5.js → chunk-JWPE2WC7-DyqhVk-0.js} +1 -1
- package/dist-embed/chunks/{chunk-POPQ4Y6H-BGCugXU7.js → chunk-POPQ4Y6H-CQpYIqjb.js} +1 -1
- package/dist-embed/chunks/{chunk-POPQ4Y6H-ofrenTaa.js → chunk-POPQ4Y6H-CtT0-VOM.js} +1 -1
- package/dist-embed/chunks/{chunk-SVP7TREG-BIxxVjkU.js → chunk-SVP7TREG-BTtpQsSJ.js} +1 -1
- package/dist-embed/chunks/{chunk-SVP7TREG-2Q2uQyQk.js → chunk-SVP7TREG-CwdiQONE.js} +1 -1
- package/dist-embed/chunks/{chunk-TICWLB2K-BqA5q52L.js → chunk-TICWLB2K-BfGhImQo.js} +1 -1
- package/dist-embed/chunks/{chunk-TICWLB2K-LNiCmYq5.js → chunk-TICWLB2K-D3UY4Hgl.js} +1 -1
- package/dist-embed/chunks/{chunk-XXDRQBXY-CqtfA3WC.js → chunk-XXDRQBXY-BaxFY2Jg.js} +1 -1
- package/dist-embed/chunks/{chunk-XXDRQBXY-CNMg_gvd.js → chunk-XXDRQBXY-a1EY5SM8.js} +1 -1
- package/dist-embed/chunks/{classDiagram-ZZMXUADV-D6z_X195.js → classDiagram-ZZMXUADV-C0eJXn7r.js} +1 -1
- package/dist-embed/chunks/{classDiagram-ZZMXUADV-Co0jT9i-.js → classDiagram-ZZMXUADV-Cop7Dp41.js} +1 -1
- package/dist-embed/chunks/{classDiagram-f62afe4f-lN62p17q.js → classDiagram-f62afe4f-BGkVvslN.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-604399ef-B_QJ6H8h.js → classDiagram-v2-604399ef-CPwahFkc.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-D6z_X195.js → classDiagram-v2-VYDZK3BY-C0eJXn7r.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-Co0jT9i-.js → classDiagram-v2-VYDZK3BY-Cop7Dp41.js} +1 -1
- package/dist-embed/chunks/{code-block-IT6T5CEO-BA38Km-f.js → code-block-IT6T5CEO-DEZxRmcq.js} +1 -1
- package/dist-embed/chunks/{component-Chor_J7e.js → component-B8gGyr50.js} +1 -1
- package/dist-embed/chunks/{cose-bilkent-JH36ORCC-B5H1cwBa.js → cose-bilkent-JH36ORCC-CQ3UHpys.js} +1 -1
- package/dist-embed/chunks/{cose-bilkent-JH36ORCC-C3cTgEcU.js → cose-bilkent-JH36ORCC-whW3Ickm.js} +1 -1
- package/dist-embed/chunks/{createText-aed3d8b3-BtgHeyNs.js → createText-aed3d8b3-BdWXGDj2.js} +1 -1
- package/dist-embed/chunks/{cs-CZ-2BRQDIVT-ClBKH9_y.js → cs-CZ-2BRQDIVT-DHo-9UK-.js} +1 -1
- package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-sdsAonZm.js → cynefinDiagram-5FMLGOSQ-C1dAzTZy.js} +1 -1
- package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-DPQLh9z7.js → cynefinDiagram-5FMLGOSQ-DKngj3tn.js} +1 -1
- package/dist-embed/chunks/{da-DK-5WZEPLOC-BqFDUAty.js → da-DK-5WZEPLOC-BLw7PbxL.js} +1 -1
- package/dist-embed/chunks/{dagre-GXQ25YYZ-DHF-9-7e.js → dagre-GXQ25YYZ-Bom0Ow10.js} +1 -1
- package/dist-embed/chunks/{dagre-GXQ25YYZ-Bwf_WjLM.js → dagre-GXQ25YYZ-BuHKUFJc.js} +1 -1
- package/dist-embed/chunks/{de-DE-XR44H4JA-6dsEQn7Z.js → de-DE-XR44H4JA-DqCVLDRk.js} +1 -1
- package/dist-embed/chunks/{diagram-S7CK7UJ4-DEqGRBMT.js → diagram-S7CK7UJ4-4zEkI5rV.js} +1 -1
- package/dist-embed/chunks/{diagram-S7CK7UJ4-C-N7Ei3I.js → diagram-S7CK7UJ4-H6Kef58R.js} +1 -1
- package/dist-embed/chunks/{diagram-UQ7AKVKN-DACyxI-v.js → diagram-UQ7AKVKN-DVAC1okH.js} +1 -1
- package/dist-embed/chunks/{diagram-UQ7AKVKN-CvSBE0YU.js → diagram-UQ7AKVKN-DeXqnBhe.js} +1 -1
- package/dist-embed/chunks/{diagram-VSXAHHWV-DFze2xro.js → diagram-VSXAHHWV-BYu3Niho.js} +1 -1
- package/dist-embed/chunks/{diagram-VSXAHHWV-DOb69VtE.js → diagram-VSXAHHWV-DJvcLGGT.js} +1 -1
- package/dist-embed/chunks/{diagram-VX7I27RA-CVTSdYyZ.js → diagram-VX7I27RA-BeOTI_JX.js} +1 -1
- package/dist-embed/chunks/{diagram-VX7I27RA-8EKYM_Sx.js → diagram-VX7I27RA-Cd39Txmj.js} +1 -1
- package/dist-embed/chunks/{diagram-Z3DM3KII-B-689FF6.js → diagram-Z3DM3KII-Ccg8IzPs.js} +1 -1
- package/dist-embed/chunks/{diagram-Z3DM3KII-DyiBmBFy.js → diagram-Z3DM3KII-DV4M-vr2.js} +1 -1
- package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-DcKvqn_h.js → ebnfDiagram-PWID7BFC-Ci7iqdKR.js} +1 -1
- package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-gj8dgCWR.js → ebnfDiagram-PWID7BFC-JrHbupeR.js} +1 -1
- package/dist-embed/chunks/{edges-b2856ca0-BqGGNnb4.js → edges-b2856ca0-D0Ve_cWg.js} +1 -1
- package/dist-embed/chunks/{el-GR-BZB4AONW-DOMW2ttY.js → el-GR-BZB4AONW-DWIe_es3.js} +1 -1
- package/dist-embed/chunks/{erDiagram-5d81789a-Bf1Ik49K.js → erDiagram-5d81789a-_wYWwZkR.js} +1 -1
- package/dist-embed/chunks/{erDiagram-RLTQ6QDP-B0PyZB_3.js → erDiagram-RLTQ6QDP-CgP-DSWO.js} +1 -1
- package/dist-embed/chunks/{erDiagram-RLTQ6QDP-GSu-_IUJ.js → erDiagram-RLTQ6QDP-D2UUMLBd.js} +1 -1
- package/dist-embed/chunks/{es-ES-U4NZUMDT-DeyWqjw1.js → es-ES-U4NZUMDT-C4nVLuzt.js} +1 -1
- package/dist-embed/chunks/{eu-ES-A7QVB2H4-CUGbZ0Pv.js → eu-ES-A7QVB2H4-DNtU9lgI.js} +1 -1
- package/dist-embed/chunks/{fa-IR-HGAKTJCU-Br8UEVO1.js → fa-IR-HGAKTJCU-C9d2dVkk.js} +1 -1
- package/dist-embed/chunks/{fi-FI-Z5N7JZ37-BSHjwo8G.js → fi-FI-Z5N7JZ37-BtMDQ3ec.js} +1 -1
- package/dist-embed/chunks/{flowDb-185abca5-U9PwWSO4.js → flowDb-185abca5-w4ZLOMwa.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-1629c991-BecgzQgp.js → flowDiagram-1629c991-CrRVLCnt.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-HODETNUW-2vih3kWM.js → flowDiagram-HODETNUW-BJpTxK5i.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-HODETNUW-tcAkcGh4.js → flowDiagram-HODETNUW-DtWilAWc.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-v2-1d953310-Bdmc9G3m.js → flowDiagram-v2-1d953310-tzv2aPj8.js} +1 -1
- package/dist-embed/chunks/{flowchart-elk-definition-6df44142-oWOWsVNc.js → flowchart-elk-definition-6df44142-C8Gjf4Dy.js} +1 -1
- package/dist-embed/chunks/{fr-FR-RHASNOE6-BukqZYPz.js → fr-FR-RHASNOE6-D1fqP_vI.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-3b0b3873-B7lmD9r9.js → ganttDiagram-3b0b3873-WkbnZ3Zy.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-D0E7se_Z.js → ganttDiagram-EL5Y4UJY-B1hq5rq9.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-DDbqMevq.js → ganttDiagram-EL5Y4UJY-DiSce27A.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-DK3EJl5z.js → gitGraphDiagram-WWUBYQGX-BoqOxrkd.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-DnVwXJWu.js → gitGraphDiagram-WWUBYQGX-Dfl4EOB8.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-f01e8bc2-B9vpLy6R.js → gitGraphDiagram-f01e8bc2-DxsYooak.js} +1 -1
- package/dist-embed/chunks/{gl-ES-HMX3MZ6V-BxVOJiaI.js → gl-ES-HMX3MZ6V-BkLcCFrx.js} +1 -1
- package/dist-embed/chunks/{he-IL-6SHJWFNN-Dv2VRxlJ.js → he-IL-6SHJWFNN-By48peS7.js} +1 -1
- package/dist-embed/chunks/{hi-IN-IWLTKZ5I-CFo5RUMz.js → hi-IN-IWLTKZ5I-386dm1ZK.js} +1 -1
- package/dist-embed/chunks/{hu-HU-A5ZG7DT2-ul3dS3un.js → hu-HU-A5ZG7DT2-B2wmIkDO.js} +1 -1
- package/dist-embed/chunks/{id-ID-SAP4L64H-ItVb-zwI.js → id-ID-SAP4L64H-Bc22Fq5f.js} +1 -1
- package/dist-embed/chunks/{index-9bae90f3-D9849sgo.js → index-9bae90f3-0dEQW6X4.js} +1 -1
- package/dist-embed/chunks/{index-oGqh9y23.js → index-B2eXWNhX.js} +1 -1
- package/dist-embed/chunks/{index-DSvebR7d.js → index-B5UP_2-0.js} +1 -1
- package/dist-embed/chunks/{index-YlGTgJvL.js → index-BEuw5cVO.js} +1 -1
- package/dist-embed/chunks/{index-CsgaCZaW.js → index-BMlDZi3F.js} +1 -1
- package/dist-embed/chunks/{index-BNFRRs9d.js → index-BW1nTf3r.js} +1 -1
- package/dist-embed/chunks/{index-xiH3WzLm.js → index-Ba1_ej_S.js} +1 -1
- package/dist-embed/chunks/{index-CjM49jS0.js → index-Bf3G_UXi.js} +1 -1
- package/dist-embed/chunks/{index-BOYhJnrD.js → index-BlBHM8M3.js} +1 -1
- package/dist-embed/chunks/{index-B5zrJYwn.js → index-Bw3Ijhff.js} +1 -1
- package/dist-embed/chunks/{index-BT4vYFeY.js → index-C5TEB73S.js} +1 -1
- package/dist-embed/chunks/{index-BkKEXqQS.js → index-CD5d-0QJ.js} +1 -1
- package/dist-embed/chunks/{index-D2LvuQlP.js → index-CTSvc7kN.js} +1 -1
- package/dist-embed/chunks/{index-B-L6ocEV.js → index-CaBZ6zn5.js} +1 -1
- package/dist-embed/chunks/{index-DSF21-29.js → index-Ce0tqSYG.js} +1 -1
- package/dist-embed/chunks/{index-BfUXEHI0.js → index-CeDsYtrC.js} +1 -1
- package/dist-embed/chunks/{index-Cp2aJ2ZR.js → index-Ckzgd1GV.js} +1 -1
- package/dist-embed/chunks/{index-jh9S19of.js → index-Crj6AD3D.js} +1 -1
- package/dist-embed/chunks/{index-bm8APcDZ.js → index-Cs7fNnHI.js} +4 -4
- package/dist-embed/chunks/{index-DoBEQ07P.js → index-D2V9YBSL.js} +2 -2
- package/dist-embed/chunks/{index-B764si9c.js → index-D4xDU_cs.js} +1 -1
- package/dist-embed/chunks/{index-O2jaI8TY.js → index-DB3vaYGl.js} +1 -1
- package/dist-embed/chunks/{index-B0wMyD8Y.js → index-DGpvT0SW.js} +1 -1
- package/dist-embed/chunks/{index-CRpZyQIR.js → index-DIGoR1Tz.js} +4 -4
- package/dist-embed/chunks/{index-CZdWsyNw.js → index-DTF28A2w.js} +1 -1
- package/dist-embed/chunks/{index-7FNjj0f2.js → index-DdBEMKdr.js} +1 -1
- package/dist-embed/chunks/{index-BrD9dtoV.js → index-DiBjbJad.js} +1 -1
- package/dist-embed/chunks/{index-BM6oRiO1.js → index-DkAo6nTX.js} +1 -1
- package/dist-embed/chunks/{index-TEcp7-f6.js → index-DmlogZBL.js} +2 -2
- package/dist-embed/chunks/{index-Cql9gOsL.js → index-DmzlqRz3.js} +1 -1
- package/dist-embed/chunks/{index-CsxlyZef.js → index-DodMg2uF.js} +1 -1
- package/dist-embed/chunks/{index-BiTIdbkn.js → index-DwKNt0FO.js} +1 -1
- package/dist-embed/chunks/{index-BqMoyzEk.js → index-I5uUezOA.js} +1 -1
- package/dist-embed/chunks/{index-DQQXY-7d.js → index-TzvZ9g2T.js} +2 -2
- package/dist-embed/chunks/{index-QZ3sHHT3.js → index-wWGi6oM9.js} +10 -10
- package/dist-embed/chunks/{index.esm-CkSite-X.js → index.esm-DFA6Rod9.js} +1 -1
- package/dist-embed/chunks/{index.esm-B7KoTOBb.js → index.esm-De-JJWit.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-27XIBGKW-DDO50Ria.js → infoDiagram-27XIBGKW-B6fdV0Xc.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-27XIBGKW-O3q53Qe2.js → infoDiagram-27XIBGKW-C6J796kn.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-a29d40f1-jOvOHUyu.js → infoDiagram-a29d40f1-BjFaAu0-.js} +1 -1
- package/dist-embed/chunks/isEqual-BxgGIFfN.js +1 -0
- package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-DuiWhpVW.js → ishikawaDiagram-5VMMS53U-CZVbbiJE.js} +1 -1
- package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-IzmbYzxv.js → ishikawaDiagram-5VMMS53U-sjolONOj.js} +1 -1
- package/dist-embed/chunks/{it-IT-JPQ66NNP-BuCUBzia.js → it-IT-JPQ66NNP-Cyadykvb.js} +1 -1
- package/dist-embed/chunks/{ja-JP-DBVTYXUO-BhtQz4sy.js → ja-JP-DBVTYXUO-DYq7TJf3.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-sO-Cfp65.js → journeyDiagram-3NMN7TZE-BJ-6GyhB.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-DGLcsVfC.js → journeyDiagram-3NMN7TZE-CNoB-K6t.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-95396277-CA4bGq0G.js → journeyDiagram-95396277-E32TRIvj.js} +1 -1
- package/dist-embed/chunks/{kaa-6HZHGXH3-B_TI8Aa0.js → kaa-6HZHGXH3-qdjcAwd_.js} +1 -1
- package/dist-embed/chunks/{kab-KAB-ZGHBKWFO-BsSg_l-j.js → kab-KAB-ZGHBKWFO-DHVNVHkT.js} +1 -1
- package/dist-embed/chunks/{kanban-definition-UXKFOSKX-CDtLkjnU.js → kanban-definition-UXKFOSKX-2elwU70n.js} +1 -1
- package/dist-embed/chunks/{kanban-definition-UXKFOSKX-0wjvwDqk.js → kanban-definition-UXKFOSKX-ZErtzIYn.js} +1 -1
- package/dist-embed/chunks/{kk-KZ-P5N5QNE5-B7XK5OQq.js → kk-KZ-P5N5QNE5-DtQCYXHl.js} +1 -1
- package/dist-embed/chunks/{km-KH-HSX4SM5Z-Cm2LA9F8.js → km-KH-HSX4SM5Z-B_GLLzdn.js} +1 -1
- package/dist-embed/chunks/{ko-KR-MTYHY66A-CL5s99y5.js → ko-KR-MTYHY66A-B8OMm-h5.js} +1 -1
- package/dist-embed/chunks/{ku-TR-6OUDTVRD-CiijvKHq.js → ku-TR-6OUDTVRD-_gB3JeJW.js} +1 -1
- package/dist-embed/chunks/{layout-CzrlbzeK.js → layout-DV2JdCx0.js} +1 -1
- package/dist-embed/chunks/{layout-BBbB54WC.js → layout-Di1pO_ld.js} +1 -1
- package/dist-embed/chunks/{lexicalHooks-DQxNZEiJ.js → lexicalHooks-DuWTjfdx.js} +1 -1
- package/dist-embed/chunks/{lt-LT-XHIRWOB4-CcA_Z5jR.js → lt-LT-XHIRWOB4-judKfepg.js} +1 -1
- package/dist-embed/chunks/{lv-LV-5QDEKY6T-CAQS9wGm.js → lv-LV-5QDEKY6T-C-9ZhYTf.js} +1 -1
- package/dist-embed/chunks/{mermaid.core-DfgoT1cz.js → mermaid.core-CH9h-G6m.js} +3 -3
- package/dist-embed/chunks/{mermaid.core-s-D09gpV.js → mermaid.core-DmeLLEp4.js} +5 -5
- package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-BCiSPRJk.js → mindmap-definition-YA3MSWOX-CH32-IRq.js} +1 -1
- package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-B6_K5ZvV.js → mindmap-definition-YA3MSWOX-DQTfxlEc.js} +1 -1
- package/dist-embed/chunks/{mindmap-definition-e4c1d938-D7gmABiC.js → mindmap-definition-e4c1d938-BgjFyiku.js} +1 -1
- package/dist-embed/chunks/{mr-IN-CRQNXWMA-DMAAvsDA.js → mr-IN-CRQNXWMA-B7W8v3Ft.js} +1 -1
- package/dist-embed/chunks/{my-MM-5M5IBNSE-t2TKqrjW.js → my-MM-5M5IBNSE-e3nyuoTM.js} +1 -1
- package/dist-embed/chunks/{nb-NO-T6EIAALU-Bi3ZI-HQ.js → nb-NO-T6EIAALU-Dq2hr8f4.js} +1 -1
- package/dist-embed/chunks/{nl-NL-IS3SIHDZ-B8UdlW1K.js → nl-NL-IS3SIHDZ-BPpJK4bx.js} +1 -1
- package/dist-embed/chunks/{nn-NO-6E72VCQL-Bt87hI27.js → nn-NO-6E72VCQL-TlFEoum0.js} +1 -1
- package/dist-embed/chunks/{oc-FR-POXYY2M6-009NL0Pk.js → oc-FR-POXYY2M6-CnSPPsW-.js} +1 -1
- package/dist-embed/chunks/{pa-IN-N4M65BXN-BfUtS2yt.js → pa-IN-N4M65BXN-DOLWrPsW.js} +1 -1
- package/dist-embed/chunks/{pegDiagram-XKGWAZYB-CBrnWUaX.js → pegDiagram-XKGWAZYB-n8BSl7l3.js} +1 -1
- package/dist-embed/chunks/{pegDiagram-XKGWAZYB-BX0ZYMng.js → pegDiagram-XKGWAZYB-oyZR3LwE.js} +1 -1
- package/dist-embed/chunks/{percentages-BXMCSKIN-CfzulzOv.js → percentages-BXMCSKIN-CGGUos_k.js} +5 -5
- package/dist-embed/chunks/{pieDiagram-E7YTZNPT-Ct8dzoLU.js → pieDiagram-E7YTZNPT-BW48oEVe.js} +1 -1
- package/dist-embed/chunks/{pieDiagram-E7YTZNPT-B1My5W85.js → pieDiagram-E7YTZNPT-t7G_PNXz.js} +1 -1
- package/dist-embed/chunks/{pieDiagram-c941bede-7DZ-Bl8U.js → pieDiagram-c941bede-Ci9AzDtZ.js} +1 -1
- package/dist-embed/chunks/{pl-PL-T2D74RX3-DbtOl9_x.js → pl-PL-T2D74RX3-hlaxloT-.js} +1 -1
- package/dist-embed/chunks/{pt-BR-5N22H2LF-B1pjR1_T.js → pt-BR-5N22H2LF-Zzt5dIRi.js} +1 -1
- package/dist-embed/chunks/{pt-PT-UZXXM6DQ-takC7TRa.js → pt-PT-UZXXM6DQ-DclavEOo.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-B1mlT7fN.js → quadrantDiagram-AXDQQJYC-BLT8OFPd.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-B7p4unpj.js → quadrantDiagram-AXDQQJYC-CqCRrPOH.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-cf8b8fe0-CTMh_Ad5.js → quadrantDiagram-cf8b8fe0-CCwvL59h.js} +1 -1
- package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-CJEwr5d9.js → railroadDiagram-O6MQD6OU-CArU1lc_.js} +1 -1
- package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-xr8bPIl7.js → railroadDiagram-O6MQD6OU-h7bwNVOI.js} +1 -1
- package/dist-embed/chunks/{renderer-Ba0Cwb4p.js → renderer-B7ulbNbj.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-53bda41b-Dv1Piop_.js → requirementDiagram-53bda41b-DwpbUtUG.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-Bw89vFiC.js → requirementDiagram-BXWQKSXE-DjSU8lt8.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-rabT3v-j.js → requirementDiagram-BXWQKSXE-DouRs4yi.js} +1 -1
- package/dist-embed/chunks/{ro-RO-JPDTUUEW-DkkqyFBF.js → ro-RO-JPDTUUEW-cgDkcR_I.js} +1 -1
- package/dist-embed/chunks/{ru-RU-B4JR7IUQ-CikD-ITp.js → ru-RU-B4JR7IUQ-9-oBtsiZ.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-D--cx9I2.js → sankeyDiagram-P5KCCOFB-CBWfRlJB.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-5SpI76uK.js → sankeyDiagram-P5KCCOFB-DjzmT1hm.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-c3ef121a-DbhtSWkB.js → sankeyDiagram-c3ef121a-9XuKuXG6.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-82a5b84f-DpxBSKAk.js → sequenceDiagram-82a5b84f-BG9YQ6K-.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-D_wK-z7a.js → sequenceDiagram-WJ2MYXX4-B9mfZJzJ.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-DGNwWgf8.js → sequenceDiagram-WJ2MYXX4-CosODaLN.js} +1 -1
- package/dist-embed/chunks/{sessions-DQkTozai.js → sessions-D0uw83Dx.js} +1 -1
- package/dist-embed/chunks/{si-LK-N5RQ5JYF-BqlWRhwK.js → si-LK-N5RQ5JYF-DwwdanqB.js} +1 -1
- package/dist-embed/chunks/{sizeCapture-INFHLROL-4Uh8JUjf.js → sizeCapture-INFHLROL-CwVsdbq8.js} +1 -1
- package/dist-embed/chunks/{sizeCapture-INFHLROL-g-K-6XON.js → sizeCapture-INFHLROL-H5_9Te0l.js} +1 -1
- package/dist-embed/chunks/{sk-SK-C5VTKIMK-DGsmi02E.js → sk-SK-C5VTKIMK-Bx7Xeegg.js} +1 -1
- package/dist-embed/chunks/{sl-SI-NN7IZMDC-HFz45GOs.js → sl-SI-NN7IZMDC-BnRYm8hb.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-43e79a5f-DxbV4jP9.js → stateDiagram-43e79a5f-DqSNbxpV.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-D77RDMKH-D-l3u-WY.js → stateDiagram-D77RDMKH-CFvF2i-n.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-D77RDMKH-C_wYpqah.js → stateDiagram-D77RDMKH-CM0rQJN-.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-2041ed4f-BzxzaDdI.js → stateDiagram-v2-2041ed4f-DEAOSRqx.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-IEMNMwm0.js → stateDiagram-v2-MP3YSRHH-BNF3zl7F.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-BGYkOvTS.js → stateDiagram-v2-MP3YSRHH-x4Ke6-d0.js} +1 -1
- package/dist-embed/chunks/{styles-455b33cd-C42Lyulv.js → styles-455b33cd-CGv1xv-g.js} +1 -1
- package/dist-embed/chunks/{styles-f932cba9-Bf6H3IMq.js → styles-f932cba9-BcvypeEH.js} +1 -1
- package/dist-embed/chunks/{styles-fcc2142b-OZg6fE-p.js → styles-fcc2142b-Bm-8o0Wg.js} +1 -1
- package/dist-embed/chunks/{subset-shared.chunk-KC0vshev.js → subset-shared.chunk-E0MJmgRL.js} +1 -1
- package/dist-embed/chunks/{subset-worker.chunk-CXZAV_Z5.js → subset-worker.chunk-C8uhAh2D.js} +1 -1
- package/dist-embed/chunks/{sv-SE-XGPEYMSR-yEdPvwHy.js → sv-SE-XGPEYMSR-CsQ6HfG0.js} +1 -1
- package/dist-embed/chunks/{svgDrawCommon-148a3cd9-D9MRwoYw.js → svgDrawCommon-148a3cd9-CfBqsI2Z.js} +1 -1
- package/dist-embed/chunks/{swimlanes-42K2YHIH-CPkom4Q8.js → swimlanes-42K2YHIH-C5u-jMMX.js} +1 -1
- package/dist-embed/chunks/{swimlanes-42K2YHIH-DJLFcHMt.js → swimlanes-42K2YHIH-DSy5A1Br.js} +1 -1
- package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-BJOhuN-y.js → swimlanesDiagram-VR7AAH4N-DiCCWeyH.js} +1 -1
- package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-BRTtY1QX.js → swimlanesDiagram-VR7AAH4N-Dz7sQXaA.js} +1 -1
- package/dist-embed/chunks/{ta-IN-2NMHFXQM-0i424YGX.js → ta-IN-2NMHFXQM-fGjZyqzP.js} +1 -1
- package/dist-embed/chunks/{th-TH-HPSO5L25-BidF5zNO.js → th-TH-HPSO5L25-mRygXByj.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-24CTP7MA-BasSLg-_.js → timeline-definition-24CTP7MA-BbGhqNW7.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-24CTP7MA-BfGIJi1H.js → timeline-definition-24CTP7MA-YHoSditW.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-7545f45a-BWwgvKxJ.js → timeline-definition-7545f45a-Cgha50uP.js} +1 -1
- package/dist-embed/chunks/{tr-TR-DEFEU3FU-BoHR9SlC.js → tr-TR-DEFEU3FU-CSMtrw8Q.js} +1 -1
- package/dist-embed/chunks/{uk-UA-QMV73CPH-DfRkqqO0.js → uk-UA-QMV73CPH-CLyS0aEW.js} +1 -1
- package/dist-embed/chunks/{vennDiagram-4TSXK5OY-D1T__rd2.js → vennDiagram-4TSXK5OY-CP_KbGdD.js} +1 -1
- package/dist-embed/chunks/{vennDiagram-4TSXK5OY-DMIYCfJ-.js → vennDiagram-4TSXK5OY-DEMghTP3.js} +1 -1
- package/dist-embed/chunks/{vi-VN-M7AON7JQ-CvZ4wpTw.js → vi-VN-M7AON7JQ-DI90c6Zt.js} +1 -1
- package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-DtlNUHLy.js → wardleyDiagram-VM6X3IG4-BKwp7C6o.js} +1 -1
- package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-CiKuFI26.js → wardleyDiagram-VM6X3IG4-CBfVN6X9.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-3f383b91-DzyuxW4K.js → xychartDiagram-3f383b91-CyeoV8HA.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-p6pYRkk6.js → xychartDiagram-S5SC5T6Z-BdfPJ1NZ.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-BIeFUHrS.js → xychartDiagram-S5SC5T6Z-DOiTJUlh.js} +1 -1
- package/dist-embed/chunks/{zh-CN-LNUGB5OW-Cx1Azgu2.js → zh-CN-LNUGB5OW-BhtQOj8w.js} +1 -1
- package/dist-embed/chunks/{zh-HK-E62DVLB3-DMjy1d4Z.js → zh-HK-E62DVLB3-BwejmqFd.js} +1 -1
- package/dist-embed/chunks/{zh-TW-RAJ6MFWO-J-YjINmR.js → zh-TW-RAJ6MFWO-CXYEZutZ.js} +1 -1
- package/dist-embed/datalayer-app-main.js +85 -85
- package/lib/apps/apps/appspec.d.ts +31 -1
- package/lib/apps/apps/appspec.js +66 -15
- package/lib/apps/plugins/chat/ChatView.js +31 -4
- package/lib/chat/ChatFloating.js +12 -4
- package/lib/chat/base/ChatBase.js +31 -5
- package/lib/chat/messages/ChatMessageList.js +1 -1
- package/lib/examples/AgentA2ATeamExample.js +6 -5
- package/lib/examples/ChatExample.js +2 -2
- package/lib/examples/VoiceChatExample.js +9 -3
- package/lib/hooks/ownRoutes.d.ts +27 -0
- package/lib/hooks/ownRoutes.js +33 -0
- package/lib/hooks/useAgentRuntimes.d.ts +5 -0
- package/lib/hooks/useAgentRuntimes.js +29 -26
- package/lib/hooks/useBrowserAgent.d.ts +1 -1
- package/lib/hooks/useBrowserAgent.js +1 -1
- package/lib/protocols/AGUIAdapter.d.ts +11 -0
- package/lib/protocols/AGUIAdapter.js +27 -2
- package/lib/specs/apps.d.ts +32 -32
- package/lib/specs/apps.js +620 -139
- package/lib/specs/protocols.js +2 -2
- package/lib/specs/scenes.js +7 -7
- package/lib/specs/teams/teams.js +11 -11
- package/lib/specs/voices.d.ts +4 -0
- package/lib/specs/voices.js +10 -0
- package/lib/types/agentspecs.d.ts +5 -0
- package/lib/types/chat.d.ts +6 -0
- package/lib/types/protocol.d.ts +17 -0
- package/lib/utils/utils.js +8 -1
- package/lib/voice/ReadAloud.d.ts +35 -0
- package/lib/voice/ReadAloud.js +29 -0
- package/lib/voice/hearing.js +5 -3
- package/lib/voice/index.d.ts +7 -2
- package/lib/voice/index.js +1 -0
- package/lib/voice/pinned.d.ts +3 -1
- package/lib/voice/pinned.js +17 -3
- package/package.json +2 -2
- package/scripts/codegen/generate_agents.py +34 -2
- package/scripts/codegen/generate_voices.py +8 -1
- package/scripts/voice/measure.py +9 -4
- package/scripts/voice/pin_store.py +11 -5
- package/scripts/voice/serve_store.py +2 -2
- package/dist-embed/chunks/ChatView-Dr-1g_cg.js +0 -32
- package/dist-embed/chunks/isEqual-CGLTk7wU.js +0 -1
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*
|
|
25
25
|
* @module apps/apps/appspec
|
|
26
26
|
*/
|
|
27
|
-
import type { AppAccent, AppThemeMode, AppThemeVariant, AppAssistantCharacter, AppEmbedMode, PapProfile, AppCustomComponentSpec, AppVoiceSpec, AppKind, AppLayout, AppPageOutputComponent, AppSpec } from '../../types/agentspecs';
|
|
27
|
+
import type { AppAccent, AppThemeMode, AppThemeVariant, AppAssistantCharacter, AppEmbedMode, PapProfile, AppCustomComponentSpec, AppVoiceSpec, AppKind, AppLayout, AppPageOutputComponent, AppSpec, UiChoice } from '../../types/agentspecs';
|
|
28
28
|
/** The version of the spec itself. */
|
|
29
29
|
export declare const APP_SCHEMA = "loop.app/v1";
|
|
30
30
|
/** The language an application's own words are in, unless it says (LOOP P-26). */
|
|
@@ -53,6 +53,36 @@ export declare const APP_ASSISTANT_CHARACTER_ID: RegExp;
|
|
|
53
53
|
export declare function isAssistantCharacterId(value: unknown): value is AppAssistantCharacter;
|
|
54
54
|
/** The layout a kind starts with. */
|
|
55
55
|
export declare const DEFAULT_LAYOUTS: Record<AppKind, AppLayout>;
|
|
56
|
+
/** The media type of an answer drawn as A2UI surfaces. */
|
|
57
|
+
export declare const A2UI_OUTPUT = "application/json+a2ui";
|
|
58
|
+
/** What `uiFor` reads of an application besides its kind. */
|
|
59
|
+
export interface AppUiFacts {
|
|
60
|
+
/** Its layout; its kind's own when unsaid. */
|
|
61
|
+
layout?: AppLayout;
|
|
62
|
+
/** The media types it answers in. */
|
|
63
|
+
outputs?: readonly string[];
|
|
64
|
+
/** It signs people in at companies (`pap.connections`). */
|
|
65
|
+
signsIn?: boolean;
|
|
66
|
+
/** It has components of its own (`interface.customComponents`). */
|
|
67
|
+
ownComponents?: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The UI plugins an application is drawn with (AGENTIC_UI R8), as its `ui`
|
|
71
|
+
* lists them: what `appPreset` mounts for it. A decision: its page alone,
|
|
72
|
+
* drawn by its host. Every other kind: the conversation — `chat`, which
|
|
73
|
+
* stands for the conversation base the runtime mounts — then the A2UI
|
|
74
|
+
* surfaces when it answers in `application/json+a2ui`, the sign-in card when
|
|
75
|
+
* it signs people in at companies, its page, its layout and the Canvas's
|
|
76
|
+
* blocks when its layout is not `chat`, and its own components when it has
|
|
77
|
+
* some. What a host adds (the Preview's sidebar, a frame) is not the
|
|
78
|
+
* application's.
|
|
79
|
+
*
|
|
80
|
+
* agentspecs' `ui_for` is the same function: both are held to
|
|
81
|
+
* `agent_runtimes/tests/fixtures/app_ui.json`.
|
|
82
|
+
*/
|
|
83
|
+
export declare function uiFor(kind: AppKind, facts?: AppUiFacts): UiChoice[];
|
|
84
|
+
/** The UI plugins an application is drawn with, by what its spec says (`uiFor`). */
|
|
85
|
+
export declare function uiOf(app: Pick<AppSpec, 'kind' | 'interface' | 'pap'>): UiChoice[];
|
|
56
86
|
/** What an application keeps of what it did, when it does not say. */
|
|
57
87
|
export declare const DEFAULT_RECORD_INCLUDE: string[];
|
|
58
88
|
type Data = Record<string, unknown>;
|
package/lib/apps/apps/appspec.js
CHANGED
|
@@ -74,6 +74,50 @@ export const DEFAULT_LAYOUTS = {
|
|
|
74
74
|
decision: 'page',
|
|
75
75
|
worker: 'split',
|
|
76
76
|
};
|
|
77
|
+
/** The media type of an answer drawn as A2UI surfaces. */
|
|
78
|
+
export const A2UI_OUTPUT = 'application/json+a2ui';
|
|
79
|
+
/**
|
|
80
|
+
* The UI plugins an application is drawn with (AGENTIC_UI R8), as its `ui`
|
|
81
|
+
* lists them: what `appPreset` mounts for it. A decision: its page alone,
|
|
82
|
+
* drawn by its host. Every other kind: the conversation — `chat`, which
|
|
83
|
+
* stands for the conversation base the runtime mounts — then the A2UI
|
|
84
|
+
* surfaces when it answers in `application/json+a2ui`, the sign-in card when
|
|
85
|
+
* it signs people in at companies, its page, its layout and the Canvas's
|
|
86
|
+
* blocks when its layout is not `chat`, and its own components when it has
|
|
87
|
+
* some. What a host adds (the Preview's sidebar, a frame) is not the
|
|
88
|
+
* application's.
|
|
89
|
+
*
|
|
90
|
+
* agentspecs' `ui_for` is the same function: both are held to
|
|
91
|
+
* `agent_runtimes/tests/fixtures/app_ui.json`.
|
|
92
|
+
*/
|
|
93
|
+
export function uiFor(kind, facts = {}) {
|
|
94
|
+
if (kind === 'decision') {
|
|
95
|
+
return [{ plugin: 'app-page' }];
|
|
96
|
+
}
|
|
97
|
+
const drawn = [{ plugin: 'chat' }];
|
|
98
|
+
if (facts.outputs?.includes(A2UI_OUTPUT)) {
|
|
99
|
+
drawn.push({ plugin: 'a2ui-surface', renderer: 'a2ui' });
|
|
100
|
+
}
|
|
101
|
+
if (facts.signsIn) {
|
|
102
|
+
drawn.push({ plugin: 'pap-sign-in' });
|
|
103
|
+
}
|
|
104
|
+
if ((facts.layout ?? DEFAULT_LAYOUTS[kind]) !== 'chat') {
|
|
105
|
+
drawn.push({ plugin: 'page-layout' }, { plugin: 'app-page' }, { plugin: 'canvas-blocks' });
|
|
106
|
+
}
|
|
107
|
+
if (facts.ownComponents) {
|
|
108
|
+
drawn.push({ plugin: 'app-components' });
|
|
109
|
+
}
|
|
110
|
+
return drawn;
|
|
111
|
+
}
|
|
112
|
+
/** The UI plugins an application is drawn with, by what its spec says (`uiFor`). */
|
|
113
|
+
export function uiOf(app) {
|
|
114
|
+
return uiFor(app.kind, {
|
|
115
|
+
layout: app.interface.layout,
|
|
116
|
+
outputs: app.interface.outputs,
|
|
117
|
+
signsIn: Boolean(app.pap?.connections.length),
|
|
118
|
+
ownComponents: Boolean(app.interface.customComponents?.length),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
77
121
|
/** What an application keeps of what it did, when it does not say. */
|
|
78
122
|
export const DEFAULT_RECORD_INCLUDE = ['conversations', 'actions', 'approvals'];
|
|
79
123
|
const DEFAULT_KEEP_FOR = '1_years';
|
|
@@ -93,22 +137,27 @@ const texts = (value) => Array.isArray(value)
|
|
|
93
137
|
const records = (value) => Array.isArray(value) ? value.filter(isData) : [];
|
|
94
138
|
/**
|
|
95
139
|
* An application's UI plugins as its document says them (AGENTIC_UI R8):
|
|
96
|
-
* `{plugin, renderer}` each.
|
|
97
|
-
*
|
|
140
|
+
* `{plugin, renderer}` each. Anything else — a bare id, the old shape — is
|
|
141
|
+
* not read as a plugin: `parseAppspec` refuses it (`uiShapeProblems`).
|
|
98
142
|
*/
|
|
99
143
|
const uiChoices = (value) => Array.isArray(value)
|
|
100
|
-
? value.
|
|
101
|
-
|
|
102
|
-
:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
144
|
+
? value.filter(isData).map(item => ({
|
|
145
|
+
plugin: text(item.plugin),
|
|
146
|
+
...(text(item.renderer) ? { renderer: text(item.renderer) } : {}),
|
|
147
|
+
}))
|
|
148
|
+
: [];
|
|
149
|
+
/**
|
|
150
|
+
* An entry of `ui` that is not `{plugin, renderer}`, in agentspecs' sentence
|
|
151
|
+
* (`ui_choices_problems`): a bare id is refused, never read as the plugin it
|
|
152
|
+
* names, and one naming a renderer says how to write it.
|
|
153
|
+
*/
|
|
154
|
+
const uiShapeProblems = (value) => Array.isArray(value)
|
|
155
|
+
? value
|
|
156
|
+
.filter(item => !isData(item))
|
|
157
|
+
.map(item => `\`ui\` lists UI plugins, each as \`{plugin, renderer}\`: ${JSON.stringify(item)} is not one` +
|
|
158
|
+
(typeof item === 'string' && UI_RENDERER_CATALOGUE[item]
|
|
159
|
+
? ` (${JSON.stringify(item)} is a UI renderer: name the plugin it renders, and say it as its \`renderer\`).`
|
|
160
|
+
: '.'))
|
|
112
161
|
: [];
|
|
113
162
|
/**
|
|
114
163
|
* One turn of a test's conversation as its document says it (STUDIO E-01):
|
|
@@ -153,7 +202,8 @@ export function emptyAppspec(kind = 'chat') {
|
|
|
153
202
|
contents: [],
|
|
154
203
|
connections: [],
|
|
155
204
|
protocols: [],
|
|
156
|
-
|
|
205
|
+
// A blank application starts with its kind's UI plugins (AGENTIC_UI R8).
|
|
206
|
+
ui: uiFor(kind),
|
|
157
207
|
rules: [],
|
|
158
208
|
permissions: {
|
|
159
209
|
spaces: [],
|
|
@@ -957,6 +1007,7 @@ export function parseAppspec(document) {
|
|
|
957
1007
|
problems.push(`\`${key}\` is not a field of the spec.`);
|
|
958
1008
|
}
|
|
959
1009
|
}
|
|
1010
|
+
problems.push(...uiShapeProblems(data.ui));
|
|
960
1011
|
const schema = text(data.schema, APP_SCHEMA);
|
|
961
1012
|
if (schema !== APP_SCHEMA) {
|
|
962
1013
|
problems.push(`This reads ${APP_SCHEMA}; the application is written in ${schema}.`);
|
|
@@ -40,6 +40,7 @@ import { useVisitorToken } from '../../apps/visitorToken';
|
|
|
40
40
|
import { AGENTS_PLUGIN_NAME, } from '../agents/plugin';
|
|
41
41
|
import { BROWSER_CODE_TOOL, dataUrlBase64, givenFilesSentence, sandboxFileName, writeFilesCode, } from '../../apps/browserSandbox';
|
|
42
42
|
import { useConfig } from '../../../hooks/useConfig';
|
|
43
|
+
import { runtimeModelsUrl } from '../../../hooks/ownRoutes';
|
|
43
44
|
import { useSkills, useSkillActions } from '../../../hooks/useSkills';
|
|
44
45
|
import { AI_MODEL_CATALOGUE, isChatModel } from '../../../specs/models';
|
|
45
46
|
import { LoopAgentBlueprint, LoopAgentGate, LoopChatComposer, sendInstead, LoopChatExtras, LoopChatHeader, LoopChatLayout, LoopChatSuggestion, LoopChatSurface, LoopChatTurn, LoopCommand, LoopFrontendTool, LoopRunProps, LoopSlots, agentServerOf, noRuntimeSaid, canOpenView, runForwardedProps, onPromptFocusRequest, onSurfaceRequest, useLoopPromptStore, } from '../../core';
|
|
@@ -1295,6 +1296,16 @@ export default function ChatView({ workspace }) {
|
|
|
1295
1296
|
// not know (LOOP R-20): it runs a session of its deployment, and no more.
|
|
1296
1297
|
const embedToken = reactor.getConfig(AGENTS_PLUGIN_NAME)?.embedToken;
|
|
1297
1298
|
const iamToken = visitors ? visitor.token : embedToken || memberToken;
|
|
1299
|
+
/*
|
|
1300
|
+
* A deployment's runtime, and the visitors', answer only the application's
|
|
1301
|
+
* own routes (OwnRoutesOnly, PAP_DATALAYER's release gates): its chat calls
|
|
1302
|
+
* nothing else — Stop is its session's, no monitoring stream, no sandbox
|
|
1303
|
+
* socket, no runtime-wide model switch. A Preview runs on the Maker's.
|
|
1304
|
+
*/
|
|
1305
|
+
const ownRoutesOnly = Boolean(deploymentUid || visitors);
|
|
1306
|
+
if (ownRoutesOnly && !runsApp) {
|
|
1307
|
+
throw new Error('A deployment’s page runs its application: its host gave no app_spec.');
|
|
1308
|
+
}
|
|
1298
1309
|
/*
|
|
1299
1310
|
* A thread opened from the person's history (LOOP P-24): its conversation
|
|
1300
1311
|
* read from the runtime once it answers — held there, else resumed from
|
|
@@ -1420,6 +1431,9 @@ export default function ChatView({ workspace }) {
|
|
|
1420
1431
|
uiSocket: `${agentServerUrl.replace(/^http/, 'ws')}/api/v1/apps/ui`,
|
|
1421
1432
|
// Its files, uploaded before what names them (RU-6).
|
|
1422
1433
|
uiFiles: `${agentServerUrl}/api/v1/apps/agents/${encodeURIComponent(agentId)}/files`,
|
|
1434
|
+
// Each thread a session: Stop is its session's.
|
|
1435
|
+
appSessions: `${agentServerUrl}/api/v1/apps/sessions`,
|
|
1436
|
+
...(ownRoutesOnly ? { ownRoutesOnly: true } : {}),
|
|
1423
1437
|
}
|
|
1424
1438
|
: {}),
|
|
1425
1439
|
agentId,
|
|
@@ -1442,6 +1456,7 @@ export default function ChatView({ workspace }) {
|
|
|
1442
1456
|
agentServerUrl,
|
|
1443
1457
|
runsApp,
|
|
1444
1458
|
iamToken,
|
|
1459
|
+
ownRoutesOnly,
|
|
1445
1460
|
]);
|
|
1446
1461
|
/*
|
|
1447
1462
|
* The model catalogue, and the builtin tools and skills the agent reports.
|
|
@@ -1474,10 +1489,17 @@ export default function ChatView({ workspace }) {
|
|
|
1474
1489
|
if (inPage || agentServerUrl === undefined) {
|
|
1475
1490
|
return undefined;
|
|
1476
1491
|
}
|
|
1492
|
+
// A deployment's runtime does not answer it (OwnRoutesOnly): nothing to
|
|
1493
|
+
// offer, as when a runtime does not answer, and its selector is hidden.
|
|
1494
|
+
const modelsUrl = runtimeModelsUrl(agentServerUrl, agentId, ownRoutesOnly);
|
|
1495
|
+
if (!modelsUrl) {
|
|
1496
|
+
setCatalogModels([]);
|
|
1497
|
+
return undefined;
|
|
1498
|
+
}
|
|
1477
1499
|
let cancelled = false;
|
|
1478
1500
|
// The agent's own models (its model and model_additionals), each saying
|
|
1479
1501
|
// whether its inference serves it.
|
|
1480
|
-
void fetch(
|
|
1502
|
+
void fetch(modelsUrl)
|
|
1481
1503
|
.then(response => (response.ok ? response.json() : null))
|
|
1482
1504
|
.then(payload => {
|
|
1483
1505
|
if (!cancelled) {
|
|
@@ -1500,7 +1522,7 @@ export default function ChatView({ workspace }) {
|
|
|
1500
1522
|
return () => {
|
|
1501
1523
|
cancelled = true;
|
|
1502
1524
|
};
|
|
1503
|
-
}, [agentServerUrl, agentId, inPage]);
|
|
1525
|
+
}, [agentServerUrl, agentId, inPage, ownRoutesOnly]);
|
|
1504
1526
|
/*
|
|
1505
1527
|
* What to offer when the server has no catalogue of its own.
|
|
1506
1528
|
*
|
|
@@ -1556,6 +1578,10 @@ export default function ChatView({ workspace }) {
|
|
|
1556
1578
|
* to agree.
|
|
1557
1579
|
*/
|
|
1558
1580
|
const selectModel = useCallback(async (model) => {
|
|
1581
|
+
if (ownRoutesOnly) {
|
|
1582
|
+
// Runtime-wide, and not the application's own: never offered here.
|
|
1583
|
+
throw new Error('A deployment’s chat does not switch its runtime’s model.');
|
|
1584
|
+
}
|
|
1559
1585
|
setPickedModel(model);
|
|
1560
1586
|
if (inPage || agentServerUrl === undefined) {
|
|
1561
1587
|
return;
|
|
@@ -1565,7 +1591,7 @@ export default function ChatView({ workspace }) {
|
|
|
1565
1591
|
headers: { 'content-type': 'application/json' },
|
|
1566
1592
|
body: JSON.stringify({ model }),
|
|
1567
1593
|
}).catch(() => undefined);
|
|
1568
|
-
}, [agentServerUrl, inPage]);
|
|
1594
|
+
}, [agentServerUrl, inPage, ownRoutesOnly]);
|
|
1569
1595
|
/* `bottom-chat` keeps the prompt in the chat column; `bottom`, the default,
|
|
1570
1596
|
spans the workspace. */
|
|
1571
1597
|
const besideChat = config?.promptPlacement === 'bottom-chat';
|
|
@@ -1660,7 +1686,8 @@ export default function ChatView({ workspace }) {
|
|
|
1660
1686
|
showTokenUsage: chatExtras.showTokenUsage ?? config?.showTokenUsage ?? true,
|
|
1661
1687
|
showContextRing: true,
|
|
1662
1688
|
agentUsage: contextUsage ?? undefined,
|
|
1663
|
-
|
|
1689
|
+
// Nor on a deployment's page: the model is its runtime's, for everyone.
|
|
1690
|
+
showModelSelector: !presence && !ownRoutesOnly,
|
|
1664
1691
|
models: offeredModels,
|
|
1665
1692
|
decisions,
|
|
1666
1693
|
selectedModel: activeModel,
|
package/lib/chat/ChatFloating.js
CHANGED
|
@@ -35,6 +35,7 @@ import { decisionsAskerAt } from './assistant/decisions';
|
|
|
35
35
|
import { DecisionAsk } from './assistant/DecisionAsk';
|
|
36
36
|
import { ServerSpeaker } from '../voice/speaker';
|
|
37
37
|
import { useSpokenAnswers } from '../voice/useSpokenAnswers';
|
|
38
|
+
import { readAloud } from '../voice/ReadAloud';
|
|
38
39
|
import { BalloonApprovalMessage, CONVERSATION_BALLOON_WIDTH, ConversationBalloonClose, balloonTailAt, conversationBalloonHeight, conversationBalloonSx, CURRENT_BALLOON_HEIGHT, peekLine, } from './assistant/ConversationBalloon';
|
|
39
40
|
import { ConversationBalloonHeader, CurrentBalloonBody, } from './assistant/BalloonParts';
|
|
40
41
|
import { DEFAULT_BALLOON_DISPLAY, conversationCount, newestToolLine, toolLineText, } from './assistant/toolLine';
|
|
@@ -165,7 +166,7 @@ export function ChatFloating({ endpoint, protocol: protocolProp, useStore: useSt
|
|
|
165
166
|
const [speakerState, setSpeakerState] = useState({
|
|
166
167
|
speaking: false,
|
|
167
168
|
});
|
|
168
|
-
const speaker = useMemo(() => voice && voice.output
|
|
169
|
+
const speaker = useMemo(() => voice && voice.output !== 'off' && voice.speechUrl
|
|
169
170
|
? new ServerSpeaker({
|
|
170
171
|
speechUrl: voice.speechUrl,
|
|
171
172
|
voice: voice.voice,
|
|
@@ -195,8 +196,15 @@ export function ChatFloating({ endpoint, protocol: protocolProp, useStore: useSt
|
|
|
195
196
|
window.removeEventListener('keydown', unlock);
|
|
196
197
|
};
|
|
197
198
|
}, [speaker]);
|
|
198
|
-
|
|
199
|
+
// `always`: each answer heard as it is written; `on_request`: a *Read
|
|
200
|
+
// aloud* under each (VO-21).
|
|
201
|
+
useSpokenAnswers(voiceItems, chatBusy, !!speaker && voice?.output === 'always' && !speechMuted, speaker);
|
|
199
202
|
const stopSpeaking = useCallback(() => speaker?.stop(), [speaker]);
|
|
203
|
+
const readAnswerAloud = useCallback((answer) => {
|
|
204
|
+
if (speaker) {
|
|
205
|
+
readAloud(speaker, answer);
|
|
206
|
+
}
|
|
207
|
+
}, [speaker]);
|
|
200
208
|
const mouthLevel = useMemo(() => (speaker ? () => speaker.level() : undefined), [speaker]);
|
|
201
209
|
const [arriving, setArriving] = useState(false);
|
|
202
210
|
const [leaving, setLeaving] = useState(false);
|
|
@@ -1057,7 +1065,7 @@ export function ChatFloating({ endpoint, protocol: protocolProp, useStore: useSt
|
|
|
1057
1065
|
...poweredByProps,
|
|
1058
1066
|
}, description: description, onStateUpdate: onStateUpdate, onNewChat: onNewChat, suggestions: suggestions, submitOnSuggestionClick: submitOnSuggestionClick, hideMessagesAfterToolUI: hideMessagesAfterToolUI, avatarConfig: {
|
|
1059
1067
|
showAvatars: true,
|
|
1060
|
-
}, placeholder: "Type a message...", backgroundColor: "canvas.subtle", frontendTools: frontendTools, showModelSelector: showModelSelector, availableModels: availableModels, showToolsMenu: showToolsMenu, showSkillsMenu: showSkillsMenu, showTokenUsage: showTokenUsage, showContextRing: showContextRing, runtimeId: runtimeId, historyEndpoint: historyEndpoint, historyAuthToken: historyAuthToken, pendingPrompt: pendingPrompt ?? suggestionPrompt, inspector: inspector, showInformation: showInformation, onInformationClick: onInformationClick, onToolCallStart: onToolCallStart, onToolCallComplete: onToolCallComplete, showToolApprovalBanner: showToolApprovalBanner, pendingApprovals: pendingApprovals, onApproveApproval: onApproveApproval, onRejectApproval: onRejectApproval, voice: voice, voiceSpeaking: speakerState.speaking, onStopSpeaking: speaker ? stopSpeaking : undefined, ...panelProps, ...assistantChat, onLoadingChange: handleLoadingChange, onDisplayItemsChange: handleDisplayItemsChange, onSendReady: handleSendReady, children: conversationBalloon && currentOpen ? (
|
|
1068
|
+
}, placeholder: "Type a message...", backgroundColor: "canvas.subtle", frontendTools: frontendTools, showModelSelector: showModelSelector, availableModels: availableModels, showToolsMenu: showToolsMenu, showSkillsMenu: showSkillsMenu, showTokenUsage: showTokenUsage, showContextRing: showContextRing, runtimeId: runtimeId, historyEndpoint: historyEndpoint, historyAuthToken: historyAuthToken, pendingPrompt: pendingPrompt ?? suggestionPrompt, inspector: inspector, showInformation: showInformation, onInformationClick: onInformationClick, onToolCallStart: onToolCallStart, onToolCallComplete: onToolCallComplete, showToolApprovalBanner: showToolApprovalBanner, pendingApprovals: pendingApprovals, onApproveApproval: onApproveApproval, onRejectApproval: onRejectApproval, voice: voice, voiceSpeaking: speakerState.speaking, onStopSpeaking: speaker ? stopSpeaking : undefined, onReadAloud: speaker ? readAnswerAloud : undefined, ...panelProps, ...assistantChat, onLoadingChange: handleLoadingChange, onDisplayItemsChange: handleDisplayItemsChange, onSendReady: handleSendReady, children: conversationBalloon && currentOpen ? (
|
|
1061
1069
|
// Current: the one thing said or done now, over the composer.
|
|
1062
1070
|
_jsx(Box, { px: 3, pt: 3, pb: 2, overflow: "hidden", children: _jsx(CurrentBalloonBody, { text: toolSaid ? undefined : (currentWords ?? description), fullText: toolSaid ? undefined : currentWhole, tool: toolSaid, busy: atWork, speaking: answering && atWork, waiting: atWork && !answering }) })) : (children) }))] }));
|
|
1063
1071
|
/*
|
|
@@ -1109,7 +1117,7 @@ export function ChatFloating({ endpoint, protocol: protocolProp, useStore: useSt
|
|
|
1109
1117
|
}
|
|
1110
1118
|
: getPositionStyles(), stageRef: stageRef, onDragStart: stageDrag.onHandlePointerDown, open: isOpen, onToggle: handleToggle, balloon: assistantBalloon, balloonDisplay: balloonDisplay, expandTarget: expandTarget, insist: balloonInsists, onDismiss: dismissAssistant, ownRef: popupRef, mouthLevel: mouthLevel, suggestions: balloonSuggestions, onSuggestion: sendSuggestion, inspector: inspector, onBalloonDisplayChange: changeBalloonDisplay, onStop: chatBusy && chatControls.current
|
|
1111
1119
|
? () => chatControls.current?.stop()
|
|
1112
|
-
: undefined, onNewChat: !conversation && showNewChatButton ? handleNewChat : undefined, onClear: !conversation && useStoreMode ? handleClear : undefined, onChangeCharacter: onChangeCharacter, speech: speaker
|
|
1120
|
+
: undefined, onNewChat: !conversation && showNewChatButton ? handleNewChat : undefined, onClear: !conversation && useStoreMode ? handleClear : undefined, onChangeCharacter: onChangeCharacter, speech: speaker && voice?.output === 'always'
|
|
1113
1121
|
? {
|
|
1114
1122
|
muted: speechMuted,
|
|
1115
1123
|
onToggle: () => {
|
|
@@ -36,7 +36,7 @@ import { askedOf } from '../../apps/apps/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';
|
|
39
|
-
import { internalQueryClient, isToolCallMessage, convertHistoryToDisplayItems, createProtocolAdapter, getApiBaseFromConfig, sanitizeAssistantContent, } from '../../utils';
|
|
39
|
+
import { internalQueryClient, isToolCallMessage, getMessageText, convertHistoryToDisplayItems, createProtocolAdapter, getApiBaseFromConfig, sanitizeAssistantContent, } from '../../utils';
|
|
40
40
|
import { useConfig, useSkills, useSkillActions, useContextSnapshot, useSandbox, } from '../../hooks';
|
|
41
41
|
import { useAgentRuntimeWebSocket } from '../../hooks/useAgentRuntimes';
|
|
42
42
|
import { agentRuntimeStore, useAgentRuntimeStore, useAgentRuntimeWsState, } from '../../stores/agentRuntimeStore';
|
|
@@ -50,6 +50,7 @@ import { ChatMessageList, } from '../messages/ChatMessageList';
|
|
|
50
50
|
import { InputPrompt } from '../prompt/InputPrompt';
|
|
51
51
|
import { DeviceHearing } from '../../voice/hearing';
|
|
52
52
|
import { VoiceInput } from '../../voice/VoiceInput';
|
|
53
|
+
import { ReadAloud, readsAloud } from '../../voice/ReadAloud';
|
|
53
54
|
import { isFloatingChatViewMode } from '../viewModes';
|
|
54
55
|
import { ToolApprovalBanner, ToolApprovalDialog, } from '../tools';
|
|
55
56
|
import { initialModelId, isOffered, offeredModels as offeredModelsFor, } from './modelChoice';
|
|
@@ -416,7 +417,7 @@ function ChatBaseInner({ title, subtitle, showHeader = false, showTokenUsage = t
|
|
|
416
417
|
// Mode selection
|
|
417
418
|
useStore: useStoreMode = true, protocol: protocolRaw, onSendMessage, onSendReady, onLoadingChange, onContextSnapshot, enableStreaming = false,
|
|
418
419
|
// Extended props
|
|
419
|
-
brandIcon, avatarConfig, headerButtons, showPoweredBy = false, poweredByProps, emptyState, renderHeader, showTurnFooter = true, notebookToolSurfacesId, footerContent, welcome, trailingContent, voice, voiceSpeaking = false, onStopSpeaking, showInformation = false, onInformationClick, headerContent, children, borderRadius, backgroundColor, border, boxShadow, compact = false, placeholder, description = 'Start a conversation with the AI agent.', onStateUpdate, onNewChat, onClear, onMessagesChange, onItemsChange, onDisplayItemsChange, autoFocus = false, suggestions, submitOnSuggestionClick = true, hideMessagesAfterToolUI = false, focusTrigger, frontendTools: frontendToolsProp, enableEphemeralNotebook = false, initialEphemeralNotebookOpen = true, onEphemeralNotebookOpenChange, enableEphemeralDocument = false, initialEphemeralSurfaceMode, onEphemeralSurfaceModeChange, collapsed = false, onExpandFromCollapsed, ephemeralNotebookToolbar, ephemeralNotebookToolbarExtraItems, ephemeralDocumentToolbarExtraItems, ephemeralNotebookCollaborationProvider, ephemeralNotebookCollaborationDocumentId, ephemeralDocumentCollaboration, ephemeralRuntimeOverride,
|
|
420
|
+
brandIcon, avatarConfig, headerButtons, showPoweredBy = false, poweredByProps, emptyState, renderHeader, showTurnFooter = true, notebookToolSurfacesId, footerContent, welcome, trailingContent, voice, voiceSpeaking = false, onStopSpeaking, onReadAloud, showInformation = false, onInformationClick, headerContent, children, borderRadius, backgroundColor, border, boxShadow, compact = false, placeholder, description = 'Start a conversation with the AI agent.', onStateUpdate, onNewChat, onClear, onMessagesChange, onItemsChange, onDisplayItemsChange, autoFocus = false, suggestions, submitOnSuggestionClick = true, hideMessagesAfterToolUI = false, focusTrigger, frontendTools: frontendToolsProp, enableEphemeralNotebook = false, initialEphemeralNotebookOpen = true, onEphemeralNotebookOpenChange, enableEphemeralDocument = false, initialEphemeralSurfaceMode, onEphemeralSurfaceModeChange, collapsed = false, onExpandFromCollapsed, ephemeralNotebookToolbar, ephemeralNotebookToolbarExtraItems, ephemeralDocumentToolbarExtraItems, ephemeralNotebookCollaborationProvider, ephemeralNotebookCollaborationDocumentId, ephemeralDocumentCollaboration, ephemeralRuntimeOverride,
|
|
420
421
|
// Tool invocation hooks
|
|
421
422
|
onToolCallStart, onToolCallComplete, inspector: inspectorGiven,
|
|
422
423
|
// Identity/Authorization props
|
|
@@ -1467,7 +1468,9 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
1467
1468
|
useEffect(() => {
|
|
1468
1469
|
onContextSnapshot?.(agentUsage);
|
|
1469
1470
|
}, [agentUsage, onContextSnapshot]);
|
|
1470
|
-
|
|
1471
|
+
// Never on a runtime held to the application's own routes: it answers no
|
|
1472
|
+
// sandbox socket (OwnRoutesOnly).
|
|
1473
|
+
const sandboxStatusQuery = useSandbox(configQueriesEnabled && showHeader && !protocol?.ownRoutesOnly, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
|
|
1471
1474
|
// ---- Refs ----
|
|
1472
1475
|
const adapterRef = useRef(null);
|
|
1473
1476
|
const unsubscribeRef = useRef(null);
|
|
@@ -1794,8 +1797,16 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
1794
1797
|
const wsBaseUrl = protocol?.configEndpoint
|
|
1795
1798
|
? protocol.configEndpoint.replace(/\/api\/v1\/(config|configure)\/?$/, '')
|
|
1796
1799
|
: (protocol?.endpoint?.replace(/\/api\/v1\/.*$/, '') ?? '');
|
|
1800
|
+
/*
|
|
1801
|
+
* Not on a runtime held to the application's own routes (OwnRoutesOnly): it
|
|
1802
|
+
* answers no monitoring stream, and an application's session asks its
|
|
1803
|
+
* approvals in the conversation, over its ui socket.
|
|
1804
|
+
*/
|
|
1797
1805
|
useAgentRuntimeWebSocket({
|
|
1798
|
-
enabled: !!protocol &&
|
|
1806
|
+
enabled: !!protocol &&
|
|
1807
|
+
!!wsBaseUrl &&
|
|
1808
|
+
!isAgentNodeTunnelAgUi &&
|
|
1809
|
+
!protocol.ownRoutesOnly,
|
|
1799
1810
|
baseUrl: wsBaseUrl,
|
|
1800
1811
|
authToken: protocol?.authToken,
|
|
1801
1812
|
agentId: protocol?.agentId,
|
|
@@ -3739,6 +3750,21 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
3739
3750
|
...displayItems,
|
|
3740
3751
|
]
|
|
3741
3752
|
: displayItems;
|
|
3753
|
+
/*
|
|
3754
|
+
* *Read aloud* under each answer the agent has finished (VOICE.md VO-21),
|
|
3755
|
+
* when the host reads answers aloud on request.
|
|
3756
|
+
*/
|
|
3757
|
+
const writingId = isLoading || isStreaming
|
|
3758
|
+
? [...welcomedItems]
|
|
3759
|
+
.reverse()
|
|
3760
|
+
.find((item) => !isToolCallMessage(item) && item.role === 'assistant')?.id
|
|
3761
|
+
: undefined;
|
|
3762
|
+
const readAloudFooter = onReadAloud
|
|
3763
|
+
? (message) => {
|
|
3764
|
+
const text = getMessageText(message);
|
|
3765
|
+
return readsAloud(message, text, writingId) ? (_jsx(ReadAloud, { onRead: () => onReadAloud(text) })) : null;
|
|
3766
|
+
}
|
|
3767
|
+
: undefined;
|
|
3742
3768
|
const messagesContent = children ? (children) : (_jsxs(Box, { display: "flex", flexDirection: "column", minHeight: 0,
|
|
3743
3769
|
/*
|
|
3744
3770
|
A reading column, not a full-bleed sheet.
|
|
@@ -3752,7 +3778,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
3752
3778
|
// Tool calls are drawn by the page's Reactor plugins; a named
|
|
3753
3779
|
// notebook's cell surfaces stand in for the default row of its tools,
|
|
3754
3780
|
// so every chat with a headless notebook gets the same transcript.
|
|
3755
|
-
notebookToolSurfacesId: notebookToolSurfacesId, approvalConfig: approvalConfig, messagesEndRef: messagesEndRef, onRespond: handleRespond, showTurnFooters: showTurnFooter, 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] }));
|
|
3781
|
+
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] }));
|
|
3756
3782
|
// The microphone, in the composer's footer (VO-10).
|
|
3757
3783
|
const voiceControl = hearing && voice ? (_jsx(VoiceInput, { hearing: hearing, language: voice.language, consentKey: voice.consentKey ?? 'chat', disabled: disabled || launching, speaking: voiceSpeaking, onStopSpeaking: onStopSpeaking, onListen: onStopSpeaking, onTranscript: (transcript) => {
|
|
3758
3784
|
if (voice.sendWhatISay) {
|
|
@@ -611,7 +611,7 @@ export function ChatMessageList({ displayItems, actOn, upload, isLoading, isStre
|
|
|
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), 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));
|
|
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?.(message) ? (_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);
|
|
@@ -11,12 +11,13 @@ import { useBrowserInference } from '../hooks/useBrowserInference';
|
|
|
11
11
|
import { readJwtClaims, tokenLifetimeMs, useAnonymousSessionStore, } from '../runtimes/browser/anonymousToken';
|
|
12
12
|
import { connectA2APeer } from '../runtimes/browser/a2aPeer';
|
|
13
13
|
import { A2ATeamGraph, SceneView, NOTEBOOK_AND_WORDS, teamConnectionsOf, teamToolClassifier, useA2ATeam, usePeerSandbox, } from '../components/teams';
|
|
14
|
-
import {
|
|
14
|
+
import { APP_CATALOGUE } from '../specs/apps';
|
|
15
15
|
import { AgentInspector, classifyToolCall, traceA2AFetch, useAgentInspector, } from '../components/inspector';
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
const
|
|
16
|
+
import { TEAM_SPECS } from '../specs/teams/teams';
|
|
17
|
+
// By id, never by the version-named constants: a version bump touches no caller.
|
|
18
|
+
const TEAM = TEAM_SPECS['sales-and-accounting'];
|
|
19
|
+
const SALES = APP_CATALOGUE['sales'];
|
|
20
|
+
const ACCOUNTING = APP_CATALOGUE['accounting'];
|
|
20
21
|
/** What Accounting reaches, from its Appspec: Odoo, through the odoo-accounting MCP server. */
|
|
21
22
|
const ACCOUNTING_CONNECTIONS = teamConnectionsOf(ACCOUNTING);
|
|
22
23
|
/** The members of the team, as the team spec says them. */
|
|
@@ -30,13 +30,13 @@ import { uniqueAgentId } from './utils/agentId';
|
|
|
30
30
|
import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
|
|
31
31
|
import { BROWSER_SIGN_IN_REASON, useExampleAgentProtocol, } from './hooks/useExampleAgentProtocol';
|
|
32
32
|
import { runsInBrowser } from '../runtimes/variants';
|
|
33
|
-
import {
|
|
33
|
+
import { AGENTSPECS } from '../specs/agents/agents';
|
|
34
34
|
import { ErrorView } from './components';
|
|
35
35
|
import { Chat } from '../chat';
|
|
36
36
|
setupPrimerPortals();
|
|
37
37
|
const AGENTSPEC_ID = 'example-simple';
|
|
38
38
|
const AGENT_NAME = 'simple';
|
|
39
|
-
const SPEC =
|
|
39
|
+
const SPEC = AGENTSPECS[AGENTSPEC_ID];
|
|
40
40
|
const AgentRuntimeChatExample = () => {
|
|
41
41
|
const agentName = useMemo(() => uniqueAgentId(AGENT_NAME), []);
|
|
42
42
|
const { agentId, baseUrl, error, status, isReady, variant } = useExampleAgentRuntime({
|
|
@@ -45,21 +45,27 @@ const LANGUAGES = [
|
|
|
45
45
|
{ tag: 'en-US', label: 'English' },
|
|
46
46
|
{ tag: 'fr-FR', label: 'Français' },
|
|
47
47
|
];
|
|
48
|
+
/** When answers are heard (VO-21): on request is the Appspec's default. */
|
|
49
|
+
const OUTPUTS = [
|
|
50
|
+
{ output: 'on_request', label: 'Read aloud on request' },
|
|
51
|
+
{ output: 'always', label: 'Always read aloud' },
|
|
52
|
+
];
|
|
48
53
|
const VoiceChatExample = () => {
|
|
49
54
|
const { token } = useSimpleAuthStore();
|
|
50
55
|
const [language, setLanguage] = useState('en-US');
|
|
56
|
+
const [output, setOutput] = useState('on_request');
|
|
51
57
|
const voiceSpec = voiceFor(language) ?? VOICE_CATALOGUE['kokoro-af-heart'];
|
|
52
58
|
const voice = useMemo(() => ({
|
|
53
59
|
language,
|
|
54
60
|
input: 'push_to_talk',
|
|
55
|
-
output
|
|
61
|
+
output,
|
|
56
62
|
voice: voiceSpec.id,
|
|
57
63
|
modelsUrl: MODELS,
|
|
58
64
|
engines: ENGINES,
|
|
59
65
|
speechUrl: SPEECH,
|
|
60
66
|
token: token || undefined,
|
|
61
67
|
consentKey: 'voice-chat-example',
|
|
62
|
-
}), [language, voiceSpec.id, token]);
|
|
63
|
-
return (_jsx(ThemedProvider, { children: _jsxs(Box, { minHeight: "100vh", bg: "canvas.default", p: 4, children: [_jsxs(Box, { maxWidth: 720, mx: "auto", children: [_jsx(Heading, { as: "h1", sx: { mb: 2 }, children: "Voice chat" }), _jsxs(Text, { as: "p", sx: { color: 'fg.muted', mb: 3 }, children: ["Talk to the assistant instead of typing: hold the microphone in its composer, or ", _jsx("kbd", { children: "Ctrl" }), "+", _jsx("kbd", { children: "Space" }), ", speak, and let go. What you say is heard in this page and never leaves it; the words go in the message box for you to send. Its answers are read aloud
|
|
68
|
+
}), [language, output, voiceSpec.id, token]);
|
|
69
|
+
return (_jsx(ThemedProvider, { children: _jsxs(Box, { minHeight: "100vh", bg: "canvas.default", p: 4, children: [_jsxs(Box, { maxWidth: 720, mx: "auto", children: [_jsx(Heading, { as: "h1", sx: { mb: 2 }, children: "Voice chat" }), _jsxs(Text, { as: "p", sx: { color: 'fg.muted', mb: 3 }, children: ["Talk to the assistant instead of typing: hold the microphone in its composer, or ", _jsx("kbd", { children: "Ctrl" }), "+", _jsx("kbd", { children: "Space" }), ", speak, and let go. What you say is heard in this page and never leaves it; the words go in the message box for you to send. Its answers are read aloud by Datalayer\u2019s speech service, and not kept: on request, with", ' ', _jsx("em", { children: "Read aloud" }), " under an answer, or always, as they are written.", ' ', _jsx("kbd", { children: "Esc" }), " stops its voice."] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 3, mb: 3, flexWrap: "wrap", children: [_jsx(SegmentedControl, { "aria-label": "Language", children: LANGUAGES.map(option => (_jsx(SegmentedControl.Button, { selected: language === option.tag, onClick: () => setLanguage(option.tag), "data-voice-language": option.tag, children: option.label }, option.tag))) }), _jsx(SegmentedControl, { "aria-label": "When answers are heard", children: OUTPUTS.map(option => (_jsx(SegmentedControl.Button, { selected: output === option.output, onClick: () => setOutput(option.output), "data-voice-output": option.output, children: option.label }, option.output))) }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: ["Voice: ", voiceSpec.name] })] }), voiceSpec.attribution && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 3 }, children: voiceSpec.attribution })), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted' }, children: ["Models from ", MODELS, ", speech from ", SPEECH, ", the agent at ", SERVER, ". See", ' ', _jsx(Link, { href: "https://agent-runtimes.datalayer.tech/chat/voice", children: "Voice" }), ' ', "for how to run each."] })] }), _jsx(ChatFloating, { defaultViewMode: "assistant", assistantCharacter: "paperclip", protocol: "vercel-ai", endpoint: `${SERVER}/api/v1/vercel-ai/assistant`, title: "Assistant", description: "Hello! Hold the microphone and ask me anything.", position: "bottom-right", useStore: false, voice: voice })] }) }));
|
|
64
70
|
};
|
|
65
71
|
export default VoiceChatExample;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The runtime routes a page calls besides an application's own, and when it
|
|
3
|
+
* does not (PAP_DATALAYER's release gates, decided 14 October 2026).
|
|
4
|
+
*
|
|
5
|
+
* A runtime that serves a deployment — kept always on, or launched by its
|
|
6
|
+
* hosted page — and the visitors' runtime answer only the application's own
|
|
7
|
+
* routes (`OwnRoutesOnly`, the same `ownRoutesOnly` its chat is told). The
|
|
8
|
+
* page then asks nothing else of it: not the agent's status, not deleting
|
|
9
|
+
* its agent, not the runtime's model catalogue. Each is `undefined` there,
|
|
10
|
+
* and the caller asks nothing.
|
|
11
|
+
*
|
|
12
|
+
* Pure, so it is read without the agent hook's runtime stack.
|
|
13
|
+
*
|
|
14
|
+
* @module hooks/ownRoutes
|
|
15
|
+
*/
|
|
16
|
+
import type { AppLaunch } from './useAgentRuntimes';
|
|
17
|
+
/**
|
|
18
|
+
* Whether the runtime launched for an application answers only its own
|
|
19
|
+
* routes: it is launched for a deployment. A Preview runs on its Maker's.
|
|
20
|
+
*/
|
|
21
|
+
export declare function launchesOwnRoutesOnly(appLaunch?: AppLaunch): boolean;
|
|
22
|
+
/** `GET /api/v1/runtime/status` for an agent, or none on such a runtime. */
|
|
23
|
+
export declare function runtimeStatusUrl(agentBaseUrl: string, agentId: string, ownRoutesOnly: boolean): string | undefined;
|
|
24
|
+
/** `DELETE /api/v1/agents/{id}`, or none on such a runtime: its agent is the deployment's. */
|
|
25
|
+
export declare function agentDeletionUrl(agentBaseUrl: string, agentId: string, ownRoutesOnly: boolean): string | undefined;
|
|
26
|
+
/** `GET /api/v1/configure/models` for an agent, or none on such a runtime. */
|
|
27
|
+
export declare function runtimeModelsUrl(agentServerUrl: string, agentId: string, ownRoutesOnly: boolean): string | undefined;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Whether the runtime launched for an application answers only its own
|
|
7
|
+
* routes: it is launched for a deployment. A Preview runs on its Maker's.
|
|
8
|
+
*/
|
|
9
|
+
export function launchesOwnRoutesOnly(appLaunch) {
|
|
10
|
+
return Boolean(appLaunch?.deploymentUid);
|
|
11
|
+
}
|
|
12
|
+
const base = (url) => url.trim().replace(/\/$/, '');
|
|
13
|
+
/** `GET /api/v1/runtime/status` for an agent, or none on such a runtime. */
|
|
14
|
+
export function runtimeStatusUrl(agentBaseUrl, agentId, ownRoutesOnly) {
|
|
15
|
+
if (ownRoutesOnly) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return `${base(agentBaseUrl)}/api/v1/runtime/status?agent_id=${encodeURIComponent(agentId)}`;
|
|
19
|
+
}
|
|
20
|
+
/** `DELETE /api/v1/agents/{id}`, or none on such a runtime: its agent is the deployment's. */
|
|
21
|
+
export function agentDeletionUrl(agentBaseUrl, agentId, ownRoutesOnly) {
|
|
22
|
+
if (ownRoutesOnly) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return `${base(agentBaseUrl)}/api/v1/agents/${encodeURIComponent(agentId)}`;
|
|
26
|
+
}
|
|
27
|
+
/** `GET /api/v1/configure/models` for an agent, or none on such a runtime. */
|
|
28
|
+
export function runtimeModelsUrl(agentServerUrl, agentId, ownRoutesOnly) {
|
|
29
|
+
if (ownRoutesOnly) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return `${base(agentServerUrl)}/api/v1/configure/models?agent_id=${encodeURIComponent(agentId)}`;
|
|
33
|
+
}
|
|
@@ -130,6 +130,11 @@ export interface AgentSandboxConnectionInfo {
|
|
|
130
130
|
agentId?: string;
|
|
131
131
|
agentBaseUrl?: string;
|
|
132
132
|
runtimeEnvironment?: RuntimeEnvironmentDetails;
|
|
133
|
+
/**
|
|
134
|
+
* The runtime answers only the application's own routes (OwnRoutesOnly):
|
|
135
|
+
* its agent's status is not asked, and the ingress given is used.
|
|
136
|
+
*/
|
|
137
|
+
ownRoutesOnly?: boolean;
|
|
133
138
|
}
|
|
134
139
|
export interface RuntimeEnvironmentDetails {
|
|
135
140
|
environmentName?: string;
|