Skip to content

[feat] Starter credits: minimal web changes (hidden managed connection, replace-only secrets, add-your-key on exhaustion) - #6174

Merged
mmabrouk merged 8 commits into
release/v0.114.0from
feat/starter-credits-web
Aug 23, 2026
Merged

[feat] Starter credits: minimal web changes (hidden managed connection, replace-only secrets, add-your-key on exhaustion)#6174
mmabrouk merged 8 commits into
release/v0.114.0from
feat/starter-credits-web

Conversation

@mmabrouk

@mmabrouk mmabrouk commented Aug 21, 2026

Copy link
Copy Markdown
Member

Context

The frontend previously copied backend fields by hand and called the provider probe through raw Axios. It also made managed behavior depend on the internal managed_by component string. That duplicated the contract and made the UI responsible for backend implementation details.

Changes

Fern is regenerated from the final EE OpenAPI contract for Python and TypeScript. The secret entity now consumes PublicSecretResponseDto, SecretValueStatus, SecretManagementPolicy, and the generated provider-probe request and response.

Before:

SecretResponseDto & {
  has_key?: boolean
  key_preview?: string
  managed_by?: string
}

After:

AgentaApi.PublicSecretResponseDto

The UI maps value_status.configured and value_status.preview into its provider-connection view model. It checks the exact management.policy === "manager_only" policy rather than a manager-name string.

Update payloads omit a provider credential when the user leaves it untouched. They do not send an empty string as a keep signal: the backend rejects an explicit blank. The backend, generated clients, SDK, and frontend ship in the same release, so there is no legacy has_key or blank-value compatibility path.

Manager-only rows are hidden from Settings and edit drawers. They remain in the shared connection atom, agent creation defaults, model picker, and key-status checks, so seeded credentials still power agents.

The probe uses the Fern secrets client and project-scoped request options. Independent Zod validation remains at the frontend boundary for drift detection.

Tests / notes

  • 120 focused @agenta/entities tests passed.
  • The final post-audit entity regression gate passed 100 tests, and the @agenta/entities build/type-check passed.
  • 38 focused @agenta/entity-ui tests passed.
  • Type checks passed for @agenta/entities, @agenta/entity-ui, and @agenta/settings-ui.
  • The generated TypeScript client build passed.
  • Generated Python client imports passed.
  • Repository-required pnpm lint-fix passed. It reported four existing mobile hook warnings and no errors.
  • Railway live QA is deferred while Railway is unavailable.
  • Full implementation report: docs/design/write-only-secrets/implementation-report.md.
  • Release QA: docs/design/write-only-secrets/qa.md.

What to QA

  • Open Settings with only the seeded managed connection. It must not appear in the table or edit drawer.
  • Create a new agent in the same project. The seeded model must be selected without a Connect key warning, and the first run must work.
  • Open the model picker. The managed connection must remain available and use the Agenta mark.
  • Edit an ordinary write-only connection without typing a key. Confirm the request omits the credential, status remains configured, and a models-only save keeps the stored value.
  • Send an explicit blank credential directly to the backend and confirm it is rejected rather than treated as keep.
  • Press Test on that connection. The request must use secret_id through Fern and refresh models without exposing the key.
  • Regression: SSO, webhook, readable secrets, and ordinary provider connections must render and edit as before.

This PR is stacked on #6195 (fix/provider-probe-stored-key), whose chain is rooted in release/v0.114.0. Merge the stack in order: #6164, #6165, #6138, #6195, then #6174.

@vercel

vercel Bot commented Aug 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agenta-documentation Ready Ready Preview Aug 23, 2026 4:58pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added managed AI connections with automatic agent setup defaults and clear branding.
    • Provider credentials can be stored securely, previewed, and tested without re-entering write-only keys.
    • Added “Replace key” guidance while preserving existing credentials when fields are blank.
    • Starter-credit errors now offer an “Add your key” action.
    • Model and connection names are clearer and more consistent.
  • Bug Fixes

    • Improved error replay and classification.
    • Corrected custom connection provider handling and model reachability.
    • Managed connections are no longer editable or removable from provider settings.

