Skip to content

Promote Development to Staging (v0.261.027) - #1486

Merged
Bionic711 merged 85 commits into
Stagingfrom
Development
Sep 17, 2026
Merged

Bionic711 merged 85 commits into
Stagingfrom
Development

Conversation

@Bionic711

Copy link
Copy Markdown
Collaborator

Summary

  • Promote Development into Staging for integration and release validation. At preparation time, the comparison contains 85 commits and 188 changed files; Development is not behind Staging.
  • Include custom model endpoint support, XSD ingestion and schema-driven XML generation, and Yamcs HTTP Basic authentication support.
  • Include document-upload reliability, workspace sharing approvals, group conversation invitations, logout, and cross-worker admin settings consistency fixes.
  • Include Azure Managed Redis support and post-deployment configuration updates, Entra Graph permission corrections, Docker build fixes, and dependency/CI updates.

Source snapshot: b7ee5d1b6808967668542d160fed39d85705b67e (Development).
Target snapshot: c3705afc05f13677813f772c4226b11f669b2be3 (Staging).

This is a draft branch-promotion PR, not approval to merge or deploy. The PR will track subsequent updates to Development.

Linked issue

No single linked issue; this PR consolidates changes already on Development.

Release Notes & Latest Features

  • New Feature
  • Bug Fix
  • UI Enhancement
  • Breaking Change
  • Internal only

Is this visible to end users?

  • Yes
  • No

Is this admin-facing (Admin Settings, governance, deployment, config)?

  • Yes
  • No

Latest Feature card and screenshot requirements: pending release-owner review of the included changes. Breaking-change classification also remains to be reviewed.

Version bump

  • application/single_app/config.py VERSION changed from 0.261.003 to 0.261.027
  • deployers/version.txt changed from 1.0.26 to 1.0.30

Testing / validation

  • Verified both remote branches exist, checked the GitHub branch comparison, and confirmed no existing open Development -> Staging PR before creation.
  • Inspected commit summaries and version-file diffs to prepare this description; no full code review was performed.
  • No tests, builds, or deployments were run as part of creating this PR. CI results and staging validation are pending.
  • Review required CI checks and resolve any failures before marking ready.
  • Validate custom endpoint configuration/authentication/streaming and existing model-provider behavior.
  • Validate document upload bursts, XSD ingestion, workspace sharing approvals, and group conversation invitations.
  • Validate logout, Redis configuration/connectivity, cross-worker settings consistency, and deployment/build paths.

Documentation

  • Release notes reviewed for the promotion
  • Feature documentation reviewed, or confirmed not needed
  • Fix documentation reviewed, or confirmed not needed

Security checklist

Pending reviewer validation; these items have not been independently verified as part of PR creation.

  • New Flask routes include @swagger_route(security=get_auth_security())
  • Settings sent to non-admin frontends use sanitize_settings_for_user()
  • Browser JavaScript is served from local SimpleChat static assets only; no CDN-hosted JS
  • No secrets, keys, connection strings, or local-only artifacts are included

Paul Lizer (paullizer) and others added 30 commits August 12, 2026 10:35
Support OpenAI, Azure OpenAI, and Anthropic API contracts across global, personal, and group endpoint scopes with manual models, API-key authentication, runtime integration, and hardened outbound networking.

Refs #1222

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve the Custom model endpoint release notes alongside the latest Development history and advance the application version to 0.250.172.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Resolves the merge conflicts with Development (VERSION and release notes) and
replaces the IS_DEVELOPMENT gate with a correct fix.

Logout redirected to /.auth/logout and returned 404 whenever
WEBSITE_AUTH_AAD_ALLOWED_TENANTS was set without Easy Auth actually running.
That variable is configured by hand per the advanced environment variable
guidance, so it was never evidence Easy Auth was intercepting requests. This
affected production deployments, not just development ones.

Detection now relies only on the X-MS-CLIENT-PRINCIPAL headers App Service
injects into requests it intercepts, so Easy Auth logout is preserved wherever
Easy Auth is genuinely active, including in development.

