svrnty-hermes-webui-plugin/manifest.yaml
Svrnty 80420e0d01
Some checks failed
plugin-tests / test (push) Failing after 5s
feat(plugin): sidebar nav buttons for Adwright + BTE (v0.5.0)
JP feedback: floating BTE launcher + always-visible Adwright panel were
"very fucked up" UX. Replaced with proper hermes-webui sidebar integration.

New static/svrnty_nav.js:
- Injects 2 nav-tab buttons into .sidebar-nav matching the existing
  data-panel + nav-tab + has-tooltip pattern
- Adwright: bullseye icon (marketing intelligence)
- BTE: sparkle/palette icon (creative studio)
- Wraps window.switchPanel to add main.svrnty-showing-{adwright,bte}
  classes so our panels participate in the existing main-view show/hide
  system without editing upstream panels.js
- Dispatches "svrnty:panel-switch" CustomEvent so panel modules can
  lazy-init / open / close based on which panel is active

Adwright panel:
- adwright.css: hidden by default; shows only when main has
  .svrnty-showing-adwright. When showing, occupies full main width
  and hides all other main children (chat etc).
- adwright.js: no change to mount logic (already mounted inside <main>).

BTE panel:
- bte.js: removed _installLauncher (no more floating bottom-right button).
  Init now listens for svrnty:panel-switch events to open/close the
  overlay. Defensively removes any stale .svrnty-bte-launcher DOM nodes
  from prior plugin versions.
- bte.css: launcher styles replaced with display:none !important.

manifest.yaml: bumped 0.4.0 → 0.5.0, svrnty_nav.js added to assets in
the correct load order (after app.js, before adwright.js + bte.js).
CONNECTION-MAP regenerated.

Karpathy 4 rules: no upstream edit, smallest possible wrap of switchPanel
to keep our panels coexisting with native panels (chat, tasks, kanban,
etc), CSS-only visibility (no DOM thrashing).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 12:45:01 -04:00

57 lines
2.4 KiB
YAML

# svrnty-hermes-webui-plugin — manifest.
# Read by hermes-webui plugin loader + sync tooling. Machine-readable identity.
plugin_name: svrnty-hermes-webui-plugin
plugin_version: 0.5.0
entry_point: svrnty_hermes_webui_plugin:register
upstream:
project: nesquena/hermes-webui
min_version: v0.51.103 # earliest tested upstream (bumped by upstream-sync.py)
tested_versions: # appended by drift CI as it sweeps new tags
- v0.51.103
- v0.51.117
- v0.51.118
current_local: v0.51.118 # what the local fork tracks (latest upstream tag)
# Permanent public API surface the plugin uses (mirrors hermes-webui's loader hook).
# CONNECTION-MAP.md is the runtime-discovered truth; this list is just declarative.
public_api:
- register_route
- register_static
- inject_script
- inject_stylesheet
- config_get
- logger
- register_audio_attachment_processor
# Assets the plugin injects into index.html on every page load.
# Load order matters: svrnty_nav.js (sidebar buttons + switchPanel wrap) MUST
# load before adwright.js / bte.js so panel modules see the wrap in place.
assets:
scripts:
- /plugins/svrnty/app.js
- /plugins/svrnty/svrnty_nav.js
- /plugins/svrnty/adwright.js
- /plugins/svrnty/bte.js
stylesheets:
- /plugins/svrnty/app.css
- /plugins/svrnty/adwright.css
- /plugins/svrnty/bte.css
# Routes this plugin registers at load time (declarative cross-check vs runtime).
# Each row maps to a routes/<file>.py.
routes:
- { path: /api/transcribe, method: POST, file: routes/transcribe.py, status: live }
- { path: /api/vault/status, method: GET, file: routes/vault_status.py, status: live }
- { path: /api/adwright/last-panel-update, method: GET, file: routes/adwright.py, status: mock }
- { path: /api/adwright/provision-creds, method: POST, file: routes/adwright.py, status: live }
- { path: /api/bte/proxy, method: GET, file: routes/bte_proxy.py, status: live }
- { path: /api/bte/proxy, method: POST, file: routes/bte_proxy.py, status: live }
# Audio-attachment processors (called by streaming.py before agent receives message).
audio_processors:
- { file: routes/transcribe.py, fn: _transcribe_audio_attachments, status: live }
# Plugin refuses to load against an unlisted upstream version unless strict=0.
strict_version_check: false