Skip to content

LiveContext CE v0.2.14

Latest

Choose a tag to compare

@livecontext-ai livecontext-ai released this 29 Aug 11:39

What is new

Sharing: a published page stops depending on the publisher's files

  • Every file a publication shows is now copied into the publication's own namespace, and stays there. Deleting the source file no longer blanks the page. Two whole populations had never been through that copy: publications made before the copy existed, and any publication whose interface data carried a file flattened into a URL string. An admin sweep replays the copy over snapshots already stored, one publication or the whole fleet, with a dry run that reports the scope without touching storage.

  • On a first publish, no file was ever copied at all. The publication's id was assigned at save time while the copy ran before it, so both file passes returned at their first line, silently, on the path where it mattered most. That is the reason so many published pages were still reading the publisher's live files.

  • A media that vanished a few hours after publish. A page whose data carried a public-link URL lost every image and video once that link's own expiry passed, and no re-render could fix it because the URL was frozen in the snapshot. Both the publish-time and the read-time walkers now recognise that shape, so an already-published page heals on its next read with no re-publish.

  • A landing page copies its files too. For an agent, table or skill publication nothing was copied, because a landing is never cloned into an acquirer. It is still rendered for every marketplace visitor, which is the part that mattered.

  • Every file copy is now gated on who may own the file. A path found in publication data is publisher-authored text, and the copy endpoint used to infer the owner from the path itself, so naming a stranger's path copied their file into the publication and served it, signed, to anonymous visitors. Every copy path now passes one check that asks whether the path is in scope, and the second allowed owner is stated by whoever can know it rather than read off the path being checked. Path traversal, absolute and empty segments are refused.

  • A published node shows the file it produced, and keeps it. The pill a node hangs under itself on the canvas was outside all of the above: nothing in the snapshot carried a step's file, so the marketplace had none to show. One file per node per epoch is now frozen with the publication and rendered from its own copy.

  • The publisher's tenant id no longer leaves with the payload. It was being copied into the anonymously readable landing response and onward to the cloud marketplace.

The side panel becomes a window

  • The panel can be detached into a floating card over the app, moved and resized with the pointer or the keyboard, from any edge or corner, and persisted per workspace. Detaching is a mode flip rather than a re-mount, so a running canvas, an open run stream and interface iframes all survive it.

  • It shades to a single strip and comes back on a click, with the grip riding at the head of the tab bar instead of costing a title bar of its own, and a short cue when the strip appears so it is not lost on screen.

  • A workflow opened in the panel has Save, Run and Share. Those lived in the page header, so a workflow reached from a chat was visible, editable and unsaveable. An application opened there gets the full set of sub-tabs instead of one bare interface, so the workflow behind it can be watched running.

  • Two canvases on screen no longer act as one. The workflow window events were broadcast unscoped: one Save saved both workflows, one Run started two billed runs, and a version restore re-imported one workflow's plan onto another's canvas.

  • The Run tab carries a way back to the canvas, next to the run it belongs to, instead of only at the bottom of a list long enough to push it off screen.

Workflows

  • A merge that no branch reached is skipped, never run on someone else's item. A merge becomes ready once its predecessors are terminal, and a skipped predecessor counts as terminal, so a merge whose branches were all skipped for one item was executed for that item anyway. On one production run that meant an agent drafting a reply to a mail whose route was "delete", then closing the epoch green with five nodes holding no record at all. The rule was already written in the docs and in one service; only the engine disagreed.

  • A workflow can say who calls it. A sub-workflow call is stored in the caller's plan, so a workflow had no way to name its callers. Both directions are now offered on the canvas toolbar and in the card footers, derived from the plans on read, so a plan save can never leave a stale relation behind. A relation the workspace cannot resolve is listed but unnamed rather than hidden.

  • Every field the engine resolves has its expression editor. Comparing the engine's own template list against the forms found eight places where the panel disagreed with it: a value typed by hand already worked, but nothing said so, and there was no drop target and no unknown-variable warning. Sub-workflow, SSH, SFTP, database, stop-on-error, send-email, email-inbox and HTTP request fields are corrected; the ones that resolve nothing are left alone and the reason is written down.

  • run_node runs one configuration over many inputs in a single call. An agent that wanted the same node run over N inputs had to spend N turns on it. An entry is byte-identically what a separate call does today, gate for gate and credit for credit, and the report is per entry so one failure does not stop the others.

Tables and files

  • A file column and an image column are one thing now, two presentations of the same stored value rather than two contracts, and a cell can point at a file that already exists in Files rather than uploading an isolated copy. Legacy columns keep their type and upgrade themselves on the next write.

  • The Files picker can find a file. It listed the whole workspace as one undifferentiated stream, showed a type icon where the file's own thumbnail would have answered the question, and offered no folders. It now navigates folders and the workflow tree, offers grid or list, and searches across the workspace rather than the folder in view.

  • Previews are rounded squares. A circle crops the sides off anything that is not a portrait, which is most of what a table holds.

