> ISPO SDK documentation. [HTML](https://ispo.ai/docs/interfaces/core.ProjectCapabilityDescriptor.html) · [Documentation index](https://ispo.ai/docs/llms.txt)

# Interface ProjectCapabilityDescriptor

Durable, host-indexed cross-project capability metadata (§25). NOT ambient authority — the durable counterpart of an `assistant.actions` entry.

```typescript
interface ProjectCapabilityDescriptor {
    acceptsContext?: ("source-range" | "selection" | "chat-transcript")[];
    agent?: string;
    confirmation: CapabilityConfirmationClass;
    description: string;
    hostOp?: string;
    id: string;
    inputSchema: ProjectCommandSchema;
    invocationMode: CapabilityInvocationMode;
    label: string;
    preconditions?: ProjectCommandPrecondition[];
    promptExamples?: string[];
    resources?: {
        inputs: {
            format: {
                maxBytes: number;
                maxPixels?: number;
                mediaTypes: (
                    | "image/png"
                    | "image/jpeg"
                    | "image/webp"
                    | "text/plain"
                    | "application/json"
                    | "audio/wav"
                )[];
            };
            maxItems: number;
            minItems: number;
            name: string;
        }[];
        output: {
            channel: "files"
            | "assets";
            format: {
                maxBytes: number;
                maxPixels?: number;
                mediaTypes: (
                    | "image/png"
                    | "image/jpeg"
                    | "image/webp"
                    | "text/plain"
                    | "application/json"
                    | "audio/wav"
                )[];
            };
            maxItems: number;
            minItems: number;
        };
    };
    resultChannels: CapabilityResultChannel[];
    resultSchema: ProjectCommandSchema;
    usage?: string;
}
```

Types: [acceptsContext](#acceptscontext), [agent](#agent), [confirmation](#confirmation), [CapabilityConfirmationClass](../types/core.CapabilityConfirmationClass.md), [description](#description), [hostOp](#hostop), [id](#id), [inputSchema](#inputschema), [ProjectCommandSchema](core.Supporting_types.ProjectCommandSchema.md), [invocationMode](#invocationmode), [CapabilityInvocationMode](../types/core.CapabilityInvocationMode.md), [label](#label), [preconditions](#preconditions), [ProjectCommandPrecondition](core.Supporting_types.ProjectCommandPrecondition.md), [promptExamples](#promptexamples), [resources](#resources), [resultChannels](#resultchannels), [CapabilityResultChannel](../types/core.CapabilityResultChannel.md), [resultSchema](#resultschema), [usage](#usage)

##### Index

### <a id="properties"></a>Properties

[acceptsContext?](#acceptscontext) [agent?](#agent) [confirmation](#confirmation) [description](#description) [hostOp?](#hostop) [id](#id) [inputSchema](#inputschema) [invocationMode](#invocationmode) [label](#label) [preconditions?](#preconditions) [promptExamples?](#promptexamples) [resources?](#resources) [resultChannels](#resultchannels) [resultSchema](#resultschema) [usage?](#usage)

## <a id="properties-1"></a>Properties

### <a id="acceptscontext"></a>`Optional`acceptsContext

```typescript
acceptsContext?: ("source-range" | "selection" | "chat-transcript")[]
```

Context slots accepted by the worker command. The host validates every supplied claim and copies its inline snapshot; this declaration grants no ambient access.

### <a id="agent"></a>`Optional`agent

```typescript
agent?: string
```

`agent-task` mode only: the agent kind spawned INTO the worker target through `agent.spawn` (internal spec §10.22). Required iff `invocationMode === 'agent-task'`.

### <a id="confirmation"></a>confirmation

```typescript
confirmation: CapabilityConfirmationClass
```

Types: [CapabilityConfirmationClass](../types/core.CapabilityConfirmationClass.md)

### <a id="description"></a>description

```typescript
description: string
```

### <a id="hostop"></a>`Optional`hostOp

```typescript
hostOp?: string
```

`host-op` mode only: the §7.9 host operation the capability lowers to (internal spec §7.9). Required iff `invocationMode === 'host-op'`.

### <a id="id"></a>id

```typescript
id: string
```

Namespaced `${ownerProjectId}:${capabilityName}`. The host rejects a foreign owner segment. The local name may be reused by other projects; the full owner-qualified id is re-derived and verified before routing.

### <a id="inputschema"></a>inputSchema

```typescript
inputSchema: ProjectCommandSchema
```

Types: [ProjectCommandSchema](core.Supporting_types.ProjectCommandSchema.md)

### <a id="invocationmode"></a>invocationMode

```typescript
invocationMode: CapabilityInvocationMode
```

Types: [CapabilityInvocationMode](../types/core.CapabilityInvocationMode.md)

Slice: `'iframe-action'`, `'agent-task'`, and `'host-op'` are parse-accepted (`'runtime-job'` stays out of slice).

### <a id="label"></a>label

```typescript
label: string
```

Display only; NEVER a routing or trust key.

### <a id="preconditions"></a>`Optional`preconditions

```typescript
preconditions?: ProjectCommandPrecondition[]
```

Types: [ProjectCommandPrecondition](core.Supporting_types.ProjectCommandPrecondition.md)

Producer-declared runtime readiness notes disclosed after exact selection. Untrusted copy, never authorization input; a note with `requiresInput` is additionally enforced pre-dispatch as an actionable not-ready signal.

### <a id="promptexamples"></a>`Optional`promptExamples

```typescript
promptExamples?: string[]
```

Short project-authored composer examples. Presentation-only and untrusted.

### <a id="resources"></a>`Optional`resources

```typescript
resources?: {
    inputs: {
        format: {
            maxBytes: number;
            maxPixels?: number;
            mediaTypes: (
                | "image/png"
                | "image/jpeg"
                | "image/webp"
                | "text/plain"
                | "application/json"
                | "audio/wav"
            )[];
        };
        maxItems: number;
        minItems: number;
        name: string;
    }[];
    output: {
        channel: "files"
        | "assets";
        format: {
            maxBytes: number;
            maxPixels?: number;
            mediaTypes: (
                | "image/png"
                | "image/jpeg"
                | "image/webp"
                | "text/plain"
                | "application/json"
                | "audio/wav"
            )[];
        };
        maxItems: number;
        minItems: number;
    };
}
```

Named byte inputs and a validated artifact result; never a grant.

### <a id="resultchannels"></a>resultChannels

```typescript
resultChannels: CapabilityResultChannel[]
```

Types: [CapabilityResultChannel](../types/core.CapabilityResultChannel.md)

All channels — `json`, `files`, `assets`, `entities`, `edit-session`, `source-patch`, `agent-run` — are parse-accepted and host-routable.

### <a id="resultschema"></a>resultSchema

```typescript
resultSchema: ProjectCommandSchema
```

Types: [ProjectCommandSchema](core.Supporting_types.ProjectCommandSchema.md)

### <a id="usage"></a>`Optional`usage

```typescript
usage?: string
```

Bounded project-authored playbook disclosed only after exact selection. It is untrusted copy and never an authorization input.
