@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
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Visa's Trusted Agent Protocol as a profile over Web Bot Auth
|
|
7
|
+
* (AGENT_PROTOCOLS PR-24) — the twin of
|
|
8
|
+
* `agent_runtimes.protocols.web_bot_auth.tap`.
|
|
9
|
+
*
|
|
10
|
+
* **Draft.** Built on 2026-10-13 from Visa's public *Merchant
|
|
11
|
+
* Specifications* and its reference repository (`TAP_SOURCES`), not
|
|
12
|
+
* confirmed by Visa: the product says it *arriving* until it is. Visa
|
|
13
|
+
* publishes no test vector; `fixtures/tap.json` is one computed in Python
|
|
14
|
+
* and reproduced here byte for byte.
|
|
15
|
+
*
|
|
16
|
+
* The agent-recognition signature: `Signature-Input` and `Signature` alone
|
|
17
|
+
* (Visa names no `Signature-Agent`, so keys are handed in by `keyid`),
|
|
18
|
+
* covering at least `@authority` and `@path`, with `created`, `keyid`,
|
|
19
|
+
* `alg="Ed25519"`, `expires`, `nonce` and `tag` — `agent-browser-auth` to
|
|
20
|
+
* browse, `agent-payer-auth` to pay —, `created` and `expires` at most 8
|
|
21
|
+
* minutes apart, a nonce seen in the last 8 minutes a replay. Signed and
|
|
22
|
+
* verified with Cloudflare's `http-message-sig`, the RFC 9421 library under
|
|
23
|
+
* `web-bot-auth`.
|
|
24
|
+
*
|
|
25
|
+
* @module protocols/web-bot-auth/tap
|
|
26
|
+
*/
|
|
27
|
+
import { createSignature, verifySignature, webcrypto } from 'http-message-sig';
|
|
28
|
+
import { generateNonce, jwkThumbprint, } from './index';
|
|
29
|
+
/** Draft until Visa confirms it. */
|
|
30
|
+
export const TAP_STATUS = 'draft';
|
|
31
|
+
/** Where the profile was read, 2026-10-13. */
|
|
32
|
+
export const TAP_SOURCES = [
|
|
33
|
+
'https://developer.visa.com/capabilities/trusted-agent-protocol/trusted-agent-protocol-specifications',
|
|
34
|
+
'https://developer.visa.com/capabilities/trusted-agent-protocol/overview',
|
|
35
|
+
'https://github.com/visa/trusted-agent-protocol',
|
|
36
|
+
];
|
|
37
|
+
/** Visa's key directory, as its page says it. */
|
|
38
|
+
export const VISA_JWKS = 'https://mcp.visa.com/.well-known/jwks';
|
|
39
|
+
export const TAP_BROWSE_TAG = 'agent-browser-auth';
|
|
40
|
+
export const TAP_PAY_TAG = 'agent-payer-auth';
|
|
41
|
+
export const TAP_TAGS = {
|
|
42
|
+
browse: TAP_BROWSE_TAG,
|
|
43
|
+
pay: TAP_PAY_TAG,
|
|
44
|
+
};
|
|
45
|
+
export const TAP_REQUIRED_COMPONENTS = ['@authority', '@path'];
|
|
46
|
+
export const TAP_REQUIRED_PARAMS = [
|
|
47
|
+
'created',
|
|
48
|
+
'keyid',
|
|
49
|
+
'alg',
|
|
50
|
+
'expires',
|
|
51
|
+
'nonce',
|
|
52
|
+
'tag',
|
|
53
|
+
];
|
|
54
|
+
/** `alg` as Visa writes it. */
|
|
55
|
+
export const TAP_ALG = 'Ed25519';
|
|
56
|
+
/** The longest window, and how long a nonce is remembered. */
|
|
57
|
+
export const TAP_MAX_WINDOW_SECONDS = 8 * 60;
|
|
58
|
+
/** Sign one request as a TAP agent browsing or paying, under an Ed25519 key. */
|
|
59
|
+
export async function signTapRequest(request, signer, options) {
|
|
60
|
+
if (signer.algorithm !== 'ed25519') {
|
|
61
|
+
throw new Error('a TAP signature is Ed25519');
|
|
62
|
+
}
|
|
63
|
+
const components = options.components ?? [...TAP_REQUIRED_COMPONENTS];
|
|
64
|
+
const missing = TAP_REQUIRED_COMPONENTS.filter(name => !components.includes(name));
|
|
65
|
+
if (missing.length) {
|
|
66
|
+
throw new Error(`a TAP signature covers ${missing.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
const lifetime = options.lifetime ?? TAP_MAX_WINDOW_SECONDS;
|
|
69
|
+
if (!(lifetime > 0 && lifetime <= TAP_MAX_WINDOW_SECONDS)) {
|
|
70
|
+
throw new Error(`a TAP signature lives at most ${TAP_MAX_WINDOW_SECONDS}s (8 minutes)`);
|
|
71
|
+
}
|
|
72
|
+
const created = options.created ?? Math.floor(Date.now() / 1000);
|
|
73
|
+
const fields = await createSignature({
|
|
74
|
+
kind: 'request',
|
|
75
|
+
method: request.method,
|
|
76
|
+
targetUri: request.url,
|
|
77
|
+
fields: [],
|
|
78
|
+
}, {
|
|
79
|
+
label: options.label ?? 'sig2',
|
|
80
|
+
components,
|
|
81
|
+
parameters: {
|
|
82
|
+
created,
|
|
83
|
+
keyid: signer.keyid,
|
|
84
|
+
alg: TAP_ALG,
|
|
85
|
+
expires: created + lifetime,
|
|
86
|
+
nonce: options.nonce ?? generateNonce(),
|
|
87
|
+
tag: TAP_TAGS[options.intent],
|
|
88
|
+
},
|
|
89
|
+
signer: { algorithm: TAP_ALG, sign: data => signer.sign(data) },
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
'Signature-Input': fields.signatureInput,
|
|
93
|
+
Signature: fields.signature,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const TAP_LABEL = /(?:^|,)\s*([a-z*][a-z0-9_.*-]*)=\([^)]*\)[^,]*;tag="(?:agent-browser-auth|agent-payer-auth)"/g;
|
|
97
|
+
/**
|
|
98
|
+
* Verify the TAP signature of one request against Ed25519 keys known by
|
|
99
|
+
* `keyid` (Visa's directory, or a registry's). A request with no TAP tag is
|
|
100
|
+
* no trusted agent's; the merchant decides what to do with it.
|
|
101
|
+
*/
|
|
102
|
+
export async function verifyTapRequest(request, keys, options) {
|
|
103
|
+
const input = request.headers.get('signature-input');
|
|
104
|
+
if (!input || !request.headers.get('signature')) {
|
|
105
|
+
return { verified: false, reason: 'the request is not signed' };
|
|
106
|
+
}
|
|
107
|
+
const labels = [...input.matchAll(TAP_LABEL)].map(match => match[1]);
|
|
108
|
+
if (labels.length === 0) {
|
|
109
|
+
return { verified: false, reason: 'no signature carries a TAP tag' };
|
|
110
|
+
}
|
|
111
|
+
if (labels.length > 1) {
|
|
112
|
+
return {
|
|
113
|
+
verified: false,
|
|
114
|
+
reason: 'more than one signature carries a TAP tag',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const now = options.now ?? Math.floor(Date.now() / 1000);
|
|
118
|
+
let keyid;
|
|
119
|
+
let unknownKey = false;
|
|
120
|
+
try {
|
|
121
|
+
const verified = await verifySignature(request, {
|
|
122
|
+
label: labels[0],
|
|
123
|
+
policy: {
|
|
124
|
+
algorithms: [TAP_ALG],
|
|
125
|
+
requiredComponents: [...TAP_REQUIRED_COMPONENTS],
|
|
126
|
+
requiredParameters: [...TAP_REQUIRED_PARAMS],
|
|
127
|
+
now,
|
|
128
|
+
validate: signature => {
|
|
129
|
+
const { created, expires, tag } = signature.parameters;
|
|
130
|
+
return ((tag === TAP_BROWSE_TAG || tag === TAP_PAY_TAG) &&
|
|
131
|
+
created !== undefined &&
|
|
132
|
+
expires !== undefined &&
|
|
133
|
+
expires - created <= TAP_MAX_WINDOW_SECONDS &&
|
|
134
|
+
now < expires);
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
resolveVerifier: async (candidate) => {
|
|
138
|
+
keyid = candidate.parameters.keyid;
|
|
139
|
+
const jwk = keyid === undefined ? undefined : keys.get(keyid);
|
|
140
|
+
if (!jwk || jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
|
|
141
|
+
unknownKey = true;
|
|
142
|
+
throw new Error('the key is not a known Ed25519 key');
|
|
143
|
+
}
|
|
144
|
+
const key = await crypto.subtle.importKey('jwk', jwk, { name: 'Ed25519' }, false, ['verify']);
|
|
145
|
+
const verifier = webcrypto.verifier(key);
|
|
146
|
+
return {
|
|
147
|
+
algorithm: TAP_ALG,
|
|
148
|
+
verify: (data, signature) => verifier.verify(data, signature),
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
const { tag, nonce } = verified.parameters;
|
|
153
|
+
if (nonce === undefined || keyid === undefined) {
|
|
154
|
+
return { verified: false, reason: 'the signature has no nonce', keyid };
|
|
155
|
+
}
|
|
156
|
+
const fresh = await options.nonceStore.checkAndRecord(`tap ${keyid}`, nonce, new Date((now + TAP_MAX_WINDOW_SECONDS) * 1000));
|
|
157
|
+
if (!fresh) {
|
|
158
|
+
return { verified: false, reason: 'the nonce was seen before', keyid };
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
verified: true,
|
|
162
|
+
intent: tag === TAP_PAY_TAG ? 'pay' : 'browse',
|
|
163
|
+
keyid,
|
|
164
|
+
nonce,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
return {
|
|
169
|
+
verified: false,
|
|
170
|
+
reason: unknownKey
|
|
171
|
+
? 'the key is not a known Ed25519 key'
|
|
172
|
+
: error.message,
|
|
173
|
+
keyid,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** The `keyid` of an Ed25519 public JWK, as a TAP key list is indexed when it says none. */
|
|
178
|
+
export async function tapKeys(jwks) {
|
|
179
|
+
const keys = new Map();
|
|
180
|
+
for (const jwk of jwks) {
|
|
181
|
+
const kid = jwk.kid;
|
|
182
|
+
keys.set(kid ?? (await jwkThumbprint(jwk)), jwk);
|
|
183
|
+
}
|
|
184
|
+
return keys;
|
|
185
|
+
}
|
package/lib/specs/apps.js
CHANGED
|
@@ -194,6 +194,7 @@ export const BOOKKEEPING_DESK_APP_0_0_1 = {
|
|
|
194
194
|
protocols: ['pap'],
|
|
195
195
|
ui: [],
|
|
196
196
|
pap: {
|
|
197
|
+
profile: 'draft-01',
|
|
197
198
|
connections: [
|
|
198
199
|
{
|
|
199
200
|
id: 'northwind',
|
|
@@ -1570,6 +1571,7 @@ export const EXCHANGE_DESK_APP_0_0_1 = {
|
|
|
1570
1571
|
protocols: ['pap'],
|
|
1571
1572
|
ui: [],
|
|
1572
1573
|
pap: {
|
|
1574
|
+
profile: 'draft-01',
|
|
1573
1575
|
connections: [],
|
|
1574
1576
|
company: {
|
|
1575
1577
|
enabled: true,
|
|
@@ -1902,6 +1904,7 @@ export const LIVE_SHOP_CHAT_APP_0_0_1 = {
|
|
|
1902
1904
|
protocols: ['pap'],
|
|
1903
1905
|
ui: [],
|
|
1904
1906
|
pap: {
|
|
1907
|
+
profile: 'draft-01',
|
|
1905
1908
|
connections: [
|
|
1906
1909
|
{
|
|
1907
1910
|
id: 'manzanita',
|
|
@@ -2474,10 +2477,11 @@ export const ORDER_DESK_APP_0_0_1 = {
|
|
|
2474
2477
|
protocols: ['pap'],
|
|
2475
2478
|
ui: [],
|
|
2476
2479
|
pap: {
|
|
2480
|
+
profile: 'draft-01',
|
|
2477
2481
|
connections: [
|
|
2478
2482
|
{
|
|
2479
2483
|
id: 'manzanita',
|
|
2480
|
-
company: 'manzanita.
|
|
2484
|
+
company: 'manzanita.examples.datalayer.run',
|
|
2481
2485
|
access: 'write',
|
|
2482
2486
|
as: 'user',
|
|
2483
2487
|
scopes: ['orders:read', 'orders:write'],
|
|
@@ -2582,7 +2586,7 @@ export const ORDER_DESK_APP_0_0_1 = {
|
|
|
2582
2586
|
"The journey is the Personal Agent Protocol SDK's recorded journey user-with-a-company (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
|
|
2583
2587
|
],
|
|
2584
2588
|
unverified: [
|
|
2585
|
-
'
|
|
2589
|
+
'It has not run in the Studio against the hosted Manzanita (manzanita.examples.datalayer.run) from this example yet.',
|
|
2586
2590
|
],
|
|
2587
2591
|
},
|
|
2588
2592
|
},
|
|
@@ -2642,6 +2646,7 @@ export const ORDER_TRACKER_APP_0_0_1 = {
|
|
|
2642
2646
|
protocols: ['pap'],
|
|
2643
2647
|
ui: [],
|
|
2644
2648
|
pap: {
|
|
2649
|
+
profile: 'draft-01',
|
|
2645
2650
|
connections: [
|
|
2646
2651
|
{
|
|
2647
2652
|
id: 'manzanita',
|
|
@@ -3650,6 +3655,7 @@ export const RETURNS_DESK_APP_0_0_1 = {
|
|
|
3650
3655
|
protocols: ['pap'],
|
|
3651
3656
|
ui: [],
|
|
3652
3657
|
pap: {
|
|
3658
|
+
profile: 'draft-01',
|
|
3653
3659
|
connections: [
|
|
3654
3660
|
{
|
|
3655
3661
|
id: 'manzanita',
|
|
@@ -4175,6 +4181,7 @@ export const SHOP_CONCIERGE_APP_0_0_1 = {
|
|
|
4175
4181
|
protocols: ['pap'],
|
|
4176
4182
|
ui: [],
|
|
4177
4183
|
pap: {
|
|
4184
|
+
profile: 'draft-01',
|
|
4178
4185
|
connections: [
|
|
4179
4186
|
{
|
|
4180
4187
|
id: 'manzanita',
|
|
@@ -4340,7 +4347,7 @@ export const SHOPPING_DESK_APP_0_0_1 = {
|
|
|
4340
4347
|
{
|
|
4341
4348
|
id: 'example-store',
|
|
4342
4349
|
protocol: 'ucp',
|
|
4343
|
-
merchant: 'store.
|
|
4350
|
+
merchant: 'store.examples.datalayer.run',
|
|
4344
4351
|
access: 'write',
|
|
4345
4352
|
limit: {
|
|
4346
4353
|
amount: '50',
|
|
@@ -4350,7 +4357,7 @@ export const SHOPPING_DESK_APP_0_0_1 = {
|
|
|
4350
4357
|
{
|
|
4351
4358
|
id: 'example-outfitters',
|
|
4352
4359
|
protocol: 'acp',
|
|
4353
|
-
merchant: 'outfitters.
|
|
4360
|
+
merchant: 'outfitters.examples.datalayer.run',
|
|
4354
4361
|
access: 'write',
|
|
4355
4362
|
limit: {
|
|
4356
4363
|
amount: '150',
|
|
@@ -4437,13 +4444,15 @@ export const SHOPPING_DESK_APP_0_0_1 = {
|
|
|
4437
4444
|
},
|
|
4438
4445
|
],
|
|
4439
4446
|
verified: {
|
|
4440
|
-
live: [
|
|
4447
|
+
live: [
|
|
4448
|
+
"Drilled on r1 on 13 October 2026 against the hosted test merchants, as its Preview's runtime reaches the gateway's ucp and acp toolsets: at Example Store (store.examples.datalayer.run) a search, a checkout filled, the exact purchase asked of the person, approved on Waiting for you, bought once and refused a second time, its order read; at Example Outfitters (outfitters.examples.datalayer.run) the same checkout over ACP. Test merchants only: paid with a test instrument.",
|
|
4449
|
+
],
|
|
4441
4450
|
recorded: [
|
|
4442
4451
|
"The purchase is the developers' UCP example (examples/protocols/ucp/shopping.py) against its local test store, Example Store, run in its own tests.",
|
|
4443
4452
|
"The checkout at Example Outfitters is the developers' ACP example (examples/protocols/agentic_commerce/checkout.py), run in its own tests.",
|
|
4444
4453
|
],
|
|
4445
4454
|
unverified: [
|
|
4446
|
-
"
|
|
4455
|
+
"A model's turns in the Studio's Preview were not watched in that drill (no dev server ran).",
|
|
4447
4456
|
],
|
|
4448
4457
|
},
|
|
4449
4458
|
},
|
|
@@ -4473,8 +4482,8 @@ export const SHOPPING_DESK_APP_0_0_1 = {
|
|
|
4473
4482
|
documents: [],
|
|
4474
4483
|
alternatives: [],
|
|
4475
4484
|
},
|
|
4476
|
-
enabled:
|
|
4477
|
-
unavailable_because: '
|
|
4485
|
+
enabled: true,
|
|
4486
|
+
unavailable_because: '',
|
|
4478
4487
|
tags: ['example', 'companies'],
|
|
4479
4488
|
icon: 'apps',
|
|
4480
4489
|
emoji: '🛍️',
|
|
@@ -4503,6 +4512,7 @@ export const SIGN_IN_DESK_APP_0_0_1 = {
|
|
|
4503
4512
|
protocols: ['pap'],
|
|
4504
4513
|
ui: [],
|
|
4505
4514
|
pap: {
|
|
4515
|
+
profile: 'draft-01',
|
|
4506
4516
|
connections: [
|
|
4507
4517
|
{
|
|
4508
4518
|
id: 'manzanita',
|
|
@@ -5191,12 +5201,18 @@ export const TRAVEL_DESK_APP_0_0_1 = {
|
|
|
5191
5201
|
connections: [
|
|
5192
5202
|
{
|
|
5193
5203
|
id: 'example-air',
|
|
5194
|
-
brand: 'air.
|
|
5195
|
-
audience: 'https://
|
|
5204
|
+
brand: 'air.examples.datalayer.run',
|
|
5205
|
+
audience: 'https://air.examples.datalayer.run/a2a',
|
|
5196
5206
|
access: 'write',
|
|
5197
5207
|
scopes: ['bookings:read', 'bookings:change'],
|
|
5198
5208
|
},
|
|
5199
5209
|
],
|
|
5210
|
+
business: {
|
|
5211
|
+
enabled: false,
|
|
5212
|
+
brand: '',
|
|
5213
|
+
scopes: {},
|
|
5214
|
+
registeredAgents: [],
|
|
5215
|
+
},
|
|
5200
5216
|
},
|
|
5201
5217
|
rules: [
|
|
5202
5218
|
{
|
|
@@ -5267,12 +5283,15 @@ export const TRAVEL_DESK_APP_0_0_1 = {
|
|
|
5267
5283
|
},
|
|
5268
5284
|
],
|
|
5269
5285
|
verified: {
|
|
5270
|
-
live: [
|
|
5286
|
+
live: [
|
|
5287
|
+
"Drilled on r1 on 13 October 2026 against the hosted Example Air (air.examples.datalayer.run), as its Preview's runtime reaches the gateway's pact toolset: its card read, asked as the application alone, the person's sign-in by device code approved at the Brand, then asked for the person and answered from the booking (bookings:read used, its receipt verified).",
|
|
5288
|
+
],
|
|
5271
5289
|
recorded: [
|
|
5272
5290
|
"The journey is the developers' PACT example (examples/protocols/pact/personal_agent.py) against its local Provider, Example Air, run in its own tests (version 1.3.112).",
|
|
5273
5291
|
],
|
|
5274
5292
|
unverified: [
|
|
5275
|
-
|
|
5293
|
+
'The hosted Example Air keeps registrations in memory: an application is registered there (POST /example/register, its issuer and keys) again after each restart.',
|
|
5294
|
+
"A model's turns in the Studio's Preview were not watched in that drill (no dev server ran); the step-up to bookings:change was not drilled live.",
|
|
5276
5295
|
],
|
|
5277
5296
|
},
|
|
5278
5297
|
},
|
|
@@ -5302,8 +5321,8 @@ export const TRAVEL_DESK_APP_0_0_1 = {
|
|
|
5302
5321
|
documents: [],
|
|
5303
5322
|
alternatives: [],
|
|
5304
5323
|
},
|
|
5305
|
-
enabled:
|
|
5306
|
-
unavailable_because: '
|
|
5324
|
+
enabled: true,
|
|
5325
|
+
unavailable_because: '',
|
|
5307
5326
|
tags: ['example', 'companies'],
|
|
5308
5327
|
icon: 'apps',
|
|
5309
5328
|
emoji: '✈️',
|
|
@@ -5621,6 +5640,7 @@ export const APP_SOURCES = {
|
|
|
5621
5640
|
],
|
|
5622
5641
|
protocols: ['pap'],
|
|
5623
5642
|
pap: {
|
|
5643
|
+
profile: 'draft-01',
|
|
5624
5644
|
connections: [
|
|
5625
5645
|
{
|
|
5626
5646
|
id: 'northwind',
|
|
@@ -6460,6 +6480,7 @@ export const APP_SOURCES = {
|
|
|
6460
6480
|
],
|
|
6461
6481
|
protocols: ['pap'],
|
|
6462
6482
|
pap: {
|
|
6483
|
+
profile: 'draft-01',
|
|
6463
6484
|
company: {
|
|
6464
6485
|
enabled: true,
|
|
6465
6486
|
interfaces: ['agent', 'openapi'],
|
|
@@ -6662,6 +6683,7 @@ export const APP_SOURCES = {
|
|
|
6662
6683
|
instructions: "You relay the person's questions to Manzanita Outfitters' own agent, through its tools, and show what the shop writes as it arrives, as the shop's words. Never finish the shop's sentences for it.",
|
|
6663
6684
|
protocols: ['pap'],
|
|
6664
6685
|
pap: {
|
|
6686
|
+
profile: 'draft-01',
|
|
6665
6687
|
connections: [
|
|
6666
6688
|
{
|
|
6667
6689
|
id: 'manzanita',
|
|
@@ -7013,10 +7035,11 @@ export const APP_SOURCES = {
|
|
|
7013
7035
|
instructions: 'You work with Manzanita Outfitters for the person you talk to, through its tools. Ask the shop before saying anything about an order; when it asks the person to sign in, say so and wait. Never confirm what the shop proposes on your own: the person approves it, word for word, on Waiting for you.',
|
|
7014
7036
|
protocols: ['pap'],
|
|
7015
7037
|
pap: {
|
|
7038
|
+
profile: 'draft-01',
|
|
7016
7039
|
connections: [
|
|
7017
7040
|
{
|
|
7018
7041
|
id: 'manzanita',
|
|
7019
|
-
company: 'manzanita.
|
|
7042
|
+
company: 'manzanita.examples.datalayer.run',
|
|
7020
7043
|
access: 'write',
|
|
7021
7044
|
scopes: ['orders:read', 'orders:write'],
|
|
7022
7045
|
extensions: ['operations'],
|
|
@@ -7080,7 +7103,7 @@ export const APP_SOURCES = {
|
|
|
7080
7103
|
"The journey is the Personal Agent Protocol SDK's recorded journey user-with-a-company (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
|
|
7081
7104
|
],
|
|
7082
7105
|
unverified: [
|
|
7083
|
-
'
|
|
7106
|
+
'It has not run in the Studio against the hosted Manzanita (manzanita.examples.datalayer.run) from this example yet.',
|
|
7084
7107
|
],
|
|
7085
7108
|
},
|
|
7086
7109
|
},
|
|
@@ -7107,6 +7130,7 @@ export const APP_SOURCES = {
|
|
|
7107
7130
|
instructions: "You read the person's orders at Manzanita Outfitters, through its tools, and change nothing. When the shop asks the person to sign in, say so and wait. If they ask to stop, tell them Disconnect under In your name ends the sign-in.",
|
|
7108
7131
|
protocols: ['pap'],
|
|
7109
7132
|
pap: {
|
|
7133
|
+
profile: 'draft-01',
|
|
7110
7134
|
connections: [
|
|
7111
7135
|
{
|
|
7112
7136
|
id: 'manzanita',
|
|
@@ -7852,6 +7876,7 @@ export const APP_SOURCES = {
|
|
|
7852
7876
|
instructions: 'You arrange returns and repairs at Manzanita Outfitters for the person, through its tools. The shop proposes each one with its terms: show them, word for word, and never confirm on your own; the person approves it on Waiting for you.',
|
|
7853
7877
|
protocols: ['pap'],
|
|
7854
7878
|
pap: {
|
|
7879
|
+
profile: 'draft-01',
|
|
7855
7880
|
connections: [
|
|
7856
7881
|
{
|
|
7857
7882
|
id: 'manzanita',
|
|
@@ -8157,6 +8182,7 @@ export const APP_SOURCES = {
|
|
|
8157
8182
|
instructions: "You talk with Manzanita Outfitters' own agent for the person, through its tools, in one conversation. When they ask for a person at the shop, ask the shop for one of its people and say who answers. Every message to the shop goes out in their name: send it only once they agreed.",
|
|
8158
8183
|
protocols: ['pap'],
|
|
8159
8184
|
pap: {
|
|
8185
|
+
profile: 'draft-01',
|
|
8160
8186
|
connections: [
|
|
8161
8187
|
{
|
|
8162
8188
|
id: 'manzanita',
|
|
@@ -8247,7 +8273,7 @@ export const APP_SOURCES = {
|
|
|
8247
8273
|
{
|
|
8248
8274
|
id: 'example-store',
|
|
8249
8275
|
protocol: 'ucp',
|
|
8250
|
-
merchant: 'store.
|
|
8276
|
+
merchant: 'store.examples.datalayer.run',
|
|
8251
8277
|
access: 'write',
|
|
8252
8278
|
limit: {
|
|
8253
8279
|
amount: '50',
|
|
@@ -8257,7 +8283,7 @@ export const APP_SOURCES = {
|
|
|
8257
8283
|
{
|
|
8258
8284
|
id: 'example-outfitters',
|
|
8259
8285
|
protocol: 'acp',
|
|
8260
|
-
merchant: 'outfitters.
|
|
8286
|
+
merchant: 'outfitters.examples.datalayer.run',
|
|
8261
8287
|
access: 'write',
|
|
8262
8288
|
limit: {
|
|
8263
8289
|
amount: '150',
|
|
@@ -8317,12 +8343,15 @@ export const APP_SOURCES = {
|
|
|
8317
8343
|
},
|
|
8318
8344
|
],
|
|
8319
8345
|
verified: {
|
|
8346
|
+
live: [
|
|
8347
|
+
"Drilled on r1 on 13 October 2026 against the hosted test merchants, as its Preview's runtime reaches the gateway's ucp and acp toolsets: at Example Store (store.examples.datalayer.run) a search, a checkout filled, the exact purchase asked of the person, approved on Waiting for you, bought once and refused a second time, its order read; at Example Outfitters (outfitters.examples.datalayer.run) the same checkout over ACP. Test merchants only: paid with a test instrument.",
|
|
8348
|
+
],
|
|
8320
8349
|
recorded: [
|
|
8321
8350
|
"The purchase is the developers' UCP example (examples/protocols/ucp/shopping.py) against its local test store, Example Store, run in its own tests.",
|
|
8322
8351
|
"The checkout at Example Outfitters is the developers' ACP example (examples/protocols/agentic_commerce/checkout.py), run in its own tests.",
|
|
8323
8352
|
],
|
|
8324
8353
|
unverified: [
|
|
8325
|
-
"
|
|
8354
|
+
"A model's turns in the Studio's Preview were not watched in that drill (no dev server ran).",
|
|
8326
8355
|
],
|
|
8327
8356
|
},
|
|
8328
8357
|
},
|
|
@@ -8333,8 +8362,6 @@ export const APP_SOURCES = {
|
|
|
8333
8362
|
deployment: {
|
|
8334
8363
|
hosted: {},
|
|
8335
8364
|
},
|
|
8336
|
-
enabled: false,
|
|
8337
|
-
unavailable_because: 'It buys at shops for you over UCP and ACP, and the services that reach a shop for you are not shipped yet.',
|
|
8338
8365
|
tags: ['example', 'companies'],
|
|
8339
8366
|
emoji: '🛍️',
|
|
8340
8367
|
},
|
|
@@ -8349,6 +8376,7 @@ export const APP_SOURCES = {
|
|
|
8349
8376
|
instructions: 'You help the person at Manzanita Outfitters, through its tools. When the shop needs them signed in, show its protected form and wait. Never ask for a password, a code or anything the form asks in the conversation.',
|
|
8350
8377
|
protocols: ['pap'],
|
|
8351
8378
|
pap: {
|
|
8379
|
+
profile: 'draft-01',
|
|
8352
8380
|
connections: [
|
|
8353
8381
|
{
|
|
8354
8382
|
id: 'manzanita',
|
|
@@ -8812,8 +8840,8 @@ export const APP_SOURCES = {
|
|
|
8812
8840
|
connections: [
|
|
8813
8841
|
{
|
|
8814
8842
|
id: 'example-air',
|
|
8815
|
-
brand: 'air.
|
|
8816
|
-
audience: 'https://
|
|
8843
|
+
brand: 'air.examples.datalayer.run',
|
|
8844
|
+
audience: 'https://air.examples.datalayer.run/a2a',
|
|
8817
8845
|
access: 'write',
|
|
8818
8846
|
scopes: ['bookings:read', 'bookings:change'],
|
|
8819
8847
|
},
|
|
@@ -8861,11 +8889,15 @@ export const APP_SOURCES = {
|
|
|
8861
8889
|
},
|
|
8862
8890
|
],
|
|
8863
8891
|
verified: {
|
|
8892
|
+
live: [
|
|
8893
|
+
"Drilled on r1 on 13 October 2026 against the hosted Example Air (air.examples.datalayer.run), as its Preview's runtime reaches the gateway's pact toolset: its card read, asked as the application alone, the person's sign-in by device code approved at the Brand, then asked for the person and answered from the booking (bookings:read used, its receipt verified).",
|
|
8894
|
+
],
|
|
8864
8895
|
recorded: [
|
|
8865
8896
|
"The journey is the developers' PACT example (examples/protocols/pact/personal_agent.py) against its local Provider, Example Air, run in its own tests (version 1.3.112).",
|
|
8866
8897
|
],
|
|
8867
8898
|
unverified: [
|
|
8868
|
-
|
|
8899
|
+
'The hosted Example Air keeps registrations in memory: an application is registered there (POST /example/register, its issuer and keys) again after each restart.',
|
|
8900
|
+
"A model's turns in the Studio's Preview were not watched in that drill (no dev server ran); the step-up to bookings:change was not drilled live.",
|
|
8869
8901
|
],
|
|
8870
8902
|
},
|
|
8871
8903
|
},
|
|
@@ -8876,8 +8908,6 @@ export const APP_SOURCES = {
|
|
|
8876
8908
|
deployment: {
|
|
8877
8909
|
hosted: {},
|
|
8878
8910
|
},
|
|
8879
|
-
enabled: false,
|
|
8880
|
-
unavailable_because: 'It asks an airline for you over PACT, and the services that reach a business for you are not shipped yet.',
|
|
8881
8911
|
tags: ['example', 'companies'],
|
|
8882
8912
|
emoji: '✈️',
|
|
8883
8913
|
},
|