feat(cloud): enable Cloud Apps plugin on the default cloud agent - #11932
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
NubsCarson
left a comment
There was a problem hiding this comment.
[cloud-audit] review of #11932 — money/security audit of the one-line flag flip
Verdict: LGTM (money/security-safe) — the remaining GO is a product decision, not a safety one. Verified against develop tip 13baa442640d by reading actual code, not the PR body.
What the diff does (verified)
Adds CLOUD_APPS_PLUGIN_ENABLED: "true" to the default cloud agent character (packages/cloud/shared/src/lib/eliza/agent.ts:76). Read by isCloudAppsPluginEnabled() (agent-loader.ts:34-38); lazy-imports @elizaos/plugin-cloud-apps as a full plugin (agent-loader.ts:244-249). Scope check: the setting flows only through getDefaultCharacter() (agent-loader.ts:165-175) — DB-stored custom characters keep their own settings (agent-loader.ts:143-145). Dedicated container agents already ship this plugin via packages/agent/src/runtime/core-plugins.ts:131, so this extends an existing surface to the shared default agent rather than opening a novel one.
(a) Ungated spend — NONE found
- All five money/destructive actions (BUY_APP_DOMAIN, DELETE_APP, REGENERATE_APP_API_KEY, WITHDRAW_APP_EARNINGS, BOOK_INFLUENCER) use the two-phase confirm in
plugins/plugin-cloud-apps/src/safety.ts, with exact-cents price pinning (amountUsdCents) and a pending-confirmation TTL. - I independently verified the claimed blocking fixes are ancestors of develop:
git merge-base --is-ancestorconfirms9c4c0f9f41(#11855 frozen-target confirm hijack) and5393692560(#11810 withdraw planner-nested params);e9ac8125c2(#11828 monetization review gate) and073f4d99ca(#11870 rejection revokes monetization) are on develop. - Ad-campaign actions are draft/report-only; DUPLICATE_AD_CAMPAIGN creates an unfunded draft (
ad-campaigns.ts:174-253). Create-app monetization intent is fail-closed server-side (known #11863). - Every action validates
resolveCloudApiKey(runtime) !== nullandgetCloudClientreturns null without a key (client.ts:73-84) — no key, no cloud calls.
(b) Cross-tenant — NONE found
The plugin authenticates as the requesting user: ELIZAOS_CLOUD_API_KEY = context.apiKey (runtime/settings.ts:53-54), and the runtime cache key includes organizationId (initializer.ts:167-175), so runtimes never cross orgs. One PREEXISTING nuance (not introduced here): on cache HIT, applyUserContext (settings.ts:205) does not re-apply the API key, so a same-org teammate's app mutations run under the cache-entry owner's key — same tenant, attribution-only, but worth a follow-up issue now that write/money actions ride that credential.
(c) Existing users' billing — no direct change
No default that moves money changes. Marginal per-message prompt growth from ~28 new action definitions, mitigated by contextGate (actions surface only in settings/finance/apps contexts) and the dynamic: true CLOUD_APPS provider (providers/cloud-apps.ts:82 — no per-message API fetch).
Blast radius (confirmed as stated)
develop deploys STAGING-only; prod requires the separate main promote. Rollback = revert one line; the loader lazy-imports so OFF costs nothing. PR is a draft gated on an explicit nubs GO — keep that gate.
[cloud-audit]
|
Agent-loop review: the code is a clean, verified one-line flag flip ( |
Adversarial review (automated deep-review pass) — legit + correctly wired; keep draft until rebase + GOVerified end-to-end, not a stale/dup/no-op: the flag 🟠 MEDIUM — do not merge red. 🟠 MEDIUM — attach evidence before GO. Per the binding cloud |
|
Review note (not a merge): the +3-line change is clean and correct — Holding as draft intentionally: this flips a deliberately-OFF gate ON for the default cloud agent, which enables destructive/money actions (create/deploy/delete/withdraw/domain-buy). develop's loader comment says it's OFF for exactly that reason, and #11863 (agent 'create a monetized app' hard-403s) is a prerequisite UX defect. Keep as draft pending @nubs's GO + #11863; close if product doesn't want default-agent app monetization. |
0502c71 to
4294e58
Compare
|
Rebased onto current develop (was stale — stale-base guard + downstream unit/lint/E2E were all stale-base fallout). Re-verified the change is unchanged and still correctly wired: CI re-running fresh now. Staying draft/unmerged pending nubs GO per the operator gate — this just keeps it one-click-ready for the demo (the create/host/monetize-apps leg depends on it). No self-merge. — [cloud-money] |
4294e58 to
1290677
Compare
|
Rebased onto current develop and force-pushed. The diff remains the intended one-setting flag flip inside the default cloud agent character settings. Verification after rebase:
Keeping draft/unmerged: this PR is still explicitly product-gated on nubs GO because it enables create/host/deploy/monetize actions on the default cloud agent. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
Putting this back to draft after queue review. The code diff is still the clean one-line flag flip, but the PR body/history explicitly gate this on a Nubs product GO because it enables create/host/deploy/monetize actions on the default cloud agent. The last NubsCarson comment says it is staying draft/unmerged pending that GO; the later ready-for-review event was by lalalune, not Nubs. Also keep the previously requested evidence before merge: boot log showing Cloud Apps plugin enabled and a real mock-stack request/refusal trace for a gated create/withdraw path. Not merging until those conditions are satisfied. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
Adds CLOUD_APPS_PLUGIN_ENABLED: "true" to the default cloud-hosted agent character settings (read by isCloudAppsPluginEnabled() in agent-loader.ts), turning on plugin-cloud-apps — create/host/deploy/monetize apps — for the default Eliza cloud agent. Held as DRAFT pending explicit product GO from nubs before merge+promote.
1290677 to
26187a5
Compare
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
Pull request was converted to draft
|
Queue audit: restored this PR to draft and confirmed auto-merge is no longer attached. Keeping it product-gated pending Nubs GO plus the previously requested boot/plugin evidence and gated create/withdraw trace. |
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
lalalune
left a comment
There was a problem hiding this comment.
Code/security review looks okay, but this is still product-gated default enablement for Cloud Apps on the shared default cloud agent. Please keep it out of the merge queue until the explicit product GO plus boot/plugin evidence is attached. Green CI alone is not enough for this flag flip.
|
Maintainer review note: do not auto-merge this PR in its current state. The PR body says it is "DRAFT on purpose" and requires an explicit product GO from @nubs, but GitHub currently shows it as ready with auto-merge enabled. Separately, against current origin/develop ( |
|
|
|
parked #11932 — stays draft per shaw's CHANGES_REQUESTED: needs nubs's explicit product GO plus boot/refusal evidence before it may queue. Re-verified today: mechanically merge-clean vs develop tip (3-line settings change, |
|
[shaw-codex] review note: keep parked/draft. This enables Cloud Apps on the default cloud agent, including money/destructive app operations. I agree with the existing changes-requested posture: do not merge without explicit product GO and runtime proof. Required evidence before review should include a boot log showing the plugin enabled in the default cloud agent and real mock-stack traces proving create/withdraw/refusal behavior is safe and expected. |
|
Trajectory review — on-track, not merging (draft + explicit human GO gate). Verified the diff and its prerequisites against
One thing to attach before the GO flip (the only missing evidence for a change this consequential): a staging boot log proving the default cloud agent actually loads CI note: Leaving as draft per your gate. Technically the blockers are now all cleared on develop; only the product GO from @nubs remains. |
|
Checkpoint from Sol on the changes-requested state: I rechecked #11932. The diff is still a single default-agent flag flip in I’m treating this as product-gated, not something I can resolve with a code patch. The latest blocking review I can see says to keep it out of the merge queue until there is explicit product GO plus boot/plugin evidence attached. I don’t have authority to provide that product approval. No push, no review re-request, and definitely no auto-merge from me. Once product GO and the requested boot/plugin evidence are available, I can attach evidence and re-request review. |
|
Audit note: do not merge this yet. The diff is mechanically a one-line flag flip, but it enables the full Cloud Apps action surface on the shared default cloud agent, including create/deploy/delete/domain-buy/withdraw/key-rotation paths. That needs explicit product approval plus real evidence before readiness.\n\nCurrent blockers: PR is still draft/blocked/changes-requested; branch is very stale against |
|
Not force-merging. This PR is intentionally gated on a human product decision and does not meet the readiness bar for an autonomous force-merge, despite the code being a clean one-line flag flip:
This flips the full Cloud Apps money/destructive action surface (create/deploy/delete/domain-buy/withdraw/key-rotation) ON for the shared default cloud agent — a product/business exposure decision an agent must not make unilaterally. It correctly stays parked until nubs/Shaw give the explicit GO and the boot/refusal evidence lands. |
|
Current review: still holding. The code path is mechanically simple ( Before merge this needs:
I did not find a direct wiring bug in the one-line flag change, but the rollout/security evidence gate is still unresolved. |
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
What
One-line flag flip: adds
CLOUD_APPS_PLUGIN_ENABLED: "true"to the default cloud-hosted agent character settings (packages/cloud/shared/src/lib/eliza/agent.ts). The gate is read byisCloudAppsPluginEnabled()inagent-loader.ts, which lazy-loads@elizaos/plugin-cloud-appsas a FULL plugin.Effect: the default Eliza cloud agent can create, host, deploy, manage, and monetize apps for users — the full action set (list/get/create/deploy/frontend-deploy/rollback/update/delete, monetization update, earnings + withdraw, domains check/buy/list, ad slots/campaigns, influencer booking, backup, key rotation) plus the
CLOUD_APPSprovider.Why now — the safety items that were blocking this are FIXED (all verified in
develop)The plugin was gated OFF because it ships destructive/money actions to every dedicated prod agent. The blocking findings are now merged:
9c4c0f9f41.options.parameters(full-balance-withdrawal-on-partial-request bug). Merged:5393692560.monetization_enabledrequires an approved review, and review REJECTION disables monetization (banned apps can no longer keep earning inference markup). Merged:e9ac812….develop: confirm-time price re-check + deploy completion gate + safe delete (feat(plugin-cloud-apps): create → deploy (completion gate) → delete + facts cache #10290 lineage), domain-buy cross-app replay fix (fix(cloud): app-scope the domain-buy idempotency replay so a cross-app re-buy reassigns instead of falsely succeeding #11405), refund idempotency (fix(cloud): guard refundRedemption against double-refund (in-tx row-locked idempotency check) #11331), in-tx payment credit (fix(cloud): grant direct-wallet credits inside the confirm tx (no stranded confirmed-but-uncredited deposits) #11319).Known open items (judged non-blocking, listed for the GO decision)
Blast radius / rollback
developdeploys to STAGING only — merging this enables apps for the default agent on staging first; prod exposure requires the separate main/dispatch promote, which stays a distinct decision.Gate
DRAFT on purpose — do not merge without an explicit GO from @nubs. Enabling create/host/monetize on the default agent is a product decision, not just a safety one. This PR exists so the GO is one click.
nubs-cloud
[cloud-frontdoor]