Skip to main content
Capabilities are a UI and runtime contract, not marketing metadata. Ophel only exposes controls that match the active pack’s capability set, and the runtime validator rejects packs that declare a capability without the required fields. The authoritative capability list lives in src/adapters/feature-capabilities.ts. The authoritative field requirements live in src/adapters/declarative/validate.ts.

Capability catalog

There is no capability id named theme-sync. Host theme sync is a separate config field, themeSync, and may imply supportsHostThemeSync.

Capability notes

Outline family

  • outline needs a conversation container so Ophel can scope scanning.
  • outline-user-queries cannot be declared alone; the validator requires outline as well.
  • Prefer stable message roots over translated visible text.

Prompt insertion

prompt-insert needs both:
  • one or more textarea / contenteditable selectors
  • an input block with mode (textarea or contenteditable) and submitKey (Enter or Ctrl+Enter)
Ophel uses the native value setter for textareas and a validated beforeinput / execCommand path for contenteditable editors. It does not silently fall back to assigning textContent.

Generation detection

Use whichever signal is reliable on the target site:
  • generating.existsSelectors — visible DOM markers while generating
  • networkMonitor — request URL / body rules when DOM state is insufficient
A pack may provide either or both. Declaring generation-detect without either is rejected.

Layout capabilities

Theme sync is not a capability id

Sites that switch light / dark mode by writing localStorage and optionally toggling a class on <html> can declare themeSync:
Rules grounded in the current validator:
  • storageKey, values.dark, and values.light are required when themeSync is present
  • values.system is only for sites that store a distinct follow-system value
  • darkClass / lightClass are optional; both may be omitted when the site listens to storage events itself
  • nested object storage uses valuePath; flat JSON-encoded strings use valueFormat: "json"
  • valuePath and valueFormat cannot be combined
  • body class, data-theme, or click-simulation theme mechanisms are not supported by this field
  • declaring themeSync while also setting supportsHostThemeSync: false is rejected

Example: Duck.ai capability set

The published duck-ai pack currently declares:
It does not declare conversation-list, model-lock, clean, panel-avoidance, or reading-history. The product UI therefore does not present those pack-backed controls for Duck.ai. These groups are not capabilities themselves, but they often accompany capability declarations: Full field, length, regex, CSS, and size limits are defined by: When the two disagree, the runtime validator wins.
Last modified on August 5, 2026