Walkthrough

The change propagates run-error codes, adds write-only and managed secret handling, merges stored provider credentials for probing, wires a shared runtime key, and updates starter-credits seeding, generated clients, UI, deployment config, and tests.

Changes

Secret visibility and runtime grants

Layer / File(s) Summary
Run-error code and drawer flow
web/oss/src/components/AgentChatSlice/components/*, web/packages/agenta-chat/src/*, web/packages/agenta-shared/src/state/*
Run-error codes now persist through replay, enter turn status, and open the provider drawer for starter-credit failures.
Secret contracts and redaction
api/oss/src/core/secrets/*, api/oss/src/dbs/postgres/secrets/*, api/oss/src/apis/fastapi/vault/router.py, api/oss/src/core/webhooks/service.py, api/ee/src/core/organizations/service.py, web/packages/agenta-entities/src/secret/*, web/packages/agenta-entity-ui/src/secretProvider/*, web/packages/agenta-settings-ui/src/providers/*, web/oss/src/components/pages/settings/Vault/*, web/packages/agenta-entities/tests/unit/*, api/oss/tests/pytest/unit/secrets/*, api/oss/tests/pytest/unit/vault/*, api/oss/tests/pytest/unit/webhooks/*, api/ee/tests/pytest/unit/test_write_only_provider_settings.py
Secret DTOs, redaction, management policy, and write-only handling now flow through vault storage, route projection, webhook responses, EE provider settings, and related tests.
Provider probing and managed connections
api/oss/src/apis/fastapi/providers/*, web/packages/agenta-entities/src/secret/*, web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/*, web/packages/agenta-entity-ui/src/secretProvider/*, web/packages/agenta-entities/tests/unit/provider-connections.test.ts, api/oss/tests/pytest/unit/providers/test_provider_probe.py
Provider probing can merge stored secrets, managed connections are rejected where required, and agent creation and provider presentation use managed-connection defaults and branding.
Runtime key, starter credits, and deployment wiring
api/oss/src/middlewares/auth.py, api/oss/src/utils/*, api/oss/src/core/workflows/service.py, api/ee/src/core/starter_credits_bridge/*, api/ee/src/core/organizations/service.py, api/entrypoints/routers.py, sdks/python/agenta/sdk/*, services/oss/tests/pytest/unit/agent/test_credential_exchange.py, sdks/python/oss/tests/pytest/unit/*, hosting/docker-compose/*, hosting/kubernetes/*, hosting/railway/oss/*, docs/design/*
The shared services key now gates runtime grants, starter-credits seeding, deployment setup, SDK credential exchange, and the associated config, docs, and tests.
Generated client and type updates
clients/python/agenta_client/*, web/packages/agenta-entities/src/secret/api/probe.ts, web/packages/agenta-entities/src/secret/core/*, web/packages/agenta-shared/src/types/llmProvider.ts, web/packages/agenta-ui/src/LLMIcons/*, web/packages/agenta-ui/src/SelectLLMProvider/*
Generated and hand-written client types now expose public-secret, probe, and credential metadata shapes, plus the Agenta icon and provider mapping.
Review and maintenance docs
.gitleaks.toml, .gitleaksignore, docs/design/write-only-secrets/*, docs/design/starter-credits-seeding/*, docs/design/managed-secrets/*, docs/design/provider-connections-models/*
The design, QA, status, and leak-allowlist files describe the new secret, runtime-key, managed-secret, and starter-credits contracts.

Estimated code review effort: 5 (Critical) | ~120 minutes

Merge Risk: 🟠 High · up to 27b0a

This PR changes secret handling, provider probing, credential resolution, and deployment defaults, but the current head still permits stored credentials to be sent to a different provider, exposes credential material through caching or representations, and includes credential-resolution and startup-failure paths. These are high-impact security, correctness, and deployment risks, so the PR is not merge-ready until fixed.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 19.50% which is insufficient. The required threshold is 60.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 518 functions across 80 files. (76 skipped: 36 unsupported, 40 over the file limit.) Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed The description clearly explains the frontend, secret-management, provider-probe, testing, and release changes in the pull request.
Title check ✅ Passed The title identifies the main frontend changes, including managed connections, replace-only secrets, and the starter-credit exhaustion action.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/starter-credits-web

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@CLAassistant

CLAassistant commented Aug 21, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
web/packages/agenta-entities/src/secret/core/connections.ts (1)

681-698: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Preserve custom-provider credentials during updates.

VaultService.update_secret carries over only models and harnesses, while the DAO replaces secrets_dbe.data with the submitted data. A write-only edit therefore sends empty provider.extras and erases stored credentials. Merge omitted secret fields server-side or omit provider.extras from partial updates, and add regression tests.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: e34ceaa0-41be-4d85-8b54-c08670bae659

📥 Commits

Reviewing files that changed from the base of the PR and between fbbfed2 and 4496dcc.

📒 Files selected for processing (47)
  • web/oss/src/components/AgentChatSlice/components/AgentMessage.runError.test.tsx
  • web/oss/src/components/AgentChatSlice/components/AgentMessage.tsx
  • web/oss/src/components/AgentChatSlice/components/ConnectModelBanner.tsx
  • web/oss/src/components/AgentChatSlice/hooks/useChatSlashCommands.tsx
  • web/oss/src/components/AgentChatSlice/hooks/useOnboardingProviderSetup.ts
  • web/oss/src/components/pages/settings/Vault/ConfigureSecretModal/index.tsx
  • web/packages/agenta-chat/src/assets/trace.ts
  • web/packages/agenta-chat/src/assets/transcriptToMessages.ts
  • web/packages/agenta-chat/src/hooks/useAgentModelKeyStatus.ts
  • web/packages/agenta-chat/src/model/turnStatus.ts
  • web/packages/agenta-chat/src/model/turnViewModel.ts
  • web/packages/agenta-chat/tests/unit/assets/trace.test.ts
  • web/packages/agenta-chat/tests/unit/assets/transcriptToMessages.test.ts
  • web/packages/agenta-chat/tests/unit/model/turnStatus.test.ts
  • web/packages/agenta-entities/src/secret/api/probe.ts
  • web/packages/agenta-entities/src/secret/core/connections.ts
  • web/packages/agenta-entities/src/secret/core/index.ts
  • web/packages/agenta-entities/src/secret/core/transforms.ts
  • web/packages/agenta-entities/src/secret/core/types.ts
  • web/packages/agenta-entities/src/secret/index.ts
  • web/packages/agenta-entities/src/secret/state/atoms.ts
  • web/packages/agenta-entities/src/secret/state/connections.ts
  • web/packages/agenta-entities/src/secret/state/persistence.ts
  • web/packages/agenta-entities/src/workflow/state/agentCreationPrefs.ts
  • web/packages/agenta-entities/src/workflow/state/appUtils.ts
  • web/packages/agenta-entities/tests/unit/agent-creation-prefs.test.ts
  • web/packages/agenta-entities/tests/unit/provider-connections.test.ts
  • web/packages/agenta-entities/tests/unit/secret-transforms.test.ts
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/AgentTemplateControl.tsx
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/agentTemplate/ProviderCredentialsSectionView.tsx
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/agentTemplate/ProviderKeyField.tsx
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/agentTemplate/useModelHarness.tsx
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/connectionPicker.ts
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/connectionUtils.ts
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/index.ts
  • web/packages/agenta-entity-ui/src/DrillInView/index.ts
  • web/packages/agenta-entity-ui/src/secretProvider/ProviderConnectionCard.tsx
  • web/packages/agenta-entity-ui/src/secretProvider/ProviderDrawer.tsx
  • web/packages/agenta-entity-ui/tests/unit/connectionPicker.test.ts
  • web/packages/agenta-entity-ui/tests/unit/connectionUtils.test.ts
  • web/packages/agenta-settings-ui/src/providers/AIProvidersPage.tsx
  • web/packages/agenta-shared/src/state/index.ts
  • web/packages/agenta-shared/src/state/openProviderDrawer.ts
  • web/packages/agenta-shared/src/types/llmProvider.ts
  • web/packages/agenta-ui/src/LLMIcons/assets/Agenta.tsx
  • web/packages/agenta-ui/src/LLMIcons/index.ts
  • web/packages/agenta-ui/src/SelectLLMProvider/utils.ts

Included review availability: Your plan provides up to 8 included reviews per hour; 4 remain after this review.

Comment thread web/oss/src/components/AgentChatSlice/components/AgentMessage.runError.test.tsx Outdated
Comment thread web/oss/src/components/pages/settings/Vault/ConfigureSecretModal/index.tsx Outdated
Comment thread web/packages/agenta-entities/src/secret/core/transforms.ts
Comment thread web/packages/agenta-entities/src/workflow/state/appUtils.ts
Comment thread web/packages/agenta-ui/src/LLMIcons/assets/Agenta.tsx
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Railway Preview Environment

Status Destroyed (PR closed)

Updated at 2026-08-23T20:48:15.703Z

@mmabrouk
mmabrouk force-pushed the feat/starter-credits-web branch from 4496dcc to 27b0abd Compare August 22, 2026 22:02
@dosubot dosubot Bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Aug 22, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
hosting/docker-compose/oss/docker-compose.gh.local.yml (1)

3-18: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

This filename matches the operator-local override pattern, but the file is committed.

The coding guidelines state that hosting/docker-compose/**/docker-compose.*.local.yml files are operator-local and gitignored. This file matches that pattern and contains full service definitions rather than an override. Committing it means run.sh will auto-include it for every operator and will also silently merge with any operator's own *.local.yml. Confirm the intended filename, or add the file to the ignore list and move the shared content into a tracked, non-.local compose file.

