Audience: Contributor
How the CMS hosts installed packs (not how operators click Install).
menu-options.service builds project app nav from bound menuItems but currently keeps only items with type === 'settings'. Packs may still declare payment-config (Payments); those entries are stored on bind but not shown in the sidebar. Operators configure payment credentials under Plugins.
Install copies pack server JS under the project shared tree and registers project_plugin rows. Runtime routes mount under /api/app/:projectId/* when pack JS is loaded. See developer docs: App package, App API.
Payment, shipping, promo, exchange, auth, tool, and site packs contribute through the app-extension / kind registry on the server. Prefer adding capabilities as plugins unless the feature must live in core.
When a plugin is enabled for a project, the host reads that plugin’s assistant ability declarations (agent blocks on its tasks and any kinds it registers) and makes them available to the assistant. When the plugin is disabled, those declarations are dropped.
How to write a declaration: Make a plugin usable by the assistant. Pipeline overview: AI pipeline.