diff --git a/.changeset/console-53ded82bf7a4.md b/.changeset/console-53ded82bf7a4.md new file mode 100644 index 0000000000..a43ad9a9c0 --- /dev/null +++ b/.changeset/console-53ded82bf7a4.md @@ -0,0 +1,47 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `53ded82bf7a4`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 23 releasing of 28 changesets added across 34 non-merge commits; omitted: 5 release-nothing changesets, 7 commits carrying no changeset (they ship no package code). + +- **minor** — Array filters on analytics aggregates were posted un-lowered and refused by the runtime with 400; they are now lowered to the canonical `FilterCondition` before the wire. (objectui `53ded82bf`) +- **minor** — Retire `ChatbotSchema.displayMode` — and its copy on `ChatbotFloatingSchema` — as an ADR-0049 retirement tombstone, and remove the `chatbot-floating` registration's "Display Mode"… (objectui `3e377c931`) +- **minor** — `ChartDataSeriesSchema` (and its TS twin `ChartDataSeries`) now REFUSES `chartType` on a chart series BY NAME and points at `type` — the renderer-internal spelling the non-strict… (objectui `caf477fa8`) +- **minor** — `DataScopeManager` now **denies** a row when a row-level scope rule carries an operator its evaluator does not implement. It used to **admit** the row. (objectui `83c77dc30`) +- **minor** — One home for the `datetime` display convention (objectui#7443). (objectui `81a2eb1fb`) +- **minor** — **`BaseSchema.visible` / `.hidden` / `.disabled` now declare the CEL envelope object the renderer already evaluates, as one named wire type** (objectui#7530, maintainer ruling 202… (objectui `c354ce5db`) +- **minor** — **Breaking for authored metadata:** `MarkdownSchema.sanitize` and `MarkdownSchema.components` are RETIRED (objectui#6972, ADR-0049 enforce-or-remove). A `markdown` node that autho… (objectui `446d93d4e`) +- **minor** — One named, importable authoring-face type per `plugin-chatbot` registration: `ChatbotEnhancedSchema` and `ChatbotFloatingSchema` join `ChatbotSchema` (objectui#7655, under the obj… (objectui `4ce14f125`) +- **minor** — Six user-visible fixes across the maker surface, the assistant rail and the dataset captions. (objectui `64dae8e71`) +- **minor** — `DrillDownConfigSchema` is the zod mirror of `DrillDownConfig`, and both declarations that carry `drillDown` reference it — `ChartSchema` (`zod/data-display.zod.ts`) and `ObjectDa… (objectui `52c8cf741`) +- **minor** — `ObjectGallerySchema` and `ObjectDataTableSchema` are members of `ObjectQLComponentSchema` on both faces — the TS union in `objectql.ts` and the zod union in `zod/objectql.zod.ts`… (objectui `52c8cf741`) +- **minor** — `ChartDataSeriesSchema` (and its TS twin `ChartDataSeries`) declares the six series keys the renderer reads — `label`, `variant`, `opacity`, `dashArray`, `stack`, `yAxis` — which… (objectui `8fe8e5c16`) +- **minor** — `AlertDialogSchema` now declares the four keys the `alert-dialog` renderer actually reads (objectui#7104): `content` (the dialog body, `SchemaNode | SchemaNode[]` like every sibli… (objectui `8ad218d58`) +- **minor** — **BREAKING** — `SchemaRegistry['kanban']` stops describing a component it cannot name (objectui `bc640ec56`) +- **minor** — One authority per exported type name, batch 3 of objectui#6349: `ComboboxOption`, `NamedActionDef`, `OrgTranslate`. (objectui `6e8863093`) +- **minor** — **Removes two published exports.** Retire the `MobileResponsiveConfig` and `GestureConfig` types (objectui#7519, ADR-0049 enforce-or-remove). Both names are deleted from `@object-… (objectui `51eb51558`) +- **minor** — Retire `FloatingChatbotConfig.triggerIcon` (objectui#7654, ADR-0049 enforce-or-remove). (objectui `a3eb5d07a`) +- **minor** — One shared record-source ladder, five plugins delegate (objectui#7632). (objectui `ce2aaefe1`) +- **patch** — The published `@default` documentation on two `layout.ts` members now matches the value the renderer actually applies. `ContainerSchema.maxWidth` documented `'lg'` while `containe… (objectui `e546222b3`) +- **patch** — Declare `avatar` and `avatarFallback` on `ChatMessage`, on both faces (objectui#7295 — the residue of objectui#4424, whose `RuntimeOnlyMessageKeys` named only the three keys API m… (objectui `858cd72e3`) +- **patch** — `ClassNameStylePropsSchema` describes itself by its two keys (objectui#7578). (objectui `9587fc959`) +- **patch** — Declare `wrapperClass` on `CheckboxSchema`, on both faces (objectui#6938 — the residue of that card; its `context-menu` half landed with objectui#6939 group 1). (objectui `b74a8598d`) +- **patch** — The standalone runner renders `AppAction.items` from its declared type only, which makes `AppActionSchema.onClick`'s retirement message true again (objectui#6854, maintainer rulin… (objectui `adb2a86db`) + +⚠️ 2 of these carry a breaking change: 2 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + +**In this console build, declared nowhere** — objectui merged 7 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ fix(hooks): read the edited path from the key the routed tool carries (#7686) (objectui `565f2b6aa`) +- _(no changeset)_ fix(schema-catalog): drop the undeclared `variant` key from the dropdown-menu Delete item (#7717) (objectui `f96a781c8`) +- _(no changeset)_ fix(hooks): an escaped quote inside a double-quoted word does not close it (#7695) (objectui `6eebc54b6`) +- _(no changeset)_ docs(skills): correct six wrong shipped-API facts in the published objectui guides (#7677) (objectui `ab771d2dd`) +- _(no changeset)_ docs(skills): record ComponentInput's five ADR-0049 tombstones in the plugin guide (objectui#7636) (#7647) (objectui `09163884f`) +- _(no changeset)_ docs(agents): state the changeset gate's full population, not `src/` alone (#7640) (objectui `0b1e39d4a`) +- _(no changeset)_ docs(charts): rewrite the inline-series chart examples into the model the renderer implements (#7679) (objectui `d3f5256ce`) + + + +objectui range: `a472b07167a3...53ded82bf7a4` diff --git a/.objectui-sha b/.objectui-sha index 7b3b74ffde..a9b031ceea 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -a472b07167a39e55491109e864bb5a54027dcfbd +53ded82bf7a494f54e344e19099dbf00854b8694 diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index 2fecd15e0c..bc425df35b 100644 --- a/packages/sdui-parser/objectui-lockstep.json +++ b/packages/sdui-parser/objectui-lockstep.json @@ -6,8 +6,8 @@ ], "objectui": { "repo": "https://github.com/objectstack-ai/objectui.git", - "rev": "a472b07167a39e55491109e864bb5a54027dcfbd", - "revDate": "2026-09-04T17:28:55+00:00", + "rev": "53ded82bf7a494f54e344e19099dbf00854b8694", + "revDate": "2026-09-05T15:42:42+00:00", "source": "packages/sdui-parser/src", "files": [ "packages/sdui-parser/src/codegen.ts", @@ -20,7 +20,7 @@ "packages/sdui-parser/src/validate.ts" ] }, - "recordedAgainstPin": "a472b07167a39e55491109e864bb5a54027dcfbd", + "recordedAgainstPin": "53ded82bf7a494f54e344e19099dbf00854b8694", "grammarRegion": { "file": "packages/sdui-parser/src/parse.ts", "delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */", diff --git a/packages/spec/src/data/api-methods-batch-conformance.test.ts b/packages/spec/src/data/api-methods-batch-conformance.test.ts index 173924f8c3..8fb5116f3b 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,24 +61,25 @@ const SINGLE_RECORD_WRITE_ONLY: Record = { // `revoked` on ONE key. The multi-select surface this rule protects does not // exist for API keys, and the shape a future one would take does not need // `bulk` either — both read off the console build this release pins - // (`.objectui-sha` = `a472b0716`, `packages/plugin-grid`; re-measured at - // that pin, 2026-09-04 — previously measured at `00d3f09c5`, `67dadd602`, - // before that at `d8ec8d6d4`, `9602dc820`, `190fbd01d`, `9a3daf8d3`, - // originally at `6314e87f2`. `ObjectGrid.tsx` DID change across the move off - // `00d3f09c5` (7 insertions, 4 deletions, all at `:1204-1213`, where - // `objectName` moved onto the shared `resolveRecordSourceObjectName`), and - // the re-READ caught the previous record's OWN grid anchor as wrong rather - // than merely shifted: `3790-3805` at `00d3f09c5` is `runBulkActionAggregate` - // and says nothing about selection. The block this record means was - // `3541-3556` there — byte-identical to the one cited at - // `67dadd602:3436-3451` — and is `ObjectGrid.tsx:3544-3559` here, shifted - // only by the three insertions above it. That is the #10274 class again, and - // the reason a citation refresh re-READS instead of moving numbers: - // arithmetic on the wrong anchor would have produced `3793-3808`, a - // fresh-looking span still describing the wrong function. The second claim, + // (`.objectui-sha` = `53ded82bf`, `packages/plugin-grid`; re-measured at + // that pin, 2026-09-08 — previously measured at `a472b0716`, `00d3f09c5`, + // `67dadd602`, before that at `d8ec8d6d4`, `9602dc820`, `190fbd01d`, + // `9a3daf8d3`, originally at `6314e87f2`. `ObjectGrid.tsx` DID change again + // across the move off `a472b0716` (24 insertions, 30 deletions), so the + // selection block this record means was re-READ rather than carried: it is + // `ObjectGrid.tsx:3538-3553` here, was `3544-3559` at `a472b0716`, and the + // sixteen lines are BYTE-IDENTICAL across the hop — `git hash-object` on both + // spans returns `6133933199230670e29d8c7f51c558d86a0af1d2`, so the block only + // shifted six lines UP and none of its substance moved. The earlier hop off + // `00d3f09c5` is the one that caught the previous record's OWN grid anchor as + // wrong rather than merely shifted: `3790-3805` there is + // `runBulkActionAggregate` and says nothing about selection. That is the + // #10274 class, and the reason a citation refresh re-READS instead of moving + // numbers — arithmetic on a wrong anchor produces a fresh-looking span still + // describing the wrong function. The second claim, // `hooks/useBulkExecutor.ts:284-289`, is in a file byte-identical at both // pins and re-READ there rather than carried on that identity — it still - // ends on `label = 'bulk delete'`, the line the `284-288` span cited four + // ends on `label = 'bulk delete'`, the line the `284-288` span cited five // pins ago stopped short of, truncating the second of the two branches it // names (byte-identity is never taken as proof an anchor is right): // diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index eb98b96c41..49a20ae875 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -279,13 +279,14 @@ describe('PageAccordionProps variant (#6776)', () => { // same file's `ComponentRegistry.register('accordion', …)` publishes the key to // the Studio block designer at `:966` (the `items` input, documented as // `[{ label, icon?, collapsed?, children }]`). Measured at the pin this repo -// builds against — `.objectui-sha` = `a472b0716`. Re-derived at that pin -// 2026-09-04: `containers.tsx` is byte-identical to the one at `00d3f09c5`, -// the hop on which both anchors moved by exactly one line (`918-924` to -// `919-925`, `965` to `966`), so NO anchor moved here — the icon block still -// spans `919-925` and the registration input still lands on `:966`. Both were -// re-READ at the new pin rather than inferred from that identity, because -// identity preserves a wrong anchor as faithfully as a right one (#10274). +// builds against — `.objectui-sha` = `53ded82bf`. Re-derived at that pin +// 2026-09-08: `containers.tsx` is byte-identical to the one at `a472b0716` +// (and, through it, to `00d3f09c5` — the last hop on which either anchor +// moved, both by exactly one line, `918-924` to `919-925` and `965` to `966`), +// so NO anchor moved here — the icon block still spans `919-925` and the +// registration input still lands on `:966`. Both were re-READ at the new pin +// rather than inferred from that identity, because identity preserves a wrong +// anchor as faithfully as a right one (#10274). // // #9397 spent a full dispatch cycle re-deriving that read point from scratch // after the sweep proposed retiring the key. This block plus the `.describe()` @@ -368,12 +369,13 @@ describe('PageTabsProps items[].value / items[].count (#5775)', () => { // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the // Studio block designer at `:789` (the `items` input, documented as // `[{ label, value?, icon?, count?, visibleWhen?, children }]`). Measured at -// the pin this repo builds against — `.objectui-sha` = `a472b0716`. Re-derived -// at that pin 2026-09-04: `containers.tsx` is byte-identical to the one at -// `00d3f09c5`, the hop on which both anchors moved by exactly one line -// (`729-735` to `730-736`, `788` to `789`), so NO anchor moved here — the icon -// block still spans `730-736` and the registration input still lands on -// `:789`. Both were re-READ at the new pin, never inferred (#10274). +// the pin this repo builds against — `.objectui-sha` = `53ded82bf`. Re-derived +// at that pin 2026-09-08: `containers.tsx` is byte-identical to the one at +// `a472b0716` (and, through it, to `00d3f09c5` — the last hop on which either +// anchor moved, both by exactly one line, `729-735` to `730-736` and `788` to +// `789`), so NO anchor moved here — the icon block still spans `730-736` and +// the registration input still lands on `:789`. Both were re-READ at the new +// pin, never inferred (#10274). // // #9397 spent a full dispatch cycle re-deriving the accordion's read point // after the sweep proposed retiring it. This block plus the `.describe()` it @@ -2776,7 +2778,9 @@ describe('#7751 — object-* block props schemas', () => { // #16503 — the spec half of objectui#8172 (decision batch #68, 2026-09-07, // option A: the contract declares the capability that already ships, is // documented and is in use). Measured at the objectui pin this repo builds -// against (`.objectui-sha` = `a472b0716`): `plugin-kanban/src/ObjectKanban.tsx:264` +// against (`.objectui-sha` = `53ded82bf`; all four anchors re-READ at that pin +// 2026-09-08 — every `plugin-kanban` file below is byte-identical to the one at +// `a472b0716`, and none moved): `plugin-kanban/src/ObjectKanban.tsx:264` // queries `$top: schema.limit ?? DEFAULT_KANBAN_LIMIT` (100, `:71`), // `plugin-kanban/src/index.tsx:395-398` maps `limit: 'limit'` in // `OBJECT_KANBAN_DATA_SOURCE`, `plugin-kanban/src/types.ts:134` declares @@ -2843,10 +2847,11 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // #9881 and #9972 recorded the accordion and tab items; these two close the set. // // The button record re-measured at the pin this repo builds against — -// `.objectui-sha` = `a472b0716`, re-derived there 2026-09-04. Both files in +// `.objectui-sha` = `53ded82bf`, re-derived there 2026-09-08. Both files in // this chain, `resolve-icon.ts` and `button.tsx`, are byte-identical to the -// ones at `00d3f09c5`, so no anchor moved; every one below was still re-READ -// at the new pin rather than inferred from that identity (#10274). The hop +// ones at `a472b0716` and, through it, to `00d3f09c5`, so no anchor moved; +// every one below was still re-READ at the new pin rather than inferred from +// that identity (#10274). The hop // onto `00d3f09c5` was the one that changed this record's SUBSTANCE and not // merely its line numbers: `resolve-icon.ts` was restructured (110 // insertions), so `resolveIcon` no longer PascalCases and maps inline — it diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 3d939c5e3d..cf728dec07 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -674,10 +674,11 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — - * `containers.tsx` is byte-identical to the one at `00d3f09c5`, the hop on - * which both anchors moved by exactly one line (the icon block from - * `729-735`, the registration input from `788`), so NO anchor moved here; + * (`.objectui-sha` = `53ded82bf`; re-derived at that pin 2026-09-08 — + * `containers.tsx` is byte-identical to the one at `a472b0716` and, through + * it, to `00d3f09c5`, the last hop on which either anchor moved by exactly + * one line (the icon block from `729-735`, the registration input from + * `788`), so NO anchor moved here; * both were re-READ at the new pin with the cited text unchanged rather * than inferred from that identity): `containers.tsx:730-736` * renders @@ -1733,10 +1734,11 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — - * `containers.tsx` is byte-identical to the one at `00d3f09c5`, the hop on - * which both anchors moved by exactly one line (the icon block from - * `918-924`, the registration input from `965`), so NO anchor moved here; + * (`.objectui-sha` = `53ded82bf`; re-derived at that pin 2026-09-08 — + * `containers.tsx` is byte-identical to the one at `a472b0716` and, through + * it, to `00d3f09c5`, the last hop on which either anchor moved by exactly + * one line (the icon block from `918-924`, the registration input from + * `965`), so NO anchor moved here; * both were re-READ at the new pin with the cited text unchanged rather * than inferred from that identity): `containers.tsx:919-925` * renders @@ -1940,9 +1942,10 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — both + * (`.objectui-sha` = `53ded82bf`; re-derived at that pin 2026-09-08 — both * files, `resolve-icon.ts` and `button.tsx`, are byte-identical to the ones - * at `00d3f09c5`, so no anchor MOVED; the re-READ still corrected two that + * at `a472b0716` and, through them, to `00d3f09c5`, so no anchor MOVED; an + * earlier re-READ corrected two that * had been wrong since they were written — the registration's input list and * its `defaultProps`, see the last paragraph of this block. The hop onto * `00d3f09c5` was the one that moved this record's SUBSTANCE rather than @@ -2581,10 +2584,11 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — all + * (`.objectui-sha` = `53ded82bf`; re-derived at that pin 2026-09-08 — all * five files in the chain below, `index.tsx`, `ObjectMetricWidget.tsx`, * `MetricWidget.tsx`, `MetricCard.tsx` and `lazy-icon.tsx`, are - * byte-identical to the ones at `00d3f09c5` and at `67dadd602` before it, so + * byte-identical to the ones at `a472b0716`, at `00d3f09c5` and at + * `67dadd602` before it, so * NO anchor moved — the `object-metric` registration still begins at `:194` * and the icon input still lands on `:204`. Every anchor below was re-READ * at the new pin rather than inferred from that identity), and the chain @@ -2645,7 +2649,8 @@ export type ObjectMetricProps = z.input; * (`KanbanRenderer`, index.tsx). `groupField` is the DESIGNER's spelling with * zero read points (#7973 class) — aliased to the `groupBy` the board reads. * `limit` (#16503) was measured later, at the pin this repo builds against - * (`.objectui-sha` = `a472b0716`): `ObjectKanban.tsx:264`, the `$top` of the + * (`.objectui-sha` = `53ded82bf`; re-READ there 2026-09-08, file + * byte-identical to `a472b0716`, anchor unmoved): `ObjectKanban.tsx:264`, the `$top` of the * board's one query — its docblock below carries the four-face record. */ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ @@ -2669,7 +2674,9 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * Row cap (#16503 — the spec half of objectui#8172; decision batch #68, * 2026-09-07, option A: the contract declares the capability that already * ships, is documented and is in use). Measured at the objectui pin this - * repo builds against (`.objectui-sha` = `a472b0716`), four faces agreed + * repo builds against (`.objectui-sha` = `53ded82bf`; all four anchors + * re-READ at that pin 2026-09-08, every `plugin-kanban` file byte-identical + * to the one at `a472b0716` and none moved), four faces agreed * while this map refused the key by name: the board's one query is * `dataSource.find(objectName, { $filter: schema.filter, $top: schema.limit * ?? DEFAULT_KANBAN_LIMIT })` (`plugin-kanban/src/ObjectKanban.tsx:262-266`, diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index 57e5e857ab..16060caf58 100644 --- a/packages/spec/src/ui/dataset.zod.ts +++ b/packages/spec/src/ui/dataset.zod.ts @@ -204,13 +204,21 @@ export const DatasetMeasureSchema = lazySchema(() => strictObject({ * altogether. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `a472b0716`; re-derived at that pin 2026-09-07) in objectui + * `53ded82bf`; re-derived at that pin 2026-09-08 — BOTH files in this chain + * changed over the hop off `a472b0716` (`dataset-format.ts` +23 lines, + * `date-display.ts` +108 under objectui#7443, "one home for the datetime + * display convention"), so every anchor below was re-READ there and three of + * the four MOVED; the substance is unchanged — the date-only arm still + * threads `format` as a STYLE and the datetime arm still takes none) in + * objectui * `packages/core/src/utils/dataset-format.ts`: `formatMeasure` routes a - * non-numeric value through `formatMeasureDate` (`:184-197`), whose - * date-only arm threads `format` into the STYLE parameter of `formatDate` - * (`utils/date-display.ts:104-137`, whose `relative` branch falls back to - * the absolute form beyond ±7 days at `:90`), while its datetime arm calls - * `formatDateTime(v, { locale })` with no style at all (`:194`). Teaching + * non-numeric value through `formatMeasureDate` (`:185-198`, was `:184-197`), + * whose date-only arm threads `format` into the STYLE parameter of + * `formatDate` (`utils/date-display.ts:131-164`, was `:104-137`, whose + * `relative` branch falls back to the absolute form beyond ±7 days at + * `:117`, was `:90`), while its datetime arm calls + * `formatDateTime(v, { locale })` with no style at all (`:195`, was `:194`). + * Teaching * the shared path a pattern grammar would change every list cell that reads * it, so the gap is DOCUMENTED here rather than closed (objectui#7178 ruled * A; the datetime half is objectui#7443). diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index e9c161010d..8389fcb570 100644 --- a/scripts/sdui-manifest.record.json +++ b/scripts/sdui-manifest.record.json @@ -9,10 +9,10 @@ "a pin bump without regeneration goes RED there — that is the anti-rot half of the freshness gate.", "Regenerate + re-record: node scripts/gen-sdui-manifest-node.mjs (see its header for the offline mode)." ], - "objectuiSha": "a472b07167a39e55491109e864bb5a54027dcfbd", + "objectuiSha": "53ded82bf7a494f54e344e19099dbf00854b8694", "objectuiPackagesVersion": "17.6.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-09-04", + "generatedAt": "2026-09-08", "sha256": "49211fee7792cf51174930dc2c1be2169d5175f77a83491f68f90b3f0c19e69d", "components": 57 }