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

# Interface HostApi

```typescript
interface HostApi {
    capabilities: { list(): Promise<HostCapabilitySurface> };
    evaluations: {
        beginFolderSelection(
            input?: EvaluationFolderSelectionInput,
        ): Promise<EvaluationFolderSelection | null>;
        createWork(
            input: EvaluationWorkCreateInput,
        ): Promise<EvaluationWorkCreateResult>;
        getRemediation(
            input: EvaluationRemediationStatusInput,
        ): Promise<EvaluationRemediationStatus | null>;
        getRun(input: EvaluationRunGetInput): Promise<EvaluationRunGetResult>;
        listRuns(input?: EvaluationRunListInput): Promise<EvaluationRunListResult>;
        listWorkRoots(
            input?: EvaluationWorkRootListInput,
        ): Promise<readonly EvaluationWorkRootCatalogEntry[]>;
        request(
            input: EvaluationRunRequestInput,
        ): Promise<EvaluationRunRequestResult>;
        rerun(input: EvaluationRunRerunInput): Promise<EvaluationRunDetail>;
        startRemediation(
            input: EvaluationRemediationStartInput,
        ): Promise<EvaluationRemediationStartResult>;
    };
    icons: {
        cancelCreate(): Promise<void>;
        create(input: HostIconsCreateInput): Promise<HostIconsCreateResult>;
    };
    projectIcons: {
        catalog(): Promise<HostProjectIconCatalogSnapshot>;
        delete(
            input: HostProjectIconDeleteInput,
        ): Promise<HostProjectIconDeleteResult | null>;
        set(input: HostProjectIconSetInput): Promise<HostProjectIconAssignment>;
        setMany(
            input: HostProjectIconSetManyInput,
        ): Promise<HostProjectIconSetManyResult>;
        targets(): Promise<HostProjectIconTargetsResult>;
        watchCatalog(
            input: HostProjectIconCatalogWatchInput,
        ): Promise<HostProjectIconCatalogSnapshot>;
    };
    projects: { list(): Promise<HostProjectSummary[]> };
    sounds: {
        catalog(): Promise<HostSoundCatalogSnapshot>;
        set(input: HostSoundSetInput): Promise<HostSoundAssignment>;
        setMany(input: HostSoundSetManyInput): Promise<HostSoundSetManyResult>;
        targets(): Promise<HostSoundTargetsResult>;
        watchCatalog(
            input: HostSoundCatalogWatchInput,
        ): Promise<HostSoundCatalogSnapshot>;
    };
    spec: {
        listSections(): Promise<HostSpecSectionSummary[]>;
        readSection(
            input: HostSpecSectionReadInput,
        ): Promise<HostSpecSectionContent>;
    };
    composeInChat(prompt: string): void;
    navigate(input: HostNavigateInput): Promise<void>;
    onNavigate(handler: HostNavigateHandler): () => void;
    openCreateProjectDraft(input: HostCreateProjectDraftInput): void;
    openExternal(url: string): Promise<void>;
    proposeSpecEdits(input: ProposeSpecEditsInput): void;
}
```

