> ## Documentation Index
> Fetch the complete documentation index at: https://docs.emergence.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# TypeScript SDK

> Fully typed TypeScript client for CRAFT APIs

# TypeScript SDK

The CRAFT TypeScript SDK provides fully typed clients for all platform APIs, with support for Node.js and browser environments.

## Installation

```bash theme={null}
# Configure the @emergence-ai npm scope
echo "@emergence-ai:registry=https://us-central1-npm.pkg.dev/aip-artifacts-store/aip-npm/" >> .npmrc

# Install all SDKs
npm install @emergence-ai/em-runtime-governance-sdk \
            @emergence-ai/em-runtime-assets-sdk \
            @emergence-ai/em-runtime-utils-sdk
```

## Quick Start

### Configure the Client

```typescript theme={null}
import {
  Configuration,
  OrganizationsApi,
  ProjectsApi,
} from '@emergence-ai/em-runtime-governance-sdk';

const config = new Configuration({
  basePath: 'https://your-instance.emergence.ai/governance',
  accessToken: 'your-jwt-token',
});

const orgsApi = new OrganizationsApi(config);
const projectsApi = new ProjectsApi(config);
```

### List Organizations

```typescript theme={null}
const { data: orgs } = await orgsApi.listOrganizations();
orgs.data.forEach(org => {
  console.log(`${org.id}: ${org.name}`);
});
```

### Create a Project

```typescript theme={null}
const { data: project } = await projectsApi.createProject({
  projectCreate: {
    name: 'My Project',
    description: 'Data analysis workspace',
  },
});
console.log(`Created project: ${project.id}`);
```

### Create a Data Connection

```typescript theme={null}
import {
  Configuration as AssetsConfig,
  DataApi,
} from '@emergence-ai/em-runtime-assets-sdk';

const assetsConfig = new AssetsConfig({
  basePath: 'https://your-instance.emergence.ai/assets',
  accessToken: 'your-jwt-token',
});

const dataApi = new DataApi(assetsConfig);
const { data: connection } = await dataApi.createDataConnection({
  dataConnectionCreate: {
    name: 'analytics-db',
    connectionType: 'postgres',
    description: 'Analytics PostgreSQL database',
  },
});
```

## Error Handling

```typescript theme={null}
import { AxiosError } from 'axios';

try {
  const { data } = await orgsApi.listOrganizations();
} catch (error) {
  if (error instanceof AxiosError) {
    switch (error.response?.status) {
      case 401:
        console.error('Token expired — refresh and retry');
        break;
      case 403:
        console.error('Insufficient permissions');
        break;
      default:
        console.error(`API error: ${error.response?.status}`);
    }
  }
}
```

## Token Refresh Pattern

```typescript theme={null}
import { Configuration } from '@emergence-ai/em-runtime-governance-sdk';

// Dynamic token provider
const config = new Configuration({
  basePath: 'https://your-instance.emergence.ai/governance',
  accessToken: async () => {
    // Fetch fresh token from Keycloak
    const token = await refreshKeycloakToken();
    return token;
  },
});
```

## Package Reference

| Package                                   | Covers                                            | Scope        |
| ----------------------------------------- | ------------------------------------------------- | ------------ |
| `@emergence-ai/em-runtime-governance-sdk` | Organizations, Projects, Permissions              | `governance` |
| `@emergence-ai/em-runtime-assets-sdk`     | Artifacts, Data Connections, Files, Models        | `assets`     |
| `@emergence-ai/em-runtime-utils-sdk`      | Data Catalog, Scheduling, Context Packs, Memories | `utils`      |

## Next Steps

<CardGroup cols={2}>
  <Card title="Python SDK" icon="python" href="/sdks/python">
    Python client guide
  </Card>

  <Card title="API Reference" icon="book" href="/api-reference/introduction">
    Interactive API playground
  </Card>
</CardGroup>
