Only one action source ever existed, so the
IActionSource interface and ScriptActionSource
are gone. ActionRegistry now subscribes to the
plugin loader and enumerates actions directly
in init() - no polymorphism for one impl.
Replace the opaque FNV-hash SpeedDialActionId
with a readable composed id of the form
prefix:title:source_key. Split AppAction's
single source field into source_key (stable
identity, e.g. plugin_key) and source_name
(display), so identity and display no longer
share one field.
Keep action identity and display metadata
constructor-set so registry keys cannot drift
from the objects they index.
Require sources to publish unique ownership while
the registry retains shared keepalive for runs.
Preserve opaque IDs and persisted state keys.
Decouple registry dispatch from plugin-specific
result types so future action types can provide
their own run implementations.
Store actions behind shared pointers to keep them
alive while plugin UI pumps a nested event loop
and queued refreshes mutate the registry. Scope
"don't ask again" to an individual action instead
of its whole plugin.
Right-clicking a fav tile now opens a small
context menu with Move left, Move right, and
Unpin, instead of relying on drag-only reorder.
- speeddial.js: oncontextmenu handler, the
menu build/position/dismiss logic, and an
Escape-key close.
- style.css: .ctx-menu/.ctx-item styling.
- ActionRegistry: reorder_favourites persists
the new bar order to AppConfig.
- SpeedDialDialog: routes the new
reorder_favourites command from the page.