@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.
Files changed (226) hide show
  1. package/CHANGELOG.md +32 -5
  2. package/README.md +2 -0
  3. package/dist/.build-fingerprint +1 -1
  4. package/dist/{agent-file-refresh-DGGSRPJ4.js → agent-file-refresh-XXCQOTWN.js} +10 -10
  5. package/dist/{agent-skill-command-37DFYS7Q.js → agent-skill-command-VDSMXH4M.js} +42 -42
  6. package/dist/{answer-shape-RBFDCNZ7.js → answer-shape-UMQRXMCX.js} +5 -5
  7. package/dist/{backend-dir-KDD43X7K.js → backend-dir-G44PETFO.js} +10 -10
  8. package/dist/{backend-slot-TBOVZXDE.js → backend-slot-TTRNOQF5.js} +4 -4
  9. package/dist/bin.js +43 -43
  10. package/dist/{branch-7PIKNUD7.js → branch-Q7CDJRU6.js} +9 -9
  11. package/dist/{branch-commands-EGY7ZEZE.js → branch-commands-Q6E66PMM.js} +24 -24
  12. package/dist/bundle.js +2 -2
  13. package/dist/{chunk-VNDR2T35.js → chunk-2VWSUG2B.js} +7 -7
  14. package/dist/{chunk-7VR4IO5B.js → chunk-3P35HT64.js} +2 -2
  15. package/dist/{chunk-HZ6ADG3O.js → chunk-3UZQ5TMG.js} +5 -5
  16. package/dist/{chunk-567KK6XF.js → chunk-3XSTC3TM.js} +4 -4
  17. package/dist/{chunk-FENA7K7C.js → chunk-4JKXGPXB.js} +3 -3
  18. package/dist/{chunk-D5OZRJ3T.js → chunk-5BEK7YKY.js} +6 -6
  19. package/dist/{chunk-ARWMVNDJ.js → chunk-5QOV52V4.js} +2 -2
  20. package/dist/{chunk-ZJOAWRED.js → chunk-5VOGPS5O.js} +4 -4
  21. package/dist/{chunk-EPFDY5JU.js → chunk-5Y5HWQ2P.js} +2 -2
  22. package/dist/{chunk-T4LJ5UR2.js → chunk-6BOKCTCM.js} +52 -22
  23. package/dist/{chunk-5SCPRXFB.js → chunk-6IOQRBRX.js} +3 -3
  24. package/dist/{chunk-FNLTFOUD.js → chunk-6NEV2PEC.js} +2 -2
  25. package/dist/{chunk-47XT6WQL.js → chunk-6PTITS3M.js} +5 -5
  26. package/dist/{chunk-3FRGNBOC.js → chunk-6S263KTM.js} +2 -2
  27. package/dist/{chunk-JI3BLXWQ.js → chunk-6YOH2L3G.js} +11 -5
  28. package/dist/{chunk-5QMJOE2K.js → chunk-6ZFJEJXZ.js} +5 -3
  29. package/dist/{chunk-M2C54ZBC.js → chunk-75MKIQON.js} +4 -4
  30. package/dist/{chunk-SDGV76HF.js → chunk-76UAME77.js} +2 -2
  31. package/dist/{chunk-26LHXLD3.js → chunk-7JKNWDYN.js} +2 -2
  32. package/dist/{chunk-JOWY6HFL.js → chunk-7MPI7NIW.js} +3 -3
  33. package/dist/{chunk-HTQWAQRW.js → chunk-ADKC3EII.js} +3 -3
  34. package/dist/{chunk-EF4MHLEW.js → chunk-B3NH5UBI.js} +4 -4
  35. package/dist/{chunk-SLGJIWCY.js → chunk-B5N6EWOM.js} +2 -2
  36. package/dist/{chunk-CT3J5JRZ.js → chunk-BUTGFWWA.js} +7 -7
  37. package/dist/{chunk-UYFUIHH3.js → chunk-C2GHFADU.js} +2 -2
  38. package/dist/{chunk-CH23ONYG.js → chunk-C6KBZH7M.js} +7 -2
  39. package/dist/{chunk-ZGLNHA7T.js → chunk-CXWCWYX3.js} +4 -4
  40. package/dist/{chunk-YCUDOF6Q.js → chunk-DDUOMOIP.js} +15 -15
  41. package/dist/{chunk-AVS4WPPY.js → chunk-DSD2NNTX.js} +2 -2
  42. package/dist/{chunk-JX6N73H3.js → chunk-DY3EJWWH.js} +2 -2
  43. package/dist/{chunk-SKEG3V2V.js → chunk-EKTIGGFO.js} +2 -2
  44. package/dist/{chunk-A4R5CAY4.js → chunk-F3IA3YWI.js} +1 -1
  45. package/dist/{chunk-EU32BC5B.js → chunk-FFB3YCUO.js} +8 -8
  46. package/dist/{chunk-B3P25SDP.js → chunk-GAU2FCT7.js} +5 -5
  47. package/dist/{chunk-NV37YGOV.js → chunk-GHPC52TD.js} +6 -6
  48. package/dist/{chunk-FDTET7FZ.js → chunk-GN5SQMIQ.js} +4 -4
  49. package/dist/{chunk-QRQ54LUI.js → chunk-H3ZBAR2L.js} +10 -10
  50. package/dist/{chunk-5ZG7V2VW.js → chunk-HBFXR4OJ.js} +3 -3
  51. package/dist/{chunk-BZ6WTG3E.js → chunk-HETQSTGG.js} +4 -4
  52. package/dist/{chunk-RBU2YX22.js → chunk-HFOGQIII.js} +2 -2
  53. package/dist/{chunk-7M6JP3FS.js → chunk-HQPL34O6.js} +2 -2
  54. package/dist/{chunk-BSVQEKHO.js → chunk-HTP2CLRQ.js} +5 -5
  55. package/dist/{chunk-CPN6WSBH.js → chunk-HVPSDQJB.js} +3 -3
  56. package/dist/{chunk-SGK3PTTM.js → chunk-HVSIS47X.js} +43 -43
  57. package/dist/{chunk-IYXL5NYU.js → chunk-I53OTC3O.js} +2 -2
  58. package/dist/{chunk-NDJAKSE7.js → chunk-IB6SKACE.js} +4 -4
  59. package/dist/{chunk-YH2JVJAO.js → chunk-IFCQCM2Q.js} +8 -8
  60. package/dist/{chunk-TWVUYS63.js → chunk-INAM6KR6.js} +15 -15
  61. package/dist/{chunk-DIWF7L33.js → chunk-KDS4PDFD.js} +3 -3
  62. package/dist/{chunk-D3KEPRRN.js → chunk-LTPF25L2.js} +2 -1
  63. package/dist/{chunk-WNCW2RNB.js → chunk-NFSUGVDY.js} +4 -4
  64. package/dist/{chunk-ZXRDD3Q2.js → chunk-NI56XX5Z.js} +3 -3
  65. package/dist/{chunk-LBJA7IEM.js → chunk-O376UAZS.js} +2 -2
  66. package/dist/{chunk-JOOKM7AH.js → chunk-OBJ7FQDX.js} +2 -2
  67. package/dist/{chunk-VJFMUJWZ.js → chunk-OHTHG3LL.js} +2 -2
  68. package/dist/{chunk-L472YIGG.js → chunk-OYRQLU66.js} +8 -8
  69. package/dist/{chunk-S46ODQRA.js → chunk-PBK257CI.js} +2 -2
  70. package/dist/{chunk-AKERAUNH.js → chunk-PFW7WFAT.js} +4 -4
  71. package/dist/{chunk-2SD4LA22.js → chunk-QC3MKMDK.js} +2 -2
  72. package/dist/{chunk-7XXWKTCE.js → chunk-QGDT52FA.js} +29 -29
  73. package/dist/{chunk-CNZASQPL.js → chunk-QL3ZJWGG.js} +2 -2
  74. package/dist/{chunk-IPNN2KRW.js → chunk-QTMXJQZN.js} +3 -3
  75. package/dist/{chunk-WUEPP5HD.js → chunk-QXOBZSQD.js} +4 -4
  76. package/dist/{chunk-VAGSKUWC.js → chunk-R3LANPQZ.js} +3 -3
  77. package/dist/{chunk-M3NEK3LT.js → chunk-R4NOZBOY.js} +4 -4
  78. package/dist/{chunk-ORGNLQN6.js → chunk-S42TFTM5.js} +3 -3
  79. package/dist/{chunk-2ACWDSAQ.js → chunk-S5RZYUP2.js} +3 -3
  80. package/dist/{chunk-B2URJBC4.js → chunk-SGYDFEXD.js} +14 -14
  81. package/dist/{chunk-O56DQKPL.js → chunk-SSOTLVOJ.js} +9 -9
  82. package/dist/{chunk-FQ53GTII.js → chunk-T3ZVNOJC.js} +6 -6
  83. package/dist/{chunk-MYZRMSPM.js → chunk-TG65NWUR.js} +2 -2
  84. package/dist/{chunk-L6HZ67P6.js → chunk-TR7EOUQE.js} +2 -2
  85. package/dist/{chunk-DG3APBUJ.js → chunk-U7XSQXOA.js} +84 -80
  86. package/dist/{chunk-PEX4QZVI.js → chunk-ULUUOUQX.js} +2 -2
  87. package/dist/{chunk-I6XRUU6U.js → chunk-UZUY6VPB.js} +117 -49
  88. package/dist/{chunk-PY722CHR.js → chunk-VD7YTLWL.js} +2 -2
  89. package/dist/{chunk-RRMH7WMY.js → chunk-VHV25AAO.js} +7 -7
  90. package/dist/{chunk-MBL7CXJ7.js → chunk-VJTTTIIB.js} +2 -2
  91. package/dist/{chunk-N3YFCFCO.js → chunk-WKCA66SH.js} +14 -14
  92. package/dist/{chunk-U5M7T6CI.js → chunk-WLFANUXE.js} +7 -7
  93. package/dist/{chunk-PEIBGH2V.js → chunk-XLQT3CCF.js} +22 -22
  94. package/dist/{chunk-2XWVZRL6.js → chunk-XPLBTV77.js} +7 -7
  95. package/dist/{chunk-VIJ5D3RC.js → chunk-XQO4A4Q4.js} +3 -3
  96. package/dist/{chunk-DXZTL7NA.js → chunk-XTUYIX5H.js} +39 -39
  97. package/dist/{chunk-PV25BDCH.js → chunk-Y2LKSXFK.js} +4 -4
  98. package/dist/{chunk-46PATL23.js → chunk-Y3FM4BSZ.js} +3 -3
  99. package/dist/{chunk-QGIZLFAS.js → chunk-YE7MHW45.js} +4 -4
  100. package/dist/{chunk-YHB34BN6.js → chunk-YEH5OIPF.js} +2 -1
  101. package/dist/{chunk-ELPQTDW6.js → chunk-YMVCKGY2.js} +73 -72
  102. package/dist/{chunk-H2K4GFUS.js → chunk-YP76ZCQ5.js} +4 -4
  103. package/dist/{chunk-GHMLRFRX.js → chunk-YVXUYDHC.js} +5 -5
  104. package/dist/{chunk-V7MBRUK6.js → chunk-ZO3QWFNV.js} +3 -3
  105. package/dist/{chunk-2YER2J47.js → chunk-ZYPEH64F.js} +5 -5
  106. package/dist/cli.d.ts +8 -1
  107. package/dist/cli.js +41 -41
  108. package/dist/{codegen-command-T7TC7PQO.js → codegen-command-KZJ7LYHW.js} +61 -61
  109. package/dist/{commands-JDENTDJS.js → commands-FOHIPDKZ.js} +3 -3
  110. package/dist/{completion-YFD5OVJW.js → completion-XUBGMKGV.js} +3 -3
  111. package/dist/{config-YJFUTRJW.js → config-544VCRKP.js} +4 -4
  112. package/dist/{deploy-command-OEVEE6UG.js → deploy-command-RXPJAM7M.js} +48 -48
  113. package/dist/{deploy-source-HYVZEYXV.js → deploy-source-TD77W4SA.js} +28 -28
  114. package/dist/{dev-env-sync-EFDCJ6KU.js → dev-env-sync-2UCNSIJL.js} +42 -42
  115. package/dist/{diagnostics-OMN5Y2AH.js → diagnostics-FNVNRYMB.js} +2 -2
  116. package/dist/{display-name-hint-SW3GB3V7.js → display-name-hint-EZQK2PDU.js} +11 -11
  117. package/dist/{emit-Dov_92kn.d.ts → emit-D-a6JznN.d.ts} +22 -16
  118. package/dist/{env-example-refresh-WNSOH534.js → env-example-refresh-QKZI26F2.js} +62 -62
  119. package/dist/{env-pull-command-UYEXMQ3P.js → env-pull-command-72PQOMKW.js} +40 -40
  120. package/dist/{env-target-JBSLBKNX.js → env-target-AZJ4JXT7.js} +10 -10
  121. package/dist/{env-var-command-BJNRAXNV.js → env-var-command-ALJITZDL.js} +38 -38
  122. package/dist/{ephemeral-CEOGMIEA.js → ephemeral-H24NF6WP.js} +9 -9
  123. package/dist/{ephemeral-command-IPSGBCS5.js → ephemeral-command-T276HQBO.js} +41 -41
  124. package/dist/{ephemeral-state-MTBASPRS.js → ephemeral-state-YLZQIOBF.js} +8 -8
  125. package/dist/{generate-command-XQXODBS6.js → generate-command-M6LAT4XU.js} +66 -66
  126. package/dist/{gitignore-RUVCIZO4.js → gitignore-V6QHYKIR.js} +14 -14
  127. package/dist/{guards-KYEOCVHN.js → guards-4VPSEOAI.js} +6 -4
  128. package/dist/{impersonate-command-MA27O7S5.js → impersonate-command-S6PYDMHQ.js} +34 -34
  129. package/dist/{import-XKRFHABE.js → import-TXYVFYJS.js} +5 -5
  130. package/dist/index.d.ts +4 -4
  131. package/dist/index.js +8 -8
  132. package/dist/{init-command-6RDTCMAB.js → init-command-ENAZKPZA.js} +46 -46
  133. package/dist/{init-modules-DHTBOCQT.js → init-modules-AIKWWTVQ.js} +8 -8
  134. package/dist/{init-web-ELBXSXDL.js → init-web-MSXDARRF.js} +3 -3
  135. package/dist/internal.d.ts +4 -4
  136. package/dist/internal.js +29 -12
  137. package/dist/{keep-data-merge-TDJOIAVT.js → keep-data-merge-3WPUPPTY.js} +23 -23
  138. package/dist/{landing-record-TPPYFQAS.js → landing-record-SJ5HG7T5.js} +16 -16
  139. package/dist/{live-diff-5E2BQWQ7.js → live-diff-CGTGOH3S.js} +3 -3
  140. package/dist/{local-engine-choice-S6VHPJRU.js → local-engine-choice-BD5O7SAU.js} +31 -31
  141. package/dist/{local-engine-command-4EZCGZ6M.js → local-engine-command-MXQUXXAA.js} +36 -36
  142. package/dist/{local-engine-config-2EBL3QKA.js → local-engine-config-6CB6FOEJ.js} +2 -2
  143. package/dist/{local-engine-deploy-FOPNWU7X.js → local-engine-deploy-ID4JJXB5.js} +14 -14
  144. package/dist/{local-engine-lookup-GM3E3NPP.js → local-engine-lookup-IC7BKAYP.js} +4 -4
  145. package/dist/{local-engine-mcp-bridge-QKZHUGW3.js → local-engine-mcp-bridge-3SOJMZ5T.js} +5 -5
  146. package/dist/{local-engine-mcp-command-BFQVLXZC.js → local-engine-mcp-command-6G3TDWDI.js} +39 -39
  147. package/dist/{local-engine-process-XUQPQENQ.js → local-engine-process-HG5BGG3F.js} +9 -9
  148. package/dist/{local-engine-state-JQPKGB65.js → local-engine-state-JZHTKHDG.js} +3 -3
  149. package/dist/{local-engine-update-check-S7UF6ZF5.js → local-engine-update-check-SKZR7YSC.js} +6 -6
  150. package/dist/{lock-commands-HJ6Y5QVS.js → lock-commands-SUPQOEVU.js} +46 -46
  151. package/dist/{login-command-JO55NZAS.js → login-command-LTYO3EK7.js} +22 -22
  152. package/dist/{logout-command-MPRIRSJA.js → logout-command-QRRT36DY.js} +13 -13
  153. package/dist/{loop-SUB6C2LK.js → loop-XFDS65OD.js} +3 -3
  154. package/dist/{marketplace-command-BM6G257N.js → marketplace-command-POQH5GVT.js} +29 -29
  155. package/dist/{marketplace-resolve-AWH3RG57.js → marketplace-resolve-PWEYJ2XS.js} +6 -6
  156. package/dist/{meta-client-AOSWODQQ.js → meta-client-PDUP4EOW.js} +11 -11
  157. package/dist/{module-manifest-GXI46PEF.js → module-manifest-KY7J63HG.js} +4 -4
  158. package/dist/node.d.ts +4 -4
  159. package/dist/node.js +47 -47
  160. package/dist/{operation-outcome-4UKPXTNC.js → operation-outcome-IXMC5SBN.js} +22 -22
  161. package/dist/{output-target-RAZ4KN5J.js → output-target-4XN43WIB.js} +15 -15
  162. package/dist/{plan-disclosure-JR52DWXN.js → plan-disclosure-GNLDYV2A.js} +15 -15
  163. package/dist/{plugin-contributions-E6XHLQWK.js → plugin-contributions-PAGG6SUP.js} +5 -5
  164. package/dist/{plugin-prompt-IODX5EU6.js → plugin-prompt-2MX6LF6X.js} +5 -5
  165. package/dist/{plugin-questions-AAAJ7POP.js → plugin-questions-AP6VUTOB.js} +4 -4
  166. package/dist/{preflight-command-7GKJBWOQ.js → preflight-command-QWZL4O2N.js} +53 -53
  167. package/dist/{profile-command-CM6J7E2M.js → profile-command-V6WFDYZW.js} +23 -23
  168. package/dist/{profile-pointer-KTYXL6FU.js → profile-pointer-4HJQH5ZR.js} +4 -4
  169. package/dist/{project-dependency-OQ5575QQ.js → project-dependency-ORX45I74.js} +7 -7
  170. package/dist/{project-sdk-2ESHHZVL.js → project-sdk-IYMFVQRC.js} +4 -4
  171. package/dist/promote-command-B3QODJNT.js +147 -0
  172. package/dist/{prompt-MQPGU4ZI.js → prompt-ZZUYWFQX.js} +4 -4
  173. package/dist/{publish-command-IEMYZ7LF.js → publish-command-JOL6LXH6.js} +51 -51
  174. package/dist/{pull-command-S5E2ABZ4.js → pull-command-RPGL6LXP.js} +64 -64
  175. package/dist/{pull-superseded-E34BZVLH.js → pull-superseded-UZ3MB53B.js} +4 -4
  176. package/dist/{release-command-7F5TBKO2.js → release-command-USZAWVXO.js} +59 -59
  177. package/dist/{release-ns-command-EK2ZQ4CC.js → release-ns-command-3XDRQKJD.js} +75 -75
  178. package/dist/{retry-command-GL5HCMVB.js → retry-command-VZYLYDVX.js} +8 -8
  179. package/dist/{routes-manifest-YR4ZIMLM.js → routes-manifest-RIZGSOZC.js} +4 -4
  180. package/dist/{routes-manifest-file-LCIKPDAG.js → routes-manifest-file-V5JJVIPH.js} +7 -7
  181. package/dist/{secrets-file-LXREYU3M.js → secrets-file-ZA6K4J6W.js} +14 -14
  182. package/dist/{secrets-fill-command-QHZS3KWM.js → secrets-fill-command-MH53XR45.js} +45 -45
  183. package/dist/{seed-FRKMDN2Z.js → seed-KEPIS7UZ.js} +5 -5
  184. package/dist/{source-resolve-BBHYTOXI.js → source-resolve-I55GN6ZC.js} +20 -20
  185. package/dist/{static-host-7LC7OZR4.js → static-host-JAOT3N3E.js} +5 -5
  186. package/dist/{status-command-TY253MJT.js → status-command-I6S2TVAY.js} +35 -35
  187. package/dist/{store-VJ3OS6VO.js → store-YFNDD6GZ.js} +6 -6
  188. package/dist/{store-Boba9OOh.d.ts → store-xUySg-KR.d.ts} +1 -1
  189. package/dist/{sync-baseline-DOV5AGIO.js → sync-baseline-3CDL4PKT.js} +7 -5
  190. package/dist/{sync-contributions-63542VE4.js → sync-contributions-4HHBUGJ4.js} +9 -9
  191. package/dist/{sync-record-RGHK7EAL.js → sync-record-U65BCPSP.js} +10 -10
  192. package/dist/{table-OAYGFGEN.js → table-E5YTK7QX.js} +7 -7
  193. package/dist/{tables-command-PZIVDAH3.js → tables-command-L4JRA7JF.js} +34 -34
  194. package/dist/{tenant-Y3II4VY3.js → tenant-DAXJ4P4D.js} +10 -10
  195. package/dist/{tenant-command-G6XON7CF.js → tenant-command-IZ3R4BDG.js} +81 -81
  196. package/dist/{test-command-3FZOX7O3.js → test-command-GCKZRRSL.js} +33 -33
  197. package/dist/{tests-KF6N6BZ7.js → tests-CLDZWLKF.js} +6 -6
  198. package/dist/{token-DJJUW5HY.js → token-XQCIFX7R.js} +9 -9
  199. package/dist/{toolchain-hooks-7PWCFLSU.js → toolchain-hooks-3ZAAAWPL.js} +6 -6
  200. package/dist/{toolchain-modules-OTNSKK52.js → toolchain-modules-C53NXT3S.js} +5 -5
  201. package/dist/{toolchain-peers-KQ7TQ2AR.js → toolchain-peers-AIKWKJH7.js} +8 -8
  202. package/dist/{tracked-backend-AJCGTO5Y.js → tracked-backend-UHKPD2JU.js} +31 -31
  203. package/dist/{update-check-4E5L6GAW.js → update-check-KMAC4VEJ.js} +44 -44
  204. package/dist/{upgrade-command-BXMSQN4C.js → upgrade-command-HQBSUFNE.js} +46 -46
  205. package/dist/{whoami-command-NLCCIEUM.js → whoami-command-23UXAC6F.js} +12 -12
  206. package/dist/{workspace-PNMJOXE4.js → workspace-TZMAJ7NF.js} +5 -5
  207. package/dist/{workspace-binding-J5GWDFRI.js → workspace-binding-RBU22BBX.js} +11 -11
  208. package/dist/{workspace-command-MHIIY352.js → workspace-command-N4BTEHSW.js} +84 -89
  209. package/dist/{workspace-env-LLRWCHSA.js → workspace-env-O3RK26FR.js} +11 -11
  210. package/dist/{workspace-export-BIKAYHWJ.js → workspace-export-UHY22VBI.js} +5 -5
  211. package/dist/{writable-UOTO4WWC.js → writable-2A6MBSFD.js} +4 -4
  212. package/dist/{xano-LCI7VWPS.js → xano-6T6L7TTI.js} +5 -5
  213. package/dist/{xanosdk-import-S7A3CVBN.js → xanosdk-import-WPCHIVP6.js} +6 -6
  214. package/dist/{xanosdk-project-J4VCFRHP.js → xanosdk-project-TEAXYQZW.js} +12 -12
  215. package/guides/cli.md +8 -7
  216. package/guides/codes.md +4 -1
  217. package/guides/deploying.md +28 -9
  218. package/llms/errors.md +1 -1
  219. package/llms/kinds-agent-mcp.md +4 -3
  220. package/llms/object-kinds.md +14 -0
  221. package/llms-full.txt +21 -6
  222. package/llms.txt +2 -2
  223. package/manifest.json +5 -1
  224. package/package.json +1 -1
  225. package/skills/xano-backend/SKILL.md +2 -2
  226. package/dist/promote-command-BDRPG6UU.js +0 -147
@@ -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 ephemeral itself**, so 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 --local` deploys to an engine running on this machine instead of an
614
- ephemeral — no network round-trip per deploy. It needs nothing configured:
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
- `llms`, `completion`, `--help`): a failure appended to it would corrupt it, so those write one
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 ephemeral a plain deploy refreshes — `--name`, `--expires-hours`,
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, or the deploy overwrites that edit.
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
@@ -1,14 +1,15 @@
1
1
  # Agent and MCP def shapes
2
2
 
3
- > Read when defining an `agent()`, `mcpServer()`, `prompt()` or `resource()`.
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.
@@ -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.7
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 defining an `agent()`, `mcpServer()`, `prompt()` or `resource()`.
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 defining an `agent()`, `mcpServer()`, `prompt()` or `resource()`.
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.7
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 defining an `agent()`, `mcpServer()`, `prompt()` or `resource()`.
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.7",
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.7",
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.7"
18
- xanosdk-digest: "sha256:335ffa095690ba305b28ede608a35590cb247a0b0954b41d2eda3046ed051fae"
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