@vm0/cli 9.204.2 → 9.204.3
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/adzuna.generated-VCDVUVAW.js +32 -0
- package/adzuna.generated-VCDVUVAW.js.map +1 -0
- package/agentmail.generated-BNZP573C.js +31 -0
- package/agentmail.generated-BNZP573C.js.map +1 -0
- package/agora.generated-RZJA5LJ6.js +41 -0
- package/agora.generated-RZJA5LJ6.js.map +1 -0
- package/ahrefs.generated-ABLXC6DB.js +31 -0
- package/ahrefs.generated-ABLXC6DB.js.map +1 -0
- package/airtable.generated-ML3Q5L5O.js +31 -0
- package/airtable.generated-ML3Q5L5O.js.map +1 -0
- package/alchemy.generated-PMMZJCYE.js +40 -0
- package/alchemy.generated-PMMZJCYE.js.map +1 -0
- package/altium-365.generated-LHZB6ZYG.js +31 -0
- package/altium-365.generated-LHZB6ZYG.js.map +1 -0
- package/amadeus.generated-ZQ6YNA2R.js +33 -0
- package/amadeus.generated-ZQ6YNA2R.js.map +1 -0
- package/amplitude.generated-JXWZ6LIV.js +51 -0
- package/amplitude.generated-JXWZ6LIV.js.map +1 -0
- package/anthropic-managed-agents.generated-L446P6RF.js +72 -0
- package/anthropic-managed-agents.generated-L446P6RF.js.map +1 -0
- package/apify.generated-2L5PHSEL.js +31 -0
- package/apify.generated-2L5PHSEL.js.map +1 -0
- package/apollo.generated-3ENLWQ6W.js +31 -0
- package/apollo.generated-3ENLWQ6W.js.map +1 -0
- package/asana.generated-NDLNF2TF.js +31 -0
- package/asana.generated-NDLNF2TF.js.map +1 -0
- package/ashby.generated-A3HTM34G.js +31 -0
- package/ashby.generated-A3HTM34G.js.map +1 -0
- package/atlascloud.generated-HMU3WVTD.js +31 -0
- package/atlascloud.generated-HMU3WVTD.js.map +1 -0
- package/atlassian.generated-BYG3JLJK.js +31 -0
- package/atlassian.generated-BYG3JLJK.js.map +1 -0
- package/attio.generated-UIEWNFYK.js +31 -0
- package/attio.generated-UIEWNFYK.js.map +1 -0
- package/aviationstack.generated-4MJHXLKU.js +31 -0
- package/aviationstack.generated-4MJHXLKU.js.map +1 -0
- package/aws.generated-J4IXTHJ4.js +57 -0
- package/aws.generated-J4IXTHJ4.js.map +1 -0
- package/axiom.generated-3S4Q3HUF.js +374 -0
- package/axiom.generated-3S4Q3HUF.js.map +1 -0
- package/base44.generated-K744TH72.js +40 -0
- package/base44.generated-K744TH72.js.map +1 -0
- package/bentoml.generated-7ISXNL7G.js +49 -0
- package/bentoml.generated-7ISXNL7G.js.map +1 -0
- package/bfl.generated-VXB65YTJ.js +49 -0
- package/bfl.generated-VXB65YTJ.js.map +1 -0
- package/bitrefill.generated-OQIWVUDY.js +31 -0
- package/bitrefill.generated-OQIWVUDY.js.map +1 -0
- package/bitrix.generated-SC6YHEX2.js +29 -0
- package/bitrix.generated-SC6YHEX2.js.map +1 -0
- package/bland.generated-EAFINO2W.js +31 -0
- package/bland.generated-EAFINO2W.js.map +1 -0
- package/box.generated-VKNV6YD6.js +115 -0
- package/box.generated-VKNV6YD6.js.map +1 -0
- package/brave-search.generated-33ENKERO.js +31 -0
- package/brave-search.generated-33ENKERO.js.map +1 -0
- package/brevo.generated-DVXZWZTV.js +31 -0
- package/brevo.generated-DVXZWZTV.js.map +1 -0
- package/brex.generated-TTXXU2KT.js +47 -0
- package/brex.generated-TTXXU2KT.js.map +1 -0
- package/bright-data.generated-JFT2ZGSD.js +31 -0
- package/bright-data.generated-JFT2ZGSD.js.map +1 -0
- package/browser-use.generated-723UT5OE.js +31 -0
- package/browser-use.generated-723UT5OE.js.map +1 -0
- package/browserbase.generated-IUEEQOWH.js +31 -0
- package/browserbase.generated-IUEEQOWH.js.map +1 -0
- package/browserless.generated-5MI66IVC.js +49 -0
- package/browserless.generated-5MI66IVC.js.map +1 -0
- package/browserstack.generated-TKIEGFHH.js +50 -0
- package/browserstack.generated-TKIEGFHH.js.map +1 -0
- package/bubblemaps.generated-JQUXWCJ4.js +31 -0
- package/bubblemaps.generated-JQUXWCJ4.js.map +1 -0
- package/buffer.generated-B76DQKPA.js +40 -0
- package/buffer.generated-B76DQKPA.js.map +1 -0
- package/builtwith.generated-Z3M3RKT4.js +31 -0
- package/builtwith.generated-Z3M3RKT4.js.map +1 -0
- package/cal-com.generated-CL6KOZUJ.js +31 -0
- package/cal-com.generated-CL6KOZUJ.js.map +1 -0
- package/calendly.generated-FGHDFMQI.js +31 -0
- package/calendly.generated-FGHDFMQI.js.map +1 -0
- package/canva.generated-JDZXRWQG.js +31 -0
- package/canva.generated-JDZXRWQG.js.map +1 -0
- package/chatwoot.generated-LQRB4ZKY.js +31 -0
- package/chatwoot.generated-LQRB4ZKY.js.map +1 -0
- package/checkr.generated-HJGBR2IX.js +47 -0
- package/checkr.generated-HJGBR2IX.js.map +1 -0
- package/chunk-GTPY5BQJ.js +27841 -0
- package/chunk-GTPY5BQJ.js.map +1 -0
- package/{chunk-ZFH5CXWE.js → chunk-LGIMPXEW.js} +4129 -31955
- package/{chunk-ZFH5CXWE.js.map → chunk-LGIMPXEW.js.map} +1 -1
- package/clado.generated-4EEZDOGQ.js +31 -0
- package/clado.generated-4EEZDOGQ.js.map +1 -0
- package/clearbit.generated-O6YEDZFY.js +35 -0
- package/clearbit.generated-O6YEDZFY.js.map +1 -0
- package/clerk.generated-VNZXBTJO.js +704 -0
- package/clerk.generated-VNZXBTJO.js.map +1 -0
- package/clickup.generated-4U5NK3UA.js +31 -0
- package/clickup.generated-4U5NK3UA.js.map +1 -0
- package/close.generated-RJLZRUPF.js +31 -0
- package/close.generated-RJLZRUPF.js.map +1 -0
- package/cloudflare.generated-6N4KWRE3.js +4323 -0
- package/cloudflare.generated-6N4KWRE3.js.map +1 -0
- package/coda.generated-VV7Y2ZCR.js +31 -0
- package/coda.generated-VV7Y2ZCR.js.map +1 -0
- package/coingecko.generated-AF2ZJ3UF.js +40 -0
- package/coingecko.generated-AF2ZJ3UF.js.map +1 -0
- package/coresignal.generated-I4SAUDJA.js +31 -0
- package/coresignal.generated-I4SAUDJA.js.map +1 -0
- package/cronlytic.generated-S4CR5ZNO.js +32 -0
- package/cronlytic.generated-S4CR5ZNO.js.map +1 -0
- package/crustdata.generated-POWBY4MH.js +32 -0
- package/crustdata.generated-POWBY4MH.js.map +1 -0
- package/cursor.generated-ND4AKJ22.js +31 -0
- package/cursor.generated-ND4AKJ22.js.map +1 -0
- package/customer-io.generated-FVRIG2G7.js +31 -0
- package/customer-io.generated-FVRIG2G7.js.map +1 -0
- package/db9.generated-YJ56MEGP.js +31 -0
- package/db9.generated-YJ56MEGP.js.map +1 -0
- package/deel.generated-32HAHF2K.js +697 -0
- package/deel.generated-32HAHF2K.js.map +1 -0
- package/deepseek.generated-MALCPZKS.js +31 -0
- package/deepseek.generated-MALCPZKS.js.map +1 -0
- package/defillama.generated-L2P2NZEC.js +29 -0
- package/defillama.generated-L2P2NZEC.js.map +1 -0
- package/devto.generated-FIF3OVN3.js +31 -0
- package/devto.generated-FIF3OVN3.js.map +1 -0
- package/diffbot.generated-BTEB6QMP.js +31 -0
- package/diffbot.generated-BTEB6QMP.js.map +1 -0
- package/dify.generated-GNBE7WCX.js +31 -0
- package/dify.generated-GNBE7WCX.js.map +1 -0
- package/discord-webhook.generated-XHPIUBW4.js +29 -0
- package/discord-webhook.generated-XHPIUBW4.js.map +1 -0
- package/discord.generated-TKPHB4TT.js +31 -0
- package/discord.generated-TKPHB4TT.js.map +1 -0
- package/docusign.generated-WJZGFZ72.js +112 -0
- package/docusign.generated-WJZGFZ72.js.map +1 -0
- package/doppler.generated-EF6577GS.js +31 -0
- package/doppler.generated-EF6577GS.js.map +1 -0
- package/doubao.generated-7764KYKN.js +31 -0
- package/doubao.generated-7764KYKN.js.map +1 -0
- package/drive9.generated-EHNETWAH.js +31 -0
- package/drive9.generated-EHNETWAH.js.map +1 -0
- package/dropbox-sign.generated-OVWNFEI7.js +31 -0
- package/dropbox-sign.generated-OVWNFEI7.js.map +1 -0
- package/dropbox.generated-FDUC7HAA.js +487 -0
- package/dropbox.generated-FDUC7HAA.js.map +1 -0
- package/duffel.generated-7OQ3QQIX.js +31 -0
- package/duffel.generated-7OQ3QQIX.js.map +1 -0
- package/e2b.generated-7QRJKLN7.js +31 -0
- package/e2b.generated-7QRJKLN7.js.map +1 -0
- package/elevenlabs.generated-HSS4YKPL.js +31 -0
- package/elevenlabs.generated-HSS4YKPL.js.map +1 -0
- package/etherscan.generated-5SGPDFMQ.js +31 -0
- package/etherscan.generated-5SGPDFMQ.js.map +1 -0
- package/etsy.generated-DN7L23UB.js +31 -0
- package/etsy.generated-DN7L23UB.js.map +1 -0
- package/exa.generated-G2GMXAGR.js +31 -0
- package/exa.generated-G2GMXAGR.js.map +1 -0
- package/explorium.generated-YK6MH26N.js +31 -0
- package/explorium.generated-YK6MH26N.js.map +1 -0
- package/faire.generated-JSG4RMY2.js +47 -0
- package/faire.generated-JSG4RMY2.js.map +1 -0
- package/fal.generated-TQ7AQFJJ.js +49 -0
- package/fal.generated-TQ7AQFJJ.js.map +1 -0
- package/figma.generated-7FWIRN56.js +193 -0
- package/figma.generated-7FWIRN56.js.map +1 -0
- package/firecrawl.generated-JJ5JQJTV.js +31 -0
- package/firecrawl.generated-JJ5JQJTV.js.map +1 -0
- package/fireflies.generated-5M3AINPQ.js +31 -0
- package/fireflies.generated-5M3AINPQ.js.map +1 -0
- package/firewall-placeholder-expansion-EZ5WNMSE.js +50 -0
- package/firewall-placeholder-expansion-EZ5WNMSE.js.map +1 -0
- package/flightaware.generated-E7EYHUD3.js +31 -0
- package/flightaware.generated-E7EYHUD3.js.map +1 -0
- package/freshdesk.generated-JENHT4QT.js +31 -0
- package/freshdesk.generated-JENHT4QT.js.map +1 -0
- package/gamma.generated-4CK7GP4Y.js +31 -0
- package/gamma.generated-4CK7GP4Y.js.map +1 -0
- package/garmin-connect.generated-VW7CPBDL.js +31 -0
- package/garmin-connect.generated-VW7CPBDL.js.map +1 -0
- package/gemini.generated-FJV4KZA2.js +31 -0
- package/gemini.generated-FJV4KZA2.js.map +1 -0
- package/github.generated-4YWKTGEJ.js +106 -0
- package/github.generated-4YWKTGEJ.js.map +1 -0
- package/gitlab.generated-VDLFPOB7.js +31 -0
- package/gitlab.generated-VDLFPOB7.js.map +1 -0
- package/gmail.generated-PL3HVAVP.js +342 -0
- package/gmail.generated-PL3HVAVP.js.map +1 -0
- package/gong.generated-JD4HLOLX.js +32 -0
- package/gong.generated-JD4HLOLX.js.map +1 -0
- package/google-ads.generated-2JH5PMA7.js +33 -0
- package/google-ads.generated-2JH5PMA7.js.map +1 -0
- package/google-analytics.generated-7EAP74EC.js +319 -0
- package/google-analytics.generated-7EAP74EC.js.map +1 -0
- package/google-calendar.generated-66JO7MZH.js +211 -0
- package/google-calendar.generated-66JO7MZH.js.map +1 -0
- package/google-cloud.generated-H4E5WNYB.js +9606 -0
- package/google-cloud.generated-H4E5WNYB.js.map +1 -0
- package/google-docs.generated-NZYWOUOC.js +59 -0
- package/google-docs.generated-NZYWOUOC.js.map +1 -0
- package/google-drive.generated-JTJW3HYA.js +364 -0
- package/google-drive.generated-JTJW3HYA.js.map +1 -0
- package/google-maps.generated-U6ECKZ6E.js +49 -0
- package/google-maps.generated-U6ECKZ6E.js.map +1 -0
- package/google-meet.generated-SQAK6E4P.js +151 -0
- package/google-meet.generated-SQAK6E4P.js.map +1 -0
- package/google-search-console.generated-PRI3O6UG.js +126 -0
- package/google-search-console.generated-PRI3O6UG.js.map +1 -0
- package/google-sheets.generated-NZNUFLZM.js +146 -0
- package/google-sheets.generated-NZNUFLZM.js.map +1 -0
- package/granola.generated-RIGG4QFA.js +31 -0
- package/granola.generated-RIGG4QFA.js.map +1 -0
- package/greenhouse.generated-5QQKUOUT.js +31 -0
- package/greenhouse.generated-5QQKUOUT.js.map +1 -0
- package/groq.generated-TJLSHCX3.js +31 -0
- package/groq.generated-TJLSHCX3.js.map +1 -0
- package/gumroad.generated-AUL7HWT7.js +31 -0
- package/gumroad.generated-AUL7HWT7.js.map +1 -0
- package/helicone.generated-ZBITLIX4.js +31 -0
- package/helicone.generated-ZBITLIX4.js.map +1 -0
- package/heygen.generated-PY3K3EO2.js +40 -0
- package/heygen.generated-PY3K3EO2.js.map +1 -0
- package/hitem3d.generated-QLX3IBRG.js +47 -0
- package/hitem3d.generated-QLX3IBRG.js.map +1 -0
- package/honcho.generated-DZMB66D3.js +31 -0
- package/honcho.generated-DZMB66D3.js.map +1 -0
- package/htmlcsstoimage.generated-7DBMEPFC.js +31 -0
- package/htmlcsstoimage.generated-7DBMEPFC.js.map +1 -0
- package/hubspot.generated-CV3CHTB6.js +31 -0
- package/hubspot.generated-CV3CHTB6.js.map +1 -0
- package/hugging-face.generated-BM3RBQIT.js +49 -0
- package/hugging-face.generated-BM3RBQIT.js.map +1 -0
- package/hume.generated-TTXWXEE3.js +31 -0
- package/hume.generated-TTXWXEE3.js.map +1 -0
- package/hunter.generated-5AB5U7KW.js +31 -0
- package/hunter.generated-5AB5U7KW.js.map +1 -0
- package/imgur.generated-QWCTTQNZ.js +31 -0
- package/imgur.generated-QWCTTQNZ.js.map +1 -0
- package/index.js +12 -10
- package/index.js.map +1 -1
- package/infisical.generated-XM6YCHQ5.js +49 -0
- package/infisical.generated-XM6YCHQ5.js.map +1 -0
- package/insforge.generated-HM54OIX7.js +31 -0
- package/insforge.generated-HM54OIX7.js.map +1 -0
- package/instagram.generated-GERAMBTF.js +40 -0
- package/instagram.generated-GERAMBTF.js.map +1 -0
- package/instantly.generated-QWQWBPJJ.js +31 -0
- package/instantly.generated-QWQWBPJJ.js.map +1 -0
- package/intercom.generated-7UVO5AEB.js +31 -0
- package/intercom.generated-7UVO5AEB.js.map +1 -0
- package/intervals-icu.generated-QBKJU7JI.js +31 -0
- package/intervals-icu.generated-QBKJU7JI.js.map +1 -0
- package/ironclad.generated-3JVEFZLT.js +31 -0
- package/ironclad.generated-3JVEFZLT.js.map +1 -0
- package/jam.generated-GHLN7H6L.js +31 -0
- package/jam.generated-GHLN7H6L.js.map +1 -0
- package/jira.generated-OVPCNMMM.js +31 -0
- package/jira.generated-OVPCNMMM.js.map +1 -0
- package/jotform.generated-SFZY6THT.js +49 -0
- package/jotform.generated-SFZY6THT.js.map +1 -0
- package/klaviyo.generated-XSJJ7ROI.js +31 -0
- package/klaviyo.generated-XSJJ7ROI.js.map +1 -0
- package/kommo.generated-3OOIFPG4.js +31 -0
- package/kommo.generated-3OOIFPG4.js.map +1 -0
- package/langfuse.generated-42JDX5UR.js +41 -0
- package/langfuse.generated-42JDX5UR.js.map +1 -0
- package/langsmith.generated-7HRUULQP.js +31 -0
- package/langsmith.generated-7HRUULQP.js.map +1 -0
- package/lark.generated-JUUZDGX6.js +31 -0
- package/lark.generated-JUUZDGX6.js.map +1 -0
- package/line.generated-FKZKELVB.js +31 -0
- package/line.generated-FKZKELVB.js.map +1 -0
- package/linear.generated-BUPBT7HJ.js +31 -0
- package/linear.generated-BUPBT7HJ.js.map +1 -0
- package/loops.generated-Q3J4ULOV.js +31 -0
- package/loops.generated-Q3J4ULOV.js.map +1 -0
- package/luma-ai.generated-V2XXBCJJ.js +31 -0
- package/luma-ai.generated-V2XXBCJJ.js.map +1 -0
- package/luma.generated-6LVCO3VX.js +31 -0
- package/luma.generated-6LVCO3VX.js.map +1 -0
- package/mailchimp.generated-CXLYVGBQ.js +40 -0
- package/mailchimp.generated-CXLYVGBQ.js.map +1 -0
- package/mailsac.generated-5J2APQUJ.js +31 -0
- package/mailsac.generated-5J2APQUJ.js.map +1 -0
- package/make.generated-NNBDHSYF.js +76 -0
- package/make.generated-NNBDHSYF.js.map +1 -0
- package/manus.generated-7NFWL4X7.js +31 -0
- package/manus.generated-7NFWL4X7.js.map +1 -0
- package/mapbox.generated-EMMM7SWX.js +31 -0
- package/mapbox.generated-EMMM7SWX.js.map +1 -0
- package/maskdb.generated-T2JIVNT4.js +101 -0
- package/maskdb.generated-T2JIVNT4.js.map +1 -0
- package/massive.generated-5LPRW3UT.js +40 -0
- package/massive.generated-5LPRW3UT.js.map +1 -0
- package/mathpix.generated-SNMBCBWB.js +32 -0
- package/mathpix.generated-SNMBCBWB.js.map +1 -0
- package/mem0.generated-73U3ARM2.js +31 -0
- package/mem0.generated-73U3ARM2.js.map +1 -0
- package/mercury.generated-CFAFZWGW.js +31 -0
- package/mercury.generated-CFAFZWGW.js.map +1 -0
- package/meshy.generated-Q4HN4QEN.js +31 -0
- package/meshy.generated-Q4HN4QEN.js.map +1 -0
- package/meta-ads.generated-YA3OEXXX.js +42 -0
- package/meta-ads.generated-YA3OEXXX.js.map +1 -0
- package/metabase.generated-LUDJY5BN.js +31 -0
- package/metabase.generated-LUDJY5BN.js.map +1 -0
- package/microsoft-365.generated-OO4GI4CR.js +125 -0
- package/microsoft-365.generated-OO4GI4CR.js.map +1 -0
- package/minimax.generated-4SXTNJOT.js +31 -0
- package/minimax.generated-4SXTNJOT.js.map +1 -0
- package/miro.generated-PN6PFBXV.js +31 -0
- package/miro.generated-PN6PFBXV.js.map +1 -0
- package/mixpanel.generated-2OVCBGSC.js +50 -0
- package/mixpanel.generated-2OVCBGSC.js.map +1 -0
- package/monday.generated-TW76QA3B.js +31 -0
- package/monday.generated-TW76QA3B.js.map +1 -0
- package/moss.generated-D3FTKHNN.js +33 -0
- package/moss.generated-D3FTKHNN.js.map +1 -0
- package/msg9.generated-JOJ7NTDU.js +31 -0
- package/msg9.generated-JOJ7NTDU.js.map +1 -0
- package/n8n.generated-T7DGAODY.js +31 -0
- package/n8n.generated-T7DGAODY.js.map +1 -0
- package/neon.generated-5X7PLZLU.js +31 -0
- package/neon.generated-5X7PLZLU.js.map +1 -0
- package/netdata.generated-RRFZR7DL.js +31 -0
- package/netdata.generated-RRFZR7DL.js.map +1 -0
- package/notion.generated-YQGYUAKH.js +112 -0
- package/notion.generated-YQGYUAKH.js.map +1 -0
- package/novita.generated-ZMI7ZU3F.js +31 -0
- package/novita.generated-ZMI7ZU3F.js.map +1 -0
- package/nyne.generated-IMMIHSCL.js +33 -0
- package/nyne.generated-IMMIHSCL.js.map +1 -0
- package/onyx.generated-4B26U3IC.js +31 -0
- package/onyx.generated-4B26U3IC.js.map +1 -0
- package/openai.generated-4GL6IOCL.js +31 -0
- package/openai.generated-4GL6IOCL.js.map +1 -0
- package/openrouter.generated-R6IGBWCZ.js +31 -0
- package/openrouter.generated-R6IGBWCZ.js.map +1 -0
- package/openweather.generated-XXOI6FJS.js +31 -0
- package/openweather.generated-XXOI6FJS.js.map +1 -0
- package/outlook-calendar.generated-X6OWZWBK.js +31 -0
- package/outlook-calendar.generated-X6OWZWBK.js.map +1 -0
- package/outlook-mail.generated-E6OXCT2H.js +31 -0
- package/outlook-mail.generated-E6OXCT2H.js.map +1 -0
- package/package.json +1 -1
- package/pandadoc.generated-4HX4BTNN.js +31 -0
- package/pandadoc.generated-4HX4BTNN.js.map +1 -0
- package/parallel.generated-JIVJZFYS.js +31 -0
- package/parallel.generated-JIVJZFYS.js.map +1 -0
- package/pdf4me.generated-MPCIW57T.js +31 -0
- package/pdf4me.generated-MPCIW57T.js.map +1 -0
- package/pdfco.generated-HH6EHYWF.js +31 -0
- package/pdfco.generated-HH6EHYWF.js.map +1 -0
- package/pdforge.generated-4ETJ3RPJ.js +31 -0
- package/pdforge.generated-4ETJ3RPJ.js.map +1 -0
- package/people-data-labs.generated-GWXWPK7W.js +31 -0
- package/people-data-labs.generated-GWXWPK7W.js.map +1 -0
- package/perplexity.generated-VE5KQMMX.js +31 -0
- package/perplexity.generated-VE5KQMMX.js.map +1 -0
- package/pika.generated-MVEKI454.js +40 -0
- package/pika.generated-MVEKI454.js.map +1 -0
- package/pinecone.generated-2X4QKSPN.js +31 -0
- package/pinecone.generated-2X4QKSPN.js.map +1 -0
- package/pipedream.generated-TJP2FBK2.js +31 -0
- package/pipedream.generated-TJP2FBK2.js.map +1 -0
- package/pipedrive.generated-ZFB4STBY.js +31 -0
- package/pipedrive.generated-ZFB4STBY.js.map +1 -0
- package/plain.generated-ABYPLWNI.js +31 -0
- package/plain.generated-ABYPLWNI.js.map +1 -0
- package/plausible.generated-A6JRG6GK.js +31 -0
- package/plausible.generated-A6JRG6GK.js.map +1 -0
- package/podchaser.generated-T2NJLKAT.js +31 -0
- package/podchaser.generated-T2NJLKAT.js.map +1 -0
- package/porkbun.generated-NU72P2E3.js +43 -0
- package/porkbun.generated-NU72P2E3.js.map +1 -0
- package/posthog.generated-PO26TPLE.js +40 -0
- package/posthog.generated-PO26TPLE.js.map +1 -0
- package/printful.generated-SFWQWPXB.js +31 -0
- package/printful.generated-SFWQWPXB.js.map +1 -0
- package/prisma-postgres.generated-JTHSJFIB.js +31 -0
- package/prisma-postgres.generated-JTHSJFIB.js.map +1 -0
- package/productlane.generated-CR3X7TGP.js +31 -0
- package/productlane.generated-CR3X7TGP.js.map +1 -0
- package/profound.generated-JHX7QVJB.js +31 -0
- package/profound.generated-JHX7QVJB.js.map +1 -0
- package/pushinator.generated-KCCONKHO.js +31 -0
- package/pushinator.generated-KCCONKHO.js.map +1 -0
- package/qdrant.generated-HKJ3BJBS.js +31 -0
- package/qdrant.generated-HKJ3BJBS.js.map +1 -0
- package/qiita.generated-YZWERRCL.js +31 -0
- package/qiita.generated-YZWERRCL.js.map +1 -0
- package/quickbooks.generated-6V23FI6G.js +132 -0
- package/quickbooks.generated-6V23FI6G.js.map +1 -0
- package/railway-project.generated-CJUAOVMY.js +31 -0
- package/railway-project.generated-CJUAOVMY.js.map +1 -0
- package/railway.generated-GC2GCBN6.js +31 -0
- package/railway.generated-GC2GCBN6.js.map +1 -0
- package/reap.generated-5WGR7WC3.js +48 -0
- package/reap.generated-5WGR7WC3.js.map +1 -0
- package/recraft.generated-6MR5BKCJ.js +31 -0
- package/recraft.generated-6MR5BKCJ.js.map +1 -0
- package/reddit.generated-WAF6XMWP.js +31 -0
- package/reddit.generated-WAF6XMWP.js.map +1 -0
- package/reducto.generated-32FRPNVV.js +31 -0
- package/reducto.generated-32FRPNVV.js.map +1 -0
- package/render.generated-BZGL7DF4.js +31 -0
- package/render.generated-BZGL7DF4.js.map +1 -0
- package/rentcast.generated-G3FPAI6D.js +31 -0
- package/rentcast.generated-G3FPAI6D.js.map +1 -0
- package/replicate.generated-MLYBPGOA.js +31 -0
- package/replicate.generated-MLYBPGOA.js.map +1 -0
- package/reportei.generated-CHURJNQT.js +31 -0
- package/reportei.generated-CHURJNQT.js.map +1 -0
- package/resend.generated-ZMEK6PF2.js +31 -0
- package/resend.generated-ZMEK6PF2.js.map +1 -0
- package/revenuecat.generated-6U74BW7S.js +31 -0
- package/revenuecat.generated-6U74BW7S.js.map +1 -0
- package/runway.generated-MOPZWPD4.js +31 -0
- package/runway.generated-MOPZWPD4.js.map +1 -0
- package/salesforce.generated-QLXPYWHS.js +31 -0
- package/salesforce.generated-QLXPYWHS.js.map +1 -0
- package/scrapeninja.generated-HUZWNEGA.js +31 -0
- package/scrapeninja.generated-HUZWNEGA.js.map +1 -0
- package/segment.generated-UBXS6E3T.js +47 -0
- package/segment.generated-UBXS6E3T.js.map +1 -0
- package/semrush.generated-BDZQFDZ6.js +31 -0
- package/semrush.generated-BDZQFDZ6.js.map +1 -0
- package/sendgrid.generated-RGLDR2E5.js +31 -0
- package/sendgrid.generated-RGLDR2E5.js.map +1 -0
- package/sentry.generated-RBPS7ELL.js +356 -0
- package/sentry.generated-RBPS7ELL.js.map +1 -0
- package/serpapi.generated-2BJ3RNLE.js +31 -0
- package/serpapi.generated-2BJ3RNLE.js.map +1 -0
- package/servicenow.generated-E7O6JASC.js +32 -0
- package/servicenow.generated-E7O6JASC.js.map +1 -0
- package/shopify.generated-TGJVHJUD.js +31 -0
- package/shopify.generated-TGJVHJUD.js.map +1 -0
- package/shortio.generated-YBZIZLEV.js +31 -0
- package/shortio.generated-YBZIZLEV.js.map +1 -0
- package/similarweb.generated-PCBSSOCD.js +31 -0
- package/similarweb.generated-PCBSSOCD.js.map +1 -0
- package/slack-webhook.generated-XMEEBF47.js +29 -0
- package/slack-webhook.generated-XMEEBF47.js.map +1 -0
- package/slack.generated-V76OAVKH.js +973 -0
- package/slack.generated-V76OAVKH.js.map +1 -0
- package/slock.generated-S57XZ5P3.js +33 -0
- package/slock.generated-S57XZ5P3.js.map +1 -0
- package/snowflake.generated-QL5XVS7V.js +32 -0
- package/snowflake.generated-QL5XVS7V.js.map +1 -0
- package/sociavault.generated-JRXDGSXH.js +31 -0
- package/sociavault.generated-JRXDGSXH.js.map +1 -0
- package/sponge.generated-2VKVSFRB.js +31 -0
- package/sponge.generated-2VKVSFRB.js.map +1 -0
- package/spotify.generated-KHVJJU2T.js +31 -0
- package/spotify.generated-KHVJJU2T.js.map +1 -0
- package/sproutgigs.generated-OC6PQNTF.js +113 -0
- package/sproutgigs.generated-OC6PQNTF.js.map +1 -0
- package/square.generated-RVAZRHLD.js +31 -0
- package/square.generated-RVAZRHLD.js.map +1 -0
- package/stability-ai.generated-2H663XX7.js +31 -0
- package/stability-ai.generated-2H663XX7.js.map +1 -0
- package/strapi.generated-T3UOXOJN.js +31 -0
- package/strapi.generated-T3UOXOJN.js.map +1 -0
- package/strava.generated-7XJAWYH2.js +131 -0
- package/strava.generated-7XJAWYH2.js.map +1 -0
- package/streak.generated-Y3LFC2JD.js +31 -0
- package/streak.generated-Y3LFC2JD.js.map +1 -0
- package/stripe.generated-UVDICBHI.js +2508 -0
- package/stripe.generated-UVDICBHI.js.map +1 -0
- package/supabase.generated-CIKR6U6G.js +31 -0
- package/supabase.generated-CIKR6U6G.js.map +1 -0
- package/supadata.generated-6PED6KGP.js +31 -0
- package/supadata.generated-6PED6KGP.js.map +1 -0
- package/supermemory.generated-VQQK63EO.js +31 -0
- package/supermemory.generated-VQQK63EO.js.map +1 -0
- package/tavily.generated-2HIO3P2G.js +31 -0
- package/tavily.generated-2HIO3P2G.js.map +1 -0
- package/test-oauth.generated-LELIDIIB.js +52 -0
- package/test-oauth.generated-LELIDIIB.js.map +1 -0
- package/testrail.generated-SRTVOQZD.js +32 -0
- package/testrail.generated-SRTVOQZD.js.map +1 -0
- package/ticketmaster.generated-VVMETHPF.js +31 -0
- package/ticketmaster.generated-VVMETHPF.js.map +1 -0
- package/tiktok-ads.generated-4FWM2V3S.js +40 -0
- package/tiktok-ads.generated-4FWM2V3S.js.map +1 -0
- package/tldv.generated-OFZOVAID.js +31 -0
- package/tldv.generated-OFZOVAID.js.map +1 -0
- package/todoist.generated-3HCN3DD6.js +31 -0
- package/todoist.generated-3HCN3DD6.js.map +1 -0
- package/together.generated-EZU7DMXG.js +31 -0
- package/together.generated-EZU7DMXG.js.map +1 -0
- package/tripo.generated-5KSYOLHP.js +31 -0
- package/tripo.generated-5KSYOLHP.js.map +1 -0
- package/twenty.generated-6JPCTSLF.js +31 -0
- package/twenty.generated-6JPCTSLF.js.map +1 -0
- package/twilio.generated-U2FL53M7.js +77 -0
- package/twilio.generated-U2FL53M7.js.map +1 -0
- package/typeform.generated-PY2QUGS4.js +31 -0
- package/typeform.generated-PY2QUGS4.js.map +1 -0
- package/v0.generated-VF33O3AD.js +31 -0
- package/v0.generated-VF33O3AD.js.map +1 -0
- package/vercel.generated-VVYZQLAJ.js +764 -0
- package/vercel.generated-VVYZQLAJ.js.map +1 -0
- package/wandb.generated-7RF2F2A3.js +31 -0
- package/wandb.generated-7RF2F2A3.js.map +1 -0
- package/webflow.generated-QLYSIAFU.js +31 -0
- package/webflow.generated-QLYSIAFU.js.map +1 -0
- package/weread.generated-DGYJJDBC.js +31 -0
- package/weread.generated-DGYJJDBC.js.map +1 -0
- package/whale-alert.generated-OEZL4IQ2.js +40 -0
- package/whale-alert.generated-OEZL4IQ2.js.map +1 -0
- package/wix.generated-WKC3OZRW.js +31 -0
- package/wix.generated-WKC3OZRW.js.map +1 -0
- package/workos.generated-T6QWUDAY.js +31 -0
- package/workos.generated-T6QWUDAY.js.map +1 -0
- package/wrike.generated-I3WQZDXJ.js +49 -0
- package/wrike.generated-I3WQZDXJ.js.map +1 -0
- package/x.generated-PUPRGNB3.js +322 -0
- package/x.generated-PUPRGNB3.js.map +1 -0
- package/xero.generated-7XBNR4R7.js +769 -0
- package/xero.generated-7XBNR4R7.js.map +1 -0
- package/youtube.generated-YWLXAYNL.js +744 -0
- package/youtube.generated-YWLXAYNL.js.map +1 -0
- package/zapier.generated-DAJBGTEJ.js +31 -0
- package/zapier.generated-DAJBGTEJ.js.map +1 -0
- package/zapsign.generated-I3FNI3UE.js +31 -0
- package/zapsign.generated-I3FNI3UE.js.map +1 -0
- package/zendesk.generated-DHS42FEH.js +31 -0
- package/zendesk.generated-DHS42FEH.js.map +1 -0
- package/zep.generated-SZF6543E.js +31 -0
- package/zep.generated-SZF6543E.js.map +1 -0
- package/zeptomail.generated-Y7AKWOWX.js +31 -0
- package/zeptomail.generated-Y7AKWOWX.js.map +1 -0
- package/zero.js +4410 -29153
- package/zero.js.map +1 -1
- package/zoom.generated-OQ74ZOYO.js +31 -0
- package/zoom.generated-OQ74ZOYO.js.map +1 -0
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/api/auth.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/auth/setup-token.ts","../src/commands/info/index.ts","../src/lib/utils/update-checker.ts","../src/lib/utils/spawn.ts","../src/commands/compose/index.ts","../src/lib/domain/yaml-validator.ts","../src/lib/storage/system-storage.ts","../src/lib/storage/direct-upload.ts","../src/commands/run/index.ts","../src/commands/run/run.ts","../src/commands/run/resume.ts","../src/commands/run/continue.ts","../src/commands/run/list.ts","../src/commands/run/kill.ts","../src/commands/run/queue.ts","../src/commands/volume/index.ts","../src/commands/volume/init.ts","../src/lib/storage/storage-utils.ts","../src/commands/volume/push.ts","../src/commands/volume/pull.ts","../src/lib/storage/pull-utils.ts","../src/commands/volume/status.ts","../src/commands/volume/list.ts","../src/commands/volume/clone.ts","../src/lib/storage/clone-utils.ts","../src/commands/artifact/index.ts","../src/commands/artifact/init.ts","../src/commands/artifact/push.ts","../src/commands/artifact/pull.ts","../src/commands/artifact/status.ts","../src/commands/artifact/list.ts","../src/commands/artifact/clone.ts","../src/commands/logs/index.ts","../src/commands/logs/search.ts","../src/commands/init/index.ts","../src/commands/upgrade/index.ts","../src/commands/whoami.ts"],"sourcesContent":["// VM0 CLI entry point - main module\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { authCommand } from \"./commands/auth\";\nimport { infoCommand } from \"./commands/info\";\nimport { composeCommand } from \"./commands/compose\";\nimport { runCommand } from \"./commands/run\";\nimport { volumeCommand } from \"./commands/volume\";\nimport { artifactCommand } from \"./commands/artifact\";\nimport { logsCommand } from \"./commands/logs\";\n\nimport { initCommand } from \"./commands/init\";\n\nimport { upgradeCommand } from \"./commands/upgrade\";\nimport { whoamiCommand } from \"./commands/whoami\";\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"vm0\")\n .description(\"VM0 CLI - Build and run agents with natural language\")\n .version(__CLI_VERSION__);\n\n// Register all commands\nprogram.addCommand(authCommand);\nprogram.addCommand(infoCommand);\nprogram.addCommand(composeCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(volumeCommand);\nprogram.addCommand(artifactCommand);\nprogram.addCommand(logsCommand);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(upgradeCommand);\nprogram.addCommand(whoamiCommand);\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"vm0\")\n) {\n configureGlobalProxyFromEnv();\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { loginCommand } from \"./login\";\nimport { logoutCommand } from \"./logout\";\nimport { statusCommand } from \"./status\";\nimport { setupTokenCommand } from \"./setup-token\";\n\nexport const authCommand = new Command()\n .name(\"auth\")\n .description(\"Authenticate vm0\")\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand)\n .addCommand(setupTokenCommand);\n","import { Command } from \"commander\";\nimport { authenticate } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const loginCommand = new Command()\n .name(\"login\")\n .description(\"Log in to VM0 (use VM0_API_URL env var to set API URL)\")\n .action(\n withErrorHandler(async () => {\n await authenticate();\n }),\n );\n","import chalk from \"chalk\";\nimport {\n saveConfig,\n clearConfig,\n loadConfig,\n getApiUrl,\n getToken,\n} from \"./config\";\n\n/**\n * Build headers with optional Vercel bypass secret\n * Used to bypass Vercel deployment protection in CI/preview environments\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add Vercel bypass secret if available (for CI/preview deployments)\n const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;\n if (bypassSecret) {\n headers[\"x-vercel-protection-bypass\"] = bypassSecret;\n }\n\n return headers;\n}\n\nasync function requestDeviceCode(apiUrl: string): Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/device`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\"An unexpected network issue occurred\");\n }\n throw new Error(`Failed to request device code: ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n }>;\n}\n\nasync function exchangeToken(\n apiUrl: string,\n deviceCode: string,\n): Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/token`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n return response.json() as Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n }>;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\nexport async function authenticate(apiUrl?: string): Promise<void> {\n // Use provided apiUrl or get from config/env (with fallback to production)\n const targetApiUrl = apiUrl ?? (await getApiUrl());\n console.log(\"Initiating authentication...\");\n\n // Request device code\n const deviceAuth = await requestDeviceCode(targetApiUrl);\n\n console.log(chalk.green(\"\\nDevice code generated\"));\n\n // Construct verification URL from API URL and server-provided path\n const verificationUrl = `${targetApiUrl}${deviceAuth.verification_path}`;\n console.log(chalk.cyan(`\\nTo authenticate, visit: ${verificationUrl}`));\n console.log(`And enter this code: ${chalk.bold(deviceAuth.user_code)}`);\n console.log(\n `\\nThe code expires in ${Math.floor(deviceAuth.expires_in / 60)} minutes.`,\n );\n\n console.log(\"\\nWaiting for authentication...\");\n\n // Poll for token\n const startTime = Date.now();\n const maxWaitTime = deviceAuth.expires_in * 1000; // Convert to milliseconds\n const pollInterval = (deviceAuth.interval || 5) * 1000; // Use server-specified interval or default to 5 seconds\n\n let isFirstPoll = true;\n\n while (Date.now() - startTime < maxWaitTime) {\n // Skip delay on first poll for faster response\n if (!isFirstPoll) {\n await delay(pollInterval); // Use dynamic polling interval\n }\n isFirstPoll = false;\n\n const tokenResult = await exchangeToken(\n targetApiUrl,\n deviceAuth.device_code,\n );\n\n if (tokenResult.access_token) {\n // Success! Store the token and org context\n await saveConfig({\n token: tokenResult.access_token,\n apiUrl: targetApiUrl,\n });\n\n console.log(chalk.green(\"\\nAuthentication successful!\"));\n console.log(\"Your credentials have been saved\");\n return;\n }\n\n if (tokenResult.error === \"authorization_pending\") {\n // Still waiting for user to authenticate\n process.stdout.write(chalk.dim(\".\"));\n continue;\n }\n\n // Handle other errors\n if (tokenResult.error === \"expired_token\") {\n throw new Error(\"Device code expired, please try again\");\n }\n\n if (tokenResult.error) {\n throw new Error(\n `Authentication failed: ${tokenResult.error_description ?? tokenResult.error}`,\n );\n }\n }\n\n // Timeout\n throw new Error(\"Authentication timed out, please try again\");\n}\n\nexport async function logout(): Promise<void> {\n await clearConfig();\n console.log(chalk.green(\"✓ Successfully logged out\"));\n console.log(\"Your credentials have been cleared\");\n}\n\nexport async function checkAuthStatus(): Promise<void> {\n const config = await loadConfig();\n\n if (config.token) {\n console.log(chalk.green(\"✓ Authenticated\"));\n console.log(\"You are logged in to VM0.\");\n } else {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(chalk.dim(\" Run: vm0 auth login\"));\n }\n\n // Also check for environment variable\n if (process.env.VM0_TOKEN) {\n console.log(\"Using token from VM0_TOKEN environment variable\");\n }\n}\n\nexport async function setupToken(): Promise<void> {\n const token = await getToken();\n\n if (!token) {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(\"\");\n console.error(\"To get a token for CI/CD:\");\n console.error(\" 1. Run 'vm0 auth login' to authenticate\");\n console.error(\" 2. Run 'vm0 auth setup-token' to get your token\");\n console.error(\n \" 3. Store the token in your CI/CD secrets (e.g., VM0_TOKEN)\",\n );\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Authentication token exported successfully!\"));\n console.log(\"\");\n console.log(\"Your token:\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\n `Use this token by setting: ${chalk.cyan(\"export VM0_TOKEN=<token>\")}`,\n );\n}\n","import { Command } from \"commander\";\nimport { logout } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const logoutCommand = new Command()\n .name(\"logout\")\n .description(\"Log out of VM0\")\n .action(\n withErrorHandler(async () => {\n await logout();\n }),\n );\n","import { Command } from \"commander\";\nimport { checkAuthStatus } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show current authentication status\")\n .action(\n withErrorHandler(async () => {\n await checkAuthStatus();\n }),\n );\n","import { Command } from \"commander\";\nimport { setupToken } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const setupTokenCommand = new Command()\n .name(\"setup-token\")\n .description(\"Output auth token for CI/CD environments\")\n .action(\n withErrorHandler(async () => {\n await setupToken();\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { existsSync } from \"fs\";\nimport * as os from \"os\";\nimport { join } from \"path\";\nimport { getApiUrl, loadConfig } from \"../../lib/api/config\";\nimport { detectPackageManager } from \"../../lib/utils/update-checker\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction getConfigPath() {\n return join(os.homedir(), \".vm0\", \"config.json\");\n}\n\nexport const infoCommand = new Command()\n .name(\"info\")\n .description(\"Display environment and debug information\")\n .action(async () => {\n // CLI version header\n console.log(chalk.bold(`VM0 CLI v${__CLI_VERSION__}`));\n console.log();\n\n // Authentication section\n const config = await loadConfig();\n const hasEnvToken = !!process.env.VM0_TOKEN;\n const hasConfigToken = !!config.token;\n const isAuthenticated = hasEnvToken || hasConfigToken;\n\n console.log(chalk.bold(\"Authentication:\"));\n if (isAuthenticated) {\n const tokenSource = hasEnvToken ? \"VM0_TOKEN env var\" : \"config file\";\n console.log(` ${chalk.green(\"✓\")} Logged in (via ${tokenSource})`);\n } else {\n console.log(` ${chalk.red(\"✗\")} Not authenticated`);\n }\n\n const configExists = existsSync(getConfigPath());\n const configDisplay = configExists\n ? `~/.vm0/config.json`\n : `~/.vm0/config.json (not found)`;\n console.log(` Config: ${configDisplay}`);\n console.log();\n\n // API section\n const apiUrl = await getApiUrl();\n console.log(chalk.bold(\"API:\"));\n console.log(` Host: ${apiUrl}`);\n console.log();\n\n // System section\n console.log(chalk.bold(\"System:\"));\n console.log(` Node: ${process.version}`);\n console.log(` Platform: ${process.platform} (${process.arch})`);\n console.log(` OS: ${os.type()} ${os.release()}`);\n console.log(` Shell: ${process.env.SHELL ?? \"unknown\"}`);\n console.log(` Package Manager: ${detectPackageManager()}`);\n });\n","import type { ChildProcess } from \"child_process\";\nimport chalk from \"chalk\";\nimport { safeSpawn } from \"./spawn\";\n\nconst PACKAGE_NAME = \"@vm0/cli\";\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;\nconst TIMEOUT_MS = 5000;\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"bun\" | \"yarn\" | \"unknown\";\n\n/**\n * Internal state for pending upgrade process\n */\ninterface UpgradeHandle {\n promise: Promise<boolean>;\n child: ChildProcess;\n packageManager: \"npm\" | \"pnpm\";\n}\n\n// Module-level state for pending upgrade\nlet pendingUpgrade: UpgradeHandle | null = null;\n\n/**\n * Detect which package manager was used to install the CLI\n * by checking the executable path for known package manager patterns.\n * Returns \"unknown\" if no known pattern is matched.\n */\nexport function detectPackageManager(): PackageManager {\n const execPath = process.argv[1] ?? \"\";\n\n // Check for pnpm (supported for auto-upgrade)\n if (execPath.includes(\"pnpm\")) {\n return \"pnpm\";\n }\n\n // Check for bun (unsupported - manual upgrade only)\n if (execPath.includes(\"/.bun/\") || execPath.includes(\"/bun/\")) {\n return \"bun\";\n }\n\n // Check for yarn (unsupported - manual upgrade only)\n if (execPath.includes(\"/.yarn/\") || execPath.includes(\"/yarn/\")) {\n return \"yarn\";\n }\n\n // Check for npm (supported for auto-upgrade)\n // Common npm paths: Homebrew, nvm, fnm, volta, nodenv, n, or node_modules\n if (\n execPath.includes(\"/usr/local/\") || // Homebrew on Intel Mac\n execPath.includes(\"/opt/homebrew/\") || // Homebrew on arm64 Mac\n execPath.includes(\"/.nvm/\") ||\n execPath.includes(\"/.fnm/\") ||\n execPath.includes(\"/.volta/\") ||\n execPath.includes(\"/.nodenv/\") ||\n execPath.includes(\"/.n/\") ||\n execPath.includes(\"/node_modules/\") ||\n execPath.includes(\"\\\\npm\\\\\") || // Windows: AppData\\Roaming\\npm\n execPath.includes(\"\\\\nodejs\\\\\") // Windows: Program Files\\nodejs\n ) {\n return \"npm\";\n }\n\n // Unknown package manager - don't assume npm\n return \"unknown\";\n}\n\n/**\n * Check if the package manager supports auto-upgrade\n */\nexport function isAutoUpgradeSupported(\n pm: PackageManager,\n): pm is \"npm\" | \"pnpm\" {\n return pm === \"npm\" || pm === \"pnpm\";\n}\n\n/**\n * Get the manual upgrade command for a package manager\n */\nexport function getManualUpgradeCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return `bun add -g ${PACKAGE_NAME}@latest`;\n case \"yarn\":\n return `yarn global add ${PACKAGE_NAME}@latest`;\n case \"pnpm\":\n return `pnpm add -g ${PACKAGE_NAME}@latest`;\n case \"npm\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n case \"unknown\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n }\n}\n\n/**\n * Fetch the latest version of the package from npm registry\n * Returns null if the request fails or times out\n */\nexport async function getLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n return controller.abort();\n }, TIMEOUT_MS);\n\n const response = await fetch(NPM_REGISTRY_URL, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const json = (await response.json()) as { version?: string };\n return json.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Execute package manager upgrade command\n * - npm: npm install -g @vm0/cli@latest\n * - pnpm: pnpm add -g @vm0/cli@latest\n * Returns true on success, false on failure\n */\nexport function performUpgrade(\n packageManager: \"npm\" | \"pnpm\",\n): Promise<boolean> {\n return new Promise((resolve) => {\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"inherit\",\n });\n\n child.on(\"close\", (code) => {\n resolve(code === 0);\n });\n\n child.on(\"error\", () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Start silent upgrade in background.\n * Call this at command start. Does NOT block after spawning.\n * The upgrade runs in parallel with command execution.\n *\n * @param currentVersion - Current CLI version\n * @returns Promise that resolves after starting upgrade (or determining no upgrade needed)\n */\nexport async function startSilentUpgrade(\n currentVersion: string,\n): Promise<void> {\n // Reset any previous state\n pendingUpgrade = null;\n\n // Check for new version\n const latestVersion = await getLatestVersion();\n\n // If check failed or already on latest, return silently\n if (latestVersion === null || latestVersion === currentVersion) {\n return;\n }\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, return silently (no whisper)\n if (!isAutoUpgradeSupported(packageManager)) {\n return;\n }\n\n // Spawn upgrade process (don't wait for completion)\n const isWindows = process.platform === \"win32\";\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"pipe\",\n detached: !isWindows,\n windowsHide: true,\n });\n\n const promise = new Promise<boolean>((resolve) => {\n child.on(\"close\", (code) => {\n return resolve(code === 0);\n });\n child.on(\"error\", () => {\n return resolve(false);\n });\n });\n\n pendingUpgrade = { promise, child, packageManager };\n}\n\n/**\n * Wait for pending upgrade to complete and show warning if failed.\n * Call this at command end.\n *\n * @param timeout - Max time to wait if upgrade still running (ms)\n * @returns Promise that resolves when upgrade completes or times out\n */\nexport async function waitForSilentUpgrade(\n timeout: number = TIMEOUT_MS,\n): Promise<void> {\n if (!pendingUpgrade) {\n return;\n }\n\n const { promise, child, packageManager } = pendingUpgrade;\n pendingUpgrade = null; // Clear state\n\n // Race between upgrade completion and timeout\n const result = await Promise.race([\n promise,\n new Promise<false>((resolve) => {\n setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeout);\n }),\n ]);\n\n // Show whisper message only on failure\n if (!result) {\n console.log(\n chalk.yellow(\n `\\n⚠ vm0 auto upgrade failed. Please run: ${getManualUpgradeCommand(packageManager)}`,\n ),\n );\n }\n}\n","import { spawn, type SpawnOptions, type ChildProcess } from \"child_process\";\n\n/**\n * Spawn a child process with safe Windows shell handling.\n *\n * On Windows, `shell: true` is required to resolve `.cmd` extensions for\n * commands like `npm`, `pnpm`, etc. On other platforms, shell is disabled\n * to avoid unnecessary shell interpretation. Commands passed to this\n * function must be hardcoded strings (not user input), and arguments\n * must use array form to prevent shell injection.\n *\n */\nexport function safeSpawn(\n command: string,\n args: string[],\n options?: Omit<SpawnOptions, \"shell\">,\n): ChildProcess {\n const isWindows = process.platform === \"win32\";\n const resolvedCommand = isWindows ? `${command}.cmd` : command;\n\n // nosemgrep: javascript.lang.security.audit.spawn-shell-true.spawn-shell-true, javascript.lang.security.detect-child-process.detect-child-process\n return spawn(resolvedCommand, args, {\n ...options,\n shell: isWindows,\n });\n}\n","import { Command, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { guaranteedConnectorProvidedBindingNames } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { extractAndGroupVariables } from \"@vm0/core/variable-expander\";\nimport {\n createOrUpdateCompose,\n listZeroSecrets,\n listZeroVariables,\n listZeroConnectors,\n} from \"../../lib/api\";\nimport { validateAgentCompose } from \"../../lib/domain/yaml-validator\";\nimport { uploadInstructions } from \"../../lib/storage/system-storage\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nconst DEFAULT_CONFIG_FILE = \"vm0.yaml\";\n\n/**\n * Extract secret names from compose content using variable references.\n * Looks for ${{ secrets.XXX }} patterns in the compose.\n */\nexport function getSecretsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.secrets.map((r) => {\n return r.name;\n }),\n );\n}\n\n/**\n * Extract variable names from compose content using variable references.\n * Looks for ${{ vars.XXX }} patterns in the compose.\n */\nfunction getVarsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.vars.map((r) => {\n return r.name;\n }),\n );\n}\n\ninterface AgentConfig {\n instructions?: string;\n framework?: string;\n environment?: Record<string, string>;\n}\n\ninterface LoadedConfig {\n config: unknown;\n agentName: string;\n agent: AgentConfig;\n basePath: string;\n}\n\n/**\n * Load and validate the compose config file.\n * Returns parsed config with agent info or exits on error.\n */\nasync function loadAndValidateConfig(\n configFile: string,\n): Promise<LoadedConfig> {\n if (!existsSync(configFile)) {\n throw new Error(`Config file not found: ${configFile}`);\n }\n\n const content = await readFile(configFile, \"utf8\");\n\n let config: unknown;\n try {\n config = parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Invalid YAML format: ${message}`);\n }\n\n const validation = validateAgentCompose(config);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n const cfg = config as Record<string, unknown>;\n const agentsConfig = cfg.agents as Record<string, Record<string, unknown>>;\n const agentName = Object.keys(agentsConfig)[0]!;\n const agent = agentsConfig[agentName] as AgentConfig;\n const basePath = dirname(configFile);\n\n return { config, agentName, agent, basePath };\n}\n\nasync function uploadInstructionsIfPresent(\n agentName: string,\n agent: AgentConfig,\n basePath: string,\n jsonMode?: boolean,\n): Promise<void> {\n if (!agent.instructions) return;\n\n if (!jsonMode) {\n console.log(`Uploading instructions: ${agent.instructions}`);\n }\n const result = await uploadInstructions(\n agentName,\n agent.instructions,\n basePath,\n agent.framework,\n );\n if (!jsonMode) {\n console.log(\n chalk.green(\n `✓ Instructions ${result.action === \"deduplicated\" ? \"(unchanged)\" : \"uploaded\"}: ${result.versionId.slice(0, 8)}`,\n ),\n );\n }\n}\n\n/**\n * Remove legacy `skills:` fields from every agent before POSTing the compose.\n * Belt-and-braces with server-side stripping planned in sibling sub-issue #9754.\n */\nfunction stripSkillsFromAgents(config: unknown): unknown {\n if (!config || typeof config !== \"object\") return config;\n const cfg = structuredClone(config) as Record<string, unknown>;\n const agents = cfg.agents;\n if (agents && typeof agents === \"object\" && !Array.isArray(agents)) {\n for (const agent of Object.values(agents as Record<string, unknown>)) {\n if (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n delete (agent as Record<string, unknown>).skills;\n }\n }\n }\n return cfg;\n}\n\n/**\n * Derive the app URL from the API URL by replacing \"www\" with \"app\" in the hostname.\n */\ninterface MissingItemsResult {\n missingSecrets: string[];\n missingVars: string[];\n}\n\n/**\n * Check for missing secrets/vars and print setup URL if any are missing.\n */\nasync function checkAndPromptMissingItems(\n config: unknown,\n options: { json?: boolean },\n): Promise<MissingItemsResult> {\n const requiredSecrets = getSecretsFromComposeContent(config);\n const requiredVars = getVarsFromComposeContent(config);\n\n if (requiredSecrets.size === 0 && requiredVars.size === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n const [secretsResponse, variablesResponse, connectorsResponse] =\n await Promise.all([\n requiredSecrets.size > 0 ? listZeroSecrets() : { secrets: [] },\n requiredVars.size > 0 ? listZeroVariables() : { variables: [] },\n listZeroConnectors(),\n ]);\n\n const existingSecretNames = new Set(\n secretsResponse.secrets.map((s) => {\n return s.name;\n }),\n );\n const existingVarNames = new Set(\n variablesResponse.variables.map((v) => {\n return v.name;\n }),\n );\n\n const guaranteedConnectorProvidedSecretNames =\n guaranteedConnectorProvidedBindingNames({\n bindings: connectorsResponse.connectorProvidedBindings,\n namespace: \"secrets\",\n });\n const guaranteedConnectorProvidedVarNames =\n guaranteedConnectorProvidedBindingNames({\n bindings: connectorsResponse.connectorProvidedBindings,\n namespace: \"vars\",\n });\n\n const missingSecrets = [...requiredSecrets].filter((name) => {\n return (\n !existingSecretNames.has(name) &&\n !guaranteedConnectorProvidedSecretNames.has(name)\n );\n });\n const missingVars = [...requiredVars].filter((name) => {\n return (\n !existingVarNames.has(name) &&\n !guaranteedConnectorProvidedVarNames.has(name)\n );\n });\n\n if (missingSecrets.length === 0 && missingVars.length === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n if (!options.json) {\n console.log();\n console.log(chalk.yellow(\"⚠ Missing secrets/variables detected:\"));\n if (missingSecrets.length > 0) {\n console.log(chalk.yellow(` Secrets: ${missingSecrets.join(\", \")}`));\n }\n if (missingVars.length > 0) {\n console.log(chalk.yellow(` Variables: ${missingVars.join(\", \")}`));\n }\n console.log();\n }\n\n return { missingSecrets, missingVars };\n}\n\n/**\n * Result from finalizeCompose for JSON output\n */\ninterface ComposeResult {\n composeId: string;\n composeName: string;\n versionId: string;\n action: \"created\" | \"existing\";\n displayName: string;\n missingSecrets?: string[];\n missingVars?: string[];\n}\n\n/**\n * Finalize compose: call API and display result.\n * Returns the compose result for JSON output mode.\n */\nasync function finalizeCompose(\n config: unknown,\n agent: AgentConfig,\n options: { yes?: boolean; autoUpdate?: boolean; json?: boolean },\n): Promise<ComposeResult> {\n // Call API\n if (!options.json) {\n console.log(\"Uploading compose...\");\n }\n const contentToPost = stripSkillsFromAgents(config);\n const response = await createOrUpdateCompose({ content: contentToPost });\n\n const shortVersionId = response.versionId.slice(0, 8);\n const displayName = response.name;\n\n // Build result\n const result: ComposeResult = {\n composeId: response.composeId,\n composeName: response.name,\n versionId: response.versionId,\n action: response.action,\n displayName,\n };\n\n // In --json mode, skip missing items check — E2B doesn't read these fields\n if (!options.json) {\n const missingItems = await checkAndPromptMissingItems(config, options);\n if (\n missingItems.missingSecrets.length > 0 ||\n missingItems.missingVars.length > 0\n ) {\n result.missingSecrets = missingItems.missingSecrets;\n result.missingVars = missingItems.missingVars;\n }\n }\n\n // Display human-readable result (skip in JSON mode)\n if (!options.json) {\n if (response.action === \"created\") {\n console.log(chalk.green(`✓ Compose created: ${displayName}`));\n } else {\n console.log(chalk.green(`✓ Compose version exists: ${displayName}`));\n }\n\n console.log(chalk.dim(` Version: ${shortVersionId}`));\n console.log();\n console.log(\" Run your agent:\");\n console.log(\n chalk.cyan(\n ` vm0 run ${displayName}:${shortVersionId} --artifact <artifact> \"your prompt\"`,\n ),\n );\n }\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n\n return result;\n}\n\nexport const composeCommand = new Command()\n .name(\"compose\")\n .description(\"Create or update agent compose (e.g., vm0.yaml)\")\n .argument(\n \"[agent-yaml]\",\n `Path to agent YAML file (default: ${DEFAULT_CONFIG_FILE})`,\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\n \"--experimental-shared-compose\",\n \"[deprecated] No longer required, kept for backward compatibility\",\n )\n .option(\"--json\", \"Output JSON for scripts (suppresses interactive output)\")\n .option(\n \"--porcelain\",\n \"[deprecated: use --json] Output JSON for scripts\",\n false,\n )\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n configFile: string | undefined,\n options: {\n yes?: boolean;\n autoUpdate?: boolean;\n experimentalSharedCompose?: boolean;\n json?: boolean;\n porcelain?: boolean;\n },\n ) => {\n const resolvedConfigFile = configFile ?? DEFAULT_CONFIG_FILE;\n\n // Handle deprecated --porcelain flag\n if (options.porcelain && !options.json) {\n console.error(\n chalk.yellow(\"⚠ --porcelain is deprecated, use --json instead\"),\n );\n options.json = true;\n }\n\n // JSON mode implies --yes and disables auto-update (for CI/CD usage)\n if (options.json) {\n options.yes = true;\n options.autoUpdate = false;\n }\n\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n try {\n const { config, agentName, agent, basePath } =\n await loadAndValidateConfig(resolvedConfigFile);\n\n await uploadInstructionsIfPresent(\n agentName,\n agent,\n basePath,\n options.json,\n );\n\n const result = await finalizeCompose(config, agent, options);\n\n // Output JSON result if requested\n if (options.json) {\n console.log(JSON.stringify(result));\n }\n } catch (error) {\n if (options.json) {\n const message =\n error instanceof Error\n ? error.message\n : \"An unexpected error occurred\";\n console.log(JSON.stringify({ error: message }));\n process.exit(1);\n }\n\n throw error;\n }\n },\n ),\n );\n","import { z } from \"zod\";\nimport {\n agentDefinitionSchema,\n volumeConfigSchema,\n} from \"@vm0/api-contracts/contracts/composes\";\n\n/**\n * CLI-specific agent name schema that allows 3-character names.\n * Pattern: start/end with alphanumeric, middle can have hyphens\n */\nconst cliAgentNameSchema = z\n .string()\n .min(3, \"Agent name must be at least 3 characters\")\n .max(64, \"Agent name must be 64 characters or less\")\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$/,\n \"Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens\",\n );\n\n/**\n * CLI compose schema with single-agent rule and volume mount validation.\n * Framework validation is handled server-side.\n */\nconst cliComposeSchema = z\n .object({\n version: z.string().min(1, \"Missing config.version\"),\n agents: z.record(cliAgentNameSchema, agentDefinitionSchema),\n volumes: z.record(z.string(), volumeConfigSchema).optional(),\n })\n .superRefine((config, ctx) => {\n const agentKeys = Object.keys(config.agents);\n\n // CLI business rule: at least one agent required\n if (agentKeys.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"agents must have at least one agent defined\",\n path: [\"agents\"],\n });\n return;\n }\n\n // CLI business rule: only one agent allowed\n if (agentKeys.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Multiple agents not supported yet. Only one agent allowed.\",\n path: [\"agents\"],\n });\n return;\n }\n\n // Volume mount validation\n const agentName = agentKeys[0]!;\n const agent = config.agents[agentName];\n const agentVolumes = agent?.volumes;\n\n if (agentVolumes && agentVolumes.length > 0) {\n if (!config.volumes) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Agent references volumes but no volumes section defined. Each volume must have explicit name and version.\",\n path: [\"volumes\"],\n });\n return;\n }\n\n for (const volDeclaration of agentVolumes) {\n const parts = volDeclaration.split(\":\");\n if (parts.length !== 2) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid volume declaration: ${volDeclaration}. Expected format: volume-key:/mount/path`,\n path: [\"agents\", agentName, \"volumes\"],\n });\n continue;\n }\n\n const volumeKey = parts[0]!.trim();\n if (!config.volumes[volumeKey]) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Volume \"${volumeKey}\" is not defined in volumes section. Each volume must have explicit name and version.`,\n path: [\"volumes\", volumeKey],\n });\n }\n }\n }\n });\n\n/**\n * Format an invalid_type Zod issue into a user-friendly message.\n * Returns null if no special formatting applies.\n */\nfunction formatInvalidTypeIssue(\n path: string,\n issue: z.ZodIssue & { expected?: string },\n): string | null {\n // Zod 4 uses 'input' instead of 'received' in types, but runtime has 'received'\n const received = (issue as unknown as { received?: string }).received;\n\n // Missing required fields (handles both \"Required\" and \"Invalid input:\" messages)\n const isMissing =\n received === \"undefined\" ||\n issue.message.includes(\"received undefined\") ||\n issue.message === \"Required\";\n\n if (path === \"version\" && isMissing) {\n return \"Missing config.version\";\n }\n if (path === \"agents\" && isMissing) {\n return \"Missing agents object in config\";\n }\n // Volume field errors\n if (path.startsWith(\"volumes.\") && path.endsWith(\".name\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'name' field (string)`;\n }\n if (path.startsWith(\"volumes.\") && path.endsWith(\".version\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'version' field (string)`;\n }\n // Array type errors\n if (issue.expected === \"array\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n return `${fieldName} must be an array`;\n }\n // Array element type errors (number where string expected)\n if (issue.expected === \"string\" && received === \"number\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n const match = fieldName.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (match) {\n return `Each entry in ${match[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n return null;\n}\n\n/**\n * Formats a Zod error into a user-friendly string\n */\nfunction formatZodError(error: z.ZodError): string {\n const issue = error.issues[0];\n if (!issue) return \"Validation failed\";\n\n const path = issue.path.join(\".\");\n const message = issue.message;\n\n // Root-level errors or custom messages without path context\n if (!path) return message;\n\n // Handle invalid_type errors with user-friendly messages\n if (issue.code === \"invalid_type\") {\n const formatted = formatInvalidTypeIssue(path, issue);\n if (formatted) return formatted;\n }\n\n // Handle invalid_key for agent name key validation (Zod 4 uses invalid_key instead of invalid_string)\n if (issue.code === \"invalid_key\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle invalid key in record (agent name validation)\n if (message === \"Invalid key in record\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle custom errors (our superRefine messages) - return without path prefix\n if (issue.code === \"custom\") {\n return message;\n }\n\n // Handle agent-level errors with cleaner paths\n if (path.startsWith(\"agents.\")) {\n const cleanPath = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n // For \"Invalid input\" messages, provide cleaner error\n if (message.startsWith(\"Invalid input:\")) {\n const match = message.match(/expected (\\w+), received (\\w+)/);\n if (match && match[1] === \"string\" && match[2] === \"number\") {\n const fieldMatch = cleanPath.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (fieldMatch) {\n return `Each entry in ${fieldMatch[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n }\n return `${cleanPath}: ${message}`;\n }\n\n return `${path}: ${message}`;\n}\n\n/**\n * Validates agent.name format\n */\nexport function validateAgentName(name: string): boolean {\n return cliAgentNameSchema.safeParse(name).success;\n}\n\n/**\n * Known fields in agent definition schema, derived from the Zod schema shape.\n * Used for typo detection against unknown fields in YAML config.\n */\nconst KNOWN_AGENT_FIELDS = Object.keys(agentDefinitionSchema.shape);\n\n/**\n * Computes Levenshtein edit distance between two strings.\n * Uses single-row DP optimization for O(min(m,n)) space.\n */\nfunction levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n // Ensure a is the shorter string for space optimization\n if (a.length > b.length) [a, b] = [b, a];\n\n const row = Array.from({ length: a.length + 1 }, (_, i) => {\n return i;\n });\n\n for (let j = 1; j <= b.length; j++) {\n let prev = j - 1;\n row[0] = j;\n for (let i = 1; i <= a.length; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const current = Math.min(\n row[i]! + 1, // deletion\n row[i - 1]! + 1, // insertion\n prev + cost, // substitution\n );\n prev = row[i]!;\n row[i] = current;\n }\n }\n\n return row[a.length]!;\n}\n\n/**\n * Finds the most similar known field for an unknown field name.\n * Uses two strategies:\n * 1. Levenshtein distance ≤ 2 for close typos (e.g., \"environments\" → \"environment\")\n * 2. Prefix containment for abbreviations (e.g., \"env\" → \"environment\")\n *\n * Returns the best matching field name, or null if no match found.\n */\nfunction findSimilarField(\n unknown: string,\n knownFields: string[],\n): string | null {\n let bestMatch: string | null = null;\n let bestDistance = Infinity;\n\n for (const known of knownFields) {\n if (unknown === known) continue;\n\n // Check 1: Levenshtein distance ≤ 2\n const distance = levenshteinDistance(unknown, known);\n if (distance <= 2 && distance < bestDistance) {\n bestDistance = distance;\n bestMatch = known;\n }\n\n // Check 2: Prefix containment (unknown is a prefix of known, min 3 chars)\n if (unknown.length >= 3 && known.startsWith(unknown) && !bestMatch) {\n bestMatch = known;\n }\n }\n\n return bestMatch;\n}\n\n/**\n * Extracts agent entries from raw config, with type guards.\n * Returns null if config structure is invalid for agent inspection.\n */\nfunction extractAgentEntries(\n config: unknown,\n): Record<string, Record<string, unknown>> | null {\n if (!config || typeof config !== \"object\") return null;\n const cfg = config as Record<string, unknown>;\n const agents = cfg.agents as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (!agents || typeof agents !== \"object\" || Array.isArray(agents))\n return null;\n return agents;\n}\n\n/**\n * Checks for unknown fields in agent definitions that look like typos.\n * Returns an error message listing all detected typos, or null if none found.\n */\nfunction checkForFieldTypos(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n const errors: string[] = [];\n\n for (const [agentName, agent] of Object.entries(agents)) {\n if (!agent || typeof agent !== \"object\" || Array.isArray(agent)) continue;\n\n for (const field of Object.keys(agent)) {\n if (KNOWN_AGENT_FIELDS.includes(field)) continue;\n\n const suggestion = findSimilarField(field, KNOWN_AGENT_FIELDS);\n if (suggestion) {\n errors.push(\n `Unknown field \"${field}\" in agent \"${agentName}\". Did you mean \"${suggestion}\"?`,\n );\n }\n }\n }\n\n return errors.length > 0 ? errors.join(\"\\n\") : null;\n}\n\n/**\n * Checks for deprecated 'provider' field and returns migration error message\n */\nfunction checkForDeprecatedProvider(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n for (const agent of Object.values(agents)) {\n if (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n if (\"provider\" in agent && !(\"framework\" in agent)) {\n const providerValue = agent.provider;\n return `'provider' field is deprecated. Use 'framework' instead.\\n\\nChange in your vm0.yaml:\\n - provider: ${providerValue}\\n + framework: ${providerValue}`;\n }\n }\n }\n return null;\n}\n\n/**\n * Validates agent compose structure using Zod schemas\n */\nexport function validateAgentCompose(config: unknown): {\n valid: boolean;\n error?: string;\n} {\n // Pre-check: Deprecated 'provider' field\n const deprecationError = checkForDeprecatedProvider(config);\n if (deprecationError) {\n return { valid: false, error: deprecationError };\n }\n\n // Pre-check: Detect likely typos in agent definition fields\n const typoError = checkForFieldTypos(config);\n if (typoError) {\n return { valid: false, error: typoError };\n }\n\n // Pre-check: Better error for array agents (common mistake)\n if (\n config &&\n typeof config === \"object\" &&\n Array.isArray((config as Record<string, unknown>).agents)\n ) {\n return {\n valid: false,\n error:\n \"agents must be an object, not an array. Use format: agents: { agent-name: { ... } }\",\n };\n }\n\n // Pre-check: Basic object check\n if (!config || typeof config !== \"object\") {\n return { valid: false, error: \"Config must be an object\" };\n }\n\n // Main validation using CLI compose schema\n const result = cliComposeSchema.safeParse(config);\n if (!result.success) {\n return { valid: false, error: formatZodError(result.error) };\n }\n\n return { valid: true };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { getInstructionsStorageName } from \"@vm0/core/storage-names\";\nimport { directUpload } from \"./direct-upload\";\nimport { getInstructionsFilename } from \"@vm0/core/frameworks\";\n\ninterface StorageUploadResult {\n name: string;\n versionId: string;\n action: \"created\" | \"deduplicated\";\n}\n\n/**\n * Upload instructions file as a volume\n *\n * @param agentName - Name of the agent (used for storage name)\n * @param instructionsFilePath - Path to the instructions file (e.g., AGENTS.md)\n * @param basePath - Base path for resolving relative paths\n * @param framework - Framework name for determining canonical filename\n * @returns Upload result with storage name and version\n */\nexport async function uploadInstructions(\n agentName: string,\n instructionsFilePath: string,\n basePath: string,\n framework?: string,\n): Promise<StorageUploadResult> {\n // Normalize agent name to lowercase to match server's normalization behavior\n // Server normalizes agent names to lowercase when storing compose configs\n const storageName = getInstructionsStorageName(agentName.toLowerCase());\n\n // Resolve file path relative to base path\n const absolutePath = path.isAbsolute(instructionsFilePath)\n ? instructionsFilePath\n : path.join(basePath, instructionsFilePath);\n\n // Read the instructions file\n const content = await fs.readFile(absolutePath, \"utf8\");\n\n // Create a temporary directory with the file\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-instructions-\"));\n const instructionsDir = path.join(tmpDir, \"instructions\");\n await fs.mkdir(instructionsDir);\n\n // Write file with framework-specific name (e.g., CLAUDE.md for claude-code)\n const filename = getInstructionsFilename(framework);\n await fs.writeFile(path.join(instructionsDir, filename), content);\n\n try {\n // Use direct upload (bypasses Vercel 4.5MB limit)\n const result = await directUpload(storageName, \"volume\", instructionsDir);\n\n return {\n name: storageName,\n versionId: result.versionId,\n action: result.deduplicated ? \"deduplicated\" : \"created\",\n };\n } finally {\n // Clean up temp directory\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n}\n","import { createHash } from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { prepareStorage, commitStorage } from \"../api\";\nimport { excludeVm0Filter } from \"../utils/file-utils\";\n\n/**\n * File entry with pre-computed hash for direct upload\n */\ninterface FileEntryWithHash {\n path: string;\n hash: string;\n size: number;\n}\n\n/**\n * Result of direct upload operation\n */\ninterface DirectUploadResult {\n versionId: string;\n size: number;\n fileCount: number;\n deduplicated: boolean;\n empty: boolean;\n}\n\n/**\n * Progress callback for upload operations\n */\ntype ProgressCallback = (message: string) => void;\n\n/**\n * Compute SHA-256 hash of a file using streaming to avoid loading large files into memory\n */\nasync function hashFileStream(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(\"sha256\");\n const stream = fs.createReadStream(filePath);\n\n stream.on(\"data\", (chunk) => {\n return hash.update(chunk);\n });\n stream.on(\"end\", () => {\n return resolve(hash.digest(\"hex\"));\n });\n stream.on(\"error\", reject);\n });\n}\n\n/**\n * Get all files in directory recursively, excluding .vm0/\n */\nasync function getAllFiles(\n dirPath: string,\n baseDir: string = dirPath,\n): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n // Skip .vm0 directory\n if (relativePath.startsWith(\".vm0\")) {\n continue;\n }\n\n if (entry.isDirectory()) {\n const subFiles = await getAllFiles(fullPath, baseDir);\n files.push(...subFiles);\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Collect file metadata with hashes using streaming to handle large files\n */\nasync function collectFileMetadata(\n cwd: string,\n files: string[],\n onProgress?: ProgressCallback,\n): Promise<FileEntryWithHash[]> {\n const fileEntries: FileEntryWithHash[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const relativePath = path.relative(cwd, file);\n\n // Use streaming hash to avoid loading large files into memory\n const [hash, stats] = await Promise.all([\n hashFileStream(file),\n fs.promises.stat(file),\n ]);\n\n fileEntries.push({\n path: relativePath,\n hash,\n size: stats.size,\n });\n\n // Report progress every 100 files\n if (onProgress && (i + 1) % 100 === 0) {\n onProgress(`Hashing files... ${i + 1}/${files.length}`);\n }\n }\n\n return fileEntries;\n}\n\n/**\n * Create tar.gz archive of files\n */\nasync function createArchive(cwd: string, files: string[]): Promise<Buffer> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n\n try {\n const relativePaths = files.map((file) => {\n return path.relative(cwd, file);\n });\n\n if (relativePaths.length > 0) {\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n },\n relativePaths,\n );\n } else {\n // For empty directories, create tar.gz excluding .vm0\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n filter: excludeVm0Filter,\n },\n [\".\"],\n );\n }\n\n const tarBuffer = await fs.promises.readFile(tarPath);\n return tarBuffer;\n } finally {\n // Clean up temp files\n if (fs.existsSync(tarPath)) {\n await fs.promises.unlink(tarPath);\n }\n await fs.promises.rmdir(tmpDir);\n }\n}\n\n/**\n * Create manifest JSON for the upload\n */\nfunction createManifest(files: FileEntryWithHash[]): Buffer {\n const manifest = {\n version: 1,\n files,\n createdAt: new Date().toISOString(),\n };\n return Buffer.from(JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Upload buffer to presigned URL with retry logic\n */\nasync function uploadToPresignedUrl(\n presignedUrl: string,\n data: Buffer,\n contentType: string,\n maxRetries: number = 3,\n): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(presignedUrl, {\n method: \"PUT\",\n body: data,\n headers: {\n \"Content-Type\": contentType,\n },\n });\n\n if (response.ok) {\n return;\n }\n\n // For 4xx errors (client errors), don't retry\n if (response.status >= 400 && response.status < 500) {\n const text = await response.text();\n throw new Error(`S3 upload failed: ${response.status} - ${text}`);\n }\n\n // For 5xx errors, retry with backoff\n const text = await response.text();\n lastError = new Error(`S3 upload failed: ${response.status} - ${text}`);\n } catch (error) {\n lastError =\n error instanceof Error ? error : new Error(\"Unknown upload error\");\n\n // Don't retry on client errors\n if (\n lastError.message.includes(\"400\") ||\n lastError.message.includes(\"403\")\n ) {\n throw lastError;\n }\n }\n\n // Exponential backoff: 1s, 2s, 4s...\n if (attempt < maxRetries) {\n const backoffMs = Math.pow(2, attempt - 1) * 1000;\n await sleep(backoffMs);\n }\n }\n\n throw lastError || new Error(\"S3 upload failed after retries\");\n}\n\n/**\n * Options for direct upload\n */\ninterface DirectUploadOptions {\n onProgress?: ProgressCallback;\n force?: boolean;\n}\n\n/**\n * Perform direct S3 upload for a storage (volume or artifact)\n *\n * This bypasses Vercel's 4.5MB request body limit by:\n * 1. Computing file hashes locally\n * 2. Getting presigned URLs from /api/storages/prepare\n * 3. Uploading directly to S3\n * 4. Committing via /api/storages/commit\n */\nexport async function directUpload(\n storageName: string,\n storageType: \"volume\" | \"artifact\",\n cwd: string,\n options?: DirectUploadOptions,\n): Promise<DirectUploadResult> {\n const { onProgress, force } = options || {};\n\n // Step 1: Collect all files\n onProgress?.(\"Collecting files...\");\n const files = await getAllFiles(cwd);\n\n // Step 2: Compute hashes for all files\n onProgress?.(\"Computing file hashes...\");\n const fileEntries = await collectFileMetadata(cwd, files, onProgress);\n\n // Step 3: Call prepare endpoint\n onProgress?.(\"Preparing upload...\");\n const prepareResult = await prepareStorage({\n storageName,\n storageType,\n files: fileEntries,\n force,\n });\n\n // Step 4: Check if version already exists (deduplication)\n // Skip upload but still call commit to update HEAD (fixes #626)\n if (prepareResult.existing) {\n onProgress?.(\"Version exists, updating HEAD...\");\n\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: true,\n empty: commitResult.fileCount === 0,\n };\n }\n\n // Step 5: Create and upload archive (skip for empty artifacts)\n if (files.length > 0) {\n onProgress?.(\"Compressing files...\");\n const archiveBuffer = await createArchive(cwd, files);\n\n onProgress?.(\"Uploading archive to S3...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n\n await uploadToPresignedUrl(\n prepareResult.uploads.archive.presignedUrl,\n archiveBuffer,\n \"application/gzip\",\n );\n }\n\n // Step 6: Create and upload manifest\n onProgress?.(\"Uploading manifest...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n const manifestBuffer = createManifest(fileEntries);\n await uploadToPresignedUrl(\n prepareResult.uploads.manifest.presignedUrl,\n manifestBuffer,\n \"application/json\",\n );\n\n // Step 7: Commit the upload\n onProgress?.(\"Committing...\");\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: commitResult.deduplicated || false,\n empty: commitResult.fileCount === 0,\n };\n}\n","import { mainRunCommand } from \"./run\";\nimport { resumeCommand } from \"./resume\";\nimport { continueCommand } from \"./continue\";\nimport { listCommand } from \"./list\";\nimport { killCommand } from \"./kill\";\nimport { queueCommand } from \"./queue\";\n\n// Add subcommands to the main run command\nmainRunCommand.addCommand(resumeCommand);\nmainRunCommand.addCommand(continueCommand);\nmainRunCommand.addCommand(listCommand);\nmainRunCommand.addCommand(killCommand);\nmainRunCommand.addCommand(queueCommand);\n\nexport const runCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport {\n directRunModelProviderTypeSchema,\n type DirectRunModelProviderType,\n} from \"@vm0/api-contracts/contracts/runs\";\nimport {\n getComposeById,\n getComposeByName,\n getComposeVersion,\n createRun,\n} from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n collectMounts,\n collectArtifacts,\n isUUID,\n extractVarNames,\n extractSecretNames,\n loadValues,\n parsePermissionPolicies,\n parseIdentifier,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction parseModelProviderType(\n value: string | undefined,\n): DirectRunModelProviderType | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = directRunModelProviderTypeSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid model provider type: ${value}`);\n }\n return parsed.data;\n}\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Run an agent\")\n .argument(\n \"<agent-name>\",\n \"Agent reference: name[:version] (e.g., 'my-agent', 'my-agent:abc123', 'my-agent:latest')\",\n )\n .argument(\"<prompt>\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable, format: volumeName=version)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--conversation <id>\",\n \"Resume from conversation ID (for fine-grained control)\",\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .option(\n \"--capture-network-bodies\",\n \"Capture HTTP header names, selected safe header values, request bodies, and response bodies in network logs\",\n )\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .addOption(new Option(\"--model-provider-type <type>\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n identifier: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volumeVersion: Record<string, string>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n conversation?: string;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n captureNetworkBodies?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n modelProviderType?: string;\n autoUpdate?: boolean;\n },\n ) => {\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n // 1. Parse identifier for optional version specifier\n const { name, version } = parseIdentifier(identifier);\n\n // 2. Resolve name to composeId and get compose content\n let composeId: string;\n let composeContent: unknown;\n\n if (isUUID(name)) {\n // It's a UUID compose ID - fetch compose to get content\n const compose = await getComposeById(name);\n composeId = compose.id;\n composeContent = compose.content;\n } else {\n // It's an agent name - resolve to compose ID\n const compose = await getComposeByName(name);\n if (!compose) {\n throw new Error(`Agent not found: ${identifier}`, {\n cause: new Error(\n \"Make sure you've composed the agent with: vm0 compose\",\n ),\n });\n }\n\n composeId = compose.id;\n composeContent = compose.content;\n }\n\n // 3. Resolve version if specified\n let agentComposeVersionId: string | undefined;\n\n if (version && version !== \"latest\") {\n // Resolve version hash to full version ID\n try {\n const versionInfo = await getComposeVersion(composeId, version);\n agentComposeVersionId = versionInfo.versionId;\n } catch (error) {\n throw new Error(`Version not found: ${version}`, {\n cause: error,\n });\n }\n }\n // Note: \"latest\" version uses agentComposeId which resolves to HEAD\n\n // 4. Load vars and secrets with priority: CLI args > --env-file > env vars\n const varNames = extractVarNames(composeContent);\n const vars = loadValues(options.vars, varNames, options.envFile);\n\n const secretNames = extractSecretNames(composeContent);\n const secrets = loadValues(\n options.secrets,\n secretNames,\n options.envFile,\n );\n\n // 5. Prepare optional fields\n const volumeVersions =\n Object.keys(options.volumeVersion).length > 0\n ? options.volumeVersion\n : undefined;\n const additionalVolumes =\n options.volume.length > 0 ? options.volume : undefined;\n const artifacts =\n options.artifact.length > 0 ? options.artifact : undefined;\n\n // 6. Call unified API (server handles all variable expansion)\n const response = await createRun({\n // Use agentComposeVersionId if resolved, otherwise use agentComposeId (resolves to HEAD)\n ...(agentComposeVersionId\n ? { agentComposeVersionId }\n : { agentComposeId: composeId }),\n prompt,\n vars,\n secrets,\n artifacts,\n volumeVersions,\n additionalVolumes,\n conversationId: options.conversation,\n appendSystemPrompt: options.appendSystemPrompt,\n disallowedTools: options.disallowedTools,\n tools: options.tools,\n settings: options.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies,\n ),\n captureNetworkBodies: options.captureNetworkBodies || undefined,\n debugNoMockClaude: options.debugNoMockClaude || undefined,\n debugNoMockCodex: options.debugNoMockCodex || undefined,\n modelProviderType: parseModelProviderType(options.modelProviderType),\n });\n\n // 7. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 8. Display run started/queued info\n renderRunCreated(response);\n\n // 9. Poll for events and exit with appropriate code\n const result = await pollEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getCheckpoint, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n collectMounts,\n collectArtifacts,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\"Resume an agent run from a checkpoint (uses all snapshot data)\")\n .argument(\"<checkpointId>\", \"Checkpoint ID to resume from\")\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .action(\n withErrorHandler(\n async (\n checkpointId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n volumeVersion: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate checkpoint ID format\n if (!isUUID(checkpointId)) {\n throw new Error(`Invalid checkpoint ID format: ${checkpointId}`, {\n cause: new Error(\"Checkpoint ID must be a valid UUID\"),\n });\n }\n\n // 2. Fetch checkpoint info to get required secret names\n // This allows loading secrets from environment variables\n const checkpointInfo = await getCheckpoint(checkpointId);\n const requiredSecretNames =\n checkpointInfo.agentComposeSnapshot.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Prepare optional fields\n // Commander routes the repeatable --artifact to either the subcommand's\n // own options or the parent's, depending on where the user put the flag.\n // Prefer the one with entries; fall back to the other.\n const artifactsInput =\n options.artifact.length > 0 ? options.artifact : allOpts.artifact;\n const artifacts =\n artifactsInput.length > 0 ? artifactsInput : undefined;\n const resolvedVars = Object.keys(vars).length > 0 ? vars : undefined;\n const volumeVersions =\n Object.keys(allOpts.volumeVersion).length > 0\n ? allOpts.volumeVersion\n : undefined;\n const additionalVolumes =\n allOpts.volume.length > 0 ? allOpts.volume : undefined;\n\n // 5. Call unified API with checkpointId\n const response = await createRun({\n checkpointId,\n prompt,\n vars: resolvedVars,\n secrets: loadedSecrets,\n artifacts,\n volumeVersions,\n additionalVolumes,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n debugNoMockClaude:\n options.debugNoMockClaude || allOpts.debugNoMockClaude,\n debugNoMockCodex:\n options.debugNoMockCodex || allOpts.debugNoMockCodex,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getSession, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectMounts,\n collectArtifacts,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Pick the first truthy value, falling back to `undefined`. Used to merge\n * commander.js subcommand options with parent options when a flag can land\n * on either depending on argv ordering. Extracted to keep the action\n * handler's cyclomatic complexity below the lint threshold.\n */\nfunction pickOpt<T>(a: T | undefined, b: T | undefined): T | undefined {\n return a || b || undefined;\n}\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue an agent run from a session (uses latest artifact version)\",\n )\n .argument(\"<agentSessionId>\", \"Agent session ID to continue from\")\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .action(\n withErrorHandler(\n async (\n agentSessionId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate session ID format\n if (!isUUID(agentSessionId)) {\n throw new Error(\n `Invalid agent session ID format: ${agentSessionId}`,\n { cause: new Error(\"Agent session ID must be a valid UUID\") },\n );\n }\n\n // 2. Fetch session info to get required secret names\n // This allows loading secrets from environment variables\n const sessionInfo = await getSession(agentSessionId);\n const requiredSecretNames = sessionInfo.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Prepare optional fields\n // Commander routes the repeatable --artifact to either the subcommand's\n // own options or the parent's, depending on where the user put the flag.\n // Prefer the one with entries; fall back to the other.\n const artifactsInput =\n options.artifact.length > 0 ? options.artifact : allOpts.artifact;\n const artifacts =\n artifactsInput.length > 0 ? artifactsInput : undefined;\n\n // 5. Call unified API with sessionId\n const response = await createRun({\n sessionId: agentSessionId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n artifacts,\n additionalVolumes:\n allOpts.volume.length > 0 ? allOpts.volume : undefined,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n debugNoMockClaude: pickOpt(\n options.debugNoMockClaude,\n allOpts.debugNoMockClaude,\n ),\n debugNoMockCodex: pickOpt(\n options.debugNoMockCodex,\n allOpts.debugNoMockCodex,\n ),\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listRuns } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport {\n ALL_RUN_STATUSES,\n type RunListItem,\n type RunStatus,\n} from \"@vm0/api-contracts/contracts/runs\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/** Standard UUID string length (with hyphens) */\nconst UUID_LENGTH = 36;\n\n/** All valid status values as a string for help text */\nconst VALID_STATUSES = ALL_RUN_STATUSES.join(\",\");\n\n/**\n * Command options type\n */\ninterface ListOptions {\n status?: string;\n all?: boolean;\n agent?: string;\n since?: string;\n until?: string;\n limit?: string;\n}\n\n/**\n * Format run status with color and optional padding\n */\nfunction formatRunStatus(status: RunStatus, width?: number): string {\n const paddedStatus = width ? status.padEnd(width) : status;\n switch (status) {\n case \"queued\":\n return chalk.blue(paddedStatus);\n case \"running\":\n return chalk.green(paddedStatus);\n case \"pending\":\n return chalk.yellow(paddedStatus);\n case \"completed\":\n return chalk.dim(paddedStatus);\n case \"failed\":\n case \"timeout\":\n return chalk.red(paddedStatus);\n default:\n return paddedStatus;\n }\n}\n\n/**\n * Validate and parse status filter from options\n */\nfunction parseStatusFilter(options: ListOptions): string | undefined {\n if (options.all) {\n return VALID_STATUSES;\n }\n\n if (options.status) {\n const values = options.status.split(\",\").map((s) => {\n return s.trim();\n });\n for (const v of values) {\n if (!ALL_RUN_STATUSES.includes(v as RunStatus)) {\n throw new Error(`Invalid status \"${v}\"`, {\n cause: new Error(`Valid values: ${VALID_STATUSES}`),\n });\n }\n }\n return values.join(\",\");\n }\n\n if (options.since) {\n // Implicit all when --since is used\n return VALID_STATUSES;\n }\n\n // undefined = backend default (pending,running)\n return undefined;\n}\n\n/**\n * Parse time option to ISO string\n */\nfunction parseTimeOption(value: string, optionName: string): string {\n try {\n return new Date(parseTime(value)).toISOString();\n } catch {\n throw new Error(\n `Invalid ${optionName} format. Use ISO (2026-01-01) or relative (1h, 7d, 30d)`,\n );\n }\n}\n\n/**\n * Parse and validate limit option\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 100) {\n throw new Error(\"--limit must be between 1 and 100\");\n }\n return limit;\n}\n\n/**\n * Display runs in table format\n */\nfunction displayRuns(runs: RunListItem[]): void {\n // Calculate column widths\n const agentWidth = Math.max(\n 5,\n ...runs.map((r) => {\n return r.agentName.length;\n }),\n );\n const statusWidth = Math.max(\n 6,\n ...runs.map((r) => {\n return r.status.length;\n }),\n );\n\n // Print header\n const header = [\n \"ID\".padEnd(UUID_LENGTH),\n \"AGENT\".padEnd(agentWidth),\n \"STATUS\".padEnd(statusWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const run of runs) {\n const row = [\n run.id.padEnd(UUID_LENGTH),\n run.agentName.padEnd(agentWidth),\n formatRunStatus(run.status, statusWidth),\n formatRelativeTime(run.createdAt),\n ].join(\" \");\n console.log(row);\n }\n}\n\n/**\n * Display empty state message\n */\nfunction displayEmptyState(hasFilters: boolean): void {\n if (hasFilters) {\n console.log(chalk.dim(\"No runs found matching filters\"));\n } else {\n console.log(chalk.dim(\"No active runs\"));\n console.log(chalk.dim(' Run: vm0 run <agent> \"<prompt>\"'));\n }\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List runs\")\n .option(\n \"--status <status,...>\",\n `Filter by status: ${VALID_STATUSES} (default: pending,running)`,\n )\n .option(\"--all\", \"Show all statuses (mutually exclusive with --status)\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--since <date>\", \"Start time (ISO format or relative: 1h, 7d, 30d)\")\n .option(\"--until <date>\", \"End time (defaults to now)\")\n .option(\"--limit <n>\", \"Maximum number of results (default: 50, max: 100)\")\n .action(\n withErrorHandler(async (options: ListOptions) => {\n // Validate mutual exclusion\n if (options.all && options.status) {\n throw new Error(\"--all and --status are mutually exclusive\");\n }\n\n // Parse options\n const statusFilter = parseStatusFilter(options);\n const since = options.since\n ? parseTimeOption(options.since, \"--since\")\n : undefined;\n const until = options.until\n ? parseTimeOption(options.until, \"--until\")\n : undefined;\n const limit = parseLimit(options.limit);\n\n // Validate since < until\n if (since && until && new Date(since) >= new Date(until)) {\n throw new Error(\"--since must be before --until\");\n }\n\n // Fetch runs with filters\n const response = await listRuns({\n status: statusFilter,\n agent: options.agent,\n since,\n until,\n limit,\n });\n\n const runs = response.runs;\n\n if (runs.length === 0) {\n const hasFilters = !!(\n options.status ||\n options.all ||\n options.agent ||\n options.since\n );\n displayEmptyState(hasFilters);\n return;\n }\n\n displayRuns(runs);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cancelRun } from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const killCommand = new Command()\n .name(\"kill\")\n .description(\"Kill (cancel) a pending or running run\")\n .argument(\"<run-id>\", \"Run ID to kill\")\n .action(\n withErrorHandler(async (runId: string) => {\n await cancelRun(runId);\n console.log(chalk.green(`✓ Run ${runId} cancelled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getRunQueue } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const queueCommand = new Command()\n .name(\"queue\")\n .description(\"Show org run queue status\")\n .action(\n withErrorHandler(async () => {\n const data = await getRunQueue();\n const { concurrency, queue } = data;\n\n // Concurrency header\n const limitDisplay =\n concurrency.limit === 0\n ? \"unlimited\"\n : `${concurrency.active}/${concurrency.limit} slots used`;\n console.log(`Concurrency: ${limitDisplay} (${concurrency.tier} tier)`);\n\n // Queue status\n if (queue.length === 0) {\n console.log(chalk.dim(\"Queue: empty — all slots available\"));\n return;\n }\n\n console.log(\n `Queue: ${queue.length} run${queue.length > 1 ? \"s\" : \"\"} waiting`,\n );\n console.log();\n\n // Dynamic column widths\n const posWidth = Math.max(1, String(queue.length).length);\n const agentWidth = Math.max(\n 5,\n ...queue.map((e) => {\n return (e.agentName ?? \"-\").length;\n }),\n );\n const emailWidth = Math.max(\n 4,\n ...queue.map((e) => {\n return (e.userEmail ?? \"-\").length;\n }),\n );\n\n // Header\n const header = [\n \"#\".padEnd(posWidth),\n \"AGENT\".padEnd(agentWidth),\n \"USER\".padEnd(emailWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Rows\n for (const entry of queue) {\n const marker = entry.runId !== null ? chalk.cyan(\" ← you\") : \"\";\n const row = [\n String(entry.position).padEnd(posWidth),\n (entry.agentName ?? \"-\").padEnd(agentWidth),\n (entry.userEmail ?? \"-\").padEnd(emailWidth),\n formatRelativeTime(entry.createdAt),\n ].join(\" \");\n console.log(row + marker);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const volumeCommand = new Command()\n .name(\"volume\")\n .description(\"Manage volumes (defined in compose, not versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a volume in the current directory\")\n .option(\"-n, --name <name>\", \"Volume name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if storage config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n console.log(\n chalk.yellow(`Volume already initialized: ${existingConfig.name}`),\n );\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine volume name\n let volumeName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n volumeName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 volume init --name <volume-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter volume name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n volumeName = name;\n }\n\n // Validate volume name\n if (!isValidStorageName(volumeName)) {\n throw new Error(`Invalid volume name: \"${volumeName}\"`, {\n cause: new Error(\n \"Volume names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file\n await writeStorageConfig(volumeName, cwd);\n\n console.log(chalk.green(`✓ Initialized volume: ${volumeName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport path from \"path\";\n\n/**\n * Storage type\n * - \"volume\": Static storage that doesn't auto-version after runs\n * - \"artifact\": Work products that auto-version after runs\n */\nexport type StorageType = \"volume\" | \"artifact\";\n\ninterface StorageConfig {\n name: string;\n type: StorageType;\n}\n\nconst CONFIG_DIR = \".vm0\";\nconst CONFIG_FILE = \"storage.yaml\";\n\n/**\n * Validate storage name format\n * Length: 3-64 characters\n * Characters: lowercase letters, numbers, hyphens\n * Must start and end with alphanumeric\n * No consecutive hyphens\n */\nexport function isValidStorageName(name: string): boolean {\n if (name.length < 3 || name.length > 64) {\n return false;\n }\n const pattern = /^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/;\n return pattern.test(name) && !name.includes(\"--\");\n}\n\n/**\n * Read storage config from .vm0/storage.yaml\n * Also supports legacy .vm0/volume.yaml for backward compatibility\n */\nexport async function readStorageConfig(\n basePath: string = process.cwd(),\n): Promise<StorageConfig | null> {\n const configPath = path.join(basePath, CONFIG_DIR, CONFIG_FILE);\n const legacyConfigPath = path.join(basePath, CONFIG_DIR, \"volume.yaml\");\n\n // Check for new config file first, then legacy\n let actualPath: string | null = null;\n if (existsSync(configPath)) {\n actualPath = configPath;\n } else if (existsSync(legacyConfigPath)) {\n actualPath = legacyConfigPath;\n }\n\n if (!actualPath) {\n return null;\n }\n\n const content = await readFile(actualPath, \"utf8\");\n const config = parseYaml(content) as StorageConfig;\n\n // Default to \"volume\" type for backward compatibility\n if (!config.type) {\n config.type = \"volume\";\n }\n\n return config;\n}\n\n/**\n * Write storage config to .vm0/storage.yaml\n */\nexport async function writeStorageConfig(\n storageName: string,\n basePath: string = process.cwd(),\n type: StorageType = \"volume\",\n): Promise<void> {\n const configDir = path.join(basePath, CONFIG_DIR);\n const configPath = path.join(configDir, CONFIG_FILE);\n\n // Create .vm0 directory if it doesn't exist\n if (!existsSync(configDir)) {\n await mkdir(configDir, { recursive: true });\n }\n\n const config: StorageConfig = {\n name: storageName,\n type,\n };\n\n const yamlContent = stringifyYaml(config);\n await writeFile(configPath, yamlContent, \"utf8\");\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud volume\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n console.log(`Pushing volume: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"volume\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty volume)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud files to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (versionId) {\n console.log(`Pulling volume: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling volume: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n version: versionId,\n });\n\n // Handle empty volume\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"volume.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import chalk from \"chalk\";\nimport { removeExtraFiles } from \"../utils/file-utils\";\n\n/**\n * Result of handling an empty storage response (HTTP 204).\n */\ninterface EmptyStorageResult {\n removedCount: number;\n}\n\n/**\n * Handle empty storage response (HTTP 204 No Content).\n * Syncs local directory to empty state by removing all tracked files.\n *\n * @param cwd - Current working directory\n * @returns Result with count of removed files\n */\nexport async function handleEmptyStorageResponse(\n cwd: string,\n): Promise<EmptyStorageResult> {\n console.log(chalk.dim(\"Syncing local files...\"));\n\n // Sync to empty state - remove all local files\n const removedCount = await removeExtraFiles(cwd, new Set());\n\n if (removedCount > 0) {\n console.log(chalk.green(`✓ Removed ${removedCount} files not in remote`));\n }\n\n console.log(chalk.green(\"✓ Synced (0 files)\"));\n\n return { removedCount };\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud volume\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (config.type !== \"volume\") {\n throw new Error(\n \"This directory is initialized as an artifact, not a volume\",\n { cause: new Error(\"Use: vm0 artifact status\") },\n );\n }\n\n // Start message\n console.log(`Checking volume: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 volume push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote volumes\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"volume\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No volumes found\"));\n console.log(\n chalk.dim(\" Create one with: vm0 volume init && vm0 volume push\"),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote volume to local directory (latest version)\")\n .argument(\"<name>\", \"Volume name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: volume name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use volume name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning volume: ${name}`);\n\n const result = await cloneStorage(name, \"volume\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned volume: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { writeStorageConfig, type StorageType } from \"./storage-utils\";\nimport { getStorageDownload } from \"../api\";\nimport {\n listTarFiles,\n formatBytes,\n checkDirectoryStatus,\n} from \"../utils/file-utils\";\n\ninterface CloneOptions {\n version?: string;\n}\n\ninterface CloneResult {\n success: boolean;\n fileCount: number;\n size: number;\n versionId: string;\n}\n\n/**\n * Clone a remote storage to a local directory\n * Creates the directory, downloads contents, and initializes .vm0 config\n */\nexport async function cloneStorage(\n name: string,\n type: StorageType,\n destination: string,\n options: CloneOptions = {},\n): Promise<CloneResult> {\n const typeLabel = type;\n\n // Check if destination already exists and is non-empty\n const dirStatus = checkDirectoryStatus(destination);\n if (dirStatus.exists && !dirStatus.empty) {\n throw new Error(`Directory \"${destination}\" is not empty`);\n }\n\n // Check if storage exists on remote\n console.log(chalk.dim(`Checking remote ${typeLabel}...`));\n\n const downloadInfo = await getStorageDownload({\n name,\n type,\n version: options.version,\n });\n\n // Create destination directory\n console.log(chalk.dim(`Creating directory: ${destination}/`));\n await fs.promises.mkdir(destination, { recursive: true });\n\n // Handle empty storage (type guard)\n if (\"empty\" in downloadInfo) {\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n\n console.log(chalk.green(`✓ Cloned empty ${typeLabel}: ${name}`));\n console.log(chalk.dim(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: 0,\n size: 0,\n versionId: downloadInfo.versionId,\n };\n }\n\n // TypeScript now knows downloadInfo has url property\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n // Clean up directory on failure\n await fs.promises.rm(destination, { recursive: true, force: true });\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-clone-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get file list from tar\n const files = await listTarFiles(tarPath);\n\n // Extract tar.gz to destination\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: destination,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${files.length} files`));\n\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n console.log(chalk.green(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: downloadInfo.fileCount,\n size: downloadInfo.size,\n versionId: downloadInfo.versionId,\n };\n}\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const artifactCommand = new Command()\n .name(\"artifact\")\n .description(\"Manage artifacts (specified at run, versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize an artifact in the current directory\")\n .option(\n \"-n, --name <name>\",\n \"Artifact name (required in non-interactive mode)\",\n )\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n if (existingConfig.type === \"artifact\") {\n console.log(\n chalk.yellow(\n `Artifact already initialized: ${existingConfig.name}`,\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Directory already initialized as volume: ${existingConfig.name}`,\n ),\n );\n console.log(\n chalk.dim(\n \" To change type, delete .vm0/storage.yaml and reinitialize\",\n ),\n );\n }\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine artifact name\n let artifactName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n artifactName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 artifact init --name <artifact-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter artifact name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n artifactName = name;\n }\n\n // Validate name\n if (!isValidStorageName(artifactName)) {\n throw new Error(`Invalid artifact name: \"${artifactName}\"`, {\n cause: new Error(\n \"Artifact names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file with type: artifact\n await writeStorageConfig(artifactName, cwd, \"artifact\");\n\n console.log(chalk.green(`✓ Initialized artifact: ${artifactName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud artifact\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume push\") },\n );\n }\n\n console.log(`Pushing artifact: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"artifact\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty artifact)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud artifact to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume pull\") },\n );\n }\n\n if (versionId) {\n console.log(`Pulling artifact: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling artifact: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n version: versionId,\n });\n\n // Handle empty artifact\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"artifact.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud artifact\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume status\") },\n );\n }\n\n // Start message\n console.log(`Checking artifact: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 artifact push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote artifacts\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"artifact\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No artifacts found\"));\n console.log(\n chalk.dim(\n \" Create one with: vm0 artifact init && vm0 artifact push\",\n ),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote artifact to local directory (latest version)\")\n .argument(\"<name>\", \"Artifact name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: artifact name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use artifact name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning artifact: ${name}`);\n\n const result = await cloneStorage(name, \"artifact\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned artifact: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getAgentEvents,\n getSystemLog,\n getMetrics,\n getNetworkLogs,\n type TelemetryMetric,\n type RunEvent,\n type NetworkLogEntry,\n} from \"../../lib/api\";\nimport { getApiUrl } from \"../../lib/api/config\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { EventStreamNormalizer } from \"../../lib/events/event-stream-normalizer\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport {\n collectLogItems,\n parsePositiveLogCount,\n} from \"../../lib/utils/log-pagination\";\nimport { searchCommand } from \"./search\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Maximum entries per API request\n */\nconst PAGE_LIMIT = 100;\n\n/**\n * Build platform URL for logs viewer\n * Transforms API URL to platform URL and appends logs path\n */\nfunction buildPlatformLogsUrl(apiUrl: string, runId: string): string {\n const url = new URL(apiUrl);\n const hostname = url.hostname;\n\n // Handle localhost\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `http://${hostname}:3001/logs/${runId}`;\n }\n\n // Transform: www.vm0.ai → app.vm0.ai\n // vm0.ai → app.vm0.ai\n const parts = hostname.split(\".\");\n if (parts[0] === \"www\" || parts[0] === \"app\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else {\n parts.unshift(\"app\");\n }\n\n const platformHost = parts.join(\".\");\n const port = url.port ? `:${url.port}` : \"\";\n return `https://${platformHost}${port}/logs/${runId}`;\n}\n\n/**\n * Log type for mutually exclusive options\n */\ntype LogType = \"agent\" | \"system\" | \"metrics\" | \"network\";\n\n/**\n * Format a single metric line\n */\nfunction formatMetric(metric: TelemetryMetric): string {\n const memPercent = ((metric.mem_used / metric.mem_total) * 100).toFixed(1);\n const diskPercent = ((metric.disk_used / metric.disk_total) * 100).toFixed(1);\n\n return `[${metric.ts}] CPU: ${metric.cpu.toFixed(1)}% | Mem: ${formatBytes(metric.mem_used)}/${formatBytes(metric.mem_total)} (${memPercent}%) | Disk: ${formatBytes(metric.disk_used)}/${formatBytes(metric.disk_total)} (${diskPercent}%)`;\n}\n\n/**\n * Format the firewall tag (name + billable marker) appended to a request line.\n */\nfunction formatFirewallTag(entry: NetworkLogEntry): string {\n if (!entry.firewall_name) return \"\";\n const billable = entry.firewall_billable ? ` ${chalk.yellow(\"$\")}` : \"\";\n return ` ${chalk.cyan(`[${entry.firewall_name}${billable}]`)}`;\n}\n\nfunction formatBrowserUserAgentTag(entry: NetworkLogEntry): string {\n return entry.browser_user_agent ? ` ${chalk.magenta(\"[browser]\")}` : \"\";\n}\n\nfunction formatConnectorDiagnosticInfo(entry: NetworkLogEntry): string {\n const tags: string[] = [];\n if (entry.connector_diagnostic_type) {\n tags.push(entry.connector_diagnostic_type);\n }\n if (entry.connector_diagnostic_reason) {\n tags.push(entry.connector_diagnostic_reason);\n }\n if (\n entry.connector_diagnostic_env_names &&\n entry.connector_diagnostic_env_names.length > 0\n ) {\n tags.push(`env: ${entry.connector_diagnostic_env_names.join(\", \")}`);\n }\n if (entry.connector_diagnostic_base) {\n tags.push(`base: ${entry.connector_diagnostic_base}`);\n }\n if (tags.length === 0) return \"\";\n return ` ${chalk.red(`[connector diagnostic: ${tags.join(\"; \")}]`)}`;\n}\n\nfunction nonEmptyLogField(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction formatNetworkTarget(entry: NetworkLogEntry): string {\n const url = nonEmptyLogField(entry.url);\n if (url) {\n return url;\n }\n\n const host = nonEmptyLogField(entry.host);\n if (!host) {\n return \"unknown\";\n }\n\n return entry.port !== undefined ? `${host}:${entry.port}` : host;\n}\n\n/**\n * Format a denied network request (filtered by permission rule)\n */\nfunction formatNetworkDeny(entry: NetworkLogEntry): string {\n const method = entry.method || \"???\";\n const url = formatNetworkTarget(entry);\n return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk.red.bold(\"DENY\")} ${chalk.dim(url)}${formatFirewallTag(entry)}${formatBrowserUserAgentTag(entry)}${formatConnectorDiagnosticInfo(entry)}`;\n}\n\n/**\n * Format a locally blocked network request (vm0/proxy/auth/precondition failure)\n */\nfunction formatNetworkBlock(entry: NetworkLogEntry): string {\n const method = entry.method || \"???\";\n const target = formatNetworkTarget(entry);\n const error = entry.firewall_error\n ? ` ${chalk.red(entry.firewall_error)}`\n : \"\";\n return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk.yellow.bold(\"BLOCK\")} ${chalk.dim(target)}${formatFirewallTag(entry)}${formatBrowserUserAgentTag(entry)}${error}${formatConnectorDiagnosticInfo(entry)}${formatAuthInfo(entry)}`;\n}\n\n/**\n * Format auth resolution info (resolved secrets, refresh/cache status, URL rewrite)\n */\nfunction formatAuthInfo(entry: NetworkLogEntry): string {\n const tags: string[] = [];\n if (entry.auth_url_rewrite) {\n tags.push(\"url-rewrite\");\n }\n if (entry.auth_resolved_secrets && entry.auth_resolved_secrets.length > 0) {\n const refreshedSet = new Set(entry.auth_refreshed_secrets ?? []);\n for (const name of entry.auth_resolved_secrets) {\n if (refreshedSet.has(name)) {\n tags.push(`${name} (refreshed)`);\n } else if (entry.auth_cache_hit) {\n tags.push(`${name} (cached)`);\n } else {\n tags.push(name);\n }\n }\n }\n if (tags.length === 0) return \"\";\n return ` ${chalk.yellow(`\\u2194 ${tags.join(\", \")}`)}`;\n}\n\n/**\n * Format an ALLOW or ERROR network request with full HTTP details\n */\nfunction formatNetworkRequest(entry: NetworkLogEntry): string {\n let statusColor: typeof chalk.green;\n const status = entry.status || 0;\n if (status >= 200 && status < 300) {\n statusColor = chalk.green;\n } else if (status >= 300 && status < 400) {\n statusColor = chalk.yellow;\n } else if (status >= 400) {\n statusColor = chalk.red;\n } else {\n statusColor = chalk.gray;\n }\n\n let latencyColor: typeof chalk.green;\n const latencyMs = entry.latency_ms || 0;\n if (latencyMs < 500) {\n latencyColor = chalk.green;\n } else if (latencyMs < 2000) {\n latencyColor = chalk.yellow;\n } else {\n latencyColor = chalk.red;\n }\n\n const method = entry.method || \"???\";\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const url = formatNetworkTarget(entry);\n const error = entry.firewall_error\n ? ` ${chalk.red(entry.firewall_error)}`\n : \"\";\n\n let line = `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + \"ms\")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(url)}${formatFirewallTag(entry)}${formatBrowserUserAgentTag(entry)}${error}${formatConnectorDiagnosticInfo(entry)}${formatAuthInfo(entry)}`;\n\n line += formatCaptureFields(entry);\n\n return line;\n}\n\n/**\n * Maximum characters of body content shown in CLI log output.\n */\nconst BODY_PREVIEW_LENGTH = 200;\n\n/**\n * Format captured body fields (request headers, request body, response body)\n * when present from --capture-network-bodies runs.\n */\nfunction formatCaptureFields(entry: NetworkLogEntry): string {\n let result = \"\";\n if (entry.request_headers) {\n const hdrs = Object.entries(entry.request_headers)\n .map(([k, v]) => {\n return `${k}: ${v}`;\n })\n .join(\", \");\n result += `\\n ${chalk.gray(\"request_headers:\")} ${hdrs}`;\n }\n if (entry.request_body) {\n const truncated = entry.request_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.request_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.request_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"request_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n if (entry.response_body) {\n const truncated = entry.response_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.response_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.response_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"response_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n return result;\n}\n\n/**\n * Format a TCP connection log entry\n */\nfunction formatNetworkTcp(entry: NetworkLogEntry): string {\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const latencyMs = entry.latency_ms || 0;\n const error = entry.error ? ` ${chalk.red(entry.error)}` : \"\";\n\n return `[${entry.timestamp}] ${chalk.blue(\"TCP\")} ${latencyMs}ms ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(`${host}:${port}`)}${error}`;\n}\n\n/**\n * Format a non-TCP/non-HTTP log entry (UDP, ICMP, DNS, etc).\n * These come from iptables LOG via /dev/kmsg or dnsmasq query log.\n */\nfunction formatNetworkOther(entry: NetworkLogEntry): string {\n const proto = (entry.type || \"???\").toUpperCase();\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const size = entry.request_size ? ` ${formatBytes(entry.request_size)}` : \"\";\n const dnsResult =\n entry.type === \"dns\" && entry.dns_result\n ? ` ${chalk.gray(\"->\")} ${chalk.dim(entry.dns_result)}`\n : \"\";\n\n return `[${entry.timestamp}] ${chalk.magenta(proto.padEnd(5))}${size} ${chalk.dim(`${host}:${port}`)}${dnsResult}`;\n}\n\n/**\n * Format a network log entry\n */\nfunction formatNetworkLog(entry: NetworkLogEntry): string {\n if (entry.action === \"BLOCK\") return formatNetworkBlock(entry);\n if (entry.type === \"tcp\") return formatNetworkTcp(entry);\n if (entry.type && entry.type !== \"http\") return formatNetworkOther(entry);\n if (entry.action === \"DENY\") return formatNetworkDeny(entry);\n return formatNetworkRequest(entry);\n}\n\n/**\n * Create an EventRenderer for log viewing (with timestamps)\n * Uses buffered mode to group tool_use/tool_result together for consistent\n * rendering with vm0 run output\n */\nfunction createLogRenderer(verbose: boolean): EventRenderer {\n return new EventRenderer({\n showTimestamp: true,\n verbose,\n });\n}\n\n/**\n * Render an agent event with timestamp for historical log viewing\n */\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n framework: string,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n framework,\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\n/**\n * Validate mutually exclusive options and return the log type\n */\nfunction getLogType(options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n}): LogType {\n const selected = [\n options.agent,\n options.system,\n options.metrics,\n options.network,\n ].filter(Boolean).length;\n\n if (selected > 1) {\n throw new Error(\n \"Options --agent, --system, --metrics, and --network are mutually exclusive\",\n );\n }\n\n if (options.system) return \"system\";\n if (options.metrics) return \"metrics\";\n if (options.network) return \"network\";\n return \"agent\"; // Default\n}\n\nexport const logsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to fetch logs for\")\n .addCommand(searchCommand)\n .option(\"-a, --agent\", \"Show agent events (default)\")\n .option(\"-s, --system\", \"Show system log\")\n .option(\"-m, --metrics\", \"Show metrics\")\n .option(\"-n, --network\", \"Show network logs (proxy traffic)\")\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z, 1705312200)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n logsCommand.help();\n return;\n }\n\n const logType = getLogType(options);\n\n // Validate --tail, --head, and --all are mutually exclusive\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n // Parse since option\n let since: number | undefined;\n if (options.since) {\n since = parseTime(options.since);\n }\n\n // Determine pagination mode and order based on flags\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n // targetCount: number for --head/--tail, \"all\" for --all, default 5 for no flag\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = parsePositiveLogCount(options.head!, \"--head\");\n } else if (isTail) {\n targetCount = parsePositiveLogCount(options.tail!, \"--tail\");\n } else {\n // Default: show last 5 entries\n targetCount = 5;\n }\n\n // Order: asc for --head, desc for --tail/--all/default\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n // Build platform URL for agent logs\n const apiUrl = await getApiUrl();\n const platformUrl = buildPlatformLogsUrl(apiUrl, runId);\n\n switch (logType) {\n case \"agent\":\n await showAgentEvents(\n runId,\n { since, targetCount, order },\n platformUrl,\n );\n break;\n case \"system\":\n await showSystemLog(runId, { since, targetCount, order });\n break;\n case \"metrics\":\n await showMetrics(runId, { since, targetCount, order });\n break;\n case \"network\":\n await showNetworkLogs(runId, { since, targetCount, order });\n break;\n }\n },\n ),\n );\n\n/**\n * Show agent events with pagination support\n */\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n platformUrl: string,\n): Promise<void> {\n let framework = \"claude-code\";\n const events = await collectLogItems<RunEvent>({\n fetchPage: async (request) => {\n const response = await getAgentEvents(runId, request);\n framework = response.framework;\n return {\n items: response.events,\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n // Create renderer for log viewing (with timestamps, always verbose)\n const renderer = createLogRenderer(true);\n const normalizer = new EventStreamNormalizer();\n\n for (const event of events) {\n renderAgentEvent(event, renderer, normalizer, framework);\n }\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n\n console.log(chalk.dim(`View on platform: ${platformUrl}`));\n}\n\n/**\n * Show system log with pagination support\n * Note: System log pagination is limited because the API returns aggregated strings\n * without individual timestamps. The --tail/--head/--all options work on batch count,\n * not line count.\n */\nasync function showSystemLog(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const pages: string[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | undefined;\n let remainingBatches =\n options.targetCount === \"all\" ? undefined : options.targetCount;\n\n while (true) {\n const limit =\n remainingBatches === undefined\n ? PAGE_LIMIT\n : Math.min(remainingBatches, PAGE_LIMIT);\n const response = await getSystemLog(runId, {\n sinceTime: options.since,\n cursor,\n limit,\n order: options.order,\n });\n\n const pageHasLog = response.systemLog.length > 0;\n if (pageHasLog) {\n pages.push(response.systemLog);\n }\n\n if (remainingBatches !== undefined && pageHasLog) {\n remainingBatches -= limit;\n if (remainingBatches <= 0) {\n break;\n }\n }\n\n const nextCursor = response.nextCursor ?? null;\n if (!response.hasMore || !nextCursor || seenCursors.has(nextCursor)) {\n break;\n }\n\n seenCursors.add(nextCursor);\n cursor = nextCursor;\n }\n\n if (pages.length === 0) {\n console.log(chalk.yellow(\"No system log found for this run\"));\n return;\n }\n\n console.log(pages.join(\"\"));\n}\n\n/**\n * Show metrics with pagination support\n */\nasync function showMetrics(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const metrics = await collectLogItems<TelemetryMetric>({\n fetchPage: async (request) => {\n const response = await getMetrics(runId, request);\n return {\n items: response.metrics,\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (metrics.length === 0) {\n console.log(chalk.yellow(\"No metrics found for this run\"));\n return;\n }\n\n for (const metric of metrics) {\n console.log(formatMetric(metric));\n }\n}\n\n/**\n * Show network logs with pagination support\n */\nasync function showNetworkLogs(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const networkLogs = await collectLogItems<NetworkLogEntry>({\n fetchPage: async (request) => {\n const response = await getNetworkLogs(runId, request);\n return {\n items: response.networkLogs,\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (networkLogs.length === 0) {\n console.log(\n chalk.yellow(\n \"No network logs found for this run. Network logs are only captured when using a runner with proxy enabled\",\n ),\n );\n return;\n }\n\n for (const entry of networkLogs) {\n console.log(formatNetworkLog(entry));\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../lib/api\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface SearchOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\n/**\n * Render a single agent event using EventRenderer.\n *\n * Search responses do not yet carry a per-result framework, so we let the\n * factory default to claude-code. Codex events in search results render as\n * nothing until the search contract is extended (tracked separately).\n */\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\n/**\n * Format a run header line\n */\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const shortId = runId.slice(0, 8);\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${shortId} (${agentName}, ${time}) ──────────`;\n}\n\n/**\n * Parse and validate context options (-A, -B, -C)\n */\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\n/**\n * Parse --limit option with validation\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\n/**\n * Render search results grouped by run\n */\nfunction renderResults(response: LogsSearchResponse): void {\n // Group results by run\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n // Render each group\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log(); // Separator between runs\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <id>\", \"Filter by agent ID\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .action(\n withErrorHandler(async (keyword: string, options: SearchOptions) => {\n const { before, after } = parseContextOptions(options);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchLogs({\n keyword,\n agentId: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { validateAgentName } from \"../../lib/domain/yaml-validator\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst VM0_YAML_FILE = \"vm0.yaml\";\nconst AGENTS_MD_FILE = \"AGENTS.md\";\n\nfunction generateVm0Yaml(agentName: string): string {\n return `version: \"1.0\"\n\nagents:\n ${agentName}:\n framework: claude-code\n # Build agentic workflow using natural language\n instructions: AGENTS.md\n`;\n}\n\nfunction generateAgentsMd(): string {\n return `# Agent Instructions\n\nYou are a HackerNews AI content curator.\n\n## Workflow\n\n1. Go to HackerNews and read the top 10 articles\n2. Find and extract AI-related content from these articles\n3. Summarize the findings into a X (Twitter) post format\n4. Write the summary to content.md\n`;\n}\n\nfunction checkExistingFiles(): string[] {\n const existingFiles: string[] = [];\n if (existsSync(VM0_YAML_FILE)) existingFiles.push(VM0_YAML_FILE);\n if (existsSync(AGENTS_MD_FILE)) existingFiles.push(AGENTS_MD_FILE);\n return existingFiles;\n}\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a new VM0 project in the current directory\")\n .option(\"-f, --force\", \"Overwrite existing files\")\n .option(\"-n, --name <name>\", \"Agent name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { force?: boolean; name?: string }) => {\n // Check existing files\n const existingFiles = checkExistingFiles();\n if (existingFiles.length > 0 && !options.force) {\n throw new Error(`${existingFiles.join(\", \")} already exists`, {\n cause: new Error(\"To overwrite: vm0 init --force\"),\n });\n }\n\n // Get agent name from option or prompt\n let agentName: string;\n if (options.name) {\n agentName = options.name.trim();\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 init --name <agent-name>\"),\n });\n } else {\n // Use directory name as default suggestion\n const dirName = path.basename(process.cwd());\n const defaultName = validateAgentName(dirName) ? dirName : undefined;\n\n const name = await promptText(\n \"Enter agent name\",\n defaultName,\n (value: string) => {\n if (!validateAgentName(value)) {\n return \"Must be 3-64 characters, alphanumeric and hyphens, start/end with letter or number\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n agentName = name;\n }\n\n // Validate agent name\n if (!agentName || !validateAgentName(agentName)) {\n throw new Error(\"Invalid agent name\", {\n cause: new Error(\n \"Must be 3-64 characters, alphanumeric and hyphens only, start and end with letter or number\",\n ),\n });\n }\n\n // Write vm0.yaml\n await writeFile(VM0_YAML_FILE, generateVm0Yaml(agentName));\n const vm0Status = existingFiles.includes(VM0_YAML_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${VM0_YAML_FILE}${vm0Status}`));\n\n // Write AGENTS.md\n await writeFile(AGENTS_MD_FILE, generateAgentsMd());\n const agentsStatus = existingFiles.includes(AGENTS_MD_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${AGENTS_MD_FILE}${agentsStatus}`));\n\n // Print next steps\n console.log();\n console.log(\"Next steps:\");\n console.log(` 1. Log in to VM0: ${chalk.cyan(\"vm0 auth login\")}`);\n console.log(\n ` 2. Edit ${chalk.cyan(\"AGENTS.md\")} to customize your agent's workflow`,\n );\n console.log(\n ` 3. Run your agent: ${chalk.cyan('vm0 run --secrets CLAUDE_CODE_OAUTH_TOKEN=<token> \"let\\'s start working\"')}`,\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n detectPackageManager,\n getLatestVersion,\n getManualUpgradeCommand,\n isAutoUpgradeSupported,\n performUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nexport const upgradeCommand = new Command()\n .name(\"upgrade\")\n .description(\"Upgrade vm0 CLI to the latest version\")\n .action(\n withErrorHandler(async () => {\n console.log(\"Checking for updates...\");\n\n const latestVersion = await getLatestVersion();\n\n if (latestVersion === null) {\n throw new Error(\"Could not check for updates. Please try again later.\");\n }\n\n if (latestVersion === __CLI_VERSION__) {\n console.log(chalk.green(`✓ Already up to date (${__CLI_VERSION__})`));\n return;\n }\n\n console.log(\n chalk.yellow(\n `Current version: ${__CLI_VERSION__} -> Latest version: ${latestVersion}`,\n ),\n );\n console.log();\n\n const packageManager = detectPackageManager();\n\n if (!isAutoUpgradeSupported(packageManager)) {\n if (packageManager === \"unknown\") {\n console.log(\n chalk.yellow(\n \"Could not detect your package manager for auto-upgrade.\",\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Auto-upgrade is not supported for ${packageManager}.`,\n ),\n );\n }\n console.log(chalk.yellow(\"Please upgrade manually:\"));\n console.log(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n return;\n }\n\n console.log(`Upgrading via ${packageManager}...`);\n const success = await performUpgrade(packageManager);\n\n if (success) {\n console.log(\n chalk.green(`✓ Upgraded from ${__CLI_VERSION__} to ${latestVersion}`),\n );\n return;\n }\n\n throw new Error(\"Upgrade failed\", {\n cause: new Error(\n `Please run manually: ${getManualUpgradeCommand(packageManager)}`,\n ),\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getApiUrl, getActiveOrg, getToken } from \"../lib/api/config\";\nimport { withErrorHandler } from \"../lib/command\";\n\n/**\n * Detect if running inside a VM0 sandbox (agent runtime).\n * Presence of VM0_RUN_ID indicates sandbox execution.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.VM0_RUN_ID;\n}\n\n/**\n * Display agent identity and run information when inside a sandbox.\n */\nasync function showSandboxInfo(): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const cliAgentType = process.env.CLI_AGENT_TYPE;\n\n const runId = process.env.VM0_RUN_ID;\n const activeOrg = await getActiveOrg();\n const apiUrl = process.env.VM0_API_URL;\n\n // Agent section\n const hasAgentInfo = agentId || cliAgentType;\n if (hasAgentInfo) {\n console.log(chalk.bold(\"Agent:\"));\n if (agentId) console.log(` ID: ${agentId}`);\n if (cliAgentType) console.log(` Framework: ${cliAgentType}`);\n console.log();\n }\n\n // Run section\n console.log(chalk.bold(\"Run:\"));\n if (runId) console.log(` ID: ${runId}`);\n if (activeOrg) console.log(` Org: ${activeOrg}`);\n if (apiUrl) console.log(` API: ${apiUrl}`);\n}\n\n/**\n * Display authentication and org information when running outside a sandbox.\n */\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const whoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show current identity and environment information\")\n .action(\n withErrorHandler(async () => {\n if (isInsideSandbox()) {\n await showSandboxInfo();\n } else {\n await showLocalInfo();\n }\n }),\n );\n"],"mappings":"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","names":["readFile","existsSync","path","fs","path","os","os","text","commitResult","existsSync","readFile","parseYaml","path","import_yaml","readFile","writeFile","mkdir","existsSync","path","parseYaml","type","stringifyYaml","path","path","fs","os","path","statusCommand","listCommand","path","fs","os","type","path","statusCommand","listCommand","path","initCommand","path","pushCommand","path","fs","os","pullCommand","path","statusCommand","listCommand","cloneCommand","initCommand","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","parseLimit","path","existsSync","writeFile","existsSync","initCommand","path","writeFile","initCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/api/auth.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/auth/setup-token.ts","../src/commands/info/index.ts","../src/lib/utils/update-checker.ts","../src/lib/utils/spawn.ts","../src/commands/compose/index.ts","../src/lib/domain/yaml-validator.ts","../src/lib/storage/system-storage.ts","../src/lib/storage/direct-upload.ts","../src/commands/run/index.ts","../src/commands/run/run.ts","../src/commands/run/resume.ts","../src/commands/run/continue.ts","../src/commands/run/list.ts","../src/commands/run/kill.ts","../src/commands/run/queue.ts","../src/commands/volume/index.ts","../src/commands/volume/init.ts","../src/lib/storage/storage-utils.ts","../src/commands/volume/push.ts","../src/commands/volume/pull.ts","../src/lib/storage/pull-utils.ts","../src/commands/volume/status.ts","../src/commands/volume/list.ts","../src/commands/volume/clone.ts","../src/lib/storage/clone-utils.ts","../src/commands/artifact/index.ts","../src/commands/artifact/init.ts","../src/commands/artifact/push.ts","../src/commands/artifact/pull.ts","../src/commands/artifact/status.ts","../src/commands/artifact/list.ts","../src/commands/artifact/clone.ts","../src/commands/logs/index.ts","../src/commands/logs/search.ts","../src/commands/init/index.ts","../src/commands/upgrade/index.ts","../src/commands/whoami.ts"],"sourcesContent":["// VM0 CLI entry point - main module\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { authCommand } from \"./commands/auth\";\nimport { infoCommand } from \"./commands/info\";\nimport { composeCommand } from \"./commands/compose\";\nimport { runCommand } from \"./commands/run\";\nimport { volumeCommand } from \"./commands/volume\";\nimport { artifactCommand } from \"./commands/artifact\";\nimport { logsCommand } from \"./commands/logs\";\n\nimport { initCommand } from \"./commands/init\";\n\nimport { upgradeCommand } from \"./commands/upgrade\";\nimport { whoamiCommand } from \"./commands/whoami\";\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"vm0\")\n .description(\"VM0 CLI - Build and run agents with natural language\")\n .version(__CLI_VERSION__);\n\n// Register all commands\nprogram.addCommand(authCommand);\nprogram.addCommand(infoCommand);\nprogram.addCommand(composeCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(volumeCommand);\nprogram.addCommand(artifactCommand);\nprogram.addCommand(logsCommand);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(upgradeCommand);\nprogram.addCommand(whoamiCommand);\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"vm0\")\n) {\n configureGlobalProxyFromEnv();\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { loginCommand } from \"./login\";\nimport { logoutCommand } from \"./logout\";\nimport { statusCommand } from \"./status\";\nimport { setupTokenCommand } from \"./setup-token\";\n\nexport const authCommand = new Command()\n .name(\"auth\")\n .description(\"Authenticate vm0\")\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand)\n .addCommand(setupTokenCommand);\n","import { Command } from \"commander\";\nimport { authenticate } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const loginCommand = new Command()\n .name(\"login\")\n .description(\"Log in to VM0 (use VM0_API_URL env var to set API URL)\")\n .action(\n withErrorHandler(async () => {\n await authenticate();\n }),\n );\n","import chalk from \"chalk\";\nimport {\n saveConfig,\n clearConfig,\n loadConfig,\n getApiUrl,\n getToken,\n} from \"./config\";\n\n/**\n * Build headers with optional Vercel bypass secret\n * Used to bypass Vercel deployment protection in CI/preview environments\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add Vercel bypass secret if available (for CI/preview deployments)\n const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;\n if (bypassSecret) {\n headers[\"x-vercel-protection-bypass\"] = bypassSecret;\n }\n\n return headers;\n}\n\nasync function requestDeviceCode(apiUrl: string): Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/device`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\"An unexpected network issue occurred\");\n }\n throw new Error(`Failed to request device code: ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n }>;\n}\n\nasync function exchangeToken(\n apiUrl: string,\n deviceCode: string,\n): Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/token`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n return response.json() as Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n }>;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\nexport async function authenticate(apiUrl?: string): Promise<void> {\n // Use provided apiUrl or get from config/env (with fallback to production)\n const targetApiUrl = apiUrl ?? (await getApiUrl());\n console.log(\"Initiating authentication...\");\n\n // Request device code\n const deviceAuth = await requestDeviceCode(targetApiUrl);\n\n console.log(chalk.green(\"\\nDevice code generated\"));\n\n // Construct verification URL from API URL and server-provided path\n const verificationUrl = `${targetApiUrl}${deviceAuth.verification_path}`;\n console.log(chalk.cyan(`\\nTo authenticate, visit: ${verificationUrl}`));\n console.log(`And enter this code: ${chalk.bold(deviceAuth.user_code)}`);\n console.log(\n `\\nThe code expires in ${Math.floor(deviceAuth.expires_in / 60)} minutes.`,\n );\n\n console.log(\"\\nWaiting for authentication...\");\n\n // Poll for token\n const startTime = Date.now();\n const maxWaitTime = deviceAuth.expires_in * 1000; // Convert to milliseconds\n const pollInterval = (deviceAuth.interval || 5) * 1000; // Use server-specified interval or default to 5 seconds\n\n let isFirstPoll = true;\n\n while (Date.now() - startTime < maxWaitTime) {\n // Skip delay on first poll for faster response\n if (!isFirstPoll) {\n await delay(pollInterval); // Use dynamic polling interval\n }\n isFirstPoll = false;\n\n const tokenResult = await exchangeToken(\n targetApiUrl,\n deviceAuth.device_code,\n );\n\n if (tokenResult.access_token) {\n // Success! Store the token and org context\n await saveConfig({\n token: tokenResult.access_token,\n apiUrl: targetApiUrl,\n });\n\n console.log(chalk.green(\"\\nAuthentication successful!\"));\n console.log(\"Your credentials have been saved\");\n return;\n }\n\n if (tokenResult.error === \"authorization_pending\") {\n // Still waiting for user to authenticate\n process.stdout.write(chalk.dim(\".\"));\n continue;\n }\n\n // Handle other errors\n if (tokenResult.error === \"expired_token\") {\n throw new Error(\"Device code expired, please try again\");\n }\n\n if (tokenResult.error) {\n throw new Error(\n `Authentication failed: ${tokenResult.error_description ?? tokenResult.error}`,\n );\n }\n }\n\n // Timeout\n throw new Error(\"Authentication timed out, please try again\");\n}\n\nexport async function logout(): Promise<void> {\n await clearConfig();\n console.log(chalk.green(\"✓ Successfully logged out\"));\n console.log(\"Your credentials have been cleared\");\n}\n\nexport async function checkAuthStatus(): Promise<void> {\n const config = await loadConfig();\n\n if (config.token) {\n console.log(chalk.green(\"✓ Authenticated\"));\n console.log(\"You are logged in to VM0.\");\n } else {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(chalk.dim(\" Run: vm0 auth login\"));\n }\n\n // Also check for environment variable\n if (process.env.VM0_TOKEN) {\n console.log(\"Using token from VM0_TOKEN environment variable\");\n }\n}\n\nexport async function setupToken(): Promise<void> {\n const token = await getToken();\n\n if (!token) {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(\"\");\n console.error(\"To get a token for CI/CD:\");\n console.error(\" 1. Run 'vm0 auth login' to authenticate\");\n console.error(\" 2. Run 'vm0 auth setup-token' to get your token\");\n console.error(\n \" 3. Store the token in your CI/CD secrets (e.g., VM0_TOKEN)\",\n );\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Authentication token exported successfully!\"));\n console.log(\"\");\n console.log(\"Your token:\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\n `Use this token by setting: ${chalk.cyan(\"export VM0_TOKEN=<token>\")}`,\n );\n}\n","import { Command } from \"commander\";\nimport { logout } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const logoutCommand = new Command()\n .name(\"logout\")\n .description(\"Log out of VM0\")\n .action(\n withErrorHandler(async () => {\n await logout();\n }),\n );\n","import { Command } from \"commander\";\nimport { checkAuthStatus } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show current authentication status\")\n .action(\n withErrorHandler(async () => {\n await checkAuthStatus();\n }),\n );\n","import { Command } from \"commander\";\nimport { setupToken } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const setupTokenCommand = new Command()\n .name(\"setup-token\")\n .description(\"Output auth token for CI/CD environments\")\n .action(\n withErrorHandler(async () => {\n await setupToken();\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { existsSync } from \"fs\";\nimport * as os from \"os\";\nimport { join } from \"path\";\nimport { getApiUrl, loadConfig } from \"../../lib/api/config\";\nimport { detectPackageManager } from \"../../lib/utils/update-checker\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction getConfigPath() {\n return join(os.homedir(), \".vm0\", \"config.json\");\n}\n\nexport const infoCommand = new Command()\n .name(\"info\")\n .description(\"Display environment and debug information\")\n .action(async () => {\n // CLI version header\n console.log(chalk.bold(`VM0 CLI v${__CLI_VERSION__}`));\n console.log();\n\n // Authentication section\n const config = await loadConfig();\n const hasEnvToken = !!process.env.VM0_TOKEN;\n const hasConfigToken = !!config.token;\n const isAuthenticated = hasEnvToken || hasConfigToken;\n\n console.log(chalk.bold(\"Authentication:\"));\n if (isAuthenticated) {\n const tokenSource = hasEnvToken ? \"VM0_TOKEN env var\" : \"config file\";\n console.log(` ${chalk.green(\"✓\")} Logged in (via ${tokenSource})`);\n } else {\n console.log(` ${chalk.red(\"✗\")} Not authenticated`);\n }\n\n const configExists = existsSync(getConfigPath());\n const configDisplay = configExists\n ? `~/.vm0/config.json`\n : `~/.vm0/config.json (not found)`;\n console.log(` Config: ${configDisplay}`);\n console.log();\n\n // API section\n const apiUrl = await getApiUrl();\n console.log(chalk.bold(\"API:\"));\n console.log(` Host: ${apiUrl}`);\n console.log();\n\n // System section\n console.log(chalk.bold(\"System:\"));\n console.log(` Node: ${process.version}`);\n console.log(` Platform: ${process.platform} (${process.arch})`);\n console.log(` OS: ${os.type()} ${os.release()}`);\n console.log(` Shell: ${process.env.SHELL ?? \"unknown\"}`);\n console.log(` Package Manager: ${detectPackageManager()}`);\n });\n","import type { ChildProcess } from \"child_process\";\nimport chalk from \"chalk\";\nimport { safeSpawn } from \"./spawn\";\n\nconst PACKAGE_NAME = \"@vm0/cli\";\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;\nconst TIMEOUT_MS = 5000;\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"bun\" | \"yarn\" | \"unknown\";\n\n/**\n * Internal state for pending upgrade process\n */\ninterface UpgradeHandle {\n promise: Promise<boolean>;\n child: ChildProcess;\n packageManager: \"npm\" | \"pnpm\";\n}\n\n// Module-level state for pending upgrade\nlet pendingUpgrade: UpgradeHandle | null = null;\n\n/**\n * Detect which package manager was used to install the CLI\n * by checking the executable path for known package manager patterns.\n * Returns \"unknown\" if no known pattern is matched.\n */\nexport function detectPackageManager(): PackageManager {\n const execPath = process.argv[1] ?? \"\";\n\n // Check for pnpm (supported for auto-upgrade)\n if (execPath.includes(\"pnpm\")) {\n return \"pnpm\";\n }\n\n // Check for bun (unsupported - manual upgrade only)\n if (execPath.includes(\"/.bun/\") || execPath.includes(\"/bun/\")) {\n return \"bun\";\n }\n\n // Check for yarn (unsupported - manual upgrade only)\n if (execPath.includes(\"/.yarn/\") || execPath.includes(\"/yarn/\")) {\n return \"yarn\";\n }\n\n // Check for npm (supported for auto-upgrade)\n // Common npm paths: Homebrew, nvm, fnm, volta, nodenv, n, or node_modules\n if (\n execPath.includes(\"/usr/local/\") || // Homebrew on Intel Mac\n execPath.includes(\"/opt/homebrew/\") || // Homebrew on arm64 Mac\n execPath.includes(\"/.nvm/\") ||\n execPath.includes(\"/.fnm/\") ||\n execPath.includes(\"/.volta/\") ||\n execPath.includes(\"/.nodenv/\") ||\n execPath.includes(\"/.n/\") ||\n execPath.includes(\"/node_modules/\") ||\n execPath.includes(\"\\\\npm\\\\\") || // Windows: AppData\\Roaming\\npm\n execPath.includes(\"\\\\nodejs\\\\\") // Windows: Program Files\\nodejs\n ) {\n return \"npm\";\n }\n\n // Unknown package manager - don't assume npm\n return \"unknown\";\n}\n\n/**\n * Check if the package manager supports auto-upgrade\n */\nexport function isAutoUpgradeSupported(\n pm: PackageManager,\n): pm is \"npm\" | \"pnpm\" {\n return pm === \"npm\" || pm === \"pnpm\";\n}\n\n/**\n * Get the manual upgrade command for a package manager\n */\nexport function getManualUpgradeCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return `bun add -g ${PACKAGE_NAME}@latest`;\n case \"yarn\":\n return `yarn global add ${PACKAGE_NAME}@latest`;\n case \"pnpm\":\n return `pnpm add -g ${PACKAGE_NAME}@latest`;\n case \"npm\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n case \"unknown\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n }\n}\n\n/**\n * Fetch the latest version of the package from npm registry\n * Returns null if the request fails or times out\n */\nexport async function getLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n return controller.abort();\n }, TIMEOUT_MS);\n\n const response = await fetch(NPM_REGISTRY_URL, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const json = (await response.json()) as { version?: string };\n return json.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Execute package manager upgrade command\n * - npm: npm install -g @vm0/cli@latest\n * - pnpm: pnpm add -g @vm0/cli@latest\n * Returns true on success, false on failure\n */\nexport function performUpgrade(\n packageManager: \"npm\" | \"pnpm\",\n): Promise<boolean> {\n return new Promise((resolve) => {\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"inherit\",\n });\n\n child.on(\"close\", (code) => {\n resolve(code === 0);\n });\n\n child.on(\"error\", () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Start silent upgrade in background.\n * Call this at command start. Does NOT block after spawning.\n * The upgrade runs in parallel with command execution.\n *\n * @param currentVersion - Current CLI version\n * @returns Promise that resolves after starting upgrade (or determining no upgrade needed)\n */\nexport async function startSilentUpgrade(\n currentVersion: string,\n): Promise<void> {\n // Reset any previous state\n pendingUpgrade = null;\n\n // Check for new version\n const latestVersion = await getLatestVersion();\n\n // If check failed or already on latest, return silently\n if (latestVersion === null || latestVersion === currentVersion) {\n return;\n }\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, return silently (no whisper)\n if (!isAutoUpgradeSupported(packageManager)) {\n return;\n }\n\n // Spawn upgrade process (don't wait for completion)\n const isWindows = process.platform === \"win32\";\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"pipe\",\n detached: !isWindows,\n windowsHide: true,\n });\n\n const promise = new Promise<boolean>((resolve) => {\n child.on(\"close\", (code) => {\n return resolve(code === 0);\n });\n child.on(\"error\", () => {\n return resolve(false);\n });\n });\n\n pendingUpgrade = { promise, child, packageManager };\n}\n\n/**\n * Wait for pending upgrade to complete and show warning if failed.\n * Call this at command end.\n *\n * @param timeout - Max time to wait if upgrade still running (ms)\n * @returns Promise that resolves when upgrade completes or times out\n */\nexport async function waitForSilentUpgrade(\n timeout: number = TIMEOUT_MS,\n): Promise<void> {\n if (!pendingUpgrade) {\n return;\n }\n\n const { promise, child, packageManager } = pendingUpgrade;\n pendingUpgrade = null; // Clear state\n\n // Race between upgrade completion and timeout\n const result = await Promise.race([\n promise,\n new Promise<false>((resolve) => {\n setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeout);\n }),\n ]);\n\n // Show whisper message only on failure\n if (!result) {\n console.log(\n chalk.yellow(\n `\\n⚠ vm0 auto upgrade failed. Please run: ${getManualUpgradeCommand(packageManager)}`,\n ),\n );\n }\n}\n","import { spawn, type SpawnOptions, type ChildProcess } from \"child_process\";\n\n/**\n * Spawn a child process with safe Windows shell handling.\n *\n * On Windows, `shell: true` is required to resolve `.cmd` extensions for\n * commands like `npm`, `pnpm`, etc. On other platforms, shell is disabled\n * to avoid unnecessary shell interpretation. Commands passed to this\n * function must be hardcoded strings (not user input), and arguments\n * must use array form to prevent shell injection.\n *\n */\nexport function safeSpawn(\n command: string,\n args: string[],\n options?: Omit<SpawnOptions, \"shell\">,\n): ChildProcess {\n const isWindows = process.platform === \"win32\";\n const resolvedCommand = isWindows ? `${command}.cmd` : command;\n\n // nosemgrep: javascript.lang.security.audit.spawn-shell-true.spawn-shell-true, javascript.lang.security.detect-child-process.detect-child-process\n return spawn(resolvedCommand, args, {\n ...options,\n shell: isWindows,\n });\n}\n","import { Command, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { guaranteedConnectorProvidedBindingNames } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { extractAndGroupVariables } from \"@vm0/core/variable-expander\";\nimport {\n createOrUpdateCompose,\n listZeroSecrets,\n listZeroVariables,\n listZeroConnectors,\n} from \"../../lib/api\";\nimport { validateAgentCompose } from \"../../lib/domain/yaml-validator\";\nimport { uploadInstructions } from \"../../lib/storage/system-storage\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nconst DEFAULT_CONFIG_FILE = \"vm0.yaml\";\n\n/**\n * Extract secret names from compose content using variable references.\n * Looks for ${{ secrets.XXX }} patterns in the compose.\n */\nexport function getSecretsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.secrets.map((r) => {\n return r.name;\n }),\n );\n}\n\n/**\n * Extract variable names from compose content using variable references.\n * Looks for ${{ vars.XXX }} patterns in the compose.\n */\nfunction getVarsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.vars.map((r) => {\n return r.name;\n }),\n );\n}\n\ninterface AgentConfig {\n instructions?: string;\n framework?: string;\n environment?: Record<string, string>;\n}\n\ninterface LoadedConfig {\n config: unknown;\n agentName: string;\n agent: AgentConfig;\n basePath: string;\n}\n\n/**\n * Load and validate the compose config file.\n * Returns parsed config with agent info or exits on error.\n */\nasync function loadAndValidateConfig(\n configFile: string,\n): Promise<LoadedConfig> {\n if (!existsSync(configFile)) {\n throw new Error(`Config file not found: ${configFile}`);\n }\n\n const content = await readFile(configFile, \"utf8\");\n\n let config: unknown;\n try {\n config = parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Invalid YAML format: ${message}`);\n }\n\n const validation = validateAgentCompose(config);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n const cfg = config as Record<string, unknown>;\n const agentsConfig = cfg.agents as Record<string, Record<string, unknown>>;\n const agentName = Object.keys(agentsConfig)[0]!;\n const agent = agentsConfig[agentName] as AgentConfig;\n const basePath = dirname(configFile);\n\n return { config, agentName, agent, basePath };\n}\n\nasync function uploadInstructionsIfPresent(\n agentName: string,\n agent: AgentConfig,\n basePath: string,\n jsonMode?: boolean,\n): Promise<void> {\n if (!agent.instructions) return;\n\n if (!jsonMode) {\n console.log(`Uploading instructions: ${agent.instructions}`);\n }\n const result = await uploadInstructions(\n agentName,\n agent.instructions,\n basePath,\n agent.framework,\n );\n if (!jsonMode) {\n console.log(\n chalk.green(\n `✓ Instructions ${result.action === \"deduplicated\" ? \"(unchanged)\" : \"uploaded\"}: ${result.versionId.slice(0, 8)}`,\n ),\n );\n }\n}\n\n/**\n * Remove legacy `skills:` fields from every agent before POSTing the compose.\n * Belt-and-braces with server-side stripping planned in sibling sub-issue #9754.\n */\nfunction stripSkillsFromAgents(config: unknown): unknown {\n if (!config || typeof config !== \"object\") return config;\n const cfg = structuredClone(config) as Record<string, unknown>;\n const agents = cfg.agents;\n if (agents && typeof agents === \"object\" && !Array.isArray(agents)) {\n for (const agent of Object.values(agents as Record<string, unknown>)) {\n if (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n delete (agent as Record<string, unknown>).skills;\n }\n }\n }\n return cfg;\n}\n\n/**\n * Derive the app URL from the API URL by replacing \"www\" with \"app\" in the hostname.\n */\ninterface MissingItemsResult {\n missingSecrets: string[];\n missingVars: string[];\n}\n\n/**\n * Check for missing secrets/vars and print setup URL if any are missing.\n */\nasync function checkAndPromptMissingItems(\n config: unknown,\n options: { json?: boolean },\n): Promise<MissingItemsResult> {\n const requiredSecrets = getSecretsFromComposeContent(config);\n const requiredVars = getVarsFromComposeContent(config);\n\n if (requiredSecrets.size === 0 && requiredVars.size === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n const [secretsResponse, variablesResponse, connectorsResponse] =\n await Promise.all([\n requiredSecrets.size > 0 ? listZeroSecrets() : { secrets: [] },\n requiredVars.size > 0 ? listZeroVariables() : { variables: [] },\n listZeroConnectors(),\n ]);\n\n const existingSecretNames = new Set(\n secretsResponse.secrets.map((s) => {\n return s.name;\n }),\n );\n const existingVarNames = new Set(\n variablesResponse.variables.map((v) => {\n return v.name;\n }),\n );\n\n const guaranteedConnectorProvidedSecretNames =\n guaranteedConnectorProvidedBindingNames({\n bindings: connectorsResponse.connectorProvidedBindings,\n namespace: \"secrets\",\n });\n const guaranteedConnectorProvidedVarNames =\n guaranteedConnectorProvidedBindingNames({\n bindings: connectorsResponse.connectorProvidedBindings,\n namespace: \"vars\",\n });\n\n const missingSecrets = [...requiredSecrets].filter((name) => {\n return (\n !existingSecretNames.has(name) &&\n !guaranteedConnectorProvidedSecretNames.has(name)\n );\n });\n const missingVars = [...requiredVars].filter((name) => {\n return (\n !existingVarNames.has(name) &&\n !guaranteedConnectorProvidedVarNames.has(name)\n );\n });\n\n if (missingSecrets.length === 0 && missingVars.length === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n if (!options.json) {\n console.log();\n console.log(chalk.yellow(\"⚠ Missing secrets/variables detected:\"));\n if (missingSecrets.length > 0) {\n console.log(chalk.yellow(` Secrets: ${missingSecrets.join(\", \")}`));\n }\n if (missingVars.length > 0) {\n console.log(chalk.yellow(` Variables: ${missingVars.join(\", \")}`));\n }\n console.log();\n }\n\n return { missingSecrets, missingVars };\n}\n\n/**\n * Result from finalizeCompose for JSON output\n */\ninterface ComposeResult {\n composeId: string;\n composeName: string;\n versionId: string;\n action: \"created\" | \"existing\";\n displayName: string;\n missingSecrets?: string[];\n missingVars?: string[];\n}\n\n/**\n * Finalize compose: call API and display result.\n * Returns the compose result for JSON output mode.\n */\nasync function finalizeCompose(\n config: unknown,\n agent: AgentConfig,\n options: { yes?: boolean; autoUpdate?: boolean; json?: boolean },\n): Promise<ComposeResult> {\n // Call API\n if (!options.json) {\n console.log(\"Uploading compose...\");\n }\n const contentToPost = stripSkillsFromAgents(config);\n const response = await createOrUpdateCompose({ content: contentToPost });\n\n const shortVersionId = response.versionId.slice(0, 8);\n const displayName = response.name;\n\n // Build result\n const result: ComposeResult = {\n composeId: response.composeId,\n composeName: response.name,\n versionId: response.versionId,\n action: response.action,\n displayName,\n };\n\n // In --json mode, skip missing items check — E2B doesn't read these fields\n if (!options.json) {\n const missingItems = await checkAndPromptMissingItems(config, options);\n if (\n missingItems.missingSecrets.length > 0 ||\n missingItems.missingVars.length > 0\n ) {\n result.missingSecrets = missingItems.missingSecrets;\n result.missingVars = missingItems.missingVars;\n }\n }\n\n // Display human-readable result (skip in JSON mode)\n if (!options.json) {\n if (response.action === \"created\") {\n console.log(chalk.green(`✓ Compose created: ${displayName}`));\n } else {\n console.log(chalk.green(`✓ Compose version exists: ${displayName}`));\n }\n\n console.log(chalk.dim(` Version: ${shortVersionId}`));\n console.log();\n console.log(\" Run your agent:\");\n console.log(\n chalk.cyan(\n ` vm0 run ${displayName}:${shortVersionId} --artifact <artifact> \"your prompt\"`,\n ),\n );\n }\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n\n return result;\n}\n\nexport const composeCommand = new Command()\n .name(\"compose\")\n .description(\"Create or update agent compose (e.g., vm0.yaml)\")\n .argument(\n \"[agent-yaml]\",\n `Path to agent YAML file (default: ${DEFAULT_CONFIG_FILE})`,\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\n \"--experimental-shared-compose\",\n \"[deprecated] No longer required, kept for backward compatibility\",\n )\n .option(\"--json\", \"Output JSON for scripts (suppresses interactive output)\")\n .option(\n \"--porcelain\",\n \"[deprecated: use --json] Output JSON for scripts\",\n false,\n )\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n configFile: string | undefined,\n options: {\n yes?: boolean;\n autoUpdate?: boolean;\n experimentalSharedCompose?: boolean;\n json?: boolean;\n porcelain?: boolean;\n },\n ) => {\n const resolvedConfigFile = configFile ?? DEFAULT_CONFIG_FILE;\n\n // Handle deprecated --porcelain flag\n if (options.porcelain && !options.json) {\n console.error(\n chalk.yellow(\"⚠ --porcelain is deprecated, use --json instead\"),\n );\n options.json = true;\n }\n\n // JSON mode implies --yes and disables auto-update (for CI/CD usage)\n if (options.json) {\n options.yes = true;\n options.autoUpdate = false;\n }\n\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n try {\n const { config, agentName, agent, basePath } =\n await loadAndValidateConfig(resolvedConfigFile);\n\n await uploadInstructionsIfPresent(\n agentName,\n agent,\n basePath,\n options.json,\n );\n\n const result = await finalizeCompose(config, agent, options);\n\n // Output JSON result if requested\n if (options.json) {\n console.log(JSON.stringify(result));\n }\n } catch (error) {\n if (options.json) {\n const message =\n error instanceof Error\n ? error.message\n : \"An unexpected error occurred\";\n console.log(JSON.stringify({ error: message }));\n process.exit(1);\n }\n\n throw error;\n }\n },\n ),\n );\n","import { z } from \"zod\";\nimport {\n agentDefinitionSchema,\n volumeConfigSchema,\n} from \"@vm0/api-contracts/contracts/composes\";\n\n/**\n * CLI-specific agent name schema that allows 3-character names.\n * Pattern: start/end with alphanumeric, middle can have hyphens\n */\nconst cliAgentNameSchema = z\n .string()\n .min(3, \"Agent name must be at least 3 characters\")\n .max(64, \"Agent name must be 64 characters or less\")\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$/,\n \"Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens\",\n );\n\n/**\n * CLI compose schema with single-agent rule and volume mount validation.\n * Framework validation is handled server-side.\n */\nconst cliComposeSchema = z\n .object({\n version: z.string().min(1, \"Missing config.version\"),\n agents: z.record(cliAgentNameSchema, agentDefinitionSchema),\n volumes: z.record(z.string(), volumeConfigSchema).optional(),\n })\n .superRefine((config, ctx) => {\n const agentKeys = Object.keys(config.agents);\n\n // CLI business rule: at least one agent required\n if (agentKeys.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"agents must have at least one agent defined\",\n path: [\"agents\"],\n });\n return;\n }\n\n // CLI business rule: only one agent allowed\n if (agentKeys.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Multiple agents not supported yet. Only one agent allowed.\",\n path: [\"agents\"],\n });\n return;\n }\n\n // Volume mount validation\n const agentName = agentKeys[0]!;\n const agent = config.agents[agentName];\n const agentVolumes = agent?.volumes;\n\n if (agentVolumes && agentVolumes.length > 0) {\n if (!config.volumes) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Agent references volumes but no volumes section defined. Each volume must have explicit name and version.\",\n path: [\"volumes\"],\n });\n return;\n }\n\n for (const volDeclaration of agentVolumes) {\n const parts = volDeclaration.split(\":\");\n if (parts.length !== 2) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid volume declaration: ${volDeclaration}. Expected format: volume-key:/mount/path`,\n path: [\"agents\", agentName, \"volumes\"],\n });\n continue;\n }\n\n const volumeKey = parts[0]!.trim();\n if (!config.volumes[volumeKey]) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Volume \"${volumeKey}\" is not defined in volumes section. Each volume must have explicit name and version.`,\n path: [\"volumes\", volumeKey],\n });\n }\n }\n }\n });\n\n/**\n * Format an invalid_type Zod issue into a user-friendly message.\n * Returns null if no special formatting applies.\n */\nfunction formatInvalidTypeIssue(\n path: string,\n issue: z.ZodIssue & { expected?: string },\n): string | null {\n // Zod 4 uses 'input' instead of 'received' in types, but runtime has 'received'\n const received = (issue as unknown as { received?: string }).received;\n\n // Missing required fields (handles both \"Required\" and \"Invalid input:\" messages)\n const isMissing =\n received === \"undefined\" ||\n issue.message.includes(\"received undefined\") ||\n issue.message === \"Required\";\n\n if (path === \"version\" && isMissing) {\n return \"Missing config.version\";\n }\n if (path === \"agents\" && isMissing) {\n return \"Missing agents object in config\";\n }\n // Volume field errors\n if (path.startsWith(\"volumes.\") && path.endsWith(\".name\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'name' field (string)`;\n }\n if (path.startsWith(\"volumes.\") && path.endsWith(\".version\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'version' field (string)`;\n }\n // Array type errors\n if (issue.expected === \"array\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n return `${fieldName} must be an array`;\n }\n // Array element type errors (number where string expected)\n if (issue.expected === \"string\" && received === \"number\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n const match = fieldName.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (match) {\n return `Each entry in ${match[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n return null;\n}\n\n/**\n * Formats a Zod error into a user-friendly string\n */\nfunction formatZodError(error: z.ZodError): string {\n const issue = error.issues[0];\n if (!issue) return \"Validation failed\";\n\n const path = issue.path.join(\".\");\n const message = issue.message;\n\n // Root-level errors or custom messages without path context\n if (!path) return message;\n\n // Handle invalid_type errors with user-friendly messages\n if (issue.code === \"invalid_type\") {\n const formatted = formatInvalidTypeIssue(path, issue);\n if (formatted) return formatted;\n }\n\n // Handle invalid_key for agent name key validation (Zod 4 uses invalid_key instead of invalid_string)\n if (issue.code === \"invalid_key\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle invalid key in record (agent name validation)\n if (message === \"Invalid key in record\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle custom errors (our superRefine messages) - return without path prefix\n if (issue.code === \"custom\") {\n return message;\n }\n\n // Handle agent-level errors with cleaner paths\n if (path.startsWith(\"agents.\")) {\n const cleanPath = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n // For \"Invalid input\" messages, provide cleaner error\n if (message.startsWith(\"Invalid input:\")) {\n const match = message.match(/expected (\\w+), received (\\w+)/);\n if (match && match[1] === \"string\" && match[2] === \"number\") {\n const fieldMatch = cleanPath.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (fieldMatch) {\n return `Each entry in ${fieldMatch[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n }\n return `${cleanPath}: ${message}`;\n }\n\n return `${path}: ${message}`;\n}\n\n/**\n * Validates agent.name format\n */\nexport function validateAgentName(name: string): boolean {\n return cliAgentNameSchema.safeParse(name).success;\n}\n\n/**\n * Known fields in agent definition schema, derived from the Zod schema shape.\n * Used for typo detection against unknown fields in YAML config.\n */\nconst KNOWN_AGENT_FIELDS = Object.keys(agentDefinitionSchema.shape);\n\n/**\n * Computes Levenshtein edit distance between two strings.\n * Uses single-row DP optimization for O(min(m,n)) space.\n */\nfunction levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n // Ensure a is the shorter string for space optimization\n if (a.length > b.length) [a, b] = [b, a];\n\n const row = Array.from({ length: a.length + 1 }, (_, i) => {\n return i;\n });\n\n for (let j = 1; j <= b.length; j++) {\n let prev = j - 1;\n row[0] = j;\n for (let i = 1; i <= a.length; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const current = Math.min(\n row[i]! + 1, // deletion\n row[i - 1]! + 1, // insertion\n prev + cost, // substitution\n );\n prev = row[i]!;\n row[i] = current;\n }\n }\n\n return row[a.length]!;\n}\n\n/**\n * Finds the most similar known field for an unknown field name.\n * Uses two strategies:\n * 1. Levenshtein distance ≤ 2 for close typos (e.g., \"environments\" → \"environment\")\n * 2. Prefix containment for abbreviations (e.g., \"env\" → \"environment\")\n *\n * Returns the best matching field name, or null if no match found.\n */\nfunction findSimilarField(\n unknown: string,\n knownFields: string[],\n): string | null {\n let bestMatch: string | null = null;\n let bestDistance = Infinity;\n\n for (const known of knownFields) {\n if (unknown === known) continue;\n\n // Check 1: Levenshtein distance ≤ 2\n const distance = levenshteinDistance(unknown, known);\n if (distance <= 2 && distance < bestDistance) {\n bestDistance = distance;\n bestMatch = known;\n }\n\n // Check 2: Prefix containment (unknown is a prefix of known, min 3 chars)\n if (unknown.length >= 3 && known.startsWith(unknown) && !bestMatch) {\n bestMatch = known;\n }\n }\n\n return bestMatch;\n}\n\n/**\n * Extracts agent entries from raw config, with type guards.\n * Returns null if config structure is invalid for agent inspection.\n */\nfunction extractAgentEntries(\n config: unknown,\n): Record<string, Record<string, unknown>> | null {\n if (!config || typeof config !== \"object\") return null;\n const cfg = config as Record<string, unknown>;\n const agents = cfg.agents as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (!agents || typeof agents !== \"object\" || Array.isArray(agents))\n return null;\n return agents;\n}\n\n/**\n * Checks for unknown fields in agent definitions that look like typos.\n * Returns an error message listing all detected typos, or null if none found.\n */\nfunction checkForFieldTypos(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n const errors: string[] = [];\n\n for (const [agentName, agent] of Object.entries(agents)) {\n if (!agent || typeof agent !== \"object\" || Array.isArray(agent)) continue;\n\n for (const field of Object.keys(agent)) {\n if (KNOWN_AGENT_FIELDS.includes(field)) continue;\n\n const suggestion = findSimilarField(field, KNOWN_AGENT_FIELDS);\n if (suggestion) {\n errors.push(\n `Unknown field \"${field}\" in agent \"${agentName}\". Did you mean \"${suggestion}\"?`,\n );\n }\n }\n }\n\n return errors.length > 0 ? errors.join(\"\\n\") : null;\n}\n\n/**\n * Checks for deprecated 'provider' field and returns migration error message\n */\nfunction checkForDeprecatedProvider(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n for (const agent of Object.values(agents)) {\n if (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n if (\"provider\" in agent && !(\"framework\" in agent)) {\n const providerValue = agent.provider;\n return `'provider' field is deprecated. Use 'framework' instead.\\n\\nChange in your vm0.yaml:\\n - provider: ${providerValue}\\n + framework: ${providerValue}`;\n }\n }\n }\n return null;\n}\n\n/**\n * Validates agent compose structure using Zod schemas\n */\nexport function validateAgentCompose(config: unknown): {\n valid: boolean;\n error?: string;\n} {\n // Pre-check: Deprecated 'provider' field\n const deprecationError = checkForDeprecatedProvider(config);\n if (deprecationError) {\n return { valid: false, error: deprecationError };\n }\n\n // Pre-check: Detect likely typos in agent definition fields\n const typoError = checkForFieldTypos(config);\n if (typoError) {\n return { valid: false, error: typoError };\n }\n\n // Pre-check: Better error for array agents (common mistake)\n if (\n config &&\n typeof config === \"object\" &&\n Array.isArray((config as Record<string, unknown>).agents)\n ) {\n return {\n valid: false,\n error:\n \"agents must be an object, not an array. Use format: agents: { agent-name: { ... } }\",\n };\n }\n\n // Pre-check: Basic object check\n if (!config || typeof config !== \"object\") {\n return { valid: false, error: \"Config must be an object\" };\n }\n\n // Main validation using CLI compose schema\n const result = cliComposeSchema.safeParse(config);\n if (!result.success) {\n return { valid: false, error: formatZodError(result.error) };\n }\n\n return { valid: true };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { getInstructionsStorageName } from \"@vm0/core/storage-names\";\nimport { directUpload } from \"./direct-upload\";\nimport { getInstructionsFilename } from \"@vm0/core/frameworks\";\n\ninterface StorageUploadResult {\n name: string;\n versionId: string;\n action: \"created\" | \"deduplicated\";\n}\n\n/**\n * Upload instructions file as a volume\n *\n * @param agentName - Name of the agent (used for storage name)\n * @param instructionsFilePath - Path to the instructions file (e.g., AGENTS.md)\n * @param basePath - Base path for resolving relative paths\n * @param framework - Framework name for determining canonical filename\n * @returns Upload result with storage name and version\n */\nexport async function uploadInstructions(\n agentName: string,\n instructionsFilePath: string,\n basePath: string,\n framework?: string,\n): Promise<StorageUploadResult> {\n // Normalize agent name to lowercase to match server's normalization behavior\n // Server normalizes agent names to lowercase when storing compose configs\n const storageName = getInstructionsStorageName(agentName.toLowerCase());\n\n // Resolve file path relative to base path\n const absolutePath = path.isAbsolute(instructionsFilePath)\n ? instructionsFilePath\n : path.join(basePath, instructionsFilePath);\n\n // Read the instructions file\n const content = await fs.readFile(absolutePath, \"utf8\");\n\n // Create a temporary directory with the file\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-instructions-\"));\n const instructionsDir = path.join(tmpDir, \"instructions\");\n await fs.mkdir(instructionsDir);\n\n // Write file with framework-specific name (e.g., CLAUDE.md for claude-code)\n const filename = getInstructionsFilename(framework);\n await fs.writeFile(path.join(instructionsDir, filename), content);\n\n try {\n // Use direct upload (bypasses Vercel 4.5MB limit)\n const result = await directUpload(storageName, \"volume\", instructionsDir);\n\n return {\n name: storageName,\n versionId: result.versionId,\n action: result.deduplicated ? \"deduplicated\" : \"created\",\n };\n } finally {\n // Clean up temp directory\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n}\n","import { createHash } from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { prepareStorage, commitStorage } from \"../api\";\nimport { excludeVm0Filter } from \"../utils/file-utils\";\n\n/**\n * File entry with pre-computed hash for direct upload\n */\ninterface FileEntryWithHash {\n path: string;\n hash: string;\n size: number;\n}\n\n/**\n * Result of direct upload operation\n */\ninterface DirectUploadResult {\n versionId: string;\n size: number;\n fileCount: number;\n deduplicated: boolean;\n empty: boolean;\n}\n\n/**\n * Progress callback for upload operations\n */\ntype ProgressCallback = (message: string) => void;\n\n/**\n * Compute SHA-256 hash of a file using streaming to avoid loading large files into memory\n */\nasync function hashFileStream(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(\"sha256\");\n const stream = fs.createReadStream(filePath);\n\n stream.on(\"data\", (chunk) => {\n return hash.update(chunk);\n });\n stream.on(\"end\", () => {\n return resolve(hash.digest(\"hex\"));\n });\n stream.on(\"error\", reject);\n });\n}\n\n/**\n * Get all files in directory recursively, excluding .vm0/\n */\nasync function getAllFiles(\n dirPath: string,\n baseDir: string = dirPath,\n): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n // Skip .vm0 directory\n if (relativePath.startsWith(\".vm0\")) {\n continue;\n }\n\n if (entry.isDirectory()) {\n const subFiles = await getAllFiles(fullPath, baseDir);\n files.push(...subFiles);\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Collect file metadata with hashes using streaming to handle large files\n */\nasync function collectFileMetadata(\n cwd: string,\n files: string[],\n onProgress?: ProgressCallback,\n): Promise<FileEntryWithHash[]> {\n const fileEntries: FileEntryWithHash[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const relativePath = path.relative(cwd, file);\n\n // Use streaming hash to avoid loading large files into memory\n const [hash, stats] = await Promise.all([\n hashFileStream(file),\n fs.promises.stat(file),\n ]);\n\n fileEntries.push({\n path: relativePath,\n hash,\n size: stats.size,\n });\n\n // Report progress every 100 files\n if (onProgress && (i + 1) % 100 === 0) {\n onProgress(`Hashing files... ${i + 1}/${files.length}`);\n }\n }\n\n return fileEntries;\n}\n\n/**\n * Create tar.gz archive of files\n */\nasync function createArchive(cwd: string, files: string[]): Promise<Buffer> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n\n try {\n const relativePaths = files.map((file) => {\n return path.relative(cwd, file);\n });\n\n if (relativePaths.length > 0) {\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n },\n relativePaths,\n );\n } else {\n // For empty directories, create tar.gz excluding .vm0\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n filter: excludeVm0Filter,\n },\n [\".\"],\n );\n }\n\n const tarBuffer = await fs.promises.readFile(tarPath);\n return tarBuffer;\n } finally {\n // Clean up temp files\n if (fs.existsSync(tarPath)) {\n await fs.promises.unlink(tarPath);\n }\n await fs.promises.rmdir(tmpDir);\n }\n}\n\n/**\n * Create manifest JSON for the upload\n */\nfunction createManifest(files: FileEntryWithHash[]): Buffer {\n const manifest = {\n version: 1,\n files,\n createdAt: new Date().toISOString(),\n };\n return Buffer.from(JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Upload buffer to presigned URL with retry logic\n */\nasync function uploadToPresignedUrl(\n presignedUrl: string,\n data: Buffer,\n contentType: string,\n maxRetries: number = 3,\n): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(presignedUrl, {\n method: \"PUT\",\n body: data,\n headers: {\n \"Content-Type\": contentType,\n },\n });\n\n if (response.ok) {\n return;\n }\n\n // For 4xx errors (client errors), don't retry\n if (response.status >= 400 && response.status < 500) {\n const text = await response.text();\n throw new Error(`S3 upload failed: ${response.status} - ${text}`);\n }\n\n // For 5xx errors, retry with backoff\n const text = await response.text();\n lastError = new Error(`S3 upload failed: ${response.status} - ${text}`);\n } catch (error) {\n lastError =\n error instanceof Error ? error : new Error(\"Unknown upload error\");\n\n // Don't retry on client errors\n if (\n lastError.message.includes(\"400\") ||\n lastError.message.includes(\"403\")\n ) {\n throw lastError;\n }\n }\n\n // Exponential backoff: 1s, 2s, 4s...\n if (attempt < maxRetries) {\n const backoffMs = Math.pow(2, attempt - 1) * 1000;\n await sleep(backoffMs);\n }\n }\n\n throw lastError || new Error(\"S3 upload failed after retries\");\n}\n\n/**\n * Options for direct upload\n */\ninterface DirectUploadOptions {\n onProgress?: ProgressCallback;\n force?: boolean;\n}\n\n/**\n * Perform direct S3 upload for a storage (volume or artifact)\n *\n * This bypasses Vercel's 4.5MB request body limit by:\n * 1. Computing file hashes locally\n * 2. Getting presigned URLs from /api/storages/prepare\n * 3. Uploading directly to S3\n * 4. Committing via /api/storages/commit\n */\nexport async function directUpload(\n storageName: string,\n storageType: \"volume\" | \"artifact\",\n cwd: string,\n options?: DirectUploadOptions,\n): Promise<DirectUploadResult> {\n const { onProgress, force } = options || {};\n\n // Step 1: Collect all files\n onProgress?.(\"Collecting files...\");\n const files = await getAllFiles(cwd);\n\n // Step 2: Compute hashes for all files\n onProgress?.(\"Computing file hashes...\");\n const fileEntries = await collectFileMetadata(cwd, files, onProgress);\n\n // Step 3: Call prepare endpoint\n onProgress?.(\"Preparing upload...\");\n const prepareResult = await prepareStorage({\n storageName,\n storageType,\n files: fileEntries,\n force,\n });\n\n // Step 4: Check if version already exists (deduplication)\n // Skip upload but still call commit to update HEAD (fixes #626)\n if (prepareResult.existing) {\n onProgress?.(\"Version exists, updating HEAD...\");\n\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: true,\n empty: commitResult.fileCount === 0,\n };\n }\n\n // Step 5: Create and upload archive (skip for empty artifacts)\n if (files.length > 0) {\n onProgress?.(\"Compressing files...\");\n const archiveBuffer = await createArchive(cwd, files);\n\n onProgress?.(\"Uploading archive to S3...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n\n await uploadToPresignedUrl(\n prepareResult.uploads.archive.presignedUrl,\n archiveBuffer,\n \"application/gzip\",\n );\n }\n\n // Step 6: Create and upload manifest\n onProgress?.(\"Uploading manifest...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n const manifestBuffer = createManifest(fileEntries);\n await uploadToPresignedUrl(\n prepareResult.uploads.manifest.presignedUrl,\n manifestBuffer,\n \"application/json\",\n );\n\n // Step 7: Commit the upload\n onProgress?.(\"Committing...\");\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: commitResult.deduplicated || false,\n empty: commitResult.fileCount === 0,\n };\n}\n","import { mainRunCommand } from \"./run\";\nimport { resumeCommand } from \"./resume\";\nimport { continueCommand } from \"./continue\";\nimport { listCommand } from \"./list\";\nimport { killCommand } from \"./kill\";\nimport { queueCommand } from \"./queue\";\n\n// Add subcommands to the main run command\nmainRunCommand.addCommand(resumeCommand);\nmainRunCommand.addCommand(continueCommand);\nmainRunCommand.addCommand(listCommand);\nmainRunCommand.addCommand(killCommand);\nmainRunCommand.addCommand(queueCommand);\n\nexport const runCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport {\n directRunModelProviderTypeSchema,\n type DirectRunModelProviderType,\n} from \"@vm0/api-contracts/contracts/runs\";\nimport {\n getComposeById,\n getComposeByName,\n getComposeVersion,\n createRun,\n} from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n collectMounts,\n collectArtifacts,\n isUUID,\n extractVarNames,\n extractSecretNames,\n loadValues,\n parsePermissionPolicies,\n parseIdentifier,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction parseModelProviderType(\n value: string | undefined,\n): DirectRunModelProviderType | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = directRunModelProviderTypeSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid model provider type: ${value}`);\n }\n return parsed.data;\n}\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Run an agent\")\n .argument(\n \"<agent-name>\",\n \"Agent reference: name[:version] (e.g., 'my-agent', 'my-agent:abc123', 'my-agent:latest')\",\n )\n .argument(\"<prompt>\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable, format: volumeName=version)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--conversation <id>\",\n \"Resume from conversation ID (for fine-grained control)\",\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .option(\n \"--capture-network-bodies\",\n \"Capture HTTP header names, selected safe header values, request bodies, and response bodies in network logs\",\n )\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .addOption(new Option(\"--model-provider-type <type>\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n identifier: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volumeVersion: Record<string, string>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n conversation?: string;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n captureNetworkBodies?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n modelProviderType?: string;\n autoUpdate?: boolean;\n },\n ) => {\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n // 1. Parse identifier for optional version specifier\n const { name, version } = parseIdentifier(identifier);\n\n // 2. Resolve name to composeId and get compose content\n let composeId: string;\n let composeContent: unknown;\n\n if (isUUID(name)) {\n // It's a UUID compose ID - fetch compose to get content\n const compose = await getComposeById(name);\n composeId = compose.id;\n composeContent = compose.content;\n } else {\n // It's an agent name - resolve to compose ID\n const compose = await getComposeByName(name);\n if (!compose) {\n throw new Error(`Agent not found: ${identifier}`, {\n cause: new Error(\n \"Make sure you've composed the agent with: vm0 compose\",\n ),\n });\n }\n\n composeId = compose.id;\n composeContent = compose.content;\n }\n\n // 3. Resolve version if specified\n let agentComposeVersionId: string | undefined;\n\n if (version && version !== \"latest\") {\n // Resolve version hash to full version ID\n try {\n const versionInfo = await getComposeVersion(composeId, version);\n agentComposeVersionId = versionInfo.versionId;\n } catch (error) {\n throw new Error(`Version not found: ${version}`, {\n cause: error,\n });\n }\n }\n // Note: \"latest\" version uses agentComposeId which resolves to HEAD\n\n // 4. Load vars and secrets with priority: CLI args > --env-file > env vars\n const varNames = extractVarNames(composeContent);\n const vars = loadValues(options.vars, varNames, options.envFile);\n\n const secretNames = extractSecretNames(composeContent);\n const secrets = loadValues(\n options.secrets,\n secretNames,\n options.envFile,\n );\n\n // 5. Prepare optional fields\n const volumeVersions =\n Object.keys(options.volumeVersion).length > 0\n ? options.volumeVersion\n : undefined;\n const additionalVolumes =\n options.volume.length > 0 ? options.volume : undefined;\n const artifacts =\n options.artifact.length > 0 ? options.artifact : undefined;\n\n // 6. Call unified API (server handles all variable expansion)\n const response = await createRun({\n // Use agentComposeVersionId if resolved, otherwise use agentComposeId (resolves to HEAD)\n ...(agentComposeVersionId\n ? { agentComposeVersionId }\n : { agentComposeId: composeId }),\n prompt,\n vars,\n secrets,\n artifacts,\n volumeVersions,\n additionalVolumes,\n conversationId: options.conversation,\n appendSystemPrompt: options.appendSystemPrompt,\n disallowedTools: options.disallowedTools,\n tools: options.tools,\n settings: options.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies,\n ),\n captureNetworkBodies: options.captureNetworkBodies || undefined,\n debugNoMockClaude: options.debugNoMockClaude || undefined,\n debugNoMockCodex: options.debugNoMockCodex || undefined,\n modelProviderType: parseModelProviderType(options.modelProviderType),\n });\n\n // 7. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 8. Display run started/queued info\n renderRunCreated(response);\n\n // 9. Poll for events and exit with appropriate code\n const result = await pollEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getCheckpoint, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n collectMounts,\n collectArtifacts,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\"Resume an agent run from a checkpoint (uses all snapshot data)\")\n .argument(\"<checkpointId>\", \"Checkpoint ID to resume from\")\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .action(\n withErrorHandler(\n async (\n checkpointId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n volumeVersion: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate checkpoint ID format\n if (!isUUID(checkpointId)) {\n throw new Error(`Invalid checkpoint ID format: ${checkpointId}`, {\n cause: new Error(\"Checkpoint ID must be a valid UUID\"),\n });\n }\n\n // 2. Fetch checkpoint info to get required secret names\n // This allows loading secrets from environment variables\n const checkpointInfo = await getCheckpoint(checkpointId);\n const requiredSecretNames =\n checkpointInfo.agentComposeSnapshot.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Prepare optional fields\n // Commander routes the repeatable --artifact to either the subcommand's\n // own options or the parent's, depending on where the user put the flag.\n // Prefer the one with entries; fall back to the other.\n const artifactsInput =\n options.artifact.length > 0 ? options.artifact : allOpts.artifact;\n const artifacts =\n artifactsInput.length > 0 ? artifactsInput : undefined;\n const resolvedVars = Object.keys(vars).length > 0 ? vars : undefined;\n const volumeVersions =\n Object.keys(allOpts.volumeVersion).length > 0\n ? allOpts.volumeVersion\n : undefined;\n const additionalVolumes =\n allOpts.volume.length > 0 ? allOpts.volume : undefined;\n\n // 5. Call unified API with checkpointId\n const response = await createRun({\n checkpointId,\n prompt,\n vars: resolvedVars,\n secrets: loadedSecrets,\n artifacts,\n volumeVersions,\n additionalVolumes,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n debugNoMockClaude:\n options.debugNoMockClaude || allOpts.debugNoMockClaude,\n debugNoMockCodex:\n options.debugNoMockCodex || allOpts.debugNoMockCodex,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getSession, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectMounts,\n collectArtifacts,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Pick the first truthy value, falling back to `undefined`. Used to merge\n * commander.js subcommand options with parent options when a flag can land\n * on either depending on argv ordering. Extracted to keep the action\n * handler's cyclomatic complexity below the lint threshold.\n */\nfunction pickOpt<T>(a: T | undefined, b: T | undefined): T | undefined {\n return a || b || undefined;\n}\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue an agent run from a session (uses latest artifact version)\",\n )\n .argument(\"<agentSessionId>\", \"Agent session ID to continue from\")\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .action(\n withErrorHandler(\n async (\n agentSessionId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate session ID format\n if (!isUUID(agentSessionId)) {\n throw new Error(\n `Invalid agent session ID format: ${agentSessionId}`,\n { cause: new Error(\"Agent session ID must be a valid UUID\") },\n );\n }\n\n // 2. Fetch session info to get required secret names\n // This allows loading secrets from environment variables\n const sessionInfo = await getSession(agentSessionId);\n const requiredSecretNames = sessionInfo.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Prepare optional fields\n // Commander routes the repeatable --artifact to either the subcommand's\n // own options or the parent's, depending on where the user put the flag.\n // Prefer the one with entries; fall back to the other.\n const artifactsInput =\n options.artifact.length > 0 ? options.artifact : allOpts.artifact;\n const artifacts =\n artifactsInput.length > 0 ? artifactsInput : undefined;\n\n // 5. Call unified API with sessionId\n const response = await createRun({\n sessionId: agentSessionId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n artifacts,\n additionalVolumes:\n allOpts.volume.length > 0 ? allOpts.volume : undefined,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n debugNoMockClaude: pickOpt(\n options.debugNoMockClaude,\n allOpts.debugNoMockClaude,\n ),\n debugNoMockCodex: pickOpt(\n options.debugNoMockCodex,\n allOpts.debugNoMockCodex,\n ),\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listRuns } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport {\n ALL_RUN_STATUSES,\n type RunListItem,\n type RunStatus,\n} from \"@vm0/api-contracts/contracts/runs\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/** Standard UUID string length (with hyphens) */\nconst UUID_LENGTH = 36;\n\n/** All valid status values as a string for help text */\nconst VALID_STATUSES = ALL_RUN_STATUSES.join(\",\");\n\n/**\n * Command options type\n */\ninterface ListOptions {\n status?: string;\n all?: boolean;\n agent?: string;\n since?: string;\n until?: string;\n limit?: string;\n}\n\n/**\n * Format run status with color and optional padding\n */\nfunction formatRunStatus(status: RunStatus, width?: number): string {\n const paddedStatus = width ? status.padEnd(width) : status;\n switch (status) {\n case \"queued\":\n return chalk.blue(paddedStatus);\n case \"running\":\n return chalk.green(paddedStatus);\n case \"pending\":\n return chalk.yellow(paddedStatus);\n case \"completed\":\n return chalk.dim(paddedStatus);\n case \"failed\":\n case \"timeout\":\n return chalk.red(paddedStatus);\n default:\n return paddedStatus;\n }\n}\n\n/**\n * Validate and parse status filter from options\n */\nfunction parseStatusFilter(options: ListOptions): string | undefined {\n if (options.all) {\n return VALID_STATUSES;\n }\n\n if (options.status) {\n const values = options.status.split(\",\").map((s) => {\n return s.trim();\n });\n for (const v of values) {\n if (!ALL_RUN_STATUSES.includes(v as RunStatus)) {\n throw new Error(`Invalid status \"${v}\"`, {\n cause: new Error(`Valid values: ${VALID_STATUSES}`),\n });\n }\n }\n return values.join(\",\");\n }\n\n if (options.since) {\n // Implicit all when --since is used\n return VALID_STATUSES;\n }\n\n // undefined = backend default (pending,running)\n return undefined;\n}\n\n/**\n * Parse time option to ISO string\n */\nfunction parseTimeOption(value: string, optionName: string): string {\n try {\n return new Date(parseTime(value)).toISOString();\n } catch {\n throw new Error(\n `Invalid ${optionName} format. Use ISO (2026-01-01) or relative (1h, 7d, 30d)`,\n );\n }\n}\n\n/**\n * Parse and validate limit option\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 100) {\n throw new Error(\"--limit must be between 1 and 100\");\n }\n return limit;\n}\n\n/**\n * Display runs in table format\n */\nfunction displayRuns(runs: RunListItem[]): void {\n // Calculate column widths\n const agentWidth = Math.max(\n 5,\n ...runs.map((r) => {\n return r.agentName.length;\n }),\n );\n const statusWidth = Math.max(\n 6,\n ...runs.map((r) => {\n return r.status.length;\n }),\n );\n\n // Print header\n const header = [\n \"ID\".padEnd(UUID_LENGTH),\n \"AGENT\".padEnd(agentWidth),\n \"STATUS\".padEnd(statusWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const run of runs) {\n const row = [\n run.id.padEnd(UUID_LENGTH),\n run.agentName.padEnd(agentWidth),\n formatRunStatus(run.status, statusWidth),\n formatRelativeTime(run.createdAt),\n ].join(\" \");\n console.log(row);\n }\n}\n\n/**\n * Display empty state message\n */\nfunction displayEmptyState(hasFilters: boolean): void {\n if (hasFilters) {\n console.log(chalk.dim(\"No runs found matching filters\"));\n } else {\n console.log(chalk.dim(\"No active runs\"));\n console.log(chalk.dim(' Run: vm0 run <agent> \"<prompt>\"'));\n }\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List runs\")\n .option(\n \"--status <status,...>\",\n `Filter by status: ${VALID_STATUSES} (default: pending,running)`,\n )\n .option(\"--all\", \"Show all statuses (mutually exclusive with --status)\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--since <date>\", \"Start time (ISO format or relative: 1h, 7d, 30d)\")\n .option(\"--until <date>\", \"End time (defaults to now)\")\n .option(\"--limit <n>\", \"Maximum number of results (default: 50, max: 100)\")\n .action(\n withErrorHandler(async (options: ListOptions) => {\n // Validate mutual exclusion\n if (options.all && options.status) {\n throw new Error(\"--all and --status are mutually exclusive\");\n }\n\n // Parse options\n const statusFilter = parseStatusFilter(options);\n const since = options.since\n ? parseTimeOption(options.since, \"--since\")\n : undefined;\n const until = options.until\n ? parseTimeOption(options.until, \"--until\")\n : undefined;\n const limit = parseLimit(options.limit);\n\n // Validate since < until\n if (since && until && new Date(since) >= new Date(until)) {\n throw new Error(\"--since must be before --until\");\n }\n\n // Fetch runs with filters\n const response = await listRuns({\n status: statusFilter,\n agent: options.agent,\n since,\n until,\n limit,\n });\n\n const runs = response.runs;\n\n if (runs.length === 0) {\n const hasFilters = !!(\n options.status ||\n options.all ||\n options.agent ||\n options.since\n );\n displayEmptyState(hasFilters);\n return;\n }\n\n displayRuns(runs);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cancelRun } from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const killCommand = new Command()\n .name(\"kill\")\n .description(\"Kill (cancel) a pending or running run\")\n .argument(\"<run-id>\", \"Run ID to kill\")\n .action(\n withErrorHandler(async (runId: string) => {\n await cancelRun(runId);\n console.log(chalk.green(`✓ Run ${runId} cancelled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getRunQueue } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const queueCommand = new Command()\n .name(\"queue\")\n .description(\"Show org run queue status\")\n .action(\n withErrorHandler(async () => {\n const data = await getRunQueue();\n const { concurrency, queue } = data;\n\n // Concurrency header\n const limitDisplay =\n concurrency.limit === 0\n ? \"unlimited\"\n : `${concurrency.active}/${concurrency.limit} slots used`;\n console.log(`Concurrency: ${limitDisplay} (${concurrency.tier} tier)`);\n\n // Queue status\n if (queue.length === 0) {\n console.log(chalk.dim(\"Queue: empty — all slots available\"));\n return;\n }\n\n console.log(\n `Queue: ${queue.length} run${queue.length > 1 ? \"s\" : \"\"} waiting`,\n );\n console.log();\n\n // Dynamic column widths\n const posWidth = Math.max(1, String(queue.length).length);\n const agentWidth = Math.max(\n 5,\n ...queue.map((e) => {\n return (e.agentName ?? \"-\").length;\n }),\n );\n const emailWidth = Math.max(\n 4,\n ...queue.map((e) => {\n return (e.userEmail ?? \"-\").length;\n }),\n );\n\n // Header\n const header = [\n \"#\".padEnd(posWidth),\n \"AGENT\".padEnd(agentWidth),\n \"USER\".padEnd(emailWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Rows\n for (const entry of queue) {\n const marker = entry.runId !== null ? chalk.cyan(\" ← you\") : \"\";\n const row = [\n String(entry.position).padEnd(posWidth),\n (entry.agentName ?? \"-\").padEnd(agentWidth),\n (entry.userEmail ?? \"-\").padEnd(emailWidth),\n formatRelativeTime(entry.createdAt),\n ].join(\" \");\n console.log(row + marker);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const volumeCommand = new Command()\n .name(\"volume\")\n .description(\"Manage volumes (defined in compose, not versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a volume in the current directory\")\n .option(\"-n, --name <name>\", \"Volume name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if storage config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n console.log(\n chalk.yellow(`Volume already initialized: ${existingConfig.name}`),\n );\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine volume name\n let volumeName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n volumeName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 volume init --name <volume-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter volume name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n volumeName = name;\n }\n\n // Validate volume name\n if (!isValidStorageName(volumeName)) {\n throw new Error(`Invalid volume name: \"${volumeName}\"`, {\n cause: new Error(\n \"Volume names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file\n await writeStorageConfig(volumeName, cwd);\n\n console.log(chalk.green(`✓ Initialized volume: ${volumeName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport path from \"path\";\n\n/**\n * Storage type\n * - \"volume\": Static storage that doesn't auto-version after runs\n * - \"artifact\": Work products that auto-version after runs\n */\nexport type StorageType = \"volume\" | \"artifact\";\n\ninterface StorageConfig {\n name: string;\n type: StorageType;\n}\n\nconst CONFIG_DIR = \".vm0\";\nconst CONFIG_FILE = \"storage.yaml\";\n\n/**\n * Validate storage name format\n * Length: 3-64 characters\n * Characters: lowercase letters, numbers, hyphens\n * Must start and end with alphanumeric\n * No consecutive hyphens\n */\nexport function isValidStorageName(name: string): boolean {\n if (name.length < 3 || name.length > 64) {\n return false;\n }\n const pattern = /^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/;\n return pattern.test(name) && !name.includes(\"--\");\n}\n\n/**\n * Read storage config from .vm0/storage.yaml\n * Also supports legacy .vm0/volume.yaml for backward compatibility\n */\nexport async function readStorageConfig(\n basePath: string = process.cwd(),\n): Promise<StorageConfig | null> {\n const configPath = path.join(basePath, CONFIG_DIR, CONFIG_FILE);\n const legacyConfigPath = path.join(basePath, CONFIG_DIR, \"volume.yaml\");\n\n // Check for new config file first, then legacy\n let actualPath: string | null = null;\n if (existsSync(configPath)) {\n actualPath = configPath;\n } else if (existsSync(legacyConfigPath)) {\n actualPath = legacyConfigPath;\n }\n\n if (!actualPath) {\n return null;\n }\n\n const content = await readFile(actualPath, \"utf8\");\n const config = parseYaml(content) as StorageConfig;\n\n // Default to \"volume\" type for backward compatibility\n if (!config.type) {\n config.type = \"volume\";\n }\n\n return config;\n}\n\n/**\n * Write storage config to .vm0/storage.yaml\n */\nexport async function writeStorageConfig(\n storageName: string,\n basePath: string = process.cwd(),\n type: StorageType = \"volume\",\n): Promise<void> {\n const configDir = path.join(basePath, CONFIG_DIR);\n const configPath = path.join(configDir, CONFIG_FILE);\n\n // Create .vm0 directory if it doesn't exist\n if (!existsSync(configDir)) {\n await mkdir(configDir, { recursive: true });\n }\n\n const config: StorageConfig = {\n name: storageName,\n type,\n };\n\n const yamlContent = stringifyYaml(config);\n await writeFile(configPath, yamlContent, \"utf8\");\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud volume\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n console.log(`Pushing volume: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"volume\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty volume)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud files to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (versionId) {\n console.log(`Pulling volume: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling volume: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n version: versionId,\n });\n\n // Handle empty volume\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"volume.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import chalk from \"chalk\";\nimport { removeExtraFiles } from \"../utils/file-utils\";\n\n/**\n * Result of handling an empty storage response (HTTP 204).\n */\ninterface EmptyStorageResult {\n removedCount: number;\n}\n\n/**\n * Handle empty storage response (HTTP 204 No Content).\n * Syncs local directory to empty state by removing all tracked files.\n *\n * @param cwd - Current working directory\n * @returns Result with count of removed files\n */\nexport async function handleEmptyStorageResponse(\n cwd: string,\n): Promise<EmptyStorageResult> {\n console.log(chalk.dim(\"Syncing local files...\"));\n\n // Sync to empty state - remove all local files\n const removedCount = await removeExtraFiles(cwd, new Set());\n\n if (removedCount > 0) {\n console.log(chalk.green(`✓ Removed ${removedCount} files not in remote`));\n }\n\n console.log(chalk.green(\"✓ Synced (0 files)\"));\n\n return { removedCount };\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud volume\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (config.type !== \"volume\") {\n throw new Error(\n \"This directory is initialized as an artifact, not a volume\",\n { cause: new Error(\"Use: vm0 artifact status\") },\n );\n }\n\n // Start message\n console.log(`Checking volume: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 volume push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote volumes\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"volume\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No volumes found\"));\n console.log(\n chalk.dim(\" Create one with: vm0 volume init && vm0 volume push\"),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote volume to local directory (latest version)\")\n .argument(\"<name>\", \"Volume name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: volume name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use volume name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning volume: ${name}`);\n\n const result = await cloneStorage(name, \"volume\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned volume: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { writeStorageConfig, type StorageType } from \"./storage-utils\";\nimport { getStorageDownload } from \"../api\";\nimport {\n listTarFiles,\n formatBytes,\n checkDirectoryStatus,\n} from \"../utils/file-utils\";\n\ninterface CloneOptions {\n version?: string;\n}\n\ninterface CloneResult {\n success: boolean;\n fileCount: number;\n size: number;\n versionId: string;\n}\n\n/**\n * Clone a remote storage to a local directory\n * Creates the directory, downloads contents, and initializes .vm0 config\n */\nexport async function cloneStorage(\n name: string,\n type: StorageType,\n destination: string,\n options: CloneOptions = {},\n): Promise<CloneResult> {\n const typeLabel = type;\n\n // Check if destination already exists and is non-empty\n const dirStatus = checkDirectoryStatus(destination);\n if (dirStatus.exists && !dirStatus.empty) {\n throw new Error(`Directory \"${destination}\" is not empty`);\n }\n\n // Check if storage exists on remote\n console.log(chalk.dim(`Checking remote ${typeLabel}...`));\n\n const downloadInfo = await getStorageDownload({\n name,\n type,\n version: options.version,\n });\n\n // Create destination directory\n console.log(chalk.dim(`Creating directory: ${destination}/`));\n await fs.promises.mkdir(destination, { recursive: true });\n\n // Handle empty storage (type guard)\n if (\"empty\" in downloadInfo) {\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n\n console.log(chalk.green(`✓ Cloned empty ${typeLabel}: ${name}`));\n console.log(chalk.dim(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: 0,\n size: 0,\n versionId: downloadInfo.versionId,\n };\n }\n\n // TypeScript now knows downloadInfo has url property\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n // Clean up directory on failure\n await fs.promises.rm(destination, { recursive: true, force: true });\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-clone-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get file list from tar\n const files = await listTarFiles(tarPath);\n\n // Extract tar.gz to destination\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: destination,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${files.length} files`));\n\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n console.log(chalk.green(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: downloadInfo.fileCount,\n size: downloadInfo.size,\n versionId: downloadInfo.versionId,\n };\n}\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const artifactCommand = new Command()\n .name(\"artifact\")\n .description(\"Manage artifacts (specified at run, versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize an artifact in the current directory\")\n .option(\n \"-n, --name <name>\",\n \"Artifact name (required in non-interactive mode)\",\n )\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n if (existingConfig.type === \"artifact\") {\n console.log(\n chalk.yellow(\n `Artifact already initialized: ${existingConfig.name}`,\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Directory already initialized as volume: ${existingConfig.name}`,\n ),\n );\n console.log(\n chalk.dim(\n \" To change type, delete .vm0/storage.yaml and reinitialize\",\n ),\n );\n }\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine artifact name\n let artifactName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n artifactName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 artifact init --name <artifact-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter artifact name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n artifactName = name;\n }\n\n // Validate name\n if (!isValidStorageName(artifactName)) {\n throw new Error(`Invalid artifact name: \"${artifactName}\"`, {\n cause: new Error(\n \"Artifact names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file with type: artifact\n await writeStorageConfig(artifactName, cwd, \"artifact\");\n\n console.log(chalk.green(`✓ Initialized artifact: ${artifactName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud artifact\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume push\") },\n );\n }\n\n console.log(`Pushing artifact: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"artifact\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty artifact)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud artifact to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume pull\") },\n );\n }\n\n if (versionId) {\n console.log(`Pulling artifact: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling artifact: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n version: versionId,\n });\n\n // Handle empty artifact\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"artifact.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud artifact\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume status\") },\n );\n }\n\n // Start message\n console.log(`Checking artifact: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 artifact push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote artifacts\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"artifact\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No artifacts found\"));\n console.log(\n chalk.dim(\n \" Create one with: vm0 artifact init && vm0 artifact push\",\n ),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote artifact to local directory (latest version)\")\n .argument(\"<name>\", \"Artifact name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: artifact name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use artifact name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning artifact: ${name}`);\n\n const result = await cloneStorage(name, \"artifact\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned artifact: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getAgentEvents,\n getSystemLog,\n getMetrics,\n getNetworkLogs,\n type TelemetryMetric,\n type RunEvent,\n type NetworkLogEntry,\n} from \"../../lib/api\";\nimport { getApiUrl } from \"../../lib/api/config\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { EventStreamNormalizer } from \"../../lib/events/event-stream-normalizer\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport {\n collectLogItems,\n parsePositiveLogCount,\n} from \"../../lib/utils/log-pagination\";\nimport { searchCommand } from \"./search\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Maximum entries per API request\n */\nconst PAGE_LIMIT = 100;\n\n/**\n * Build platform URL for logs viewer\n * Transforms API URL to platform URL and appends logs path\n */\nfunction buildPlatformLogsUrl(apiUrl: string, runId: string): string {\n const url = new URL(apiUrl);\n const hostname = url.hostname;\n\n // Handle localhost\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `http://${hostname}:3001/logs/${runId}`;\n }\n\n // Transform: www.vm0.ai → app.vm0.ai\n // vm0.ai → app.vm0.ai\n const parts = hostname.split(\".\");\n if (parts[0] === \"www\" || parts[0] === \"app\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else {\n parts.unshift(\"app\");\n }\n\n const platformHost = parts.join(\".\");\n const port = url.port ? `:${url.port}` : \"\";\n return `https://${platformHost}${port}/logs/${runId}`;\n}\n\n/**\n * Log type for mutually exclusive options\n */\ntype LogType = \"agent\" | \"system\" | \"metrics\" | \"network\";\n\n/**\n * Format a single metric line\n */\nfunction formatMetric(metric: TelemetryMetric): string {\n const memPercent = ((metric.mem_used / metric.mem_total) * 100).toFixed(1);\n const diskPercent = ((metric.disk_used / metric.disk_total) * 100).toFixed(1);\n\n return `[${metric.ts}] CPU: ${metric.cpu.toFixed(1)}% | Mem: ${formatBytes(metric.mem_used)}/${formatBytes(metric.mem_total)} (${memPercent}%) | Disk: ${formatBytes(metric.disk_used)}/${formatBytes(metric.disk_total)} (${diskPercent}%)`;\n}\n\n/**\n * Format the firewall tag (name + billable marker) appended to a request line.\n */\nfunction formatFirewallTag(entry: NetworkLogEntry): string {\n if (!entry.firewall_name) return \"\";\n const billable = entry.firewall_billable ? ` ${chalk.yellow(\"$\")}` : \"\";\n return ` ${chalk.cyan(`[${entry.firewall_name}${billable}]`)}`;\n}\n\nfunction formatBrowserUserAgentTag(entry: NetworkLogEntry): string {\n return entry.browser_user_agent ? ` ${chalk.magenta(\"[browser]\")}` : \"\";\n}\n\nfunction formatConnectorDiagnosticInfo(entry: NetworkLogEntry): string {\n const tags: string[] = [];\n if (entry.connector_diagnostic_type) {\n tags.push(entry.connector_diagnostic_type);\n }\n if (entry.connector_diagnostic_reason) {\n tags.push(entry.connector_diagnostic_reason);\n }\n if (\n entry.connector_diagnostic_env_names &&\n entry.connector_diagnostic_env_names.length > 0\n ) {\n tags.push(`env: ${entry.connector_diagnostic_env_names.join(\", \")}`);\n }\n if (entry.connector_diagnostic_base) {\n tags.push(`base: ${entry.connector_diagnostic_base}`);\n }\n if (tags.length === 0) return \"\";\n return ` ${chalk.red(`[connector diagnostic: ${tags.join(\"; \")}]`)}`;\n}\n\nfunction nonEmptyLogField(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction formatNetworkTarget(entry: NetworkLogEntry): string {\n const url = nonEmptyLogField(entry.url);\n if (url) {\n return url;\n }\n\n const host = nonEmptyLogField(entry.host);\n if (!host) {\n return \"unknown\";\n }\n\n return entry.port !== undefined ? `${host}:${entry.port}` : host;\n}\n\n/**\n * Format a denied network request (filtered by permission rule)\n */\nfunction formatNetworkDeny(entry: NetworkLogEntry): string {\n const method = entry.method || \"???\";\n const url = formatNetworkTarget(entry);\n return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk.red.bold(\"DENY\")} ${chalk.dim(url)}${formatFirewallTag(entry)}${formatBrowserUserAgentTag(entry)}${formatConnectorDiagnosticInfo(entry)}`;\n}\n\n/**\n * Format a locally blocked network request (vm0/proxy/auth/precondition failure)\n */\nfunction formatNetworkBlock(entry: NetworkLogEntry): string {\n const method = entry.method || \"???\";\n const target = formatNetworkTarget(entry);\n const error = entry.firewall_error\n ? ` ${chalk.red(entry.firewall_error)}`\n : \"\";\n return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk.yellow.bold(\"BLOCK\")} ${chalk.dim(target)}${formatFirewallTag(entry)}${formatBrowserUserAgentTag(entry)}${error}${formatConnectorDiagnosticInfo(entry)}${formatAuthInfo(entry)}`;\n}\n\n/**\n * Format auth resolution info (resolved secrets, refresh/cache status, URL rewrite)\n */\nfunction formatAuthInfo(entry: NetworkLogEntry): string {\n const tags: string[] = [];\n if (entry.auth_url_rewrite) {\n tags.push(\"url-rewrite\");\n }\n if (entry.auth_resolved_secrets && entry.auth_resolved_secrets.length > 0) {\n const refreshedSet = new Set(entry.auth_refreshed_secrets ?? []);\n for (const name of entry.auth_resolved_secrets) {\n if (refreshedSet.has(name)) {\n tags.push(`${name} (refreshed)`);\n } else if (entry.auth_cache_hit) {\n tags.push(`${name} (cached)`);\n } else {\n tags.push(name);\n }\n }\n }\n if (tags.length === 0) return \"\";\n return ` ${chalk.yellow(`\\u2194 ${tags.join(\", \")}`)}`;\n}\n\n/**\n * Format an ALLOW or ERROR network request with full HTTP details\n */\nfunction formatNetworkRequest(entry: NetworkLogEntry): string {\n let statusColor: typeof chalk.green;\n const status = entry.status || 0;\n if (status >= 200 && status < 300) {\n statusColor = chalk.green;\n } else if (status >= 300 && status < 400) {\n statusColor = chalk.yellow;\n } else if (status >= 400) {\n statusColor = chalk.red;\n } else {\n statusColor = chalk.gray;\n }\n\n let latencyColor: typeof chalk.green;\n const latencyMs = entry.latency_ms || 0;\n if (latencyMs < 500) {\n latencyColor = chalk.green;\n } else if (latencyMs < 2000) {\n latencyColor = chalk.yellow;\n } else {\n latencyColor = chalk.red;\n }\n\n const method = entry.method || \"???\";\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const url = formatNetworkTarget(entry);\n const error = entry.firewall_error\n ? ` ${chalk.red(entry.firewall_error)}`\n : \"\";\n\n let line = `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + \"ms\")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(url)}${formatFirewallTag(entry)}${formatBrowserUserAgentTag(entry)}${error}${formatConnectorDiagnosticInfo(entry)}${formatAuthInfo(entry)}`;\n\n line += formatCaptureFields(entry);\n\n return line;\n}\n\n/**\n * Maximum characters of body content shown in CLI log output.\n */\nconst BODY_PREVIEW_LENGTH = 200;\n\n/**\n * Format captured body fields (request headers, request body, response body)\n * when present from --capture-network-bodies runs.\n */\nfunction formatCaptureFields(entry: NetworkLogEntry): string {\n let result = \"\";\n if (entry.request_headers) {\n const hdrs = Object.entries(entry.request_headers)\n .map(([k, v]) => {\n return `${k}: ${v}`;\n })\n .join(\", \");\n result += `\\n ${chalk.gray(\"request_headers:\")} ${hdrs}`;\n }\n if (entry.request_body) {\n const truncated = entry.request_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.request_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.request_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"request_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n if (entry.response_body) {\n const truncated = entry.response_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.response_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.response_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"response_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n return result;\n}\n\n/**\n * Format a TCP connection log entry\n */\nfunction formatNetworkTcp(entry: NetworkLogEntry): string {\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const latencyMs = entry.latency_ms || 0;\n const error = entry.error ? ` ${chalk.red(entry.error)}` : \"\";\n\n return `[${entry.timestamp}] ${chalk.blue(\"TCP\")} ${latencyMs}ms ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(`${host}:${port}`)}${error}`;\n}\n\n/**\n * Format a non-TCP/non-HTTP log entry (UDP, ICMP, DNS, etc).\n * These come from iptables LOG via /dev/kmsg or dnsmasq query log.\n */\nfunction formatNetworkOther(entry: NetworkLogEntry): string {\n const proto = (entry.type || \"???\").toUpperCase();\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const size = entry.request_size ? ` ${formatBytes(entry.request_size)}` : \"\";\n const dnsResult =\n entry.type === \"dns\" && entry.dns_result\n ? ` ${chalk.gray(\"->\")} ${chalk.dim(entry.dns_result)}`\n : \"\";\n\n return `[${entry.timestamp}] ${chalk.magenta(proto.padEnd(5))}${size} ${chalk.dim(`${host}:${port}`)}${dnsResult}`;\n}\n\n/**\n * Format a network log entry\n */\nfunction formatNetworkLog(entry: NetworkLogEntry): string {\n if (entry.action === \"BLOCK\") return formatNetworkBlock(entry);\n if (entry.type === \"tcp\") return formatNetworkTcp(entry);\n if (entry.type && entry.type !== \"http\") return formatNetworkOther(entry);\n if (entry.action === \"DENY\") return formatNetworkDeny(entry);\n return formatNetworkRequest(entry);\n}\n\n/**\n * Create an EventRenderer for log viewing (with timestamps)\n * Uses buffered mode to group tool_use/tool_result together for consistent\n * rendering with vm0 run output\n */\nfunction createLogRenderer(verbose: boolean): EventRenderer {\n return new EventRenderer({\n showTimestamp: true,\n verbose,\n });\n}\n\n/**\n * Render an agent event with timestamp for historical log viewing\n */\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n framework: string,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n framework,\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\n/**\n * Validate mutually exclusive options and return the log type\n */\nfunction getLogType(options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n}): LogType {\n const selected = [\n options.agent,\n options.system,\n options.metrics,\n options.network,\n ].filter(Boolean).length;\n\n if (selected > 1) {\n throw new Error(\n \"Options --agent, --system, --metrics, and --network are mutually exclusive\",\n );\n }\n\n if (options.system) return \"system\";\n if (options.metrics) return \"metrics\";\n if (options.network) return \"network\";\n return \"agent\"; // Default\n}\n\nexport const logsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to fetch logs for\")\n .addCommand(searchCommand)\n .option(\"-a, --agent\", \"Show agent events (default)\")\n .option(\"-s, --system\", \"Show system log\")\n .option(\"-m, --metrics\", \"Show metrics\")\n .option(\"-n, --network\", \"Show network logs (proxy traffic)\")\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z, 1705312200)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n logsCommand.help();\n return;\n }\n\n const logType = getLogType(options);\n\n // Validate --tail, --head, and --all are mutually exclusive\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n // Parse since option\n let since: number | undefined;\n if (options.since) {\n since = parseTime(options.since);\n }\n\n // Determine pagination mode and order based on flags\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n // targetCount: number for --head/--tail, \"all\" for --all, default 5 for no flag\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = parsePositiveLogCount(options.head!, \"--head\");\n } else if (isTail) {\n targetCount = parsePositiveLogCount(options.tail!, \"--tail\");\n } else {\n // Default: show last 5 entries\n targetCount = 5;\n }\n\n // Order: asc for --head, desc for --tail/--all/default\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n // Build platform URL for agent logs\n const apiUrl = await getApiUrl();\n const platformUrl = buildPlatformLogsUrl(apiUrl, runId);\n\n switch (logType) {\n case \"agent\":\n await showAgentEvents(\n runId,\n { since, targetCount, order },\n platformUrl,\n );\n break;\n case \"system\":\n await showSystemLog(runId, { since, targetCount, order });\n break;\n case \"metrics\":\n await showMetrics(runId, { since, targetCount, order });\n break;\n case \"network\":\n await showNetworkLogs(runId, { since, targetCount, order });\n break;\n }\n },\n ),\n );\n\n/**\n * Show agent events with pagination support\n */\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n platformUrl: string,\n): Promise<void> {\n let framework = \"claude-code\";\n const events = await collectLogItems<RunEvent>({\n fetchPage: async (request) => {\n const response = await getAgentEvents(runId, request);\n framework = response.framework;\n return {\n items: response.events,\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n // Create renderer for log viewing (with timestamps, always verbose)\n const renderer = createLogRenderer(true);\n const normalizer = new EventStreamNormalizer();\n\n for (const event of events) {\n renderAgentEvent(event, renderer, normalizer, framework);\n }\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n\n console.log(chalk.dim(`View on platform: ${platformUrl}`));\n}\n\n/**\n * Show system log with pagination support\n * Note: System log pagination is limited because the API returns aggregated strings\n * without individual timestamps. The --tail/--head/--all options work on batch count,\n * not line count.\n */\nasync function showSystemLog(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const pages: string[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | undefined;\n let remainingBatches =\n options.targetCount === \"all\" ? undefined : options.targetCount;\n\n while (true) {\n const limit =\n remainingBatches === undefined\n ? PAGE_LIMIT\n : Math.min(remainingBatches, PAGE_LIMIT);\n const response = await getSystemLog(runId, {\n sinceTime: options.since,\n cursor,\n limit,\n order: options.order,\n });\n\n const pageHasLog = response.systemLog.length > 0;\n if (pageHasLog) {\n pages.push(response.systemLog);\n }\n\n if (remainingBatches !== undefined && pageHasLog) {\n remainingBatches -= limit;\n if (remainingBatches <= 0) {\n break;\n }\n }\n\n const nextCursor = response.nextCursor ?? null;\n if (!response.hasMore || !nextCursor || seenCursors.has(nextCursor)) {\n break;\n }\n\n seenCursors.add(nextCursor);\n cursor = nextCursor;\n }\n\n if (pages.length === 0) {\n console.log(chalk.yellow(\"No system log found for this run\"));\n return;\n }\n\n console.log(pages.join(\"\"));\n}\n\n/**\n * Show metrics with pagination support\n */\nasync function showMetrics(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const metrics = await collectLogItems<TelemetryMetric>({\n fetchPage: async (request) => {\n const response = await getMetrics(runId, request);\n return {\n items: response.metrics,\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (metrics.length === 0) {\n console.log(chalk.yellow(\"No metrics found for this run\"));\n return;\n }\n\n for (const metric of metrics) {\n console.log(formatMetric(metric));\n }\n}\n\n/**\n * Show network logs with pagination support\n */\nasync function showNetworkLogs(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const networkLogs = await collectLogItems<NetworkLogEntry>({\n fetchPage: async (request) => {\n const response = await getNetworkLogs(runId, request);\n return {\n items: response.networkLogs,\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (networkLogs.length === 0) {\n console.log(\n chalk.yellow(\n \"No network logs found for this run. Network logs are only captured when using a runner with proxy enabled\",\n ),\n );\n return;\n }\n\n for (const entry of networkLogs) {\n console.log(formatNetworkLog(entry));\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../lib/api\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface SearchOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\n/**\n * Render a single agent event using EventRenderer.\n *\n * Search responses do not yet carry a per-result framework, so we let the\n * factory default to claude-code. Codex events in search results render as\n * nothing until the search contract is extended (tracked separately).\n */\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\n/**\n * Format a run header line\n */\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const shortId = runId.slice(0, 8);\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${shortId} (${agentName}, ${time}) ──────────`;\n}\n\n/**\n * Parse and validate context options (-A, -B, -C)\n */\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\n/**\n * Parse --limit option with validation\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\n/**\n * Render search results grouped by run\n */\nfunction renderResults(response: LogsSearchResponse): void {\n // Group results by run\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n // Render each group\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log(); // Separator between runs\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <id>\", \"Filter by agent ID\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .action(\n withErrorHandler(async (keyword: string, options: SearchOptions) => {\n const { before, after } = parseContextOptions(options);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchLogs({\n keyword,\n agentId: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { validateAgentName } from \"../../lib/domain/yaml-validator\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst VM0_YAML_FILE = \"vm0.yaml\";\nconst AGENTS_MD_FILE = \"AGENTS.md\";\n\nfunction generateVm0Yaml(agentName: string): string {\n return `version: \"1.0\"\n\nagents:\n ${agentName}:\n framework: claude-code\n # Build agentic workflow using natural language\n instructions: AGENTS.md\n`;\n}\n\nfunction generateAgentsMd(): string {\n return `# Agent Instructions\n\nYou are a HackerNews AI content curator.\n\n## Workflow\n\n1. Go to HackerNews and read the top 10 articles\n2. Find and extract AI-related content from these articles\n3. Summarize the findings into a X (Twitter) post format\n4. Write the summary to content.md\n`;\n}\n\nfunction checkExistingFiles(): string[] {\n const existingFiles: string[] = [];\n if (existsSync(VM0_YAML_FILE)) existingFiles.push(VM0_YAML_FILE);\n if (existsSync(AGENTS_MD_FILE)) existingFiles.push(AGENTS_MD_FILE);\n return existingFiles;\n}\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a new VM0 project in the current directory\")\n .option(\"-f, --force\", \"Overwrite existing files\")\n .option(\"-n, --name <name>\", \"Agent name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { force?: boolean; name?: string }) => {\n // Check existing files\n const existingFiles = checkExistingFiles();\n if (existingFiles.length > 0 && !options.force) {\n throw new Error(`${existingFiles.join(\", \")} already exists`, {\n cause: new Error(\"To overwrite: vm0 init --force\"),\n });\n }\n\n // Get agent name from option or prompt\n let agentName: string;\n if (options.name) {\n agentName = options.name.trim();\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 init --name <agent-name>\"),\n });\n } else {\n // Use directory name as default suggestion\n const dirName = path.basename(process.cwd());\n const defaultName = validateAgentName(dirName) ? dirName : undefined;\n\n const name = await promptText(\n \"Enter agent name\",\n defaultName,\n (value: string) => {\n if (!validateAgentName(value)) {\n return \"Must be 3-64 characters, alphanumeric and hyphens, start/end with letter or number\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n agentName = name;\n }\n\n // Validate agent name\n if (!agentName || !validateAgentName(agentName)) {\n throw new Error(\"Invalid agent name\", {\n cause: new Error(\n \"Must be 3-64 characters, alphanumeric and hyphens only, start and end with letter or number\",\n ),\n });\n }\n\n // Write vm0.yaml\n await writeFile(VM0_YAML_FILE, generateVm0Yaml(agentName));\n const vm0Status = existingFiles.includes(VM0_YAML_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${VM0_YAML_FILE}${vm0Status}`));\n\n // Write AGENTS.md\n await writeFile(AGENTS_MD_FILE, generateAgentsMd());\n const agentsStatus = existingFiles.includes(AGENTS_MD_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${AGENTS_MD_FILE}${agentsStatus}`));\n\n // Print next steps\n console.log();\n console.log(\"Next steps:\");\n console.log(` 1. Log in to VM0: ${chalk.cyan(\"vm0 auth login\")}`);\n console.log(\n ` 2. Edit ${chalk.cyan(\"AGENTS.md\")} to customize your agent's workflow`,\n );\n console.log(\n ` 3. Run your agent: ${chalk.cyan('vm0 run --secrets CLAUDE_CODE_OAUTH_TOKEN=<token> \"let\\'s start working\"')}`,\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n detectPackageManager,\n getLatestVersion,\n getManualUpgradeCommand,\n isAutoUpgradeSupported,\n performUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nexport const upgradeCommand = new Command()\n .name(\"upgrade\")\n .description(\"Upgrade vm0 CLI to the latest version\")\n .action(\n withErrorHandler(async () => {\n console.log(\"Checking for updates...\");\n\n const latestVersion = await getLatestVersion();\n\n if (latestVersion === null) {\n throw new Error(\"Could not check for updates. Please try again later.\");\n }\n\n if (latestVersion === __CLI_VERSION__) {\n console.log(chalk.green(`✓ Already up to date (${__CLI_VERSION__})`));\n return;\n }\n\n console.log(\n chalk.yellow(\n `Current version: ${__CLI_VERSION__} -> Latest version: ${latestVersion}`,\n ),\n );\n console.log();\n\n const packageManager = detectPackageManager();\n\n if (!isAutoUpgradeSupported(packageManager)) {\n if (packageManager === \"unknown\") {\n console.log(\n chalk.yellow(\n \"Could not detect your package manager for auto-upgrade.\",\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Auto-upgrade is not supported for ${packageManager}.`,\n ),\n );\n }\n console.log(chalk.yellow(\"Please upgrade manually:\"));\n console.log(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n return;\n }\n\n console.log(`Upgrading via ${packageManager}...`);\n const success = await performUpgrade(packageManager);\n\n if (success) {\n console.log(\n chalk.green(`✓ Upgraded from ${__CLI_VERSION__} to ${latestVersion}`),\n );\n return;\n }\n\n throw new Error(\"Upgrade failed\", {\n cause: new Error(\n `Please run manually: ${getManualUpgradeCommand(packageManager)}`,\n ),\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getApiUrl, getActiveOrg, getToken } from \"../lib/api/config\";\nimport { withErrorHandler } from \"../lib/command\";\n\n/**\n * Detect if running inside a VM0 sandbox (agent runtime).\n * Presence of VM0_RUN_ID indicates sandbox execution.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.VM0_RUN_ID;\n}\n\n/**\n * Display agent identity and run information when inside a sandbox.\n */\nasync function showSandboxInfo(): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const cliAgentType = process.env.CLI_AGENT_TYPE;\n\n const runId = process.env.VM0_RUN_ID;\n const activeOrg = await getActiveOrg();\n const apiUrl = process.env.VM0_API_URL;\n\n // Agent section\n const hasAgentInfo = agentId || cliAgentType;\n if (hasAgentInfo) {\n console.log(chalk.bold(\"Agent:\"));\n if (agentId) console.log(` ID: ${agentId}`);\n if (cliAgentType) console.log(` Framework: ${cliAgentType}`);\n console.log();\n }\n\n // Run section\n console.log(chalk.bold(\"Run:\"));\n if (runId) console.log(` ID: ${runId}`);\n if (activeOrg) console.log(` Org: ${activeOrg}`);\n if (apiUrl) console.log(` API: ${apiUrl}`);\n}\n\n/**\n * Display authentication and org information when running outside a sandbox.\n */\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const whoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show current identity and environment information\")\n .action(\n withErrorHandler(async () => {\n if (isInsideSandbox()) {\n await showSandboxInfo();\n } else {\n await showLocalInfo();\n }\n }),\n );\n"],"mappings":"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","names":["readFile","existsSync","path","fs","path","os","os","text","commitResult","existsSync","readFile","parseYaml","path","import_yaml","readFile","writeFile","mkdir","existsSync","path","parseYaml","type","stringifyYaml","path","path","fs","os","path","statusCommand","listCommand","path","fs","os","type","path","statusCommand","listCommand","path","initCommand","path","pushCommand","path","fs","os","pullCommand","path","statusCommand","listCommand","cloneCommand","initCommand","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","parseLimit","path","existsSync","writeFile","existsSync","initCommand","path","writeFile","initCommand"]}
|