Skip to content

v0.19.0

Choose a tag to compare

@miragon-release-please miragon-release-please released this 12 Oct 13:35
080d2aa

0.19.0 (2026-10-12)

⚠ BREAKING CHANGES

  • analytics: In @miragon-ai/analytics-client, an EngineLandscapeEngine that reports no metrics carries null instead of 0 in every count. The landscape totals' runningInstances, openIncidents and failedJobs are null while no engine reports, and analytics_engine_landscape and its feed send these nulls too. AnalyticsDashboardData requires the new previous and activityCount fields, and dashboardData takes an optional minBucketSize. createBpmnXmlFetcher (camunda7-connector) rejects a failed read instead of resolving null, and resolves null only for a missing definition. FetchBpmnXml (analytics-connector) takes an optional engineId and carries the same contract, so a custom fetcher must reject a failure.
  • camunda7: In @miragon-ai/camunda7-connector, camunda7_save_user_profile and Camunda7Settings drop preferredRole; the strict tool input refuses it, and a stored value stays inert. UserProfileView requires readOnlyReason ("toolset" | "noSignIn" | null); "noSignIn" is reported for any request without a profile key. The view models require new name and label fields, each null when unknown:
    • Job: processDefinitionName and activityName;
    • ProcessInstanceRow: processDefinitionName;
    • IncidentInstance: businessKey;
    • InstanceDetailData: processDefinitionName;
    • HistoryTimelineData: incidentActivityIds;
    • EngineHealthCluster: activityName and processDefinitionName;
    • ClusterIncidentRow: processDefinitionName;
    • ClusterDetailData: activityName;
    • BpmnViewerData: businessKey and processDefinitionName.
  • widget-shell: In @miragon-ai/widget-shell/widgets, ViewDataState and QueryFallback require onRetry. QueryFallback no longer takes errorHint: describeError words the failure, and errorTitle heads only a failure it cannot classify. ViewDataState's loadingText is now the optional sr-only status. useDetailView takes refreshErrorTitle instead of refreshErrorText. ListTable requires ariaLabel and renders its table inside a scroll region. TableEmptyState renders the toolkit's EmptyState, with its children as a non-heading title. BpmnHeatmap without a height sizes itself from the diagram's aspect ratio, and HeatmapLegend shows min and max when given. The shell:* widgets' default empty texts are the kit's localized words instead of the dataKey.
  • @miragon-ai/widget-shell/widgets no longer exports cn, the tone model (ToneVariant, TONE_, MICRO_LABEL), KpiGrid/KpiGridSkeleton/KpiCell/KpiGridHeader, LivePill/StatusBadge/CountPill, FilterBar/FilterChip, WidgetHeader, PagedListFooter, SectionHeading, GroupCard, DrillButton, ListFooter, useDebouncedValue, parseToolResult/parseViewToolResult, useHostActions/buildShowWidgetIntent/HostActions, useViewToolQuery, useViewData or ViewDataResult. Import them from @miragon/mcp-toolkit-ui (or its /app and /hooks subpaths), and use useViewData with initialDataMode "seed" plus the new viewRefreshState. camunda7's CockpitListFooter and its listFooter. catalog keys are gone. The @miragon/mcp-toolkit-* peer range is ~2.8.0.
  • The in-app theme switch is gone. The profile record, the camunda7 settings panel and camunda7_save_user_profile no longer carry a theme, and the save tool rejects the key. widget-shell no longer exports THEMES or ThemePref, and useApplyTheme() takes no argument; widgets follow the host's theme, then the OS's. @miragon-ai/widget-shell no longer ships ./theme.css. A consumer stylesheet imports tailwindcss, adds an @source for node_modules/@miragon/mcp-toolkit-ui/src, imports @miragon/mcp-toolkit-ui/theme.css and overrides role variables only; the template's brand.css shows how. The --m-* accents and the critical tone no longer exist. The @miragon/mcp-toolkit-* peer range is ~2.7.0, and a host bundle that dedupes lucide-react needs a 1.x version.
  • camunda7: EngineHealthData drops headline; the verdict is status plus summary, worded by its reader. IncidentsDashboardData, ProcessIncidentsData and IncidentDetailData require engineVendor. The CIB seven provider's display name is "CIB seven". Several camunda7 catalog keys changed: the hand-off labels (handOff.*), the former …One/…Other plural pairs and several messages. The show tools' view titles come from the profile language, or are absent.
  • widget-shell: The widget-shell tone vocabulary drops critical (use danger) and TONE_TEXT (use TONE_INK; numbers stay neutral, and a state is a dot, edge or icon). WidgetHeader no longer takes icon/iconTone. The tone colours live in @miragon-ai/widget-shell/theme.css, and the --critical* and --*-foreground tone tokens are gone from the app and template stylesheets; override --<tone>, --<tone>-soft and --<tone>-ink instead. formatDuration renders German units in a German view. The kit peers on lucide-react (^0.562.0 || ^1.0.0), which a consumer installs and appends to its vite dedupe list.
  • In @miragon-ai/widget-shell, PagedViewData.error now carries only the page-0 failure; load-more failures move to the new loadMoreError, and retry, refreshing and stale are added. firstPage keeps the previous result of the same list while a new page 0 is in flight or has failed. camunda7:process-definition-flow drops its initialMode prop. camunda7_open_cockpit lists only the caller's engines (allowedEngineIds) and refuses an engine outside them with ENGINE_NOT_AVAILABLE instead of opening the picker.
  • widget-shell: The profile language gains "system" (follow the host locale) and defaults to it, so ProfileRecord.language and the camunda7 UserProfile.language are now LanguagePref. View stylesheets import @miragon-ai/widget-shell/theme.css after tailwindcss, plus an @source for the toolkit's src, instead of @miragon/mcp-toolkit-ui/globals.css, and Geist is no longer shipped. ViewDisplayModeBridge is replaced by ViewHostBridge, and AppShellProviders no longer mounts mcp-use's ThemeProvider. ProfileGate holds the first paint until the profile answers: at most 1.5 s after the host connects, 5 s without a host. BpmnZoomControls sit top-right.
  • AskAiButton's prompt accepts only an AskAiPrompt built by askAiPrompt from @miragon-ai/widget-shell/widgets: a raw string no longer compiles, and null renders no button. @miragon-ai/camunda7-connector no longer exports CAMUNDA7_ENGINELESS_TOOLS. camunda7_format_incident_issue and the draft_incident_ticket prompt drop their repository argument: drafts target only the configured CAMUNDA_INCIDENT_ISSUE_REPO, and without one there is no prefilled URL.
  • analytics: analytics reads only the server's configured engines: camunda7's engine ids, else ANALYTICS_ENGINE_IDS, else every analytics tool refuses. It refuses any other engine id. analytics_engine_health returns unknown (a new status) for silent engines and only counts alerts scoped to them. @miragon-ai/analytics-client renames or removes result fields without aliases:
    • dashboard runningCount/failedCount/incidentCount/failureRatePct → runningNow/openIncidentsNow/incidentsCreated/incidentsResolved/incidentRatePct;
    • failureDashboardData.processBreakdown totalInstances/failedCount/incidentCount/failureRatePct → runningNow/deadJobs/openIncidents/incidentRatePct;
    • definitionBreakdown running/failed → runningNow/incidentsCreated;
    • activityBreakdown rows drop activityName and gain processDefinitionKey;
    • analyzePerformance/comparePeriods failed/failure_rate_pct → incident_count/incident_rate_pct, and analyzePerformance drops earliest/latest;
    • compare failed_count/failure_rate_pct and the failure-rate delta are removed, instance_count_delta_pct → started_per_day_delta_pct, and element-scoped incidents move to element_incident_*;
    • failure-dashboard and find-failed rows carry only incident type, process and counts;
    • durations and rates are null when not measured;
    • every engine-filterable result gains engines, and findFailedInstances returns { engines, patterns }.
  • camunda7: camunda7 view payloads change meaning and shape. The definition view, the cockpit landscape and the incidents dashboard count every version of a key. ProcessIncidentsData.version is now diagramVersion; DefinitionStat.version and IncidentsDashboardProcess.version are now latestVersion; IncidentsDashboardProcess.totalActivityCount is gone; per-activity incidentCount is now scannedIncidentCount. Health and cluster counts follow the ClusterCounts shape: incidentCount is nullable, with scannedIncidentCount and a nullable last24hCount. Numbers the server cannot vouch for are null instead of 0: affected activities, the 24h and first-seen facts of a partial scan, siblingsWithIncidents and BpmnViewerData.bpmnXml. InstanceDetailData gains exact incidentCount/openTaskCount. BpmnViewerData gains statsScope and, in instance mode, counts only the instance's own tokens and failed jobs. The process-instance list reports totals over the whole filtered set. Engine failures and unknown ids are tool errors instead of empty views. The pipeline steps throw on failure and stamp engineId. The incidents-dashboard step reads its scope from camunda7:incidentsProcessDefinitionKey instead of camunda7:processDefinitionKey.
  • @miragon-ai/widget-shell/server no longer exports mergeRawSlice (save a slice with saveModuleSlice) or mergeProfile (use mergeStoredProfile(...).record). ComposableModule.supportsToolsets is removed: a module without a toolsets vocabulary is a module without toolsets, so its suffix is ignored with a warning and its config never carries a toolset. EffectiveToolset.source no longer has the "legacy" value. Profile records stored below schema v3 are no longer migrated: they are adopted at schema v3, their flat v1/v2 module fields stay inert, and those preferences read as their defaults.
  • camunda7_engine is gone: camunda7_list_engines (read-only) lists the engines and the saved default, and camunda7_select_engine saves it. The camunda7 engine parameter is advertised as an enum of the configured ids, so an unknown id now fails input validation instead of returning UNKNOWN_ENGINE. camunda7_list_process_definitions and camunda7_list_deployments return the { items, totalCount, hasMore, nextOffset? } envelope instead of a bare array. Every model-visible maxResults is capped at 100, and camunda7_show_history_timeline defaults to 100 (was 500). The model-facing variable reads cut string values over 2000 characters (truncated: true, valueLength); pass variableName to read one variable whole. Writes declare destructiveHint: false explicitly. BootComposition (createComposedServer) requires the composition's instructions member, and module snippets are appended to the server instructions. Advertised input schemas drop $schema and the safe-integer bounds.
  • camunda7 and analytics tools, including show tools and app-only feeds, now reject unknown input keys with a tool error that lists the valid ones, instead of ignoring them. Parameters were renamed without aliases: camunda7_list_process_definitions, camunda7_show_process_list and camunda7_process_list_data take processDefinitionKey (was key); camunda7_get_deployment takes deploymentId (was id); camunda7_query_historic_task_instances takes assignee (was taskAssignee); camunda7_show_process_instances, camunda7_process_instances_data and the process-instances widget take withIncidents (was withIncidentsOnly; the echoed filters follow); analytics_find_failed_instances and analytics_element_bottleneck take maxResults (was limit, also in the analytics-client params); and the analytics cluster/engine/version compare tools and their show twins take activityId (was elementId; VERSION_ELEMENT_SCOPE_NOTE is now VERSION_ACTIVITY_SCOPE_NOTE). A false boolean filter is no longer forwarded: it is sent as its complementary flag or dropped. A complementary pair that asks for both states or neither is refused. A …Like filter without % now matches a substring instead of the exact value.
  • A client-supplied Mcp-Session-Id is no longer a profile key, and a missing request context no longer maps to the shared anonymous record. Without MCP_OAUTH there is no caller identity: settings show defaults and saves refuse. MCP_PROFILE_SESSION_TTL_DAYS and REDIS_URL are no longer read. widget-shell drops startProfileSessionCleanup, isExpiredSessionRecord, ProfileStore.cleanupSessions, ProfileAuthContext and McpRequestInfo.sessionId; anonymousCaller declares the local caller instead. MCP_OAUTH is parsed strictly by widget-shell's oauthFromEnv, so oidc/oidc-proxy and the ignored audience key now fail the boot as invalid config. camunda7's EngineRegistry.defaultEngineId lookup now receives the tool call's ctx.
  • camunda7: camunda7_handle_external_task_failure (and the exported handleExternalTaskFailureInput) requires retries; camunda7_set_job_retries_batch and camunda7_migrate_process_instances_async return { batchId, status: "queued", type, totalJobs, … } instead of { success: true, …, batch }; camunda7_complete_task submits the task form (/submit-form) only for a task with form fields, so the engine rejects a completion that violates those fields while omitted fields keep their value, a task without form fields still completes through /complete, and a delegated task is resolved back to its owner and stays open (outcome "resolved"); camunda7_get_task_form fails for an unknown task instead of returning empty fields; variable reads return Json/Xml/Object values serialized (a string plus valueInfo) instead of deserialized; date filters and Date variables refuse non-ISO-8601 input.