Adds DISABLE_APP_SERVICE_EASY_AUTH_LOGOUT for deployments where Easy Auth is
active but /.auth/* is not routed to the origin, plus debug logging of the
logout path decision and a Logout Behavior Across Environments section in the
local development guide.

Also removes a customer hostname from the test fixture and replaces an exact
VERSION assertion in the idle logout test with the shared version helper.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This prevents 404 error after logout.
Version and test updates.
Fixed goofy github conflict
Updating with latest fixes to deploy to dev for testing
…smos gate is not overwhelmed when many documents are uploaded.
Promote Staging to main for v0.261.002
Bumps [snowflake-connector-python](https://github.com/snowflakedb/snowflake-connector-python) from 3.18.0 to 3.18.1.
- [Release notes](https://github.com/snowflakedb/snowflake-connector-python/releases)
- [Commits](snowflakedb/snowflake-connector-python@v3.18.0...v3.18.1)

---
updated-dependencies:
- dependency-name: snowflake-connector-python
  dependency-version: 3.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
…updates

Bumps the github-actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `3.7.0` | `7.0.1` |
| [actions/setup-python](https://github.com/actions/setup-python) | `5` | `7` |
| [tj-actions/changed-files](https://github.com/tj-actions/changed-files) | `46.0.1` | `47.0.6` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4` | `7` |
| [actions/github-script](https://github.com/actions/github-script) | `7.1.0` | `9.0.0` |
| [azure/login](https://github.com/azure/login) | `2.3.1` | `3.0.1` |
| [Azure/setup-azd](https://github.com/azure/setup-azd) | `2.3.0` | `2.4.0` |
| [actions/setup-node](https://github.com/actions/setup-node) | `4.4.0` | `7.0.0` |



Updates `actions/checkout` from 3.7.0 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](actions/checkout@v3.7.0...v7.0.1)

Updates `actions/setup-python` from 5 to 7
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v7)

Updates `tj-actions/changed-files` from 46.0.1 to 47.0.6
- [Release notes](https://github.com/tj-actions/changed-files/releases)
- [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md)
- [Commits](tj-actions/changed-files@2f7c5bf...9426d40)

Updates `actions/upload-artifact` from 4 to 7
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)

Updates `actions/github-script` from 7.1.0 to 9.0.0
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@f28e40c...3a2844b)

Updates `azure/login` from 2.3.1 to 3.0.1
- [Release notes](https://github.com/azure/login/releases)
- [Commits](Azure/login@7184910...f5d393a)

Updates `Azure/setup-azd` from 2.3.0 to 2.4.0
- [Release notes](https://github.com/azure/setup-azd/releases)
- [Changelog](https://github.com/Azure/setup-azd/blob/main/CHANGELOG.md)
- [Commits](Azure/setup-azd@634ad92...0b7e3a3)

Updates `actions/setup-node` from 4.4.0 to 7.0.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@49933ea...8207627)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: azure/login
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: Azure/setup-azd
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: tj-actions/changed-files
  dependency-version: 47.0.6
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [pypdf](https://github.com/py-pdf/pypdf) from 6.15.0 to 6.16.1.
- [Release notes](https://github.com/py-pdf/pypdf/releases)
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md)
- [Commits](py-pdf/pypdf@6.15.0...6.16.1)

---
updated-dependencies:
- dependency-name: pypdf
  dependency-version: 6.16.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Paul Lizer (paullizer) and others added 27 commits September 4, 2026 11:07
CodeQL flagged the Redis connection test as an information-exposure and
clear-text-logging source: the validation handler returned the exception text
to the browser, and both handlers interpolated the raw exception into log_event,
which CodeQL traces into the shared Application Insights sinks.

Both handlers now pass the exception through sanitize_log_message before
logging and reply with fixed messages. The route already returns specific 400s
for a missing host, key, or Key Vault secret name before reaching the factory,
so no actionable detail is lost.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
REDIS_TOKEN_REFRESH_BUFFER_SECONDS and _get_redis_entra_token_scope had no
callers outside functions_redis_client, so the back-compat re-export only
produced CodeQL py/unused-import noise. REDIS_ENTRA_TOKEN_SCOPE and
RedisManagedIdentityCredentialProvider are still re-exported because existing
callers and tests reference them through app_settings_cache.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CodeQL traced the interpolated exception message from the Redis connection test
into the shared Application Insights sinks as a clear-text-logging source, since
the failing call chain resolves an access key or Key Vault secret.

Both handlers now interpolate only the exception class name and pass
exceptionTraceback=True, so Application Insights still captures the full
exception and stack for diagnosis while no resolved credential material can
reach the log message. This matches the _safe_error_summary pattern already
used in functions_redis_monitoring.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CodeQL py/unused-import: REDIS_ENTRA_TOKEN_SCOPE and
RedisManagedIdentityCredentialProvider were re-exported for backward
compatibility, but no production module imported them through
app_settings_cache either before or after this change - on Development they
were referenced only inside app_settings_cache itself and by one test.

Both are dropped and the test now references them from functions_redis_client,
where they are defined. The create_redis_managed_identity_client wrapper is
kept, since app.py called it before this change.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…-migration

Add Azure Managed Redis support alongside Azure Cache for Redis
Ground segments commonly publish Yamcs through a reverse proxy, such as Apache,
that challenges every request with HTTP Basic authentication against a directory
before the request reaches Yamcs. Yamcs behind that proxy often has no
authentication of its own. The Yamcs action could authenticate to Yamcs but had
no way to answer a front-door proxy challenge, so such a server was unreachable
even when every Yamcs setting was correct.

Adds an optional Reverse Proxy Authentication layer, independent of the Yamcs
authentication method and off by default so a directly reachable server, such as
a local simulator, is unaffected.

Credentials can be entered inline, with the password stored in Key Vault, or
supplied by a reusable username/password identity. The proxy credential gets its
own identity reference, separate from the Yamcs credential, so one action can use
both and a rotating temporary password is maintained once under Workspace >
Identities instead of by editing the action.

Proxy Basic auth combines with the none and api_key Yamcs methods. It is blocked
for username_password and bearer_token: only one Authorization header can be
sent, and the Yamcs token exchange would itself be refused by the proxy. The rule
is enforced in the plugin, the health checker, the test-connection route, and the
action modal, so the conflict surfaces before an agent depends on it.

Implementation notes:

- yamcs-client 2.1.0 already ships BasicAuthCredentials, so no dependency change
  is needed. It is imported separately from the other credential classes so a
  deployment on an older client keeps working for every non-proxy method.
- basic_auth_password is registered in YAMCS_SENSITIVE_ADDITIONAL_FIELDS, which
  routes it through the existing Key Vault store, redact, retrieve, and delete
  handling.
- The proxy identity reference is resolved inside validate_action_identity_reference
  and hydrate_action_identity_reference, so personal, group, and global action
  paths pick it up unchanged. UI hydration returns the identity username but never
  its password.
- Turning the toggle off preserves the stored credential rather than blanking it,
  which would drop the Key Vault reference and orphan the secret.

Fixes #1435

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Validate the OAuth2 token endpoint when the token is fetched, not only when the
endpoint is saved. Checking at save time leaves the request itself unguarded,
because settings can be written by another path, restored from backup, or
changed after validation, so code scanning was right to call this a server-side
request forgery. The token URL is now revalidated against the same outbound
policy as the inference endpoint and the request runs on the same pinned
transport, so its addresses are validated at connection time.

That transport refuses redirects, which the previous code avoided on the stated
grounds that token endpoints commonly redirect. That reasoning was wrong:
redirects belong to the browser-based authorization-code flow, while a
client-credentials token endpoint answers a server-to-server POST with a JSON
body. A regression test now asserts a blocked token URL is refused before any
HTTP client is constructed.

Remove backtracking from the version-segment pattern. Its optional suffix could
begin with a digit, making it ambiguous with the preceding digits and quadratic
on a long run of them: 8,000 characters took about 0.19s to reject and now takes
0.0003s. Requiring the suffix to begin with a letter matches exactly the same
segments.

Move the auth-type constants and their normalizer to the provider registry so
validation no longer imports the authentication module. That removes the real
coupling behind several cyclic-import findings and lets the token fetch import
validation normally rather than through a deferred import whose comment would
otherwise have become untrue.

Drop genuinely dead imports, and declare the deliberate re-exports in
functions_model_endpoint_types with __all__, since functions_settings and the
provider tests import those constants through it. Close file handles in tests
and stop importing the same module both ways.

The remaining cyclic-import findings are pre-existing: the same single
nine-module cycle is present on Development, and none of the modules in this
change participate in an import-time cycle.

Refs #1228

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ease

Development published v0.261.010 and v0.261.011 for the Azure Managed Redis work
while this branch was using the same numbers, so both release-notes sections and
config.py collided.

Development's sections are authoritative and are kept exactly as published. This
branch's nine sections move above them, to v0.261.012 through v0.261.020, and
config.py becomes 0.261.020. The restored PR #1228 entry is renumbered too: its
original v0.261.010 claim was vacated when that PR was reverted, so it re-lands
alongside the fixes stacked on it.

Version references in this branch's tests and feature documentation are updated
to match, so each still names the version its behaviour ships in.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… through an exception'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Add HTTP Basic authentication to the Yamcs action for proxied servers
…ease

Development published v0.261.012 for the Yamcs basic authentication work while
this branch was using that number for the restored PR #1228 entry, so the
release notes and config.py collided again.

Development's sections are kept exactly as published. This branch's nine
sections shift up one, to v0.261.013 through v0.261.021, and config.py becomes
0.261.021. Version references in this branch's tests and feature documentation
move with them.

The sections belonging to this branch are now identified by content rather than
by a hardcoded list of numbers, so a further collision while this PR is open is
resolved the same way without guessing which sections are whose.

The generated release-notes pages are rebuilt from the merged source rather than
hand-resolved, since they are build output.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…nts-v2

Re-land Custom model endpoint provider with the provider-coverage gaps closed
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The delegated permission GUIDs in Initialize-EntraApplication.ps1 were
shifted by one entry, so the script configured permissions that did not
match the names it logged:

- "People.Read.All" used b340eb25-... which is actually User.ReadBasic.All
- "User.ReadBasic.All" used b4e74841-... which is actually User.ReadWrite

As a result People.Read.All was never granted, and User.ReadWrite - a
write scope the application never uses - was granted instead. The app
only requires User.Read, User.ReadBasic.All, People.Read.All and
Group.Read.All (see SCOPE in application/single_app/config.py).

All eight GUIDs verified against the Microsoft Graph service principal
oauth2PermissionScopes.

Bumps deployers/version.txt to 1.0.29.
Fix incorrect Microsoft Graph permission GUIDs in Entra app registration script
Preserve current Development export, approval, workflow, and streaming behavior while retaining fail-closed XSD ingestion and schema-validated XML publication.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Return only allowlisted XSD ingestion messages and status codes from chat uploads, with a safe fallback for unknown failures.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add XSD ingestion and schema-driven XML generation
postconfig.py provisioned and RBAC-granted a Redis cache but never wrote the
settings the application reads, leaving a placeholder:

    # Scale > Redis Cache
    # todo support redis cache configuration

The App Service only receives REDIS_ENTRA_TOKEN_SCOPE, and configure_sessions()
in app.py reads enable_redis_cache and redis_url from the Cosmos settings
document. Those stayed False and empty, so every deployment that enabled Redis
silently fell back to filesystem sessions and in-memory caching.

postconfig now writes enable_redis_cache, redis_url, redis_auth_type,
redis_service_type, redis_port and redis_key when the deployment provisioned a
cache. It is skipped when no cache was provisioned so an operator-configured
external Redis is preserved.

The Bicep redisCacheKind parameter uses managed/classic while the application
uses azure_managed_redis/azure_cache_for_redis, so the value is translated
rather than passed through. Writing it through unchanged would resolve the
wrong TLS port (10000 vs 6380).

Adds functional_tests/test_postconfig_redis_cache_configuration.py, which also
cross-checks the identifiers against the SERVICE_TYPE constants in
functions_redis_client.py so the two vocabularies cannot drift apart.

Bumps deployers/version.txt to 1.0.30.
Write Redis cache settings during post-deployment configuration
Fixes #1472

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…invites

Fix group-scoped conversation invite source storage
Fixes #1477

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Address CodeQL py/cyclic-import and py/side-effect-in-assert in PR #1478. Refs #1477.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Address CodeQL py/unused-import follow-up in PR #1478. Refs #1477.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[BREAKING] Fix cross-worker settings consistency and Redis Explorer
@Bionic711
Bionic711 marked this pull request as ready for review September 17, 2026 17:33
@Bionic711
Bionic711 merged commit 82498ff into Staging Sep 17, 2026
8 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants