-
59db1f9: chore(lint): clear the baseline lint errors in plugin-chatbot (objectui#2713 Wave 3)
Wave 3 of the #2713 lint-gate restoration.
@object-ui/plugin-chatbotwas red at baseline onmain; cleared every error (no behavior change; warnings out of scope):react-hooks/rules-of-hooksinuseObjectChat(8) — the hook called DIFFERENTuseCallbacks in each of its twoisApiModereturn branches, so both sets were conditional (React throws if the mode toggles between renders).useChatwas already called unconditionally; this destructures its result and hoists all eight callbacks (3 API + 5 local) above theisApiModebranch, so the same hooks run in the same order every render. Only the returned surface differs by mode — the callback bodies are unchanged (the APImessageslocal is renamedapiMessages). Verified against theuseObjectChat.sendFailure/handoffContext/ChatbotEnhanced.sendErrorsuites.react-hooks/rules-of-hooksinFloatingChatbotTrigger—useChatbotLabelwrapped the provider-safeuseObjectTranslationin try/catch; removed the wrapper (the #2709 fix).react-hooks/static-componentsinshimmer—motion.create(Component)genuinely builds a motion component and must key off theasprop, so it can't be module-scoped. Memoized perComponent(stable across renders, avoids the remount) and carries a justified scoped disable at the render site.
-
Updated dependencies [1c8935a]
-
Updated dependencies [8b8b744]
-
Updated dependencies [7cf4051]
-
Updated dependencies [803558e]
-
Updated dependencies [2e7d7f0]
-
Updated dependencies [ef14f69]
-
Updated dependencies [94d4876]
-
Updated dependencies [69fa5d1]
-
Updated dependencies [549c67d]
-
Updated dependencies [2b17339]
-
Updated dependencies [31b77d4]
-
Updated dependencies [6d4fbe6]
-
Updated dependencies [0a3710b]
-
Updated dependencies [62b9ab5]
-
Updated dependencies [1629313]
-
Updated dependencies [29c6040]
-
Updated dependencies [faebac3]
-
Updated dependencies [2331ac9]
-
Updated dependencies [199fa83]
-
Updated dependencies [eee4ded]
- @object-ui/core@16.1.0
- @object-ui/types@16.1.0
- @object-ui/react@16.1.0
- @object-ui/components@16.1.0
- c0bd483: Plan-card approval gives immediate in-card feedback (#2627): clicking
"Build it" flips the clicked card to a spinning "Building…" badge right away
(the approval's chat-level effects land at the bottom of the thread, outside
the viewport, so the card looked untouched for ~10s and users double-clicked).
The durable Built state still derives from the message stream; an approval
that never left the client (rate limit / offline) rolls the badge back so the
button returns. New
planBuildingLabelprop (AiChatPage passes zh). - Updated dependencies [d3e19ed]
- Updated dependencies [59d4fa9]
- Updated dependencies [4c7c47f]
- Updated dependencies [210806a]
- Updated dependencies [b4ef588]
- Updated dependencies [5534535]
- Updated dependencies [9b8f978]
- Updated dependencies [195a651]
- Updated dependencies [33b4995]
- @object-ui/react@16.0.0
- @object-ui/components@16.0.0
- @object-ui/types@16.0.0
- @object-ui/core@16.0.0
- @object-ui/types@15.0.0
- @object-ui/core@15.0.0
- @object-ui/react@15.0.0
- @object-ui/components@15.0.0
-
82441e4: feat(console-ai): proactive AI usage indicator in the ChatDock (ADR-0057 #8)
Surfaces remaining AI headroom before a send hits the 429 wall, instead of only learning the limit reactively.
- AiUsageIndicator — two meters (build + dataChat) as small progress rings in the ChatDock header (desktop rail + mobile sheet). Near-full → an amber "running low" hint and a popover with "resets tonight / next cycle" plus the upgrade / top-up CTA (reusing the 429 deep-link). D5-safe: fractions and qualitative words only, never a token number. Hides itself when the usage endpoint is absent (older backend / OSS / no seat).
- useAiUsage — fetches the D5-safe per-meter fractions; refetches on the chat engine's post-turn / 429 nudge and on tab re-focus; fails soft to nothing.
- useObjectChat emits
AI_USAGE_REFRESH_EVENTon a rejected send (429) and on the turn-finish edge so the ring updates right after the user's action. - i18n:
console.ai.usage.*in en + zh-CN.
Consumes the cloud
GET /api/v1/ai/usageendpoint (objectstack-ai/cloud#824). -
Updated dependencies [0890fa7]
-
Updated dependencies [2ded18c]
-
Updated dependencies [e628d1f]
-
Updated dependencies [5523fc4]
-
Updated dependencies [887062c]
-
Updated dependencies [055e1d2]
-
Updated dependencies [9e2d58f]
-
Updated dependencies [dea65f7]
-
Updated dependencies [f30ff68]
-
Updated dependencies [073e7aa]
-
Updated dependencies [6c0135c]
-
Updated dependencies [5b52624]
-
Updated dependencies [4afb251]
-
Updated dependencies [d5b1bc0]
-
Updated dependencies [f94905d]
-
Updated dependencies [f0f10f5]
- @object-ui/core@14.1.0
- @object-ui/types@14.1.0
- @object-ui/react@14.1.0
- @object-ui/components@14.1.0
-
7b4fc36: feat(console-ai): ask→build handoff carries conversation context (ADR-0057 P4 / cloud#817)
The P4 "Open in Builder →" handoff previously carried only the build prompt + an optional package, so the Builder started cold and the user re-explained themselves. It now also carries the source
askconversation as context — ADR-0057 P4 / cloud#817 — so the build agent's first turn starts with the thread the user already had.@object-ui/app-shell: both handoff sites (the full-pageAiChatPageand the console FAB) now append?parentConversationId=<ask thread id>to the/ai/buildURL. The build surface reads it and forwards it touseObjectChat; the existing URL-mirror drops it once the build conversation id is minted, so a reload never re-carries it.@object-ui/plugin-chatbot:useObjectChatacceptsparentConversationIdand sends it ascontext.parentConversationIdon the first turn only (held in a ref, consumed once) — the backend redeems it into the turn's context and the client owns history from there. New pure helperwithHandoffContext(unit tested) does the non-mutatingcontextmerge.
Requires the cloud handoff-context contract (service-ai, cloud#817): the build agent redeems
context.parentConversationIdinto a single system block on its first turn — ownership-checked, and carrying only the user/assistant text the user already saw (ADR-0063 governance boundary). Without it the console degrades cleanly: the id is sent but ignored, and the handoff is a (working) cold start. -
7dea792: feat(console-ai): explicit "Open in Builder →" ask→build handoff (ADR-0057 P4)
When the
askagent declines an app-authoring request it now calls the cloudsuggest_buildertool (structured decline). The console renders that as an explicit "Open in Builder →" action that opens the full-page build surface seeded with the handoff prompt — ADR-0063 decline-and-redirect: an explicit, user-initiated switch, never a silent re-route into authoring.@object-ui/plugin-chatbot:detectBuilderHandofflifts the{ status:'build_handoff', prompt, packageId? }result onto the tool invocation;ChatbotEnhancedrenders the "Open in Builder →" card and calls a newonOpenBuilderprop (disabled when no host wires it).@object-ui/app-shell: the full-pageAiChatPage(ask) and the console FAB wireonOpenBuilderto navigate to/ai/build?package=…&handoffPrompt=…; the build surface seeds that prompt as its first message (auto-sent once the conversation is minted), and the URL-mirror strips?handoffPromptso a reload never re-sends it. Full ask-conversation context transfer is a later upgrade (cloud#817); v1 carries the build prompt + optional package.
Requires the cloud
suggest_buildersignal (service-ai-studio) to light up; the console degrades cleanly (no card) without it. -
9d0fdb1: feat(console-ai): render agent behavior by declared capability (cloud#816 / ADR-0057 "B+")
GET /api/v1/ai/agentsnow serves per-agentcapabilities; the console consumes them instead of hard-codingisBuildAgent(name):@object-ui/plugin-chatbot:AgentDescriptor.capabilities(normalized from the catalog) + newagentHasCapability(agents, name, cap)— declaration wins when present; falls back to the legacyisBuildAgent(name)check when absent (older server), so shipping order doesn't matter.@object-ui/app-shell: the build-doctor drawer +showDebugkey off'debug', the FAB's resume-vs-fresh keys off'resume', HomePage's "Build with AI" availability keys off'authoring'. The ADR-0063 product-axis sites (surface→agent resolver, conversation scope keying, picker availability) intentionally stay name-based — capability describes RENDERED behavior, not which product an agent is.
A future skill-driven build variant now needs no console change.
-
cd778d4: feat(console-ai): package binding chip + inert handoff cards + honest send hint (#2458 / ADR-0057 A1.a)
Three UX improvements from live magic-flow testing:
- A1.a — package binding chip (
app-shell): the build surface header shows the package the conversation is bound to (📦 <app>), or "New app" when unbound — so the edit blast-radius is always visible (Claude-Code-shows-the-repo idiom). The magic flow starts unbound and binds the moment its build mints a package (deriveBoundPackageIdreads?package=else the latest draft/handoff result; unit-tested). - UX#5 — only the latest handoff card is actionable (
plugin-chatbot): when a thread accumulates several "Open in Builder →" cards, only the newest stays clickable; older (superseded) cards' buttons are disabled — derived from message order, so it survives the navigation the button triggers and the pane remount that follows. A stale prompt in an older card can't be re-fired. - UX#7 — honest send hint (
plugin-chatbot): the composer already sends on plain Enter (Shift+Enter = newline); dropped the misleading⌘glyph from the hint so it no longer implies Cmd+Enter.
- A1.a — package binding chip (
-
1273f1e: fix(console-ai): reliable ask→build handoff auto-send + second-handoff context re-carry (ADR-0057 P4)
Two follow-ups to the P4 "Open in Builder →" handoff:
-
Auto-send swallow. The handoff's auto-sent first message could be dropped on a brand-new build conversation: the seed gated on the async-resolved
activeAgent, which can settle after the conversation id is minted, so the deferred-send replay ran with an empty pending and never re-fired. The seed now gates on the route (agentSegment, synchronous) and bumps apendingSignalthatuseDeferredFirstSendlists in its replay deps, so the seed always fires — no more empty build conversation on handoff. -
Second-handoff re-carry. A second "Open in Builder →" into the (singleton) build conversation now re-carries the latest ask context. The transport re-arms
parentConversationIdon each falsy→truthy transition of the prop (the ask thread is a singleton, so the same id repeats — the fresh-arrival signal is the transition the URL-mirror produces, not a changed value), and the seed re-arms on each newhandoffPrompt.
Unit-tested: deferred-send replays a post-id seed via the signal; the transport re-carries across a strip→re-supply cycle.
-
-
bfea27f: Make the ask-decline wait feel responsive: live thinking indicator + handoff card the moment
suggest_builderlands (#2458 item 3).When the
askagent declines a build-shaped request, the ~20s before the "Open in Builder →" card is dominated by the LLM's time-to-tool-call. During that wait the chat could show dead air — a blank bubble, or the static "执行过程" activity note (a hydrated-history affordance) when the backend streamed a(called …)tool-call placeholder.ChatbotEnhancednow shows the existing live thinking indicator (ThinkingDots) whenever a streaming assistant turn has nothing visible yet — including whitespace-only content, a mid-stream(called …)placeholder, and hidden reasoning insummarymode. The static "执行过程" note is reserved for FINISHED (re-hydrated) tool-call-only turns (#772 preserved). ThebuilderHandoffcard already renders atoutput-availablewith no gate on the trailing prose, so it surfaces the instant the tool result arrives; the typing cursor now only paints beside real streaming prose (no lone cursor during the tool phase). -
408f4ba: fix(plugin-chatbot): build-result summary truncates on mobile instead of overflowing (#2493)
The draft-review card's summary line (
built N artifact(s) — …) is a nowraptruncatespan, but its flex row lacked themin-w-0that letstruncateactually bite — so on a phone the long summary expanded the chat column past the viewport and the whole chat scrolled sideways. The span now getsmin-w-0 flex-1(truncating within the row) and the action row isflex-wrapso its buttons drop to a new line on a narrow screen rather than forcing horizontal scroll. Desktop is unchanged (there's room, so nothing wraps or truncates). -
Updated dependencies [443360a]
-
Updated dependencies [86c69c3]
-
Updated dependencies [05e56ca]
-
Updated dependencies [a44e7b6]
-
Updated dependencies [6a74160]
- @object-ui/core@14.0.0
- @object-ui/react@14.0.0
- @object-ui/types@14.0.0
- @object-ui/components@14.0.0
- Updated dependencies [80901aa]
- Updated dependencies [e492b9d]
- @object-ui/components@13.2.0
- @object-ui/react@13.2.0
- @object-ui/types@13.2.0
- @object-ui/core@13.2.0
- @object-ui/types@13.1.0
- @object-ui/core@13.1.0
- @object-ui/react@13.1.0
- @object-ui/components@13.1.0
- Updated dependencies [ac04b76]
- Updated dependencies [619097e]
- @object-ui/components@13.0.0
- @object-ui/types@13.0.0
- @object-ui/react@13.0.0
- @object-ui/core@13.0.0
- Updated dependencies [6cbccf3]
- Updated dependencies [c31874d]
- @object-ui/components@12.1.0
- @object-ui/types@12.1.0
- @object-ui/react@12.1.0
- @object-ui/core@12.1.0
- Updated dependencies [226fde9]
- Updated dependencies [e4de456]
- @object-ui/types@12.0.0
- @object-ui/core@12.0.0
- @object-ui/components@12.0.0
- @object-ui/react@12.0.0
- Updated dependencies [6fffd3d]
- Updated dependencies [9255686]
- Updated dependencies [fae75e2]
- Updated dependencies [1072701]
- @object-ui/react@11.5.0
- @object-ui/components@11.5.0
- @object-ui/types@11.5.0
- @object-ui/core@11.5.0
- Updated dependencies [8bf6295]
- Updated dependencies [1948c5b]
- Updated dependencies [bce581a]
- Updated dependencies [c38d107]
- Updated dependencies [7782698]
- Updated dependencies [e84d64d]
- @object-ui/types@11.4.0
- @object-ui/components@11.4.0
- @object-ui/core@11.4.0
- @object-ui/react@11.4.0
-
8d351f1: chore(chatbot): upgrade to Vercel AI SDK v7 / @ai-sdk/react v4
Bump
ai^6 -> ^7 and@ai-sdk/react^3 -> ^4. The chatbot'suseChat,DefaultChatTransport,UIMessage/ChatStatususage and themapMessagesparts adapter are all source-compatible with v7 — no code changes required.Verified: type-check clean, build green, 183/183 unit tests pass on v7.
Part of the org-wide AI SDK v6->v7 / providers v3->v4 upgrade (framework#2464, cloud#710).
- Updated dependencies [d88c8ec]
- Updated dependencies [b7237bb]
- Updated dependencies [d23d6eb]
- @object-ui/components@11.3.0
- @object-ui/core@11.3.0
- @object-ui/react@11.3.0
- @object-ui/types@11.3.0
- Updated dependencies [9e7a986]
- Updated dependencies [1311749]
- @object-ui/components@11.2.0
- @object-ui/core@11.2.0
- @object-ui/react@11.2.0
- @object-ui/types@11.2.0
-
27bef5a: feat(ai-build): event-driven "Designing your app…" progress for the blueprint-design stream (Refs cloud#657, cloud#655)
propose_blueprintnow streams a reconcileddata-blueprint-progresspart while it drafts the plan (a tens-of-seconds, otherwise-opaque LLM call), so the chat shows the app taking shape — objects appearing one-by-one with their field counts, the summary / extend target revealed progressively, and aseq-driven liveness cue — instead of a purely presentational rotating-hint placeholder.mapMessages:uiMessageToChatMessagelifts the latestdata-blueprint-progressframe ontoChatMessage.blueprintProgress(same single-reconciled-part mechanism asdata-build-progress; transient, never persisted). This is the shared streaming converter both the full-page AI Build surface (AiChatPageviauseObjectChat) and the floating console chatbot already route through.ChatbotEnhanced: a newBlueprintProgressPanelrenders the live "Designing…" card (object chips + summary + running counts + liveness). It supersedes the rotating-hint placeholder while events flow, and yields to the authoritative "Proposed plan" card the instant thepropose_blueprintresult lands.- Graceful degradation: with no
data-blueprint-progressevents (older runtimes / non-streaming turns) the existing rotating-hint placeholder behaves exactly as before — zero regression. On reload the persisted "Proposed plan" card is the record (the live panel is transient by design).
- @object-ui/components@11.1.0
- @object-ui/react@11.1.0
- @object-ui/types@11.1.0
- @object-ui/core@11.1.0
- @object-ui/types@7.3.0
- @object-ui/core@7.3.0
- @object-ui/react@7.3.0
- @object-ui/components@7.3.0
- Updated dependencies [d23db5c]
- @object-ui/types@7.2.0
- @object-ui/components@7.2.0
- @object-ui/react@7.2.0
- @object-ui/core@7.2.0
- Updated dependencies [677f7ed]
- Updated dependencies [08c47da]
- Updated dependencies [a71be60]
- Updated dependencies [cb03bc3]
- @object-ui/types@7.1.0
- @object-ui/core@7.1.0
- @object-ui/react@7.1.0
- @object-ui/components@7.1.0
-
81c0777: feat(studio): ADR-0033 Phase B — draft review surface (chat → designer → generic diff)
Closes the AI metadata-authoring loop in Studio. The framework (ADR-0033 Phases A + C) makes the assistant stage every change as a DRAFT; this lets a human see and review those drafts.
@object-ui/plugin-chatbotmapMessagesnow detects the framework's draft envelopes —{ status:'drafted', type, name, … }(single) and{ status:'drafted', drafted:[{type,name}] }(apply_blueprint batch) — and lifts the reviewable targets ontoChatToolInvocation.draftReview(mirrors the existing HITLpendingActionIdpath; the Vercel{type:'text',value}wrapper is peeled).blueprint_proposedis intentionally not surfaced (no draft yet).ChatbotEnhancedrenders a "Review N change(s)" button on drafted tool results, driven by a newonReviewDraftcallback prop.
@object-ui/app-shellassistantBusgains a review channel (requestReview/requestAssistantReview);ConsoleFloatingChatbotwires the chat button to it; a small navigator insideAppContent(which knows the app base) routes to/apps/:appName/metadata/:type/:name?review=1.ResourceEditPagehonours?review=1: it force-reloads the pending draft (covers the case where the AI drafted the item after the page mounted) and opens the review/diff.- New
DraftReviewPanel— a generic, type-agnostic draft↔published structural diff (added / changed / removed by key), reusingLayeredDiff'scomputeDiffRows. It gives every metadata type (view, dashboard, flow, …) a real "what will publishing change" review, surfaced as a toolbar affordance + sheet whenever a draft exists. The object designer keeps its richer per-field review.
Nothing is published by any of this — the human still clicks Publish.
-
9049bbe: Add end-user friendly agent process summaries for chatbot tool calls, with a debug mode for raw reasoning and tool details. Console chat surfaces now keep a sanitized browser-side display cache so refreshes can restore user/assistant text plus grouped tool states when the backend returns no message rows.
-
053c948: feat(plugin-chatbot): render AI data-query charts inline (
data-chart)Companion to the framework
visualize_datatool: the data-query assistant can now answer with a CHART rendered right in the assistant bubble.mapMessages.ts—extractCharts()lifts everydata-chartcustom stream part ontoChatMessage.charts(defensive narrowing; preserves multiple charts in order), mirroring the existingdata-build-progress→buildProgresspath.ChatbotEnhanced.tsx— renders each chart via<SchemaRenderer schema={{ type:'chart', … }}/>(decoupled — no hard dep onplugin-charts), giving the chart a definitewidth: min(520px, 80vw)so recharts'ResponsiveContainermeasures a stable non-zero width inside thew-fitbubble (otherwise the circular width dependency leaves bars unpainted).
-
053c948: feat(plugin-chatbot): honest liveness indicator on running AI turns
AI app builds run 1–3 min with long quiet gaps (LLM thinking, sample-data generation) where a static spinner is indistinguishable from a dropped connection. The chat now shows a Claude-Code-style liveness indicator driven by REAL observed stream activity, not a free-running clock:
useTurnLiveness(active, activityKey)stamps the moment real data arrives (a streamed token / tool delta /data-build-progressupdate) and measures seconds-since-last-byte.LivenessIndicatorrenders three honest states — receiving (emerald pulse + m:ss, bytes arrived recently), waiting (request in flight, nothing back yet), and stalled (amber + "no response for Ns", genuinely silent past 6s).- The build panel prefers the server's monotonic
seqkeep-alive heartbeat as its activity key (falling back to the content signature on older runtimes), so a long quiet seed-generation window reads as honestly receiving rather than flipping to amber.
- 40c79df: Improve the floating chatbot flow with responsive panel bounds, safer FAB placement, inline responding and stop states, and clearer retryable error feedback.
- Updated dependencies [5976ba3]
- Updated dependencies [a00e16d]
- Updated dependencies [eaccefd]
- Updated dependencies [f7f325d]
- Updated dependencies [c12986e]
- Updated dependencies [71d7ce0]
- Updated dependencies [053c948]
- Updated dependencies [ddbe4a2]
- Updated dependencies [2d47e94]
- Updated dependencies [9049bbe]
- Updated dependencies [6c0c92c]
- Updated dependencies [cb2fdb1]
- Updated dependencies [c3749eb]
- Updated dependencies [6cfa330]
- Updated dependencies [ad8ade6]
- Updated dependencies [d54346c]
- Updated dependencies [3870c20]
- Updated dependencies [2eb3096]
- Updated dependencies [b88c560]
- Updated dependencies [d16566f]
- Updated dependencies [90acb7f]
- Updated dependencies [7913390]
- Updated dependencies [1394e34]
- Updated dependencies [e95cc25]
- Updated dependencies [abe8ebc]
- Updated dependencies [300d755]
- Updated dependencies [bd8b054]
- Updated dependencies [4eb9cb6]
- Updated dependencies [7c239fd]
- Updated dependencies [858ad94]
- Updated dependencies [2270239]
- Updated dependencies [8d1195d]
- @object-ui/core@7.0.0
- @object-ui/components@7.0.0
- @object-ui/react@7.0.0
- @object-ui/types@7.0.0
- @object-ui/types@6.2.3
- @object-ui/core@6.2.3
- @object-ui/react@6.2.3
- @object-ui/components@6.2.3
- Updated dependencies [a66f788]
- @object-ui/react@6.2.2
- @object-ui/components@6.2.2
- @object-ui/types@6.2.2
- @object-ui/core@6.2.2
- @object-ui/types@6.2.1
- @object-ui/core@6.2.1
- @object-ui/react@6.2.1
- @object-ui/components@6.2.1
-
0335ec4: Polish the AI chat surface based on real-world dogfooding feedback.
@object-ui/plugin-chatbot— new display helpers shared byChatbotEnhanced:unwrapToolResult(value)peels the MCP-style{ type: 'text', value: '<json>' }envelope that backend tools emit (@objectstack/service-ai's data/metadata tools, in particular), and JSON-parses the inner payload. The result panel now renders a structured object tree instead of a doubly-escaped wall of\\\"objects\\\":[…].humanizeToolName(name)converts snake_case / kebab-case / camelCase tool ids into sentence case ("list_objects" → "List objects"), preserving known acronyms (API, ID, SQL, …). Tool-call cards now show the friendly title with the raw id as a small monospace badge for power users.summarizeChatError(err)strips the AI SDK's"Failed after N attempts. Last error: "prefix and keeps the first sentence as a headline; the full text is exposed via an optionaldetailsfield so the new error banner can render a "Details" disclosure plus a prominent Retry button instead of a 300-character single-line wall.
A new
⌘⏎ to sendhint is shown in the prompt footer (hidden on narrow screens).ToolHeader.titlenow acceptsReactNode(previouslystring) so wrappers can compose richer titles.@object-ui/app-shell—AiChatPage:- Removes the fake "Hello! I'm X" assistant welcome bubble so the empty-state suggestion chips can actually render.
- Adds per-agent default suggestion sets (
data_chat,metadata_assistant) with a generic fallback. New conversations open with three actionable starter prompts tailored to the selected agent. - Surfaces agent-fetch failures as an inline warning on the agent picker instead of hijacking the welcome message.
- Placeholder text now hints at the first suggestion (e.g.
Ask Data Assistant… (try "系统里有多少个用户?")).
- @object-ui/react@6.2.0
- @object-ui/components@6.2.0
- @object-ui/types@6.2.0
- @object-ui/core@6.2.0
- Updated dependencies [991b62d]
- @object-ui/core@6.1.0
- @object-ui/types@6.1.0
- @object-ui/components@6.1.0
- @object-ui/react@6.1.0
- @object-ui/types@6.0.4
- @object-ui/core@6.0.4
- @object-ui/react@6.0.4
- @object-ui/components@6.0.4
- @object-ui/types@6.0.3
- @object-ui/core@6.0.3
- @object-ui/react@6.0.3
- @object-ui/components@6.0.3
- @object-ui/types@6.0.2
- @object-ui/core@6.0.2
- @object-ui/react@6.0.2
- @object-ui/components@6.0.2
- @object-ui/types@6.0.1
- @object-ui/core@6.0.1
- @object-ui/react@6.0.1
- @object-ui/components@6.0.1
-
451bbee: HITL conversation loop:
useHitlInChatnow accepts acontinueConversation(prompt, ctx)callback. After the operator approves or rejects a tool call from inline chat buttons, the hook synthesises a short follow-up user prompt (tagged[HITL pa_xxx], with the executed result or rejection reason) and invokes the callback so the LLM continues the conversation with full awareness of the outcome.ConsoleFloatingChatbotwires this callback touseObjectChat'ssendMessage, closing the loop end-to-end. Execution failures stay visible in the inline status badge but do NOT continue automatically — the operator decides next steps.No framework changes required. Internal
idMapnow also tracks the tool name so the synthesised prompt is human-readable. New test suiteuseHitlInChat.test.tsxcovers approve/reject/failed/no-callback branches.
- @object-ui/types@6.0.0
- @object-ui/core@6.0.0
- @object-ui/react@6.0.0
- @object-ui/components@6.0.0
- @object-ui/types@5.4.2
- @object-ui/core@5.4.2
- @object-ui/react@5.4.2
- @object-ui/components@5.4.2
- @object-ui/types@5.4.1
- @object-ui/core@5.4.1
- @object-ui/react@5.4.1
- @object-ui/components@5.4.1
- 3a8c754: Rebuilt the chatbot UI on top of Vercel AI Elements (MIT) and wired in
the v1 capabilities exposed by
@objectstack/service-ai(tracing,generateObject,query_datatool,ModelRegistry).- What's new
ChatbotEnhancedis now composed fromConversation,Message,PromptInput,Suggestion,Tool,Reasoning,Sources, and friends. Sticky-to-bottom scrolling, keyboard-aware textarea, file pill chips, copy/retry actions, and the streaming/error banners now match the shadcn-style AI surface used across the ecosystem.- Tool / reasoning / sources rendering: assistant messages with
toolInvocations,reasoning, orsourcesautomatically render the collapsible tool panels, the chain-of-thought block, and the citation pill.useObjectChatparses these directly fromvercel/ai'sUIMessage.partsstream — no extra wiring needed at the call site. - Model picker: optional
models+selectedModelId+onModelChangeprops render an inline<select>in the prompt-input toolbar. Designed to be fed straight fromGET /api/v1/ai/models(new in service-ai v1). - Trace links: new optional
traceIdonChatMessagesurfaces a small "trace" link on assistant messages — pair with theai_tracesobject exposed by service-ai's auto-tracing. - New optional
suggestions?: string[]prop renders a chip row in the empty state and forwards the picked suggestion toonSendMessage. - All vendored AI Elements (10 components) plus two missing shadcn
primitives (
button-group,input-group) are exported as a namespace —import { AIElements } from '@object-ui/plugin-chatbot'— so apps can compose bespoke chat surfaces without dropping back to the legacy primitives.
- Type-level changes
@object-ui/typesChatMessagegains optionalreasoning,sources,traceIdfields, and a newChatMessageSourceinterface.ChatToolInvocationaccepts the AI SDK v6 lifecycle states (input-streaming/input-available/output-available/output-error/ …) in addition to the legacypartial-call/call/result.argsis now optional and accepts arbitrary shapes; new optionalerrorTextfield.
- What hasn't changed
- Public prop signature on
FloatingChatbot,FloatingChatbotPanel, and the SDUI"chatbot"renderer. - Hook contracts:
useObjectChat,useAgents,useFloatingChatbot. - SSR / Tailwind 4 / React 18+19 support.
- Public prop signature on
- Under the hood
- New deps:
streamdown,use-stick-to-bottom,shiki,motion,nanoid,@radix-ui/react-use-controllable-state,@radix-ui/react-slot,class-variance-authority. - Vendored sources live under
src/elements/with header comments pointing back toregistry.ai-sdk.dev. Rule #7 No-Touch Zones are respected —packages/components/src/ui/**was not modified.
- New deps:
- What's new
- Updated dependencies [3a8c754]
- @object-ui/types@5.4.0
- @object-ui/components@5.4.0
- @object-ui/core@5.4.0
- @object-ui/react@5.4.0
- @object-ui/types@5.3.2
- @object-ui/core@5.3.2
- @object-ui/react@5.3.2
- @object-ui/components@5.3.2
- @object-ui/types@5.3.1
- @object-ui/core@5.3.1
- @object-ui/react@5.3.1
- @object-ui/components@5.3.1
- @object-ui/types@5.3.0
- @object-ui/core@5.3.0
- @object-ui/react@5.3.0
- @object-ui/components@5.3.0
- @object-ui/types@5.2.1
- @object-ui/core@5.2.1
- @object-ui/react@5.2.1
- @object-ui/components@5.2.1
- Updated dependencies [de0c5e6]
- Updated dependencies [9997cae]
- Updated dependencies [b2d1704]
- Updated dependencies [87bc8ff]
- Updated dependencies [3ebba63]
- Updated dependencies [a8d12ec]
- Updated dependencies [70b5570]
- Updated dependencies [aa063db]
- Updated dependencies [d1442e3]
- Updated dependencies [7c7400a]
- @object-ui/types@5.2.0
- @object-ui/core@5.2.0
- @object-ui/react@5.2.0
- @object-ui/components@5.2.0
- Updated dependencies [8955b9c]
- @object-ui/components@5.1.1
- @object-ui/types@5.1.1
- @object-ui/core@5.1.1
- @object-ui/react@5.1.1
- Updated dependencies [bd8447d]
- Updated dependencies [fbd5052]
- Updated dependencies [d51a577]
- Updated dependencies [d1ec6a2]
- Updated dependencies [cf30cc2]
- Updated dependencies [5b80cfd]
- Updated dependencies [d548d6b]
- @object-ui/components@5.1.0
- @object-ui/react@5.1.0
- @object-ui/types@5.1.0
- @object-ui/core@5.1.0
- @object-ui/components@5.0.2
- @object-ui/react@5.0.2
- @object-ui/types@5.0.2
- @object-ui/core@5.0.2
- @object-ui/types@5.0.1
- @object-ui/core@5.0.1
- @object-ui/react@5.0.1
- @object-ui/components@5.0.1
- Updated dependencies [8930b15]
- Updated dependencies [95b6b21]
- Updated dependencies [ddb08a7]
- Updated dependencies [765d50f]
- Updated dependencies [927187a]
- Updated dependencies [bae8ba8]
- Updated dependencies [8435860]
- Updated dependencies [bb2ea48]
- Updated dependencies [b14fe09]
- Updated dependencies [a7bef6e]
- Updated dependencies [74962b0]
- Updated dependencies [3154334]
- Updated dependencies [fa4c2cb]
- Updated dependencies [7213027]
- @object-ui/components@5.0.0
- @object-ui/react@5.0.0
- @object-ui/types@5.0.0
- @object-ui/core@5.0.0
- @object-ui/types@4.8.0
- @object-ui/core@4.8.0
- @object-ui/react@4.8.0
- @object-ui/components@4.8.0
- @object-ui/types@4.7.0
- @object-ui/core@4.7.0
- @object-ui/react@4.7.0
- @object-ui/components@4.7.0
- Updated dependencies [3ee436d]
- @object-ui/components@4.6.0
- @object-ui/types@4.6.0
- @object-ui/core@4.6.0
- @object-ui/react@4.6.0
- Updated dependencies [ab5e281]
- Updated dependencies [6b6afd1]
- Updated dependencies [aa7855f]
- Updated dependencies [170d89f]
- @object-ui/types@4.5.0
- @object-ui/components@4.5.0
- @object-ui/core@4.5.0
- @object-ui/react@4.5.0
- Updated dependencies [2bd45af]
- @object-ui/components@4.4.0
- @object-ui/types@4.4.0
- @object-ui/core@4.4.0
- @object-ui/react@4.4.0
- Updated dependencies [6b683c8]
- @object-ui/components@4.3.1
- @object-ui/react@4.3.1
- @object-ui/types@4.3.1
- @object-ui/core@4.3.1
- Updated dependencies [4e7bc1b]
- Updated dependencies [8442c05]
- @object-ui/components@4.3.0
- @object-ui/react@4.3.0
- @object-ui/types@4.3.0
- @object-ui/core@4.3.0
- @object-ui/types@4.2.1
- @object-ui/core@4.2.1
- @object-ui/react@4.2.1
- @object-ui/components@4.2.1
- @object-ui/components@4.2.0
- @object-ui/react@4.2.0
- @object-ui/types@4.2.0
- @object-ui/core@4.2.0
- @object-ui/types@4.1.0
- @object-ui/core@4.1.0
- @object-ui/react@4.1.0
- @object-ui/components@4.1.0
- @object-ui/types@4.0.12
- @object-ui/core@4.0.12
- @object-ui/react@4.0.12
- @object-ui/components@4.0.12
- @object-ui/components@4.0.11
- @object-ui/react@4.0.11
- @object-ui/types@4.0.11
- @object-ui/core@4.0.11
- @object-ui/types@4.0.10
- @object-ui/core@4.0.10
- @object-ui/react@4.0.10
- @object-ui/components@4.0.10
- @object-ui/types@4.0.9
- @object-ui/core@4.0.9
- @object-ui/react@4.0.9
- @object-ui/components@4.0.9
- @object-ui/components@4.0.8
- @object-ui/react@4.0.8
- @object-ui/types@4.0.8
- @object-ui/core@4.0.8
- Updated dependencies [7c9b85c]
- @object-ui/core@4.0.7
- @object-ui/react@4.0.7
- @object-ui/components@4.0.7
- @object-ui/types@4.0.7
-
1b6dc64: fix: complete Tailwind v3→v4 migration cleanup
- Rename deprecated
flex-shrink-0→shrink-0andflex-grow-N→grow-N(Tailwind v4 dropped the long-form aliases). Affects data-table, fields/index, FileField, ChatbotEnhanced, FloatingChatbotPanel, ProcessDesigner, HistoryPanel, KanbanEnhanced, KanbanImpl, plugin-timeline index, FlowDesigner, LayoutRenderer. - Replace
theme(spacing.4)inside arbitrary-value[calc(...)]with literal1remin sidebar.tsx —theme()is deprecated in v4. - Remove obsolete v3-escape CSS overrides from index.css and
sidebar-fixes.css. The component source now uses native v4 stacked
data variants (
group-data-[state=collapsed]:group-data-[collapsible=icon]:w-(--sidebar-width-icon)) which Tailwind v4 emits correctly without the manual overrides. Only the bespoke.sidebar-menu-button-icon-mode*rules are kept.
- Rename deprecated
-
Updated dependencies [925051d]
-
Updated dependencies [1b6dc64]
- @object-ui/components@4.0.6
- @object-ui/types@4.0.6
- @object-ui/core@4.0.6
- @object-ui/react@4.0.6
-
1dc6061: fix(build): inline dynamic imports in library outputs
Library
vite build --liboutputs were emitting separate code-split chunks (rolldown-runtime-*.js,LookupField-*.js, etc.) when source files usedReact.lazy()/ dynamicimport(). When consumer apps re-bundled these multi-file dists, the library's per-chunk rolldown-runtime collided with the consumer's own runtime, causing "TypeError: i is not a function" at runtime when lazy components tried to register themselves (e.g. TextField in@object-ui/fieldsafter 4.0.4).Adding
output.inlineDynamicImports: trueto all@object-ui/*library vite configs forces a singledist/index.jsper package, which lets consumer bundlers handle the library as an opaque ESM module without identifier mismatches across chunks.Affected packages: components, fields, layout, plugin-aggrid, plugin-ai, plugin-calendar, plugin-charts, plugin-chatbot, plugin-dashboard, plugin-designer, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-grid, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-view, plugin-workflow.
-
Updated dependencies [1dc6061]
- @object-ui/components@4.0.5
- @object-ui/types@4.0.5
- @object-ui/core@4.0.5
- @object-ui/react@4.0.5
-
d2b6ece: fix: externalize all bare imports in library builds
Library builds (vite lib mode) now externalize every non-relative import instead of bundling third-party CJS dependencies into the published dist. This avoids inlined
require("react")/require("react-dom")calls that causeCalling \require` for "react" in an environment that doesn't expose the `require` function` runtime errors when consumer apps re-bundle the published dist.Specifically fixes:
@object-ui/plugin-dashboardno longer inlinesreact-grid-layout(and its transitivereact-draggable/react-resizableCJS bundles).react-grid-layoutis now declared as a peer dependency so consumers install a single ESM-friendly copy.@object-ui/components,@object-ui/plugin-calendar,@object-ui/plugin-charts,@object-ui/plugin-designerno longer inlinereact-i18next/i18next/use-sync-external-storeCJS shims.- All plugin packages now use a unified
external: (id) => !/^[./]/.test(id) && !id.startsWith(__dirname)rule, ensuring future additions of CJS deps are automatically externalized.
-
Updated dependencies [d2b6ece]
- @object-ui/components@4.0.4
- @object-ui/types@4.0.4
- @object-ui/core@4.0.4
- @object-ui/react@4.0.4
-
4be43e2: Page-mode record forms (
editMode: 'page'). New per-object metadata flag that opts a record's create/edit form into a dedicated full-screen route (/apps/:appName/:objectName/new,/apps/:appName/:objectName/record/:recordId/edit). Two new declarative actionsnavigate_createandnavigate_editopen these routes from JSON action buttons. Default modal behavior is preserved for objects that do not seteditMode.@object-ui/plugin-list&@object-ui/plugin-detail:ComponentRegistrysingleton fix. Both plugins' Vite configs now mark all@object-ui/*packages as external so each plugin no longer bundles its own private copy of@object-ui/core. Cross-plugin component lookups now resolve correctly from the same singleton registry.plugin-listdist shrank from multi-MB to 67 kB (gzip 16 kB);plugin-detailto 124 kB (gzip 28 kB).@object-ui/app-shellCreateViewDialogchurn fix.existingSetis now memoised on the joined string key ofexistingLabelsrather than the raw array reference, preventing the name-suggestuseEffectfrom re-firing on every parent render.CI fixes.
ReportViewerconditional-formatting test now accepts bothrgb(...)and hex color representations.ObjectViewi18n mocks rewritten to mirror the real hook shapes (useObjectTranslation,useObjectLabel). -
Updated dependencies [4be43e2]
- @object-ui/types@4.0.3
- @object-ui/core@4.0.3
- @object-ui/react@4.0.3
- @object-ui/components@4.0.3
- @object-ui/types@4.0.1
- @object-ui/core@4.0.1
- @object-ui/react@4.0.1
- @object-ui/components@4.0.1
- Updated dependencies
- @object-ui/types@4.0.0
- @object-ui/components@4.0.0
- @object-ui/core@4.0.0
- @object-ui/react@4.0.0
- Updated dependencies [a2d7023]
- Updated dependencies [f1ca238]
- Updated dependencies [de881ef]
- @object-ui/components@3.4.0
- @object-ui/types@3.4.0
- @object-ui/core@3.4.0
- @object-ui/react@3.4.0
- @object-ui/types@3.3.2
- @object-ui/core@3.3.2
- @object-ui/react@3.3.2
- @object-ui/components@3.3.2
- Updated dependencies [b429568]
- @object-ui/components@3.3.1
- @object-ui/types@3.3.1
- @object-ui/core@3.3.1
- @object-ui/react@3.3.1
- @object-ui/types@3.3.0
- @object-ui/core@3.3.0
- @object-ui/react@3.3.0
- @object-ui/components@3.3.0
- @object-ui/types@3.2.0
- @object-ui/core@3.2.0
- @object-ui/react@3.2.0
- @object-ui/components@3.2.0
- @object-ui/react@3.1.5
- @object-ui/components@3.1.5
- @object-ui/types@3.1.5
- @object-ui/core@3.1.5
- @object-ui/types@3.1.4
- @object-ui/core@3.1.4
- @object-ui/react@3.1.4
- @object-ui/components@3.1.4
- @object-ui/types@3.1.3
- @object-ui/core@3.1.3
- @object-ui/react@3.1.3
- @object-ui/components@3.1.3
- @object-ui/types@3.1.2
- @object-ui/core@3.1.2
- @object-ui/react@3.1.2
- @object-ui/components@3.1.2
- Updated dependencies
- @object-ui/types@3.1.1
- @object-ui/components@3.1.1
- @object-ui/core@3.1.1
- @object-ui/react@3.1.1
- @object-ui/types@3.0.3
- @object-ui/core@3.0.3
- @object-ui/react@3.0.3
- @object-ui/components@3.0.3
- @object-ui/types@3.0.2
- @object-ui/core@3.0.2
- @object-ui/react@3.0.2
- @object-ui/components@3.0.2
- Updated dependencies [adf2cc0]
- @object-ui/react@3.0.1
- @object-ui/components@3.0.1
- @object-ui/types@3.0.1
- @object-ui/core@3.0.1
- 87979c3: Upgrade to @objectstack v3.0.0 and console bundle optimization
- Upgraded all @objectstack/* packages from ^2.0.7 to ^3.0.0
- Breaking change migrations: Hub → Cloud namespace, definePlugin removed, PaginatedResult.value → .records, PaginatedResult.count → .total, client.meta.getObject() → client.meta.getItem()
- Console bundle optimization: split monolithic 3.7 MB chunk into 17 granular cacheable chunks (95% main entry reduction)
- Added gzip + brotli pre-compression via vite-plugin-compression2
- Lazy MSW loading for build:server (~150 KB gzip saved)
- Added bundle analysis with rollup-plugin-visualizer
- Updated dependencies [87979c3]
- @object-ui/types@3.0.0
- @object-ui/core@3.0.0
- @object-ui/react@3.0.0
- @object-ui/components@3.0.0
- b859617: Release v1.0.0 — unify all package versions to 1.0.0
- Updated dependencies [b859617]
- @object-ui/types@2.0.0
- @object-ui/core@2.0.0
- @object-ui/react@2.0.0
- @object-ui/components@2.0.0
- Maintenance release - Documentation and build improvements
- Updated dependencies
- @object-ui/types@0.3.1
- @object-ui/core@0.3.1
- @object-ui/react@0.3.1
- @object-ui/components@0.3.1