Extension build artifacts and checks

An extension package hands DataMind Oda its contracts through files its build generates: a record of what the package exposes, the schemas that validate those contracts at runtime, and, for packages with Remote calls, the client side of those calls. This page covers what the build generates and checks, what a package manifest declares, and how the runtime registers the result. Read it when you wire a package's build, or when a failure names one of the checks below.

What the build generates

Generation is a build-time step. It never runs in a live chat: Oda loads the files a build produced, and it does not generate them while it runs.

Declare the generated files in the manifest

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

What the build checks

Manifest fields for display and compatibility

All of these fields are optional: omitting one leaves it undeclared, and readers do not infer a default.

What the runtime does with the artifacts

Questions, answered

Does generation run while Oda is running?

No. Generation runs only at build time, never in a live chat. Oda loads what the build produced; it does not generate the files itself.

Why was my package not picked up?

Only concrete export targets are read. A package whose exports use a wildcard pattern is not analysed; give the package concrete export targets instead.

Why did the build refuse my package's export entry?

The entry does not point at the generated files exactly as written: the declaration file under types and the runtime file under default, for every generated artifact. Fix the entry and build again; the failure reads must export <subpath> as {"types":...,"default":...}.

Why does the build say a package publishes Remote artifacts but has no Remote methods?

The manifest still publishes the Remote client artifacts, but the package no longer declares Remote methods. Remove the leftover artifacts, or put the methods back.

Which JSDoc does a new service or event need?

An event needs an @mode tag, one of emit, bail, waterfall, parallel and serial. Every parameter needs @param <name>, and a service method that returns a value needs @returns (return type: <type>). A missing tag fails the catalogue check, and the failure names the source file and line.

Which TypeScript constructs cannot become schemas?

A generic schema declaration, and computed constructs such as a conditional or mapped root. The build fails on them and names the construct; it does not weaken the type.

What happens when two packages register the same name?

The whole batch is rejected before anything is committed. The identities are checked together: the same package and side, schema name, invocation id or endpoint.

Can a wire declaration change after a runtime has seen it?

No. Registering the same name again with a changed wire declaration is refused during that runtime's lifetime.

What happens when a change listener fails?

Nothing else stops: the failure is logged, and later listeners still run.

What icon may a package declare?

An SVG, PNG, JPEG or WebP file, at most 256 KiB, kept inside the package folder. The app shows it as an image, never as inline markup.

What does an engines range enforce?

Nothing by itself today. It declares the compatible Oda versions as a SemVer range, including an exact version, but declaring a range does not reject an incompatible host: compatibility is declarative.

Why must I restart after a package gains its declared export?

Oda works out once, for the whole process, whether a package contributes its generated files, and that verdict is cached for the life of the process. Add the export, then start Oda again; Hot reload lists what applies live.