terse-cli 0.1.42 → 0.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terse-cli",
3
- "version": "0.1.42",
3
+ "version": "0.1.43",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "terse": "dist/index.js"
@@ -20,8 +20,8 @@
20
20
  "handlebars": "^4.7.9",
21
21
  "ora": "^8.0.0",
22
22
  "tsx": "^4.0.0",
23
- "terse-sdk": "0.1.31",
24
- "terse-types": "0.0.26"
23
+ "terse-types": "0.0.27",
24
+ "terse-sdk": "0.1.32"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "^22.0.0",
@@ -1,15 +1,13 @@
1
1
  {{> header}}
2
2
 
3
3
  {{#if github}}{{> github-section github}}{{/if~}}
4
- {{#if gmail}}{{> gmail-section gmail}}{{/if~}}
5
4
  {{#if slack}}{{> slack-section slack}}{{/if~}}
6
5
  {{#if linear}}{{> linear-section linear}}{{/if~}}
7
6
  {{#if notion}}{{> notion-section notion}}{{/if~}}
8
7
  {{#if posthog}}{{> posthog-section posthog}}{{/if~}}
9
8
  {{#if datadog}}{{> datadog-section datadog}}{{/if~}}
10
9
  {{#if launchdarkly}}{{> launchdarkly-section launchdarkly}}{{/if~}}
11
- {{#if workos}}{{> workos-section workos}}{{/if~}}
12
10
  {{#if attio}}{{> attio-section attio}}{{/if~}}
13
- {{#if snowflake}}{{> snowflake-section snowflake}}{{/if~}}
11
+ {{> triggers-section}}
12
+ {{> skills-section}}
14
13
  {{#if tools}}{{> tools-section tools}}{{/if}}
15
- {{> system-section system}}
@@ -29,10 +29,3 @@ export class AttioObject<
29
29
  {{/if}}
30
30
  }
31
31
 
32
- export const Attio = {
33
- /** Use in `skills[]` */
34
- skill(opts: { object: AttioObject<any> }): TypedSkill<{{{skillToolType}}}> {
35
- return new AttioOutputConfig("{{escape id}}", opts.object.apiSlug) as TypedSkill<{{{skillToolType}}}>
36
- },
37
- }
38
-
@@ -1,11 +1,3 @@
1
1
  {{sectionHeader "Datadog"}}
2
2
 
3
3
  {{> resource-class indexClass}}
4
-
5
- export const Datadog = {
6
- /** Use in `skills[]` */
7
- skill(opts?: { indexes?: DatadogIndex[] }): TypedSkill<{{{skillToolType}}}> {
8
- return new DatadogConfig("{{escape id}}", opts?.indexes?.map(i => i.name)) as TypedSkill<{{{skillToolType}}}>
9
- },
10
- }
11
-
@@ -28,39 +28,3 @@ export class Repos {
28
28
  {{/each}}
29
29
  {{/if}}
30
30
  }
31
-
32
- export const GitHub = {
33
- /** Trigger on push to a repository */
34
- onPush(opts: { repo: Repos }): TypedTrigger<GithubPushTrigger> {
35
- return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PUSH])
36
- },
37
- /** Trigger when a pull request is opened */
38
- onPROpened(opts: { repo: Repos }): TypedTrigger<GithubPROpenedTrigger> {
39
- return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED])
40
- },
41
- /** Trigger when a pull request is merged */
42
- onPRMerged(opts: { repo: Repos }): TypedTrigger<GithubPRMergedTrigger> {
43
- return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_MERGED])
44
- },
45
- /** Trigger when a pull request is closed */
46
- onPRClosed(opts: { repo: Repos }): TypedTrigger<GithubPRClosedTrigger> {
47
- return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_CLOSED])
48
- },
49
- /** Trigger when a pull request is synchronized */
50
- onPRSynchronized(opts: { repo: Repos }): TypedTrigger<GithubPRSynchronizedTrigger> {
51
- return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_SYNCHRONIZE])
52
- },
53
- /** Trigger on any pull request event */
54
- onPR(opts: { repo: Repos }): TypedTrigger<GithubPRTrigger> {
55
- return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED, GitHubEventType.PR_MERGED, GitHubEventType.PR_CLOSED, GitHubEventType.PR_SYNCHRONIZE])
56
- },
57
- /** Trigger on specific GitHub events for the given repositories */
58
- trigger(opts: { repos: Repos[]; eventTypes?: GitHubEventType[] }): TypedTrigger<GithubTrigger> {
59
- return new GitHubConfig("{{escape id}}", opts.repos.map(r => r.repositoryId), opts.eventTypes)
60
- },
61
- /** Use in `skills[]` */
62
- skill(opts: { repos: Repos[] }): TypedSkill<{{{skillToolType}}}> {
63
- return new GitHubConfig("{{escape id}}", opts.repos.map(r => r.repositoryId)) as TypedSkill<{{{skillToolType}}}>
64
- },
65
- }
66
-
@@ -1,11 +1,3 @@
1
1
  {{sectionHeader "LaunchDarkly"}}
2
2
 
3
3
  {{> resource-class projectClass}}
4
-
5
- export const LaunchDarkly = {
6
- /** Use in `skills[]` */
7
- skill(opts: { project: LaunchDarklyProject; environmentKeys: string[] }): TypedSkill<{{{skillToolType}}}> {
8
- return new LaunchDarklyConfig("{{escape id}}", opts.project.projectKey, opts.environmentKeys) as TypedSkill<{{{skillToolType}}}>
9
- },
10
- }
11
-
@@ -3,31 +3,3 @@
3
3
  {{> resource-class teamClass}}
4
4
 
5
5
  {{> resource-class projectClass}}
6
-
7
- export const Linear = {
8
- /** Trigger when a new issue is created. Optionally scope with `LinearTeam.*` / `LinearProject.*` (same idea as `Slack.onMessage` + `SlackChannel`). */
9
- onIssueCreated(opts?: { team?: LinearTeam; project?: LinearProject }): TypedTrigger<LinearIssueCreatedTrigger> {
10
- return new LinearInputConfig("{{escape id}}", opts?.project?.projectId ?? null, [LinearEventType.ISSUE_CREATED], opts?.team?.teamId ?? null)
11
- },
12
- /** Trigger when an issue is updated */
13
- onIssueUpdated(opts?: { team?: LinearTeam; project?: LinearProject }): TypedTrigger<LinearIssueUpdatedTrigger> {
14
- return new LinearInputConfig("{{escape id}}", opts?.project?.projectId ?? null, [LinearEventType.ISSUE_UPDATED], opts?.team?.teamId ?? null)
15
- },
16
- /** Trigger when a comment is added to an issue */
17
- onComment(opts?: { team?: LinearTeam; project?: LinearProject }): TypedTrigger<LinearCommentCreatedTrigger> {
18
- return new LinearInputConfig("{{escape id}}", opts?.project?.projectId ?? null, [LinearEventType.COMMENT_CREATED], opts?.team?.teamId ?? null)
19
- },
20
- /** Trigger on all Linear events */
21
- trigger(opts?: { team?: LinearTeam; project?: LinearProject; eventTypes?: LinearEventType[] }): TypedTrigger<LinearTrigger> {
22
- return new LinearInputConfig("{{escape id}}", opts?.project?.projectId ?? null, opts?.eventTypes, opts?.team?.teamId ?? null)
23
- },
24
- /** Use in `skills[]`. Pass `LinearTeam` / `LinearProject` like `Slack.skill` uses `SlackChannel`. */
25
- skill(opts?: { team?: LinearTeam; project?: LinearProject }): TypedSkill<{{{skillToolType}}}> {
26
- return new LinearOutputConfig(
27
- "{{escape id}}",
28
- opts?.team?.teamId ?? null,
29
- opts?.team?.name ?? null,
30
- opts?.project?.projectId ?? null
31
- ) as TypedSkill<{{{skillToolType}}}>
32
- },
33
- }
@@ -3,13 +3,3 @@
3
3
  {{> resource-class databaseClass}}
4
4
 
5
5
  {{> resource-class pageClass}}
6
-
7
- export const Notion = {
8
- /** Use in `skills[]` */
9
- skill(opts?: { databases?: NotionDatabase[]; pages?: NotionPage[] }): TypedSkill<{{{skillToolType}}}> {
10
- return new NotionConfig("{{escape id}}",
11
- opts?.databases?.map(d => d.databaseId), opts?.databases?.map(d => d.title),
12
- opts?.pages?.map(p => p.pageId), opts?.pages?.map(p => p.title)) as TypedSkill<{{{skillToolType}}}>
13
- },
14
- }
15
-
@@ -1,11 +1,3 @@
1
1
  {{sectionHeader "PostHog"}}
2
2
 
3
3
  {{> resource-class projectClass}}
4
-
5
- export const Posthog = {
6
- /** Use in `skills[]` */
7
- skill(opts: { project: PosthogProject }): TypedSkill<{{{skillToolType}}}> {
8
- return new PosthogConfig("{{escape id}}", opts.project.projectId, opts.project.name) as TypedSkill<{{{skillToolType}}}>
9
- },
10
- }
11
-
@@ -0,0 +1,95 @@
1
+ {{sectionHeader "Skills"}}
2
+
3
+ /**
4
+ * Skills available in your workspace.
5
+ *
6
+ * Type `Skills.` in your editor to see every connected integration's skill at a glance.
7
+ * Use these in `TerseAgent.create({ skills: [...] })`.
8
+ */
9
+ export const Skills = {
10
+ {{#if slack}}
11
+ /** Slack — send messages and manage threads in a specific channel */
12
+ slack(opts: { channel: SlackChannel; userIds?: string[]; userNames?: string[]; listenToUserDms?: boolean }): TypedSkill<{{{slack.skillToolType}}}> {
13
+ return new SlackOutputConfig("{{escape slack.id}}", opts.channel.channelId ?? null, opts.channel.name ?? null, opts.userIds ?? [], opts.userNames ?? null, opts.listenToUserDms)
14
+ },
15
+ {{/if}}
16
+ {{#if github}}
17
+ /** GitHub — read code and pull requests from the given repositories */
18
+ github(opts: { repos: Repos[] }): TypedSkill<{{{github.skillToolType}}}> {
19
+ return new GitHubConfig("{{escape github.id}}", opts.repos.map(r => r.repositoryId))
20
+ },
21
+ {{/if}}
22
+ {{#if linear}}
23
+ /** Linear — read and write issues, optionally scoped to a team or project */
24
+ linear(opts?: { team?: LinearTeam; project?: LinearProject }): TypedSkill<{{{linear.skillToolType}}}> {
25
+ return new LinearOutputConfig(
26
+ "{{escape linear.id}}",
27
+ opts?.team?.teamId ?? null,
28
+ opts?.team?.name ?? null,
29
+ opts?.project?.projectId ?? null
30
+ )
31
+ },
32
+ {{/if}}
33
+ {{#if gmail}}
34
+ /** Gmail — send emails */
35
+ gmail(): TypedSkill<{{{gmail.skillToolType}}}> {
36
+ return new GmailOutputConfig("{{escape gmail.id}}")
37
+ },
38
+ /** Gmail — create draft emails (no auto-send) */
39
+ gmailDraft(): TypedSkill<{{{gmail.skillToolType}}}> {
40
+ return new GmailDraftOutputConfig("{{escape gmail.id}}")
41
+ },
42
+ {{/if}}
43
+ {{#if notion}}
44
+ /** Notion — read and write to the given databases or pages */
45
+ notion(opts?: { databases?: NotionDatabase[]; pages?: NotionPage[] }): TypedSkill<{{{notion.skillToolType}}}> {
46
+ return new NotionConfig("{{escape notion.id}}",
47
+ opts?.databases?.map(d => d.databaseId), opts?.databases?.map(d => d.title),
48
+ opts?.pages?.map(p => p.pageId), opts?.pages?.map(p => p.title))
49
+ },
50
+ {{/if}}
51
+ {{#if posthog}}
52
+ /** PostHog — query analytics for a specific project */
53
+ posthog(opts: { project: PosthogProject }): TypedSkill<{{{posthog.skillToolType}}}> {
54
+ return new PosthogConfig("{{escape posthog.id}}", opts.project.projectId, opts.project.name)
55
+ },
56
+ {{/if}}
57
+ {{#if datadog}}
58
+ /** Datadog — search and analyze logs, optionally scoped to specific indexes */
59
+ datadog(opts?: { indexes?: DatadogIndex[] }): TypedSkill<{{{datadog.skillToolType}}}> {
60
+ return new DatadogConfig("{{escape datadog.id}}", opts?.indexes?.map(i => i.name))
61
+ },
62
+ {{/if}}
63
+ {{#if launchdarkly}}
64
+ /** LaunchDarkly — read and toggle feature flags in a project + environments */
65
+ launchDarkly(opts: { project: LaunchDarklyProject; environmentKeys: string[] }): TypedSkill<{{{launchdarkly.skillToolType}}}> {
66
+ return new LaunchDarklyConfig("{{escape launchdarkly.id}}", opts.project.projectKey, opts.environmentKeys)
67
+ },
68
+ {{/if}}
69
+ {{#if workos}}
70
+ /** WorkOS — manage users, organizations and invitations */
71
+ workOS(): TypedSkill<{{{workos.skillToolType}}}> {
72
+ return new WorkOSOutputConfig("{{escape workos.id}}")
73
+ },
74
+ {{/if}}
75
+ {{#if attio}}
76
+ /** Attio — query and upsert records on a CRM object */
77
+ attio(opts: { object: AttioObject<any> }): TypedSkill<{{{attio.skillToolType}}}> {
78
+ return new AttioOutputConfig("{{escape attio.id}}", opts.object.apiSlug)
79
+ },
80
+ {{/if}}
81
+ {{#if snowflake}}
82
+ /** Snowflake — run SQL queries against your warehouse */
83
+ snowflake(): TypedSkill<{{{snowflake.skillToolType}}}> {
84
+ return new SnowflakeOutputConfig("{{escape snowflake.id}}")
85
+ },
86
+ {{/if}}
87
+ /** Web — built-in web search, page extraction, and multi-source research */
88
+ web(): TypedSkill<"web_search" | "web_extract" | "web_research"> {
89
+ return new WebConfig()
90
+ },
91
+ /** ImageEdit — edit and generate images */
92
+ imageEdit(): TypedSkill<"image_edit"> {
93
+ return new ImageEditConfig()
94
+ },
95
+ }
@@ -1,30 +1,3 @@
1
1
  {{sectionHeader "Slack"}}
2
2
 
3
3
  {{> resource-class channelClass}}
4
-
5
- export const Slack = {
6
- /** Trigger on any message in a channel */
7
- onMessage(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<SlackMessageTrigger> {
8
- return new SlackConfig("{{escape id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds ?? [], [SlackEventType.MESSAGE])
9
- },
10
- /** Trigger on direct messages to the bot */
11
- onDm(opts?: { userIds?: string[] }): TypedTrigger<SlackMessageTrigger> {
12
- return new SlackConfig("{{escape id}}", undefined, undefined, true, opts?.userIds ?? [], [SlackEventType.MESSAGE])
13
- },
14
- /** Trigger when the Slack app is directly mentioned */
15
- onAppMention(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<SlackAppMentionTrigger> {
16
- return new SlackConfig("{{escape id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds ?? [], [SlackEventType.APP_MENTION])
17
- },
18
- /** Trigger when a reaction is added to a message in a channel */
19
- onReactionAdded(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<SlackReactionAddedTrigger> {
20
- return new SlackConfig("{{escape id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds ?? [], [SlackEventType.REACTION_ADDED])
21
- },
22
- /** Trigger on all Slack events (messages + DMs) for a channel */
23
- trigger(opts?: { channel?: SlackChannel; listenToUserDms?: boolean; userIds?: string[]; eventTypes?: SlackEventType[] }): TypedTrigger<SlackTrigger> {
24
- return new SlackConfig("{{escape id}}", opts?.channel?.channelId, opts?.channel?.name, opts?.listenToUserDms, opts?.userIds ?? [], opts?.eventTypes)
25
- },
26
- /** Use in `skills[]` */
27
- skill(opts: { channel: SlackChannel; userIds?: string[]; userNames?: string[]; listenToUserDms?: boolean }): TypedSkill<{{{skillToolType}}}> {
28
- return new SlackOutputConfig("{{escape id}}", opts.channel.channelId ?? null, opts.channel.name ?? null, opts.userIds ?? [], opts.userNames ?? null, opts.listenToUserDms)
29
- },
30
- }
@@ -0,0 +1,180 @@
1
+ {{sectionHeader "Triggers"}}
2
+
3
+ /**
4
+ * Triggers available in your workspace.
5
+ *
6
+ * Type `Triggers.` in your editor to see every connected integration with triggers.
7
+ * Use these in `createJob({ triggers: [...] })`.
8
+ */
9
+ export const Triggers = {
10
+ {{#if slack}}
11
+ slack: {
12
+ /** Trigger on any message in a channel */
13
+ onMessage(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<SlackMessageTrigger> {
14
+ return new SlackConfig("{{escape slack.id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds ?? [], [SlackEventType.MESSAGE])
15
+ },
16
+ /** Trigger on direct messages to the bot */
17
+ onDm(opts?: { userIds?: string[] }): TypedTrigger<SlackMessageTrigger> {
18
+ return new SlackConfig("{{escape slack.id}}", undefined, undefined, true, opts?.userIds ?? [], [SlackEventType.MESSAGE])
19
+ },
20
+ /** Trigger when the Slack app is directly mentioned */
21
+ onAppMention(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<SlackAppMentionTrigger> {
22
+ return new SlackConfig("{{escape slack.id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds ?? [], [SlackEventType.APP_MENTION])
23
+ },
24
+ /** Trigger when a reaction is added to a message in a channel */
25
+ onReactionAdded(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<SlackReactionAddedTrigger> {
26
+ return new SlackConfig("{{escape slack.id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds ?? [], [SlackEventType.REACTION_ADDED])
27
+ },
28
+ /** Trigger on all Slack events (messages + DMs) for a channel */
29
+ trigger(opts?: { channel?: SlackChannel; listenToUserDms?: boolean; userIds?: string[]; eventTypes?: SlackEventType[] }): TypedTrigger<SlackTrigger> {
30
+ return new SlackConfig("{{escape slack.id}}", opts?.channel?.channelId, opts?.channel?.name, opts?.listenToUserDms, opts?.userIds ?? [], opts?.eventTypes)
31
+ },
32
+ },
33
+ {{/if}}
34
+ {{#if github}}
35
+ github: {
36
+ /** Trigger on push to a repository */
37
+ onPush(opts: { repo: Repos }): TypedTrigger<GithubPushTrigger> {
38
+ return new GitHubConfig("{{escape github.id}}", [opts.repo.repositoryId], [GitHubEventType.PUSH])
39
+ },
40
+ /** Trigger when a pull request is opened */
41
+ onPROpened(opts: { repo: Repos }): TypedTrigger<GithubPROpenedTrigger> {
42
+ return new GitHubConfig("{{escape github.id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED])
43
+ },
44
+ /** Trigger when a pull request is merged */
45
+ onPRMerged(opts: { repo: Repos }): TypedTrigger<GithubPRMergedTrigger> {
46
+ return new GitHubConfig("{{escape github.id}}", [opts.repo.repositoryId], [GitHubEventType.PR_MERGED])
47
+ },
48
+ /** Trigger when a pull request is closed */
49
+ onPRClosed(opts: { repo: Repos }): TypedTrigger<GithubPRClosedTrigger> {
50
+ return new GitHubConfig("{{escape github.id}}", [opts.repo.repositoryId], [GitHubEventType.PR_CLOSED])
51
+ },
52
+ /** Trigger when a pull request is synchronized */
53
+ onPRSynchronized(opts: { repo: Repos }): TypedTrigger<GithubPRSynchronizedTrigger> {
54
+ return new GitHubConfig("{{escape github.id}}", [opts.repo.repositoryId], [GitHubEventType.PR_SYNCHRONIZE])
55
+ },
56
+ /** Trigger on any pull request event */
57
+ onPR(opts: { repo: Repos }): TypedTrigger<GithubPRTrigger> {
58
+ return new GitHubConfig("{{escape github.id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED, GitHubEventType.PR_MERGED, GitHubEventType.PR_CLOSED, GitHubEventType.PR_SYNCHRONIZE])
59
+ },
60
+ /** Trigger on specific GitHub events for the given repositories */
61
+ trigger(opts: { repos: Repos[]; eventTypes?: GitHubEventType[] }): TypedTrigger<GithubTrigger> {
62
+ return new GitHubConfig("{{escape github.id}}", opts.repos.map(r => r.repositoryId), opts.eventTypes)
63
+ },
64
+ },
65
+ {{/if}}
66
+ {{#if linear}}
67
+ linear: {
68
+ /** Trigger when a new issue is created. Optionally scope with `LinearTeam.*` / `LinearProject.*`. */
69
+ onIssueCreated(opts?: { team?: LinearTeam; project?: LinearProject }): TypedTrigger<LinearIssueCreatedTrigger> {
70
+ return new LinearInputConfig("{{escape linear.id}}", opts?.project?.projectId ?? null, [LinearEventType.ISSUE_CREATED], opts?.team?.teamId ?? null)
71
+ },
72
+ /** Trigger when an issue is updated */
73
+ onIssueUpdated(opts?: { team?: LinearTeam; project?: LinearProject }): TypedTrigger<LinearIssueUpdatedTrigger> {
74
+ return new LinearInputConfig("{{escape linear.id}}", opts?.project?.projectId ?? null, [LinearEventType.ISSUE_UPDATED], opts?.team?.teamId ?? null)
75
+ },
76
+ /** Trigger when a comment is added to an issue */
77
+ onComment(opts?: { team?: LinearTeam; project?: LinearProject }): TypedTrigger<LinearCommentCreatedTrigger> {
78
+ return new LinearInputConfig("{{escape linear.id}}", opts?.project?.projectId ?? null, [LinearEventType.COMMENT_CREATED], opts?.team?.teamId ?? null)
79
+ },
80
+ /** Trigger on all Linear events */
81
+ trigger(opts?: { team?: LinearTeam; project?: LinearProject; eventTypes?: LinearEventType[] }): TypedTrigger<LinearTrigger> {
82
+ return new LinearInputConfig("{{escape linear.id}}", opts?.project?.projectId ?? null, opts?.eventTypes, opts?.team?.teamId ?? null)
83
+ },
84
+ },
85
+ {{/if}}
86
+ {{#if gmail}}
87
+ gmail: {
88
+ /** Trigger when a new email is received */
89
+ onEmail(): TypedTrigger<GmailTrigger> {
90
+ return new GmailConfig("{{escape gmail.id}}", [GmailEventType.EMAIL_RECEIVED])
91
+ },
92
+ /** Trigger on all Gmail events */
93
+ trigger(opts?: { eventTypes?: GmailEventType[] }): TypedTrigger<GmailTrigger> {
94
+ return new GmailConfig("{{escape gmail.id}}", opts?.eventTypes)
95
+ },
96
+ },
97
+ {{/if}}
98
+ {{#if workos}}
99
+ workOS: {
100
+ /** Trigger on user creation */
101
+ onUserCreated(): TypedTrigger<WorkOSUserCreatedTrigger> {
102
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.USER_CREATED])
103
+ },
104
+ /** Trigger on user update */
105
+ onUserUpdated(): TypedTrigger<WorkOSUserUpdatedTrigger> {
106
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.USER_UPDATED])
107
+ },
108
+ /** Trigger on user deletion */
109
+ onUserDeleted(): TypedTrigger<WorkOSUserDeletedTrigger> {
110
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.USER_DELETED])
111
+ },
112
+ /** Trigger on organization membership creation */
113
+ onMembershipCreated(): TypedTrigger<WorkOSOrganizationMembershipCreatedTrigger> {
114
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED])
115
+ },
116
+ /** Trigger on organization membership update */
117
+ onMembershipUpdated(): TypedTrigger<WorkOSOrganizationMembershipUpdatedTrigger> {
118
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED])
119
+ },
120
+ /** Trigger on organization membership deletion */
121
+ onMembershipDeleted(): TypedTrigger<WorkOSOrganizationMembershipDeletedTrigger> {
122
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED])
123
+ },
124
+ /** Trigger on any organization membership change */
125
+ onMembershipChanged(): TypedTrigger<WorkOSMembershipTrigger> {
126
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED])
127
+ },
128
+ /** Trigger when an invitation is sent (created or resent) */
129
+ onInvitationSent(): TypedTrigger<WorkOSInvitationTrigger> {
130
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.INVITATION_CREATED, WorkOSEventType.INVITATION_RESENT])
131
+ },
132
+ /** Trigger when an invitation is first created */
133
+ onInvitationCreated(): TypedTrigger<WorkOSInvitationCreatedTrigger> {
134
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.INVITATION_CREATED])
135
+ },
136
+ /** Trigger when an invitation is resent */
137
+ onInvitationResent(): TypedTrigger<WorkOSInvitationResentTrigger> {
138
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.INVITATION_RESENT])
139
+ },
140
+ /** Trigger on invitation accepted */
141
+ onInvitationAccepted(): TypedTrigger<WorkOSInvitationAcceptedTrigger> {
142
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.INVITATION_ACCEPTED])
143
+ },
144
+ /** Trigger when an invitation is revoked */
145
+ onInvitationRevoked(): TypedTrigger<WorkOSInvitationRevokedTrigger> {
146
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.INVITATION_REVOKED])
147
+ },
148
+ /** Trigger on organization creation */
149
+ onOrganizationCreated(): TypedTrigger<WorkOSOrganizationTrigger> {
150
+ return new WorkOSInputConfig("{{escape workos.id}}", [WorkOSEventType.ORGANIZATION_CREATED])
151
+ },
152
+ /** Trigger on specific WorkOS event types */
153
+ trigger(opts?: { eventTypes?: WorkOSEventType[] }): TypedTrigger<WorkOSTrigger | WorkOSUserTrigger | WorkOSMembershipTrigger | WorkOSInvitationTrigger | WorkOSOrganizationTrigger> {
154
+ return new WorkOSInputConfig("{{escape workos.id}}", opts?.eventTypes)
155
+ },
156
+ },
157
+ {{/if}}
158
+ schedule: {
159
+ /** Run on a cron schedule */
160
+ cron(opts: { expression: string }): TypedTrigger<CronTrigger> {
161
+ return new TimeTriggerConfig(opts.expression)
162
+ },
163
+ },
164
+ webhook: {
165
+ /** Trigger via an external HTTP request to a generated URL */
166
+ onRequest<TBody = unknown>(): TypedTrigger<WebhookTrigger<TBody>> {
167
+ return new WebhookInputConfig()
168
+ },
169
+ },
170
+ webMonitor: {
171
+ /** Trigger when a query against the live web matches the given schema */
172
+ onEvent<const TSchema>(opts: {
173
+ query: string
174
+ frequency: { number: number; unit: FrequencyUnit }
175
+ outputSchema?: TSchema
176
+ }): TypedTrigger<WebMonitorTrigger<InferStructuredOutput<TSchema>>> {
177
+ return new WebMonitorConfig(opts.query, opts.frequency, opts.outputSchema)
178
+ },
179
+ },
180
+ }
@@ -1,13 +1,13 @@
1
1
  import { createJob, TerseAgent, type GithubPRTrigger } from "terse-sdk"
2
- import { GitHub, Repos, Slack, SlackChannel } from "./terse.generated"
2
+ import { Repos, Skills, SlackChannel, Triggers } from "./terse.generated"
3
3
 
4
4
  createJob({
5
5
  name: "Summarize PR and send slack message",
6
- triggers: [GitHub.onPROpened({ repo: Repos.TerseAI.Terse })],
6
+ triggers: [Triggers.github.onPROpened({ repo: Repos.TerseAI.Terse })],
7
7
  onTrigger: async (event: GithubPRTrigger) => {
8
8
  const agent = TerseAgent.create({
9
9
  prompt: "You summarise GitHub pull requests and post concise updates to Slack.",
10
- skills: [GitHub.skill({ repos: [Repos.TerseAI.LandingPage, Repos.TerseAI.Terse] }), Slack.skill({ channel: SlackChannel.AllTerseInc })]
10
+ skills: [Skills.github({ repos: [Repos.TerseAI.LandingPage, Repos.TerseAI.Terse] }), Skills.slack({ channel: SlackChannel.AllTerseInc })]
11
11
  })
12
12
 
13
13
  const message = await agent.tools.slack.sendMessage({
@@ -1,21 +0,0 @@
1
- {{sectionHeader "Gmail"}}
2
-
3
- export const Gmail = {
4
- /** Trigger when a new email is received */
5
- onEmail(): TypedTrigger<GmailTrigger> {
6
- return new GmailConfig("{{escape id}}", [GmailEventType.EMAIL_RECEIVED])
7
- },
8
- /** Trigger on all Gmail events */
9
- trigger(opts?: { eventTypes?: GmailEventType[] }): TypedTrigger<GmailTrigger> {
10
- return new GmailConfig("{{escape id}}", opts?.eventTypes)
11
- },
12
- /** Use in `skills[]` */
13
- skill(): TypedSkill<{{{skillToolType}}}> {
14
- return new GmailOutputConfig("{{escape id}}") as TypedSkill<{{{skillToolType}}}>
15
- },
16
- /** Use in `skills[]` — creates draft emails */
17
- draftSkill(): TypedSkill<{{{skillToolType}}}> {
18
- return new GmailDraftOutputConfig("{{escape id}}") as TypedSkill<{{{skillToolType}}}>
19
- },
20
- }
21
-
@@ -1,9 +0,0 @@
1
- {{sectionHeader "Snowflake"}}
2
-
3
- export const Snowflake = {
4
- /** Use in `skills[]` */
5
- skill(): TypedSkill<{{{skillToolType}}}> {
6
- return new SnowflakeOutputConfig("{{escape id}}") as TypedSkill<{{{skillToolType}}}>
7
- },
8
- }
9
-
@@ -1,45 +0,0 @@
1
- {{sectionHeader "Schedule"}}
2
-
3
- export const Schedule = {
4
- /** Use in `triggers[]` — run on a cron schedule */
5
- cron(opts: { expression: string }): TypedTrigger<CronTrigger> {
6
- return new TimeTriggerConfig(opts.expression)
7
- },
8
- }
9
-
10
- {{sectionHeader "Webhook"}}
11
-
12
- export const Webhook = {
13
- /** Use in `triggers[]` — trigger via an external HTTP request to a generated URL */
14
- onRequest<TBody = unknown>(): TypedTrigger<WebhookTrigger<TBody>> {
15
- return new WebhookInputConfig()
16
- },
17
- }
18
-
19
- {{sectionHeader "WebMonitor"}}
20
-
21
- export const WebMonitor = {
22
- onEvent<const TSchema>(opts: {
23
- query: string
24
- frequency: { number: number; unit: FrequencyUnit }
25
- outputSchema?: TSchema
26
- }): TypedTrigger<WebMonitorTrigger<InferStructuredOutput<TSchema>>> {
27
- return new WebMonitorConfig(opts.query, opts.frequency, opts.outputSchema)
28
- },
29
- }
30
-
31
- {{sectionHeader "Web tools"}}
32
-
33
- export const Web = {
34
- /** Use in `skills[]` — built-in web search, page extraction, and multi-source research */
35
- skill(): TypedSkill<"web_search" | "web_extract" | "web_research"> {
36
- return new WebConfig() as TypedSkill<"web_search" | "web_extract" | "web_research">
37
- },
38
- }
39
-
40
- export const ImageEdit = {
41
- /** Use in `skills[]` — edit/generate images */
42
- skill(): TypedSkill<"image_edit"> {
43
- return new ImageEditConfig() as TypedSkill<"image_edit">
44
- },
45
- }
@@ -1,65 +0,0 @@
1
- {{sectionHeader "WorkOS"}}
2
-
3
- export const WorkOS = {
4
- /** Trigger on user creation */
5
- onUserCreated(): TypedTrigger<WorkOSUserCreatedTrigger> {
6
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_CREATED])
7
- },
8
- /** Trigger on user update */
9
- onUserUpdated(): TypedTrigger<WorkOSUserUpdatedTrigger> {
10
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_UPDATED])
11
- },
12
- /** Trigger on user deletion */
13
- onUserDeleted(): TypedTrigger<WorkOSUserDeletedTrigger> {
14
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_DELETED])
15
- },
16
- /** Trigger on organization membership creation */
17
- onMembershipCreated(): TypedTrigger<WorkOSOrganizationMembershipCreatedTrigger> {
18
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED])
19
- },
20
- /** Trigger on organization membership update */
21
- onMembershipUpdated(): TypedTrigger<WorkOSOrganizationMembershipUpdatedTrigger> {
22
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED])
23
- },
24
- /** Trigger on organization membership deletion */
25
- onMembershipDeleted(): TypedTrigger<WorkOSOrganizationMembershipDeletedTrigger> {
26
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED])
27
- },
28
- /** Trigger on organization membership change */
29
- onMembershipChanged(): TypedTrigger<WorkOSMembershipTrigger> {
30
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED])
31
- },
32
- /** Trigger when an invitation is sent */
33
- onInvitationSent(): TypedTrigger<WorkOSInvitationTrigger> {
34
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED, WorkOSEventType.INVITATION_RESENT])
35
- },
36
- /** Trigger when an invitation is first created */
37
- onInvitationCreated(): TypedTrigger<WorkOSInvitationCreatedTrigger> {
38
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED])
39
- },
40
- /** Trigger when an invitation is resent */
41
- onInvitationResent(): TypedTrigger<WorkOSInvitationResentTrigger> {
42
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_RESENT])
43
- },
44
- /** Trigger on invitation accepted */
45
- onInvitationAccepted(): TypedTrigger<WorkOSInvitationAcceptedTrigger> {
46
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_ACCEPTED])
47
- },
48
- /** Trigger when an invitation is revoked */
49
- onInvitationRevoked(): TypedTrigger<WorkOSInvitationRevokedTrigger> {
50
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_REVOKED])
51
- },
52
- /** Trigger on organization creation */
53
- onOrganizationCreated(): TypedTrigger<WorkOSOrganizationTrigger> {
54
- return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_CREATED])
55
- },
56
- /** Trigger on specific WorkOS event types */
57
- trigger(opts?: { eventTypes?: WorkOSEventType[] }): TypedTrigger<WorkOSTrigger | WorkOSUserTrigger | WorkOSMembershipTrigger | WorkOSInvitationTrigger | WorkOSOrganizationTrigger> {
58
- return new WorkOSInputConfig("{{escape id}}", opts?.eventTypes)
59
- },
60
- /** Use in `skills[]` */
61
- skill(): TypedSkill<{{{skillToolType}}}> {
62
- return new WorkOSOutputConfig("{{escape id}}") as TypedSkill<{{{skillToolType}}}>
63
- },
64
- }
65
-