Features

  • adopt the toolkit's Miragon theme (toolkit 2.7.0) and drop the in-app theme switch (#382) (1f6f6e5)
  • analytics: Lucide hand-offs, brand-tone copy, honest comparisons and a shared vocabulary (#380) (6db8405)
  • analytics: names before ids, honest unknowns and one severity ladder in the analytics views (#387) (bcd40b5)
  • build every Ask-AI hand-off with askAiPrompt — fenced engine text, localized intents, live tool surface (#373) (2fe8492)
  • camunda7: context line, names before ids and one primary action in the camunda7 views (#386) (d06ad38)
  • camunda7: Lucide icons, chat hand-offs and brand-tone copy in the camunda7 widgets (#379) (f773444)
  • camunda7: run every in-widget write through useEngineAction — named confirmations, targeted refresh, seeded standalone views (#376) (01bf2fa)
  • deps: bump @miragon/mcp-toolkit-* to 2.6.0 and mcp-use to 2.7.3 (#362) (62a8879)
  • docs: align the docs site with the Miragon CI dark theme (#350) (#369) (017fe4d)
  • LLM surface trims — engine enum + server instructions, camunda7_engine split, one pagination contract, historic incidents, labelled health verdicts (#368) (11d7d8a)
  • widget-shell: kit layout, states, feedback and BPMN tokens on the Miragon CI (#385) (a7f2b16)
  • widget-shell: lay the Miragon design-system foundation in the kit (#378) (242ec19)
  • widget-shell: serve Geist and Geist Mono from the server and load them in every view (#384) (1261745)

Bug Fixes

  • analytics: report only what the metrics measure — unknown health, live gauges, null durations, clamped windows, configured engines (#372) (60e20bc)
  • camunda7: honour the engine REST contract in tools, feeds and widgets (#365) (c5d5f69)
  • camunda7: report honest camunda7 numbers — key-wide views, counts over capped scans, errors over zeros (#371) (0bfbabc)
  • camunda7: resolve real definition keys in the data builders and echo the incidents-dashboard filters (#374) (594ed37)
  • open the cockpit on its resolved engine, keep paged lists mounted while they fetch, gate the heatmap on analytics and read tenant diagrams by id (#377) (2f6f56c)
  • profile persistence keeps unknown keys, serializes writes and degrades on store outages (#363) (e900ac9)
  • refuse unknown tool inputs and give the tools the filters their prompts promise (#367) (3024da1)
  • resolve caller identity from OAuth only, wired through widget-shell's oauthFromEnv (#366) (cdd40a1)
  • widget-shell: follow the host — theme, locale, height, fonts, BPMN canvas, fullscreen (#375) (eca2918)

Code Refactoring

  • move to toolkit 2.8.0 — one kit, the toolkit's seeded views and builder titles (#383) (bbe64a7)
  • remove the pre-production compat paths (#370) (29c9f98)