| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| plugins-v0.11.0 source code.tar.gz | 2026-08-05 | 147.2 MB | |
| plugins-v0.11.0 source code.zip | 2026-08-05 | 154.3 MB | |
| README.md | 2026-08-05 | 55.1 kB | |
| Totals: 3 Items | 301.6 MB | 1 | |
Plugins + CLI 0.11.0 (2026-08-05)
Minor Changes
-
Agents become identity/presets (breaking, no data migration — 0.1.0 agents must be recreated):
Agent0.2.0 keeps only name, DID, enabled, and a typedInstructionsref; a chat and the agent it runs as are linked by theCompanionTorelation (resolved withAgentChat.loadAgent/AgentChat.loadChat), neither type referencing the other by field; durable artifacts belong to a Project collection; subscriptions and cron schedules compile to Routines whose relay qualifies events with a cheap model and forwards them onto the durable agent session. (f9ba47a) -
Chats carry a typed
instructionsref rendered into the system prompt at request time (replacing typename-based inlining of bound Instructions objects, which now bind as ordinary context objects), and the new Project skill lets the assistant file created objects into a project's artifacts collection and list them. (b5ecf54) -
Add a
Minimapcomponent (@dxos/react-ui-components): a vertical rail of ticks representing anchor markers in a scrollable document, with a wave hover animation, per-marker popover, and brighter ticks for the currently-visible range.
MarkdownStreamController gains scrollTo, getVisibleRange, and onVisibleRangeChange. In plugin-assistant the chat thread now renders a Chat.Minimap rail (one tick per prompt turn, scrolls to the turn on click), and prompt prev/next navigation steps through the prompt range table rather than the xml-tag widget bookmarks. (801b77f)
- Plumb ephemeral trace events through the swarm (DX-1125).
Adds tag-based broadcast pub/sub over the existing swarm messaging layer (spec 1): a message may carry tags instead of a single recipient, and a subscriber registers a tag set and receives any broadcast whose tags intersect (logical OR). New wire fields (signal.Message.tags, signal.SubscribeMessagesRequest, messenger.Message.tags, SwarmRequest.SUBSCRIBE/subscribe_tags) and a dedicated onBroadcast channel keep broadcasts off the point-to-point path.
On top of that (spec 2), remote runtimes broadcast their ephemeral trace messages so clients can watch live progress: Trace.messageToTags/Filter/matchesFilter/encodeTraceMessage, a SwarmTraceSink producer, Process.Monitor.subscribeToTraceMessages(filter), a RemoteTraceMonitor swarm source merged into the aggregate monitor, and a plugin-client consumer that projects remote status.update events into the progress registry. (08a3eea)
-
Drive connector-auth ("Connect X") toolbar actions from a
ConnectorAuthAnnotationschema annotation, resolved by a single app-graph extension in plugin-connector — replacing the per-pluginconnectorAuthExtensionhelper (removed). Owning plugins inline their own sync/generate toolbar actions. AddsactionGroupstoGraphBuilder.createExtension/createTypeExtensionand aprimarymenu-action variant. (68e61ca) -
Introduce
@dxos/link, a low-level infrastructure package holding a unifiedCursorECHO type (org.dxos.type.cursor0.2.0), the relocatedAccessTokentype, and the durable-progress sync machinery.Cursorreplaces@dxos/plugin-connector'sSyncBindingrelation with a flat object whose discriminatedspeccovers both external-source sync (Gmail, Trello, GitHub, Linear, Slack, Discord, Bluesky) and internal feed-to-feed processing (e.g. mailbox fact extraction), so progress now persists across reloads for both.Connection/Connectorstay in@dxos/plugin-connectorand correlate to aCursorvia their sharedAccessTokenrather than a direct relation. This is a breaking change: existingSyncBindingrelations andCursor0.1.0 objects are not migrated and are abandoned on upgrade — external syncs re-bind and feed-to-feed analysis restarts from the beginning. (a49131a) -
Add an in-app
@dxos/logviewer (new@dxos/react-ui-debugLogPanel) so logs can be filtered, level-configured, and copied without opening DevTools; plugin-debug surfaces it as an R0 companion tab and a status-bar popover, and the devtools performance panel reuses the same component. Make the devtoolssubscribeToFeeds/subscribeToSpacesfeedKeys/spaceKeyspayload fields optional, fixing a Storage-panel schema decode error on empty subscriptions. Reimplement the devtools performancePanelandPanelContaineron the shared@dxos/react-uiPanelprimitive. (b591791) -
The deck companion now opens beside the attended plank instead of at the end of the deck: it shares that plank's container, split by a draggable seam whose geometry is the same for every plank/companion pair and in every presentation, and follows attention as the user moves between planks. Attending a plank also brings it to the front of the deck, collapsing the planks after it into the trailing spine pile. The "open companion" control is offered on every plank that has one, and a URL restoring a companion attends the plank it was anchored to. The sliding deck also runs flush to both ends of the viewport (
--main-spacingis a gap only), and the plank at the front is capped to exactly the space the two spine piles leave it, so the plank after it folds to a spine instead of wedging a part-drawn header against the current plank. (e7f0d9e) -
Redesign Composer URLs as pair chains (
/w/<workspace>/<key>/<id>/…) resolved by the graph builder via per-extensionurl: { key, kind, path }declarations (replacing theNavigationPathResolvercapability), and collapse the deck's layout modes into a single mode: presentation derives from plank count (fullbleed / tiling / sliding) and fullscreen is transient. Navigation is now gesture-based (nonavigationDefaultsetting): nav-tree plain click navigates solo (shift adds a plank), and in-plank/card navigation follows the deck — adding beside the origin when sliding and replacing when solo.LayoutOperation.Open'sdispositionvalues aresolo | add | auto. Breaking:LayoutOperation.SetLayoutModeis removed,?plank=URLs are replaced by the pair-chain grammar,AppCapabilities.NavigationTargetResolvernow declares its real requirement (Effect<NavigationTarget[], never, Database.Service>) so implementations no longer need a cast, and the unusedcompanionFrameSizingfield is dropped from the deck's persisted state (stripped by the existing migration). (5585ec8) -
Gmail and JMAP sync are now always bidirectional and durably resumable: the sync cursor tracks a
max/minwatermark pair (replacingvalue), each run syncs new mail forward and continues backfilling backward in the same pass, and a per-run message cap requests a durable re-run viaOperation.runAgain()instead of looping in-process. The sync operations now take only the binding — thedirection/after/beforeinputs are removed. Breaking: theCursorschema fieldvaluebecomes themax/minpair,Cursor.resolveWindowis replaced byCursor.resolveHorizon/Cursor.resolveWindows,Cursor.dedupStagedrops itsdirectionoption, andCursor.advance/Cursor.parseKey/Cursor.formatKeyoperate onmaxinstead ofvalue. (48d168e) -
Add
Html, a sandboxed renderer for untrusted HTML: sanitized content in a Shadow DOM host, so the document's CSS cannot reach the app while it still flows in the app layout, with remote images blocked by default. Content-specific behaviour is supplied as anHtmlDialect— a plain value carrying CSS, transforms and asrcresolver — rather than baked into the component;emailDialect()is the first of these.plugin-inbox'sHtmlVieweris replaced by that pair, movingcid:attachment resolution into the plugin (useCidResolver) so the shared UI package no longer depends on ECHO.
Email bodies now honour the sender's color-scheme declaration, read from the raw markup before sanitization strips it: a body declaring light is left as authored on a light sheet in dark mode, and anything undeclared is recolored to the app theme regardless of layout (the previous table-layout exemption preserved too little to justify leaving marketing mail glaring white in dark mode). (ba7aabf)
- The conversation view (
MessageArticle) now renders threads as a Mosaic stack: each message is a tile with its own toolbar, so Reply/Reply All/Forward/AI reply/Delete act on that specific message rather than always targeting the newest one. Body view controls (view mode, load remote images) and collapse-all/expand-all move to a single thread toolbar that applies to the whole conversation, and each message can be individually collapsed to a compact summary. The per-messageMessage.Toolbarno longer includes the view-mode switcher or load-images toggle.
By default only the most recent message is expanded and the rest are collapsed. Replying to a message now records the specific message it answers (parentMessage), so the draft renders directly after that message in the thread rather than always at the bottom, and it is smoothly scrolled fully into view.
Listbox.Item rows with an onClick (not just selectable ones) are now keyboard-focusable and respond to Enter/Space, matching native <button> activation. (2a68c3b)
-
Add stable
data-testids across the inbox and connector UI (mailbox sync/reply/message actions, message and conversation tiles, connect dropdown) and an optionaltestIdparam onAppNode.makeToolbarActionGroup/react-ui-menu's menu builder, enabling reliable browser-e2e targeting. (30ae5eb) -
Mail sync is now incremental and provider system state maps onto shared canonical tags.
Incremental delta-resume: the sync cursor carries an opaque provider delta token (Gmail historyId, JMAP Email/get state). After the initial window backfill, each run fetches only the delta since the token (Gmail history.list — paginated so multi-page deltas are not dropped; JMAP Email/changes), applying additions plus label/flag reconciliation to already-committed feed messages via objectless commit units. A stale token falls back to the window scan and recaptures; the token advances only after the run's merged stream fully drains, so a crash re-fetches the delta idempotently.
Unified system tags: Gmail system labels, JMAP mailbox roles, and the JMAP $flagged keyword now resolve to a shared, provider-agnostic tag registry (org.dxos.tag: starred / inbox / important / sent / and the Gmail categories) instead of provider-scoped tags — so a Gmail star, a JMAP flag, and a locally-toggled star are the same tag. Read-state, drafts, trash, spam, and archive are intentionally not tagged (archive is derived as "not in inbox"). The starred tag's foreign key moves from org.dxos.org to org.dxos.tag; existing locally-starred items under the old key are not migrated. (2543b63)
-
Bring JMAP mail sync to feature parity with Gmail — live progress monitor with cancellation, stats-panel telemetry, and failure reporting — and drive both providers through one shared, provider-agnostic sync effect (
runMailSync) that takes its provider as an Effect service, so each handler is the same run with its own provider layer (API + resolver) provided. (33e1a3d) -
Restructure the mailbox nav tree around an inbox-filtered default view, with All Mail, Sent, and Drafts as sibling views rendered through the same list and message companion; drafts now appear inline on their thread wherever it's already shown. Inbox and Sent resolve by the canonical system tag's identity, matching feed messages by the ids resolved from the mailbox's tag index rather than a query-level tag filter (which can't see tags on immutable feed messages) or label text, so both actually populate and stay correct across providers/locales. The sync and analyze-topics actions now appear on every one of a mailbox's views (previously only the primary node).
Drafts is now a canonical system-tag view like Inbox/Sent, not a separate data path: a draft is tagged when composed and untagged the instant it sends, so the Drafts view is a plain tag-filtered query over the same aggregate/pagination pipeline as every other view, and a mailbox's in-flight drafts drop out of the "attach to thread" list the moment they're sent rather than waiting on the next sync. Every draft-creation path (new compose, inline reply/reply-all/forward, and the AI assistant's draft tool) applies the tag consistently. Composing a brand-new message now navigates to the Drafts view and selects the new draft, so its message companion opens immediately. (a2447cd)
- Mailbox sync progress can now be cancelled from the sync meter: for an edge-executed sync trigger the cancel control stops the current run and its continuation chain, while the trigger's schedule stays enabled and re-syncs on its next tick.
@dxos/computenow exports theCancellationservice the runtimes provide (Cancellation.Service) and operations observe (Cancellation.signal).
Breaking:
@dxos/app-toolkit:ProgressTraceSinkOptions.terminateProcessis renamed tocancelProcessand takes aCancelTarget(pid, space, runtime, trigger) instead of a pid, so a cancel can be routed to the runtime that owns the run.-
@dxos/compute-runtime:SwarmRemoteTraceMonitorOptions.subscribeyieldsSwarmTraceBroadcast({ payload, tags }) instead of a bare payload — the envelope tags carry the ref-typed trace meta dropped by the wire codec. (5e7839e) -
Auto-create a recurring sync Routine when a mailbox or calendar is bound to a connection (new connection, multi-target selection, or reusing an existing connection); the toolbar "Sync" action force-runs it and disables while a sync is already in progress. Fixes a legacy-DXN compatibility gap in
refToEffectSchemaand a bug where cancelling a Gmail sync left its progress monitor stuck at "running". (923d5be) -
One identity rule per type, shared by the extractor's create-vs-merge decision and by a new duplicate scan, plus a Duplicates tab on the database type article for reviewing and merging what has already accumulated.
Contact extraction is now an allow-list: a sender earns a Person only when we sent or replied to it, or its domain matches a known Organization, and never when the address or message is automated. Mail sync and Google Contacts sync resolve against one index per space rather than a snapshot each, so concurrent syncs no longer both create the same person. (0a4bbde)
- Promote
Topicto a first-class domain type.Topicmoves from@dxos/pipeline-emailto@dxos/typesas a Project-style class (inline title/label/icon annotations +makefactory), keeping a sharedTopic.Propsstruct and itsorg.dxos.type.topicDXN. The Topic detail view (TopicArticle) moves to@dxos/plugin-brainand renders via a regular object/article surface.
Breaking: Topic / TopicProps are no longer exported from @dxos/pipeline-email — import from @dxos/types and use the namespace form (Topic.Topic, Topic.Props). No compatibility re-export is left behind. (f0ec728)
-
Clean up inbox operations: remove unused
DeleteEmail,DeleteEvent,SyncDraftEvents,SyncContactsoperations and the deadtool-ids.tsfile. DeprecateExtractContactandExtractMailbox. Add a defensive double-click guard to toolbar action buttons — they now disable while the handler is in-flight. (bb63d91) -
Add an
orderoption toAggregate.items({ limit, order }): an explicit, per-group member ordering independent of anyorderByelsewhere in the query. Previously a precedingorderBydid double duty — establishing group order and silently determining which members (and in what order) landed in a followingAggregate.items({ limit })— so moving thatorderByrelative toaggregatecould silently change which items appeared. The mailbox list now usesorderto keep each thread's preview newest-first, independent of the query's own group ordering. (4e64123) -
Ambient (Google-Docs-style) document review. The default document view now overlays every author's suggestions plus comments on main, with a per-user Editing/Viewing mode governed by a product-level
ReviewRenderPolicy; the explicit branch switcher / diff selector remains as the advanced path. Also fixes a crash when adding a comment while viewing a branch (comment anchors now resolve against the editor-bound document) and prohibits inline comments on suggestion branches.@dxos/ui-editorgainssuggestionsOverlayand areadonlyoption oncomments(). (c035062) -
Add an opt-in branch review workflow: comment threads are tagged with the branch under review and scoped to it, and a reviewer can accept an individual change from a branch (per-hunk cherry-pick via the
AcceptChangecollaboration operation) without merging the whole branch. Instant CRDT merge remains the default. (31fe0b8) -
Make the published
@dxos/clirunnable, and keep React out of node and bun builds.
@dxos/cli@0.10.0 could not execute at all once installed from npm. Nothing marked external in
the compiled binary can resolve at runtime (Bun's embedded filesystem has no node_modules), so the
externals are gone and esbuild-wasm's WASM is inlined; the @dxos/node-std shims resolve to node
builtins, since Bun miscompiles export * from 'node:<mod>'; @automerge/automerge-subduction uses
its self-contained web entry rather than the node one that reads a sibling file; the platform
binary keeps its executable bit through publishing; and the pinned bun no longer leaks --smol into
process.argv. Persistent SQLite on bun also now creates its parent directory, which any dx
command needed on a machine with a stored profile but no data root.
The binary also contained React, react-dom and the whole react-ui graph. Capability.lazy,
OperationHandlerSet.lazy and React.lazy defer evaluation but not bundling, so plugin barrels that
merely listed a React surface pulled it into every non-browser consumer: the plugins with a node
variant now have node-conditioned #capabilities, and plugin-sheet a node-conditioned
#operations. Headless code no longer reaches for React packages — @effect-atom/atom instead of
@effect-atom/atom-react wherever only Atom/Registry/Result are used, and @dxos/client/*
instead of @dxos/react-client/*. @dxos/ui-editor/headless is a new UI-free entrypoint for the
editor helpers operation handlers need.
Breaking:
formatForDisplayandformatForEditingmove from@dxos/react-ui-formto@dxos/schema.renderBylineandBylineIdentitymove from@dxos/react-ui-transcriptionto@dxos/plugin-transcription.- The icon list moves from
@dxos/react-ui-pickers/iconsto@dxos/ui-types, and that subpath is removed;huesmoves from@dxos/ui-themeto@dxos/ui-typesbesideChromaticPalette. @dxos/plugin-graphno longer exports its React hooks from the package root — import them from@dxos/plugin-graph/hooks.-
@dxos/plugin-deckand@dxos/plugin-navtreeare browser-only:#pluginno longer resolves anodeorworkerdcondition. (3f6ac61) -
The
dxbinary no longer depends on the machine that built it:@dxos/kv-store'screateLevelmoves to@dxos/kv-store/levelso importing the package for its types no longer binds LevelDB's native addon, and Automerge's WASM is inlined rather than read from disk.LevelDB,SublevelDBandBatchLevelare unchanged on the main entry. Each@dxos/cli-<platform>-<arch>package also exposesdxdirectly, so one platform can be installed without pulling the rest. (091ebe4) -
Add
@dxos/versioning(checkpoints, draft branches, and 3-way merge for automerge-backed ECHO objects) and document revisions and branches in Markdown: named checkpoints with read-only time travel and restore, draft branches (separate Text objects anchored to a parent revision) with 3-way merge-back, a History companion panel, a Versions section in object properties, an editor banner with a branch switcher, agent operations (create-checkpoint, create-branch, merge-branch, get-history), and adiffViewsetting selecting inline, side-by-side, or gutter diff rendering. (dd190a0) -
The editor's object picker is now a combobox: the query is typed into a search input in the popover instead of into the document, opted into per trigger via
searchTriggers. In markdown, the picker sorts objects by name and leads with a generic "Add object" that opens the create-object dialog and inserts a link to whatever it creates. Links to internal objects no longer show a raw-URI hover tooltip. (2e10525) -
Consolidate document review into
@dxos/plugin-review. The comment threads (previously@dxos/plugin-comments) and the generic version/review layer (previously in@dxos/plugin-space) now live in one plugin under theReviewCapabilitiesnamespace: the history companion (checkpoint/branch/merge timeline), the in-memory version-selection and review-mode state, the default review-render policy, theHistoryProvideropt-in, and the timeline model.plugin-spaceno longer depends on@dxos/versioning, andplugin-markdowncarries no review vocabulary — it exposes a neutralEditorBindingHookcapability thatplugin-reviewcontributes to. (77fff35) -
plugin-comments and plugin-versioning merge into plugin-review (one review domain: threads, suggestions, branches, history), and plugin-markdown becomes review-agnostic: versioning/review behavior reaches the editor through the new
MarkdownCapabilities.EditorBindingHooksocket, and theSuggestionSourcesProviderslot is removed. Consumers referencing the old plugin packages or keys (org.dxos.plugin.comments,org.dxos.plugin.versioning) migrate to@dxos/plugin-review(org.dxos.plugin.review). (cec59a4) -
Fold the review "Suggesting" mode into the editor view-mode dropdown.
addViewModenow accepts an optionalViewModeItem[](default the three built-in modes), threaded throughEditorToolbarFeatureFlags.viewModes; plugin-markdown establishes aViewModeExtensioncapability that plugin-comments implements to contribute the "Suggesting" entry, and the separate toolbar branch-selector / review-mode dropdowns are removed (the History companion covers branch switching). Single-select dropdowns now render a check on the current value (with radio semantics). Also: an author-coloured change-bar gutter on lines containing suggestions, a fix for comments flashing out of the companion on submit, and a suggestion-overlay perf improvement (compute the base/document character diff once across all authors). (6e624bd) -
Move the
WithPropertiestest helper from@dxos/plugin-markdown/testingto a new@dxos/app-toolkit/testingsubpath export. (499dde4) -
Introduce three plugin quality tiers (
beta,alpha,labs) and tag every non-system plugin with exactly one. The registry'srecommendedcategory is now an allowlist ofbetaandalpharather than everything not taggedlabs, so an untagged plugin is no longer surfaced as recommended by default. Theintegrationtag is renamed toconnector. (863e2e0) -
Add
Project(@dxos/compute), the successor toTopic, holding owned instructions, routine references, and an artifacts collection; theRoutineschema moves into@dxos/computealongside it.Instructionsgains a structuredcommandsfield, surfaced as sentinel-command autocomplete in the assistant chat prompt. The existing@dxos/typesGH/Linear-styleProject(name, description, image) is renamed toExternalProjectto free the typename for the new concept.dx-inputnow owns its full input chrome (padding, focus shift, a single-band ring/border treatment) so markdown-backed fields match plain inputs. (f7d7735) -
Add project templates: plugins can contribute pre-wired Project scaffolds (instructions, skills, standing context, starter routines) via a new template capability, and the routine instructions editor can now scope which fields it renders and writes back. The mailbox gains a "Set up project" action (Inbox Research with a sender-ledger starter routine), CRM contributes a sender-research project, and the brain plugin contributes a scheduled mailbox fact-analysis project. Routines created in a project's scope run with the project bound into their session so outputs can be filed into the project's artifacts. (cd3ed11)
-
Routines render a card summarizing when they run ("Runs every day at 9:00 AM", with a green check when the trigger is enabled) instead of a generic form preview of their internals, and the instructions editor no longer exposes the context
objectsfield — the owning project or chat supplies session context. (a83d98a) -
Full-text search across a space in the search plugin — ranked, highlighted results backed by the ECHO FTS index, plus a new
SearchResultList. The mailbox filter now searches messages by subject, sender/recipients, and plain/markdown body (never raw HTML) and shows a best-match highlighted snippet; the query is debounced to avoid re-rendering the list on each keystroke. Shared match/snippet utilities (computeMatchSpans,buildSnippet,Highlighted) moved to@dxos/react-ui-search. (e510f3b) -
Add
dx space exportanddx space importcommands. Export writes a space archive to disk in either the binary storage-dump format (includes document history) or a JSON snapshot of current object state; import reads an archive of either format back as a new space. (179afc6) -
Convert outline items into Task objects: a "Convert to task" action replaces the item with a link to a new Task parented to a project created lazily on first use, and the link navigates to the task in place. Adds the
getItemText,replaceItemWithLink, andsyncLinkLabelseditor commands. Fixes the outliner content column not being centered, which pushed the drag grip outside the document and the line menu inside it. (59a65a8) -
Add an appearance setting (Light / Dark / System, default System) that overrides the OS colour-scheme preference. Persisted per-device and applied live across all tabs in the same browser. (3400dc1)
-
Extract the headless diagramming layer into the new
@dxos/plugin-illustrator: it owns the baseSketchtype (name + canvas variant ref, mirroring Game/Chess), the scene DSL, dialect registry, sketch skill, and renderer-agnostic create/read/edit operations resolved through a newSketchVariantcapability.@dxos/plugin-sketchis renamed to@dxos/plugin-tldrawand, together with@dxos/plugin-excalidraw, now contributes a variant (canvas type + scene-DSL builder + surfaces) instead of owning its own root object type. (3502b3d) -
Add a backend-neutral scene DSL to the tldraw plugin: agents can create, edit, and delete diagrams as world objects composed of elements (rect, ellipse, circle, diamond, triangle, line, curve, arc, text, arrow) addressed by id, via the
DrawingOperation.Create/Read/Editoperations and theorg.dxos.skill.drawingagent skill. Renderers implement the sharedDrawingBuildercontributed by@dxos/plugin-illustrator. (b752581)
Patch Changes
-
Use the WebRTC transport for bun as well as node: bump node-datachannel to 0.32.3 (the 0.30.0 darwin-arm64 binary crashed under both runtimes) and remove the obsolete bun memory-transport guard. CLI
halo shareprints the joinable URL and validates--hostas an absolute URL. (d547045) -
Reorganize CodeMirror extensions into themed folders (
core,state,behavior,decoration,language,collab,completion,streaming,structure,demo,debug) with per-folder barrels; the package's public export set is preserved. Fixes the misspelled exported typeCompoetionContext→CompletionContext, de-duplicatesescapeRegExpSourceintoutil(closing a latent tag-escaping bug inextendedMarkdown's mixed parser), and adds anxmlTagscharacterization test suite.xmlTagsblock widgets now keep their portal alive across viewport culls (removing the blank/flicker on scroll-back for known-height embeds).@dxos/ui: adds astringoverload toDomino.offor custom-element tags (e.g.dx-icon);@dxos/plugin-assistantdrops the now-unneededDomino.of(... as any)casts. (a256a87) -
Move the
useFlushhook from@dxos/plugin-assistant/hooksto@dxos/react-client/echo. It operates on aSpace, so it belongs with the other space hooks; import it from@dxos/react-client/echoinstead of@dxos/plugin-assistant/hooks. (c9da903) -
Add routed scripts to the scripted test language model (per-session cursors for supervisor/sub-agent scenarios) and restore per-message span publishing from the chat thread (minimap markers and prompt navigation). (bdf9f68)
-
Resolve an object's canonical navigation path through
NavigationOperation.ResolveNavigationTargets, so opening an object from a generic surface (a card, a search result, an agent following a reference) lands where the nav tree shows it — its collection, or its type's sidebar section — instead of the hidden database path every object falls back to. This also fixes the nav tree showing no selection for objects opened from cards. (5b05d75) -
Force a full reload when the client reconnects to a newly-elected leader worker, as an interim fix for guest tabs breaking after the leader tab closes. (a77e1a2)
-
Fix comment author attribution and reset-device reload.
useIdentitynow seeds its atom with the service's synchronous snapshot so the current identity is available on the first render instead of a transientundefined— a comment sent in that window was stamped with an empty sender and never matched its author, hiding the edit affordance. Duringclient.reset()the worker-reconnect handler now reloads to the origin (fresh boot) rather than the stale current route, andClient.resettingexposes that state. SQLite hypercore storage drains in-flight writes onclose()so a save racing reset teardown can't stall or reject against a torn-down connection. (eec72c5) -
Fix device-invitation links hanging in apps with onboarding: invitation URL params are now consumed by a single owner (
invitationUrlHandler: falsedisables the plugin-client/plugin-space navigation handlers so plugin-onboarding owns the flow), an invitation arriving with an existing identity opens the reset-and-join dialog instead of being dropped, navigation-handler failures surface as a toast instead of dying silently, anddx halo share --openalways prints the invitation code and reports browser-launch failures with the invitation URL. (fe63f19) -
Document versioning: Google-Docs-style suggestion review.
- @dxos/ui-editor:
suggestChanges(inline per-change accept/reject over a proposal) plus word-leveldiffHunks; a multi-authorsuggestions({ sources })overlay andgroupHunksgrouping; thecomments/diff/suggestreview extensions are grouped under a newreview/folder (package barrel exports unchanged). - @dxos/app-framework:
NamePopovermoved to@dxos/app-framework/ui, decoupled from translations via asubmitLabelprop. - @dxos/plugin-markdown: branch/merge/checkpoint exposed as agent skill tools; a
suggestdiff-view mode; the compare/diff overlay is reconfigured through a CodeMirrorCompartmentso switching views no longer remounts the editor (rebinding automerge / losing selection). The branch banner's Compare toggle becomes a three-way[Base | Diff | Branch]view selector — Base shows the parent content at the anchor read-only. - @dxos/plugin-space:
NamePopoverremoved from@dxos/plugin-space/components(relocated to@dxos/app-framework/ui);VersioningState.compare(boolean) becomesview(base | diff | branch). - @dxos/types: new
ContentBlock.Change(a suggested edit —before/after) so a suggestion renders through the message tile. - @dxos/react-ui-thread:
Message.Tilerenders thechangeblock (struck original → proposed text) with Accept/Reject via newonAcceptChange/onRejectChangethread callbacks;CommentThreadis decoupled from@dxos/react-client(metadata/activity/identity injected as props). - @dxos/plugin-review: a unified review companion — comment threads and suggestion cards in one surface.
Suggestionsreactively tracks the document's activekind:'suggestion'branches (one bound probe per branch) and renders each grouped change as a change-block tile, routing Accept/Reject to the durableAcceptChange/RejectChangeops. -
@dxos/plugin-markdown: a
SuggestEditoperation + "Suggest edits" authoring action that find-or-creates the caller's per-author suggestion branch and edits it. (3f1fc67) -
Fix
dx account login --method emailto handle the hub'sneedsIdentityresponse, creating a local identity and retrying so the login completes instead of waiting for a token that never arrives. (382d00d) -
Publish the HALO Effect service packages (
@dxos/halo,@dxos/halo-adapter-client,@dxos/halo-react) and begin migrating Composer/plugins off direct@dxos/clientHALO access onto them:plugin-clientnow providesIdentity.Service/Space.Servicelayer specs and wraps the app inHaloProvider. (6439417) -
Add an optional
attachflag to thedatabase.objectCreateoperation that files the created object in the space root collection (visible in the navigation tree). CLI:dx profile createtemplates now enable edge features (fixes device invitations hanging at "Connecting…" for CLI-created profiles), anddx halo shareprints the joinable URL. (bda1a02) -
Report passkey login failures on the welcome screen instead of silently doing nothing.
RedeemPasskeynow fails withPasskeyDismissedError,PasskeyRejectedError, orPasskeyLoginError, whichclassifyPasskeyFailuremaps to a message. (832d150) -
Fix an uncaught
Space is not initializederror thrown from the space replication-progress capability. Theclient.spacessubscription fires while a space is still initializing (on app load and during space creation), and the space name was read eagerly fromspace.properties, whose getter throws until the space is ready. The name is now read lazily per sync-state update and only once the space reachesSPACE_READY. (aea1e6e) -
New package
@dxos/echo-panproto: declarative, JSON-serializable lenses (Panproto.Lens) between ECHO objects and foreign wire records, executed by a runner (Panproto.encode/decode) rather than expressed as closures.
Annotation-driven publishing of ECHO objects to the AT Protocol. @dxos/schema gains AtprotoRecordAnnotation (type-level: target collection, record-key strategy, and a declarative serializable lens) and AtprotoVisibilityAnnotation (field-level, private by default — a field is published only when explicitly marked), so a generic companion can discover and publish any annotated type without knowing the type itself.
MasterDetail moves from plugin-routine into @dxos/react-ui-list as a reusable primitive: a selectable master list above a detail slot, nestable by placing another MasterDetail in detail. Per-row overflow menus are driven by useMenuBuilder from @dxos/react-ui-menu.
ComboboxField now shows the selected option's label rather than the stored value, which is often an opaque id the user never chose to see. (9da013f)
-
Group a connector's sync surface into a nested
syncfield (operation,getTargets,materializeTarget,optionsSchema) with an optionaltriggerspec and anautoflag. A connector that declares a trigger spec is synced by force-running its binding's Routine trigger — on demand as well as on schedule, so both share the dispatcher's durable execution — and one that declaresautosyncs as soon as a binding is created. (c3625d3) -
Supporting changes for the new plugin-blogger / plugin-typefully feature:
- @dxos/plugin-connector: expose
Connectiontypes via a new./typesexport subpath so provider plugins can consume the connection contract without pulling the full package barrel. -
@dxos/react-ui:
Card.Rootnow accepts and forwardsonKeyDown, enabling keyboard-interactive cards (Enter/Space activation) without a cast. (e0e1a9f) -
Move
DraftMessageout of@dxos/plugin-inboxinto@dxos/types, and move the generic email-sync pipeline stages (excluding theSyncBinding-coupledtoCommitUnit) out of@dxos/plugin-inboxinto@dxos/pipeline-email, so these can be reused without depending on a full app-framework plugin.ConnectionandSyncBindingremain in@dxos/plugin-connector;toCommitUnitandfactsCommit(both coupled toSyncBinding) live in@dxos/plugin-inbox. (6d2afe0) -
Fix rebinding a target (e.g. a Mailbox) to an existing connection not renaming it after the connection's account, and fix the newly-created cursor for a target materialized alongside a brand-new connection not being immediately visible to the sync trigger UI. (0d1f866)
-
Fix the companion panel failing to open when a caller names only the variant (
~comments,~transcript,~settings) rather than a fully qualified companion id. (bce1dbc) -
Clicking a folded plank's spine now attends that plank instead of handing attention straight back to whichever plank was already on screen; the plank toolbar's fullscreen and close controls are offered regardless of how many planks are open; and the navtree marks the open item as current immediately rather than up to half a second later. (ebb6383)
-
Fix the navigation sidebar disappearing permanently at desktop widths after a dismissal persisted from below the
lgbreakpoint. (1dad41e) -
Plugin-declared decks and deck scroll stability. A type can now declare how the deck behaves when one of its objects is the root:
AppAnnotation.DeckAnnotationcarries aDeckSpec(initial planks and a chain of levels),LayoutOperation.Openacceptsroot+levelso opening at a level reuses that level's plank and closes the levels below it, Collections are navigation targets that open their contents as planks, and the mailbox declaresmailbox / message / attachment(meta-click opens a message in its own plank; a message swap carries the open companion along). Deck scrolling is now strictly intent-driven: an in-deck click yields to the navigation it triggers, navigations re-issue if a reflow kills the glide, browser scroll anchoring is disabled on the deck viewport, a companion opening past the trailing edge is revealed by exactly the overflow, and stalecompanionPlanksentries are pruned. (f10b1ce) -
HeyGen avatar/voice pickers now list only the account's own assets (
/v3/avatars?ownership=private,/v3/voices?type=private) instead of HeyGen's public catalog, with names trimmed (HeyGen returns user-named assets with leading newlines / non-breaking spaces) and sorted alphabetically; list requests are bounded by a timeout so a slow response can't hang the picker.Listbox.ItemContentno longer reserves the leading icon column when noiconis set, so icon-less rows are flush to the edge instead of indented. (277e365) -
Register the
Canvastype on the plugin that owns it, so creating a drawing no longer fails with "Schema not registered" when the Excalidraw plugin is disabled. (cc51de3) -
Fix Mailbox.recordExtraction dropping the first extraction recorded on a fresh mailbox (detached-record write). (724d468)
-
Open a new mail draft as a plank beside the mailbox view it was composed from, and leave reply/forward drafts inline in their conversation instead of navigating to Drafts. (2fb1993)
-
Fix Gmail sync wedging permanently when a message is deleted before it is fetched: the 404 now drops that message instead of failing the run and stranding the history token. (98d79ec)
-
Hide markdown images with an empty target (
![alt]()) when image loading is disabled. The match required a non-empty url, so these fell through and rendered as a broken image with their source left visible, alongside thecid:and protocol-relative targets already handled. (1872bc0) -
Inbox draft composer rebuilt as a compose-style form, plus the shared UI it needs.
@dxos/react-uiInput.TextInputgains MUI-stylestart/endadornments rendered inside the input container;@dxos/ui-themeadds a shared.dx-inputbox treatment (surface + hairline border + focus-within shift) now used by Input,MarkdownField,RefEditor, and the inbox editor.@dxos/react-ui-formRefEditoremail mode renders committed mailboxes as atomic tag widgets (trailing delete affordance, no@marker) — a raw address stays plain text until committed with comma/Space/Enter, typing before a tag starts a fresh token, and the single line is centered so text and tags align.@dxos/ui-editor'sdefaultThemeSlotsis nowfullWidth(no longer forcesh-full).@dxos/plugin-inboxEditMessagegains To/Cc/Bcc recipient pickers with Person autocomplete, arrow-key field navigation, and a layout fix so Send no longer overlaps the editor. (d958118) -
The inbox message view selector (HTML / Markdown / Plain) now persists across messages and sessions. The choice is stored alongside the other inbox settings (the
loadRemoteImagestoggle) in the plugin's settings store, so it survives reloads instead of resetting to HTML on every open. Also reorganizesuseArticleKeyboardNavigationunderAttentionProvider(no change to the@dxos/react-ui-attentionpublic exports). (3b4a7c8) -
Mailbox UX fixes: the Gmail sync progress meter now shows a determinate bar (the retrieval total is known once message ids are enumerated); the Topics and Subscriptions articles use the standard
Panel.Toolbarmenu idiom and render their lists (and topic suggestions) viareact-ui-mosaicStack; selecting a topic opensTopicArticlein the companion; theTopictype now has a navtree name; and the one-click unsubscribe POST no longer triggers a CORS console error. (6dd1aa8) -
usePagination'sisLoadingnow reflects genuine query settlement instead of clearing on the next microtask regardless of delivery, so consumers can reliably distinguish "still loading" from "loaded and empty" even for async, feed-backed queries. The mailbox article uses this to fix a bug where it could briefly flash the wrong empty-state message (e.g. "No connections configured") while a large mailbox's messages were still loading. (9cde1c6) -
Fix mailbox paging and the list blanking during sync.
usePaginationnow keeps the previously-shown page across a query-identity change instead of resetting to empty + loading, and the virtualizer pagination hook re-armsgetNextafter a page lands and no longer misreads a reordered item as an eviction. The mailbox renders a loading spinner in-flow at the end of the list rather than replacing the whole panel. (0afbf15) -
Graph actions can now declare
dispositionas an array and apresentationchrome override per surface, letting one action multi-target the object toolbar and nav-tree context menu with appropriate chrome in each. Mailbox and calendar "Sync" now surface from a single graph action instead of a duplicated toolbar button. (1a989ed) -
Fix auto-created mailbox/calendar sync triggers so their
inputcarries onlybinding, matching the sync operation's input schema. The trigger no longer smuggles an extramailbox/calendarref into the operation input; the routine is instead discovered through itsbindingcursor'sspec.target. (cb14d6e) -
Import ECHO data-access hooks (
useQuery,useObject,useType,usePagination, …) directly from@dxos/echo-reactin Composer plugins and UI packages instead of through the@dxos/react-client/echore-export, decoupling pure ECHO data access from@dxos/react-client. (b8c0825) -
Fix "Cannot assign to read only property" when playing a game — game variants now receive the live state object instead of a frozen snapshot, so chess moves and New Game work again. Tic-Tac-Toe now ships from the community plugins repo and is no longer built here. (c58ebb7)
-
Resolve an object's database via
Obj.getDatabase(obj)(and its space id viadb.spaceId) instead ofgetSpace(obj).db/.idin plugin data-access sites, dropping the@dxos/client/@dxos/react-clientdependency where the full space handle was not needed. (b602d44) -
Fix the mailbox silently dropping a compose draft, which has no thread. A draft with no
threadIdis now created as a thread of one — keyed on a fresh id — so the mailbox list's whole-thread semi-join and conversation grouping keep it. Also align the JMAPEmailschema with RFC 8621, wherethreadIdis a required, server-set property. (85893fe) -
Move contexts, hooks, constants and helpers out of React component modules into sibling modules so each component module is a react-refresh boundary. Public package APIs are unchanged; the previously exported names are re-exported from each directory barrel. (37874ce)
-
Chats no longer spend a
query-skillscall before everyenable-skills— the available-skills list is already rendered into the system prompt — and project chats pre-bind the artifact-type skills, so creating the artifact you asked for costs fewer tool calls. Deleting an object now also closes planks for the objects it cascade-deletes (e.g. a project's chats), which previously stayed open pointing at removed objects. (4bb7e3b) -
Documents created from the editor's slash/link menu are now filed in the same collection as the document they were created from, instead of the space root. (ac51564)
-
Show a message in the sidebar when the active workspace is not available instead of rendering an empty nav tree, and stop serializing the unresolved-workspace sentinel into the URL. (a97a5ca)
-
Publish
@dxos/plugin-projects: the package is no longer private and declares public publish access. (89fdccc) -
Routines created from a project are now owned by it, so deleting the project deletes its routines (and their triggers) instead of leaving them behind. (34f774a)
-
Poll the service worker registration hourly so a deployed update is detected while the app stays open, instead of only on reload, and report the update download as a progress monitor. Re-dispatching a toast with an existing id now replaces it instead of stacking a duplicate. (707caae)
-
Fix running a routine manually. The runnable's input now comes from the routine's first trigger, so a sync routine's
bindingreaches the operation instead of throwing, and a routine whose trigger isremoteforce-runs on the edge dispatcher rather than silently running on the client. Also exportcreateInvocationPayloadfor building a trigger's invocation payload. (bf055c8) -
Rename
Message.ContenttoMessage.Bodyand add a new optionalMessage.Contentwrapper that carries the message's default padding.Card.Rootaccepts agutterprop so a card whose body is a form insets its fields like a standalone form. (51aaffe) -
Keep the sync status indicator a single colour in every state; the icon and label continue to convey status. (25272e3)
-
Distinguish a stalled replication from a lost EDGE connection in the sync status indicator, and stop reporting a stall while replication is still making progress. (0e3a1a9)
-
Fixed outline link chips not updating when the linked task is renamed; the label sync now observes task changes directly instead of relying on query re-emission. (0d7d4bf)