Jingle Developers

Extension model

Understand Jingle extension packages, manifests, command modes, settings, runtime code, and agent capabilities.

An extension package is the development and distribution boundary in Jingle. A package can declare commands, render React views, define connected accounts, provide a main service, and register capabilities that agents can call.

Package layout

extensions/github/
  manifest.ts
  runtime.ts
  runtime-metadata.ts
  main.ts
  assets/
    icon.svg
  src/
    my-issues.tsx
    create-issue.tsx
    tools.ts
    contracts.ts
FileResponsibilityStatus
manifest.tsTitle, icon, commands, settings, connection, and AI capabilityPreview
runtime.tsView, no-view, and menu-bar command entriesPreview
runtime-metadata.tsStatic runtime metadata such as viewportPreview
main.tsPrivileged RPC, tool definitions, local APIs, and provider callsPreview
assets/Icons and local resourcesPreview
Reference visual for an extension command in root search
A package can make multiple commands discoverable from the launcher; each command then chooses whether it renders a list, form, detail view, or no-view action.

Manifest

The manifest is how Jingle identifies an extension. It describes identity, commands, settings, and capabilities through a TypeScript definition:

import { defineNativeExtensionManifest } from "@openwork/extension-api"

export const githubManifest = defineNativeExtensionManifest({
  name: "github",
  title: "GitHub",
  iconName: "github",
  capabilities: ["navigation", "rpc", "surface"],
  commands: [
    {
      name: "my-issues",
      title: "My Issues",
      description: "List GitHub issues created by you, assigned to you, or mentioning you.",
      mode: "view"
    }
  ]
})

Core fields include:

FieldMeaning
name / title / description / icon / iconNameExtension identity and presentation
commandsCommands exposed to the launcher
preferencesExtension-level settings
connectionConnected-account declaration
aiCapabilityAgent-visible capability and tool list
runtimeCapabilitiesHost capabilities the runtime can request
runtimeShell.allowedUrlSchemesURL schemes the command may open
supportedPlatformsPlatform constraints

Command modes

modeUse caseStatus
viewCommands with a main UI such as search pages, forms, or listsPreview
no-viewImmediate actions without showing a main viewPreview
menu-barMenu bar status and actionsPreview
backgroundScheduled or resident background tasksPlanned

Preferences

Extensions and commands can contribute settings. Runtime code reads them with getPreferenceValues().

const preferences = getPreferenceValues<{
  accessToken: string
  apiBaseUrl: string
}>()
typeValueStatus
text / textfieldstringPreview
passwordstring, treated as a secret by the hostPreview
checkboxbooleanPreview
dropdownstringPreview
appPickerapplication name, bundle id, or pathPreview
file / directoryfile or directory pathPlanned

Runtime

Runtime packages use React components to describe command UI:

import { Action, ActionPanel, List } from "@openwork/extension-api"

export default function SearchPage() {
  return (
    <List searchBarPlaceholder="Search workspace">
      <List.Item
        title="Project Plan"
        subtitle="Notion"
        actions={
          <ActionPanel>
            <Action.OpenInBrowser url="https://example.com" title="Open" />
          </ActionPanel>
        }
      />
    </List>
  )
}

The runtime SDK covers lists, details, forms, ActionPanel, MenuBarExtra, toast, clipboard, storage, preferences, navigation, and command handoff. See API reference for the full surface.

Main service

Main service owns privileged or host-side work: provider API calls, filesystem bridges, native capabilities, and agent tool execution. Runtime code should request those capabilities through a service or host capability rather than reading renderer state or local credentials directly.

export const main = defineNativeExtensionMain({
  service: defineNativeExtensionService({
    methods: ["searchIssues"],
    async invoke(request, context) {
      // context.connection / context.extensionPreferences are resolved by Jingle.
    }
  })
})

AI capability

Extensions can declare agent-visible capabilities:

aiCapability: {
  id: "github",
  title: "GitHub",
  requiredPreferenceNames: ["accessToken"],
  publicPreferenceNames: ["apiBaseUrl"],
  toolNames: ["searchIssues", "createIssue"],
  guide: "Use GitHub only after the user connects GitHub."
}

Agents can see capability guidance, tool names, connection status, and presentation metadata. Credentials should not enter the prompt.