@intentic/extension-manifest
v1.394.0
Published
What an intentic extension DECLARES, the intentic-extension.json schema and the sandbox-route allowlist rule
Readme
extension-manifest
The schema of intentic-extension.json: what an extension declares it contributes and may reach, which the install dialog shows and the host holds every registration to.
flowchart LR
points["src/points/<br/>one file per contribution point"] --> manifest(["ExtensionManifestSchema"])
manifest -- "manifestJsonSchema" --> schema["intentic-extension.schema.json<br/>author's editor hover text"]
manifest --> daemon["Daemon<br/>install · updates · route gate"]
manifest --> web["Editor<br/>install dialog · extension host"]
manifest --> scan["registry-scan<br/>readiness checks"]manifest.tsis the envelope. Each contribution point (views, commands, capabilities, listener, processes and the rest) is aContributionPointinsrc/points/, carrying the sentence an author sees as hover text.- The runtime parse is lenient and the authoring schema strict, since an unknown key in an author's file is a typo.
The generated schema is committed twice, here and in the site's
public/behindMANIFEST_SCHEMA_URL, and the editor'smanifest-schema.test.tsfails when either copy is stale. - A cli card whose credential is a delegated OAuth sign-in declares
refreshToken(the secret field it lives in and the fields it is bound to), so its own CLI and listener can store a new or rotated token through the daemon's write-only oauth-token route instead of printing it for someone to paste, andprobe.oauth, which trades the token for an access token before the card's connection test (Microsoft's identity platform only, today). sandboxRouteAllowedis the permission rule: an entry is"<METHOD> <path-glob>", and each*stands alone between slashes and matches one whole path segment, never a.or..the URL would resolve away. A malformed entry (**, a*inside a segment, an unknown method, a relative path) fails the manifest parse rather than the first call it gates.extensionRouteReachis the whole rule for an extension's own token: the two routes every extension reaches about itself (EXTENSION_OWN_ROUTES: its settings and its event stream), its own listener provider's routes, and whateverpermissions.daemondeclares. The daemon's grant and the SDK's test fake both judge by it, and./permissionsexports the rule alone, for a process that should not load the manifest schema.- What a field MEANS to the host is declared on the field, with
.meta({ power, effect, mintsServer })(meaning.ts), and read from there: the powersdiffPowersfolds a manifest into (so an update re-asks only when it adds one), the effects a card discloses in the capability catalog, and the capability kinds whose ids becomemcp__<id>__servers in the contract's reserved-name check. A new field is either given a meaning where it is defined or has none. toolServersOfis the one reading of which MCP servers a manifest serves the agent:contributes.tools, or a cli card'smcp, its alias for one release. AsuperRefineon the envelope says what no single field can: tools need aserverbundle or a declared process to serve them.HOST_PUBLISHED_SPECIFIERSlists the only bare imports a published bundle may use: the modules the shell's import map provides.bundleProblemfinds a bundle's imports with a small tokenizer rather than a line regex, since a minified bundle puts them all on one line and a string or comment may spell the word.- The same reading names what each static import takes (
bundleImportedNames:RepoRailofimport { RepoRail as e },defaultof a default import).missingImportscompares that with what a host's modules export, which the caller hands in, andbundleProblemsays it in words when given them. The editor's loader runs it before linking a bundle, over only the imports at the bundle's head (leading), where a bundler puts them all. That takes a fraction of a millisecond where reading a 700 KB bundle whole took about 20 (2026-10-15), and an import it does not reach fails to link as it would have.
Key files
- src/manifest.ts —
ExtensionManifestSchema, the envelope. - src/points/index.ts — every contribution point, assembled into
contributes. - src/permissions.ts — the sandbox-route allowlist rule.
- src/meaning.ts — the meaning a field declares, and the walk that reads it off a manifest.
- src/powers-diff.ts — what an update asks for, as set arithmetic over powers.
- intentic-extension.schema.json — the generated authoring schema.
Commands
pnpm --filter @intentic/extension-manifest schema # regenerate both copies of the authoring schema
pnpm --filter @intentic/extension-manifest test # the bundle scanner, the permission grammar, every power counting