Release notes 0.250 series
SimpleChat release notes for 0.250.231 – 0.250.001.
Release notes 0.250 series
(v0.250.231)
Bug Fixes
- Missing Release Highlight Screenshots Now Display
- The Latest Release pages referenced 24 screenshots that were never present in the documentation site, so every one of them rendered as a broken image.
- The images already existed in the application at
application/single_app/static/images/features/, where the in-app Latest Features gallery reads them. They are now also published with the documentation site, so the release highlight pages show the same screenshots users see in the product. - (Ref:
docs/images/latest-release/,docs/_data/latest_release_features.yml, Latest Release highlight pages)
- Broken Documentation Links Repaired
- Fixed the remaining broken internal links on the documentation site. Links that pointed at renamed pages now resolve, and links that target files kept in the repository rather than published on the site, such as the Custom Pages developer guide, the Teams app manifest, and a CI workflow, now open on GitHub instead of returning a missing page.
- Removed two references to a ServiceNow multi-action setup guide that was never written.
- The documentation site now has zero broken internal links across 31,649 checked links.
- (Ref:
ui_tests/check_docs_links.js, ServiceNow guides, Custom Pages guide, upgrade paths guide)
(v0.250.230)
New Features
- Documentation Site Redesign
- The documentation site was rebuilt for search, navigation, page simplicity, mobile support, and content coverage.
- Search now indexes page content instead of titles only. Previously 84% of the 986 indexed pages were internal engineering notes, 88% of entries had no description, and no page body text was indexed at all, so a search for “agent” returned mostly internal fix notes. The index is now 165 entries with a description on every one and no engineering notes.
- Added a dedicated search results page with section filters and highlighted excerpts, a
Ctrl+Kshortcut, keyboard navigation, and a full-screen mobile search sheet. Search was previously hidden entirely on phones. - Navigation was rebuilt so the top bar and sidebar expose the same six sections: Start, Guides, Features, Administration, Deploy and operate, and Reference. Coverage went from 27 links to 74, all verified to resolve.
- (Ref:
docs/search-index.json,docs/assets/js/search.js,docs/_config.ymlnavigation,docs/search.md)
- Screenshot and Video Placeholders for Documentation
- Documentation pages can now declare a screenshot or video slot. When the asset does not exist yet the page renders a visible card naming the exact file path to create; adding the file at that path replaces the placeholder automatically on the next build with no configuration or code change.
- Videos render as a local poster card that links out to YouTube or Microsoft Stream, so no video files are committed to the repository and no third-party embed scripts are loaded.
- Added a media status page listing every slot and whether it is filled, as a capture worklist for contributors.
- (Ref:
docs/_includes/media.html,docs/_data/media.yml,docs/contributing/media-status.md)
- Complete Documentation Coverage of the Application
- Added one page per admin settings tab covering what the tab controls, why it matters, every setting with its default and governing settings key, prerequisites, and the common tasks admins perform there.
- Added task guides for creating actions, agents, agents with actions, multi-task workflows, triggering workflows, file sync connectors, tags, tags in chat, tags on conversations, and exporting conversations, plus further guides derived from the application surface. Each guide explains what the task does and why before the steps.
- Added a chat interface reference covering all 47 chat controls and an action reference covering all 27 actions.
- Added a feature catalog in which every one of the 111 capability toggles is claimed by exactly one capability entry.
- (Ref:
docs/admin/,docs/guides/,docs/reference/chat-controls.md,docs/reference/actions/,docs/_data/features.yml)
- Documentation Coverage Enforcement
- Added a generated inventory of the application surface and functional tests that fail when a new capability toggle, admin settings tab, action plugin, or chat control ships without documentation, so coverage stays complete as changes land.
- (Ref:
scripts/build_docs_inventory.py,functional_tests/test_docs_app_surface_coverage.py,functional_tests/test_docs_site_quality.py)
User Interface Enhancements
- Documentation Site Works on Phones and Tablets
- Standardized the responsive breakpoints, which previously mixed
768pxand767.98pxand left gaps, and exported the desktop breakpoint to JavaScript so it is no longer duplicated by hand. - Wide tables and long code blocks are now contained in horizontal scroll regions instead of widening the page, images are lazy-loaded with intrinsic sizing, touch targets meet a 44px minimum, and the mobile navigation drawer and search sheet trap and restore focus.
- Verified with browser tests at 360x640, 390x844, 768x1024, 1280x800, and 1920x1080.
- (Ref:
docs/assets/css/main.scss,docs/assets/js/sidebar.js,ui_tests/test_docs_site_responsive.js)
- Standardized the responsive breakpoints, which previously mixed
- Simpler Documentation Pages
- Landing pages were rewritten from hand-written HTML card markup into plain markdown. The home page previously had 82 blocks of card markup and zero markdown headings, and the features page 119 blocks and zero headings, which meant neither page had a working “On this page” table of contents or heading anchors.
- The FAQ was rebuilt so every question is its own heading with a linkable anchor.
- The decorative page hero, with its gradient banner, pill row, and icon orb, was replaced with a plain documentation header across the 38 pages that used it.
- Split the 452 KB release notes page into per-version-series pages while keeping the existing release notes URL working.
- (Ref:
docs/index.md,docs/features.md,docs/start/faqs.md,scripts/build_release_notes_pages.py)
- Documentation URLs Now Match Their Section
- Guides previously lived under three different URL spaces that all meant the same thing. Tutorials and how-to guides are consolidated under
/guides/, orientation pages moved under/start/, deployment scenarios under/deploy/, and reference pages under/reference/. - Existing links and bookmarks continue to work. Every moved page redirects from its old URL, and the URLs the application itself links to were deliberately left unchanged.
- (Ref: documentation navigation,
jekyll-redirect-from,ui_tests/check_docs_links.js)
- Guides previously lived under three different URL spaces that all meant the same thing. Tutorials and how-to guides are consolidated under
Bug Fixes
- Documentation Site No Longer Overflows Horizontally on Desktop
- The main content region combined a full-width rule with a sidebar offset, so every desktop viewport scrolled sideways by exactly the sidebar width. This was a long-standing defect on the published site.
- (Ref:
.docs-main-content,docs/assets/css/main.scss)
- Documentation Section Labels and Page Titles
- Path-scoped Jekyll defaults used collection names as their type and therefore never applied, so nearly every page fell back to a generic “Docs” section and search facets were meaningless. Three scenario index pages also had a comment above their front matter, so it was never parsed and they were titled with their own file path and rendered through an empty layout.
- (Ref:
docs/_config.ymldefaults,docs/explanation/scenarios/)
- Documentation Site Loads No Third-Party Assets
- Removed jQuery, DataTables, marked, DOMPurify, and split.js, none of which the site used, and vendored Bootstrap, Bootstrap Icons, Prism, Lunr, and the site fonts locally with their licenses. The site now makes zero external requests.
- (Ref:
docs/assets/vendor/,docs/_layouts/default.html, local browser asset policy)
(v0.250.229)
Bug Fixes
- Admin Latest Features Previous and Archive Preview Restored
- The read-only user-facing preview panel in Admin Settings > Latest Features never rendered, because it sat inside a disabled template block that also holds the legacy hardcoded feature cards from before the tab became data-driven.
- The admin route was already computing and passing
support_latest_feature_release_groups_previewfor a panel that could never display, so admins had no way to review previous and archive release cards alongside their sharing status. - Closed the disabled block after the legacy cards so the preview panel renders again, and namespaced its element ids to avoid colliding with the admin release-group cards.
- (Ref:
admin_settings.htmlLatest Features tab,support_latest_feature_release_groups_preview,route_frontend_admin_settings.py)
- Latest Features Sidebar Card Id Special Case Removed
- The admin sidebar built the previous-release section link through a redundant conditional that produced the same id as the general dynamic expression.
- Simplified to the dynamic form so every non-current tier, including the new archive tier, is handled the same way.
- (Ref:
_sidebar_nav.html, admin Latest Features navigation)
- Orphaned Latest Features Metadata Tables Removed
- Removed
_SUPPORT_CURRENT_FEATURE_IMAGE_METADATAand_SUPPORT_CURRENT_FEATURE_USER_METADATAalong with the two helpers that consumed them. Their keys matched no feature id in any release tier, so both helpers were no-ops, and the_CURRENT_naming became misleading after the release tiers shifted. - Verified behavior-neutral: the full serialized catalog output across every accessor and several settings permutations is byte-identical before and after removal.
- Added a regression test that generically detects orphaned per-feature metadata tables, so this class of drift is caught in future rather than only these two names.
- (Ref:
support_menu_config.py,test_support_menu_config_dead_metadata_removal.py)
- Removed
- Citations and Source Rendering
- Citation parsing preserves line breaks after inline citations, agent document search results render as document sources, retrieved and cited sources remain separated, prior grounded references resolve in follow-up turns, and source-reading intent is no longer misclassified as artifact generation.
- (Ref: citation parser, agent document search, grounded source references, generated artifacts)
- Shared Conversations and Conversation Forks
- Shared conversations load, render messages, generate AI responses, refresh uploads/task documents, and survive Blueprint security hardening.
- Forking from group/public workspace knowledge no longer returns HTTP 500, and structured logging normalization prevents logger errors from replacing HTTP responses.
- (Ref: shared conversations, streaming bridge, conversation fork, structured logging)
- Workflow Execution Reliability
- File Sync summaries reach task-based workflow models, task instructions scope document search queries, run history preserves per-task document status, zero-retry settings persist, and invalid task document actions are contained.
- (Ref: workflow execution, task document status, retries, File Sync summaries)
- Backup, Restore, and Data Management Reliability
- Backup ETag normalization, Cosmos pagination, checkpoint batching, and provider status diagnostics improve backup completeness and troubleshooting.
- (Ref: Data Management backup, Backup Inventory, Cosmos pagination, checkpoint batching)
- Tabular Analyze/Search Durability
- Exhaustive Markdown output includes all rows, line-phrased requests route to the durable pipeline, artifact lifecycle finishes before run completion, stale settings migrations correct disabled preflight flags, and
filter_rows containssemantics match across foreground and durable paths. - (Ref: tabular analyze, durable preflight, generated artifacts, filter_rows)
- Exhaustive Markdown output includes all rows, line-phrased requests route to the durable pipeline, artifact lifecycle finishes before run completion, stale settings migrations correct disabled preflight flags, and
- Document Extraction and Grounded Search
- Legacy DOC/PPT embedded images are analyzed, image chunks merge into the correct surrounding-text chunk, document picker search matches file names, and multi-word grounded queries support punctuation word breaks.
- (Ref: embedded images, chunk placement, document picker search, grounded search)
- Cosmos, Redis, and Cache Performance
- Settings container idle RU usage is reduced, no-op read invalidation is skipped, Docker multi-worker startup conflicts recover, DAI Redis TTLs are bounded/refreshed, cache invalidation fails closed on unknown safety state, and cache parity improves for pending shared documents, legacy revisions, and generated-artifact identity.
- (Ref: Cosmos RU usage, conversation cache invalidation, DAI Redis cache, public workspace artifacts)
- Authentication and Security
- Credential-like field names are no longer logged in clear text, action secret references are scoped to their owning action, Terms of Use redirects happen server-side with HTTPS enforcement, and
/getATokenwithout an authorization code redirects to sign-in. - (Ref: credential redaction, action secrets, Terms of Use, authentication redirects)
- Credential-like field names are no longer logged in clear text, action secret references are scoped to their owning action, Terms of Use redirects happen server-side with HTTPS enforcement, and
- Model Endpoints and MCP Outbound
- Managed identity cloud values are normalized, vision test connection uses the correct multi-endpoint target, GPT 5.6+ models appear in the multi-modal vision selector, and MCP tool arguments no longer get wrapped in incompatible
kwargspayloads. - (Ref: model endpoints, vision selector, managed identity, MCP outbound)
- Managed identity cloud values are normalized, vision test connection uses the correct multi-endpoint target, GPT 5.6+ models appear in the multi-modal vision selector, and MCP tool arguments no longer get wrapped in incompatible
- Governance, Navigation, and Admin Settings
- Retargeting policies no longer creates duplicates, block-list modals stack correctly, Group Workflows appears in the sidebar, hidden tabs hide sidebar links, logo/favicon save paths no longer 500, and update banner version comparison no longer shows stale releases as newer.
- (Ref: governance policies, workspace sidebar, admin settings, update banner)
- Retention, Notifications, Logging, and Public Workspace Edge Cases
- Group and collaboration conversations now use correct retention policy/activity timestamps, unauthenticated pages avoid notification polling 401 noise, Application Insights events carry sanitized diagnostic values with standardized tags, custom Databricks-prefixed plugin discovery avoids built-in defaults, and hidden public workspace documents can ground chat searches.
- (Ref: retention policy, notification polling, Application Insights logging, plugin discovery, public workspace search)
Detailed Change Log (v0.250.003 - v0.250.229)
The individual patch builds consolidated into v0.260.001 are preserved below for traceability.
(v0.250.229)
Bug Fixes
- Citations No Longer Eat the Line Break After Them
- Text that came after an inline document citation was jammed onto the end of the closing parenthesis instead of starting a new paragraph — you would see
(Source: uploading_documents.md, Page: 1)Thank you, Paul.with no break at all. - The citation parser matched the
[#citation-id]marker along with the whitespace that followed it, then rebuilt the citation without putting that whitespace back. Because this runs on the raw markdown before it is rendered, a deleted blank line did not just remove a space — it changed how the rest of the block was read, so a paragraph after a cited list item got absorbed into the list item itself. - Spacing is now restored exactly as the model wrote it. Paragraphs, bullets, and numbered lists after a citation render in their intended structure, a citation followed by more text on the same line keeps its space, and back-to-back citations stop colliding. Copied and exported message text keeps its line breaks for the same reason.
- The cleanup pass for leftover citation markers had the same flaw in reverse and could swallow the blank line before a stray marker. It now only removes horizontal spacing, or the marker’s whole line when it sits on one.
- (Ref: #1289,
chat-citations.js,parseCitations(), chat message rendering)
- Text that came after an inline document citation was jammed onto the end of the closing parenthesis instead of starting a new paragraph — you would see
(v0.250.228)
Bug Fixes
- Figures Now Stay in the Chunk They Came From
- Images extracted from Word and PowerPoint files were appended as extra chunks at the end of the document, with page numbers continuing past the real content. A figure on page 5 of a 15-page document became chunk 16, so a search hit on the figure lost its surrounding text and citations pointed at a page that did not exist.
- Embedded images are now merged into the chunk containing the text they appear with. PowerPoint images follow the slide that references them; Word images are placed by their position in reading order; and legacy
.docand.pptimages, which carry no recoverable position, anchor to the final chunk instead of creating a page beyond the document. - Merging rather than adding a chunk also removes a latent indexing hazard: chunk ids are derived from the page number, so a second chunk sharing a page number would have overwritten the first in the search index.
- PDFs were already correct — Content Understanding attributes each figure to its page by span, and Document Intelligence Layout inlines tables and figures into the page markdown. That behavior is unchanged and now covered by a regression test.
- Existing documents keep their current chunks until they are extracted again. Use Change Extraction or re-upload to pick up the new placement.
- (Ref: #1277,
functions_documents.py,functions_office_media.py, figure chunk association)
(v0.250.227)
Bug Fixes
- Shared Conversation Stream Errors Stay Attached to the Shared Conversation
- Follow-up hardening to the v0.250.224 shared conversation fix. When an AI request in a shared conversation failed, the error the browser received did not say which kind of conversation it belonged to, so the recovery path could have reloaded from the personal endpoint and produced the same “Conversation not found” error that was just fixed.
- It could not actually happen yet because of an unrelated guard, but it would have come back the moment anyone added a message id to those errors. All shared stream failures now go through a single serializer that always tags the conversation, and a test walks the code to prove no failure path can skip it.
- (Ref: #1281,
route_backend_collaboration.py,chat-streaming.js, collaborative AI streaming)
- Repaired Route Assertions Across the Test Suite
- The recent Blueprint security hardening renamed how routes are declared, but 82 assertions across 40 test files still checked for the old form. Those tests were failing on the rename before they ever reached the behavior they were written to protect.
- This is how the shared conversation streaming bug reached users: the test guarding that exact code path was already red for an unrelated reason. 59 assertions across 32 files were corrected, each verified against a real route first. 14 were deliberately left alone because they point at routes that no longer exist, which is a separate issue worth investigating rather than hiding.
- (Ref: #1281,
functional_tests/, Blueprint route registration)
(v0.250.226)
Bug Fixes
- File Sync Now Tells the Workflow What Changed
- File Sync builds a summary of each run — the scan counts plus every new or changed document — but that summary never reached the model in any workflow that uses tasks, which is every workflow the builder creates.
- The failure was silent and misleading: the summary was written into the conversation, so the transcript showed the changed-document list as though the model had received it. In practice the model saw only the raw task instructions and usually replied that it knew nothing about any documents.
- This hit Monitor File Sync Changes workflows hardest, along with any workflow using Search or no document action, or with Use changed documents turned off. The first task in the sequence now receives the summary, and later tasks get it through the first task’s response.
- The summary is also bounded now, with a clear truncation notice, so a very large sync cannot crowd out the actual instructions.
- (Ref: #1285,
functions_workflow_runner.py, File Sync prompt context)
- Document Search Queries Are No Longer Diluted by Injected Context
- A workflow’s document search used the entire task prompt as its search query, including the File Sync summary and the previous task’s full response. A search for “find the renewal clause” could end up querying 50 lines of file paths.
- Search queries now use the task’s own instructions. Retrieved content and context still reach the model exactly as before — only the query is scoped.
- (Ref: #1285,
functions_workflow_runner.py, workflow document search)
(v0.250.225)
New Features
- Workspace Documents Are Now Configured Per Workflow Task
- Each task in a workflow now owns its own Workspace documents setup — document action, document target, selected documents, Compare source and targets, per-document analysis, and windowing — instead of sharing one configuration across the whole workflow.
- Adding a task resets the document fields, and returning to a previously configured task restores that task’s setup, so tasks are self-contained.
- Every task now executes with its own document action at run time. Previously the single workflow-level action only ever applied to task 1, and every later task ran with no document context.
- Existing workflows keep working: their saved document action is inherited by task 1 only, matching how they actually ran. Group workflows still force every task into the owning group workspace.
- Task cards and the Review step now summarize which documents each task uses.
- (Ref: #1282,
workspace_workflows.js,functions_personal_workflows.py,functions_group_workflows.py,functions_workflow_runner.py, per-task document actions)
Bug Fixes
- Workflow Document Picker No Longer Hangs on “Loading tags…“
- Choosing a Document action of Search, Analyze, or Compare in the workflow builder revealed the document picker but never loaded it. Tags stayed disabled showing
Loading tags...forever, the document list stayed empty, and no console error appeared. - The picker was only ever loaded when the modal opened, and that path returned early whenever the action was
No document action— which is always true for a new workflow. The Document action dropdown’s change handler only toggled visibility and never triggered a load. - Changing the Document action or Document Target now loads the picker, and the tags control always resolves to the available tags or
No tags available for this scope. - (Ref: #1282,
workspace_workflows.js,chat-documents.js, workflow document picker)
- Choosing a Document action of Search, Analyze, or Compare in the workflow builder revealed the document picker but never loaded it. Tags stayed disabled showing
- Workflow Run History No Longer Masks a Failed Document
- When two tasks in the same run process the same document, the later task’s status used to overwrite the earlier one’s, so a document that failed in one task could be shown as succeeded.
- Document run items are now recorded per task, and each item records which task produced it.
- (Ref: #1282,
functions_workflow_runner.py, workflow run history)
- Resume Failed Items Respects Per-Task Documents
- Resuming failed documents narrowed only the workflow-level document action. Now that tasks own their own documents, it also narrows each task’s analyze action to the documents that failed in that task, and group resumes keep every task inside the owning group workspace.
- (Ref: #1282,
route_backend_workflows.py, resume failed items)
- A Workflow Task Configured for Zero Retries Per Window Stays at Zero
- Saving a multi-task workflow rewrote a stored
Retries Per Windowof0to1on any task other than the one being edited. - (Ref: #1282,
workspace_workflows.js, retries per window)
- Saving a multi-task workflow rewrote a stored
- An Invalid Task Document Action No Longer Aborts the Whole Run
- If a workflow’s document action stopped validating between runs — for example an administrator disabled Analyze or Compare, or lowered the workflow document limit — the run failed outright with no task-level error recorded.
- The failure is now contained to that task and follows the workflow’s retry and failure-handling settings.
- (Ref: #1282,
functions_workflow_runner.py, workflow task error handling)
User Interface Enhancements
- “Refresh documents” Now Actually Refreshes
- The Refresh selected documents button previously warned
Select one or more workspace documents in the picker first.even though the picker was empty and nothing could be selected. - It is now labeled Refresh documents, reloads the document list while preserving the current selection, and reports what it found — including a clear message when the selected scope has no documents.
- (Ref: #1282,
workspace.html,group_workspaces.html,workspace_workflows.js)
- The Refresh selected documents button previously warned
(v0.250.224)
Bug Fixes
- Shared Conversations Load and Answer Again
- Sharing a personal conversation left it unusable. Every reload or click on the shared conversation raised a “Conversation not found” error, because the chat page was still asking for its messages from the personal conversation endpoint — and a shared conversation is stored separately, under its own id.
- Shared conversations now load their messages only from the collaboration endpoint, so the failed request and the error banner are gone.
- (Ref: #1281,
chat-conversations.js,chat-collaboration.js, shared conversation loading)
- AI Responses Work Again in Shared Conversations
- Asking the AI anything in a shared conversation failed immediately with “Stream interrupted: Chat streaming endpoint is unavailable” and no answer was ever generated.
- The recent Blueprint security hardening renamed the internal chat streaming endpoint, and the shared-conversation bridge was still looking for the old name. The bridge now resolves the endpoint correctly and logs a diagnostic if it ever cannot, so this fails loudly instead of silently. Group shared conversations are restored by the same fix.
- (Ref: #1281,
route_backend_collaboration.py,app.py, collaborative AI streaming)
- Chat Uploads and Task Documents in Shared Conversations
- Files uploaded inside a shared conversation never showed up in the Analyze and Compare document pickers, and task documents from the previously opened conversation stayed attached after switching to a shared one.
- Shared conversations now refresh both when their messages load, matching personal conversation behavior.
- (Ref: #1281,
chat-collaboration.js,chat-messages.js, Compare and Analyze document pickers)
New Features
- Optional Mathematical Formula Extraction
- Added an Extract mathematical formulas toggle to the Document Intelligence settings. When enabled, equations in PDFs and images are captured as LaTeX instead of being approximated as OCR text.
- This requests a billed Document Intelligence add-on, so it is off by default and must be turned on deliberately. It applies to the Layout model only, so it has no effect while extraction is set to Standard.
- (Ref: #1277,
functions_content.py,functions_settings.py,admin_settings.html, Document Intelligence formulas add-on)
Bug Fixes
- Images in Legacy
.docand.pptFiles Are Now Analyzed- Embedded image analysis previously covered only DOCX and PPTX, because legacy Office files are OLE compound documents rather than zip packages and have no media parts to enumerate.
- Pictures and embedded equation previews are now carved out of the legacy container by metafile signature, using the length recorded in the metafile’s own header, then rasterized and analyzed like any other embedded image.
- Validation is strict — record type, signature position, and a length that fits the remaining bytes — so a coincidental byte sequence is not mistaken for an image. Duplicate images are still collapsed and the per-document cap still applies.
- (Ref: #1277,
functions_office_media.py,functions_documents.py, legacy Office image extraction)
(v0.250.223)
Bug Fixes
- Diagrams in Word and PowerPoint Files Are Now Analyzed
- Images embedded in Office documents as EMF or WMF metafiles were silently skipped. Word stores pasted diagrams, SmartArt, Visio drawings, and charts in this format, so architecture diagrams — often the most information-dense figures in a document — were never analyzed or indexed.
- Metafiles are now rasterized in-process and sent to the configured extraction engine like any other image. Text drawn inside the diagram is recovered as well, so figure labels such as service and resource names become searchable even when the vision engine returns no description.
- The renderer is pure Python on top of Pillow, with no system packages or external converters, so it behaves the same in the Linux container as it does locally. Fidelity is intentionally a description aid rather than a pixel-accurate reproduction; unsupported drawing records are skipped rather than failing the document.
- (Ref: #1277,
functions_emf_render.py,functions_office_media.py, embedded Office image analysis)
- Embedded Image Processing Is Now Visible in the Workspace Log
- A document whose images were all skipped looked exactly like a document with no images at all, so there was no way to tell whether embedded image analysis had run.
- Processing now reports how many embedded images were found, how many were analyzed, and why any were skipped — too small, duplicates, unsupported format, or over the per-document cap. Progress is reported per image rather than only once at the start.
- The found, analyzed, and skipped counts are stored on the document so the outcome can be confirmed after processing completes.
- (Ref: #1277,
functions_documents.py,functions_office_media.py, embedded image diagnostics)
(v0.250.222)
New Features
- Index Auto-Login
- Added an opt-in
ENABLE_AUTO_LOGIN_ON_INDEXsetting that redirects unauthenticated home-page visits to the existing Microsoft Entra sign-in flow. - Supports government tenant SSO scenarios where users already have a browser session and should enter SimpleChat without first clicking the sign-in link.
- (Ref:
app.py,config.py,INDEX_AUTO_LOGIN.md, Microsoft Entra sign-in)
- Added an opt-in
(v0.250.221)
New Features
- Enhanced Extraction Now Uses Azure AI Content Understanding
- Enhanced extraction for PDFs and images now uses Azure AI Content Understanding (
prebuilt-documentSearch) instead of Document Intelligence Layout. In addition to tables, page structure, and checkbox states, it returns AI-generated descriptions of figures, charts, and diagrams — structure Document Intelligence never produced. - Standard extraction is unchanged and always uses Document Intelligence, which remains required for workspaces and chat file uploads.
- A new Enable Enhanced extraction toggle in Admin Settings reveals the Content Understanding configuration. Turning it on defaults the extraction mode to Auto, so documents are only upgraded when the sample shows structure worth paying for.
- Content Understanding supports both key and managed identity authentication, with a Test Connection button and an in-app setup guide covering Foundry resource creation, supported regions, required model deployment defaults, and the Cognitive Services User role.
- Enhanced never becomes a hard dependency. Content Understanding is not offered in Azure Government, so Enhanced automatically uses Document Intelligence Layout in Government and custom clouds — the admin UI says so plainly and there is nothing to configure there. Enhanced also falls back when Content Understanding is unconfigured or a request fails, and the reason is recorded on the document and shown in workspace tooltips.
- (Ref: #1277,
functions_content_understanding.py,functions_content.py,functions_settings.py,route_backend_settings.py,admin_settings.html,CONTENT_UNDERSTANDING_ENHANCED_EXTRACTION.md)
- Enhanced extraction for PDFs and images now uses Azure AI Content Understanding (
- Images Inside Word and PowerPoint Files Are Now Analyzed
- Neither extraction engine describes figures inside Office files, so SimpleChat now pulls embedded images out of DOCX and PPTX packages and analyzes them with whichever engine backs the selected extraction mode — Content Understanding when Enhanced is active, Document Intelligence otherwise. This works with Standard extraction too.
- Each analyzed image is indexed as its own citable chunk, and PowerPoint images are attributed to the slide that references them.
- Cost is bounded by design: icons, bullets, and spacer graphics are filtered out by a configurable minimum size, byte-identical images such as repeated header logos are analyzed once, and a per-document cap limits the total.
- Uploaded Office files are treated as untrusted: extracted file names are generated rather than reused from the archive, entries are streamed with a hard byte ceiling instead of trusting the archive’s declared size, compression methods and entry counts are bounded, and slide relationship parts are parsed with a hardened XML parser.
- Can be turned off entirely with Analyze images embedded in DOCX and PPTX files. Image analysis failures never fail the document.
- (Ref: #1277,
functions_office_media.py,functions_documents.py, embedded Office image analysis)
Upgrade Notes
- Existing Enhanced and Auto Deployments Keep Their Setting
- The new Enable Enhanced extraction toggle defaults to off, so deployments already set to Enhanced or Auto are migrated automatically on first settings read: the toggle is switched on and persisted, preserving the previously selected mode.
- Without this migration an upgrade would have silently downgraded those deployments to Standard and then overwritten the stored mode on the next settings save.
- (Ref: #1277,
functions_settings.py,get_settings()migration)
User Interface Enhancements
- Extraction Badges Name the Engine That Actually Ran
- Extraction tooltips in personal, group, and public workspaces now say whether a document was processed with Azure AI Content Understanding or Document Intelligence Layout, and explain any fallback that occurred.
- The Change Extraction action now works for images as well as PDFs, and refuses a change to Enhanced while Enhanced extraction is disabled.
- (Ref: #1277,
workspace-documents.js,public_workspace.js,group_workspaces.html,functions_documents.py)
- Auto Mode Also Upgrades for Figures
- Auto mode still samples the first pages with Document Intelligence Layout as the cheaper detector, but now upgrades to Enhanced when it finds figures or images, not just tables and selection marks. This matters because figure description is the main reason to use Enhanced.
- (Ref: #1277,
functions_documents.py, Auto mode detection)(v0.250.220)
Bug Fixes
- Data Management History Failure Diagnostics
- Backup Inventory and Job History failures returned a generic 503 telling admins to review application logs, while the logs recorded only the exception class name. The provider status code and message were discarded, making the failure impossible to diagnose.
- Failures now log the Cosmos status code and sanitized provider message. Provider text stays in operator logs and is never returned to the browser.
- (Ref: #1275,
functions_data_management.py,route_backend_data_management.py, Data Management history)
- Data Management History Throttle Handling
- Throttled history reads previously produced the same opaque error as a permanent failure.
- Cosmos throttling is now detected, retried up to three times with jittered backoff, and reported as temporary busy guidance with a retryable flag instead of a generic error.
- (Ref: #1275,
functions_data_management.py, Cosmos history query retry)
- Data Management History Index Guidance
- Missing-index detection required the exact phrase “composite index”, so equivalent provider wording fell through to the generic error.
- Detection now also matches
ORDER BYfailures reported as having no corresponding index, keeping the Cosmos indexing maintenance guidance actionable. - (Ref: #1275,
functions_data_management.py, Cosmos indexing maintenance)
- Source Blob Backup ETag Failure
- Fixed every source blob failing backup with “Source blob changed while it was being backed up”, which meant user documents, group documents, public documents, and chat attachments were never actually backed up.
- Root cause was comparing an ETag from
list_blobs()(unquoted XML element) against one fromget_blob_properties()(RFC-quoted HTTP header); the two never matched, so the post-transfer consistency check always failed after the blob had already been downloaded and uploaded. - Both values are now normalized before comparison. The precondition sent to Azure is unchanged, and a genuine mid-transfer source change is still rejected.
- (Ref: #1271,
functions_data_management.py, source blob transfer verification)
- Source Blob Backup Checkpoint Throughput
- Source blob backups previously wrote one Cosmos checkpoint per blob, capping throughput at roughly six items per second and stretching a single container to over an hour.
- Checkpoints are now batched per 100 items or 15 seconds, whichever comes first, while still asserting the job lease on every item.
- (Ref: #1271,
functions_data_management.py, source blob checkpointing)
- Functional Tests Silently Passing Under pytest
- Backup functional tests written with the try/except and
return Falsetemplate were reported as passed by pytest because they returned a value instead of raising. - The backup ETag and Cosmos pagination test files now assert directly, so real failures are reported by both pytest and standalone execution.
- (Ref: #1271,
test_data_management_backup_source_blob_etag.py,test_data_management_backup_cosmos_pagination.py)
- Backup functional tests written with the try/except and
(v0.250.219)
Bug Fixes
- Agent Document Search Now Produces Real Document Citations
- Documents an agent retrieved through the document search action are now recorded as document sources instead of only as an agent tool call. Previously they appeared solely as a raw JSON tool modal, so the documents were missing from the message Sources disclosure, were not clickable, never opened in the enhanced citation viewer, and could never reach the Used documents drawer.
- Covers all three document search functions — relevance-ranked search, ordered chunk retrieval, and document summarization — across personal, group, and public workspaces.
- Document search results now carry a ready-to-copy citation value, and the action instructs the model to reuse it verbatim. When the answer cites a document, it is correctly separated from the retrieved sources and recorded in the conversation’s used documents.
- Applies to streaming and non-streaming chat, document actions, cancelled and interrupted streams, and scheduled workflow runs.
- Retrieved sources are deliberately not capped, so a search that sources hundreds of chunks records all of them. Chunks retrieved by both the document search toggle and an agent are listed once.
- Cancelled and interrupted streams keep the documents the agent had already retrieved, and citation locations no longer relabel a valid page or sequence of
0as page 1, which affected video chunks keyed by second. - Workspace capability metadata now reports document usage for agent-only document turns, which previously under-reported as unused.
- (Ref: #1239,
functions_agent_document_citations.py,route_backend_chats.py,functions_workflow_runner.py,document_search_plugin.py,AGENT_DOCUMENT_SEARCH_CITATION_FIX.md)
User Interface Enhancements
- Collapsed Long Source Lists
- The per-message Sources disclosure now shows the first 25 document sources and collapses the rest behind a Show N more sources control, so an agent that retrieves hundreds of chunks no longer floods the panel.
- No source data is discarded — the full set is still stored, exported, and available for citation matching.
- (Ref: #1239,
chat-messages.js,chat-citations.js)
(v0.250.218)
Bug Fixes
- Credential Field Names Logged in Clear Text
- Fixed a gap where credential values could be written to application logs and Application Insights in clear text. The log redactor matched only a fixed list of key-name substrings, so field names this codebase actually uses for secrets were missed. The most significant were
auth_key, used by the action connection-test routes for the caller-supplied secret, and the plugin manifest’sauth.key, which holds connection strings and service principal passwords. - Eighteen credential key names were affected in total, including
pwd,key_pair,master_key,primary_key,secondary_key,encryption_key,signing_key,session_key, andstorage_key. - Benign configuration keys that merely contain the word “key”, such as
key_encoding,key_prefix_hints, andpartition_key_path, deliberately stay visible so logs keep their diagnostic value. - (Ref:
functions_appinsights.py,test_log_credential_key_redaction.py,LOG_CREDENTIAL_KEY_REDACTION_FIX.md)
- Fixed a gap where credential values could be written to application logs and Application Insights in clear text. The log redactor matched only a fixed list of key-name substrings, so field names this codebase actually uses for secrets were missed. The most significant were
- CosmosClient Import Bindings in Helper Scripts
- Completed the v0.250.047 import-binding cleanup by updating the two remaining scripts that bound
CosmosClientdirectly, so patchingazure.cosmos.CosmosClientis observed consistently. No directCosmosClientimports remain in the repository. - (Ref:
scripts/resolve_multiendpoint_gpt.py,deployers/bicep/postconfig.py)
- Completed the v0.250.047 import-binding cleanup by updating the two remaining scripts that bound
- Privacy Logging Audit Test Restored
- The privacy logging and telemetry audit had been failing since v0.242.072 because it asserted an exact
config.pyversion and never reached its assertions. It now asserts a version floor, per the repository’s version-assertion guidance, so the audit runs again. - (Ref:
test_privacy_logging_telemetry_audit.py)
- The privacy logging and telemetry audit had been failing since v0.242.072 because it asserted an exact
(v0.250.217)
New Features
- Test Connection for Eight More Action Types
- Added a Test Connection button to the Step 3 configuration for OpenAPI, Azure Maps, Blob Storage, Databricks, Log Analytics, MCP, Snowflake, and Tableau actions. Previously only SQL, Cosmos DB, Yamcs, and RocksDB actions could be validated before saving.
- Each test authenticates with the credentials entered in the modal and performs one lightweight read against the configured resource, so a wrong warehouse ID, container name, subscription key, personal access token, or MCP endpoint is caught immediately instead of failing later during a chat.
- Failures name the cause — rejected credentials, a missing warehouse or container, an unreachable host, or a driver that is not installed — and successes report useful detail such as the Databricks warehouse state, the Snowflake version, the Tableau API version, or the MCP tool count.
- Editing an existing action works without retyping credentials: masked secrets and reusable workspace identities are resolved server-side for the test only, and no credential value is ever returned to the browser.
- The MCP test enforces the same stdio scope restriction and outbound destination policy as MCP tool discovery, and it does not overwrite discovered tool metadata.
- (Ref: #1267,
functions_action_connection_tests.py,route_backend_plugins.py,_plugin_modal.html,plugin_modal_stepper.js,ACTION_TEST_CONNECTION.md)
User Interface Enhancements
- Dedicated Log Analytics Configuration Section
- Log Analytics actions now have their own Step 3 configuration section instead of reusing the generic endpoint and authentication form.
- Workspace ID, Cloud, API Endpoint, and the authentication method moved out of Advanced → Additional Fields and into the main configuration step, next to the new Test Connection button. Authority Host and Endpoint Override appear only when the Custom cloud is selected.
- Existing Log Analytics actions are unaffected — the section reads and writes the same manifest fields and preserves stored values such as
query_history. - (Ref: #1267,
_plugin_modal.html,plugin_modal_stepper.js, Log Analytics action configuration)
Bug Fixes
- Action Secret References Now Resolved Only Within Their Own Scope
- Action connection tests resolve a stored Key Vault secret reference strictly against the scope of the action being tested, instead of resolving any reference name supplied in the request.
- The unscoped resolver has been removed, and the existing MCP tool discovery, Cosmos DB, SQL, Yamcs, and RocksDB test paths now share the same scope-checked resolution used by the new connection tests. A reference that does not match the action’s scope is rejected instead of resolved.
- Loading a global action for a connection test now requires the Admin role at the shared loader, so every test route inherits the check rather than relying on each route to gate it.
- Only affects deployments with Key Vault secret storage enabled. Normal editing is unchanged — testing an existing action still works without retyping stored credentials.
- (Ref: #1267,
route_backend_plugins.py,functions_keyvault.py, action secret scoping)
(v0.250.216)
New Features
- RocksDB Action
- Added a new
rocksdbaction type so agents can read an ordered RocksDB key-value store, with a dedicated configuration card and Test Connection button in the action modal. - RocksDB is an embedded library with no network protocol, so the action calls a RocksDB-backed HTTP/JSON service that you operate alongside your data. SimpleChat never runs RocksDB locally or opens a database directory on the application host.
- Supports no-auth, bearer token, and API key header authentication with a configurable header name. TLS certificate validation is always enforced.
- Exposes
get_value,get_values,key_exists,scan_prefix,scan_range,list_column_families, andget_database_statsfor reads, plusput_value,delete_value, andwrite_batchthat stay blocked until an action explicitly allows writes. - Handles binary data through configurable UTF-8, base64, and JSON key and value encodings that are sent to the service on every request, caps returned records, and flags values truncated by the size limit.
- The RocksDB HTTP service contract is fully documented so operators can implement a conforming service.
- (Ref:
rocksdb_plugin.py,route_backend_plugins.py,plugin_health_checker.py,_plugin_modal.html,plugin_modal_stepper.js,rocksdb.definition.json,test_rocksdb_plugin.py,test_workspace_rocksdb_action_modal.py,docs/explanation/features/v0.250.216/ROCKSDB_ACTION.md)
- Added a new
(v0.250.215)
Bug Fixes
- Retrieved Sources and Cited References
- Separated complete document/web retrieval results from the exact references used in final assistant responses, while preserving all returned results under Sources.
- Used documents now follows active cited responses, conversation details marks cited items within the full source inventory, and conversation/message export references exclude retrieved-only sources.
- Historical conversations retain their previous fallback without a migration or ordinary read-time history parsing.
- (Ref: #1249,
functions_citation_tracking.py,route_backend_chats.py,route_backend_conversation_export.py,SOURCE_AND_CITED_REFERENCE_DISTINCTION_FIX.md)
(v0.250.214)
New Features
- Agent Instruction Context References (
#actionand#knowledge)- Instructions can now reference the exact actions, action capabilities, and assigned knowledge that were selected for the agent, so authors can spell out when and why each capability or document should be used.
- Typing
#in the Instruction Brief or the instructions editor opens an autocomplete that drills down from theaction/knowledgenamespace, to the actions selected in the Actions step, to that action’s enabled capabilities.#knowledge:lists the assigned documents, workspaces, tag limits, and web sources with type badges. - Tokens such as
#action:"Simple Chat":create_groupand#knowledge:doc:"Employee Handbook.pdf"are stored literally with the instructions so they stay editable and round-trip unchanged when an agent is edited. Values containing a space or colon are quoted automatically. - Navigate with the arrow keys, insert with
TaborEnter, dismiss withEsc, or use the mouse. Document titles containing spaces stay searchable while typing. - Foundry agents manage their instructions and tools in Foundry, so the references stay inert for Classic Foundry, New Foundry, and Foundry Workflow agents.
- (Ref: #1257, #1263,
agent_instruction_mentions.js,agent_modal_stepper.js,_agent_modal.html)
- Context-Aware Draft Instructions
- The Draft Instructions helper now receives the selected actions with their enabled capabilities and the assigned knowledge configuration, instead of only the agent name, description, and brief.
- Drafts reference only real, selected actions and documents, and use the new
#action:/#knowledge:token convention. - Client-supplied context is normalized, length-capped, count-capped, and bounded by a shared total character budget on the backend. It is used purely as prompt text and never affects authorization, and whitespace collapsing prevents newline-based prompt injection through action or document names.
- (Ref: #1257, #1263,
route_backend_agents.py,POST /api/agents/draft-instructions)
User Interface Enhancements
- Agent Modal Step Reorder: Instructions After Actions and Knowledge
- The agent modal now runs Basic Info → Model & Connection → Actions → Knowledge → Instructions → Advanced → Summary, so instructions are written once the agent’s real capabilities are known.
- Added a collapsible Selected Actions & Knowledge panel at the top of the Instructions step listing the selected actions with badges for their enabled capabilities, plus the assigned workspaces, documents, tags, and web sources, each with its reference token.
- Step navigation, validation, and Foundry agent-type visibility now key off named steps rather than hard-coded step numbers.
- (Ref: #1257, #1263,
_agent_modal.html,agent_modal_stepper.js)
Bug Fixes
- Agent Summary Step Referenced the Wrong Step Number
- The Summary step’s empty-actions message pointed authors at “step 4” to add actions. Actions is step 3 under the new order, and step 4 is now Assigned Knowledge.
- (Ref: #1263,
_agent_modal.html, agent modal summary step)
(v0.250.213)
New Features
- Workflow Alert Rules
- Workflow alerts are now conditional. Instead of a single Pop-up Alert Priority that notified on every run, a workflow can define rules that describe why it should notify you, and a run that matches nothing stays completely silent.
- Conditions cover run status, task status, output text (contains, does not contain, or regex), File Sync results, empty output, an agent-raised signal, and a plain-English condition judged by a model, such as “any certificate expires within 14 days.”
- Each rule can be scoped to the final output, any task output, or one specific task.
- Model-judged conditions are batched into a single call per run and skipped entirely when a deterministic rule already matched at a higher severity, so workflows that use only deterministic conditions add no model calls.
- (Ref:
functions_workflow_alerts.py,functions_workflow_runner.py,functions_personal_workflows.py,functions_group_workflows.py,workspace_workflows.js,WORKFLOW_ALERT_RULES.md)
- Expanded Alert Severities and a Distinct Failure Style
- The severity ladder grew from low/medium/high to info, low, medium, high and critical.
- Info and low alerts land quietly in the notification bell, while medium and above open the pop-up. Any rule can override this.
- Runs that error now carry a separate failure category that changes the icon and wording independently of severity, so “the workflow broke” is visually distinct from “the workflow found something.”
- When several rules match the same run, the highest severity wins and the alert lists every matched rule with its reason under a new “Triggered by” section.
- (Ref:
functions_notifications.py,notifications.js,base.html, workflow alert modal)
- Agent-Raised Workflow Alerts
- Agents running inside a workflow can now raise an alert signal mid-run with severity, title and reason through the new
raise_workflow_alertSimpleChat capability, and anagent_signalrule decides whether it notifies anyone. - The rule’s severity acts as a floor the agent can escalate above but never quiet below, and named signals can route to their own rules.
- The capability is opt-in and refuses outside an active workflow run, so existing agents do not gain the ability to create notifications and a normal chat cannot fabricate one.
- (Ref:
simplechat_plugin.py,functions_simplechat_operations.py,agent_modal_stepper.js,plugin_modal_stepper.js)
- Agents running inside a workflow can now raise an alert signal mid-run with severity, title and reason through the new
- Alert Decision Visibility
- Each run now records why it did or did not alert, including the winning severity and every matched rule, surfaced through the workflow activity view so noisy or silent workflows can be diagnosed.
- (Ref:
functions_workflow_activity.py,functions_workflow_runner.py)
User Interface Enhancements
- Workflow Alert Rules Editor
- The Review step of the personal and group workflow builders replaces the single Pop-up Alert Priority dropdown with an alert mode selector and a rule editor for adding, editing, enabling and removing alert rules.
- Each rule row exposes its name, condition, severity, delivery and, where relevant, the task or output it should watch, with condition-specific fields appearing as the condition is chosen.
- The workflow list now summarizes alerts as the number of active rules, and the Review summary names the rules that will notify you.
- Invalid rules are caught before saving, such as a missing regex pattern, empty match values, an unwritten model condition, or a task-scoped rule with no task selected.
- (Ref:
workspace.html,group_workspaces.html,workspace_workflows.js, workflow builder review step)
Breaking Changes
- Workflow Alert Configuration Model
- The single
alert_priorityfield is superseded byalert_mode,alert_rulesandalert_evaluation. The old field is retained and still honored. - Migration: None required. Workflows that only carry
alert_priorityare migrated on read into two editable rules,Run failed → highandRun completed → <previous priority>, which reproduce the previous behavior exactly, including always opening the pop-up and staying silent on cancelled runs. Owners can then prune the noisy rule.
- The single
(v0.250.212)
New Features
- Yamcs Mission Control Action
- Added a first-class, read-only
yamcsaction type that connects agents to a Yamcs mission control server using the officialyamcs-clientPython package. - Exposes eleven read-only tools: instances, data links, mission database parameters and parameter detail, command definitions, live parameter values, parameter history, events, packets, alarms, and an optional guarded archive SQL query.
- Strictly read-only by design. The action cannot issue commands, set parameter values, run scripts, or enable/disable data links, and command listing returns definitions only.
- Archive SQL is disabled by default and, when enabled, is restricted to
SELECT,SHOW,DESC, andDESCRIBEstatements with a forbidden-keyword guard and an automatic row limit. - Every retrieval is bounded by a row limit, a serialized byte limit, and a request timeout so a broad query cannot walk an entire archive, and error text is scrubbed of credentials.
- (Ref:
functions_yamcs_operations.py,semantic_kernel_plugins/yamcs_plugin.py,semantic_kernel_plugins/yamcs_plugin_factory.py,docs/explanation/features/YAMCS_ACTION.md)
- Added a first-class, read-only
- Yamcs Action Configuration Panel and Test Connection
- Added a dedicated Yamcs configuration section to the Add/Edit Action modal covering server URL, instance, processor, authentication, TLS verification, archive SQL opt-in, and retrieval limits.
- Supports username/password, API key, bearer token, and unauthenticated Yamcs servers, plus reusable workspace identities using
api_key,bearer_token, orusername_password. - Added a Test Yamcs Connection button backed by
POST /api/plugins/test-yamcs-connection, which verifies reachability and credentials and confirms the configured instance exists. Saved actions resolve their stored credential from Key Vault, so secrets do not need to be re-entered to run a test. - (Ref:
_plugin_modal.html,plugin_modal_stepper.js,route_backend_plugins.py,workspace/view-utils.js)
Breaking Changes
- New
yamcs-clientDependency- Added
yamcs-client==2.1.0toapplication/single_app/requirements.txt. - This package is licensed LGPL-3.0, the first LGPL dependency in this repository. It is used as an unmodified, dynamically linked pip dependency.
- It vendorizes its own protobuf runtime, so it does not conflict with the pinned
protobuf==6.33.5. - Migration: run
pip install -r requirements.txtwhen upgrading. Deployments that do not install it can still run SimpleChat; Yamcs actions will return an actionable dependency error until the package is present. - (Ref:
requirements.txt,semantic_kernel_plugins/yamcs_plugin.py)
- Added
(v0.250.211)
User Interface Enhancements
- Consistent Workspace Section Order
- Workspace sections now follow a single order of operations everywhere they are listed: Documents, Prompts, Identities, Sync, Endpoints, Actions, Agents, Workflows.
- The order reflects how a workspace is actually built up, so it is clearer that Identities feed both Sync and Actions, that Actions belong to Agents, and that Workflows run Agents.
- Applied to the tab strip, the collapsed Section dropdown, and the left-hand sidebar submenus for personal and group workspaces. Public workspaces already matched this order and were left unchanged.
- Sections that an admin has disabled stay hidden; the remaining sections simply close up while keeping their relative positions.
- (Ref: #1255,
workspace.html,group_workspaces.html,_sidebar_nav.html,WORKSPACE_SECTION_ORDER.md)
Bug Fixes
- Group Workflows Missing From Sidebar Navigation
- Added the missing Group Workflows link to the left-hand group workspace submenu. Group workflows previously had a working tab but no way to reach it from the sidebar.
- (Ref: #1255,
_sidebar_nav.html, group workflows navigation)
- Sidebar Links Pointing At Unrendered Workspace Tabs
- Fixed left-hand navigation links whose visibility rules did not match the tabs they opened, so a link could appear for a section that was never rendered.
- Personal Agents and Actions links now respect the user agent and plugin permissions, group Agents and Actions links now respect per-user Semantic Kernel and group plugin permissions, and both Identities links now match their tab’s File Sync and Semantic Kernel conditions.
- (Ref: #1255,
_sidebar_nav.html,test_workspace_section_order.py)
(v0.250.210)
Bug Fixes
- Chat Document Search Now Matches File Names
- Fixed the chat grounded-search document picker only matching on a document’s title, which made file names completely unsearchable for any document that had extracted title metadata.
- Typing any fragment of a file name now surfaces the document, anywhere in the name — searching
200findsQuarterly_Report_200_final.pdf. - Multi-word queries are also supported, with
_,-, and.treated as word breaks, soreport 200matchesQuarterly_Report_200_final.pdf. The same improvement applies to the scope, tags, prompt, model, and agent selectors. - (Ref: #1256,
chat-documents.js,chat-searchable-select.js, chat grounded search, document picker)
- Leftover Separator Lines in Filtered Dropdowns
- Fixed filtered dropdowns leaving orphaned workspace separator lines behind — commonly two stacked horizontal rules directly under the “Select All” / “Clear All” row — when a search removed the leading sections.
- Divider visibility now follows the section it separates instead of the nearest visible row, and separator lines can no longer be leading, trailing, or stacked. Affects the Document, Scope, and Tags dropdowns, plus the Compare modal document picker.
- (Ref: #1256,
chat-searchable-select.js, dropdown filtering, section dividers)
User Interface Enhancements
- File Name Shown in Document Picker Rows
- Document rows in the chat grounded-search picker now show the file name as a smaller muted line beneath the title whenever the two differ, so it is clear which file a search matched.
- Rows without distinct titles are unchanged, and the row tooltip carries both the title and the file name.
- (Ref: #1256,
chat-documents.js,chats.css, document picker rows)
(v0.250.209)
Bug Fixes
- Cosmos Backup Continuation Token Failure
- Fixed Data Management backups silently omitting every Cosmos container that held more than one page of documents, which in most deployments meant personal conversations and personal messages were never backed up.
- Affected containers failed with
BadRequest: Invalid Continuation Tokenand were dropped from the backup artifact set while the job still reported completion with warnings. - Root cause was rebuilding the cross-partition query for each page and replaying the previous pager’s continuation token; the backup now drains a single pager so the SDK’s cross-partition execution context is preserved.
- (Ref: #1258,
functions_data_management.py, Cosmos backup source paging)
- Missing Backup Failure Diagnostics
- Source blob transfer failures previously produced no log output at all, so a run with nearly 20,000 failed blobs left no trace in App Service logs.
- Backups now log the first failure for each resource plus a bounded rollup of distinct failure reasons and counts when the resource finishes.
- (Ref: #1258,
functions_data_management.py, source blob backup logging)
- Application Insights Log Message Text
- Structured log events reached Application Insights as the constant
[SIMPLE_CHAT_LOG_EVENT]with every string property reduced to a character count, making traces unusable for diagnosis. - Traces now carry the sanitized message text and an allowlist of non-sensitive diagnostic values such as job ID, resource, container, status code, and error. Sensitive keys still collapse to a presence flag and secret redaction is unchanged.
- (Ref: #1258,
functions_appinsights.py, log event properties)
- Structured log events reached Application Insights as the constant
(v0.250.208)
User Interface Enhancements
- Governance Policy Copy and Principal Review Actions
- Added Duplicate and Inverse actions for delegated item governance policies so admins can quickly clone a policy or create an allow/block-list-swapped version before saving it as a new policy.
- Added a Show Users modal and removed the allowed/blocked user and group columns from the main delegated policy table, keeping the table easier to scan while preserving principal detail access.
- (Ref: #1252,
admin_governance.js,admin_settings.html, governance delegated item policies)
(v0.250.207)
Bug Fixes
- Intentional Governance Item Policy Retargeting
- Updated delegated item policy edits so admins can intentionally move an existing policy to a different delegated item without creating a duplicate policy document.
- The admin UI keeps the policy ID stable, warns that changing the target will move the policy, and the backend saves the new target while deleting the original source document when original target metadata is supplied.
- Also prevents ambiguous policy-ID reuse and keeps feature-policy saves and item-policy deletes out of the retarget conflict path.
- (Ref: #1252,
functions_governance.py,route_backend_governance.py,admin_governance.js)
(v0.250.206)
Bug Fixes
- Governance Item Policy Retarget Protection
- Fixed delegated item policy edits so changing the selected target no longer creates a duplicate policy document for the new item while leaving the old policy behind.
- Locks the target controls during existing policy edits and rejects conflicting backend saves when an existing policy ID is reused for a different delegated item.
- (Ref: #1252,
admin_governance.js,route_backend_governance.py,functions_governance.py)
(v0.250.205)
Bug Fixes
- Governance Block List Modal Handoff
- Fixed the delegated item block-list editor opening behind the item policy editor by hiding the parent modal before opening the shared principal editor, then restoring the item editor after the principal editor closes.
- Keeps Bootstrap modal focus, backdrop, and scroll handling consistent by ensuring only one governance modal is visible at a time.
- (Ref: #1252,
admin_governance.js,test_admin_governance_tab.py)
(v0.250.204)
New Features
- Governance Policy Block Lists
- Added admin-managed block lists for feature and delegated item governance policies so specific users or groups can be denied even when allow-all or allow-list rules would otherwise grant access.
- Enables administrator-friendly APIM quota-tier separation, such as allowing a high-threshold group to a high endpoint while blocking that group from a default low-threshold endpoint without maintaining a large low-user allow list.
- (Ref: #1252,
functions_governance.py,route_backend_governance.py,admin_governance.js, MCP governance)
(v0.250.203)
New Features
- Model Endpoint Identity Header
- Added admin controls to send a stable HMAC-hashed user identity key with model endpoint requests for APIM counters, quota policies, and backend routing policies.
- Supports global enablement, custom safe header names, selectable identity inputs, and per-endpoint inherit/enable/disable overrides without exposing raw UPN, object ID, or tenant ID values.
- (Ref: #1250, Model Endpoint Identity Header,
functions_model_endpoint_identity_header.py, model endpoint runtime, Admin Settings)
(v0.250.202)
Bug Fixes
- Live User Message Metadata During Streaming
- Made submitted user-message metadata available as soon as storage is acknowledged, without waiting for the assistant response to finish or requiring a page refresh.
- Preserved finalized metadata across success, server errors, cancellation, disconnect, recovery, image generation, document actions, and shared-chat streams while keeping in-flight message mutations gated until terminal completion.
- (Ref: #1244,
functions_chat_stream_events.py,chat-streaming.js,chat-messages.js,USER_MESSAGE_METADATA_STREAMING_FIX.md)
(v0.250.201)
Bug Fixes
- Exhaustive Row-by-Row Markdown Output
- Fixed line-by-line Markdown analysis reading every source row but publishing only 12 summarized findings because the previous hierarchical lane intentionally bounded findings and notable rows.
- Search now produces one exhaustive Markdown artifact containing every source row and every requested answer; Analyze produces a concise Markdown summary plus a separate exhaustive row-by-row Markdown artifact.
- Exact-row Markdown uses ordered checkpoints, output-aware batching, consecutive answer-field validation, non-empty answer enforcement, final row-count/source-order checks, and literal Markdown escaping for untrusted content.
- (Ref: #1233,
functions_tabular_orchestration.py,functions_tabular_generated_exports.py,route_backend_chats.py,TABULAR_EXHAUSTIVE_ROW_MARKDOWN_FIX.md)
(v0.250.200)
Bug Fixes
- Hidden Public Workspace Document Chat Grounding
- Fixed document chat handoffs from accessible public workspaces that users had hidden from the public directory, so the selected document is now available to grounded search instead of appearing selected while being silently excluded.
- Adds the selected workspace to the user’s visible Chat workspaces without hiding any existing choices and revalidates the requested public workspace before updating user settings.
- (Ref: #1245,
route_frontend_chats.py,test_public_workspace_hidden_document_chat_visibility.py,PUBLIC_WORKSPACE_HIDDEN_DOCUMENT_CHAT_VISIBILITY_FIX.md)
(v0.250.199)
Bug Fixes
- Tabular Analyze/Search Artifact Lifecycle Completion
- Preserved the selected model endpoint for pure-tabular Analyze background work, preventing non-default model selections from falling back to an unavailable deployment on the default Azure OpenAI resource.
- Enforced one artifact contract across Search and Analyze: Search CSV produces CSV; Analyze CSV produces Markdown plus CSV; exhaustive requests without an explicit output format produce Markdown in either mode.
- Made artifact publication complete before run completion, repaired previously uploaded-but-hidden Markdown artifacts during status reconciliation, and preserved original generation failures instead of masking them as schema errors.
- Removed misleading one-row Analyze CSV handoff artifacts and added sanitized user-visible failure reasons without exposing provider errors or endpoint details.
- (Ref:
functions_tabular_orchestration.py,functions_workflow_runner.py,functions_tabular_generated_exports.py,TABULAR_DURABLE_ARTIFACT_LIFECYCLE_FIX.md)
(v0.250.198)
Bug Fixes
- Tabular Parity Stale Settings Migration
- Fixed the four backend-only tabular durable-preflight parity flags (
tabular_request_planner_mode,enable_tabular_search_shared_preflight,enable_tabular_analyze_durable_preflight,enable_tabular_hierarchical_analysis) silently staying disabled on any deployment whose Cosmos settings document already stored them from before their defaults were raised to active. get_settings()merges code defaults into the persisted document viadeep_merge_dicts(), which only fills in missing keys and never overwrites an existing one, so raising a default in code alone never took effect for upgraded-in-place deployments.- Both Analyze and Search durable preflight now self-correct to the active defaults on the next settings load and persist the fix back to Cosmos DB; the
SIMPLECHAT_DISABLE_TABULAR_PARITY_DURABLE_PREFLIGHTemergency rollback env var continues to work unchanged. - (Ref:
functions_settings.py,normalize_tabular_parity_durable_preflight_defaults(),TABULAR_PARITY_STALE_SETTINGS_MIGRATION_FIX.md)
- Fixed the four backend-only tabular durable-preflight parity flags (
(v0.250.197)
Bug Fixes
- Tabular “Line” Terminology Routing
- Recognized “line”-phrased exhaustive tabular requests (for example, “for each line,” “line by line,” “one line per”) as equivalent to “row”-phrased requests across eight duplicated keyword-detection functions, so they route through the durable generated-output/analysis pipeline instead of the bounded foreground tool-calling path.
- Activated
enable_tabular_hierarchical_analysisby default so narrative (non-export) exhaustive whole-dataset Analyze/Search requests can resolve to the durablehierarchical_analysistask type, extending the existing emergency env kill switch to also cover this flag. - (Ref:
functions_tabular_orchestration.py,functions_tabular_parity_contract.py,route_backend_chats.py,functions_document_analysis.py,TABULAR_LINE_TERMINOLOGY_ROUTING_FIX.md)
(v0.250.196)
Bug Fixes
- Top Navigation Public Workspace Lockout
- Fixed a server-rendering failure that could lock users out after they selected top navigation while Public Workspaces was enabled.
- Preserved the saved navigation preference and default or customized Public Workspace labels without requiring a Cosmos profile repair.
- (Ref:
_top_nav.html,test_public_workspace_display_name_settings.py,TOP_NAV_PUBLIC_WORKSPACE_LABEL_CRASH_FIX.md)
(v0.250.185)
Bug Fixes
- Analyze Combined Generated Output Routing
- Treats Analyze requests that ask for row-level answers plus CSV/JSON/XML output as first-class combined durable work, producing both the Markdown analysis artifact and requested structured output artifacts.
- Queues planner-approved combined tabular Analyze work before foreground tabular tools run, preventing empty inline tool output from becoming a stream-level 500.
- Carries the selected model endpoint context into background generated-output runs so non-default endpoints do not fall back to an Azure OpenAI deployment name lookup.
- (Ref: #1233,
functions_tabular_orchestration.py,functions_workflow_runner.py, Analyze deliverable contract, combined durable generated output)
- Data Management Scheduler Context Guard
- Prevented the background Data Management scheduler from using request-context-copying executor APIs when no Flask request context exists.
- Scheduler-submitted jobs now use the existing worker-thread path outside request handling, while route-triggered submissions can still use the configured executor.
- (Ref:
functions_data_management.py, Data Management scheduler, background job submission)
(v0.250.182)
Bug Fixes
- Analyze Artifact Copilot Review Cleanup
- Preserved explicit request order for combined JSON/XML artifact requests when both formats share the same action phrase.
- Kept explicit unchanged-copy requests eligible even when source field names include descriptive terms such as risk or status.
- Made semantic validation shadow mode fail open on verifier errors and prevented the chat UI from falling back to withheld legacy artifacts when
generated_artifactsis explicitly empty. - (Ref: PR #1238, Copilot review comments, generated artifact ordering, semantic validation shadow mode, plural artifact UI)
(v0.250.181)
Bug Fixes
- Analyze Artifact Advanced Security Cleanup
- Replaced a self-comparison float finite check in the tabular transformation validator with an explicit finite-number check.
- Simplified an unnecessary callable wrapper in the Phase 7B production-correctness functional test harness.
- (Ref: PR #1238, GitHub Advanced Security comments, tabular transformation validation)
(v0.250.180)
Bug Fixes
- Analyze Artifact Output Contract Closure
- Made Analyze generated-output delivery Markdown-first and contract-faithful across durable tabular execution by adding reviewed transformation planning, deterministic server-side rules, bounded semantic verification and repair, and exact Search/Analyze 200-row parity validation.
- Hardened artifact-set publication so new staged generated artifacts are not downloadable or promotable until the completed run manifest commits every required member, while preserving legacy generated artifact compatibility.
- Restored explicit Word/DOCX current-turn function-result serialization and repaired cumulative lifecycle, scale, route, and UI validation harnesses through 30,000-row bounded finalization and 100,000-row deterministic planning/hardening contracts.
- (Ref: #1233, PR #1234, PR #1235, PR #1236, Analyze deliverable contract, tabular transformation contract, artifact-set publication lifecycle)
(v0.250.170)
Bug Fixes
- Rendered Admin Tabular Run Controls Coverage
- Replaced source-only coverage with an authenticated browser regression that verifies the Admin Settings controls render, submit, survive reload, and restore their original values.
- Guarded shared settings mutation behind an explicit isolated-environment opt-in and limited configured-model testing to routable legacy direct or APIM deployments.
- (Ref: #1201,
ui_tests/test_admin_tabular_run_controls.py, Admin Settings tabular run controls)
(v0.250.169)
Bug Fixes
- Large Tabular Run Confirmation Deduplication
- Prevented repeated Send clicks or Enter presses from opening concurrent confirmation waiters and starting the same expensive tabular run more than once.
- Restored normal sending after the user continues, narrows scope, dismisses the dialog, or an unexpected confirmation error occurs.
- (Ref: Fixes #1200,
chat-messages.js,test_chat_background_generated_export_status.py)
(v0.250.168)
Bug Fixes
- Tabular Execution Settings Sanitization
- Prevented normal user-facing settings responses from exposing admin-only hierarchical-analysis, chunk-model deployment, and model-validation retry controls.
- Preserved the durable-run confirmation settings required by chat so users continue to receive prompts before very large tabular runs.
- (Ref: #1199,
sanitize_settings_for_user(),TABULAR_GENERATION_BACKEND_SETTING_KEYS)
(v0.250.167)
Bug Fixes
- Tabular Parity Rollout and Lifecycle Hardening
- Enforced parity canary assignment before durable execution and included authorized source versions in request and unit fingerprints.
- Preserved failed and canceled durable outputs as terminal incomplete evidence, including all-canceled per-document Analyze results, and corrected Analyze parity telemetry classification.
- Renamed incomplete multi-file and deferred-composition controls as planning-only and exposed that durable fan-out and automatic continuation are unavailable without changing working single-source or per-document behavior.
- (Ref: PR #1219, #1031, #1055, #1058,
functions_tabular_orchestration.py,functions_workflow_runner.py,route_backend_chats.py)
(v0.250.166)
New Features
- Tabular Analyze/Search Durable Preflight Parity
- Unified exhaustive tabular Search and Analyze requests behind a shared route-neutral planner that can queue durable work before bounded foreground tools or immediate synthesis run.
- Preserved truthful pending, failed, canceled, and completed evidence across pure tabular, mixed-source, per-document, and multi-table workflows, including deferred mixed-source composition and public lifecycle coverage.
- Added backend-only shadow and canary controls, privacy-safe telemetry and status metadata, and evidence-backed legacy fallback retirement while reusing existing authorization, source-version, rollback, and artifact-card contracts.
- (Ref: #1031, #1055, #1058,
functions_tabular_orchestration.py,functions_workflow_runner.py,route_backend_chats.py)
(v0.250.160)
Bug Fixes
- getAToken Missing Authorization Code Redirect
- Redirects direct
/getATokenbrowser visits without an OAuth authorization code back to the home sign-in page instead of showing a technical callback error. - Preserves the normal Microsoft Entra authorization-code callback flow and keeps
/getATokenApiexplicit error behavior unchanged for API token callbacks. - (Ref:
/getATokenOAuth callback,route_frontend_authentication.py,test_getatoken_missing_code_redirect.py)
- Redirects direct
(v0.250.159)
New Features
- Chat Used Documents Pane
- Added a Used Documents mode to the existing chat conversation side pane so users can review documents that were actually cited in the conversation without opening the full details modal.
- Reuses the same conversation metadata document tags as the details modal, excludes selected-but-unused documents, and auto-opens once when cited documents first appear.
- (Ref: #1209, conversation contents drawer, cited document metadata,
chat-conversation-contents.js,chat-conversation-details.js)
(v0.250.157)
Bug Fixes
- Prior Grounded Source Continuity
- Follow-up mixed-source turns can now detect references such as “that XML file,” “same template,” or “previous spreadsheet” and merge reauthorized prior grounded sources with the current selected sources.
- Preserved authorization boundaries by deriving prior sources from
last_grounded_document_refsand revalidating scope before use. - (Ref: #1204, mixed-source source continuity,
route_backend_chats.py,test_chat_history_grounded_follow_up_fix.py)
(v0.250.156)
Bug Fixes
- JSON/XML Source-Only Intent Guardrails
- Prevented source-reading prompts such as “Summarize this XML document” and “Validate this JSON object” from being misclassified as generated artifact requests.
- Kept explicit output requests such as “Export as JSON” and “Create an XML file” routed to generated artifact workflows.
- (Ref: #1198, structured artifact intent detection,
functions_generated_file_exports.py,test_generated_json_xml_exports.py)
(v0.250.155)
Bug Fixes
- Tabular Contains Replay Semantics
- Aligned foreground
filter_rows containsmatching with durable CSV replay by using literal, case-insensitive containment in both paths. - Added regression coverage for regex-shaped values such as
A.*so previews and generated export replays select the same row cohort. - (Ref: #1197, tabular durable replay descriptors,
tabular_processing_plugin.py,test_tabular_large_result_pagination.py)
- Aligned foreground
(v0.250.129)
New Features
- Configurable Workflow Task Limit
- Added an admin setting that controls how many ordered instruction tasks users can add to a workflow.
- The default is 50 tasks, with backend and browser enforcement clamped to a supported range of 1-100 tasks.
- (Ref: workflow task sequences, Admin Settings Workflow section,
functions_personal_workflows.py,workspace_workflows.js)
(v0.250.128)
Bug Fixes
- Outbound MCP Tool Argument Normalization
- Fixed outbound MCP tool calls that could wrap parameters inside a
kwargsobject, preventing standards-compliant MCP servers from seeing required top-level fields such astype. - Added schema-aware normalization before MCP argument validation and invocation while preserving tools that explicitly define a real top-level
kwargsproperty. - (Ref: #1163, MCP
tools/callarguments,functions_mcp_operations.py,mcp_plugin.py,mcp_plugin_factory.py)
- Fixed outbound MCP tool calls that could wrap parameters inside a
(v0.250.127)
Bug Fixes
- Replayable Exhaustive Tabular Exports
- Generalized version-pinned CSV source descriptors so exhaustive
filter_rowsandsearch_rowsrequests can replay the complete authorized cohort through the existing durable export runner instead of failing on bounded preview gaps. - Added exhaustive per-row request routing for natural phrases such as “for each row,” “every row,” and “one row per,” while preserving direct deterministic aggregation behavior.
- Non-replayable semantics such as normalized entity matching now fail closed with an explicit reason and never publish a partial CSV.
- (Ref: #1031, tabular source descriptors, durable generated exports,
functions_tabular_csv_query.py,tabular_processing_plugin.py,route_backend_chats.py)
- Generalized version-pinned CSV source descriptors so exhaustive
(v0.250.126)
Bug Fixes
- Enhanced Citations Startup Storage Degradation
- Prevented Enhanced Citations storage connectivity problems from blocking application startup when Cosmos DB is otherwise available.
- Deferred live storage container checks to upload/admin-test paths and added Admin Settings diagnostics for explicit storage validation.
- (Ref: #1155, PR #1161, Enhanced Citations storage startup,
config.py,functions_documents.py, Admin Settings)
- Functional Test Version Assertion Resilience
- Added shared functional-test version helpers so tests can assert the app version is at least the feature implementation version instead of exactly equal to an older release.
- Migrated brittle exact
config.pyversion checks and added a guardrail test to prevent reintroducing exact app-version assertions. - (Ref: functional test version helpers,
test_support/versioning.py,test_app_version_assertion_guardrails.py)
(v0.250.125)
Bug Fixes
- Logging Tag Standardization
- Standardized Python logging prefixes to
[UPPERCASE_WITH_UNDERSCORES]so Application Insights, debug logs, and operational searches use consistent tag names. - Added a logging tag reference inventory and functional coverage to keep future logging tags normalized and documented.
- (Ref: logging tag inventory,
docs/reference/logging-tags.md,test_logging_tag_standardization.py)
- Standardized Python logging prefixes to
(v0.250.124)
Bug Fixes
- Key Vault Reminder PR Security Hardening
- Replaced raw exception text returned from plugin/action Key Vault save paths with stable user-safe messages while preserving server-side logging for diagnostics.
- Renamed the external Key Vault reminder telemetry event to avoid security scanner false positives on secret-related terminology while keeping queryable Application Insights dimensions.
- (Ref: #1156, PR #1157,
route_backend_plugins.py,functions_appinsights.py, CodeQL findings)
(v0.250.123)
New Features
- Key Vault Reminder Contact Email Telemetry Opt-In
- Added a default-off admin setting that allows Key Vault reminder contact email addresses to be included in the external Application Insights telemetry event for direct Azure Monitor, Logic App, Function, or webhook routing.
- Kept raw secret names redacted from external telemetry and added Reminder ID visibility/search in the admin inventory for fixed admin-channel alert workflows.
- (Ref: #1156,
functions_appinsights.py,functions_keyvault_reminders.py, Admin Key Vault reminder external alert guidance)
(v0.250.122)
New Features
- Key Vault Reminder External Telemetry
- Added a privacy-safe, queryable Application Insights event when Key Vault expiration reminder notifications are created, enabling Azure Monitor scheduled query alerts, action groups, Logic Apps, Functions, or webhooks for external notification workflows.
- Added admin and feature documentation guidance with a sample KQL query while avoiding raw secret names and email values in telemetry dimensions.
- (Ref: #1156,
functions_appinsights.py,functions_keyvault_reminders.py, Azure Monitor external notification guidance)
(v0.250.121)
New Features
- Key Vault Expiration Reminder Inventory
- Added SimpleChat-managed Key Vault secret expiration reminder tracking with per-action reminder metadata, expiration dates, lead days, reminder contact email, friendly labels, and rotation notes.
- Added an admin Key Vault reminder dashboard that maps generated Key Vault secret names back to SimpleChat scope, source action, field, owner/contact context, sync status, and remediation details.
- Added a background reminder sweep and
key_vault_secret_expiringin-app notifications while preserving Azure Monitor/Event Grid as the recommended email alert path. - (Ref: #1156,
functions_keyvault_reminders.py,admin_settings.html,plugin_modal_stepper.js, Key Vault reminder inventory)
Bug Fixes
- Reliable Key Vault Secret Rotation
- Fixed action secret save behavior so replacing a Key Vault-backed secret with a new literal value writes a new Key Vault version for global, group, and personal actions.
Stored_In_KeyVaultplaceholders now only preserve validated existing references; placeholder-only saves without an existing secret are rejected instead of creating dead references.- Key Vault write failures now surface as errors instead of falling back to raw secret persistence.
- (Ref: #1156,
functions_keyvault.py, action save helpers, Key Vault secret reference validation)
(v0.250.119)
Bug Fixes
- Duplicate Chat Stream JSON Import Cleanup
- Removed the redundant local
jsonimport from the chat streaming route while keeping the existing module-level import, clearing the PR #1145 CodeQL duplicate-module-import notice without changing streaming behavior. - Updated the PR 1145 remediation plan with the implementation version and validation results.
- (Ref: #1145,
route_backend_chats.py, CodeQL alert 30)
- Removed the redundant local
(v0.250.118)
Bug Fixes
- Semantic Kernel Return Contract Cleanup
- Made the nested chat Semantic Kernel invocation helper return
Noneexplicitly when an async generator completes without yielding, clearing the PR #1145 CodeQL mixed explicit/implicit return alert without changing runtime behavior. - Added focused functional coverage for direct values, coroutine results, yielded async-generator values, and empty async generators.
- (Ref: #1145,
route_backend_chats.py,test_chat_semantic_kernel_return_contract.py)
- Made the nested chat Semantic Kernel invocation helper return
(v0.250.115)
Bug Fixes
- Token Usage Aggregation Fixture Cleanup
- Removed duplicate mocked helper keys from the document action token usage aggregation functional test so the fixture intent is explicit and CodeQL no longer reports overwritten dictionary entries.
- Kept comparison coverage focused on cross-format compare behavior while preserving aggregate token usage assertions for analysis, comparison, workflow assistant persistence, and chat persistence markers.
- (Ref: #1145,
test_document_action_token_usage_aggregation.py, token usage aggregation fixtures)
(v0.250.114)
Bug Fixes
- Foundry Citation Thought Detail Cleanup
- Fixed a CodeQL finding where Foundry citation thoughts iterated citations without using the citation value, causing duplicate generic thought messages.
- Foundry citation thoughts now include safe citation-specific labels when available while avoiding raw payloads, URL query strings, userinfo, and long unbounded text.
- (Ref: #1145,
route_backend_chats.py,test_foundry_citation_thoughts.py)
(v0.250.114)
New Features
- Generated JSON and XML Export Artifacts
- JSON and XML generation requests can now save valid generated output as downloadable chat artifacts instead of leaving large file-shaped content in the assistant response.
- Document Analyze and generated export flows now recognize natural JSON/XML conversion and XML template-population phrasing, with XML serialization support added to durable generated exports.
- XML document processing now uses a consolidated token-aware pipeline for more reliable analysis and export workflows.
- (Ref: #1071,
functions_generated_file_exports.py, generated analysis artifacts, XML document processing)
(v0.250.112)
New Features
- Model Capability Catalog
- Added an initial JSON source of truth for model feature capabilities across OpenAI GPT-5+, recent Claude models, Meta Llama and Code Llama, xAI Grok, and Microsoft Phi/MAI models.
- Catalog entries track support for text, image, audio, video, binary/file input, coding optimization, tool calling, and structured output so future multimodal routing can move away from regex-only model-name checks.
- This release is data-only and does not change backend or frontend runtime behavior.
- (Ref: Closes #1147,
model_capabilities.json, model capability detection)
(v0.250.111)
Bug Fixes
- Data Management Restore Route Registration
- Fixed application startup failure caused by duplicate Data Management restore review route and endpoint registrations.
- Preserved the authorization-aware restore review workflow and added regression coverage requiring unique Blueprint endpoint names.
- (Ref:
route_backend_data_management.py,test_data_management_security_patterns.py,DATA_MANAGEMENT_RESTORE_ROUTE_ENDPOINT_COLLISION_FIX.md)
(v0.250.110)
New Features
- Configurable Public Workspace Display Name
- Admins can now set an optional end-user display name for Public Workspace, capped at 32 characters, so organizations can present tenant-specific terms such as “Domain Knowledge”.
- End users see the configured label across navigation, Profile, Public Directory, Public Workspace pages, chat scope selection, and related browser messages while admin settings and internal identifiers continue to use Public Workspace/public_workspace.
- Empty or unset values preserve the existing Public Workspace/Public Workspaces defaults.
- (Ref: #1146,
functions_settings.py,admin_settings.html, public workspace templates and JavaScript,PUBLIC_WORKSPACE_DISPLAY_NAME.md)
(v0.250.109)
New Features
- Per-Model Response Length Overrides
- Administrators can now set an optional response-length/output-token ceiling on each model in global multi-endpoint GPT configuration.
- Standard chat applies the selected model’s configured ceiling with the correct backend token parameter for GPT-5/o-series aliases and other OpenAI-compatible chat models.
- Existing endpoint model records remain compatible when the field is blank or absent.
- (Ref: Closes #1143, related #1047 and #358,
functions_settings.py,route_backend_chats.py,admin_model_endpoints.js)
(v0.250.108)
User Interface Enhancements
- Backup, Migrate & Restore Admin Refresh
- Reworked the Admin Settings data-management tab into a clearer Backup, Migrate & Restore control center with start-here guidance, setup modals, and plain-language migration choices.
- Separated destination Cosmos RU Boost configuration and testing from Cosmos data-copy access validation so admins can verify the correct Azure management-plane permissions before migration.
- Aligned the refresh with the restore workflow from Backup Inventory so admins can review backup readiness, choose restore policy/surfaces, run preflight, and queue supported restore jobs.
- (Ref: #1140,
admin_settings.html,admin_data_management.js,functions_data_management.py, Data Management docs and tests)
(v0.250.107)
Bug Fixes
- Mixed Source Manifest Storage Locator Preservation
- Preserved explicit blob storage locators for authorized non-chat mixed-source manifest entries when archived-revision document metadata already contains a resolved container and blob path.
- Updated focused mixed-source Analyze and conversation-continuity tests for the current rollout/version contract.
- (Ref: #1055, #1056, mixed-source manifests,
functions_mixed_source_orchestration.py,test_mixed_source_manifest_contracts.py)
(v0.250.106)
New Features
- Backup Cleanup and Retention Policy Controls
- Added Data Management backup cleanup controls so administrators can manually delete backup artifacts and metadata from Backup Inventory.
- Added unit-based backup retention settings for days, weeks, months, and years, with automatic cleanup that preserves the newest successful full backup as a restore safety baseline.
- Cleanup removes stored backup blobs, job timeline records, and differential sidecar state so future partial backups re-export affected unchanged items instead of pointing to deleted artifacts.
- (Ref: Closes #1130,
functions_data_management.py,route_backend_data_management.py,admin_settings.html,admin_data_management.js)
- Multi-Select Metadata Extraction
- Personal, group, and public workspace document multi-select bars now include an Extract Metadata action when metadata extraction is enabled.
- Selected documents are queued through the shared metadata extraction background workflow, preserving generated titles along with authors, abstracts, keywords, publication dates, and organization metadata.
- (Ref: Closes #1134,
route_backend_documents.py,route_backend_group_documents.py,route_backend_public_documents.py, workspace document multi-select actions)
- Data Management Backup Restore Workflow
- Added an admin-only restore workflow for completed Data Management backups, with manifest preflight, create-only default policy, explicit overwrite confirmation, durable restore jobs, cancellation/retry support, and sanitized progress in Job History.
- Restore supports configured target Cosmos DB, AI Search, and Enhanced Citation blob targets while preserving secret-safe review and job responses.
- (Ref: Closes #1091,
functions_data_management.py,functions_data_management_restore_state.py,route_backend_data_management.py,admin_settings.html,admin_data_management.js,DATA_MANAGEMENT_RESTORE.md)
Bug Fixes
- Retry and Edit Streaming Parity
- Retry and edit chat flows now use the same full SSE streaming path as first-send chat, restoring live token updates, streamed thoughts, stop controls, and recovery behavior.
- The stream path reuses the retry/edit user message and thread metadata created by the preparation endpoints, preserving carousel attempt history without duplicating user messages.
- (Ref: Fixes #963,
route_backend_chats.py,chat-retry.js,chat-edit.js,test_chat_retry_edit_streaming_parity.py)
User Interface Enhancements
- Custom Pages Admin Open Action
- Added an Open action to the Admin Settings Custom Pages table so administrators can launch enabled static or Python-backed custom pages directly from their metadata row.
- The action opens encoded
/custom/<slug>URLs in a new tab while preserving existing Custom Pages route authorization, enabled-state checks, access-level rules, role restrictions, and.htmlalias compatibility. - Disabled or unavailable pages now show a disabled Open action with explanatory tooltip copy instead of silently omitting the action.
- (Ref: Closes #951, PR #1131,
admin_custom_pages.js,CUSTOM_PAGES.md)
(v0.250.105)
User Interface Enhancements
- Reviewed, Scalable Data Migration Workflow
- Replaced the Admin Data Management migration form with a six-stage Target, Scope, Content & Options, Review, Confirm, and Progress workflow.
- Added server-paginated principal catalogs, exhaustive all-mode counts, persistent cross-page selections, sanitized preflight checks, single-use administrator-bound review authorization, settings-drift protection, separate destructive confirmation, duplicate-submit prevention, and inline durable job recovery controls.
- (Ref: Closes #1097,
functions_data_management.py,route_backend_data_management.py,admin_settings.html,admin_data_management.js)
(v0.250.103)
New Features
- Configurable AI Response Completion Audio Cues
- Administrators can enable locally bundled completion sounds, while each user can opt in, choose and preview one of ten cues, set volume, or mute cues without losing their preferences.
- Cues play once for newly completed personal-chat responses outside the active visible conversation, with server-authoritative gating, cross-tab preference synchronization, and historical/duplicate suppression.
- (Ref: Closes #1062,
completion-audio-cues.js, notification polling, Profile and Admin Settings,AI_RESPONSE_COMPLETION_AUDIO_CUES.md)
Bug Fixes
- Retention Coverage Across Group and Collaborative Conversations
- Group-scoped private conversations now follow their primary group’s retention policy instead of the creator’s personal policy.
- Personal and group collaborative conversations now use their correct governing policy and activity timestamp, while linked conversion sources are cleaned once without duplicate counting.
- Collaboration cleanup now covers messages, per-user state, linked sources, blob-backed files, thoughts, activity logs, and conversation caches; new groups also persist explicit default retention values.
- (Ref: Closes #1054,
functions_retention_policy.py,functions_collaboration.py,functions_group.py,RETENTION_POLICY_CONVERSATION_SCOPE_COVERAGE_FIX.md)
- Custom Databricks-Prefixed Action Discovery
- Fixed action type discovery so custom plugin types such as
databricks_table_dscmono longer inherit the built-in Databricks discovery defaults. - Custom Databricks-prefixed plugin types now stay on the standard plugin configuration path and visual treatment unless their type is exactly
databricksordatabricks_table. - Added a regression test that scaffolds a temporary fake custom Databricks-prefixed plugin, schema, and definition file to validate discovery and settings merge behavior.
- (Ref: #1124,
functions_databricks_operations.py,route_backend_plugins.py,view-utils.js,test_plugin_type_discovery_custom_databricks.py)
- Fixed action type discovery so custom plugin types such as
(v0.250.102)
New Features
- High-Throughput Resumable Source Blob Backups
- Source document backups now stream bounded Azure SDK blocks with configurable file concurrency and chunk size instead of buffering complete blobs or copying files serially.
- Added durable per-file verification and resume, source/target generation fencing, adaptive Retry-After-aware throttling, isolated file failures, authenticated chunked encryption, throughput telemetry, and a reproducible AzCopy/server-copy/SDK benchmark harness.
- (Ref: Closes #1095,
functions_data_management.py,test_data_management_blob_backup_transfers.py,benchmark_data_management_blob_backup.py,DATA_MANAGEMENT_BLOB_BACKUP_THROUGHPUT.md)
- Desktop Conversation Notifications
- Administrators can enable operating system notifications for completed AI responses, and users can manage their own preference from Profile.
- Notifications appear only while SimpleChat is open in a hidden or unfocused tab, show the application and conversation titles without response content, and focus the existing tab when selected.
- (Ref: Fixes #866,
chat-desktop-notifications.js,chat-streaming.js, Profile and Admin Settings)
- Automatic Overnight Control Center Statistics Refresh
- Added an enabled-by-default daily Control Center metrics refresh at 2:00 AM Eastern, with an administrator toggle and configurable time under Admin Settings > Control Center.
- The recurring schedule follows Eastern daylight-saving changes, stores concrete execution timestamps in UTC, and shows last-run and next-run values in each administrator’s browser timezone.
- (Ref: Closes #706,
functions_control_center.py,background_tasks.py,admin_settings.html,control-center.js)
- Configurable Chat AI Notice
- Administrators can display custom plain-text AI guidance directly below the chat composer.
- Supports non-dismissible, per-session, daily, and once-per-message-version behavior with validated dismissal persistence and automatic redisplay when the configured notice changes.
- (Ref: #715,
functions_ai_notice.py,admin_settings.html,chats.html,chat-ai-notice.js)
- Per-Message Audio Export
- Users can export completed user and assistant chat messages as MP3 audio when text-to-speech is enabled.
- Downloads reuse the active Azure Speech voice and speed, include only visible message text, and remain transient without storing generated audio in SimpleChat.
- (Ref: #628,
chat-tts.js,chat-message-export.js,chat-messages.js,MESSAGE_AUDIO_EXPORT.md)
User Interface Enhancements
- External Link Ordering Controls
- Admins can now move saved external links up or down and save the resulting navigation order without deleting and recreating links.
- The first and last links expose disabled boundary controls, and the visible order stays synchronized with the Admin Settings save payload.
- (Ref: Closes #793,
admin_settings.js,test_admin_external_link_ordering.py,EXTERNAL_LINK_ORDERING_FIX.md)
- Application-Wide Non-Blocking Toast Notifications
- Replaced native browser alerts across admin, group, public, personal workspace, profile, feedback, safety, and control-center workflows with consistent Bootstrap toast notifications.
- Added a shared, accessible toast utility that safely renders dynamic messages as text and preserves specialized chat toast positioning.
- (Ref: Closes #739,
toast.js,chat-toast.js, first-party templates and workspace scripts)
(v0.250.101)
New Features
- Adaptive Exhaustive Azure AI Search Backups
- Azure AI Search backups now export personal, group, and public indexes through deterministic keyset-paged artifacts with durable checkpoints, exact resume behavior, schema validation, and restore-readiness integrity status.
- Added fair bounded concurrency, Retry-After-aware handling for throttling and service interruptions, adaptive pressure reduction and recovery, and sanitized per-index throughput and failure metrics.
- (Ref: Closes #1094,
functions_data_management.py,test_data_management_ai_search_backup_export.py,DATA_MANAGEMENT_BACKUP_MIGRATION.md)
- Conversation Context Grounding
- Models and agents now receive bounded, credential-sanitized metadata for every user turn, including the active model, SimpleChat version, workspace scope, selected documents, agent, and capability state.
- Each assistant response exposes the identical snapshot as a visible Conversation Context citation across streaming, non-streaming, retry, fallback, collaboration, and document-action paths.
- (Ref: #508,
functions_conversation_context.py,route_backend_chats.py,functions_workflow_runner.py)
Bug Fixes
- Conversation Fork Workspace Context and HTTP 500 Fix
- Fixed conversation forks returning HTTP 500 when an owned single-user conversation used group or public workspace knowledge.
- Forking now revalidates current workspace access, preserves the authorized context and chat type, and returns controlled conflicts when access is stale or unavailable.
- Corrected fork-specific structured logging so validation, conflict, cleanup, and cache errors retain their intended response behavior.
- (Ref: #1025,
functions_simplechat_operations.py,route_backend_conversations.py,chat-messages.js,CONVERSATION_FORK_HTTP_500_FIX.md)
- Application-Wide Log Event Contract Guard
- Fixed conversation fork conflict and recovery logging that used unsupported metadata keywords, preventing logger errors from replacing intended HTTP responses such as eligibility conflicts with HTTP 500.
- Standardized structured metadata on
extra=and added an application-wide call-signature check plus route regression coverage for the HTTP 409 conflict path. - (Ref: #1112,
functions_simplechat_operations.py,route_backend_conversations.py,test_log_event_call_contract.py)
(v0.250.100)
Bug Fixes
- MCP PR CodeQL Cleanup
- Resolved CodeQL findings from the MCP pull request by replacing exception text returned to clients with stable public messages, tightening inbound MCP correlation IDs, and removing raw query text from search/cache logs.
- Cleaned up MCP catalog imports, test stubs, and JavaScript defaults that produced CodeQL note-level findings.
- (Ref: #1013, CodeQL scan, MCP PR readiness,
functions_appinsights.py,route_inbound_mcp.py,route_backend_plugins.py)
(v0.250.098)
New Features
- MCP Current-State Platform
- Added the governed inbound SimpleChat MCP server with a bounded personal tool surface for conversations, documents, prompts, tags, workflow discovery, and workflow execution.
- Hardened outbound MCP actions with presets, server-side preconfiguration catalogs, destination governance, custom headers, result policy controls, and redaction-safe discovery/runtime telemetry.
- (Ref: #1013, #1014, #1015, #1017, #1018, MCP current-state roadmap)
User Interface Enhancements
- MCP Admin And Observability Surfaces
- Added Admin Settings controls for inbound MCP runtime settings, source governance guidance, Easy Auth setup verification, request-size and throttle tuning, tool registry visibility, and copyable Application Insights starter queries.
- Added Governance controls for outbound MCP destination policies and inbound MCP source policies using the current source-first access model.
- (Ref: #1020, MCP governance/admin UX,
admin_settings.html,admin_settings.js,admin_governance.js)
Bug Fixes
- MCP Enterprise Hardening
- Added inbound MCP request correlation, bounded payloads, Cosmos-backed tool throttles, clear JSON-RPC tool error transport, and OAuth/PRM discovery compatibility for MCP clients.
- Added outbound MCP discovery/factory telemetry with safe destination metadata and redaction to make connector failures easier to diagnose.
- (Ref: #1015, #1017, #1020, MCP observability and enterprise readiness)
(v0.250.076)
New Features
- Bounded Parallel Cosmos Backup Export and Source Capacity Recovery
- Cosmos backup export now streams deterministic JSONL checkpoint batches through configurable bounded concurrency, preserving durable fencing, latest-item state, cancellation, retry/resume, and recovery semantics without materializing complete containers in memory.
- Added bounded
408,429,449, and5xxretry with Retry-After-aware jittered backoff, adaptive staging pressure, sanitized per-container and aggregate RU/rate/retry telemetry, and deterministic no-replay checkpoint outcomes. - Added opt-in local/source Cosmos throughput boosts capped at 10,000 RU/s with topology discovery, immutable pre-mutation snapshots, fenced restore-pending recovery, safe external-change protection, minimum ARM role support in Terraform, and explicit fail-or-continue policy for unsupported or denied capacity mutations.
- (Ref: Closes #1093,
functions_data_management.py,admin_data_management.js,test_data_management_backup_parallelism.py,DATA_MANAGEMENT_BACKUP_MIGRATION.md)
(v0.250.075)
New Features
- Admin Feedback and Safety Record Lifecycle
- Added archive, unarchive, and permanently delete actions to the Feedback Review and Safety Violations admin pages, with active/archived filtering across lists, cards, statistics, pagination, and CSV exports.
- Archived records are hidden from user profile history, destructive deletion requires confirmation, and safety violations with pending remediation approvals cannot be deleted.
- Archive, unarchive, and delete actions create non-sensitive admin activity audit records, while audit persistence failures are surfaced without undoing successful lifecycle changes.
- (Ref: #991,
functions_review_lifecycle.py,route_backend_feedback.py,route_backend_safety.py,ADMIN_REVIEW_RECORD_LIFECYCLE.md)
- File Processing Log Cleanup
- Added admin controls to permanently delete file-processing logs older than a chosen number of days, weeks, or fixed 30-day months, or delete every stored log through a separate action.
- Added explicit confirmation, exact and partial deletion counts, admin activity logging, validation, and secured cross-partition Cosmos DB cleanup.
- (Ref: #398,
functions_logging.py,route_frontend_admin_settings.py,admin_settings.js,FILE_PROCESSING_LOG_CLEANUP.md)
(v0.250.074)
New Features
- Conversation Contents Drawer
- Added an admin-controlled, default-on conversation contents drawer that indexes persisted user messages and lets users jump directly to earlier prompts in long chats.
- Added a default-on user profile preference so each user can hide the drawer while the global admin feature remains enabled.
- (Ref: #1026,
chat-conversation-contents.js,admin_settings.html,profile.html)
- Fork Personal Conversations from Assistant Responses
- Added a Fork conversation action for persisted assistant messages, creating an independent personal conversation containing the active history through the selected response while leaving the source unchanged.
- Forks remap conversation, message, thread, reply, and artifact identifiers; copy blob-backed attachments to independent paths; reject unauthorized or changed sources; and clean up failed copies before they become visible.
- Added confirmation, duplicate-click prevention, failure feedback, immediate fork navigation, backend regression coverage, and browser workflow coverage.
- (Ref: #1025,
functions_simplechat_operations.py,route_backend_conversations.py,chat-messages.js,FORK_CONVERSATION.md)
User Interface Enhancements
- Responsive Long-Chat Navigation
- Added safe plain-text labels, active-location tracking, keyboard focus management, destination highlighting, and persistent desktop or off-canvas mobile layouts.
- (Ref: #1026,
chats.html,chats.css,test_chat_conversation_contents_drawer.py)
(v0.250.073)
New Features
- User Font Size Preferences
- Added persisted XS, S, M, L, and XL font-size choices to the user profile, ranging from 75% to 200% with medium as the default.
- Font-size selections preview immediately and apply across SimpleChat after the user saves the preference.
- (Ref: #1099,
profile.html,functions_settings.py,FONT_SIZE_AND_200_PERCENT_ZOOM_FIX.md)
- Durable Data Management Backup Jobs
- Full and partial backups now persist immutable plans and source cutoffs, fenced attempts, resource/batch checkpoints, and latest-only Cosmos, AI Search, and Blob item state without mutating source records or metadata.
- Added source-scoped overlap protection, authenticated cancellation and focused retry/resume controls, stale/queued worker recovery, bounded sanitized progress, and explicit non-destructive differential/deletion semantics in backup manifests.
- (Ref: Closes #1092,
functions_data_management.py,functions_data_management_backup_state.py,DATA_MANAGEMENT_BACKUP_MIGRATION.md)
User Interface Enhancements
- 200% Zoom and Large-Text Layout Support
- Updated Chat, top navigation, classification banners, and sidebar scrolling to reserve font-relative space and keep messages, navigation, tools, and the composer reachable at 200% browser zoom and large saved font sizes.
- (Ref: #1099,
chats.css,navigation.css,sidebar.css)
(v0.250.072)
Bug Fixes
- Selected Public Workspace Prompt Migration
- Selected public-workspace Data Management migrations now copy current prompts owned through
public_idwhile retaining compatibility with legacypublic_workspace_idrecords. - Prompts outside the selected workspaces remain excluded, transitional records migrate once, and copied prompt artifact counts are accurate. All-workspaces migration behavior is unchanged.
- (Ref: #1033,
functions_data_management.py,test_data_management_public_prompt_migration.py)
- Selected public-workspace Data Management migrations now copy current prompts owned through
(v0.250.071)
New Features
- Resilient Data Management Migrations
- Added durable migration provenance, per-resource checkpoints, bounded concurrent transfers, retry/resume controls, and long-running Cosmos, Search, Blob, inventory, and reconciliation heartbeats.
- Added New only, Delta / upsert, and explicitly confirmed Mirror with deletions modes with durable baseline watermarks, migration-owned update/delete protection, and server-owned live previews.
- Added post-copy Cosmos, AI Search, and Blob reconciliation with cutover readiness, actual outcome totals, and preview-versus-actual divergence reporting.
- Replaced deep AI Search pagination with persisted
idkeyset cursors, including selected-scope filter batching and coverage beyond 100,000 documents. - Added memory-bounded reconciliation, two-phase mirror deletion with current-source/ETag revalidation, target-side coordination across independent SimpleChat sources, and retryable
not_readycutover failures. - Preserved Blob content settings, metadata, tags, tier, type, and available content verification while adding mid-stream lease heartbeats, cooperative cancellation, source ETag stability, and pending-to-succeeded provenance.
- Added durable privacy-safe per-item outcome batches plus admin JSONL manifest and failure-list downloads.
- Made unresolved temporary Cosmos capacity restoration a retryable terminal state; retry restores the saved snapshot without reapplying the boost.
- Added a durable target AI Search write fence that drains normal SimpleChat indexing before transfer or mirror deletion, bounds Search requests, rejects self-targeting migrations, and requires explicit external-writer freeze acknowledgement before Search writes begin.
- Added target-side coordinator fencing across independent SimpleChat source deployments and retained uncertain target Search write slots through their full quarantine window. Authorization-reducing unshare requests now defer safely while target Search ACL writes are frozen.
- (Ref: #1043,
functions_data_management.py,functions_migration_provenance.py,admin_data_management.js,DATA_MANAGEMENT_MIGRATION_RESILIENCE.md)
(v0.250.070)
Bug Fixes
- Azure Blob Container SAS Support and Credential Guidance
- Added support for storage connection strings, full container SAS URLs, and standalone SAS tokens. Pasted SAS URLs derive the canonical account, selected container, and default source name without persisting the token in connection metadata.
- Validates required Read and List permissions, HTTPS-only protocol, account-SAS Blob resource scope, start time, and expiry. Extra permissions and broader account credentials remain usable but produce least-privilege warnings.
- Shows non-secret SAS scope, named permissions, exact expiry, days remaining, stored-policy status, IP restrictions, and warnings in connection tests and source rows.
- Supports saving Blob credentials with or without Azure Key Vault; Key Vault is used when enabled and existing File Sync credential persistence is used otherwise.
- (Ref: #1027,
functions_file_sync.py,workspace-file-sync.js,AZURE_BLOB_CONTAINER_SAS_SUPPORT_FIX.md)
(v0.250.068)
Bug Fixes
- Azure Blob File Sync Endpoint and Error Hardening
- Restricted Azure Blob File Sync URLs and connection strings to validated HTTPS Azure Blob endpoints, blocking arbitrary, internal, development-storage, and credential-bearing endpoint forms before SDK requests are created.
- Replaced raw File Sync route, run-history, activity, and item exception text with fixed client-safe messages while retaining detailed sanitized diagnostics in server logs.
- (Ref: #1027, PR #1088 security review,
functions_file_sync.py,route_backend_file_sync.py)
(v0.250.067)
New Features
- Azure Blob Storage File Sync
- Added Azure Blob Storage as an admin-controlled File Sync source for personal, group, and public workspaces, with account, container, prefix, selected-path, filter, tag, schedule, and remote-delete controls.
- Added managed identity, Key Vault-backed service principal and connection string authentication, connection testing, virtual-folder browsing, ETag change detection, and streamed ingestion through the existing document pipeline.
- (Ref: #1027,
functions_file_sync.py,workspace-file-sync.js,AZURE_BLOB_STORAGE_FILE_SYNC.md)(v0.250.066)
Bug Fixes
- GPT 5.6+ Multi-Modal Vision Model Selection
- Enabled GPT 5.6 Luna, Sol, Terra, and later supported GPT deployments to appear in the Multi-Modal Vision Analysis selector across Azure OpenAI and Foundry endpoints.
- Model detection now evaluates model, display, and deployment names with normalized separators while preserving disabled-model and unsupported-family filtering.
- (Ref: #1086,
admin_settings.js,test_admin_multimodal_vision_model_options.py)
(v0.250.065)
New Features
- Task-Level Workflow Model and Agent Selection
- Each ordered workflow task can now inherit the workflow’s Default Runner or select its own authorized Direct Model or Agent.
- Task runners are normalized on save and revalidated before execution, including current personal/group/global agent scope, group membership, and enabled model endpoint/model availability.
- Unavailable runners follow the workflow’s retry and stop-or-continue strategy, while task run items record non-secret runner audit details, execution deployment/provider, output preview, and token usage when available.
- Existing tasks without runner configuration inherit the workflow default, and workflows without task sequences retain the legacy execution path.
- (Ref: #1084,
functions_personal_workflows.py,functions_group_workflows.py,functions_workflow_runner.py)
User Interface Enhancements
- Per-Task Runner Controls
- Renamed the workflow-level Runner field to Default Runner and added Workflow default, Direct Model, and Agent selection to each task editor.
- Task rows and Review now show the resolved runner, with responsive conditional model/agent controls and text-safe rendering for endpoint, model, and agent labels.
- (Ref: #1084,
workspace.html,group_workspaces.html,workspace_workflows.js)
(v0.250.064)
New Features
- Repeatable AI Workflow Task Sequences
- Personal and group workflows can now run with only instructions and a selected model or agent; workspace documents, File Sync, URL access, schedules, and completion alerts remain optional.
- Workflows support ordered instruction tasks that share the selected runner and receive bounded prior-task output as context.
- Added per-task retries and stop-or-continue error handling, with task outcomes recorded in run history and workflow activity.
- Existing document Search, Analyze, and Compare behavior remains available as optional input for the first task, while existing workflows without task sequences retain their prior execution path.
- (Ref: #1082,
functions_personal_workflows.py,functions_group_workflows.py,functions_workflow_runner.py)
User Interface Enhancements
- Stepped Workflow Builder
- Replaced the single-pane personal and group workflow form with a five-step General, Trigger, Tasks, Reliability, and Review builder.
- Users can add, edit, remove, and reorder tasks, configure retry and failure behavior, and review runner, trigger, document input, File Sync, and pop-up alert settings before saving.
- (Ref: #1082,
workspace.html,group_workspaces.html,workspace_workflows.js,workspace-responsive.css)
(v0.250.062)
Bug Fixes
- Cosmos Container Startup Conflict Recovery
- Fixed a local Docker startup failure where multiple gunicorn workers could race while creating first-run Cosmos containers, causing a
NotFoundfollowed by aConflictduring app import. - Container initialization now re-reads and returns the existing container when another worker creates it first, preserving normal startup behavior for already-provisioned environments.
- (Ref:
config.py,test_cosmos_container_conflict_recovery.py,COSMOS_CONTAINER_STARTUP_CONFLICT_FIX.md)
- Fixed a local Docker startup failure where multiple gunicorn workers could race while creating first-run Cosmos containers, causing a
New Features
- Workflow Run Cancellation
- Personal and group workflows can now be cancelled from workspace rows and cards, run history, or the workflow activity view while a run is active.
- Cancellation is persisted for the active run and cooperatively stops further File Sync, document action, model, agent, artifact, notification, and scheduling work after any in-flight external request returns.
- Cancelled scheduled and File Sync workflows return to an idle state and advance to their next scheduled run instead of immediately restarting.
- (Ref: #990,
route_backend_workflows.py,functions_workflow_runner.py,workspace_workflows.js)
(v0.250.061)
New Features
- Configurable Content Safety Violation Messages
- Administrators can now configure the Markdown message shown when Content Safety blocks a chat request using the standard Markdown editor toolbar.
- A new setting controls whether the block reason, detected categories and severities, and blocklist matches are included beneath the custom message.
- The editor now renders correctly when the hidden Safety tab opens, and Markdown-only edits activate Save Settings before submission.
- (Ref: #989,
functions_content_safety.py,admin_settings.html,route_backend_chats.py)
(v0.250.059)
New Features
- Versioned Latest Features Navigation Hide Preference
- Users can now hide Latest Features navigation entries for the current SimpleChat version from the ellipsis action and restore them from Profile Settings.
- The hidden state is version-aware, so Latest Features automatically appears again after the app version changes.
- Added a development-only
is_development=trueenvironment override that hides Latest Features nav entries without affecting production behavior when unset or false. - (Ref: #987,
latestFeaturesHiddenVersion,_sidebar_nav.html,_top_nav.html,profile.html,latest-features-nav.js)
(v0.250.057)
Bug Fixes
- Terms of Use Redirect Hardening
- Replaced wildcard config imports in the Terms of Use route with explicit Flask imports.
- Moved post-acceptance return paths from hidden form values to server-side session storage, keeping user-controlled return targets local-only.
- Restricted admin-configured external decline redirects to HTTPS URLs without embedded credentials while preserving local-path redirects.
- (Ref: #504,
route_frontend_terms_of_use.py,functions_terms_of_use.py,terms_of_use.html)
(v0.250.056)
New Features
- Optional Terms of Use Gate
- Added an admin-configurable Terms of Use prompt that can require users to accept rules of behavior, terms, or an entry notice before using SimpleChat.
- Supports every-session, once-per-day, and once-per-version recurrence modes, with server-side browser/API enforcement and activity logging for accept/decline events.
- (Ref: #504,
TERMS_OF_USE.md,functions_terms_of_use.py,route_frontend_terms_of_use.py,terms_of_use.html)
(v0.250.052)
Bug Fixes
- Control Center Left Nav Endpoint Fix
- Fixed an issue where admins could open Control Center while the left navigation Control Center section stayed hidden when ControlCenterAdmin enforcement was disabled.
- Updated the sidebar endpoint check to use the blueprint-qualified
frontend_control_center.control_centerroute and added regression coverage for the regular Admin fallback. - (Ref: #1009,
_sidebar_nav.html,test_control_center_left_nav_endpoint.py)
(v0.250.051)
User Interface Enhancements
- Cosmos Editor Independent Results Scrolling
- Cosmos editor query results now use a dedicated scroll area inside the results modal, so long result lists do not stretch the rest of the modal.
- Added a smaller results-list cap for narrower screens while keeping the document editor and modal footer accessible.
- (Ref: #1006,
admin_settings.html,styles.css, Cosmos DB JSON Editor)
(v0.250.049)
Bug Fixes
- Cosmos Editor Page Size Enforcement
- Empty Cosmos editor browse mode now respects the selected page size up to the 100-document cap instead of always requesting 100 items.
- This keeps small page-size selections useful for compact validation and targeted inspection.
- (Ref: #1006, Cosmos DB JSON Editor,
functions_data_management.py)
User Interface Enhancements
- Cosmos Editor Results Modal
- Moved Cosmos editor query results and the JSON document editor into a large scrollable modal opened by Run Query.
- Kept the Data Management card focused on unlock, container selection, page size, and query setup while the modal provides compact result rows, a scrollable results pane, document refresh, Next Page, and Save JSON controls.
- (Ref: #1006,
admin_settings.html,admin_data_management.js,COSMOS_DB_JSON_EDITOR.md)
(v0.250.048)
New Features
- Admin Cosmos DB JSON Editor
- Added an admin-only Data Management tool for selecting SimpleChat Cosmos DB containers, running paged SELECT queries, opening individual documents, editing JSON, and saving changes with ETag concurrency protection.
- Empty browse mode is capped at the first 100 documents, while custom SELECT queries page beyond 100 through continuation tokens without returning oversized result sets in one request.
- The interface is protected by danger acknowledgements, blocks
idand partition key edits, and records editor actions plus save summaries in Activity Logs. - (Ref: #1006,
COSMOS_DB_JSON_EDITOR.md,functions_data_management.py,route_backend_data_management.py,admin_settings.html,admin_data_management.js)
(v0.250.047)
Bug Fixes
- CosmosClient Import Binding CodeQL Cleanup
- Replaced direct
CosmosClientimports with module-qualifiedazure_cosmos.CosmosClientlookups so tests and diagnostics that patchazure.cosmos.CosmosClientare observed consistently. - Updated the Cosmos query plugin functional test to patch the module-qualified SDK client and avoid live Cosmos connections during app-module imports.
- (Ref:
config.py,functions_data_management.py,route_backend_plugins.py,cosmos_query_plugin.py,test_cosmos_query_plugin.py)
- Replaced direct
(v0.250.046)
Bug Fixes
- Conversation Cache Invalidation Authorization
- Route-level message mutation cache invalidation now loads personal conversations through the existing ownership authorization helper instead of directly reading a request-derived conversation id.
- Updated PR-readiness functional test fixtures to match the current document access index config imports and avoid live Cosmos connections during notification regression tests.
- (Ref:
route_backend_conversations.py,test_chat_completion_notifications.py, DAI functional test fixtures)
(v0.250.044)
New Features
- Development Requirements Overlay
- Added a root
requirements-dev.txtfor test and development-only Python dependencies that are not already included in the base app requirements. - The overlay includes pytest, pytest Playwright integration, and Azure Playwright management support so local validation can be installed without duplicating the production dependency set.
- (Ref:
requirements-dev.txt, testing dependencies, local development setup)
- Added a root
(v0.250.043)
New Features
- Redis Explorer SimpleChat Resolution
- Redis Explorer now resolves
DAI_LIST_CACHE_VERSION:{hash}keys to safe SimpleChat scope metadata when possible, including user/group/public workspace identity, workspace name/status, DAI row counts, and source/access-role summaries. - Added DAI cache hygiene counters to Redis Monitoring for payload keys, version markers, no-expiry markers, and the active version-marker TTL policy.
- (Ref:
functions_redis_monitoring.py,functions_document_access_index.py,admin_settings.html,admin_settings.js,REDIS_EXPLORER.md)
- Redis Explorer now resolves
Bug Fixes
- DAI Redis Version Marker TTL Hygiene
- DAI Redis version marker keys now receive a bounded TTL that outlives DAI payload cache entries instead of remaining in Redis indefinitely.
- Marker TTLs refresh on DAI cache reads, cache invalidations, and app-maintenance hygiene; existing no-expiry markers are repaired in place rather than deleted.
- With the current 900-second DAI payload TTL, version markers are refreshed to 3,600 seconds.
- (Ref: DAI Redis cache version markers,
refresh_document_access_cache_version_marker_ttls, app maintenance)
(v0.250.041)
User Interface Enhancements
- Redis Explorer Browse-All Layout
- Improved Redis Explorer with a fixed-height modal where the key list and sanitized preview pane scroll independently, keeping pagination controls and selected preview context easier to use.
- Added an explicit Browse All action, clearer Apply Filter and Previous Page/Next Page controls, page/scope status text, and guidance for app settings cache key names such as
APP_SETTINGS_CACHE. - (Ref:
REDIS_EXPLORER.md,admin_settings.html,admin_settings.js, Redis Explorer)
(v0.250.040)
New Features
- Redis Explorer
- Added an admin-only Redis Explorer in Admin Settings > Scale > Redis Monitoring for read-only, cursor-paginated Redis key browsing with substring filtering and page-size controls.
- Admins can select a key to view sanitized metadata and bounded preview content; session, token, cookie, credential, password, secret, authorization, and CSRF-like keys return restricted previews.
- JSON previews redact sensitive fields and all browser rendering uses text-safe DOM updates.
- (Ref:
REDIS_EXPLORER.md,functions_redis_monitoring.py,route_backend_settings.py,admin_settings.html,admin_settings.js)
(v0.250.039)
New Features
- Phase 9 Cosmos Performance Runbooks
- Added support guidance for rebuilding caches, rebuilding the Document Access Index, cleaning stale operational cache documents, applying expected Cosmos composite indexes, interpreting shadow validation diffs, and interpreting DAI fallback/cache metrics.
- Documented when broad source fallback should remain available while DAI repair, backfill, Redis cache, and production fallback telemetry stabilize.
- (Ref:
COSMOS_PERFORMANCE_OPTIMIZATION_PLAN.md, Cosmos maintenance, DAI runbooks)
User Interface Enhancements
- Guarded Cosmos Index Apply Action
- Added an Admin Settings > Scale > Cosmos Maintenance action for applying missing expected Cosmos composite indexes through the existing app-maintenance endpoint.
- The confirmation modal explains that updates are additive and preserve existing indexing policy paths, but can add write-index overhead and trigger asynchronous Cosmos index transformation.
- (Ref:
admin_settings.html,admin_settings.js,functions_cosmos_indexing.py, app maintenance)
(v0.250.037)
Bug Fixes
- Settings Container RU Write Suppression
- Reduced idle Cosmos DB
settingscontainer RU consumption by stopping routine status refreshes, no-op autoscale checks, and generic settings writes from creating unrelated cache/version churn. - Conversation cache versioning and volatile chat bootstrap/conversation payloads now require Redis; when Redis is unavailable, the app bypasses those caches and falls back to source Cosmos query behavior instead of writing cache artifacts to
settings. - Document Access Index status now uses short-lived in-process state caching and skips shadow-validation state reads when shadow validation is disabled.
- Post-deploy validation showed
settingsdropped out of the top normalized RU consumers during idle monitoring. - (Ref:
functions_settings.py,functions_cosmos_throughput.py,functions_shared_cache.py,functions_conversation_cache.py,functions_document_access_index.py,SETTINGS_CONTAINER_RU_WRITE_SUPPRESSION_FIX.md)
- Reduced idle Cosmos DB
(v0.250.035)
Bug Fixes
- Conversation Cache Mark-Read Invalidation Tuning
- Normal conversation switching now skips mark-read requests when the client has no unread assistant-response state, reducing unnecessary conversation feed cache invalidations during page reloads and navigation.
- The mark-read API now only upserts the conversation and bumps the user-scoped conversation cache version when unread conversation fields actually changed; notification clearing remains intact.
- (Ref: conversation cache invalidation, mark-read flow,
chat-conversations.js,route_backend_conversations.py,test_conversations_read_ownership_authorization.py)
(v0.250.034)
New Features
- Conversation Cache Metrics Dashboard
- Added DAI-style rolling metrics for conversation list, feed, and advanced-search cache activity, including 15-minute hit rate, hits/misses, bypasses/errors, writes/invalidations, operation mix, last cache event, and last invalidation.
- Exposed normalized conversation cache settings and metrics through app maintenance status without adding Cosmos reads to the conversation hot path.
- Removed the Phase 4 badge from the Conversation Cache card now that the feature is part of the operational dashboard.
- (Ref: conversation cache metrics,
functions_conversation_cache.py,functions_app_maintenance.py,admin_settings.html,admin_settings.js)
(v0.250.033)
New Features
- Phase 4 Conversation Cache Hardening
- Hardened conversation list, feed, and advanced-search caching behind an explicit
enable_conversation_cachesetting. - Added Admin Settings > Scale controls for enabling conversation cache and adjusting the conversation cache TTL without requiring direct Cosmos settings edits.
- Redis remains optional: enabled cache paths use the shared Redis-first/Cosmos-fallback helper, while disabled cache paths bypass cache reads and writes and continue using source Cosmos queries.
- Conversation cache entries remain user-scoped and versioned, with collaboration-aware feed/search fingerprints based on the user’s group-access state.
- (Ref: conversation cache, optional Redis fallback,
functions_conversation_cache.py,route_backend_conversations.py,admin_settings.html)
- Hardened conversation list, feed, and advanced-search caching behind an explicit
Bug Fixes
- Conversation Cache Invalidation Coverage
- Added cache invalidation after metadata reads normalize and persist legacy/missing
chat_typevalues so cached list/search payloads do not remain stale. - Updated conversation cache and ownership authorization regressions to cover disabled-cache bypass, source fallback, and route wiring.
- (Ref: conversation metadata normalization, cache invalidation,
test_cosmos_wave2b_conversation_cache.py,test_conversations_read_ownership_authorization.py)
- Added cache invalidation after metadata reads normalize and persist legacy/missing
(v0.250.032)
New Features
- Phase 3 Low-Churn Cache Hardening
- Hardened the shared low-churn cache foundation for custom pages/navigation and chat bootstrap data.
- Added safe shared-cache diagnostics for hit, miss, write, delete, and version-bump activity using hashed cache-key context, and exposed those metrics through app maintenance status.
- Expanded chat bootstrap cache invalidation coverage across group and public workspace metadata, membership, role, ownership, status, model endpoint, Control Center, and SimpleChat operation mutations.
- (Ref: shared cache metrics, chat bootstrap cache, custom pages cache,
functions_shared_cache.py,functions_app_maintenance.py)
Bug Fixes
- Low-Churn Cache Invalidation Coverage
- Fixed stale chat bootstrap labels after group rename/update paths by invalidating the global chat bootstrap cache after successful group metadata writes.
- Custom pages/navigation cache now invalidates after app settings writes so menu and feature-setting changes do not wait for TTL expiry.
- (Ref: group metadata updates, custom page settings invalidation,
route_backend_groups.py,functions_settings.py)
- Public Workspace Document Manager Approval
- Fixed document-manager request approval so the manager addition and pending-request cleanup are persisted in a single workspace update instead of risking a stale overwrite.
- The approval and rejection flows now invalidate chat bootstrap cache state for public workspace visibility updates.
- (Ref: public workspace document managers,
functions_public_workspaces.py,test_cosmos_wave2a_chat_bootstrap_cache.py)
(v0.250.030)
New Features
- Redis Document Access Index Cache
- Added Redis read-through caching for DAI-backed document list, tag list, and legacy-count reads with scope-version invalidation and bounded TTL controls.
- Admin Settings now shows Redis DAI cache health, hit/miss/bypass/error metrics, invalidations, and the latest cache event alongside DAI read and maintenance status.
- (Ref: DAI Redis cache,
functions_document_access_index.py,admin_settings.html,admin_settings.js)
Bug Fixes
- DAI Cache Invalidation and Repair Safety
- Hardened DAI cache invalidation so access changes fail closed when Redis invalidation cannot be proven safe, including revoked-share, delete, partial projection failure, and untracked repair-state scenarios.
- Preserved historical revoked scopes through repair and blocked DAI/cache reads while repair safety is unknown.
- (Ref: DAI cache invalidation, projection repair backlog,
test_cosmos_wave6_document_access_cache.py)
- DAI List Parity Improvements
- DAI document-list reads now include pending shared documents needed by approval UI, preserve generated-artifact requester identity for public workspace actions, collapse legacy revisions like source reads, and match source exact/case-sensitive classification and array filters.
- DAI tag-list reads now project file names for legacy rows so distinct legacy documents without revision-family metadata do not collapse into a single tag-count identity.
- External public DAI lists now use unfiltered DAI legacy counts so legacy-update prompts match source-backed behavior.
- (Ref: DAI list parity, public workspace documents, external public documents)
- Maintenance Failure Visibility
- Manual app maintenance runs now surface failed step status instead of reporting full success, and Admin Settings keeps detailed DAI status visible when a run completes with errors.
- The DAI maintenance status now reports automatic maintenance only when the app-maintenance scheduler gates are enabled and startup maintenance can actually run.
- Optional shadow-validation source queries now fail open after successful DAI reads so diagnostics cannot break served list responses.
- (Ref: app maintenance, DAI shadow validation,
functions_app_maintenance.py, document list routes)
(v0.250.015)
Bug Fixes
- Anonymous Notification Polling 401 Log Reduction
- Stopped loading the notification polling script for unauthenticated sessions, preventing the login screen from repeatedly calling
/api/notifications/countafter idle timeout or before sign-in. - This reduces expected 401 noise in App Service log streams and Application Insights while preserving notification badge polling for authenticated users.
- (Ref: notification polling, idle timeout,
base.html,notifications.js,test_notification_polling_redirect_guard.py)
- Stopped loading the notification polling script for unauthenticated sessions, preventing the login screen from repeatedly calling
(v0.250.010)
New Features
- Audio File Runtime Support
- Added default-on FFmpeg and FFprobe packaging for container builds so SimpleChat can transcode a much broader set of audio files before Azure Speech transcription.
- Expanded recognized audio upload extensions to include common containers and codecs such as 3GA, AAC, AC3, AIFF, AMR, AU, CAF, FLAC, M4A/M4B/M4R, Matroska audio, MP2/MP3/MPA, OGG/Opus/Speex, WAV, WebM audio, WMA, and WavPack.
- Added Admin Settings runtime guidance showing whether FFmpeg broad transcoding is available in the current app runtime and which audio upload extensions are recognized.
- Added
SIMPLECHAT_INSTALL_FFMPEG/INSTALL_AUDIO_FFMPEGbuild controls for deployments that need to opt out of bundling FFmpeg. - (Ref: audio uploads, FFmpeg runtime,
Dockerfile,functions_documents.py,admin_settings.html,AUDIO_FILE_RUNTIME_SUPPORT.md)
Bug Fixes
- iPhone M4A Upload FFmpeg Fallback
- Fixed supported iPhone
.m4aaudio uploads failing before transcription when the app runtime could not resolve a localffmpegexecutable. - Public Azure environments can now fall back to Azure Speech fast transcription using the original supported source audio file and content type when local segmentation fails because FFmpeg is missing.
- FFmpeg segmentation now targets the first audio stream and emits mono 16 kHz PCM WAV chunks for Speech when FFmpeg is available.
- (Ref: #974,
.m4aupload processing, Azure Speech fast transcription,IPHONE_M4A_FFMPEG_FALLBACK_FIX.md)
- Fixed supported iPhone
(v0.250.008)
Bug Fixes
- Multi-Endpoint Vision Test Connection
- Fixed the Admin Settings Vision Model test button so multi-endpoint models are tested against their configured endpoint instead of always using the legacy GPT endpoint.
- Vision model options now preserve endpoint and model metadata for the test call while keeping the saved deployment-name value compatible with existing settings.
- Removed duplicate backend Vision test connection logic and preserved GPT-5/o-series token handling for Vision test requests.
- (Ref: Vision Model test, multi-endpoint model endpoints,
admin_settings.js,admin_settings.html,route_backend_settings.py,MULTI_ENDPOINT_VISION_TEST_CONNECTION_FIX.md)
(v0.250.007)
- Malicious PR Security Review Workflow
- Added a static malicious-change review workflow for pull requests into
Development, with manual dispatch options for custom review ranges and full-file scans. - Added a reusable security review prompt and focused functional coverage for dependency pinning policy, hidden Unicode detection, suspicious egress markers, and workflow wiring.
- (Ref: malicious PR security review,
.github/workflows/malicious-pr-security-review.yml,scripts/check_malicious_pr_security_review.py)
- Added a static malicious-change review workflow for pull requests into
(v0.250.006)
New Features
- Chat Scroll Behavior and 508 Usability
- Updated chat message rendering so the viewport no longer jumps to the very bottom of long assistant responses when they finish loading while the user is reading near the top.
- Auto-scroll now only occurs when the user is already near the bottom of the conversation, and a floating “scroll to latest message” button appears when new content arrives below the current view.
- This aligns the chat experience more closely with other AI chat tools and reduces unexpected motion for 508 testers and keyboard users.
- (Ref:
chats.html,chat-global.js,chat-messages.js)
(v0.250.005)
Bug Fixes
- Admin Settings Save 500 Fix
- Fixed an issue where saving Admin Settings returned an HTTP 500 error even though configuration changes were successfully persisted.
- The
/admin/settingsPOST handler now uses Flask’scurrent_appwhen regenerating custom logo and favicon files after a successful settings update, eliminating theNameError: name 'app' is not definedin the post-save path. - (Ref: admin settings save, logo/favicon regeneration,
route_frontend_admin_settings.py,ADMIN_SETTINGS_SAVE_500_FIX.md)
(v0.250.004)
Bug Fixes
- Model Endpoint Management Cloud Normalization
- Fixed model endpoint saves so managed identity and other non-editable cloud paths derive
management_cloudfromAZURE_ENVIRONMENTinstead of persisting the hidden UI default ofpublic. - Added custom-cloud handling for inherited model endpoint authority and Foundry scope defaults while preserving explicit Foundry service-principal cross-cloud selections.
- (Ref: model endpoint authentication,
normalize_model_endpoints,AZURE_ENVIRONMENT,test_model_endpoint_management_cloud_environment.py)
- Fixed model endpoint saves so managed identity and other non-editable cloud paths derive
(v0.250.003)
Bug Fixes
- Admin Settings Update Banner Version Comparison
- Fixed stale cached update-check settings so Admin Settings no longer displays an older release such as
v0.250.001as available when the running app version is newer. - The render path now recomputes
update_availablefrom the cached latest version and the current app version before showing the banner. - (Ref: Admin Settings update banner,
compare_versions,test_admin_update_banner_version_comparison.py)
- Fixed stale cached update-check settings so Admin Settings no longer displays an older release such as
(v0.250.001)
New Features
- Azure Billing Dynamic Charts
- Updated the Azure Billing action chart path to return SimpleChat
simplechartMarkdown instead of server-rendered matplotlib PNG image payloads. - Preserved existing
plot_chart/plot_custom_chartinputs while returningchart_payload,chart_markdown, summary, and renderer metadata for interactive chat display. - Added regression coverage for stacked and pie Azure Billing chart output.
- (Ref: Azure Billing action, dynamic inline charts,
chart_markdown,test_azure_billing_dynamic_charts.py)
- Updated the Azure Billing action chart path to return SimpleChat
- Blueprint Route Security Policies
- Migrated SimpleChat route registration to Blueprint-backed route groups with explicit
before_requestauthentication policies. - Added reusable Blueprint auth helpers that compose the existing login, user, admin, and external bearer-token decorators.
- Added route policy tests covering Blueprint registration, unauthenticated access expectations, public/external route exceptions, and route-test completeness.
- Updated route-authentication prompts, Python route instructions, PR-prep guidance, and CI route validation workflow so future route work must update and run the route policy tests.
- Preserved Custom Pages as login-required with page metadata role checks layered inside the dispatcher.
- (Ref: Blueprint route policies, route auth guardrails,
functional_tests/route_tests/,functions_authentication.py,app.py)
- Migrated SimpleChat route registration to Blueprint-backed route groups with explicit
- Azure OpenAI Identity Setup Guidance
- Added admin setup guidance explaining which identity is used for legacy Azure OpenAI model discovery and which identity or key is used for runtime GPT, embedding, and image generation calls.
- Clarifies that
Fetch Modelsuses Azure Resource Manager deployment listing while chat generation, embeddings, file-upload embedding generation, and image generation use the Azure OpenAI data plane. - (Ref: Azure OpenAI setup guide, Admin Settings model guidance,
AZURE_OPENAI_IDENTITY_SETUP_GUIDE.md)
- Model Endpoint Setup Guidance
- Added in-product Setup Guide buttons beside global, personal, and group model endpoint actions, plus inline setup guidance inside the shared Model Endpoint modal.
- Guidance covers Azure OpenAI, Foundry (classic), and New Foundry provider selection, managed identity and service principal RBAC, and API-key inference-only limitations.
- (Ref: model endpoint modal, Admin Settings model endpoints, workspace endpoints, Foundry RBAC setup)
- Tabular SK Large Result Pagination
- Added continuation metadata for row-returning tabular Semantic Kernel tools, including
start_row,page_size,has_more, andnext_start_row. - Added safe row payload trimming for oversized tool results, while preserving explicit
return_columnsprojection and protected row metadata used for sheet context, matched values, and row-linked document evidence. - Raised tabular computed-results handoff guardrails to 100K characters with warning logs when truncation is still required.
- Inspired by and adapted from PR #894 by @vivche.
- (Ref: tabular SK pagination,
return_columns, large-result handoff,tabular_processing_plugin.py,route_backend_chats.py)
- Added continuation metadata for row-returning tabular Semantic Kernel tools, including
- Beta Feature Integration with Development Governance
- Prepared the beta feature branch for integration with the latest
Developmentgovernance, custom pages, and user settings cache changes. - Preserved beta capabilities for agent catalog customization, file sync, workflows, workspace identities, Data Management, and chat/workspace productivity while applying Development governance gates where required.
- (Ref: Development merge resolution, governance integration, PR readiness)
- Prepared the beta feature branch for integration with the latest
- User Settings Cache Optimization
- Added request-scoped memoization for full user settings reads and a lightweight user UI settings cache that works with Redis-enabled and no-Redis deployments.
- Shared page scripts now reuse injected UI preferences for dark mode and navigation layout before falling back to the full user settings API.
- (Ref: user settings cache, user UI settings cache,
functions_settings.py,app_settings_cache.py,dark-mode.js,sidebar.js)
- Custom Pages
- Added administrator-managed custom pages with static HTML/CSS/JS assets, optional Python-backed page extensions, and authenticated host routes for publishing internal experiences inside SimpleChat.
- Added Admin Settings controls, navigation wiring, example page templates, documentation, and functional coverage for disabled-by-default fail-closed behavior.
- (Ref: custom pages, Admin Settings Custom Pages tab,
route_custom_pages.py,functions_custom_pages.py)
- Governance Controls for Endpoints, Agents, and Actions
- Added in-app governance policies that let administrators control access to personal, group, and global endpoints, agents, and actions.
- Added feature-level policies, delegated item policies, review workflows, backend enforcement, and Admin Settings UI for managing governance allowlists.
- (Ref: governance policies, delegated item policies, Admin Settings Governance tab)
- Governance and App Settings Cache Versioning
- Added cache-version coordination so settings and governance policy changes can invalidate stale worker process caches across Redis-enabled and non-Redis deployments.
- Keeps hot-path settings and governance checks fast while reducing stale reads after admin changes.
- (Ref: app settings cache, governance cache versioning)
- Pull Request Preparation Prompt
- Added a reusable Copilot prompt for preparing SimpleChat branches for pull requests into
Development. - The workflow verifies branch freshness against
Development, runs repo-aligned validation checks, updates release notes when needed, and gates push or PR creation behind explicit user confirmation. - Optional merge or rebase from
Developmentis supported only when requested, with conflicts resolved interactively by the agent after explaining each side of the conflict. - (Ref:
.github/prompts/prepare-for-pull-request.prompt.md, PR readiness workflow, Development branch validation)
- Added a reusable Copilot prompt for preparing SimpleChat branches for pull requests into
- Tableau Action
- Added a first-class, read-only Tableau action powered by
tableauserverclientfor discovering Tableau Server and Tableau Cloud projects, workbooks, views, datasources, and workbook details. - Added a dedicated Tableau action configuration workflow with server/site fields, PAT and username/password authentication, reusable workspace identity support, discovery limits, schemas, health validation, and Semantic Kernel loader integration.
- (Ref:
tableau_plugin.py,tableau_plugin_factory.py,functions_tableau_operations.py,plugin_modal_stepper.js,TABLEAU_ACTION.md)
- Added a first-class, read-only Tableau action powered by
- Snowflake Action
- Added a first-class Snowflake action type for querying Snowflake data warehouses through the Snowflake Python Connector, focused on read-only data retrieval for agent analysis, charts, generated documents, and exports.
- Added tailored action configuration for account, warehouse, default database/schema, role, password/key-pair/OAuth authentication, reusable workspace identities, and query execution limits.
- Added read-only SQL enforcement, automatic result limiting, structured column/row responses, Semantic Kernel loader integration, Key Vault secret handling, governance labels, schemas, feature documentation, and functional coverage.
- Uses
snowflake-connector-python[pandas]==3.18.0so the local Python 3.13 development environment can install from wheels without requiring native C++ build tooling. - (Ref:
SnowflakePlugin,SnowflakePluginFactory, Snowflake action modal,SNOWFLAKE_ACTION.md)
- Workflow Per-Document Analysis and Generated Office Exports
- Added a workflow Analyze mode that runs the same prompt against each selected document separately, then combines the per-document replies, coverage, citations, generated artifacts, and alert targets into the workflow result.
- Added SimpleChat action tools for generated Word documents and PowerPoint presentations, with group workflow uploads defaulting to the current group workspace while preserving existing group access checks.
- (Ref:
functions_document_actions.py,functions_workflow_runner.py,functions_simplechat_operations.py,simplechat_plugin.py,WORKFLOW_PER_DOCUMENT_ANALYSIS_AND_EXPORTS.md)
- Group Workflows
- Added group-scoped workflows with dedicated Cosmos containers for workflow definitions, run history, and per-document run items.
- Group workflow APIs now support create, edit, delete, run, history, resume-failed, agent selection, File Sync sources, and activity streaming while revalidating group membership and assignment gating.
- Added Admin Settings controls for enabling group workflows, requiring group assignment, managing assigned groups, and applying the existing owner-only management policy to group workflows.
- Added a Group Workflows tab to group workspaces and updated the shared workflow UI/activity page to support personal and group workflow scopes.
- (Ref:
functions_group_workflows.py,route_backend_workflows.py,functions_workflow_runner.py,group_workspaces.html,workspace_workflows.js,GROUP_WORKFLOWS.md)
- Voice-Assisted Form Inputs and Agent Instruction Drafting
- Added speech-to-text microphone controls to supported agent, group, public workspace, document metadata, and tag-name fields when speech input is enabled.
- Added an agent Instruction Brief field and Draft Instructions action that sends typed or dictated context to the configured GPT/APIM model, then inserts editable Markdown instructions before save.
- Dictated tag names are normalized to lowercase safe tag values, and dictated document keywords are normalized to comma-separated values.
- (Ref:
form-voice-input.js,agent_modal_stepper.js,/api/agents/draft-instructions,VOICE_ASSISTED_FORM_INPUTS.md)
- Microsoft Graph Send Mail Action
- Microsoft Graph actions can now create manual drafts, prepare delayed-delivery drafts from 5 to 600 seconds, or send mail automatically from the signed-in user’s mailbox.
- Added plugin configuration for default delivery mode and delay seconds, with runtime validation and Graph scopes for draft creation, delayed draft submission, and immediate send flows.
- (Ref: Microsoft Graph action,
MSGraphPlugin.send_mail,plugin_modal_stepper.js,MSGRAPH_SEND_MAIL_ACTION.md)
- Workspace-Backed Chat Upload Replacement
- Eligible chat uploads now use the personal workspace document as the source of truth instead of also running the legacy chat-local extraction and chat blob storage path.
- Chat creates a lightweight workspace-backed file message with processing progress and automatically includes ready linked workspace documents in regular and streaming chat search context for enhanced citations.
- Fixed the chat handoff queue helper to use the configured Flask executor extension, preventing orphaned personal workspace rows from remaining at queued 0% when background processing was not submitted.
- (Ref:
route_frontend_chats.py,route_backend_chats.py,functions_documents.py,CHAT_UPLOAD_PERSONAL_WORKSPACE_HANDOFF.md)
- Chat Upload Personal Workspace Handoff
- Eligible chat uploads now queue a personal workspace document while preserving the existing chat attachment/image message behavior and fallback flow.
- Chat-uploaded workspace documents receive the
conversationstag plus the conversation ID tag, store explicit source metadata, and surface processing progress in the chat message with the same document status fields used by workspace uploads. - Workspace metadata and delete flows now show when a document is linked to a conversation.
- (Ref:
route_frontend_chats.py,functions_documents.py,workspace-documents.js,chat-messages.js,CHAT_UPLOAD_PERSONAL_WORKSPACE_HANDOFF.md)
- Chat Upload Personal Workspace Handoff Design
- Added a proposed implementation plan for routing eligible chat file uploads into the user’s personal workspace while preserving the existing chat attachment experience and fallback flow.
- Documented the recommended metadata, conversation tags, delete lifecycle, search/analyze/compare implications, security checks, failure modes, testing plan, and staged rollout for the handoff.
- (Ref:
CHAT_UPLOAD_PERSONAL_WORKSPACE_HANDOFF.md, chat uploads, personal workspace documents, conversation-linked document lifecycle)
- Document Intelligence Auto Mode and PDF Reprocessing
- Added Auto extraction for PDFs and images so admins can sample the first PDF pages with Layout and let SimpleChat finish with Read or Layout based on detected tables or selection marks.
- Expanded Search & Extract guidance with a Read/Layout/Auto help modal, Auto sample-page control, and clearer Layout benefit/cost copy including the 6X increase for every 1000 pages.
- Added Read/Layout extraction badges plus single-document and bulk PDF reprocess actions in personal, group, and public workspaces. New PDF/image uploads preserve their source blob so PDFs can be reprocessed later when available.
- (Ref:
DOCUMENT_INTELLIGENCE_PDF_IMAGE_EXTRACTION_MODE.md,functions_documents.py, Admin Settings Search & Extract, workspace document actions)
- Cosmos Native Autoscale Conversion
- Added global and per-container policy controls that let admins convert dedicated manual Cosmos throughput to native Cosmos autoscale.
- Added manual Convert actions for database and container throughput so admins can move eligible manual throughput to autoscale from the Admin Settings Scale tab.
- Background throughput automation can now prioritize eligible manual-to-autoscale conversions before utilization-based RU scale decisions, while preserving configured min and max guardrails.
- (Ref:
functions_cosmos_throughput.py, Admin Settings Scale tab,COSMOS_NATIVE_AUTOSCALE_CONVERSION.md)
- Document Intelligence PDF and Image Extraction Mode
- Added a Search & Extract admin setting that lets administrators choose Read or Layout extraction for PDF and image uploads.
- Read keeps the faster text-extraction path, while Layout captures richer structure such as tables, document layout, and checked or unchecked selection marks with some added parsing latency.
- New PDF and image ingestion records
document_intelligence_extraction_modemetadata so extracted documents identify whether Read or Layout was used. - (Ref:
admin_settings.html,functions_content.py,functions_documents.py,DOCUMENT_INTELLIGENCE_PDF_IMAGE_EXTRACTION_MODE.md)
- Cosmos Container Policy Enforcement
- Added an Admin Settings option to enforce the global Cosmos throughput automation policy across every dedicated-throughput container.
- New containers discovered by Refresh or the background autoscale loop inherit the same global thresholds, intervals, RU step sizes, and guardrails automatically.
- Added an Apply Global Policy action in the Containers modal to stage the current global policy onto all currently discovered containers while preserving per-container cooldown timestamps.
- (Ref:
functions_cosmos_throughput.py,admin_settings.html,admin_settings.js,COSMOS_CONTAINER_POLICY_ENFORCEMENT.md)
- Cosmos DB Throughput Autoscale Controls
- Added Cosmos DB RU monitoring to the Admin Settings Scale tab, including database throughput status, recent normalized RU utilization, and per-container request-unit visibility.
- Added guarded manual Scale Up and Scale Down actions plus optional background automation with separate up/down thresholds, intervals, RU step sizes, and minimum/maximum guardrails.
- Added deployment metadata app settings and a custom Cosmos throughput operator role so the app identity can adjust throughput and read metrics without exposing Cosmos data-plane access to agents or user actions.
- (Ref:
functions_cosmos_throughput.py, Admin Settings Scale tab, Cosmos throughput autoscale,COSMOS_THROUGHPUT_AUTOSCALE.md)
- Workflow File Sync Triggers and Batch Resume
- Added File Sync Before Run controls so workflows can trigger selected personal, group, or public File Sync sources before the workflow prompt executes.
- Added Monitor File Sync Changes mode, which checks selected sync sources on the configured interval and only runs the workflow when new or changed files are detected.
- Added dynamic Analyze targeting for changed synced documents, per-document workflow run item tracking, and a Resume failed action that reruns failed document items from a previous Analyze workflow run.
- (Ref:
functions_personal_workflows.py,functions_workflow_runner.py,functions_file_sync.py,route_backend_workflows.py,workspace_workflows.js,WORKFLOW_FILE_SYNC_TRIGGERS.md)
- OneDrive File Sync and Source Selection UX
- Added OneDrive as a personal-workspace File Sync source that pulls selected OneDrive files and folders into the existing SimpleChat document processing, chunking, embedding, and Azure AI Search indexing pipeline.
- Added provider browsing and selected folder/file controls so users can sync the source root, specific folders, or specific files, with Include subfolders moved into the source-selection and filter workflow.
- Added remote change-token handling for provider-native IDs and eTags/cTags before content checksum fallback, improving change detection for cloud-drive files.
- (Ref:
functions_file_sync.py,route_backend_file_sync.py,workspace-file-sync.js,ONEDRIVE_FILE_SYNC.md,test_file_sync_onedrive_personal.py)
- Global Cloud Drive Connector Identities
- Extended global workspace identities so admins can manage File Sync cloud-drive connector credentials separately from personal user sync choices.
- OneDrive File Sync now resolves an admin-managed global File Sync client-secret identity before falling back to legacy app registration configuration, keeping tenant-level Graph credentials out of the personal source setup flow.
- Updated Admin Settings and workspace identity UI guidance to clarify that users choose what to sync while admins own tenant cloud-drive connector permissions.
- (Ref:
functions_workspace_identities.py,functions_file_sync.py,workspace-identities.js,admin_settings.html,WORKSPACE_IDENTITIES.md)
- Azure Files File Sync Source
- Added Azure Files as a first-class File Sync source type so workspaces can sync from Azure Storage file shares using a file service URL, share name, and optional directory path.
- Added Azure Files-compatible reusable identity support for managed identity, service principal client secret, and storage connection string authentication while keeping SMB sources on username/password or anonymous authentication.
- Updated File Sync source selection, admin source-type visibility controls, synced-document badges, documentation, and regression coverage for the new Azure Files connector.
- (Ref:
functions_file_sync.py,functions_workspace_identities.py,workspace-file-sync.js,workspace-identities.js,AZURE_FILES_FILE_SYNC.md,test_file_sync_azure_files_identity.py)
- Conversation Feed Pagination
- Added a paged conversation feed so chat startup loads pinned conversations, unread conversations, and the first 20 recent conversations instead of pulling every accessible conversation into the browser.
- Added load-more and near-bottom scroll loading for both the main conversation list and docked sidebar, with backend-driven title search that is not limited to the currently loaded page.
- Hidden conversations are excluded from the default feed and reloaded only when users enable the hidden-conversation toggle.
- (Ref:
route_backend_conversations.py,functions_conversation_feed.py,chat-conversations.js,chat-sidebar-conversations.js,CONVERSATION_FEED_PAGINATION.md)
- Group File Share Approval Notifications
- Added notifications when personal and group documents are shared, approved, or denied so recipients know when a file needs review and share owners know the outcome.
- Group document shares now require approval by the receiving group’s Owners, Admins, or Document Managers before the file becomes searchable in that group.
- Receiving groups now see Approve or Remove actions for shared files, cannot delete the owner group’s document, and cannot view the owner group’s shared-recipient list.
- (Ref: group document sharing approval,
route_backend_group_documents.py,route_backend_documents.py,functions_notifications.py,group_workspaces.html,GROUP_FILE_SHARE_APPROVAL_NOTIFICATIONS.md)
- Stats Time Windows and CSV Exports
- Added 7-day, 30-day, 90-day, and custom date windows to personal profile stats, group stats, and public workspace stats so these pages match the Control Center activity-trends experience.
- Added CSV export actions for personal, group, and public stats with selectable metric sections and matching predefined or custom export windows.
- Centralized stats window parsing and daily bucket generation for consistent labels, chart ranges, and backend filtering across all three stats surfaces.
- (Ref: profile stats, group stats, public workspace stats,
functions_stats_windows.py,route_frontend_profile.py,route_backend_groups.py,route_backend_public_workspaces.py)
- Personal Workflow Access Governance
- Added a dedicated Admin Settings Workflow section so personal workflows can be explicitly enabled or disabled.
- Added optional
WorkflowUserEnterprise App role enforcement for workflow UI access, API routes, manual runs, activity views, and SimpleChat workflow creation operations. - Added
WorkflowUserapp role definitions to Azure CLI and Terraform deployer assets, with deployer version tracking updated. - (Ref: workflow access control,
functions_settings.py,route_backend_workflows.py,route_frontend_admin_settings.py,PERSONAL_WORKFLOWS.md,WORKFLOW_ACCESS_CONTROL_FIX.md)
- Azure Commercial Databricks Action
- Added a first-class Databricks action type for Azure Commercial workspaces, using the Databricks SQL Statement Execution API rather than an ODBC driver.
- Added action modal configuration for workspace URL, SQL Warehouse ID, catalog/schema defaults, token/service-principal/managed-identity auth, execution limits, and reusable identity selection.
- Added read-only SQL enforcement, factory-based Semantic Kernel loading, manifest validation, schemas, feature documentation, and functional/UI coverage.
- (Ref:
DatabricksPlugin,DatabricksPluginFactory, Databricks action modal,DATABRICKS_ACTION_CONFIGURATION.md)
- Model Context Protocol Actions
- Added first-class MCP action support with transport, authentication, timeout, tool allowlist, and cached tool metadata configuration in the shared action modal.
- Added server-side MCP tool discovery plus runtime tool invocation through Semantic Kernel’s MCP connector, including dynamic tool function registration for agents.
- Restricted stdio MCP transport to admin-managed global actions because it launches server-side commands, while remote transports support streamable HTTP, SSE, and WebSocket.
- (Ref: MCP actions, Semantic Kernel MCP connector,
functions_mcp_operations.py,mcp_plugin.py,mcp_plugin_factory.py,route_backend_plugins.py,plugin_modal_stepper.js,MCP_ACTION_CONFIGURATION.md)
- Layered Message Masking
- Added mask-plus and mask-minus controls so users can add multiple selected-text masks to the same chat message.
- Full-message masks now layer independently from selected-text masks, allowing users to remove the full-message mask while preserving prior selected ranges.
- Extended masking support to collaborative personal and group conversations, including shared event updates and source-message metadata sync.
- (Ref: message masking, collaborative conversations,
functions_message_masking.py,route_backend_chats.py,route_backend_collaboration.py,chat-messages.js,chat-collaboration.js)
- Workspace and Global Identities
- Promoted reusable identities into first-class personal, group, and public workspace tabs instead of managing them from the File Sync source list.
- Added an admin-managed Global Identities tab for credentials shared by global agents, actions/plugins, model endpoints, and future global integrations.
- Added a dedicated global identity Cosmos DB container while keeping public workspace identities limited to File Sync usage and excluding File Sync from global identities.
- (Ref: workspace identities, global identities,
functions_workspace_identities.py,route_backend_workspace_identities.py,workspace-identities.js,_sidebar_nav.html)
- Visio Ingestion and Citation Previews
- Added native
.vsdxupload support that parses Visio package XML and indexes each diagram page as a structured searchable chunk. - Enhanced citations now render a lightweight PNG preview for the cited Visio page and keep the original
.vsdxavailable for download. - Added functional and UI coverage for Visio parsing, preview rendering, and chat citation modal behavior.
- (Ref: Visio ingestion, enhanced citations,
functions_visio.py,functions_documents.py,route_enhanced_citations.py,chat-enhanced-citations.js,test_visio_ingestion_preview.py,VISIO_INGESTION.md)
- Added native
- Outlook MSG File Ingestion
- Added support for Outlook
.msgfiles so saved email messages can be uploaded into workspaces and participate in document processing, metadata extraction, chunking, search, and chat grounding. - Email files now fit the same workspace knowledge workflow as other supported business documents, helping users bring message-based context into conversations without manually copying mail content.
- (Ref: Outlook MSG ingestion, workspace uploads, document processing,
functions_content.py,functions_documents.py)
- Added support for Outlook
- Assigned Knowledge for Agents
- Added agent-level Assigned Knowledge so agent creators can bind agents to governed workspace sources, documents, and tags.
- Chat now resolves the selected agent from trusted server-side records and enforces its assigned search scope for both regular and streaming chat, including personal, group, and public workspace boundaries.
- When an Assigned Knowledge agent is selected in chat, document search is forced on and the workspace, document, and tag controls become read-only while displaying the agent’s configured knowledge context.
- (Ref: Assigned Knowledge, agent modal Knowledge step, chat document search enforcement,
functions_assigned_knowledge.py,route_backend_agents.py,route_backend_chats.py,agent_modal_stepper.js,chat-agents.js,chat-documents.js)
- Deep Research Distroless JavaScript Rendering Runtime
- Added Playwright Chromium packaging for the existing Azure Linux distroless app image so Deep Research can optionally render JavaScript-heavy source pages without changing the final container base image.
- Added a runtime capability check that verifies Chromium launch support and surfaces the status in Admin Settings before admins rely on rendered-page fallback.
- Kept Chromium sandboxing enabled by default, added an explicit
SOURCE_REVIEW_CHROMIUM_NO_SANDBOXescape hatch for reviewed deployments, and capped rendered fetch concurrency withSOURCE_REVIEW_JS_RENDER_MAX_CONCURRENCY. - (Ref: Deep Research JavaScript rendering, distroless container runtime,
Dockerfile,requirements.txt,functions_source_review.py,admin_settings.html)
- Source Review Load More Support
- Source Review can now use the optional rendered-page path to click visible Load More, Show More, View More, and related archive controls on source pages before extracting links and evidence.
- Load More clicks are bounded by a configurable admin cap, stop early when no new content appears, and can stop when requested date-range evidence is visible for prompts such as past three years.
- Existing SSRF, redirect, timeout, page-budget, and content-type protections remain enforced.
- (Ref: Source Review Load More,
functions_source_review.py,admin_settings.html,test_source_review_security.py)
- Source Review Model-Assisted Link Planning
- Deep Source Review can now ask the selected chat model to rank server-extracted child links before additional source pages are fetched, improving general multi-source research without adding question-specific heuristics.
- The planner is bounded to already extracted, policy-approved candidate URLs; invented URLs are ignored and deterministic ordering remains the fallback.
- Added admin control for enabling model-assisted link planning and functional coverage for candidate validation and planner-driven ordering.
- (Ref: Deep Source Review, Source Review link planning,
functions_source_review.py,route_backend_chats.py,admin_settings.html,test_source_review_deep_traversal.py)
- File Sync for Workspace Documents
- Added an optional SMB-based File Sync capability for personal, group, and public workspaces, with scope-specific enablement, allow/block controls, and Redis readiness gating before sync can be enabled.
- Sync sources support UNC paths, credentials with optional Azure Key Vault storage, fixed and parent-folder-derived tags, include/exclude filters, file type filters, manual runs, scheduled runs, history, counts, and debug logging.
- Synced remote file changes reuse the existing same-name document upload behavior to create document versions, and synced-document deletes now ask whether to delete locally only or ignore the remote path for future runs.
- Added Control Center activity-log support for File Sync events and admin warnings for scale and performance considerations.
- (Ref: File Sync, SMB sync sources, workspace Sync tab,
functions_file_sync.py,route_backend_file_sync.py,workspace-file-sync.js,test_file_sync_capability.py,FILE_SYNC.md)
- Source Review for Web Evidence
- Added an optional chat Sources toggle that reviews source pages from pasted URLs and Web Search citations before the final model response is generated.
- Deep Source Review can follow a bounded set of relevant links from source indexes while enforcing SSRF protections, redirect/page-size/time limits, robots.txt handling, and prompt-injection isolation for fetched page text.
- Added admin controls for Source Review defaults, page budgets, domain/user allowlists and blocklists, optional JavaScript rendering fallback, and audit logging.
- (Ref: Source Review,
functions_source_review.py,route_backend_chats.py,admin_settings.html,chats.html,test_source_review_security.py,SOURCE_REVIEW.md)
- Conversation Charts and Workflow Tabular Reuse
- Added chart creation as a core conversation ability so users can request inline charts directly in chat while agents and workflows can still use assigned chart actions.
- Added a reusable tabular analysis import surface for workflow document analysis and comparison, reducing workflow coupling to the chat route while preserving existing chat tabular behavior.
- Enabled Semantic Kernel auto tool invocation in the model-only fallback path so core conversation tools can be called when chart requests are routed through the kernel.
- (Ref: conversation charts, workflow tabular analysis,
semantic_kernel_loader.py,route_backend_chats.py,functions_tabular_analysis.py,functions_workflow_runner.py,test_conversation_chart_and_tabular_reuse.py)
- Generated Markdown Artifact Viewer
- Added a
View MDaction besideDownload MDon generated Markdown artifact cards so users can inspect rendered Markdown directly in Chats before downloading the file. - Reused the citation modal for the rendered view and improved Markdown citation handling so
.mdand.markdowncitations display as sanitized rendered Markdown instead of raw source text. - Added UI regression coverage for rendered previews, rendered artifact modal content, and unsafe attribute stripping.
- (Ref: generated Markdown artifacts, citation modal Markdown rendering,
chat-messages.js,chat-citations.js,test_chat_generated_tabular_output_card.py,GENERATED_ARTIFACT_MARKDOWN_VIEW.md)
- Added a
- Tabular Related Document Evidence
- Added generic row-level related-document resolution for workspace tabular analysis, so when a CSV or workbook row explicitly references a supporting non-tabular file, the tabular path can pull excerpts from that document and use them alongside the computed row results.
- Related document evidence now flows into both the outer tabular handoff and generated structured exports, which helps responses use supporting file context without treating those files as isolated search-only results.
- Added focused regression coverage and versioned feature documentation for the related-document matching, evidence summary, and export prompt wiring.
- (Ref: tabular related-document evidence,
route_backend_chats.py,functions_search_service.py,test_tabular_related_document_evidence.py,test_tabular_computed_results_prompt_priority.py,test_tabular_generated_output_exports.py,TABULAR_RELATED_DOCUMENT_EVIDENCE.md)
- Generated Artifact Workspace Promotion Approval
- Added an
Add to Workspaceaction to generated analysis artifact cards in Chats so users can move reusable exports out of the conversation and into workspace documents. - Personal promotions now queue immediately, while group and public promotions create a visible pending workspace file that must be approved before it becomes usable for search and chat.
- Group and public workspace document lists now show an
Approveaction for pending generated artifacts, and the requester receives approval workflow notifications as the file moves through review and processing. - (Ref: generated artifact promotion,
route_enhanced_citations.py,route_backend_group_documents.py,route_backend_public_documents.py,chat-messages.js,group_workspaces.html,public_workspace.js,test_generated_artifact_workspace_promotion.py,test_chat_generated_tabular_output_card.py)
- Added an
- Chat Clipboard Paste Uploads
- Added direct clipboard upload support in Chats so users can paste copied images and browser-exposed files straight into the main chat message box instead of opening the file picker first.
- The pasted upload flow now reuses the existing chat upload pipeline, including automatic conversation creation, upload consent checks, and backend file processing.
- Clipboard files with empty names are normalized before upload so pasted screenshots still reach the existing extension-based processing path.
- (Ref: chat paste uploads,
chat-input-actions.js,test_chat_clipboard_paste_upload_support.py,test_chat_clipboard_paste_upload_workflow.py,CHAT_CLIPBOARD_PASTE_UPLOADS.md)
- Staging Branch UI Test CI/CD
- Added a protected GitHub Actions workflow for the
Stagingbranch that deploys the Azure Developer CLI staging environment, waits for App Service warm-up, and runs live UI smoke coverage before the environment is considered healthy. - Added a reusable staging bootstrap script for GitHub OIDC app registration, federated credentials, Azure role assignments, GitHub Environment variables, App Service CI authentication settings, and Microsoft Playwright Workspace wiring.
- (Ref:
.github/workflows/staging-azd-ui-tests.yml,deployers/Initialize-GitHubActionsStaging.ps1,docs/explanation/features/v0.241.014/STAGING_UI_CICD.md,test_staging_ui_cicd_workflow.py)
- Added a protected GitHub Actions workflow for the
- Microsoft Playwright Workspaces Staging Runner
- Added Azure-hosted Playwright Workspace support for staging smoke tests, including Node-based Playwright service execution and matching Python smoke coverage for the staging chat experience.
- (Ref:
ui_tests/playwright-workspaces/,ui_tests/test_staging_chat_smoke.py,PLAYWRIGHT_SERVICE_URL)
- Service Principal Authentication for CI UI Tests
- Added a disabled-by-default
/ci-auth/sessionendpoint so staging UI tests can create a Flask session from a fresh Entra access token minted by the GitHub OIDC service principal. - (Ref:
functions_authentication.py,route_frontend_authentication.py,config.py,appRegistrationRoles.json,SIMPLECHAT_UI_AUTH_RESOURCE,ENABLE_CI_BEARER_SESSION_AUTH)
- Added a disabled-by-default
- Profile Sidebar Toggle Style Preference
- Added a profile navigation preference for large versus compact sidebar hide controls and applied it across full and compact sidebar templates.
- (Ref:
profile.html,_sidebar_nav.html,_sidebar_short_nav.html,sidebar.css,route_backend_users.py,test_profile_sidebar_toggle_style_preference.py)
Bug Fixes
- Azure OpenAI Model Discovery Identity Split
- Legacy GPT, embedding, and image
Fetch Modelsroutes now use the configured app registration/service principal management-plane credential for Azure OpenAI deployment discovery instead of implicitly following runtime data-plane managed identity behavior. - Deployer assets now grant the app registration/service principal
Cognitive Services Userfor model discovery while preserving the App Service managed identityCognitive Services OpenAI Userrole for data-plane inference. - (Ref:
route_backend_models.py, deployer OpenAI RBAC,AZURE_OPENAI_MODEL_DISCOVERY_IDENTITY_FIX.md)
- Legacy GPT, embedding, and image
- Chat Model Icon Avatars
- Fixed saved model endpoint icons and uploaded model images not appearing on model-only assistant responses in chat.
- Model icon metadata now flows through multi-endpoint model resolution, streaming and non-streaming response metadata, and assistant avatar rendering for model-only responses.
- Preserved agent avatar priority so agent responses never fall through to the model icon when an agent identity is present.
- (Ref: chat assistant avatars, model endpoint icons,
route_backend_chats.py,chat-messages.js)
- Tabular SK Python 3.13 Kernel Parameter Compatibility
- Updated public tabular
@kernel_functionparameters to avoidAnnotated[Optional[str], ...]so Semantic Kernel argument parsing works on both Python 3.12 and Python 3.13. - Added a guardrail test that fails if optional string annotations are reintroduced on public tabular tool parameters.
- Preserved current Development model-context routing instead of reintroducing older endpoint-specific route wiring.
- Inspired by and adapted from PR #892 by @vivche.
- (Ref: Python 3.13, Semantic Kernel tool parsing, tabular SK parameters,
test_tabular_kernel_parameter_annotations.py)
- Updated public tabular
- Python 3.12 CI and XSS Guardrail Fix
- Updated GitHub workflow Python setup from 3.11 to 3.12 to match the supported SimpleChat runtime and prevent valid Python 3.12 f-string syntax from failing CI parse checks.
- Reworked changed Admin Settings, group workspace delete modal, and profile hero rendering paths to satisfy the XSS sink guardrail without broad suppressions.
- (Ref: Python 3.12 CI, XSS sink validation, Admin Settings bootstrap data, group workspace delete modal, profile hero image)
- PR Readiness Guardrail Cleanup
- Fixed pull-request validation blockers by removing trailing whitespace, dropping an unnecessary
|safefilter from JSON-rendered Admin Settings version data, removing a UTF-8 BOM from the Semantic Kernel loader, and documenting reviewed plugin authorization boundaries for the BAC guardrail. - Keeps the beta branch aligned with SimpleChat PR hygiene, XSS, route, and broken-access-control validation before draft PR creation.
- (Ref: PR readiness,
check_xss_sinks.py,check_broken_access_control.py, Semantic Kernel plugins)
- Fixed pull-request validation blockers by removing trailing whitespace, dropping an unnecessary
- Governance Admin Rendering XSS Hardening
- Reworked changed admin governance, model endpoint, agent, and plugin table rendering paths so untrusted names, descriptions, IDs, and labels are populated with DOM APIs and
textContentinstead of interpolated HTML attributes. - Added narrow reviewed XSS guardrail suppressions only for static Bootstrap modal shells that do not interpolate untrusted values.
- (Ref: governance admin UI, model endpoint table, plugin table rendering, XSS sink validation)
- Reworked changed admin governance, model endpoint, agent, and plugin table rendering paths so untrusted names, descriptions, IDs, and labels are populated with DOM APIs and
- Group Workflow Assignment Cleanup
- Fixed Admin Settings form bloat caused by malformed nested JSON strings being saved as group workflow assignment IDs.
- Group workflow assignment settings now preserve valid group UUIDs, drop invalid payload fragments, and compact the hidden admin form field before save.
- (Ref:
functions_settings.py,admin_settings.js,GROUP_WORKFLOW_ASSIGNMENT_CLEANUP_FIX.md)
- Workflow Activity New-Tab Navigation
- Fixed workflow
Activityactions so they no longer navigate the current workspace tab after opening the activity view in a new tab. - Blocked pop-ups now show a warning toast instead of replacing the workflow list page.
- (Ref:
workspace_workflows.js, workflow Activity button,WORKFLOW_ACTIVITY_CURRENT_TAB_NAVIGATION_FIX.md)
- Fixed workflow
- Group Workflow Activity View Gate
- Fixed group workflow activity links so the shared
/workflow-activitypage no longer depends on the personal workflow feature flag when opened withscope=group. - Group activity views now use group-specific authorization, including group workspaces enabled, group workflows enabled, group assignment gating, and current group membership validation.
- Personal workflow activity links still use the existing personal workflow and WorkflowUser app-role policy.
- (Ref:
route_frontend_chats.py,workflow-activity.js,GROUP_WORKFLOW_ACTIVITY_VIEW_GATE_FIX.md)
- Fixed group workflow activity links so the shared
- Tabular Inline Chart Handoff
- Fixed tabular analysis chart requests so successful grouped CSV/XLSX results now produce SimpleChat inline chart citations instead of relying on the model to emit supported chart syntax.
- Workspace-search and chat-uploaded tabular results now share the same deterministic chart handoff in both streaming and non-streaming responses, preventing unsupported Mermaid chart blocks from appearing when users request charts.
- (Ref:
route_backend_chats.py,functions_chart_operations.py,test_tabular_inline_chart_handoff.py,TABULAR_INLINE_CHART_HANDOFF_FIX.md)
- Document Intelligence Upload Normalizer Import
- Fixed Azure Document Intelligence upload processing so the shared extractor resolves the extraction-mode normalizer through the existing settings module import, preventing Read/Layout/Auto uploads from failing with a missing normalizer name while avoiding the startup circular import path.
- (Ref:
functions_content.py, Document Intelligence extraction mode)
- Cosmos Native Autoscale Migration Action
- Fixed manual-to-autoscale conversions so manual Cosmos throughput offers call the ARM
migrateToAutoscaleaction instead of attempting to writeautoscaleSettings.maxThroughputdirectly onto a manual offer. - Preserved the existing
PUT autoscaleSettings.maxThroughputpath for database or container throughput that is already in autoscale mode. - Expanded the least-privilege Cosmos throughput operator role with the
migrateToAutoscale/actionand operation-result read permissions required for native conversion without Cosmos data-plane access. - (Ref:
functions_cosmos_throughput.py,setPermissions.bicep,COSMOS_NATIVE_AUTOSCALE_MIGRATION_ACTION_FIX.md)
- Fixed manual-to-autoscale conversions so manual Cosmos throughput offers call the ARM
- Cosmos Autoscale Background Cadence
- Updated the Cosmos throughput background scheduler so the check cadence follows the configured Metrics Window instead of a hard-coded five-minute sleep.
- Added background-specific autoscale start, completion, and sleep logs so scheduler runs are distinguishable from manual Admin Settings Refresh requests.
- Clarified Admin Settings copy that background automation refreshes on the Metrics Window cadence while Scale Up/Down intervals remain cooldowns after scaling.
- (Ref:
background_tasks.py,functions_cosmos_throughput.py, Admin Settings Scale tab,COSMOS_AUTOSCALE_BACKGROUND_CADENCE_FIX.md)
- Cosmos Container Metrics REST Metadata Parsing
- Switched Cosmos throughput metric collection from the Azure Monitor Query SDK response model to the raw Azure Monitor Metrics REST response for this feature, because the SDK returned container-split time series without usable metadata names or values.
- Restored per-container RU utilization and request-unit rows by parsing REST
collectionnameanddatabasenamemetadata from the same metric dimensions shown in Azure Metrics Explorer. - (Ref:
functions_cosmos_throughput.py, Azure Monitor Metrics REST, CosmosCollectionNamedimensions,COSMOS_CONTAINER_METRICS_REST_METADATA_FIX.md)
- Cosmos Container Autoscale Metric Accuracy and Refresh Performance
- Tightened the Azure Monitor query so container-targeted scaling requests
NormalizedRUConsumptionsplit by the configured database andCollectionName, matching the per-container view available in the Azure portal. - Container autoscale now explicitly waits for per-container utilization rows instead of treating aggregate account-level utilization as eligible input for individual container scaling.
- Reduced Admin Settings refresh latency by reusing one ARM token and reading per-container throughput settings in a bounded parallel scan instead of serial per-container reads.
- (Ref:
functions_cosmos_throughput.py, Cosmos throughput Azure Monitor dimensions, ARM container throughput reads,COSMOS_CONTAINER_THROUGHPUT_REFRESH_PERFORMANCE_FIX.md)
- Tightened the Azure Monitor query so container-targeted scaling requests
- Cosmos Container Metric Dimensions
- Fixed Cosmos throughput status refreshes so Azure Monitor is asked for per-container metric dimensions instead of only aggregate account-level RU metrics.
- Preserved the aggregate RU utilization card through a fallback query when container-dimensional metrics are delayed or unavailable, and added clearer Admin Settings messaging for that aggregate-only state.
- (Ref:
functions_cosmos_throughput.py,admin_settings.js, Cosmos throughput Azure Monitor metrics,COSMOS_CONTAINER_METRICS_DIMENSION_FIX.md)
- Cosmos Throughput Cached Status
- Fixed the Admin Settings Cosmos throughput card so it renders the last saved database or container-targeted view immediately after server restart instead of requiring a manual Refresh to rediscover containers.
- Manual Refresh and background autoscale checks now persist a compact cached status with capacity scope, throughput summary, metrics, container rows, and timestamps.
- Added copy clarifying that background automation checks throughput about every 5 minutes while enabled, and versioned the Admin Settings JavaScript asset to avoid stale browser-side Cosmos UI logic.
- (Ref:
functions_cosmos_throughput.py,admin_settings.html,admin_settings.js,COSMOS_THROUGHPUT_CACHED_STATUS_FIX.md)
- Container Policy Save Button Activation
- Fixed the Cosmos throughput container policy modal so saving staged container policies enables the main Admin Settings Save button immediately.
- The modal now uses the standard admin form dirty-state handler instead of setting only the internal modified flag.
- (Ref:
admin_settings.js, Admin Settings Scale tab,COSMOS_CONTAINER_POLICY_SAVE_BUTTON_FIX.md)
- Cosmos Throughput Refresh Logging
- Added backend start, completion, failure, and phase timing logs for Admin Settings Cosmos throughput refreshes so admins can see whether the request is waiting on token acquisition, ARM throughput reads, container scans, or Azure Monitor metrics.
- Added a refresh correlation ID across route, ARM, container, and metrics logs to make a single Refresh click traceable in console logs and Application Insights.
- (Ref:
functions_cosmos_throughput.py,route_backend_settings.py, Cosmos throughput refresh diagnostics)
- Advanced Conversation Search Matching
- Fixed the Advanced Search modal so it searches conversation titles and message content across both legacy and collaborative conversation stores.
- Added explicit match modes for partial text, all words, any word, and whole word searches, with partial matching as the default so terms such as
Chasecan match larger tokens likeJPMorganChase. - Normalized chat type filters so personal and multi-user conversation types are not silently excluded from advanced search results.
- (Ref: advanced conversation search, chat search modal,
route_backend_conversations.py,chat-search-modal.js,ADVANCED_CONVERSATION_SEARCH_FIX.md)
- Visio Connector and Arc Fidelity
- Improved Visio citation previews by approximating
RelEllipticalArcTogeometry as smooth curves instead of straight endpoint segments. - Removed duplicate fallback center-to-center connection lines when explicit connector geometry is already available, reducing visual clutter through service icons.
- Added bounded supersampling to smooth rendered PNG previews while avoiding external office-suite dependencies.
- Added regression coverage for curved master stencil geometry in the preview parser path.
- (Ref: Visio arc geometry, connector rendering, master stencil preview expansion,
functions_visio.py,test_visio_ingestion_preview.py)
- Improved Visio citation previews by approximating
- Visio Path and Master Geometry Rendering
- Improved the built-in Visio citation preview renderer to draw supported VSDX geometry rows as actual local paths instead of collapsing those shapes to generic rectangles.
- Added preview-only expansion of referenced master stencil geometry so common Azure/service icons render with more recognizable vector structure while indexed Visio chunks stay focused on page content.
- Improved label placement for icon-backed shapes and dashed container labels using the Visio-exported SVG/PDF reference fixtures.
- Added regression coverage to ensure preview master expansion does not pollute default ingestion parsing.
- (Ref: Visio path geometry, master stencil geometry, structural renderer,
functions_visio.py,test_visio_ingestion_preview.py,architecture.svg,architecture.pdf)
- Visio Preview Runtime Simplification
- Removed the optional LibreOffice conversion branch from Visio citation previews after confirming Azure Linux
tdnfdoes not provide LibreOffice packages in the app builder image. - Visio previews now consistently use the built-in structural renderer with nested shape coordinates, connector endpoint lines, supported embedded media, and page geometry.
- (Ref: Visio previews, structural renderer,
functions_visio.py,VISIO_PREVIEW_FIDELITY_FIX.md)
- Removed the optional LibreOffice conversion branch from Visio citation previews after confirming Azure Linux
- Visio Citation Preview Fidelity
- Strengthened the built-in Visio renderer so it preserves nested shape coordinates, connector endpoint lines, supported embedded media, and page geometry more accurately.
- (Ref: Visio previews, structural rendering,
functions_visio.py,VISIO_PREVIEW_FIDELITY_FIX.md)
- Source Review Citation Seeding and Second-Hop Traversal
- Source Review now receives the full Foundry web-search citation set, not only URLs that appeared in the web-search answer text, so official sources returned as raw citations can be reviewed directly.
- Added a configurable seed-page budget so initial search-result pages cannot consume the entire Source Review page budget before child source pages are inspected.
- Raised bounded Deep Source Review depth to support one additional hop, allowing flows such as official news archive -> press-release section -> year/detail page while preserving page, redirect, timeout, type, and SSRF limits.
- (Ref: Web Search citations, Deep Source Review,
route_backend_chats.py,functions_source_review.py,admin_settings.html,test_web_search_current_message_only.py,test_source_review_deep_traversal.py)
- Deep Source Review Link Prioritization and Audit Detail
- Fixed Deep Source Review link extraction so relevant press-release/archive links are scored before link inventory limits are applied, preventing noisy navigation links from crowding out useful source-detail candidates.
- Generic archive traversal now rejects shallow same-domain navigation such as About and Careers pages unless the link has a stronger source/archive signal.
- Source Review audit logs and thought details now expose seed pages, child pages, Deep Source Review usage, planner attempted/used state, planner candidate count, and selected planner URLs.
- (Ref: Deep Source Review, Source Review audit logging,
functions_source_review.py,route_backend_chats.py,test_source_review_deep_traversal.py)
- Deep Source Review Traversal Balance
- Improved Deep Source Review so seed/archive pages are reviewed before child links consume the remaining page budget, giving multi-source research requests better coverage across official sources.
- Child-link scoring now favors generic release/detail archive patterns and downranks common navigation pages without adding company-specific heuristics.
- (Ref: Deep Source Review,
functions_source_review.py,test_source_review_deep_traversal.py,SOURCE_REVIEW_DEEP_TRAVERSAL_FIX.md)
- Authenticated Request Login Activity Tracking
- Fixed login analytics so passive authenticated browser visits now contribute to login activity even when the user does not explicitly trigger the OAuth callback during that session.
- Added throttled authenticated-request tracking to avoid inflating counts on every page load, while still preserving the explicit
azure_adlogin signal and avoiding an immediate duplicate on the post-login redirect. - This improves Control Center and profile login visibility for seamless SSO and session-reuse scenarios without changing the user-facing login flow.
- (Ref: authenticated request login activity,
functions_activity_logging.py,app.py,route_frontend_authentication.py,test_authenticated_request_login_activity.py,AUTHENTICATED_REQUEST_LOGIN_ACTIVITY_FIX.md)
- Safety Violation Remediation Workflow
- Fixed the Safety Violations admin flow so
Warn usernow sends a user notification,Suspend userapplies the same timed access restriction used by Control Center, andBlock userapplies the same indefinite deny path. - Safety admins who do not hold the required approval role now create a pending approval request instead of applying the remediation immediately, while eligible reviewers can still self-approve and execute their own request when policy allows it.
- The safety review modal and shared approvals page now expose the notification details, suspension restore date, and explicit warn/suspend/block approval labels needed to review and execute those requests cleanly.
- (Ref:
route_backend_safety.py,route_backend_control_center.py,functions_approvals.py,functions_safety_remediation.py,functions_notifications.py,admin_safety_violations.html,admin-safety-violations.js,approvals.html,test_safety_violation_remediation_approvals.py)
- Fixed the Safety Violations admin flow so
- Group and Public Workspace Hero Color Editing
- Fixed the group and public workspace manage pages so hero color selections now apply to the saved workspace branding instead of leaving those selectors effectively non-functional.
- The manage-page hero preview now stays in sync with the selected color, and the saved branding metadata flows back through the workspace APIs for consistent rendering.
- (Ref: workspace branding,
manage_group.js,manage_public_workspace.js,route_backend_groups.py,route_backend_public_workspaces.py)
- Chat-Scoped Generated Tabular Exports
- Fixed large tabular JSON and CSV export requests so the generated file now stays attached to the active chat instead of being pushed through the personal workspace document pipeline.
- Assistant replies now keep the exhaustive dataset in a downloadable chat artifact with the existing preview card, which makes large structured outputs more reliable while keeping the visible answer concise.
- Personal conversation deletion and retention cleanup now remove blob-backed generated chat files when archiving is disabled, closing the lifecycle gap for conversation-scoped exports.
- (Ref: generated tabular exports,
route_backend_chats.py,functions_simplechat_operations.py,route_enhanced_citations.py,route_backend_conversations.py,functions_retention_policy.py,chat-messages.js)
- Fact Memory Delete Confirmation Layering
- Fixed the profile fact-memory workflow so the delete confirmation now opens above the Manage Fact Memories editor instead of appearing underneath it.
- Users can now confirm or cancel a delete without closing the editor first, and the manager modal remains active so they can continue reviewing saved memories immediately after the confirmation closes.
- Added focused UI regression coverage for the stacked modal behavior.
- (Ref: fact memory management,
profile.html,test_profile_fact_memory_editor.py)
- Live Tabular Analysis Thought Progress
- Fixed long-running tabular analysis chats so workbook tool activity now streams into the thoughts panel while the answer is still being prepared, instead of waiting until the tabular pass completes.
- Tabular requests now show a dedicated progress card with the current step, running and completed tool-call counts, and a clearer completion state when workbook evidence is ready.
- Added focused UI regression coverage for the live tabular progress card and kept the adjacent agent-progress behavior covered.
- (Ref: tabular analysis streaming,
route_backend_chats.py,chat-thoughts.js,test_chat_tabular_thought_progress.py,test_chat_agent_thought_progress.py)
- Workspace Search Document Action Gating
- Fixed chat document actions so Review and Compare now only apply while Workspace Search is enabled.
- Turning Workspace Search off now ignores any previously selected Review or Compare mode instead of routing the request through document-action validation and showing stale “select documents before starting a review” warnings.
- Added a focused UI regression test for the workspace-toggle flow so normal chat sends continue using the standard chat stream when workspace search is disabled.
- (Ref: workspace search toggle,
chat-messages.js,test_chat_document_action_workspace_toggle.py)
- Chat File Upload Client Enablement
- Fixed chat file uploads so the effective per-user upload setting is serialized to the browser upload guards.
- Users with chat uploads enabled no longer see the
Chat file uploads are not enabled for your account.warning caused by a missing client-side flag. - (Ref: chat upload controls,
chats.html,test_chat_file_upload_access_control.py,CHAT_FILE_UPLOAD_CLIENT_FLAG_FIX.md)
- Document Auto Metadata Extraction Consistency
- Fixed upload processing so all supported file types run the same automatic final metadata extraction flow when metadata extraction is enabled.
- Corrected public workspace audio and video chunk scoping so public media files participate correctly in metadata extraction and metadata-to-chunk synchronization.
- Preserved final processing statuses that indicate whether metadata was extracted, yielded no new information, or completed with a metadata warning.
- (Ref: document upload metadata extraction, public workspace media chunks,
functions_documents.py,DOCUMENT_AUTO_METADATA_EXTRACTION_FIX.md)
- Chat Stream Lifecycle Observability
- Improved diagnostics for long-running chat streams so backend status now distinguishes active, detached-but-running, completed, and errored stream states during the replay window.
- Added backend lifecycle logging for keepalive, detach, reattach, queue backpressure, and terminal stream outcomes, plus frontend best-effort telemetry for request failures, read failures, premature endings, aborts, and recovery attempts.
- Added focused regression coverage and versioned fix documentation for the new stream observability path.
- (Ref:
route_backend_chats.py,chat-streaming.js,test_chat_stream_lifecycle_observability.py,CHAT_STREAM_LIFECYCLE_OBSERVABILITY_FIX.md)
- Uploaded File Preview Body XSS Hardening (
f044)- Fixed the uploaded-file preview modal so stored file bodies no longer reach the preview pane through raw HTML sinks.
- Plain-text previews now render as inert preformatted text, CSV-backed previews are built with DOM text nodes, and legacy HTML-backed table payloads now fall back to inert text instead of live markup.
- Added focused functional and UI regression coverage plus versioned fix documentation for the hardened preview path.
- (Ref:
chat-input-actions.js,test_uploaded_file_preview_xss_fix.py,test_uploaded_file_preview_escaping.py,UPLOADED_FILE_PREVIEW_XSS_FIX.md)
- Public Workspace Tag Color XSS Hardening (
f043)- Fixed the public workspace tag surfaces so stored tag colors no longer reach folder-grid actions, tag badges, tag management rows, or selected-tag chips through inline handler or style interpolation.
- Shared tag helper paths now normalize and validate tag colors on create and update across personal, group, and public routes, and previously stored invalid colors fall back to safe deterministic values on read.
- Added focused functional and UI regression coverage plus versioned fix documentation for the hardened public tag rendering path.
- (Ref:
functions_documents.py,route_backend_documents.py,route_backend_group_documents.py,route_backend_public_documents.py,public_workspace.js,test_public_workspace_tag_color_xss_fix.py,test_public_workspace_tag_color_rendering.py,PUBLIC_WORKSPACE_TAG_COLOR_XSS_FIX.md)
- Agent Template Gallery Actions Escaping (
f045)- Fixed the agent template gallery so stored
actions_to_loadvalues no longer reach the recommended-actions row through a raw HTML sink. - Agent template helper paths now normalize
actions_to_loadconsistently on read, create, and update flows, and invalid write payload shapes are rejected before they can persist. - Added focused functional and UI regression coverage plus versioned fix documentation for the hardened gallery path.
- (Ref:
agent_templates_gallery.js,functions_agent_templates.py,test_agent_template_gallery_actions_to_load_xss_fix.py,test_agent_template_gallery_actions_escaping.py,AGENT_TEMPLATE_GALLERY_ACTIONS_TO_LOAD_XSS_FIX.md)
- Fixed the agent template gallery so stored
- Stored XSS Share, Activity, and Masking Hardening (
f022,f042, residualf037)- Fixed the remaining stored-XSS share-modal flows so attacker-controlled user names, group names, descriptions, emails, and toast content no longer render through inline handlers or raw HTML sinks.
- Hardened the group activity timeline and raw-activity modal so stored activity metadata and serialized activity JSON now render as inert text instead of executable markup.
- Rebuilt masked-range rendering with DOM APIs and bound masking display names to the authenticated server-side user instead of trusting browser-supplied identity fields.
- Added focused functional and UI regression coverage plus versioned fix documentation for the hardened sharing, activity, and masking paths.
- (Ref:
chat-toast.js,workspace-documents-sharing.js,group-documents-sharing.js,manage_group.js,chat-messages.js,route_backend_chats.py,test_stored_xss_share_activity_and_masking_fix.py,test_document_share_modal_escaping.py,STORED_XSS_SHARE_ACTIVITY_AND_MASKING_FIX.md)
- Chat Scope Picker and Conversation Details XSS Hardening (
f021)- Fixed the chat scope-lock picker so stored group and public workspace names no longer reach the locked-workspaces modal through raw HTML interpolation.
- Hardened the conversation-details modal so attacker-controlled titles, context names, participant labels, document labels, semantic tags, classifications, and scope-lock names render as inert text, and invalid web-source values no longer produce active
javascript:links. - Added focused functional and UI regression coverage plus versioned fix documentation for the affected chat modal surfaces.
- (Ref:
chat-documents.js,chat-conversation-details.js,test_stored_xss_chat_scope_and_conversation_details_fix.py,test_chat_scope_lock_and_conversation_details_escaping.py,CHAT_SCOPE_LOCK_AND_CONVERSATION_DETAILS_XSS_FIX.md)
- Chat Citation and Uploaded File Modal Filename XSS Hardening (
f020)- Fixed the first-render chat citation modal so attacker-controlled document filenames returned from citation APIs no longer reach the modal header as raw HTML on the first open.
- The uploaded-file preview modal now uses the same safe title-population path, closing the adjacent filename sink before it can regress into the same stored-XSS family.
- Added focused functional and UI regression coverage plus versioned fix documentation for both modal title flows.
- (Ref:
chat-citations.js,chat-input-actions.js,test_stored_xss_chat_modal_filename_fix.py,test_chat_modal_filename_escaping.py,CITATION_AND_FILE_MODAL_FILENAME_XSS_FIX.md)
- Stored XSS Agent and Member Rendering Hardening (
f009,f010)- Fixed the stored-XSS sink in chat message rendering so agent display names no longer reach the sender header, image header, or metadata drawer as raw HTML.
- Public and group workspace member-management views now escape untrusted member display names and emails before rendering member rows, pending requests, ownership-transfer options, bulk-remove summaries, user-search results, and CSV validation previews, and the public member search no longer embeds untrusted values inside an inline
onclickhandler. /api/userSearchnow escapes Microsoft Graph OData filter literals before composing the$filterexpression, so apostrophes in search input cannot break the backend Graph query.- Added focused functional and UI regression coverage plus versioned fix documentation for the hardened chat, workspace member-management, and Graph filter paths.
- (Ref:
chat-messages.js,manage_public_workspace.js,manage_group.js,route_backend_users.py,test_stored_xss_chat_workspace_rendering_fix.py,test_public_workspace_member_rendering_escaping.py,test_group_workspace_member_rendering_escaping.py,STORED_XSS_AGENT_AND_MEMBER_RENDERING_FIX.md)
- Chat Selected Document Metadata Authorization Fix (
f046)- Fixed chat selected-document metadata resolution so
/api/chat,/api/chat/stream, and the selected tabular document helper no longer trust caller-supplied document ids after authentication. - Personal selected documents now resolve only for the owner or a legitimately shared user, group selected documents now honor authorized owner and shared-group access, and public selected documents now resolve only inside the caller’s visible public workspaces.
- Added focused regression coverage for the shared selected-document resolver and updated the existing all-scope tabular regression so the hardened lookup path stays covered.
- (Ref:
route_backend_chats.py,test_chat_selected_document_metadata_authorization.py,test_tabular_all_scope_group_source_context.py,CHAT_SELECTED_DOCUMENT_METADATA_AUTHORIZATION_FIX.md)
- Fixed chat selected-document metadata resolution so
- Control Center Public Workspace Members XSS Fix (
f008)- Fixed a stored XSS in the Control Center public workspace members modal where stored member
displayNameandemailvalues were rendered into an admin-facing HTML sink. - The members modal now builds the member row with DOM text nodes instead of injecting those fields through
innerHTML, so malicious stored markup renders as inert text while the existing role badge styling remains unchanged. - Added focused regression coverage for the affected modal and documented the hardened sink under the current version line.
- (Ref:
workspace-manager.js,test_control_center_public_workspace_members_escaping.py,test_stored_xss_admin_rendering_fix.py,CONTROL_CENTER_PUBLIC_WORKSPACE_MEMBERS_XSS_FIX.md)
- Fixed a stored XSS in the Control Center public workspace members modal where stored member
- Plugin Log Recent Feed Admin Authorization Follow-Up
- Fixed the adjacent plugin logging route so
/api/plugins/invocations/recentnow enforces theAdminrole instead of exposing the cross-user recent invocation feed to any authenticated user. - Unauthenticated requests still return
401 Unauthorized, non-admin users now receive403 Forbidden, and the admin response payload remains unchanged for legitimate troubleshooting flows. - Extended the focused plugin logging regression coverage so both admin-only plugin logging endpoints are exercised under unauthenticated, non-admin, and admin conditions.
- (Ref:
route_plugin_logging.py,test_plugin_logging_clear_logs_authorization.py,PLUGIN_LOG_RECENT_INVOCATIONS_ADMIN_FIX.md)
- Fixed the adjacent plugin logging route so
- Public Workspace Details Projection Hardening (
f034)- Fixed
GET /api/public_workspaces/<workspace_id>so authenticated non-members no longer receive the full public workspace Cosmos document. - The route now returns a minimal public summary for non-members and a member-aware payload with explicit
userRoleandisMemberfields for authorized workspace members, which preserves the manage-page UX without exposing manager lists, pending requests, or other member-only metadata. - Added focused functional and UI regression coverage to lock down the new payload contract and verify the public directory and non-member workspace page continue to behave correctly.
- (Ref:
route_backend_public_workspaces.py,functions_public_workspaces.py,manage_public_workspace.js,public_directory.js,test_security_authorization_hardening.py,test_public_workspace_projection_non_member_ui.py,PUBLIC_WORKSPACE_DETAILS_DISCLOSURE_FIX.md)
- Fixed
- Approval Route Authorization Guard Consolidation (
f033)- Hardened the approval detail, approve, and deny endpoints so both the admin and non-admin route variants now resolve requests through one shared authorization helper before returning approval data or executing destructive approval actions.
- This reduces the chance of future drift between approval handlers while preserving the existing
403 Forbiddenbehavior for callers who are not allowed to view or approve a request. - Added focused regression coverage to ensure the approval routes continue using the shared authorization path.
- (Ref:
route_backend_control_center.py,functions_approvals.py,test_security_authorization_hardening.py)
- Feedback Submission Ownership Enforcement (
f038)- Fixed the user feedback submission route so caller-supplied
conversationIdandmessageIdvalues must resolve inside the authenticated user’s own conversation before any feedback row is created. - Foreign conversation ids now return
403 Forbidden, missing assistant targets now return404 Not Found, and invalid submissions no longer persist copied prompt or AI response content into the caller’s feedback history. - Added focused regression coverage for owner success, foreign-conversation rejection before message lookup, and missing-target rejection without feedback persistence.
- (Ref:
route_backend_feedback.py,test_feedback_submission_authorization.py,FEEDBACK_AND_PLUGIN_LOG_ACCESS_CONTROL_FIX.md)
- Fixed the user feedback submission route so caller-supplied
- Plugin Log Clear Admin Authorization (
f039)- Fixed the destructive plugin log clear endpoint so only administrators can wipe the shared in-memory plugin invocation history.
- Unauthenticated requests still return
401 Unauthorized, non-admin authenticated users now receive403 Forbidden, and admin behavior remains unchanged for legitimate maintenance flows. - Added focused regression coverage for unauthenticated, non-admin, and admin clear-log requests against the shared logger state.
- (Ref:
route_plugin_logging.py,test_plugin_logging_clear_logs_authorization.py,FEEDBACK_AND_PLUGIN_LOG_ACCESS_CONTROL_FIX.md)
- Authorization State Confusion Settings Hardening
- Completed the remaining settings-boundary hardening so active public workspace selection now validates server-side before it is persisted, instead of accepting arbitrary caller-supplied workspace ids through generic settings updates.
- Public workspace selection routes now share the same validated helper path, and public prompt operations now resolve the active workspace through a canonical authorization check instead of trusting raw stored settings values.
- The generic user-settings update route also now drops unsupported settings keys and returns a client error when a payload contains no valid settings keys, reducing the chance that authorization-sensitive state can bypass dedicated validators in future changes.
- (Ref:
functions_public_workspaces.py,route_backend_users.py,route_backend_public_workspaces.py,route_frontend_public_workspaces.py,route_backend_public_prompts.py,AUTHORIZATION_STATE_CONFUSION_SETTINGS_FIX.md)
- Key Vault Plugin Secret Scope Enforcement (
f013)- Fixed a plugin Key Vault authorization gap where well-formed full secret names could be stored or replayed across user, group, or global scopes and later resolved with the application’s Key Vault identity.
- Plugin secret save, runtime resolution, SQL connection-test resolution, and delete cleanup now verify that stored secret references match the expected scope and source before any Key Vault operation is attempted.
- Added focused regression coverage and versioned fix documentation for the hardened plugin secret boundary.
- (Ref:
functions_keyvault.py,semantic_kernel_loader.py,route_backend_plugins.py,test_keyvault_plugin_secret_scope_enforcement.py,KEY_VAULT_PLUGIN_SECRET_SCOPE_ENFORCEMENT_FIX.md)
- Log Analytics Query History User Scope Enforcement (
f016)- Fixed the Log Analytics plugin so query history now binds to the authenticated user on the server instead of accepting an LLM-controlled
user_idparameter. - Shared user-settings reads and writes now deny cross-user request access by default unless a reviewed privileged path explicitly opts into a cross-user bypass, and the Control Center admin flows have been updated to use that bypass intentionally.
- Added focused regression coverage and versioned fix documentation for the plugin surface change and the shared user-settings authorization boundary.
- (Ref:
log_analytics_plugin.py,functions_settings.py,route_backend_control_center.py,test_log_analytics_plugin_user_scope_enforcement.py,LOG_ANALYTICS_PLUGIN_USER_SCOPE_ENFORCEMENT_FIX.md)
- Fixed the Log Analytics plugin so query history now binds to the authenticated user on the server instead of accepting an LLM-controlled
- Personal Conversation Authorization (
f025,f027)- Closed personal-conversation authorization gaps so conversation deletion, chat file-content retrieval, and frontend conversation rendering verify ownership before returning or destroying data.
- The chat message loader also now handles
403 Forbiddenand404 Not Foundconversation-message responses explicitly, so the browser shows a controlled error state instead of assuming every message load succeeds. - Added focused functional and UI regression coverage plus a separate follow-up fix document under the current release line.
- (Ref:
route_backend_conversations.py,route_backend_documents.py,route_frontend_conversations.py,chat-messages.js,test_personal_conversation_followup_authorization.py,test_chat_messages_authorization_error.py,PERSONAL_CONVERSATION_AUTHORIZATION_FOLLOW_UP_FIX.md)
- Personal Conversation Read Authorization Hardening
- Fixed authenticated personal conversation read paths so message history and inline image retrieval now verify conversation ownership before returning content.
- Requests that use leaked or foreign conversation identifiers now return
403 Forbiddeninstead of disclosing another user’s transcript or image content, while the existing missing-resource response contracts remain unchanged. - Added focused regression coverage and versioned fix documentation for the hardened conversation read boundary.
- (Ref:
f024,route_backend_conversations.py,test_conversations_read_ownership_authorization.py,PERSONAL_CONVERSATION_READ_AUTHORIZATION_FIX.md)
- Broken Access Control IDOR Hardening
- Closed the authenticated authorization gaps by enforcing personal conversation ownership in chat, binding tabular blob access to the current authorized request context, and binding fact-memory operations to that same canonical scope.
- Request group and public workspace scope is now canonicalized before downstream processing so forged or stale scope identifiers do not survive into plugin execution or grounded-history fallback reuse.
- Added focused regression coverage and versioned fix documentation for the hardened chat and plugin authorization boundary.
- (Ref:
route_backend_chats.py,tabular_processing_plugin.py,fact_memory_plugin.py,test_security_authorization_hardening.py,BROKEN_ACCESS_CONTROL_IDOR_HARDENING_FIX.md)
- Stored XSS Admin Rendering Hardening
- Closed the admin-side stored-XSS findings by escaping stored member and agent metadata before Control Center and Admin Settings HTML row rendering.
- Control Center toast rendering now escapes message content by default and requires an explicit opt-in for the small number of admin success messages that intentionally include formatted HTML.
- Added focused functional and UI regression coverage plus versioned fix documentation for the hardened admin rendering sinks.
- (Ref:
control_center.html,control-center.js,admin_agents.js,test_stored_xss_admin_rendering_fix.py,test_control_center_group_members_escaping.py,STORED_XSS_ADMIN_RENDERING_FIX.md)
- Web Search Data Egress Hardening
- Fixed the Bing-grounding web-search path so external web search now sends only the user’s current message instead of a query derived from prior conversation context.
- Updated the admin consent copy and user notice text to match the implemented behavior and warn that sensitive content pasted into the current message may still be sent when web search is used.
- Reduced outbound web-search invocation metadata and added focused functional and UI regression coverage for the boundary and disclosure text changes.
- (Ref:
route_backend_chats.py,functions_settings.py,route_frontend_admin_settings.py,admin_settings.html,chats.html,test_web_search_current_message_only.py,test_web_search_notice_copy.py)
- Authorization Boundary Hardening Across Search, Groups, Approvals, and History Fallback
- Hardened several authenticated workflows that previously trusted caller-supplied identifiers or stale stored scope values, so active group selection, group-scoped prompt access, approval actions, and history-grounded follow-up reuse now revalidate the current user’s authorization before proceeding.
- Azure AI Search filter construction now escapes OData literals for document, user, group, shared, and public workspace identifiers, and the Control Center public workspace view now renders untrusted workspace metadata as inert text instead of raw HTML.
- Added focused functional and UI regression coverage for the authorization and escaping paths, plus versioned fix documentation for the full hardening pass.
- (Ref:
functions_search.py,functions_group.py,route_backend_users.py,route_backend_group_prompts.py,route_backend_control_center.py,route_backend_chats.py,control-center.js,test_security_authorization_hardening.py,test_control_center_public_workspace_escaping.py)
- SQL ODBC Driver 18 Container Support
- Fixed SQL Server and Azure SQL actions in container deployments by installing Microsoft ODBC Driver 18, copying native driver registration and unixODBC libraries into the distroless runtime, and retrying saved Driver 17 connection strings with Driver 18 only when the failure is a missing-driver error.
- (Ref:
Dockerfile,sql_odbc_utils.py,sql_schema_plugin.py,sql_query_plugin.py,route_backend_plugins.py,test_sql_odbc_driver_18_support.py)
- Entra Application Deployment Stability
- Hardened Entra app registration scripts for Microsoft Graph MFA or conditional-access prompts and persisted app registration outputs into the selected AZD environment.
- (Ref:
Initialize-EntraApplication.ps1,test_entra_application_graph_mfa_auth.py,test_entra_application_azd_env_persistence.py)
- Public Workspace Manage Script Syntax Fix
- Fixed the public workspace management page script so pending request handlers and delegated member-search selection initialize without parser errors.
- (Ref:
manage_public_workspace.js,test_public_workspace_manage_script_syntax_fix.py,test_public_workspace_manage_script_parse.py)
- Chat Document Dropdown Viewport Fit Fix
- Fixed grounded-search document dropdown placement so long document lists stay inside short and mobile-influenced viewports.
- (Ref:
chat-documents.js,test_chat_document_dropdown_viewport_fit.py)
User Interface Enhancements
- Workflow Analyze Mode and Conversation Navigation
- Added a
Run each document separatelyswitch to personal and group workflow Analyze configuration. - Workflow history and alert conversation actions now open linked conversations in a new browser tab so users keep their workflow context open.
- Added Word and PowerPoint upload capability toggles to SimpleChat action and agent builders.
- (Ref:
workspace.html,group_workspaces.html,workspace_workflows.js,notifications.js,plugin_modal_stepper.js,agent_modal_stepper.js)
- Added a
- Personal Workflow Labeling
- Renamed the existing workspace workflow surface to
Personal Workflowsso users can distinguish personal workflows from the new group workflow experience. - Updated personal workflow navigation, modal headings, primary actions, and documentation to use the new wording without changing existing personal workflow IDs or API contracts.
- (Ref:
workspace.html,workspace_workflows.js,PERSONAL_WORKFLOWS.md)
- Renamed the existing workspace workflow surface to
- Custom Workspace Hero Color Swatches
- Added a custom color swatch to group and public workspace manage pages so workspace owners can choose any valid hero color in addition to the preset palette.
- Saved custom colors now reselect the custom swatch and update the live hero preview before saving.
- (Ref:
manage_group.html,manage_public_workspace.html,manage_group.js,manage_public_workspace.js,GROUP_PUBLIC_WORKSPACE_CUSTOM_HERO_COLORS.md)
- Selectable Conversation-Linked Workspace Document Deletion
- Conversation delete now lists workspace documents created from chat uploads and lets users select one, many, or all documents to delete with the conversation.
- Leaving all documents unchecked keeps them in the personal workspace so they follow the normal document retention policy.
- Bulk conversation delete no longer removes linked workspace documents automatically.
- (Ref: conversation delete modal,
chat-conversations.js,route_backend_conversations.py,functions_documents.py)
- Document Intelligence Extraction Terminology
- Renamed user-facing PDF/image extraction choices from Read/Layout to Standard/Enhanced while preserving the underlying
readandlayoutsettings and API values. - Added hover text for extraction, citation, and File Sync badges so workspace users can understand Standard, Enhanced, synced, and manually uploaded document states without extra visual clutter.
- (Ref: Admin Settings Search & Extract, personal/group/public workspace document details)
- Renamed user-facing PDF/image extraction choices from Read/Layout to Standard/Enhanced while preserving the underlying
- Extraction Badge Placement
- Removed Read/Layout extraction badges from top-level document rows and cards while preserving them in expanded document details and metadata views.
- (Ref: personal, group, and public workspace document views)
- Cosmos Throughput Table Clarity
- Simplified the Admin Settings Cosmos throughput container table by removing the redundant Database column and replacing the Configure text action with a compact gear button.
- Added tooltips that distinguish RU Utilization from Request Units, plus a Setup Guide modal with a Run Test action that uses the same status checks as Refresh.
- Preserved unavailable container request-unit metrics as unavailable instead of rendering a misleading zero when Azure Monitor does not return a container metric row.
- (Ref:
admin_settings.html,admin_settings.js, Cosmos throughput container metrics,COSMOS_THROUGHPUT_TABLE_CLARITY_FIX.md)
- Container-Targeted Cosmos Throughput Policies
- Added a Containers modal to the Admin Settings Scale tab so admins can review every Cosmos container and configure per-container automation settings.
- Each dedicated-throughput container can now have independent min/max RU guardrails, scale-up/down thresholds, RU step sizes, cooldown intervals, and manual scale actions.
- The Cosmos throughput status endpoint now falls back to container-targeted management when database-level throughput settings are absent instead of failing the card with a 404.
- (Ref:
functions_cosmos_throughput.py, Admin Settings Scale tab,COSMOS_CONTAINER_THROUGHPUT_FALLBACK_FIX.md)
- File Sync Source Configuration Flow
- Reworked the File Sync source modal around a combined selection, subfolders, and filters section, including selected path summaries and a browse modal for supported providers.
- OneDrive source configuration now presents a global connector identity notice instead of source-local credential fields.
- (Ref:
workspace-file-sync.js, File Sync source workflow, selected paths)
- Control Center Group Token Totals
- Added all-time group token usage totals to the Control Center Group Management table so admins can compare group usage alongside members, status, and document metrics.
- Included the same token total in the group management modal and CSV export for consistent reporting.
- (Ref: Control Center group management, group token usage aggregation,
route_backend_control_center.py,control-center.js,control_center.html)
- Workspace Identity Modal Workflow
- Simplified workspace and global identity management around real consumers: File Sync, Actions, and Model Endpoints.
- Replaced the inline identity form with Add, View, and Edit modals that group identity details, used-for selection, and authentication.
- Removed the workspace identity page heading and refresh button so the tab starts with a left-aligned Add Identity action and a focused identity table.
- (Ref: workspace identities, identity modal workflow,
workspace-identities.js,functions_workspace_identities.py)
- Deep Research Allowed-User Management Modal
- Replaced inline Deep Research user policy controls with a compact Manage Users modal that supports directory search, manual user additions, filtering, removal, CSV upload, and example CSV download.
- Removed blocked-user policy controls from Deep Research and switched runtime behavior to allow-only user access; legacy blocked-user settings are ignored and cleared on admin save.
- Deep Research now applies max/enabled defaults when newly enabled while keeping the master feature toggle off by default.
- (Ref: Deep Research access policy, allowed users modal,
admin_settings.html,admin_settings.js,functions_source_review.py,route_frontend_admin_settings.py)
- Assistant Follow-Up Prompt Actions
- Chat responses that include visible next-step options can now render those options as prompt buttons under the assistant message.
- Clicking a prompt action stages the text in the chat input and starts a cancelable send countdown, making suggested next steps easier to continue while keeping the user in control.
- (Ref: chat follow-up actions,
chat-messages.js,chats.css,test_chat_follow_up_prompt_actions.py)
- Workspace Document Cards and Folder-Card Views
- Added public workspace document cards and aligned public workspace view controls with personal and group workspaces: List, Cards, Folders, and Folders + Cards.
- Folder-card views now let users browse folders first and then review matching documents as cards, while card clicks open the document action menu for quick Chat, Edit, Select, and management actions.
- Improved multi-select controls and visible-only select-all behavior across personal, group, and public list, card, folder, and folder-card views.
- (Ref: workspace document cards, public workspace views,
workspace-documents.js,workspace-tags.js,public_workspace.js,workspace-responsive.css,workspace.html,group_workspaces.html,public_workspaces.html,test_public_workspace_document_cards_views.py)
- Control Center Management Pagination
- Added consistent page-size selectors to User Management, Group Management, and Public Workspace Management in Control Center, with 10, 25, 50, 100, and 250 item options.
- Group and public workspace management now use server-driven pagination instead of loading a fixed first page, so admins can navigate larger result sets with accurate filtered totals.
- Added regression coverage and fix documentation for the shared management pagination behavior.
- (Ref:
route_backend_control_center.py,control_center.html,control-center.js,test_control_center_management_pagination.py,CONTROL_CENTER_MANAGEMENT_PAGINATION_FIX.md)
- Workspace Branding Heroes and Shortcuts
- Added logo upload support for group and public workspace manage pages so owners can brand those spaces with a persistent hero image in addition to the hero color.
- Group and public workspace pages now show the active workspace hero card with the selected color, owner metadata, optional logo, and a direct manage button for the selected workspace.
- Added focused functional and UI regression coverage for the branding metadata, hero rendering, and manage-page flows.
- (Ref:
functions_workspace_branding.py,group_workspaces.html,public_workspaces.html,test_workspace_branding_hero_and_logo.py,test_workspace_active_hero_shortcuts.py,test_manage_group_page_branding.py,test_manage_public_workspace_page_load.py)
- GitHub Pages Documentation Redesign
- Redesigned the GitHub Pages documentation shell with fixed top navigation, curated sidebar sections, responsive mobile drawer, documentation search, and a right-side page rail.
- (Ref:
docs/_layouts/default.html,docs/_includes/sidebar_nav.html,docs/assets/css/main.scss,docs/assets/js/main.js,docs/index.md,ui_tests/test_docs_showcase_pages.py)
- Chat and Sidebar Icon-Only Controls
- Refined the chat conversation info button and compact sidebar toggle so they render as quiet icon-only controls while preserving accessible focus states.
- (Ref:
chats.html,_sidebar_nav.html,_sidebar_short_nav.html,sidebar.css,test_chat_sidebar_toggle_controls.py)