Changelog
Source:NEWS.md
shidashi 0.2.1
-
colormapSelectInput()can no longer be emptied: Backspace/Delete keep the selected color map, an update with an emptyselectedrestores the previous value (or the first color map), and aselectedoutside the choices selects the first one - Added a color picker widget using vanilla
shinyselect input; - Added base theme for plots and viewers that are registered output, such as
plotOutput2; - Redesigned the
MCPendpoint so agents such asClaude Codecan drive the dashboard without session binding:- the tool list is built from the template on disk (each module’s tools load once without a browser), so it is available before any browser opens and never changes while an agent is connected; tools from modules that fail to load fall back to
agents/tool-schema.yaml - each tool call runs in a module chosen on the spot: the module named by the optional
_moduleargument, else the module tab the user pinned with the new pin button, else the one the user used most recently; results end with a note naming the module - removed the
list_shinysessions,register_shinysession,get_session_info, andask_userMCPtools; addedshidashi_sessions(open modules and the default one) andshidashi_call(tools that exist only in live sessions) - the server no longer issues
Mcp-Session-Id;/mcp/{module}limits a connection to one module (a module id or a handle) - agent modes and the confirmation policy apply only to the in-dashboard chat; over
MCP, tools carryreadOnlyHintanddestructiveHintannotations and a note, and the agent asks the user in its own chat, never in the browser; tools turned off inagents.yamlstay off - the stdio proxy picks up apps from per-app records, follows an app across restarts, accepts
--appand--module, and always replies to a request - the stdio proxy works without a running app: it connects, lists the tools it can, and tells the agent to ask the user whether to start an app or launch a saved one
- the stdio proxy can attach to a shidashi app at any address for the current session (
shidashi_connect,shidashi_disconnect); its tool list follows the attached app, andshidashi_toolslists the app’s tools for clients that do not refresh their tool list - module handles always carry the session token prefix (
<module>@<token>), so a handle stays the same when the user opens the module again in another tab - added the
switch_modulemeta tool: it shows a module in the user’s dashboard as clicking it in the sidebar does (its open tab comes to the front, or it opens in a new tab;auto_new = FALSEonly switches to an open tab), and returns once the module’s page has loaded (optionsshidashi.switch_module_timeoutandshidashi.switch_module_wait); it is refused while the user has a module pinned - the dashboard now finds a module’s open tab by its module id, and a module page asks its dashboard directly when switching modules, so
switch_module()also works when the dashboard sits in a frame -
switch_module()gainsauto_new: withauto_new = FALSEit only switches to a module whose tab is open - exported
mcp_call_active(): it isTRUEwhile a tool runs for anMCPcall, and while it is, the environment variableSHIDASHI_USING_MCPis"TRUE"(removed when the call returns), so tools and skill scripts can behave differently for agents, for example print less
- the tool list is built from the template on disk (each module’s tools load once without a browser), so it is available before any browser opens and never changes while an agent is connected; tools from modules that fail to load fall back to
- Each skill is now two tools:
skill_load__<name>reads the instructions and reference files and never changes anything, andskill_run__<name>runs the scripts;skill_wrapper()returns both (load,run); in the dashboard chat, a script marked destructive inagents.yamlnow asks for confirmation - Skill scripts document their arguments in a
# Usage:header comment;skill_run__<name>lists each script’s usage and refuses a call that leaves out a required argument; files inscripts/whose names start with_are helpers, not scripts - Environment variables passed to a skill script (
envs) are now added to the app’s environment instead of replacing it, so the script keepsPATH,HOME, andSHIDASHI_USING_MCP - Added
save_launcher()andrun_launcher(): saved apps are kept in onelaunchers.jsonfile in theshidashicache folder, optionally with a copy of the app (copy_app = TRUE) and free-form metadata; theMCPproxy lists saved apps (shidashi_launchers) and, when the user picks one, starts it and opens the chosen module in the browser (shidashi_launch) -
shiny_query_uinow returns the element’s HTML or image in one call;shiny_query_ui_resultis removed;transform_image = FALSEasks for HTML only, and long HTML is trimmed (image data and scripts shortened,max_charssets the limit) - Added the
shiny_output_resultMCPtool: it returns a registered output’s rendered content even when the output is in a hidden tab or a collapsed card, rendering it first (waiting up to 10 seconds; optionshidashi.output_result_timeout); a plot that was never shown is drawn at a fallback size;shiny_query_uinotes when an element is not shown or shows an error; outputs registered withdownload_type = "htmlwidget"also return the widget data (x), since a widget such as aDTtable shows only one page of it, and outputs registered withdownload_type = "data"also return whatdownload_functionwrites; both are trimmed bymax_chars - Added
render_hidden_output(), which renders one output at the next flush even when it is hidden, then restoressuspendWhenHidden -
shiny_query_uiandshiny_output_resultask the browser after a short pause (optionshidashi.query_ui_delay, default 0.1 seconds): agents often send a change and a query in one turn as concurrent requests, whichRmay take in either order, and the pause lets the change reach the page first - In the
bslib-baretemplate,shiny_query_uiandshiny_output_resultask athreeBrainviewer for pictures of itsWebGLorWebGPUcanvases: they dispatch oneviewerApp.captureOnceevent on the viewer’s wrapper (.threejs-brain-canvas) with an empty object asdetail, and the viewer draws a frame and adds{ canvas, dataURI }todetail.viewsfor each view it drew. When the viewer has not answered after three animation frames, and for any other canvas, the canvas is read directly as before. Such canvases used to come back blank inChromium, or out of date in browsers that keep the last frame. A page that draws no frames (for example in a background tab) is read after half a second, with a note - Errors inside
shidashi’s own observers are reported as warnings instead of ending the user’s session -
register_input()gainstooltip, shown when the mouse hovers over the input (itstitle); it defaults to the first sentence ofdescription(newas_tooltip()), andtooltip = NULLturns it off; only inputs get it, so other registered elements, such as cards, are unchanged
shidashi 0.2.0
CRAN release: 2026-04-10
New Features
- Added
stream_vizhtmlwidgetswidget for real-time multi-channel signal viewing; binary stream files are produced bystream_to_js()and fetched by the browser viafetchStreamData(); rendering engine switched fromD3toThree.js(WebGL) for improved performance on high-density multi-channel data - Added streaming helpers:
stream_init()sets up per-session stream directories with automatic cleanup;stream_path()returns the token-qualified file path;stream_file_id()builds the{token}_{ns(id)}identifier used by both R andJS - Added
stream_to_js()for writing binary envelope files (supportsraw,json,int32,float32,float64body types) andread_stream_vis()for reading them back in R - Added
streamVizOutput()/renderStreamViz()/updateStreamViz()Shiny bindings for thestream_vizwidget -
register_output()is now a server-side function: it assigns the render function, registers theMCPoutput spec, and injects download/pop-out widget icons viaJSoverlay (no UI-side wrapper needed) - Added output widget overlay system: registered outputs gain hover-visible download and pop-out icons injected entirely by
JS; download modal supportsimage,htmlwidget,threeBrain,data, andstream_viztypes - Added
server_standalone_viewer()— a hidden module that re-renders a parent session’s output in a standalone browser tab (pop-out window), forwarding inputs back to the original module session - Added
fire_event()andget_event()for a reactive session event bus; events can be scoped locally (per-session) or globally (cross-tab broadcast viashared_id);get_theme()is a convenience wrapper that returns the current dashboard theme - Added
register_session()/unregister_session()for comprehensive session life-cycle management with automatic cleanup, reactive event bus setup, and cross-tab synchronization support; replaces the deprecatedregister_session_id() - Added
get_handler()/set_handler()for managing named session-scopedObserverobjects with a shared registry; handlers are automatically destroyed on session end - Added
enable_input_broadcast()/disable_input_broadcast()andenable_input_sync()/disable_input_sync()for opt-in cross-tab input state synchronization; broadcast publishes the current session’s inputs for peer tabs, sync restores inputs from a peer session - Added
switch_module()to programmatically navigate to another module from server-side code; supports cross-iframeforwarding viaJSpostMessage - Added
card_badge()UI component for dynamic badge widgets in card headers;set_card_badge()updates badge text and styling from the server without re-rendering;card_recalculate_badge()creates a clickable “recalculate needed” badge withenable_recalculate_badge()/disable_recalculate_badge()toggles - Added
html_asis()for escaping HTML special characters to display strings literally;combine_html_class()merges and remove duplicated class strings;remove_html_class()removes specified classes from a class string -
shared_idis now unified and shared across UI and server viainit_app(); resolved from URL query string, R option, environment variable, or auto-generated - Internal session registries (
tools,output_renderers,handlers) now usefastmapforO(1)lookup and efficient memory management - Added
_captureSVG()helper inJSto convertSVG(raster) elements (e.g.D3output) toPNGdata URLs for the query-UI tool - Added
shidashi.set_shiny_inputJSmessage handler for programmatic cross-session input forwarding - Added
shidashi.switch_moduleJSmessage handler for programmatic module navigation fromJS - Added
shidashi.register_output_widgetsJSmessage handler that injects the download/pop-out overlay icons on registered outputs - Added demo template modules:
output_widgets,stream_viz, andsession_events; added hiddenstandalone_viewermodule - Added
htmlwidgetstoImports
Bug Fixes
- Fixed download file extension not used correctly in
register_output() - Fixed position issue for output widget overlay container
- Fixed multi-result
MCPtool request not handled correctly in chat-bot - Sanitized
MCPtool-call results for dashboard display
shidashi 0.1.7 & 0.1.8
New Features
- Added built-in AI chat-bot panel powered by
ellmerandshinychat; supports multiple providers, in-memory conversation history, mode-based tool permissions, token/cost display, and early-stop controls - Added
init_chat()to create anellmerChatobject from R options (shidashi.chat_provider,shidashi.chat_model,shidashi.chat_system_prompt,shidashi.chat_base_url) - Added
MCP(Model Context Protocol) proxy server (inst/mcp-proxy/) so externalLLMclients can interact with a running Shiny application viaMCP - Added
mcp_wrapper()to register anMCPendpoint for a Shiny module - Added
register_input()/register_output()helpers to expose Shiny inputs and outputs asMCPtool parameters with descriptions - Added skills system:
skill_wrapper()parses and runs reusable agent skill scripts; skill working directory is resolved relative to the skill folder - Tools and skills are now category- and permission-aware; module IDs are excluded from tool names for consistency
- Added
module_drawer(),drawer_open(),drawer_close(), anddrawer_toggle()for controlling a slide-in drawer panel -
module_info()now returns richer per-module metadata; addedcurrent_module()andactive_module()helpers for querying the active Shiny module - Modules support an optional
agents.yamlfor declaring agent configurations (tools, skills, auto-approve rules) -
MCPhost can be a remote server; fuzzy module reference is supported when resolving module IDs - Added demo template modules:
aiagent,filestructure, andmcpsetup - Added
ellmercontent helpers: S7 genericellmer_as_json()forContentText,ContentImageInline,ContentImageRemote, andContentToolResult; andcontent_to_mcp()for converting chat content toMCPresponses - Chat-bot UI displays token usage and API cost next to each turn
shidashi 0.1.5
CRAN release: 2023-04-04
- Fixed
accordionandcard_tabsetnot working properly wheninputIdstarts with digits - Updated templates and used
npmto compile - Session information now stores at
userDatainstead of riskycache - Ensured at least template root directory is available
shidashi 0.1.4
CRAN release: 2022-10-15
- Fixed a bug that makes application fail to launch on
Windows - Added support to evaluated expressions before launching the application, allowing actions such as setting global options and loading data
shidashi 0.1.2
CRAN release: 2022-06-21
- Fixed group name not handled correctly as factors
- Module
URLrespects domain now and is generated with relative path - Works on
rstudio-servernow - More stable behavior to
flex_container - Allow output (mainly plot and text outputs) to be reset
- Fixed
iframeheight not set correctly - Enhanced 500 page to print out
traceback, helping debug the errors - Added
flex_breakto allow wrapping elements in flex container - Added
remove_classto removeHTMLclass from a string - Allow to set
data-titleto cards