Adds composio-sdk/ with SKILL.md, AGENTS.md, and 18 rule files covering Tool Router, direct execution, triggers, and auth patterns. Source: composiohq/skills Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
276 lines
6.8 KiB
Markdown
276 lines
6.8 KiB
Markdown
---
|
|
title: Manage Trigger Lifecycle (Enable, Disable, Update)
|
|
impact: HIGH
|
|
description: Control trigger states, update configurations, and manage trigger instances
|
|
tags: [triggers, lifecycle, enable, disable, update, management]
|
|
---
|
|
|
|
# Manage Trigger Lifecycle
|
|
|
|
Control trigger states and configurations without recreating triggers.
|
|
|
|
## Enable/Disable Triggers
|
|
|
|
```typescript
|
|
// Disable trigger (stop receiving events)
|
|
await composio.triggers.disable('trigger_id_123');
|
|
|
|
// Enable trigger (resume receiving events)
|
|
await composio.triggers.enable('trigger_id_123');
|
|
```
|
|
|
|
**Use cases:**
|
|
- **Disable:** Pause events temporarily, user disconnects account, billing issues
|
|
- **Enable:** Resume after resolving issues, user reconnects account
|
|
|
|
## Update Trigger Configuration
|
|
|
|
```typescript
|
|
// Update trigger config
|
|
await composio.triggers.update('trigger_id_123', {
|
|
triggerConfig: {
|
|
labelIds: 'SENT', // Changed from 'INBOX'
|
|
interval: 120 // Changed from 60
|
|
}
|
|
});
|
|
```
|
|
|
|
**Updateable fields:**
|
|
- `triggerConfig` - Trigger-specific configuration
|
|
- Cannot change trigger slug or connected account
|
|
|
|
## Delete Triggers
|
|
|
|
```typescript
|
|
await composio.triggers.delete('trigger_id_123');
|
|
```
|
|
|
|
**Warning:** Permanent deletion. Creates new trigger if needed later.
|
|
|
|
## List Active Triggers
|
|
|
|
```typescript
|
|
// All active triggers
|
|
const triggers = await composio.triggers.getActiveTriggers();
|
|
|
|
// By trigger slug
|
|
const gmailTriggers = await composio.triggers.getActiveTriggers({
|
|
triggerSlugs: ['GMAIL_NEW_GMAIL_MESSAGE']
|
|
});
|
|
|
|
// By user
|
|
const userTriggers = await composio.triggers.getActiveTriggers({
|
|
userIds: ['user_123']
|
|
});
|
|
|
|
// By connected account
|
|
const accountTriggers = await composio.triggers.getActiveTriggers({
|
|
connectedAccountIds: ['conn_abc123']
|
|
});
|
|
|
|
// By status
|
|
const enabled = await composio.triggers.getActiveTriggers({
|
|
status: 'enabled'
|
|
});
|
|
const disabled = await composio.triggers.getActiveTriggers({
|
|
status: 'disabled'
|
|
});
|
|
|
|
// Combine filters
|
|
const filtered = await composio.triggers.getActiveTriggers({
|
|
triggerSlugs: ['SLACK_NEW_MESSAGE'],
|
|
userIds: ['user_123'],
|
|
status: 'enabled'
|
|
});
|
|
```
|
|
|
|
**Response includes:**
|
|
- `triggerId` - Unique ID
|
|
- `triggerSlug` - Trigger type
|
|
- `userId` - User ID
|
|
- `connectedAccountId` - Account ID
|
|
- `status` - 'enabled' or 'disabled'
|
|
- `config` - Current configuration
|
|
- `createdAt`, `updatedAt` - Timestamps
|
|
|
|
## Get Trigger Details
|
|
|
|
```typescript
|
|
// Get specific trigger
|
|
const trigger = await composio.triggers.getTriggerById('trigger_id_123');
|
|
|
|
console.log(trigger.status); // 'enabled'
|
|
console.log(trigger.triggerSlug); // 'GMAIL_NEW_GMAIL_MESSAGE'
|
|
console.log(trigger.config.triggerConfig); // { labelIds: 'INBOX', ... }
|
|
```
|
|
|
|
## Common Patterns
|
|
|
|
### Pause User's Triggers
|
|
|
|
```typescript
|
|
async function pauseUserTriggers(userId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
userIds: [userId],
|
|
status: 'enabled'
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.disable(trigger.triggerId);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Resume User's Triggers
|
|
|
|
```typescript
|
|
async function resumeUserTriggers(userId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
userIds: [userId],
|
|
status: 'disabled'
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.enable(trigger.triggerId);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Clean Up Disconnected Account Triggers
|
|
|
|
```typescript
|
|
async function cleanupTriggers(connectedAccountId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
connectedAccountIds: [connectedAccountId]
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.delete(trigger.triggerId);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Update All User Gmail Triggers
|
|
|
|
```typescript
|
|
async function updateGmailInterval(userId: string, newInterval: number) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
userIds: [userId],
|
|
triggerSlugs: ['GMAIL_NEW_GMAIL_MESSAGE']
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.update(trigger.triggerId, {
|
|
triggerConfig: {
|
|
...trigger.config.triggerConfig,
|
|
interval: newInterval
|
|
}
|
|
});
|
|
}
|
|
}
|
|
```
|
|
|
|
### Check Trigger Status
|
|
|
|
```typescript
|
|
async function isTriggerActive(triggerId: string): Promise<boolean> {
|
|
try {
|
|
const trigger = await composio.triggers.getTriggerById(triggerId);
|
|
return trigger.status === 'enabled';
|
|
} catch (error) {
|
|
return false; // Trigger doesn't exist
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Trigger Count by User
|
|
|
|
```typescript
|
|
async function getUserTriggerCount(userId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
userIds: [userId]
|
|
});
|
|
|
|
return {
|
|
total: triggers.items.length,
|
|
enabled: triggers.items.filter(t => t.status === 'enabled').length,
|
|
disabled: triggers.items.filter(t => t.status === 'disabled').length
|
|
};
|
|
}
|
|
```
|
|
|
|
## Lifecycle Management
|
|
|
|
### Account Disconnection
|
|
|
|
```typescript
|
|
// When user disconnects an account
|
|
async function handleAccountDisconnect(accountId: string) {
|
|
// Option 1: Disable triggers (can resume later)
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
connectedAccountIds: [accountId]
|
|
});
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.disable(trigger.triggerId);
|
|
}
|
|
|
|
// Option 2: Delete triggers (permanent)
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.delete(trigger.triggerId);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Account Reconnection
|
|
|
|
```typescript
|
|
// When user reconnects
|
|
async function handleAccountReconnect(accountId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
connectedAccountIds: [accountId],
|
|
status: 'disabled'
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.enable(trigger.triggerId);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Subscription Management
|
|
|
|
```typescript
|
|
// Downgrade: disable non-essential triggers
|
|
async function handleDowngrade(userId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
userIds: [userId],
|
|
triggerSlugs: ['NON_ESSENTIAL_TRIGGER']
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.disable(trigger.triggerId);
|
|
}
|
|
}
|
|
|
|
// Upgrade: enable all triggers
|
|
async function handleUpgrade(userId: string) {
|
|
const triggers = await composio.triggers.getActiveTriggers({
|
|
userIds: [userId],
|
|
status: 'disabled'
|
|
});
|
|
|
|
for (const trigger of triggers.items) {
|
|
await composio.triggers.enable(trigger.triggerId);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Key Points
|
|
|
|
- **Disable vs Delete** - Disable pauses events, delete is permanent
|
|
- **Update config** - Change trigger settings without recreating
|
|
- **Filter getActiveTriggers** - Use multiple filters to narrow results
|
|
- **Batch operations** - Loop through triggers for bulk enable/disable
|
|
- **Handle disconnects** - Disable or delete triggers when accounts disconnect
|
|
- **Status check** - Always verify trigger status before operations
|