Folders and lists

  • A folder can be left again. A page opened directly on a folder link, or restored with a tab, could not be navigated out of: the crumbs and the up arrow resolved to nothing. The same shape was live on the agent list tabs, the marketplace filters and several deep links, all fixed with one helper.

  • A folder of pages or applications shows what is inside it, the real pages and the live app previews, instead of a grey silhouette or a single letter.

  • Filing works with a finger, the folder path is a drop target rather than dead space, and the drop target is decided by the pointer rather than by the preview drifting behind it.

Applications and pages

  • A page you open arrives silent, with a control to give it sound. Opening a page from the list is a look, not a decision to be spoken to, so it follows the rule an application's preview already followed. A button beside Edit opens the controls, and appears only once the page has said there is something to control.

  • An application's sound switch moves out of the settings cog and into the controls toolbar with pagination and fullscreen, where the other view controls are. A visitor who cannot copy the app has no cog at all and now still has the sound.

Agents

  • An agent can be deleted from the edit modal, behind the same confirmation the rest of the app uses, instead of leaving the modal to select the row in the list.

Generation

  • Seedance was two models out of seven, and every one of them was sold under cost. The flagship 2.5 and the cheapest 2.0 mini were unreachable by any path. Pricing was worse: the provider bills by resolution and the descriptor carried one flat per-second price while letting the caller pick the resolution for free, so a five-second 1080p clip cost several times what it was sold for. The resolution is now part of the model, eleven of them, each priced from the published examples. The two existing ids are pinned to what was already their effective default, so nothing pinned in a workflow moves.

  • A model offered but never priced is now reported. Such a value is absent from the generation catalogue, so the only way in is a raw call, where every billing guard reads the descriptor, finds no rate and dispatches the platform key anyway. Nothing failed, which is how four of them lived like that for months.

Self-hosted installs

  • The update check can now count installs, anonymously, and you can turn it off. Every install already called the release feed once a day to learn whether it was behind, and that call carried no identifier, so five installs and five hundred looked the same. It now presents one random id per install. The record holds that id, the running version, and first-seen and last-seen: no IP in the row, no hostname, no tenant, no account. Set CE_VERSIONCHECK_SENDINSTALLID=false to keep the update check without the id, or CE_VERSIONCHECK_ENABLED=false to turn the check off entirely. Settings > Information says which of the two you are on.

Fixes

  • The advanced inspector no longer breaks in a production build. Double-clicking a node threw and unmounted the whole panel, in released builds only, never in development, because of how the bundler grouped modules rather than anything in the application logic.

  • The grip you drag a panel by shows the open hand, which a rule in the global stylesheet had been quietly overriding on every focusable drag surface in the app, and the inspector's own handle stops hiding until hovered.

  • The relations control is a plain square button beside Settings, rather than a chip with a count painted on it like an unread badge.

Update an existing install

git pull
docker compose pull
docker compose up -d

The compose file pins this release's image tag, so run git pull first. Your data lives in Docker volumes and is kept across updates.

Fresh install

git clone https://github.com/livecontext-ai/livecontext-ce
cd livecontext-ce
docker compose up -d

Then open http://localhost:3000

Images

Pull from whichever registry you prefer, the digests are identical.

  • ghcr.io/livecontext-ai/livecontext-ce:v0.2.14

  • ghcr.io/livecontext-ai/livecontext-ce-frontend:v0.2.14

  • ghcr.io/livecontext-ai/livecontext-ce-bridge:v0.2.14

  • ghcr.io/livecontext-ai/livecontext-ce-screenshot-renderer:v0.2.14 (opt-in renderer profile)

  • docker.io/livecontext/livecontext-ce:v0.2.14

  • docker.io/livecontext/livecontext-ce-frontend:v0.2.14

  • docker.io/livecontext/livecontext-ce-bridge:v0.2.14

  • docker.io/livecontext/livecontext-ce-screenshot-renderer:v0.2.14 (opt-in renderer profile)

  • quay.io/livecontext/livecontext-ce:v0.2.14

  • quay.io/livecontext/livecontext-ce-frontend:v0.2.14

  • quay.io/livecontext/livecontext-ce-bridge:v0.2.14

  • quay.io/livecontext/livecontext-ce-screenshot-renderer:v0.2.14 (opt-in renderer profile)

Each image is also tagged v0.2, v0 and latest if you prefer to track a moving line rather than pin an exact release.