@bnbagent/studio-cli 0.0.14-alpha.4 → 0.0.14-alpha.6

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/README.md CHANGED
@@ -316,7 +316,7 @@ This package is licensed under Apache-2.0 and provided **as is**, without warran
316
316
 
317
317
  ### CreateOS (NodeOps)
318
318
 
319
- Studio pins deploy 0.6.2 and loads its published Node.js SDK. Configure the agent:
319
+ Studio pins deploy 0.6.4 and loads its published Node.js SDK. Configure the agent:
320
320
 
321
321
  ```toml
322
322
  [deploy.nodeops]
@@ -339,6 +339,6 @@ bag deploy destroy --provider nodeops # preview
339
339
  bag deploy destroy --provider nodeops --execute --yes # delete project
340
340
  ```
341
341
 
342
- Account mode supports ZIP/container deployment, runtime secrets and updates. An unhealthy endpoint makes deploy exit nonzero while preserving `.studio/deployments/nodeops.json`; inspect logs and retry verification. Wallet runtime variables use `settings.runEnvs` through the pinned deploy 0.6.2; the pinned SDK 0.5.7-alpha.2 supports BSC nested Permit2 signing with explicit policy opt-in. The Studio bridge now supports bounded approval transactions with an explicit gas budget during authorized payments. Hosting renewal is not yet integrated. `bag deploy wallet --json` reads Gateway chains and USDC balances without signing or paying. CreateOS uses NodeOps infrastructure; AWS and Azure providers deploy into your own cloud account.
342
+ Account mode supports ZIP/container deployment, runtime secrets and updates. An unhealthy endpoint makes deploy exit nonzero while preserving `.studio/deployments/nodeops.json`; inspect logs and retry verification. Wallet runtime variables use `settings.runEnvs` through the pinned deploy 0.6.4; the pinned SDK 0.5.7-alpha.2 supports BSC nested Permit2 signing with explicit policy opt-in. The Studio bridge now supports bounded approval transactions with an explicit gas budget during authorized payments. Hosting renewal is not yet integrated. `bag deploy wallet --json` reads Gateway chains and USDC balances without signing or paying. CreateOS uses NodeOps infrastructure; AWS and Azure providers deploy into your own cloud account.
343
343
 
344
344
  The installed skill includes `references/bnbagent-studio-use-createos.md` with configuration, capability limits and recovery steps.
package/dist/bag.js CHANGED
@@ -72,7 +72,7 @@ import {
72
72
  x402SellerIsFree,
73
73
  x402SellerPricingState,
74
74
  x402SellerUsesB402
75
- } from "./chunk-NSZXF5VL.js";
75
+ } from "./chunk-P4YB7JBD.js";
76
76
  import {
77
77
  validateAgentcoreName
78
78
  } from "./chunk-U7IDQ3K5.js";
