The extension contract says:
- Extensions describe behavior with Python metadata.
.vyasa selects and configures extensions.
- Extensions register through a restricted
VyasaExtensionApp, not raw FastHTML
and not raw ExtensionRuntime mutation.
- The app surface includes:
app.routes.add(...)
app.assets.bundle(...)
app.markdown.fence(...)
app.markdown.preprocessor(...)
app.layout.slot(...)
app.layout.mode(...)
app.config.defaults(...)
app.lifecycle.startup(...)
app.lifecycle.shutdown(...)
app.storage.namespace(...)
- Capability strings validate conflicts and requirements.
- Asset bundles are loaded by page need.
- Storage namespaces give each extension durable local territory.
- A Markdown syntax marker has exactly one owning render extension.
- A route prefix has exactly one owning route extension.
- A slot has exactly one owner.
The current implementation does not provide VyasaExtension, does not provide
VyasaExtensionApp, does not instantiate extension classes, and lets built-ins
mutate ExtensionRuntime directly.