@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 +2 -2
- package/dist/bag.js +52 -23
- package/dist/{chunk-NSZXF5VL.js → chunk-P4YB7JBD.js} +3 -3
- package/dist/{deployCli-MG3GJCHM.js → deployCli-3E2EMAEW.js} +1 -1
- package/package.json +3 -3
- package/skills/bnbagent-studio.md +1 -1
- package/skills/references/bnbagent-studio-scaffolding-agent.md +1 -1
- package/skills/references/bnbagent-studio-use-aws-agentcore.md +1 -1
- package/skills/references/bnbagent-studio-use-azure-foundry.md +2 -2
- package/skills/references/bnbagent-studio-use-bnb-trial.md +1 -1
- package/skills/references/bnbagent-studio-use-createos.md +8 -6
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.
|
|
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.
|
|
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-
|
|
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-
|
|
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.
|
|
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}.
|
|
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.
|
|
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 (
|
|
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 (
|
|
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.
|
|
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.
|
|
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
|
|
19804
|
-
|
|
19805
|
-
|
|
19806
|
-
|
|
19807
|
-
|
|
19808
|
-
|
|
19809
|
-
|
|
19810
|
-
|
|
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.
|
|
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 = "
|
|
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.
|
|
951
|
-
return "0.0.14-alpha.
|
|
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.
|
|
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() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bnbagent/studio-cli",
|
|
3
|
-
"version": "0.0.14-alpha.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|