mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-24 15:45:35 +08:00
feat(integrations): add Trigger.dev integration (#4974)
* feat(integrations): add Trigger.dev integration * feat(integrations): cover the full Trigger.dev management API surface Adds batch retrieve/results, run result/events/trace/tags, queue list and concurrency override/reset, deployments, TRQL query + schema, waitpoint tokens, env var import, and timezones (44 tools total). Marks deduplicationKey required on create schedule and switches list-run filters to the documented comma-separated form, both per the OpenAPI spec. * fix(executor): strip dots from normalized block names so dotted names resolve References split on '.', so a block named "Hunter.io 1" could never be resolved (the first path segment cut the name at the dot). normalizeName now strips dots on both the tag-generation and lookup sides, which cannot break any previously working reference. Aligns the inline normalizers in connection drag-drop, deploy modal, output select, and tag dropdown, and renames Cal Com to Cal.com now that dotted display names work. * improvement(integrations): address Trigger.dev review feedback Reads the delete schedule response instead of hardcoding success, and adds explicit plaintext-secret warnings to the env var read operations and docs. * fix(integrations): scope Trigger.dev block params to the selected operation Advanced sub-block values with non-empty content are serialized regardless of their operation condition, so values left over from a previously selected operation could leak into another operation's API call (e.g., a trigger-task idempotency key filtering the waitpoint list). The params function now routes every shared or remapped param by the selected operation and clears it otherwise. Also derives delete env var success from the response like delete schedule, via a shared helper. * improvement(executor): dot-free names keep reference ownership on legacy collisions Name uniqueness is enforced at the normalized level on create and rename, so new collisions cannot be created. For legacy workflows that already contain names differing only by dots, the resolver now lets the dot-free name own the reference key regardless of block order, so previously working references never change targets.
This commit is contained in:
@@ -7602,3 +7602,32 @@ export function WizaIcon(props: SVGProps<SVGSVGElement>) {
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export function TriggerDevIcon(props: SVGProps<SVGSVGElement>) {
|
||||
const id = useId()
|
||||
const gradientId = `triggerdev_paint0_${id}`
|
||||
|
||||
return (
|
||||
<svg {...props} viewBox='0 0 109 95' fill='none' xmlns='http://www.w3.org/2000/svg'>
|
||||
<path
|
||||
fillRule='evenodd'
|
||||
clipRule='evenodd'
|
||||
d='M32.569 38.1914L54.5301 0.158447L108.956 94.4175H0.104248L22.0654 56.3834L37.6003 65.3517L31.1753 76.4795H77.885L54.5301 36.0332L48.1051 47.1609L32.569 38.1914Z'
|
||||
fill={`url(#${gradientId})`}
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id={gradientId}
|
||||
x1='88.2367'
|
||||
y1='94.4175'
|
||||
x2='87.2207'
|
||||
y2='27.8737'
|
||||
gradientUnits='userSpaceOnUse'
|
||||
>
|
||||
<stop stopColor='#41FF54' />
|
||||
<stop offset='1' stopColor='#E7FF52' />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -197,6 +197,7 @@ import {
|
||||
TextractIcon,
|
||||
TinybirdIcon,
|
||||
TrelloIcon,
|
||||
TriggerDevIcon,
|
||||
TwilioIcon,
|
||||
TypeformIcon,
|
||||
UpstashIcon,
|
||||
@@ -438,6 +439,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
textract_v2: TextractIcon,
|
||||
tinybird: TinybirdIcon,
|
||||
trello: TrelloIcon,
|
||||
trigger_dev: TriggerDevIcon,
|
||||
twilio_sms: TwilioIcon,
|
||||
twilio_voice: TwilioIcon,
|
||||
typeform: TypeformIcon,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Cal Com
|
||||
title: Cal.com
|
||||
description: Manage Cal.com bookings, event types, schedules, and availability
|
||||
---
|
||||
|
||||
|
||||
@@ -197,6 +197,7 @@
|
||||
"textract",
|
||||
"tinybird",
|
||||
"trello",
|
||||
"trigger_dev",
|
||||
"twilio_sms",
|
||||
"twilio_voice",
|
||||
"typeform",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+2
-1
@@ -11,6 +11,7 @@ import {
|
||||
flattenWorkflowOutputs,
|
||||
} from '@/lib/workflows/blocks/flatten-outputs'
|
||||
import { getBlock } from '@/blocks'
|
||||
import { normalizeName } from '@/executor/constants'
|
||||
import { useWorkflowDiffStore } from '@/stores/workflow-diff/store'
|
||||
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
|
||||
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
|
||||
@@ -147,7 +148,7 @@ export function OutputSelect({
|
||||
return flat.map((f) => {
|
||||
const displayBlockName =
|
||||
f.blockName && typeof f.blockName === 'string'
|
||||
? f.blockName.replace(/\s+/g, '').toLowerCase()
|
||||
? normalizeName(f.blockName)
|
||||
: `block-${f.blockId}`
|
||||
return {
|
||||
id: `${f.blockId}_${f.path}`,
|
||||
|
||||
+2
-4
@@ -32,7 +32,7 @@ import {
|
||||
import { syncLocalDraftFromServer } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/hooks/sync-local-draft'
|
||||
import type { DeployReadiness } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/hooks/use-deploy-readiness'
|
||||
import { runPreDeployChecks } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/hooks/use-predeploy-checks'
|
||||
import { startsWithUuid } from '@/executor/constants'
|
||||
import { normalizeName, startsWithUuid } from '@/executor/constants'
|
||||
import { useA2AAgentByWorkflow } from '@/hooks/queries/a2a/agents'
|
||||
import { useApiKeys } from '@/hooks/queries/api-keys'
|
||||
import {
|
||||
@@ -273,9 +273,7 @@ export function DeployModal({
|
||||
const parts = outputId.split('.')
|
||||
if (parts.length >= 2) {
|
||||
const blockName = parts[0]
|
||||
return blocks.some(
|
||||
(b) => b.name?.toLowerCase().replace(/\s+/g, '') === blockName.toLowerCase()
|
||||
)
|
||||
return blocks.some((b) => b.name && normalizeName(b.name) === blockName.toLowerCase())
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@ import { ChevronDown } from 'lucide-react'
|
||||
import { Badge } from '@/components/emcn'
|
||||
import { handleKeyboardActivation } from '@/lib/core/utils/keyboard'
|
||||
import type { ConnectedBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections'
|
||||
import { normalizeName } from '@/executor/constants'
|
||||
|
||||
const logger = createLogger('FieldItem')
|
||||
|
||||
@@ -44,7 +45,7 @@ export function FieldItem({
|
||||
}: FieldItemProps) {
|
||||
const handleDragStart = useCallback(
|
||||
(e: React.DragEvent) => {
|
||||
const normalizedBlockName = connection.name.replace(/\s+/g, '').toLowerCase()
|
||||
const normalizedBlockName = normalizeName(connection.name)
|
||||
const fullTag = `${normalizedBlockName}.${path}`
|
||||
|
||||
e.dataTransfer.setData(
|
||||
|
||||
+2
-1
@@ -14,6 +14,7 @@ import {
|
||||
import type { ConnectedBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections'
|
||||
import { useBlockOutputFields } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields'
|
||||
import { getBlock } from '@/blocks/registry'
|
||||
import { normalizeName } from '@/executor/constants'
|
||||
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
|
||||
import { EMPTY_SUBBLOCK_VALUES, useSubBlockStore } from '@/stores/workflows/subblock/store'
|
||||
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
|
||||
@@ -279,7 +280,7 @@ export function ConnectionBlocks({ connections, currentBlockId }: ConnectionBloc
|
||||
|
||||
const handleConnectionDragStart = useCallback(
|
||||
(e: React.DragEvent, connection: ConnectedBlock) => {
|
||||
const normalizedBlockName = connection.name.replace(/\s+/g, '').toLowerCase()
|
||||
const normalizedBlockName = normalizeName(connection.name)
|
||||
|
||||
e.dataTransfer.setData(
|
||||
'application/json',
|
||||
|
||||
+1
-1
@@ -1518,7 +1518,7 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
||||
if (tag.startsWith(TAG_PREFIXES.VARIABLE)) {
|
||||
const variableName = tag.substring(TAG_PREFIXES.VARIABLE.length)
|
||||
const variableObj = workflowVariables.find(
|
||||
(v: Variable) => v.name.replace(/\s+/g, '') === variableName
|
||||
(v: Variable) => normalizeName(v.name) === variableName
|
||||
)
|
||||
|
||||
if (variableObj) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import { getTrigger } from '@/triggers'
|
||||
|
||||
export const CalComBlock: BlockConfig<ToolResponse> = {
|
||||
type: 'calcom',
|
||||
name: 'Cal Com',
|
||||
name: 'Cal.com',
|
||||
description: 'Manage Cal.com bookings, event types, schedules, and availability',
|
||||
authMode: AuthMode.OAuth,
|
||||
triggerAllowed: true,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -278,6 +278,7 @@ import { ThinkingBlock } from '@/blocks/blocks/thinking'
|
||||
import { TinybirdBlock, TinybirdBlockMeta } from '@/blocks/blocks/tinybird'
|
||||
import { TranslateBlock } from '@/blocks/blocks/translate'
|
||||
import { TrelloBlock, TrelloBlockMeta } from '@/blocks/blocks/trello'
|
||||
import { TriggerDevBlock, TriggerDevBlockMeta } from '@/blocks/blocks/trigger_dev'
|
||||
import { TtsBlock } from '@/blocks/blocks/tts'
|
||||
import { TwilioSMSBlock, TwilioSMSBlockMeta } from '@/blocks/blocks/twilio'
|
||||
import { TwilioVoiceBlock, TwilioVoiceBlockMeta } from '@/blocks/blocks/twilio_voice'
|
||||
@@ -571,6 +572,7 @@ const BLOCK_REGISTRY: Record<string, BlockConfig> = {
|
||||
tinybird: TinybirdBlock,
|
||||
translate: TranslateBlock,
|
||||
trello: TrelloBlock,
|
||||
trigger_dev: TriggerDevBlock,
|
||||
tts: TtsBlock,
|
||||
twilio_sms: TwilioSMSBlock,
|
||||
twilio_voice: TwilioVoiceBlock,
|
||||
@@ -811,6 +813,7 @@ const BLOCK_META_REGISTRY: Record<string, BlockMeta> = {
|
||||
textract: TextractBlockMeta,
|
||||
tinybird: TinybirdBlockMeta,
|
||||
trello: TrelloBlockMeta,
|
||||
trigger_dev: TriggerDevBlockMeta,
|
||||
twilio_sms: TwilioSMSBlockMeta,
|
||||
twilio_voice: TwilioVoiceBlockMeta,
|
||||
typeform: TypeformBlockMeta,
|
||||
|
||||
@@ -7602,3 +7602,32 @@ export function WizaIcon(props: SVGProps<SVGSVGElement>) {
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export function TriggerDevIcon(props: SVGProps<SVGSVGElement>) {
|
||||
const id = useId()
|
||||
const gradientId = `triggerdev_paint0_${id}`
|
||||
|
||||
return (
|
||||
<svg {...props} viewBox='0 0 109 95' fill='none' xmlns='http://www.w3.org/2000/svg'>
|
||||
<path
|
||||
fillRule='evenodd'
|
||||
clipRule='evenodd'
|
||||
d='M32.569 38.1914L54.5301 0.158447L108.956 94.4175H0.104248L22.0654 56.3834L37.6003 65.3517L31.1753 76.4795H77.885L54.5301 36.0332L48.1051 47.1609L32.569 38.1914Z'
|
||||
fill={`url(#${gradientId})`}
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id={gradientId}
|
||||
x1='88.2367'
|
||||
y1='94.4175'
|
||||
x2='87.2207'
|
||||
y2='27.8737'
|
||||
gradientUnits='userSpaceOnUse'
|
||||
>
|
||||
<stop stopColor='#41FF54' />
|
||||
<stop offset='1' stopColor='#E7FF52' />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -485,9 +485,16 @@ export function escapeRegExp(value: string): string {
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes a name for comparison by converting to lowercase and removing spaces.
|
||||
* Used for both block names and variable names to ensure consistent matching.
|
||||
* Normalizes a name for comparison by converting to lowercase and removing
|
||||
* spaces and dots. Used for both block names and variable names to ensure
|
||||
* consistent matching.
|
||||
*
|
||||
* Dots are stripped because `.` is the reference path delimiter — a name like
|
||||
* "Trigger.dev 1" must normalize to "triggerdev1" so the reference
|
||||
* `<triggerdev1.output>` parses unambiguously. Dotted names could never be
|
||||
* referenced before (the first path segment cut the name at the dot), so
|
||||
* stripping dots cannot break any previously working reference.
|
||||
*/
|
||||
export function normalizeName(name: string): string {
|
||||
return name.toLowerCase().replace(/\s+/g, '')
|
||||
return name.toLowerCase().replace(/\s+/g, '').replace(/\./g, '')
|
||||
}
|
||||
|
||||
@@ -243,6 +243,34 @@ describe('BlockResolver', () => {
|
||||
expect(resolver.resolve('<My Source Block>', ctx)).toEqual({ message: 'hello' })
|
||||
})
|
||||
|
||||
it.concurrent('should resolve blocks whose names contain dots via dot-stripped names', () => {
|
||||
const workflow = createTestWorkflow([{ id: 'block-dot', name: 'Hunter.io 1' }])
|
||||
const resolver = new BlockResolver(workflow)
|
||||
const ctx = createTestContext('current', {
|
||||
'block-dot': { email: 'jane@acme.com', score: 92 },
|
||||
})
|
||||
|
||||
expect(resolver.resolve('<hunterio1.email>', ctx)).toBe('jane@acme.com')
|
||||
expect(resolver.resolve('<hunterio1.score>', ctx)).toBe(92)
|
||||
})
|
||||
|
||||
it.concurrent('should keep dot-free names as the reference target on legacy collisions', () => {
|
||||
const blocks = [
|
||||
{ id: 'block-dotted', name: 'Hunter.io 1' },
|
||||
{ id: 'block-plain', name: 'Hunterio 1' },
|
||||
]
|
||||
const ctx = createTestContext('current', {
|
||||
'block-dotted': { email: 'dotted@acme.com' },
|
||||
'block-plain': { email: 'plain@acme.com' },
|
||||
})
|
||||
|
||||
const resolver = new BlockResolver(createTestWorkflow(blocks))
|
||||
expect(resolver.resolve('<hunterio1.email>', ctx)).toBe('plain@acme.com')
|
||||
|
||||
const reversedResolver = new BlockResolver(createTestWorkflow([...blocks].reverse()))
|
||||
expect(reversedResolver.resolve('<hunterio1.email>', ctx)).toBe('plain@acme.com')
|
||||
})
|
||||
|
||||
it.concurrent('should resolve nested property path', () => {
|
||||
const workflow = createTestWorkflow([{ id: 'source' }])
|
||||
const resolver = new BlockResolver(workflow)
|
||||
|
||||
@@ -43,7 +43,18 @@ export class BlockResolver implements Resolver {
|
||||
for (const block of workflow.blocks) {
|
||||
this.blockById.set(block.id, block)
|
||||
if (block.metadata?.name) {
|
||||
this.nameToBlockId.set(normalizeName(block.metadata.name), block.id)
|
||||
// Name uniqueness is enforced at the normalized level on create/rename,
|
||||
// but legacy workflows may contain names that collide only now that
|
||||
// normalizeName strips dots. Dot-free names keep ownership of the key so
|
||||
// previously working references never change targets.
|
||||
const normalizedName = normalizeName(block.metadata.name)
|
||||
const incumbentId = this.nameToBlockId.get(normalizedName)
|
||||
const incumbentName = incumbentId
|
||||
? this.blockById.get(incumbentId)?.metadata?.name
|
||||
: undefined
|
||||
if (!incumbentId || incumbentName?.includes('.')) {
|
||||
this.nameToBlockId.set(normalizedName, block.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const loop of Object.values(workflow.loops ?? {})) {
|
||||
|
||||
@@ -196,6 +196,7 @@ import {
|
||||
TextractIcon,
|
||||
TinybirdIcon,
|
||||
TrelloIcon,
|
||||
TriggerDevIcon,
|
||||
TwilioIcon,
|
||||
TypeformIcon,
|
||||
UpstashIcon,
|
||||
@@ -412,6 +413,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
||||
textract_v2: TextractIcon,
|
||||
tinybird: TinybirdIcon,
|
||||
trello: TrelloIcon,
|
||||
trigger_dev: TriggerDevIcon,
|
||||
twilio_sms: TwilioIcon,
|
||||
twilio_voice: TwilioIcon,
|
||||
typeform: TypeformIcon,
|
||||
|
||||
@@ -2239,7 +2239,7 @@
|
||||
{
|
||||
"type": "calcom",
|
||||
"slug": "cal-com",
|
||||
"name": "Cal Com",
|
||||
"name": "Cal.com",
|
||||
"description": "Manage Cal.com bookings, event types, schedules, and availability",
|
||||
"longDescription": "Integrate Cal.com into your workflow. Create and manage bookings, event types, schedules, and check availability slots. Supports creating, listing, rescheduling, and canceling bookings, as well as managing event types and schedules. Can also trigger workflows based on Cal.com webhook events (booking created, cancelled, rescheduled). Connect your Cal.com account via OAuth.",
|
||||
"bgColor": "#292929",
|
||||
@@ -14808,6 +14808,201 @@
|
||||
"integrationType": "productivity",
|
||||
"tags": ["project-management", "ticketing"]
|
||||
},
|
||||
{
|
||||
"type": "trigger_dev",
|
||||
"slug": "trigger-dev",
|
||||
"name": "Trigger.dev",
|
||||
"description": "Trigger tasks and manage runs and schedules",
|
||||
"longDescription": "Integrate Trigger.dev into the workflow. Trigger and batch trigger background tasks, retrieve and control runs (cancel, replay, reschedule, tags, metadata, events, traces), manage cron schedules, environment variables, queues, deployments, and waitpoint tokens, and query run data with TRQL.",
|
||||
"bgColor": "#000000",
|
||||
"iconName": "TriggerDevIcon",
|
||||
"docsUrl": "https://docs.sim.ai/integrations/trigger_dev",
|
||||
"operations": [
|
||||
{
|
||||
"name": "Trigger Task",
|
||||
"description": "Trigger a Trigger.dev task by its identifier with an optional JSON payload. Returns the ID of the created run."
|
||||
},
|
||||
{
|
||||
"name": "Batch Trigger Task",
|
||||
"description": "Batch trigger a Trigger.dev task with up to 1,000 payloads. All items in the batch run the same task. Returns the batch ID and the created run IDs."
|
||||
},
|
||||
{
|
||||
"name": "Get Batch",
|
||||
"description": "Retrieve a Trigger.dev batch by its ID, including its status, run IDs, and success and failure counts."
|
||||
},
|
||||
{
|
||||
"name": "Get Batch Results",
|
||||
"description": "Retrieve the execution results of every run in a Trigger.dev batch, including outputs and error details."
|
||||
},
|
||||
{
|
||||
"name": "Get Run",
|
||||
"description": "Retrieve a Trigger.dev run by its ID, including status, payload, output, attempts, and timing details."
|
||||
},
|
||||
{
|
||||
"name": "Get Run Result",
|
||||
"description": "Retrieve the result of a Trigger.dev run: whether it succeeded, its output, and error details. Lighter than Get Run when only the outcome is needed."
|
||||
},
|
||||
{
|
||||
"name": "Get Run Events",
|
||||
"description": "Retrieve the log and span events of a Trigger.dev run, including messages, levels, durations, and error events."
|
||||
},
|
||||
{
|
||||
"name": "Get Run Trace",
|
||||
"description": "Retrieve the OpenTelemetry trace of a Trigger.dev run as a tree of spans with timing, errors, and nested children."
|
||||
},
|
||||
{
|
||||
"name": "List Runs",
|
||||
"description": "List Trigger.dev runs in the environment of the API key, with optional filters for status, task, version, tags, schedule, and creation time."
|
||||
},
|
||||
{
|
||||
"name": "Cancel Run",
|
||||
"description": "Cancel an in-progress Trigger.dev run. Has no effect if the run is already completed."
|
||||
},
|
||||
{
|
||||
"name": "Replay Run",
|
||||
"description": "Replay a Trigger.dev run, creating a new run with the same payload and options as the original."
|
||||
},
|
||||
{
|
||||
"name": "Reschedule Run",
|
||||
"description": "Reschedule a delayed Trigger.dev run with a new delay. Only valid while the run is in the DELAYED state."
|
||||
},
|
||||
{
|
||||
"name": "Add Run Tags",
|
||||
"description": "Add tags to an existing Trigger.dev run. Runs can have up to 10 tags."
|
||||
},
|
||||
{
|
||||
"name": "Update Run Metadata",
|
||||
"description": "Replace the metadata of a Trigger.dev run with a new JSON object."
|
||||
},
|
||||
{
|
||||
"name": "Create Schedule",
|
||||
"description": "Create an imperative cron schedule that triggers a Trigger.dev task on a recurring basis."
|
||||
},
|
||||
{
|
||||
"name": "Get Schedule",
|
||||
"description": "Retrieve a Trigger.dev schedule by its ID."
|
||||
},
|
||||
{
|
||||
"name": "List Schedules",
|
||||
"description": "List Trigger.dev schedules in the project, with page-based pagination."
|
||||
},
|
||||
{
|
||||
"name": "Update Schedule",
|
||||
"description": "Update an imperative Trigger.dev schedule by its ID, replacing its task, cron expression, timezone, and external ID."
|
||||
},
|
||||
{
|
||||
"name": "Delete Schedule",
|
||||
"description": "Delete an imperative Trigger.dev schedule by its ID."
|
||||
},
|
||||
{
|
||||
"name": "Activate Schedule",
|
||||
"description": "Activate an imperative Trigger.dev schedule so it resumes triggering its task."
|
||||
},
|
||||
{
|
||||
"name": "Deactivate Schedule",
|
||||
"description": "Deactivate an imperative Trigger.dev schedule so it stops triggering its task."
|
||||
},
|
||||
{
|
||||
"name": "List Env Vars",
|
||||
"description": "List the environment variables of a Trigger.dev project environment. Values are returned in plaintext and will appear in workflow outputs and run history — scope this operation carefully."
|
||||
},
|
||||
{
|
||||
"name": "Create Env Var",
|
||||
"description": "Create an environment variable in a Trigger.dev project environment."
|
||||
},
|
||||
{
|
||||
"name": "Get Env Var",
|
||||
"description": "Retrieve an environment variable from a Trigger.dev project environment. The value is returned in plaintext and will appear in workflow outputs and run history."
|
||||
},
|
||||
{
|
||||
"name": "Update Env Var",
|
||||
"description": "Update the value of an environment variable in a Trigger.dev project environment."
|
||||
},
|
||||
{
|
||||
"name": "Delete Env Var",
|
||||
"description": "Delete an environment variable from a Trigger.dev project environment."
|
||||
},
|
||||
{
|
||||
"name": "Import Env Vars",
|
||||
"description": "Upload multiple environment variables to a Trigger.dev project environment in one request."
|
||||
},
|
||||
{
|
||||
"name": "Get Queue",
|
||||
"description": "Retrieve a Trigger.dev queue by ID, task identifier, or custom queue name, including its running and queued counts."
|
||||
},
|
||||
{
|
||||
"name": "List Queues",
|
||||
"description": "List the queues in the environment of the API key, including running and queued counts, with page-based pagination."
|
||||
},
|
||||
{
|
||||
"name": "Pause Queue",
|
||||
"description": "Pause a Trigger.dev queue so no new runs start. Runs that are currently executing continue to completion."
|
||||
},
|
||||
{
|
||||
"name": "Resume Queue",
|
||||
"description": "Resume a paused Trigger.dev queue so new runs can start again."
|
||||
},
|
||||
{
|
||||
"name": "Override Queue Concurrency",
|
||||
"description": "Override the concurrency limit of a Trigger.dev queue with a new value."
|
||||
},
|
||||
{
|
||||
"name": "Reset Queue Concurrency",
|
||||
"description": "Reset the concurrency limit of a Trigger.dev queue back to its base value, removing any override."
|
||||
},
|
||||
{
|
||||
"name": "List Deployments",
|
||||
"description": "List Trigger.dev deployments in the environment of the API key, with optional status and creation-time filters."
|
||||
},
|
||||
{
|
||||
"name": "Get Deployment",
|
||||
"description": "Retrieve a Trigger.dev deployment by its ID, including its status, version, and registered tasks."
|
||||
},
|
||||
{
|
||||
"name": "Get Latest Deployment",
|
||||
"description": "Retrieve the latest Trigger.dev deployment in the environment of the API key."
|
||||
},
|
||||
{
|
||||
"name": "Promote Deployment",
|
||||
"description": "Promote a Trigger.dev deployment version so new runs execute on it (e.g., to roll back to a previous version)."
|
||||
},
|
||||
{
|
||||
"name": "Execute Query",
|
||||
"description": "Execute a TRQL (SQL-like) query against Trigger.dev run data for reporting and analytics."
|
||||
},
|
||||
{
|
||||
"name": "Get Query Schema",
|
||||
"description": "Retrieve the TRQL query schema: the tables and columns available for Execute Query, with types and allowed values."
|
||||
},
|
||||
{
|
||||
"name": "Create Waitpoint Token",
|
||||
"description": "Create a Trigger.dev waitpoint token that a task can wait on until it is completed from outside (e.g., a human approval)."
|
||||
},
|
||||
{
|
||||
"name": "Complete Waitpoint Token",
|
||||
"description": "Complete a Trigger.dev waitpoint token, resuming any task waiting on it and passing it optional JSON data."
|
||||
},
|
||||
{
|
||||
"name": "Get Waitpoint Token",
|
||||
"description": "Retrieve a Trigger.dev waitpoint token by its ID, including its status, timeout, and completion data."
|
||||
},
|
||||
{
|
||||
"name": "List Waitpoint Tokens",
|
||||
"description": "List Trigger.dev waitpoint tokens in the environment of the API key, with optional status, tag, and creation-time filters."
|
||||
},
|
||||
{
|
||||
"name": "List Timezones",
|
||||
"description": "List the IANA timezones supported by Trigger.dev schedules, for use as the timezone of a cron schedule."
|
||||
}
|
||||
],
|
||||
"operationCount": 44,
|
||||
"triggers": [],
|
||||
"triggerCount": 0,
|
||||
"authType": "api-key",
|
||||
"category": "tools",
|
||||
"integrationType": "devops",
|
||||
"tags": ["automation", "ci-cd", "monitoring"]
|
||||
},
|
||||
{
|
||||
"type": "twilio_sms",
|
||||
"slug": "twilio-sms",
|
||||
|
||||
@@ -35,10 +35,15 @@ describe('normalizeName', () => {
|
||||
expect(normalizeName('already_normalized')).toBe('already_normalized')
|
||||
})
|
||||
|
||||
it.concurrent('should preserve non-space special characters', () => {
|
||||
it.concurrent('should preserve non-space special characters except dots', () => {
|
||||
expect(normalizeName('my-variable')).toBe('my-variable')
|
||||
expect(normalizeName('my_variable')).toBe('my_variable')
|
||||
expect(normalizeName('my.variable')).toBe('my.variable')
|
||||
})
|
||||
|
||||
it.concurrent('should strip dots since they conflict with the reference path delimiter', () => {
|
||||
expect(normalizeName('my.variable')).toBe('myvariable')
|
||||
expect(normalizeName('Trigger.dev 1')).toBe('triggerdev1')
|
||||
expect(normalizeName('Hunter.io 2')).toBe('hunterio2')
|
||||
})
|
||||
|
||||
it.concurrent('should handle tabs and newlines as whitespace', () => {
|
||||
|
||||
@@ -3189,6 +3189,52 @@ import {
|
||||
trelloListListsTool,
|
||||
trelloUpdateCardTool,
|
||||
} from '@/tools/trello'
|
||||
import {
|
||||
triggerDevActivateScheduleTool,
|
||||
triggerDevAddRunTagsTool,
|
||||
triggerDevBatchTriggerTaskTool,
|
||||
triggerDevCancelRunTool,
|
||||
triggerDevCompleteWaitpointTokenTool,
|
||||
triggerDevCreateEnvVarTool,
|
||||
triggerDevCreateScheduleTool,
|
||||
triggerDevCreateWaitpointTokenTool,
|
||||
triggerDevDeactivateScheduleTool,
|
||||
triggerDevDeleteEnvVarTool,
|
||||
triggerDevDeleteScheduleTool,
|
||||
triggerDevExecuteQueryTool,
|
||||
triggerDevGetBatchResultsTool,
|
||||
triggerDevGetBatchTool,
|
||||
triggerDevGetDeploymentTool,
|
||||
triggerDevGetEnvVarTool,
|
||||
triggerDevGetLatestDeploymentTool,
|
||||
triggerDevGetQuerySchemaTool,
|
||||
triggerDevGetQueueTool,
|
||||
triggerDevGetRunEventsTool,
|
||||
triggerDevGetRunResultTool,
|
||||
triggerDevGetRunTool,
|
||||
triggerDevGetRunTraceTool,
|
||||
triggerDevGetScheduleTool,
|
||||
triggerDevGetWaitpointTokenTool,
|
||||
triggerDevImportEnvVarsTool,
|
||||
triggerDevListDeploymentsTool,
|
||||
triggerDevListEnvVarsTool,
|
||||
triggerDevListQueuesTool,
|
||||
triggerDevListRunsTool,
|
||||
triggerDevListSchedulesTool,
|
||||
triggerDevListTimezonesTool,
|
||||
triggerDevListWaitpointTokensTool,
|
||||
triggerDevOverrideQueueConcurrencyTool,
|
||||
triggerDevPauseQueueTool,
|
||||
triggerDevPromoteDeploymentTool,
|
||||
triggerDevReplayRunTool,
|
||||
triggerDevRescheduleRunTool,
|
||||
triggerDevResetQueueConcurrencyTool,
|
||||
triggerDevResumeQueueTool,
|
||||
triggerDevTriggerTaskTool,
|
||||
triggerDevUpdateEnvVarTool,
|
||||
triggerDevUpdateRunMetadataTool,
|
||||
triggerDevUpdateScheduleTool,
|
||||
} from '@/tools/trigger_dev'
|
||||
import {
|
||||
azureTtsTool,
|
||||
cartesiaTtsTool,
|
||||
@@ -5257,6 +5303,50 @@ export const tools: Record<string, ToolConfig> = {
|
||||
trello_update_card: trelloUpdateCardTool,
|
||||
trello_get_actions: trelloGetActionsTool,
|
||||
trello_add_comment: trelloAddCommentTool,
|
||||
trigger_dev_trigger_task: triggerDevTriggerTaskTool,
|
||||
trigger_dev_batch_trigger_task: triggerDevBatchTriggerTaskTool,
|
||||
trigger_dev_get_batch: triggerDevGetBatchTool,
|
||||
trigger_dev_get_batch_results: triggerDevGetBatchResultsTool,
|
||||
trigger_dev_get_run: triggerDevGetRunTool,
|
||||
trigger_dev_get_run_result: triggerDevGetRunResultTool,
|
||||
trigger_dev_get_run_events: triggerDevGetRunEventsTool,
|
||||
trigger_dev_get_run_trace: triggerDevGetRunTraceTool,
|
||||
trigger_dev_list_runs: triggerDevListRunsTool,
|
||||
trigger_dev_cancel_run: triggerDevCancelRunTool,
|
||||
trigger_dev_replay_run: triggerDevReplayRunTool,
|
||||
trigger_dev_reschedule_run: triggerDevRescheduleRunTool,
|
||||
trigger_dev_add_run_tags: triggerDevAddRunTagsTool,
|
||||
trigger_dev_update_run_metadata: triggerDevUpdateRunMetadataTool,
|
||||
trigger_dev_create_schedule: triggerDevCreateScheduleTool,
|
||||
trigger_dev_get_schedule: triggerDevGetScheduleTool,
|
||||
trigger_dev_list_schedules: triggerDevListSchedulesTool,
|
||||
trigger_dev_update_schedule: triggerDevUpdateScheduleTool,
|
||||
trigger_dev_delete_schedule: triggerDevDeleteScheduleTool,
|
||||
trigger_dev_activate_schedule: triggerDevActivateScheduleTool,
|
||||
trigger_dev_deactivate_schedule: triggerDevDeactivateScheduleTool,
|
||||
trigger_dev_list_env_vars: triggerDevListEnvVarsTool,
|
||||
trigger_dev_create_env_var: triggerDevCreateEnvVarTool,
|
||||
trigger_dev_get_env_var: triggerDevGetEnvVarTool,
|
||||
trigger_dev_update_env_var: triggerDevUpdateEnvVarTool,
|
||||
trigger_dev_delete_env_var: triggerDevDeleteEnvVarTool,
|
||||
trigger_dev_import_env_vars: triggerDevImportEnvVarsTool,
|
||||
trigger_dev_get_queue: triggerDevGetQueueTool,
|
||||
trigger_dev_list_queues: triggerDevListQueuesTool,
|
||||
trigger_dev_pause_queue: triggerDevPauseQueueTool,
|
||||
trigger_dev_resume_queue: triggerDevResumeQueueTool,
|
||||
trigger_dev_override_queue_concurrency: triggerDevOverrideQueueConcurrencyTool,
|
||||
trigger_dev_reset_queue_concurrency: triggerDevResetQueueConcurrencyTool,
|
||||
trigger_dev_list_deployments: triggerDevListDeploymentsTool,
|
||||
trigger_dev_get_deployment: triggerDevGetDeploymentTool,
|
||||
trigger_dev_get_latest_deployment: triggerDevGetLatestDeploymentTool,
|
||||
trigger_dev_promote_deployment: triggerDevPromoteDeploymentTool,
|
||||
trigger_dev_execute_query: triggerDevExecuteQueryTool,
|
||||
trigger_dev_get_query_schema: triggerDevGetQuerySchemaTool,
|
||||
trigger_dev_create_waitpoint_token: triggerDevCreateWaitpointTokenTool,
|
||||
trigger_dev_complete_waitpoint_token: triggerDevCompleteWaitpointTokenTool,
|
||||
trigger_dev_get_waitpoint_token: triggerDevGetWaitpointTokenTool,
|
||||
trigger_dev_list_waitpoint_tokens: triggerDevListWaitpointTokensTool,
|
||||
trigger_dev_list_timezones: triggerDevListTimezonesTool,
|
||||
vercel_list_deployments: vercelListDeploymentsTool,
|
||||
vercel_get_deployment: vercelGetDeploymentTool,
|
||||
vercel_create_deployment: vercelCreateDeploymentTool,
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import type {
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevScheduleResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevSchedule,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevActivateScheduleTool: ToolConfig<
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevScheduleResponse
|
||||
> = {
|
||||
id: 'trigger_dev_activate_schedule',
|
||||
name: 'Trigger.dev Activate Schedule',
|
||||
description: 'Activate an imperative Trigger.dev schedule so it resumes triggering its task.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
scheduleId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the schedule to activate (starts with sched_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/schedules/${encodeURIComponent(params.scheduleId.trim())}/activate`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevSchedule(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
import type {
|
||||
TriggerDevAddRunTagsParams,
|
||||
TriggerDevAddRunTagsResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
splitCommaSeparated,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevAddRunTagsTool: ToolConfig<
|
||||
TriggerDevAddRunTagsParams,
|
||||
TriggerDevAddRunTagsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_add_run_tags',
|
||||
name: 'Trigger.dev Add Run Tags',
|
||||
description: 'Add tags to an existing Trigger.dev run. Runs can have up to 10 tags.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to tag (starts with run_)',
|
||||
},
|
||||
tags: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Comma-separated tags to add to the run (max 10 total, each under 128 characters)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/tags`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({ tags: splitCommaSeparated(params.tags) }),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
message: data.message ?? '',
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
message: { type: 'string', description: 'Confirmation message for the added tags' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import type {
|
||||
TriggerDevBatchTriggerTaskParams,
|
||||
TriggerDevBatchTriggerTaskResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
parseJsonInput,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevBatchTriggerTaskTool: ToolConfig<
|
||||
TriggerDevBatchTriggerTaskParams,
|
||||
TriggerDevBatchTriggerTaskResponse
|
||||
> = {
|
||||
id: 'trigger_dev_batch_trigger_task',
|
||||
name: 'Trigger.dev Batch Trigger Task',
|
||||
description:
|
||||
'Batch trigger a Trigger.dev task with up to 1,000 payloads. All items in the batch run the same task. Returns the batch ID and the created run IDs.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
taskIdentifier: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Identifier of the task to batch trigger (e.g., "send-welcome-email")',
|
||||
},
|
||||
items: {
|
||||
type: 'json',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'JSON array of batch items (max 1,000). Each item is an object with a "payload" and optional "options" (queue, concurrencyKey, idempotencyKey, ttl, delay, tags, machine). Example: [{"payload": {"userId": "user_1"}}, {"payload": {"userId": "user_2"}, "options": {"delay": "1h"}}]',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/tasks/${encodeURIComponent(params.taskIdentifier.trim())}/batch`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const items = parseJsonInput(params.items, 'items')
|
||||
if (!Array.isArray(items)) {
|
||||
throw new Error('The items parameter must be a JSON array of batch items')
|
||||
}
|
||||
return { items }
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
batchId: data.batchId,
|
||||
runIds: data.runs ?? [],
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
batchId: { type: 'string', description: 'ID of the batch that was triggered' },
|
||||
runIds: {
|
||||
type: 'array',
|
||||
description: 'IDs of the runs created by the batch',
|
||||
items: { type: 'string', description: 'Run ID (starts with run_)' },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
import type { TriggerDevRunActionResponse, TriggerDevRunIdParams } from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevCancelRunTool: ToolConfig<
|
||||
TriggerDevRunIdParams,
|
||||
TriggerDevRunActionResponse
|
||||
> = {
|
||||
id: 'trigger_dev_cancel_run',
|
||||
name: 'Trigger.dev Cancel Run',
|
||||
description:
|
||||
'Cancel an in-progress Trigger.dev run. Has no effect if the run is already completed.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to cancel (starts with run_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v2/runs/${encodeURIComponent(params.runId.trim())}/cancel`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: { type: 'string', description: 'ID of the run that was canceled' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
import type {
|
||||
TriggerDevCompleteWaitpointTokenParams,
|
||||
TriggerDevCompleteWaitpointTokenResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
parseJsonInput,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevCompleteWaitpointTokenTool: ToolConfig<
|
||||
TriggerDevCompleteWaitpointTokenParams,
|
||||
TriggerDevCompleteWaitpointTokenResponse
|
||||
> = {
|
||||
id: 'trigger_dev_complete_waitpoint_token',
|
||||
name: 'Trigger.dev Complete Waitpoint Token',
|
||||
description:
|
||||
'Complete a Trigger.dev waitpoint token, resuming any task waiting on it and passing it optional JSON data.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
waitpointId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the waitpoint token to complete (starts with waitpoint_)',
|
||||
},
|
||||
data: {
|
||||
type: 'json',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'JSON data passed back to the waiting run as the token result. Example: {"status": "approved"}',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/waitpoints/tokens/${encodeURIComponent(params.waitpointId.trim())}/complete`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const data = parseJsonInput(params.data, 'data')
|
||||
return data === undefined ? {} : { data }
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
success: data.success ?? true,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
success: { type: 'boolean', description: 'Whether the waitpoint token was completed' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import type {
|
||||
TriggerDevEnvVarActionResponse,
|
||||
TriggerDevEnvVarWriteParams,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevEnvVarsUrl, buildTriggerDevHeaders } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevCreateEnvVarTool: ToolConfig<
|
||||
TriggerDevEnvVarWriteParams,
|
||||
TriggerDevEnvVarActionResponse
|
||||
> = {
|
||||
id: 'trigger_dev_create_env_var',
|
||||
name: 'Trigger.dev Create Env Var',
|
||||
description: 'Create an environment variable in a Trigger.dev project environment.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
projectRef: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External ref of the project, from the project settings (starts with proj_)',
|
||||
},
|
||||
environment: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Environment to create the variable in: dev, staging, or prod',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Name of the environment variable (e.g., "SLACK_API_KEY")',
|
||||
},
|
||||
value: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Value of the environment variable',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => buildTriggerDevEnvVarsUrl(params.projectRef, params.environment),
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({
|
||||
name: params.name,
|
||||
value: params.value,
|
||||
}),
|
||||
},
|
||||
|
||||
transformResponse: async (response, params) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
success: data.success ?? true,
|
||||
name: params?.name ?? '',
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
success: { type: 'boolean', description: 'Whether the environment variable was created' },
|
||||
name: { type: 'string', description: 'Name of the environment variable that was created' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
import type {
|
||||
TriggerDevCreateScheduleParams,
|
||||
TriggerDevScheduleResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevSchedule,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevCreateScheduleTool: ToolConfig<
|
||||
TriggerDevCreateScheduleParams,
|
||||
TriggerDevScheduleResponse
|
||||
> = {
|
||||
id: 'trigger_dev_create_schedule',
|
||||
name: 'Trigger.dev Create Schedule',
|
||||
description:
|
||||
'Create an imperative cron schedule that triggers a Trigger.dev task on a recurring basis.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
task: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Identifier of the task to schedule (e.g., "daily-report")',
|
||||
},
|
||||
cron: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Cron expression defining when the task runs (e.g., "0 0 * * *")',
|
||||
},
|
||||
timezone: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'IANA timezone the cron expression is evaluated in (e.g., "America/New_York"). Defaults to UTC',
|
||||
},
|
||||
externalId: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External identifier to associate with the schedule (e.g., a user ID)',
|
||||
},
|
||||
deduplicationKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Key that prevents duplicate schedules; creating again with the same key updates the existing schedule',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: `${TRIGGER_DEV_API_BASE}/api/v1/schedules`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const body: Record<string, unknown> = {
|
||||
task: params.task,
|
||||
cron: params.cron,
|
||||
deduplicationKey: params.deduplicationKey,
|
||||
}
|
||||
if (params.timezone) body.timezone = params.timezone
|
||||
if (params.externalId) body.externalId = params.externalId
|
||||
return body
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevSchedule(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
import type {
|
||||
TriggerDevCreateWaitpointTokenParams,
|
||||
TriggerDevCreateWaitpointTokenResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
splitCommaSeparated,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevCreateWaitpointTokenTool: ToolConfig<
|
||||
TriggerDevCreateWaitpointTokenParams,
|
||||
TriggerDevCreateWaitpointTokenResponse
|
||||
> = {
|
||||
id: 'trigger_dev_create_waitpoint_token',
|
||||
name: 'Trigger.dev Create Waitpoint Token',
|
||||
description:
|
||||
'Create a Trigger.dev waitpoint token that a task can wait on until it is completed from outside (e.g., a human approval).',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
timeout: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'How long before the token times out, as a duration ("30s", "1m", "2h", "3d") or an ISO 8601 date',
|
||||
},
|
||||
idempotencyKey: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Idempotency key; passing the same key before it expires returns the original token',
|
||||
},
|
||||
idempotencyKeyTTL: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'How long the idempotency key is valid, as a duration ("30s", "1m", "2h", "3d")',
|
||||
},
|
||||
tags: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Comma-separated tags to attach to the waitpoint (max 10, each under 128 characters)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: `${TRIGGER_DEV_API_BASE}/api/v1/waitpoints/tokens`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const body: Record<string, unknown> = {}
|
||||
if (params.timeout) body.timeout = params.timeout
|
||||
if (params.idempotencyKey) body.idempotencyKey = params.idempotencyKey
|
||||
if (params.idempotencyKeyTTL) body.idempotencyKeyTTL = params.idempotencyKeyTTL
|
||||
if (params.tags) {
|
||||
const tags = splitCommaSeparated(params.tags)
|
||||
if (tags.length > 0) body.tags = tags
|
||||
}
|
||||
return body
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
isCached: data.isCached ?? false,
|
||||
url: data.url,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: {
|
||||
type: 'string',
|
||||
description: 'Unique ID of the waitpoint token (starts with waitpoint_)',
|
||||
},
|
||||
isCached: {
|
||||
type: 'boolean',
|
||||
description:
|
||||
'Whether an existing token was returned because the same idempotency key was reused',
|
||||
},
|
||||
url: {
|
||||
type: 'string',
|
||||
description:
|
||||
'HTTP callback URL; a POST request to this URL completes the waitpoint without an API key',
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
import type {
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevScheduleResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevSchedule,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevDeactivateScheduleTool: ToolConfig<
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevScheduleResponse
|
||||
> = {
|
||||
id: 'trigger_dev_deactivate_schedule',
|
||||
name: 'Trigger.dev Deactivate Schedule',
|
||||
description: 'Deactivate an imperative Trigger.dev schedule so it stops triggering its task.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
scheduleId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the schedule to deactivate (starts with sched_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/schedules/${encodeURIComponent(params.scheduleId.trim())}/deactivate`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevSchedule(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
import type {
|
||||
TriggerDevEnvVarActionResponse,
|
||||
TriggerDevEnvVarNameParams,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevEnvVarsUrl,
|
||||
buildTriggerDevHeaders,
|
||||
resolveTriggerDevSuccess,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevDeleteEnvVarTool: ToolConfig<
|
||||
TriggerDevEnvVarNameParams,
|
||||
TriggerDevEnvVarActionResponse
|
||||
> = {
|
||||
id: 'trigger_dev_delete_env_var',
|
||||
name: 'Trigger.dev Delete Env Var',
|
||||
description: 'Delete an environment variable from a Trigger.dev project environment.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
projectRef: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External ref of the project, from the project settings (starts with proj_)',
|
||||
},
|
||||
environment: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Environment the variable belongs to: dev, staging, or prod',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Name of the environment variable to delete (e.g., "SLACK_API_KEY")',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => buildTriggerDevEnvVarsUrl(params.projectRef, params.environment, params.name),
|
||||
method: 'DELETE',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response, params) => {
|
||||
const deleted = await resolveTriggerDevSuccess(response)
|
||||
return {
|
||||
success: deleted,
|
||||
output: {
|
||||
success: deleted,
|
||||
name: params?.name ?? '',
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
success: { type: 'boolean', description: 'Whether the environment variable was deleted' },
|
||||
name: { type: 'string', description: 'Name of the environment variable that was deleted' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import type {
|
||||
TriggerDevDeleteScheduleResponse,
|
||||
TriggerDevScheduleIdParams,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
resolveTriggerDevSuccess,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevDeleteScheduleTool: ToolConfig<
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevDeleteScheduleResponse
|
||||
> = {
|
||||
id: 'trigger_dev_delete_schedule',
|
||||
name: 'Trigger.dev Delete Schedule',
|
||||
description: 'Delete an imperative Trigger.dev schedule by its ID.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
scheduleId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the schedule to delete (starts with sched_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/schedules/${encodeURIComponent(params.scheduleId.trim())}`,
|
||||
method: 'DELETE',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response, params) => {
|
||||
const deleted = await resolveTriggerDevSuccess(response)
|
||||
return {
|
||||
success: deleted,
|
||||
output: {
|
||||
deleted,
|
||||
scheduleId: params?.scheduleId ?? '',
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
deleted: { type: 'boolean', description: 'Whether the schedule was deleted' },
|
||||
scheduleId: { type: 'string', description: 'ID of the schedule that was deleted' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
import type {
|
||||
TriggerDevExecuteQueryParams,
|
||||
TriggerDevExecuteQueryResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevExecuteQueryTool: ToolConfig<
|
||||
TriggerDevExecuteQueryParams,
|
||||
TriggerDevExecuteQueryResponse
|
||||
> = {
|
||||
id: 'trigger_dev_execute_query',
|
||||
name: 'Trigger.dev Execute Query',
|
||||
description:
|
||||
'Execute a TRQL (SQL-like) query against Trigger.dev run data for reporting and analytics.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
query: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'TRQL query to execute (e.g., "SELECT run_id, status, triggered_at FROM runs WHERE status = \'Failed\' LIMIT 10")',
|
||||
},
|
||||
scope: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Scope of data to query: environment (default), project, or organization',
|
||||
},
|
||||
period: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Time period shorthand (e.g., "1h", "7d", "30d"). Cannot be combined with from/to',
|
||||
},
|
||||
from: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Start of the time range as an ISO 8601 timestamp. Must be used with "to"',
|
||||
},
|
||||
to: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'End of the time range as an ISO 8601 timestamp. Must be used with "from"',
|
||||
},
|
||||
format: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Response format: "json" (default) for structured rows or "csv" for a CSV string',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: `${TRIGGER_DEV_API_BASE}/api/v1/query`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const body: Record<string, unknown> = { query: params.query }
|
||||
if (params.scope) body.scope = params.scope
|
||||
if (params.period) body.period = params.period
|
||||
if (params.from) body.from = params.from
|
||||
if (params.to) body.to = params.to
|
||||
if (params.format) body.format = params.format
|
||||
return body
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
format: data.format ?? 'json',
|
||||
results: data.results ?? [],
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
format: { type: 'string', description: 'Format of the results (json or csv)' },
|
||||
results: {
|
||||
type: 'json',
|
||||
description: 'Query results: an array of row objects for json format, a CSV string for csv',
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
import type { TriggerDevBatchIdParams, TriggerDevGetBatchResponse } from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetBatchTool: ToolConfig<
|
||||
TriggerDevBatchIdParams,
|
||||
TriggerDevGetBatchResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_batch',
|
||||
name: 'Trigger.dev Get Batch',
|
||||
description:
|
||||
'Retrieve a Trigger.dev batch by its ID, including its status, run IDs, and success and failure counts.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
batchId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the batch to retrieve (starts with batch_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/batches/${encodeURIComponent(params.batchId.trim())}`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
status: data.status,
|
||||
idempotencyKey: data.idempotencyKey ?? null,
|
||||
createdAt: data.createdAt ?? null,
|
||||
updatedAt: data.updatedAt ?? null,
|
||||
runCount: data.runCount ?? null,
|
||||
runIds: data.runs ?? [],
|
||||
successfulRunCount: data.successfulRunCount ?? null,
|
||||
failedRunCount: data.failedRunCount ?? null,
|
||||
errors: data.errors
|
||||
? data.errors.map(
|
||||
(batchError: {
|
||||
index?: number
|
||||
taskIdentifier?: string
|
||||
error?: Record<string, unknown>
|
||||
errorCode?: string | null
|
||||
}) => ({
|
||||
index: batchError.index ?? null,
|
||||
taskIdentifier: batchError.taskIdentifier ?? null,
|
||||
error: batchError.error ?? null,
|
||||
errorCode: batchError.errorCode ?? null,
|
||||
})
|
||||
)
|
||||
: null,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: { type: 'string', description: 'ID of the batch (starts with batch_)' },
|
||||
status: {
|
||||
type: 'string',
|
||||
description: 'Batch status (PENDING, PROCESSING, COMPLETED, PARTIAL_FAILED, or ABORTED)',
|
||||
},
|
||||
idempotencyKey: {
|
||||
type: 'string',
|
||||
description: 'Idempotency key provided when triggering the batch',
|
||||
optional: true,
|
||||
},
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the batch was created',
|
||||
optional: true,
|
||||
},
|
||||
updatedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the batch was last updated',
|
||||
optional: true,
|
||||
},
|
||||
runCount: { type: 'number', description: 'Total number of runs in the batch', optional: true },
|
||||
runIds: {
|
||||
type: 'array',
|
||||
description: 'IDs of the runs in the batch',
|
||||
items: { type: 'string', description: 'Run ID (starts with run_)' },
|
||||
},
|
||||
successfulRunCount: {
|
||||
type: 'number',
|
||||
description: 'Number of successful runs, populated after completion',
|
||||
optional: true,
|
||||
},
|
||||
failedRunCount: {
|
||||
type: 'number',
|
||||
description: 'Number of failed runs, populated after completion',
|
||||
optional: true,
|
||||
},
|
||||
errors: {
|
||||
type: 'array',
|
||||
description: 'Error details for failed items, present for PARTIAL_FAILED batches',
|
||||
optional: true,
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Failed batch item',
|
||||
properties: {
|
||||
index: { type: 'number', description: 'Index of the failed item', nullable: true },
|
||||
taskIdentifier: {
|
||||
type: 'string',
|
||||
description: 'Task identifier of the failed item',
|
||||
nullable: true,
|
||||
},
|
||||
error: { type: 'json', description: 'Error details', nullable: true },
|
||||
errorCode: { type: 'string', description: 'Optional error code', nullable: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
import type {
|
||||
TriggerDevBatchIdParams,
|
||||
TriggerDevBatchResultsResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevRunResult,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_RUN_RESULT_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetBatchResultsTool: ToolConfig<
|
||||
TriggerDevBatchIdParams,
|
||||
TriggerDevBatchResultsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_batch_results',
|
||||
name: 'Trigger.dev Get Batch Results',
|
||||
description:
|
||||
'Retrieve the execution results of every run in a Trigger.dev batch, including outputs and error details.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
batchId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the batch to retrieve results for (starts with batch_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/batches/${encodeURIComponent(params.batchId.trim())}/results`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
items: (data.items ?? []).map(mapTriggerDevRunResult),
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: { type: 'string', description: 'ID of the batch (starts with batch_)' },
|
||||
items: {
|
||||
type: 'array',
|
||||
description: 'Execution results for each run in the batch',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Run result',
|
||||
properties: TRIGGER_DEV_RUN_RESULT_PROPERTIES,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import type {
|
||||
TriggerDevDeploymentResponse,
|
||||
TriggerDevGetDeploymentParams,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevDeployment,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_DEPLOYMENT_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetDeploymentTool: ToolConfig<
|
||||
TriggerDevGetDeploymentParams,
|
||||
TriggerDevDeploymentResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_deployment',
|
||||
name: 'Trigger.dev Get Deployment',
|
||||
description:
|
||||
'Retrieve a Trigger.dev deployment by its ID, including its status, version, and registered tasks.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
deploymentId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the deployment to retrieve',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/deployments/${encodeURIComponent(params.deploymentId.trim())}`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevDeployment(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_DEPLOYMENT_PROPERTIES,
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
import type {
|
||||
TriggerDevEnvVarNameParams,
|
||||
TriggerDevEnvVarResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevEnvVarsUrl, buildTriggerDevHeaders } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetEnvVarTool: ToolConfig<
|
||||
TriggerDevEnvVarNameParams,
|
||||
TriggerDevEnvVarResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_env_var',
|
||||
name: 'Trigger.dev Get Env Var',
|
||||
description:
|
||||
'Retrieve an environment variable from a Trigger.dev project environment. The value is returned in plaintext and will appear in workflow outputs and run history.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
projectRef: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External ref of the project, from the project settings (starts with proj_)',
|
||||
},
|
||||
environment: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Environment to read the variable from: dev, staging, or prod',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Name of the environment variable (e.g., "SLACK_API_KEY")',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => buildTriggerDevEnvVarsUrl(params.projectRef, params.environment, params.name),
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
name: data.name,
|
||||
value: data.value,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
name: { type: 'string', description: 'Name of the environment variable' },
|
||||
value: {
|
||||
type: 'string',
|
||||
description:
|
||||
'Plaintext value of the environment variable; appears in workflow outputs and run history',
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import type { TriggerDevBaseParams, TriggerDevDeploymentResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevDeployment,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_DEPLOYMENT_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetLatestDeploymentTool: ToolConfig<
|
||||
TriggerDevBaseParams,
|
||||
TriggerDevDeploymentResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_latest_deployment',
|
||||
name: 'Trigger.dev Get Latest Deployment',
|
||||
description: 'Retrieve the latest Trigger.dev deployment in the environment of the API key.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: `${TRIGGER_DEV_API_BASE}/api/v1/deployments/latest`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevDeployment(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_DEPLOYMENT_PROPERTIES,
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
import type { TriggerDevBaseParams, TriggerDevQuerySchemaResponse } from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetQuerySchemaTool: ToolConfig<
|
||||
TriggerDevBaseParams,
|
||||
TriggerDevQuerySchemaResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_query_schema',
|
||||
name: 'Trigger.dev Get Query Schema',
|
||||
description:
|
||||
'Retrieve the TRQL query schema: the tables and columns available for Execute Query, with types and allowed values.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: `${TRIGGER_DEV_API_BASE}/api/v1/query/schema`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
tables: (data.tables ?? []).map(
|
||||
(table: {
|
||||
name?: string
|
||||
description?: string
|
||||
timeColumn?: string
|
||||
columns?: {
|
||||
name?: string
|
||||
type?: string
|
||||
description?: string
|
||||
example?: string
|
||||
allowedValues?: string[]
|
||||
coreColumn?: boolean
|
||||
}[]
|
||||
}) => ({
|
||||
name: table.name ?? null,
|
||||
description: table.description ?? null,
|
||||
timeColumn: table.timeColumn ?? null,
|
||||
columns: (table.columns ?? []).map((column) => ({
|
||||
name: column.name ?? null,
|
||||
type: column.type ?? null,
|
||||
description: column.description ?? null,
|
||||
example: column.example ?? null,
|
||||
allowedValues: column.allowedValues ?? [],
|
||||
coreColumn: column.coreColumn ?? false,
|
||||
})),
|
||||
})
|
||||
),
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
tables: {
|
||||
type: 'array',
|
||||
description: 'Tables that can be queried with TRQL',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Queryable table',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Table name used in TRQL queries', nullable: true },
|
||||
description: { type: 'string', description: 'Description of the table', nullable: true },
|
||||
timeColumn: {
|
||||
type: 'string',
|
||||
description: 'Primary time column for the table',
|
||||
nullable: true,
|
||||
},
|
||||
columns: {
|
||||
type: 'array',
|
||||
description: 'Columns of the table',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Table column',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Column name', nullable: true },
|
||||
type: { type: 'string', description: 'ClickHouse data type', nullable: true },
|
||||
description: {
|
||||
type: 'string',
|
||||
description: 'Column description',
|
||||
nullable: true,
|
||||
},
|
||||
example: { type: 'string', description: 'Example value', nullable: true },
|
||||
allowedValues: {
|
||||
type: 'array',
|
||||
description: 'Allowed values for enum-like columns',
|
||||
items: { type: 'string', description: 'Allowed value' },
|
||||
},
|
||||
coreColumn: {
|
||||
type: 'boolean',
|
||||
description: 'Whether the column is included in default queries',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import type { TriggerDevQueueParams, TriggerDevQueueResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevQueue,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetQueueTool: ToolConfig<TriggerDevQueueParams, TriggerDevQueueResponse> = {
|
||||
id: 'trigger_dev_get_queue',
|
||||
name: 'Trigger.dev Get Queue',
|
||||
description:
|
||||
'Retrieve a Trigger.dev queue by ID, task identifier, or custom queue name, including its running and queued counts.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
queueName: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Queue ID (starts with queue_), task identifier, or custom queue name, depending on the queue type',
|
||||
},
|
||||
queueType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'How to interpret the queue name: "id" (default) for a queue ID, "task" for a task identifier, or "custom" for a custom queue name',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => {
|
||||
const base = `${TRIGGER_DEV_API_BASE}/api/v1/queues/${encodeURIComponent(params.queueName.trim())}`
|
||||
return params.queueType ? `${base}?type=${encodeURIComponent(params.queueType)}` : base
|
||||
},
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevQueue(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import type { TriggerDevRunIdParams, TriggerDevRunResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevRunDetail,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_RUN_DETAIL_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetRunTool: ToolConfig<TriggerDevRunIdParams, TriggerDevRunResponse> = {
|
||||
id: 'trigger_dev_get_run',
|
||||
name: 'Trigger.dev Get Run',
|
||||
description:
|
||||
'Retrieve a Trigger.dev run by its ID, including status, payload, output, attempts, and timing details.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to retrieve (starts with run_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v3/runs/${encodeURIComponent(params.runId.trim())}`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevRunDetail(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_RUN_DETAIL_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
import type { TriggerDevRunEventsResponse, TriggerDevRunIdParams } from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetRunEventsTool: ToolConfig<
|
||||
TriggerDevRunIdParams,
|
||||
TriggerDevRunEventsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_run_events',
|
||||
name: 'Trigger.dev Get Run Events',
|
||||
description:
|
||||
'Retrieve the log and span events of a Trigger.dev run, including messages, levels, durations, and error events.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to retrieve events for (starts with run_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/events`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
events: (data.events ?? []).map(
|
||||
(event: {
|
||||
spanId?: string
|
||||
parentId?: string | null
|
||||
runId?: string | null
|
||||
message?: string
|
||||
startTime?: string
|
||||
duration?: number
|
||||
isError?: boolean
|
||||
isPartial?: boolean
|
||||
isCancelled?: boolean
|
||||
level?: string
|
||||
kind?: string
|
||||
attemptNumber?: number | null
|
||||
taskSlug?: string
|
||||
events?: { name?: string; time?: string; properties?: Record<string, unknown> }[]
|
||||
}) => ({
|
||||
spanId: event.spanId ?? null,
|
||||
parentId: event.parentId ?? null,
|
||||
runId: event.runId ?? null,
|
||||
message: event.message ?? null,
|
||||
startTime: event.startTime ?? null,
|
||||
duration: event.duration ?? null,
|
||||
isError: event.isError ?? false,
|
||||
isPartial: event.isPartial ?? false,
|
||||
isCancelled: event.isCancelled ?? false,
|
||||
level: event.level ?? null,
|
||||
kind: event.kind ?? null,
|
||||
attemptNumber: event.attemptNumber ?? null,
|
||||
taskSlug: event.taskSlug ?? null,
|
||||
events: (event.events ?? []).map((spanEvent) => ({
|
||||
name: spanEvent.name ?? null,
|
||||
time: spanEvent.time ?? null,
|
||||
properties: spanEvent.properties ?? null,
|
||||
})),
|
||||
})
|
||||
),
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
events: {
|
||||
type: 'array',
|
||||
description: 'Log and span events recorded during the run',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Run event',
|
||||
properties: {
|
||||
spanId: { type: 'string', description: 'Span ID of the event', nullable: true },
|
||||
parentId: { type: 'string', description: 'Parent span ID', nullable: true },
|
||||
runId: {
|
||||
type: 'string',
|
||||
description: 'Run ID associated with the event',
|
||||
nullable: true,
|
||||
},
|
||||
message: { type: 'string', description: 'Event message', nullable: true },
|
||||
startTime: {
|
||||
type: 'string',
|
||||
description: 'Start time as a bigint string (nanoseconds since epoch)',
|
||||
nullable: true,
|
||||
},
|
||||
duration: {
|
||||
type: 'number',
|
||||
description: 'Duration of the event in nanoseconds',
|
||||
nullable: true,
|
||||
},
|
||||
isError: { type: 'boolean', description: 'Whether the event represents an error' },
|
||||
isPartial: { type: 'boolean', description: 'Whether the event is still in progress' },
|
||||
isCancelled: { type: 'boolean', description: 'Whether the event was cancelled' },
|
||||
level: {
|
||||
type: 'string',
|
||||
description: 'Log level (TRACE, DEBUG, LOG, INFO, WARN, or ERROR)',
|
||||
nullable: true,
|
||||
},
|
||||
kind: { type: 'string', description: 'Kind of span event', nullable: true },
|
||||
attemptNumber: {
|
||||
type: 'number',
|
||||
description: 'Attempt number the event belongs to',
|
||||
nullable: true,
|
||||
},
|
||||
taskSlug: { type: 'string', description: 'Task identifier', nullable: true },
|
||||
events: {
|
||||
type: 'array',
|
||||
description: 'Span events (e.g., exceptions) that occurred during this event',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Span event',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Event name', nullable: true },
|
||||
time: { type: 'string', description: 'When the event occurred', nullable: true },
|
||||
properties: {
|
||||
type: 'json',
|
||||
description: 'Event-specific properties',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import type { TriggerDevRunIdParams, TriggerDevRunResultResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevRunResult,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_RUN_RESULT_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetRunResultTool: ToolConfig<
|
||||
TriggerDevRunIdParams,
|
||||
TriggerDevRunResultResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_run_result',
|
||||
name: 'Trigger.dev Get Run Result',
|
||||
description:
|
||||
'Retrieve the result of a Trigger.dev run: whether it succeeded, its output, and error details. Lighter than Get Run when only the outcome is needed.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to retrieve the result for (starts with run_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/result`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevRunResult(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_RUN_RESULT_PROPERTIES,
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
import type { TriggerDevRunIdParams, TriggerDevRunTraceResponse } from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetRunTraceTool: ToolConfig<
|
||||
TriggerDevRunIdParams,
|
||||
TriggerDevRunTraceResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_run_trace',
|
||||
name: 'Trigger.dev Get Run Trace',
|
||||
description:
|
||||
'Retrieve the OpenTelemetry trace of a Trigger.dev run as a tree of spans with timing, errors, and nested children.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to retrieve the trace for (starts with run_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/trace`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
traceId: data.trace?.traceId ?? null,
|
||||
rootSpan: data.trace?.rootSpan ?? null,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
traceId: { type: 'string', description: 'OpenTelemetry trace ID of the run' },
|
||||
rootSpan: {
|
||||
type: 'json',
|
||||
description:
|
||||
'Root span of the trace; each span has id, parentId, runId, data (message, taskSlug, startTime, duration, isError, level, events), and recursively nested children spans',
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
import type {
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevScheduleResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevSchedule,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetScheduleTool: ToolConfig<
|
||||
TriggerDevScheduleIdParams,
|
||||
TriggerDevScheduleResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_schedule',
|
||||
name: 'Trigger.dev Get Schedule',
|
||||
description: 'Retrieve a Trigger.dev schedule by its ID.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
scheduleId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the schedule to retrieve (starts with sched_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/schedules/${encodeURIComponent(params.scheduleId.trim())}`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevSchedule(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import type {
|
||||
TriggerDevWaitpointIdParams,
|
||||
TriggerDevWaitpointTokenResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevWaitpointToken,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_WAITPOINT_TOKEN_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevGetWaitpointTokenTool: ToolConfig<
|
||||
TriggerDevWaitpointIdParams,
|
||||
TriggerDevWaitpointTokenResponse
|
||||
> = {
|
||||
id: 'trigger_dev_get_waitpoint_token',
|
||||
name: 'Trigger.dev Get Waitpoint Token',
|
||||
description:
|
||||
'Retrieve a Trigger.dev waitpoint token by its ID, including its status, timeout, and completion data.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
waitpointId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the waitpoint token to retrieve (starts with waitpoint_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/waitpoints/tokens/${encodeURIComponent(params.waitpointId.trim())}`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevWaitpointToken(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_WAITPOINT_TOKEN_PROPERTIES,
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
import type {
|
||||
TriggerDevImportEnvVarsParams,
|
||||
TriggerDevImportEnvVarsResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevEnvVarsUrl,
|
||||
buildTriggerDevHeaders,
|
||||
parseJsonInput,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevImportEnvVarsTool: ToolConfig<
|
||||
TriggerDevImportEnvVarsParams,
|
||||
TriggerDevImportEnvVarsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_import_env_vars',
|
||||
name: 'Trigger.dev Import Env Vars',
|
||||
description:
|
||||
'Upload multiple environment variables to a Trigger.dev project environment in one request.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
projectRef: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External ref of the project, from the project settings (starts with proj_)',
|
||||
},
|
||||
environment: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Environment to upload the variables to: dev, staging, or prod',
|
||||
},
|
||||
variables: {
|
||||
type: 'json',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description:
|
||||
'JSON array of environment variables to upload. Example: [{"name": "SLACK_API_KEY", "value": "slack_123"}]',
|
||||
},
|
||||
override: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Whether to override existing variables: "true" or "false" (default false)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => `${buildTriggerDevEnvVarsUrl(params.projectRef, params.environment)}/import`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const variables = parseJsonInput(params.variables, 'variables')
|
||||
if (!Array.isArray(variables)) {
|
||||
throw new Error('The variables parameter must be a JSON array of {"name", "value"} objects')
|
||||
}
|
||||
const body: Record<string, unknown> = { variables }
|
||||
if (params.override === 'true' || params.override === 'false') {
|
||||
body.override = params.override === 'true'
|
||||
}
|
||||
return body
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response, params) => {
|
||||
const data = await response.json()
|
||||
const variables = parseJsonInput(params?.variables, 'variables')
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
success: data.success ?? true,
|
||||
count: Array.isArray(variables) ? variables.length : 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
success: { type: 'boolean', description: 'Whether the environment variables were uploaded' },
|
||||
count: { type: 'number', description: 'Number of environment variables submitted' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
export { triggerDevActivateScheduleTool } from '@/tools/trigger_dev/activate_schedule'
|
||||
export { triggerDevAddRunTagsTool } from '@/tools/trigger_dev/add_run_tags'
|
||||
export { triggerDevBatchTriggerTaskTool } from '@/tools/trigger_dev/batch_trigger_task'
|
||||
export { triggerDevCancelRunTool } from '@/tools/trigger_dev/cancel_run'
|
||||
export { triggerDevCompleteWaitpointTokenTool } from '@/tools/trigger_dev/complete_waitpoint_token'
|
||||
export { triggerDevCreateEnvVarTool } from '@/tools/trigger_dev/create_env_var'
|
||||
export { triggerDevCreateScheduleTool } from '@/tools/trigger_dev/create_schedule'
|
||||
export { triggerDevCreateWaitpointTokenTool } from '@/tools/trigger_dev/create_waitpoint_token'
|
||||
export { triggerDevDeactivateScheduleTool } from '@/tools/trigger_dev/deactivate_schedule'
|
||||
export { triggerDevDeleteEnvVarTool } from '@/tools/trigger_dev/delete_env_var'
|
||||
export { triggerDevDeleteScheduleTool } from '@/tools/trigger_dev/delete_schedule'
|
||||
export { triggerDevExecuteQueryTool } from '@/tools/trigger_dev/execute_query'
|
||||
export { triggerDevGetBatchTool } from '@/tools/trigger_dev/get_batch'
|
||||
export { triggerDevGetBatchResultsTool } from '@/tools/trigger_dev/get_batch_results'
|
||||
export { triggerDevGetDeploymentTool } from '@/tools/trigger_dev/get_deployment'
|
||||
export { triggerDevGetEnvVarTool } from '@/tools/trigger_dev/get_env_var'
|
||||
export { triggerDevGetLatestDeploymentTool } from '@/tools/trigger_dev/get_latest_deployment'
|
||||
export { triggerDevGetQuerySchemaTool } from '@/tools/trigger_dev/get_query_schema'
|
||||
export { triggerDevGetQueueTool } from '@/tools/trigger_dev/get_queue'
|
||||
export { triggerDevGetRunTool } from '@/tools/trigger_dev/get_run'
|
||||
export { triggerDevGetRunEventsTool } from '@/tools/trigger_dev/get_run_events'
|
||||
export { triggerDevGetRunResultTool } from '@/tools/trigger_dev/get_run_result'
|
||||
export { triggerDevGetRunTraceTool } from '@/tools/trigger_dev/get_run_trace'
|
||||
export { triggerDevGetScheduleTool } from '@/tools/trigger_dev/get_schedule'
|
||||
export { triggerDevGetWaitpointTokenTool } from '@/tools/trigger_dev/get_waitpoint_token'
|
||||
export { triggerDevImportEnvVarsTool } from '@/tools/trigger_dev/import_env_vars'
|
||||
export { triggerDevListDeploymentsTool } from '@/tools/trigger_dev/list_deployments'
|
||||
export { triggerDevListEnvVarsTool } from '@/tools/trigger_dev/list_env_vars'
|
||||
export { triggerDevListQueuesTool } from '@/tools/trigger_dev/list_queues'
|
||||
export { triggerDevListRunsTool } from '@/tools/trigger_dev/list_runs'
|
||||
export { triggerDevListSchedulesTool } from '@/tools/trigger_dev/list_schedules'
|
||||
export { triggerDevListTimezonesTool } from '@/tools/trigger_dev/list_timezones'
|
||||
export { triggerDevListWaitpointTokensTool } from '@/tools/trigger_dev/list_waitpoint_tokens'
|
||||
export { triggerDevOverrideQueueConcurrencyTool } from '@/tools/trigger_dev/override_queue_concurrency'
|
||||
export { triggerDevPauseQueueTool } from '@/tools/trigger_dev/pause_queue'
|
||||
export { triggerDevPromoteDeploymentTool } from '@/tools/trigger_dev/promote_deployment'
|
||||
export { triggerDevReplayRunTool } from '@/tools/trigger_dev/replay_run'
|
||||
export { triggerDevRescheduleRunTool } from '@/tools/trigger_dev/reschedule_run'
|
||||
export { triggerDevResetQueueConcurrencyTool } from '@/tools/trigger_dev/reset_queue_concurrency'
|
||||
export { triggerDevResumeQueueTool } from '@/tools/trigger_dev/resume_queue'
|
||||
export { triggerDevTriggerTaskTool } from '@/tools/trigger_dev/trigger_task'
|
||||
export { triggerDevUpdateEnvVarTool } from '@/tools/trigger_dev/update_env_var'
|
||||
export { triggerDevUpdateRunMetadataTool } from '@/tools/trigger_dev/update_run_metadata'
|
||||
export { triggerDevUpdateScheduleTool } from '@/tools/trigger_dev/update_schedule'
|
||||
@@ -0,0 +1,122 @@
|
||||
import type {
|
||||
TriggerDevListDeploymentsParams,
|
||||
TriggerDevListDeploymentsResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevDeployment,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_DEPLOYMENT_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListDeploymentsTool: ToolConfig<
|
||||
TriggerDevListDeploymentsParams,
|
||||
TriggerDevListDeploymentsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_deployments',
|
||||
name: 'Trigger.dev List Deployments',
|
||||
description:
|
||||
'List Trigger.dev deployments in the environment of the API key, with optional status and creation-time filters.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
status: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Deployment status to filter by: PENDING, BUILDING, DEPLOYING, DEPLOYED, FAILED, CANCELED, or TIMED_OUT',
|
||||
},
|
||||
period: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return deployments created in the given period (e.g., "1h", "7d")',
|
||||
},
|
||||
from: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return deployments created on or after this ISO 8601 timestamp',
|
||||
},
|
||||
to: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return deployments created on or before this ISO 8601 timestamp',
|
||||
},
|
||||
pageSize: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Number of deployments per page (5 to 100, default 20)',
|
||||
},
|
||||
pageAfter: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Cursor to start the page after, from the previous response pagination',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => {
|
||||
const query = new URLSearchParams()
|
||||
if (params.pageSize) query.set('page[size]', String(params.pageSize))
|
||||
if (params.pageAfter) query.set('page[after]', params.pageAfter)
|
||||
if (params.status) query.set('status', params.status.toUpperCase())
|
||||
if (params.period) query.set('period', params.period)
|
||||
if (params.from) query.set('from', params.from)
|
||||
if (params.to) query.set('to', params.to)
|
||||
const queryString = query.toString()
|
||||
return queryString
|
||||
? `${TRIGGER_DEV_API_BASE}/api/v1/deployments?${queryString}`
|
||||
: `${TRIGGER_DEV_API_BASE}/api/v1/deployments`
|
||||
},
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
deployments: (data.data ?? []).map(mapTriggerDevDeployment),
|
||||
pagination: {
|
||||
next: data.pagination?.next ?? null,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
deployments: {
|
||||
type: 'array',
|
||||
description: 'Deployments matching the filters',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Deployment',
|
||||
properties: TRIGGER_DEV_DEPLOYMENT_PROPERTIES,
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
type: 'object',
|
||||
description: 'Cursor pagination details',
|
||||
properties: {
|
||||
next: {
|
||||
type: 'string',
|
||||
description: 'Cursor to pass as the page-after parameter for the next page',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import type {
|
||||
TriggerDevEnvVarsScopeParams,
|
||||
TriggerDevListEnvVarsResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevEnvVarsUrl, buildTriggerDevHeaders } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListEnvVarsTool: ToolConfig<
|
||||
TriggerDevEnvVarsScopeParams,
|
||||
TriggerDevListEnvVarsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_env_vars',
|
||||
name: 'Trigger.dev List Env Vars',
|
||||
description:
|
||||
'List the environment variables of a Trigger.dev project environment. Values are returned in plaintext and will appear in workflow outputs and run history — scope this operation carefully.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
projectRef: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External ref of the project, from the project settings (starts with proj_)',
|
||||
},
|
||||
environment: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Environment to list variables for: dev, staging, or prod',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => buildTriggerDevEnvVarsUrl(params.projectRef, params.environment),
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
const variables = Array.isArray(data) ? data : []
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
variables: variables.map((variable) => ({
|
||||
name: variable.name,
|
||||
value: variable.value,
|
||||
})),
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
variables: {
|
||||
type: 'array',
|
||||
description: 'Environment variables in the project environment',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Environment variable',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Name of the environment variable' },
|
||||
value: {
|
||||
type: 'string',
|
||||
description:
|
||||
'Plaintext value of the environment variable; appears in workflow outputs and run history',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
import type {
|
||||
TriggerDevListQueuesParams,
|
||||
TriggerDevListQueuesResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevQueue,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListQueuesTool: ToolConfig<
|
||||
TriggerDevListQueuesParams,
|
||||
TriggerDevListQueuesResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_queues',
|
||||
name: 'Trigger.dev List Queues',
|
||||
description:
|
||||
'List the queues in the environment of the API key, including running and queued counts, with page-based pagination.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
page: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Page number to return (default 1)',
|
||||
},
|
||||
perPage: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Number of queues per page',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => {
|
||||
const query = new URLSearchParams()
|
||||
if (params.page) query.set('page', String(params.page))
|
||||
if (params.perPage) query.set('perPage', String(params.perPage))
|
||||
const queryString = query.toString()
|
||||
return queryString
|
||||
? `${TRIGGER_DEV_API_BASE}/api/v1/queues?${queryString}`
|
||||
: `${TRIGGER_DEV_API_BASE}/api/v1/queues`
|
||||
},
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
queues: (data.data ?? []).map(mapTriggerDevQueue),
|
||||
pagination: {
|
||||
currentPage: data.pagination?.currentPage ?? null,
|
||||
totalPages: data.pagination?.totalPages ?? null,
|
||||
count: data.pagination?.count ?? null,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
queues: {
|
||||
type: 'array',
|
||||
description: 'Queues in the environment',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Queue',
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Unique ID of the queue (starts with queue_)' },
|
||||
name: { type: 'string', description: 'Name of the queue' },
|
||||
type: {
|
||||
type: 'string',
|
||||
description: 'Queue type (task for task-default queues, custom for named queues)',
|
||||
nullable: true,
|
||||
},
|
||||
running: {
|
||||
type: 'number',
|
||||
description: 'Number of runs currently executing',
|
||||
nullable: true,
|
||||
},
|
||||
queued: {
|
||||
type: 'number',
|
||||
description: 'Number of runs waiting in the queue',
|
||||
nullable: true,
|
||||
},
|
||||
paused: { type: 'boolean', description: 'Whether the queue is paused' },
|
||||
concurrencyLimit: {
|
||||
type: 'number',
|
||||
description: 'Maximum number of runs that can execute concurrently',
|
||||
nullable: true,
|
||||
},
|
||||
concurrency: {
|
||||
type: 'object',
|
||||
description: 'Concurrency details for the queue',
|
||||
nullable: true,
|
||||
properties: {
|
||||
current: { type: 'number', description: 'Current concurrency limit', nullable: true },
|
||||
base: { type: 'number', description: 'Base concurrency limit', nullable: true },
|
||||
override: {
|
||||
type: 'number',
|
||||
description: 'Overridden concurrency limit',
|
||||
nullable: true,
|
||||
},
|
||||
overriddenAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the concurrency limit was overridden',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
type: 'object',
|
||||
description: 'Page-based pagination details',
|
||||
properties: {
|
||||
currentPage: { type: 'number', description: 'Current page number', nullable: true },
|
||||
totalPages: { type: 'number', description: 'Total number of pages', nullable: true },
|
||||
count: { type: 'number', description: 'Total number of queues', nullable: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
import type {
|
||||
TriggerDevListRunsParams,
|
||||
TriggerDevListRunsResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevRunSummary,
|
||||
splitCommaSeparated,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_RUN_SUMMARY_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListRunsTool: ToolConfig<
|
||||
TriggerDevListRunsParams,
|
||||
TriggerDevListRunsResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_runs',
|
||||
name: 'Trigger.dev List Runs',
|
||||
description:
|
||||
'List Trigger.dev runs in the environment of the API key, with optional filters for status, task, version, tags, schedule, and creation time.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
status: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Comma-separated run statuses to filter by: PENDING_VERSION, DELAYED, QUEUED, EXECUTING, REATTEMPTING, FROZEN, COMPLETED, CANCELED, FAILED, CRASHED, INTERRUPTED, SYSTEM_FAILURE',
|
||||
},
|
||||
taskIdentifier: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Comma-separated task identifiers to filter by',
|
||||
},
|
||||
version: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Comma-separated worker versions to filter by (e.g., "20240101.1")',
|
||||
},
|
||||
tag: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Comma-separated tags to filter by',
|
||||
},
|
||||
schedule: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Schedule ID to filter by (starts with sched_)',
|
||||
},
|
||||
isTest: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Filter by test runs: "true" for only test runs, "false" to exclude them',
|
||||
},
|
||||
period: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return runs created in the given period (e.g., "1h", "7d")',
|
||||
},
|
||||
from: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return runs created on or after this ISO 8601 timestamp',
|
||||
},
|
||||
to: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return runs created on or before this ISO 8601 timestamp',
|
||||
},
|
||||
pageSize: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Number of runs per page (max 100, default 25)',
|
||||
},
|
||||
pageAfter: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Run ID to start the page after, for forward pagination',
|
||||
},
|
||||
pageBefore: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Run ID to start the page before, for backward pagination',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => {
|
||||
const query = new URLSearchParams()
|
||||
if (params.pageSize) query.set('page[size]', String(params.pageSize))
|
||||
if (params.pageAfter) query.set('page[after]', params.pageAfter)
|
||||
if (params.pageBefore) query.set('page[before]', params.pageBefore)
|
||||
if (params.status) {
|
||||
const statuses = splitCommaSeparated(params.status).map((status) => status.toUpperCase())
|
||||
if (statuses.length > 0) query.set('filter[status]', statuses.join(','))
|
||||
}
|
||||
if (params.taskIdentifier) {
|
||||
const tasks = splitCommaSeparated(params.taskIdentifier)
|
||||
if (tasks.length > 0) query.set('filter[taskIdentifier]', tasks.join(','))
|
||||
}
|
||||
if (params.version) {
|
||||
const versions = splitCommaSeparated(params.version)
|
||||
if (versions.length > 0) query.set('filter[version]', versions.join(','))
|
||||
}
|
||||
if (params.tag) {
|
||||
const tags = splitCommaSeparated(params.tag)
|
||||
if (tags.length > 0) query.set('filter[tag]', tags.join(','))
|
||||
}
|
||||
if (params.schedule) query.set('filter[schedule]', params.schedule)
|
||||
if (params.isTest === 'true' || params.isTest === 'false') {
|
||||
query.set('filter[isTest]', params.isTest)
|
||||
}
|
||||
if (params.period) query.set('filter[createdAt][period]', params.period)
|
||||
if (params.from) query.set('filter[createdAt][from]', params.from)
|
||||
if (params.to) query.set('filter[createdAt][to]', params.to)
|
||||
|
||||
const queryString = query.toString()
|
||||
return queryString
|
||||
? `${TRIGGER_DEV_API_BASE}/api/v1/runs?${queryString}`
|
||||
: `${TRIGGER_DEV_API_BASE}/api/v1/runs`
|
||||
},
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
runs: (data.data ?? []).map(mapTriggerDevRunSummary),
|
||||
pagination: {
|
||||
next: data.pagination?.next ?? null,
|
||||
previous: data.pagination?.previous ?? null,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
runs: {
|
||||
type: 'array',
|
||||
description: 'Runs matching the filters',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Run summary',
|
||||
properties: TRIGGER_DEV_RUN_SUMMARY_PROPERTIES,
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
type: 'object',
|
||||
description: 'Cursor pagination details',
|
||||
properties: {
|
||||
next: {
|
||||
type: 'string',
|
||||
description: 'Run ID to start the next page after',
|
||||
nullable: true,
|
||||
},
|
||||
previous: {
|
||||
type: 'string',
|
||||
description: 'Run ID to start the previous page before',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
import type {
|
||||
TriggerDevListSchedulesParams,
|
||||
TriggerDevListSchedulesResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevSchedule,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListSchedulesTool: ToolConfig<
|
||||
TriggerDevListSchedulesParams,
|
||||
TriggerDevListSchedulesResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_schedules',
|
||||
name: 'Trigger.dev List Schedules',
|
||||
description: 'List Trigger.dev schedules in the project, with page-based pagination.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
page: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Page number to return (default 1)',
|
||||
},
|
||||
perPage: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Number of schedules per page',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => {
|
||||
const query = new URLSearchParams()
|
||||
if (params.page) query.set('page', String(params.page))
|
||||
if (params.perPage) query.set('perPage', String(params.perPage))
|
||||
const queryString = query.toString()
|
||||
return queryString
|
||||
? `${TRIGGER_DEV_API_BASE}/api/v1/schedules?${queryString}`
|
||||
: `${TRIGGER_DEV_API_BASE}/api/v1/schedules`
|
||||
},
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
schedules: (data.data ?? []).map(mapTriggerDevSchedule),
|
||||
pagination: {
|
||||
currentPage: data.pagination?.currentPage ?? null,
|
||||
totalPages: data.pagination?.totalPages ?? null,
|
||||
count: data.pagination?.count ?? null,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
schedules: {
|
||||
type: 'array',
|
||||
description: 'Schedules in the project',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Schedule',
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Unique ID of the schedule (starts with sched_)' },
|
||||
task: { type: 'string', description: 'Identifier of the task the schedule triggers' },
|
||||
type: {
|
||||
type: 'string',
|
||||
description: 'Schedule type (DECLARATIVE or IMPERATIVE)',
|
||||
nullable: true,
|
||||
},
|
||||
active: { type: 'boolean', description: 'Whether the schedule is active' },
|
||||
deduplicationKey: {
|
||||
type: 'string',
|
||||
description: 'Deduplication key of the schedule',
|
||||
nullable: true,
|
||||
},
|
||||
externalId: {
|
||||
type: 'string',
|
||||
description: 'External ID associated with the schedule',
|
||||
nullable: true,
|
||||
},
|
||||
cron: { type: 'string', description: 'Cron expression of the schedule', nullable: true },
|
||||
cronDescription: {
|
||||
type: 'string',
|
||||
description: 'Human-readable description of the cron expression',
|
||||
nullable: true,
|
||||
},
|
||||
timezone: {
|
||||
type: 'string',
|
||||
description: 'IANA timezone of the schedule',
|
||||
nullable: true,
|
||||
},
|
||||
nextRun: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp of the next scheduled run',
|
||||
nullable: true,
|
||||
},
|
||||
environments: {
|
||||
type: 'array',
|
||||
description: 'Environments the schedule runs in',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Environment the schedule is associated with',
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Environment ID', nullable: true },
|
||||
type: { type: 'string', description: 'Environment type', nullable: true },
|
||||
userName: {
|
||||
type: 'string',
|
||||
description: 'Username for dev environments',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
type: 'object',
|
||||
description: 'Page-based pagination details',
|
||||
properties: {
|
||||
currentPage: { type: 'number', description: 'Current page number', nullable: true },
|
||||
totalPages: { type: 'number', description: 'Total number of pages', nullable: true },
|
||||
count: { type: 'number', description: 'Total number of schedules', nullable: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
import type {
|
||||
TriggerDevListTimezonesParams,
|
||||
TriggerDevListTimezonesResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListTimezonesTool: ToolConfig<
|
||||
TriggerDevListTimezonesParams,
|
||||
TriggerDevListTimezonesResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_timezones',
|
||||
name: 'Trigger.dev List Timezones',
|
||||
description:
|
||||
'List the IANA timezones supported by Trigger.dev schedules, for use as the timezone of a cron schedule.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
excludeUtc: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Set to "true" to exclude UTC from the returned timezones',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
params.excludeUtc === 'true'
|
||||
? `${TRIGGER_DEV_API_BASE}/api/v1/timezones?excludeUtc=true`
|
||||
: `${TRIGGER_DEV_API_BASE}/api/v1/timezones`,
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
timezones: data.timezones ?? [],
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
timezones: {
|
||||
type: 'array',
|
||||
description: 'IANA timezones supported by schedules',
|
||||
items: { type: 'string', description: 'IANA timezone name' },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
import type {
|
||||
TriggerDevListWaitpointTokensParams,
|
||||
TriggerDevListWaitpointTokensResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevWaitpointToken,
|
||||
splitCommaSeparated,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_WAITPOINT_TOKEN_PROPERTIES,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevListWaitpointTokensTool: ToolConfig<
|
||||
TriggerDevListWaitpointTokensParams,
|
||||
TriggerDevListWaitpointTokensResponse
|
||||
> = {
|
||||
id: 'trigger_dev_list_waitpoint_tokens',
|
||||
name: 'Trigger.dev List Waitpoint Tokens',
|
||||
description:
|
||||
'List Trigger.dev waitpoint tokens in the environment of the API key, with optional status, tag, and creation-time filters.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
status: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Waitpoint status to filter by: WAITING, COMPLETED, or TIMED_OUT',
|
||||
},
|
||||
idempotencyKey: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Idempotency key to filter by',
|
||||
},
|
||||
tags: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Comma-separated tags to filter by',
|
||||
},
|
||||
period: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return tokens created in the given period (e.g., "1h", "7d")',
|
||||
},
|
||||
from: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return tokens created on or after this ISO 8601 timestamp',
|
||||
},
|
||||
to: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Only return tokens created on or before this ISO 8601 timestamp',
|
||||
},
|
||||
pageSize: {
|
||||
type: 'number',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Number of tokens per page (max 100)',
|
||||
},
|
||||
pageAfter: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Waitpoint ID to start the page after, for forward pagination',
|
||||
},
|
||||
pageBefore: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Waitpoint ID to start the page before, for backward pagination',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => {
|
||||
const query = new URLSearchParams()
|
||||
if (params.pageSize) query.set('page[size]', String(params.pageSize))
|
||||
if (params.pageAfter) query.set('page[after]', params.pageAfter)
|
||||
if (params.pageBefore) query.set('page[before]', params.pageBefore)
|
||||
if (params.status) query.set('filter[status]', params.status.toUpperCase())
|
||||
if (params.idempotencyKey) query.set('filter[idempotencyKey]', params.idempotencyKey)
|
||||
if (params.tags) {
|
||||
const tags = splitCommaSeparated(params.tags)
|
||||
if (tags.length > 0) query.set('filter[tags]', tags.join(','))
|
||||
}
|
||||
if (params.period) query.set('filter[createdAt][period]', params.period)
|
||||
if (params.from) query.set('filter[createdAt][from]', params.from)
|
||||
if (params.to) query.set('filter[createdAt][to]', params.to)
|
||||
const queryString = query.toString()
|
||||
return queryString
|
||||
? `${TRIGGER_DEV_API_BASE}/api/v1/waitpoints/tokens?${queryString}`
|
||||
: `${TRIGGER_DEV_API_BASE}/api/v1/waitpoints/tokens`
|
||||
},
|
||||
method: 'GET',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
tokens: (data.data ?? []).map(mapTriggerDevWaitpointToken),
|
||||
pagination: {
|
||||
next: data.pagination?.next ?? null,
|
||||
previous: data.pagination?.previous ?? null,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
tokens: {
|
||||
type: 'array',
|
||||
description: 'Waitpoint tokens matching the filters',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Waitpoint token',
|
||||
properties: TRIGGER_DEV_WAITPOINT_TOKEN_PROPERTIES,
|
||||
},
|
||||
},
|
||||
pagination: {
|
||||
type: 'object',
|
||||
description: 'Cursor pagination details',
|
||||
properties: {
|
||||
next: {
|
||||
type: 'string',
|
||||
description: 'Waitpoint ID to start the next page after',
|
||||
nullable: true,
|
||||
},
|
||||
previous: {
|
||||
type: 'string',
|
||||
description: 'Waitpoint ID to start the previous page before',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
import type {
|
||||
TriggerDevOverrideQueueConcurrencyParams,
|
||||
TriggerDevQueueResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevQueue,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevOverrideQueueConcurrencyTool: ToolConfig<
|
||||
TriggerDevOverrideQueueConcurrencyParams,
|
||||
TriggerDevQueueResponse
|
||||
> = {
|
||||
id: 'trigger_dev_override_queue_concurrency',
|
||||
name: 'Trigger.dev Override Queue Concurrency',
|
||||
description: 'Override the concurrency limit of a Trigger.dev queue with a new value.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
queueName: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Queue ID (starts with queue_), task identifier, or custom queue name, depending on the queue type',
|
||||
},
|
||||
queueType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'How to interpret the queue name: "id" (default) for a queue ID, "task" for a task identifier, or "custom" for a custom queue name',
|
||||
},
|
||||
concurrencyLimit: {
|
||||
type: 'number',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'New concurrency limit for the queue (0 to 100000)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/queues/${encodeURIComponent(params.queueName.trim())}/concurrency/override`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({
|
||||
concurrencyLimit: params.concurrencyLimit,
|
||||
...(params.queueType ? { type: params.queueType } : {}),
|
||||
}),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevQueue(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import type { TriggerDevQueueParams, TriggerDevQueueResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevQueue,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevPauseQueueTool: ToolConfig<TriggerDevQueueParams, TriggerDevQueueResponse> =
|
||||
{
|
||||
id: 'trigger_dev_pause_queue',
|
||||
name: 'Trigger.dev Pause Queue',
|
||||
description:
|
||||
'Pause a Trigger.dev queue so no new runs start. Runs that are currently executing continue to completion.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
queueName: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Queue ID (starts with queue_), task identifier, or custom queue name, depending on the queue type',
|
||||
},
|
||||
queueType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'How to interpret the queue name: "id" (default) for a queue ID, "task" for a task identifier, or "custom" for a custom queue name',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/queues/${encodeURIComponent(params.queueName.trim())}/pause`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({
|
||||
action: 'pause',
|
||||
...(params.queueType ? { type: params.queueType } : {}),
|
||||
}),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevQueue(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import type {
|
||||
TriggerDevPromoteDeploymentParams,
|
||||
TriggerDevPromoteDeploymentResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevPromoteDeploymentTool: ToolConfig<
|
||||
TriggerDevPromoteDeploymentParams,
|
||||
TriggerDevPromoteDeploymentResponse
|
||||
> = {
|
||||
id: 'trigger_dev_promote_deployment',
|
||||
name: 'Trigger.dev Promote Deployment',
|
||||
description:
|
||||
'Promote a Trigger.dev deployment version so new runs execute on it (e.g., to roll back to a previous version).',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
version: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Deployment version to promote (e.g., "20250228.1")',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/deployments/${encodeURIComponent(params.version.trim())}/promote`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
version: data.version ?? null,
|
||||
shortCode: data.shortCode ?? null,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: { type: 'string', description: 'ID of the promoted deployment' },
|
||||
version: {
|
||||
type: 'string',
|
||||
description: 'Version of the promoted deployment',
|
||||
optional: true,
|
||||
},
|
||||
shortCode: {
|
||||
type: 'string',
|
||||
description: 'Short code of the promoted deployment',
|
||||
optional: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
import type { TriggerDevRunActionResponse, TriggerDevRunIdParams } from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevHeaders, TRIGGER_DEV_API_BASE } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevReplayRunTool: ToolConfig<
|
||||
TriggerDevRunIdParams,
|
||||
TriggerDevRunActionResponse
|
||||
> = {
|
||||
id: 'trigger_dev_replay_run',
|
||||
name: 'Trigger.dev Replay Run',
|
||||
description:
|
||||
'Replay a Trigger.dev run, creating a new run with the same payload and options as the original.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to replay (starts with run_)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/replay`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: { type: 'string', description: 'ID of the new run created by the replay' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
import type {
|
||||
TriggerDevRescheduleRunParams,
|
||||
TriggerDevRunResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevRunDetail,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_RUN_DETAIL_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevRescheduleRunTool: ToolConfig<
|
||||
TriggerDevRescheduleRunParams,
|
||||
TriggerDevRunResponse
|
||||
> = {
|
||||
id: 'trigger_dev_reschedule_run',
|
||||
name: 'Trigger.dev Reschedule Run',
|
||||
description:
|
||||
'Reschedule a delayed Trigger.dev run with a new delay. Only valid while the run is in the DELAYED state.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the delayed run to reschedule (starts with run_)',
|
||||
},
|
||||
delay: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'New delay for the run, as a duration ("30m", "1h", "2d") or an ISO 8601 date to delay until',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/reschedule`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({ delay: params.delay }),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevRunDetail(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_RUN_DETAIL_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import type { TriggerDevQueueParams, TriggerDevQueueResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevQueue,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevResetQueueConcurrencyTool: ToolConfig<
|
||||
TriggerDevQueueParams,
|
||||
TriggerDevQueueResponse
|
||||
> = {
|
||||
id: 'trigger_dev_reset_queue_concurrency',
|
||||
name: 'Trigger.dev Reset Queue Concurrency',
|
||||
description:
|
||||
'Reset the concurrency limit of a Trigger.dev queue back to its base value, removing any override.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
queueName: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Queue ID (starts with queue_), task identifier, or custom queue name, depending on the queue type',
|
||||
},
|
||||
queueType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'How to interpret the queue name: "id" (default) for a queue ID, "task" for a task identifier, or "custom" for a custom queue name',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/queues/${encodeURIComponent(params.queueName.trim())}/concurrency/reset`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => (params.queueType ? { type: params.queueType } : {}),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevQueue(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import type { TriggerDevQueueParams, TriggerDevQueueResponse } from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevQueue,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevResumeQueueTool: ToolConfig<TriggerDevQueueParams, TriggerDevQueueResponse> =
|
||||
{
|
||||
id: 'trigger_dev_resume_queue',
|
||||
name: 'Trigger.dev Resume Queue',
|
||||
description: 'Resume a paused Trigger.dev queue so new runs can start again.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
queueName: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Queue ID (starts with queue_), task identifier, or custom queue name, depending on the queue type',
|
||||
},
|
||||
queueType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'How to interpret the queue name: "id" (default) for a queue ID, "task" for a task identifier, or "custom" for a custom queue name',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/queues/${encodeURIComponent(params.queueName.trim())}/pause`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({
|
||||
action: 'resume',
|
||||
...(params.queueType ? { type: params.queueType } : {}),
|
||||
}),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevQueue(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_QUEUE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
import type {
|
||||
TriggerDevTriggerTaskParams,
|
||||
TriggerDevTriggerTaskResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
parseJsonInput,
|
||||
splitCommaSeparated,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevTriggerTaskTool: ToolConfig<
|
||||
TriggerDevTriggerTaskParams,
|
||||
TriggerDevTriggerTaskResponse
|
||||
> = {
|
||||
id: 'trigger_dev_trigger_task',
|
||||
name: 'Trigger.dev Trigger Task',
|
||||
description:
|
||||
'Trigger a Trigger.dev task by its identifier with an optional JSON payload. Returns the ID of the created run.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
taskIdentifier: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Identifier of the task to trigger (e.g., "send-welcome-email")',
|
||||
},
|
||||
payload: {
|
||||
type: 'json',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'JSON payload passed to the task run. Example: {"userId": "user_123"}',
|
||||
},
|
||||
idempotencyKey: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Idempotency key that ensures the task is only triggered once per key',
|
||||
},
|
||||
queue: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Name of the queue to run the task on',
|
||||
},
|
||||
concurrencyKey: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Key that scopes the queue concurrency limit (e.g., a user ID)',
|
||||
},
|
||||
delay: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Delay before the run executes, as a duration ("30m", "1h", "2d") or an ISO 8601 date',
|
||||
},
|
||||
ttl: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Time-to-live before an unstarted run expires, as a duration ("1h42m") or seconds',
|
||||
},
|
||||
machine: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'Machine preset for the run: micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, or large-2x',
|
||||
},
|
||||
tags: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Comma-separated tags to attach to the run (max 10, each under 128 characters)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/tasks/${encodeURIComponent(params.taskIdentifier.trim())}/trigger`,
|
||||
method: 'POST',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const body: Record<string, unknown> = {}
|
||||
|
||||
const payload = parseJsonInput(params.payload, 'payload')
|
||||
if (payload !== undefined) body.payload = payload
|
||||
|
||||
const options: Record<string, unknown> = {}
|
||||
if (params.idempotencyKey) options.idempotencyKey = params.idempotencyKey
|
||||
if (params.queue) options.queue = { name: params.queue }
|
||||
if (params.concurrencyKey) options.concurrencyKey = params.concurrencyKey
|
||||
if (params.delay) options.delay = params.delay
|
||||
if (params.ttl) options.ttl = params.ttl
|
||||
if (params.machine) options.machine = params.machine
|
||||
if (params.tags) {
|
||||
const tags = splitCommaSeparated(params.tags)
|
||||
if (tags.length > 0) options.tags = tags
|
||||
}
|
||||
if (Object.keys(options).length > 0) body.options = options
|
||||
|
||||
return body
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
id: data.id,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
id: { type: 'string', description: 'ID of the run that was triggered (starts with run_)' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,788 @@
|
||||
import type { ToolResponse } from '@/tools/types'
|
||||
|
||||
export interface TriggerDevBaseParams {
|
||||
apiKey: string
|
||||
}
|
||||
|
||||
/** Raw run object returned by the Trigger.dev list runs and retrieve run endpoints */
|
||||
export interface TriggerDevApiRun {
|
||||
id: string
|
||||
status: string
|
||||
taskIdentifier: string
|
||||
version?: string
|
||||
idempotencyKey?: string
|
||||
isTest?: boolean
|
||||
createdAt?: string
|
||||
updatedAt?: string
|
||||
startedAt?: string
|
||||
finishedAt?: string
|
||||
delayedUntil?: string
|
||||
ttl?: string | number
|
||||
expiredAt?: string
|
||||
tags?: string[]
|
||||
metadata?: Record<string, unknown>
|
||||
costInCents?: number
|
||||
baseCostInCents?: number
|
||||
durationMs?: number
|
||||
depth?: number
|
||||
batchId?: string
|
||||
triggerFunction?: string
|
||||
env?: {
|
||||
id?: string
|
||||
name?: string
|
||||
user?: string
|
||||
}
|
||||
}
|
||||
|
||||
/** Raw run detail object returned by the Trigger.dev retrieve and reschedule run endpoints */
|
||||
export interface TriggerDevApiRunDetail extends TriggerDevApiRun {
|
||||
payload?: unknown
|
||||
payloadPresignedUrl?: string
|
||||
output?: unknown
|
||||
outputPresignedUrl?: string
|
||||
schedule?: {
|
||||
id?: string
|
||||
externalId?: string
|
||||
deduplicationKey?: string
|
||||
generator?: {
|
||||
type?: string
|
||||
expression?: string
|
||||
description?: string
|
||||
}
|
||||
}
|
||||
attempts?: TriggerDevApiAttempt[]
|
||||
relatedRuns?: {
|
||||
root?: TriggerDevApiRun
|
||||
parent?: TriggerDevApiRun
|
||||
children?: TriggerDevApiRun[]
|
||||
}
|
||||
}
|
||||
|
||||
/** Raw queue object returned by the Trigger.dev queues endpoints */
|
||||
export interface TriggerDevApiQueue {
|
||||
id: string
|
||||
name: string
|
||||
type?: string
|
||||
running?: number
|
||||
queued?: number
|
||||
paused?: boolean
|
||||
concurrencyLimit?: number | null
|
||||
concurrency?: {
|
||||
current?: number
|
||||
base?: number
|
||||
override?: number | null
|
||||
overriddenAt?: string | null
|
||||
}
|
||||
}
|
||||
|
||||
/** Raw schedule object returned by the Trigger.dev schedules endpoints */
|
||||
export interface TriggerDevApiSchedule {
|
||||
id: string
|
||||
task: string
|
||||
type?: string
|
||||
active?: boolean
|
||||
deduplicationKey?: string
|
||||
externalId?: string
|
||||
generator?: {
|
||||
type?: string
|
||||
expression?: string
|
||||
description?: string
|
||||
}
|
||||
timezone?: string
|
||||
nextRun?: string
|
||||
environments?: {
|
||||
id?: string
|
||||
type?: string
|
||||
userName?: string
|
||||
}[]
|
||||
}
|
||||
|
||||
/** Raw attempt object included in the Trigger.dev retrieve run response */
|
||||
export interface TriggerDevApiAttempt {
|
||||
id: string
|
||||
status: string
|
||||
createdAt?: string
|
||||
updatedAt?: string
|
||||
startedAt?: string
|
||||
completedAt?: string
|
||||
error?: {
|
||||
message?: string
|
||||
name?: string
|
||||
stackTrace?: string
|
||||
}
|
||||
}
|
||||
|
||||
/** Normalized run fields shared by the list runs and get run outputs */
|
||||
export interface TriggerDevRunSummary {
|
||||
id: string
|
||||
status: string
|
||||
taskIdentifier: string
|
||||
version: string | null
|
||||
idempotencyKey: string | null
|
||||
isTest: boolean
|
||||
createdAt: string | null
|
||||
updatedAt: string | null
|
||||
startedAt: string | null
|
||||
finishedAt: string | null
|
||||
delayedUntil: string | null
|
||||
ttl: string | number | null
|
||||
expiredAt: string | null
|
||||
tags: string[]
|
||||
costInCents: number | null
|
||||
baseCostInCents: number | null
|
||||
durationMs: number | null
|
||||
env: {
|
||||
id: string | null
|
||||
name: string | null
|
||||
user: string | null
|
||||
} | null
|
||||
}
|
||||
|
||||
/** Normalized attempt entry in the get run output */
|
||||
export interface TriggerDevAttempt {
|
||||
id: string
|
||||
status: string
|
||||
createdAt: string | null
|
||||
updatedAt: string | null
|
||||
startedAt: string | null
|
||||
completedAt: string | null
|
||||
error: {
|
||||
message: string | null
|
||||
name: string | null
|
||||
stackTrace: string | null
|
||||
} | null
|
||||
}
|
||||
|
||||
/** Full normalized run returned by the get run tool */
|
||||
export interface TriggerDevRunDetail extends TriggerDevRunSummary {
|
||||
metadata: Record<string, unknown> | null
|
||||
depth: number | null
|
||||
batchId: string | null
|
||||
triggerFunction: string | null
|
||||
payload: unknown
|
||||
payloadPresignedUrl: string | null
|
||||
output: unknown
|
||||
outputPresignedUrl: string | null
|
||||
schedule: {
|
||||
id: string | null
|
||||
externalId: string | null
|
||||
deduplicationKey: string | null
|
||||
generator: {
|
||||
type: string | null
|
||||
expression: string | null
|
||||
description: string | null
|
||||
} | null
|
||||
} | null
|
||||
attempts: TriggerDevAttempt[]
|
||||
relatedRuns: {
|
||||
root: TriggerDevRunSummary | null
|
||||
parent: TriggerDevRunSummary | null
|
||||
children: TriggerDevRunSummary[]
|
||||
} | null
|
||||
}
|
||||
|
||||
/** Normalized schedule returned by the schedule tools */
|
||||
export interface TriggerDevSchedule {
|
||||
id: string
|
||||
task: string
|
||||
type: string | null
|
||||
active: boolean
|
||||
deduplicationKey: string | null
|
||||
externalId: string | null
|
||||
cron: string | null
|
||||
cronDescription: string | null
|
||||
timezone: string | null
|
||||
nextRun: string | null
|
||||
environments: {
|
||||
id: string | null
|
||||
type: string | null
|
||||
userName: string | null
|
||||
}[]
|
||||
}
|
||||
|
||||
/** Normalized queue returned by the queue tools */
|
||||
export interface TriggerDevQueue {
|
||||
id: string
|
||||
name: string
|
||||
type: string | null
|
||||
running: number | null
|
||||
queued: number | null
|
||||
paused: boolean
|
||||
concurrencyLimit: number | null
|
||||
concurrency: {
|
||||
current: number | null
|
||||
base: number | null
|
||||
override: number | null
|
||||
overriddenAt: string | null
|
||||
} | null
|
||||
}
|
||||
|
||||
/** Normalized environment variable returned by the env var tools */
|
||||
export interface TriggerDevEnvVar {
|
||||
name: string
|
||||
value: string
|
||||
}
|
||||
|
||||
/** Raw run result object returned by the run result and batch results endpoints */
|
||||
export interface TriggerDevApiRunResult {
|
||||
ok: boolean
|
||||
id: string
|
||||
taskIdentifier?: string
|
||||
output?: string
|
||||
outputType?: string
|
||||
error?: Record<string, unknown>
|
||||
usage?: {
|
||||
durationMs?: number
|
||||
}
|
||||
}
|
||||
|
||||
/** Normalized run result returned by the run result and batch results tools */
|
||||
export interface TriggerDevRunResult {
|
||||
ok: boolean
|
||||
id: string
|
||||
taskIdentifier: string | null
|
||||
output: unknown
|
||||
outputType: string | null
|
||||
error: Record<string, unknown> | null
|
||||
durationMs: number | null
|
||||
}
|
||||
|
||||
/** Span event entry attached to a run event or trace span */
|
||||
export interface TriggerDevSpanEvent {
|
||||
name: string | null
|
||||
time: string | null
|
||||
properties: Record<string, unknown> | null
|
||||
}
|
||||
|
||||
/** Normalized run event returned by the run events tool */
|
||||
export interface TriggerDevRunEvent {
|
||||
spanId: string | null
|
||||
parentId: string | null
|
||||
runId: string | null
|
||||
message: string | null
|
||||
startTime: string | null
|
||||
duration: number | null
|
||||
isError: boolean
|
||||
isPartial: boolean
|
||||
isCancelled: boolean
|
||||
level: string | null
|
||||
kind: string | null
|
||||
attemptNumber: number | null
|
||||
taskSlug: string | null
|
||||
events: TriggerDevSpanEvent[]
|
||||
}
|
||||
|
||||
/** Raw deployment object returned by the deployments endpoints */
|
||||
export interface TriggerDevApiDeployment {
|
||||
id: string
|
||||
status: string
|
||||
createdAt?: string
|
||||
shortCode?: string
|
||||
version?: string
|
||||
runtime?: string | null
|
||||
runtimeVersion?: string | null
|
||||
deployedAt?: string | null
|
||||
git?: Record<string, unknown> | null
|
||||
error?: Record<string, unknown> | null
|
||||
contentHash?: string
|
||||
imageReference?: string | null
|
||||
errorData?: Record<string, unknown> | null
|
||||
worker?: {
|
||||
id?: string
|
||||
version?: string
|
||||
tasks?: {
|
||||
id?: string
|
||||
slug?: string
|
||||
filePath?: string
|
||||
}[]
|
||||
} | null
|
||||
}
|
||||
|
||||
/** Normalized deployment returned by the deployment tools */
|
||||
export interface TriggerDevDeployment {
|
||||
id: string
|
||||
status: string
|
||||
version: string | null
|
||||
shortCode: string | null
|
||||
createdAt: string | null
|
||||
deployedAt: string | null
|
||||
runtime: string | null
|
||||
runtimeVersion: string | null
|
||||
git: Record<string, unknown> | null
|
||||
error: Record<string, unknown> | null
|
||||
tasks: {
|
||||
id: string | null
|
||||
slug: string | null
|
||||
filePath: string | null
|
||||
}[]
|
||||
}
|
||||
|
||||
/** Raw waitpoint token object returned by the waitpoint endpoints */
|
||||
export interface TriggerDevApiWaitpointToken {
|
||||
id: string
|
||||
url: string
|
||||
status: string
|
||||
idempotencyKey?: string | null
|
||||
idempotencyKeyExpiresAt?: string | null
|
||||
timeoutAt?: string | null
|
||||
completedAt?: string | null
|
||||
output?: string | null
|
||||
outputType?: string | null
|
||||
outputIsError?: boolean | null
|
||||
tags?: string[]
|
||||
createdAt?: string
|
||||
}
|
||||
|
||||
/** Normalized waitpoint token returned by the waitpoint tools */
|
||||
export interface TriggerDevWaitpointToken {
|
||||
id: string
|
||||
url: string
|
||||
status: string
|
||||
idempotencyKey: string | null
|
||||
idempotencyKeyExpiresAt: string | null
|
||||
timeoutAt: string | null
|
||||
completedAt: string | null
|
||||
output: unknown
|
||||
outputType: string | null
|
||||
outputIsError: boolean
|
||||
tags: string[]
|
||||
createdAt: string | null
|
||||
}
|
||||
|
||||
export interface TriggerDevTriggerTaskParams extends TriggerDevBaseParams {
|
||||
taskIdentifier: string
|
||||
payload?: string | Record<string, unknown>
|
||||
idempotencyKey?: string
|
||||
queue?: string
|
||||
concurrencyKey?: string
|
||||
delay?: string
|
||||
ttl?: string
|
||||
machine?: string
|
||||
tags?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevBatchTriggerTaskParams extends TriggerDevBaseParams {
|
||||
taskIdentifier: string
|
||||
items: string | Record<string, unknown>[]
|
||||
}
|
||||
|
||||
export interface TriggerDevRunIdParams extends TriggerDevBaseParams {
|
||||
runId: string
|
||||
}
|
||||
|
||||
export interface TriggerDevRescheduleRunParams extends TriggerDevBaseParams {
|
||||
runId: string
|
||||
delay: string
|
||||
}
|
||||
|
||||
export interface TriggerDevAddRunTagsParams extends TriggerDevBaseParams {
|
||||
runId: string
|
||||
tags: string
|
||||
}
|
||||
|
||||
export interface TriggerDevBatchIdParams extends TriggerDevBaseParams {
|
||||
batchId: string
|
||||
}
|
||||
|
||||
export interface TriggerDevUpdateRunMetadataParams extends TriggerDevBaseParams {
|
||||
runId: string
|
||||
metadata: string | Record<string, unknown>
|
||||
}
|
||||
|
||||
export interface TriggerDevListRunsParams extends TriggerDevBaseParams {
|
||||
status?: string
|
||||
taskIdentifier?: string
|
||||
version?: string
|
||||
tag?: string
|
||||
schedule?: string
|
||||
isTest?: string
|
||||
period?: string
|
||||
from?: string
|
||||
to?: string
|
||||
pageSize?: number
|
||||
pageAfter?: string
|
||||
pageBefore?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevCreateScheduleParams extends TriggerDevBaseParams {
|
||||
task: string
|
||||
cron: string
|
||||
deduplicationKey: string
|
||||
timezone?: string
|
||||
externalId?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevUpdateScheduleParams extends TriggerDevBaseParams {
|
||||
scheduleId: string
|
||||
task: string
|
||||
cron: string
|
||||
timezone?: string
|
||||
externalId?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevScheduleIdParams extends TriggerDevBaseParams {
|
||||
scheduleId: string
|
||||
}
|
||||
|
||||
export interface TriggerDevListSchedulesParams extends TriggerDevBaseParams {
|
||||
page?: number
|
||||
perPage?: number
|
||||
}
|
||||
|
||||
export interface TriggerDevEnvVarsScopeParams extends TriggerDevBaseParams {
|
||||
projectRef: string
|
||||
environment: string
|
||||
}
|
||||
|
||||
export interface TriggerDevEnvVarNameParams extends TriggerDevEnvVarsScopeParams {
|
||||
name: string
|
||||
}
|
||||
|
||||
export interface TriggerDevEnvVarWriteParams extends TriggerDevEnvVarNameParams {
|
||||
value: string
|
||||
}
|
||||
|
||||
export interface TriggerDevImportEnvVarsParams extends TriggerDevEnvVarsScopeParams {
|
||||
variables: string | Record<string, unknown>[]
|
||||
override?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevQueueParams extends TriggerDevBaseParams {
|
||||
queueName: string
|
||||
queueType?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevListQueuesParams extends TriggerDevBaseParams {
|
||||
page?: number
|
||||
perPage?: number
|
||||
}
|
||||
|
||||
export interface TriggerDevOverrideQueueConcurrencyParams extends TriggerDevQueueParams {
|
||||
concurrencyLimit: number
|
||||
}
|
||||
|
||||
export interface TriggerDevListDeploymentsParams extends TriggerDevBaseParams {
|
||||
status?: string
|
||||
period?: string
|
||||
from?: string
|
||||
to?: string
|
||||
pageSize?: number
|
||||
pageAfter?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevGetDeploymentParams extends TriggerDevBaseParams {
|
||||
deploymentId: string
|
||||
}
|
||||
|
||||
export interface TriggerDevPromoteDeploymentParams extends TriggerDevBaseParams {
|
||||
version: string
|
||||
}
|
||||
|
||||
export interface TriggerDevExecuteQueryParams extends TriggerDevBaseParams {
|
||||
query: string
|
||||
scope?: string
|
||||
period?: string
|
||||
from?: string
|
||||
to?: string
|
||||
format?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevCreateWaitpointTokenParams extends TriggerDevBaseParams {
|
||||
timeout?: string
|
||||
idempotencyKey?: string
|
||||
idempotencyKeyTTL?: string
|
||||
tags?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevWaitpointIdParams extends TriggerDevBaseParams {
|
||||
waitpointId: string
|
||||
}
|
||||
|
||||
export interface TriggerDevCompleteWaitpointTokenParams extends TriggerDevBaseParams {
|
||||
waitpointId: string
|
||||
data?: string | Record<string, unknown>
|
||||
}
|
||||
|
||||
export interface TriggerDevListWaitpointTokensParams extends TriggerDevBaseParams {
|
||||
status?: string
|
||||
idempotencyKey?: string
|
||||
tags?: string
|
||||
period?: string
|
||||
from?: string
|
||||
to?: string
|
||||
pageSize?: number
|
||||
pageAfter?: string
|
||||
pageBefore?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevListTimezonesParams extends TriggerDevBaseParams {
|
||||
excludeUtc?: string
|
||||
}
|
||||
|
||||
export interface TriggerDevTriggerTaskResponse extends ToolResponse {
|
||||
output: {
|
||||
id: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevBatchTriggerTaskResponse extends ToolResponse {
|
||||
output: {
|
||||
batchId: string
|
||||
runIds: string[]
|
||||
}
|
||||
}
|
||||
|
||||
/** Normalized batch returned by the get batch tool */
|
||||
export interface TriggerDevBatch {
|
||||
id: string
|
||||
status: string
|
||||
idempotencyKey: string | null
|
||||
createdAt: string | null
|
||||
updatedAt: string | null
|
||||
runCount: number | null
|
||||
runIds: string[]
|
||||
successfulRunCount: number | null
|
||||
failedRunCount: number | null
|
||||
errors:
|
||||
| {
|
||||
index: number | null
|
||||
taskIdentifier: string | null
|
||||
error: Record<string, unknown> | null
|
||||
errorCode: string | null
|
||||
}[]
|
||||
| null
|
||||
}
|
||||
|
||||
export interface TriggerDevGetBatchResponse extends ToolResponse {
|
||||
output: TriggerDevBatch
|
||||
}
|
||||
|
||||
export interface TriggerDevBatchResultsResponse extends ToolResponse {
|
||||
output: {
|
||||
id: string
|
||||
items: TriggerDevRunResult[]
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevRunResultResponse extends ToolResponse {
|
||||
output: TriggerDevRunResult
|
||||
}
|
||||
|
||||
export interface TriggerDevAddRunTagsResponse extends ToolResponse {
|
||||
output: {
|
||||
message: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevRunEventsResponse extends ToolResponse {
|
||||
output: {
|
||||
events: TriggerDevRunEvent[]
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevRunTraceResponse extends ToolResponse {
|
||||
output: {
|
||||
traceId: string | null
|
||||
rootSpan: Record<string, unknown> | null
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevListQueuesResponse extends ToolResponse {
|
||||
output: {
|
||||
queues: TriggerDevQueue[]
|
||||
pagination: {
|
||||
currentPage: number | null
|
||||
totalPages: number | null
|
||||
count: number | null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevDeploymentResponse extends ToolResponse {
|
||||
output: TriggerDevDeployment
|
||||
}
|
||||
|
||||
export interface TriggerDevListDeploymentsResponse extends ToolResponse {
|
||||
output: {
|
||||
deployments: TriggerDevDeployment[]
|
||||
pagination: {
|
||||
next: string | null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevPromoteDeploymentResponse extends ToolResponse {
|
||||
output: {
|
||||
id: string
|
||||
version: string | null
|
||||
shortCode: string | null
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevExecuteQueryResponse extends ToolResponse {
|
||||
output: {
|
||||
format: string
|
||||
results: unknown
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevQuerySchemaResponse extends ToolResponse {
|
||||
output: {
|
||||
tables: {
|
||||
name: string | null
|
||||
description: string | null
|
||||
timeColumn: string | null
|
||||
columns: {
|
||||
name: string | null
|
||||
type: string | null
|
||||
description: string | null
|
||||
example: string | null
|
||||
allowedValues: string[]
|
||||
coreColumn: boolean
|
||||
}[]
|
||||
}[]
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevCreateWaitpointTokenResponse extends ToolResponse {
|
||||
output: {
|
||||
id: string
|
||||
isCached: boolean
|
||||
url: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevCompleteWaitpointTokenResponse extends ToolResponse {
|
||||
output: {
|
||||
success: boolean
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevWaitpointTokenResponse extends ToolResponse {
|
||||
output: TriggerDevWaitpointToken
|
||||
}
|
||||
|
||||
export interface TriggerDevListWaitpointTokensResponse extends ToolResponse {
|
||||
output: {
|
||||
tokens: TriggerDevWaitpointToken[]
|
||||
pagination: {
|
||||
next: string | null
|
||||
previous: string | null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevImportEnvVarsResponse extends ToolResponse {
|
||||
output: {
|
||||
success: boolean
|
||||
count: number
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevListTimezonesResponse extends ToolResponse {
|
||||
output: {
|
||||
timezones: string[]
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevUpdateRunMetadataResponse extends ToolResponse {
|
||||
output: {
|
||||
metadata: Record<string, unknown> | null
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevListEnvVarsResponse extends ToolResponse {
|
||||
output: {
|
||||
variables: TriggerDevEnvVar[]
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevEnvVarResponse extends ToolResponse {
|
||||
output: TriggerDevEnvVar
|
||||
}
|
||||
|
||||
export interface TriggerDevEnvVarActionResponse extends ToolResponse {
|
||||
output: {
|
||||
success: boolean
|
||||
name: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevQueueResponse extends ToolResponse {
|
||||
output: TriggerDevQueue
|
||||
}
|
||||
|
||||
export interface TriggerDevRunResponse extends ToolResponse {
|
||||
output: TriggerDevRunDetail
|
||||
}
|
||||
|
||||
export interface TriggerDevListRunsResponse extends ToolResponse {
|
||||
output: {
|
||||
runs: TriggerDevRunSummary[]
|
||||
pagination: {
|
||||
next: string | null
|
||||
previous: string | null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevRunActionResponse extends ToolResponse {
|
||||
output: {
|
||||
id: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevScheduleResponse extends ToolResponse {
|
||||
output: TriggerDevSchedule
|
||||
}
|
||||
|
||||
export interface TriggerDevListSchedulesResponse extends ToolResponse {
|
||||
output: {
|
||||
schedules: TriggerDevSchedule[]
|
||||
pagination: {
|
||||
currentPage: number | null
|
||||
totalPages: number | null
|
||||
count: number | null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface TriggerDevDeleteScheduleResponse extends ToolResponse {
|
||||
output: {
|
||||
deleted: boolean
|
||||
scheduleId: string
|
||||
}
|
||||
}
|
||||
|
||||
export type TriggerDevResponse =
|
||||
| TriggerDevTriggerTaskResponse
|
||||
| TriggerDevBatchTriggerTaskResponse
|
||||
| TriggerDevGetBatchResponse
|
||||
| TriggerDevBatchResultsResponse
|
||||
| TriggerDevRunResponse
|
||||
| TriggerDevRunResultResponse
|
||||
| TriggerDevListRunsResponse
|
||||
| TriggerDevRunActionResponse
|
||||
| TriggerDevAddRunTagsResponse
|
||||
| TriggerDevRunEventsResponse
|
||||
| TriggerDevRunTraceResponse
|
||||
| TriggerDevUpdateRunMetadataResponse
|
||||
| TriggerDevScheduleResponse
|
||||
| TriggerDevListSchedulesResponse
|
||||
| TriggerDevDeleteScheduleResponse
|
||||
| TriggerDevListEnvVarsResponse
|
||||
| TriggerDevEnvVarResponse
|
||||
| TriggerDevEnvVarActionResponse
|
||||
| TriggerDevImportEnvVarsResponse
|
||||
| TriggerDevQueueResponse
|
||||
| TriggerDevListQueuesResponse
|
||||
| TriggerDevDeploymentResponse
|
||||
| TriggerDevListDeploymentsResponse
|
||||
| TriggerDevPromoteDeploymentResponse
|
||||
| TriggerDevExecuteQueryResponse
|
||||
| TriggerDevQuerySchemaResponse
|
||||
| TriggerDevCreateWaitpointTokenResponse
|
||||
| TriggerDevCompleteWaitpointTokenResponse
|
||||
| TriggerDevWaitpointTokenResponse
|
||||
| TriggerDevListWaitpointTokensResponse
|
||||
| TriggerDevListTimezonesResponse
|
||||
@@ -0,0 +1,74 @@
|
||||
import type {
|
||||
TriggerDevEnvVarActionResponse,
|
||||
TriggerDevEnvVarWriteParams,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import { buildTriggerDevEnvVarsUrl, buildTriggerDevHeaders } from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevUpdateEnvVarTool: ToolConfig<
|
||||
TriggerDevEnvVarWriteParams,
|
||||
TriggerDevEnvVarActionResponse
|
||||
> = {
|
||||
id: 'trigger_dev_update_env_var',
|
||||
name: 'Trigger.dev Update Env Var',
|
||||
description: 'Update the value of an environment variable in a Trigger.dev project environment.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
projectRef: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External ref of the project, from the project settings (starts with proj_)',
|
||||
},
|
||||
environment: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Environment the variable belongs to: dev, staging, or prod',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Name of the environment variable to update (e.g., "SLACK_API_KEY")',
|
||||
},
|
||||
value: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'New value of the environment variable',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) => buildTriggerDevEnvVarsUrl(params.projectRef, params.environment, params.name),
|
||||
method: 'PUT',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({
|
||||
value: params.value,
|
||||
}),
|
||||
},
|
||||
|
||||
transformResponse: async (response, params) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
success: data.success ?? true,
|
||||
name: params?.name ?? '',
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
success: { type: 'boolean', description: 'Whether the environment variable was updated' },
|
||||
name: { type: 'string', description: 'Name of the environment variable that was updated' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import type {
|
||||
TriggerDevUpdateRunMetadataParams,
|
||||
TriggerDevUpdateRunMetadataResponse,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
parseJsonInput,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevUpdateRunMetadataTool: ToolConfig<
|
||||
TriggerDevUpdateRunMetadataParams,
|
||||
TriggerDevUpdateRunMetadataResponse
|
||||
> = {
|
||||
id: 'trigger_dev_update_run_metadata',
|
||||
name: 'Trigger.dev Update Run Metadata',
|
||||
description: 'Replace the metadata of a Trigger.dev run with a new JSON object.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
runId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the run to update (starts with run_)',
|
||||
},
|
||||
metadata: {
|
||||
type: 'json',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'JSON object to set as the run metadata. Example: {"stage": "approved"}',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/runs/${encodeURIComponent(params.runId.trim())}/metadata`,
|
||||
method: 'PUT',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => ({ metadata: parseJsonInput(params.metadata, 'metadata') ?? {} }),
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: {
|
||||
metadata: data.metadata ?? null,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
outputs: {
|
||||
metadata: { type: 'json', description: 'The updated metadata of the run' },
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
import type {
|
||||
TriggerDevScheduleResponse,
|
||||
TriggerDevUpdateScheduleParams,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import {
|
||||
buildTriggerDevHeaders,
|
||||
mapTriggerDevSchedule,
|
||||
TRIGGER_DEV_API_BASE,
|
||||
TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
} from '@/tools/trigger_dev/utils'
|
||||
import type { ToolConfig } from '@/tools/types'
|
||||
|
||||
export const triggerDevUpdateScheduleTool: ToolConfig<
|
||||
TriggerDevUpdateScheduleParams,
|
||||
TriggerDevScheduleResponse
|
||||
> = {
|
||||
id: 'trigger_dev_update_schedule',
|
||||
name: 'Trigger.dev Update Schedule',
|
||||
description:
|
||||
'Update an imperative Trigger.dev schedule by its ID, replacing its task, cron expression, timezone, and external ID.',
|
||||
version: '1.0.0',
|
||||
|
||||
params: {
|
||||
apiKey: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-only',
|
||||
description: 'Trigger.dev secret API key (starts with tr_)',
|
||||
},
|
||||
scheduleId: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'ID of the schedule to update (starts with sched_)',
|
||||
},
|
||||
task: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Identifier of the task the schedule triggers (e.g., "daily-report")',
|
||||
},
|
||||
cron: {
|
||||
type: 'string',
|
||||
required: true,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Cron expression defining when the task runs (e.g., "0 0 * * *")',
|
||||
},
|
||||
timezone: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description:
|
||||
'IANA timezone the cron expression is evaluated in (e.g., "America/New_York"). Defaults to UTC',
|
||||
},
|
||||
externalId: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'External identifier to associate with the schedule (e.g., a user ID)',
|
||||
},
|
||||
},
|
||||
|
||||
request: {
|
||||
url: (params) =>
|
||||
`${TRIGGER_DEV_API_BASE}/api/v1/schedules/${encodeURIComponent(params.scheduleId.trim())}`,
|
||||
method: 'PUT',
|
||||
headers: (params) => buildTriggerDevHeaders(params.apiKey),
|
||||
body: (params) => {
|
||||
const body: Record<string, unknown> = {
|
||||
task: params.task,
|
||||
cron: params.cron,
|
||||
}
|
||||
if (params.timezone) body.timezone = params.timezone
|
||||
if (params.externalId) body.externalId = params.externalId
|
||||
return body
|
||||
},
|
||||
},
|
||||
|
||||
transformResponse: async (response) => {
|
||||
const data = await response.json()
|
||||
return {
|
||||
success: true,
|
||||
output: mapTriggerDevSchedule(data),
|
||||
}
|
||||
},
|
||||
|
||||
outputs: TRIGGER_DEV_SCHEDULE_OUTPUTS,
|
||||
}
|
||||
@@ -0,0 +1,825 @@
|
||||
import type {
|
||||
TriggerDevApiAttempt,
|
||||
TriggerDevApiDeployment,
|
||||
TriggerDevApiQueue,
|
||||
TriggerDevApiRun,
|
||||
TriggerDevApiRunDetail,
|
||||
TriggerDevApiRunResult,
|
||||
TriggerDevApiSchedule,
|
||||
TriggerDevApiWaitpointToken,
|
||||
TriggerDevAttempt,
|
||||
TriggerDevDeployment,
|
||||
TriggerDevQueue,
|
||||
TriggerDevRunDetail,
|
||||
TriggerDevRunResult,
|
||||
TriggerDevRunSummary,
|
||||
TriggerDevSchedule,
|
||||
TriggerDevWaitpointToken,
|
||||
} from '@/tools/trigger_dev/types'
|
||||
import type { OutputProperty, ToolConfig } from '@/tools/types'
|
||||
|
||||
export const TRIGGER_DEV_API_BASE = 'https://api.trigger.dev'
|
||||
|
||||
/**
|
||||
* Builds the standard headers for Trigger.dev management API requests.
|
||||
*/
|
||||
export function buildTriggerDevHeaders(apiKey: string): Record<string, string> {
|
||||
return {
|
||||
Authorization: `Bearer ${apiKey}`,
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits a comma-separated string into trimmed, non-empty values.
|
||||
*/
|
||||
export function splitCommaSeparated(value: string): string[] {
|
||||
return value
|
||||
.split(',')
|
||||
.map((entry) => entry.trim())
|
||||
.filter((entry) => entry.length > 0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes a JSON parameter that may arrive as a parsed value or a JSON string.
|
||||
* Throws a descriptive error when the string is not valid JSON.
|
||||
*/
|
||||
export function parseJsonInput(value: unknown, paramName: string): unknown {
|
||||
if (value === undefined || value === null || value === '') return undefined
|
||||
if (typeof value !== 'string') return value
|
||||
try {
|
||||
return JSON.parse(value)
|
||||
} catch {
|
||||
throw new Error(`Invalid JSON in ${paramName} parameter`)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Derives operation success from a response that may have an empty body.
|
||||
* Uses the body's boolean `success` field when present, otherwise falls back
|
||||
* to the HTTP status.
|
||||
*/
|
||||
export async function resolveTriggerDevSuccess(response: Response): Promise<boolean> {
|
||||
const text = await response.text()
|
||||
if (text) {
|
||||
try {
|
||||
const data = JSON.parse(text)
|
||||
if (typeof data.success === 'boolean') return data.success
|
||||
} catch {
|
||||
return response.ok
|
||||
}
|
||||
}
|
||||
return response.ok
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the URL for the environment variable endpoints of a project environment.
|
||||
*/
|
||||
export function buildTriggerDevEnvVarsUrl(
|
||||
projectRef: string,
|
||||
environment: string,
|
||||
name?: string
|
||||
): string {
|
||||
const base = `${TRIGGER_DEV_API_BASE}/api/v1/projects/${encodeURIComponent(projectRef.trim())}/envvars/${encodeURIComponent(environment.trim())}`
|
||||
return name ? `${base}/${encodeURIComponent(name.trim())}` : base
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev run object to the normalized run summary shape.
|
||||
*/
|
||||
export function mapTriggerDevRunSummary(run: TriggerDevApiRun): TriggerDevRunSummary {
|
||||
return {
|
||||
id: run.id,
|
||||
status: run.status,
|
||||
taskIdentifier: run.taskIdentifier,
|
||||
version: run.version ?? null,
|
||||
idempotencyKey: run.idempotencyKey ?? null,
|
||||
isTest: run.isTest ?? false,
|
||||
createdAt: run.createdAt ?? null,
|
||||
updatedAt: run.updatedAt ?? null,
|
||||
startedAt: run.startedAt ?? null,
|
||||
finishedAt: run.finishedAt ?? null,
|
||||
delayedUntil: run.delayedUntil ?? null,
|
||||
ttl: run.ttl ?? null,
|
||||
expiredAt: run.expiredAt ?? null,
|
||||
tags: run.tags ?? [],
|
||||
costInCents: run.costInCents ?? null,
|
||||
baseCostInCents: run.baseCostInCents ?? null,
|
||||
durationMs: run.durationMs ?? null,
|
||||
env: run.env
|
||||
? {
|
||||
id: run.env.id ?? null,
|
||||
name: run.env.name ?? null,
|
||||
user: run.env.user ?? null,
|
||||
}
|
||||
: null,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev attempt object to the normalized attempt shape.
|
||||
*/
|
||||
export function mapTriggerDevAttempt(attempt: TriggerDevApiAttempt): TriggerDevAttempt {
|
||||
return {
|
||||
id: attempt.id,
|
||||
status: attempt.status,
|
||||
createdAt: attempt.createdAt ?? null,
|
||||
updatedAt: attempt.updatedAt ?? null,
|
||||
startedAt: attempt.startedAt ?? null,
|
||||
completedAt: attempt.completedAt ?? null,
|
||||
error: attempt.error
|
||||
? {
|
||||
message: attempt.error.message ?? null,
|
||||
name: attempt.error.name ?? null,
|
||||
stackTrace: attempt.error.stackTrace ?? null,
|
||||
}
|
||||
: null,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev run detail object (retrieve and reschedule responses)
|
||||
* to the normalized run detail shape.
|
||||
*/
|
||||
export function mapTriggerDevRunDetail(run: TriggerDevApiRunDetail): TriggerDevRunDetail {
|
||||
return {
|
||||
...mapTriggerDevRunSummary(run),
|
||||
metadata: run.metadata ?? null,
|
||||
depth: run.depth ?? null,
|
||||
batchId: run.batchId ?? null,
|
||||
triggerFunction: run.triggerFunction ?? null,
|
||||
payload: run.payload ?? null,
|
||||
payloadPresignedUrl: run.payloadPresignedUrl ?? null,
|
||||
output: run.output ?? null,
|
||||
outputPresignedUrl: run.outputPresignedUrl ?? null,
|
||||
schedule: run.schedule
|
||||
? {
|
||||
id: run.schedule.id ?? null,
|
||||
externalId: run.schedule.externalId ?? null,
|
||||
deduplicationKey: run.schedule.deduplicationKey ?? null,
|
||||
generator: run.schedule.generator
|
||||
? {
|
||||
type: run.schedule.generator.type ?? null,
|
||||
expression: run.schedule.generator.expression ?? null,
|
||||
description: run.schedule.generator.description ?? null,
|
||||
}
|
||||
: null,
|
||||
}
|
||||
: null,
|
||||
attempts: (run.attempts ?? []).map(mapTriggerDevAttempt),
|
||||
relatedRuns: run.relatedRuns
|
||||
? {
|
||||
root: run.relatedRuns.root ? mapTriggerDevRunSummary(run.relatedRuns.root) : null,
|
||||
parent: run.relatedRuns.parent ? mapTriggerDevRunSummary(run.relatedRuns.parent) : null,
|
||||
children: (run.relatedRuns.children ?? []).map(mapTriggerDevRunSummary),
|
||||
}
|
||||
: null,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a serialized output value using its declared content type.
|
||||
* Trigger.dev returns run and waitpoint outputs as serialized strings with an
|
||||
* accompanying content type; JSON payloads are parsed so downstream blocks can
|
||||
* reference fields directly. Unparseable values are returned as-is.
|
||||
*/
|
||||
export function parseSerializedOutput(
|
||||
output: string | null | undefined,
|
||||
outputType: string | null | undefined
|
||||
): unknown {
|
||||
if (output === undefined || output === null) return null
|
||||
if (outputType === 'application/json') {
|
||||
try {
|
||||
return JSON.parse(output)
|
||||
} catch {
|
||||
return output
|
||||
}
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev run result object (run result and batch results
|
||||
* responses) to the normalized run result shape.
|
||||
*/
|
||||
export function mapTriggerDevRunResult(result: TriggerDevApiRunResult): TriggerDevRunResult {
|
||||
return {
|
||||
ok: result.ok,
|
||||
id: result.id,
|
||||
taskIdentifier: result.taskIdentifier ?? null,
|
||||
output: parseSerializedOutput(result.output, result.outputType),
|
||||
outputType: result.outputType ?? null,
|
||||
error: result.error ?? null,
|
||||
durationMs: result.usage?.durationMs ?? null,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev deployment object to the normalized deployment shape.
|
||||
*/
|
||||
export function mapTriggerDevDeployment(deployment: TriggerDevApiDeployment): TriggerDevDeployment {
|
||||
return {
|
||||
id: deployment.id,
|
||||
status: deployment.status,
|
||||
version: deployment.version ?? null,
|
||||
shortCode: deployment.shortCode ?? null,
|
||||
createdAt: deployment.createdAt ?? null,
|
||||
deployedAt: deployment.deployedAt ?? null,
|
||||
runtime: deployment.runtime ?? null,
|
||||
runtimeVersion: deployment.runtimeVersion ?? null,
|
||||
git: deployment.git ?? null,
|
||||
error: deployment.error ?? deployment.errorData ?? null,
|
||||
tasks: (deployment.worker?.tasks ?? []).map((task) => ({
|
||||
id: task.id ?? null,
|
||||
slug: task.slug ?? null,
|
||||
filePath: task.filePath ?? null,
|
||||
})),
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev waitpoint token object to the normalized token shape.
|
||||
*/
|
||||
export function mapTriggerDevWaitpointToken(
|
||||
token: TriggerDevApiWaitpointToken
|
||||
): TriggerDevWaitpointToken {
|
||||
return {
|
||||
id: token.id,
|
||||
url: token.url,
|
||||
status: token.status,
|
||||
idempotencyKey: token.idempotencyKey ?? null,
|
||||
idempotencyKeyExpiresAt: token.idempotencyKeyExpiresAt ?? null,
|
||||
timeoutAt: token.timeoutAt ?? null,
|
||||
completedAt: token.completedAt ?? null,
|
||||
output: parseSerializedOutput(token.output, token.outputType),
|
||||
outputType: token.outputType ?? null,
|
||||
outputIsError: token.outputIsError ?? false,
|
||||
tags: token.tags ?? [],
|
||||
createdAt: token.createdAt ?? null,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev queue object to the normalized queue shape.
|
||||
*/
|
||||
export function mapTriggerDevQueue(queue: TriggerDevApiQueue): TriggerDevQueue {
|
||||
return {
|
||||
id: queue.id,
|
||||
name: queue.name,
|
||||
type: queue.type ?? null,
|
||||
running: queue.running ?? null,
|
||||
queued: queue.queued ?? null,
|
||||
paused: queue.paused ?? false,
|
||||
concurrencyLimit: queue.concurrencyLimit ?? null,
|
||||
concurrency: queue.concurrency
|
||||
? {
|
||||
current: queue.concurrency.current ?? null,
|
||||
base: queue.concurrency.base ?? null,
|
||||
override: queue.concurrency.override ?? null,
|
||||
overriddenAt: queue.concurrency.overriddenAt ?? null,
|
||||
}
|
||||
: null,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a raw Trigger.dev schedule object to the normalized schedule shape.
|
||||
*/
|
||||
export function mapTriggerDevSchedule(schedule: TriggerDevApiSchedule): TriggerDevSchedule {
|
||||
return {
|
||||
id: schedule.id,
|
||||
task: schedule.task,
|
||||
type: schedule.type ?? null,
|
||||
active: schedule.active ?? false,
|
||||
deduplicationKey: schedule.deduplicationKey ?? null,
|
||||
externalId: schedule.externalId ?? null,
|
||||
cron: schedule.generator?.expression ?? null,
|
||||
cronDescription: schedule.generator?.description ?? null,
|
||||
timezone: schedule.timezone ?? null,
|
||||
nextRun: schedule.nextRun ?? null,
|
||||
environments: (schedule.environments ?? []).map((environment) => ({
|
||||
id: environment.id ?? null,
|
||||
type: environment.type ?? null,
|
||||
userName: environment.userName ?? null,
|
||||
})),
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Output property schema for a normalized run summary, shared by the run tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_RUN_SUMMARY_PROPERTIES: Record<string, OutputProperty> = {
|
||||
id: { type: 'string', description: 'Unique ID of the run (starts with run_)' },
|
||||
status: {
|
||||
type: 'string',
|
||||
description:
|
||||
'Run status (PENDING_VERSION, DELAYED, QUEUED, EXECUTING, REATTEMPTING, FROZEN, COMPLETED, CANCELED, FAILED, CRASHED, INTERRUPTED, or SYSTEM_FAILURE)',
|
||||
},
|
||||
taskIdentifier: { type: 'string', description: 'Identifier of the task the run executes' },
|
||||
version: {
|
||||
type: 'string',
|
||||
description: 'Worker version the run executes on',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
idempotencyKey: {
|
||||
type: 'string',
|
||||
description: 'Idempotency key the run was triggered with',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
isTest: { type: 'boolean', description: 'Whether the run is a test run' },
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the run was created',
|
||||
nullable: true,
|
||||
},
|
||||
updatedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the run was last updated',
|
||||
nullable: true,
|
||||
},
|
||||
startedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the run started executing',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
finishedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the run finished',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
delayedUntil: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp the run is delayed until',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
ttl: {
|
||||
type: 'string',
|
||||
description: 'Time-to-live before an unstarted run expires',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
expiredAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the run expired',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
tags: {
|
||||
type: 'array',
|
||||
description: 'Tags attached to the run',
|
||||
items: { type: 'string', description: 'Run tag' },
|
||||
},
|
||||
costInCents: {
|
||||
type: 'number',
|
||||
description: 'Compute cost of the run in cents',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
baseCostInCents: {
|
||||
type: 'number',
|
||||
description: 'Base invocation cost of the run in cents',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
durationMs: {
|
||||
type: 'number',
|
||||
description: 'Compute duration of the run in milliseconds',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
env: {
|
||||
type: 'object',
|
||||
description: 'Environment the run executes in',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Environment ID', nullable: true },
|
||||
name: { type: 'string', description: 'Environment name', nullable: true },
|
||||
user: { type: 'string', description: 'Username for dev environments', nullable: true },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema for a normalized schedule, shared by the schedule tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_SCHEDULE_OUTPUTS: NonNullable<ToolConfig['outputs']> = {
|
||||
id: { type: 'string', description: 'Unique ID of the schedule (starts with sched_)' },
|
||||
task: { type: 'string', description: 'Identifier of the task the schedule triggers' },
|
||||
type: {
|
||||
type: 'string',
|
||||
description: 'Schedule type (DECLARATIVE or IMPERATIVE)',
|
||||
optional: true,
|
||||
},
|
||||
active: { type: 'boolean', description: 'Whether the schedule is active' },
|
||||
deduplicationKey: {
|
||||
type: 'string',
|
||||
description: 'Deduplication key of the schedule',
|
||||
optional: true,
|
||||
},
|
||||
externalId: {
|
||||
type: 'string',
|
||||
description: 'External ID associated with the schedule',
|
||||
optional: true,
|
||||
},
|
||||
cron: { type: 'string', description: 'Cron expression of the schedule', optional: true },
|
||||
cronDescription: {
|
||||
type: 'string',
|
||||
description: 'Human-readable description of the cron expression',
|
||||
optional: true,
|
||||
},
|
||||
timezone: { type: 'string', description: 'IANA timezone of the schedule', optional: true },
|
||||
nextRun: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp of the next scheduled run',
|
||||
optional: true,
|
||||
},
|
||||
environments: {
|
||||
type: 'array',
|
||||
description: 'Environments the schedule runs in',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Environment the schedule is associated with',
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Environment ID', nullable: true },
|
||||
type: { type: 'string', description: 'Environment type', nullable: true },
|
||||
userName: { type: 'string', description: 'Username for dev environments', nullable: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema for a normalized run detail, shared by the get run and
|
||||
* reschedule run tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_RUN_DETAIL_OUTPUTS: NonNullable<ToolConfig['outputs']> = {
|
||||
...TRIGGER_DEV_RUN_SUMMARY_PROPERTIES,
|
||||
metadata: {
|
||||
type: 'json',
|
||||
description: 'Metadata attached to the run',
|
||||
optional: true,
|
||||
},
|
||||
depth: {
|
||||
type: 'number',
|
||||
description: 'Depth of the run in a parent-child run hierarchy',
|
||||
optional: true,
|
||||
},
|
||||
batchId: {
|
||||
type: 'string',
|
||||
description: 'ID of the batch the run belongs to, if batch-triggered',
|
||||
optional: true,
|
||||
},
|
||||
triggerFunction: {
|
||||
type: 'string',
|
||||
description:
|
||||
'Function used to trigger the run (trigger, triggerAndWait, batchTrigger, or batchTriggerAndWait)',
|
||||
optional: true,
|
||||
},
|
||||
payload: {
|
||||
type: 'json',
|
||||
description: 'Payload the run was triggered with',
|
||||
optional: true,
|
||||
},
|
||||
payloadPresignedUrl: {
|
||||
type: 'string',
|
||||
description: 'Presigned URL to download the payload when it is too large to inline',
|
||||
optional: true,
|
||||
},
|
||||
output: {
|
||||
type: 'json',
|
||||
description: 'Output returned by the run',
|
||||
optional: true,
|
||||
},
|
||||
outputPresignedUrl: {
|
||||
type: 'string',
|
||||
description: 'Presigned URL to download the output when it is too large to inline',
|
||||
optional: true,
|
||||
},
|
||||
schedule: {
|
||||
type: 'object',
|
||||
description: 'Schedule that triggered the run, if any',
|
||||
optional: true,
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Schedule ID', nullable: true },
|
||||
externalId: { type: 'string', description: 'External ID of the schedule', nullable: true },
|
||||
deduplicationKey: {
|
||||
type: 'string',
|
||||
description: 'Deduplication key of the schedule',
|
||||
nullable: true,
|
||||
},
|
||||
generator: {
|
||||
type: 'object',
|
||||
description: 'Schedule generator details',
|
||||
nullable: true,
|
||||
properties: {
|
||||
type: { type: 'string', description: 'Generator type (e.g., CRON)', nullable: true },
|
||||
expression: { type: 'string', description: 'Cron expression', nullable: true },
|
||||
description: {
|
||||
type: 'string',
|
||||
description: 'Human-readable description of the cron expression',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
attempts: {
|
||||
type: 'array',
|
||||
description: 'Attempts made for the run',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Run attempt',
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Attempt ID (starts with attempt_)' },
|
||||
status: {
|
||||
type: 'string',
|
||||
description:
|
||||
'Attempt status (PENDING, EXECUTING, PAUSED, COMPLETED, FAILED, or CANCELED)',
|
||||
},
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the attempt was created',
|
||||
nullable: true,
|
||||
},
|
||||
updatedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the attempt was last updated',
|
||||
nullable: true,
|
||||
},
|
||||
startedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the attempt started',
|
||||
nullable: true,
|
||||
},
|
||||
completedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the attempt completed',
|
||||
nullable: true,
|
||||
},
|
||||
error: {
|
||||
type: 'object',
|
||||
description: 'Error details when the attempt failed',
|
||||
nullable: true,
|
||||
properties: {
|
||||
message: { type: 'string', description: 'Error message', nullable: true },
|
||||
name: { type: 'string', description: 'Error name', nullable: true },
|
||||
stackTrace: { type: 'string', description: 'Error stack trace', nullable: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
relatedRuns: {
|
||||
type: 'object',
|
||||
description: 'Root, parent, and child runs related to this run',
|
||||
optional: true,
|
||||
properties: {
|
||||
root: {
|
||||
type: 'object',
|
||||
description: 'Root run of the hierarchy',
|
||||
nullable: true,
|
||||
properties: TRIGGER_DEV_RUN_SUMMARY_PROPERTIES,
|
||||
},
|
||||
parent: {
|
||||
type: 'object',
|
||||
description: 'Parent run of this run',
|
||||
nullable: true,
|
||||
properties: TRIGGER_DEV_RUN_SUMMARY_PROPERTIES,
|
||||
},
|
||||
children: {
|
||||
type: 'array',
|
||||
description: 'Child runs of this run',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Child run',
|
||||
properties: TRIGGER_DEV_RUN_SUMMARY_PROPERTIES,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema for a normalized queue, shared by the queue tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_QUEUE_OUTPUTS: NonNullable<ToolConfig['outputs']> = {
|
||||
id: { type: 'string', description: 'Unique ID of the queue (starts with queue_)' },
|
||||
name: { type: 'string', description: 'Name of the queue' },
|
||||
type: {
|
||||
type: 'string',
|
||||
description: 'Queue type (task for task-default queues, custom for named queues)',
|
||||
optional: true,
|
||||
},
|
||||
running: { type: 'number', description: 'Number of runs currently executing', optional: true },
|
||||
queued: { type: 'number', description: 'Number of runs waiting in the queue', optional: true },
|
||||
paused: { type: 'boolean', description: 'Whether the queue is paused' },
|
||||
concurrencyLimit: {
|
||||
type: 'number',
|
||||
description: 'Maximum number of runs that can execute concurrently',
|
||||
optional: true,
|
||||
},
|
||||
concurrency: {
|
||||
type: 'object',
|
||||
description: 'Concurrency details for the queue',
|
||||
optional: true,
|
||||
properties: {
|
||||
current: { type: 'number', description: 'Current concurrency limit', nullable: true },
|
||||
base: { type: 'number', description: 'Base concurrency limit', nullable: true },
|
||||
override: { type: 'number', description: 'Overridden concurrency limit', nullable: true },
|
||||
overriddenAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the concurrency limit was overridden',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema for a normalized run result, shared by the run result and
|
||||
* batch results tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_RUN_RESULT_PROPERTIES: Record<string, OutputProperty> = {
|
||||
ok: { type: 'boolean', description: 'Whether the run completed successfully' },
|
||||
id: { type: 'string', description: 'ID of the run (starts with run_)' },
|
||||
taskIdentifier: {
|
||||
type: 'string',
|
||||
description: 'Identifier of the task the run executed',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
output: {
|
||||
type: 'json',
|
||||
description: 'Output returned by the run, parsed when the output type is JSON',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
outputType: {
|
||||
type: 'string',
|
||||
description: 'Content type of the serialized output (e.g., application/json)',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
error: {
|
||||
type: 'json',
|
||||
description: 'Error details when the run failed',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
durationMs: {
|
||||
type: 'number',
|
||||
description: 'Duration of the run in milliseconds',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema for a normalized deployment, shared by the deployment tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_DEPLOYMENT_PROPERTIES: Record<string, OutputProperty> = {
|
||||
id: { type: 'string', description: 'Unique ID of the deployment' },
|
||||
status: {
|
||||
type: 'string',
|
||||
description:
|
||||
'Deployment status (PENDING, INSTALLING, BUILDING, DEPLOYING, DEPLOYED, FAILED, CANCELED, or TIMED_OUT)',
|
||||
},
|
||||
version: {
|
||||
type: 'string',
|
||||
description: 'Deployment version (e.g., "20250228.1")',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
shortCode: {
|
||||
type: 'string',
|
||||
description: 'Short code of the deployment',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the deployment was created',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
deployedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the deployment was promoted to DEPLOYED',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
runtime: {
|
||||
type: 'string',
|
||||
description: 'Runtime used by the deployment (e.g., "node")',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
runtimeVersion: {
|
||||
type: 'string',
|
||||
description: 'Runtime version of the deployment',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
git: {
|
||||
type: 'json',
|
||||
description: 'Git metadata associated with the deployment',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
error: {
|
||||
type: 'json',
|
||||
description: 'Error details when the deployment failed',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
tasks: {
|
||||
type: 'array',
|
||||
description: 'Tasks registered by the deployed worker',
|
||||
items: {
|
||||
type: 'object',
|
||||
description: 'Deployed task',
|
||||
properties: {
|
||||
id: { type: 'string', description: 'Task ID', nullable: true },
|
||||
slug: { type: 'string', description: 'Task identifier', nullable: true },
|
||||
filePath: {
|
||||
type: 'string',
|
||||
description: 'File path of the task in the project',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema for a normalized waitpoint token, shared by the waitpoint tools.
|
||||
*/
|
||||
export const TRIGGER_DEV_WAITPOINT_TOKEN_PROPERTIES: Record<string, OutputProperty> = {
|
||||
id: { type: 'string', description: 'Unique ID of the waitpoint token (starts with waitpoint_)' },
|
||||
url: {
|
||||
type: 'string',
|
||||
description:
|
||||
'HTTP callback URL; a POST request to this URL completes the waitpoint without an API key',
|
||||
},
|
||||
status: {
|
||||
type: 'string',
|
||||
description: 'Status of the waitpoint token (WAITING, COMPLETED, or TIMED_OUT)',
|
||||
},
|
||||
idempotencyKey: {
|
||||
type: 'string',
|
||||
description: 'Idempotency key used when creating the token',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
idempotencyKeyExpiresAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the idempotency key expires',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
timeoutAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the token times out',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
completedAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the token was completed',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
output: {
|
||||
type: 'json',
|
||||
description: 'Data passed when completing the token, parsed when the output type is JSON',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
outputType: {
|
||||
type: 'string',
|
||||
description: 'Content type of the serialized output (e.g., application/json)',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
outputIsError: {
|
||||
type: 'boolean',
|
||||
description: 'Whether the output represents an error (e.g., a timeout)',
|
||||
},
|
||||
tags: {
|
||||
type: 'array',
|
||||
description: 'Tags attached to the waitpoint',
|
||||
items: { type: 'string', description: 'Waitpoint tag' },
|
||||
},
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
description: 'ISO timestamp when the token was created',
|
||||
optional: true,
|
||||
nullable: true,
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user