init
This commit is contained in:
commit
2c0505f16f
|
|
@ -0,0 +1,2 @@
|
||||||
|
.DS_Store
|
||||||
|
references/docs
|
||||||
|
|
@ -0,0 +1,760 @@
|
||||||
|
---
|
||||||
|
name: coda-pack-dev
|
||||||
|
description: Use when the user asks about building Coda Packs, creating formulas, sync tables, actions, authentication, schemas, parameters, or any Coda Pack SDK questions.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Coda Pack Development Expert
|
||||||
|
|
||||||
|
Expert assistance for building Coda Packs using the Coda Pack SDK. Provides guidance on formulas, sync tables, actions, authentication, and best practices.
|
||||||
|
|
||||||
|
## What Are Coda Packs?
|
||||||
|
|
||||||
|
Coda Packs are extensions that add new capabilities to Coda documents. They're built using TypeScript/JavaScript and run on Coda's servers as serverless applications.
|
||||||
|
|
||||||
|
### Four Core Extension Types
|
||||||
|
|
||||||
|
1. **Formulas** - Custom functions for calculations or data retrieval
|
||||||
|
2. **Actions** - Special formulas that modify external applications (used in buttons/automations)
|
||||||
|
3. **Column Formats** - Control how values display in tables
|
||||||
|
4. **Sync Tables** - Automated tables that pull data from external sources
|
||||||
|
|
||||||
|
## Pack Structure
|
||||||
|
|
||||||
|
### Basic pack.ts Template
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import * as coda from "@codahq/packs-sdk";
|
||||||
|
|
||||||
|
export const pack = coda.newPack();
|
||||||
|
|
||||||
|
// Add network domains your pack will access
|
||||||
|
pack.addNetworkDomain("api.example.com");
|
||||||
|
|
||||||
|
// Add formulas, sync tables, etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Creating Formulas
|
||||||
|
|
||||||
|
### Formula Anatomy
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
pack.addFormula({
|
||||||
|
name: "FormulaName", // Upper camel case, letters/numbers/underscores only
|
||||||
|
description: "What it does",
|
||||||
|
parameters: [ // Array of parameters
|
||||||
|
coda.makeParameter({
|
||||||
|
type: coda.ParameterType.String,
|
||||||
|
name: "paramName",
|
||||||
|
description: "What this param does",
|
||||||
|
optional: false, // Optional: mark as optional param
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resultType: coda.ValueType.String, // Return type
|
||||||
|
isAction: false, // Set true for actions (buttons/automations)
|
||||||
|
execute: async function(args, context) {
|
||||||
|
// Your code here
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameter Types
|
||||||
|
|
||||||
|
Common parameter types:
|
||||||
|
- `ParameterType.String` - Text values
|
||||||
|
- `ParameterType.Number` - Numeric values
|
||||||
|
- `ParameterType.Boolean` - True/false
|
||||||
|
- `ParameterType.Date` - Date values
|
||||||
|
- `ParameterType.StringArray` - Array of strings
|
||||||
|
- `ParameterType.NumberArray` - Array of numbers
|
||||||
|
- `ParameterType.Html` - HTML content
|
||||||
|
- `ParameterType.Image` - Image URL or data
|
||||||
|
|
||||||
|
### Result Types
|
||||||
|
|
||||||
|
Common result types:
|
||||||
|
- `ValueType.String` - Text
|
||||||
|
- `ValueType.Number` - Numbers
|
||||||
|
- `ValueType.Boolean` - True/false
|
||||||
|
- `ValueType.Array` - Array of values
|
||||||
|
- `ValueType.Object` - Structured object (requires schema)
|
||||||
|
|
||||||
|
### Formula Naming Best Practices
|
||||||
|
|
||||||
|
- **Data sources**: Use plural nouns (`Tasks`, `Users`)
|
||||||
|
- **Transformations**: Use verbs (`Reverse`, `Truncate`)
|
||||||
|
- **Multiple words**: Upper camel case (`BugReport`, `DeletedFiles`)
|
||||||
|
- **Avoid prefixes**: Skip "Get", "Lookup", "Query"
|
||||||
|
- **Unique names**: Must be unique within pack
|
||||||
|
|
||||||
|
⚠️ **Warning**: Renaming formulas breaks existing documents using them!
|
||||||
|
|
||||||
|
### Making HTTP Requests
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
execute: async function([param1, param2], context) {
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "POST",
|
||||||
|
url: "https://api.example.com/endpoint",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
key: "value",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check status
|
||||||
|
if (response.status !== 200) {
|
||||||
|
throw new coda.UserVisibleError("API request failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Access response body
|
||||||
|
let data = response.body;
|
||||||
|
return data.result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Actions vs Regular Formulas
|
||||||
|
|
||||||
|
**Actions** (`isAction: true`) are formulas designed for buttons and automations:
|
||||||
|
- Can modify external systems (create, update, delete)
|
||||||
|
- Show differently in the formula picker
|
||||||
|
- Used in button formulas and automations
|
||||||
|
|
||||||
|
**Regular formulas** are for calculations and data retrieval:
|
||||||
|
- Should be idempotent (same inputs = same output)
|
||||||
|
- Cached for performance
|
||||||
|
- Used in table columns and document calculations
|
||||||
|
|
||||||
|
## Sync Tables
|
||||||
|
|
||||||
|
### Basic Sync Table Structure
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 1. Define schema
|
||||||
|
const ItemSchema = coda.makeObjectSchema({
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: coda.ValueType.Number,
|
||||||
|
fromKey: "id",
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
fromKey: "name",
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
fromKey: "url",
|
||||||
|
codaType: coda.ValueHintType.Url,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
displayProperty: "name", // Primary column
|
||||||
|
idProperty: "id", // Unique identifier
|
||||||
|
featuredProperties: ["name", "url"], // Show by default
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2. Add sync table
|
||||||
|
pack.addSyncTable({
|
||||||
|
name: "Items",
|
||||||
|
identityName: "Item", // Singular form
|
||||||
|
schema: ItemSchema,
|
||||||
|
formula: {
|
||||||
|
name: "SyncItems",
|
||||||
|
description: "Sync items from API",
|
||||||
|
parameters: [
|
||||||
|
// Optional filter parameters
|
||||||
|
],
|
||||||
|
execute: async function(args, context) {
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: "https://api.example.com/items",
|
||||||
|
});
|
||||||
|
|
||||||
|
let items = response.body.items;
|
||||||
|
|
||||||
|
return {
|
||||||
|
result: items, // Array of objects matching schema
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sync Table Key Concepts
|
||||||
|
|
||||||
|
**Identity**: Every sync table needs `identityName` (singular form of table name)
|
||||||
|
|
||||||
|
**Schema Properties**: Define the structure of each row
|
||||||
|
- Use `fromKey` to map API field names to schema properties
|
||||||
|
- Set `required: true` for mandatory fields
|
||||||
|
- Use `displayProperty` for the primary column
|
||||||
|
- Use `idProperty` for unique identification
|
||||||
|
|
||||||
|
**Row Limits**:
|
||||||
|
- Default: 1,000 rows
|
||||||
|
- Maximum: 10,000 rows
|
||||||
|
|
||||||
|
**Continuations**: For paginated results exceeding 60s timeout:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
execute: async function(args, context) {
|
||||||
|
let url = context.sync.continuation?.nextUrl || "https://api.example.com/items";
|
||||||
|
|
||||||
|
let response = await context.fetcher.fetch({ method: "GET", url });
|
||||||
|
|
||||||
|
let continuation;
|
||||||
|
if (response.body.next_page) {
|
||||||
|
continuation = {
|
||||||
|
nextUrl: response.body.next_page,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
result: response.body.items,
|
||||||
|
continuation: continuation,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dynamic Sync Tables
|
||||||
|
|
||||||
|
For APIs with multiple similar endpoints:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
pack.addDynamicSyncTable({
|
||||||
|
name: "DynamicTable",
|
||||||
|
getName: async function(context) {
|
||||||
|
// Return table name based on context
|
||||||
|
},
|
||||||
|
getSchema: async function(context) {
|
||||||
|
// Return schema based on selected entity
|
||||||
|
},
|
||||||
|
getDisplayUrl: async function(context) {
|
||||||
|
// Return URL to view the data
|
||||||
|
},
|
||||||
|
listDynamicUrls: async function(context) {
|
||||||
|
// Return list of available tables
|
||||||
|
},
|
||||||
|
formula: {
|
||||||
|
// Same as regular sync table
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**See [Advanced Sync Tables](references/advanced-sync-tables.md) for:**
|
||||||
|
- Complete dynamic sync table implementation guide
|
||||||
|
- Two-way sync (editable sync tables)
|
||||||
|
- Property options and dynamic dropdowns
|
||||||
|
- Folder organization, search, and manual URL entry
|
||||||
|
|
||||||
|
### Two-Way Sync Tables
|
||||||
|
|
||||||
|
Enable users to edit synced data and push changes back to external sources. Mark columns as editable with `mutable: true` and implement an `executeUpdate` function:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const TaskSchema = coda.makeObjectSchema({
|
||||||
|
properties: {
|
||||||
|
id: { type: coda.ValueType.Number, required: true },
|
||||||
|
name: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
mutable: true, // Editable column
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
codaType: coda.ValueHintType.SelectList,
|
||||||
|
options: ["Todo", "In Progress", "Done"],
|
||||||
|
mutable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
displayProperty: "name",
|
||||||
|
idProperty: "id",
|
||||||
|
});
|
||||||
|
|
||||||
|
pack.addSyncTable({
|
||||||
|
name: "Tasks",
|
||||||
|
identityName: "Task",
|
||||||
|
schema: TaskSchema,
|
||||||
|
formula: {
|
||||||
|
name: "SyncTasks",
|
||||||
|
description: "Sync tasks",
|
||||||
|
parameters: [],
|
||||||
|
execute: async function([], context) {
|
||||||
|
// Fetch data from API
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: "https://api.example.com/tasks",
|
||||||
|
});
|
||||||
|
return { result: response.body.tasks };
|
||||||
|
},
|
||||||
|
executeUpdate: async function([], context, updates) {
|
||||||
|
// Push changes back to API
|
||||||
|
let results = [];
|
||||||
|
for (let update of updates) {
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "PATCH",
|
||||||
|
url: `https://api.example.com/tasks/${update.previousValue.id}`,
|
||||||
|
body: JSON.stringify({
|
||||||
|
name: update.newValue.name,
|
||||||
|
status: update.newValue.status,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
results.push(response.body);
|
||||||
|
}
|
||||||
|
return { result: results };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**See [Advanced Sync Tables](references/advanced-sync-tables.md) for:**
|
||||||
|
- Property options (static and dynamic)
|
||||||
|
- Batch updates with `maxUpdateBatchSize`
|
||||||
|
- Error handling in updates
|
||||||
|
- OAuth incremental authorization
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
### Setting Up Authentication
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// User authentication (most common)
|
||||||
|
pack.setUserAuthentication({
|
||||||
|
type: coda.AuthenticationType.HeaderBearerToken,
|
||||||
|
instructionsUrl: "https://example.com/get-api-key",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Or system authentication (shared credentials)
|
||||||
|
pack.setSystemAuthentication({
|
||||||
|
type: coda.AuthenticationType.HeaderBearerToken,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Authentication Types
|
||||||
|
|
||||||
|
- **HeaderBearerToken** - Bearer token in Authorization header
|
||||||
|
- **CustomHeaderToken** - Custom header name
|
||||||
|
- **QueryParamToken** - Token in query string
|
||||||
|
- **WebBasic** - Username and password
|
||||||
|
- **OAuth2** - OAuth 2.0 flow
|
||||||
|
- **CodaApiHeaderBearerToken** - For Coda API
|
||||||
|
- **AWSAccessKey** - AWS Signature v4
|
||||||
|
|
||||||
|
### OAuth2 Authentication
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
pack.setUserAuthentication({
|
||||||
|
type: coda.AuthenticationType.OAuth2,
|
||||||
|
authorizationUrl: "https://example.com/oauth/authorize",
|
||||||
|
tokenUrl: "https://example.com/oauth/token",
|
||||||
|
scopes: ["read", "write"],
|
||||||
|
|
||||||
|
// Get account name for the connection
|
||||||
|
getConnectionName: async function(context) {
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: "https://api.example.com/me",
|
||||||
|
});
|
||||||
|
return response.body.username;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Per-Account Endpoints
|
||||||
|
|
||||||
|
For services with account-specific domains:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
pack.setUserAuthentication({
|
||||||
|
type: coda.AuthenticationType.HeaderBearerToken,
|
||||||
|
|
||||||
|
// Prompt user for their account URL
|
||||||
|
getConnectionName: async function(context) {
|
||||||
|
return context.endpoint || "Unknown";
|
||||||
|
},
|
||||||
|
|
||||||
|
endpointDomain: async function(context) {
|
||||||
|
return context.endpoint;
|
||||||
|
},
|
||||||
|
|
||||||
|
networkDomain: "example.com",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Access endpoint in formulas
|
||||||
|
execute: async function(args, context) {
|
||||||
|
let url = `https://${context.endpoint}/api/endpoint`;
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Schemas
|
||||||
|
|
||||||
|
### Object Schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const PersonSchema = coda.makeObjectSchema({
|
||||||
|
properties: {
|
||||||
|
id: { type: coda.ValueType.Number },
|
||||||
|
name: { type: coda.ValueType.String },
|
||||||
|
email: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
codaType: coda.ValueHintType.Email,
|
||||||
|
},
|
||||||
|
joinDate: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
codaType: coda.ValueHintType.Date,
|
||||||
|
},
|
||||||
|
avatar: {
|
||||||
|
type: coda.ValueType.String,
|
||||||
|
codaType: coda.ValueHintType.ImageReference,
|
||||||
|
},
|
||||||
|
isActive: { type: coda.ValueType.Boolean },
|
||||||
|
},
|
||||||
|
displayProperty: "name",
|
||||||
|
idProperty: "id",
|
||||||
|
featuredProperties: ["name", "email"],
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Value Hints (codaType)
|
||||||
|
|
||||||
|
Make data more interactive:
|
||||||
|
- `ValueHintType.Url` - Clickable links
|
||||||
|
- `ValueHintType.Email` - Email addresses
|
||||||
|
- `ValueHintType.Date` - Date formatting
|
||||||
|
- `ValueHintType.DateTime` - Date and time
|
||||||
|
- `ValueHintType.ImageReference` - Display images
|
||||||
|
- `ValueHintType.ImageAttachment` - Inline images
|
||||||
|
- `ValueHintType.Markdown` - Render markdown
|
||||||
|
- `ValueHintType.Html` - Render HTML
|
||||||
|
|
||||||
|
### Array Schemas
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Array of objects
|
||||||
|
const resultType = coda.ValueType.Array;
|
||||||
|
const schema = coda.makeSchema({
|
||||||
|
type: coda.ValueType.Array,
|
||||||
|
items: PersonSchema, // Schema for each item
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Network Domains
|
||||||
|
|
||||||
|
Whitelist domains your pack will access:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
pack.addNetworkDomain("api.example.com");
|
||||||
|
pack.addNetworkDomain("cdn.example.com");
|
||||||
|
|
||||||
|
// Support subdomains
|
||||||
|
pack.addNetworkDomain("example.com"); // Allows *.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### User-Visible Errors
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
execute: async function(args, context) {
|
||||||
|
if (!args[0]) {
|
||||||
|
throw new coda.UserVisibleError("Parameter is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
let response = await context.fetcher.fetch({...});
|
||||||
|
|
||||||
|
if (response.status === 404) {
|
||||||
|
throw new coda.UserVisibleError("Item not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.status !== 200) {
|
||||||
|
throw new coda.UserVisibleError(
|
||||||
|
`API error: ${response.status} - ${response.body.message}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.body;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Status Code Error
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Automatically throw error for non-2xx responses
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: "https://api.example.com/endpoint",
|
||||||
|
cacheTtlSecs: 0, // Disable caching
|
||||||
|
throwOnError: true, // Throw on non-2xx status
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Caching
|
||||||
|
|
||||||
|
### Cache Control
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Set cache TTL (time-to-live in seconds)
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: "https://api.example.com/data",
|
||||||
|
cacheTtlSecs: 300, // Cache for 5 minutes
|
||||||
|
});
|
||||||
|
|
||||||
|
// Disable caching
|
||||||
|
cacheTtlSecs: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### When to Cache
|
||||||
|
|
||||||
|
- ✅ Reference data (countries, categories)
|
||||||
|
- ✅ Slowly changing data (user profiles)
|
||||||
|
- ❌ Real-time data (stock prices, live scores)
|
||||||
|
- ❌ User-specific data that changes frequently
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Formula Development
|
||||||
|
|
||||||
|
1. **Descriptive names**: Clear, concise, descriptive names
|
||||||
|
2. **Good descriptions**: Explain what the formula does and when to use it
|
||||||
|
3. **Parameter validation**: Check required parameters early
|
||||||
|
4. **Error messages**: Clear, actionable error messages
|
||||||
|
5. **Examples**: Add examples to aid documentation
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
pack.addFormula({
|
||||||
|
name: "ConvertCurrency",
|
||||||
|
description: "Convert amount from one currency to another using current exchange rates",
|
||||||
|
parameters: [
|
||||||
|
coda.makeParameter({
|
||||||
|
type: coda.ParameterType.Number,
|
||||||
|
name: "amount",
|
||||||
|
description: "The amount to convert",
|
||||||
|
}),
|
||||||
|
coda.makeParameter({
|
||||||
|
type: coda.ParameterType.String,
|
||||||
|
name: "from",
|
||||||
|
description: "Source currency code (e.g., USD, EUR)",
|
||||||
|
}),
|
||||||
|
coda.makeParameter({
|
||||||
|
type: coda.ParameterType.String,
|
||||||
|
name: "to",
|
||||||
|
description: "Target currency code (e.g., USD, EUR)",
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resultType: coda.ValueType.Number,
|
||||||
|
examples: [
|
||||||
|
{ params: [100, "USD", "EUR"], result: 85.50 },
|
||||||
|
{ params: [50, "GBP", "USD"], result: 65.75 },
|
||||||
|
],
|
||||||
|
execute: async function([amount, from, to], context) {
|
||||||
|
// Implementation
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sync Table Best Practices
|
||||||
|
|
||||||
|
1. **Identity**: Always set `identityName` and `idProperty`
|
||||||
|
2. **Display property**: Choose the most meaningful column
|
||||||
|
3. **Featured properties**: Show 3-5 most important columns by default
|
||||||
|
4. **Continuations**: Handle pagination for large datasets
|
||||||
|
5. **Parameters**: Add filter parameters to reduce API calls
|
||||||
|
|
||||||
|
### API Integration
|
||||||
|
|
||||||
|
1. **Rate limits**: Respect API rate limits
|
||||||
|
2. **Pagination**: Handle paginated responses properly
|
||||||
|
3. **Error handling**: Graceful handling of API errors
|
||||||
|
4. **Authentication**: Use appropriate auth type
|
||||||
|
5. **Caching**: Cache when appropriate to reduce API calls
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
1. **Minimize API calls**: Batch requests when possible
|
||||||
|
2. **Use caching**: Cache stable data
|
||||||
|
3. **Optimize schemas**: Only include needed properties
|
||||||
|
4. **Continuations**: Use for large datasets
|
||||||
|
5. **Timeout awareness**: 60-second execution limit
|
||||||
|
|
||||||
|
## Common Patterns
|
||||||
|
|
||||||
|
### Handling API Pagination
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
execute: async function(args, context) {
|
||||||
|
let page = context.sync.continuation?.page || 1;
|
||||||
|
let allItems = context.sync.continuation?.items || [];
|
||||||
|
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: `https://api.example.com/items?page=${page}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
allItems = allItems.concat(response.body.items);
|
||||||
|
|
||||||
|
let continuation;
|
||||||
|
if (response.body.has_more) {
|
||||||
|
continuation = {
|
||||||
|
page: page + 1,
|
||||||
|
items: allItems,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
result: allItems,
|
||||||
|
continuation: continuation,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building URLs with Parameters
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
execute: async function([filter, sortBy], context) {
|
||||||
|
let params = new URLSearchParams();
|
||||||
|
if (filter) params.append("filter", filter);
|
||||||
|
if (sortBy) params.append("sort", sortBy);
|
||||||
|
|
||||||
|
let url = `https://api.example.com/items?${params.toString()}`;
|
||||||
|
let response = await context.fetcher.fetch({ method: "GET", url });
|
||||||
|
|
||||||
|
return response.body;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Transforming API Data
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
execute: async function(args, context) {
|
||||||
|
let response = await context.fetcher.fetch({
|
||||||
|
method: "GET",
|
||||||
|
url: "https://api.example.com/users",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Transform API data to match schema
|
||||||
|
let users = response.body.users.map(user => ({
|
||||||
|
id: user.user_id, // Map API field to schema
|
||||||
|
name: user.full_name,
|
||||||
|
email: user.email_address,
|
||||||
|
isActive: user.status === "active",
|
||||||
|
}));
|
||||||
|
|
||||||
|
return { result: users };
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Upload/deploy pack
|
||||||
|
npx coda upload pack.ts --notes "Description of changes"
|
||||||
|
|
||||||
|
# Validate pack
|
||||||
|
npx coda validate pack.ts
|
||||||
|
|
||||||
|
# Execute formula locally (for testing)
|
||||||
|
npx coda execute pack.ts FormulaName param1 param2
|
||||||
|
|
||||||
|
# Create new pack
|
||||||
|
npx coda init
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### Unit Testing
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { executeFormulaFromPackDef } from '@codahq/packs-sdk/dist/development';
|
||||||
|
import { pack } from './pack';
|
||||||
|
|
||||||
|
// Test a formula
|
||||||
|
let result = await executeFormulaFromPackDef(
|
||||||
|
pack,
|
||||||
|
"FormulaName",
|
||||||
|
["param1", "param2"]
|
||||||
|
);
|
||||||
|
|
||||||
|
console.assert(result === expectedValue);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**"Network domain not whitelisted"**
|
||||||
|
- Add the domain with `pack.addNetworkDomain()`
|
||||||
|
|
||||||
|
**"Formula already exists"**
|
||||||
|
- Formula names must be unique within the pack
|
||||||
|
|
||||||
|
**"Invalid parameter type"**
|
||||||
|
- Check parameter types match expected values
|
||||||
|
|
||||||
|
**"Execution timeout"**
|
||||||
|
- Use continuations for long-running operations
|
||||||
|
- Optimize API calls and data processing
|
||||||
|
|
||||||
|
**"Authentication failed"**
|
||||||
|
- Verify auth configuration
|
||||||
|
- Check user credentials
|
||||||
|
- Ensure proper headers/tokens
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
### Official Documentation
|
||||||
|
- **Official Docs**: https://coda.io/packs/build/latest/
|
||||||
|
- **SDK Reference**: https://coda.io/packs/build/latest/reference/sdk/
|
||||||
|
- **Pack Studio**: https://coda.io/packs/build
|
||||||
|
- **Example Packs**: Available in Pack Studio
|
||||||
|
|
||||||
|
### Skill Reference Guides
|
||||||
|
- **[Advanced Sync Tables](references/advanced-sync-tables.md)** - Two-way sync, dynamic tables, property options
|
||||||
|
- **[Quick Examples](references/quick-examples.md)** - Common formula and sync table patterns
|
||||||
|
- **[Troubleshooting](references/troubleshooting.md)** - Common errors and debugging strategies
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
### Common Imports
|
||||||
|
```typescript
|
||||||
|
import * as coda from "@codahq/packs-sdk";
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pack Initialization
|
||||||
|
```typescript
|
||||||
|
export const pack = coda.newPack();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Add Formula
|
||||||
|
```typescript
|
||||||
|
pack.addFormula({ name, description, parameters, resultType, execute });
|
||||||
|
```
|
||||||
|
|
||||||
|
### Add Sync Table
|
||||||
|
```typescript
|
||||||
|
pack.addSyncTable({ name, identityName, schema, formula });
|
||||||
|
```
|
||||||
|
|
||||||
|
### Make Parameter
|
||||||
|
```typescript
|
||||||
|
coda.makeParameter({ type, name, description, optional });
|
||||||
|
```
|
||||||
|
|
||||||
|
### Make Schema
|
||||||
|
```typescript
|
||||||
|
coda.makeObjectSchema({ properties, displayProperty, idProperty });
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fetch Data
|
||||||
|
```typescript
|
||||||
|
await context.fetcher.fetch({ method, url, headers, body });
|
||||||
|
```
|
||||||
|
|
||||||
|
### Throw Error
|
||||||
|
```typescript
|
||||||
|
throw new coda.UserVisibleError("Error message");
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,592 @@
|
||||||
|
---
|
||||||
|
# Coda Pack SDK Documentation Structure
|
||||||
|
# Complete file tree of all documentation (370+ files)
|
||||||
|
|
||||||
|
root: docs/
|
||||||
|
|
||||||
|
structure:
|
||||||
|
# Main landing page
|
||||||
|
index.md: Home page
|
||||||
|
|
||||||
|
# Agents section
|
||||||
|
agents:
|
||||||
|
index.md: Agents overview
|
||||||
|
development.md: Agent development
|
||||||
|
examples.md: Agent examples
|
||||||
|
quickstart.md: Agent quickstart
|
||||||
|
troubleshooting.md: Agent troubleshooting
|
||||||
|
upgrade.md: Agent upgrade guide
|
||||||
|
features:
|
||||||
|
chat.md: Chat features
|
||||||
|
context.md: Context management
|
||||||
|
mcp.md: MCP (Model Context Protocol)
|
||||||
|
skills.md: Skills system
|
||||||
|
tools.md: Agent tools
|
||||||
|
indexing:
|
||||||
|
index.md: Indexing overview
|
||||||
|
crawling.md: Content crawling
|
||||||
|
incremental.md: Incremental indexing
|
||||||
|
schema.md: Index schema
|
||||||
|
|
||||||
|
# Blog
|
||||||
|
blog:
|
||||||
|
index.md: Blog index
|
||||||
|
posts:
|
||||||
|
new_agent_features.md: New agent features announcement
|
||||||
|
|
||||||
|
# Guides - main documentation
|
||||||
|
guides:
|
||||||
|
overview.md: Pack development overview
|
||||||
|
design.md: Pack design guidelines
|
||||||
|
best-practices.md: Best practices
|
||||||
|
|
||||||
|
# Basics
|
||||||
|
basics:
|
||||||
|
data-types.md: Working with data types
|
||||||
|
fetcher.md: Making HTTP requests
|
||||||
|
authentication:
|
||||||
|
index.md: Authentication overview
|
||||||
|
oauth2.md: OAuth2 authentication
|
||||||
|
aws.md: AWS authentication
|
||||||
|
parameters:
|
||||||
|
index.md: Parameters overview
|
||||||
|
autocomplete.md: Parameter autocomplete
|
||||||
|
|
||||||
|
# Building blocks
|
||||||
|
blocks:
|
||||||
|
formulas.md: Creating formulas
|
||||||
|
actions.md: Building actions
|
||||||
|
cards.md: Creating cards
|
||||||
|
column-formats.md: Custom column formats
|
||||||
|
sync-tables:
|
||||||
|
index.md: Sync tables overview
|
||||||
|
dynamic.md: Dynamic sync tables
|
||||||
|
two-way.md: Two-way sync
|
||||||
|
|
||||||
|
# Advanced topics
|
||||||
|
advanced:
|
||||||
|
schemas.md: Advanced schema patterns
|
||||||
|
caching.md: Caching strategies
|
||||||
|
errors.md: Error handling
|
||||||
|
images.md: Working with images
|
||||||
|
embeds.md: Embedded content
|
||||||
|
timezones.md: Timezone handling
|
||||||
|
.card_schema.md: Card schema (internal)
|
||||||
|
|
||||||
|
# Development
|
||||||
|
development:
|
||||||
|
cli.md: Command line interface
|
||||||
|
testing.md: Testing packs
|
||||||
|
troubleshooting.md: Troubleshooting
|
||||||
|
libraries.md: Using libraries
|
||||||
|
pack-maker-tools.md: Pack maker tools
|
||||||
|
versions.md: Version management
|
||||||
|
|
||||||
|
# Tutorials
|
||||||
|
tutorials:
|
||||||
|
index.md: Tutorials index
|
||||||
|
videos.md: Video tutorials
|
||||||
|
get-started:
|
||||||
|
web.md: Web IDE tutorial
|
||||||
|
cli.md: CLI tutorial
|
||||||
|
github.md: GitHub development
|
||||||
|
gitpod.md: Gitpod development
|
||||||
|
replit.md: Replit development
|
||||||
|
.cli.md: CLI (internal)
|
||||||
|
.cli-before.md: CLI setup (internal)
|
||||||
|
.cli-test.md: CLI testing (internal)
|
||||||
|
.rebuild.md: Rebuild (internal)
|
||||||
|
.use.md: Usage (internal)
|
||||||
|
build:
|
||||||
|
formula.md: Building formulas
|
||||||
|
fetcher.md: Using fetcher
|
||||||
|
sync-table.md: Building sync tables
|
||||||
|
oauth.md: Implementing OAuth
|
||||||
|
|
||||||
|
# Code samples
|
||||||
|
samples:
|
||||||
|
index.md: Samples index
|
||||||
|
|
||||||
|
# Full pack examples
|
||||||
|
full:
|
||||||
|
hello-world.md: Hello World pack
|
||||||
|
cats.md: Cat photos pack
|
||||||
|
math.md: Math pack
|
||||||
|
github.md: GitHub pack
|
||||||
|
todoist.md: Todoist pack
|
||||||
|
daylight.md: Daylight pack
|
||||||
|
dnd.md: D&D pack
|
||||||
|
|
||||||
|
# Topic-specific samples
|
||||||
|
topic:
|
||||||
|
formula.md: Formula examples
|
||||||
|
action.md: Action examples
|
||||||
|
sync-table.md: Sync table examples
|
||||||
|
dynamic-sync-table.md: Dynamic sync table examples
|
||||||
|
two-way.md: Two-way sync examples
|
||||||
|
authentication.md: Authentication examples
|
||||||
|
fetcher.md: Fetcher examples
|
||||||
|
parameter.md: Parameter examples
|
||||||
|
autocomplete.md: Autocomplete examples
|
||||||
|
schema.md: Schema examples
|
||||||
|
data-type.md: Data type examples
|
||||||
|
column-format.md: Column format examples
|
||||||
|
card.md: Card examples
|
||||||
|
image.md: Image examples
|
||||||
|
dates.md: Date handling examples
|
||||||
|
apis.md: API integration examples
|
||||||
|
|
||||||
|
# SDK Reference
|
||||||
|
reference:
|
||||||
|
sdk:
|
||||||
|
index.md: SDK reference index
|
||||||
|
|
||||||
|
# Core SDK
|
||||||
|
core:
|
||||||
|
index.md: Core SDK index
|
||||||
|
|
||||||
|
# Classes
|
||||||
|
classes:
|
||||||
|
PackDefinitionBuilder.md: Pack definition builder
|
||||||
|
UserVisibleError.md: User visible error
|
||||||
|
StatusCodeError.md: Status code error
|
||||||
|
MissingScopesError.md: Missing scopes error
|
||||||
|
ResponseSizeTooLargeError.md: Response size error
|
||||||
|
|
||||||
|
# Enumerations
|
||||||
|
enumerations:
|
||||||
|
AuthenticationType.md: Authentication types
|
||||||
|
ParameterType.md: Parameter types
|
||||||
|
ValueType.md: Value types
|
||||||
|
ValueHintType.md: Value hint types
|
||||||
|
ConnectionRequirement.md: Connection requirements
|
||||||
|
Type.md: Schema types
|
||||||
|
HttpStatusCode.md: HTTP status codes
|
||||||
|
InvocationErrorType.md: Invocation error types
|
||||||
|
InvocationSource.md: Invocation sources
|
||||||
|
PostSetupType.md: Post-setup types
|
||||||
|
OptionsType.md: Options types
|
||||||
|
NetworkConnection.md: Network connection types
|
||||||
|
PermissionSyncMode.md: Permission sync modes
|
||||||
|
EmbeddedContentType.md: Embedded content types
|
||||||
|
AttributionNodeType.md: Attribution node types
|
||||||
|
LinkDisplayType.md: Link display types
|
||||||
|
EmailDisplayType.md: Email display types
|
||||||
|
CurrencyFormat.md: Currency formats
|
||||||
|
DurationUnit.md: Duration units
|
||||||
|
PrecannedDateRange.md: Precanned date ranges
|
||||||
|
ImageCornerStyle.md: Image corner styles
|
||||||
|
ImageOutline.md: Image outlines
|
||||||
|
ImageShapeStyle.md: Image shape styles
|
||||||
|
ScaleIconSet.md: Scale icon sets
|
||||||
|
ToolType.md: Tool types
|
||||||
|
TokenExchangeCredentialsLocation.md: Token exchange locations
|
||||||
|
ScreenAnnotationType.md: Screen annotation types
|
||||||
|
KnowledgeToolSourceType.md: Knowledge tool source types
|
||||||
|
SkillModel.md: Skill models
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
functions:
|
||||||
|
newPack.md: Create new pack
|
||||||
|
makeFormula.md: Make formula
|
||||||
|
makeParameter.md: Make parameter
|
||||||
|
makeSchema.md: Make schema
|
||||||
|
makeObjectSchema.md: Make object schema
|
||||||
|
makeSyncTable.md: Make sync table
|
||||||
|
makeDynamicSyncTable.md: Make dynamic sync table
|
||||||
|
makeMetadataFormula.md: Make metadata formula
|
||||||
|
makeEmptyFormula.md: Make empty formula
|
||||||
|
makeAttributionNode.md: Make attribution node
|
||||||
|
makeReferenceSchemaFromObjectSchema.md: Make reference schema
|
||||||
|
makeTranslateObjectFormula.md: Make translate object formula
|
||||||
|
makeSimpleAutocompleteMetadataFormula.md: Simple autocomplete metadata
|
||||||
|
simpleAutocomplete.md: Simple autocomplete
|
||||||
|
autocompleteSearchObjects.md: Autocomplete search objects
|
||||||
|
generateSchema.md: Generate schema
|
||||||
|
getEffectivePropertyKeysFromSchema.md: Get effective property keys
|
||||||
|
joinUrl.md: Join URL
|
||||||
|
getQueryParams.md: Get query params
|
||||||
|
withQueryParams.md: With query params
|
||||||
|
withIdentity.md: With identity
|
||||||
|
assertCondition.md: Assert condition
|
||||||
|
ensureExists.md: Ensure exists
|
||||||
|
ensureNonEmptyString.md: Ensure non-empty string
|
||||||
|
ensureUnreachable.md: Ensure unreachable
|
||||||
|
|
||||||
|
# Interfaces (100+ interfaces)
|
||||||
|
interfaces:
|
||||||
|
# Core interfaces
|
||||||
|
PackDefinition.md: Pack definition
|
||||||
|
PackVersionDefinition.md: Pack version definition
|
||||||
|
ExecutionContext.md: Execution context
|
||||||
|
SyncExecutionContext.md: Sync execution context
|
||||||
|
UpdateSyncExecutionContext.md: Update sync execution context
|
||||||
|
Fetcher.md: Fetcher interface
|
||||||
|
FetchRequest.md: Fetch request
|
||||||
|
FetchResponse.md: Fetch response
|
||||||
|
Network.md: Network interface
|
||||||
|
TemporaryBlobStorage.md: Temporary blob storage
|
||||||
|
InvocationLocation.md: Invocation location
|
||||||
|
|
||||||
|
# Formula interfaces
|
||||||
|
BaseFormulaDef.md: Base formula definition
|
||||||
|
CommonPackFormulaDef.md: Common pack formula definition
|
||||||
|
PackFormulaDef.md: Pack formula definition
|
||||||
|
ObjectArrayFormulaDef.md: Object array formula definition
|
||||||
|
EmptyFormulaDef.md: Empty formula definition
|
||||||
|
MetadataFormulaObjectResultType.md: Metadata formula result type
|
||||||
|
|
||||||
|
# Parameter interfaces
|
||||||
|
ParamDef.md: Parameter definition
|
||||||
|
RequiredParamDef.md: Required parameter
|
||||||
|
OptionalParamDef.md: Optional parameter
|
||||||
|
CustomAuthParameter.md: Custom auth parameter
|
||||||
|
DynamicOptions.md: Dynamic options
|
||||||
|
PropertyWithOptions.md: Property with options
|
||||||
|
PropertyOptionsExecutionContext.md: Property options context
|
||||||
|
|
||||||
|
# Schema interfaces
|
||||||
|
ObjectSchemaDefinition.md: Object schema definition
|
||||||
|
ObjectSchemaProperty.md: Object schema property
|
||||||
|
ArraySchema.md: Array schema
|
||||||
|
BooleanSchema.md: Boolean schema
|
||||||
|
NumericSchema.md: Numeric schema
|
||||||
|
StringEmbedSchema.md: String embed schema
|
||||||
|
SimpleStringSchema.md: Simple string schema
|
||||||
|
StringWithOptionsSchema.md: String with options
|
||||||
|
ImageSchema.md: Image schema
|
||||||
|
LinkSchema.md: Link schema
|
||||||
|
EmailSchema.md: Email schema
|
||||||
|
CurrencySchema.md: Currency schema
|
||||||
|
DurationSchema.md: Duration schema
|
||||||
|
NumericDurationSchema.md: Numeric duration schema
|
||||||
|
StringDateSchema.md: String date schema
|
||||||
|
StringDateTimeSchema.md: String datetime schema
|
||||||
|
StringTimeSchema.md: String time schema
|
||||||
|
NumericDateSchema.md: Numeric date schema
|
||||||
|
NumericDateTimeSchema.md: Numeric datetime schema
|
||||||
|
NumericTimeSchema.md: Numeric time schema
|
||||||
|
ProgressBarSchema.md: Progress bar schema
|
||||||
|
ScaleSchema.md: Scale schema
|
||||||
|
SliderSchema.md: Slider schema
|
||||||
|
ArrayType.md: Array type
|
||||||
|
Format.md: Format interface
|
||||||
|
|
||||||
|
# Authentication interfaces
|
||||||
|
BaseAuthentication.md: Base authentication
|
||||||
|
NoAuthentication.md: No authentication
|
||||||
|
CustomAuthentication.md: Custom authentication
|
||||||
|
CustomHeaderTokenAuthentication.md: Custom header token
|
||||||
|
HeaderBearerTokenAuthentication.md: Header bearer token
|
||||||
|
MultiHeaderTokenAuthentication.md: Multi-header token
|
||||||
|
QueryParamTokenAuthentication.md: Query param token
|
||||||
|
MultiQueryParamTokenAuthentication.md: Multi-query param token
|
||||||
|
WebBasicAuthentication.md: Web basic auth
|
||||||
|
OAuth2Authentication.md: OAuth2 authentication
|
||||||
|
OAuth2ClientCredentialsAuthentication.md: OAuth2 client credentials
|
||||||
|
CodaApiBearerTokenAuthentication.md: Coda API bearer token
|
||||||
|
AWSAccessKeyAuthentication.md: AWS access key
|
||||||
|
AWSAssumeRoleAuthentication.md: AWS assume role
|
||||||
|
|
||||||
|
# Sync table interfaces
|
||||||
|
SyncTableDef.md: Sync table definition
|
||||||
|
SyncTableOptions.md: Sync table options
|
||||||
|
SyncFormulaDef.md: Sync formula definition
|
||||||
|
SyncFormulaResult.md: Sync formula result
|
||||||
|
DynamicSyncTableDef.md: Dynamic sync table definition
|
||||||
|
DynamicSyncTableOptions.md: Dynamic sync table options
|
||||||
|
SyncBase.md: Sync base
|
||||||
|
SyncFull.md: Full sync
|
||||||
|
SyncIncremental.md: Incremental sync
|
||||||
|
SyncUpdate.md: Sync update
|
||||||
|
UpdateSync.md: Update sync
|
||||||
|
SyncUpdateResult.md: Sync update result
|
||||||
|
SyncTableRelation.md: Sync table relation
|
||||||
|
SyncCompletionMetadata.md: Sync completion metadata
|
||||||
|
SyncCompletionMetadataIncomplete.md: Incomplete sync metadata
|
||||||
|
|
||||||
|
# Identity and indexing
|
||||||
|
Identity.md: Identity interface
|
||||||
|
IdentityDefinition.md: Identity definition
|
||||||
|
PropertyIdentifierDetails.md: Property identifier details
|
||||||
|
CustomIndexDefinition.md: Custom index definition
|
||||||
|
CrawlStrategy.md: Crawl strategy
|
||||||
|
|
||||||
|
# Embedded content
|
||||||
|
EmbeddedContentTool.md: Embedded content tool
|
||||||
|
CopyableBlockEmbeddedContent.md: Copyable block content
|
||||||
|
CarouselViewEmbeddedContent.md: Carousel view content
|
||||||
|
TabViewEmbeddedContent.md: Tab view content
|
||||||
|
|
||||||
|
# Attribution
|
||||||
|
ImageAttributionNode.md: Image attribution node
|
||||||
|
LinkAttributionNode.md: Link attribution node
|
||||||
|
TextAttributionNode.md: Text attribution node
|
||||||
|
|
||||||
|
# Tools and skills
|
||||||
|
PackTool.md: Pack tool
|
||||||
|
ContactResolutionTool.md: Contact resolution tool
|
||||||
|
KnowledgeTool.md: Knowledge tool
|
||||||
|
PackKnowledgeToolSource.md: Pack knowledge source
|
||||||
|
ScreenAnnotationTool.md: Screen annotation tool
|
||||||
|
RewriteScreenAnnotation.md: Rewrite screen annotation
|
||||||
|
Skill.md: Skill interface
|
||||||
|
SkillEntrypoints.md: Skill entrypoints
|
||||||
|
SkillEntrypointConfig.md: Skill entrypoint config
|
||||||
|
SkillModelConfiguration.md: Skill model configuration
|
||||||
|
MCPServer.md: MCP server interface
|
||||||
|
|
||||||
|
# Validation and errors
|
||||||
|
ParameterValidationDetail.md: Parameter validation detail
|
||||||
|
ValidParameterValidationResult.md: Valid parameter validation
|
||||||
|
InvalidParameterValidationResult.md: Invalid parameter validation
|
||||||
|
StatusCodeErrorResponse.md: Status code error response
|
||||||
|
|
||||||
|
# Post-setup and endpoints
|
||||||
|
SetEndpoint.md: Set endpoint
|
||||||
|
RequestHandlerTemplate.md: Request handler template
|
||||||
|
ResponseHandlerTemplate.md: Response handler template
|
||||||
|
|
||||||
|
# Autocomplete
|
||||||
|
SimpleAutocompleteOption.md: Simple autocomplete option
|
||||||
|
|
||||||
|
# Continuation
|
||||||
|
Continuation.md: Continuation interface
|
||||||
|
|
||||||
|
# Type aliases (100+ type aliases)
|
||||||
|
type-aliases:
|
||||||
|
# Formula type aliases
|
||||||
|
Formula.md: Formula type
|
||||||
|
BaseFormula.md: Base formula
|
||||||
|
PackFormulaResult.md: Pack formula result
|
||||||
|
PackFormulaValue.md: Pack formula value
|
||||||
|
StringFormulaDef.md: String formula definition
|
||||||
|
NumericFormulaDef.md: Numeric formula definition
|
||||||
|
BooleanFormulaDef.md: Boolean formula definition
|
||||||
|
ArrayFormulaDef.md: Array formula definition
|
||||||
|
ObjectFormulaDef.md: Object formula definition
|
||||||
|
TypedPackFormula.md: Typed pack formula
|
||||||
|
StringPackFormula.md: String pack formula
|
||||||
|
NumericPackFormula.md: Numeric pack formula
|
||||||
|
BooleanPackFormula.md: Boolean pack formula
|
||||||
|
ObjectPackFormula.md: Object pack formula
|
||||||
|
|
||||||
|
# Schema type aliases
|
||||||
|
Schema.md: Schema type
|
||||||
|
SchemaType.md: Schema type enum
|
||||||
|
NumberSchema.md: Number schema
|
||||||
|
StringSchema.md: String schema
|
||||||
|
StringHintTypes.md: String hint types
|
||||||
|
NumberHintTypes.md: Number hint types
|
||||||
|
BooleanHintTypes.md: Boolean hint types
|
||||||
|
ObjectHintTypes.md: Object hint types
|
||||||
|
ObjectSchemaProperties.md: Object schema properties
|
||||||
|
PropertySchemaOptions.md: Property schema options
|
||||||
|
|
||||||
|
# Sync table type aliases
|
||||||
|
SyncTable.md: Sync table
|
||||||
|
GenericSyncTable.md: Generic sync table
|
||||||
|
GenericDynamicSyncTable.md: Generic dynamic sync table
|
||||||
|
SyncFormula.md: Sync formula
|
||||||
|
GenericSyncFormula.md: Generic sync formula
|
||||||
|
GenericSyncFormulaResult.md: Generic sync formula result
|
||||||
|
Sync.md: Sync type
|
||||||
|
SyncCompletionMetadataResult.md: Sync completion metadata result
|
||||||
|
GenericSyncUpdate.md: Generic sync update
|
||||||
|
GenericSyncUpdateSingleResult.md: Generic sync update single
|
||||||
|
SyncUpdateSingleResult.md: Sync update single result
|
||||||
|
|
||||||
|
# Authentication type aliases
|
||||||
|
Authentication.md: Authentication type
|
||||||
|
AuthenticationDef.md: Authentication definition
|
||||||
|
SystemAuthentication.md: System authentication
|
||||||
|
SystemAuthenticationDef.md: System authentication definition
|
||||||
|
UserAuthenticationDef.md: User authentication definition
|
||||||
|
|
||||||
|
# Metadata type aliases
|
||||||
|
MetadataFormula.md: Metadata formula
|
||||||
|
MetadataFormulaDef.md: Metadata formula definition
|
||||||
|
MetadataFormulaResultType.md: Metadata formula result
|
||||||
|
MetadataFunction.md: Metadata function
|
||||||
|
MetadataContext.md: Metadata context
|
||||||
|
LegacyDefaultMetadataReturnType.md: Legacy metadata return
|
||||||
|
PropertyOptionsMetadataFunction.md: Property options metadata function
|
||||||
|
PropertyOptionsMetadataResult.md: Property options metadata result
|
||||||
|
|
||||||
|
# Parameter type aliases
|
||||||
|
ParamDefs.md: Parameter definitions
|
||||||
|
ParamValues.md: Parameter values
|
||||||
|
ParameterOptions.md: Parameter options
|
||||||
|
ParameterValidationResult.md: Parameter validation result
|
||||||
|
ParamDefFromOptionsUnion.md: Param def from options
|
||||||
|
SuggestedValueType.md: Suggested value type
|
||||||
|
|
||||||
|
# Pack definition type aliases
|
||||||
|
BasicPackDefinition.md: Basic pack definition
|
||||||
|
PackId.md: Pack ID
|
||||||
|
|
||||||
|
# Error type aliases
|
||||||
|
InvocationError.md: Invocation error
|
||||||
|
HttpStatusInvocationError.md: HTTP status error
|
||||||
|
TimeoutInvocationError.md: Timeout error
|
||||||
|
RateLimitExceededInvocationError.md: Rate limit error
|
||||||
|
ResponseTooLargeInvocationError.md: Response too large error
|
||||||
|
UnknownInvocationError.md: Unknown error
|
||||||
|
|
||||||
|
# Formula options type aliases
|
||||||
|
FormulaDefinitionOptions.md: Formula definition options
|
||||||
|
FormulaOptions.md: Formula options
|
||||||
|
|
||||||
|
# Post-setup type aliases
|
||||||
|
PostSetup.md: Post-setup type
|
||||||
|
PostSetupDef.md: Post-setup definition
|
||||||
|
SetEndpointDef.md: Set endpoint definition
|
||||||
|
|
||||||
|
# Attribution type aliases
|
||||||
|
AttributionNode.md: Attribution node
|
||||||
|
|
||||||
|
# Embedded content type aliases
|
||||||
|
EmbeddedContent.md: Embedded content type
|
||||||
|
|
||||||
|
# Indexing type aliases
|
||||||
|
IndexDefinition.md: Index definition
|
||||||
|
BasicIndexedProperty.md: Basic indexed property
|
||||||
|
IndexedProperty.md: Indexed property
|
||||||
|
FilterableProperty.md: Filterable property
|
||||||
|
PropertyIdentifier.md: Property identifier
|
||||||
|
|
||||||
|
# Context type aliases
|
||||||
|
ContextProperties.md: Context properties
|
||||||
|
|
||||||
|
# Screen annotation type aliases
|
||||||
|
ScreenAnnotation.md: Screen annotation
|
||||||
|
|
||||||
|
# Knowledge tool type aliases
|
||||||
|
KnowledgeToolSource.md: Knowledge tool source
|
||||||
|
|
||||||
|
# Skills type aliases
|
||||||
|
PartialSkillDef.md: Partial skill definition
|
||||||
|
|
||||||
|
# Fetch type aliases
|
||||||
|
FetchMethodType.md: Fetch method type
|
||||||
|
|
||||||
|
# Inference type aliases
|
||||||
|
InferrableTypes.md: Inferrable types
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
variables:
|
||||||
|
PropertyLabelValueTemplate.md: Property label value template
|
||||||
|
ValidFetchMethods.md: Valid fetch methods
|
||||||
|
|
||||||
|
# Namespaces
|
||||||
|
namespaces:
|
||||||
|
SvgConstants:
|
||||||
|
index.md: SVG constants
|
||||||
|
variables:
|
||||||
|
DataUrlPrefix.md: Data URL prefix
|
||||||
|
DataUrlPrefixWithDarkModeSupport.md: Data URL with dark mode
|
||||||
|
DarkModeFragmentId.md: Dark mode fragment ID
|
||||||
|
|
||||||
|
# Testing SDK
|
||||||
|
testing:
|
||||||
|
index.md: Testing SDK index
|
||||||
|
|
||||||
|
# Testing functions
|
||||||
|
functions:
|
||||||
|
executeFormulaFromPackDef.md: Execute formula from pack
|
||||||
|
executeFormulaOrSyncWithVM.md: Execute with VM
|
||||||
|
executeSyncFormula.md: Execute sync formula
|
||||||
|
executeSyncFormulaFromPackDef.md: Execute sync from pack
|
||||||
|
executeSyncFormulaFromPackDefSingleIteration.md: Execute single iteration
|
||||||
|
executeMetadataFormula.md: Execute metadata formula
|
||||||
|
newMockExecutionContext.md: New mock execution context
|
||||||
|
newMockSyncExecutionContext.md: New mock sync context
|
||||||
|
newRealFetcherExecutionContext.md: New real fetcher context
|
||||||
|
newRealFetcherSyncExecutionContext.md: New real fetcher sync context
|
||||||
|
newJsonFetchResponse.md: New JSON fetch response
|
||||||
|
|
||||||
|
# Testing interfaces
|
||||||
|
interfaces:
|
||||||
|
MockExecutionContext.md: Mock execution context
|
||||||
|
MockSyncExecutionContext.md: Mock sync execution context
|
||||||
|
ExecuteOptions.md: Execute options
|
||||||
|
ContextOptions.md: Context options
|
||||||
|
|
||||||
|
# Testing type aliases
|
||||||
|
type-aliases:
|
||||||
|
SyncExecutionContextAsMock.md: Sync execution context as mock
|
||||||
|
|
||||||
|
# Support
|
||||||
|
support:
|
||||||
|
index.md: Support index
|
||||||
|
faq.md: Frequently asked questions
|
||||||
|
errors.md: Common errors
|
||||||
|
changes.md: Changelog
|
||||||
|
contributing:
|
||||||
|
index.md: Contributing guide
|
||||||
|
style.md: Style guide
|
||||||
|
migration:
|
||||||
|
index.md: Migration guide
|
||||||
|
v0.11.0.md: Migrate to v0.11.0
|
||||||
|
|
||||||
|
# Quick reference paths
|
||||||
|
quick_paths:
|
||||||
|
# Getting started
|
||||||
|
getting_started: docs/tutorials/get-started/web.md
|
||||||
|
overview: docs/guides/overview.md
|
||||||
|
|
||||||
|
# Core building blocks
|
||||||
|
formulas: docs/guides/blocks/formulas.md
|
||||||
|
actions: docs/guides/blocks/actions.md
|
||||||
|
sync_tables: docs/guides/blocks/sync-tables/index.md
|
||||||
|
dynamic_sync_tables: docs/guides/blocks/sync-tables/dynamic.md
|
||||||
|
two_way_sync: docs/guides/blocks/sync-tables/two-way.md
|
||||||
|
column_formats: docs/guides/blocks/column-formats.md
|
||||||
|
cards: docs/guides/blocks/cards.md
|
||||||
|
|
||||||
|
# Basics
|
||||||
|
authentication: docs/guides/basics/authentication/index.md
|
||||||
|
oauth2: docs/guides/basics/authentication/oauth2.md
|
||||||
|
fetcher: docs/guides/basics/fetcher.md
|
||||||
|
data_types: docs/guides/basics/data-types.md
|
||||||
|
parameters: docs/guides/basics/parameters/index.md
|
||||||
|
autocomplete: docs/guides/basics/parameters/autocomplete.md
|
||||||
|
|
||||||
|
# Advanced
|
||||||
|
schemas: docs/guides/advanced/schemas.md
|
||||||
|
caching: docs/guides/advanced/caching.md
|
||||||
|
errors: docs/guides/advanced/errors.md
|
||||||
|
images: docs/guides/advanced/images.md
|
||||||
|
embeds: docs/guides/advanced/embeds.md
|
||||||
|
timezones: docs/guides/advanced/timezones.md
|
||||||
|
|
||||||
|
# Development
|
||||||
|
cli: docs/guides/development/cli.md
|
||||||
|
testing: docs/guides/development/testing.md
|
||||||
|
troubleshooting: docs/guides/development/troubleshooting.md
|
||||||
|
libraries: docs/guides/development/libraries.md
|
||||||
|
versions: docs/guides/development/versions.md
|
||||||
|
|
||||||
|
# SDK Reference
|
||||||
|
sdk_core: docs/reference/sdk/core/index.md
|
||||||
|
sdk_testing: docs/reference/sdk/testing/index.md
|
||||||
|
new_pack: docs/reference/sdk/core/functions/newPack.md
|
||||||
|
make_formula: docs/reference/sdk/core/functions/makeFormula.md
|
||||||
|
make_sync_table: docs/reference/sdk/core/functions/makeSyncTable.md
|
||||||
|
make_dynamic_sync_table: docs/reference/sdk/core/functions/makeDynamicSyncTable.md
|
||||||
|
|
||||||
|
# Samples
|
||||||
|
samples_index: docs/samples/index.md
|
||||||
|
hello_world: docs/samples/full/hello-world.md
|
||||||
|
formula_samples: docs/samples/topic/formula.md
|
||||||
|
sync_table_samples: docs/samples/topic/sync-table.md
|
||||||
|
auth_samples: docs/samples/topic/authentication.md
|
||||||
|
|
||||||
|
# Support
|
||||||
|
faq: docs/support/faq.md
|
||||||
|
best_practices: docs/guides/best-practices.md
|
||||||
|
design: docs/guides/design.md
|
||||||
|
|
||||||
|
# Statistics
|
||||||
|
total_files: 370
|
||||||
|
total_directories: 40
|
||||||
Loading…
Reference in New Issue