Repository navigation
Conversation
ppXD
force-pushed
the
fix/close-node-record-redaction-gaps
branch
from
October 12, 2026 17:37
44372ce to
0bf1f84
Compare
ppXD
changed the base branch from
fix/close-node-record-redaction-gaps
to
main
October 12, 2026 17:39
A model credential's base URL can carry credentials (user:key@host, ?api-key=), and the list returned it verbatim to every member. So could a git provider connection's base, API and web URLs. Both lists now mask userinfo and secret-named query values; an update that sends the masked value back keeps the stored URL, so existing edit forms and API clients that PUT or PATCH back what they GET keep working. A masked placeholder left in an otherwise edited URL is refused instead of being stored as the credential. Stored secrets are write-only, yet an Admin could repoint an endpoint without re-entering them and have the next refresh, probe, run, repository read, webhook registration or OAuth refresh present them to the new host. Moving a model credential's scheme, host or port now needs the key in the same update (400 model_endpoint_key_required). Moving a git provider's base or API host is refused while member tokens are still connected through it (428 provider_endpoint_credentials_bound: those tokens are not the editor's to re-enter, so they are disconnected first or the new host is added as its own provider), and needs its stored OAuth client secret again (400 provider_endpoint_secret_required). Path-only changes and connections with nothing bound are unaffected, and every endpoint move is logged with scheme://host:port only. A gateway that echoes the key it rejected put that key into node, interaction and external-call failure records a Viewer can read. LlmHttpTransport now strikes every credential the request presented from the error body before LlmApiException exists (classification still reads the raw body), and the interaction.failed payload strikes the call's own credential as a backstop. Git provider errors that echo the presented token reached Viewers on repository pages, git node errors and webhook pages. The resilience translation strikes the tokens the auth resolver handed the instance and drops the SDK's "Original call: <url>" suffix from the client-facing message and the insufficient-scope hint. The calls that read a refusal body themselves - GitLab's raw /unapprove, the project and group hook creates and lists, GitHub's hook creates - strike the token they sent before the body becomes an exception message or a webhook attempt's stored response. The needle rule (secret-name markers, URL userinfo and query values) moves to Services/Redaction so the agent-run redactor and these scrubs share one definition; the agent-run redactor's needles are unchanged. The model and provider edit forms ask for the secret again when the endpoint moves and say why a provider move is refused.
ppXD
force-pushed
the
fix/bind-model-endpoints-to-their-keys
branch
from
October 12, 2026 17:39
285dc86 to
270ce6c
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bind credentials to their endpoints and strike echoed tokens
Summary
BaseUrland git-providerBaseUrl/ApiUrl/WebUrl.CredentialUrl.KeepStoredIfMaskedreads a masked value sent back as "unchanged", so edit forms and API clients that PUT or PATCH back what they GET keep the stored URL.***left in an otherwise edited URL is refused instead of being stored as the credential (ModelCredentialService,ProviderInstanceService).CredentialUrl.SameEndpoint) now has these effects:model_endpoint_key_required).provider_endpoint_credentials_bound). Those tokens are not the editor's to re-enter, so the remedy is to disconnect them first or add the new host as its own provider.provider_endpoint_secret_required).LlmHttpTransporterror bodies, plus aninteraction.failedbackstop.ExternalCallResilienceSDK translation, which also drops theOriginal call: <url>suffix./unapprove, GitLab project and group hook create/list, and GitHub repo and org hook create. Their output feedsexternal_call.failed,repository_webhook.last_errorand*_webhook_attempt.error/response_body, all of which any team member can read.Services/Redaction(CredentialNeedles,CredentialUrl); the agent-run redactor's behaviour is unchanged.Test plan
ProviderRefusalEchoTests(GitLab/unapprove401/403/500 and the scope hint; GitLab project and group hook create/list; GitHub repo and org hook create).ProviderInstanceEndpointBindingTests.external_call.failedtest inNodeObservabilityTests.CredentialNeedles.Strike,CredentialUrl.KeepStoredIfMasked, and the failure-code pins.WebhookRegistrationCredentialEchoTests: the real registrars and providers against an echoing stub; no token inlast_error,attempt.errororattempt.response_body.ProviderInstanceEndpointBindingFlowTests: a refused repoint changes nothing; revoked tokens and path-only edits are allowed; the OAuth secret is required on a host move; masked values round-trip.ProviderInstanceRepointE2ETests: an Admin PATCH ofbaseUrlorapiUrlgets 428, the attacker stub accepts 0 connections, and a Viewer's branch read still reaches the real host. A Viewer's provider list contains no canary, and a masked PATCH keeps the stored URLs.ModelKeyExposureE2ETestsandGitProviderErrorEchoE2ETestsstill pass.credentialEndpointhelpers,pnpm lint(0 errors),tsc -b,pnpm build.