|
| 1 | +--- |
| 2 | +title: v9.0.0 |
| 3 | +description: Analytics single-form cutover (ADR-0021), honest chart taxonomy, canonical OS_* settings env vars, Google sign-in, and a smarter AI build experience in Console. |
| 4 | +--- |
| 5 | + |
| 6 | +**Released June 10, 2026.** All `@objectstack/*` packages are published at 9.0.0. This is a major |
| 7 | +release: the analytics authoring surface completes its cutover to the dataset |
| 8 | +semantic layer, the chart taxonomy is trimmed to what actually renders, and |
| 9 | +settings environment variables move to their canonical `OS_*` form. |
| 10 | + |
| 11 | +**TL;DR for upgraders:** if your app defines dashboards, reports, or list |
| 12 | +charts with inline queries (`object` + `aggregate` + field names), you must |
| 13 | +migrate them to named datasets. If you configure settings via environment |
| 14 | +variables, rename them to `OS_<NAMESPACE>_<KEY>`. Everything else is additive. |
| 15 | + |
| 16 | +## Breaking changes |
| 17 | + |
| 18 | +### 1. Analytics single-form cutover — datasets are now required (ADR-0021) |
| 19 | + |
| 20 | +The inline analytics author surface is removed from `@objectstack/spec`. Every |
| 21 | +dashboard widget, report, and list chart must now bind a semantic **dataset** |
| 22 | +and select dimensions/measures **by name**. Define a metric once, reference it |
| 23 | +everywhere. |
| 24 | + |
| 25 | +Removed from the spec: |
| 26 | + |
| 27 | +| Schema | Removed properties | Now required | |
| 28 | +|:---|:---|:---| |
| 29 | +| `DashboardWidget` | `object`, `categoryField`, `categoryGranularity`, `valueField`, `aggregate`, `measures` (and the `WidgetMeasure` type) | `dataset` + `values` | |
| 30 | +| `Report` | top-level and joined-block `objectName`, `columns`, `groupingsDown`, `groupingsAcross`, `filter` | `dataset` + `values` (`rows` are the dimensions) | |
| 31 | +| `ListChart` | `xAxisField`, `yAxisFields`, `aggregation`, `groupByField` | `dataset` + `values` | |
| 32 | + |
| 33 | +**Migration:** |
| 34 | + |
| 35 | +1. For each inline query, create a dataset with `defineDataset(...)` declaring |
| 36 | + its dimensions and measures. See the |
| 37 | + [Analytics Datasets guide](/docs/guides/analytics-datasets). |
| 38 | +2. Point the widget/report/chart at it: `dataset: "<name>"`, pick `values` |
| 39 | + (measure names) and `dimensions`/`rows` (dimension names). |
| 40 | +3. Presentation-scope filtering goes through the widget's `filter`, which is |
| 41 | + applied as the dataset's `runtimeFilter`. |
| 42 | +4. A flat record listing (the former `tabular` report or inline list) is not an |
| 43 | + analytics dataset — model it as an object-bound **ListView** (ADR-0017). |
| 44 | + |
| 45 | +> Rationale: [ADR-0021 — Analytics: one semantic dataset layer](https://github.com/objectstack-ai/framework/blob/main/docs/adr/0021-analytics-dataset-semantic-layer.md) |
| 46 | +
|
| 47 | +### 2. `ChartTypeSchema` trimmed to distinctly-renderable families |
| 48 | + |
| 49 | +Eight chart types that only ever rendered as their base chart are removed, so |
| 50 | +the taxonomy no longer advertises variants the renderer doesn't draw. Update |
| 51 | +any widget or series using a removed type to its base: |
| 52 | + |
| 53 | +| Removed type | Use instead | |
| 54 | +|:---|:---| |
| 55 | +| `grouped-bar`, `stacked-bar`, `bi-polar-bar` | `bar` | |
| 56 | +| `stacked-area` | `area` | |
| 57 | +| `step-line`, `spline` | `line` | |
| 58 | +| `pyramid` | `funnel` | |
| 59 | +| `bubble` | `scatter` | |
| 60 | + |
| 61 | +Kept: `bar` / `horizontal-bar` / `column`, `line` / `area`, `pie` / `donut` / |
| 62 | +`funnel`, `scatter`, `treemap` / `sankey`, `radar`, `table` / `pivot`, and the |
| 63 | +single-value performance family (`metric` / `kpi` / `gauge` / `solid-gauge` / |
| 64 | +`bullet`). Removed variants can return behind an opt-in renderer once a real |
| 65 | +renderer and data model back them. |
| 66 | + |
| 67 | +### 3. Settings env overrides: canonical `OS_<NAMESPACE>_<KEY>` only |
| 68 | + |
| 69 | +`@objectstack/service-settings` no longer accepts unprefixed aliases for |
| 70 | +settings-namespace environment overrides. Rename your deployment variables: |
| 71 | + |
| 72 | +| Before | After | |
| 73 | +|:---|:---| |
| 74 | +| `AI_OPENAI_BASE_URL` (or `ai.openai_base_url`) | `OS_AI_OPENAI_BASE_URL` | |
| 75 | +| `FEATURE_FLAGS_AI_ENABLED` | `OS_FEATURE_FLAGS_AI_ENABLED` | |
| 76 | + |
| 77 | +The general rule: `OS_` + namespace + key, upper-snake-cased. See the |
| 78 | +[Environment Variables guide](/docs/guides/environment-variables). |
| 79 | + |
| 80 | +### 4. `@object-ui/plugin-workflow` removed |
| 81 | + |
| 82 | +The package authored BPMN-style workflow shapes the ObjectStack automation |
| 83 | +engine does not execute (ADR-0020, ADR-0031). If you imported it in a custom |
| 84 | +UI, the replacements ship already: flow authoring is the metadata-admin |
| 85 | +`FlowCanvas` (engine-registry-driven palette) in `@object-ui/app-shell`, run |
| 86 | +history is `FlowRunsPanel`, and approval UI comes from the framework's |
| 87 | +`@objectstack/plugin-approvals`. |
| 88 | + |
| 89 | +## New in the framework |
| 90 | + |
| 91 | +### Analytics results are now presentation-ready |
| 92 | + |
| 93 | +Three `@objectstack/service-analytics` improvements make charts and reports |
| 94 | +human-readable with no frontend work: |
| 95 | + |
| 96 | +- **Dimension display labels.** A `select` dimension shows its option label |
| 97 | + (`Backlog`, not `backlog`); a `lookup`/`master_detail` dimension shows the |
| 98 | + related record's display name instead of its foreign-key id. Resolution |
| 99 | + happens server-side in `queryDataset`. |
| 100 | +- **Date dimensions bucket and format by granularity.** A monthly trend chart |
| 101 | + now yields one point per month with sort-stable labels (`2026`, `2026-Q2`, |
| 102 | + `2026-04`) — no more raw epoch milliseconds on the axis. |
| 103 | +- **Measure label and format travel with the result.** `AnalyticsResult.fields[]` |
| 104 | + gains optional `label` and `format`, so a chart can display "Tasks" and |
| 105 | + "$616,000" while keeping raw numbers for plotting. |
| 106 | + |
| 107 | +### Auth: Google sign-in and an extension hook |
| 108 | + |
| 109 | +`@objectstack/plugin-auth` binds the `auth` settings namespace to better-auth |
| 110 | +runtime configuration and exposes an extension hook for provider packages. |
| 111 | +Google sign-in works out of the box — configure it in **Setup → |
| 112 | +Authentication** or via deployment-level `GOOGLE_CLIENT_ID` / |
| 113 | +`GOOGLE_CLIENT_SECRET`. See [Auth & SSO](/docs/guides/auth-sso). |
| 114 | + |
| 115 | +### CLI: AI provider SDKs bundled |
| 116 | + |
| 117 | +The CLI now ships `@ai-sdk/openai`, `@ai-sdk/anthropic`, and `@ai-sdk/google` |
| 118 | +as direct dependencies. A globally-installed CLI can configure any |
| 119 | +OpenAI-compatible provider (DeepSeek, DashScope, SiliconFlow, OpenRouter, |
| 120 | +Cloudflare) without the previous "Could not build adapter for provider=…" |
| 121 | +failure. |
| 122 | + |
| 123 | +## New in Console (Studio) |
| 124 | + |
| 125 | +The Console build frozen into `@objectstack/console` 9.0.0 picks up the |
| 126 | +dataset cutover end-to-end, plus a round of AI-builder and designer |
| 127 | +improvements: |
| 128 | + |
| 129 | +- **Dataset widgets render as their true chart type** — pie, donut, funnel, |
| 130 | + line, area, scatter, radar, treemap, sankey, table, and pivot all route to |
| 131 | + their real renderer, and metric cards display the measure's label and format. |
| 132 | +- **Reports render the dataset form** (ADR-0021), including matrix and joined |
| 133 | + variants; widget filters apply as dataset runtime filters. |
| 134 | +- **Flow designer aligned with the engine vocabulary**, with a runs panel for |
| 135 | + inspecting executions; toolbar flow/script actions now resolve the selected |
| 136 | + record correctly. |
| 137 | +- **Build-with-AI**: a live build tree streams progress while the agent |
| 138 | + scaffolds an app, finished apps can auto-publish in chat, seed-data results |
| 139 | + are surfaced, and the consumer panel no longer dumps raw tool JSON. |
| 140 | +- **Marketplace**: when cloud-bound, the Installed view reads the |
| 141 | + control-plane's install list (ADR-0007). |
| 142 | +- **Forms**: conditional rules in inline grids can now reference parent-record |
| 143 | + fields (`parent.<field>` scope). |
| 144 | +- **Pages**: `PageView` gains a console action runtime, so page-embedded |
| 145 | + actions behave like their grid/detail counterparts. |
| 146 | +- **Charts**: crowded bar-chart x-axis labels angle and truncate instead of |
| 147 | + overlapping. |
| 148 | + |
| 149 | +## Notable fixes |
| 150 | + |
| 151 | +- Publishing pending drafts by ref so package-less drafts can't get stuck in |
| 152 | + the metadata-admin publish queue. |
| 153 | +- `FlowRunner` closes cleanly when a terminal resume fails instead of leaving |
| 154 | + a dead dialog. |
| 155 | +- The AI service treats a stored or env-locked `provider=memory` as an explicit |
| 156 | + override, while manifest defaults keep boot-time provider auto-detection |
| 157 | + intact. |
| 158 | + |
| 159 | +## Upgrade checklist |
| 160 | + |
| 161 | +1. Update all `@objectstack/*` dependencies to `^9.0.0` (they are |
| 162 | + version-locked — upgrade them together). |
| 163 | +2. Migrate inline dashboard widgets, reports, and list charts to named |
| 164 | + datasets ([guide](/docs/guides/analytics-datasets)). |
| 165 | +3. Replace removed chart types with their base family (table above). |
| 166 | +4. Rename settings env vars to the `OS_<NAMESPACE>_<KEY>` form. |
| 167 | +5. Re-run your app's spec validation (`os validate`) — it will flag any |
| 168 | + metadata still using removed properties. |
0 commit comments