As per coding guidelines: "Local compose override files are operator-local, gitignored, automatically included by run.sh, sorted lexicographically, and should be preserved during normal and targeted rebuilds."

Source: Coding guidelines

🧹 Nitpick comments (9)
api/oss/src/utils/env.py (1)

578-586: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

The "replace-me" placeholder rule is declared in three files. _services_internal_key_from_environment already maps a blank or "replace-me" value to None, so both consumers re-check a condition that the shared env object cannot produce. The literal is duplicated, and a change to the placeholder in env.py would leave the two copies stale.

  • api/oss/src/utils/env.py#L578-L586: export the placeholder rule, for example a module-level UNCONFIGURED_KEY_PLACEHOLDER constant, so consumers reuse one definition.
  • api/oss/src/apis/fastapi/access/router.py#L101-L127: drop _UNCONFIGURED_KEY and the expected == _UNCONFIGURED_KEY branch, and keep only the not expected guard.
  • api/ee/src/core/starter_credits_bridge/service.py#L440-L448: drop _UNCONFIGURED_RUNTIME_KEY and reduce _platform_runtime_key_configured to a truthiness check on env.agenta.services_internal_key.
clients/python/agenta_client/__init__.py (1)

422-423: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low value

Rename the remaining local TypeScript alias to PublicSecretResponseDto. types.ts, transforms.ts, and the tests still use SecretResponseDto, although the Python generated client and services use the replacement.

