5ba2564ca0
A directive chip (`@url:`, `@session:`) reads as the thing it points at and is coloured like one, but a composer is an editor — a click inside the contenteditable only places the caret, so there was no way to actually act on the reference. Hovering a chip whose kind has an action now floats a pill above it that runs it: `@url:` opens in the browser, `@session:` opens the session as a tab. It's a small registry (`DIRECTIVE_ACTIONS`), so a new actionable kind is one entry, not another watcher. The pill portals to `<body>` and anchors to the chip's rect, so it can't end up inside the submitted draft, and it re-anchors on scroll and resize rather than stranding itself over a reference that moved or was deleted. The press is swallowed before it reaches the editor — mousedown in a contenteditable moves the caret, and the edit composer reads a blur as "cancel". Listeners bind to `document`, not the editor: the edit composer's contenteditable isn't reliably attached when the effect first runs, so an editor-bound listener never fired there. A document listener that reads the editor lazily works in both composers, and each instance filters to its own editor so one chip never shows two pills.