Bundle
A bundle installs several separately identifiable plugins. Declare the exclusive bundle kind, list child manifest IDs in contains and declare their npm packages in dependencies. A bundle has no browser half.
contains identifies what to install; dependencies tells npm where to obtain it. Both are needed. plugin-bundle uses sibling file dependencies for the supplied page and widget examples; a distributable package needs resolvable dependency specifications.
Ownership and removal
Installing a bundle promotes missing children to the top level of the user's plugin installation. Each child can be enabled, moved or removed independently.
Newly installed children carry installedBy: <bundle-id> in their configuration. Removing the bundle removes only children carrying that ownership marker. A child already present remains untouched. Reinstalling a child directly clears the marker, making it independent of the bundle.
Expansion stops after one level. A bundle listed inside another bundle is installed but is not recursively expanded; this avoids cycles.
A client-only child can be active without a main entry: the daemon serves its browser bundle without executing host code. Multiple UI registrations from one package are not a bundle; see Kinds.