api/oss/src/dbs/postgres/secrets/dao.py (1)

137-139: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Update the stale comment.

The comment describes "the one-way write_only check below". No write_only check exists in this method. The lock now protects the resolve_update callback, which the comment at Line 154 already explains.

♻️ Proposed comment fix
-            # FOR UPDATE serializes concurrent updates so the one-way write_only check
-            # below always sees the latest committed flag — two racing updates cannot
-            # both observe False and let a stale explicit False win.
+            # FOR UPDATE serializes concurrent updates so `resolve_update` below always
+            # reads the latest committed row.
api/oss/src/dbs/postgres/secrets/mappings.py (1)

90-101: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Align the update dump with the create dump.

map_secrets_dto_to_dbe serializes data with model_dump(exclude_none=True) at Line 57. The update path calls update_secret_dto.secret.data.model_dump() without exclude_none. An update therefore persists explicit nulls, for example {"provider": {"key": null}} or "harnesses": null, where a create of the same secret stores no key at all.

Two rows with identical logical content then differ on disk depending on the write path. Downstream helpers such as _value_status and _carry_over_saved_extras read these fields with not in (None, "") checks, so the divergence is easy to reintroduce as a behavior difference later.

♻️ Proposed fix
-                secrets_dbe.data = _data_payload(
-                    update_secret_dto.secret.data.model_dump(),
+                secrets_dbe.data = _data_payload(
+                    update_secret_dto.secret.data.model_dump(exclude_none=True),
                     write_only=write_only,
                     management=management,
                 )
.gitleaks.toml (1)

45-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Two conflicting exemption strategies land in the same change.

This block exempts fixture strings by value and states that fingerprints are deliberately avoided because "a fingerprint names the commit it was seen in, so it goes stale every time a lane below is rebased." .gitleaksignore lines 295-303 then adds four commit-anchored fingerprints for the same class of fixture and asks maintainers to regenerate them after any history rewrite.

Both files describe the same rebase hazard, and one of them accepts it. Pick one strategy for these fixtures. Value-based exemption survives the rebases this stack expects.

web/packages/agenta-entity-ui/src/secretProvider/ProviderConnectionCard.tsx (1)

167-172: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Reduce the new explanatory comments to one short line.

  • web/packages/agenta-entity-ui/src/secretProvider/ProviderConnectionCard.tsx#L167-L172: replace the multi-line state explanation with one short comment.
  • web/packages/agenta-entity-ui/src/secretProvider/ProviderDrawer.tsx#L134-L139: remove or reduce the multi-line filtering explanation.
  • web/packages/agenta-settings-ui/src/providers/AIProvidersPage.tsx#L76-L79: remove or reduce the multi-line filtering explanation.

As per coding guidelines, “Keep in-code comments to at most one short line; use longer comments only for genuinely surprising constraints such as bugs, races, or ordering requirements.”

Source: Coding guidelines

api/ee/tests/pytest/unit/test_starter_credits_bridge_seeding.py (1)

103-118: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Class-level mutable state on FakeProxyClient couples tests to fixture ordering.

records, generate_failures, and instances are class attributes. Only the seeding_env fixture resets them. Any future test in this module that instantiates FakeProxyClient without seeding_env inherits state from a previous test. Consider moving the reset into an autouse fixture, or making the registry instance-scoped and passing it through the factory.

Also applies to: 184-199

api/oss/tests/pytest/unit/vault/test_write_only_routes.py (1)

36-46: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Make the fake DAO store data in one shape.

create stores data as a dict (model_dump(exclude_none=True)), and update stores it as the typed DTO object (update_secret_dto.secret.data). The router path then reads two different representations depending on whether a record was created or updated. Aligning update with create keeps the fake faithful to the postgres mapping and prevents a future assertion from passing for the wrong reason.

♻️ Proposed alignment
         if update_secret_dto.secret is not None:
             updated.kind = update_secret_dto.secret.kind
-            updated.data = update_secret_dto.secret.data
+            updated.data = update_secret_dto.secret.data.model_dump(exclude_none=True)

Also applies to: 78-88

hosting/kubernetes/helm/tests/test_runner_secret_absence.py (1)

166-169: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Reuse one rendered document set.

Line 166 renders the chart with DEFAULT_TOKEN_ARGS, and line 169 renders the same arguments again. Each render call spawns a helm template subprocess. Render once and derive both results from the same documents.

♻️ Single render
-    names = runner_container_env_names(render(DEFAULT_TOKEN_ARGS))
+    docs = render(DEFAULT_TOKEN_ARGS)
+    names = runner_container_env_names(docs)
     failures += check(names)
-
-    docs = render(DEFAULT_TOKEN_ARGS)

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 2502a529-0a02-4c7d-bf7a-80d7b6db3294

📥 Commits

Reviewing files that changed from the base of the PR and between 4496dcc and 27b0abd.

⛔ Files ignored due to path filters (24)
  • web/packages/agenta-api-client/src/generated/api/resources/secrets/client/Client.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/resources/secrets/client/requests/CreateSecretDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/resources/secrets/client/requests/ProbeProviderRequest.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/resources/secrets/client/requests/UpdateSecretDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/resources/secrets/client/requests/index.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/CredentialResult.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/CredentialStatus.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/CustomProviderDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/CustomSecretSettingsDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/DiscoveryResult.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/DiscoveryStatus.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/ProbeProviderResponse.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/ProviderCredentials.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/PublicSecretManagementDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/PublicSecretResponseDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/SecretDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/SecretManagementPolicy.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/SecretValueStatus.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/SsoProviderSettingsDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/StandardProviderDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/StandardProviderSettingsDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/UpdateSecretPayloadDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/WebhookProviderSettingsDto.ts is excluded by !**/generated/**
  • web/packages/agenta-api-client/src/generated/api/types/index.ts is excluded by !**/generated/**
📒 Files selected for processing (127)
  • .gitleaks.toml
  • .gitleaksignore
  • api/ee/src/core/organizations/service.py
  • api/ee/src/core/starter_credits_bridge/__init__.py
  • api/ee/src/core/starter_credits_bridge/client.py
  • api/ee/src/core/starter_credits_bridge/service.py
  • api/ee/src/core/starter_credits_bridge/types.py
  • api/ee/src/main.py
  • api/ee/tests/pytest/unit/test_starter_credits_bridge_client.py
  • api/ee/tests/pytest/unit/test_starter_credits_bridge_seeding.py
  • api/ee/tests/pytest/unit/test_write_only_provider_settings.py
  • api/entrypoints/routers.py
  • api/oss/src/apis/fastapi/access/router.py
  • api/oss/src/apis/fastapi/providers/models.py
  • api/oss/src/apis/fastapi/providers/router.py
  • api/oss/src/apis/fastapi/vault/router.py
  • api/oss/src/core/secrets/dtos.py
  • api/oss/src/core/secrets/interfaces.py
  • api/oss/src/core/secrets/managed.py
  • api/oss/src/core/secrets/redaction.py
  • api/oss/src/core/secrets/services.py
  • api/oss/src/core/webhooks/service.py
  • api/oss/src/core/workflows/service.py
  • api/oss/src/dbs/postgres/secrets/dao.py
  • api/oss/src/dbs/postgres/secrets/mappings.py
  • api/oss/src/middlewares/auth.py
  • api/oss/src/utils/env.py
  • api/oss/src/utils/helpers.py
  • api/oss/tests/pytest/unit/access/test_grant_exchange.py
  • api/oss/tests/pytest/unit/middlewares/test_auth_grants.py
  • api/oss/tests/pytest/unit/providers/test_provider_probe.py
  • api/oss/tests/pytest/unit/secrets/test_dtos.py
  • api/oss/tests/pytest/unit/secrets/test_managed_secrets.py
  • api/oss/tests/pytest/unit/secrets/test_services.py
  • api/oss/tests/pytest/unit/secrets/test_write_only.py
  • api/oss/tests/pytest/unit/utils/test_env_helpers.py
  • api/oss/tests/pytest/unit/vault/test_managed_routes.py
  • api/oss/tests/pytest/unit/vault/test_write_only_routes.py
  • api/oss/tests/pytest/unit/webhooks/test_write_only_outward.py
  • clients/python/agenta_client/__init__.py
  • clients/python/agenta_client/secrets/client.py
  • clients/python/agenta_client/secrets/raw_client.py
  • clients/python/agenta_client/types/__init__.py
  • clients/python/agenta_client/types/credential_result.py
  • clients/python/agenta_client/types/credential_status.py
  • clients/python/agenta_client/types/custom_provider_dto.py
  • clients/python/agenta_client/types/custom_secret_settings_dto.py
  • clients/python/agenta_client/types/discovery_result.py
  • clients/python/agenta_client/types/discovery_status.py
  • clients/python/agenta_client/types/probe_provider_response.py
  • clients/python/agenta_client/types/provider_credentials.py
  • clients/python/agenta_client/types/public_secret_management_dto.py
  • clients/python/agenta_client/types/public_secret_response_dto.py
  • clients/python/agenta_client/types/public_secret_response_dto_data.py
  • clients/python/agenta_client/types/secret_dto.py
  • clients/python/agenta_client/types/secret_management_policy.py
  • clients/python/agenta_client/types/secret_value_status.py
  • clients/python/agenta_client/types/sso_provider_settings_dto.py
  • clients/python/agenta_client/types/standard_provider_dto.py
  • clients/python/agenta_client/types/standard_provider_settings_dto.py
  • clients/python/agenta_client/types/update_secret_payload_dto.py
  • clients/python/agenta_client/types/update_secret_payload_dto_data.py
  • clients/python/agenta_client/types/webhook_provider_settings_dto.py
  • docs/design/managed-secrets/README.md
  • docs/design/provider-connections-models/provider-discovery.md
  • docs/design/starter-credits-seeding/README.md
  • docs/design/write-only-secrets/README.md
  • docs/design/write-only-secrets/context.md
  • docs/design/write-only-secrets/implementation-report.md
  • docs/design/write-only-secrets/plan.md
  • docs/design/write-only-secrets/qa.md
  • docs/design/write-only-secrets/research.md
  • docs/design/write-only-secrets/review.md
  • docs/design/write-only-secrets/status.md
  • hosting/docker-compose/ee/docker-compose.dev.yml
  • hosting/docker-compose/ee/docker-compose.gh.local.yml
  • hosting/docker-compose/ee/docker-compose.gh.yml
  • hosting/docker-compose/ee/env.ee.dev.example
  • hosting/docker-compose/ee/env.ee.gh.example
  • hosting/docker-compose/oss/docker-compose.dev.yml
  • hosting/docker-compose/oss/docker-compose.gh.local.yml
  • hosting/docker-compose/oss/docker-compose.gh.ssl.yml
  • hosting/docker-compose/oss/docker-compose.gh.yml
  • hosting/docker-compose/oss/env.oss.dev.example
  • hosting/docker-compose/oss/env.oss.gh.example
  • hosting/kubernetes/ee/values.ee.example.yaml
  • hosting/kubernetes/helm/templates/NOTES.txt
  • hosting/kubernetes/helm/templates/_helpers.tpl
  • hosting/kubernetes/helm/templates/_validations.tpl
  • hosting/kubernetes/helm/templates/api-deployment.yaml
  • hosting/kubernetes/helm/templates/secrets.yaml
  • hosting/kubernetes/helm/templates/services-deployment.yaml
  • hosting/kubernetes/helm/tests/test_runner_secret_absence.py
  • hosting/kubernetes/helm/values.schema.json
  • hosting/kubernetes/helm/values.yaml
  • hosting/kubernetes/oss/values.oss.example.yaml
  • hosting/railway/oss/README.md
  • hosting/railway/oss/scripts/configure.sh
  • hosting/railway/oss/template/template.json
  • sdks/python/agenta/sdk/agents/connections/__init__.py
  • sdks/python/agenta/sdk/agents/connections/credentials.py
  • sdks/python/agenta/sdk/agents/connections/errors.py
  • sdks/python/agenta/sdk/agents/platform/connections.py
  • sdks/python/agenta/sdk/agents/platform/secrets.py
  • sdks/python/agenta/sdk/middlewares/routing/auth.py
  • sdks/python/agenta/sdk/middlewares/running/vault.py
  • sdks/python/oss/tests/pytest/unit/agents/connections/test_credentials_parity.py
  • sdks/python/oss/tests/pytest/unit/agents/platform/test_write_only_secrets.py
  • sdks/python/oss/tests/pytest/unit/test_auth_middleware_credentials.py
  • services/oss/tests/pytest/unit/agent/test_credential_exchange.py
  • web/packages/agenta-entities/src/secret/api/probe.ts
  • web/packages/agenta-entities/src/secret/core/connections.ts
  • web/packages/agenta-entities/src/secret/core/index.ts
  • web/packages/agenta-entities/src/secret/core/transforms.ts
  • web/packages/agenta-entities/src/secret/core/types.ts
  • web/packages/agenta-entities/src/secret/index.ts
  • web/packages/agenta-entities/src/secret/state/atoms.ts
  • web/packages/agenta-entities/src/workflow/state/agentCreationPrefs.ts
  • web/packages/agenta-entities/tests/unit/agent-creation-prefs.test.ts
  • web/packages/agenta-entities/tests/unit/provider-connections.test.ts
  • web/packages/agenta-entities/tests/unit/secret-transforms.test.ts
  • web/packages/agenta-entity-ui/src/DrillInView/SchemaControls/connectionPicker.ts
  • web/packages/agenta-entity-ui/src/secretProvider/ProviderConnectionCard.tsx
  • web/packages/agenta-entity-ui/src/secretProvider/ProviderDrawer.tsx
  • web/packages/agenta-entity-ui/tests/unit/connectionPicker.test.ts
  • web/packages/agenta-settings-ui/src/providers/AIProvidersPage.tsx
  • web/packages/agenta-shared/src/types/llmProvider.ts
💤 Files with no reviewable changes (1)
  • api/ee/src/main.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • web/packages/agenta-entity-ui/tests/unit/connectionPicker.test.ts

Included review availability: Your plan provides up to 8 included reviews per hour; 6 remain after this review.

Comment thread api/oss/src/apis/fastapi/access/router.py Outdated
Comment thread api/oss/src/apis/fastapi/providers/router.py Outdated
Comment thread api/oss/src/core/secrets/services.py
Comment thread api/oss/tests/pytest/unit/providers/test_provider_probe.py Outdated
Comment thread clients/python/agenta_client/types/provider_credentials.py Outdated
Comment thread hosting/docker-compose/oss/env.oss.gh.example
Comment thread hosting/kubernetes/helm/templates/NOTES.txt
Comment thread sdks/python/agenta/sdk/agents/platform/connections.py
Comment thread sdks/python/agenta/sdk/middlewares/running/vault.py Outdated
Comment thread web/packages/agenta-entities/src/secret/core/connections.ts
@mmabrouk
mmabrouk force-pushed the feat/starter-credits-web branch from 27b0abd to 1145d25 Compare August 22, 2026 22:25
@mmabrouk
mmabrouk changed the base branch from release/v0.114.0 to fix/provider-probe-stored-key August 22, 2026 22:25
@mmabrouk

Copy link
Copy Markdown
Member Author

Implemented the final frontend/review handoff in 7f0a7407b750bdf3ed14490e486711500652fc12.

  • The frontend and generated clients use the same value_status and managed-secret contract as the backend.
  • Untouched credentials are omitted from update payloads; no empty-string or legacy-field compatibility behavior remains.
  • The backend and frontend are documented and tested as one release.
  • The review, implementation report, status, and QA files now describe the final five-PR stack and the exact release flows.

Local gates: 100 focused entity tests and the @agenta/entities build/type-check passed. Repository CI is green; only the known Railway preview setup remains pending.

— Codex

@mmabrouk

Copy link
Copy Markdown
Member Author

🤖 The AI agent says:

Final verification records are current at 37b21bbe2c.

  • The implementation report and affected PR descriptions now reflect 64 write-only tests, 74 write-only plus managed tests, and 229 tests in the final focused API selection after removing four unsupported webhook compatibility cases.
  • The report also records the 109-test webhook and write-only-secret run against the final behavior.
  • All repository-owned checks on this head passed, including API, SDK, services, runner, web, mobile types, Helm, formatting, lint, gitleaks, and image builds. Railway preview setup is the only failure and remains the accepted external blocker.

@mmabrouk
mmabrouk changed the base branch from fix/provider-probe-stored-key to release/v0.114.0 August 23, 2026 20:47
@mmabrouk
mmabrouk merged commit 43fd852 into release/v0.114.0 Aug 23, 2026
53 of 54 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request frontend size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants