Plugin artifacts and the catalog

When a plugin package joins Oda, a build step turns its source into the artifacts the runtime loads: a record of what the package exposes, the schemas that validate its contracts, and the client side of its Remote methods. This page follows that pipeline for plugin developers: what the build generates and checks, how the runtime registers the result, and how the service and event catalog stays in step with the code.

What the build generates

Export entryWhat it publishes
A host entryThe host side: the package's record of what it exposes, and its runtime schemas.
A client entryThe client side of the package.
A remote entryThe client projections of the package's Remote methods.

What fails the build

The build checks the manifest against what it generated, and fails when the two disagree:

How the runtime registers a package

The catalog of services and events

The catalog is generated from the sources: it lists the services and the events a plugin can listen to, with their signatures, and the inspection tools read it, so their answers describe what this build actually exposes (Inspect and manage extensions). The same catalog is written into developer pages as generated regions.

What a package manifest declares

Questions, answered

What keeps the catalog in step with the code?

Generation does. The catalog is produced from the sources, and a freshness check compares the committed result with them; when the two drift apart, the check fails and tells you to regenerate and commit. The gates fail closed in between: a missing annotation, or a type with no home, stops the generation instead of shipping a catalog that does not match the code.

May I edit the text between the generated markers?

No. Everything between the BEGIN GENERATED and END GENERATED markers is produced from the sources; an edit there is lost on the next regeneration, and a committed region that no longer matches its sources fails the freshness check. Edit the source and regenerate.

Why did the catalog gate refuse a type my service uses?

The referenced type has no home in the catalog: no documentation page owns it, it is not one of the built-in types, and no exemption covers it. The failure names the type; give it a home, or an exemption, and regenerate.

What does the counted register failure mean?

A malformed artifact failed the load for packages that were already mounted. The report counts the contributors that could not register (<n> contributor(s) failed to register:), and each failing contributor brings its own message. Repair or remove the package and start Oda again; a failure later in the process is logged for that package, and unrelated packages keep registering.

Why does my nested plugin not register?

Oda does not discover a package that sits behind another entry on its own. Name the package explicitly in the setup; a named entry that cannot be resolved, or that lacks its export entry, fails the load loudly and names the package.

Which entries must a contributing package declare?

One export entry for each side it contributes: a host entry, a client entry and, when it declares Remote methods, a remote entry. Each entry names its declaration file under types and its runtime file under default, and the build fails on an entry that does not point exactly at the generated files.

What does write mode change in my sources?

It inserts the public type annotations that check mode would refuse, then re-checks the edited projects from scratch, so anything it cannot repair still fails. Check mode only reports; it never changes your sources.

Does the client side register itself?

No. Automatic registration covers the host side only in the current build; the client side has no matching automatic discovery.

When does a registration go away?

When the plugin that made it unloads: each registration is withdrawn exactly then. An artifact whose import settles after its plugin is gone is discarded rather than registered late.