@object-ui/plugin-chatbot 17.6.0 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +2814 -0
  2. package/README.md +84 -28
  3. package/dist/AiPendingActionsInbox.d.ts +8 -2
  4. package/dist/AiPendingActionsInbox.d.ts.map +1 -1
  5. package/dist/ChatbotEnhanced.d.ts +235 -101
  6. package/dist/ChatbotEnhanced.d.ts.map +1 -1
  7. package/dist/FloatingChatbot.d.ts +1 -1
  8. package/dist/FloatingChatbot.d.ts.map +1 -1
  9. package/dist/chatMessageAdapter.d.ts +18 -6
  10. package/dist/chatMessageAdapter.d.ts.map +1 -1
  11. package/dist/elements/conversation.d.ts +1 -1
  12. package/dist/elements/conversation.d.ts.map +1 -1
  13. package/dist/elements/index.d.ts +10 -10
  14. package/dist/elements/message.d.ts +1 -1
  15. package/dist/elements/message.d.ts.map +1 -1
  16. package/dist/elements/prompt-input.d.ts +10 -2
  17. package/dist/elements/prompt-input.d.ts.map +1 -1
  18. package/dist/elements/tool.d.ts +13 -1
  19. package/dist/elements/tool.d.ts.map +1 -1
  20. package/dist/index.d.ts +48 -59
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +3217 -1945
  23. package/dist/index.umd.cjs +3 -3
  24. package/dist/mapMessages.d.ts +309 -6
  25. package/dist/mapMessages.d.ts.map +1 -1
  26. package/dist/recordLink.d.ts +34 -0
  27. package/dist/recordLink.d.ts.map +1 -0
  28. package/dist/tool-display.d.ts +97 -26
  29. package/dist/tool-display.d.ts.map +1 -1
  30. package/dist/useAgents.d.ts +5 -0
  31. package/dist/useAgents.d.ts.map +1 -1
  32. package/dist/useAiApprovalsTranslation.d.ts +76 -0
  33. package/dist/useAiApprovalsTranslation.d.ts.map +1 -0
  34. package/dist/useAiModels.d.ts +3 -1
  35. package/dist/useAiModels.d.ts.map +1 -1
  36. package/dist/useHitlInChat.d.ts +2 -2
  37. package/dist/useHitlInChat.d.ts.map +1 -1
  38. package/dist/useObjectChat.d.ts +94 -27
  39. package/dist/useObjectChat.d.ts.map +1 -1
  40. package/dist/usePendingActions.d.ts +5 -0
  41. package/dist/usePendingActions.d.ts.map +1 -1
  42. package/package.json +11 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,2819 @@
1
1
  # @object-ui/plugin-chatbot
2
2
 
