@xano/sdk 1.0.7 → 1.0.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/CHANGELOG.md +32 -5
- package/README.md +2 -0
- package/dist/.build-fingerprint +1 -1
- package/dist/{agent-file-refresh-DGGSRPJ4.js → agent-file-refresh-XXCQOTWN.js} +10 -10
- package/dist/{agent-skill-command-37DFYS7Q.js → agent-skill-command-VDSMXH4M.js} +42 -42
- package/dist/{answer-shape-RBFDCNZ7.js → answer-shape-UMQRXMCX.js} +5 -5
- package/dist/{backend-dir-KDD43X7K.js → backend-dir-G44PETFO.js} +10 -10
- package/dist/{backend-slot-TBOVZXDE.js → backend-slot-TTRNOQF5.js} +4 -4
- package/dist/bin.js +43 -43
- package/dist/{branch-7PIKNUD7.js → branch-Q7CDJRU6.js} +9 -9
- package/dist/{branch-commands-EGY7ZEZE.js → branch-commands-Q6E66PMM.js} +24 -24
- package/dist/bundle.js +2 -2
- package/dist/{chunk-VNDR2T35.js → chunk-2VWSUG2B.js} +7 -7
- package/dist/{chunk-7VR4IO5B.js → chunk-3P35HT64.js} +2 -2
- package/dist/{chunk-HZ6ADG3O.js → chunk-3UZQ5TMG.js} +5 -5
- package/dist/{chunk-567KK6XF.js → chunk-3XSTC3TM.js} +4 -4
- package/dist/{chunk-FENA7K7C.js → chunk-4JKXGPXB.js} +3 -3
- package/dist/{chunk-D5OZRJ3T.js → chunk-5BEK7YKY.js} +6 -6
- package/dist/{chunk-ARWMVNDJ.js → chunk-5QOV52V4.js} +2 -2
- package/dist/{chunk-ZJOAWRED.js → chunk-5VOGPS5O.js} +4 -4
- package/dist/{chunk-EPFDY5JU.js → chunk-5Y5HWQ2P.js} +2 -2
- package/dist/{chunk-T4LJ5UR2.js → chunk-6BOKCTCM.js} +52 -22
- package/dist/{chunk-5SCPRXFB.js → chunk-6IOQRBRX.js} +3 -3
- package/dist/{chunk-FNLTFOUD.js → chunk-6NEV2PEC.js} +2 -2
- package/dist/{chunk-47XT6WQL.js → chunk-6PTITS3M.js} +5 -5
- package/dist/{chunk-3FRGNBOC.js → chunk-6S263KTM.js} +2 -2
- package/dist/{chunk-JI3BLXWQ.js → chunk-6YOH2L3G.js} +11 -5
- package/dist/{chunk-5QMJOE2K.js → chunk-6ZFJEJXZ.js} +5 -3
- package/dist/{chunk-M2C54ZBC.js → chunk-75MKIQON.js} +4 -4
- package/dist/{chunk-SDGV76HF.js → chunk-76UAME77.js} +2 -2
- package/dist/{chunk-26LHXLD3.js → chunk-7JKNWDYN.js} +2 -2
- package/dist/{chunk-JOWY6HFL.js → chunk-7MPI7NIW.js} +3 -3
- package/dist/{chunk-HTQWAQRW.js → chunk-ADKC3EII.js} +3 -3
- package/dist/{chunk-EF4MHLEW.js → chunk-B3NH5UBI.js} +4 -4
- package/dist/{chunk-SLGJIWCY.js → chunk-B5N6EWOM.js} +2 -2
- package/dist/{chunk-CT3J5JRZ.js → chunk-BUTGFWWA.js} +7 -7
- package/dist/{chunk-UYFUIHH3.js → chunk-C2GHFADU.js} +2 -2
- package/dist/{chunk-CH23ONYG.js → chunk-C6KBZH7M.js} +7 -2
- package/dist/{chunk-ZGLNHA7T.js → chunk-CXWCWYX3.js} +4 -4
- package/dist/{chunk-YCUDOF6Q.js → chunk-DDUOMOIP.js} +15 -15
- package/dist/{chunk-AVS4WPPY.js → chunk-DSD2NNTX.js} +2 -2
- package/dist/{chunk-JX6N73H3.js → chunk-DY3EJWWH.js} +2 -2
- package/dist/{chunk-SKEG3V2V.js → chunk-EKTIGGFO.js} +2 -2
- package/dist/{chunk-A4R5CAY4.js → chunk-F3IA3YWI.js} +1 -1
- package/dist/{chunk-EU32BC5B.js → chunk-FFB3YCUO.js} +8 -8
- package/dist/{chunk-B3P25SDP.js → chunk-GAU2FCT7.js} +5 -5
- package/dist/{chunk-NV37YGOV.js → chunk-GHPC52TD.js} +6 -6
- package/dist/{chunk-FDTET7FZ.js → chunk-GN5SQMIQ.js} +4 -4
- package/dist/{chunk-QRQ54LUI.js → chunk-H3ZBAR2L.js} +10 -10
- package/dist/{chunk-5ZG7V2VW.js → chunk-HBFXR4OJ.js} +3 -3
- package/dist/{chunk-BZ6WTG3E.js → chunk-HETQSTGG.js} +4 -4
- package/dist/{chunk-RBU2YX22.js → chunk-HFOGQIII.js} +2 -2
- package/dist/{chunk-7M6JP3FS.js → chunk-HQPL34O6.js} +2 -2
- package/dist/{chunk-BSVQEKHO.js → chunk-HTP2CLRQ.js} +5 -5
- package/dist/{chunk-CPN6WSBH.js → chunk-HVPSDQJB.js} +3 -3
- package/dist/{chunk-SGK3PTTM.js → chunk-HVSIS47X.js} +43 -43
- package/dist/{chunk-IYXL5NYU.js → chunk-I53OTC3O.js} +2 -2
- package/dist/{chunk-NDJAKSE7.js → chunk-IB6SKACE.js} +4 -4
- package/dist/{chunk-YH2JVJAO.js → chunk-IFCQCM2Q.js} +8 -8
- package/dist/{chunk-TWVUYS63.js → chunk-INAM6KR6.js} +15 -15
- package/dist/{chunk-DIWF7L33.js → chunk-KDS4PDFD.js} +3 -3
- package/dist/{chunk-D3KEPRRN.js → chunk-LTPF25L2.js} +2 -1
- package/dist/{chunk-WNCW2RNB.js → chunk-NFSUGVDY.js} +4 -4
- package/dist/{chunk-ZXRDD3Q2.js → chunk-NI56XX5Z.js} +3 -3
- package/dist/{chunk-LBJA7IEM.js → chunk-O376UAZS.js} +2 -2
- package/dist/{chunk-JOOKM7AH.js → chunk-OBJ7FQDX.js} +2 -2
- package/dist/{chunk-VJFMUJWZ.js → chunk-OHTHG3LL.js} +2 -2
- package/dist/{chunk-L472YIGG.js → chunk-OYRQLU66.js} +8 -8
- package/dist/{chunk-S46ODQRA.js → chunk-PBK257CI.js} +2 -2
- package/dist/{chunk-AKERAUNH.js → chunk-PFW7WFAT.js} +4 -4
- package/dist/{chunk-2SD4LA22.js → chunk-QC3MKMDK.js} +2 -2
- package/dist/{chunk-7XXWKTCE.js → chunk-QGDT52FA.js} +29 -29
- package/dist/{chunk-CNZASQPL.js → chunk-QL3ZJWGG.js} +2 -2
- package/dist/{chunk-IPNN2KRW.js → chunk-QTMXJQZN.js} +3 -3
- package/dist/{chunk-WUEPP5HD.js → chunk-QXOBZSQD.js} +4 -4
- package/dist/{chunk-VAGSKUWC.js → chunk-R3LANPQZ.js} +3 -3
- package/dist/{chunk-M3NEK3LT.js → chunk-R4NOZBOY.js} +4 -4
- package/dist/{chunk-ORGNLQN6.js → chunk-S42TFTM5.js} +3 -3
- package/dist/{chunk-2ACWDSAQ.js → chunk-S5RZYUP2.js} +3 -3
- package/dist/{chunk-B2URJBC4.js → chunk-SGYDFEXD.js} +14 -14
- package/dist/{chunk-O56DQKPL.js → chunk-SSOTLVOJ.js} +9 -9
- package/dist/{chunk-FQ53GTII.js → chunk-T3ZVNOJC.js} +6 -6
- package/dist/{chunk-MYZRMSPM.js → chunk-TG65NWUR.js} +2 -2
- package/dist/{chunk-L6HZ67P6.js → chunk-TR7EOUQE.js} +2 -2
- package/dist/{chunk-DG3APBUJ.js → chunk-U7XSQXOA.js} +84 -80
- package/dist/{chunk-PEX4QZVI.js → chunk-ULUUOUQX.js} +2 -2
- package/dist/{chunk-I6XRUU6U.js → chunk-UZUY6VPB.js} +117 -49
- package/dist/{chunk-PY722CHR.js → chunk-VD7YTLWL.js} +2 -2
- package/dist/{chunk-RRMH7WMY.js → chunk-VHV25AAO.js} +7 -7
- package/dist/{chunk-MBL7CXJ7.js → chunk-VJTTTIIB.js} +2 -2
- package/dist/{chunk-N3YFCFCO.js → chunk-WKCA66SH.js} +14 -14
- package/dist/{chunk-U5M7T6CI.js → chunk-WLFANUXE.js} +7 -7
- package/dist/{chunk-PEIBGH2V.js → chunk-XLQT3CCF.js} +22 -22
- package/dist/{chunk-2XWVZRL6.js → chunk-XPLBTV77.js} +7 -7
- package/dist/{chunk-VIJ5D3RC.js → chunk-XQO4A4Q4.js} +3 -3
- package/dist/{chunk-DXZTL7NA.js → chunk-XTUYIX5H.js} +39 -39
- package/dist/{chunk-PV25BDCH.js → chunk-Y2LKSXFK.js} +4 -4
- package/dist/{chunk-46PATL23.js → chunk-Y3FM4BSZ.js} +3 -3
- package/dist/{chunk-QGIZLFAS.js → chunk-YE7MHW45.js} +4 -4
- package/dist/{chunk-YHB34BN6.js → chunk-YEH5OIPF.js} +2 -1
- package/dist/{chunk-ELPQTDW6.js → chunk-YMVCKGY2.js} +73 -72
- package/dist/{chunk-H2K4GFUS.js → chunk-YP76ZCQ5.js} +4 -4
- package/dist/{chunk-GHMLRFRX.js → chunk-YVXUYDHC.js} +5 -5
- package/dist/{chunk-V7MBRUK6.js → chunk-ZO3QWFNV.js} +3 -3
- package/dist/{chunk-2YER2J47.js → chunk-ZYPEH64F.js} +5 -5
- package/dist/cli.d.ts +8 -1
- package/dist/cli.js +41 -41
- package/dist/{codegen-command-T7TC7PQO.js → codegen-command-KZJ7LYHW.js} +61 -61
- package/dist/{commands-JDENTDJS.js → commands-FOHIPDKZ.js} +3 -3
- package/dist/{completion-YFD5OVJW.js → completion-XUBGMKGV.js} +3 -3
- package/dist/{config-YJFUTRJW.js → config-544VCRKP.js} +4 -4
- package/dist/{deploy-command-OEVEE6UG.js → deploy-command-RXPJAM7M.js} +48 -48
- package/dist/{deploy-source-HYVZEYXV.js → deploy-source-TD77W4SA.js} +28 -28
- package/dist/{dev-env-sync-EFDCJ6KU.js → dev-env-sync-2UCNSIJL.js} +42 -42
- package/dist/{diagnostics-OMN5Y2AH.js → diagnostics-FNVNRYMB.js} +2 -2
- package/dist/{display-name-hint-SW3GB3V7.js → display-name-hint-EZQK2PDU.js} +11 -11
- package/dist/{emit-Dov_92kn.d.ts → emit-D-a6JznN.d.ts} +22 -16
- package/dist/{env-example-refresh-WNSOH534.js → env-example-refresh-QKZI26F2.js} +62 -62
- package/dist/{env-pull-command-UYEXMQ3P.js → env-pull-command-72PQOMKW.js} +40 -40
- package/dist/{env-target-JBSLBKNX.js → env-target-AZJ4JXT7.js} +10 -10
- package/dist/{env-var-command-BJNRAXNV.js → env-var-command-ALJITZDL.js} +38 -38
- package/dist/{ephemeral-CEOGMIEA.js → ephemeral-H24NF6WP.js} +9 -9
- package/dist/{ephemeral-command-IPSGBCS5.js → ephemeral-command-T276HQBO.js} +41 -41
- package/dist/{ephemeral-state-MTBASPRS.js → ephemeral-state-YLZQIOBF.js} +8 -8
- package/dist/{generate-command-XQXODBS6.js → generate-command-M6LAT4XU.js} +66 -66
- package/dist/{gitignore-RUVCIZO4.js → gitignore-V6QHYKIR.js} +14 -14
- package/dist/{guards-KYEOCVHN.js → guards-4VPSEOAI.js} +6 -4
- package/dist/{impersonate-command-MA27O7S5.js → impersonate-command-S6PYDMHQ.js} +34 -34
- package/dist/{import-XKRFHABE.js → import-TXYVFYJS.js} +5 -5
- package/dist/index.d.ts +4 -4
- package/dist/index.js +8 -8
- package/dist/{init-command-6RDTCMAB.js → init-command-ENAZKPZA.js} +46 -46
- package/dist/{init-modules-DHTBOCQT.js → init-modules-AIKWWTVQ.js} +8 -8
- package/dist/{init-web-ELBXSXDL.js → init-web-MSXDARRF.js} +3 -3
- package/dist/internal.d.ts +4 -4
- package/dist/internal.js +29 -12
- package/dist/{keep-data-merge-TDJOIAVT.js → keep-data-merge-3WPUPPTY.js} +23 -23
- package/dist/{landing-record-TPPYFQAS.js → landing-record-SJ5HG7T5.js} +16 -16
- package/dist/{live-diff-5E2BQWQ7.js → live-diff-CGTGOH3S.js} +3 -3
- package/dist/{local-engine-choice-S6VHPJRU.js → local-engine-choice-BD5O7SAU.js} +31 -31
- package/dist/{local-engine-command-4EZCGZ6M.js → local-engine-command-MXQUXXAA.js} +36 -36
- package/dist/{local-engine-config-2EBL3QKA.js → local-engine-config-6CB6FOEJ.js} +2 -2
- package/dist/{local-engine-deploy-FOPNWU7X.js → local-engine-deploy-ID4JJXB5.js} +14 -14
- package/dist/{local-engine-lookup-GM3E3NPP.js → local-engine-lookup-IC7BKAYP.js} +4 -4
- package/dist/{local-engine-mcp-bridge-QKZHUGW3.js → local-engine-mcp-bridge-3SOJMZ5T.js} +5 -5
- package/dist/{local-engine-mcp-command-BFQVLXZC.js → local-engine-mcp-command-6G3TDWDI.js} +39 -39
- package/dist/{local-engine-process-XUQPQENQ.js → local-engine-process-HG5BGG3F.js} +9 -9
- package/dist/{local-engine-state-JQPKGB65.js → local-engine-state-JZHTKHDG.js} +3 -3
- package/dist/{local-engine-update-check-S7UF6ZF5.js → local-engine-update-check-SKZR7YSC.js} +6 -6
- package/dist/{lock-commands-HJ6Y5QVS.js → lock-commands-SUPQOEVU.js} +46 -46
- package/dist/{login-command-JO55NZAS.js → login-command-LTYO3EK7.js} +22 -22
- package/dist/{logout-command-MPRIRSJA.js → logout-command-QRRT36DY.js} +13 -13
- package/dist/{loop-SUB6C2LK.js → loop-XFDS65OD.js} +3 -3
- package/dist/{marketplace-command-BM6G257N.js → marketplace-command-POQH5GVT.js} +29 -29
- package/dist/{marketplace-resolve-AWH3RG57.js → marketplace-resolve-PWEYJ2XS.js} +6 -6
- package/dist/{meta-client-AOSWODQQ.js → meta-client-PDUP4EOW.js} +11 -11
- package/dist/{module-manifest-GXI46PEF.js → module-manifest-KY7J63HG.js} +4 -4
- package/dist/node.d.ts +4 -4
- package/dist/node.js +47 -47
- package/dist/{operation-outcome-4UKPXTNC.js → operation-outcome-IXMC5SBN.js} +22 -22
- package/dist/{output-target-RAZ4KN5J.js → output-target-4XN43WIB.js} +15 -15
- package/dist/{plan-disclosure-JR52DWXN.js → plan-disclosure-GNLDYV2A.js} +15 -15
- package/dist/{plugin-contributions-E6XHLQWK.js → plugin-contributions-PAGG6SUP.js} +5 -5
- package/dist/{plugin-prompt-IODX5EU6.js → plugin-prompt-2MX6LF6X.js} +5 -5
- package/dist/{plugin-questions-AAAJ7POP.js → plugin-questions-AP6VUTOB.js} +4 -4
- package/dist/{preflight-command-7GKJBWOQ.js → preflight-command-QWZL4O2N.js} +53 -53
- package/dist/{profile-command-CM6J7E2M.js → profile-command-V6WFDYZW.js} +23 -23
- package/dist/{profile-pointer-KTYXL6FU.js → profile-pointer-4HJQH5ZR.js} +4 -4
- package/dist/{project-dependency-OQ5575QQ.js → project-dependency-ORX45I74.js} +7 -7
- package/dist/{project-sdk-2ESHHZVL.js → project-sdk-IYMFVQRC.js} +4 -4
- package/dist/promote-command-B3QODJNT.js +147 -0
- package/dist/{prompt-MQPGU4ZI.js → prompt-ZZUYWFQX.js} +4 -4
- package/dist/{publish-command-IEMYZ7LF.js → publish-command-JOL6LXH6.js} +51 -51
- package/dist/{pull-command-S5E2ABZ4.js → pull-command-RPGL6LXP.js} +64 -64
- package/dist/{pull-superseded-E34BZVLH.js → pull-superseded-UZ3MB53B.js} +4 -4
- package/dist/{release-command-7F5TBKO2.js → release-command-USZAWVXO.js} +59 -59
- package/dist/{release-ns-command-EK2ZQ4CC.js → release-ns-command-3XDRQKJD.js} +75 -75
- package/dist/{retry-command-GL5HCMVB.js → retry-command-VZYLYDVX.js} +8 -8
- package/dist/{routes-manifest-YR4ZIMLM.js → routes-manifest-RIZGSOZC.js} +4 -4
- package/dist/{routes-manifest-file-LCIKPDAG.js → routes-manifest-file-V5JJVIPH.js} +7 -7
- package/dist/{secrets-file-LXREYU3M.js → secrets-file-ZA6K4J6W.js} +14 -14
- package/dist/{secrets-fill-command-QHZS3KWM.js → secrets-fill-command-MH53XR45.js} +45 -45
- package/dist/{seed-FRKMDN2Z.js → seed-KEPIS7UZ.js} +5 -5
- package/dist/{source-resolve-BBHYTOXI.js → source-resolve-I55GN6ZC.js} +20 -20
- package/dist/{static-host-7LC7OZR4.js → static-host-JAOT3N3E.js} +5 -5
- package/dist/{status-command-TY253MJT.js → status-command-I6S2TVAY.js} +35 -35
- package/dist/{store-VJ3OS6VO.js → store-YFNDD6GZ.js} +6 -6
- package/dist/{store-Boba9OOh.d.ts → store-xUySg-KR.d.ts} +1 -1
- package/dist/{sync-baseline-DOV5AGIO.js → sync-baseline-3CDL4PKT.js} +7 -5
- package/dist/{sync-contributions-63542VE4.js → sync-contributions-4HHBUGJ4.js} +9 -9
- package/dist/{sync-record-RGHK7EAL.js → sync-record-U65BCPSP.js} +10 -10
- package/dist/{table-OAYGFGEN.js → table-E5YTK7QX.js} +7 -7
- package/dist/{tables-command-PZIVDAH3.js → tables-command-L4JRA7JF.js} +34 -34
- package/dist/{tenant-Y3II4VY3.js → tenant-DAXJ4P4D.js} +10 -10
- package/dist/{tenant-command-G6XON7CF.js → tenant-command-IZ3R4BDG.js} +81 -81
- package/dist/{test-command-3FZOX7O3.js → test-command-GCKZRRSL.js} +33 -33
- package/dist/{tests-KF6N6BZ7.js → tests-CLDZWLKF.js} +6 -6
- package/dist/{token-DJJUW5HY.js → token-XQCIFX7R.js} +9 -9
- package/dist/{toolchain-hooks-7PWCFLSU.js → toolchain-hooks-3ZAAAWPL.js} +6 -6
- package/dist/{toolchain-modules-OTNSKK52.js → toolchain-modules-C53NXT3S.js} +5 -5
- package/dist/{toolchain-peers-KQ7TQ2AR.js → toolchain-peers-AIKWKJH7.js} +8 -8
- package/dist/{tracked-backend-AJCGTO5Y.js → tracked-backend-UHKPD2JU.js} +31 -31
- package/dist/{update-check-4E5L6GAW.js → update-check-KMAC4VEJ.js} +44 -44
- package/dist/{upgrade-command-BXMSQN4C.js → upgrade-command-HQBSUFNE.js} +46 -46
- package/dist/{whoami-command-NLCCIEUM.js → whoami-command-23UXAC6F.js} +12 -12
- package/dist/{workspace-PNMJOXE4.js → workspace-TZMAJ7NF.js} +5 -5
- package/dist/{workspace-binding-J5GWDFRI.js → workspace-binding-RBU22BBX.js} +11 -11
- package/dist/{workspace-command-MHIIY352.js → workspace-command-N4BTEHSW.js} +84 -89
- package/dist/{workspace-env-LLRWCHSA.js → workspace-env-O3RK26FR.js} +11 -11
- package/dist/{workspace-export-BIKAYHWJ.js → workspace-export-UHY22VBI.js} +5 -5
- package/dist/{writable-UOTO4WWC.js → writable-2A6MBSFD.js} +4 -4
- package/dist/{xano-LCI7VWPS.js → xano-6T6L7TTI.js} +5 -5
- package/dist/{xanosdk-import-S7A3CVBN.js → xanosdk-import-WPCHIVP6.js} +6 -6
- package/dist/{xanosdk-project-J4VCFRHP.js → xanosdk-project-TEAXYQZW.js} +12 -12
- package/guides/cli.md +8 -7
- package/guides/codes.md +4 -1
- package/guides/deploying.md +28 -9
- package/llms/errors.md +1 -1
- package/llms/kinds-agent-mcp.md +4 -3
- package/llms/object-kinds.md +14 -0
- package/llms-full.txt +21 -6
- package/llms.txt +2 -2
- package/manifest.json +5 -1
- package/package.json +1 -1
- package/skills/xano-backend/SKILL.md +2 -2
- package/dist/promote-command-BDRPG6UU.js +0 -147
package/guides/deploying.md
CHANGED
|
@@ -175,7 +175,8 @@ what ran, then `xanosdk promote <release>` lands it there as a new branch, leavi
|
|
|
175
175
|
untouched until you say otherwise.
|
|
176
176
|
|
|
177
177
|
**Static host** — `deploy --static <dir>` archives a directory and deploys it to a
|
|
178
|
-
static host after the backend import. The frontend lands **on the
|
|
178
|
+
static host after the backend import. The frontend lands **on the environment the backend just
|
|
179
|
+
went to** — the ephemeral itself, or the Xano Engine (see *A frontend on the Xano Engine, and server rendering*) — so the
|
|
179
180
|
backend and the frontend live in one environment. The CLI uploads the archive to
|
|
180
181
|
`/api:meta/workspace/{id}/static_host/default/build` with your ordinary bearer. That route
|
|
181
182
|
auto-creates the `default` host (and only that one: a `--static-host` naming a host the target
|
|
@@ -294,7 +295,7 @@ as three environment variables** — the `type: "token"` record above, with no f
|
|
|
294
295
|
XANO_INSTANCE_URL=https://your-instance.xano.io \
|
|
295
296
|
XANO_WORKSPACE_ID=3 \
|
|
296
297
|
XANO_META_TOKEN=your-meta-api-token \
|
|
297
|
-
npx xanosdk deploy ./xano/index.ts
|
|
298
|
+
npx xanosdk deploy ./xano/index.ts --ephemeral
|
|
298
299
|
```
|
|
299
300
|
|
|
300
301
|
Nothing is read from or written to disk, and nothing rotates, so the same three secrets keep
|
|
@@ -610,8 +611,10 @@ with `--to` (`--seed`, `--prune`, `--dry-run`, …) stay refused alongside it.
|
|
|
610
611
|
|
|
611
612
|
### Deploying locally
|
|
612
613
|
|
|
613
|
-
`xanosdk deploy
|
|
614
|
-
|
|
614
|
+
A bare `xanosdk deploy` deploys to an engine running on this machine — no network round-trip
|
|
615
|
+
per deploy. `--local` is that default spelled out, needed only to name an engine:
|
|
616
|
+
`--local=<version|url|path>` runs that one instead of the pinned version. It needs nothing
|
|
617
|
+
configured:
|
|
615
618
|
|
|
616
619
|
- **The first run** resolves the latest published engine for this machine's platform,
|
|
617
620
|
downloads it, checks it against the sha256 its release recorded, and **pins** that version in
|
|
@@ -1019,7 +1022,7 @@ instead, so stdout is never empty. Branch on `code`, not on the message:
|
|
|
1019
1022
|
|
|
1020
1023
|
A piped stdout gets the document too, without `--json`, so a script reading the pipe never gets
|
|
1021
1024
|
an empty stdout. The exception is a command whose stdout is the data itself (`export` to stdout,
|
|
1022
|
-
`
|
|
1025
|
+
`completion`, `--help`): a failure appended to it would corrupt it, so those write one
|
|
1023
1026
|
only under `--json`. A piped `release` or `promote` write prints its operation result (above)
|
|
1024
1027
|
either way.
|
|
1025
1028
|
|
|
@@ -1127,7 +1130,7 @@ or on a second destination, nothing for a tenant to be pointed at, and no record
|
|
|
1127
1130
|
build *was* beyond the commit you built it from. Prefer the release flow for anything you may
|
|
1128
1131
|
need to repeat.
|
|
1129
1132
|
|
|
1130
|
-
The flags that describe the
|
|
1133
|
+
The flags that describe the environment a plain deploy replaces — `--name`, `--expires-hours`,
|
|
1131
1134
|
`--reset`, `--keep-data`, `--test` (with `--kind`/`--concurrency`), `--no-dev-env`,
|
|
1132
1135
|
`--require-microservices`, `--open` — are refused beside `--to`, before sign-in. `--static`
|
|
1133
1136
|
publishes beside the merge, but not under `--dry-run`; `--skip-liveness` needs `--static` there.
|
|
@@ -1295,7 +1298,7 @@ xanosdk workspace diff ./xano/index.ts --json
|
|
|
1295
1298
|
}
|
|
1296
1299
|
```
|
|
1297
1300
|
|
|
1298
|
-
- `changedThere`: pull before you deploy
|
|
1301
|
+
- `changedThere`: pull before you deploy. `deploy --to workspace` refuses to overwrite it (see below).
|
|
1299
1302
|
- `changedHere`: deploy it.
|
|
1300
1303
|
- `changedBoth`: reconcile by hand.
|
|
1301
1304
|
- `unclassified`: the baseline cannot tell. The object has no baseline entry, both sides
|
|
@@ -1323,6 +1326,22 @@ A few things to know about the baseline:
|
|
|
1323
1326
|
next sync records a new baseline.
|
|
1324
1327
|
- On a merge conflict in `xano.lock`, keep either side's baseline for a branch, or delete it.
|
|
1325
1328
|
|
|
1329
|
+
#### The deploy guard
|
|
1330
|
+
|
|
1331
|
+
`deploy --to workspace` reads the same baseline before it writes. When an object it would
|
|
1332
|
+
overwrite is in `changedThere` or `changedBoth`, it refuses with exit 2 and
|
|
1333
|
+
`SDK_WORKSPACE_CHANGED`. The refusal's `details.objects` lists those objects, and
|
|
1334
|
+
`details.changedThere`, `details.changedBoth` and `details.baseline` say how each was classified.
|
|
1335
|
+
Pull the change into the project and commit it, then deploy again. To deploy over it anyway, pass
|
|
1336
|
+
`--overwrite`; the run warns (`deploy.overwrite-changed`) and names what it overwrote. A
|
|
1337
|
+
`--dry-run` refuses nothing: it warns and lists the objects under `changedInXano`.
|
|
1338
|
+
|
|
1339
|
+
The guard counts only what the deploy writes. A merge leaves an object that only the branch holds
|
|
1340
|
+
alone, so an object added in Xano is refused over only under `--prune` or `--replace`, which
|
|
1341
|
+
delete it. Nothing is refused when the branch has no baseline, over an `unclassified`
|
|
1342
|
+
difference, or on a `--branch` deploy to a branch that does not exist yet. It reads the branch
|
|
1343
|
+
once, before the confirmation, so an edit made in Xano after that read is not caught.
|
|
1344
|
+
|
|
1326
1345
|
### Deploying to a branch
|
|
1327
1346
|
|
|
1328
1347
|
`--branch <label>` stages on a Xano branch instead of the live one, which is the safer shape
|
|
@@ -1601,10 +1620,10 @@ and `XANO_META_TOKEN`, [above](#signing-in--deploying-in-depth) — no browser,
|
|
|
1601
1620
|
nothing that rotates:
|
|
1602
1621
|
|
|
1603
1622
|
```bash
|
|
1604
|
-
XANO_INSTANCE_URL=… XANO_WORKSPACE_ID=… XANO_META_TOKEN=… npx xanosdk deploy ./xano/index.ts
|
|
1623
|
+
XANO_INSTANCE_URL=… XANO_WORKSPACE_ID=… XANO_META_TOKEN=… npx xanosdk deploy ./xano/index.ts --ephemeral
|
|
1605
1624
|
```
|
|
1606
1625
|
|
|
1607
1626
|
> ⚠️ A deploy without `--keep-data` is a full replace of the target environment, including
|
|
1608
|
-
> its table records, before importing. The blast radius is your own disposable ephemeral — but anything
|
|
1627
|
+
> its table records, before importing. The blast radius is your own Xano Engine or disposable ephemeral — but anything
|
|
1609
1628
|
> you only ever created by hand in it (or any data it accumulated) is gone. That's exactly
|
|
1610
1629
|
> why a real workspace or tenant is reached only by naming it, with `deploy --to`.
|
package/llms/errors.md
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
- A response types as `StackTupleWidened` — a `Statement[]` helper was spread into the stack; return `statements(...)`. `llms.txt`; `llms/statements-runtime.md`.
|
|
35
35
|
- `ERR_PACKAGE_PATH_NOT_EXPORTED` — `tsx -e "import …"`, or running from outside the project root; run a real file with `tsx <file.ts>` from the root. `llms/client.md`.
|
|
36
36
|
- `Missing statement: mvp:placeholder` on import — an unconfigured slot in a pulled tree; replace it with the statement it stands in for. `llms/legacy.md`.
|
|
37
|
-
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
37
|
+
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_WORKSPACE_CHANGED` (deploy over objects edited in Xano since the last sync; `details.objects`; pull first or `--overwrite`), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
38
38
|
- A CLI command reports `could not reach <url>: fetch failed (<code>)` — blocked egress, not a bad credential; fix it before `xanosdk login`, which rotates a single-use refresh token.
|
|
39
39
|
|
|
40
40
|
### CLI exit codes
|
package/llms/kinds-agent-mcp.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# Agent and MCP def shapes
|
|
2
2
|
|
|
3
|
-
> Read when
|
|
3
|
+
> Read when building an MCP server (tools, prompts, resources) or an `agent()`.
|
|
4
4
|
|
|
5
|
+
- An MCP server serves THREE primitives, and each reaches the client differently: a `tool()` is an action the MODEL calls (it may write); a `resource()` is read-only context the client APPLICATION lists and attaches by `uri` (reference docs, a schema, one record through a `{variable}` template); a `prompt()` is a message template with arguments the USER picks by name. Context a session opens with is a `resource()`; a workflow a user starts by name is a `prompt()`; data the model must fetch on its own mid-task stays a `tool()`, since a client shows the model only the resources attached to the conversation. Register each kind (`registerTools`/`registerPrompts`/`registerResources`) and list it on the server.
|
|
5
6
|
- `mcpServer({ name, guid?, description?, instructions?, docs?, enabled?, canonical?, spec?, tags?, history?, tools?, prompts?, resources?, oauth?, llm?, output? })` — an MCP toolset. `llm?`/`output?` are the same blocks `agent()` takes and are usually absent: an MCP server and an agent are ONE stored object distinguished by `type`. Returns a handle with `getPath()`/`getUrl(baseUrl)` for the Streamable-HTTP endpoint — `getUrl` is NOT idempotent, a `baseUrl` already carrying an `/x2/mcp/<…>/stream` path THROWS, so resolve ONCE from the instance base URL. Fires on an ephemeral. A TENANT rides AFTER the prefix (`/x2/mcp/tenant/<tenant>/<canonical>/<token>/stream`), not as a base-URL segment: `getUrl` LIFTS a `/tenant/<name>` out of the base and re-places it there, so `getUrl(window.XANO_HOST)` is correct as-is; concatenating them by hand builds an unregistered route that 404s. Pass `{ tenant }` when the base URL cannot name it (a tenant on its own domain).
|
|
6
7
|
- `tools?`: a `ToolsetToolEntry[]`. Pass the `tool()` HANDLES directly (`tools: [saveNote]`); use the `{ tool, enabled?, auth?, type?, resourceUri?, toolMeta? }` wrapper when an entry needs more. `type: "resource"` (+ a required `resourceUri`) is the LEGACY way to publish a tool as an MCP resource — author a `resource()` and list it in `resources` instead; `toolMeta` is extra metadata on a tool entry. The two payload fields are per-type and supplying the other one is refused, because the engine stores it against neither. `auth` names an auth **table** (a `table({ auth: true })` handle or its name) — per-tool, and the only gate there is. ⚠ It is also what gives the tool a CALLER, on an `agent()` exactly as on an MCP server. `auth()` inside a tool whose entry names no table does NOT return null: the call answers a normal result carrying `{"code":"ERROR_FATAL","message":""}`, so the model reads a successful tool result and reports success while nothing is written. A caller token does not rescue it — the ENTRY supplies identity. Spell it `{ tool: saveNote, auth: users }`; `export()` warns. An entry naming no tool THROWS at export; a deliberate raw `id: 0` warns and carries through.
|
|
7
8
|
- `prompts?` / `resources?`: `prompt()` / `resource()` HANDLES (or names), or a `{ prompt, enabled?, auth? }` / `{ resource, enabled?, auth? }` wrapper. `auth` names the auth table and is what gives the stack a caller: a prompt/resource reading `auth()` behind an entry with none answers every `prompts/get` / `resources/read` with `-32603 "Access Denied"` (`export()` warns `toolset.primitive-reads-auth-ungated`). Listing one target twice THROWS; two resources with one `uri` on one server fail `export()` (`mcp.resource-uri-duplicate`). MCP-server only — `agent()` takes tools only.
|
|
8
9
|
- `history?` is the server tier for its tools, prompts AND resources alike; an object's own `history` wins. The workspace tier (`workspaceConfig({ history })`) has `prompt` and `resource` keys, both default on.
|
|
9
10
|
- `oauth?`: per-server sign-in; omit and nothing changes. Union on `mode`; `authTable` (REQUIRED, auth `table()` handle or name) is whose row the signed-in user is — `auth()` on the whole server, `t.auth` in its trigger. Hosted (the platform is the authorization server): `{ mode: "hosted", authTable, loginUrl }` — clients are sent to `loginUrl` (YOUR page, which is also the consent screen) with `mcp_request`; show `s.mcp.oauth.request`, sign the user in, then your endpoint calls `s.mcp.oauth.complete` with their `decision` and the page redirects to the URL it binds. External (your IdP issues tokens): `{ mode: "external", authTable, issuer, column, audience?, audienceAck?, claim?, claimAck?, preset?, allowedClientIds? }` — token `claim` (default `sub`) matched against `column`; `preset` is `auth0|clerk|workos|entra|okta|cognito|generic`. `loginUrl`/`issuer`/`audience` take `env("NAME")` (resolved per environment).
|
|
10
11
|
- `export()` FAILS: hosted without `loginUrl` (`mcp.oauth-hosted-incomplete`); external without `issuer`/`column` (`mcp.oauth-external-incomplete`); `preset: "clerk"` without `allowedClientIds` (`mcp.oauth-preset-client-ids`); `claim` other than `sub`/`oid`/`email` without `claimAck` (`mcp.oauth-claim-unacked` — users can edit it at most providers). Unknown `mode`/`preset` THROWS; so do the dropped `consent`/`branding`/`trustedClients`.
|
|
11
|
-
- `prompt({ name, guid?, description?, docs?, title?, icons?, tags?, history?, input?, stack?, response?, responseShape?, middleware? })` — an MCP prompt; takes `registerPrompts`. `input` is the prompt's arguments (each field's `description`/`required`/enum `values` reach the client; enum values also answer completion requests). `response`: a text value is ONE user message; a list of `{ role: "user" | "assistant", content }` is sent in order: `s.set_var("m", obj({ list: [obj({ role: c.text("user"), content: ref("body") })] }))`, `response: ref("m.list")`. Without `response` or a top-level `s.return`, `prompts/get` fails.
|
|
12
|
+
- `prompt({ name, guid?, description?, docs?, title?, icons?, tags?, history?, input?, stack?, response?, responseShape?, middleware? })` — an MCP prompt; takes `registerPrompts`. `input` is the prompt's arguments (each field's `description`/`required`/enum `values` reach the client; enum values also answer completion requests). `response`: a text value is ONE user message; a list of `{ role: "user" | "assistant", content }` is sent in order, `content` a string or an MCP content block: `s.set_var("m", obj({ list: [obj({ role: c.text("user"), content: ref("body") })] }))`, `response: ref("m.list")`. Without `response` or a top-level `s.return`, `prompts/get` fails.
|
|
12
13
|
- `resource({ name, uri, guid?, description?, docs?, mimeType?, title?, icons?, annotations?, tags?, history?, input?, stack?, response?, responseShape?, middleware? })` — an MCP resource; takes `registerResources`. Clients address it by `uri`, never `name`.
|
|
13
14
|
- `uri`: a literal (`"docs://readme"`, no `input`) or an RFC 6570 LEVEL-1 template (`"orders://{region}/{order_id}"`). It must start with a scheme; each `{variable}` is letters/digits/`_`, one per brace pair, never two adjacent. `input` must be EXACTLY the template's variables, each a single `text`/`int`/`decimal`/`bool`/`enum`/`email`/`uuid` — anything else THROWS. A value that does not convert is refused before the stack runs.
|
|
14
15
|
- `response`: a string is returned as text; non-UTF-8 content (a file, binary) as a base64 blob. `mimeType?` omitted → derived from what the stack returns.
|
|
@@ -25,6 +26,6 @@
|
|
|
25
26
|
- `llm` (REQUIRED): typed provider settings, a discriminated union on `type` (`"xano-free" | "anthropic" | "openai" | "google-genai"`). Shared fields: `systemPrompt?`, `maxSteps?` (default `5`), and `prompt?` XOR `messages?` (genuinely exclusive: both is a type error and throws — the engine stores ONE `prompt_type`, so one would be dropped); plus provider fields (`apiKey?`, `model?`, `temperature?`, `reasoningEffort?`, …). String fields accept Twig placeholders — `{{ $args.x }}` for run inputs (the `args` of `s.ai.agent.run`), `{{ $env.NAME }}` for env vars.
|
|
26
27
|
- `tools?`: same `ToolsetToolEntry[]` as `mcpServer` — bare `tool()` handles, or a `{ tool, enabled?, auth? }` wrapper when one needs `enabled`/`auth`. A tool reading `auth()` MUST use the wrapper naming the auth table — a bare handle runs it with no caller (see `mcpServer`'s `tools?`).
|
|
27
28
|
- `output?`: `{ schema: Record<string, input.*>, enabled? }` — structured-output schema. `schema` is a named-field record authored with the `input.*` catalog, exactly like a `defineFunction`/`query` `input:` map (the stored `structuredOutputsSchema` is the same wire shape as function inputs). e.g. `output: { schema: { priority: input.enum(["low","high"]), summary: input.text() } }`. When you pass the agent *handle* to `s.ai.agent.run({ agent })`, `.result` is typed straight from this schema — no `resultShape` witness needed (the shape is declared once). `resultShape` remains only to override that, or to type an agent referenced by bare name.
|
|
28
|
-
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`.
|
|
29
|
+
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, allowToolExecution: c.bool(true), as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`. ⚠ An agent with tools needs `allowToolExecution: c.bool(true)` on the run: unset, its tools are OFF and it answers without them (warns `stack.agent-tools-off`).
|
|
29
30
|
- **Marketplace:** for chat history, use `@xano-sdk/chatbot`; for vector RAG, use `@xano-sdk/vector` (`tools: [vector.searchTool]`). Find add-ons with `xanosdk marketplace search <q>`.
|
|
30
31
|
- Both kinds persist under the `toolset` payload key, so a same-name `agent` + `mcpServer` pair derives ONE guid and `export()` throws — give them distinct names.
|
package/llms/object-kinds.md
CHANGED
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
Author with the factory, register on the Xano instance, lands under the payload key. Each line ends with a one-liner on what the primitive is.
|
|
6
6
|
|
|
7
|
+
### Choosing a kind
|
|
8
|
+
|
|
9
|
+
Choose by who or what starts the work. Each rule names the kind that fits and the one it gets mistaken for.
|
|
10
|
+
|
|
11
|
+
- **Logic other code calls** → `defineFunction`, run with `s.function.run`. A `query` is the only kind an HTTP client reaches by verb + path; a `tool` is what an `agent()` or an MCP client calls. Logic serving two callers (an endpoint AND a tool) lives in one function both call.
|
|
12
|
+
- **Work on a timer** → `task` (cron or interval). **Work a request starts but does not wait for** → `s.function.run({ fn, runtime: { mode: "async-shared" } })`, which binds a job id, not the result (collect with `s.await`). **Work that follows a row change** → `tableTrigger`: it fires on every insert/update/delete of the table, whichever stack writes it, so the same side effect placed in one endpoint's stack misses every other write path.
|
|
13
|
+
- **The same steps before or after many objects** (an auth check, a rate limit, logging) → `middleware`, attached per host (`middleware: { pre, post }` on a query, function, task, tool or API group) or to every host of a kind with `workspaceConfig({ middleware: { query, function, task, tool } })` — not a function call repeated at the top of each stack.
|
|
14
|
+
- **Related rows on returned rows** → an `addon` attached to the read through its `addon: [{ addon, as, input }]` option (`db.query`/`get`/`add`/`edit`/`patch`), merged onto each row under `as` and typed in `InferResponse` — not a second read plus a loop that stitches rows together.
|
|
15
|
+
- **AI.** An LLM running inside the backend → `agent()`, started from a stack with `s.ai.agent.run`; it has no public endpoint. An external AI client (Claude, Cursor, any MCP client) calling the backend → `mcpServer()`. Standing instructions for Xano's own builder AI → `knowledge()`; an `agent()` run never reads it. The actions either one calls → `tool()`. What an MCP server serves besides tools (`prompt()`, `resource()`) and when each fits: `llms/kinds-agent-mcp.md`.
|
|
16
|
+
- **Pushing to connected clients** → `realtimeServer` → `realtimeChannel` → `realtimeMessage` (the handler for a frame a client sends — the realtime analogue of a query). A server-side push from any stack is `s.realtime.publish`; a client polling a `query` is the substitute this replaces.
|
|
17
|
+
- **Code the typed surface cannot express** → a lambda (`s.lambda`, `fl.lambda`) for a short JavaScript body, LAST, after native filters and expressions (`llms/lambda.md`); a `microservice` for a long-running container or another language; `s.api.request` for a service that already has an HTTP API.
|
|
18
|
+
- **Tests** → `tests` on a `query`/`defineFunction`/`middleware` for that one object's input → output; a `workflowTest` for a flow across objects (`s.function.call`, `s.api.call`, `s.task.call`) asserted with `s.expect.*`.
|
|
19
|
+
- **Reacting to the platform** → `errorTrigger` (an error signature first seen, regressing, or marked fixed) and `workspaceTrigger` (branch new/merge/live). What one connection to an MCP server, agent, realtime server or channel may see or do → that object's connection trigger.
|
|
20
|
+
|
|
7
21
|
⚠ Composing a workspace from independently-authored modules: `register*` takes its defs however they arrive, but `modules.flatMap((m) => m.tables)` does NOT typecheck. `Array.prototype.flatMap` binds its element type to the FIRST element, so every later module's tables are checked against that one table's schema — the error compares two unrelated column names and mentions neither `flatMap` nor the cause. `.concat()` collapses the same way. Two spellings work: pass an array LITERAL (`registerTables([...a.tables, ...b.tables])` — spreads are fine, TypeScript infers the union across every element at once), or annotate the module array with the wide aliases `AnyTableDef` / `AnyQueryDef` / `AnyFunctionDef` / `AnyAddonDef`, exported for exactly the four def types whose generics can collapse this way. Widening the array costs nothing: the typing you need lives on the `table()`/`query()` handle you hold and pass to `s.db.*`, and is never read back off the registered array.
|
|
8
22
|
|
|
9
23
|
- function: `defineFunction` → `Xano.registerFunctions` → payload `function` — Reusable server-side logic (a custom function) callable from any stack via `s.function.run`.
|
package/llms-full.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanosdk v1.0.
|
|
1
|
+
# xanosdk v1.0.9
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -43,7 +43,7 @@ plain file read resolves them at the version you have.
|
|
|
43
43
|
- [Toolchain modules](llms/toolchain.md): Read when `package.json` has a `"xanosdk"` block or you run `xanosdk marketplace`.
|
|
44
44
|
- [Error index](llms/errors.md): Read when a request, test, build, or pull fails with a message you did not write — the string, its cause, and where the fix is.
|
|
45
45
|
- [Saved unit tests, assertions, and mocks](llms/tests.md): Read when authoring a `workflowTest()` stack, when a query/function/middleware carries `tests`, when a statement needs a `mock`, or when running a deployed environment's tests.
|
|
46
|
-
- [Agent and MCP def shapes](llms/kinds-agent-mcp.md): Read when
|
|
46
|
+
- [Agent and MCP def shapes](llms/kinds-agent-mcp.md): Read when building an MCP server (tools, prompts, resources) or an `agent()`.
|
|
47
47
|
- [Knowledge def shape](llms/kinds-knowledge.md): Read when the workspace defines a `knowledge()` item for its AI agents.
|
|
48
48
|
- [Realtime def shapes](llms/kinds-realtime.md): Read when the workspace defines a `realtimeServer()`, `realtimeChannel()`, or `realtimeMessage()` handler.
|
|
49
49
|
- [Triggers](llms/triggers.md): Read when authoring any trigger. A trigger's `stack` is a callback rather than the plain array every other kind takes, so the shape does not carry over.
|
|
@@ -498,6 +498,20 @@ Control flow & blocks (each nests a sub-stack; block specials name it `body`):
|
|
|
498
498
|
|
|
499
499
|
Author with the factory, register on the Xano instance, lands under the payload key. Each line ends with a one-liner on what the primitive is.
|
|
500
500
|
|
|
501
|
+
### Choosing a kind
|
|
502
|
+
|
|
503
|
+
Choose by who or what starts the work. Each rule names the kind that fits and the one it gets mistaken for.
|
|
504
|
+
|
|
505
|
+
- **Logic other code calls** → `defineFunction`, run with `s.function.run`. A `query` is the only kind an HTTP client reaches by verb + path; a `tool` is what an `agent()` or an MCP client calls. Logic serving two callers (an endpoint AND a tool) lives in one function both call.
|
|
506
|
+
- **Work on a timer** → `task` (cron or interval). **Work a request starts but does not wait for** → `s.function.run({ fn, runtime: { mode: "async-shared" } })`, which binds a job id, not the result (collect with `s.await`). **Work that follows a row change** → `tableTrigger`: it fires on every insert/update/delete of the table, whichever stack writes it, so the same side effect placed in one endpoint's stack misses every other write path.
|
|
507
|
+
- **The same steps before or after many objects** (an auth check, a rate limit, logging) → `middleware`, attached per host (`middleware: { pre, post }` on a query, function, task, tool or API group) or to every host of a kind with `workspaceConfig({ middleware: { query, function, task, tool } })` — not a function call repeated at the top of each stack.
|
|
508
|
+
- **Related rows on returned rows** → an `addon` attached to the read through its `addon: [{ addon, as, input }]` option (`db.query`/`get`/`add`/`edit`/`patch`), merged onto each row under `as` and typed in `InferResponse` — not a second read plus a loop that stitches rows together.
|
|
509
|
+
- **AI.** An LLM running inside the backend → `agent()`, started from a stack with `s.ai.agent.run`; it has no public endpoint. An external AI client (Claude, Cursor, any MCP client) calling the backend → `mcpServer()`. Standing instructions for Xano's own builder AI → `knowledge()`; an `agent()` run never reads it. The actions either one calls → `tool()`. What an MCP server serves besides tools (`prompt()`, `resource()`) and when each fits: `llms/kinds-agent-mcp.md`.
|
|
510
|
+
- **Pushing to connected clients** → `realtimeServer` → `realtimeChannel` → `realtimeMessage` (the handler for a frame a client sends — the realtime analogue of a query). A server-side push from any stack is `s.realtime.publish`; a client polling a `query` is the substitute this replaces.
|
|
511
|
+
- **Code the typed surface cannot express** → a lambda (`s.lambda`, `fl.lambda`) for a short JavaScript body, LAST, after native filters and expressions (`llms/lambda.md`); a `microservice` for a long-running container or another language; `s.api.request` for a service that already has an HTTP API.
|
|
512
|
+
- **Tests** → `tests` on a `query`/`defineFunction`/`middleware` for that one object's input → output; a `workflowTest` for a flow across objects (`s.function.call`, `s.api.call`, `s.task.call`) asserted with `s.expect.*`.
|
|
513
|
+
- **Reacting to the platform** → `errorTrigger` (an error signature first seen, regressing, or marked fixed) and `workspaceTrigger` (branch new/merge/live). What one connection to an MCP server, agent, realtime server or channel may see or do → that object's connection trigger.
|
|
514
|
+
|
|
501
515
|
⚠ Composing a workspace from independently-authored modules: `register*` takes its defs however they arrive, but `modules.flatMap((m) => m.tables)` does NOT typecheck. `Array.prototype.flatMap` binds its element type to the FIRST element, so every later module's tables are checked against that one table's schema — the error compares two unrelated column names and mentions neither `flatMap` nor the cause. `.concat()` collapses the same way. Two spellings work: pass an array LITERAL (`registerTables([...a.tables, ...b.tables])` — spreads are fine, TypeScript infers the union across every element at once), or annotate the module array with the wide aliases `AnyTableDef` / `AnyQueryDef` / `AnyFunctionDef` / `AnyAddonDef`, exported for exactly the four def types whose generics can collapse this way. Widening the array costs nothing: the typing you need lives on the `table()`/`query()` handle you hold and pass to `s.db.*`, and is never read back off the registered array.
|
|
502
516
|
|
|
503
517
|
- function: `defineFunction` → `Xano.registerFunctions` → payload `function` — Reusable server-side logic (a custom function) callable from any stack via `s.function.run`.
|
|
@@ -766,7 +780,7 @@ core sections still refresh; under `routes --emit --strict` it is fatal. `@xano-
|
|
|
766
780
|
- A response types as `StackTupleWidened` — a `Statement[]` helper was spread into the stack; return `statements(...)`. `llms.txt`; `llms/statements-runtime.md`.
|
|
767
781
|
- `ERR_PACKAGE_PATH_NOT_EXPORTED` — `tsx -e "import …"`, or running from outside the project root; run a real file with `tsx <file.ts>` from the root. `llms/client.md`.
|
|
768
782
|
- `Missing statement: mvp:placeholder` on import — an unconfigured slot in a pulled tree; replace it with the statement it stands in for. `llms/legacy.md`.
|
|
769
|
-
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
783
|
+
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_WORKSPACE_CHANGED` (deploy over objects edited in Xano since the last sync; `details.objects`; pull first or `--overwrite`), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
770
784
|
- A CLI command reports `could not reach <url>: fetch failed (<code>)` — blocked egress, not a bad credential; fix it before `xanosdk login`, which rotates a single-use refresh token.
|
|
771
785
|
|
|
772
786
|
### CLI exit codes
|
|
@@ -849,15 +863,16 @@ The run is isolated in ways that make a correct test fail for reasons the failur
|
|
|
849
863
|
|
|
850
864
|
# Agent and MCP def shapes
|
|
851
865
|
|
|
852
|
-
> Read when
|
|
866
|
+
> Read when building an MCP server (tools, prompts, resources) or an `agent()`.
|
|
853
867
|
|
|
868
|
+
- An MCP server serves THREE primitives, and each reaches the client differently: a `tool()` is an action the MODEL calls (it may write); a `resource()` is read-only context the client APPLICATION lists and attaches by `uri` (reference docs, a schema, one record through a `{variable}` template); a `prompt()` is a message template with arguments the USER picks by name. Context a session opens with is a `resource()`; a workflow a user starts by name is a `prompt()`; data the model must fetch on its own mid-task stays a `tool()`, since a client shows the model only the resources attached to the conversation. Register each kind (`registerTools`/`registerPrompts`/`registerResources`) and list it on the server.
|
|
854
869
|
- `mcpServer({ name, guid?, description?, instructions?, docs?, enabled?, canonical?, spec?, tags?, history?, tools?, prompts?, resources?, oauth?, llm?, output? })` — an MCP toolset. `llm?`/`output?` are the same blocks `agent()` takes and are usually absent: an MCP server and an agent are ONE stored object distinguished by `type`. Returns a handle with `getPath()`/`getUrl(baseUrl)` for the Streamable-HTTP endpoint — `getUrl` is NOT idempotent, a `baseUrl` already carrying an `/x2/mcp/<…>/stream` path THROWS, so resolve ONCE from the instance base URL. Fires on an ephemeral. A TENANT rides AFTER the prefix (`/x2/mcp/tenant/<tenant>/<canonical>/<token>/stream`), not as a base-URL segment: `getUrl` LIFTS a `/tenant/<name>` out of the base and re-places it there, so `getUrl(window.XANO_HOST)` is correct as-is; concatenating them by hand builds an unregistered route that 404s. Pass `{ tenant }` when the base URL cannot name it (a tenant on its own domain).
|
|
855
870
|
- `tools?`: a `ToolsetToolEntry[]`. Pass the `tool()` HANDLES directly (`tools: [saveNote]`); use the `{ tool, enabled?, auth?, type?, resourceUri?, toolMeta? }` wrapper when an entry needs more. `type: "resource"` (+ a required `resourceUri`) is the LEGACY way to publish a tool as an MCP resource — author a `resource()` and list it in `resources` instead; `toolMeta` is extra metadata on a tool entry. The two payload fields are per-type and supplying the other one is refused, because the engine stores it against neither. `auth` names an auth **table** (a `table({ auth: true })` handle or its name) — per-tool, and the only gate there is. ⚠ It is also what gives the tool a CALLER, on an `agent()` exactly as on an MCP server. `auth()` inside a tool whose entry names no table does NOT return null: the call answers a normal result carrying `{"code":"ERROR_FATAL","message":""}`, so the model reads a successful tool result and reports success while nothing is written. A caller token does not rescue it — the ENTRY supplies identity. Spell it `{ tool: saveNote, auth: users }`; `export()` warns. An entry naming no tool THROWS at export; a deliberate raw `id: 0` warns and carries through.
|
|
856
871
|
- `prompts?` / `resources?`: `prompt()` / `resource()` HANDLES (or names), or a `{ prompt, enabled?, auth? }` / `{ resource, enabled?, auth? }` wrapper. `auth` names the auth table and is what gives the stack a caller: a prompt/resource reading `auth()` behind an entry with none answers every `prompts/get` / `resources/read` with `-32603 "Access Denied"` (`export()` warns `toolset.primitive-reads-auth-ungated`). Listing one target twice THROWS; two resources with one `uri` on one server fail `export()` (`mcp.resource-uri-duplicate`). MCP-server only — `agent()` takes tools only.
|
|
857
872
|
- `history?` is the server tier for its tools, prompts AND resources alike; an object's own `history` wins. The workspace tier (`workspaceConfig({ history })`) has `prompt` and `resource` keys, both default on.
|
|
858
873
|
- `oauth?`: per-server sign-in; omit and nothing changes. Union on `mode`; `authTable` (REQUIRED, auth `table()` handle or name) is whose row the signed-in user is — `auth()` on the whole server, `t.auth` in its trigger. Hosted (the platform is the authorization server): `{ mode: "hosted", authTable, loginUrl }` — clients are sent to `loginUrl` (YOUR page, which is also the consent screen) with `mcp_request`; show `s.mcp.oauth.request`, sign the user in, then your endpoint calls `s.mcp.oauth.complete` with their `decision` and the page redirects to the URL it binds. External (your IdP issues tokens): `{ mode: "external", authTable, issuer, column, audience?, audienceAck?, claim?, claimAck?, preset?, allowedClientIds? }` — token `claim` (default `sub`) matched against `column`; `preset` is `auth0|clerk|workos|entra|okta|cognito|generic`. `loginUrl`/`issuer`/`audience` take `env("NAME")` (resolved per environment).
|
|
859
874
|
- `export()` FAILS: hosted without `loginUrl` (`mcp.oauth-hosted-incomplete`); external without `issuer`/`column` (`mcp.oauth-external-incomplete`); `preset: "clerk"` without `allowedClientIds` (`mcp.oauth-preset-client-ids`); `claim` other than `sub`/`oid`/`email` without `claimAck` (`mcp.oauth-claim-unacked` — users can edit it at most providers). Unknown `mode`/`preset` THROWS; so do the dropped `consent`/`branding`/`trustedClients`.
|
|
860
|
-
- `prompt({ name, guid?, description?, docs?, title?, icons?, tags?, history?, input?, stack?, response?, responseShape?, middleware? })` — an MCP prompt; takes `registerPrompts`. `input` is the prompt's arguments (each field's `description`/`required`/enum `values` reach the client; enum values also answer completion requests). `response`: a text value is ONE user message; a list of `{ role: "user" | "assistant", content }` is sent in order: `s.set_var("m", obj({ list: [obj({ role: c.text("user"), content: ref("body") })] }))`, `response: ref("m.list")`. Without `response` or a top-level `s.return`, `prompts/get` fails.
|
|
875
|
+
- `prompt({ name, guid?, description?, docs?, title?, icons?, tags?, history?, input?, stack?, response?, responseShape?, middleware? })` — an MCP prompt; takes `registerPrompts`. `input` is the prompt's arguments (each field's `description`/`required`/enum `values` reach the client; enum values also answer completion requests). `response`: a text value is ONE user message; a list of `{ role: "user" | "assistant", content }` is sent in order, `content` a string or an MCP content block: `s.set_var("m", obj({ list: [obj({ role: c.text("user"), content: ref("body") })] }))`, `response: ref("m.list")`. Without `response` or a top-level `s.return`, `prompts/get` fails.
|
|
861
876
|
- `resource({ name, uri, guid?, description?, docs?, mimeType?, title?, icons?, annotations?, tags?, history?, input?, stack?, response?, responseShape?, middleware? })` — an MCP resource; takes `registerResources`. Clients address it by `uri`, never `name`.
|
|
862
877
|
- `uri`: a literal (`"docs://readme"`, no `input`) or an RFC 6570 LEVEL-1 template (`"orders://{region}/{order_id}"`). It must start with a scheme; each `{variable}` is letters/digits/`_`, one per brace pair, never two adjacent. `input` must be EXACTLY the template's variables, each a single `text`/`int`/`decimal`/`bool`/`enum`/`email`/`uuid` — anything else THROWS. A value that does not convert is refused before the stack runs.
|
|
863
878
|
- `response`: a string is returned as text; non-UTF-8 content (a file, binary) as a base64 blob. `mimeType?` omitted → derived from what the stack returns.
|
|
@@ -874,7 +889,7 @@ The run is isolated in ways that make a correct test fail for reasons the failur
|
|
|
874
889
|
- `llm` (REQUIRED): typed provider settings, a discriminated union on `type` (`"xano-free" | "anthropic" | "openai" | "google-genai"`). Shared fields: `systemPrompt?`, `maxSteps?` (default `5`), and `prompt?` XOR `messages?` (genuinely exclusive: both is a type error and throws — the engine stores ONE `prompt_type`, so one would be dropped); plus provider fields (`apiKey?`, `model?`, `temperature?`, `reasoningEffort?`, …). String fields accept Twig placeholders — `{{ $args.x }}` for run inputs (the `args` of `s.ai.agent.run`), `{{ $env.NAME }}` for env vars.
|
|
875
890
|
- `tools?`: same `ToolsetToolEntry[]` as `mcpServer` — bare `tool()` handles, or a `{ tool, enabled?, auth? }` wrapper when one needs `enabled`/`auth`. A tool reading `auth()` MUST use the wrapper naming the auth table — a bare handle runs it with no caller (see `mcpServer`'s `tools?`).
|
|
876
891
|
- `output?`: `{ schema: Record<string, input.*>, enabled? }` — structured-output schema. `schema` is a named-field record authored with the `input.*` catalog, exactly like a `defineFunction`/`query` `input:` map (the stored `structuredOutputsSchema` is the same wire shape as function inputs). e.g. `output: { schema: { priority: input.enum(["low","high"]), summary: input.text() } }`. When you pass the agent *handle* to `s.ai.agent.run({ agent })`, `.result` is typed straight from this schema — no `resultShape` witness needed (the shape is declared once). `resultShape` remains only to override that, or to type an agent referenced by bare name.
|
|
877
|
-
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`.
|
|
892
|
+
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, allowToolExecution: c.bool(true), as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`. ⚠ An agent with tools needs `allowToolExecution: c.bool(true)` on the run: unset, its tools are OFF and it answers without them (warns `stack.agent-tools-off`).
|
|
878
893
|
- **Marketplace:** for chat history, use `@xano-sdk/chatbot`; for vector RAG, use `@xano-sdk/vector` (`tools: [vector.searchTool]`). Find add-ons with `xanosdk marketplace search <q>`.
|
|
879
894
|
- Both kinds persist under the `toolset` payload key, so a same-name `agent` + `mcpServer` pair derives ONE guid and `export()` throws — give them distinct names.
|
|
880
895
|
|
package/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanosdk v1.0.
|
|
1
|
+
# xanosdk v1.0.9
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -43,7 +43,7 @@ plain file read resolves them at the version you have.
|
|
|
43
43
|
- [Toolchain modules](llms/toolchain.md): Read when `package.json` has a `"xanosdk"` block or you run `xanosdk marketplace`.
|
|
44
44
|
- [Error index](llms/errors.md): Read when a request, test, build, or pull fails with a message you did not write — the string, its cause, and where the fix is.
|
|
45
45
|
- [Saved unit tests, assertions, and mocks](llms/tests.md): Read when authoring a `workflowTest()` stack, when a query/function/middleware carries `tests`, when a statement needs a `mock`, or when running a deployed environment's tests.
|
|
46
|
-
- [Agent and MCP def shapes](llms/kinds-agent-mcp.md): Read when
|
|
46
|
+
- [Agent and MCP def shapes](llms/kinds-agent-mcp.md): Read when building an MCP server (tools, prompts, resources) or an `agent()`.
|
|
47
47
|
- [Knowledge def shape](llms/kinds-knowledge.md): Read when the workspace defines a `knowledge()` item for its AI agents.
|
|
48
48
|
- [Realtime def shapes](llms/kinds-realtime.md): Read when the workspace defines a `realtimeServer()`, `realtimeChannel()`, or `realtimeMessage()` handler.
|
|
49
49
|
- [Triggers](llms/triggers.md): Read when authoring any trigger. A trigger's `stack` is a callback rather than the plain array every other kind takes, so the shape does not carry over.
|
package/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xanosdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.",
|
|
5
5
|
"coverage": {
|
|
6
6
|
"objectKinds": {
|
|
@@ -9118,6 +9118,10 @@
|
|
|
9118
9118
|
"flag": "--allow-shared-schema-changes",
|
|
9119
9119
|
"description": "Proceed even though table/microservice changes reach every branch — only with --to"
|
|
9120
9120
|
},
|
|
9121
|
+
{
|
|
9122
|
+
"flag": "--overwrite",
|
|
9123
|
+
"description": "Deploy over objects changed in Xano since the last deploy or pull (see `workspace diff`) — only with --to"
|
|
9124
|
+
},
|
|
9121
9125
|
{
|
|
9122
9126
|
"flag": "--allow-branch-deletion",
|
|
9123
9127
|
"description": "Acknowledge that --replace permanently deletes the workspace's other branches — only with --to"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xano/sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Xano SDK — your Xano backend as TypeScript. `xanosdk deploy` ships your typed workspace (and an optional static frontend) to a live, auto-expiring ephemeral environment and prints its URL. init → deploy → URL.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xanosdk",
|
|
@@ -14,8 +14,8 @@ description: >-
|
|
|
14
14
|
FastAPI) unless the user asks for Xano.
|
|
15
15
|
license: MIT
|
|
16
16
|
metadata:
|
|
17
|
-
xanosdk-version: "1.0.
|
|
18
|
-
xanosdk-digest: "sha256:
|
|
17
|
+
xanosdk-version: "1.0.9"
|
|
18
|
+
xanosdk-digest: "sha256:4c4c096cd062d4c4cf8066389104c392ea35aac52bffbd8220da4544f0d71f00"
|
|
19
19
|
---
|
|
20
20
|
|
|
21
21
|
# Xano backend
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
assertNoMergeFlags,
|
|
3
|
-
derivedPromoteLabel,
|
|
4
|
-
isDerivedPromoteLabel,
|
|
5
|
-
reportNotRun,
|
|
6
|
-
runPromoteCommand
|
|
7
|
-
} from "./chunk-7XXWKTCE.js";
|
|
8
|
-
import "./chunk-5ZG7V2VW.js";
|
|
9
|
-
import "./chunk-DXZTL7NA.js";
|
|
10
|
-
import "./chunk-SGK3PTTM.js";
|
|
11
|
-
import "./chunk-B3P25SDP.js";
|
|
12
|
-
import "./chunk-IPNN2KRW.js";
|
|
13
|
-
import "./chunk-LBJA7IEM.js";
|
|
14
|
-
import "./chunk-I6XRUU6U.js";
|
|
15
|
-
import "./chunk-RRMH7WMY.js";
|
|
16
|
-
import "./chunk-JI3BLXWQ.js";
|
|
17
|
-
import "./chunk-NV37YGOV.js";
|
|
18
|
-
import "./chunk-N3YFCFCO.js";
|
|
19
|
-
import "./chunk-7M6JP3FS.js";
|
|
20
|
-
import "./chunk-BSVQEKHO.js";
|
|
21
|
-
import "./chunk-FNLTFOUD.js";
|
|
22
|
-
import "./chunk-H2K4GFUS.js";
|
|
23
|
-
import "./chunk-2YER2J47.js";
|
|
24
|
-
import "./chunk-VAGSKUWC.js";
|
|
25
|
-
import "./chunk-L472YIGG.js";
|
|
26
|
-
import "./chunk-567KK6XF.js";
|
|
27
|
-
import "./chunk-2SD4LA22.js";
|
|
28
|
-
import "./chunk-3DRXWLJ5.js";
|
|
29
|
-
import "./chunk-X4DVXBFY.js";
|
|
30
|
-
import "./chunk-M2C54ZBC.js";
|
|
31
|
-
import "./chunk-GHMLRFRX.js";
|
|
32
|
-
import "./chunk-JOOKM7AH.js";
|
|
33
|
-
import "./chunk-2TFRR6JV.js";
|
|
34
|
-
import "./chunk-IYXL5NYU.js";
|
|
35
|
-
import "./chunk-BZ6WTG3E.js";
|
|
36
|
-
import "./chunk-DG3APBUJ.js";
|
|
37
|
-
import "./chunk-VIJ5D3RC.js";
|
|
38
|
-
import "./chunk-PV25BDCH.js";
|
|
39
|
-
import "./chunk-B2URJBC4.js";
|
|
40
|
-
import "./chunk-S46ODQRA.js";
|
|
41
|
-
import "./chunk-TWVUYS63.js";
|
|
42
|
-
import "./chunk-26LHXLD3.js";
|
|
43
|
-
import "./chunk-ZJOAWRED.js";
|
|
44
|
-
import "./chunk-MBL7CXJ7.js";
|
|
45
|
-
import "./chunk-YH2JVJAO.js";
|
|
46
|
-
import "./chunk-VNDR2T35.js";
|
|
47
|
-
import "./chunk-EPFDY5JU.js";
|
|
48
|
-
import "./chunk-A4R5CAY4.js";
|
|
49
|
-
import "./chunk-LCOCRJ4K.js";
|
|
50
|
-
import "./chunk-WNCW2RNB.js";
|
|
51
|
-
import "./chunk-QGIZLFAS.js";
|
|
52
|
-
import "./chunk-2MNLRIOX.js";
|
|
53
|
-
import "./chunk-AKERAUNH.js";
|
|
54
|
-
import "./chunk-CJDPSCMX.js";
|
|
55
|
-
import "./chunk-ZXRDD3Q2.js";
|
|
56
|
-
import "./chunk-PY722CHR.js";
|
|
57
|
-
import "./chunk-ZGLNHA7T.js";
|
|
58
|
-
import "./chunk-ORGNLQN6.js";
|
|
59
|
-
import "./chunk-ZYJP6BOO.js";
|
|
60
|
-
import "./chunk-QO6BVGS5.js";
|
|
61
|
-
import "./chunk-PEX4QZVI.js";
|
|
62
|
-
import "./chunk-MYZRMSPM.js";
|
|
63
|
-
import "./chunk-UYFUIHH3.js";
|
|
64
|
-
import "./chunk-622HUCZT.js";
|
|
65
|
-
import "./chunk-3FRGNBOC.js";
|
|
66
|
-
import "./chunk-NDJAKSE7.js";
|
|
67
|
-
import "./chunk-EUUUMY7J.js";
|
|
68
|
-
import "./chunk-5SCPRXFB.js";
|
|
69
|
-
import "./chunk-DIWF7L33.js";
|
|
70
|
-
import "./chunk-D5OZRJ3T.js";
|
|
71
|
-
import "./chunk-EF4MHLEW.js";
|
|
72
|
-
import "./chunk-ZFDZKNGG.js";
|
|
73
|
-
import "./chunk-FWD7AL6N.js";
|
|
74
|
-
import "./chunk-47XT6WQL.js";
|
|
75
|
-
import "./chunk-DXUICABI.js";
|
|
76
|
-
import "./chunk-L6HZ67P6.js";
|
|
77
|
-
import "./chunk-4KHEMC32.js";
|
|
78
|
-
import "./chunk-FDTET7FZ.js";
|
|
79
|
-
import "./chunk-MFWF2NZJ.js";
|
|
80
|
-
import "./chunk-DNBP4GJN.js";
|
|
81
|
-
import "./chunk-CNZASQPL.js";
|
|
82
|
-
import "./chunk-WAVNUTMT.js";
|
|
83
|
-
import "./chunk-ARWMVNDJ.js";
|
|
84
|
-
import "./chunk-LLNZGEFK.js";
|
|
85
|
-
import "./chunk-HU7F56VF.js";
|
|
86
|
-
import "./chunk-MF4W6FHU.js";
|
|
87
|
-
import "./chunk-X2NL4KUO.js";
|
|
88
|
-
import "./chunk-4GPIOIAC.js";
|
|
89
|
-
import "./chunk-SKEG3V2V.js";
|
|
90
|
-
import "./chunk-E763QI3G.js";
|
|
91
|
-
import "./chunk-BRANWM4U.js";
|
|
92
|
-
import "./chunk-5GIOCDUM.js";
|
|
93
|
-
import "./chunk-LJM5CIY4.js";
|
|
94
|
-
import "./chunk-7THDHQ4R.js";
|
|
95
|
-
import "./chunk-3YW23UFH.js";
|
|
96
|
-
import "./chunk-7REDHC4N.js";
|
|
97
|
-
import "./chunk-CH23ONYG.js";
|
|
98
|
-
import "./chunk-FQ53GTII.js";
|
|
99
|
-
import "./chunk-VJFMUJWZ.js";
|
|
100
|
-
import "./chunk-6JAEMMZ7.js";
|
|
101
|
-
import "./chunk-5QMJOE2K.js";
|
|
102
|
-
import "./chunk-45ZUMF4E.js";
|
|
103
|
-
import "./chunk-7KPKDHHI.js";
|
|
104
|
-
import "./chunk-7FIMUFBP.js";
|
|
105
|
-
import "./chunk-T4LJ5UR2.js";
|
|
106
|
-
import "./chunk-ICK36EGF.js";
|
|
107
|
-
import "./chunk-BEXZ4XRV.js";
|
|
108
|
-
import "./chunk-ETAZIGNT.js";
|
|
109
|
-
import "./chunk-GSGDWJB5.js";
|
|
110
|
-
import "./chunk-SLGJIWCY.js";
|
|
111
|
-
import "./chunk-ERVIASGL.js";
|
|
112
|
-
import "./chunk-VTMTIBKP.js";
|
|
113
|
-
import "./chunk-H2V3N23D.js";
|
|
114
|
-
import "./chunk-3JDU4VRL.js";
|
|
115
|
-
import "./chunk-WTPZRR4I.js";
|
|
116
|
-
import "./chunk-YHB34BN6.js";
|
|
117
|
-
import "./chunk-UTI5G6OJ.js";
|
|
118
|
-
import "./chunk-5KJBWIDZ.js";
|
|
119
|
-
import "./chunk-5ZSO4T2G.js";
|
|
120
|
-
import "./chunk-VQPDATQT.js";
|
|
121
|
-
import "./chunk-UDZX2ZL4.js";
|
|
122
|
-
import "./chunk-ZY55DO5P.js";
|
|
123
|
-
import "./chunk-A2AOUBJS.js";
|
|
124
|
-
import "./chunk-TFFGOFVZ.js";
|
|
125
|
-
import "./chunk-7VR4IO5B.js";
|
|
126
|
-
import "./chunk-EHP3WPEG.js";
|
|
127
|
-
import "./chunk-D3KEPRRN.js";
|
|
128
|
-
import "./chunk-Q7DGTQ5G.js";
|
|
129
|
-
import "./chunk-4XHAT7C5.js";
|
|
130
|
-
import "./chunk-S56YBYMN.js";
|
|
131
|
-
import "./chunk-UVF45BVU.js";
|
|
132
|
-
import "./chunk-VAX3UZOY.js";
|
|
133
|
-
import "./chunk-LL6ED5IB.js";
|
|
134
|
-
import "./chunk-4BW2SG2N.js";
|
|
135
|
-
import "./chunk-JIKGT7DO.js";
|
|
136
|
-
import "./chunk-4MIV244X.js";
|
|
137
|
-
import "./chunk-OHX6MIUZ.js";
|
|
138
|
-
import "./chunk-36JUQZVQ.js";
|
|
139
|
-
import "./chunk-PZ5AY32C.js";
|
|
140
|
-
export {
|
|
141
|
-
assertNoMergeFlags,
|
|
142
|
-
derivedPromoteLabel,
|
|
143
|
-
isDerivedPromoteLabel,
|
|
144
|
-
reportNotRun,
|
|
145
|
-
runPromoteCommand
|
|
146
|
-
};
|
|
147
|
-
//# sourceMappingURL=promote-command-BDRPG6UU.js.map
|