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.
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.
The build checks the package manifest against what it generated, and fails when the two disagree:
types and its runtime file under default. An entry that is missing or points elsewhere fails the build with must export <subpath> as {"types":. . . ,"default":. . . }.package files must include <file>.publishes Remote artifacts but has no Remote methods. Remove the leftovers or put the methods back.The build fails on syntax or semantic errors, a public member without an explicit type annotation, a reference to another package's private declaration, and a declaration merge that cannot be kept losslessly.
A namespace re-export that crosses between the host and client areas cannot be represented, so it fails the build.
Schema generation covers a deliberate subset. A generic schema declaration cannot be emitted, and computed constructs such as a conditional or mapped root fail with the construct named, instead of a weakened type.
The service and event catalogue that feeds the inspection tools (Inspect and manage extensions) is generated from the sources, and its checks are strict. An event needs an @mode tag, every parameter needs @param, and a service method that returns a value needs @returns. The failures read:
is missing an @mode tag. Add '@mode emit|bail|waterfall|parallel|serial' to its JSDocis missing @param <name>.is missing @returns (return type: <type>).Each finding names its service or event and the source file and line, and the check fails with the total count.
A freshness check compares the committed generated files with their sources: when one no longer matches, the check fails and says to regenerate it and commit the result.
All of these fields are optional: omitting one leaves it undeclared, and readers do not infer a default.
1, independent of the package version and of the chat log format.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.
Only concrete export targets are read. A package whose exports use a wildcard pattern is not analysed; give the package concrete export targets instead.
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":..
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.
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.
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.
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.
No. Registering the same name again with a changed wire declaration is refused during that runtime's lifetime.
Nothing else stops: the failure is logged, and later listeners still run.
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.
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.
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.