Repository navigation
Releases
v0.6.2 — the trigger moves into the session header action row
Put the trigger in the session header's action row, not the overlay layer
The one-click graph button was registered in shell.overlay, and the first fix
for it moved the CSS instead of the seat. The slot catalog is explicit about what
that seat is for: "Frame-wide floating layer, above every column and outside their
scroll containers... a badge, a toast stack or a status pill all belong here", and
the layer is click-through by design so an overlay never blocks the app
underneath. A BUTTON registered there is wrong twice over:
- it is drawn in the window's top-left, beside the Application/Edit menus and the
sidebar's reopen control, so it reads as a stray icon in the window chrome; - it cannot be clicked without opting back into pointer events, because the layer
ispointer-events: none.
It now registers in conversation.session.header.actions, the title-adjacent row
the shipped jobs, subagent, agent-preset and agent-team controls occupy, and it
copies their metrics rather than inventing a look: borderless, transparent, at
least 28px, --dsw-radius-sm, tertiary label colour at rest and secondary on
hover, with the open state keeping its brand tint through data-state. The icon
is icon-only in that row, so it now carries aria-label beside its tooltip. The
seat is a named constant (TRIGGER_SLOT), and the comments that described a
top-right frame trigger are gone with the seat.
Verification: node tests/activate.mjs, all checks passing. The gate now asserts
the trigger is in the header action row, that nothing of this plugin is registered
in shell.overlay, and that the action names itself.
v0.6.1 — the stylesheet has an owner, and the trigger is clickable
The harness client loader owns plugin styles by the data-plugin attribute:
claimStyles marks every <style> that LACKS it as belonging to whichever plugin
materialises next, and removeOwnedStyles(id) deletes every <style> whose
data-plugin equals an id when that entry is replaced or pruned. This sheet
carried only a private data-dsh-knowledge-dag marker, so it looked unowned to
the loader: the next plugin to materialise claimed it, and that plugin's first
refresh or prune deleted it. Losing the sheet is silent and severe, because an
SVG with no fill: none fills black: the graph drew as black shapes and
the trigger fell back to the browser's default button. The sheet is injected
while apply runs, which is after the loader's claim pass, so this plugin's own
claim never saw it either. It now carries data-plugin and data-plugin-css, a
second apply no longer stacks a duplicate sheet, and tests/activate.mjs
asserts the tagging so the sheet cannot silently become unowned again.
The frame trigger no longer positions itself with position: fixed at the top
right. That end of the window's control row belongs to minimise, maximise and
close, so a fixed trigger is painted underneath them and cannot be clicked; it
now sits in the frame's overlay seat as a normal icon button of that row.
CHANGELOG records 0.6.1.
Verification: node tests/activate.mjs, all checks passing, including the two
new ones that would have caught the deleted sheet.
v0.6.0 - first public release
[0.6.0] — 2026-10-04
First public release: the plugin is installable from GitHub, carries a license,
and ships the gate that proves its browser half still activates.
Added
- The node-link graph view. The pane's third tab draws the record as nodes and
descent edges in one SVG: a node's colour is its status, a dashed edge crosses
tracks, hovering lights a node's own edges, and the panel's filters dim the
nodes they exclude instead of removing them, so the shape of the record
survives the question "where is this one". Pan, zoom, and a fit control belong
to the reader; the layout is computed once in graph coordinates. tests/activate.mjs— an activation gate for the browser half. The bundle
has no build step, so nothing type-checks it and nothing loads it outside a
browser: a brokenclient.cjsotherwise surfaces only as the harness boot
audit reporting that the entry did not activate. The gate evaluates the real
bundle, callsapplyover service fakes that enforce the 0.2.0 registry rules,
renders every registration once, and checks that the frame trigger reads the
on-screen session.LICENSE(MIT) and.gitattributes, which keeps the two committed halves in
LF so a clone does not show a line-ending diff.
Fixed
- The frame trigger read the wrong session.
sidebarRight.openTabsis not one
session's tab list: it is the pane's inventory of saved and adopted layouts,
flattened across every session, and each record carries its ownsessionId. The
trigger asked "is this kind open anywhere", so with a knowledge-graph tab open
in any session every session's button read open and its click closed the
column instead of opening the graph. It now reads the on-screen session from
sidebarRight.mountedand watches both sources, and it reads closed when no
session is on screen.
Changed
- The README is written for someone installing the plugin rather than for the
author planning it, and no longer contains absolute paths from one machine.