Skip to content

Integrate Development updates into React V2 - #1508

Merged
Paul Lizer (paullizer) merged 309 commits into
paullizer-react-v2-uifrom
paullizer-development-rebase
Sep 21, 2026
Merged

Paul Lizer (paullizer) merged 309 commits into
paullizer-react-v2-uifrom
paullizer-development-rebase

Conversation

@paullizer

@paullizer Paul Lizer (paullizer) commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Bring the latest Development updates (f1be106e) into the existing React V2 work through a merge-preserving rebase and integration repairs. The base is paullizer-react-v2-ui, not Development or main.
  • Reconcile Microsoft 365 Run as selection, approval/sign-in waits, and durable workflow continuation across the backend and native React workflow UI, preserving cancellation and completed execution checkpoints. Run as edits now also participate in structured authoring history and the Flow preview's authored digest.
  • Retain Development's guarded Custom model clients, audited model budgets, authoritative settings writes, and screening/publication protections while restoring Custom embedding compatibility and native administration parity.
  • Recover historical merge-only documentation and regression coverage, and incorporate the target's M5B visual authoring and M5C cross-surface Undo/Redo without reverting the Development integration.

The current React V2 base (da39b2f6, including #1506 and #1507) is incorporated by merge commit ebffe973. Historical replay conflicts were distinguished from actual target-side changes using the preserved pre-rebase snapshot. The merge retains both parent histories and resolves the actual editor, version, and release-history overlaps.

Development's remote-only MCP policy is intentionally retained: local/STDIO MCP remains disabled. Only the PR head branch was pushed; Development, main, and the React V2 target branch were not modified.

Linked issue

N/A. This branch integration was requested directly; no associated issue was supplied.

Release Notes & Latest Features

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

The breaking-change flag calls out retention of Development's remote-only MCP policy for React V2 configurations that previously used local/STDIO MCP.

Is this visible to end users?

  • Yes
  • No

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

  • Yes
  • No

Should this become a Latest Feature card?

  • Yes
  • No
  • Already added

Screenshot needed for the card?

  • Yes
  • No
  • Attached

Version bump

  • application/single_app/config.py VERSION third segment bumped, or not needed because this is docs-only
  • deployers/version.txt bumped, or not needed because deployers/ was not changed

Application version: 0.261.124. The integrated deployer version is 1.0.31, compared with 1.0.26 on the React V2 target. Compiling the merged Bicep with version 0.44.1 reproduced the checked-in deployment JSON exactly; the subsequent authoring merge introduced no deployer changes.

Testing / validation

  • npm run build in application/v2_ui: final combined TypeScript and production build passed.
  • node --test across test_workflow_authoring_history.js, test_workflow_authoring_session.js, test_workflow_field_drafts.js, test_workflow_flow_authoring_commands.js, and test_workflow_m365_run_as_client.js: 147 passed.
  • python -m pytest -q functional_tests/test_workflow_flow_authoring.py functional_tests/test_workflow_authoring_history.py: 68 passed, including real preview/Save field parity and equal authored digests. The durable/M365 integration and continuation cases also passed (31).
  • The full combined Flow/history/M365 browser run passed 79 cases. Its sole remaining failure was a fixture that assumed only one group had eligible Run as accounts. After adding explicit second-group data and stricter scope assertions, all 26 affected/focused browser cases passed, including the remaining case, both scope-switch variants, Run as Undo/Redo, and all M365 authoring/runtime cases. Payload equality, stale-build guards, and other assertions remain enabled.
  • Earlier integration coverage passed: native M365 admin browser coverage (15), Classic embedding/capacity browser coverage (32), Classic editor Node coverage (15), and admin/connection regressions (71 tests plus 81 subtests).
  • Standalone route-policy scripts passed: test_route_blueprint_policy_inventory.py, test_route_unauthenticated_policy_contract.py, and test_route_policy_test_coverage.py under functional_tests/route_tests/.
  • python functional_tests/test_docs_app_surface_coverage.py and python functional_tests/test_docs_site_quality.py: 7/7 and 6/6 passed. Python syntax and whitespace checks passed, and the final merge changed only the 40 incoming paths plus directly related integration documentation and the scoped test fixture.

Validation used local browser fixtures and controlled service boundaries. No live Azure/Microsoft 365 operations or deployments were performed. The final authoring coverage includes the combined tree with #1506/#1507.

Documentation

  • Release notes updated, or not needed
  • Feature documentation updated, or not needed
  • Fix documentation updated, or not needed

A separate release-note entry for this integration was not added; the incoming M5C release entry and existing historical entries were retained. Integration decisions and validation are documented in docs/explanation/fixes/DEVELOPMENT_REBASE_INTEGRATION_FIX.md; workflow guides, Undo/Redo documentation, and the application-surface inventory remain aligned.

Security checklist

  • 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 September 5, 2026 10:48
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>
Make explicit action-type item policies authoritative during governance checks.
Previously, a feature-level allow could still permit an action type such as
Azure Maps even when an explicit personal_action_type policy existed with
allow_all=false and no allowed principals.

This updates action-type enforcement so:
- feature-level policy grants access only when no explicit item policy exists
- explicit item policies must pass once they are present
- empty explicit allowlists correctly block the targeted action type
[BREAKING] Fix cross-worker settings consistency and Redis Explorer
with an identity that lacks the required SimpleChat app role and show the current signed-in account on the access-denied page.
Promote Development to Staging (v0.261.027)
Use tenant-scoped Entra Cosmos access for managed-identity deployments without automatic firewall edits or silent key fallback. Scope hook environment lookups and POSIX role operations to the selected deployment.

Consolidate Redis configuration, publish settings through the shared fenced OCC store, and create only missing Search indexes from application schemas. Include Windows/POSIX execution and concurrency regressions plus deployment documentation.
Add v0.261.028 release notes and link the deployment fix documentation to issue #1489 and PR #1488. Refs #1489.
Promote Staging to main (v0.261.027)
Bumps the github-actions group with 1 update in the / directory: [azure/login](https://github.com/azure/login).


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

---
updated-dependencies:
- dependency-name: azure/login
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Reject explicitly empty nested source policies and non-boolean partial opt-ins, preserve recognized Analyze origin semantics, and keep the bounded reader additive to the committed keyword interface.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
React V2 already includes Analyze through workflow PR #1484. Resolve the original and cherry-picked history conflicts while preserving the integrated v0.261.112 tree unchanged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Make Analyze results readable and reusable across chat and workflows
Refs #1476

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Expose a dedicated settings tab, connect the V2 policy editor, reject failed saves truthfully, and include V2 sources in ACR builds. Refs #1476.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add matching custom rules and starter packs, gate optional AI configuration without clearing saved values, separate workspace model permissions, and show required baseline checks. Update documentation and application version to 0.261.108.

Refs #1476

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve screening holds across durable Analyze, concurrent model calls, checkpoint reuse, assistant publication, saved-result responses and exports. Retain embedding compatibility and workflow budget guards alongside strict screening credentials. Reconcile application version 0.261.113 and documentation inventory.

Refs #1476; updates #1485

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

Add content screening, document quarantine, and review workflows
Initialize a blank baseline on first activation and use normal upload processing until effective checks exist. Preserve existing holds, saved policies, and policy drafts across classic and React V2 settings changes.

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

Allow Content Screening to stay enabled with an empty policy
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Merge the current React V2 screening baseline, preserve screening-aware artifact delivery, and record scoped validation and live acceptance limits.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Integrate the current React V2 baseline and align the Analyze release, documentation and regression headers with the next patch version.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Stabilize Analyze planning, downloads, and mobile chat
Introduce opt-in v3 structured paths, typed conditions, scoped durable executions, exact result/publication identities, and native V2 List authoring and run inspection. Preserve legacy workflows and document the independently releasable M4A slice in application 0.261.116.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep document_results distinct from record collections when loading complete-record pages, with legacy and structured result-reader coverage.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add structured workflow control flow and V2 List tools (M4A)
Extend the merged M4A v3 runner with frozen authorized inputs, execution-scoped serial loops, exact paged Collect, locally metered reporting, admin item limits, and V2 List authoring and inspection. Preserve legacy contracts and defer M4C/M5. Bump application to 0.261.117.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add M4B serial workflow loops and exact Collect
Add opt-in Submitted, Approved, and Indexed-ready completion for native Analyze artifacts in structured workflows. Reuse exact publication receipts and native lifecycle proof across waits, retries, and worker restarts while preserving legacy behavior. Include List controls, closed regressions, documentation, and application version 0.261.118.

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

Add durable workflow publication completion policies (M4C-1)
Export complete saved workflow records as exact JSON through the shared generated-file framework, with source-bound recovery, authorized reads, and existing publication completion semantics. Add V2 List controls, regression coverage, and documentation; bump the application to 0.261.119.

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

M4C-2: publish exact saved workflow and Collect outputs
Implement typed state, frozen finite batch policy, durable manual continuation, mixed iteration identities, authorized inspection, and V2 authoring. Preserve the existing exact saved-record export and publication contracts. Bump the application to 0.261.120.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add saved, draft-preview, and exact frozen-run Flow views over the existing compiler and runtime. Reuse bounded execution inspectors, retain temporary layout isolation and source authorization, and add offline regression coverage and documentation for version 0.261.121.

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

Add read-only workflow Flow inspection (M5A)
Restore historical merge intent and integrate M365 durable workflows, guarded Custom embeddings, and native administration surfaces while preserving Development contracts.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve the verified Development integration while incorporating M5B visual authoring and M5C history. Retain Microsoft 365 Run as in history and preview contracts, with cross-surface and scoped browser regressions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@paullizer
Paul Lizer (paullizer) merged commit 1f6b444 into paullizer-react-v2-ui Sep 21, 2026
2 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