@@ -771,7 +771,7 @@ import {
771
771
  var CAMPAIGN_DOC_URL = "https://www.bnbchain.org/en/blog/bnb-agent-studio-is-live-on-bnb-chain-ai-agents-from-one-prompt";
772
772
  var CAMPAIGN_CHECK_TIMEOUT_MS = 6e3;
773
773
  async function fetchCampaignActive() {
774
- const { bnbPlatformApiUrl: bnbPlatformApiUrl2 } = await import("./deployCli-MG3GJCHM.js");
774
+ const { bnbPlatformApiUrl: bnbPlatformApiUrl2 } = await import("./deployCli-3E2EMAEW.js");
775
775
  const controller = new AbortController();
776
776
  const timer = setTimeout(() => controller.abort(), CAMPAIGN_CHECK_TIMEOUT_MS);
777
777
  try {
@@ -3612,9 +3612,13 @@ async function signNodeOpsApproval(wallet, tx, policy) {
3612
3612
  "gas",
3613
3613
  "gasPrice",
3614
3614
  "data",
3615
- "from"
3615
+ "from",
3616
+ "account",
3617
+ "chain"
3616
3618
  ]);
3617
- if (Object.entries(tx).some(([k, v]) => v !== void 0 && !fields.has(k)) || tx.chainId !== 56 || tx.type !== "legacy" || typeof tx.to !== "string" || tx.to.toLowerCase() !== USDC.toLowerCase() || tx.from !== void 0 && String(tx.from).toLowerCase() !== wallet.address.toLowerCase() || tx.value !== void 0 && tx.value !== 0n || !Number.isSafeInteger(tx.nonce) || Number(tx.nonce) < 0 || typeof tx.gas !== "bigint" || tx.gas <= 0n || typeof tx.gasPrice !== "bigint" || tx.gasPrice <= 0n || tx.gas * tx.gasPrice > BigInt(policy.maxApprovalGasWei) || typeof tx.data !== "string")
3619
+ if (Object.entries(tx).some(([k, v]) => v !== void 0 && !fields.has(k)) || tx.chainId !== 56 || tx.chain !== void 0 && (tx.chain === null || typeof tx.chain !== "object" || tx.chain.id !== 56) || tx.account !== void 0 && String(
3620
+ typeof tx.account === "string" ? tx.account : tx.account?.address
3621
+ ).toLowerCase() !== wallet.address.toLowerCase() || tx.type !== "legacy" || typeof tx.to !== "string" || tx.to.toLowerCase() !== USDC.toLowerCase() || tx.from !== void 0 && String(tx.from).toLowerCase() !== wallet.address.toLowerCase() || tx.value !== void 0 && tx.value !== 0n || !Number.isSafeInteger(tx.nonce) || Number(tx.nonce) < 0 || typeof tx.gas !== "bigint" || tx.gas <= 0n || typeof tx.gasPrice !== "bigint" || tx.gasPrice <= 0n || tx.gas * tx.gasPrice > BigInt(policy.maxApprovalGasWei) || typeof tx.data !== "string")
3618
3622
  throw new Error(
3619
3623
  "Rejected a transaction outside the bounded BSC USDC approval policy."
3620
3624
  );
@@ -9041,7 +9045,7 @@ function requireDurablePassword(projectRoot) {
9041
9045
  const persisted = getEnvVar(envPath, PASSWORD_ENV2);
9042
9046
  if (!persisted) {
9043
9047
  throw new Error(
9044
- `refusing to create a keystore with an unpersisted ${PASSWORD_ENV2}. Edit ${envPath}, set ${PASSWORD_ENV2} there, and retry; do not pass wallet passwords on the command line.`
9048
+ `refusing to create a keystore with an unpersisted ${PASSWORD_ENV2}. For a new wallet/import, add --save-password to privately save the current shell password in ${envPath}, or use --generate-password to generate one. Do not pass wallet passwords on the command line.`
9045
9049
  );
9046
9050
  }
9047
9051
  if (persisted !== password) {
@@ -9101,6 +9105,9 @@ function registerWallet(program) {
9101
9105
  ).option(
9102
9106
  "--generate-password",
9103
9107
  "For a new evm-local wallet, generate a CSPRNG password and persist it privately before creating the keystore."
9108
+ ).option(
9109
+ "--save-password",
9110
+ "For a new evm-local wallet/import, privately persist WALLET_PASSWORD from the current shell; never accepts a password argument."
9104
9111
  ).option("--project-root <path>", "Override project root.").action(
9105
9112
  act(
9106
9113
  wrap2(
@@ -9219,6 +9226,11 @@ async function createProjectWallet(opts, projectRoot) {
9219
9226
  walletCfg = loadWalletCfg(projectRoot);
9220
9227
  }
9221
9228
  const kind = walletKind(walletCfg);
9229
+ if (opts.savePassword && (kind !== "evm-local" || opts.generatePassword)) {
9230
+ throw new Error(
9231
+ "--save-password requires evm-local and cannot be combined with --generate-password."
9232
+ );
9233
+ }
9222
9234
  if (kind === "twak") {
9223
9235
  return cmdNewTwak(projectRoot, walletCfg);
9224
9236
  }
@@ -9263,13 +9275,24 @@ async function createProjectWallet(opts, projectRoot) {
9263
9275
  );
9264
9276
  return 1;
9265
9277
  }
9278
+ if (opts.savePassword && (anchored || existingKeystores.length)) {
9279
+ throw new Error(
9280
+ "--save-password is only for a new wallet/import; use the existing wallet's original saved password."
9281
+ );
9282
+ }
9266
9283
  const privateKey = await resolvePrivateKeyArg(opts.privateKey);
9267
9284
  const priorPersistedPassword = getEnvVar(
9268
9285
  envLocalPath10(projectRoot),
9269
9286
  PASSWORD_ENV2
9270
9287
  );
9271
- const password = opts.generatePassword ? generateLocalWalletPassword() : requireDurablePassword(projectRoot);
9272
- if (opts.generatePassword) {
9288
+ const password = opts.generatePassword ? generateLocalWalletPassword() : opts.savePassword ? requirePassword2() : requireDurablePassword(projectRoot);
9289
+ if (opts.savePassword && priorPersistedPassword && priorPersistedPassword !== password) {
9290
+ throw new Error(
9291
+ "Refusing to replace a different saved WALLET_PASSWORD; make the existing durable password authoritative first."
9292
+ );
9293
+ }
9294
+ const savedPassword = opts.generatePassword || opts.savePassword;
9295
+ if (savedPassword) {
9273
9296
  setEnvVar(privateEnvPath(projectRoot), PASSWORD_ENV2, password);
9274
9297
  }
9275
9298
  let provider;
@@ -9288,7 +9311,7 @@ async function createProjectWallet(opts, projectRoot) {
9288
9311
  } catch {
9289
9312
  walletWasWritten = false;
9290
9313
  }
9291
- if (opts.generatePassword && !walletWasWritten) {
9314
+ if (savedPassword && !walletWasWritten) {
9292
9315
  setEnvVar(
9293
9316
  privateEnvPath(projectRoot),
9294
9317
  PASSWORD_ENV2,
@@ -9301,12 +9324,12 @@ async function createProjectWallet(opts, projectRoot) {
9301
9324
  persistAddress(projectRoot, provider.address, opts.keystoreDir);
9302
9325
  } catch (cause) {
9303
9326
  throw new Error(
9304
- "The wallet and its password were saved, but writing the address to studio.toml failed. Restore file permissions, then run `bag wallet new` without --generate-password to adopt the saved wallet.",
9327
+ "The wallet and its password were saved, but writing the address to studio.toml failed. Restore file permissions, then run `bag wallet new` without --generate-password or --save-password to adopt the saved wallet.",
9305
9328
  { cause }
9306
9329
  );
9307
9330
  }
9308
9331
  printOut(provider.address);
9309
- if (opts.generatePassword) {
9332
+ if (savedPassword) {
9310
9333
  printErr(
9311
9334
  `Password stored (0600): ${envLocalPath10(projectRoot)} (WALLET_PASSWORD)`
9312
9335
  );
@@ -15177,7 +15200,7 @@ async function loadNodeOpsSdk() {
15177
15200
  ).resolve("@bnbagent/deploy-provider-nodeops/sdk");
15178
15201
  } catch {
15179
15202
  throw new Error(
15180
- "Installed deploy package lacks the NodeOps Node.js SDK. Reinstall Studio with its pinned @bnbagent/deploy-cli 0.6.2 dependency."
15203
+ "Installed deploy package lacks the NodeOps Node.js SDK. Reinstall Studio with its pinned @bnbagent/deploy-cli 0.6.4 dependency."
15181
15204
  );
15182
15205
  }
15183
15206
  }
@@ -15628,7 +15651,7 @@ async function inspectNodeOpsWallet(root, deps = {}) {
15628
15651
  const sdk = await (deps.sdk ?? loadNodeOpsSdk)();
15629
15652
  if (!sdk.createGatewayWalletClient)
15630
15653
  throw new Error(
15631
- "The installed deploy SDK lacks Gateway wallet queries. Reinstall Studio with its pinned deploy 0.6.2 dependency."
15654
+ "The installed deploy SDK lacks Gateway wallet queries. Reinstall Studio with its pinned deploy 0.6.4 dependency."
15632
15655
  );
15633
15656
  const address = cfg.options.walletAddress ?? (deps.wallet ?? getWallet3)().address;
15634
15657
  if (typeof address !== "string" || !address)
@@ -19266,7 +19289,7 @@ function resolveTarget(opts, root, destination = agentDeployDestination(root)) {
19266
19289
  return readStackRuntime(root) ?? "agentcore";
19267
19290
  }
19268
19291
  function validateRuntimeAgainstStack(target, force, root) {
19269
- if (target === "platform" || target === "platform-azure") {
19292
+ if (target === "platform" || target === "platform-azure" || target === "nodeops") {
19270
19293
  return null;
19271
19294
  }
19272
19295
  const stackRuntime2 = readStackRuntime(root);
@@ -19800,14 +19823,20 @@ async function cmdDeploy(opts, deployArgs) {
19800
19823
  printErr("error: --backend does not apply to CreateOS");
19801
19824
  return 2;
19802
19825
  }
19803
- const readiness = await runPrepare({
19804
- target: "nodeops",
19805
- projectRoot: root
19806
- });
19807
- if (readiness.exitCode() !== 0) {
19808
- for (const check of readiness.checks)
19809
- printErr(`${check.level}: ${check.message}`);
19810
- return readiness.exitCode();
19826
+ const storageExit = enforceSkipPrepareStorageGate(opts, root, "nodeops");
19827
+ if (storageExit !== null) return storageExit;
19828
+ if (!opts.skipPrepare) {
19829
+ let readiness = await runPrepare({
19830
+ target: "nodeops",
19831
+ projectRoot: root,
19832
+ force: opts.force
19833
+ });
19834
+ readiness = applyStorageGuard(readiness, root);
19835
+ readiness = bypassBrokenStorageIfForced(opts, readiness, root);
19836
+ if (readiness.exitCode() !== 0) {
19837
+ renderPrepareHuman(readiness, true);
19838
+ return readiness.exitCode();
19839
+ }
19811
19840
  }
19812
19841
  try {
19813
19842
  const record2 = await deployNodeOps(root, { pay: opts.pay === true });
@@ -23078,7 +23107,7 @@ function registerEnv(program) {
23078
23107
  "Resolve .env.local under this project root (mirrors `bag config --project-root`); ignored when --file is given."
23079
23108
  ).addHelpText(
23080
23109
  "after",
23081
- "\nNote: wallet unlock passwords are intentionally REJECTED here \u2014 studio\nnever accepts them as command-line arguments. Keep evm-local in the shell:\n export WALLET_PASSWORD=...\nFor twak, edit .studio/.env.local yourself and set:\n TWAK_WALLET_PASSWORD=...\nNever pass either value through chat or argv. See docs/guides/user-guide.md \xA710."
23110
+ "\nNote: wallet unlock passwords are intentionally REJECTED here \u2014 studio\nnever accepts them as command-line arguments. For a NEW evm-local wallet/import,\nread the password privately in your terminal, export WALLET_PASSWORD, then use\n bag wallet new --save-password\nAdd --private-key to import through a hidden prompt, or --private-key - for stdin.\nFor an existing wallet, keep its original password in the owner-only .studio/.env.local.\nFor twak, edit .studio/.env.local yourself and set:\n TWAK_WALLET_PASSWORD=...\nNever pass either value through chat or argv. See docs/guides/user-guide.md \xA710."
23082
23111
  ).action(
23083
23112
  act(
23084
23113
  (key, value, opts) => cmdSet2(key, value, opts.file, opts.projectRoot)
@@ -23119,7 +23148,7 @@ function resolveEnvPath(fileArg, rootArg) {
23119
23148
  }
23120
23149
  function cmdSet2(key, value, fileArg, rootArg) {
23121
23150
  if (WALLET_PASSWORD_KEYS.has(key)) {
23122
- let guidance = "Set it for this shell instead:\n export WALLET_PASSWORD=...\n\u2014 every `bag` command reads it from the environment.";
23151
+ let guidance = "For a NEW evm-local wallet/import, read the password privately in your terminal, export WALLET_PASSWORD, then run `bag wallet new --save-password` (add --private-key for a hidden key prompt, or --private-key - for stdin). For an existing wallet, keep its original password in the owner-only .studio/.env.local. Never replace an existing wallet password.";
23123
23152
  if (key === "TWAK_WALLET_PASSWORD") {
23124
23153
  guidance = "Edit .studio/.env.local yourself and add:\n TWAK_WALLET_PASSWORD=...";
23125
23154
  }
@@ -947,8 +947,8 @@ function packageRoot() {
947
947
  }
948
948
  }
949
949
  function studioCliVersion() {
950
- if ("0.0.14-alpha.4") {
951
- return "0.0.14-alpha.4";
950
+ if ("0.0.14-alpha.6") {
951
+ return "0.0.14-alpha.6";
952
952
  }
953
953
  const file = path4.join(packageRoot(), "package.json");
954
954
  const pkg = JSON.parse(fs4.readFileSync(file, "utf-8"));
@@ -1230,7 +1230,7 @@ function isTable(value) {
1230
1230
  }
1231
1231
 
1232
1232
  // src/cli/_deploy/deployCli.ts
1233
- var DEPLOY_CLI_VERSION = "0.6.2";
1233
+ var DEPLOY_CLI_VERSION = "0.6.4";
1234
1234
  var DEPLOY_CLI_PACKAGE = `@bnbagent/deploy-cli@${DEPLOY_CLI_VERSION}`;
1235
1235
  var require2 = createRequire(import.meta.url);
1236
1236
  function resolveLocalDeployCli() {
@@ -21,7 +21,7 @@ import {
21
21
  runPlatformAccountCommand,
22
22
  trialFromDeployCliJson,
23
23
  withDeployFiles
24
- } from "./chunk-NSZXF5VL.js";
24
+ } from "./chunk-P4YB7JBD.js";
25
25
  export {
26
26
  BNB_PLATFORM_API_URL,
27
27
  BNB_PLATFORM_API_URL_ENV,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bnbagent/studio-cli",
3
- "version": "0.0.14-alpha.4",
3
+ "version": "0.0.14-alpha.6",
4
4
  "description": "Skills-first toolkit and bag CLI for BNB Chain seller agents: ERC-8004 identity, ERC-8183 escrowed commerce, and x402 payments.",
5
5
  "keywords": [
6
6
  "bnb-chain",
@@ -42,7 +42,7 @@
42
42
  "bag": "./dist/bag.js"
43
43
  },
44
44
  "dependencies": {
45
- "@bnbagent/deploy-cli": "0.6.2",
45
+ "@bnbagent/deploy-cli": "0.6.4",
46
46
  "@bnbagent/sdk": "0.5.7-alpha.2",
47
47
  "ai": "^7.0.29",
48
48
  "archiver": "^8.0.0",
@@ -55,7 +55,7 @@
55
55
  "tar": "^7.4.0",
56
56
  "viem": "^2.56.3",
57
57
  "yaml": "^2.9.0",
58
- "@bnbagent/studio-runtime": "0.0.14-alpha.4"
58
+ "@bnbagent/studio-runtime": "0.0.14-alpha.6"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@a2a-js/sdk": "^0.3.14",
@@ -67,7 +67,7 @@ Treat ERC-8183 amounts as decimal strings at CLI/config boundaries and `bigint`
67
67
 
68
68
  ## CLI groups at a glance
69
69
 
70
- `init`, `scan`, `recipe`, `skills`, `wallet`, `erc8004`, `erc8183`, `x402`, `mpp`, `agents`, `config`, `env`, `dev`, `doctor`, `feedback`, `audit`, `deploy`, `platform`, `llm`, `bundle`, `budget` - see `bag --help` for details. `bag deploy [--provider bnb\|aws\|azure\|nodeops] [--backend aws\|azure]` is the primary deploy command; `--backend` is valid only for provider `bnb` and confirms the recipe-derived managed backend. `prepare`, `list`, `verify`, `status`, `info`, `destroy`, `logs`, and `fix-gitignore` remain lifecycle subcommands (`deploy agent` is a deprecated compatibility alias). Provider deploy/status/logs/destroy and deploy-time credential validation are delegated to pinned `@bnbagent/deploy-cli@0.6.2`.
70
+ `init`, `scan`, `recipe`, `skills`, `wallet`, `erc8004`, `erc8183`, `x402`, `mpp`, `agents`, `config`, `env`, `dev`, `doctor`, `feedback`, `audit`, `deploy`, `platform`, `llm`, `bundle`, `budget` - see `bag --help` for details. `bag deploy [--provider bnb\|aws\|azure\|nodeops] [--backend aws\|azure]` is the primary deploy command; `--backend` is valid only for provider `bnb` and confirms the recipe-derived managed backend. `prepare`, `list`, `verify`, `status`, `info`, `destroy`, `logs`, and `fix-gitignore` remain lifecycle subcommands (`deploy agent` is a deprecated compatibility alias). Provider deploy/status/logs/destroy and deploy-time credential validation are delegated to pinned `@bnbagent/deploy-cli@0.6.4`.
71
71
 
72
72
  ## Tool surface
73
73
 
@@ -166,7 +166,7 @@ Build a TodoWrite list. The shape depends on the `wallet kind`. The canonical 8-
166
166
 
167
167
  Do not run or explain the upstream `twak setup` wizard. `twak-init` uses the project-pinned binary, runs `twak init --json`, verifies an authenticated read, generates and persists `TWAK_WALLET_PASSWORD`, creates/adopts the project-dedicated no-keychain wallet, and anchors the address. No separate `bag wallet new` step exists. For CI, the user may place `TWAK_ACCESS_ID` + `TWAK_HMAC_SECRET` in `.studio/.env.local` themselves; never route them through chat. Reuse an existing wallet only with explicit `--twak-home <home-style-path>`; `--twak-home ~` is a discouraged opt-in to the main wallet. Load `bnbagent-studio-using-twak-wallet.md` for the exact security and deploy contract.
168
168
 
169
- - **evm-local** (default): the new-wallet TTY happy path generates `WALLET_PASSWORD` with the OS CSPRNG, persists it privately, then creates the encrypted keystore in-process. After `--no-onboard`, run `(cd app/agent && bag wallet new --generate-password)` for the same non-interactive safe path. It refuses to replace an existing or anchored wallet. For an existing encrypted v3 file, prefer `bag init ... --wallet-kind evm-local --evm-keystore <path>` and use the file's original password; Studio copies and verifies the file without re-encrypting it. To import a raw key, use the hidden `bag wallet new --private-key` prompt or stdin; never pass the key inline.
169
+ - **evm-local** (default): the new-wallet TTY happy path generates `WALLET_PASSWORD` with the OS CSPRNG, persists it privately, then creates the encrypted keystore in-process. After `--no-onboard`, run `(cd app/agent && bag wallet new --generate-password)` for the same non-interactive safe path. It refuses to replace an existing or anchored wallet. For an existing encrypted v3 file, prefer `bag init ... --wallet-kind evm-local --evm-keystore <path>` and use the file's original password; Studio copies and verifies the file without re-encrypting it. To import a raw key into a new wallet, use `bag wallet new --private-key --generate-password` (hidden key prompt) or `--private-key - --generate-password` (stdin). For a user-selected password, the user privately reads/exports `WALLET_PASSWORD` in their own terminal and replaces `--generate-password` with `--save-password`, which persists it privately and refuses existing wallets or a different saved password. Never pass a key or password inline.
170
170
 
171
171
  5. **Fund the wallet - OPTIONAL; do NOT block on it.** The default `auto/free` LLM model runs at $0 and AgentCore deploy consumes no wallet balance, so a brand-new seller can scaffold, run `bag dev`, and deploy with an empty wallet. `bag doctor` and `bag deploy` only **WARN** (never block) on zero balance. Funding is needed later only for: a paid LLM model, on-chain settle, paying positive-price ERC-8183 job buys, or buying/smoking a PAID B402 request. A FREE ERC-8183 buy needs no U escrow or ERC-20 approval, but still needs the ERC-8183 state-changing calls and their gas/paymaster path. A FREE B402/x402 request needs neither token funding nor a facilitator call. When funding is needed, the wallet uses **TWO distinct U balances on TWO chains** (same wallet address, same private key, different chains):
172
172
  - **tBNB (gas)** on BSC testnet: message the official Telegram bot https://t.me/bnbchain_official_bot with `I would like to get tBNB to my wallet <address>` (up to 0.3 tBNB/day; replies with the tx hash). More options: https://docs.bnbchain.org/bnb-smart-chain/developers/faucet/
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bnbagent-studio-use-aws-agentcore
3
- description: When the user wants to deploy or operate a bnbagent-studio project on AWS Bedrock AgentCore - deploy with `bag deploy --provider aws` (all cloud lifecycle mutations are delegated to pinned `@bnbagent/deploy-cli@0.6.2`), inspect with `bag deploy status` / `logs --provider aws` / `verify --provider aws`, and tear down with `bag deploy destroy --provider aws --execute [--purge]`. Also covers AWS credential prerequisites, the optional read-only quota probe, and the runtime-secret channel.
3
+ description: When the user wants to deploy or operate a bnbagent-studio project on AWS Bedrock AgentCore - deploy with `bag deploy --provider aws` (all cloud lifecycle mutations are delegated to pinned `@bnbagent/deploy-cli@0.6.4`), inspect with `bag deploy status` / `logs --provider aws` / `verify --provider aws`, and tear down with `bag deploy destroy --provider aws --execute [--purge]`. Also covers AWS credential prerequisites, the optional read-only quota probe, and the runtime-secret channel.
4
4
  ---
5
5
 
6
6
  > **Reference file** of the `bnbagent-studio` router skill - installed at `bnbagent-studio/references/` and loaded on demand (not a standalone skill). Route here via the router's decision tree.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bnbagent-studio-use-azure-foundry
3
- description: When the user wants to deploy or operate a bnbagent-studio project on Azure AI Foundry Hosted Agents - scaffold with `bag init --runtime azure-foundry`, deploy either to the managed platform with `bag deploy --provider bnb --backend azure` or directly with `bag deploy --provider azure`; all cloud lifecycle execution is delegated to pinned `@bnbagent/deploy-cli@0.6.2`. Native MCP is not supported on Azure; use AgentCore for MCP.
3
+ description: When the user wants to deploy or operate a bnbagent-studio project on Azure AI Foundry Hosted Agents - scaffold with `bag init --runtime azure-foundry`, deploy either to the managed platform with `bag deploy --provider bnb --backend azure` or directly with `bag deploy --provider azure`; all cloud lifecycle execution is delegated to pinned `@bnbagent/deploy-cli@0.6.4`. Native MCP is not supported on Azure; use AgentCore for MCP.
4
4
  ---
5
5
 
6
6
  > **Reference file** of the `bnbagent-studio` router skill - installed at `bnbagent-studio/references/` and loaded on demand (not a standalone skill). Route here via the router's decision tree.
@@ -31,7 +31,7 @@ Procedure for deploying and operating the seller Agent on **Azure AI Foundry Hos
31
31
 
32
32
  1. **Bun 1.3+ (`bunx`) on PATH** - the pinned `@bnbagent/deploy-cli` runs through it.
33
33
  2. **Docker running** - the image is built locally (linux/amd64) before push.
34
- 3. **An Azure subscription** the operator may provision in (Foundry account/project, container registry, hosted agent). Before a local self-deploy, run `bunx --bun @bnbagent/deploy-cli@0.6.2 login --provider azure`; use OIDC/service-principal credentials in CI.
34
+ 3. **An Azure subscription** the operator may provision in (Foundry account/project, container registry, hosted agent). Before a local self-deploy, run `bunx --bun @bnbagent/deploy-cli@0.6.4 login --provider azure`; use OIDC/service-principal credentials in CI.
35
35
 
36
36
  ## ⚠️ Foundry gotchas (read before deploying)
37
37
 
@@ -9,7 +9,7 @@ description: Use when deploying or operating a bnbagent-studio seller on the BNB
9
9
 
10
10
  Treat this provider as a temporary testnet sandbox. Require a throwaway wallet, keep `bsc-testnet`, and explain that the runtime signing material is transmitted to the operator's managed secret store for the trial. Never use a mainnet key. Exception: `wallet.kind='altana'` ships only the bounded, budget-limited, revocable session - the throwaway-wallet advice does not apply; tighten the session instead (`bag wallet session grant --force --budget-u <small> --expiry-days <short>`) and never run `bag wallet new` on an altana project (it breaks the session's `[wallet].address` anchor).
11
11
 
12
- All auth and cloud lifecycle work must cross the pinned `@bnbagent/deploy-cli@0.6.2` boundary. Do not call a cloud CLI or platform REST routes directly. The managed backend is recipe-derived: `agentcore` uses AWS; `azure-foundry` uses Azure. For headless managed Azure, confirm with `bag deploy --provider bnb --backend azure --yes`; never treat `--backend` as a cross-cloud recipe converter.
12
+ All auth and cloud lifecycle work must cross the pinned `@bnbagent/deploy-cli@0.6.4` boundary. Do not call a cloud CLI or platform REST routes directly. The managed backend is recipe-derived: `agentcore` uses AWS; `azure-foundry` uses Azure. For headless managed Azure, confirm with `bag deploy --provider bnb --backend azure --yes`; never treat `--backend` as a cross-cloud recipe converter.
13
13
 
14
14
  ## Select and authenticate
15
15
 
@@ -1,17 +1,17 @@
1
1
  ---
2
2
  name: bnbagent-studio-use-createos
3
- description: Deploy and operate Studio agents on CreateOS through the nodeops provider and published deploy 0.6.2 SDK. Covers account credentials, ZIP/container packaging, runtime secrets, health recovery, project lifecycle and wallet payment restrictions.
3
+ description: Deploy and operate Studio agents on CreateOS through the nodeops provider and published deploy 0.6.4 SDK. Covers account credentials, ZIP/container packaging, runtime secrets, health recovery, project lifecycle and wallet payment restrictions.
4
4
  ---
5
5
 
6
6
  # Deploy and operate on CreateOS
7
7
 
8
- Use Studio's `nodeops` provider for NodeOps-hosted infrastructure. AWS and Azure providers remain separate choices for infrastructure in the user's own cloud account. Studio pins `@bnbagent/deploy-cli@0.6.2` and resolves the published `@bnbagent/deploy-provider-nodeops/sdk` through that dependency. No local deploy checkout, source override or Bun process is required for NodeOps.
8
+ Use Studio's `nodeops` provider for NodeOps-hosted infrastructure. AWS and Azure providers remain separate choices for infrastructure in the user's own cloud account. Studio pins `@bnbagent/deploy-cli@0.6.4` and resolves the published `@bnbagent/deploy-provider-nodeops/sdk` through that dependency. No local deploy checkout, source override or Bun process is required for NodeOps.
9
9
 
10
10
  ## Check the installed CLI
11
11
 
12
12
  Run `bag --version` and `bag deploy --help`. Confirm that `nodeops` is advertised before following this reference; older Studio releases lack the adapter. If absent, use the main skill's approved upgrade workflow. Do not bypass Studio with a raw provider deployment, because it omits Studio packaging, secrets and resource records.
13
13
 
14
- The generic router's minimum version does not establish NodeOps compatibility. Use the release's documented CLI version with deploy 0.6.2; an alpha may be required while npm `latest` lacks this integration. Do not repeatedly install `latest` without checking its capabilities. Reuse existing installation authorization and verify the selected CLI's version and provider after installation.
14
+ The generic router's minimum version does not establish NodeOps compatibility. Use the release's documented CLI version with deploy 0.6.4; an alpha may be required while npm `latest` lacks this integration. Do not repeatedly install `latest` without checking its capabilities. Reuse existing installation authorization and verify the selected CLI's version and provider after installation.
15
15
 
16
16
  ## Complete a build-and-deploy request
17
17
 
@@ -106,11 +106,11 @@ Deletion removes project environments too; registry images and payment history r
106
106
 
107
107
  Read this section before choosing a wallet for NodeOps. Use `evm-local` for the currently tested Studio signing path. Turnkey implements the required public signing interfaces but still needs provider-specific live acceptance testing. TWAK lacks generic EIP-712 signing; Altana's session `x402.pay` is not wired into Gateway authentication/payment. Do not silently replace an existing wallet to work around these limits.
108
108
 
109
- Studio pins published deploy 0.6.2, which supports runtime credentials through `settings.runEnvs`, independently of the uploaded archive. The 2026-09-10 standalone live probe confirmed Dockerfile deployment, BSC MPP settlement and runtime variable injection; the installed-package integration suite covers the Studio path with injected HTTP responses. These do not establish secret-vault encryption, redaction or variable rotation. If readiness reports an older SDK without runtime variable support, follow the approved CLI upgrade workflow; do not use a source override or embed credentials in the artifact.
109
+ Studio pins published deploy 0.6.4, which supports runtime credentials through `settings.runEnvs`, independently of the uploaded archive. The 2026-09-10 standalone live probe confirmed Dockerfile deployment, BSC MPP settlement and runtime variable injection; the installed-package integration suite covers the Studio path with injected HTTP responses. These do not establish secret-vault encryption, redaction or variable rotation. If readiness reports an older SDK without runtime variable support, follow the approved CLI upgrade workflow; do not use a source override or embed credentials in the artifact.
110
110
 
111
111
  For evm-local workloads, runtime variables include the encrypted `WALLET_KEYSTORE_JSON` and its `WALLET_PASSWORD`. NodeOps therefore receives the material needed by the deployed agent to unlock and use that wallet. The claim "no private-key export" applies to the hosting-payment signer, not to runtime custody. Explain this boundary when choosing the deployment wallet, honor existing custody authorization and prefer a dedicated wallet for new third-party-hosted agents. Do not display or log the secret payload or imply that keystore encryption keeps it inaccessible to a runtime that also receives the password.
112
112
 
113
- For a new project, use the explicit business-interface initialization above, install dependencies, and run `(cd app/agent && bag wallet new --generate-password)`. Reuse an initialized wallet within its authorized custody scope instead of generating another. Configure model/storage credentials using the existing local secret workflow; never collect private keys, passwords or API keys in chat. A wallet used to pay NodeOps is not automatically compatible with every runtime wallet backend.
113
+ For a new project, use the explicit business-interface initialization above, install dependencies, and run `(cd app/agent && bag wallet new --generate-password)`. To import a raw key with a new generated password, use `bag wallet new --private-key - --generate-password` with the key supplied by the user through stdin. If the user requires their own password, they privately read/export `WALLET_PASSWORD` in their terminal and run `bag wallet new --private-key - --save-password`; the flag persists it in `.studio/.env.local` (0600) and refuses existing wallets or a different saved password. Never put passwords or private keys in argv. Reuse an initialized wallet within its authorized custody scope instead of generating another. Configure model/storage credentials using the existing local secret workflow; never collect private keys, passwords or API keys in chat. A wallet used to pay NodeOps is not automatically compatible with every runtime wallet backend.
114
114
 
115
115
  Merge the following into `app/agent/studio.toml`. These amounts are example spending caps, **not a NodeOps quote**; use the user's approved limits. Keep existing signing-policy entries.
116
116
 
@@ -164,11 +164,13 @@ bag deploy status --provider nodeops --json
164
164
  bag deploy verify --provider nodeops --skip-register
165
165
  ```
166
166
 
167
+ `--skip-prepare` skips readiness checks only; the fatal storage guard and deploy SDK validation still run. `--force` does not override fatal storage or wallet signing checks. The explicit `--force-deploy-broken-storage` override permits knowingly deploying broken/local storage with a warning; do not add it merely to get a deployment through. `prepare --provider nodeops` selects the cloud provider, not a local runtime named nodeops.
168
+
167
169
  `deploy wallet` is read-only and reports on-chain USDC. `createosCredits: null` means unknown hosting credits, not zero. Funding and hidden credential entry may require the user's terminal/wallet. Base/Arbitrum require their exact USDC domain and validity-window policy instead of the BSC Permit2 configuration. `RPC_URL_BSC` overrides the default `https://bsc-dataseed.bnbchain.org`; RPC requests have bounded timeouts and do not retry broadcasts automatically.
168
170
 
169
171
  `--yes` confirms deployment; `--pay` additionally authorizes payment within the caps. An initial deploy POST may consume existing credits and create a project even without a payment challenge. `use_existing_credits` is the separate choice for credits shared by active projects. `auto_pay=true` additionally requires the approved `pay_to` recipient pin. It automates payment when deployment is invoked; it does not schedule renewal.
170
172
 
171
- Wallet deployments are create-only. Use `status` and `verify` after an acknowledged build failure, timeout or uncertain response; retain `.studio/deployments/nodeops.json` and deploy's durable journal under `~/.bnbagent-deploy/nodeops/payments/`. All callers of a wallet must share one journal for budget aggregation and locking. Do not change names, clear the journal or submit another payment to recover an unknown outcome. Logs, existing-image deployment, named-environment management and in-place updates are not exposed by the current wallet adapter.
173
+ Wallet deployments are create-only. Use `status` and `verify` after an acknowledged build failure, timeout or uncertain response; retain `.studio/deployments/nodeops.json` and deploy's durable journal under `~/.bnbagent-deploy/nodeops/payments/`. With deploy 0.6.4, a verified pre-broadcast failure releases the reservation and a retry can resume the same deployment. An ambiguous approval broadcast, a submitted payment, or an old reservation without preparation evidence must remain blocked for reconciliation; missing resource IDs are not proof that payment failed. All callers of a wallet must share one journal for budget aggregation and locking. Do not change names, clear the journal or submit another payment to recover an unknown outcome. Logs, existing-image deployment, named-environment management and in-place updates are not exposed by the current wallet adapter.
172
174
 
173
175
  ## When the user asks to renew
174
176