{"_id":"@bnbagent/deploy-provider-nodeops","_rev":"7-b24e27d4a3ff3240dfbbee8f7f873fbf","name":"@bnbagent/deploy-provider-nodeops","dist-tags":{"latest":"0.6.6"},"versions":{"0.6.0":{"name":"@bnbagent/deploy-provider-nodeops","version":"0.6.0","license":"Apache-2.0","_id":"@bnbagent/deploy-provider-nodeops@0.6.0","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"dist":{"shasum":"fc386838c6198f2fa7b2fbeb041bdeaef8444f97","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.0.tgz","fileCount":14,"integrity":"sha512-FbvyVerwvgUCtgOTdg21rTKJdaNfLCh1R+nsdD30ImF5qBVZuTLMlJsK31nfoq/f09CzOUna5rvsce1ivtbt/w==","signatures":[{"sig":"MEYCIQCiJ6ddbFAXW4DpeeowESpqoW9MJukOSmTxuViXZYJD0AIhAK5T7xXXKVvHtc1RGx2i/un2xjBN7HUDZUEnLq9dticO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201406},"type":"module","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"gitHead":"6c4b0bef7775a9a3a110b1ebb9bff0018a043746","scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.0","@types/proper-lockfile":"4.1.4"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/deploy-provider-nodeops_0.6.0_1789022336296_0.4527359783329741","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@bnbagent/deploy-provider-nodeops","version":"0.6.1","license":"Apache-2.0","_id":"@bnbagent/deploy-provider-nodeops@0.6.1","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"dist":{"shasum":"d2b04aa4360e069d81087480b8cff04d1274c9d9","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.1.tgz","fileCount":15,"integrity":"sha512-OKCiMuVxmr4kBFJAp1skh+Bedem2800wLFoxFma/bhFrPpJe0nlTRYtc88FymhsVAfvBnSzmhBao86dwjjb9fw==","signatures":[{"sig":"MEUCIQDw4u6/9N2FkT4Viib8EZWWdKho6zCOuKem6QTTAG4STAIgahiix4ZuUDC62U2X+6tqJ9P4Crb3D5LoohDpel/NAKM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEFXIGsJEMGCFC/YxmxtnKtd7Vl/vgkyxxR+nJ/DKC3nAiBa1hvygQQLUk1ihPP4P4eOFKwrh2WwyahA2jrW/0L8Eg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214835},"type":"module","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"gitHead":"11c0110c3cac0d64d0b9b8a2d5e28e367b94b065","scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.1","@types/proper-lockfile":"4.1.4"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.1"},"_npmOperationalInternal":{"tmp":"tmp/deploy-provider-nodeops_0.6.1_1789032470694_0.7101353140702351","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@bnbagent/deploy-provider-nodeops","version":"0.6.2","license":"Apache-2.0","_id":"@bnbagent/deploy-provider-nodeops@0.6.2","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"dist":{"shasum":"da2c5007c5b6ce97e02a9f9129220bfc981b9b6e","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.2.tgz","fileCount":15,"integrity":"sha512-TEkCY3MRqkUjddCbP83LwEX+Kfi0+gzDIErTaDOkZxNlLdTopJntZCh9FF6AFkdtLm8dwoloTr79K4Shq5BeLA==","signatures":[{"sig":"MEQCIBR+2B0ip5MeRmzRB0vCGaCU5zlefJaOqTVyrBhrQn4QAiA7R64F1bsL/ETP8p2nZdqjLMl0Sj6PFWKLoROZBVVNAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDcJKnA7VfZ6XlqpByy4aU7VHRFz97wEp1pf8+y4Ktu6gIgKi5016Y609vh7m7ZJa9+xUbKPjpZNDBmQZg7BGM9Tyk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221103},"type":"module","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"gitHead":"c409bbc99430acc966d266d946b43c21507dc6c7","scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.2","@types/proper-lockfile":"4.1.4"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.2"},"_npmOperationalInternal":{"tmp":"tmp/deploy-provider-nodeops_0.6.2_1789097201992_0.4832342329679553","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@bnbagent/deploy-provider-nodeops","version":"0.6.3","license":"Apache-2.0","_id":"@bnbagent/deploy-provider-nodeops@0.6.3","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"dist":{"shasum":"4e6af551deb7a91518442c3d919fe1335f56e786","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.3.tgz","fileCount":15,"integrity":"sha512-M2EbuFPSYHKMzx6gn8Qw+kSRqxSAxQAv1EblAljJb7t46/s++ho/TlRUVJyFMRXyTMMyulwFHiSNmJoV2kCFBg==","signatures":[{"sig":"MEQCIFmVGT3uNsV14OALPVY60Akdb5qxuyD9uhNH72kbr8PXAiAxrzhtu7zZYziDe8F3ip1EZscQUO+swIpkjXlujID+1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCul7v8c08xNwp4hxFTLErRc9T8Sr0AxsKze0dTRKMwZQIgPglqjMmfVam2ffcFHRBeEJjlOpUiLRXIDre3l4ShLVQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229182},"type":"module","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"gitHead":"09e40a0a0c133f4921a75fcd090faebd9a8ebb4d","scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.3","@types/proper-lockfile":"4.1.4"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.3"},"_npmOperationalInternal":{"tmp":"tmp/deploy-provider-nodeops_0.6.3_1789357968236_0.6633535586142398","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"@bnbagent/deploy-provider-nodeops","version":"0.6.4","license":"Apache-2.0","_id":"@bnbagent/deploy-provider-nodeops@0.6.4","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"dist":{"shasum":"2c58702750b0b13cd53cb01e14a5d06ef867f176","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.4.tgz","fileCount":29,"integrity":"sha512-6kFMGVXeBIPSNChJ9FregzOWisK4EU+VDLgGMEh0LqLvqLRgFpLLI+VJbaV8K2mVslCpdnctTCMER3mGTA2Pgg==","signatures":[{"sig":"MEYCIQD45hmkzMfBW0EdK0KRVEPwTdKep7khSBbr8QAy8uIPoQIhAIFeI2/bO3ozr/LJhSGm5fjGCMXKzd18f51bP0JzYUL2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC6O/gKwVpkGRQINxVMiidlfSgi2O0OkWUZThQb3WoJPwIhAPdk2e5/N8FaECCX3GF3wXWNOg4OzWfH+VVpGaVD3HrU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266815},"type":"module","_from":"file:/home/runner/work/bnbagent-deploy/bnbagent-deploy/.release/bnbagent-deploy-provider-nodeops-0.6.4.tgz","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_resolved":"/home/runner/work/bnbagent-deploy/bnbagent-deploy/.release/bnbagent-deploy-provider-nodeops-0.6.4.tgz","_integrity":"sha512-6kFMGVXeBIPSNChJ9FregzOWisK4EU+VDLgGMEh0LqLvqLRgFpLLI+VJbaV8K2mVslCpdnctTCMER3mGTA2Pgg==","_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","write-file-atomic":"6.0.0","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.4","@types/proper-lockfile":"4.1.4","@types/write-file-atomic":"4.0.3"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.4"},"_npmOperationalInternal":{"tmp":"tmp/deploy-provider-nodeops_0.6.4_1789367844806_0.08114137870359572","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"@bnbagent/deploy-provider-nodeops","version":"0.6.5","license":"Apache-2.0","_id":"@bnbagent/deploy-provider-nodeops@0.6.5","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"dist":{"shasum":"2271091d3c9c357534f5cd145b862327dd3773d3","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.5.tgz","fileCount":29,"integrity":"sha512-V80akEZ/B0mlfNIlWi5vr+j9E6inDRIQkRvZ2eHGVjBNMvvaBlAZApyN87uPrr/GdIe3X7ayUcfjKvlPDafMSg==","signatures":[{"sig":"MEUCIEg5A0ZeHDXmtd7fAX3hzMYDSnjTRnZIihGh/kQuTZTmAiEAk7jmHpd541LNhyhHKmWR/mhZ9K8//lWiRDFDc+oVa2g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCgf/Lqy4i4n7KYPmZ9fMZyzWEwtf+lZOldZZUEv/mRvgIgap/bZdI01/XCh5j7q5gL2e3wdA+DHrTEIl1JpFTl1fU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272492},"type":"module","_from":"file:/home/runner/work/bnbagent-deploy/bnbagent-deploy/.release/bnbagent-deploy-provider-nodeops-0.6.5.tgz","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_resolved":"/home/runner/work/bnbagent-deploy/bnbagent-deploy/.release/bnbagent-deploy-provider-nodeops-0.6.5.tgz","_integrity":"sha512-V80akEZ/B0mlfNIlWi5vr+j9E6inDRIQkRvZ2eHGVjBNMvvaBlAZApyN87uPrr/GdIe3X7ayUcfjKvlPDafMSg==","_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","write-file-atomic":"6.0.0","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.5","@types/proper-lockfile":"4.1.4","@types/write-file-atomic":"4.0.3"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.5"},"_npmOperationalInternal":{"tmp":"tmp/deploy-provider-nodeops_0.6.5_1789372687522_0.18534457930107195","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"_id":"@bnbagent/deploy-provider-nodeops@0.6.6","dist":{"shasum":"ed53efbc04ec2c5de73aff4cd60aa4bf013a134f","tarball":"https://registry.npmjs.org/@bnbagent/deploy-provider-nodeops/-/deploy-provider-nodeops-0.6.6.tgz","fileCount":29,"integrity":"sha512-jO7zTecJqHDlVIXF79BIhSt5pIBu6cB537fjS97BtIMVcXaLPYHIVLgqlCbz1I5rIUHehb7v5Xyko/Q7qlos9g==","signatures":[{"sig":"MEUCIQCKhhYITpVJoPPloNnX7OwBuTPe+3Or7ggFPJWoVbsssQIgIYz17ZW3gqtMg5k0ENwbxqPGRvqNniftGOmJLhFAxFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCPdIu43sSS00op7Jjju5WyoLzOqhQ4eJs0EyA27lSCAQIhAK1uuXKlbZdNAmgfHcC1SVqXkvrUTQSh2nDRKu9r8J7R"}],"unpackedSize":272492},"name":"@bnbagent/deploy-provider-nodeops","type":"module","_from":"file:/home/runner/work/bnbagent-deploy/bnbagent-deploy/.release/bnbagent-deploy-provider-nodeops-0.6.6.tgz","exports":{".":"./src/index.ts","./sdk":{"types":"./dist/sdk.d.ts","import":"./dist/sdk.js","default":"./dist/sdk.js"}},"license":"Apache-2.0","scripts":{"build":"tsup","prepack":"bun run build","typecheck":"tsc --noEmit"},"version":"0.6.6","_npmUser":{"name":"robotbnb","email":"yolin@bnbchain.org"},"_resolved":"/home/runner/work/bnbagent-deploy/bnbagent-deploy/.release/bnbagent-deploy-provider-nodeops-0.6.6.tgz","_integrity":"sha512-jO7zTecJqHDlVIXF79BIhSt5pIBu6cB537fjS97BtIMVcXaLPYHIVLgqlCbz1I5rIUHehb7v5Xyko/Q7qlos9g==","_npmVersion":"10.9.8","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","directories":{},"maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"_nodeVersion":"22.23.2","dependencies":{"mppx":"0.9.1","viem":"2.56.3","fflate":"^0.8.2","@bnb-chain/b402":"0.2.1","proper-lockfile":"4.1.2","write-file-atomic":"6.0.0","@bnb-chain/mpp-b402":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.0","@types/bun":"^1.3.0","typescript":"^5.7.0","@bnbagent/deploy-core":"0.6.6","@types/proper-lockfile":"4.1.4","@types/write-file-atomic":"4.0.3"},"peerDependencies":{"@bnbagent/deploy-core":"0.6.6"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/deploy-provider-nodeops_0.6.6_1789374055461_0.5383004249876155"}}},"time":{"created":"2026-09-10T06:38:56.047Z","modified":"2026-09-14T08:20:55.736Z","0.6.0":"2026-09-10T06:38:56.564Z","0.6.1":"2026-09-10T09:27:50.793Z","0.6.2":"2026-09-11T03:26:42.095Z","0.6.3":"2026-09-14T03:52:48.324Z","0.6.4":"2026-09-14T06:37:24.903Z","0.6.5":"2026-09-14T07:58:07.602Z","0.6.6":"2026-09-14T08:20:55.545Z"},"license":"Apache-2.0","description":"NodeOps CreateOS account and wallet deployments, with a Node.js SDK and bounded MPP/x402 payments.","maintainers":[{"name":"robotbnb","email":"yolin@bnbchain.org"},{"name":"jardenx","email":"devin@bnbchain.org"},{"name":"aiden-cao","email":"aiden.c@nodereal.io"}],"readme":"# NodeOps CreateOS provider\n\nDeploy an HTTP agent with `target = \"nodeops/createos\"` using either an account\nAPI Key (`mode = \"account\"`, the backward-compatible default) or a wallet Gateway\n(`mode = \"wallet\"`). Account mode uses existing account credits; wallet mode can\nauthorize bounded MPP/x402 payments. The following sections describe account mode;\nsee **Wallet Gateway mode** below for its separate contract and examples. Neither\nmode implements BNB trial semantics or automatic renewal.\n\n## Prerequisites and authentication\n\n1. Create a CreateOS account and an API key with project/deployment permissions.\n2. Check that account's current credits and billing in CreateOS. Promotional\n   credits, when granted to your account, are used by CreateOS normally. This\n   provider has no verified balance API and does **not** promise free hosting.\n3. Inject `CREATEOS_API_KEY` into the deployment process through your shell/CI\n   secret manager. Keep this control-plane key outside `agent-deploy.toml`,\n   `[env]`, the agent's secret file, image and ZIP.\n4. Run `bnbagent-deploy login --provider nodeops` to verify and save the key locally,\n   or leave it in the environment for CI. `whoami` reports the account ID;\n   `logout` removes the saved session but cannot unset your shell variable.\n\nThe API origin is fixed to `https://api-createos.nodeops.network`. Environment\ncredentials take precedence over the local file\n`~/.bnbagent-deploy/nodeops/session.json` (mode `0600`, origin-bound).\nSDK services should set `flags: { platformService: true }` to ignore local sessions.\nFor multiple accounts, instantiate the provider with a separate `env` credential\nobject per tenant; do not mutate shared process environment during a request.\n\n## Artifact paths\n\n| Type | User supplies | Local Docker | CreateOS operation |\n|---|---|---|---|\n| `zip` | Prebuilt Node 22 JavaScript directory or `.zip` | No | Upload project; multipart ZIP, remote image build using a fixed Dockerfile |\n| `container` | Dockerfile, source, `.dockerignore`, public registry repository | Yes | Local `linux/amd64` build → registry push → image project deployment |\n| `image` | Public image reference with explicit tag or digest | No | Image project deployment directly from the reference |\n\nZIP deployment does not compile application source or install dependencies.\nBuild TypeScript yourself (`bun build --target=node`); bundle dependencies into\nthe output. Native libraries and custom runtimes should use container/image.\nThe provider repackages the artifact under `artifact/` and adds a fixed Node 22\nDockerfile (`USER node`, `/app`, configured port/entrypoint). This includes\nprebuilt `.zip` inputs: their original bytes are not uploaded unchanged.\nAny Dockerfile within the supplied artifact is an ordinary file and is never\nselected as the build recipe. No Build AI or automatic security scan is enabled.\n\nZIP limits are conservatively 50 MiB compressed, 100 MiB expanded and 10,000\nfiles. Directory packaging excludes `.env*`, the configured secret filename,\nVCS/cache folders and `node_modules`. Prebuilt ZIPs containing those paths are\nrejected; traversal, symlinks, duplicates, encrypted archives and ZIP64 are rejected.\nContainer projects must have `.dockerignore` entries for `.env*`, `.git` and any\ncustom secret filename, without negation rules. Review your Dockerfile/context:\nDocker build instructions remain user code.\n\nContainer push uses the user's existing `docker login` session. The registry\nrepository must already exist and permit **public pulls** from CreateOS. No\nregistry credentials are sent to CreateOS. Private image authentication is not\nimplemented. The generated tag is unique per build; the pushed image reference\nis returned as `record.imageUri`. Destroy does not delete images from your registry.\n\n## Configuration\n\n```toml\nname = \"my-nodeops-agent\" # verbatim CreateOS uniqueName: 4–32 letters/digits/hyphens\n\n[deploy]\ntarget = \"nodeops/createos\"\ntype = \"zip\"\ndist = \"dist\"\nentrypoint = \"index.js\"\nruntimeVersion = \"NODE_22\"\nprotocol = \"HTTP\"\n\n[nodeops]\nport = 8080                 # 1024–65535; app must listen on 0.0.0.0\ntimeoutSeconds = 1800       # default per deployment/promotion/delete wait, 10–3600\ninvokePath = \"/invocations\"\n# accountId = \"<whoami account ID>\" # pin applied to ALL lifecycle commands\n# environment = \"production\"     # existing environment name or UUID\n# imageRepository = \"ghcr.io/owner/agent\" # required for container; no tag\n\n[env]\nAPP_ENV = \"production\"\n\n# Optional: inject values via CreateOS runtime runEnvs, never Docker build args.\n# [secrets]\n# envFile = \".env.runtime\"\n```\n\n`[secrets].envFile` and SDK `secrets` are merged over `[env]`, then transmitted to\nCreateOS `runEnvs`. These are account-managed runtime environment variables,\n**not a separate secret-manager vault**; project administrators may read them.\nThe provider does not print these values. Applications must also avoid logging\nthem. `PORT` is supplied automatically and must agree with `nodeops.port` if set.\nKeep the configuration's env map complete: updates send the full desired map\nto project settings and the selected existing environment; they are not a\nper-key secret-store synchronization mechanism.\n\nUnsupported options are rejected even with `--skip-validation`/`--force`:\nA2A/MCP, inbound OAuth provisioning, payment gateway publication, deliverable\nstores, secret references, region selection, custom log retention and unknown\n`[nodeops]` keys. `init`, token/trial commands and automatic top-ups are unavailable.\n\n## Lifecycle and ownership\n\n```sh\nbnbagent-deploy capabilities --provider nodeops --json\nbnbagent-deploy validate --json\nbnbagent-deploy deploy --dry-run --json\nbnbagent-deploy deploy --json\nbnbagent-deploy status --json\nbnbagent-deploy invoke --payload '{\"prompt\":\"hello\"}'\nbnbagent-deploy logs\nbnbagent-deploy logs --follow\nbnbagent-deploy list --provider nodeops --json\nbnbagent-deploy destroy --yes\n```\n\nUntil this package is published, run the repository CLI instead of the installed\ncommand: `bun /absolute/path/to/bnbagent-deploy/packages/deploy-cli/src/cli.ts …`.\n\nDeployment is create-or-update by exact project name, with a description marker.\nThe provider refuses to mutate a foreign same-name project unless the caller\nexplicitly passes `--take-ownership`. Upload/image project type changes require\na new name. A ZIP project's existing port must also remain unchanged (use a new\nname to change it). Concurrent deploys to one project should be serialized by the\ncaller; the API does not expose a verified transactional compare-and-swap contract.\n\nWith one existing environment, deployment targets it; with multiple environments,\nset `nodeops.environment`. An explicit selection must exist before deployment.\nThe provider waits for the deployment, assigns it to the environment if needed,\nthen waits for active promotion. Environment URLs are preferred. If CreateOS\nreturns no environment, the result explicitly warns that its deployment URL may\nchange on redeploy. Successful deployment means CreateOS reports it running,\nnot an application-specific health-check pass: configure `healthPath` or use\n`invoke` to verify your agent.\n\n`id` is the project name; `record.projectId` is its stable CreateOS UUID and\n`record.deploymentId` identifies this release. Persist the complete `record`.\nSDK lifecycle calls accept either the name or project UUID. `list` reports project\ninventory (`active` projects have normalized `unknown` health); `status` reads\nthe active deployment. Logs refer to the latest deployment (build logs while\nbuilding or after a build failure; runtime logs otherwise), and `--follow` stays\non that deployment; `--since` is unsupported. Invocation posts to `invokePath`,\noptionally with `--bearer`; it never forwards the CreateOS API key.\n\n**Destroy deletes the entire managed project, including all its environments.**\nKeep one agent per managed project. It waits for deletion; a second delete after\nremoval succeeds. Failures/timeouts retain the project for inspection. A network\ninterruption during a write reports an unknown outcome and never automatically\nreplays it; inspect CreateOS/status/list before retrying. Updating environment\nvariables and promoting a new version are separate API operations, not an atomic\nrollback transaction. No paid cleanup, credit purchase or registry deletion runs.\n\n## SDK usage (Bun host)\n\n```ts\nimport { createDeployer } from \"@bnbagent/deploy-core\";\nimport { createNodeOpsProvider } from \"@bnbagent/deploy-provider-nodeops\";\n\nconst provider = createNodeOpsProvider({ env: { CREATEOS_API_KEY: accountApiKey } });\nconst deployer = createDeployer({\n  provider, runtime: \"createos\", baseDir: projectDirectory,\n  flags: { platformService: true },\n  overrides: { nodeops: { accountId, port: 8080 } },\n});\nconst result = await deployer.deploy({\n  name: \"my-nodeops-agent\", type: \"zip\", dist: \"dist\", entrypoint: \"index.js\",\n}, { secrets: { MODEL_API_KEY: modelApiKey } });\n// Persist result.record in the caller's deployment store.\nconst status = await deployer.status(result.record!.projectId!);\n```\n\n## Contract verification\n\nREST routes, authentication and envelopes were checked against the official\n[CreateOS CLI](https://github.com/NodeOps-app/createos-cli/tree/main/internal/api)\nand [MCP server](https://github.com/NodeOps-app/createos-mcp/tree/main/handlers).\nThe public [supported runtime catalog](https://api-createos.nodeops.network/v1/projects/supported)\nwas fetched on 2026-09-09 and includes the `dockerfile` runtime. Automated tests\nuse a stateful API fake and cover wire payloads, lifecycle, ownership, secrets,\nerrors and packaging. They do not establish a successful real cloud deployment.\nRun the [NodeOps live verification checklist](../../examples/REAL_DEPLOY_E2E.md#nodeops-createos)\nwith an authorized test account before claiming end-to-end production validation.\n\n## Wallet Gateway mode\n\n`[nodeops].mode = \"wallet\"` selects a separate, wallet-authenticated adapter at\n`https://mpp-createos.nodeops.network`. Omitted mode stays `account` for backward\ncompatibility. There is no automatic credential fallback or Dashboard/account\nlinking. See [ZIP wallet example](../../examples/zip-ts-nodeops-wallet) and\n[remote Dockerfile example](../../examples/source-ts-nodeops-wallet).\n\nWallet mode supports new ZIP/source deployments, status/list/invoke/delete,\nMPP or x402 charges using advertised known USDC assets, identity pins, bounded\npayment budgets, and a durable payment-intent journal. BSC uses Permit2 Exact;\nBase/Arbitrum use EIP-3009. The current production discovery may restrict which\nprotocol is offered on each chain. No implicit fallback to the old\n`X-Payment-Tx` direct-transfer flow is implemented.\n\n`--pay` authorizes one payment under `[nodeops.payment]` caps. For unattended\nnew deployments, `autoPay=true` additionally requires a `payTo` pin. BSC approval\nis automatic only with an explicit `maxApprovalGasWei` budget and a signer able\nto sign transactions, or an injected bounded approval callback. Otherwise the\nprovider stops before payment and asks the operator to prepare allowance.\n`validate` does not request a deploy/quote. A real `deploy` can consume existing\ncredits even without `--pay`; sharing with active projects additionally requires\n`useExistingCredits=true`.\n\nWallet runtime values merge spec.env with ctx.secrets (secrets take precedence),\nthen travel as settings.runEnvs separately from the source archive. Control-plane\nkeys, invalid variable names/values and mismatched PORT are rejected. Values do\nnot appear in resource records or payment journals; changing values changes the\nrequest hash. Secret-store references, image references, same-name updates, logs,\nnamed environments and hosting renewal are not exposed by this adapter.\nThe `months` parameter buys credits; it is not a subscription or renewal task.\nCloud credit balance remains unknown; the public balance API reports tokens.\n\n## Node.js SDK\n\nAfter building this package, `@bnbagent/deploy-provider-nodeops/sdk` exports\n`createNodeOpsClient(options)`. Its account/ZIP and Gateway paths run on Node 22+\nwithout Bun. Supply a viem-compatible `LocalAccount` through `options.signer`;\nkeys remain inside the caller's wallet. `options.paymentIO`, `fetch`, `docker`,\nclock and journal-directory seams permit hermetic tests. SDK callers pass the\nnormalized deployment spec and Context, with `overrides.nodeops.mode`, logger,\nbaseDir, flags and in-memory secrets. `deploy` validates before mutation.\n\nThe source CloudProvider entry remains compatible with Bun deploy-core/CLI.\nThe package publishes `dist/sdk.js` and declarations alongside its existing\nsource entry. Run package build before release/pack.\n\n## Application health and invocation\n\nBoth modes accept `[nodeops].healthPath = \"/ping\"` for an optional, credential-free\nHTTP GET after the cloud reports a deployment ready. Omit it to skip the probe;\napplications do not need to serve GET `/`. The path must be relative, without a\nquery string, fragment or traversal. Redirects are rejected. Probes never receive\naccount API keys, wallet authentication headers or invocation bearer tokens.\n\nA successful probe adds `health: { status: \"passed\", path: \"/ping\" }` to the\ndeployment result. An unreachable or non-2xx probe adds `health.status = \"failed\"`\nand a warning, while retaining the successful cloud status and complete resource\nrecord. CLI JSON and SDK callers should persist `record` first and use `health`\nto decide whether to expose the service. Do not deploy/pay again to retry a probe;\ninspect the existing service. This probe does not verify A2A/MCP or seller payments.\n\n`invoke` accepts `--bearer` in both modes (SDK: `ctx.flags.bearer`); it forwards\nonly that application token to `invokePath`. Network failures and non-2xx errors\nare sanitized and never automatically retried. `destroy --purge` and\n`destroy --purge-images` are rejected before cloud access in both modes.\n\nThe Node.js SDK exports `NodeOpsClient`, `NodeOpsClientOptions`, and\n`NodeOpsValidationError`. Failed SDK preflight exposes `error.validation.issues`\nwith their original issue codes; callers can distinguish unsupported capability\nfrom missing credentials without parsing error messages. `capabilities()` defaults\nto account mode; pass Context to inspect wallet mode. Release checks install the\nactual npm archives and validate runtime behavior and public TypeScript exports.\n\n\n## Gateway discovery and recovery updates\n\nThe Node.js SDK additionally exports `createGatewayWalletClient(fetch?)`:\n\n```ts\nimport { createGatewayWalletClient } from \"@bnbagent/deploy-provider-nodeops/sdk\";\nconst gateway = createGatewayWalletClient();\nconst chains = await gateway.chains();\nconst balance = await gateway.balance(walletAddress, \"bsc\");\n// balance.balance is derived from validated atomic units, not server display text.\n```\n\nThese are public GET requests and never attach credentials or sign a deployment.\nBalances are on-chain USDC, not CreateOS hosting credits. Failed or mismatched\nresponses throw rather than reporting zero. The production `/agent/chains`\ninventory checked on 2026-09-10 lists Base, Arbitrum and BSC; do not infer testnet\navailability from constants in the upstream example script. Runtime 402 offers\nremain authoritative for payment selection.\n\nNew wallet project names receive a random suffix because Gateway `uniqueName`\nis global. The journal retains `requestName`, reusing it for the initial quote,\npayment submission and subsequent polling recovery; display names stay unchanged.\nLegacy journal entries without that field keep their original request body.\nNever regenerate the name or sign another payment after an uncertain outcome.\n\n`NodeOpsDeploymentError` exposes `record` when a wallet deployment has acknowledged\nIDs but polling fails (including build failure, timeout or a network error).\nPersist `error.record` just like a successful result so the caller can query or\ndelete the existing resource. Errors before acknowledgement still require journal\nand inventory reconciliation; no project ID is invented.\n\nThe runtime-variable and native-MPP fixes are local changes after deploy 0.6.1\nand require another release. On 2026-09-10 a standalone live probe verified\nDockerfile upload, BSC MPP payment and runtime settings.runEnvs injection. This\ndoes not verify secret-vault encryption, rotation or every wallet backend.\n\nNative MPP uses an explicit transport so an unrelated x402 header cannot block\nthe selected native challenge. The original response URL and body digest remain\nvalidated before approval. RPC_URL_BSC / RPC_URL_BASE / RPC_URL_ARBITRUM select\nHTTPS RPC endpoints; BSC defaults to https://bsc-dataseed.bnbchain.org. RPC calls\ntime out after 15 seconds with no automatic retries, including broadcasts.\n\nHosting auto-renew can be implemented by a caller, but recharging an existing\nbilling identity and reconciling its result remain unverified. The public\nGateway contract currently couples credit purchase to deployment creation. Do\nnot use repeated deploys or bare USDC transfers as a renewal implementation.\n\nAn account image project can be removed via project deletion. Deleting its\nexternal GHCR/Docker Hub image is a separate registry operation; the official\nCreateOS skill explicitly separates image registry management. Public contracts\ndo not specify garbage collection of images built internally by CreateOS.\n\n### Interrupted deployment recovery\n\nAccount deployments preserve an identity-bound `NodeOpsDeploymentError.record` after a project ID is acknowledged, including upload errors, polling timeouts, failed builds and promotion errors. A record may have only `projectId` if deployment acknowledgement failed; use status/logs/destroy with that project before retrying. The default wait is 1800 seconds, configurable with `timeoutSeconds`; timing out does not cancel the remote deployment.\n\nWallet journals distinguish credential preparation from payment submission. A failure before any signed approval transaction, or a credential failure after a confirmed approval, releases the hosting budget reservation. Retrying the same deployment can recover interrupted preparation when the journal contains that evidence. An approval with an unknown broadcast result, an already submitted payment, and legacy reservations without preparation metadata remain blocked. Neither missing IDs nor an empty project list proves no payment occurred; do not delete the journal or change the name to bypass reconciliation. Verify the Gateway outcome and transaction receipts before resolving a legacy or ambiguous operation.\n\n### EIP-3009 asset domains\n\nBase and Arbitrum wallet payments accept only the configured native USDC contracts. Native MPP passes chain-bound asset objects to mppx, with no shared authorization name/version fallback. Base uses mppx's USDC asset; mppx 0.9.1 has no Arbitrum entry, so the provider explicitly defines Arbitrum native USDC metadata (chain 42161, token address and decimals, USD Coin domain version 2). Missing or mismatched asset metadata fails before payment. x402 quote name/version must match the trusted asset, and the actual typed-data domain is checked before signing. This does not enable additional tokens or chains, or take domain metadata from untrusted quotes.\n","readmeFilename":"README.md"}