Skip to main content

Manifest reference

defineApp() returns a twl-tool.app.v1 manifest. The TypeScript input has this top-level shape.

FieldTypeRequiredPurpose
keystringyesStable lowercase app slug
namestringyesUser-facing app name
versionstringyesInstallable app version
descriptionstring | nullnoCatalog and installation copy
permissionsstring[]noRequested platform permissions
catalogobjectnoCategory, runtime, tags, and featured state
uiobjectnoIcon, color, default surface, and surfaces
extensionobjectnoContextual browser-extension actions
sourceobjectnoProvenance for a cloned Space Template
spacesRecord<string, SpaceDefinition>noExplicit Space hierarchy and placement
resourcesAppResourcesyesDurable app resources

Generated fields

The SDK adds:

{
"format": "twl-tool.app.v1"
}

It also deduplicates permissions, creates the default root Space when needed, and selects the first surface when ui.defaultSurface is omitted.

Catalog values

Categories:

chrome-tools | browser-agents | automation | data | forms | other

Runtime values:

chrome-extension | browser-agent | server

For the server's current JSON schema and node catalog, request GET /api/v1/apps-layer/platform-schema.

Chat preset fields

A chat surface reuses the host AI chat and requires preset.workflow. Its optional preset fields include space, outputDocumentFolder, allowedTools, display-control flags, app instructions, and contextSources.

contextSources is an array of app-scoped @ mention providers. A Data Workspace row source has this shape:

{
key: string,
label: string,
type: 'dataWorkspaceRows',
table: ResourceReference<'dataWorkspaceTables'>,
workflowContextKey: string,
labelField: string,
descriptionFields?: string[],
filter?: {
field: string,
equals: string | number | boolean,
},
}

See Scoped AI chat for a complete example and workflow binding.