Repository navigation
V2 chat: inline media players, image cards, agent-posted markdown, and interactive maps (0.261.224) - #1612
Merged
Paul Lizer (paullizer) merged 16 commits intoOct 2, 2026
Conversation
Post the upload status before reading the document so the etag-guarded write in upload_to_blob no longer conflicts with its own status update (every group upload failed with Enhanced Citations on). Allow the server-bound scope_id on Call agent manifests so scoped saves pass validation. Adds regression tests and fix notes; version 0.261.217.
…p members without Graph Background runs take the owner's stored display name and email instead of the bare object ID, which also stops them overwriting the stored display name. add_user_to_group accepts a user_id with email or display name, as the REST members route does, and group conversation invites match current group members before any directory lookup. Version 0.261.218.
GPT-6 deployments reject max_tokens. Recognize gpt-6 alongside gpt-5 so response length uses max_completion_tokens and no temperature is sent. Version 0.261.219.
…restriction in the model catalog gpt-6-astra becomes a token-evidenced record: 1,050,000 context, 922,000 input and 128,000 output for OpenAI and Azure, total-generation accounting, and a Chat Completions reasoning policy of low, medium, high and xhigh. Azure Chat Completions rejects its function tools unless reasoning_effort is none, which the model rejects; toolReasoningEfforts can't express that, so it's recorded in notes. Refs #1606. Version 0.261.220.
…rt none gpt-6-sol gets verified 1,050,000 context, 922,000 input and 128,000 output limits, a reasoning policy of none through xhigh, and Chat Completions toolReasoningEfforts of none for OpenAI and Azure. OpenAI documents that its Chat Completions function calling requires none, and Azure behaved the same. Agents with tools and no effort now send none; another explicit effort fails before the request. Refs #1606. Version 0.261.221.
…der agent-posted messages as markdown Audio links become an expanding player (play/pause, stop, seek, volume, speed), video links become cards with native controls, and markdown images become captioned cards with the lightbox. One recording plays at a time. Messages an agent posts through add_conversation_message are marked as agent-authored markdown and render like agent replies. CSP_MEDIA_SRC_ORIGINS adds validated https origins to media-src. Version 0.261.222. Refs #1611.
Open
6 tasks
Replies that used the Azure Maps action now show their map under the text in the V2 chat. The map opens fitted to all features. It pans and zooms with Ctrl/Cmd + scroll, so a plain scroll still scrolls the conversation, and it has a full screen control. Hovering a marker, path or area shows its details, and a click pins them. A text list shows everything on the map.
OpenLayers 10.6.1 is vendored into public/vendor, byte-identical to the published package and to the classic chat's copy, and loaded only when a reply has a map. Map text is only written as text. OpenLayers' HTML attribution control is off, and tiles only load through /api/azure-maps/tile.
/api/get_messages and the collaboration messages endpoint now reissue expired tile tokens, so maps in older replies and in group conversations load their tiles. Compact map citations are fetched by artifact. Legacy {{map:...}} blocks are hidden from reply text.
Also updates the V2 enhanced citations CSP check for the media-src directive that 0.261.222 moved into csp_media_sources.py.
Version 0.261.223. Refs #1609.
This was referenced Oct 2, 2026
Tool results are redacted before they are stored as a reply's citations, and that redaction replaced the map payload's tile proxy token with ***REDACTED***. Every stored map then requested tiles with an unusable token and drew its markers and paths on blank tiles, in the classic and V2 chat alike. sanitize_plugin_invocation_value now keeps the token= value only where it directly follows /api/azure-maps/tile?, which is exactly where build_tile_proxy_url_template writes it. That token is encrypted with the app's secret key, expires, and only works on SimpleChat's signed-in tile proxy. Every other token= value, a token later in the query, another key after the prefix, absolute URLs and every other secret are still redacted. Maps stored before this change keep the redacted token and still show no tiles. Version 0.261.224. Refs #1609.
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
…call-agent Resolves the conflicts with #1607. Both branches started from 0.261.216 and used 0.261.217. VERSION stays 0.261.221, and the release notes combine both 0.261.217 entries under one heading.
…oad-call-agent' into paullizer-react-v2-fix-group-upload-call-agent
A map point can carry an https photo, a caption and label/value fields. The V2 popup shows them as text, the photo opens full size, and the map's text list includes them. The popup opens on the side with room and a pinned popup pans into view. Refs #1609. Version 0.261.225.
Paul Lizer (paullizer)
merged commit Oct 2, 2026
16d4734
into
paullizer-react-v2-ui
10 checks passed
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 2, 2026
) into 6b-1 Merged with rerere disabled. Two files conflicted: - application/single_app/config.py: kept this branch's VERSION line for the merge; the next commit renumbers 0.261.218 to 0.261.226 because V2 is now at 0.261.225. - docs/explanation/release_notes.md: this branch's section stays on top, followed by V2's 0.261.224 to 0.261.218 sections unchanged. route_backend_conversations.py merged cleanly (hunks do not overlap). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
added a commit
to paullizer/simplechat
that referenced
this pull request
Oct 2, 2026
V2 is now at 0.261.225 (microsoft#1612 with microsoft#1608), so this branch takes the next version. Mechanical change only: 51 occurrences in 21 files, all on lines this branch added (config.py VERSION, the release-notes heading, test headers, route-inventory docstrings and the feature docs). V2's own 0.261.218 lines from microsoft#1608 are unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This was referenced Oct 2, 2026
14 of 24 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Plays audio and video inline in the V2 chat, shows markdown images as captioned cards, renders messages an agent posts through the Simple Chat action as markdown, and draws interactive maps from Azure Maps action results. Adds an optional, validated allowlist of external media origins to the CSP
media-srcdirective.Refs #1611 and #1609. Stacked on #1608 (
paullizer-react-v2-fix-group-upload-call-agent).Changes
InlineAudioPlayer.tsx): a markdown link whose URL path ends in an audio extension renders as an expanding bar with play/pause, title and elapsed/total time; expanded, it adds a seek slider, stop, volume and mute, playback speed and an open-in-new-tab link. Starting one recording pauses any other.InlineVideoCard.tsx): native controls (play, seek, volume, fullscreen) with a caption.InlineImageCard.tsx): markdown images become captioned cards that open the existing lightbox (rendered through a portal).InlineMediaFallback.tsx): media that cannot play shows a short notice and a link.AssistantMarkdown.tsx,lib/inlineMedia.ts): newaandimgcomponents. Raw HTML stays off and react-markdown's default URL transform is unchanged; media sources and links pass throughsafeMediaUrl/safeMarkdownHref.add_conversation_message_for_current_usermarks personal and shared messages withposted_via: agent_actionandcontent_format: markdown; V2 renders only those as markdown in the neutral bubble and labels them "posted through an agent". Messages people type stay plain text.CSP_MEDIA_SRC_ORIGINS(newcsp_media_sources.py) appends validated barehttps://origins tomedia-src; anything else is rejected and logged.Validation
functional_tests/test_v2_inline_media_players.py(7 checks, including the Node run oftest_v2_inline_media_logic.mjs): passed.test_v2_rich_rendering.py,test_v2_message_masking.py,test_v2_citations.py: passed (37 total with the new test).test_simplechat_conversation_messages.pyupdated for the new keyword and marker; it needs the Cosmos test environment, as before.tsc --noEmit: passed.Docs
docs/explanation/features/V2_INLINE_MEDIA_AND_AGENT_MESSAGES.md.create-an-action.md(media an action returns,CSP_MEDIA_SRC_ORIGINS),collaborate-in-a-conversation.md(messages an agent posts for you).REACT_V2_UI.mdCSP note.docs/explanation/features/V2_INTERACTIVE_MAPS.md, the Azure Maps action reference ("What people see in chat"), the vendored-library table and test list inREACT_V2_UI.md, and the 0.261.223 release notes.Interactive maps (0.261.223)
Replies that used the Azure Maps action now show their map in the V2 chat. Refs #1609.
application/v2_ui/public/vendor/openlayers-10.6.1/(ol.js,ol.css,LICENSE.md), byte-identical to the publishedol@10.6.1package and to the classic chat's copy, loaded only when a reply has a map. No npm dependency, no CDN asset, CSP unchanged.textContent. OpenLayers' attribution control writes its strings as HTML, so it is turned off and the attribution is shown as text in the footer. Tile templates must be/api/azure-maps/tile?...with{z},{x},{y}; colours must look like colours; coordinates are range-checked.GET /api/conversation/<id>/agent-citation/<artifact_id>. Only map functions are fetched.GET /api/get_messagesandGET /api/collaboration/conversations/<id>/messagesnow reissue expired tile tokens throughrefresh_azure_maps_message_citations, as the classic message route already did, so maps in older replies and in group conversations load their tiles.refresh_azure_maps_function_resultno longer parses JSON-text results that cannot be maps.{{map:...}}blocks are hidden from V2 reply text, as the classic chat hides them; the map comes from the tool result.Validation
functional_tests/test_v2_inline_maps.py: 7 passed. Vendored bytes match the published SHA-256, no HTML sink, attribution control off, tiles only through the proxy, wiring, both endpoints refresh, and the refresh helper reissues expired tokens in object and JSON-text results without mutating its input.functional_tests/test_v2_inline_maps_logic.mjs: 13 passed (Node, real module).ui_tests/test_v2_inline_maps.py: 4 passed. RealMessageListand card in Chromium with production CSS: tiles from the proxy, Full screen control, no HTML attribution control, legacy block hidden, hover details, click to pin, Escape, compact citation fetched and drawn, text list, fallback when OpenLayers cannot load.functional_tests/test_v2_rich_rendering.pyregisters OpenLayers with the vendored-library and forbidden npm dependency checks.functional_tests/test_content_screening_history.pygets the new helper in its route namespace.functional_tests/test_v2_enhanced_citations.pynow checks the builtmedia-srcdirective, since 0.261.222 moved that literal out ofconfig.py.npm run typecheckand the Vite build pass.Not in this change
Map tiles in stored replies (0.261.224)
Deploying 0.261.223 to a SimpleChat POC deployment showed the cards drawing correctly but every tile request returning 400. The cause was older than the V2 work.
sanitize_plugin_invocation_valuebefore they are stored as citations, in chat and in the workflow runner. Itstoken=rule replaced the map payload's tile proxy token with***REDACTED***, so every stored map, classic or V2, drew on blank tiles._redact_secret_assignmentnow keeps thetoken=value only where it directly follows/api/azure-maps/tile?, which is wherebuild_tile_proxy_url_templatewrites it. That token is encrypted with the app's secret key, expires, and only works on SimpleChat's signed-in tile proxy. Every othertoken=, another key after the prefix, a token later in the query, absolute URLs and every other secret are still redacted.test_v2_inline_maps.py::test_tool_result_redaction_keeps_only_the_tile_proxy_tokenruns the real logger and Azure Maps helpers.test_plugin_tool_agent_security_audit.pyandtest_log_injection_codeql_alerts_fix.pystill pass (47).docs/explanation/fixes/AZURE_MAPS_TILE_TOKEN_REDACTION_FIX.md, the V2 maps feature doc and the 0.261.224 release notes.