3
+ ## 18.0.0
4
+
5
+ ### Dependency floors
6
+
7
+ Computed from `.objectstack-sha` `06cab4849a8a`: the earliest published `@objectstack/spec` that contains it is `18.0.0`.
8
+
9
+ - `@objectstack/spec` (`dependencies`): `^18.0.0-next.1` → `^18.0.0`
10
+
11
+ ### Major Changes
12
+
13
+ - 6f3299f: objectui moves to major 18, following `@objectstack/*` from 17 to 18 (objectui#12334). objectui's major is not a count of its own breaking changes: it tracks the major of the `@objectstack/spec` its packages depend on, so that the same major means compatible across the two projects. These packages already declare `@objectstack/*` on the 18 line (objectui#12030), so every package in the fixed release group crosses to 18 together. It is the one `major` that rule admits: objectui's own breaking changes ship as `minor`, described in their entries.
14
+
15
+ The 18 line is released from Changesets pre mode on the `next` tag (`.changeset/pre.json`), as `@objectstack/*` 18 is: these releases are `18.0.0-next.N` on the npm `next` dist-tag, and they do not move `latest`. The first `18.0.0` on `latest` comes when `@objectstack` 18 is generally available and this repository leaves pre mode.
16
+
17
+ What a consumer must do to take it is in the `@objectstack/*` 18 entry of this release (objectui#12030): move its own `@objectstack/*` packages to the 18 line at the same time.
18
+
19
+ ### Minor Changes
20
+
21
+ - fc3c2cc: Five fixes on the AI build surface, from the 2026-10-05 cloud acceptance run (objectui#11658).
22
+
23
+ - **The first AI build lands on the running app.** The built-moment transition still moves the conversation into the Studio workbench at `/studio/PKG/interfaces`. The Interfaces canvas now opens in **Run** mode with the properties panel collapsed, where it used to open in Design with the panel open. One click on **Design** brings back the design overlays and the properties panel. Every other way into Studio, the "Design in Studio" button included, still opens in Design. The transition asks for this with router state, which the pillar reads once at mount; it is not a URL param, so a reload or a shared link opens the designer.
24
+ - **The in-app composer names the task.** Inside an app, the composer placeholder reads "Ask about your data, or ask me to change this app…". This covers the console dock in a running app, the Studio dock and `/ai/build?package=`. It used to read "Ask {agent}…", which showed as「向 构建 提问…」in Chinese. The cold-start build surface and the ask agent keep the placeholders they had. New key: `console.ai.askOrChangeApp`.
25
+ - **The AI usage popover shows one figure.** The popover shows the share of the single AI pool used so far (`console.ai.usage.poolUsed`, for example "19% used"). It no longer shows the build / data-Q&A split, because that split cannot honestly say which part a single-composer turn used. The keys `console.ai.usage.meterBuild`, `meterAsk` and `breakdownTitle` are retired from all ten packs. `useAiUsage` still reads `breakdown` from the wire and validates it strictly, but nothing renders it.
26
+ - **The usage gauge no longer looks like a loading spinner.** The header glyph is now a closed outline in the tone colour with a pie wedge inside it. It used to be a stroked arc over a faint track, which at low usage had the outline of a spinner.
27
+ - **The plan card's scope chip is localized.** The extend-mode chip on the proposed-plan card and on the live design panel reads the pack's `chatbot.plan.extendTarget` sentence, where it used to show the English literal "Adding to existing app". It names the target app by its label, and the internal name moves to the chip's tooltip. `ChatbotEnhanced` gains an optional `resolveAppLabel(appName)` prop, and the console passes one over its metadata apps. A host `planExtendLabel` still takes precedence, but the prop no longer defaults to an English string.
28
+ - 848ba0e: The chat launchers show a marker while a proposed plan awaits the user's approval (objectui#11666, item 6 of objectui#2458). A user who closed the chat with a blueprint still waiting on them used to get no sign of it from the launcher they return to.
29
+
30
+ What a user sees: while the newest proposed plan of a conversation still offers "Build it", the console's assistant button (the floating launcher on app pages and Home) and the ChatDock edge launcher Studio uses carry a small amber dot. Assistive tech reads it as the button's description, from the new `console.ai.dock.planAwaitingApproval` key in the active language. With no plan awaiting, neither launcher shows anything. The dot goes away when the plan stops awaiting: the user approves it, its build runs, or a newer proposal takes its place and is itself approved or built. Opening the chat clears nothing by itself, and neither does opening another conversation. Deleting the conversation from the `/ai` sidebar drops it.
31
+
32
+ Where the reading comes from: the chat's own plan card. `ChatbotEnhanced` derives "awaiting approval" from the same producer its card header and body read (`resolveProposalCardState` reads `pending`), and reports it to its host. The console's chat pane publishes that reading on the assistant bus, per conversation and per signed-in user, and the launchers read the bus. They import no chat code. The reading is exact for everything that happens in the tab. It does not see a decision made in another tab or on another device, and a page reload starts it empty until a chat on that conversation is opened again. The durable copy is the server conversation, which the launchers do not read.
33
+
34
+ **Clause-②: yes (widening).** Two published surfaces widen:
35
+
36
+ - `@object-ui/plugin-chatbot`: the exported `ChatbotEnhancedProps` type gains one optional member, `onPlanApprovalPendingChange`, a callback that takes one boolean and returns nothing. `ChatbotEnhanced` calls it once on mount and again whenever the boolean changes. Without it nothing changes.
37
+ - `@object-ui/i18n`: every built-in locale pack gains one key, `console.ai.dock.planAwaitingApproval`. The `en` pack is exported from the package entry, so the key also joins the translation-key type derived from it.
38
+
39
+ `@object-ui/app-shell` adds no export: the bus functions the pane and the launchers use (`publishPlanApprovalPending`, `usePlanApprovalPending`) ship inside `dist/` but are not on the package entry, and the exported `assistantBus` object and `AssistantSnapshot` type are unchanged. No prop, export or key is removed, and no existing member changes type.
40
+ - 6d5eb34: The chat build panel reads cloud's post-apply verification loop, and an unknown build phase no longer reads as "Building" (objectui#11988, the receiver objectstack-ai/cloud#2172's ruling A orders).
41
+
42
+ After `apply_blueprint` finishes, cloud's agent loop reports its verification hops on a second `data-build-progress` part with the id `build-verify`, beside the build tree. A hop is `{ phase: 'verify', hop, tool }` and the exit is `{ phase: 'done' }`. The receiver used to take the last `data-build-progress` part whatever its id, and turned every phase other than `data` and `done` into `structure`. So the first verification hop replaced the finished tree with "Building your app…".
43
+
44
+ - **The tree and the verification part are read apart, by part id.** The `build-verify` part never displaces the tree, whichever order the two parts arrive in. A message that carries only the tree maps and renders exactly as before.
45
+ - **The build panel shows a verification line under the tree.** It reads "Checking the change… step N" while a hop runs, with the hop's tool name as its tooltip, and "Checked the change" once the `done` frame arrives. A `build-verify` part on a message that has no build tree is not drawn as a tree.
46
+ - **Phases are read against the spec's vocabulary.** The receiver's phase table and frame type are typed by `@objectstack/spec/ai`'s own `BuildProgressPhase` and `BUILD_PROGRESS_FRAME_TYPE`, so a phase the spec adds or drops fails the type check here instead of drifting. The spec's runtime module is not imported, because it would put its whole AI schema module on the console's first load. A phase outside the vocabulary, or a frame without one, is now `unknown` and shows as a warning line ("Unknown build phase") on the tree header or on the verification line. It is no longer coerced to `structure`.
47
+ - **Type change.** `ChatBuildProgress.phase`, reached through `ChatMessage['buildProgress']`, widens from `'structure' | 'data' | 'done'` to `'structure' | 'data' | 'verify' | 'done' | 'unknown'`: the spec's phase vocabulary plus `'unknown'`, held equal to the spec's union by a compile-time test. `ChatBuildProgress` also gains an optional `verify` member, `{ phase, hop?, tool? }`. The published typings name no new `@objectstack/spec` symbol, so the package's spec range is unchanged.
48
+ - **New language-pack keys, in all ten packs:** `chatbot.build.verifying`, `chatbot.build.verifyStep`, `chatbot.build.verified` and `chatbot.build.unknownPhase`.
49
+ - c5406c2: Depend on the `@objectstack/*` 18 prerelease line (objectui#12030).
50
+
51
+ Every `@objectstack/*` range these packages declare in `dependencies` or `peerDependencies` moves from `^17.x` to `^18.0.0-next.0`, the `next` prerelease of `@objectstack/*` 18 (raised to `^18.0.0-next.1` by objectui#12370 before release).
52
+
53
+ **Breaking for consumers:** an install that resolves `@objectstack/spec` (or `@objectstack/client`, `@objectstack/formula`, `@objectstack/lint`) 17.x no longer satisfies these ranges. A consumer must move its own `@objectstack/*` packages to the 18 line, starting with `18.0.0-next.1` (objectui#12370), at the same time as it takes this release.
54
+
55
+ **objectui's own surface moves with it:**
56
+
57
+ - `element:record_picker`'s registration stops publishing the `object`, `filter`, `sort` and `limit` inputs, which spec 18 retires; a JSX page that writes one now gets `unknown-prop`.
58
+ - The `CapabilityMultiSelectField` widget's curated capability set (`@object-ui/fields`) follows spec 18: `manage_mailboxes` in, `manage_org_presentation` out.
59
+ - `element:number` and `element:repeater` nodes that bind no object are accepted, as spec 18's row and `PageComponentSchema` accept them; the two `ELEMENT_*_OBJECT_REQUIRED` refusals are gone.
60
+
61
+ **Retired with the spec:** `@objectstack/spec` 18 tombstones `object-grid`'s `defaultFilters` and refuses it by name, and `ObjectGrid` and `ObjectView` stop reading it (`table.defaultFilters` on an `object-view` included). A view that still carries it renders unfiltered: rename the key to `filter`, whose value is the same rule array.
62
+ - e723f58: Screen readers hear the names of more controls in the viewer's language (objectui#12145).
63
+
64
+ These controls carried an English `aria-label`, so under a non-English locale a screen reader announced their names in English: the docs portal's loading spinner, the record form page's breadcrumb, the `Spinner` status region, a data table's row menu button, the `pagination` renderer's previous and next links, the image crop preview, the percent slider, the record picker's grid, the AI composer's send and stop button and an attachment's remove button, the designer's undo and redo buttons, minimap, version history and back button, a dismissible record alert's close button, the bulk-action bar, and the mobile view switcher. Each name now comes from the language packs. English names are unchanged, with two small exceptions: the spinner now reads "Loading…", and the pagination links read "Previous page" and "Next page", the same words the data table pager uses. Sighted use is unchanged.
65
+
66
+ Added: eight language-pack keys in all ten packs: `help.loadingDocumentation`, `common.breadcrumb`, `table.rowActions`, `fields.image.cropPreview`, `fields.percent.slider`, `designer.canvasMinimap`, `designer.versionHistory` and `grid.bulkActions`. Every other name reuses a key that already holds the same words. The exported `en` pack, and so `TranslationKeys`, gains these eight members. `PromptInputAttachment` (exported through `AIElements`) takes an optional `removeLabel` prop that names its remove button; without it the button keeps its English name.
67
+ - ff9df88: Depend on `@objectstack/*` `18.0.0-next.1` (objectui#12370).
68
+
69
+ Every `@objectstack/*` range these packages declare moves from `^18.0.0-next.0` to `^18.0.0-next.1`; the console and the runner bundle `18.0.0-next.1`. A consumer moves its own `@objectstack/*` packages to `18.0.0-next.1` with this release.
70
+
71
+ **Accept sets that narrow with it.** `@object-ui/types` validates page action rows and view data bindings through the spec's own rows, so its faces (`safeValidateSchema` and `StrictAnyComponentSchema`) now refuse what `18.0.0-next.1` refuses. Each was accepted on `18.0.0-next.0`:
72
+
73
+ - `onSuccess` on an `action:button` / `action:icon` row, or an `action:group` / `action:menu` member, whose executor is the `url`, `navigation`, `modal`, `flow` or `form` built-in, or that has no executor at all. Write the hop on an `api` or `script` action (or a host handler name), or drop it.
74
+ - `onSuccess` beside `operation: 'update'`, and an `onSuccess` block carrying a key outside `{ navigate, openIn }`.
75
+ - `actionType: 'navigation'` on a row (and `type: 'navigation'` on a container member): write `'url'`.
76
+ - A `url` executor's `target` that is not openable, judged on the executor the runner runs, including a row whose `name` selects it.
77
+ - A view `data` binding with `provider: 'api'`: bind the object or static rows; an API call is the page element's binding.
78
+ - ac59073: **The AI build conversation stays on the conversation and reads more compactly** (objectui#12724).
79
+
80
+ - **No automatic navigation after a build.** When a build finishes, the page no longer moves you into Studio. The finished build card offers two buttons: 打开应用 / Open app (primary), which opens the app on its first navigation item, and 在 Studio 中查看 / View in Studio. Both are in-app navigations. The conversation is still bound to the built app, so Studio's copilot resumes the same thread.
81
+ - **One collapsed line per phase.** A turn's tool activity reads as one line, for example "设计方案 · 4 步 · 0:48 · 读取编写规范 · 列出对象 ×3 …". Repeated calls of a tool fold into one step with a count, and a chevron expands the per-tool rows. The rows open on their own while a step is running. The elapsed time shows only for a turn this page watched; a reopened conversation shows no time.
82
+ - **The finished build card.** Its header reads 「已搭建并上线 · APP」 / "Built and live · APP" once the build is published, and "Built APP" otherwise. Below the buttons, a line lists the build's next steps as things you can say, followed by the sentence 「之后的修改先存草稿,由你在 Studio 发布」. The progress bar is gone once the build is done. A whole-app build no longer repeats its next steps as a list on the draft card.
83
+ - **The plan card.** The header names the app the plan builds and shows 等待确认 / Awaiting confirmation until you decide. Each object gets a row with one chip per field from the plan's `blueprint.objects[].fields`. The plan's views get their own rows, and the reply hint sits beside 开始搭建 / 调整方案. A plan without field rows (for example one restored from the local cache) shows the object chips with field counts, as before.
84
+ - **The composer.** Outside an app, the build agent's placeholder reads 「描述你想搭建的应用,或要改的地方…」 / "Describe the app you want to build, or what to change…" and no longer names the agent. Inside an app it still reads "Ask about your data, or ask me to change this app…". The key hint reads 「↵ 发送 · Shift+↵ 换行」.
85
+
86
+ `@object-ui/plugin-chatbot`: `ProposedPlan` gains optional `appLabel`, `views` and `objects[].fields`, and `ChatbotLabels` gains an optional `newlineHint`. `@object-ui/i18n`: new `console.ai.describeAppToBuild`, `console.ai.newlineHint`, `console.ai.viewBuiltAppInStudio`, `chatbot.phase.*`, `chatbot.plan.awaitingConfirm` / `objectsAndFields` / `views` and `chatbot.build.builtAndLive` / `nextStepsLead` / `nextStepQuote` / `draftPosture` in every pack. `console.ai.designBuiltApp` is retired.
87
+ - 44cb469: **The AI build cards draw the plan and result details the build agent now sends** (objectui#12724).
88
+
89
+ - **The plan card.** Each object's fields are chips. A field whose sample data is held to a format shows it in mono type (「ISBN 13 位数字」, 「邮箱 邮箱格式」). A field the agent added on its own (you did not name it) has a dashed chip marked 「补充」 / "suggested". An object that declares its name field gets a 「名称:书名」 / "Name: Title" line. Each view shows one line saying what it does, for example 「列表 · 筛选 状态 = 逾期 且 归还日期 为空 · 按应还日期升序」. The assumptions are a bulleted list, and the count line ends with the sample data the build will stage (「示例数据 12 条/对象」).
90
+ - **The result card.** A finished build shows a 「核对通过 7/7」 / "Checks passed 7/7" chip and the lines the agent verified on the built app, objects in one column and views and sample data in the other. Those lines replace the list of staged artifacts. When the agent re-checks the build later in the same turn, the card shows that newer check. 打开应用 opens the app the build landed in, and 在 Studio 中查看 opens its package.
91
+ - **Step names.** The steps in the progress line read as short sentences in your language, for example 「记下后续检查项」 for the agent's to-do step and "List the existing objects" in English. Before, the English names were the tool names with their underscores removed.
92
+
93
+ Each of these reads a field of the build agent's plan or result. When an older agent does not send that field, the card looks as it did before.
94
+
95
+ `@object-ui/plugin-chatbot`: `ProposedPlan` gains optional `planCard` and `viewIntents`. `@object-ui/i18n`: new `chatbot.plan.suggestedField`, `chatbot.plan.nameField` and `chatbot.build.checksPassed` in every pack, and every pack's `chatbot.tool.*` values are reworded.
96
+ - 3da39ae: **The copilot's change card says when a change will be saved as a draft, and the applied card offers review and undo** (objectui#12894).
97
+
98
+ - **The change card.** When the copilot proposes a change, the card is headed 「修改方案 · 2 项」 / "Change plan · 2 changes" and lists one row per change: a + / ✎ / - symbol, the kind (字段 / 视图 …), the object and field it touches, and its type and parameters in small type (「number · 续借次数 · 默认 0 · 不必填」). For an app that is already live and holds records, the change is saved as a Studio draft: the card says so in an amber note, and its main button reads 「存为草稿」 / "Save as draft".
99
+ - **The applied card.** After you confirm, the card shows what happened, for example 「已存为草稿 · 2 项未发布」 with 「已有 12 条记录的续借次数为空」 and 「核对:结构 ✓」. It offers 「查看变更并发布」 / "Review changes and publish" and 「撤销」 / "Undo" when the host provides them. Undo discards every unpublished draft of the app package, so when other drafts are pending the button says how many, and the card asks before it runs.
100
+
101
+ Each of these reads a field the copilot's tools now send. When an older version does not send it, the card looks as it did before.
102
+
103
+ `@object-ui/plugin-chatbot`: `ProposedChanges` gains optional `posture` and `primaryAction`; `ReplayOutcome` gains optional `draftState`, `existingRows` and `appliedCard`; `ChatbotEnhancedToolInvocation` now references both types instead of repeating them; `ChatbotEnhancedProps` gains optional `onReviewDrafts` and `onDiscardDrafts`. `@object-ui/i18n`: new `chatbot.changes.*` keys in every pack.
104
+ - 76f91f8: feat(plugin-chatbot): a drafted result's Preview button appears for any draft kind, and the draft preview bar names what is pending on the surface it shows (objectui#12968)
105
+
106
+ Clause-②: yes — `ChatbotEnhancedProps` gains the optional `onPreviewDraft`.
107
+
108
+ **`@object-ui/plugin-chatbot`.** A drafted tool result whose items include no app now draws a
109
+ Preview button beside Publish and Review when the host passes `onPreviewDraft(items, { appSegment })`.
110
+ The click hands the host the drafted `{ type, name }` items and the owning package id, the app's route
111
+ segment. A draft set that includes an app keeps `onPreviewDraftApp`, unchanged, and a host that passes
112
+ no `onPreviewDraft` draws what it drew before. Preview publishes nothing. The confirm path previews
113
+ too: `detectReplayOutcome` lifts a drafted replay's `drafted[]` items into the exported `ReplayOutcome`
114
+ as the optional `items`, and the applied card (or, from an older cloud, the drafted badge) draws the
115
+ same Preview over them through the same `onPreviewDraft` / `onPreviewDraftApp` rule.
116
+
117
+ **`@object-ui/app-shell`.** In draft preview (`?preview=draft`), the DraftPreviewBar's message names
118
+ how many pending drafts belong to the surface it shows: an object's list, view or record, a page, a
119
+ dashboard or a report. The count is read from the same pending-drafts list as before. The preview's
120
+ deep-link table (`preview/draftSurface.ts`, `draftPreviewPath`) maps drafted items to the route that
121
+ shows them: a page to that page, a view to the object's list on that view, a field or object to the
122
+ object's default list, anything else to the app. The console wires it: `ChatPane` passes
123
+ `onPreviewDraft`, and a field, view or page draft's Preview opens the Live Canvas at that path, in
124
+ draft preview; `LiveCanvas` takes the full preview path beside the app segment (`path`). An app
125
+ draft's Preview opens the app as before.
126
+
127
+ **`@object-ui/i18n`.** `preview.draftBar.pendingHere`, a plural family, in all ten packs.
128
+ - 51269f0: The AI build chat's pending-drafts bar no longer covers the composer's input (objectui#12978).
129
+
130
+ On the full-page chat (`/ai/build`), with a pending draft, the bar that offers 发布 floated over the composer (`absolute bottom-20`): it sat on the input's first line, so the placeholder and the first line typed were hidden. It is now a row of the composer's own area, laid out in flow directly above the input, so the conversation gives up the room instead, at every width. The console dock mounts the same chat pane and gets the same row. The package's own Studio still draws no bar (objectui#12965).
131
+
132
+ **`ChatbotEnhanced` gains `promptHeaderSlot`** (optional `ReactNode`): a host's row rendered in flow at the top of the prompt area, above the input and outside its form. Unlike `promptOverlaySlot`, which stays absolute-positioned for palettes, it takes layout space. Content that renders nothing takes no space. Hosts that do not pass it render exactly as before.
133
+
134
+ **Clause-②: yes (widening)**: one optional prop, `promptHeaderSlot`, added to `ChatbotEnhancedProps` in `@object-ui/plugin-chatbot`. No export is added or removed, and no existing prop changes.
135
+ - b4e0787: The runtime chat contracts have their own names, apart from `@object-ui/types`' authoring `ChatMessage` / `ChatToolInvocation` (objectui#6349, batch 5). The shape `<ChatbotEnhanced>` renders is declared as `ChatbotEnhancedMessage`, and its tool invocations as `ChatbotEnhancedToolInvocation` — the names this package already published them under. `ChatbotEnhancedMessage` is no longer deprecated.
136
+
137
+ **Type changes, breaking for some consumers.**
138
+
139
+ - `ChatMessage` is no longer exported from `@object-ui/plugin-chatbot`. It denoted the same type as `ChatbotEnhancedMessage`, while `@object-ui/types` publishes a different `ChatMessage` (the JSON/SDUI authoring contract), so one name stood for two contracts across the two packages. Replace `import { type ChatMessage } from '@object-ui/plugin-chatbot'` with `ChatbotEnhancedMessage`; the shape is unchanged. The compiler names the replacement (TS2460: declared locally, exported as `ChatbotEnhancedMessage`). For authored messages, import `ChatMessage` from `@object-ui/types` and convert them with `toRuntimeMessages`.
140
+ - `ChatbotEnhancedToolInvocation` keeps its name and shape; only its declaration was renamed from `ChatToolInvocation`, a name this package's entry never exported.
141
+
142
+ The README and the plugin-chatbot docs page now teach `ChatbotEnhancedMessage`. No runtime behaviour changes.
143
+
144
+ ### Patch Changes
145
+
146
+ - d39ac2e: The AI Approvals inbox shows the error, not an empty queue, when its read fails, and its poll stops on an answer that will not change (objectui#11736).
147
+
148
+ On a deployment with no AI service, the open edition answers `501` on `/api/v1/ai/pending-actions`. `AiPendingActionsInbox` rendered the error alert and, beneath it, "No actions waiting". That reads as a live approval queue that happens to be empty, on a deployment that has none. `usePendingActions` also re-armed its five-second interval whatever the read answered, so the page asked the dead endpoint every five seconds for as long as it stayed open.
149
+
150
+ - The inbox shows the empty state only when the read answered. When the read failed, the error alert stands alone.
151
+ - `usePendingActions` now arms each poll after the previous read settles, according to its answer:
152
+ - A refused read stops the poll. That is `501`, or any `4xx` except `408` and `429`, such as `401`, `403` or `404`. A manual `refresh()` that succeeds, the re-fetch after `approve` or `reject`, or a change to the hook's options starts it again.
153
+ - A transient failure backs the poll off. That is no answer at all, `408`, `429`, or a `5xx` other than `501`. The delay doubles with each consecutive failure, up to 120 seconds, or up to `pollInterval` if that is longer.
154
+ - A read that succeeds polls again after `pollInterval`, as before, and resets the backoff.
155
+
156
+ The policy is in the hook, so every caller of `usePendingActions` gets it, not only the inbox. With a working endpoint nothing changes: an empty queue still shows "No actions waiting", and the poll keeps its interval.
157
+
158
+ **Clause-②: no.** No export, prop, option, return member or language-pack key is added or removed, and no accepted input widens.
159
+ - 8f8f760: Three more controls pick with the shared `Select`, the control the rest of the console picks with (objectui#11865, the list view and the chatbot): `ListView`'s "Color by field" and its "Rows per page" selector (the fallback for views without a grid pager), and `ChatbotEnhanced`'s model picker.
160
+
161
+ The three were browser-native selects, so they looked and behaved differently from the console's other dropdowns. They now use the shared Radix `Select`: the same trigger, dropdown and keyboard behaviour. "Color by field" now matches its twin in the compact toolbar's View settings popover, which made the same change earlier.
162
+
163
+ What they write is unchanged. Each option gives the same value as before: "None" still clears the row-colour config, a field keeps the config's colours, each page size still reaches `onPageSizeChange` and refetches at that size, and each model still reaches `onModelChange` as its id. Re-picking the current option writes nothing. The model picker keeps its accessible name, the `model` label. A row-colour rule on a field the caller may not read still shows as "None" and is never offered.
164
+
165
+ One display change: a value none of a picker's options carries now shows as itself. The native select showed its first option instead: "None" for a row-colour field outside the list's columns, the first size for a page size in force that is not one of the options (an undeclared size, for instance), and the first model for a selected model the environment no longer offers.
166
+
167
+ **Clause-②: no.** No published face moves: the package entries export the same names, the two components take the same props, and no i18n key is added. What moves is the three controls' own markup, described above.
168
+ - d17952c: Studio no longer logs a red "Failed to load resource" line for things it already knows are absent (objectui#12508).
169
+
170
+ - **A draft-only object is not asked for its published layers.** The Data pillar used to read `GET /meta/object/NAME/layers` for every selected object, so the console showed a 404 right after "New object" saved a draft. For an object that has a pending draft and is not in the package's published list, the pillar now reads the draft and skips the layers. A published object is read as before.
171
+ - **A list view of a draft-only object is not asked for its published layers.** Opening such an object in the Interfaces pillar used to read `GET /meta/view/NAME.default/layers` and get a 404. Nothing of a draft-only object is published, so its views have no layer either, and the list-view panel no longer asks. A failed layer read (a 5xx or a network error) still shows as the panel's load failure.
172
+ - **No `/ai/models` request on a server without an AI service.** The chat pane now asks for the AI-model list only once the agent catalog names an agent. A server without `@objectstack/service-ai` answers that catalog empty, so the console no longer asks it and gets a 501. `useAiModels` also remembers a 501 for the session: it no longer retries it five times, and a later mount does not ask again. Other failures, such as a 503 while the server is still starting, are still retried.
173
+ - c83e3fe: `ChatbotEnhanced`'s `onDesignBuiltApp` doc comment now describes what the finished build card draws since objectui#12724: "Open app" (打开应用) is the primary action and "Design in Studio" (在 Studio 中查看) the secondary one, primary only when the host passes no `onOpenBuiltApp` (objectui#12842). It no longer cites an ADR section that does not exist. Comment only; no behaviour changes.
174
+
175
+ Clause-②: no
176
+ No prop, export or language-pack key moves.
177
+ - 6db875e: Opening the console no longer starts nine reads the page does not show in the same moment as the page's own reads (objectui#12980, part 3).
178
+
179
+ - **The bell.** The inbox and the pending-approvals count are read once the boot splash is gone and a frame has painted. Until they land the badge draws nothing, as it does while any read is in flight, and never a `0`. The Activity tab's feed, which the badge does not use, is read when the bell is about to open: a pointer over it, focus, or a click. Until then it does not ask whether `sys_activity` exists either, which inside an app is its own `meta/object/sys_activity` read.
180
+ - **The header's dashboard, page and report lists.** The header reads each only on the route type that names one, for the phone bar's title. Any other route reads none of them.
181
+ - **The navigation sync.** It reads the page and dashboard lists after the first paint. It still waits for both to load before it compares them.
182
+ - **The agent catalog.** `useAgents` sends `GET /api/v1/ai/agents` after the first frame has painted, not while the page mounts. The AI entry points stay hidden until the catalog answers, as before.
183
+ - **The user's language row.** The `sys_user` read that applies the signed-in user's language runs after the first paint. It stays a separate read because `GET /auth/me/localization` does not say whether its `locale` came from the user's column or from a fallback.
184
+ - **The console's locale list and the timezone prompt's settings read.** Both wait for the first paint. The locale list asks for the session at the moment it sends, so a sign-out while it waits sends nothing.
185
+
186
+ Nothing is added to a package entry: no export, prop or type member.
187
+ - 5f599db: The AI build plan card draws a stage field's lifecycle on its chip (for example 「借出 · 已还 ✓完成 · 逾期 ⚠」), read from the plan card's `lifecycle` key. A chip without the key draws as before (objectui#12994).
188
+ - 4b7ce47: The AI build plan card now draws a composed record title's line (for example 「名称:自动生成「{图书} · {读者} · {借出日期}」,表单里不出现」) in place of the plain 「名称:LABEL」 line, read from the plan card's `nameField.generated` key that objectstack-ai/cloud writes since cloud PR #3047. An object without the key draws as before.
189
+ - 6f877f1: An assistant answer reads well in the narrow assistant panel (objectui#13032). Headings inside a chat answer render at chat size (15–16px, bold, set apart by weight and spacing instead of the article-page 20–30px scale). Tables use 13px text and keep their first column frozen while the other columns scroll, and when the columns overflow the panel the table's expand control becomes a labelled, clearly visible "Expand" button. A finished answer taller than two heights of the conversation viewport is folded, with "Show full answer" and "Collapse" controls; an answer is never folded while it is still streaming. The scroll-to-bottom button now sits in its own row below the message list instead of floating over it, so it never covers text, a table or a heading. The four new strings ship in all ten locale packs.
190
+ - 633b8f1: A record link in an assistant answer opens that record inside the console (objectui#13037).
191
+
192
+ An answer names a record with one fixed link form, `/record/OBJECT/ID`, for example `[Wayne Enterprises](/record/account/acc_42)`. The href must match `^\/record\/([a-z_][a-z0-9_]*)\/([A-Za-z0-9_-]{1,128})$` exactly: the object name in the spec's object-name grammar and a record id of letters, digits, `_` or `-`. A click hands the object and the id to the chat's `onOpenRecord`, the opener the `open_record` card already uses, so the console resolves the app and its own mount and navigates in the same tab, with no link dialog.
193
+
194
+ Nothing else about links changes. An external link, any other same-origin path, and a record form carrying a query string, a fragment or more path keep streamdown's link-safety dialog and new tab, and so does the record form in a chat whose host gives no `onOpenRecord`. Nothing is added to the package entry.
195
+ - 912bfd4: The chat's step line no longer shows the agent's tool-loading step, and no longer counts it (objectui#13038).
196
+
197
+ On the build agent, a data question calls `load_tools` first to attach the data tools. That call read as "Load tools" (zh 「加载更多工具」) among the turn's steps, and it was counted in the step total. It is the agent's own plumbing, not a step the user asked for. The phase line and its expanded rows now leave it out, and the count drops by one. A phase that so far called only `load_tools` draws no line, instead of "0 steps". Every other step reads as before.
198
+
199
+ Nothing declares a tool as plumbing today, so the renderer keeps a private list holding `load_tools` only. Nothing is added to the package entry: no export, prop, type member or language-pack key.
200
+ - 1f1c4b5: Doc comments now name the runtime message type `ChatbotEnhancedMessage`, its name since objectui#6349 batch 5, instead of `ChatbotEnhanced.ChatMessage` (objectui#6349, batch 6).
201
+
202
+ No type or runtime behaviour changes.
203
+ - Updated dependencies [18d7b48]
204
+ - Updated dependencies [172acc3]
205
+ - Updated dependencies [f0496bd]
206
+ - Updated dependencies [c4c506b]
207
+ - Updated dependencies [9db9ff3]
208
+ - Updated dependencies [c096f03]
209
+ - Updated dependencies [d92b2a1]
210
+ - Updated dependencies [92f4e2b]
211
+ - Updated dependencies [b10c68e]
212
+ - Updated dependencies [bdc9049]
213
+ - Updated dependencies [e8c0b96]
214
+ - Updated dependencies [b92329c]
215
+ - Updated dependencies [2e818d0]
216
+ - Updated dependencies [fd060f0]
217
+ - Updated dependencies [fd060f0]
218
+ - Updated dependencies [8b14aec]
219
+ - Updated dependencies [2abec3a]
220
+ - Updated dependencies [9dfaca6]
221
+ - Updated dependencies [c000398]
222
+ - Updated dependencies [73b5d77]
223
+ - Updated dependencies [7b17705]
224
+ - Updated dependencies [fc3c2cc]
225
+ - Updated dependencies [f9f4a62]
226
+ - Updated dependencies [848ba0e]
227
+ - Updated dependencies [57d82cb]
228
+ - Updated dependencies [de96f3d]
229
+ - Updated dependencies [9ca3cac]
230
+ - Updated dependencies [c910630]
231
+ - Updated dependencies [ce464d9]
232
+ - Updated dependencies [e6dcd85]
233
+ - Updated dependencies [96fcf30]
234
+ - Updated dependencies [7a2c60b]
235
+ - Updated dependencies [834c559]
236
+ - Updated dependencies [22b503c]
237
+ - Updated dependencies [9fc68aa]
238
+ - Updated dependencies [d50f724]
239
+ - Updated dependencies [17acfbb]
240
+ - Updated dependencies [6be0f7a]
241
+ - Updated dependencies [89cc738]
242
+ - Updated dependencies [c0862c1]
243
+ - Updated dependencies [c0862c1]
244
+ - Updated dependencies [c0862c1]
245
+ - Updated dependencies [c0862c1]
246
+ - Updated dependencies [c0862c1]
247
+ - Updated dependencies [c0862c1]
248
+ - Updated dependencies [ded4494]
249
+ - Updated dependencies [d172f63]
250
+ - Updated dependencies [4c0de52]
251
+ - Updated dependencies [a80fef7]
252
+ - Updated dependencies [3bf8894]
253
+ - Updated dependencies [e06365c]
254
+ - Updated dependencies [1e1f09e]
255
+ - Updated dependencies [455c646]
256
+ - Updated dependencies [f34e877]
257
+ - Updated dependencies [f34e877]
258
+ - Updated dependencies [9844bbf]
259
+ - Updated dependencies [cef0eee]
260
+ - Updated dependencies [7ebff39]
261
+ - Updated dependencies [054fd84]
262
+ - Updated dependencies [5275d1f]
263
+ - Updated dependencies [7241a81]
264
+ - Updated dependencies [74add0c]
265
+ - Updated dependencies [aaba865]
266
+ - Updated dependencies [f1781be]
267
+ - Updated dependencies [fbad078]
268
+ - Updated dependencies [45d5853]
269
+ - Updated dependencies [4f4fc03]
270
+ - Updated dependencies [2312bd9]
271
+ - Updated dependencies [6d5eb34]
272
+ - Updated dependencies [c5406c2]
273
+ - Updated dependencies [c5406c2]
274
+ - Updated dependencies [d99b731]
275
+ - Updated dependencies [2571a3e]
276
+ - Updated dependencies [2a48bd4]
277
+ - Updated dependencies [8a55f0c]
278
+ - Updated dependencies [c7b30bd]
279
+ - Updated dependencies [20c6d35]
280
+ - Updated dependencies [417e245]
281
+ - Updated dependencies [69bca0a]
282
+ - Updated dependencies [023f00d]
283
+ - Updated dependencies [158c75d]
284
+ - Updated dependencies [7525045]
285
+ - Updated dependencies [5af42db]
286
+ - Updated dependencies [ce991bd]
287
+ - Updated dependencies [3c0f806]
288
+ - Updated dependencies [1071393]
289
+ - Updated dependencies [5f75cfa]
290
+ - Updated dependencies [6757a93]
291
+ - Updated dependencies [b7cd5c8]
292
+ - Updated dependencies [5330038]
293
+ - Updated dependencies [c9fc10b]
294
+ - Updated dependencies [dc6d28e]
295
+ - Updated dependencies [c0c2f79]
296
+ - Updated dependencies [0665c3b]
297
+ - Updated dependencies [d2500d8]
298
+ - Updated dependencies [e723f58]
299
+ - Updated dependencies [82bb1d5]
300
+ - Updated dependencies [f3d5408]
301
+ - Updated dependencies [b231607]
302
+ - Updated dependencies [b231607]
303
+ - Updated dependencies [466a219]
304
+ - Updated dependencies [6fb281d]
305
+ - Updated dependencies [54159d3]
306
+ - Updated dependencies [fa778e6]
307
+ - Updated dependencies [334f0cf]
308
+ - Updated dependencies [c08c933]
309
+ - Updated dependencies [92f979d]
310
+ - Updated dependencies [c4dd707]
311
+ - Updated dependencies [c4dd707]
312
+ - Updated dependencies [7578323]
313
+ - Updated dependencies [38bb373]
314
+ - Updated dependencies [923504f]
315
+ - Updated dependencies [5c2982a]
316
+ - Updated dependencies [97e7d4e]
317
+ - Updated dependencies [10aba37]
318
+ - Updated dependencies [5d3f437]
319
+ - Updated dependencies [51c661e]
320
+ - Updated dependencies [7af0ab3]
321
+ - Updated dependencies [b434f5f]
322
+ - Updated dependencies [9f282ef]
323
+ - Updated dependencies [fd4872f]
324
+ - Updated dependencies [f0532d8]
325
+ - Updated dependencies [cea429b]
326
+ - Updated dependencies [3092aca]
327
+ - Updated dependencies [82e5f53]
328
+ - Updated dependencies [d81e460]
329
+ - Updated dependencies [8106db1]
330
+ - Updated dependencies [068a540]
331
+ - Updated dependencies [ca45c6d]
332
+ - Updated dependencies [093d55b]
333
+ - Updated dependencies [b64fda3]
334
+ - Updated dependencies [a8051d6]
335
+ - Updated dependencies [72594f2]
336
+ - Updated dependencies [524136e]
337
+ - Updated dependencies [2b06a91]
338
+ - Updated dependencies [6f3299f]
339
+ - Updated dependencies [065a1cf]
340
+ - Updated dependencies [f2b17c6]
341
+ - Updated dependencies [52d6194]
342
+ - Updated dependencies [23bf859]
343
+ - Updated dependencies [1c72d77]
344
+ - Updated dependencies [2b4d3f1]
345
+ - Updated dependencies [d75f212]
346
+ - Updated dependencies [37db09f]
347
+ - Updated dependencies [ff9df88]
348
+ - Updated dependencies [70e843f]
349
+ - Updated dependencies [caac3b2]
350
+ - Updated dependencies [a2225f9]
351
+ - Updated dependencies [5c4deb5]
352
+ - Updated dependencies [a8e5b73]
353
+ - Updated dependencies [d9d9d98]
354
+ - Updated dependencies [c950345]
355
+ - Updated dependencies [21f9577]
356
+ - Updated dependencies [044f231]
357
+ - Updated dependencies [f8267df]
358
+ - Updated dependencies [9b82ced]
359
+ - Updated dependencies [3821a3a]
360
+ - Updated dependencies [3eb3ec1]
361
+ - Updated dependencies [92c2a69]
362
+ - Updated dependencies [646caea]
363
+ - Updated dependencies [1ffd6a2]
364
+ - Updated dependencies [5f8ecf6]
365
+ - Updated dependencies [8ed7e5a]
366
+ - Updated dependencies [6c4d00d]
367
+ - Updated dependencies [db8ce2f]
368
+ - Updated dependencies [726d8c9]
369
+ - Updated dependencies [f0e760a]
370
+ - Updated dependencies [a5bb7ac]
371
+ - Updated dependencies [f78efdd]
372
+ - Updated dependencies [8a8bcf3]
373
+ - Updated dependencies [f74638c]
374
+ - Updated dependencies [ef71a09]
375
+ - Updated dependencies [8614705]
376
+ - Updated dependencies [619e3f7]
377
+ - Updated dependencies [ca7a4c3]
378
+ - Updated dependencies [c9e6742]
379
+ - Updated dependencies [f62b6ff]
380
+ - Updated dependencies [608033b]
381
+ - Updated dependencies [611566b]
382
+ - Updated dependencies [efa9cb4]
383
+ - Updated dependencies [d66d7e8]
384
+ - Updated dependencies [15d8ca6]
385
+ - Updated dependencies [378896d]
386
+ - Updated dependencies [9d857c9]
387
+ - Updated dependencies [670ea10]
388
+ - Updated dependencies [ff215d9]
389
+ - Updated dependencies [71243db]
390
+ - Updated dependencies [a8add5c]
391
+ - Updated dependencies [33ee9de]
392
+ - Updated dependencies [4839f5c]
393
+ - Updated dependencies [a23e804]
394
+ - Updated dependencies [c7462e7]
395
+ - Updated dependencies [36e2f7b]
396
+ - Updated dependencies [ac59073]
397
+ - Updated dependencies [44cb469]
398
+ - Updated dependencies [e058d76]
399
+ - Updated dependencies [c999d4c]
400
+ - Updated dependencies [8df2608]
401
+ - Updated dependencies [5483297]
402
+ - Updated dependencies [ed43c79]
403
+ - Updated dependencies [260ef71]
404
+ - Updated dependencies [655e897]
405
+ - Updated dependencies [655e897]
406
+ - Updated dependencies [8d80845]
407
+ - Updated dependencies [69a408f]
408
+ - Updated dependencies [d2b21a1]
409
+ - Updated dependencies [5ff64ef]
410
+ - Updated dependencies [64acb7e]
411
+ - Updated dependencies [4ff5b6b]
412
+ - Updated dependencies [473e5a0]
413
+ - Updated dependencies [b279016]
414
+ - Updated dependencies [bb6c38c]
415
+ - Updated dependencies [26323c4]
416
+ - Updated dependencies [9753811]
417
+ - Updated dependencies [2727527]
418
+ - Updated dependencies [3da39ae]
419
+ - Updated dependencies [bc281f4]
420
+ - Updated dependencies [d637be3]
421
+ - Updated dependencies [2cfdc99]
422
+ - Updated dependencies [2cfdc99]
423
+ - Updated dependencies [1e6d83b]
424
+ - Updated dependencies [1e6d83b]
425
+ - Updated dependencies [6058bf8]
426
+ - Updated dependencies [c219165]
427
+ - Updated dependencies [a7ae252]
428
+ - Updated dependencies [fb501bc]
429
+ - Updated dependencies [30083da]
430
+ - Updated dependencies [7f9cc37]
431
+ - Updated dependencies [025130c]
432
+ - Updated dependencies [76f91f8]
433
+ - Updated dependencies [ea34d9b]
434
+ - Updated dependencies [8aa8e3e]
435
+ - Updated dependencies [024b7b6]
436
+ - Updated dependencies [cb80001]
437
+ - Updated dependencies [909c64e]
438
+ - Updated dependencies [9e7e1a5]
439
+ - Updated dependencies [2493e85]
440
+ - Updated dependencies [d0b9648]
441
+ - Updated dependencies [46dbf32]
442
+ - Updated dependencies [a928aaa]
443
+ - Updated dependencies [47508f3]
444
+ - Updated dependencies [61ed5ad]
445
+ - Updated dependencies [1b94d50]
446
+ - Updated dependencies [6f877f1]
447
+ - Updated dependencies [988aa9f]
448
+ - Updated dependencies [1ce0711]
449
+ - Updated dependencies [fb85637]
450
+ - Updated dependencies [9f1dd79]
451
+ - Updated dependencies [df71568]
452
+ - Updated dependencies [d11174a]
453
+ - Updated dependencies [2d8a8b7]
454
+ - Updated dependencies [cbac9d7]
455
+ - Updated dependencies [9eb1479]
456
+ - Updated dependencies [74e37aa]
457
+ - Updated dependencies [961b69f]
458
+ - Updated dependencies [52907d7]
459
+ - Updated dependencies [f466b0a]
460
+ - Updated dependencies [673a71c]
461
+ - Updated dependencies [616df65]
462
+ - Updated dependencies [58798ec]
463
+ - Updated dependencies [8803ca5]
464
+ - Updated dependencies [e70c21d]
465
+ - Updated dependencies [4b92c5a]
466
+ - Updated dependencies [06be396]
467
+ - Updated dependencies [3650d94]
468
+ - Updated dependencies [7c05f21]
469
+ - Updated dependencies [8cd4db4]
470
+ - Updated dependencies [daeb77f]
471
+ - Updated dependencies [eb4552e]
472
+ - Updated dependencies [3c3115e]
473
+ - Updated dependencies [55e90fd]
474
+ - Updated dependencies [9b75509]
475
+ - Updated dependencies [b13ea3c]
476
+ - Updated dependencies [d7e9e9a]
477
+ - Updated dependencies [cf62edf]
478
+ - Updated dependencies [0253416]
479
+ - Updated dependencies [5d77c09]
480
+ - Updated dependencies [3fd8625]
481
+ - Updated dependencies [1473757]
482
+ - Updated dependencies [d73d987]
483
+ - Updated dependencies [12ff256]
484
+ - Updated dependencies [26b0bd2]
485
+ - Updated dependencies [26b0bd2]
486
+ - Updated dependencies [d328698]
487
+ - Updated dependencies [d328698]
488
+ - Updated dependencies [b4e0787]
489
+ - Updated dependencies [088e0f7]
490
+ - Updated dependencies [78b07f4]
491
+ - Updated dependencies [f962cdc]
492
+ - Updated dependencies [b403bb3]
493
+ - Updated dependencies [8a25fee]
494
+ - Updated dependencies [4016370]
495
+ - Updated dependencies [12dc7b4]
496
+ - @object-ui/types@18.0.0
497
+ - @object-ui/components@18.0.0
498
+ - @object-ui/core@18.0.0
499
+ - @object-ui/i18n@18.0.0
500
+ - @object-ui/react@18.0.0
501
+
502
+ ## 17.7.0
503
+
504
+ ### Minor Changes
505
+
506
+ - b46c58f: BREAKING (`@object-ui/types`, `@object-ui/plugin-chatbot`): the authoring `ChatToolInvocation.state` union sheds the AI SDK's three runtime-only approval states — `approval-requested`, `approval-responded` and `output-denied` — so a schema-authored tool invocation can no longer claim an approval the runtime has nothing to back (objectui#10018, the residual clause of the objectui#8426 ruling, decision batch #86).
507
+
508
+ (The bump is `minor` by this repo's release model — objectui's major is pinned to the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.)
509
+
510
+ **Break 1 — authored approval states are refused.** `ChatToolInvocation.state` (and so `ChatMessage.toolInvocations[].state` and `ChatbotSchema.messages`) no longer admits the three approval states, and the Zod mirror `ChatToolInvocationSchema` refuses them as an `invalid_value` at `state`. The refusal holds with or without an `approval` envelope: the envelope does not make a runtime-only state authorable. A chat runtime still produces these states — from the SDK's approval envelope, or promoted from an ObjectStack pending-action result — and still renders them; only the authoring face stops declaring them. Migration: author the state the tool call is actually in (`input-streaming`, `input-available`, `output-available`, `output-error`, or a legacy `partial-call` / `call` / `result`), and leave approval states to the runtime.
511
+
512
+ **Break 2 — `onSend` handlers typed against the authoring `ChatMessage[]`.** The messages a chat runtime hands back can carry those three states, so they are no longer a subtype of the authoring `ChatMessage`. `ChatbotSchema.onSend`'s `messages` is now typed as the authoring message widened by exactly those states, and `useObjectChat`'s `ObjectChatMessage` is no longer assignable to the authoring `ChatMessage`. A handler that declares its parameter as the authoring `ChatMessage[]` stops type-checking. Migration: let the parameter be inferred from the slot, or declare it as `ObjectChatMessage[]` from `@object-ui/plugin-chatbot` when passing `onSend` to `useObjectChat`.
513
+
514
+ Not breaking: `UseObjectChatOptions.initialMessages`, `SeamToolInvocation` and `toRuntimeToolState` now take the seam's state vocabulary (authoring plus runtime), which is the same set of values they accepted before, so every existing caller still compiles. `UseObjectChatOptions.initialMessages` also moves from the authoring `ChatMessage` to the exported `SeamChatMessage`, so nine optional runtime-only keys are now declared on that option: `buildProgress`, `blueprintProgress` and `charts` on a message, and `pendingActionId`, `draftReview`, `proposedPlan`, `proposedChanges`, `builderHandoff` and `replayOutcome` on each tool invocation. Nothing changes at runtime, because the hook's two builders behave exactly as before: local mode's `normalizeMessages` forwards `toolInvocations` whole (so the six tool-invocation keys survive) but copies only the base message fields (so `buildProgress`, `blueprintProgress` and `charts` are dropped), and API mode's `aiInitialMessages` rebuilds each message as SDK parts that carry none of the nine. Each key was already declared on `SeamChatMessage`; what changes is that a host passing one in an object literal is no longer told it is an excess property. No new name is exported: the three runtime-only states are named only by a non-exported alias in `@object-ui/types`, pinned equal to `ChatbotEnhanced`'s runtime union by `chat-message-contract.test.ts`. The effect on out-of-repo authors and hosts was not measured.
515
+ - e6203d7: An incremental edit is no longer read as a whole-app build. An `apply_edit` result says `kind: 'edit'` on its envelope, and its `drafted[]` may list the `app` artifact the edit re-staged, because an `add_object` op re-stages it for the nav merge. An `apply_blueprint` build carries no `kind`. The chat now takes the producer's field as the only thing that separates the two, instead of guessing a build from which artifact types were staged (objectui#10109):
516
+
517
+ - `detectBuiltAppPackage` returns `undefined` for an envelope that says `kind: 'edit'`, in both the drafted and the auto-publish (`status: 'published'`) postures.
518
+ - `DraftReview` has a new optional `kind?: 'edit'`, and `detectDraftResult` fills it from the envelope. The edit still gets its draft card, its items and its `packageId`, so one-click publish still works.
519
+ - `ChatbotEnhancedToolInvocation['draftReview']` (`ChatToolInvocation.draftReview`) is now typed as `DraftReview` instead of an inline copy of its fields, so it declares `kind` too. The two were field-identical before this change, and the published tool-invocation type now describes exactly what the chat mapper puts on it.
520
+ - `buildProgressFromDraftReview` builds no finished "Built X" panel for a draft review whose `kind` is `'edit'`, so a reloaded edit shows the same thing it showed live.
521
+
522
+ An envelope without `kind` behaves as before. `DraftReview.kind` declares only the value these readers act on, and an envelope that says anything else leaves it unset.
523
+ - 64dae8e: Six user-visible fixes across the maker surface, the assistant rail and the
524
+ dataset captions.
525
+
526
+ **The maker's start chips now promise only what ADR-0112 v1 builds
527
+ (cloud#1984).** Two of the five asked for automation the first version has no
528
+ flows or actions for — the ticket chip said 「状态流转」, the inventory chip said
529
+ 「低库存预警」 — and the measured behaviour was not a refusal but a silent
530
+ degrade: a status kanban and a low-stock view. The chip promised an alert and
531
+ delivered a page. All five are reworded in all ten packs (and in the call-site
532
+ `defaultValue` fallbacks, which are a second copy of the same strings) to ask
533
+ for objects, fields, views, pages, dashboards and sample data, keeping each a
534
+ real business scenario — the ticket chip now asks for a status field and a board
535
+ grouped by it, the inventory chip for a view that filters below the reorder
536
+ point. A note beside the keys says to revert when v2 re-adds flows.
537
+
538
+ **Five newer AI tools get their step labels (objectui#7481).** A zh conversation
539
+ read `✓ Get authoring rules 已完成` between 「读取元数据结构」 and 「列出对象」:
540
+ `get_authoring_rules` (cloud#1837), plus `load_tools`, `open_record`,
541
+ `test_flow` and `toggle_flow`, are registered by the cloud AI runtime but are
542
+ newer than the pinned spec's tool registry, so they had no `chatbot.tool.*`
543
+ entry in any pack and fell through to the English title-caser.
544
+
545
+ **The assistant rail follows the thread when you send (objectui#7480).** The
546
+ rail and the full-page maker are the same component; what differs is width. A
547
+ reply that still ends on screen in the wide column runs two or three times
548
+ taller in a ~360px rail, so `StickToBottom`'s lock is escaped by the time the
549
+ user types and the new bubble, the tool steps and the streaming answer all land
550
+ below the fold. Every send path now re-arms the lock — including the plan-card
551
+ "Build it" and 确认修改 approvals, whose own code comments already named this
552
+ miss. Message APPENDS deliberately do not, so a user reading back through the
553
+ thread mid-answer is never yanked to the bottom.
554
+
555
+ **Console toasts move off the assistant composer (objectui#7482).** 「客户更新
556
+ 成功」 sat on the ChatDock composer's send button and stayed there. One defect,
557
+ two symptoms: `apps/console` pinned the toaster to `bottom-right` — an override
558
+ that predates ADR-0057 P3a — so a toast both covered the button and, because
559
+ sonner pauses a toast's dismiss timer while the pointer is inside the toaster
560
+ region, never got to run its 4s timer with a pointer resting on the composer
561
+ underneath. The override is gone; the console takes `ConsoleToaster`'s own
562
+ documented top-right anchor, and the 4s success duration is now pinned.
563
+
564
+ **Built-in aggregate captions follow the locale everywhere (objectui#7534).**
565
+ objectui#7258 taught `buildChartSeries()` to resolve a server-minted default
566
+ measure through the locale map, so a chart legend read `计数` while the table
567
+ beneath it, the KPI caption, the pivot header and the dataset preview still
568
+ printed the server's hard-coded English `Count`. `buildDatasetFieldHelpers()`
569
+ takes the same optional `builtinAggregateLabels`, resolving through the one
570
+ `resolveMeasureLabel` order, and the five call sites pass it. Omitting the
571
+ argument reproduces the previous output byte for byte, and an author-declared
572
+ measure still keeps its own label verbatim (objectui#4106).
573
+
574
+ **The activity feed stops asking for an object the environment does not have
575
+ (objectui#7476).** A tenant environment has no `sys_activity`, so every page
576
+ load issued a request that 404'd. Everything downstream was already correct —
577
+ the adapter memoizes the missing collection, its logger demotes the failure, the
578
+ feed retires as an ANSWER and the panel renders its earned empty state — so what
579
+ is left is the request itself, and `data-objectstack` states the rule for it:
580
+ the cure for a doomed request is not issuing it. New `useObjectPresence` reads
581
+ the object registry the shell loads for the nav anyway; only a registry that has
582
+ ANSWERED and lists other objects without this one skips the read. Every
583
+ uncertainty — no provider, empty registry, still loading, errored — reads as
584
+ before, because a wrong skip would cost a real deployment its feed.
585
+ - 95bad12: feat(plugin-chatbot)!: `useObjectChat` drops the never-honoured `maxToolRoundtrips` option (objectui#5605)
586
+
587
+ **BREAKING (authoring).** `UseObjectChatOptions.maxToolRoundtrips` is removed, so a host
588
+ that passes it to `useObjectChat` no longer type-checks. The three chat registrations
589
+ (`chatbot`, `chatbot-enhanced`, `chatbot-floating`) no longer forward the key, and the
590
+ one-time console notice that authoring it used to log is gone. The authored key is now
591
+ refused by name in `@object-ui/types` (see that package's entry). The notice's reset
592
+ helper was never exported from the package entry, so no other export moves.
593
+
594
+ **Migration:** remove `maxToolRoundtrips`; cap tool loops on the agent
595
+ (`planning.maxIterations`).
596
+
597
+ The option never capped anything. The hook gives `useChat` no client tool loop, so every
598
+ tool round-trip of a turn runs on the server agent inside one streamed response, and the
599
+ value reached neither `useChat` nor the request body.
600
+
601
+ The stage-one deprecation (`.changeset/max-tool-roundtrips-deprecate-5605.md`) never
602
+ shipped: that changeset is still pending, and no `CHANGELOG.md` in this repository
603
+ mentions the key's deprecation.
604
+ - 52a43de: `ChatbotSchema` names the `chatbot` node's local-display and legacy
605
+ auto-response keys — a new, additive published surface (objectui#6169, the
606
+ #6172 family ruling: every component node has exactly one named, importable
607
+ authoring-face type).
608
+
609
+ `ChatbotSchema` (`@object-ui/types`) now declares ten keys that previously
610
+ existed ONLY inside an anonymous inline intersection local to
611
+ `packages/plugin-chatbot/src/renderer.tsx`'s `chatbot` registration, invisible
612
+ to anything outside that one file:
613
+
614
+ - `showTimestamp`, `userAvatarUrl`, `userAvatarFallback`, `assistantAvatarUrl`,
615
+ `assistantAvatarFallback`, `maxHeight` — display fields.
616
+ - `autoResponse`, `autoResponseText`, `autoResponseDelay` — the local
617
+ auto-response (demo/playground) fields, already live via a real consumer
618
+ (`packages/app-shell/src/console/ai/AiChatPage.tsx`).
619
+ - `onSend` — the send-callback, now typed on the published authoring face
620
+ rather than against the plugin's internal runtime message type. Its
621
+ `messages` element is the authoring `ChatMessage` widened by the three
622
+ runtime-only approval states a chat runtime hands back (objectui#10018).
623
+
624
+ Each was read-site-censused before being declared (renderer.tsx and/or
625
+ `useObjectChat.ts` reads every one); none were dead, so none took the
626
+ ADR-0049 retirement route. `disabled` — also present in the original
627
+ intersection — is NOT redeclared: it is already `BaseSchema.disabled`
628
+ (`boolean | string`), read generically for every node type, and redeclaring
629
+ it here would have narrowed away the inherited expression-string case.
630
+
631
+ **What an external consumer can now do that they could not before:** import
632
+ `ChatbotSchema` from `@object-ui/types` and get these ten keys with real,
633
+ checked types — previously any reference to them required either duplicating
634
+ the anonymous type by hand or falling back to `any`. The Zod mirror
635
+ (`@object-ui/types/zod`) gained the same ten keys in lockstep, so a `chatbot`
636
+ node parsed through it is now validated on these keys rather than silently
637
+ passed through unchecked (`BaseSchema`'s Zod mirror is `.passthrough()`).
638
+
639
+ `packages/plugin-chatbot`'s `chatbot` registration (`renderer.tsx`) now types
640
+ its `schema` prop as `ChatbotSchema` directly, dropping the anonymous
641
+ intersection. No behavior change: `renderer.tsx:87`'s
642
+ `body: schema.requestBody` forwarding — the subject of the already-merged
643
+ #6193 — is untouched, and the render function reads the exact same keys it
644
+ already read.
645
+
646
+ This is additive (new optional keys on an interface that already carried a
647
+ `[key: string]: any` index signature, and a new Zod-validated subset of
648
+ previously-passthrough keys), so it ships as `minor` even though it changes
649
+ published type surface: objectui's major is pinned to `@objectstack`'s
650
+ (`scripts/check-changeset-no-major.mjs`), and objectui's own breaking changes
651
+ ship as `minor` with the break spelled out — there is no break here to spell
652
+ out, only a widening from anonymous-and-unchecked to named-and-validated.
653
+
654
+ Out of scope, deliberately: the `chatbot-enhanced` and `chatbot-floating`
655
+ registrations' own anonymous intersections (different key sets, a decision
656
+ for a separate card in the same family), and the `surface` row on
657
+ `content/docs/plugins/plugin-chatbot.mdx`'s Properties table, which names a
658
+ key no registration in this package currently reads (filed separately).
659
+ - 7d8e546: `surface` becomes authorable on the `chatbot-enhanced` node, so the capability the docs
660
+ have been documenting is one an author can actually reach (objectui#6687, maintainer
661
+ ruling 2026-08-29).
662
+
663
+ `content/docs/plugins/plugin-chatbot.mdx`'s `Properties` table listed `surface`
664
+ (`'card' | 'plain'`, "bordered panel or a frameless full-page workspace"), but the key had
665
+ **zero read points**: none of the three `ComponentRegistry.register('chatbot*', ...)` sites
666
+ in `renderer.tsx` forwarded it, and `ChatbotSchema` did not declare it. `surface` was real
667
+ only as a prop of the React component — `ChatbotEnhanced.tsx` defines `ChatbotSurface`,
668
+ defaults it to `'card'`, and branches six layout decisions off `isPlainSurface` — so it was
669
+ reachable by a hand-written React host and by nobody writing metadata. An author who wrote
670
+ `surface: 'plain'` got the `'card'` default, with no error and no signal.
671
+
672
+ Measured on both declaration faces before the fix, each with a control that had to hit:
673
+ `schema.surface` appeared 0 times in `renderer.tsx` against `schema.placeholder` at 3 (one
674
+ per registration) and `schema.processVisibility` at 1; and `ChatbotSchema`
675
+ (`packages/types/src/complex.ts`) declared 34 keys, not this one. Two faces agreeing is
676
+ what made the zero a reading rather than a bad query.
677
+
678
+ The ruling adopted **wiring it** over deleting the row — the row names a real, shipped
679
+ capability, and hiding it back inside the component would withdraw it from authors. It also
680
+ matches this page's two existing resolutions of the same defect class, neither of which
681
+ deleted a row: `requestBody` (objectui#6193) kept its row and documented the seam, and
682
+ `maxToolRoundtrips` (objectui#5605) kept its row, marked it inert, and warns once at runtime.
683
+
684
+ - `chatbot-enhanced` declares `surface?: ChatbotSurface` on its inline schema-extension
685
+ type and forwards `schema.surface` to `<ChatbotEnhanced>`. The union is **imported** from
686
+ `ChatbotEnhanced.tsx` rather than re-spelled, so there is one contract rather than two
687
+ dialects that can drift (AGENTS.md #0.1).
688
+ - The key joins the registration's `inputs` (designer + autocomplete surface) with
689
+ `defaultValue: 'card'`, and deliberately **not** its `defaultProps` — mirroring
690
+ `processVisibility`, so nothing materializes the key onto new nodes.
691
+ - **The absent case is unchanged**: an unauthored `surface` is forwarded as `undefined`, so
692
+ `<ChatbotEnhanced>`'s own `surface = 'card'` default still applies. This is pinned as
693
+ hard as the authored direction, because it is what a careless
694
+ `schema.surface ?? 'plain'` or a `defaultProps` entry would silently regress for every
695
+ existing document.
696
+ - `chatbot` and `chatbot-floating` do **not** gain the key: they render `<Chatbot>` and
697
+ `<FloatingChatbot>`, which have no such chrome to switch. The docs row is therefore
698
+ scoped to say the key applies to the enhanced registration — the table never again claims
699
+ more than the registrations deliver.
700
+
701
+ `renderer.surface.test.tsx` pins all of it through the real SDUI host rather than a bare
702
+ component render, and asserts the rendered chrome rather than the forwarded prop, so a
703
+ regression where the key is forwarded but no longer acted on is still red.
704
+
705
+ ⚠️ **Dated note, 2026-09-27 — `maxToolRoundtrips` no longer keeps its row — objectui#5605.**
706
+ Later in this same release `maxToolRoundtrips` is retired behind a tombstone: its props-table
707
+ row is gone, it no longer warns at runtime, and authoring it on any chat node is refused by
708
+ name with the agent's `planning.maxIterations` as the remedy. The sentence above that says it
709
+ "kept its row, marked it inert, and warns once at runtime" is kept as the reading of this
710
+ change; the objectui#5605 retirement entry states what an author gets now.
711
+ - d3499b3: `chatbot-floating` now fences its `<FloatingChatbot>` spread the same way its
712
+ two sibling registrations (`chatbot`, `chatbot-enhanced`) already do —
713
+ `{...toDomProps(props)}`, at the head of the element, instead of a raw
714
+ `{...props}` spread at the end. This is a deliberate,
715
+ user-visible behavior change, not a refactor:
716
+
717
+ - **A message sent through a floating chatbot now actually renders.**
718
+ Previously the authored `messages` seed (whatever array was on the node
719
+ when it was authored) silently overrode the live runtime messages on every
720
+ render, because the raw spread landed AFTER `messages={runtimeMessages}`.
721
+ Neither the user's own message nor an `autoResponse` reply ever appeared —
722
+ the identical send on `chatbot-enhanced` worked correctly. Fixed.
723
+ - **`displayMode`, `systemPrompt` and `model` stop leaking as DOM attributes**
724
+ on the panel's root element (`systemPrompt` / `model` are still read
725
+ normally, by name, for the request they configure — only the second,
726
+ unfiltered forward is gone). Closes objectui#4425's leak class on the one
727
+ `plugin-chatbot` registration that had not closed it yet.
728
+ - **Three undeclared keys go dark on `chatbot-floating` nodes:**
729
+ `processVisibility`, `surface` and `showAvatars` reached the panel's
730
+ `ChatbotEnhanced` through the raw spread even though `ChatbotFloatingSchema`
731
+ never declared them. `ChatbotFloatingSchema` documents this explicitly and
732
+ always has — the face never promised these keys — so this closes an
733
+ accidental channel rather than removing declared behavior. A document that
734
+ relied on any of the three to affect a floating node loses that effect;
735
+ author them on a `chatbot-enhanced` node instead, where they are part of
736
+ the declared, tested contract.
737
+
738
+ `@object-ui/types`: `ChatbotFloatingSchema`'s doc comment is updated to match
739
+ — no type-shape change, so nothing that imports the type needs to change.
740
+ - 0ea7054: Remove 37 runtime dependencies that no file in the declaring package consumes, and gate
741
+ the direction so the next one cannot land (objectui#8198).
742
+
743
+ `check:phantom-deps` judges imports that are not declared; nothing judged the reverse,
744
+ so a declaration could outlive its last consumer indefinitely. That is what happened to
745
+ `recharts` in `@object-ui/components` after objectui#7397 deleted its only importer — it
746
+ was removed by hand on objectui#7625, and nothing would have reported the next one. The
747
+ new `pnpm check:unused-deps` asks the reverse question over `dependencies` and
748
+ `optionalDependencies` of every released package.
749
+
750
+ **Potentially breaking, for consumers relying on hoisting.** Nothing these packages ship
751
+ changes: their Vite `external` predicates are path-based and never read `dependencies`,
752
+ so no built artifact moves. What changes is the install graph — a project that imports
753
+ one of the removed packages while depending only on the ObjectUI package that used to
754
+ drag it in will no longer resolve it. Declare it directly; that is the correct
755
+ dependency edge in either case. The removals, by package:
756
+
757
+ - `@object-ui/plugin-designer`: `@dnd-kit/core`, `@dnd-kit/sortable`, `@dnd-kit/utilities`, `@object-ui/fields`
758
+ - `@object-ui/plugin-chatbot`: `react-markdown`, `react-syntax-highlighter`, `remark-gfm` (and the orphaned `@types/react-syntax-highlighter`)
759
+ - `@object-ui/plugin-report`: `@object-ui/plugin-grid`, `clsx`, `react-i18next`, `tailwind-merge`
760
+ - `@object-ui/plugin-map`: `@objectstack/spec`, `lucide-react`, `zod`
761
+ - `@object-ui/runner`: `class-variance-authority`, `clsx`, `tailwind-merge`
762
+ - `@object-ui/core`: `lodash`, `zod`
763
+ - `@object-ui/layout`: `clsx`, `tailwind-merge`, and `react-dom` — which it pinned at an exact version in `dependencies` while also declaring it as a peer range, i.e. a library hard-depending on the renderer it asks its host to supply
764
+ - `@object-ui/plugin-dashboard`: `clsx`, `tailwind-merge`, and the same `react-dom` defect
765
+ - `@object-ui/plugin-ai`: `@object-ui/react`, `clsx`, `tailwind-merge`
766
+ - `@object-ui/fields`: `clsx`, `tailwind-merge`
767
+ - `@object-ui/console`: `@object-ui/react-runtime`, `sucrase`
768
+ - `@object-ui/auth`: `@object-ui/types`
769
+ - `@object-ui/plugin-calendar`: `@object-ui/fields`
770
+ - `@object-ui/plugin-editor`, `@object-ui/plugin-markdown`: `@object-ui/react`
771
+ - `@object-ui/react`: `react-hook-form`
772
+
773
+ Every one was verified by a whole-package grep before removal — the name appeared nowhere
774
+ under the package but its own manifest and CHANGELOG — and the whole workspace builds,
775
+ type-checks and tests green afterwards.
776
+ - 411a132: `uiMessagesToChatMessages` / `uiMessageToChatMessage` now accept `@ai-sdk/react`'s
777
+ `UIMessage[]` — the exact input the exported mappers are documented for
778
+ (objectui#8214).
779
+
780
+ **Not breaking.** The parameter type only got looser: every argument that compiled
781
+ before still compiles. `minor` rather than `patch` because a published signature
782
+ accepts input it refused before, which is a capability a consumer can newly rely on.
783
+
784
+ `mapMessages.ts`'s local `AnyPart` is written to absorb whatever a producer hands the
785
+ mapper — every other member is `string` / `unknown` — but `state` was typed against the
786
+ OUTPUT contract (`ChatToolInvocation['state']`, the tool-invocation lifecycle). The AI
787
+ SDK's own text and reasoning parts carry `state: 'streaming' | 'done'`, which is not in
788
+ that union, so the deliberately-permissive input interface was on that one property
789
+ STRICTER than the union it exists to absorb and the whole `UIMessage[]` assignment was
790
+ refused (TS2345). An app that followed the README and drove `useChat()` itself had to
791
+ add an `as never` / `as any` of its own, permanently disabling checking on that seam.
792
+
793
+ `AnyPart.state` is now `string`, and the one read site narrows through an `isToolState`
794
+ guard whose table is a `Record` over `ChatToolInvocation['state']` — so the output stays
795
+ exactly as checked as before, and the table cannot drift from the union it guards.
796
+
797
+ Small behaviour fix that falls out of the guard: a part carrying an unrecognized state
798
+ string (an AI SDK v4 snapshot's `'result'`, say) used to pass through verbatim into
799
+ `ChatToolInvocation.state`, fall past every branch in `getToolState`, and render a
800
+ finished call as "Running" forever. It now normalizes to `undefined`, which is the
801
+ documented "infer from `errorText` / `result`" case.
802
+ - 69a6fc1: feat(plugin-chatbot): `ChatbotEnhanced` takes an optional `surfaceContextTitle`, the tooltip of the surface-context chip
803
+
804
+ The chip that `surfaceContextLabel` renders above the composer now accepts an
805
+ optional `surfaceContextTitle`, rendered as the chip's `title`. A host can show
806
+ a readable label on the chip and keep an internal identifier reachable on hover.
807
+ The prop is additive: a caller that does not pass it renders the chip exactly
808
+ as before, with no `title`.
809
+ - 4dbab84: Build the chat runtime's discriminated tool parts at the PRODUCER, and delete the last
810
+ `as any` on the `useChat` call (objectui#8426; director seat, decision batch #86,
811
+ 2026-09-08, option A — contract-first).
812
+
813
+ `useObjectChat`'s API-mode builder declared its part array as
814
+ `Array<Record<string, unknown>>` and pushed plain objects into it. That is not the
815
+ store's part union, and the mismatch was absorbed by a cast on the `messages` option
816
+ rather than reported. Measured 2x2 on this branch, each leg mutated on disk with hash
817
+ proof: with both that cast and the blanket one objectui#8378 removed gone, both
818
+ type-check programs turn red with one `TS2322` each — `Record<string, unknown>` is not
819
+ assignable to the store's part type. The builder now CONSTRUCTS each part, so the
820
+ option is checked and the cast is gone.
821
+
822
+ **Breaking, deliberately — `UseObjectChatOptions.initialMessages`.** A message's
823
+ optional `parts` member is now declared as the store's own part array instead of
824
+ `Array<Record<string, unknown>>`. Nothing in this repository sets it (the schema
825
+ renderer passes `schema.messages`; app-shell passes the output of
826
+ `hydratedMessagesToChatMessages`, whose literal declares no `parts`), so this is
827
+ visible only to a host that hands `useObjectChat` pre-built parts — which is exactly
828
+ the population the cast was hiding the mismatch from. Per this repo's version policy a
829
+ breaking change ships as `minor`; migration is to build real parts (or drop `parts` and
830
+ let the builder synthesize them from `content` / `toolInvocations`).
831
+
832
+ Three behaviour changes ride with it, each measured rather than assumed:
833
+
834
+ - **The three approval states are now reachable.** `approval-requested`,
835
+ `approval-responded` and `output-denied` require the runtime's `approval` envelope
836
+ alongside them; `ChatToolInvocation` gained that envelope in objectui#9229, and the
837
+ builder now constructs those arms from it. Before this, such an invocation was
838
+ emitted as an untyped object the store could not hold.
839
+ - **The legacy authoring states are folded, not passed through.** `partial-call`,
840
+ `call` and `result` are not runtime states; passing them through left the round-trip
841
+ reader refusing them, so the invocation came back with no state at all. They now fold
842
+ onto `input-streaming` / `input-available` / `output-available`.
843
+ - **The dead `toolName` member is no longer written onto a `tool-*` part.** Only the
844
+ dynamic-tool arm declares one, and the round-trip reader derives the name off the
845
+ part's `type`, so dropping it is behaviour-preserving.
846
+
847
+ An invocation that claims an approval state with no envelope to back it is not
848
+ constructible, and no envelope is invented for it: the state is derived from the data
849
+ the invocation does carry and the producer is told once, by name. An ObjectStack HITL
850
+ approval (`pendingActionId` plus a `pending_approval` result) is deliberately NOT
851
+ reported — it is carried by that id, and the mapper re-promotes the state from the
852
+ result on the way back out.
853
+
854
+ Also lifts the `approval` envelope in `mapMessages`' tool-invocation extraction, which
855
+ closes the disagreement objectui#9229 left behind: the hydrated path carried the
856
+ envelope while the live path dropped it. The lift lands in the same round as its first
857
+ reader, rather than earlier as a declared-but-unread key.
858
+ - 3a43a15: `ChatToolInvocation` gains an optional `approval` envelope, and the Console's
859
+ hydration mapper stops dropping it — together with `pendingActionId`
860
+ (objectui#8442).
861
+
862
+ Three AI SDK `state` values — `approval-requested`, `approval-responded` and
863
+ `output-denied` — are states the SDK's own tool-part union cannot express
864
+ WITHOUT an `{ id, approved?, reason?, isAutomatic?, signature? }` envelope.
865
+ `hydratedMessagesToChatMessages` built each invocation
866
+ from six fields and neither the envelope nor `pendingActionId` was one of them,
867
+ so a rehydrated pending approval arrived carrying a state that says "a human must
868
+ decide" and nothing a decision could be made with: `useHitlInChat` keys its index
869
+ on `pendingActionId` and skips any invocation without one.
870
+
871
+ The two halves arrive from different places and are lifted separately. The SDK
872
+ envelope is persisted ON THE PART and is narrowed to its declared shape rather
873
+ than cast (an `approval` with no usable `id` is refused, not passed through).
874
+ `pendingActionId` is never a part key — in rehydrated history it exists only
875
+ inside the tool RESULT — so it is derived with `detectPendingApproval`, the same
876
+ parse the live mapper uses, now exported from `@object-ui/plugin-chatbot` so the
877
+ two paths cannot disagree about one envelope rather than growing a second
878
+ dialect of it.
879
+
880
+ **`minor`, on the repo's written precedent — PM ruling, overriding the `patch`
881
+ this was drafted at.** The lane's runtime test answers no: the member is optional,
882
+ every value that parsed before still parses, and no chip, card or affordance
883
+ changes for data that carries no envelope. But that test is about stored data,
884
+ and what lands here is published SURFACE — two capabilities a consumer can newly
885
+ rely on: the `ChatToolInvocation.approval` member, and the `detectPendingApproval`
886
+ export. `.changeset/8214-chatbot-anypart-state-widen.md` settles that case in this
887
+ repo in those words: *"`minor` rather than `patch` because a published signature
888
+ accepts input it refused before, which is a capability a consumer can newly rely
889
+ on."*
890
+
891
+ The sequencing argument for `patch` was that objectui#8426's `minor` + `**BREAKING**`
892
+ carrier should not be spent early. ⛔ It does not hold, for two measured reasons.
893
+ **First, the level was never the signal.** This repo ships a breaking change AS
894
+ `minor`, so what distinguishes objectui#8426's half is the `**BREAKING**` carrier,
895
+ not the number beside the package — and that carrier is untouched by this
896
+ declaration. **Second, `.changeset/config.json` puts every package in ONE `fixed`
897
+ group**, so the released level is the maximum across all pending changesets
898
+ regardless of what this file says. Declaring `patch` here therefore buys no
899
+ smaller release and no preserved signal; it only makes the changelog line
900
+ under-describe what shipped. ⇒ the accurate declaration is the cheap one.
901
+
902
+ ⛔ Nothing is narrowed here. The envelope stays optional on purpose, and this
903
+ card does not pair it with the approval states. That narrowing — the residual
904
+ clause of the objectui#8426 ruling — ships under its own name and its own
905
+ BREAKING banner: objectui#10018 sheds the three approval states from the
906
+ authoring `state` union, so an AUTHORED invocation cannot declare one at all,
907
+ with or without an envelope. On the runtime `ChatbotEnhanced.ChatToolInvocation`
908
+ an approval state may still arrive with no envelope — an ObjectStack
909
+ pending-action approval is carried by `pendingActionId` instead — and the
910
+ envelope stays optional there too.
911
+ - 270f282: Six hand-rolled em-dash placeholders now draw the shared `EmptyValue` from
912
+ `@object-ui/components` (objectui#8504), closing the *no accessible name* half
913
+ of the class objectui#8491 / PR #8503 opened.
914
+
915
+ **The accessibility defect.** Each site built its own `<span>` holding a bare em
916
+ dash. `EmptyValue` carries three things none of them had: a `data-slot` of
917
+ `empty-value`, an `aria-label` resolved through the i18n label hook, and
918
+ `select-none` / `no-underline` / `pointer-events-none`. So a screen-reader user
919
+ reaching one of these cells heard a naked punctuation mark, while a neighbouring
920
+ cell drawn by a type-aware renderer was announced as "No value". Two of the
921
+ sites make the inconsistency reachable inside one surface: the metadata list
922
+ renders column 0's placeholder *inside the row's `<Link>`*, where the
923
+ hand-rolled span inherited the link colour and stayed selectable, and the
924
+ dashboard record drawer sits next to renderers that already returned the shared
925
+ component.
926
+
927
+ The six: the metadata list's `defaultCell` and the Audit tab's lock column
928
+ (`@object-ui/app-shell`), the dashboard record drawer's empty `<dd>`
929
+ (`@object-ui/plugin-dashboard`), the import wizard's saved-mapping transform
930
+ cell (`@object-ui/plugin-grid`), the AI-approvals `JsonBlock`
931
+ (`@object-ui/plugin-chatbot`), and the Public Forms object column
932
+ (`@object-ui/console`).
933
+
934
+ **A deliberate visual change, not a no-op.** Five sites drop
935
+ `text-muted-foreground` (or `/60`) for the shared `text-muted-foreground/50`, so
936
+ every placeholder in the workspace is now one colour. The glyph is unchanged
937
+ everywhere. The sixth, `JsonBlock`, keeps its `text-xs` through `className`
938
+ because it stands where a `text-xs <pre>` would and has no shared neighbour to
939
+ match — its delta is the accessible name and the three affordances only.
940
+
941
+ **Two adjacent lines in the same file, taken deliberately.** The AI-approvals
942
+ drawer's `proposed_by` / `decided_by` fields fell back to a bare `'—'` text node
943
+ inside a plain `<div>` — a different source spelling of the same rendered
944
+ defect, individually verified on the card rather than swept up. They are
945
+ converted too. `formatRelative`'s `if (!s) return '—'` is not: that helper is
946
+ declared `: string`, so its fallback is not a node.
947
+
948
+ Filled values are untouched in every path.
949
+ - 6ce89da: The 确认修改 (confirm changes) card now carries a UI-owned terminal state after approval (#5695): `detectReplayOutcome` lifts the confirm-replay envelope (`replay_*` tool results) into 应用中 / 已生效 / 已暂存为草稿(含内联发布)/ 未生效(含 publishError 首行), rendered on the original card across the live, hydration/share, and localStorage-cache converters. A failed in-turn publish no longer rehydrates as an ordinary draft card with a live Publish button — the UI-rendered refusal is the layer a model cannot narrate over. New `console.ai.changesApplying/Applied/Drafted/Failed` keys in all ten locale packs.
950
+ - 63b4e0e: Fix the three breaks at the AI paywall moment (#7253), measured on a free plan's
951
+ second build iteration when the cloud guardrail refuses "Confirm changes" with a
952
+ 429 `AI_DESIGN_QUOTA_EXHAUSTED`.
953
+
954
+ - **The upgrade CTA no longer opens a 404.** It used to open a client-composed
955
+ `${cloudBase}/apps/cloud-control/sys_environment`, which guessed the control
956
+ plane's console mount, app slug and route — all three wrong — and landed on
957
+ the API's `ENDPOINT_NOT_FOUND` JSON. `cloudInstallDeepLink` /
958
+ `cloudPricingDeepLink` are replaced by `cloudConsoleUrl()`, the
959
+ runtime-supplied cloud origin with no path appended; the control plane's own
960
+ root redirect decides the landing page. The former
961
+ `|| 'https://cloud.objectos.app'` default is gone: a runtime with no upstream
962
+ cloud now renders no upgrade link at all rather than pointing a self-hosted
963
+ user at the vendor's SaaS.
964
+ - **The confirm card gets an explicit failure state.** A quota refusal parks the
965
+ card on "not applied" with the server's own next step (reset tomorrow /
966
+ upgrade) plus the upgrade action, instead of silently rolling back to
967
+ "Confirm / Adjust" as though the click had never happened. Transient failures
968
+ (offline, per-minute rate limit) still roll back, because retrying is the
969
+ right next step there.
970
+ - **The composer is no longer refilled with an already-delivered message.**
971
+ Only text typed into the composer is restorable now; card-driven sends
972
+ (confirm, approve, suggestion chips) send canned text the user never typed and
973
+ no longer leave the previous prompt staged as if it needed resending.
974
+ - b842035: `useObjectChat().setMessages` now keeps the promise its declaration makes, and the
975
+ `chatResult as any` that was hiding the gap is gone (objectui#8342).
976
+
977
+ The member is declared `(messages: unknown[]) => void` and the hook returned
978
+ `@ai-sdk/react`'s own `setMessages`, which accepts only its `UIMessage[]`.
979
+ Parameters are contravariant, so that assignment is unsound — `tsc` reported it as
980
+ a TS2322 the moment the cast came off, and the declared type was telling every
981
+ consumer they could hand over an arbitrary array when the function underneath
982
+ could not take one. Nothing broke only because no caller had yet taken the type at
983
+ its word; one who did got a runtime failure the compiler had blessed.
984
+
985
+ The parameter stays `unknown[]`. This package does not republish the SDK's pinned
986
+ `UIMessage` on its own surface — the same call objectui#8214 made one file over
987
+ for `AnyPart.state`, and typing this member against the SDK would re-break it on
988
+ the next dependency bump. Instead the hook now wraps the SDK function and checks
989
+ every element first: an object with a string `id`, a `'user' | 'assistant' |
990
+ 'system'` role, and a `parts` array — exactly the three members `UIMessage`
991
+ requires. `parts` is checked for array-ness only, because the part union is open
992
+ (a `data-*` part carries an author-defined payload) and restating it is the
993
+ coupling this change exists to avoid.
994
+
995
+ **Behaviour change, and the reason this is not a patch.** A value that is not a
996
+ chat message is now REFUSED, not filtered and not passed on: the call throws a
997
+ `TypeError` naming the offending index, and the SDK's store is left untouched
998
+ because the whole array is validated before anything is written. Filtering was
999
+ rejected deliberately — this is a re-hydration path where the caller's statement
1000
+ is "the thread is now exactly these messages", so dropping the failures would
1001
+ install a shorter thread that the `void` return makes undetectable. The declared
1002
+ TYPE does not move, so nothing that compiled stops compiling; what narrows is the
1003
+ set of values a consumer can successfully pass at runtime, which is the opposite
1004
+ direction from objectui#8214's widen.
1005
+
1006
+ `@object-ui/app-shell`'s `useReconcileOnError` is the one in-repo consumer. Its
1007
+ payload comes from `toUIMessages`, which emits exactly `id` / `role` / `parts`, so
1008
+ it passes the check unchanged; and it already calls through a `try`/`catch` that
1009
+ falls back to the ordinary error banner, so a future malformed server payload
1010
+ degrades to "show the error" rather than to a quietly-truncated transcript.
1011
+ - f157423: Studio workbench and AI tool cards speak the author's language (objectui#7254)
1012
+
1013
+ - The Interfaces breadcrumb, canvas caption and navigation rail show the
1014
+ metadata label plus a translated kind; the internal `type · name` pair moves
1015
+ to the tooltip. An unlabelled nav leaf now falls back to its object name
1016
+ instead of rendering an empty row.
1017
+ - The Studio top-bar package switcher reads the package's human name from
1018
+ either position the packages endpoint serves it in, instead of degrading a
1019
+ registry-shaped entry to its reverse-domain id.
1020
+ - The dashboard property panel is localized: the spec's authoring form is
1021
+ overlaid through the platform's own `metadataForms.<type>` convention, so
1022
+ section headings, field labels, hints and the `header` composite's sub-fields
1023
+ render in Chinese (developer vocabulary such as "Tailwind units" is replaced
1024
+ with something an author can act on, not transliterated).
1025
+ - AI tool cards: tool titles resolve through `chatbot.tool.<name>` (all thirty
1026
+ platform-provided tools, ten locale packs), the header status badge is
1027
+ localized, and the plan count strip is a real plural family instead of an
1028
+ English `+ "s"` concatenation.
1029
+ - The tool card's header badge and its body badge now come from one producer:
1030
+ a proposal that has been confirmed, built or published no longer keeps a
1031
+ header reading "Awaiting Approval".
1032
+
1033
+ ### Patch Changes
1034
+
1035
+ - ac15833: fix(plugin-chatbot): a reloaded multi-step build no longer shows an empty 「执行过程」 block under every step (objectui#10899)
1036
+
1037
+ The conversation store persists each step of an agent turn as its own assistant
1038
+ row whose only text is a `(called …)` placeholder, so a reloaded build (the
1039
+ in-app dock, the Studio copilot) hydrates into one message per step. Each one
1040
+ rendered its tool row, then the italic 执行过程 note, then the message action
1041
+ bar — invisible until hover but full height — so every step read as an empty
1042
+ block with a large gap.
1043
+
1044
+ - The 执行过程 note is now only the fallback for a placeholder turn that shows
1045
+ nothing else. A turn whose tool row, build panel or design panel is on screen
1046
+ does not repeat it.
1047
+ - The copy / regenerate bar renders only for a turn with visible prose. A
1048
+ prose-less step has nothing to copy, and Copy used to copy the internal
1049
+ placeholder.
1050
+ - 7d82957: fix(plugin-chatbot): the proposed-plan card's actions wait until no turn is in flight
1051
+
1052
+ The proposed-plan card renders as soon as `propose_blueprint` returns, but the
1053
+ turn that proposed it keeps streaming after that, and the server stores each of
1054
+ its remaining steps as it goes. Build it, Adjust and the one-click answer chips
1055
+ were live the whole time. In a cloud E2E run the user clicked Build it inside
1056
+ that window. The next turn was sent while the previous one was still being
1057
+ stored, and the stored history interleaved the two turns.
1058
+
1059
+ These actions are now disabled while `isLoading` is true, on the structured plan
1060
+ card and on the fallback confirm card alike. `isLoading` is the signal that
1061
+ already turns the composer's send into a stop button. The actions come back once
1062
+ the response stream has been read to its end, and the buttons carry the native
1063
+ `disabled` attribute while they wait. The gate also covers two windows that a
1064
+ message's own `streaming` flag misses: a request that is out but has no reply
1065
+ yet, and a newer turn streaming below an older plan card.
1066
+
1067
+ Ordering replayed history by turn in the conversation store is a separate
1068
+ server-side fix.
1069
+ - be66b56: fix(plugin-chatbot): the confirm-changes card's actions wait until no turn is in flight
1070
+
1071
+ The confirm-changes card renders as soon as a tool such as `update_metadata`
1072
+ returns `changes_proposed`, but the turn that proposed the change keeps
1073
+ streaming after that. Confirm and Adjust were live the whole time, and Confirm
1074
+ sends its confirmation straight away, so a click in that window sent the next
1075
+ turn while the previous one was still in flight. The proposed-plan card's
1076
+ actions were fixed for the same overlap.
1077
+
1078
+ Confirm and Adjust are now disabled while `isLoading` is true, the signal the
1079
+ proposed-plan card's actions already wait on. They carry the native `disabled`
1080
+ attribute while they wait and come back once no turn is in flight. Because the
1081
+ signal is not tied to the card's own message, the gate also holds an older card
1082
+ while a newer turn is in flight below it, including a request that is out with
1083
+ no reply yet.
1084
+
1085
+ Only those two buttons change. The card's other states render as before: the
1086
+ Applying badge, the blocked state after an AI quota refusal, the Confirmed
1087
+ badge, and the reply hint shown when the host passes no `onSendMessage`.
1088
+ - 39f4309: Published typings from every `vite-plugin-dts` package now carry an explicit extension on
1089
+ every relative specifier, and a type error in the declaration build now fails the build
1090
+ instead of being printed and ignored (objectui#5439, objectui#5483).
1091
+
1092
+ **Consumers on `moduleResolution: nodenext` or `node16` may see NEW type errors, and that
1093
+ is the fix working.** These packages re-export mostly through NAMED re-exports —
1094
+ `export { useObjectChat } from './useObjectChat'`. TypeScript could not follow the
1095
+ extensionless hop, but it still DECLARED the name, so the symbol resolved to a silent
1096
+ `any`. Nothing errored; consumers simply got no types. With the extension emitted, the
1097
+ symbol carries its real type, and any call site that was relying on the `any` now type
1098
+ checks for the first time. This is the mode that produced the 21 residual `TS7006` on
1099
+ `@object-ui/app-shell` reported against objectui#5365 — a type hole that opened quietly,
1100
+ unlike objectui#5365's own `export * from './ui'` packages where the same defect surfaced
1101
+ immediately as `TS2305: has no exported member`.
1102
+
1103
+ 410 extensionless relative specifiers across 19 packages were emitted before this change;
1104
+ the count is now 0 in all 22 packages that build typings through `vite-plugin-dts`.
1105
+ `@object-ui/fields` was already clean — its sources write explicit `.js` specifiers — and
1106
+ is wired so it stays that way.
1107
+
1108
+ The second half changes no emitted output today: 22/22 packages built green unmodified, so
1109
+ making the declaration step's exit code honest turns nothing red. It changes what a FUTURE
1110
+ regression does — print and exit 0, versus fail the build.
1111
+ - 01c9023: `AiPendingActionsInbox` speaks the session locale — every string in it, not only its timestamps (objectui#7173).
1112
+
1113
+ The AI HITL approval inbox held its own relative-time helper returning hardcoded
1114
+ English (`'just now'`, `` `${min}m ago` ``), so a zh / ja / ar session read English
1115
+ relative times on every row. It is the fifth spelling of that helper in the repo,
1116
+ and the file had **no translation wiring at all** — the unwired-component shape,
1117
+ not the lookup-swap shape.
1118
+
1119
+ It is therefore swept whole. objectui#7142 wired one string into an otherwise
1120
+ untranslated component and shipped something visibly half-done, and objectui#7149
1121
+ is what finishing that afterwards cost; the triage ruling on this card (2026-09-01)
1122
+ carried that forward as *sweep the file whole or leave it*. Everything the user can
1123
+ read now resolves from the locale packs: the card heading and description, the three
1124
+ tabs, the refresh button, all five status badges, the six column headings, the empty
1125
+ state, the row and drawer buttons, all nine drawer field labels, the outcome banner
1126
+ and the whole reject-reason dialog.
1127
+
1128
+ **No new rows for the four relative-time branches.** `detail.justNow`,
1129
+ `detail.minutesAgo`, `detail.hoursAgo` and `detail.daysAgo` already existed,
1130
+ translated, in all ten packs, and cross-package key borrowing is this repo's settled
1131
+ convention rather than an open question — `ObjectGrid`, `ObjectKanban`, `ObjectTree`,
1132
+ `ListView`, `ObjectView`, `NavigationOverlay`, `RecordAttachmentsPanel`,
1133
+ `RecordDetailView` and `apps/console` all resolve `detail.*` from outside
1134
+ `plugin-detail`. One phrase on one kind of control should not get a second
1135
+ translation that can drift from the first.
1136
+
1137
+ The rest of the sweep needed copy no pack had, so `@object-ui/i18n` gains an
1138
+ `aiApprovals` namespace: 38 keys, translated in all ten packs. It is deliberately
1139
+ separate from `approvalsInbox`, which is the human approval-**process** inbox — a
1140
+ different surface and a different feature, so no rows are shared with it. Four
1141
+ generic verbs are reused rather than forked (`common.refresh`, `common.cancel`,
1142
+ `common.loading`, `common.ok`).
1143
+
1144
+ **⛔ The five relative-time helpers are not unified.** They differ in real behaviour
1145
+ — `Math.round` here against `Math.floor` in `plugin-detail`, thresholds 45s/30d
1146
+ against 60s/7d, different tails — so normalising them is a behaviour change wearing
1147
+ a refactor's clothes and needs its own card. This inbox's arithmetic is untouched,
1148
+ and three rows in the new suite exist only to pin it: 50s renders `1m ago` (a 60s
1149
+ threshold would still say "just now"), 90s renders `2m ago` (`Math.floor` gives
1150
+ `1m ago`), and 20d renders `20d ago` (a 7d threshold would already show a date).
1151
+
1152
+ Two assembled English sentences became single interpolated keys — the outcome banner
1153
+ (`Approve for {{id}}: {{message}}`) and the drawer subtitle
1154
+ (`Tool {{tool}} on {{object}}`). Their word order differs per locale, which fragments
1155
+ around a `<code>` element cannot express, so the two identifiers lose their monospace
1156
+ styling. That is the deliberate cost of making those sentences translatable.
1157
+
1158
+ Evidence: an `en`-only assertion cannot discriminate here, because each key's `en`
1159
+ value is byte-identical to the literal it replaced. The suite asserts in **zh and
1160
+ ar**, and the provider-less path separately, in its own file (`createI18n` installs
1161
+ itself as react-i18next's module-level global, so a provider-less render in a file
1162
+ that has already mounted a provider silently reads that pack instead of the defaults
1163
+ map). No inline `defaultValue` anywhere (objectui#3517).
1164
+
1165
+ Two consequences of the sweep, both landed here rather than left for CI to find:
1166
+
1167
+ `packages/app-shell/src/console/ai/__tests__/ConversationsSidebar.test.tsx` froze its
1168
+ `vi.mock('@object-ui/i18n', ...)` factory to a hand-written object. Its import graph
1169
+ reaches `plugin-chatbot`, which now resolves `createSafeTranslation` at module scope, so
1170
+ the frozen surface made that read `undefined` and the file died during COLLECTION — the
1171
+ objectui#6849 shape, which does not look like a test failure. It now spreads
1172
+ `importOriginal()` and overrides only `useObjectTranslation`. Measured, not guessed: of
1173
+ the 41 frozen `@object-ui/i18n` factories in the repo, running every one of them showed
1174
+ this to be the only file whose graph reaches the package.
1175
+
1176
+ The ten pack blocks are locale DATA, and locale data lands in the console's eager
1177
+ `framework` chunk, so `scripts/check-eager-closure-budget.mjs` raises that chunk's
1178
+ ceiling from 512,000 to 524,000 gzipped bytes and re-pins its baseline onto a fresh
1179
+ measurement (502,405 to 514,863). Attributed by three console builds: the merge parent
1180
+ reads 510,192, this branch with the ten `aiApprovals` blocks cut reads 510,192 again, and
1181
+ this branch reads 514,863 — so the whole 4,671-byte delta is the pack data and nothing
1182
+ else. Headroom is kept at the line's own convention (9,137 bytes, 0.10x the regression
1183
+ the gate must catch) rather than widened; most of the overage was pre-existing drift, with
1184
+ the merge parent already at 510,192 of the 512,000 allowed.
1185
+ - c6198c2: **Breaking for authored metadata:** `ComponentInput.label`, `ComponentInput.defaultValue` and
1186
+ `ComponentInput.advanced` are RETIRED on both faces (objectui#7493 item ① and objectui#7781;
1187
+ maintainer ruling A of 2026-09-06, immediate, no deprecation window; ADR-0049 enforce-or-remove).
1188
+ They are the three keys the manifest serializer does not forward, and nothing read them on any
1189
+ publication or consumption path.
1190
+
1191
+ No manifest ever published them, so no consumer could ever have read them. `sdui-parser`'s
1192
+ serializer (`packages/sdui-parser/src/index.ts`) forwards exactly seven keys per input — `name`,
1193
+ `type`, `of`, `required`, `enum`, `binding`, `description` — so a value authored under any of the three
1194
+ never reached `sdui.manifest.json`, the generated JSX `.d.ts`, or a diagnostic; its boundary type
1195
+ has no slot for them; the registry's data-source seam reads `name` only; and neither the designer
1196
+ nor the app-shell inspectors consult registry `inputs` at all. A structural census over every
1197
+ `inputs:` array in the repository (re-measured on this change's merge-base, `name` 951 and `type`
1198
+ 951 as the controls) counted the writes: `label` 908, `defaultValue` 245, `advanced` 9 — written on
1199
+ nearly every registration, read by nothing.
1200
+
1201
+ FROM → TO, per key — all three **TOMBSTONED, not removed**, because the route was measured on
1202
+ the built face before it was chosen: `ComponentInputSchema` is a non-strict `z.object`, and an
1203
+ undeclared key parses GREEN and is silently STRIPPED, so a deletion would have swallowed 1,162
1204
+ authored values in silence. The tombstone is what makes the refusal loud and by name.
1205
+
1206
+ - `label?: string` → `label?: never` on the interface, `retirementTombstone()` on the Zod mirror.
1207
+ Migration: delete the key. An input is identified by its `name` on every path that reaches it;
1208
+ nothing ever rendered a label for it.
1209
+ - `defaultValue?: any` → `defaultValue?: never` / `retirementTombstone()`. Migration: delete the
1210
+ key. The renderer's own fallback read IS the default; tell the author about it in `description`,
1211
+ which IS published. (Tightening the type to `unknown` was ruled out: it closes no error class,
1212
+ since nothing reads the value.)
1213
+ - `advanced?: boolean` → `advanced?: never` / `retirementTombstone()`. Migration: delete the key.
1214
+ No designer surface ever hid an "advanced" input; there is nothing to write instead.
1215
+
1216
+ The retirement kit: `?: never` on `ComponentInput` (`packages/types/src/base.ts`), so authoring one
1217
+ is a `tsc` error at the registration site; `retirementTombstone()` on `ComponentInputSchema`
1218
+ (`packages/types/src/zod/base.zod.ts`), so an authored value is REFUSED at parse time with
1219
+ `code: 'invalid_type'`, the key named in the issue `path`, and the migration note as the message
1220
+ (one string, both channels). Pinned in
1221
+ `packages/types/src/__tests__/component-input-retired-keys-7493.test.ts`, which also holds a
1222
+ tree-scoped absence census over every `inputs:` array under `packages/**` and `apps/**`.
1223
+
1224
+ Accept-set change, stated plainly for reviewers: a document that sets any of the three keys on a
1225
+ `ComponentInput` used to parse GREEN (the value was then dropped by the serializer) and now parses
1226
+ RED. Every in-repo authoring site — 1,199 keys across 110 registration files, the three standalone
1227
+ `ComponentInput[]` arrays and the two named input arrays `tsc` found included — is deleted in the same change, as the ruling's split rule
1228
+ requires; the `WidgetRegistry` seam no longer copies the widget-manifest values onto the synthesized
1229
+ `ComponentInput` (they fed nothing), and the data-source declaration `ELEMENT_DATA_SOURCE_INPUT`
1230
+ drops its `label`. The patch entries on the other packages record exactly that: their registrations
1231
+ stop authoring inert keys, with no runtime or published-manifest change.
1232
+
1233
+ The nine test files that read `defaultValue` off a registration were re-pinned against the
1234
+ renderer's ACTUAL default (its own fallback read, or the `defaultProps` it ships) instead of the
1235
+ declaration that went away; two assertions that only restated the shadow default were dropped with
1236
+ the reason on the line.
1237
+
1238
+ The in-repo zero is what was measured. Whether anything OUTSIDE this repository writes these keys
1239
+ is not measurable from here (the objectui#5674 limit); converting such a write from a silent drop
1240
+ into a named refusal is exactly what the tombstones buy. `WidgetInput`'s own `label` /
1241
+ `defaultValue` / `advanced` (the widget-manifest face) stay declared and writable — nothing has
1242
+ ruled on that face; that it now has no reader either is recorded as objectui#7911.
1243
+ - 3e377c9: Retire `ChatbotSchema.displayMode` — and its copy on `ChatbotFloatingSchema` — as an
1244
+ ADR-0049 retirement tombstone, and remove the `chatbot-floating` registration's
1245
+ "Display Mode" designer control and its `defaultProps.displayMode: 'floating'` seed
1246
+ (objectui#7654, maintainer ruling B of 2026-09-05, director decision batch #44).
1247
+
1248
+ ⚠️ **BREAKING for anyone authoring `displayMode` against a chatbot face in TypeScript.**
1249
+ Ships as `minor` per the launch-window convention: objectui's `major` is a cross-repo pin
1250
+ to `@objectstack`'s so that "same major means compatible" holds across the two repos
1251
+ (`scripts/check-changeset-no-major.mjs`), and objectui's own breaking changes ship as
1252
+ `minor` with the break named where it lands — this entry is the channel that carries it.
1253
+
1254
+ ## What was retired, and why
1255
+
1256
+ The node `type` — `chatbot-floating` versus `chatbot` / `chatbot-enhanced` — is the one
1257
+ selector of presentation. `displayMode` (`'inline' | 'floating'`) was a second spelling
1258
+ of that same choice, and no renderer has ever read it: `chatbot-floating` renders the
1259
+ trigger and panel unconditionally, and `chatbot` never looked at the key, so
1260
+ `displayMode: 'floating'` on a `chatbot` node produced no trigger and `'inline'` on a
1261
+ `chatbot-floating` node changed nothing. It was nevertheless declared on both faces,
1262
+ painted as a **Display Mode** control in the designer's property panel, and written as
1263
+ `'floating'` into every node the designer created — two surfaces teaching a switch that
1264
+ did not exist.
1265
+
1266
+ Re-measured on this branch's base rather than inherited from the card: a whole-repo
1267
+ `git grep` census over tracked files, build output excluded, returned the declarations,
1268
+ the doc comments and parity-ledger entries beside them, one historical CHANGELOG line and
1269
+ two unrelated `displayMode` props on `GridField` / `MasterDetailForm` — no read. The same
1270
+ pass over `floatingConfig`, a key that IS read, returned 79 lines, so the instrument was
1271
+ not blind.
1272
+
1273
+ FROM → TO:
1274
+
1275
+ - `ChatbotSchema.displayMode?: 'inline' | 'floating'` → **`displayMode?: never`**, an
1276
+ ADR-0049 retirement tombstone whose comment points at `type` as the replacement.
1277
+ - `ChatbotFloatingSchema.displayMode?: 'inline' | 'floating'` → **`displayMode?: never`**,
1278
+ the same tombstone. objectui#7655 declared the key on the floating face with
1279
+ `ChatbotSchema`'s own lines precisely so this retirement would find it on both faces;
1280
+ leaving the copy typed would have kept the published face teaching the switch.
1281
+ - `chatbot-floating` `inputs`: the **Display Mode** control is removed.
1282
+ - `chatbot-floating` `defaultProps`: `displayMode: 'floating'` is no longer written into
1283
+ designer-created nodes.
1284
+
1285
+ A control is restated, never deleted into a vacuum (`5f4514f7b`): the restatement of
1286
+ the removed control is the tombstone's guidance plus this note.
1287
+
1288
+ **Migration.** Delete `displayMode` from any TypeScript literal typed as `ChatbotSchema`
1289
+ or `ChatbotFloatingSchema`; the presentation you wanted is already chosen by `type` —
1290
+ `'chatbot-floating'` for the trigger-and-panel, `'chatbot'` / `'chatbot-enhanced'` for
1291
+ inline. **No JSON document needs editing** — see the next section.
1292
+
1293
+ ## Stored documents: runtime validation of this key is unchanged — zero before, zero after
1294
+
1295
+ `displayMode` has never had a Zod arm — it sits in the `UnmirroredDeclared` ledger for
1296
+ both `complex.zod.ts#ChatbotSchema` and `#ChatbotFloatingSchema`, and `BaseSchema` is
1297
+ `.passthrough()` — so a stored document carrying `displayMode: 'floating'` (every node
1298
+ the designer ever created) parses green before this change and parses green after it,
1299
+ and the value is dropped at render time exactly as it always was.
1300
+
1301
+ That is deliberate, and it is why this tombstone has **no `retirementTombstone()`
1302
+ half**: minting a mirror arm to refuse the key would be the declared-but-unmirrored axis
1303
+ (objectui#6152), a different defect, and a parse outcome the ruling did not ask for.
1304
+ `packages/types/src/__tests__/chatbot-display-mode-retired.test.ts` pins both twins'
1305
+ shapes as a **tripwire** — the same shape `a3eb5d07a` gave `triggerIcon` — so that if
1306
+ objectui#6152 ever mints an arm for `displayMode`, the pin goes red and whoever lands the
1307
+ mirror adds the `retirementTombstone()` half at that time, flipping the control rather
1308
+ than deleting it.
1309
+
1310
+ ## Why a tombstone and not a deletion — measured on this carrier
1311
+
1312
+ `ChatbotSchema` extends `BaseSchema`, which carries a `[key: string]: any` index
1313
+ signature, and on such a carrier deleting an optional member is **silent in every value
1314
+ shape**: the index signature defeats both excess-property checking and the weak-type
1315
+ check. Measured on this member with `tsc -p tsconfig.test.json`, a no-index-signature
1316
+ control carrier (`FloatingChatbotConfig`) lit in the same run:
1317
+
1318
+ | route | fresh `'floating'` | fresh `'bogus'` | widened `'floating'` |
1319
+ |---|---|---|---|
1320
+ | declared (before) | clean | `TS2322` | clean |
1321
+ | deleted | clean | **clean** | clean |
1322
+ | tombstoned (after) | `TS2322` | `TS2322` | `TS2322` |
1323
+
1324
+ Deleted, the member reads as `any` and even a wrong-typed value goes quiet. Tombstoned,
1325
+ **presence with any value** is a compile error — a channel deletion cannot produce on
1326
+ this carrier at all. On a `BaseSchema` carrier the two routes are loud-vs-silent, not
1327
+ louder-vs-quieter (the discriminator's carrier branch in its amended form, `5f8190c8c`).
1328
+ Prong 2 of that discriminator licenses the tombstone: the key was advertised in the
1329
+ 3.3.0 release record (`CHANGELOG.md:578`) and its published comment taught it as the
1330
+ presentation switch. The deleted row is pinned in the test file as a live control — an
1331
+ undeclared key that rides both shapes with no directive — so the contrast cannot rot.
1332
+
1333
+ ## Accept-set change, one line per face
1334
+
1335
+ - **TypeScript.** A write of `displayMode` against either chatbot face used to compile
1336
+ and now does not.
1337
+ - **Runtime (Zod / `safeValidateSchema`).** Nothing changes at all — a stored document
1338
+ carrying the key parses green before and after, and keeps the value.
1339
+ - **Designer.** The **Display Mode** control disappears from the `chatbot-floating`
1340
+ property panel, and newly created nodes no longer carry the key.
1341
+ - **Manifest, author-time validator, and generated JSX props.** The `chatbot-floating`
1342
+ registration's `inputs` go from 20 entries to 19 and its `defaultProps` from 9 keys to
1343
+ 8, so the manifest projected from them no longer lists the prop. Measured on both sides
1344
+ of this change: `validateTree` on a stored `chatbot-floating` node carrying
1345
+ `displayMode` goes from **0 diagnostics to exactly 1** — code `unknown-prop`, severity
1346
+ **`warning`**, message `` `<chatbot-floating> has no prop "displayMode"` `` — which is
1347
+ what the JSX/HTML authoring tier reports through `compile()`. In the same pair of runs
1348
+ the props interface `generateDts` derives from those same `inputs` drops from 20 members
1349
+ to 19, losing its `displayMode?: string` line, so a `.tsx` page written against those
1350
+ generated intrinsics no longer type-checks the attribute.
1351
+
1352
+ **This is author-time only: no stored document stops parsing and nothing at render
1353
+ moves.** The value survives compilation — `compile()` returns a tree still carrying
1354
+ `displayMode: 'floating'`, byte-for-byte the same keys before and after — and a
1355
+ `warning` never blocks a page, because the page renderer filters the diagnostics to
1356
+ `severity === 'error'` before deciding whether to fail. Two neighbouring instruments are
1357
+ untouched and worth naming so the scope is not read wider than it is: `os validate` runs
1358
+ `safeValidateSchema`, the Zod path, and is silent on this key before and after; and the
1359
+ build-time `sdui-intrinsics.d.ts` artifact is generated from the PUBLIC tier, which does
1360
+ not contain `chatbot-floating` on either side of this change.
1361
+ - 4ce14f1: One named, importable authoring-face type per `plugin-chatbot` registration:
1362
+ `ChatbotEnhancedSchema` and `ChatbotFloatingSchema` join `ChatbotSchema`
1363
+ (objectui#7655, under the objectui#6169 / #6172 family ruling — every component
1364
+ node has exactly one named, importable authoring-face type).
1365
+
1366
+ `packages/plugin-chatbot` registers three components — `chatbot`,
1367
+ `chatbot-enhanced`, `chatbot-floating` — and `@object-ui/types` published ONE
1368
+ face for the family with `type` pinned to `'chatbot'`. An author annotating a
1369
+ `chatbot-enhanced` or `chatbot-floating` node either dropped to untyped JSON or
1370
+ annotated with `ChatbotSchema` and lied about `type`; the docs' floating example
1371
+ had to be a `json` fence because no `tsx` fence could compile. The two
1372
+ registrations' real key sets lived in anonymous `ChatbotSchema & { ... }`
1373
+ intersections local to the renderer, referenceable by nothing outside that file.
1374
+
1375
+ ## The shape, and why not the smaller diff
1376
+
1377
+ One interface per registration, not `ChatbotSchema['type']` widened to the union
1378
+ of the three keys. The union would give three nodes ONE type and re-open what
1379
+ #6169 closed — a single interface declaring keys only some of its own `type`
1380
+ values read — and this card exists because the family's declarations had already
1381
+ drifted from its reads. Each face declares what ITS registration reads, censused
1382
+ per key on the PR's base (one `schema.KEY` read per registration body in
1383
+ `renderer.tsx`, lit by keys that are NOT shared: `processVisibility` 0 / 1 / 0,
1384
+ `floatingConfig` 0 / 0 / 1), and the twenty keys all three read are picked off
1385
+ `ChatbotSchema` by name (`ChatbotSharedKey`) so they stay one declaration:
1386
+
1387
+ - **`ChatbotEnhancedSchema`** (`type: 'chatbot-enhanced'`): the shared twenty,
1388
+ plus `maxHeight` and `processVisibility` (read here, not by the floating
1389
+ panel), plus `enableMarkdown`, `enableFileUpload`, `surface` (`'card' |
1390
+ 'plain'`, objectui#6687) and the `onClear` runtime slot — four keys
1391
+ `ChatbotSchema` never declared.
1392
+ - **`ChatbotFloatingSchema`** (`type: 'chatbot-floating'`): the shared twenty,
1393
+ plus `enableMarkdown`, `enableFileUpload`, `onClear`, and the two keys it
1394
+ declares alongside `ChatbotSchema` — `floatingConfig` (`FloatingChatbotConfig`)
1395
+ and `displayMode`. No `maxHeight`, `processVisibility` or `surface`: the
1396
+ floating registration has no named read for any of them. (At this change its
1397
+ trailing raw props spread still carried authored keys into the panel —
1398
+ `processVisibility`, `surface` and `showAvatars` were live there, measured
1399
+ through the real host — and this face neither declared nor promised that
1400
+ accidental channel, which was tracked on a card of its own. That card has since
1401
+ fenced the spread (`d3499b315`) the way the two sibling registrations do, so those three keys
1402
+ are dark on `chatbot-floating` now; no member this face declares depended on
1403
+ the channel.)
1404
+ - Neither face declares `ChatbotSchema`'s six legacy members (`loading`,
1405
+ `showAvatars`, `userAvatar`, `assistantAvatar`, `markdown`, `height`) — no
1406
+ registration reads them by name — and neither redeclares `disabled`, which
1407
+ stays `BaseSchema`'s `boolean | string` (`c93b4d5f3`).
1408
+
1409
+ **`ChatbotSchema` is unchanged.** It keeps `displayMode` and `floatingConfig`
1410
+ (declarations verbatim), and the floating face declares the same two, so
1411
+ `ChatbotSchema['displayMode']` and `ChatbotSchema['floatingConfig']` stay the
1412
+ typed members they were — the `a3eb5d07a` `triggerIcon` tombstone keeps its
1413
+ reach on `chatbot` nodes, now pinned on the node. `floatingConfig`'s doc comment
1414
+ is rewritten on both faces: the old text said it was "only used when
1415
+ `displayMode` is `'floating'`", which was false — it is read by `chatbot-floating`
1416
+ alone and forwarded to the panel. `displayMode` is RULED RETIRED — objectui#7654,
1417
+ maintainer ruling B (2026-09-05): `?: never` tombstone, designer control and
1418
+ `defaultProps` seed removed, in that card's own change. This change carries the
1419
+ key untouched on both faces (still unmirrored, still read by nothing) so that PR
1420
+ finds the member exactly as ruled, and a tripwire test pins that any value still
1421
+ parses green until that PR flips it.
1422
+
1423
+ **New published symbol:** `ChatbotSharedKey`, the string-literal union of the
1424
+ twenty keys all three registrations read. It is exported from `complex.ts`
1425
+ because an exported interface may not extend a `Pick` over a private name
1426
+ (TS4022), so it is emitted into `dist/complex.d.ts` and is reachable through the
1427
+ published `@object-ui/types/complex` subpath (it is not re-exported from the
1428
+ package entry). It is a census, not an authoring face.
1429
+
1430
+ ## Zod twins, in lockstep
1431
+
1432
+ `@object-ui/types/zod` gains `ChatbotEnhancedSchema` and `ChatbotFloatingSchema`
1433
+ (and `ComplexSchema` routes the two new discriminants). Every declared key is an
1434
+ arm except: the three runtime slots (`onError`, `onSend`, `onClear`), refused by
1435
+ name per objectui#6124; and, on the floating twin only, `floatingConfig` (no
1436
+ `FloatingChatbotConfig` mirror exists — minting one is objectui#6152's axis) and
1437
+ `displayMode` (unmirrored on `ChatbotSchema`'s twin too; retired by ruling on
1438
+ objectui#7654 and executed there). The twins mirror the API body params under the
1439
+ key the renderer reads, `requestBody`, and inherit `body` as the children slot —
1440
+ they do not copy `ChatbotSchema`'s `body` naming collision.
1441
+
1442
+ **Accept-set change, stated plainly:** a `chatbot-enhanced` or `chatbot-floating`
1443
+ document parsed through the family's only twin used to fail on `type`; through
1444
+ its own twin it now parses, and the keys the twin declares are VALIDATED where
1445
+ they rode through `.passthrough()` unexamined before (`surface: 'frameless'`,
1446
+ `enableMarkdown: 'yes'` and `requestBody: 'x'` are refused). A `chatbot` node's
1447
+ parse outcome is unchanged: `ChatbotSchema`'s twin did not move.
1448
+
1449
+ ## `@object-ui/plugin-chatbot`
1450
+
1451
+ The `chatbot-enhanced` and `chatbot-floating` registrations type `schema` as the
1452
+ published faces and drop the anonymous intersections. One consequence:
1453
+ `chatbot-floating` used to write `disabled={schema.disabled}` and then spread
1454
+ `{...props}` AFTER it — and `SchemaRenderer` always includes `disabled: verdict
1455
+ || undefined` in those props, so the raw read was overridden on every render.
1456
+ With `disabled` honestly typed as `boolean | string` the raw union cannot be
1457
+ forwarded into the panel's `boolean` prop, so the registration now names the
1458
+ host verdict (`disabled: hostDisabled`) the way its two siblings have since
1459
+ objectui#4431. No render outcome moves; the pin renders through the real host
1460
+ both ways.
1461
+
1462
+ This ships as `minor` for `@object-ui/types` because it widens the published
1463
+ surface with two new node types, two new Zod twins and one new type alias;
1464
+ `ChatbotSchema`'s own accept set does not move: objectui's major is pinned to `@objectstack`'s
1465
+ (`scripts/check-changeset-no-major.mjs`), and objectui's own contract changes
1466
+ ship as `minor` with the semantics spelled out — as above.
1467
+
1468
+ ⚠️ **Dated note, 2026-09-27 — the shared census is nineteen keys, not twenty — objectui#5605.**
1469
+ Later in this same release `maxToolRoundtrips` is retired behind a tombstone: no
1470
+ registration reads it, so it leaves `ChatbotSharedKey`, and `ChatbotSchema` declares it
1471
+ instead as a `?: never` member that the other two faces pick by name, refused by name on
1472
+ the zod twins. The "twenty keys" above is kept as the reading of this change; the
1473
+ objectui#5605 retirement entry states what the three faces declare now.
1474
+
1475
+ **Correction, 2026-09-30 (objectui#6152, round 4).** The "Zod twins" section above says the floating twin leaves `floatingConfig` unmirrored because no `FloatingChatbotConfig` mirror exists. That was true when this change was written, and it no longer is: objectui#6152 round 4 minted that mirror and declared `floatingConfig` on the `chatbot-floating` twin, judged member by member. The same round declared `requestBody` on `ChatbotSchema`'s twin, so all three chatbot twins now share one `requestBody` arm. `displayMode` stays unmirrored on both twins, as this entry says.
1476
+
1477
+ **Correction, 2026-10-01 (objectui#6152, round 5).** The section above says `ChatbotSchema` keeps `floatingConfig` as a typed member, so the `triggerIcon` tombstone reaches `chatbot` nodes. That is no longer true: objectui#6152 round 5 retired `ChatbotSchema.floatingConfig` on both faces, because the `chatbot` registration never read it. The member is a `?: never` tombstone on the TypeScript face and a named refusal on the zod twin, so a `chatbot` node refuses the whole key. `ChatbotFloatingSchema.floatingConfig` is unchanged; it never inherited the base member.
1478
+ - e627724: Merge an authored `className` into the floating chat panel instead of replacing it
1479
+ (objectui#8078).
1480
+
1481
+ `<FloatingChatbot>` ended its `<ChatbotEnhanced>` element with a bare
1482
+ `className="h-full border-0 rounded-none"` literal written **after**
1483
+ `{...chatbotProps}`. A later JSX prop always wins over an earlier spread, so the
1484
+ `className` a `chatbot-floating` node authored — correctly forwarded the whole way,
1485
+ since the registration destructures it as its own named prop — was silently
1486
+ replaced. It type-checked, it parsed, and it did nothing to the rendered panel:
1487
+ the styling escape hatch AGENTS.md #3 requires every widget to expose
1488
+ (*"Always expose `className` in schema props so users can override via JSON"*),
1489
+ exposed and inert. Every sibling in this package already merges through `cn()`.
1490
+
1491
+ The three classes are now the panel's **default** fit rather than its property:
1492
+ `cn("h-full border-0 rounded-none", chatbotProps.className)`. This repo's `cn` is
1493
+ `twMerge(clsx(...))`, so the last conflicting utility wins — an author who declares
1494
+ `rounded-xl` or `border-2` on a floating node now gets it, while an author who
1495
+ declares nothing about size still gets the borderless, square, container-filling
1496
+ inner surface the surrounding panel chrome expects. A node that authors no
1497
+ `className` renders exactly the class list it rendered before; that control is
1498
+ pinned beside the fix.
1499
+
1500
+ `maxHeight="100%"`, two lines up, has the identical shape and is **deliberately
1501
+ kept forced** rather than merged — a ruling, recorded in a comment at the line.
1502
+ `ChatbotFloatingSchema` does not declare `maxHeight` and the `chatbot-floating`
1503
+ registration forwards none (that authoring face says the key is "NOT declared, on
1504
+ purpose", for this very reason), so nothing authored is dropped there, while
1505
+ `<ChatbotEnhanced>`'s own `'500px'` default would cap the conversation well inside
1506
+ a panel that can be 800px tall — or the whole viewport in fullscreen.
1507
+
1508
+ The card recorded that it had measured the defect statically and "not yet confirmed
1509
+ through a live render". The pin added here is that render: a `chatbot-floating` node
1510
+ mounted through the real SDUI host, asserting on the rendered panel's own class list
1511
+ — red before the fix, green after, with the panel's own `h-full` still present beside
1512
+ the authored classes.
1513
+ - e5a28b9: A confirm-gate preview no longer counts as the commit that settles the card before it
1514
+ (objectui#8343).
1515
+
1516
+ `builtPlanIds` decided a proposed plan had been built from the tool NAME alone —
1517
+ `tool.toolName === 'apply_blueprint'`. On an iteration turn where the user did not say
1518
+ the magic phrase ("直接搭建" / "just build it"), `apply_blueprint` hits its own
1519
+ confirm gate and returns `{status:'awaiting_confirmation'}`: it built nothing and is
1520
+ itself waiting for the user. That still marked the earlier `propose_blueprint` card
1521
+ 已搭建, collapsing its "Build it" button into an inert badge — and the
1522
+ `apply_blueprint` card carries no button of its own, so the turn was left with **no
1523
+ confirm affordance at all** while the assistant's prose asked the user to confirm one.
1524
+ The only way forward was guessing "确认" into the composer.
1525
+
1526
+ A build now only counts when the invocation is not a confirm-gate preview
1527
+ (`!isProposalResult(tool.result)`) — the same fact the tool header already reads to say
1528
+ "Awaiting Approval". A still-running `apply_blueprint` (no result yet) keeps counting,
1529
+ so the objectui#432 guard against re-triggering an in-flight build is unchanged.
1530
+
1531
+ The sibling `confirmedChangeIds` memo carried the same defect one level down: it
1532
+ inferred "this later call committed" from the ABSENCE of a rich `proposedChanges` card,
1533
+ and that detector additionally requires ≥1 parseable change row — so a later same-tool
1534
+ call that WAS a preview but produced no card (an empty `changes: []`) silently settled
1535
+ the pending 确认修改 card. It now reads the preview fact directly too.
1536
+ - bddf1cf: Fold an authored `role: 'tool'` before it seeds the AI SDK store, instead of asserting
1537
+ it away (objectui#8443).
1538
+
1539
+ `useObjectChat`'s `aiInitialMessages` builder wrote `as 'user' | 'assistant' | 'system'`
1540
+ over the role at both of its arms. The authoring contract accepts `role: 'tool'`,
1541
+ `normalizeMessages` deliberately does not narrow it, and `renderer.tsx` passes
1542
+ `schema.messages` straight through as `initialMessages` — so in API mode the store was
1543
+ seeded with a value outside its own union, declared as one of three roles it was not.
1544
+
1545
+ Measured against the real `@ai-sdk/react` 4.0.68 / `ai` 7.0.65 before the change: the
1546
+ client store holds the out-of-union role verbatim — nothing recognises it, nothing
1547
+ renders it distinctly — and the SDK's own downstream entry points then reject it.
1548
+ `convertToModelMessages` throws `AI_MessageConversionError: Unsupported role: tool`, and
1549
+ `validateUIMessages` throws `AI_TypeValidationError` naming `["system","user","assistant"]`
1550
+ at `[0].role`. Both legs were read with an in-union control on the identical shape, which
1551
+ converted and validated cleanly.
1552
+
1553
+ Both arms now call `toRuntimeRole(...)` — the package's single expression of this fold
1554
+ and the named decision of objectui#4399, the same one the render seam already applies:
1555
+ `'tool'` renders as an assistant bubble. **Behaviour change on the API-mode leg**: an
1556
+ authored `'tool'` message now seeds the store as `'assistant'` rather than `'tool'`. Its
1557
+ content, parts and tool invocations are untouched, and the other three roles are
1558
+ unchanged — `'system'` in particular keeps its own role and its centred pill.
1559
+
1560
+ Local mode is deliberately unaffected: an authored `'tool'` role still reaches the hook's
1561
+ own `messages` surface unchanged and is folded only at the render seam, which is what
1562
+ `ObjectChatMessage` is a statement about.
1563
+
1564
+ Deleting the assertions also re-arms the compile-time tripwire the seam was built to
1565
+ provide — `chatMessageAdapter.ts` records that "a new authored `role` makes
1566
+ `toRuntimeRole` unassignable", and an `as` let a future role past these two lines
1567
+ silently.
1568
+ - a78cd37: Dates and numbers across the console and the plugins format in the session's
1569
+ display locale instead of the machine's (objectui#9909).
1570
+
1571
+ Every one of these faces handed `Intl` — directly, or through a formatter called
1572
+ without one — either no locale tag or an explicit `undefined`, which is not "the
1573
+ user's locale": it is the locale of the machine the browser runs on, which is
1574
+ neither of this repository's two locale channels.
1575
+ A German or Spanish session therefore read, beside a translated label, a date or
1576
+ an amount grouped and decimal-marked the machine's way — and an amount with
1577
+ inverted separators does not read as unformatted, it reads as a different
1578
+ number. They now go through `useDisplayLocale()` (tenant regional default, then
1579
+ the active UI language, then `'en'`), and a plain helper takes that tag from its
1580
+ caller. The surfaces:
1581
+
1582
+ - **`@object-ui/fields`** — `GridField`'s numeric and currency cells (list mode
1583
+ and computed columns) and both total cells. The same cell helper's date branch
1584
+ already used the display locale, so a single grid row read two conventions at
1585
+ once.
1586
+ - **`@object-ui/plugin-charts`** — ISO-date x-axis ticks, compact y-axis ticks,
1587
+ the single-value face, spec `format` strings and the tooltip value.
1588
+ - **`@object-ui/app-shell`** — the organization invitations, members and
1589
+ accept-invitation dates; marketplace version dates; the AI conversation row's
1590
+ older-than-a-week date and its tooltip; the build-debug token count; the
1591
+ record approvals timeline; and the metadata-admin audit, history, external
1592
+ datasource snapshot, schema-browser row estimate, flow-run start and job
1593
+ next-fire faces. The audit, history and flow-run panels format these in the
1594
+ DISPLAY locale, not in the `locale` prop they take for their UI strings
1595
+ (`AuditPanel` defaults that prop to `'en-US'`; `HistoryPanel` and
1596
+ `FlowRunsPanel` leave it optional).
1597
+ - **`@object-ui/console`** — the approvals inbox's timestamp tooltips, amounts
1598
+ and payload summary; the audit log's timestamp column; the flow runs table and
1599
+ its run detail.
1600
+ - **`@object-ui/components`** — the export dialog's record counts and the debug
1601
+ panel's event times.
1602
+ - **`@object-ui/plugin-form`** — the analytics submission count, the
1603
+ master-detail subtotal / tax / total stack and the edit-conflict dialog's
1604
+ "their save" time.
1605
+ - **`@object-ui/plugin-chatbot`** — the approvals inbox's past-30-days date and
1606
+ the times stamped on local-mode chat messages (the user's and the
1607
+ auto-response).
1608
+ - **`@object-ui/plugin-dashboard`** — the record-count badge, and the currency
1609
+ and date-format branches of `renderFieldValue`, which was handed the display
1610
+ locale and spent it only on its percent branch.
1611
+ - **`@object-ui/plugin-grid`** — the record-detail panel's inferred currency
1612
+ value and the mobile card's amount line, siblings of date cells already on the
1613
+ display locale.
1614
+ - **`@object-ui/plugin-designer`** — `VersionHistory`'s version times.
1615
+
1616
+ A host that mounts one of the components that newly read the display locale with
1617
+ NO `I18nProvider` now gets react-i18next's once-per-module `NO_I18NEXT_INSTANCE`
1618
+ notice in the console on the first such mount; the faces still render, in the
1619
+ channel's `'en'` last resort, and mounting an `I18nProvider` (as the console
1620
+ does) avoids the notice.
1621
+
1622
+ **Additive API** (nothing that compiled before stops compiling):
1623
+
1624
+ - `@object-ui/types`: `ValidationContext` gains an optional `locale`. At this
1625
+ change, the `@object-ui/core` validation engine prints the `date_min` /
1626
+ `date_max` bound in it; omitted, `Intl` follows the runtime default, as
1627
+ `formatDisplayNumber` already declares for a caller with no locale in hand.
1628
+
1629
+ ⚠️ **Dated note, 2026-09-25 — that engine (`ValidationEngine`) is removed from
1630
+ `@object-ui/core` by a later change; `ValidationContext.locale` stays declared in
1631
+ `@object-ui/types`, and at that change nothing in `@object-ui/core` reads it —
1632
+ objectui#7659.**
1633
+
1634
+ ⚠️ **Dated note, 2026-09-27 — `ValidationContext` itself is removed from
1635
+ `@object-ui/types` by a later change, with the rest of the Phase 3.5
1636
+ validation types it belonged to, so the `locale` member this entry adds no
1637
+ longer exists — objectui#10719.**
1638
+ - `@object-ui/plugin-report`: `exportReport`, `exportAsHTML` and `exportAsPDF`
1639
+ take a trailing optional `locale` for the exported file's "Generated:" time,
1640
+ and `LiveExportOptions` gains an optional `locale` that `exportWithLiveData`
1641
+ forwards. Omitted, the time uses the display channel's own last resort
1642
+ (`'en'`), never the machine's locale. `ReportViewer` passes the session's
1643
+ display locale. The locale is deliberately NOT a `ReportExportConfig` member:
1644
+ that type is authored report metadata, and a display locale belongs to the
1645
+ session.
1646
+
1647
+ **One census, repository-wide.** `plugin-detail`'s machine-locale census pin
1648
+ (objectui#9786) is now a single test, `machineLocaleCensus-9909.test.ts` in
1649
+ `@object-ui/i18n`, covering every workspace package whose manifest depends on
1650
+ `@object-ui/i18n`. It refuses any call site that passes nothing, `undefined`,
1651
+ the `'default'` pseudo-tag (a subtag no locale data answers, so `Intl` resolves
1652
+ it to the machine's locale) or a hard-coded tag, unless the site is declared
1653
+ with its reason — for example the `catch` fallback for a tag `Intl` itself
1654
+ rejected, or an ISO formatter feeding `<input type="date">`. Each declared site
1655
+ is counted exactly, so deleting one without its entry is refused too. The
1656
+ per-package pin it replaces is deleted. The runtime tripwire that observes the
1657
+ argument each locale-taking call (`Intl` constructors, `Date` and `Number`
1658
+ `toLocale*`) actually receives moved into the private `@object-ui/test-support`
1659
+ package, and every surface above is pinned with it: the same data under two
1660
+ declared locales must render differently, NO locale-taking call may receive the
1661
+ machine's locale (nothing, `undefined` or `'default'`), and the surface's own
1662
+ calls must receive the declared tag. A call carrying another declared tag, such
1663
+ as the `'en'` of the session's UI language, is tolerated by design: only the
1664
+ machine's locale is the defect.
1665
+ - 79a4b8f: Recognize the landed AI quota ledger vocabulary in the chat error path
1666
+
1667
+ `parseAiQuotaError` now accepts the three SCREAMING_SNAKE ledger codes the cloud
1668
+ token guardrail emits (`AI_ALLOWANCE_EXHAUSTED`, `AI_DESIGN_QUOTA_EXHAUSTED`,
1669
+ `AI_DATA_CHAT_TRIAL_EXHAUSTED`) alongside the legacy lowercase trio, which stays
1670
+ readable for producers that have not converged yet. The companion fields
1671
+ (`messageEn` / `upgrade` / `topUp` / `resetsTonight`) are now read from the
1672
+ declared envelope's `error.details` as well as their legacy top-level position,
1673
+ with the declared position winning.
1674
+
1675
+ A quota-exhausted user gets the upgrade / top-up CTA again instead of the
1676
+ generic "Response failed" banner. The per-turn message cap's generic
1677
+ `QUOTA_EXCEEDED` deliberately keeps its existing rate-limit path — it has no
1678
+ upgrade or top-up next step.
1679
+ - cc3366b: The built-moment transition (#5799) now fires on auto-publish environments too: `detectBuiltAppPackage` reads the raw build envelope (`status:'drafted'` OR `'published'`, packageId + an `app` item), because an auto-publish posture rewrites apply_blueprint's envelope to `published` and the drafted-only `draftReview` lift never fired there — measured live on staging, where reopening a built conversation stayed on the full page.
1680
+ - a31adc6: `useObjectChat` no longer rebuilds its `DefaultChatTransport` on every render
1681
+ (objectui#4187).
1682
+
1683
+ The transport `useMemo` listed the caller's `body` and `headers` in its dep list.
1684
+ Both are object props and every caller passes a fresh literal each render — the AI
1685
+ page's chat pane builds its `body.context` inline — so the memo never hit and a
1686
+ transport was constructed on every render of every chat surface, which during a
1687
+ streaming turn is once per token batch.
1688
+
1689
+ `body` and `headers` are now read through refs inside
1690
+ `prepareSendMessagesRequest`, the idiom this hook already uses for the live model
1691
+ (`modelRef`) and the handoff conversation id (`parentConvRef`), and they are gone
1692
+ from the dep list. Unlike memoizing at each call site, a future caller cannot
1693
+ undo it.
1694
+
1695
+ No user-visible behaviour changes: `@ai-sdk/react` keeps the transport in a ref
1696
+ and re-keys its `Chat` only on `chat`/`id` (verified against the installed
1697
+ 4.0.68), which `useObjectChat` passes neither of, so the message thread was never
1698
+ at risk — the rebuild was pure waste. The one real difference is *when* the two
1699
+ values are sampled: a send now reads them at send time, so it observes the values
1700
+ of the most recent render instead of those of the last render that happened to
1701
+ rebuild the transport. That is never staler than before, and it is pinned by
1702
+ `useObjectChat.transportIdentity.test.tsx`.
1703
+ - 8ea3bee: fix(plugin-chatbot): localize the build-progress panel, which was an English island (objectui#7388)
1704
+
1705
+ Every label the build panel is HANDED was already localized — the host passes
1706
+ `openBuiltAppLabel`, `designBuiltAppLabel`, `previewDraftLabel` and the three
1707
+ connection cues through its own `t()`. Every string the panel OWNED was a
1708
+ literal in the component, so a fully Chinese conversation watched its app get
1709
+ built under `Building your app…`, over `Objects` / `Views` / `Dashboards` /
1710
+ `App` / `Sample data` row headings — one per row, on every build — and a
1711
+ `+N more` overflow counter.
1712
+
1713
+ All of them now resolve through the console's pack as `chatbot.build.*`, added
1714
+ to all ten locales. Behaviour for a known phase is unchanged in English, and
1715
+ the unknown-artifact-type fallback still renders the raw type rather than a
1716
+ raw i18n key.
1717
+ - fb336df: Move `lucide-react` from `^1.31.0` to `^1.43.0` in every package that declares it, and
1718
+ repair what the jump breaks, so icons resolved from a STRING keep drawing a glyph.
1719
+
1720
+ Measured once against the installed 1.43.0 artifact when this change was made; nothing in
1721
+ the repository re-derives these readings. Across the jump lucide removes no runtime export,
1722
+ no public type name and no `lucide-react/dynamic.mjs` name, and every name this repository
1723
+ imports from `lucide-react` resolves. Exactly one key leaves the runtime `icons` record:
1724
+ `Trash2`, retired in favour of `trash`.
1725
+
1726
+ What a user sees change:
1727
+
1728
+ - Icons the lazy icon seam draws (`resolveIcon`, objectui#9251) get their path data again.
1729
+ lucide 1.43.0 icon modules export their path data inside `__iconData` and no longer
1730
+ export `__iconNode`; the seam now reads both. Reading only `__iconNode` against 1.43.0
1731
+ leaves every such glyph an empty box, with nothing thrown or logged.
1732
+ - `DetailView`'s delete action and three schema-catalog examples spell their icon
1733
+ `trash`, not `trash-2`, so they keep resolving. The glyph is unchanged: 1.43.0's `trash`
1734
+ path data is byte-identical to the `trash-2` path data of 1.31.0 and 1.35.0. Anything
1735
+ that already authored `trash` now draws that same artwork, because lucide moved it under
1736
+ the `trash` name; a few other glyphs were also redrawn upstream.
1737
+ - Icons imported as COMPONENTS carry lucide 1.43.0's own classes: one class per declared
1738
+ alias (a spinner renders `class="lucide lucide-loader-circle lucide-loader-2 ..."`), and
1739
+ no longer the class lucide used to derive from the PascalCase key where that differs
1740
+ (`ArrowDown01` no longer carries `lucide-arrow-down01`). The canonical
1741
+ `lucide-<icon name>` class is still there, so a `.lucide-loader-circle` selector still
1742
+ matches.
1743
+ - Icons resolved from a STRING through the seam keep the classes they had: `lucide`, the
1744
+ canonical `lucide-<icon name>` class and the key-derived class. They do not carry
1745
+ lucide's per-alias classes. That is a maintainer ruling (objectui#8941, option C): the
1746
+ alias list lives only inside each lazily loaded icon module, and it was not moved into
1747
+ the eager name list. A selector that targets an alias class matches a component-imported
1748
+ icon and not a string-resolved one. This also dates the example in the objectui#9251
1749
+ entry: `trash-2` no longer resolves as a string, so no seam-drawn glyph carries
1750
+ `lucide-trash2 lucide-trash-2`; a digit-bearing name that still resolves, such as
1751
+ `arrow-down-0-1`, carries `lucide-arrow-down01 lucide-arrow-down-0-1`.
1752
+ - 0fce2ef: `maxToolRoundtrips` on `ChatbotSchema` is deprecated: it is inert, and an author
1753
+ who sets it is now told so instead of being left believing the documented cap
1754
+ applies (objectui#5605).
1755
+
1756
+ The key was declared authorable in `@object-ui/types` (interface and zod, with a
1757
+ description), threaded from the authored document through the chatbot renderer at
1758
+ three call sites, accepted by `useObjectChat`, given a default — and then dropped.
1759
+ Measuring the installed chat runtime says it cannot be honoured from here rather
1760
+ than that someone forgot to wire it: `@ai-sdk/react`'s `useChat` takes `ChatInit`
1761
+ plus throttle/resume, and `ChatInit` declares exactly one loop control — the
1762
+ boolean predicate `sendAutomaticallyWhen` — and no numeric cap under any
1763
+ spelling. The numeric knob was removed from `useChat` in a major, and its
1764
+ successor was renamed through `continueUntil` to `stopWhen` / `stepCountIs`,
1765
+ which the installed `ai` package declares only on `generateText`, `streamText`
1766
+ and the tool-loop agent settings — all server-side. ObjectUI is backend-agnostic,
1767
+ so it owns no server loop to cap either, and putting the number in the request
1768
+ body would only move the same dead key one hop onto a wire contract no backend
1769
+ reads.
1770
+
1771
+ This is stage one of a two-stage retirement, so nothing an author already wrote
1772
+ breaks: the key still parses, still carries its declared shape, and the renderer
1773
+ still threads it. What changes is that it is now marked `@deprecated` in the
1774
+ interface, the zod description and the docs, and that authoring it logs a
1775
+ one-time notice naming the knob that does work — `planning.maxIterations` on the
1776
+ agent. A follow-up removes the declaration once this deprecation has shipped in a
1777
+ release.
1778
+
1779
+ ⚠️ **Dated note, 2026-09-27 — the key is retired behind a tombstone, not staged for removal — objectui#5605.**
1780
+ This deprecation never shipped: it was still a pending changeset when the seat ruled
1781
+ arm A on the card, so no release carries the "deprecated, still accepted" state this entry
1782
+ describes. Later in this same release `maxToolRoundtrips` is refused by name on all three
1783
+ chat nodes, the one-time notice and the renderer pass-throughs are gone, and the key is no
1784
+ longer an option of `useObjectChat`. The rest of this entry is kept as the reading of this
1785
+ change; the objectui#5605 retirement entry states what an author gets now.
1786
+ - a392e1c: 「打开这条记录 →」卡片——ask 的记录交接终于有了客户端的另一半
1787
+
1788
+ 服务端半边(cloud#1659 的 `open_record`)先落了地,实测发现它是**半活的**:agent 发出
1789
+ `status:'record_handoff'`、回答说「点击上方链接打开」,而上方根本没有链接——控制台
1790
+ 有 `build_handoff` 的探测器,这个状态一处都不认识,信号被原样丢弃。
1791
+
1792
+ 按五步补齐:`detectRecordHandoff`(含持久化 `{type:'text',value}` 包裹形状——replay
1793
+ 信封那课的规矩)→ live 映射提升 → 水合提升 → 卡片渲染 → 宿主回调。
1794
+
1795
+ 两个设计点:
1796
+
1797
+ - **app 段点击时现场解析**。记录路由要 `/apps/:app/:object/record/:id`,交接载荷只有
1798
+ 对象和记录 id;宿主回调用一次同源元数据读取 `_packageId` 再导航,不给 agent 增加
1799
+ 它未必知道的参数。
1800
+ - **刻意不做「被取代」置灰**。builder 卡的旧 prompt 会过时,旧的记录链接不会——记录
1801
+ 不因为有新交接而失效。
1802
+
1803
+ 真机闭环验证:问「把《沉默的大多数》标记成已读」→ 卡片渲染
1804
+ (`沉默的大多数 — 把阅读状态改为已读`)→ 点击 → 落在
1805
+ `/apps/app.hdke/hdke_book/record/<id>` 详情页,「编辑」在手边。
1806
+
1807
+ 缺任一 id 的交接在探测器就被丢弃,与服务端的拒绝对称——指向空处的卡片比散文更糟。
1808
+ - ad404e0: Confirm-replay dispatch errors (bare `{error: …}` envelopes) now resolve the 确认修改 card instead of leaving it on 应用中 forever: `detectReplayOutcome` classifies them as a provisional failure, and a later successful authoring result in the same turn (the model self-repairing, e.g. after an `object not found` on a blueprint-local name) supersedes it via `detectAuthoringVerdict` — so the card never says 未生效 over a change that actually landed. Real publish failures (`publishFailed` envelopes) are never superseded. Measured live on the local rig, 2026-08-24.
1809
+ - eddc1dd: The Studio copilot tells the agent WHAT the user is discussing (cloud#1610 send half): `ChatPane` accepts a `surfaceContext` and sends it as `context.surface` on every turn (the transport reads the body per send, so it stays fresh); the Studio copilot derives it from the URL alone — the `:tab` pillar segment plus the `?surface=type:name` deep-link the pillars already mirror, so the artifact carries its type discriminator (page/object/dashboard/report). A display chip above the composer (「正在讨论:…」, new `console.ai.discussing` key in all ten packs) makes the sent context visible instead of invisible grounding.
1810
+ - 9a9977c: 工具卡片的名字终于有了 i18n 通道(此前中文界面里必然是英文)
1811
+
1812
+ 实测(cloud#1658,全中文环境):
1813
+
1814
+ ```
1815
+ 统计一下每个阅读状态各有多少本书
1816
+ Describe object 已完成 执行过程 ← 工具名英文
1817
+ Visualize data 已完成 执行过程 ← 工具名英文
1818
+ 已统计完成,各阅读状态的书本数量如下:… ← 其余全中文
1819
+ ```
1820
+
1821
+ 卡片上每一处都本地化了——状态、动作、回答——**唯独工具名不能**,因为
1822
+ `humanizeToolName` 是个纯英文构词器(`describe_object` → `Describe object`),
1823
+ 名字从未经过翻译,任何语言包都够不着它。而"它现在在做什么"恰恰是用户最需要读懂的一步。
1824
+
1825
+ 现在它接受一个可选的 `translate`(形状即 `useSafeTranslate()`),按
1826
+ `chatbot.tool.<tool_name>` 查;查不到就回落到与今天完全一致的英文标题。
1827
+
1828
+ **这一步只打通通道,不改变任何现有显示**:不传 translate 时行为逐字不变(测试的第一组
1829
+ 就在钉这一点),语言包也还没有条目。后续两件事各自独立、可分别推进:
1830
+ 把两个调用点接上 `useSafeTranslate()`;以及按需往语言包里补 `chatbot.tool.*`。
1831
+ 先落通道是因为——在通道存在之前,翻译工作根本无处可放。
1832
+
1833
+ 回落刻意交给英文标题而非原始名:语言包缺条目时显示 `Describe object`(与今天相同),
1834
+ 而不是 `describe_object`(比今天更差)。
1835
+ - Updated dependencies [7b10bef]
1836
+ - Updated dependencies [97abedc]
1837
+ - Updated dependencies [b46c58f]
1838
+ - Updated dependencies [a507334]
1839
+ - Updated dependencies [ad694ac]
1840
+ - Updated dependencies [6f96fca]
1841
+ - Updated dependencies [afb2284]
1842
+ - Updated dependencies [3ac2de8]
1843
+ - Updated dependencies [0aacecc]
1844
+ - Updated dependencies [63f4f92]
1845
+ - Updated dependencies [777fca2]
1846
+ - Updated dependencies [c131d9e]
1847
+ - Updated dependencies [5f00ff4]
1848
+ - Updated dependencies [c9e073a]
1849
+ - Updated dependencies [7b395d8]
1850
+ - Updated dependencies [0879812]
1851
+ - Updated dependencies [8cedb0d]
1852
+ - Updated dependencies [162621b]
1853
+ - Updated dependencies [4c6f549]
1854
+ - Updated dependencies [6cc910b]
1855
+ - Updated dependencies [061f5e8]
1856
+ - Updated dependencies [2dd4d3f]
1857
+ - Updated dependencies [e686f4d]
1858
+ - Updated dependencies [4ab4f1b]
1859
+ - Updated dependencies [b57107d]
1860
+ - Updated dependencies [e3ea4f9]
1861
+ - Updated dependencies [bb5d4ee]
1862
+ - Updated dependencies [dc666f7]
1863
+ - Updated dependencies [3335767]
1864
+ - Updated dependencies [8b1f066]
1865
+ - Updated dependencies [af243c1]
1866
+ - Updated dependencies [cff4b77]
1867
+ - Updated dependencies [961ceaa]
1868
+ - Updated dependencies [f3f4e4c]
1869
+ - Updated dependencies [a05c350]
1870
+ - Updated dependencies [1dbb993]
1871
+ - Updated dependencies [2b5f509]
1872
+ - Updated dependencies [808f339]
1873
+ - Updated dependencies [6cf5999]
1874
+ - Updated dependencies [274e14a]
1875
+ - Updated dependencies [8c10f4f]
1876
+ - Updated dependencies [90dac98]
1877
+ - Updated dependencies [6096f20]
1878
+ - Updated dependencies [544aca2]
1879
+ - Updated dependencies [ea02938]
1880
+ - Updated dependencies [a14fb23]
1881
+ - Updated dependencies [ae98f1d]
1882
+ - Updated dependencies [f98eddf]
1883
+ - Updated dependencies [ce6bd99]
1884
+ - Updated dependencies [a5b08c9]
1885
+ - Updated dependencies [86982ac]
1886
+ - Updated dependencies [cdefa2a]
1887
+ - Updated dependencies [0961d5e]
1888
+ - Updated dependencies [6276478]
1889
+ - Updated dependencies [5e67837]
1890
+ - Updated dependencies [ff14e29]
1891
+ - Updated dependencies [9b28151]
1892
+ - Updated dependencies [64563a9]
1893
+ - Updated dependencies [1a5003f]
1894
+ - Updated dependencies [09ab32b]
1895
+ - Updated dependencies [8acc51b]
1896
+ - Updated dependencies [ea9d17f]
1897
+ - Updated dependencies [45362a3]
1898
+ - Updated dependencies [2a943bf]
1899
+ - Updated dependencies [93a689d]
1900
+ - Updated dependencies [4357a27]
1901
+ - Updated dependencies [e5f4343]
1902
+ - Updated dependencies [3261e64]
1903
+ - Updated dependencies [f5178a2]
1904
+ - Updated dependencies [2ad3671]
1905
+ - Updated dependencies [8740e86]
1906
+ - Updated dependencies [d22b37b]
1907
+ - Updated dependencies [1daf477]
1908
+ - Updated dependencies [3d614ea]
1909
+ - Updated dependencies [6c2f3c5]
1910
+ - Updated dependencies [fb13e85]
1911
+ - Updated dependencies [c2d8659]
1912
+ - Updated dependencies [e0f8202]
1913
+ - Updated dependencies [ac2d6f1]
1914
+ - Updated dependencies [9fbbb17]
1915
+ - Updated dependencies [c3a26cc]
1916
+ - Updated dependencies [a66e58e]
1917
+ - Updated dependencies [d89492c]
1918
+ - Updated dependencies [9a5f998]
1919
+ - Updated dependencies [9327397]
1920
+ - Updated dependencies [17cc3a3]
1921
+ - Updated dependencies [02e6d36]
1922
+ - Updated dependencies [4758b33]
1923
+ - Updated dependencies [4758b33]
1924
+ - Updated dependencies [f905090]
1925
+ - Updated dependencies [9c78ebe]
1926
+ - Updated dependencies [9c78ebe]
1927
+ - Updated dependencies [12809a5]
1928
+ - Updated dependencies [7afc81d]
1929
+ - Updated dependencies [f9c06ef]
1930
+ - Updated dependencies [5ad3b88]
1931
+ - Updated dependencies [f9d772b]
1932
+ - Updated dependencies [97b6c21]
1933
+ - Updated dependencies [26ca2ad]
1934
+ - Updated dependencies [41ae65b]
1935
+ - Updated dependencies [baac95a]
1936
+ - Updated dependencies [13220af]
1937
+ - Updated dependencies [29b45f6]
1938
+ - Updated dependencies [39b8d51]
1939
+ - Updated dependencies [17b323e]
1940
+ - Updated dependencies [b956e69]
1941
+ - Updated dependencies [33e58d8]
1942
+ - Updated dependencies [256b4c9]
1943
+ - Updated dependencies [c5ec15c]
1944
+ - Updated dependencies [fec3b1a]
1945
+ - Updated dependencies [b8e0941]
1946
+ - Updated dependencies [0c50f18]
1947
+ - Updated dependencies [1dae95a]
1948
+ - Updated dependencies [e32dae1]
1949
+ - Updated dependencies [30b11ad]
1950
+ - Updated dependencies [4aebea0]
1951
+ - Updated dependencies [f976774]
1952
+ - Updated dependencies [3d6badf]
1953
+ - Updated dependencies [25cb364]
1954
+ - Updated dependencies [a60539b]
1955
+ - Updated dependencies [de1b879]
1956
+ - Updated dependencies [c6678b1]
1957
+ - Updated dependencies [0638322]
1958
+ - Updated dependencies [e3782d2]
1959
+ - Updated dependencies [db0beb2]
1960
+ - Updated dependencies [997ce38]
1961
+ - Updated dependencies [ae0b9d3]
1962
+ - Updated dependencies [ad1785c]
1963
+ - Updated dependencies [3b469c8]
1964
+ - Updated dependencies [990a2d6]
1965
+ - Updated dependencies [1c84036]
1966
+ - Updated dependencies [1c84036]
1967
+ - Updated dependencies [6650259]
1968
+ - Updated dependencies [4f8b7f8]
1969
+ - Updated dependencies [9e6619f]
1970
+ - Updated dependencies [f6ae5e2]
1971
+ - Updated dependencies [eb97ce6]
1972
+ - Updated dependencies [7343376]
1973
+ - Updated dependencies [b2683a2]
1974
+ - Updated dependencies [dded788]
1975
+ - Updated dependencies [b45d463]
1976
+ - Updated dependencies [54a7830]
1977
+ - Updated dependencies [f3135a4]
1978
+ - Updated dependencies [b5696d3]
1979
+ - Updated dependencies [3f9d926]
1980
+ - Updated dependencies [e978ed5]
1981
+ - Updated dependencies [6a7f24e]
1982
+ - Updated dependencies [b3c96d6]
1983
+ - Updated dependencies [8d0ca91]
1984
+ - Updated dependencies [c30c8dd]
1985
+ - Updated dependencies [244d516]
1986
+ - Updated dependencies [deca847]
1987
+ - Updated dependencies [ac15833]
1988
+ - Updated dependencies [ac15833]
1989
+ - Updated dependencies [e2dffc9]
1990
+ - Updated dependencies [328abeb]
1991
+ - Updated dependencies [dd0d78f]
1992
+ - Updated dependencies [24d3e65]
1993
+ - Updated dependencies [95a7c8d]
1994
+ - Updated dependencies [e227156]
1995
+ - Updated dependencies [cc4e476]
1996
+ - Updated dependencies [92970c4]
1997
+ - Updated dependencies [d570eaa]
1998
+ - Updated dependencies [4b742f4]
1999
+ - Updated dependencies [42687ba]
2000
+ - Updated dependencies [6cd8f66]
2001
+ - Updated dependencies [24a0f14]
2002
+ - Updated dependencies [797a30f]
2003
+ - Updated dependencies [b4075c0]
2004
+ - Updated dependencies [9b85600]
2005
+ - Updated dependencies [e327c89]
2006
+ - Updated dependencies [2eaf5be]
2007
+ - Updated dependencies [bf7ab35]
2008
+ - Updated dependencies [99878d8]
2009
+ - Updated dependencies [3c13675]
2010
+ - Updated dependencies [63ab761]
2011
+ - Updated dependencies [0eb9f36]
2012
+ - Updated dependencies [ae582b7]
2013
+ - Updated dependencies [51c2949]
2014
+ - Updated dependencies [a4b017e]
2015
+ - Updated dependencies [8732846]
2016
+ - Updated dependencies [559a2e2]
2017
+ - Updated dependencies [db11afd]
2018
+ - Updated dependencies [154075a]
2019
+ - Updated dependencies [582edef]
2020
+ - Updated dependencies [19f484f]
2021
+ - Updated dependencies [0a78a20]
2022
+ - Updated dependencies [615346d]
2023
+ - Updated dependencies [75dcc81]
2024
+ - Updated dependencies [55a12a8]
2025
+ - Updated dependencies [edfcf5a]
2026
+ - Updated dependencies [0a3e540]
2027
+ - Updated dependencies [c021b35]
2028
+ - Updated dependencies [f61dab1]
2029
+ - Updated dependencies [b0a05dd]
2030
+ - Updated dependencies [dd5ff19]
2031
+ - Updated dependencies [54997ff]
2032
+ - Updated dependencies [81f8498]
2033
+ - Updated dependencies [a782fa7]
2034
+ - Updated dependencies [1d6a23d]
2035
+ - Updated dependencies [0645133]
2036
+ - Updated dependencies [76e9df0]
2037
+ - Updated dependencies [0ecaa7d]
2038
+ - Updated dependencies [b24f93a]
2039
+ - Updated dependencies [6158e4c]
2040
+ - Updated dependencies [cff8641]
2041
+ - Updated dependencies [c27b575]
2042
+ - Updated dependencies [84b275c]
2043
+ - Updated dependencies [0e6e76b]
2044
+ - Updated dependencies [bf43afa]
2045
+ - Updated dependencies [385ebc5]
2046
+ - Updated dependencies [858eafb]
2047
+ - Updated dependencies [a8c5509]
2048
+ - Updated dependencies [c2a8d23]
2049
+ - Updated dependencies [0ffc423]
2050
+ - Updated dependencies [3cc4fe5]
2051
+ - Updated dependencies [cd5b19a]
2052
+ - Updated dependencies [cd5b19a]
2053
+ - Updated dependencies [17dc167]
2054
+ - Updated dependencies [20d23be]
2055
+ - Updated dependencies [20d23be]
2056
+ - Updated dependencies [2e3da72]
2057
+ - Updated dependencies [1263e40]
2058
+ - Updated dependencies [e6bc087]
2059
+ - Updated dependencies [9419df1]
2060
+ - Updated dependencies [8bab157]
2061
+ - Updated dependencies [a7557a7]
2062
+ - Updated dependencies [7d074ba]
2063
+ - Updated dependencies [6158e4c]
2064
+ - Updated dependencies [6158e4c]
2065
+ - Updated dependencies [52aad5c]
2066
+ - Updated dependencies [18d1a0a]
2067
+ - Updated dependencies [7fed09d]
2068
+ - Updated dependencies [58da8ae]
2069
+ - Updated dependencies [a8b9889]
2070
+ - Updated dependencies [138ad45]
2071
+ - Updated dependencies [138ad45]
2072
+ - Updated dependencies [5262f7d]
2073
+ - Updated dependencies [6aa029b]
2074
+ - Updated dependencies [2124d04]
2075
+ - Updated dependencies [be52115]
2076
+ - Updated dependencies [770cc5b]
2077
+ - Updated dependencies [1a88ce2]
2078
+ - Updated dependencies [a1a44d6]
2079
+ - Updated dependencies [e0a9c67]
2080
+ - Updated dependencies [5638529]
2081
+ - Updated dependencies [5638529]
2082
+ - Updated dependencies [d0fba91]
2083
+ - Updated dependencies [c476be0]
2084
+ - Updated dependencies [c82ff39]
2085
+ - Updated dependencies [6c3da53]
2086
+ - Updated dependencies [31987bd]
2087
+ - Updated dependencies [3c3ce15]
2088
+ - Updated dependencies [063119f]
2089
+ - Updated dependencies [e100589]
2090
+ - Updated dependencies [304f611]
2091
+ - Updated dependencies [e46ee77]
2092
+ - Updated dependencies [f9c8c4e]
2093
+ - Updated dependencies [6e9c8d2]
2094
+ - Updated dependencies [9547063]
2095
+ - Updated dependencies [3f6efd6]
2096
+ - Updated dependencies [55d18c6]
2097
+ - Updated dependencies [c4ab6d0]
2098
+ - Updated dependencies [0e9058b]
2099
+ - Updated dependencies [c4ab6d0]
2100
+ - Updated dependencies [5988b6b]
2101
+ - Updated dependencies [6158e4c]
2102
+ - Updated dependencies [00ccdf7]
2103
+ - Updated dependencies [9d9ed54]
2104
+ - Updated dependencies [4a1adb7]
2105
+ - Updated dependencies [4a1adb7]
2106
+ - Updated dependencies [50c73fe]
2107
+ - Updated dependencies [ca3de72]
2108
+ - Updated dependencies [83e3f83]
2109
+ - Updated dependencies [401611b]
2110
+ - Updated dependencies [2c0ddf2]
2111
+ - Updated dependencies [4abc0aa]
2112
+ - Updated dependencies [f560ded]
2113
+ - Updated dependencies [2b188fa]
2114
+ - Updated dependencies [b654d4e]
2115
+ - Updated dependencies [f68e0a0]
2116
+ - Updated dependencies [aea682a]
2117
+ - Updated dependencies [fcdc8ec]
2118
+ - Updated dependencies [2d576e4]
2119
+ - Updated dependencies [8366acc]
2120
+ - Updated dependencies [95e58a3]
2121
+ - Updated dependencies [9d7419b]
2122
+ - Updated dependencies [fc7db05]
2123
+ - Updated dependencies [9ed8d0f]
2124
+ - Updated dependencies [c73cdb5]
2125
+ - Updated dependencies [6f5719e]
2126
+ - Updated dependencies [d0097af]
2127
+ - Updated dependencies [432882b]
2128
+ - Updated dependencies [64dae8e]
2129
+ - Updated dependencies [b06e374]
2130
+ - Updated dependencies [06a8af5]
2131
+ - Updated dependencies [6a91586]
2132
+ - Updated dependencies [a04d7c6]
2133
+ - Updated dependencies [5ccc500]
2134
+ - Updated dependencies [f3c2bb0]
2135
+ - Updated dependencies [978507b]
2136
+ - Updated dependencies [778138e]
2137
+ - Updated dependencies [9801765]
2138
+ - Updated dependencies [9cebfca]
2139
+ - Updated dependencies [460575f]
2140
+ - Updated dependencies [d796c8d]
2141
+ - Updated dependencies [594704f]
2142
+ - Updated dependencies [d3995fe]
2143
+ - Updated dependencies [1b1d772]
2144
+ - Updated dependencies [d88e20f]
2145
+ - Updated dependencies [2d7304d]
2146
+ - Updated dependencies [636b236]
2147
+ - Updated dependencies [4172589]
2148
+ - Updated dependencies [d6d8fb9]
2149
+ - Updated dependencies [64d624d]
2150
+ - Updated dependencies [053fdc8]
2151
+ - Updated dependencies [41b7ce3]
2152
+ - Updated dependencies [ae476b8]
2153
+ - Updated dependencies [39f4309]
2154
+ - Updated dependencies [95bad12]
2155
+ - Updated dependencies [d2fb6ef]
2156
+ - Updated dependencies [7cd3987]
2157
+ - Updated dependencies [ee3b878]
2158
+ - Updated dependencies [e304a4e]
2159
+ - Updated dependencies [fda49e5]
2160
+ - Updated dependencies [490d9a9]
2161
+ - Updated dependencies [fc62bb4]
2162
+ - Updated dependencies [41df893]
2163
+ - Updated dependencies [0cba1b7]
2164
+ - Updated dependencies [00f3eb5]
2165
+ - Updated dependencies [1ec291c]
2166
+ - Updated dependencies [453dbaa]
2167
+ - Updated dependencies [95f8704]
2168
+ - Updated dependencies [f8cdbf2]
2169
+ - Updated dependencies [69a2163]
2170
+ - Updated dependencies [24e027e]
2171
+ - Updated dependencies [2c3cd1b]
2172
+ - Updated dependencies [e176053]
2173
+ - Updated dependencies [e30ed15]
2174
+ - Updated dependencies [90665e0]
2175
+ - Updated dependencies [8d3a529]
2176
+ - Updated dependencies [5ac2e2c]
2177
+ - Updated dependencies [194fae1]
2178
+ - Updated dependencies [7e19d03]
2179
+ - Updated dependencies [b08b7eb]
2180
+ - Updated dependencies [1e946c9]
2181
+ - Updated dependencies [546ddf7]
2182
+ - Updated dependencies [864154e]
2183
+ - Updated dependencies [b023625]
2184
+ - Updated dependencies [75bd83d]
2185
+ - Updated dependencies [44d075b]
2186
+ - Updated dependencies [40c479a]
2187
+ - Updated dependencies [971d387]
2188
+ - Updated dependencies [ee851c3]
2189
+ - Updated dependencies [6414dfd]
2190
+ - Updated dependencies [a8d5c71]
2191
+ - Updated dependencies [905b21f]
2192
+ - Updated dependencies [88e9109]
2193
+ - Updated dependencies [2c45966]
2194
+ - Updated dependencies [db3a600]
2195
+ - Updated dependencies [3a3db76]
2196
+ - Updated dependencies [0d723a3]
2197
+ - Updated dependencies [0c95d3d]
2198
+ - Updated dependencies [3e4fa2c]
2199
+ - Updated dependencies [b5b928a]
2200
+ - Updated dependencies [6fd2cf7]
2201
+ - Updated dependencies [5fa06c4]
2202
+ - Updated dependencies [52a43de]
2203
+ - Updated dependencies [195052f]
2204
+ - Updated dependencies [e4559d1]
2205
+ - Updated dependencies [2c71482]
2206
+ - Updated dependencies [129bcc5]
2207
+ - Updated dependencies [a26b9e4]
2208
+ - Updated dependencies [5ef9c4f]
2209
+ - Updated dependencies [46f0bb4]
2210
+ - Updated dependencies [06b82b8]
2211
+ - Updated dependencies [8ec11e1]
2212
+ - Updated dependencies [6f81384]
2213
+ - Updated dependencies [22ba927]
2214
+ - Updated dependencies [f8c70f4]
2215
+ - Updated dependencies [5d3a2d1]
2216
+ - Updated dependencies [8f1d995]
2217
+ - Updated dependencies [b362c1b]
2218
+ - Updated dependencies [f9c34df]
2219
+ - Updated dependencies [dddb942]
2220
+ - Updated dependencies [00c665e]
2221
+ - Updated dependencies [29754cf]
2222
+ - Updated dependencies [d7de534]
2223
+ - Updated dependencies [3c2b6f7]
2224
+ - Updated dependencies [6e88630]
2225
+ - Updated dependencies [b84dc18]
2226
+ - Updated dependencies [ac8abb0]
2227
+ - Updated dependencies [9d86e1d]
2228
+ - Updated dependencies [3a5817f]
2229
+ - Updated dependencies [99a3c2d]
2230
+ - Updated dependencies [5961030]
2231
+ - Updated dependencies [f24de8b]
2232
+ - Updated dependencies [c8ea8af]
2233
+ - Updated dependencies [9602dc8]
2234
+ - Updated dependencies [3190414]
2235
+ - Updated dependencies [4e480f5]
2236
+ - Updated dependencies [38a123c]
2237
+ - Updated dependencies [299102e]
2238
+ - Updated dependencies [30c73cd]
2239
+ - Updated dependencies [830ed58]
2240
+ - Updated dependencies [d7acad6]
2241
+ - Updated dependencies [45a9aeb]
2242
+ - Updated dependencies [713db46]
2243
+ - Updated dependencies [c71e14d]
2244
+ - Updated dependencies [bf3a03c]
2245
+ - Updated dependencies [cb55718]
2246
+ - Updated dependencies [748494b]
2247
+ - Updated dependencies [5967be0]
2248
+ - Updated dependencies [831be72]
2249
+ - Updated dependencies [29cb85b]
2250
+ - Updated dependencies [3e028c8]
2251
+ - Updated dependencies [d0889e2]
2252
+ - Updated dependencies [ce503e5]
2253
+ - Updated dependencies [f20dcf0]
2254
+ - Updated dependencies [12402a9]
2255
+ - Updated dependencies [aff3d7a]
2256
+ - Updated dependencies [4ca30d0]
2257
+ - Updated dependencies [7a5da14]
2258
+ - Updated dependencies [fff9645]
2259
+ - Updated dependencies [9c3b7ce]
2260
+ - Updated dependencies [2c1c967]
2261
+ - Updated dependencies [9486ac6]
2262
+ - Updated dependencies [9486ac6]
2263
+ - Updated dependencies [4d5f9b4]
2264
+ - Updated dependencies [d6ceb8d]
2265
+ - Updated dependencies [dc4365c]
2266
+ - Updated dependencies [e321d52]
2267
+ - Updated dependencies [969ba84]
2268
+ - Updated dependencies [4c68077]
2269
+ - Updated dependencies [7977ff9]
2270
+ - Updated dependencies [3beef6d]
2271
+ - Updated dependencies [06b8c42]
2272
+ - Updated dependencies [46b9bc9]
2273
+ - Updated dependencies [b97790a]
2274
+ - Updated dependencies [dbd5194]
2275
+ - Updated dependencies [7c9b044]
2276
+ - Updated dependencies [d47de51]
2277
+ - Updated dependencies [3fe6463]
2278
+ - Updated dependencies [b392674]
2279
+ - Updated dependencies [4f3a1e2]
2280
+ - Updated dependencies [31ab372]
2281
+ - Updated dependencies [846889b]
2282
+ - Updated dependencies [2acd8e1]
2283
+ - Updated dependencies [26896c6]
2284
+ - Updated dependencies [67fc3b0]
2285
+ - Updated dependencies [33a3b3c]
2286
+ - Updated dependencies [b87f15b]
2287
+ - Updated dependencies [045d20b]
2288
+ - Updated dependencies [a2d2515]
2289
+ - Updated dependencies [c18d099]
2290
+ - Updated dependencies [adb2a86]
2291
+ - Updated dependencies [03380aa]
2292
+ - Updated dependencies [4562ea5]
2293
+ - Updated dependencies [3619792]
2294
+ - Updated dependencies [3561bd2]
2295
+ - Updated dependencies [bf97b98]
2296
+ - Updated dependencies [320374d]
2297
+ - Updated dependencies [b0d308d]
2298
+ - Updated dependencies [40f34b4]
2299
+ - Updated dependencies [8063bcb]
2300
+ - Updated dependencies [b74a859]
2301
+ - Updated dependencies [d4493fd]
2302
+ - Updated dependencies [240b80f]
2303
+ - Updated dependencies [77cb489]
2304
+ - Updated dependencies [bfaa158]
2305
+ - Updated dependencies [777e5c6]
2306
+ - Updated dependencies [0c386dd]
2307
+ - Updated dependencies [9e37d9b]
2308
+ - Updated dependencies [5ad86dd]
2309
+ - Updated dependencies [16a725f]
2310
+ - Updated dependencies [4dfdcc3]
2311
+ - Updated dependencies [6a449fc]
2312
+ - Updated dependencies [446d93d]
2313
+ - Updated dependencies [ecd9cb2]
2314
+ - Updated dependencies [98d4108]
2315
+ - Updated dependencies [0e3b3be]
2316
+ - Updated dependencies [a29ae2d]
2317
+ - Updated dependencies [220c18d]
2318
+ - Updated dependencies [00d3f09]
2319
+ - Updated dependencies [4388f71]
2320
+ - Updated dependencies [0b1ac58]
2321
+ - Updated dependencies [c93b4d5]
2322
+ - Updated dependencies [c1fe272]
2323
+ - Updated dependencies [3cab570]
2324
+ - Updated dependencies [8ad218d]
2325
+ - Updated dependencies [3e41187]
2326
+ - Updated dependencies [5f78953]
2327
+ - Updated dependencies [639114c]
2328
+ - Updated dependencies [639114c]
2329
+ - Updated dependencies [1490691]
2330
+ - Updated dependencies [1f31d3a]
2331
+ - Updated dependencies [d1842ab]
2332
+ - Updated dependencies [78ca238]
2333
+ - Updated dependencies [d8ec8d6]
2334
+ - Updated dependencies [351eb31]
2335
+ - Updated dependencies [866cd1d]
2336
+ - Updated dependencies [20c04b2]
2337
+ - Updated dependencies [01c9023]
2338
+ - Updated dependencies [48c19bd]
2339
+ - Updated dependencies [a6d8b8d]
2340
+ - Updated dependencies [4b5bb95]
2341
+ - Updated dependencies [b652514]
2342
+ - Updated dependencies [adbda1b]
2343
+ - Updated dependencies [adbda1b]
2344
+ - Updated dependencies [8952395]
2345
+ - Updated dependencies [e2b3826]
2346
+ - Updated dependencies [0348bc9]
2347
+ - Updated dependencies [e8c553b]
2348
+ - Updated dependencies [2e32ed4]
2349
+ - Updated dependencies [3ed3eec]
2350
+ - Updated dependencies [7c3df8f]
2351
+ - Updated dependencies [a4514e8]
2352
+ - Updated dependencies [db3896c]
2353
+ - Updated dependencies [b9f5ff1]
2354
+ - Updated dependencies [e75f4c9]
2355
+ - Updated dependencies [19f1639]
2356
+ - Updated dependencies [4704aa4]
2357
+ - Updated dependencies [47547d0]
2358
+ - Updated dependencies [1bee5d0]
2359
+ - Updated dependencies [858cd72]
2360
+ - Updated dependencies [cfc9b6d]
2361
+ - Updated dependencies [554f2b6]
2362
+ - Updated dependencies [72f55c9]
2363
+ - Updated dependencies [26e06d7]
2364
+ - Updated dependencies [669d71b]
2365
+ - Updated dependencies [ed27d7c]
2366
+ - Updated dependencies [52c8cf7]
2367
+ - Updated dependencies [2ceb43a]
2368
+ - Updated dependencies [7cdd2b9]
2369
+ - Updated dependencies [52c8cf7]
2370
+ - Updated dependencies [3399704]
2371
+ - Updated dependencies [71a4a53]
2372
+ - Updated dependencies [7bf244b]
2373
+ - Updated dependencies [f0bb9fa]
2374
+ - Updated dependencies [81a2eb1]
2375
+ - Updated dependencies [caa0cd3]
2376
+ - Updated dependencies [caa0cd3]
2377
+ - Updated dependencies [20cb8db]
2378
+ - Updated dependencies [25c7d58]
2379
+ - Updated dependencies [00d2fa6]
2380
+ - Updated dependencies [77b2a18]
2381
+ - Updated dependencies [c6198c2]
2382
+ - Updated dependencies [721d1e0]
2383
+ - Updated dependencies [c2f0f48]
2384
+ - Updated dependencies [1237ae4]
2385
+ - Updated dependencies [2f61238]
2386
+ - Updated dependencies [51eb515]
2387
+ - Updated dependencies [c354ce5]
2388
+ - Updated dependencies [8fe8e5c]
2389
+ - Updated dependencies [feac439]
2390
+ - Updated dependencies [9ae871d]
2391
+ - Updated dependencies [efbd566]
2392
+ - Updated dependencies [2a5bf45]
2393
+ - Updated dependencies [9587fc9]
2394
+ - Updated dependencies [e62c44e]
2395
+ - Updated dependencies [daf9d57]
2396
+ - Updated dependencies [23b9958]
2397
+ - Updated dependencies [c15d7ec]
2398
+ - Updated dependencies [5d0876c]
2399
+ - Updated dependencies [f7ace0a]
2400
+ - Updated dependencies [b041b9c]
2401
+ - Updated dependencies [ce2aaef]
2402
+ - Updated dependencies [544ecba]
2403
+ - Updated dependencies [2ce2612]
2404
+ - Updated dependencies [bc640ec]
2405
+ - Updated dependencies [1e215c4]
2406
+ - Updated dependencies [da6e191]
2407
+ - Updated dependencies [3e377c9]
2408
+ - Updated dependencies [a3eb5d0]
2409
+ - Updated dependencies [4ce14f1]
2410
+ - Updated dependencies [aef97e5]
2411
+ - Updated dependencies [2af1fa7]
2412
+ - Updated dependencies [c14d3a0]
2413
+ - Updated dependencies [a137d0c]
2414
+ - Updated dependencies [caf477f]
2415
+ - Updated dependencies [f6375da]
2416
+ - Updated dependencies [967e5d8]
2417
+ - Updated dependencies [c907a9c]
2418
+ - Updated dependencies [a4611b3]
2419
+ - Updated dependencies [20316ba]
2420
+ - Updated dependencies [d3499b3]
2421
+ - Updated dependencies [91f9276]
2422
+ - Updated dependencies [309c75e]
2423
+ - Updated dependencies [c9f9bae]
2424
+ - Updated dependencies [18897a4]
2425
+ - Updated dependencies [8b7ea39]
2426
+ - Updated dependencies [a915064]
2427
+ - Updated dependencies [dcbf0b2]
2428
+ - Updated dependencies [52cac38]
2429
+ - Updated dependencies [93fea2e]
2430
+ - Updated dependencies [1422a92]
2431
+ - Updated dependencies [d05fe17]
2432
+ - Updated dependencies [a480f79]
2433
+ - Updated dependencies [f08d1a8]
2434
+ - Updated dependencies [64a252d]
2435
+ - Updated dependencies [786bc91]
2436
+ - Updated dependencies [75fca96]
2437
+ - Updated dependencies [7ca6ddd]
2438
+ - Updated dependencies [f1cd290]
2439
+ - Updated dependencies [5a41ce7]
2440
+ - Updated dependencies [8d50bc2]
2441
+ - Updated dependencies [604476d]
2442
+ - Updated dependencies [d1bebb0]
2443
+ - Updated dependencies [95bf128]
2444
+ - Updated dependencies [335abea]
2445
+ - Updated dependencies [edea22a]
2446
+ - Updated dependencies [0f5cadf]
2447
+ - Updated dependencies [4f9f1ee]
2448
+ - Updated dependencies [66e8b2a]
2449
+ - Updated dependencies [aa083cd]
2450
+ - Updated dependencies [12b5992]
2451
+ - Updated dependencies [b93e245]
2452
+ - Updated dependencies [c842594]
2453
+ - Updated dependencies [290de37]
2454
+ - Updated dependencies [e1c27e4]
2455
+ - Updated dependencies [8c8da45]
2456
+ - Updated dependencies [8cd8eb5]
2457
+ - Updated dependencies [cf1d29e]
2458
+ - Updated dependencies [1bd79c8]
2459
+ - Updated dependencies [af9e957]
2460
+ - Updated dependencies [b1030c7]
2461
+ - Updated dependencies [c974edf]
2462
+ - Updated dependencies [ad852b6]
2463
+ - Updated dependencies [6778809]
2464
+ - Updated dependencies [7fb22a1]
2465
+ - Updated dependencies [ad66d79]
2466
+ - Updated dependencies [0758bd8]
2467
+ - Updated dependencies [ee4d19f]
2468
+ - Updated dependencies [496d31d]
2469
+ - Updated dependencies [0ea7054]
2470
+ - Updated dependencies [9a853f2]
2471
+ - Updated dependencies [cb847fd]
2472
+ - Updated dependencies [ee70287]
2473
+ - Updated dependencies [3e98e13]
2474
+ - Updated dependencies [a695f50]
2475
+ - Updated dependencies [fc32921]
2476
+ - Updated dependencies [4eaa835]
2477
+ - Updated dependencies [8f9d87a]
2478
+ - Updated dependencies [b1777ae]
2479
+ - Updated dependencies [24845c4]
2480
+ - Updated dependencies [6f864cf]
2481
+ - Updated dependencies [24d1edd]
2482
+ - Updated dependencies [645087c]
2483
+ - Updated dependencies [33f4a19]
2484
+ - Updated dependencies [6e9a3d4]
2485
+ - Updated dependencies [4a292d2]
2486
+ - Updated dependencies [5323168]
2487
+ - Updated dependencies [841dd2b]
2488
+ - Updated dependencies [3014fc0]
2489
+ - Updated dependencies [dacb402]
2490
+ - Updated dependencies [846cec0]
2491
+ - Updated dependencies [91facae]
2492
+ - Updated dependencies [b38014e]
2493
+ - Updated dependencies [474797d]
2494
+ - Updated dependencies [704e695]
2495
+ - Updated dependencies [a407bd6]
2496
+ - Updated dependencies [317dbce]
2497
+ - Updated dependencies [309728c]
2498
+ - Updated dependencies [aa08d7e]
2499
+ - Updated dependencies [3a43a15]
2500
+ - Updated dependencies [868e825]
2501
+ - Updated dependencies [f76f436]
2502
+ - Updated dependencies [ce45a03]
2503
+ - Updated dependencies [421544b]
2504
+ - Updated dependencies [fb01022]
2505
+ - Updated dependencies [e9d9212]
2506
+ - Updated dependencies [ecfb693]
2507
+ - Updated dependencies [abc1b18]
2508
+ - Updated dependencies [81a51db]
2509
+ - Updated dependencies [67749c7]
2510
+ - Updated dependencies [507b61b]
2511
+ - Updated dependencies [512c84b]
2512
+ - Updated dependencies [c300267]
2513
+ - Updated dependencies [fb3a101]
2514
+ - Updated dependencies [d4733f2]
2515
+ - Updated dependencies [7c9145f]
2516
+ - Updated dependencies [1570eac]
2517
+ - Updated dependencies [f391ede]
2518
+ - Updated dependencies [f5cfbbd]
2519
+ - Updated dependencies [f5cfbbd]
2520
+ - Updated dependencies [8b532cb]
2521
+ - Updated dependencies [64c3cdd]
2522
+ - Updated dependencies [4d65991]
2523
+ - Updated dependencies [c42554e]
2524
+ - Updated dependencies [555b4ec]
2525
+ - Updated dependencies [1ccfc23]
2526
+ - Updated dependencies [542718f]
2527
+ - Updated dependencies [7f27bc5]
2528
+ - Updated dependencies [0a174f3]
2529
+ - Updated dependencies [676f677]
2530
+ - Updated dependencies [f95b140]
2531
+ - Updated dependencies [541ce4e]
2532
+ - Updated dependencies [6479086]
2533
+ - Updated dependencies [d79f525]
2534
+ - Updated dependencies [d1865d2]
2535
+ - Updated dependencies [55ba3ff]
2536
+ - Updated dependencies [f1190b0]
2537
+ - Updated dependencies [561abef]
2538
+ - Updated dependencies [ef52001]
2539
+ - Updated dependencies [6a4680b]
2540
+ - Updated dependencies [c3a4273]
2541
+ - Updated dependencies [abf710d]
2542
+ - Updated dependencies [093af32]
2543
+ - Updated dependencies [1bd1be7]
2544
+ - Updated dependencies [d234fa9]
2545
+ - Updated dependencies [adf5812]
2546
+ - Updated dependencies [e36acd4]
2547
+ - Updated dependencies [5058336]
2548
+ - Updated dependencies [2f6b2bf]
2549
+ - Updated dependencies [2028b31]
2550
+ - Updated dependencies [63601ab]
2551
+ - Updated dependencies [c372b29]
2552
+ - Updated dependencies [152f0a7]
2553
+ - Updated dependencies [8693b85]
2554
+ - Updated dependencies [e82dad1]
2555
+ - Updated dependencies [58b7b3d]
2556
+ - Updated dependencies [84defab]
2557
+ - Updated dependencies [681d3f1]
2558
+ - Updated dependencies [969d4f2]
2559
+ - Updated dependencies [f3bc481]
2560
+ - Updated dependencies [b79aac2]
2561
+ - Updated dependencies [93fc0e7]
2562
+ - Updated dependencies [a4b723f]
2563
+ - Updated dependencies [2b10ca0]
2564
+ - Updated dependencies [7db4a81]
2565
+ - Updated dependencies [19a0b0e]
2566
+ - Updated dependencies [526fc11]
2567
+ - Updated dependencies [f8e3e9a]
2568
+ - Updated dependencies [b9d47ec]
2569
+ - Updated dependencies [3b6bc69]
2570
+ - Updated dependencies [6214db6]
2571
+ - Updated dependencies [6732df4]
2572
+ - Updated dependencies [fe9e0d0]
2573
+ - Updated dependencies [63fb72c]
2574
+ - Updated dependencies [804831c]
2575
+ - Updated dependencies [279e48e]
2576
+ - Updated dependencies [8700d6d]
2577
+ - Updated dependencies [8db2a0f]
2578
+ - Updated dependencies [689953a]
2579
+ - Updated dependencies [30443fb]
2580
+ - Updated dependencies [8d3dbb2]
2581
+ - Updated dependencies [efc1c9c]
2582
+ - Updated dependencies [da45e6b]
2583
+ - Updated dependencies [7533465]
2584
+ - Updated dependencies [835f0f3]
2585
+ - Updated dependencies [a9d97be]
2586
+ - Updated dependencies [ed35b44]
2587
+ - Updated dependencies [9ba7e9c]
2588
+ - Updated dependencies [729e851]
2589
+ - Updated dependencies [96919a4]
2590
+ - Updated dependencies [345e24a]
2591
+ - Updated dependencies [20b507a]
2592
+ - Updated dependencies [2e471dc]
2593
+ - Updated dependencies [6748587]
2594
+ - Updated dependencies [be50942]
2595
+ - Updated dependencies [775e079]
2596
+ - Updated dependencies [7e8b3c0]
2597
+ - Updated dependencies [53374dc]
2598
+ - Updated dependencies [f6fb83f]
2599
+ - Updated dependencies [2049b03]
2600
+ - Updated dependencies [2bf34f7]
2601
+ - Updated dependencies [15b33ae]
2602
+ - Updated dependencies [7cbc724]
2603
+ - Updated dependencies [7098eed]
2604
+ - Updated dependencies [3df7c5c]
2605
+ - Updated dependencies [fb91ac9]
2606
+ - Updated dependencies [fb91ac9]
2607
+ - Updated dependencies [641fb55]
2608
+ - Updated dependencies [8524372]
2609
+ - Updated dependencies [7cbefa5]
2610
+ - Updated dependencies [72d6587]
2611
+ - Updated dependencies [a272a4f]
2612
+ - Updated dependencies [55f39ee]
2613
+ - Updated dependencies [0ce32d5]
2614
+ - Updated dependencies [0970a0e]
2615
+ - Updated dependencies [e427e9c]
2616
+ - Updated dependencies [bbc9dc3]
2617
+ - Updated dependencies [02f1813]
2618
+ - Updated dependencies [1ef89c0]
2619
+ - Updated dependencies [ba0b61a]
2620
+ - Updated dependencies [ba0b61a]
2621
+ - Updated dependencies [ac716ff]
2622
+ - Updated dependencies [f0f3cd5]
2623
+ - Updated dependencies [ab856ed]
2624
+ - Updated dependencies [20f3e65]
2625
+ - Updated dependencies [bbba098]
2626
+ - Updated dependencies [87af769]
2627
+ - Updated dependencies [3be720e]
2628
+ - Updated dependencies [43c0d17]
2629
+ - Updated dependencies [c3df43a]
2630
+ - Updated dependencies [d16d0e9]
2631
+ - Updated dependencies [bbe57fd]
2632
+ - Updated dependencies [272a530]
2633
+ - Updated dependencies [1779e8d]
2634
+ - Updated dependencies [f7fcc2c]
2635
+ - Updated dependencies [f0f4d6c]
2636
+ - Updated dependencies [4128188]
2637
+ - Updated dependencies [b253c4e]
2638
+ - Updated dependencies [78a9c67]
2639
+ - Updated dependencies [4a7ef0d]
2640
+ - Updated dependencies [4598f6d]
2641
+ - Updated dependencies [dea17b4]
2642
+ - Updated dependencies [89bb77a]
2643
+ - Updated dependencies [06611e4]
2644
+ - Updated dependencies [44152c4]
2645
+ - Updated dependencies [3939545]
2646
+ - Updated dependencies [66abbde]
2647
+ - Updated dependencies [dc3893d]
2648
+ - Updated dependencies [1bbaa16]
2649
+ - Updated dependencies [6ee259a]
2650
+ - Updated dependencies [7649f43]
2651
+ - Updated dependencies [e708426]
2652
+ - Updated dependencies [3b6d53b]
2653
+ - Updated dependencies [276d174]
2654
+ - Updated dependencies [2982ed9]
2655
+ - Updated dependencies [a8198de]
2656
+ - Updated dependencies [0c789a4]
2657
+ - Updated dependencies [05a49f2]
2658
+ - Updated dependencies [b234a84]
2659
+ - Updated dependencies [a78cd37]
2660
+ - Updated dependencies [5ea623e]
2661
+ - Updated dependencies [5eabe86]
2662
+ - Updated dependencies [ca5d671]
2663
+ - Updated dependencies [32bf2d6]
2664
+ - Updated dependencies [ff0c384]
2665
+ - Updated dependencies [af4fb29]
2666
+ - Updated dependencies [c698a81]
2667
+ - Updated dependencies [ff5ef1c]
2668
+ - Updated dependencies [befd40c]
2669
+ - Updated dependencies [9a97800]
2670
+ - Updated dependencies [6bca0e4]
2671
+ - Updated dependencies [81c0bc4]
2672
+ - Updated dependencies [3c76801]
2673
+ - Updated dependencies [60500cb]
2674
+ - Updated dependencies [2fcefb9]
2675
+ - Updated dependencies [77f846a]
2676
+ - Updated dependencies [bc5870c]
2677
+ - Updated dependencies [b55a346]
2678
+ - Updated dependencies [065bba7]
2679
+ - Updated dependencies [f760064]
2680
+ - Updated dependencies [dd19463]
2681
+ - Updated dependencies [6791717]
2682
+ - Updated dependencies [8ea3bee]
2683
+ - Updated dependencies [100547e]
2684
+ - Updated dependencies [3a58149]
2685
+ - Updated dependencies [6d1c155]
2686
+ - Updated dependencies [d7573b3]
2687
+ - Updated dependencies [bf3edfe]
2688
+ - Updated dependencies [2c8474c]
2689
+ - Updated dependencies [6ce89da]
2690
+ - Updated dependencies [0e05aac]
2691
+ - Updated dependencies [ae61ad4]
2692
+ - Updated dependencies [5aed9e4]
2693
+ - Updated dependencies [83c77dc]
2694
+ - Updated dependencies [18a8e7d]
2695
+ - Updated dependencies [e7957ab]
2696
+ - Updated dependencies [f7e34ca]
2697
+ - Updated dependencies [e719ebd]
2698
+ - Updated dependencies [516583b]
2699
+ - Updated dependencies [f9e4f91]
2700
+ - Updated dependencies [6ef48b1]
2701
+ - Updated dependencies [fa429cf]
2702
+ - Updated dependencies [ed8df3e]
2703
+ - Updated dependencies [fe76ece]
2704
+ - Updated dependencies [8b446f5]
2705
+ - Updated dependencies [8e74b27]
2706
+ - Updated dependencies [7102b20]
2707
+ - Updated dependencies [8ebd57f]
2708
+ - Updated dependencies [617707a]
2709
+ - Updated dependencies [c40f3b8]
2710
+ - Updated dependencies [58770f3]
2711
+ - Updated dependencies [aefe428]
2712
+ - Updated dependencies [485f096]
2713
+ - Updated dependencies [7357447]
2714
+ - Updated dependencies [199d31b]
2715
+ - Updated dependencies [b655a9d]
2716
+ - Updated dependencies [3e01cb5]
2717
+ - Updated dependencies [7138bc1]
2718
+ - Updated dependencies [cef27e2]
2719
+ - Updated dependencies [4e8622b]
2720
+ - Updated dependencies [dffd752]
2721
+ - Updated dependencies [06973aa]
2722
+ - Updated dependencies [50798f3]
2723
+ - Updated dependencies [6a576c9]
2724
+ - Updated dependencies [105f3c5]
2725
+ - Updated dependencies [3ccd9e8]
2726
+ - Updated dependencies [689b979]
2727
+ - Updated dependencies [c70f865]
2728
+ - Updated dependencies [e546222]
2729
+ - Updated dependencies [fd13f52]
2730
+ - Updated dependencies [d7bd274]
2731
+ - Updated dependencies [98c3a74]
2732
+ - Updated dependencies [fffa30d]
2733
+ - Updated dependencies [ebce5a3]
2734
+ - Updated dependencies [fb336df]
2735
+ - Updated dependencies [9d9040d]
2736
+ - Updated dependencies [20e317c]
2737
+ - Updated dependencies [0fce2ef]
2738
+ - Updated dependencies [42df928]
2739
+ - Updated dependencies [0e2ddd4]
2740
+ - Updated dependencies [b7479ab]
2741
+ - Updated dependencies [9850c6e]
2742
+ - Updated dependencies [de570cc]
2743
+ - Updated dependencies [b2ea297]
2744
+ - Updated dependencies [5b5a5c3]
2745
+ - Updated dependencies [14582b8]
2746
+ - Updated dependencies [51e144e]
2747
+ - Updated dependencies [19cbf10]
2748
+ - Updated dependencies [ab92940]
2749
+ - Updated dependencies [a691c0b]
2750
+ - Updated dependencies [0b1326d]
2751
+ - Updated dependencies [1e66879]
2752
+ - Updated dependencies [c5200f0]
2753
+ - Updated dependencies [af3861f]
2754
+ - Updated dependencies [515f171]
2755
+ - Updated dependencies [1f4e029]
2756
+ - Updated dependencies [4f14ad7]
2757
+ - Updated dependencies [258d264]
2758
+ - Updated dependencies [cac64b3]
2759
+ - Updated dependencies [8033ad1]
2760
+ - Updated dependencies [fa140b8]
2761
+ - Updated dependencies [71cba28]
2762
+ - Updated dependencies [190fbd0]
2763
+ - Updated dependencies [c00bf28]
2764
+ - Updated dependencies [93127bd]
2765
+ - Updated dependencies [f2158ec]
2766
+ - Updated dependencies [759606e]
2767
+ - Updated dependencies [fd8dace]
2768
+ - Updated dependencies [72ffc34]
2769
+ - Updated dependencies [a51fa0c]
2770
+ - Updated dependencies [51f3d8d]
2771
+ - Updated dependencies [bf28341]
2772
+ - Updated dependencies [78cbdb5]
2773
+ - Updated dependencies [b7543a9]
2774
+ - Updated dependencies [6c6cee7]
2775
+ - Updated dependencies [42887e0]
2776
+ - Updated dependencies [83fe6e7]
2777
+ - Updated dependencies [d1ab06f]
2778
+ - Updated dependencies [38a9568]
2779
+ - Updated dependencies [f90b8fb]
2780
+ - Updated dependencies [91783c4]
2781
+ - Updated dependencies [982885d]
2782
+ - Updated dependencies [dba7d84]
2783
+ - Updated dependencies [ca39427]
2784
+ - Updated dependencies [bd09957]
2785
+ - Updated dependencies [5a07e67]
2786
+ - Updated dependencies [2d36552]
2787
+ - Updated dependencies [45d8288]
2788
+ - Updated dependencies [b2437a7]
2789
+ - Updated dependencies [f157423]
2790
+ - Updated dependencies [7a90afd]
2791
+ - Updated dependencies [eddc1dd]
2792
+ - Updated dependencies [490f482]
2793
+ - Updated dependencies [27308c5]
2794
+ - Updated dependencies [8689166]
2795
+ - Updated dependencies [c9327c9]
2796
+ - Updated dependencies [920165d]
2797
+ - Updated dependencies [9101be5]
2798
+ - Updated dependencies [f53a8d0]
2799
+ - Updated dependencies [968dc1e]
2800
+ - Updated dependencies [57f9b07]
2801
+ - Updated dependencies [3c73d99]
2802
+ - Updated dependencies [d91aed9]
2803
+ - Updated dependencies [ed71d9e]
2804
+ - Updated dependencies [7776fc2]
2805
+ - Updated dependencies [e76634c]
2806
+ - Updated dependencies [c86185e]
2807
+ - Updated dependencies [fb96ecb]
2808
+ - Updated dependencies [1170ed1]
2809
+ - Updated dependencies [92814db]
2810
+ - Updated dependencies [4d73b07]
2811
+ - @object-ui/react@17.7.0
2812
+ - @object-ui/core@17.7.0
2813
+ - @object-ui/types@17.7.0
2814
+ - @object-ui/i18n@17.7.0
2815
+ - @object-ui/components@17.7.0
2816
+
3
2817
  ## 17.6.0
4
2818
 
5
2819
  ### Patch Changes