@datalayer/agent-runtimes 1.5.7 → 1.5.9
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-KezohVQI.js → AgentDetails-CMBy5o1q.js} +1 -1
- package/dist-embed/chunks/{AgentDetailsDialog-CklhMnk7.js → AgentDetailsDialog-D2vH2Nrd.js} +1 -1
- package/dist-embed/chunks/{AgentInspector-CtCaRc1L.js → AgentInspector-Bd0oHNAX.js} +1 -1
- package/dist-embed/chunks/{AgentInspectorDialog-DB9cx3Gd.js → AgentInspectorDialog-BJUgBPAE.js} +1 -1
- package/dist-embed/chunks/{CellSidebarExtension-CfaJL6DQ.js → CellSidebarExtension-CYOVwk1t.js} +6 -6
- package/dist-embed/chunks/ChatView-DIdw1rtZ.js +32 -0
- package/dist-embed/chunks/{ContextPie-1vP4f-3N.js → ContextPie-B9mAKJc2.js} +1 -1
- package/dist-embed/chunks/{DeckComponent-82GVdsoi.js → DeckComponent-CbmzVWcF.js} +2 -2
- package/dist-embed/chunks/{DocumentView-SrJloJDo.js → DocumentView-BqsGfNys.js} +1 -1
- package/dist-embed/chunks/{EphemeralDocument-t1KulOH8.js → EphemeralDocument-DLaNvwm_.js} +1 -1
- package/dist-embed/chunks/{EphemeralNotebook-Co-WQWCc.js → EphemeralNotebook-jnqAJFPI.js} +1 -1
- package/dist-embed/chunks/{ExcalidrawComponent-5NeLUYVB.js → ExcalidrawComponent-Cb8yeXqu.js} +1 -1
- package/dist-embed/chunks/{ExcalidrawModal-9ZnOB03n.js → ExcalidrawModal-DaPSGYek.js} +1 -1
- package/dist-embed/chunks/{JupyterLexicalExtension-Cize8RXy.js → JupyterLexicalExtension-BQINjIFV.js} +9 -9
- package/dist-embed/chunks/{KernelVariables-Cl57Zze1.js → KernelVariables-CGQkS5EX.js} +1 -1
- package/dist-embed/chunks/{LexicalToolRegistry-CoM9ROsx.js → LexicalToolRegistry-BJ6mpMWn.js} +1 -1
- package/dist-embed/chunks/{NotebookToolSurfaces-CWfppxBN.js → NotebookToolSurfaces-DiPifvaW.js} +1 -1
- package/dist-embed/chunks/{NotebookView-DOf_K74b.js → NotebookView-IX0wNuX8.js} +1 -1
- package/dist-embed/chunks/{Output-9DKTscSv.js → Output-B9XAhyoF.js} +1 -1
- package/dist-embed/chunks/{SandboxDetailsDialog-BCfDm6MB.js → SandboxDetailsDialog-COCpmo8m.js} +1 -1
- package/dist-embed/chunks/{SchemaForm-BOYPrvf8.js → SchemaForm-WIwdKnrk.js} +1 -1
- package/dist-embed/chunks/{WidgetVariableView-BTOwHP78.js → WidgetVariableView-BoGROi-A.js} +1 -1
- package/dist-embed/chunks/{YouTubePlugin-Bs4zZIB1.js → YouTubePlugin-BEQBWMwx.js} +1 -1
- package/dist-embed/chunks/{abnfDiagram-VCTEODGH-D5p59vS_.js → abnfDiagram-VCTEODGH-CG18Hf18.js} +1 -1
- package/dist-embed/chunks/{abnfDiagram-VCTEODGH-DRYbUvhc.js → abnfDiagram-VCTEODGH-D3_T0Lze.js} +1 -1
- package/dist-embed/chunks/{ar-SA-G6X2FPQ2-D6XRzkBS.js → ar-SA-G6X2FPQ2-BDWXsTdt.js} +1 -1
- package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-DQGv0imf.js → architectureDiagram-5GKGNRK7-B1QPAYO8.js} +1 -1
- package/dist-embed/chunks/{architectureDiagram-5GKGNRK7-B7ITKDup.js → architectureDiagram-5GKGNRK7-B5kSsKje.js} +1 -1
- package/dist-embed/chunks/{az-AZ-76LH7QW2-DBTdUiqp.js → az-AZ-76LH7QW2-BGchGiT7.js} +1 -1
- package/dist-embed/chunks/{bg-BG-XCXSNQG7-DuhcsaSL.js → bg-BG-XCXSNQG7-vCII6Zuq.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-868be97b-DYe-XTjy.js → blockDiagram-868be97b-BvM0ptp7.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-I7D4REHJ-y7tEFo3j.js → blockDiagram-I7D4REHJ-B8BmxOM4.js} +1 -1
- package/dist-embed/chunks/{blockDiagram-I7D4REHJ-IltJXCd6.js → blockDiagram-I7D4REHJ-ClwWG8yx.js} +1 -1
- package/dist-embed/chunks/{bn-BD-2XOGV67Q-CPFeLVSN.js → bn-BD-2XOGV67Q-Beu9yUTu.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-3f4bdde3-Bybp0wky.js → c4Diagram-3f4bdde3-S92W2yOx.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-7LVT6UL2-DpaHndz8.js → c4Diagram-7LVT6UL2-CNWW_-u7.js} +1 -1
- package/dist-embed/chunks/{c4Diagram-7LVT6UL2-CizxVqqX.js → c4Diagram-7LVT6UL2-nSCKKLuX.js} +1 -1
- package/dist-embed/chunks/{ca-ES-6MX7JW3Y-gDR_kEC6.js → ca-ES-6MX7JW3Y-CnEo6YQi.js} +1 -1
- package/dist-embed/chunks/{celltoolbartracker-DLF4PWyW.js → celltoolbartracker-CO6V5FhH.js} +1 -1
- package/dist-embed/chunks/{chunk-2Q5K7J3B-BI6lURun.js → chunk-2Q5K7J3B--r8j4N5L.js} +1 -1
- package/dist-embed/chunks/{chunk-2Q5K7J3B-DWoLSrj9.js → chunk-2Q5K7J3B-D3fTIaw3.js} +1 -1
- package/dist-embed/chunks/{chunk-5VM5RSS4-SleuNqDC.js → chunk-5VM5RSS4-D76mXyWz.js} +1 -1
- package/dist-embed/chunks/{chunk-5VM5RSS4-CDh4wYym.js → chunk-5VM5RSS4-QmrgOATO.js} +1 -1
- package/dist-embed/chunks/{chunk-F27PBJKO-h_FwJMTr.js → chunk-F27PBJKO-DdSgBnK0.js} +1 -1
- package/dist-embed/chunks/{chunk-F27PBJKO-AvWsNGYY.js → chunk-F27PBJKO-DvNrStTM.js} +1 -1
- package/dist-embed/chunks/{chunk-IMKFNOWR-DGRceKiU.js → chunk-IMKFNOWR-DpxND1Ct.js} +1 -1
- package/dist-embed/chunks/{chunk-IMKFNOWR-Hx4a5yny.js → chunk-IMKFNOWR-DwqmSZhU.js} +1 -1
- package/dist-embed/chunks/{chunk-JWPE2WC7-A4gy2qc4.js → chunk-JWPE2WC7-i7V3vMtZ.js} +1 -1
- package/dist-embed/chunks/{chunk-JWPE2WC7-BuJactJo.js → chunk-JWPE2WC7-jla8jvq5.js} +1 -1
- package/dist-embed/chunks/{chunk-POPQ4Y6H-CFM-817s.js → chunk-POPQ4Y6H-BGCugXU7.js} +1 -1
- package/dist-embed/chunks/{chunk-POPQ4Y6H-CmRF80iG.js → chunk-POPQ4Y6H-ofrenTaa.js} +1 -1
- package/dist-embed/chunks/{chunk-SVP7TREG-CryZx9JE.js → chunk-SVP7TREG-2Q2uQyQk.js} +1 -1
- package/dist-embed/chunks/{chunk-SVP7TREG-DSNzmytH.js → chunk-SVP7TREG-BIxxVjkU.js} +1 -1
- package/dist-embed/chunks/{chunk-TICWLB2K-DyGS3fIj.js → chunk-TICWLB2K-BqA5q52L.js} +1 -1
- package/dist-embed/chunks/{chunk-TICWLB2K-CEaDF8ZJ.js → chunk-TICWLB2K-LNiCmYq5.js} +1 -1
- package/dist-embed/chunks/{chunk-XXDRQBXY-8Cnzpdjz.js → chunk-XXDRQBXY-CNMg_gvd.js} +1 -1
- package/dist-embed/chunks/{chunk-XXDRQBXY-DxQBcVOz.js → chunk-XXDRQBXY-CqtfA3WC.js} +1 -1
- package/dist-embed/chunks/{classDiagram-ZZMXUADV-yvP3zMO3.js → classDiagram-ZZMXUADV-Co0jT9i-.js} +1 -1
- package/dist-embed/chunks/{classDiagram-ZZMXUADV-BQkO1UYr.js → classDiagram-ZZMXUADV-D6z_X195.js} +1 -1
- package/dist-embed/chunks/{classDiagram-f62afe4f-AYfpYKtp.js → classDiagram-f62afe4f-lN62p17q.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-604399ef-BWyNcT_y.js → classDiagram-v2-604399ef-B_QJ6H8h.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-yvP3zMO3.js → classDiagram-v2-VYDZK3BY-Co0jT9i-.js} +1 -1
- package/dist-embed/chunks/{classDiagram-v2-VYDZK3BY-BQkO1UYr.js → classDiagram-v2-VYDZK3BY-D6z_X195.js} +1 -1
- package/dist-embed/chunks/{code-block-IT6T5CEO-F4BSIGY6.js → code-block-IT6T5CEO-BA38Km-f.js} +1 -1
- package/dist-embed/chunks/{component-DMQ8W8n1.js → component-Chor_J7e.js} +1 -1
- package/dist-embed/chunks/{cose-bilkent-JH36ORCC-C3HC0XIY.js → cose-bilkent-JH36ORCC-B5H1cwBa.js} +1 -1
- package/dist-embed/chunks/{cose-bilkent-JH36ORCC-MVxlcfpd.js → cose-bilkent-JH36ORCC-C3cTgEcU.js} +1 -1
- package/dist-embed/chunks/{createText-aed3d8b3-CEJODAXJ.js → createText-aed3d8b3-BtgHeyNs.js} +1 -1
- package/dist-embed/chunks/{cs-CZ-2BRQDIVT-BXQxcYp6.js → cs-CZ-2BRQDIVT-ClBKH9_y.js} +1 -1
- package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-DNRKTIHx.js → cynefinDiagram-5FMLGOSQ-DPQLh9z7.js} +1 -1
- package/dist-embed/chunks/{cynefinDiagram-5FMLGOSQ-D87ENxS0.js → cynefinDiagram-5FMLGOSQ-sdsAonZm.js} +1 -1
- package/dist-embed/chunks/{da-DK-5WZEPLOC-Ck3vidj3.js → da-DK-5WZEPLOC-BqFDUAty.js} +1 -1
- package/dist-embed/chunks/{dagre-GXQ25YYZ-BOhThFKd.js → dagre-GXQ25YYZ-Bwf_WjLM.js} +1 -1
- package/dist-embed/chunks/{dagre-GXQ25YYZ-DscCD5Uq.js → dagre-GXQ25YYZ-DHF-9-7e.js} +1 -1
- package/dist-embed/chunks/{de-DE-XR44H4JA-CPZgrOuc.js → de-DE-XR44H4JA-6dsEQn7Z.js} +1 -1
- package/dist-embed/chunks/{diagram-S7CK7UJ4-zDQduoQy.js → diagram-S7CK7UJ4-C-N7Ei3I.js} +1 -1
- package/dist-embed/chunks/{diagram-S7CK7UJ4-CUhme3Bl.js → diagram-S7CK7UJ4-DEqGRBMT.js} +1 -1
- package/dist-embed/chunks/{diagram-UQ7AKVKN-BxhQPjAM.js → diagram-UQ7AKVKN-CvSBE0YU.js} +1 -1
- package/dist-embed/chunks/{diagram-UQ7AKVKN-Byi-v8UN.js → diagram-UQ7AKVKN-DACyxI-v.js} +1 -1
- package/dist-embed/chunks/{diagram-VSXAHHWV-au-v2v9D.js → diagram-VSXAHHWV-DFze2xro.js} +1 -1
- package/dist-embed/chunks/{diagram-VSXAHHWV-CqihYkDH.js → diagram-VSXAHHWV-DOb69VtE.js} +1 -1
- package/dist-embed/chunks/{diagram-VX7I27RA-Cd5PaF_n.js → diagram-VX7I27RA-8EKYM_Sx.js} +1 -1
- package/dist-embed/chunks/{diagram-VX7I27RA-ETzwrw79.js → diagram-VX7I27RA-CVTSdYyZ.js} +1 -1
- package/dist-embed/chunks/{diagram-Z3DM3KII-DkbsvY2A.js → diagram-Z3DM3KII-B-689FF6.js} +1 -1
- package/dist-embed/chunks/{diagram-Z3DM3KII-AcMuRFo5.js → diagram-Z3DM3KII-DyiBmBFy.js} +1 -1
- package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-DuWfMZcD.js → ebnfDiagram-PWID7BFC-DcKvqn_h.js} +1 -1
- package/dist-embed/chunks/{ebnfDiagram-PWID7BFC-BrEs-SB2.js → ebnfDiagram-PWID7BFC-gj8dgCWR.js} +1 -1
- package/dist-embed/chunks/{edges-b2856ca0-Czd3-xvj.js → edges-b2856ca0-BqGGNnb4.js} +1 -1
- package/dist-embed/chunks/{el-GR-BZB4AONW-CjQSkw0P.js → el-GR-BZB4AONW-DOMW2ttY.js} +1 -1
- package/dist-embed/chunks/{erDiagram-5d81789a-JegaF4gy.js → erDiagram-5d81789a-Bf1Ik49K.js} +1 -1
- package/dist-embed/chunks/{erDiagram-RLTQ6QDP-xubaXuKR.js → erDiagram-RLTQ6QDP-B0PyZB_3.js} +1 -1
- package/dist-embed/chunks/{erDiagram-RLTQ6QDP-Cpn6_cd1.js → erDiagram-RLTQ6QDP-GSu-_IUJ.js} +1 -1
- package/dist-embed/chunks/{es-ES-U4NZUMDT-CQz3Tsxk.js → es-ES-U4NZUMDT-DeyWqjw1.js} +1 -1
- package/dist-embed/chunks/{eu-ES-A7QVB2H4-DPwxHXvP.js → eu-ES-A7QVB2H4-CUGbZ0Pv.js} +1 -1
- package/dist-embed/chunks/{fa-IR-HGAKTJCU-DlQyRFJP.js → fa-IR-HGAKTJCU-Br8UEVO1.js} +1 -1
- package/dist-embed/chunks/{fi-FI-Z5N7JZ37-BL9Dv0rT.js → fi-FI-Z5N7JZ37-BSHjwo8G.js} +1 -1
- package/dist-embed/chunks/{flowDb-185abca5-BN_8lgCO.js → flowDb-185abca5-U9PwWSO4.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-1629c991-YRlRqB59.js → flowDiagram-1629c991-BecgzQgp.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-HODETNUW-lW-icIxi.js → flowDiagram-HODETNUW-2vih3kWM.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-HODETNUW-CzRvxVGK.js → flowDiagram-HODETNUW-tcAkcGh4.js} +1 -1
- package/dist-embed/chunks/{flowDiagram-v2-1d953310-DBFSFroi.js → flowDiagram-v2-1d953310-Bdmc9G3m.js} +1 -1
- package/dist-embed/chunks/{flowchart-elk-definition-6df44142-RjL83g27.js → flowchart-elk-definition-6df44142-oWOWsVNc.js} +1 -1
- package/dist-embed/chunks/{fr-FR-RHASNOE6-xB7HyFVv.js → fr-FR-RHASNOE6-BukqZYPz.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-3b0b3873-Dowe9cKl.js → ganttDiagram-3b0b3873-B7lmD9r9.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-CNQPBdAP.js → ganttDiagram-EL5Y4UJY-D0E7se_Z.js} +1 -1
- package/dist-embed/chunks/{ganttDiagram-EL5Y4UJY-CLaynGwe.js → ganttDiagram-EL5Y4UJY-DDbqMevq.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CupHqYWl.js → gitGraphDiagram-WWUBYQGX-DK3EJl5z.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-WWUBYQGX-CDuBbPX3.js → gitGraphDiagram-WWUBYQGX-DnVwXJWu.js} +1 -1
- package/dist-embed/chunks/{gitGraphDiagram-f01e8bc2-C06Sje1n.js → gitGraphDiagram-f01e8bc2-B9vpLy6R.js} +1 -1
- package/dist-embed/chunks/{gl-ES-HMX3MZ6V-BX50ltap.js → gl-ES-HMX3MZ6V-BxVOJiaI.js} +1 -1
- package/dist-embed/chunks/{he-IL-6SHJWFNN-DR3hLzYG.js → he-IL-6SHJWFNN-Dv2VRxlJ.js} +1 -1
- package/dist-embed/chunks/{hi-IN-IWLTKZ5I-C3bSDqVc.js → hi-IN-IWLTKZ5I-CFo5RUMz.js} +1 -1
- package/dist-embed/chunks/{hu-HU-A5ZG7DT2--mRUDQG6.js → hu-HU-A5ZG7DT2-ul3dS3un.js} +1 -1
- package/dist-embed/chunks/{id-ID-SAP4L64H-D6psdwdp.js → id-ID-SAP4L64H-ItVb-zwI.js} +1 -1
- package/dist-embed/chunks/{index-qsUgit40.js → index-7FNjj0f2.js} +1 -1
- package/dist-embed/chunks/{index-9bae90f3-BY7E8HZU.js → index-9bae90f3-D9849sgo.js} +1 -1
- package/dist-embed/chunks/{index-DToDguC3.js → index-B-L6ocEV.js} +1 -1
- package/dist-embed/chunks/{index-C01nR1dW.js → index-B0wMyD8Y.js} +1 -1
- package/dist-embed/chunks/{index-BzXMsI1v.js → index-B5zrJYwn.js} +6 -6
- package/dist-embed/chunks/{index-DcZQ2Oqj.js → index-B764si9c.js} +1 -1
- package/dist-embed/chunks/{index-3O3ob63z.js → index-BM6oRiO1.js} +1 -1
- package/dist-embed/chunks/{index-DVUMPcVw.js → index-BNFRRs9d.js} +1 -1
- package/dist-embed/chunks/{index-D0DBuFMt.js → index-BOYhJnrD.js} +1 -1
- package/dist-embed/chunks/{index-CA8D7U2s.js → index-BT4vYFeY.js} +1 -1
- package/dist-embed/chunks/{index-C8IekrmL.js → index-BfUXEHI0.js} +1 -1
- package/dist-embed/chunks/{index-DvWWLOj6.js → index-BiTIdbkn.js} +1 -1
- package/dist-embed/chunks/{index-BhU2ra4k.js → index-BkKEXqQS.js} +1 -1
- package/dist-embed/chunks/{index-CpcHHQd7.js → index-BqMoyzEk.js} +1 -1
- package/dist-embed/chunks/{index-D1lY79hS.js → index-BrD9dtoV.js} +1 -1
- package/dist-embed/chunks/{index-B063q-PC.js → index-CRpZyQIR.js} +4 -4
- package/dist-embed/chunks/{index-BblwlEJB.js → index-CZdWsyNw.js} +1 -1
- package/dist-embed/chunks/{index-Azo_wV3K.js → index-CjM49jS0.js} +1 -1
- package/dist-embed/chunks/{index-rfsiH_M6.js → index-Cp2aJ2ZR.js} +1 -1
- package/dist-embed/chunks/{index-Cknn3VQD.js → index-Cql9gOsL.js} +1 -1
- package/dist-embed/chunks/{index-jy9kOmqu.js → index-CsgaCZaW.js} +1 -1
- package/dist-embed/chunks/{index-DB46n9Tf.js → index-CsxlyZef.js} +1 -1
- package/dist-embed/chunks/{index-MTdX216X.js → index-D2LvuQlP.js} +1 -1
- package/dist-embed/chunks/{index-s3hayhRS.js → index-DQQXY-7d.js} +2 -2
- package/dist-embed/chunks/{index-B0KVfQGJ.js → index-DSF21-29.js} +1 -1
- package/dist-embed/chunks/{index-BYMZi_1t.js → index-DSvebR7d.js} +1 -1
- package/dist-embed/chunks/{index-a51XM5L8.js → index-DoBEQ07P.js} +3 -3
- package/dist-embed/chunks/{index-kpqZuE4J.js → index-O2jaI8TY.js} +1 -1
- package/dist-embed/chunks/{index-C6wF35Kk.js → index-QZ3sHHT3.js} +1 -1
- package/dist-embed/chunks/{index-BlWZloLe.js → index-TEcp7-f6.js} +2 -2
- package/dist-embed/chunks/{index-EpYurdzk.js → index-YlGTgJvL.js} +5 -5
- package/dist-embed/chunks/{index-CUL9WiLS.js → index-bm8APcDZ.js} +1 -1
- package/dist-embed/chunks/{index-BipXK1tF.js → index-jh9S19of.js} +1 -1
- package/dist-embed/chunks/{index-C643Hfu1.js → index-oGqh9y23.js} +1 -1
- package/dist-embed/chunks/{index-BdvS7Q4t.js → index-xiH3WzLm.js} +1 -1
- package/dist-embed/chunks/{index.esm-CWygaJYM.js → index.esm-B7KoTOBb.js} +1 -1
- package/dist-embed/chunks/{index.esm-DYeUXS4c.js → index.esm-CkSite-X.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-27XIBGKW-Ctm-zk09.js → infoDiagram-27XIBGKW-DDO50Ria.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-27XIBGKW-DRzH33_4.js → infoDiagram-27XIBGKW-O3q53Qe2.js} +1 -1
- package/dist-embed/chunks/{infoDiagram-a29d40f1-c78-ZMuT.js → infoDiagram-a29d40f1-jOvOHUyu.js} +1 -1
- package/dist-embed/chunks/{isEqual-niFNV5MZ.js → isEqual-CGLTk7wU.js} +1 -1
- package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-DKv5KL85.js → ishikawaDiagram-5VMMS53U-DuiWhpVW.js} +1 -1
- package/dist-embed/chunks/{ishikawaDiagram-5VMMS53U-CILSTTqm.js → ishikawaDiagram-5VMMS53U-IzmbYzxv.js} +1 -1
- package/dist-embed/chunks/{it-IT-JPQ66NNP-BfrG_atL.js → it-IT-JPQ66NNP-BuCUBzia.js} +1 -1
- package/dist-embed/chunks/{ja-JP-DBVTYXUO-sahpmNGY.js → ja-JP-DBVTYXUO-BhtQz4sy.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-CSMQRlsr.js → journeyDiagram-3NMN7TZE-DGLcsVfC.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-3NMN7TZE-DlMPiHSP.js → journeyDiagram-3NMN7TZE-sO-Cfp65.js} +1 -1
- package/dist-embed/chunks/{journeyDiagram-95396277-VzHClVrX.js → journeyDiagram-95396277-CA4bGq0G.js} +1 -1
- package/dist-embed/chunks/{kaa-6HZHGXH3-BrkhtXQj.js → kaa-6HZHGXH3-B_TI8Aa0.js} +1 -1
- package/dist-embed/chunks/{kab-KAB-ZGHBKWFO-DwtFIV_I.js → kab-KAB-ZGHBKWFO-BsSg_l-j.js} +1 -1
- package/dist-embed/chunks/{kanban-definition-UXKFOSKX-BkxvAXq2.js → kanban-definition-UXKFOSKX-0wjvwDqk.js} +1 -1
- package/dist-embed/chunks/{kanban-definition-UXKFOSKX-esf1amn7.js → kanban-definition-UXKFOSKX-CDtLkjnU.js} +1 -1
- package/dist-embed/chunks/{kk-KZ-P5N5QNE5-UxN1LGH5.js → kk-KZ-P5N5QNE5-B7XK5OQq.js} +1 -1
- package/dist-embed/chunks/{km-KH-HSX4SM5Z-B7lolfpy.js → km-KH-HSX4SM5Z-Cm2LA9F8.js} +1 -1
- package/dist-embed/chunks/{ko-KR-MTYHY66A-CnxefCaN.js → ko-KR-MTYHY66A-CL5s99y5.js} +1 -1
- package/dist-embed/chunks/{ku-TR-6OUDTVRD-Bt7bmFnv.js → ku-TR-6OUDTVRD-CiijvKHq.js} +1 -1
- package/dist-embed/chunks/{layout-D7Mk1riq.js → layout-BBbB54WC.js} +1 -1
- package/dist-embed/chunks/{layout-Sl9Lf6Ae.js → layout-CzrlbzeK.js} +1 -1
- package/dist-embed/chunks/{lexicalHooks-DKF-DsxG.js → lexicalHooks-DQxNZEiJ.js} +1 -1
- package/dist-embed/chunks/{lt-LT-XHIRWOB4-D6qkXs9m.js → lt-LT-XHIRWOB4-CcA_Z5jR.js} +1 -1
- package/dist-embed/chunks/{lv-LV-5QDEKY6T-D8g27j86.js → lv-LV-5QDEKY6T-CAQS9wGm.js} +1 -1
- package/dist-embed/chunks/{mermaid.core-BhiOhb5K.js → mermaid.core-DfgoT1cz.js} +3 -3
- package/dist-embed/chunks/{mermaid.core-CRlujv29.js → mermaid.core-s-D09gpV.js} +5 -5
- package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-eCxs0BsL.js → mindmap-definition-YA3MSWOX-B6_K5ZvV.js} +1 -1
- package/dist-embed/chunks/{mindmap-definition-YA3MSWOX-BJQsz4H1.js → mindmap-definition-YA3MSWOX-BCiSPRJk.js} +1 -1
- package/dist-embed/chunks/{mindmap-definition-e4c1d938-DoGG9eDO.js → mindmap-definition-e4c1d938-D7gmABiC.js} +1 -1
- package/dist-embed/chunks/{mr-IN-CRQNXWMA-CMbVGyJm.js → mr-IN-CRQNXWMA-DMAAvsDA.js} +1 -1
- package/dist-embed/chunks/{my-MM-5M5IBNSE-B-KPsx1j.js → my-MM-5M5IBNSE-t2TKqrjW.js} +1 -1
- package/dist-embed/chunks/{nb-NO-T6EIAALU-Cl7QLAt7.js → nb-NO-T6EIAALU-Bi3ZI-HQ.js} +1 -1
- package/dist-embed/chunks/{nl-NL-IS3SIHDZ-Brzte_o2.js → nl-NL-IS3SIHDZ-B8UdlW1K.js} +1 -1
- package/dist-embed/chunks/{nn-NO-6E72VCQL-CzCKEx02.js → nn-NO-6E72VCQL-Bt87hI27.js} +1 -1
- package/dist-embed/chunks/{oc-FR-POXYY2M6-DA72PkVY.js → oc-FR-POXYY2M6-009NL0Pk.js} +1 -1
- package/dist-embed/chunks/{pa-IN-N4M65BXN-CzkFYtL0.js → pa-IN-N4M65BXN-BfUtS2yt.js} +1 -1
- package/dist-embed/chunks/{pegDiagram-XKGWAZYB-CD3xZvKE.js → pegDiagram-XKGWAZYB-BX0ZYMng.js} +1 -1
- package/dist-embed/chunks/{pegDiagram-XKGWAZYB-CV-d6HkK.js → pegDiagram-XKGWAZYB-CBrnWUaX.js} +1 -1
- package/dist-embed/chunks/{percentages-BXMCSKIN-mjCCp4uI.js → percentages-BXMCSKIN-CfzulzOv.js} +5 -5
- package/dist-embed/chunks/{pieDiagram-E7YTZNPT-toANOh_O.js → pieDiagram-E7YTZNPT-B1My5W85.js} +1 -1
- package/dist-embed/chunks/{pieDiagram-E7YTZNPT-DipS--g7.js → pieDiagram-E7YTZNPT-Ct8dzoLU.js} +1 -1
- package/dist-embed/chunks/{pieDiagram-c941bede-DytniBrW.js → pieDiagram-c941bede-7DZ-Bl8U.js} +1 -1
- package/dist-embed/chunks/{pl-PL-T2D74RX3-F4ebFTYK.js → pl-PL-T2D74RX3-DbtOl9_x.js} +1 -1
- package/dist-embed/chunks/{pt-BR-5N22H2LF-B5i8LuE4.js → pt-BR-5N22H2LF-B1pjR1_T.js} +1 -1
- package/dist-embed/chunks/{pt-PT-UZXXM6DQ-BQ7hfRRg.js → pt-PT-UZXXM6DQ-takC7TRa.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-D_j5dzK-.js → quadrantDiagram-AXDQQJYC-B1mlT7fN.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-AXDQQJYC-DlhtjZ-k.js → quadrantDiagram-AXDQQJYC-B7p4unpj.js} +1 -1
- package/dist-embed/chunks/{quadrantDiagram-cf8b8fe0-BQ2yjLYu.js → quadrantDiagram-cf8b8fe0-CTMh_Ad5.js} +1 -1
- package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-CZFkdwSz.js → railroadDiagram-O6MQD6OU-CJEwr5d9.js} +1 -1
- package/dist-embed/chunks/{railroadDiagram-O6MQD6OU-aWlxxhLc.js → railroadDiagram-O6MQD6OU-xr8bPIl7.js} +1 -1
- package/dist-embed/chunks/{renderer-2D5v6hpK.js → renderer-Ba0Cwb4p.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-53bda41b-CWV_b9FE.js → requirementDiagram-53bda41b-Dv1Piop_.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-EVwiX2gg.js → requirementDiagram-BXWQKSXE-Bw89vFiC.js} +1 -1
- package/dist-embed/chunks/{requirementDiagram-BXWQKSXE-BSF51uZZ.js → requirementDiagram-BXWQKSXE-rabT3v-j.js} +1 -1
- package/dist-embed/chunks/{ro-RO-JPDTUUEW-BdcZRS6h.js → ro-RO-JPDTUUEW-DkkqyFBF.js} +1 -1
- package/dist-embed/chunks/{ru-RU-B4JR7IUQ-Cta1z8f6.js → ru-RU-B4JR7IUQ-CikD-ITp.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-BqD6w06O.js → sankeyDiagram-P5KCCOFB-5SpI76uK.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-P5KCCOFB-t6rHaBZJ.js → sankeyDiagram-P5KCCOFB-D--cx9I2.js} +1 -1
- package/dist-embed/chunks/{sankeyDiagram-c3ef121a-C9O52Zx9.js → sankeyDiagram-c3ef121a-DbhtSWkB.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-82a5b84f-Dga-BwWi.js → sequenceDiagram-82a5b84f-DpxBSKAk.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-ih6W0378.js → sequenceDiagram-WJ2MYXX4-DGNwWgf8.js} +1 -1
- package/dist-embed/chunks/{sequenceDiagram-WJ2MYXX4-DphVeQVS.js → sequenceDiagram-WJ2MYXX4-D_wK-z7a.js} +1 -1
- package/dist-embed/chunks/{sessions-APuuDN3K.js → sessions-DQkTozai.js} +1 -1
- package/dist-embed/chunks/{si-LK-N5RQ5JYF-DYy_OKHx.js → si-LK-N5RQ5JYF-BqlWRhwK.js} +1 -1
- package/dist-embed/chunks/{sizeCapture-INFHLROL-o0dzt8-T.js → sizeCapture-INFHLROL-4Uh8JUjf.js} +1 -1
- package/dist-embed/chunks/{sizeCapture-INFHLROL-CxIMCruL.js → sizeCapture-INFHLROL-g-K-6XON.js} +1 -1
- package/dist-embed/chunks/{sk-SK-C5VTKIMK-B4A8rgzq.js → sk-SK-C5VTKIMK-DGsmi02E.js} +1 -1
- package/dist-embed/chunks/{sl-SI-NN7IZMDC-Dn2yU1RA.js → sl-SI-NN7IZMDC-HFz45GOs.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-43e79a5f-RBFnM6HD.js → stateDiagram-43e79a5f-DxbV4jP9.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-D77RDMKH-R5RRRvFY.js → stateDiagram-D77RDMKH-C_wYpqah.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-D77RDMKH-DUbaZs3a.js → stateDiagram-D77RDMKH-D-l3u-WY.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-2041ed4f-O5FpnsEz.js → stateDiagram-v2-2041ed4f-BzxzaDdI.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-xKTLvXGN.js → stateDiagram-v2-MP3YSRHH-BGYkOvTS.js} +1 -1
- package/dist-embed/chunks/{stateDiagram-v2-MP3YSRHH-CxTXB7mT.js → stateDiagram-v2-MP3YSRHH-IEMNMwm0.js} +1 -1
- package/dist-embed/chunks/{styles-455b33cd-D4Xv2qYx.js → styles-455b33cd-C42Lyulv.js} +1 -1
- package/dist-embed/chunks/{styles-f932cba9-BRIqeB8k.js → styles-f932cba9-Bf6H3IMq.js} +1 -1
- package/dist-embed/chunks/{styles-fcc2142b-CSNd2DtU.js → styles-fcc2142b-OZg6fE-p.js} +1 -1
- package/dist-embed/chunks/{subset-shared.chunk-SugOGKH0.js → subset-shared.chunk-KC0vshev.js} +1 -1
- package/dist-embed/chunks/{subset-worker.chunk-CHn-RJwQ.js → subset-worker.chunk-CXZAV_Z5.js} +1 -1
- package/dist-embed/chunks/{sv-SE-XGPEYMSR-DIGNKjA1.js → sv-SE-XGPEYMSR-yEdPvwHy.js} +1 -1
- package/dist-embed/chunks/{svgDrawCommon-148a3cd9-ioBjWI45.js → svgDrawCommon-148a3cd9-D9MRwoYw.js} +1 -1
- package/dist-embed/chunks/{swimlanes-42K2YHIH-DID4P1mJ.js → swimlanes-42K2YHIH-CPkom4Q8.js} +1 -1
- package/dist-embed/chunks/{swimlanes-42K2YHIH-BPXSOfWl.js → swimlanes-42K2YHIH-DJLFcHMt.js} +1 -1
- package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-C5LAWW5q.js → swimlanesDiagram-VR7AAH4N-BJOhuN-y.js} +1 -1
- package/dist-embed/chunks/{swimlanesDiagram-VR7AAH4N-B216TpFb.js → swimlanesDiagram-VR7AAH4N-BRTtY1QX.js} +1 -1
- package/dist-embed/chunks/{ta-IN-2NMHFXQM-h5n2V9ms.js → ta-IN-2NMHFXQM-0i424YGX.js} +1 -1
- package/dist-embed/chunks/{th-TH-HPSO5L25-DPUFV7b6.js → th-TH-HPSO5L25-BidF5zNO.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-24CTP7MA-CsrTDzso.js → timeline-definition-24CTP7MA-BasSLg-_.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-24CTP7MA-Y3tUsmSp.js → timeline-definition-24CTP7MA-BfGIJi1H.js} +1 -1
- package/dist-embed/chunks/{timeline-definition-7545f45a-Dwe7O50H.js → timeline-definition-7545f45a-BWwgvKxJ.js} +1 -1
- package/dist-embed/chunks/{tr-TR-DEFEU3FU-BezJkdMx.js → tr-TR-DEFEU3FU-BoHR9SlC.js} +1 -1
- package/dist-embed/chunks/{uk-UA-QMV73CPH-CqILlosm.js → uk-UA-QMV73CPH-DfRkqqO0.js} +1 -1
- package/dist-embed/chunks/{vennDiagram-4TSXK5OY-BhVdyHxt.js → vennDiagram-4TSXK5OY-D1T__rd2.js} +1 -1
- package/dist-embed/chunks/{vennDiagram-4TSXK5OY-ClTlC2ql.js → vennDiagram-4TSXK5OY-DMIYCfJ-.js} +1 -1
- package/dist-embed/chunks/{vi-VN-M7AON7JQ-CnkPVQ0a.js → vi-VN-M7AON7JQ-CvZ4wpTw.js} +1 -1
- package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-kS16z5iB.js → wardleyDiagram-VM6X3IG4-CiKuFI26.js} +1 -1
- package/dist-embed/chunks/{wardleyDiagram-VM6X3IG4-DbWIMpvU.js → wardleyDiagram-VM6X3IG4-DtlNUHLy.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-3f383b91-DYoT_EjG.js → xychartDiagram-3f383b91-DzyuxW4K.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-KeQp-cQ1.js → xychartDiagram-S5SC5T6Z-BIeFUHrS.js} +1 -1
- package/dist-embed/chunks/{xychartDiagram-S5SC5T6Z-CdwuwQAF.js → xychartDiagram-S5SC5T6Z-p6pYRkk6.js} +1 -1
- package/dist-embed/chunks/{zh-CN-LNUGB5OW-CNdfctAT.js → zh-CN-LNUGB5OW-Cx1Azgu2.js} +1 -1
- package/dist-embed/chunks/{zh-HK-E62DVLB3-DEXwa5-T.js → zh-HK-E62DVLB3-DMjy1d4Z.js} +1 -1
- package/dist-embed/chunks/{zh-TW-RAJ6MFWO-BF7cCYAK.js → zh-TW-RAJ6MFWO-J-YjINmR.js} +1 -1
- package/dist-embed/datalayer-app-main.js +22 -22
- package/lib/apps/apps/appspec.d.ts +10 -1
- package/lib/apps/apps/appspec.js +104 -7
- package/lib/apps/core/index.d.ts +26 -0
- package/lib/apps/core/index.js +20 -0
- package/lib/apps/plugins/chat/ChatView.js +21 -4
- package/lib/protocols/mcp/client.d.ts +73 -0
- package/lib/protocols/mcp/client.js +136 -0
- package/lib/protocols/mcp/index.d.ts +1 -0
- package/lib/protocols/mcp/index.js +3 -1
- package/lib/protocols/web-bot-auth/tap.d.ts +56 -0
- package/lib/protocols/web-bot-auth/tap.js +185 -0
- package/lib/specs/apps.js +56 -26
- package/lib/specs/appspecSchema.js +180 -5
- package/lib/specs/protocols.js +5 -5
- package/lib/types/agentspecs.d.ts +66 -3
- package/package.json +3 -1
- package/dist-embed/chunks/ChatView-B3QqHhAP.js +0 -32
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*
|
|
25
25
|
* @module apps/apps/appspec
|
|
26
26
|
*/
|
|
27
|
-
import type { AppAccent, AppThemeMode, AppThemeVariant, AppAssistantCharacter, AppEmbedMode, AppCustomComponentSpec, AppVoiceSpec, AppKind, AppLayout, AppPageOutputComponent, AppSpec } from '../../types/agentspecs';
|
|
27
|
+
import type { AppAccent, AppThemeMode, AppThemeVariant, AppAssistantCharacter, AppEmbedMode, PapProfile, AppCustomComponentSpec, AppVoiceSpec, AppKind, AppLayout, AppPageOutputComponent, AppSpec } 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). */
|
|
@@ -60,6 +60,15 @@ type Data = Record<string, unknown>;
|
|
|
60
60
|
export declare function retentionDays(keepFor: string): number;
|
|
61
61
|
/** An application with nothing said: what *Start blank* opens. */
|
|
62
62
|
export declare function emptyAppspec(kind?: AppKind): AppSpec;
|
|
63
|
+
/** The Personal Agent Protocol profiles Datalayer speaks, as agentspecs' `PAP_PROFILES` (PAP_DATALAYER S-03). */
|
|
64
|
+
export declare const PAP_PROFILES: readonly PapProfile[];
|
|
65
|
+
/** The profile a `pap` block is written for when the Studio or a builder starts one. */
|
|
66
|
+
export declare const PAP_PROFILE: PapProfile;
|
|
67
|
+
/**
|
|
68
|
+
* What is wrong with a `pap` block's profile, in agentspecs' sentence
|
|
69
|
+
* (`pap_profile_problem`); `undefined` when it is one Datalayer speaks.
|
|
70
|
+
*/
|
|
71
|
+
export declare function papProfileProblem(value: unknown): string | undefined;
|
|
63
72
|
/** An application's voice (VOICE.md VO-41): off unless said. */
|
|
64
73
|
export declare const DEFAULT_VOICE: AppVoiceSpec;
|
|
65
74
|
/** What a page's output may be drawn with (LOOP P-05), and the property of each that shows its value. */
|
package/lib/apps/apps/appspec.js
CHANGED
|
@@ -248,6 +248,23 @@ function parseConnection(data) {
|
|
|
248
248
|
only: texts(data.only),
|
|
249
249
|
};
|
|
250
250
|
}
|
|
251
|
+
/** The Personal Agent Protocol profiles Datalayer speaks, as agentspecs' `PAP_PROFILES` (PAP_DATALAYER S-03). */
|
|
252
|
+
export const PAP_PROFILES = ['draft-01'];
|
|
253
|
+
/** The profile a `pap` block is written for when the Studio or a builder starts one. */
|
|
254
|
+
export const PAP_PROFILE = PAP_PROFILES[PAP_PROFILES.length - 1];
|
|
255
|
+
/**
|
|
256
|
+
* What is wrong with a `pap` block's profile, in agentspecs' sentence
|
|
257
|
+
* (`pap_profile_problem`); `undefined` when it is one Datalayer speaks.
|
|
258
|
+
*/
|
|
259
|
+
export function papProfileProblem(value) {
|
|
260
|
+
if (value === undefined || value === null || value === '') {
|
|
261
|
+
return `Its \`pap\` block names no Personal Agent Protocol profile: add \`profile: ${PAP_PROFILE}\`.`;
|
|
262
|
+
}
|
|
263
|
+
if (!PAP_PROFILES.includes(value)) {
|
|
264
|
+
return `This application asks for Personal Agent Protocol profile “${String(value)}”; Datalayer speaks ${PAP_PROFILES.join(' or ')}.`;
|
|
265
|
+
}
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
251
268
|
const PAP_INTERFACES = ['agent', 'openapi', 'mcp', 'web'];
|
|
252
269
|
const PAP_SIGN_IN = ['direct', 'device', 'mediated'];
|
|
253
270
|
const PAP_DEFAULT_INTERFACES = ['agent'];
|
|
@@ -265,6 +282,7 @@ const enumsOf = (value, allowed, otherwise) => {
|
|
|
265
282
|
function parsePap(data) {
|
|
266
283
|
const company = isData(data.company) ? data.company : {};
|
|
267
284
|
return {
|
|
285
|
+
profile: data.profile,
|
|
268
286
|
connections: records(data.connections).map(connection => ({
|
|
269
287
|
id: text(connection.id),
|
|
270
288
|
company: text(connection.company),
|
|
@@ -286,17 +304,53 @@ function parsePap(data) {
|
|
|
286
304
|
operations: records(company.operations).map(operation => ({
|
|
287
305
|
action: text(operation.action),
|
|
288
306
|
tool: text(operation.tool),
|
|
307
|
+
...(isData(operation.allows)
|
|
308
|
+
? { allows: parsePapStanding(operation.allows) }
|
|
309
|
+
: {}),
|
|
289
310
|
summary: text(operation.summary),
|
|
290
311
|
userApprovalRequired: flag(operation.user_approval_required, true),
|
|
291
312
|
})),
|
|
292
313
|
},
|
|
293
314
|
};
|
|
294
315
|
}
|
|
316
|
+
/** A standing permission an operation gives (PAP_DATALAYER R-07), as agentspecs reads it. */
|
|
317
|
+
function parsePapStanding(data) {
|
|
318
|
+
return {
|
|
319
|
+
connection: text(data.connection),
|
|
320
|
+
action: oneOf(data.action, ['write', 'buy'], 'buy'),
|
|
321
|
+
limits: records(data.limits).map(limit => ({
|
|
322
|
+
path: text(limit.path),
|
|
323
|
+
...(typeof limit.maximum === 'string'
|
|
324
|
+
? { maximum: text(limit.maximum) }
|
|
325
|
+
: {}),
|
|
326
|
+
...(typeof limit.allowed === 'string'
|
|
327
|
+
? { allowed: text(limit.allowed) }
|
|
328
|
+
: {}),
|
|
329
|
+
})),
|
|
330
|
+
uses: text(data.uses),
|
|
331
|
+
days: text(data.days),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/** A standing permission as its document says it: every field, none has a default. */
|
|
335
|
+
function dumpPapStanding(standing) {
|
|
336
|
+
return {
|
|
337
|
+
connection: standing.connection,
|
|
338
|
+
action: standing.action,
|
|
339
|
+
limits: standing.limits.map(limit => ({
|
|
340
|
+
path: limit.path,
|
|
341
|
+
...(limit.maximum !== undefined ? { maximum: limit.maximum } : {}),
|
|
342
|
+
...(limit.allowed !== undefined ? { allowed: limit.allowed } : {}),
|
|
343
|
+
})),
|
|
344
|
+
uses: standing.uses,
|
|
345
|
+
days: standing.days,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
295
348
|
/** Personal Agent Protocol as its document says it, nothing at its default. */
|
|
296
349
|
function dumpPap(pap) {
|
|
297
350
|
if (!pap)
|
|
298
351
|
return {};
|
|
299
352
|
return new Writer()
|
|
353
|
+
.text('profile', pap.profile, '\u0000')
|
|
300
354
|
.list('connections', pap.connections.map(connection => new Writer()
|
|
301
355
|
.text('id', connection.id, '\u0000')
|
|
302
356
|
.text('company', connection.company, '\u0000')
|
|
@@ -318,12 +372,23 @@ function dumpPap(pap) {
|
|
|
318
372
|
.list('registered_agents', pap.company.registeredAgents)
|
|
319
373
|
.list('operations', pap.company.operations.map(operation => new Writer()
|
|
320
374
|
.text('action', operation.action, '\u0000')
|
|
321
|
-
|
|
375
|
+
// An operation that allows a standing permission calls no tool (R-07).
|
|
376
|
+
.text('tool', operation.tool, operation.allows ? '' : '\u0000')
|
|
377
|
+
.present('allows', operation.allows
|
|
378
|
+
? dumpPapStanding(operation.allows)
|
|
379
|
+
: undefined)
|
|
322
380
|
.text('summary', operation.summary, '\u0000')
|
|
323
381
|
.value('user_approval_required', operation.userApprovalRequired, true).data)).data).data;
|
|
324
382
|
}
|
|
325
|
-
/** PACT (AGENT_PROTOCOLS PI-01): the businesses it asks for each person. */
|
|
383
|
+
/** PACT (AGENT_PROTOCOLS PI-01): the businesses it asks for each person, and as one (PR-13). */
|
|
326
384
|
function parsePact(data) {
|
|
385
|
+
const business = isData(data.business) ? data.business : {};
|
|
386
|
+
const scopes = {};
|
|
387
|
+
if (isData(business.scopes)) {
|
|
388
|
+
for (const [scope, said] of Object.entries(business.scopes)) {
|
|
389
|
+
scopes[scope] = text(said);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
327
392
|
return {
|
|
328
393
|
connections: records(data.connections).map(connection => ({
|
|
329
394
|
id: text(connection.id),
|
|
@@ -332,6 +397,15 @@ function parsePact(data) {
|
|
|
332
397
|
access: oneOf(connection.access, ['read', 'write'], 'read'),
|
|
333
398
|
scopes: texts(connection.scopes),
|
|
334
399
|
})),
|
|
400
|
+
business: {
|
|
401
|
+
enabled: flag(business.enabled, false),
|
|
402
|
+
brand: text(business.brand),
|
|
403
|
+
scopes,
|
|
404
|
+
registeredAgents: records(business.registered_agents).map(agent => ({
|
|
405
|
+
issuer: text(agent.issuer),
|
|
406
|
+
jwksUri: text(agent.jwks_uri),
|
|
407
|
+
})),
|
|
408
|
+
},
|
|
335
409
|
};
|
|
336
410
|
}
|
|
337
411
|
/** Commerce (AGENT_PROTOCOLS PI-01): the merchants it shops at for each person. */
|
|
@@ -373,12 +447,26 @@ function dumpCommerce(commerce) {
|
|
|
373
447
|
function dumpPact(pact) {
|
|
374
448
|
if (!pact)
|
|
375
449
|
return {};
|
|
376
|
-
|
|
450
|
+
const business = pact.business ?? {
|
|
451
|
+
enabled: false,
|
|
452
|
+
brand: '',
|
|
453
|
+
scopes: {},
|
|
454
|
+
registeredAgents: [],
|
|
455
|
+
};
|
|
456
|
+
return new Writer()
|
|
457
|
+
.list('connections', pact.connections.map(connection => new Writer()
|
|
377
458
|
.text('id', connection.id, '\u0000')
|
|
378
459
|
.text('brand', connection.brand, '\u0000')
|
|
379
460
|
.text('audience', connection.audience, '\u0000')
|
|
380
461
|
.value('access', connection.access, 'read')
|
|
381
|
-
.list('scopes', connection.scopes).data))
|
|
462
|
+
.list('scopes', connection.scopes).data))
|
|
463
|
+
.part('business', new Writer()
|
|
464
|
+
.value('enabled', business.enabled, false)
|
|
465
|
+
.text('brand', business.brand)
|
|
466
|
+
.part('scopes', { ...business.scopes })
|
|
467
|
+
.list('registered_agents', business.registeredAgents.map(agent => new Writer()
|
|
468
|
+
.text('issuer', agent.issuer, '\u0000')
|
|
469
|
+
.text('jwks_uri', agent.jwksUri, '\u0000').data)).data).data;
|
|
382
470
|
}
|
|
383
471
|
/** A2A (AGENT_PROTOCOLS PR-02): the extensions its Agent Card advertises. */
|
|
384
472
|
function parseA2A(data) {
|
|
@@ -942,8 +1030,16 @@ export function parseAppspec(document) {
|
|
|
942
1030
|
if (isData(data.decision)) {
|
|
943
1031
|
app.decision = parseDecision(data.decision);
|
|
944
1032
|
}
|
|
945
|
-
|
|
946
|
-
|
|
1033
|
+
// A `pap` block names a profile Datalayer speaks, or it is refused and not
|
|
1034
|
+
// read (PAP_DATALAYER S-03); a block saying nothing is no block.
|
|
1035
|
+
if (isData(data.pap) && Object.keys(data.pap).length > 0) {
|
|
1036
|
+
const problem = papProfileProblem(data.pap.profile);
|
|
1037
|
+
if (problem) {
|
|
1038
|
+
problems.push(problem);
|
|
1039
|
+
}
|
|
1040
|
+
else {
|
|
1041
|
+
app.pap = parsePap(data.pap);
|
|
1042
|
+
}
|
|
947
1043
|
}
|
|
948
1044
|
if (isData(data.pact)) {
|
|
949
1045
|
app.pact = parsePact(data.pact);
|
|
@@ -1006,7 +1102,8 @@ export function protocolsProblems(app) {
|
|
|
1006
1102
|
}
|
|
1007
1103
|
const configured = {
|
|
1008
1104
|
pap: Boolean(app.pap && (app.pap.connections.length > 0 || app.pap.company.enabled)),
|
|
1009
|
-
pact: Boolean(app.pact &&
|
|
1105
|
+
pact: Boolean(app.pact &&
|
|
1106
|
+
(app.pact.connections.length > 0 || app.pact.business?.enabled)),
|
|
1010
1107
|
a2a: Boolean(app.a2a && app.a2a.extensions.length > 0),
|
|
1011
1108
|
};
|
|
1012
1109
|
for (const spec of Object.values(PROTOCOL_CATALOGUE)) {
|
package/lib/apps/core/index.d.ts
CHANGED
|
@@ -710,7 +710,33 @@ export type LoopChatExtrasValue = {
|
|
|
710
710
|
* every snapshot the chat receives, `undefined` included.
|
|
711
711
|
*/
|
|
712
712
|
onUsage?: (snapshot: ContextSnapshotData | undefined) => void;
|
|
713
|
+
/**
|
|
714
|
+
* What the person types goes somewhere else than the agent, live.
|
|
715
|
+
*
|
|
716
|
+
* While set, the composer's placeholder is `says` and sending hands the
|
|
717
|
+
* words to `send`, never to the model or the runtime: a person talking with
|
|
718
|
+
* a company themselves in a Direct Conversation (PAP_DATALAYER P-08), their
|
|
719
|
+
* own words sent as theirs. A refusal `send` throws is said under the
|
|
720
|
+
* composer and the words stay where they were typed. Unset, the composer
|
|
721
|
+
* talks to the agent again.
|
|
722
|
+
*/
|
|
723
|
+
sendInstead?: {
|
|
724
|
+
/** Where the words go, in the person's words, in place of the placeholder. */
|
|
725
|
+
says: string;
|
|
726
|
+
send: (text: string) => Promise<void>;
|
|
727
|
+
};
|
|
713
728
|
};
|
|
729
|
+
/**
|
|
730
|
+
* The words sent where the extras say instead of to the agent
|
|
731
|
+
* (`sendInstead`): `null` when they go to the agent as usual; else whether
|
|
732
|
+
* they were taken, and the refusal in a sentence when they were not.
|
|
733
|
+
*/
|
|
734
|
+
export declare function sendInstead(extras: Pick<LoopChatExtrasValue, 'sendInstead'>, message: string): Promise<{
|
|
735
|
+
sent: true;
|
|
736
|
+
} | {
|
|
737
|
+
sent: false;
|
|
738
|
+
refused: string;
|
|
739
|
+
} | null>;
|
|
714
740
|
export type ChatExtrasContribution = {
|
|
715
741
|
/** Stable id, for the registry and the graph. */
|
|
716
742
|
id: string;
|
package/lib/apps/core/index.js
CHANGED
|
@@ -181,6 +181,26 @@ export { LoopA2uiComponent, } from './a2uiComponents';
|
|
|
181
181
|
// Where the files of an application's folder are served (LOOP P-29): said
|
|
182
182
|
// by the page side its package carries.
|
|
183
183
|
export { LoopAppFiles } from './appFiles';
|
|
184
|
+
/**
|
|
185
|
+
* The words sent where the extras say instead of to the agent
|
|
186
|
+
* (`sendInstead`): `null` when they go to the agent as usual; else whether
|
|
187
|
+
* they were taken, and the refusal in a sentence when they were not.
|
|
188
|
+
*/
|
|
189
|
+
export async function sendInstead(extras, message) {
|
|
190
|
+
if (!extras.sendInstead) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
await extras.sendInstead.send(message);
|
|
195
|
+
return { sent: true };
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return {
|
|
199
|
+
sent: false,
|
|
200
|
+
refused: error instanceof Error ? error.message : String(error),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
184
204
|
export const LoopChatExtras = defineContributionPoint('loop.chat.extras');
|
|
185
205
|
export const LoopOpeningNotebook = defineContributionPoint('loop.notebook.opening');
|
|
186
206
|
export const LoopOpeningDocument = defineContributionPoint('loop.document.opening');
|
|
@@ -42,7 +42,7 @@ import { BROWSER_CODE_TOOL, dataUrlBase64, givenFilesSentence, sandboxFileName,
|
|
|
42
42
|
import { useConfig } from '../../../hooks/useConfig';
|
|
43
43
|
import { useSkills, useSkillActions } from '../../../hooks/useSkills';
|
|
44
44
|
import { AI_MODEL_CATALOGUE, isChatModel } from '../../../specs/models';
|
|
45
|
-
import { LoopAgentBlueprint, LoopAgentGate, LoopChatComposer, LoopChatExtras, LoopChatHeader, LoopChatLayout, LoopChatSuggestion, LoopChatSurface, LoopChatTurn, LoopCommand, LoopFrontendTool, LoopRunProps, LoopSlots, agentServerOf, noRuntimeSaid, canOpenView, runForwardedProps, onPromptFocusRequest, onSurfaceRequest, useLoopPromptStore, } from '../../core';
|
|
45
|
+
import { LoopAgentBlueprint, LoopAgentGate, LoopChatComposer, sendInstead, LoopChatExtras, LoopChatHeader, LoopChatLayout, LoopChatSuggestion, LoopChatSurface, LoopChatTurn, LoopCommand, LoopFrontendTool, LoopRunProps, LoopSlots, agentServerOf, noRuntimeSaid, canOpenView, runForwardedProps, onPromptFocusRequest, onSurfaceRequest, useLoopPromptStore, } from '../../core';
|
|
46
46
|
import { messageText, turnWritersOf } from './turnState';
|
|
47
47
|
import { isInactiveSurfaceContribution, orderToolContributions, toolsForChatView, } from './chatViewTools';
|
|
48
48
|
import { agentBundleToolDefinitions, useAgentCommandTools, } from '../../../tools/adapters/commands';
|
|
@@ -486,11 +486,27 @@ export default function ChatView({ workspace }) {
|
|
|
486
486
|
* place "the first prompt" means the same thing regardless of which one
|
|
487
487
|
* a person or a host used.
|
|
488
488
|
*/
|
|
489
|
+
setTransient(null);
|
|
490
|
+
/*
|
|
491
|
+
* Words that go elsewhere than the agent (`sendInstead`, PAP_DATALAYER
|
|
492
|
+
* P-08): a Direct Conversation with a company, the person's own words
|
|
493
|
+
* sent as theirs. Neither a command nor a turn, and never the model's;
|
|
494
|
+
* refused, the words stay where they were typed and the reason is said.
|
|
495
|
+
*/
|
|
496
|
+
const elsewhere = await sendInstead(chatExtrasRef.current, message);
|
|
497
|
+
if (elsewhere) {
|
|
498
|
+
if (elsewhere.sent) {
|
|
499
|
+
setDraft('');
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
setTransient(elsewhere.refused);
|
|
503
|
+
}
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
489
506
|
if (!firstPromptFired.current) {
|
|
490
507
|
firstPromptFired.current = true;
|
|
491
508
|
inputPromptConfig?.firstPromptHook?.();
|
|
492
509
|
}
|
|
493
|
-
setTransient(null);
|
|
494
510
|
// The turn begins where the message goes out (`sendNow`): a command
|
|
495
511
|
// the workspace runs is not one.
|
|
496
512
|
const outcome = await workspace.submit(message);
|
|
@@ -1594,8 +1610,9 @@ export default function ChatView({ workspace }) {
|
|
|
1594
1610
|
// send button into a stop — the person keeps a way out.
|
|
1595
1611
|
isLoading: busy,
|
|
1596
1612
|
onStop: () => workspace.viewControls.stop?.(),
|
|
1597
|
-
// The reason where the typing would go, read before the person types
|
|
1598
|
-
|
|
1613
|
+
// The reason where the typing would go, read before the person types;
|
|
1614
|
+
// where it goes when it goes elsewhere than the agent (P-08).
|
|
1615
|
+
placeholder: disabledReason ?? chatExtras.sendInstead?.says ?? placeholder,
|
|
1599
1616
|
typingSuggestions: suggestions.map(item => item.text),
|
|
1600
1617
|
// The same openers behind the composer's suggestions control.
|
|
1601
1618
|
suggestions: chatSuggestions,
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
2
|
+
import type { CallToolResult, GetPromptResult, ReadResourceResult, Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
/** A listed tool as a client reads it. */
|
|
4
|
+
export interface McpToolReading {
|
|
5
|
+
name: string;
|
|
6
|
+
title: string | null;
|
|
7
|
+
description: string | null;
|
|
8
|
+
/** Its parameters' names, sorted. */
|
|
9
|
+
parameters: string[];
|
|
10
|
+
/** Those it requires, sorted. */
|
|
11
|
+
required: string[];
|
|
12
|
+
/** Whether it says an output schema (answers structured content). */
|
|
13
|
+
structured: boolean;
|
|
14
|
+
readOnly: boolean;
|
|
15
|
+
destructive: boolean;
|
|
16
|
+
idempotent: boolean;
|
|
17
|
+
openWorld: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** A tool's answer as a client reads it. */
|
|
20
|
+
export interface McpCallReading {
|
|
21
|
+
isError: boolean;
|
|
22
|
+
/** Its text parts, joined by a newline. */
|
|
23
|
+
text: string;
|
|
24
|
+
structured: Record<string, unknown> | null;
|
|
25
|
+
}
|
|
26
|
+
/** A text resource's contents as a client reads them. */
|
|
27
|
+
export interface McpResourceReading {
|
|
28
|
+
uri: string;
|
|
29
|
+
mimeType: string | null;
|
|
30
|
+
text: string;
|
|
31
|
+
}
|
|
32
|
+
/** A prompt's message as a client reads it. */
|
|
33
|
+
export interface McpPromptReading {
|
|
34
|
+
role: 'user' | 'assistant';
|
|
35
|
+
text: string;
|
|
36
|
+
}
|
|
37
|
+
/** A listed tool: its parameters, whether it answers structured, its hints. */
|
|
38
|
+
export declare function toolReading(tool: Tool): McpToolReading;
|
|
39
|
+
/** A tool's answer: refused or not, its text parts joined, its structured content. */
|
|
40
|
+
export declare function callReading(result: CallToolResult): McpCallReading;
|
|
41
|
+
/** A resource's text contents; a binary one is refused, never decoded here. */
|
|
42
|
+
export declare function resourceReading(result: ReadResourceResult): McpResourceReading[];
|
|
43
|
+
/** A prompt's messages as text; a message of another kind is refused. */
|
|
44
|
+
export declare function promptReading(result: GetPromptResult): McpPromptReading[];
|
|
45
|
+
/** Where an `McpClient` connects: a Streamable HTTP endpoint, or any transport. */
|
|
46
|
+
export type McpServerAddress = {
|
|
47
|
+
url: string;
|
|
48
|
+
/** Headers sent with every request (a bearer, for one). */
|
|
49
|
+
headers?: Record<string, string>;
|
|
50
|
+
} | {
|
|
51
|
+
transport: Transport;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* An MCP client: connects, lists and calls tools, reads resources, gets
|
|
55
|
+
* prompts, and answers each as the readings above. The SDK's `Client` does
|
|
56
|
+
* the protocol (the initialize handshake, the version negotiated, a
|
|
57
|
+
* structured answer checked against the tool's output schema).
|
|
58
|
+
*/
|
|
59
|
+
export declare class McpClient {
|
|
60
|
+
private readonly client;
|
|
61
|
+
private readonly agreed;
|
|
62
|
+
private constructor();
|
|
63
|
+
/** Connected to `server`, said to it as `name` at `version`. */
|
|
64
|
+
static connect(server: McpServerAddress, name?: string, version?: string): Promise<McpClient>;
|
|
65
|
+
/** The protocol version agreed with the server. */
|
|
66
|
+
get protocolVersion(): string;
|
|
67
|
+
/** Every tool the server lists, through its pages. */
|
|
68
|
+
listTools(): Promise<McpToolReading[]>;
|
|
69
|
+
callTool(name: string, args: Record<string, unknown>): Promise<McpCallReading>;
|
|
70
|
+
readResource(uri: string): Promise<McpResourceReading[]>;
|
|
71
|
+
getPrompt(name: string, args: Record<string, string>): Promise<McpPromptReading[]>;
|
|
72
|
+
close(): Promise<void>;
|
|
73
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* An MCP client in TypeScript, on the official `@modelcontextprotocol/sdk`
|
|
7
|
+
* (AGENT_PROTOCOLS PR-51, decided 2026-10-13), and what it reads from a
|
|
8
|
+
* server's answers — the twin of `agent_runtimes.protocols.mcp.reading`.
|
|
9
|
+
*
|
|
10
|
+
* The readings are the plain shape both languages agree on, held to
|
|
11
|
+
* `agent_runtimes/protocols/mcp/fixtures/session.json` by the pytest and the
|
|
12
|
+
* vitest. A tool's missing annotations are read with the specification's
|
|
13
|
+
* defaults (`readOnlyHint` false, `destructiveHint` true, `idempotentHint`
|
|
14
|
+
* false, `openWorldHint` true), so a server that says nothing is never read
|
|
15
|
+
* as harmless; `destructiveHint` means something only when the tool is not
|
|
16
|
+
* read-only, so a read-only tool is never destructive.
|
|
17
|
+
*
|
|
18
|
+
* @module protocols/mcp/client
|
|
19
|
+
*/
|
|
20
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
21
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
22
|
+
const sorted = (values) => [...values].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
23
|
+
/** A listed tool: its parameters, whether it answers structured, its hints. */
|
|
24
|
+
export function toolReading(tool) {
|
|
25
|
+
const hints = tool.annotations;
|
|
26
|
+
const readOnly = hints?.readOnlyHint === true;
|
|
27
|
+
return {
|
|
28
|
+
name: tool.name,
|
|
29
|
+
title: tool.title ?? null,
|
|
30
|
+
description: tool.description ?? null,
|
|
31
|
+
parameters: sorted(Object.keys(tool.inputSchema.properties ?? {})),
|
|
32
|
+
required: sorted(tool.inputSchema.required ?? []),
|
|
33
|
+
structured: tool.outputSchema !== undefined,
|
|
34
|
+
readOnly,
|
|
35
|
+
destructive: !readOnly && hints?.destructiveHint !== false,
|
|
36
|
+
idempotent: hints?.idempotentHint === true,
|
|
37
|
+
openWorld: hints?.openWorldHint !== false,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** A tool's answer: refused or not, its text parts joined, its structured content. */
|
|
41
|
+
export function callReading(result) {
|
|
42
|
+
return {
|
|
43
|
+
isError: result.isError === true,
|
|
44
|
+
text: result.content
|
|
45
|
+
.flatMap(part => (part.type === 'text' ? [part.text] : []))
|
|
46
|
+
.join('\n'),
|
|
47
|
+
structured: result.structuredContent ?? null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** A resource's text contents; a binary one is refused, never decoded here. */
|
|
51
|
+
export function resourceReading(result) {
|
|
52
|
+
return result.contents.map(part => {
|
|
53
|
+
if (!('text' in part) || typeof part.text !== 'string') {
|
|
54
|
+
throw new Error(`${part.uri} is not text.`);
|
|
55
|
+
}
|
|
56
|
+
return { uri: part.uri, mimeType: part.mimeType ?? null, text: part.text };
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** A prompt's messages as text; a message of another kind is refused. */
|
|
60
|
+
export function promptReading(result) {
|
|
61
|
+
return result.messages.map(message => {
|
|
62
|
+
if (message.content.type !== 'text') {
|
|
63
|
+
throw new Error(`A ${message.role} message is not text.`);
|
|
64
|
+
}
|
|
65
|
+
return { role: message.role, text: message.content.text };
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* An MCP client: connects, lists and calls tools, reads resources, gets
|
|
70
|
+
* prompts, and answers each as the readings above. The SDK's `Client` does
|
|
71
|
+
* the protocol (the initialize handshake, the version negotiated, a
|
|
72
|
+
* structured answer checked against the tool's output schema).
|
|
73
|
+
*/
|
|
74
|
+
export class McpClient {
|
|
75
|
+
client;
|
|
76
|
+
agreed;
|
|
77
|
+
constructor(client, agreed) {
|
|
78
|
+
this.client = client;
|
|
79
|
+
this.agreed = agreed;
|
|
80
|
+
}
|
|
81
|
+
/** Connected to `server`, said to it as `name` at `version`. */
|
|
82
|
+
static async connect(server, name = 'agent-runtimes', version = '1.0.0') {
|
|
83
|
+
const transport = 'transport' in server
|
|
84
|
+
? server.transport
|
|
85
|
+
: new StreamableHTTPClientTransport(new URL(server.url), {
|
|
86
|
+
requestInit: server.headers
|
|
87
|
+
? { headers: server.headers }
|
|
88
|
+
: undefined,
|
|
89
|
+
});
|
|
90
|
+
// The SDK hands the version agreed at initialize to the transport alone.
|
|
91
|
+
let agreed;
|
|
92
|
+
const setProtocolVersion = transport.setProtocolVersion?.bind(transport);
|
|
93
|
+
transport.setProtocolVersion = (protocolVersion) => {
|
|
94
|
+
agreed = protocolVersion;
|
|
95
|
+
setProtocolVersion?.(protocolVersion);
|
|
96
|
+
};
|
|
97
|
+
const client = new Client({ name, version });
|
|
98
|
+
await client.connect(transport);
|
|
99
|
+
return new McpClient(client, () => agreed);
|
|
100
|
+
}
|
|
101
|
+
/** The protocol version agreed with the server. */
|
|
102
|
+
get protocolVersion() {
|
|
103
|
+
const version = this.agreed();
|
|
104
|
+
if (!version) {
|
|
105
|
+
throw new Error('The MCP client is not connected.');
|
|
106
|
+
}
|
|
107
|
+
return version;
|
|
108
|
+
}
|
|
109
|
+
/** Every tool the server lists, through its pages. */
|
|
110
|
+
async listTools() {
|
|
111
|
+
const tools = [];
|
|
112
|
+
let cursor;
|
|
113
|
+
do {
|
|
114
|
+
const page = await this.client.listTools(cursor ? { cursor } : {});
|
|
115
|
+
tools.push(...page.tools.map(toolReading));
|
|
116
|
+
cursor = page.nextCursor;
|
|
117
|
+
} while (cursor);
|
|
118
|
+
return tools;
|
|
119
|
+
}
|
|
120
|
+
async callTool(name, args) {
|
|
121
|
+
const result = await this.client.callTool({ name, arguments: args });
|
|
122
|
+
if (!Array.isArray(result.content)) {
|
|
123
|
+
throw new Error(`${name} answered in the form before MCP 2024-11-05.`);
|
|
124
|
+
}
|
|
125
|
+
return callReading(result);
|
|
126
|
+
}
|
|
127
|
+
async readResource(uri) {
|
|
128
|
+
return resourceReading(await this.client.readResource({ uri }));
|
|
129
|
+
}
|
|
130
|
+
async getPrompt(name, args) {
|
|
131
|
+
return promptReading(await this.client.getPrompt({ name, arguments: args }));
|
|
132
|
+
}
|
|
133
|
+
async close() {
|
|
134
|
+
await this.client.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -2,3 +2,4 @@ export declare const MCP_PLUGIN = "agent-runtimes.protocols.mcp";
|
|
|
2
2
|
/** The MCP specification version of the `@modelcontextprotocol/sdk` installed (1.32: `LATEST_PROTOCOL_VERSION`); Python's `mcp` 2.1 speaks 2026-07-28. */
|
|
3
3
|
export declare const MCP_SPECIFICATION_VERSION = "2025-11-25";
|
|
4
4
|
export declare const McpPlugin: import("@datalayer/reactor").ReactorPlugin<Record<string, never>, unknown, unknown>;
|
|
5
|
+
export * from './client';
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* declares no point yet: MCP's optional capabilities and extensions become
|
|
8
8
|
* `mcp.extension.<name>` points when the MCP client and server read them
|
|
9
9
|
* from contributions (AGENT_PROTOCOLS PR-01). The twin of
|
|
10
|
-
* `agent_runtimes.protocols.mcp`.
|
|
10
|
+
* `agent_runtimes.protocols.mcp`. Its client, on the official
|
|
11
|
+
* `@modelcontextprotocol/sdk`, is `./client` (PR-51).
|
|
11
12
|
*
|
|
12
13
|
* @module protocols/mcp
|
|
13
14
|
*/
|
|
@@ -36,3 +37,4 @@ export const McpPlugin = definePlugin({
|
|
|
36
37
|
}, { id: 'mcp', order: DEFAULT_ORDER }),
|
|
37
38
|
],
|
|
38
39
|
});
|
|
40
|
+
export * from './client';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type HttpSigner, type NonceStore } from './index';
|
|
2
|
+
/** Draft until Visa confirms it. */
|
|
3
|
+
export declare const TAP_STATUS = "draft";
|
|
4
|
+
/** Where the profile was read, 2026-10-13. */
|
|
5
|
+
export declare const TAP_SOURCES: readonly ["https://developer.visa.com/capabilities/trusted-agent-protocol/trusted-agent-protocol-specifications", "https://developer.visa.com/capabilities/trusted-agent-protocol/overview", "https://github.com/visa/trusted-agent-protocol"];
|
|
6
|
+
/** Visa's key directory, as its page says it. */
|
|
7
|
+
export declare const VISA_JWKS = "https://mcp.visa.com/.well-known/jwks";
|
|
8
|
+
export declare const TAP_BROWSE_TAG = "agent-browser-auth";
|
|
9
|
+
export declare const TAP_PAY_TAG = "agent-payer-auth";
|
|
10
|
+
export type TapIntent = 'browse' | 'pay';
|
|
11
|
+
export declare const TAP_TAGS: Record<TapIntent, string>;
|
|
12
|
+
export declare const TAP_REQUIRED_COMPONENTS: readonly ["@authority", "@path"];
|
|
13
|
+
export declare const TAP_REQUIRED_PARAMS: readonly ["created", "keyid", "alg", "expires", "nonce", "tag"];
|
|
14
|
+
/** `alg` as Visa writes it. */
|
|
15
|
+
export declare const TAP_ALG = "Ed25519";
|
|
16
|
+
/** The longest window, and how long a nonce is remembered. */
|
|
17
|
+
export declare const TAP_MAX_WINDOW_SECONDS: number;
|
|
18
|
+
export interface TapSignOptions {
|
|
19
|
+
intent: TapIntent;
|
|
20
|
+
label?: string;
|
|
21
|
+
/** Covered: at least `@authority` and `@path` (the default). */
|
|
22
|
+
components?: string[];
|
|
23
|
+
/** Unix seconds; now by default. */
|
|
24
|
+
created?: number;
|
|
25
|
+
/** Seconds, at most 8 minutes (the default). */
|
|
26
|
+
lifetime?: number;
|
|
27
|
+
nonce?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface TapSignedHeaders {
|
|
30
|
+
'Signature-Input': string;
|
|
31
|
+
Signature: string;
|
|
32
|
+
}
|
|
33
|
+
/** What verifying a TAP signature found; `reason` when it does not hold. */
|
|
34
|
+
export interface TapVerification {
|
|
35
|
+
verified: boolean;
|
|
36
|
+
reason?: string;
|
|
37
|
+
intent?: TapIntent;
|
|
38
|
+
keyid?: string;
|
|
39
|
+
nonce?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Sign one request as a TAP agent browsing or paying, under an Ed25519 key. */
|
|
42
|
+
export declare function signTapRequest(request: {
|
|
43
|
+
method: string;
|
|
44
|
+
url: string;
|
|
45
|
+
}, signer: HttpSigner, options: TapSignOptions): Promise<TapSignedHeaders>;
|
|
46
|
+
/**
|
|
47
|
+
* Verify the TAP signature of one request against Ed25519 keys known by
|
|
48
|
+
* `keyid` (Visa's directory, or a registry's). A request with no TAP tag is
|
|
49
|
+
* no trusted agent's; the merchant decides what to do with it.
|
|
50
|
+
*/
|
|
51
|
+
export declare function verifyTapRequest(request: Request, keys: Map<string, JsonWebKey>, options: {
|
|
52
|
+
nonceStore: NonceStore;
|
|
53
|
+
now?: number;
|
|
54
|
+
}): Promise<TapVerification>;
|
|
55
|
+
/** The `keyid` of an Ed25519 public JWK, as a TAP key list is indexed when it says none. */
|
|
56
|
+
export declare function tapKeys(jwks: JsonWebKey[]): Promise<Map<string, JsonWebKey>>;
|