| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-10-10 | 34.4 kB | |
| v0.14.0 source code.tar.gz | 2026-10-10 | 197.4 MB | |
| v0.14.0 source code.zip | 2026-10-10 | 208.0 MB | |
| Totals: 3 Items | 405.4 MB | 0 | |
Core/SDK 0.14.0 (2026-10-10)
Minor Changes
-
An agent's chats now run on EDGE (
Agent.chatLocation) unless a chat setsremote: false, so every chat shares the agent's one brain. Facts the agent records are attributed to space members by identity DID, with the display name as an optional label (attribution.agentLabel), and watches resolve the person they name to that member's DID and match on it (someone who is no member is matched by name, as their words are attributed); a chat with a member no longer invents a placeholder "Me" person. (f0fc12a) -
The space Home assistant prompt no longer adds a feed to the space on every visit: its chat is an in-memory draft until the user sends, when the chat, its feed and its bindings are written together.
AiContext.Bindernow opens over a feed that is not stored yet, holding bindings in memory untilflush()writes them once the feed is stored, andunbindremoves an object from the bound set immediately whichever URI form the ref uses. (3e98467) -
An agent gains a "Brain store" companion: a read-only debug view of its brain as held, showing the raw facts with full attribution, each watch's rules, the facts encoded as the Datalog relations those rules match, and each watch's pending events with when the clock next matters. It reads the brain through the new
TriggerOperation.InspectBrain, and@dxos/brainaddsEncoding.formatandEncoding.formatEntryto print encoded facts in the rules dialect. (62abfd7) -
@dxos/braingainsEvaluator, which evaluates every subscription of one brain withGoalRulesover a shared fact stream (push,tick,hydrate,nextDueAt), andOracle, the replay gate a compiled goal must pass.GoalRules.nextDueAtreports when the clock next matters,everyfires once per period even when every evaluation falls on a boundary, andaboutalso matches an entity's label. plugin-agent's in-memory brain now evaluates subscriptions with theEvaluator: aTriggercarriesrules, compiled from the goal's text byWatchFacts(gated by the oracle, naming the space's members by DID) or translated from itsFactPatternbyTrigger.toRules, replacingTrigger.matchesPatternandBrainService.matchEvent.BrainServiceevents carry the wake's label and facts, and the service gainstickandnextDueAt;TriggerOperation.RunDueruns due watches. (37b0196) -
Export
composerRingPaths(and theComposerRingtype) so each ring of the Composer mark can be rendered and animated on its own. (c6e9fd9) -
A chat can run on Claude Code on this computer or on EDGE.
A chat names the durable process that runs it in session.process. Plugins contribute agent processes through AssistantCapabilities.AgentProcess, and AgentService spawns the one a chat names, falling back to the assistant's own. The Claude plugin's Claude Code process starts the agent through the new ShellService (@dxos/compute/ShellService), which runs operating-system processes and bash scripts for a compute process. Each process gets its own instance, and every child it started ends when that process ends. The Node.js implementation is @dxos/compute-runtime/node-shell.
"Claude Code (cloud)", built on plugin-code's new EdgeAgent.make, runs a chat's turns on EDGE's coding-agent process in a sandbox container. The session keeps working with no client connected, and EDGE restarts the container and resumes the turn when the agent dies or stalls. Each turn lends the process the user's credential, so the credential never enters the container. The cloud session runs unattended by default: a permission request is denied on the spot, and the agent skips that step and carries on.
A new Claude Code connector stores a Claude subscription token: open a terminal, run claude setup-token, and paste the token it prints. The token is kept apart from the Anthropic API key. Claude Code on this computer receives it as CLAUDE_CODE_OAUTH_TOKEN, and the cloud harness lends it in preference to the API key.
A project lists the GitHub repositories its cloud sessions work on (Project.repositories), set in the project's header next to its name. The sandbox checks out the project's repo and each listed repository before the agent starts. Each turn lends the space's GitHub token to EDGE, resolving it through EDGE when EDGE holds it, and EDGE proxies the sandbox's git calls with it, so the token never enters the container either. The project folder setting applies only to Claude Code on this computer.
The Code plugin's coding-agent permission setting gains bypassPermissions, which never asks and runs everything. (ec6da5a)
-
A chat hosted on EDGE now shows its working indicators, phases and streamed reply for the whole turn, instead of reading idle while the agent works.
AgentProcesstakes aresidentoption that keeps the process for the next prompt rather than spawning a new one per turn, andsubscribeEphemeraltakes{ replay }. Breaking: plugin-assistant'sAiChatProcessoris nowChatModel(useChatProcessor→useChatModel,getProcessorState→getChatModelState, and theprocessorprop ofChat.Root/ChatPrompt→chatModel). (a1e64db) -
Operations now run as processes through
Process.Manager, and durable operations are declared in two stages:Operation.makeDurable({ ... })(which accepts an optionalname) followed byOperation.withDurableHandler(...). Breaking: spawn a durable operation withProcess.spawn(durable, input)and read its result withProcess.awaitOutput, wrap a plain operation withOperationProcess.make(op)from@dxos/compute-runtime(which replacesDurableOperation.fromOperationand finds its handler in the process context), and reattach with the newProcess.Manager.attach;invokeFiber/attachFiber/OperationFiberare removed.Process.Handleis merged intoProcess.Process(parentId→parentPid,Process.Handle.Any→Process.Any); processes are built only by the runtime, so fixtures usemakeTestProcessfrom@dxos/compute-runtime/testing.Trigger.Monitor/Trigger.TriggerMonitorServiceare renamedTrigger.Manager/Trigger.ManagerService, and compute-runtime'sTriggerMonitormodule is nowTriggerManager. (28bb45b) -
In
@dxos/react-ui-canvas, a link may carrytext, drawn at the middle of its route on an opaque rounded backdrop. Guides and borderless shapes are off the lattice: they occupy no cells, move and resize freely, and do not block gutter routes. A nested scene routes on its parent's lattice, so its links no longer jump when it settles. On a lattice a smart link takes the side-centre ports whose gutter route bends least (a pinned port stays pinned), and the gutter search runs on a binary heap. A label's or note's lines are a whole number of minor grid units tall, padded a grid unit either side, and a guide's text takes the default colour.SceneView.Root'sreadonlynow also prevents selection and hides the selection frame, ports, the actions bar, the Properties and Layers panels, the grid and the lattice guides.
In @dxos/plugin-canvas, a laid-out illustrator diagram draws on the canvas lattice as it renders: each connector binds to its boxes as a smart link carrying its caption as text, and a group is a guide titled at its top-left corner on a Backdrop layer below the shapes. A linked drawing's own frames open the drawings they show, so drawings nest to any depth. A frame's object resolves through the canvas's database, and its role field appears as soon as an object is picked. Read-only is the viewer's own, kept in the canvas's view state and toggled from the drawing's menu (Read only / Edit drawing). The plugin offers a "DXOS Architecture" space template: multi-level Composer and EDGE architecture diagrams (from docs/diagrams/*.dx) seeded as nested canvas drawings, which the Architecture stories also load, read-only by default. Composer enables the plugin by default.
In @dxos/diagram, a group frame's margin is the same on every side, with its title inside the top margin, and a diagram with an explicit grid keeps every box on it: extra space between groups is whole cells.
In @dxos/react-ui-form, picking a reference in RefField commits it, so an auto-saving form saves the pick at once rather than on the next field's edit. (b0e4b60)
-
Diagram connectors accept
tail=arrow, so one connector can carry an arrowhead at both ends instead of drawing a two-way relationship as two arrows (edge A -> B tail=arrowin the diagram DSL). The layout engine now pulls apart connectors that would otherwise share a line, even when separating them adds a crossing. (1eed6b1) -
The MCP
runScripttool now answers with the text the program printed instead of a JSON object. A failed program now returns an error result, and every answer ends with a trailer after---giving the number of calls the program made, the time spent in them, and the total time.ScriptResultgainsstats(calls,callMs), counted by both the in-process and the isolate sandbox, andMcpServer.formatScriptAnswerrenders the answer. (eb5d14d) -
Skill hooks can now run in the background: an end-request
Skill.Hookwithasync: trueno longer holds up the request, and the agent process waits for it before finishing. Composer uses this for an opt-in Report agent struggles assistant setting (telemetry must also be on): a small model reviews each turn and, when the agent struggled because of its instructions or tools, the conversation is uploaded and anagent_struggleanalytics event is emitted.Observability.supportgainsuploadNdjson(ndjson, kind)for uploading caller-built NDJSON bundles. (1fe9218) -
SceneViewdocks its properties and layers panels by default: a column beside the canvas (which narrows rather than sitting under them) holding an accordion with one section per panel, any number open, the column scrolling them together.SceneView.Roottakespanels(PanelMode:'docked'|'floating') to float them back over the canvas instead;PropertiesandLayersPaneltakedocked. The layers toolbar's delete and merge actions move into a menu at its end. A newSceneView.Aboutadds a dock-only section below the layers with the scene's object counts (Aboutis the panel itself). In Composer, a canvas drawing's menu offers "Dock panels" / "Float panels", stored as the canvas settingdockPanels.
In @dxos/react-ui, Toolbar adds no gap or inline padding of its own (its items carry their own spacing, and a ToggleGroup in a toolbar drops its gap to match), and an Accordion item's icon and caret sit in Blocks rather than custom padding, and list rows in a container with no gutter lose their rounded corners. In @dxos/react-ui-form, a Form.Viewport without scroll pads its block axis as the scrolling one does, so a form in a host that scrolls it still ends a gutter in. (fd09131)
- The scene shape is now a frame. Breaking: the built-in node type
sceneis renamedframe(palette name "Frame", shortcut F), withPortalNode→FrameNode,isPortalNode→isFrameNodeandPortalNodeView→FrameNodeView; the node'sscenefield (its child scene id) is unchanged, and drawings saved withtype: 'scene'are not migrated. A node type may definehostOpen, the host's own way to open a node of it: opening (double-click, Enter, the open control) calls it instead of drilling in, and auto-drill passes such a node by. A node type may also definetoolbar, controls drawn above the node, flush with its right edge and at screen size, shown while the node is hovered or selected. The canvas clips rather than hides its overflow, so focusing an editor in a node no longer scrolls the canvas out from under the camera. A frame always draws its border, and one the host opens itself is never faded as the scene being zoomed into. A node's embedded content (markeddata-scene-overlay) is live only while the node is active (SceneViewAtoms.active,NodeViewProps.active): a click on the node activates it, and selecting anything else or Escape deactivates it. Inactive, a press anywhere moves the node; active, a press on the content starts no move (so its controls receive their clicks), a double-click there does not open the node, and the wheel is the content's where it has something to scroll. Presses inside a portal the content opens (a menu) no longer reach the node.
In @dxos/plugin-canvas, a frame holds either its own nested scene or a referenced ECHO object: CanvasSceneNode.drawing is replaced by CanvasFrameNode.object (any object, picked in the properties panel) and role (card, section or article; unset is a card). A canvas drawing is embedded as a scene, as linked drawings were; any other object renders as its surface of that role, with a floating toolbar whose button opens the object in the app. Selecting the frame, or focusing within it, gives the object's surface attention, so its own toolbar acts. The object picker lists only user objects (those the navtree shows), not system objects such as space properties or canvases.
In @dxos/react-ui-form, the object picker's popup is as wide as its field rather than growing to its longest option.
In @dxos/react-ui, a Card.Root with border={false} also drops its corner radius, as its prop always described, so a card framed by its host shows no rounding of its own. (508be04)
- Scenes have layers.
Scene.layersholds orderedLayers (a scene that names none has one,DEFAULT_LAYER), and every node and link is on one (layer); created, pasted and fixture-built elements name theirs, and adding a layer first pins elements that name none to the layer they are drawn on (pinLayers), so a new bottom layer never takes them.@dxos/plugin-canvasnames the layers of a drawing saved before layers when it loads. Elements paint by layer, then by their own order, and a hidden layer is neither drawn nor hit.SceneView.Layers(LayersPanel) selects several layers at once, adds (at the end of the list), deletes, merges the selected layers into the top-most of them, shows or hides, reorders and renames them in place; new shapes go on the top-most selected layer, and the properties panel picks an element's layer. New intentslayerandremoveLayercarry the edits, so each is one undo step.CellGrid(withcreateCellGridAtoms,toggleCell,ToggleModeand its headers) is no longer exported from@dxos/react-ui-canvas: it moved into@dxos/plugin-sequencer, its only user.
In @dxos/react-ui, Editable's pencil opens the field with one click whatever the activation gesture, the field shows a save button (a green check) while editing, and inside a list row the preview takes the row's hover and its presses, so the list keeps its arrow keys. Listbox.Root takes selectionMode='extended' (Cmd/Ctrl- or Shift-click adds to the selection), and Listbox.Content takes padBlock to pad the list above and below by its gutter. In @dxos/react-ui-list, OrderedList.Root takes multiple, so value and onValueChange carry an array of ids. (347546a)
- A queued prompt's delivery ticks now sit on the prompt bubble's bottom edge instead of adding a line inside it, and its remove control moves into the toolbar under the bubble, which stays shown while the prompt can be removed.
Breaking: createDeliveryWidget is removed, and the renderer no longer emits a <delivery> tag; ChatThread renders the ticks from the message's delivery annotation itself. (1759426)
-
The scene engine's node types are defined by the registry: a type declares its text
partsandfields, mayextenda prototype, and itsdefaultSizeis in major grid cells. The UML class shape moved out of the built-ins into the new@dxos/plugin-uml. Breaking: hosts that setdefaultSizein pixels must give it in major cells, andsceneBounds,DEFAULT_EXTENTand the drawn scene frame are removed. Every nested scene keeps its own scale, so a shape is the same size at the same zoom on every level; Fit frames the shapes and never zooms past 100%, a new Actual size control returns to 100%, entering and leaving a scene take a second, and the layer around a scene being zoomed into fades out. A scene shape showing its contents draws them live at any size. Scene shapes look like rectangles, with an editable label, ports and a zoom-in control, and can show another canvas drawing. Styles are a hue and a tone from 0 to 3. Guides and the lattice have their own toggles. Links and their ends scale with the zoom.SceneView.Rootcan start from a saved camera and report camera changes (initialCamera,onCameraChange).SceneBuilderbuilds fixtures declaratively and rejects duplicate ids. Canvas drawings keep their camera position, have Lattice and Grid size settings in the Properties companion, and migrate content saved under the oldscene:rootid. (929d683) -
Links take a line style (a hue from the style grid's outline row, and solid, dashed or dotted), and their ends, arrow, triangle and circle, are a quarter of a major grid cell drawn in the line's hue; links scale with the zoom. Breaking:
Link.directedis removed in favour ofends: { end: 'arrow' }(plugin-canvas reads saveddirectedlinks as an end arrow). Tones 1 to 3 run strongest to lightest (the hue's 500, 400 and 300), the style grid offers sky in place of pink, node frames have a 2px border and labels default to 18px. New shapes are sized in major grid cells (a rectangle 2×1, an ellipse 2×2) and a node made by dropping a link is centred on the release point, selected with its link. The properties panel gains a toolbar with a flip-direction button for links and shows a scene shape's resolved Show contents; Fit leaves two major cells of margin, the navigation bar's Up and root are icons, and the depth label is gone. (8bd0c5b) -
The scene engine is now the root export of
@dxos/react-ui-canvas(@dxos/react-ui-canvas/scenestill resolves to the same exports), and@dxos/react-ui-canvas-compute's shapes are scene-engine node types: each shape module exports aNodeDef(gptNodeDef,triggerNodeDef, …, built withdefineComputeNode) whose component takesComputeNodeViewProps, with ports fromcreatePorts/createFunctionPorts, andcomputeNodeDefs/computeNodeRegistryare the palette.@dxos/react-ui-canvas-computenow owns theCanvasBoardECHO type (withCanvasGraphModel, the shape schemas andGraphMonitor), exported from its root and a new./typesentry point under the unchanged typenameorg.dxos.type.canvasBoardand version0.1.0, so saved boards load as before. Breaking:@dxos/react-ui-canvas-editoris removed;@dxos/react-ui-canvasno longer exports the pre-engine canvas (Canvas,useCanvasContext,Grid,FPS,ProjectionMapper,zoomTo,useDrag,useWheel,Markers,getRelativePointand thePoint/Dimension/Rectschemas) nor its./typesentry point; and compute's editor-basedShapeDefexports (gptShape, …),computeShapes,ComputeShapeLayout,useComputeGraphController,createFunctionAnchorsandComputeContext.registryare removed. (30b3bd3) -
Nodes and links share one
style: a link'sLineStyle(colour andlineStyle) is the common base a node'sNodeStyleextends with fill, tone, frame, font size and text alignment (alignHorizontal,alignVertical);styleFieldslets a shape extend it further. The properties panel edits the fields a mixed selection shares with one style picker. Drawings gain style classes (StyleClass,SceneStore.styles, kept in a new optionalCanvas.stylesmap besidecontent): an element naming a class derives its style from it, and editing a classed element's look edits the class. Shapes and links of an unregistered type render as the core base (BaseNode): a box showing itslabel, or a straight line. A scene shape can open any scene of its drawing, and "New scene from selection" (groupIntoScene) moves the selected nodes into a new scene behind one scene shape. Breaking: a link'sline({ hue, dash },LinkLine) is nowstyle({ hue, lineStyle }), which plugin-canvas reads from drawings saved the old way; a node style'sclassNameis removed; the UML class shape keeps its name inlabelinstead ofname. (3c4d73d)
Patch Changes
-
An app now has one process manager: the stack's
Process.ManagerService, which the app's operation invoker,Capabilities.ProcessManagerandAgentServiceall use. Operations the app invokes withon: 'edge'therefore run on EDGE instead of dying with "Remote process requested, but RemoteProcessManager offers no process control", which an agent's watches and Brain store views logged every three seconds.@dxos/app-frameworknow owns the unified-manager spec that@dxos/plugin-routineused to contribute, with a no-op remote manager as a fallback, and aLayerStackspec now outranks an ambient service of the same tag. (0715304) -
@dxos/brandships Poiret One (assets/fonts/poiret-one), the face of the Composer wordmark. The Markdown, Sheet, Tables and Projects plugins' details now include a narrated demo video, opening on the Composer ident. (085dcb1) -
Invitation spans are no longer lost to sampling. Tail sampling now keeps every span marked
dxos.sampling.keep, and both the host'shandleInvitationFlowspan and the guest'sacceptInvitationspan carry that mark, so short invitation flows are no longer dropped 70% of the time. The host span also recordsctx.outcomewhen it ends. (1819960) -
Switching a routine's action between Instructions and an operation no longer carries one kind's trigger inputs into the other: a stray
input: {}(or an operation'sconnection) failed every run until EDGE switched the trigger off. Switching a broken trigger back on now repairs it. Pressing Sync on an account whose sync routine is switched off now shows a toast that links to the routines panel, instead of retrying EDGE's 409 refusal for about 30 seconds. The trigger manager refuses a disabled trigger with a typedTriggerDisabledError, and EDGE force-runs no longer retry a 409 that is not about the trigger being switched off. (5324de6) -
An operation invoked with
on: 'edge'now fails with EDGE's reason when EDGE refuses its process (for exampleUnknown process key), and withRemoteRuntimeUnreachableErrorwhen EDGE has not accepted it within 30 seconds, instead of waiting forever; the agent's Brain store view shows that error rather than "Reading the brain…".EdgeCallFailedErrornow carries the response's HTTPstatus, and a remote process control dies withRemoteCommandRejectedErrorfor a refusal so the queued client stops retrying it. (35217f4) -
The devtools EDGE card no longer reports spurious red flags right after startup: its first status query waits until each active space is replicating with EDGE, and it re-queries every second while EDGE still reports issues. (716c951)
-
Fragments in the pre-Automerge-3.5 shape that a client receives after its one-time migration are repaired on every open, so it no longer uploads fragments that hide a document's head from EDGE. The EDGE connect flow now sends the SDK version on
/auth(X-DXOS-Version) as well as on the WebSocket, and EDGE's refusal of an outdated SDK surfaces asEdgeClientTooOldError, which is not retried. (6847fe2) -
Identical queries that differ only in
debugLabelnow share one cached query result, and so one worker query. (ed52cb7) -
Update
@automerge/automerge-subductionto 0.19.0, which addsSubduction.getHeads(id)for reading one tree's heads without loading the whole space. (5528d65) -
A one-shot query's stream now ends after its first result, so the query no longer stays registered and re-runs on invalidations until the client's interrupt arrives. Queries that register while the snapshot store is still filling share one completeness check instead of each running a full scan. (4ea1487)
-
The worker now logs a warning, above its default log filter, when an index pass, a query batch, full-text catch-up or a storage-only document load takes 1 s or more. A slow query batch names its slowest query. (ea0f796)
-
The constrained projection keeps a node's style: a hue or tone set from the properties panel on a constrained scene is stored in the model and survives later edits, where before it was dropped as solved geometry. (b06ee26)
-
Stop writing form field values to the debug log, so secrets typed into forms (passwords, API keys, access tokens) no longer reach
app.logor exported log bundles. (4820c02) -
The space Home page no longer holds its sections back or shifts while documents load: Recent reserves placeholder tiles sized from an index-only count, Activity waits for its stats instead of showing zeros, starter prompts show from the cache at once and skip the recent-objects query within the refresh interval, the assistant prompt renders before its chat model opens, and the recent-objects filter no longer repeats types.
Masonrynow lays out at its measured size in its first painted frame instead of starting at zero height, and reveals at once when an earlier mount cached every tile's height. (385f3ce) -
ThemePluginno longer scans the consumer's wholenode_moduleswhen the package is installed, which could stall a Vite dev server before its first response. Installed copies now scan the app's own sources and the built@dxospackages, plus any globs passed as the newcontentoption. (b07f49f)