Types: [capabilities](#capabilities), [HostCapabilitySurface](core.Supporting_types.HostCapabilitySurface.md), [evaluations](#evaluations), [EvaluationFolderSelectionInput](../types/core.EvaluationFolderSelectionInput.md), [EvaluationFolderSelection](core.EvaluationFolderSelection.md), [EvaluationWorkCreateInput](core.EvaluationWorkCreateInput.md), [EvaluationWorkCreateResult](core.EvaluationWorkCreateResult.md), [EvaluationRemediationStatusInput](core.EvaluationRemediationStatusInput.md), [EvaluationRemediationStatus](core.EvaluationRemediationStatus.md), [EvaluationRunGetInput](core.EvaluationRunGetInput.md), [EvaluationRunGetResult](../types/core.EvaluationRunGetResult.md), [EvaluationRunListInput](core.EvaluationRunListInput.md), [EvaluationRunListResult](core.EvaluationRunListResult.md), [EvaluationWorkRootListInput](../types/core.EvaluationWorkRootListInput.md), [EvaluationWorkRootCatalogEntry](core.EvaluationWorkRootCatalogEntry.md), [EvaluationRunRequestInput](core.EvaluationRunRequestInput.md), [EvaluationRunRequestResult](../types/core.EvaluationRunRequestResult.md), [EvaluationRunRerunInput](core.EvaluationRunRerunInput.md), [EvaluationRunDetail](core.EvaluationRunDetail.md), [EvaluationRemediationStartInput](core.EvaluationRemediationStartInput.md), [EvaluationRemediationStartResult](core.EvaluationRemediationStartResult.md), [icons](#icons), [HostIconsCreateInput](core.HostIconsCreateInput.md), [HostIconsCreateResult](core.HostIconsCreateResult.md), [projectIcons](#projecticons), [HostProjectIconCatalogSnapshot](core.HostProjectIconCatalogSnapshot.md), [HostProjectIconDeleteInput](core.HostProjectIconDeleteInput.md), [HostProjectIconDeleteResult](core.HostProjectIconDeleteResult.md), [HostProjectIconSetInput](core.HostProjectIconSetInput.md), [HostProjectIconAssignment](core.HostProjectIconAssignment.md), [HostProjectIconSetManyInput](core.HostProjectIconSetManyInput.md), [HostProjectIconSetManyResult](core.HostProjectIconSetManyResult.md), [HostProjectIconTargetsResult](core.HostProjectIconTargetsResult.md), [HostProjectIconCatalogWatchInput](core.HostProjectIconCatalogWatchInput.md), [projects](#projects), [HostProjectSummary](core.HostProjectSummary.md), [sounds](#sounds), [HostSoundCatalogSnapshot](core.HostSoundCatalogSnapshot.md), [HostSoundSetInput](core.HostSoundSetInput.md), [HostSoundAssignment](core.HostSoundAssignment.md), [HostSoundSetManyInput](core.HostSoundSetManyInput.md), [HostSoundSetManyResult](core.HostSoundSetManyResult.md), [HostSoundTargetsResult](core.HostSoundTargetsResult.md), [HostSoundCatalogWatchInput](core.HostSoundCatalogWatchInput.md), [spec](#spec), [HostSpecSectionSummary](core.HostSpecSectionSummary.md), [HostSpecSectionReadInput](core.HostSpecSectionReadInput.md), [HostSpecSectionContent](core.HostSpecSectionContent.md), [composeInChat](#composeinchat-1), [navigate](#navigate-1), [HostNavigateInput](core.HostNavigateInput.md), [onNavigate](#onnavigate-1), [HostNavigateHandler](../types/core.HostNavigateHandler.md), [openCreateProjectDraft](#opencreateprojectdraft-1), [HostCreateProjectDraftInput](core.Supporting_types.HostCreateProjectDraftInput.md), [openExternal](#openexternal-1), [proposeSpecEdits](#proposespecedits-1), [ProposeSpecEditsInput](core.Supporting_types.ProposeSpecEditsInput.md)

##### Index

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

[capabilities](#capabilities) [evaluations](#evaluations) [icons](#icons) [projectIcons](#projecticons) [projects](#projects) [sounds](#sounds) [spec](#spec)

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

[composeInChat](#composeinchat) [navigate](#navigate) [onNavigate](#onnavigate) [openCreateProjectDraft](#opencreateprojectdraft) [openExternal](#openexternal) [proposeSpecEdits](#proposespecedits)

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

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

```typescript
capabilities: { list(): Promise<HostCapabilitySurface> }
```

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

#### Type Declaration

*   ##### list: function
    
    *   ```typescript
        list(): Promise<HostCapabilitySurface>
        ```
        
        Types: [HostCapabilitySurface](core.Supporting_types.HostCapabilitySurface.md)
        
        The platform capability vocabulary plus THIS project's own envelope (§10.33). Grantless, argument-free, and inert: every project method with the declaration token and grant capability its gates read, the connector providers and host catalog selectors, device features, built-in entity types, and a `self` block with the caller's reviewed requests, live grants, and trust class.
        
        Use it to render an honest blocked state — "Calendar write isn't granted yet" with a one-click ask — instead of discovering a missing grant from a failed call. It discloses no other project's envelope and grants nothing: a listed method still faces both gates when you call it.
        
        #### Returns Promise<[HostCapabilitySurface](core.Supporting_types.HostCapabilitySurface.md)\>
        

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

```typescript
evaluations: {
    beginFolderSelection(
        input?: EvaluationFolderSelectionInput,
    ): Promise<EvaluationFolderSelection | null>;
    createWork(
        input: EvaluationWorkCreateInput,
    ): Promise<EvaluationWorkCreateResult>;
    getRemediation(
        input: EvaluationRemediationStatusInput,
    ): Promise<EvaluationRemediationStatus | null>;
    getRun(input: EvaluationRunGetInput): Promise<EvaluationRunGetResult>;
    listRuns(input?: EvaluationRunListInput): Promise<EvaluationRunListResult>;
    listWorkRoots(
        input?: EvaluationWorkRootListInput,
    ): Promise<readonly EvaluationWorkRootCatalogEntry[]>;
    request(
        input: EvaluationRunRequestInput,
    ): Promise<EvaluationRunRequestResult>;
    rerun(input: EvaluationRunRerunInput): Promise<EvaluationRunDetail>;
    startRemediation(
        input: EvaluationRemediationStartInput,
    ): Promise<EvaluationRemediationStartResult>;
}
```

Types: [EvaluationFolderSelectionInput](../types/core.EvaluationFolderSelectionInput.md), [EvaluationFolderSelection](core.EvaluationFolderSelection.md), [EvaluationWorkCreateInput](core.EvaluationWorkCreateInput.md), [EvaluationWorkCreateResult](core.EvaluationWorkCreateResult.md), [EvaluationRemediationStatusInput](core.EvaluationRemediationStatusInput.md), [EvaluationRemediationStatus](core.EvaluationRemediationStatus.md), [EvaluationRunGetInput](core.EvaluationRunGetInput.md), [EvaluationRunGetResult](../types/core.EvaluationRunGetResult.md), [EvaluationRunListInput](core.EvaluationRunListInput.md), [EvaluationRunListResult](core.EvaluationRunListResult.md), [EvaluationWorkRootListInput](../types/core.EvaluationWorkRootListInput.md), [EvaluationWorkRootCatalogEntry](core.EvaluationWorkRootCatalogEntry.md), [EvaluationRunRequestInput](core.EvaluationRunRequestInput.md), [EvaluationRunRequestResult](../types/core.EvaluationRunRequestResult.md), [EvaluationRunRerunInput](core.EvaluationRunRerunInput.md), [EvaluationRunDetail](core.EvaluationRunDetail.md), [EvaluationRemediationStartInput](core.EvaluationRemediationStartInput.md), [EvaluationRemediationStartResult](core.EvaluationRemediationStartResult.md)

#### Type Declaration

*   ##### beginFolderSelection: function
    
    *   ```typescript
        beginFolderSelection(
            input?: EvaluationFolderSelectionInput,
        ): Promise<EvaluationFolderSelection | null>
        ```
        
        Types: [EvaluationFolderSelectionInput](../types/core.EvaluationFolderSelectionInput.md), [EvaluationFolderSelection](core.EvaluationFolderSelection.md)
        
        Open the Host folder picker and return one opaque, single-use selector.
        
        #### Parameters
        
        *   `Optional`input: [EvaluationFolderSelectionInput](../types/core.EvaluationFolderSelectionInput.md)
        
        #### Returns Promise<[EvaluationFolderSelection](core.EvaluationFolderSelection.md) | null\>
        
*   ##### createWork: function
    
    *   ```typescript
        createWork(
            input: EvaluationWorkCreateInput,
        ): Promise<EvaluationWorkCreateResult>
        ```
        
        Types: [EvaluationWorkCreateInput](core.EvaluationWorkCreateInput.md), [EvaluationWorkCreateResult](core.EvaluationWorkCreateResult.md)
        
        Create Host-routed work from one completed proposal and a Host selector.
        
        #### Parameters
        
        *   input: [EvaluationWorkCreateInput](core.EvaluationWorkCreateInput.md)
        
        #### Returns Promise<[EvaluationWorkCreateResult](core.EvaluationWorkCreateResult.md)\>
        
*   ##### getRemediation: function
    
    *   ```typescript
        getRemediation(
            input: EvaluationRemediationStatusInput,
        ): Promise<EvaluationRemediationStatus | null>
        ```
        
        Types: [EvaluationRemediationStatusInput](core.EvaluationRemediationStatusInput.md), [EvaluationRemediationStatus](core.EvaluationRemediationStatus.md)
        
        Read bounded remediation status without exposing its working directory.
        
        #### Parameters
        
        *   input: [EvaluationRemediationStatusInput](core.EvaluationRemediationStatusInput.md)
        
        #### Returns Promise<[EvaluationRemediationStatus](core.EvaluationRemediationStatus.md) | null\>
        
*   ##### getRun: function
    
    *   ```typescript
        getRun(input: EvaluationRunGetInput): Promise<EvaluationRunGetResult>
        ```
        
        Types: [EvaluationRunGetInput](core.EvaluationRunGetInput.md), [EvaluationRunGetResult](../types/core.EvaluationRunGetResult.md)
        
        Read one bounded Host-owned run detail.
        
        #### Parameters
        
        *   input: [EvaluationRunGetInput](core.EvaluationRunGetInput.md)
        
        #### Returns Promise<[EvaluationRunGetResult](../types/core.EvaluationRunGetResult.md)\>
        
*   ##### listRuns: function
    
    *   ```typescript
        listRuns(input?: EvaluationRunListInput): Promise<EvaluationRunListResult>
        ```
        
        Types: [EvaluationRunListInput](core.EvaluationRunListInput.md), [EvaluationRunListResult](core.EvaluationRunListResult.md)
        
        Read bounded Host-owned run summaries. No evidence bytes or paths cross.
        
        #### Parameters
        
        *   `Optional`input: [EvaluationRunListInput](core.EvaluationRunListInput.md)
        
        #### Returns Promise<[EvaluationRunListResult](core.EvaluationRunListResult.md)\>
        
*   ##### listWorkRoots: function
    
    *   ```typescript
        listWorkRoots(
            input?: EvaluationWorkRootListInput,
        ): Promise<readonly EvaluationWorkRootCatalogEntry[]>
        ```
        
        Types: [EvaluationWorkRootListInput](../types/core.EvaluationWorkRootListInput.md), [EvaluationWorkRootCatalogEntry](core.EvaluationWorkRootCatalogEntry.md)
        
        List bounded Host-selected roots; selectors never disclose filesystem paths.
        
        #### Parameters
        
        *   `Optional`input: [EvaluationWorkRootListInput](../types/core.EvaluationWorkRootListInput.md)
        
        #### Returns Promise<readonly [EvaluationWorkRootCatalogEntry](core.EvaluationWorkRootCatalogEntry.md)\[\]\>
        
*   ##### request: function
    
    *   ```typescript
        request(input: EvaluationRunRequestInput): Promise<EvaluationRunRequestResult>
        ```
        
        Types: [EvaluationRunRequestInput](core.EvaluationRunRequestInput.md), [EvaluationRunRequestResult](../types/core.EvaluationRunRequestResult.md)
        
        Request a Host-resolved evaluation after native source selection.
        
        #### Parameters
        
        *   input: [EvaluationRunRequestInput](core.EvaluationRunRequestInput.md)
        
        #### Returns Promise<[EvaluationRunRequestResult](../types/core.EvaluationRunRequestResult.md)\>
        
*   ##### rerun: function
    
    *   ```typescript
        rerun(input: EvaluationRunRerunInput): Promise<EvaluationRunDetail>
        ```
        
        Types: [EvaluationRunRerunInput](core.EvaluationRunRerunInput.md), [EvaluationRunDetail](core.EvaluationRunDetail.md)
        
        Ask Host to derive and launch a new run from the selected canonical run.
        
        #### Parameters
        
        *   input: [EvaluationRunRerunInput](core.EvaluationRunRerunInput.md)
        
        #### Returns Promise<[EvaluationRunDetail](core.EvaluationRunDetail.md)\>
        
*   ##### startRemediation: function
    
    *   ```typescript
        startRemediation(
            input: EvaluationRemediationStartInput,
        ): Promise<EvaluationRemediationStartResult>
        ```
        
        Types: [EvaluationRemediationStartInput](core.EvaluationRemediationStartInput.md), [EvaluationRemediationStartResult](core.EvaluationRemediationStartResult.md)
        
        Start remediation only for an already rooted work item.
        
        #### Parameters
        
        *   input: [EvaluationRemediationStartInput](core.EvaluationRemediationStartInput.md)
        
        #### Returns Promise<[EvaluationRemediationStartResult](core.EvaluationRemediationStartResult.md)\>
        

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

```typescript
icons: {
    cancelCreate(): Promise<void>;
    create(input: HostIconsCreateInput): Promise<HostIconsCreateResult>;
}
```

Types: [HostIconsCreateInput](core.HostIconsCreateInput.md), [HostIconsCreateResult](core.HostIconsCreateResult.md)

Bundled-Icons-only generated-icon transaction. Main owns provider egress, secret resolution, durable persistence, and Asset publication.

#### Type Declaration

*   ##### cancelCreate: function
    
    *   ```typescript
        cancelCreate(): Promise<void>
        ```
        
        Cancel the active generation request, if one exists.
        
        #### Returns Promise<void\>
        
*   ##### create: function
    
    *   ```typescript
        create(input: HostIconsCreateInput): Promise<HostIconsCreateResult>
        ```
        
        Types: [HostIconsCreateInput](core.HostIconsCreateInput.md), [HostIconsCreateResult](core.HostIconsCreateResult.md)
        
        #### Parameters
        
        *   input: [HostIconsCreateInput](core.HostIconsCreateInput.md)
        
        #### Returns Promise<[HostIconsCreateResult](core.HostIconsCreateResult.md)\>
        

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

```typescript
projectIcons: {
    catalog(): Promise<HostProjectIconCatalogSnapshot>;
    delete(
        input: HostProjectIconDeleteInput,
    ): Promise<HostProjectIconDeleteResult | null>;
    set(input: HostProjectIconSetInput): Promise<HostProjectIconAssignment>;
    setMany(
        input: HostProjectIconSetManyInput,
    ): Promise<HostProjectIconSetManyResult>;
    targets(): Promise<HostProjectIconTargetsResult>;
    watchCatalog(
        input: HostProjectIconCatalogWatchInput,
    ): Promise<HostProjectIconCatalogSnapshot>;
}
```

Types: [HostProjectIconCatalogSnapshot](core.HostProjectIconCatalogSnapshot.md), [HostProjectIconDeleteInput](core.HostProjectIconDeleteInput.md), [HostProjectIconDeleteResult](core.HostProjectIconDeleteResult.md), [HostProjectIconSetInput](core.HostProjectIconSetInput.md), [HostProjectIconAssignment](core.HostProjectIconAssignment.md), [HostProjectIconSetManyInput](core.HostProjectIconSetManyInput.md), [HostProjectIconSetManyResult](core.HostProjectIconSetManyResult.md), [HostProjectIconTargetsResult](core.HostProjectIconTargetsResult.md), [HostProjectIconCatalogWatchInput](core.HostProjectIconCatalogWatchInput.md)

#### Type Declaration

*   ##### catalog: function
    
    *   ```typescript
        catalog(): Promise<HostProjectIconCatalogSnapshot>
        ```
        
        Types: [HostProjectIconCatalogSnapshot](core.HostProjectIconCatalogSnapshot.md)
        
        Read the canonical App Icon catalog used by every host picker, plus named read-only projections such as the exact bundled collection. System Icons (`host-ui-icon`) are structurally excluded.
        
        #### Returns Promise<[HostProjectIconCatalogSnapshot](core.HostProjectIconCatalogSnapshot.md)\>
        
*   ##### delete: function
    
    *   ```typescript
        delete(
            input: HostProjectIconDeleteInput,
        ): Promise<HostProjectIconDeleteResult | null>
        ```
        
        Types: [HostProjectIconDeleteInput](core.HostProjectIconDeleteInput.md), [HostProjectIconDeleteResult](core.HostProjectIconDeleteResult.md)
        
        Delete one global App Icon after host confirmation. This destructive operation has its own `requests.chrome: ["project-icon-delete"]` gate; cancelling the confirmation resolves with null.
        
        #### Parameters
        
        *   input: [HostProjectIconDeleteInput](core.HostProjectIconDeleteInput.md)
        
        #### Returns Promise<[HostProjectIconDeleteResult](core.HostProjectIconDeleteResult.md) | null\>
        
*   ##### set: function
    
    *   ```typescript
        set(input: HostProjectIconSetInput): Promise<HostProjectIconAssignment>
        ```
        
        Types: [HostProjectIconSetInput](core.HostProjectIconSetInput.md), [HostProjectIconAssignment](core.HostProjectIconAssignment.md)
        
        Set or clear a host project icon. Bundled/system-app only; requires `requests.chrome: ["project-icons"]` and the `projectIcons.manage` grant.
        
        #### Parameters
        
        *   input: [HostProjectIconSetInput](core.HostProjectIconSetInput.md)
        
        #### Returns Promise<[HostProjectIconAssignment](core.HostProjectIconAssignment.md)\>
        
*   ##### setMany: function
    
    *   ```typescript
        setMany(
            input: HostProjectIconSetManyInput,
        ): Promise<HostProjectIconSetManyResult>
        ```
        
        Types: [HostProjectIconSetManyInput](core.HostProjectIconSetManyInput.md), [HostProjectIconSetManyResult](core.HostProjectIconSetManyResult.md)
        
        Batch variant for icon-library apply flows.
        
        #### Parameters
        
        *   input: [HostProjectIconSetManyInput](core.HostProjectIconSetManyInput.md)
        
        #### Returns Promise<[HostProjectIconSetManyResult](core.HostProjectIconSetManyResult.md)\>
        
*   ##### targets: function
    
    *   ```typescript
        targets(): Promise<HostProjectIconTargetsResult>
        ```
        
        Types: [HostProjectIconTargetsResult](core.HostProjectIconTargetsResult.md)
        
        List projects that may receive an App Icon. This narrow read avoids requesting agent-dispatch authority merely to render an app picker.
        
        #### Returns Promise<[HostProjectIconTargetsResult](core.HostProjectIconTargetsResult.md)\>
        
*   ##### watchCatalog: function
    
    *   ```typescript
        watchCatalog(
            input: HostProjectIconCatalogWatchInput,
        ): Promise<HostProjectIconCatalogSnapshot>
        ```
        
        Types: [HostProjectIconCatalogWatchInput](core.HostProjectIconCatalogWatchInput.md), [HostProjectIconCatalogSnapshot](core.HostProjectIconCatalogSnapshot.md)
        
        Wait for the canonical catalog revision to change. A timeout resolves successfully with the unchanged snapshot.
        
        #### Parameters
        
        *   input: [HostProjectIconCatalogWatchInput](core.HostProjectIconCatalogWatchInput.md)
        
        #### Returns Promise<[HostProjectIconCatalogSnapshot](core.HostProjectIconCatalogSnapshot.md)\>
        

**Authority for `host.projectIcons`**

Reviewed request token: `chrome.project-icons`. Standing capability: `projectIcons.manage`.

Handle structured `ProjectRpcError` failures. A timeout does not guarantee cancellation; do not automatically retry effects without a documented idempotency contract. [Method authority and recovery](/docs/documents/Method_authority.md).

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

```typescript
projects: { list(): Promise<HostProjectSummary[]> }
```

Types: [HostProjectSummary](core.HostProjectSummary.md)

#### Type Declaration

*   ##### list: function
    
    *   ```typescript
        list(): Promise<HostProjectSummary[]>
        ```
        
        Types: [HostProjectSummary](core.HostProjectSummary.md)
        
        List registered projects for a picker. Read-only and grantless; the result intentionally contains no project roots or authority metadata.
        
        #### Returns Promise<[HostProjectSummary](core.HostProjectSummary.md)\[\]\>
        

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

```typescript
sounds: {
    catalog(): Promise<HostSoundCatalogSnapshot>;
    set(input: HostSoundSetInput): Promise<HostSoundAssignment>;
    setMany(input: HostSoundSetManyInput): Promise<HostSoundSetManyResult>;
    targets(): Promise<HostSoundTargetsResult>;
    watchCatalog(
        input: HostSoundCatalogWatchInput,
    ): Promise<HostSoundCatalogSnapshot>;
}
```

Types: [HostSoundCatalogSnapshot](core.HostSoundCatalogSnapshot.md), [HostSoundSetInput](core.HostSoundSetInput.md), [HostSoundAssignment](core.HostSoundAssignment.md), [HostSoundSetManyInput](core.HostSoundSetManyInput.md), [HostSoundSetManyResult](core.HostSoundSetManyResult.md), [HostSoundTargetsResult](core.HostSoundTargetsResult.md), [HostSoundCatalogWatchInput](core.HostSoundCatalogWatchInput.md)

#### Type Declaration

*   ##### catalog: function
    
    *   ```typescript
        catalog(): Promise<HostSoundCatalogSnapshot>
        ```
        
        Types: [HostSoundCatalogSnapshot](core.HostSoundCatalogSnapshot.md)
        
        Read the canonical UI-sound catalog (every accepted `ui-sound` asset). Requires `requests.chrome: ["host-sound-catalog"]` and the `hostSounds.manage` grant; catalog access does not by itself request assignment.
        
        #### Returns Promise<[HostSoundCatalogSnapshot](core.HostSoundCatalogSnapshot.md)\>
        
*   ##### set: function
    
    *   ```typescript
        set(input: HostSoundSetInput): Promise<HostSoundAssignment>
        ```
        
        Types: [HostSoundSetInput](core.HostSoundSetInput.md), [HostSoundAssignment](core.HostSoundAssignment.md)
        
        Assign or clear the host UI sound for one slot (`soundRef: null` clears back to the host default). Requires `requests.chrome: ["host-sounds"]` and the `hostSounds.manage` grant. The host validates the ref is an accepted `ui-sound` asset (PCM WAV, ≤ 3s, ≤ 2MB) at assignment time.
        
        #### Parameters
        
        *   input: [HostSoundSetInput](core.HostSoundSetInput.md)
        
        #### Returns Promise<[HostSoundAssignment](core.HostSoundAssignment.md)\>
        
*   ##### setMany: function
    
    *   ```typescript
        setMany(input: HostSoundSetManyInput): Promise<HostSoundSetManyResult>
        ```
        
        Types: [HostSoundSetManyInput](core.HostSoundSetManyInput.md), [HostSoundSetManyResult](core.HostSoundSetManyResult.md)
        
        Batch variant for sound-library apply flows (max 50 updates). Same `requests.chrome: ["host-sounds"]` + `hostSounds.manage` gate as set.
        
        #### Parameters
        
        *   input: [HostSoundSetManyInput](core.HostSoundSetManyInput.md)
        
        #### Returns Promise<[HostSoundSetManyResult](core.HostSoundSetManyResult.md)\>
        
*   ##### targets: function
    
    *   ```typescript
        targets(): Promise<HostSoundTargetsResult>
        ```
        
        Types: [HostSoundTargetsResult](core.HostSoundTargetsResult.md)
        
        List the host sound slots (id, label, description, current soundRef). The slot vocabulary is closed and host-owned; treat this as the runtime authority rather than hardcoding `HostSoundSlotId`. Same `requests.chrome: ["host-sounds"]` + `hostSounds.manage` gate as set.
        
        #### Returns Promise<[HostSoundTargetsResult](core.HostSoundTargetsResult.md)\>
        
*   ##### watchCatalog: function
    
    *   ```typescript
        watchCatalog(
            input: HostSoundCatalogWatchInput,
        ): Promise<HostSoundCatalogSnapshot>
        ```
        
        Types: [HostSoundCatalogWatchInput](core.HostSoundCatalogWatchInput.md), [HostSoundCatalogSnapshot](core.HostSoundCatalogSnapshot.md)
        
        Wait for the canonical catalog revision to change. A timeout resolves successfully with the unchanged snapshot. Same `requests.chrome: ["host-sound-catalog"]` + `hostSounds.manage` gate as catalog.
        
        #### Parameters
        
        *   input: [HostSoundCatalogWatchInput](core.HostSoundCatalogWatchInput.md)
        
        #### Returns Promise<[HostSoundCatalogSnapshot](core.HostSoundCatalogSnapshot.md)\>
        

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

```typescript
spec: {
    listSections(): Promise<HostSpecSectionSummary[]>;
    readSection(
        input: HostSpecSectionReadInput,
    ): Promise<HostSpecSectionContent>;
}
```

Types: [HostSpecSectionSummary](core.HostSpecSectionSummary.md), [HostSpecSectionReadInput](core.HostSpecSectionReadInput.md), [HostSpecSectionContent](core.HostSpecSectionContent.md)

#### Type Declaration

*   ##### listSections: function
    
    *   ```typescript
        listSections(): Promise<HostSpecSectionSummary[]>
        ```
        
        Types: [HostSpecSectionSummary](core.HostSpecSectionSummary.md)
        
        List the canonical spec outline. Requires the existing spec principal; no repository root or absolute path crosses the project boundary.
        
        #### Returns Promise<[HostSpecSectionSummary](core.HostSpecSectionSummary.md)\[\]\>
        
*   ##### readSection: function
    
    *   ```typescript
        readSection(input: HostSpecSectionReadInput): Promise<HostSpecSectionContent>
        ```
        
        Types: [HostSpecSectionReadInput](core.HostSpecSectionReadInput.md), [HostSpecSectionContent](core.HostSpecSectionContent.md)
        
        Read one canonical Markdown source by manifest id. Caller paths are not accepted or resolved.
        
        #### Parameters
        
        *   input: [HostSpecSectionReadInput](core.HostSpecSectionReadInput.md)
        
        #### Returns Promise<[HostSpecSectionContent](core.HostSpecSectionContent.md)\>
        

## <a id="methods-1"></a>Methods

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

*   <a id="composeinchat-1"></a>
    
    ```typescript
    composeInChat(prompt: string): void
    ```
    
    Hand a prompt to the host **Chat** pane: the host seeds the currently selected chat/draft composer with `prompt` and focuses it (does not start a new chat). Fire-and-forget (a host-chrome trigger, NOT an RPC — there is no reply). The user still presses Send; a sandboxed project can never make the assistant act on its own, so this is not gated by a device/consent grant — the human Send is the trust boundary. A no-op when not embedded (`window.parent === window`) or when `prompt` is empty. Only honored for the currently active project's chat. Use it to demonstrate or seed a "change this app" prompt in-product.
    
    #### Parameters
    
    *   prompt: string
    
    #### Returns void
    

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

*   <a id="navigate-1"></a>
    
    ```typescript
    navigate(input: HostNavigateInput): Promise<void>
    ```
    
    Types: [HostNavigateInput](core.HostNavigateInput.md)
    
    Request coarse host navigation (needs `"navigate"` in `requests.ui`; cross-project also needs the `ui.navigate` grant, same-project does not). To bring the user to an EXACT agent terminal — e.g. the one you just `agent.spawn`\-ed — pass `{ kind: 'agents', terminalId }` with the spawn result's `terminalId` (focuses it directly, no entity round-trip); `terminalSessionId` focuses by the `terminal.session` entity id instead, and a bare `{ kind: 'agents' }` opens the panel.
    
    #### Parameters
    
    *   input: [HostNavigateInput](core.HostNavigateInput.md)
    
    #### Returns Promise<void\>
    

**Authority for `host.navigate`**

Reviewed request token: `ui.navigate`. Authority depends on the arguments, resource, and caller; check the live capability surface.

Handle structured `ProjectRpcError` failures. A timeout does not guarantee cancellation; do not automatically retry effects without a documented idempotency contract. [Method authority and recovery](/docs/documents/Method_authority.md).

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

*   <a id="onnavigate-1"></a>
    
    ```typescript
    onNavigate(handler: HostNavigateHandler): () => void
    ```
    
    Types: [HostNavigateHandler](../types/core.HostNavigateHandler.md)
    
    Subscribe to host-mediated in-app navigation for this project iframe.
    
    #### Parameters
    
    *   handler: [HostNavigateHandler](../types/core.HostNavigateHandler.md)
    
    #### Returns () \=> void
    

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

*   <a id="opencreateprojectdraft-1"></a>
    
    ```typescript
    openCreateProjectDraft(input: HostCreateProjectDraftInput): void
    ```
    
    Types: [HostCreateProjectDraftInput](core.Supporting_types.HostCreateProjectDraftInput.md)
    
    Open the host Create intake with an editable title and prompt. This is a host-chrome trigger, not project-creation authority: the host attributes the sender, and the user still deliberately submits the intake.
    
    #### Parameters
    
    *   input: [HostCreateProjectDraftInput](core.Supporting_types.HostCreateProjectDraftInput.md)
    
    #### Returns void
    

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

*   <a id="openexternal-1"></a>
    
    ```typescript
    openExternal(url: string): Promise<void>
    ```
    
    Open an HTTP(S) URL in the persistent ISPO Browser. Grantless but trust-gated: allowed for `workspace`/`privileged-workspace` projects, rejected with `host.openExternal: trust-blocked` for quarantined/sandboxed ones, and rejected for non-http(s) URLs. Plain `<a href>` clicks to external URLs are routed here automatically by `connectToHost()`, so call this only for programmatic opens (buttons, card clicks). Never navigate `window.location` to an external URL — the host CSP kills that navigation and blanks the app frame.
    
    #### Parameters
    
    *   url: string
    
    #### Returns Promise<void\>
    

**Authority for `host.openExternal`**

No static request token. No static standing capability. Resource bindings, identity checks, or interactive consent may still apply.

Handle structured `ProjectRpcError` failures. A timeout does not guarantee cancellation; do not automatically retry effects without a documented idempotency contract. [Method authority and recovery](/docs/documents/Method_authority.md).

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

*   <a id="proposespecedits-1"></a>
    
    ```typescript
    proposeSpecEdits(input: ProposeSpecEditsInput): void
    ```
    
    Types: [ProposeSpecEditsInput](core.Supporting_types.ProposeSpecEditsInput.md)
    
    Propose per-file spec edits to host chrome (Spec → live document, Phase 3). Fire-and-forget: posts a `spec-propose-edits` wire frame to the host. `disposition: 'review'` (default) opens the diff modal; `disposition: 'save'` commits immediately under the user's Save click (no modal / no agent). Commit is still host-owned and gated by `spec.propose` — not an RPC. Only the bundled/privileged spec project uses it.
    
    #### Parameters
    
    *   input: [ProposeSpecEditsInput](core.Supporting_types.ProposeSpecEditsInput.md)
    
    #### Returns void
