terse-cli 0.1.19 → 0.1.20
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/README.md +15 -0
- package/dist/api.d.ts +3 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +16 -6
- package/dist/api.js.map +1 -1
- package/dist/assertProjectRoot.d.ts +4 -1
- package/dist/assertProjectRoot.d.ts.map +1 -1
- package/dist/assertProjectRoot.js +3 -3
- package/dist/assertProjectRoot.js.map +1 -1
- package/dist/attach.d.ts +3 -0
- package/dist/attach.d.ts.map +1 -0
- package/dist/attach.js +61 -0
- package/dist/attach.js.map +1 -0
- package/dist/auth.d.ts +1 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +29 -18
- package/dist/auth.js.map +1 -1
- package/dist/deploy.d.ts +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +35 -10
- package/dist/deploy.js.map +1 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +7 -39
- package/dist/generate.js.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +11 -1
- package/dist/init.js.map +1 -1
- package/dist/loadJob.d.ts +2 -2
- package/dist/loadJob.d.ts.map +1 -1
- package/dist/loadJob.js +11 -5
- package/dist/loadJob.js.map +1 -1
- package/dist/promptErrors.d.ts +2 -0
- package/dist/promptErrors.d.ts.map +1 -0
- package/dist/promptErrors.js +8 -0
- package/dist/promptErrors.js.map +1 -0
- package/dist/providers/LanguageProvider.d.ts +8 -2
- package/dist/providers/LanguageProvider.d.ts.map +1 -1
- package/dist/providers/codegenTypes.d.ts +6 -16
- package/dist/providers/codegenTypes.d.ts.map +1 -1
- package/dist/providers/fetchSdkVersion.d.ts +4 -0
- package/dist/providers/fetchSdkVersion.d.ts.map +1 -0
- package/dist/providers/fetchSdkVersion.js +24 -0
- package/dist/providers/fetchSdkVersion.js.map +1 -0
- package/dist/providers/python/PythonProvider.d.ts +20 -2
- package/dist/providers/python/PythonProvider.d.ts.map +1 -1
- package/dist/providers/python/PythonProvider.js +65 -28
- package/dist/providers/python/PythonProvider.js.map +1 -1
- package/dist/providers/python/preparePythonCodegenData.d.ts +50 -0
- package/dist/providers/python/preparePythonCodegenData.d.ts.map +1 -1
- package/dist/providers/python/preparePythonCodegenData.js +100 -7
- package/dist/providers/python/preparePythonCodegenData.js.map +1 -1
- package/dist/providers/resolveProvider.js +2 -2
- package/dist/providers/resolveProvider.js.map +1 -1
- package/dist/providers/shared/entryFileGuidance.d.ts +10 -0
- package/dist/providers/shared/entryFileGuidance.d.ts.map +1 -0
- package/dist/providers/shared/entryFileGuidance.js +20 -0
- package/dist/providers/shared/entryFileGuidance.js.map +1 -0
- package/dist/providers/shared/sessionStream.d.ts +4 -11
- package/dist/providers/shared/sessionStream.d.ts.map +1 -1
- package/dist/providers/shared/sessionStream.js +13 -68
- package/dist/providers/shared/sessionStream.js.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.d.ts +9 -3
- package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.js +43 -22
- package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
- package/dist/providers/typescript/prepareCodegenData.d.ts +1 -11
- package/dist/providers/typescript/prepareCodegenData.d.ts.map +1 -1
- package/dist/providers/typescript/prepareCodegenData.js +47 -50
- package/dist/providers/typescript/prepareCodegenData.js.map +1 -1
- package/dist/run.d.ts +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +8 -8
- package/dist/run.js.map +1 -1
- package/dist/test.d.ts +1 -1
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +26 -14
- package/dist/test.js.map +1 -1
- package/dist/util.d.ts +2 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +3 -3
- package/dist/util.js.map +1 -1
- package/package.json +3 -3
- package/templates/python/codegen/generated.hbs +5 -0
- package/templates/python/codegen/partials/github-section.hbs +149 -0
- package/templates/python/codegen/partials/gmail-section.hbs +30 -0
- package/templates/python/codegen/partials/linear-section.hbs +229 -0
- package/templates/python/codegen/partials/schedule-section.hbs +8 -2
- package/templates/python/codegen/partials/slack-section.hbs +110 -22
- package/templates/python/codegen/partials/webhook-section.hbs +15 -0
- package/templates/python/codegen/partials/workos-section.hbs +149 -0
- package/templates/python/init/README.md.hbs +5 -3
- package/templates/python/init/src/main.py.hbs +10 -13
- package/templates/typescript/codegen/generated.hbs +0 -2
- package/templates/typescript/codegen/partials/github-section.hbs +16 -12
- package/templates/typescript/codegen/partials/gmail-section.hbs +2 -2
- package/templates/typescript/codegen/partials/linear-section.hbs +19 -13
- package/templates/typescript/codegen/partials/slack-section.hbs +15 -7
- package/templates/typescript/codegen/partials/system-section.hbs +4 -4
- package/templates/typescript/codegen/partials/workos-section.hbs +34 -22
- package/templates/typescript/init/package.json.hbs +1 -1
- package/templates/typescript/init/src/{index.ts.hbs → terse.jobs.ts.hbs} +2 -2
- package/templates/typescript/codegen/partials/atlassian-section.hbs +0 -32
- package/templates/typescript/codegen/partials/figma-section.hbs +0 -13
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{{~#if workos}}
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# === WorkOS ===
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class WorkOS:
|
|
8
|
+
@staticmethod
|
|
9
|
+
def on_user_created() -> TriggerConfig[WorkOSUserCreatedTrigger]:
|
|
10
|
+
return TriggerConfig(
|
|
11
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
12
|
+
integration_type='workos',
|
|
13
|
+
config_type='workos_input',
|
|
14
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.user_created]),
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
@staticmethod
|
|
18
|
+
def on_user_updated() -> TriggerConfig[WorkOSUserUpdatedTrigger]:
|
|
19
|
+
return TriggerConfig(
|
|
20
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
21
|
+
integration_type='workos',
|
|
22
|
+
config_type='workos_input',
|
|
23
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.user_updated]),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def on_user_deleted() -> TriggerConfig[WorkOSUserDeletedTrigger]:
|
|
28
|
+
return TriggerConfig(
|
|
29
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
30
|
+
integration_type='workos',
|
|
31
|
+
config_type='workos_input',
|
|
32
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.user_deleted]),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
@staticmethod
|
|
36
|
+
def on_membership_created() -> TriggerConfig[WorkOSOrganizationMembershipCreatedTrigger]:
|
|
37
|
+
return TriggerConfig(
|
|
38
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
39
|
+
integration_type='workos',
|
|
40
|
+
config_type='workos_input',
|
|
41
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.organization_membership_created]),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
@staticmethod
|
|
45
|
+
def on_membership_updated() -> TriggerConfig[WorkOSOrganizationMembershipUpdatedTrigger]:
|
|
46
|
+
return TriggerConfig(
|
|
47
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
48
|
+
integration_type='workos',
|
|
49
|
+
config_type='workos_input',
|
|
50
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.organization_membership_updated]),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def on_membership_deleted() -> TriggerConfig[WorkOSOrganizationMembershipDeletedTrigger]:
|
|
55
|
+
return TriggerConfig(
|
|
56
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
57
|
+
integration_type='workos',
|
|
58
|
+
config_type='workos_input',
|
|
59
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.organization_membership_deleted]),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def on_membership_changed() -> TriggerConfig[WorkOSMembershipTrigger]:
|
|
64
|
+
return TriggerConfig(
|
|
65
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
66
|
+
integration_type='workos',
|
|
67
|
+
config_type='workos_input',
|
|
68
|
+
config=_compact_dict(
|
|
69
|
+
eventTypes=[
|
|
70
|
+
WorkOSEventType.organization_membership_created,
|
|
71
|
+
WorkOSEventType.organization_membership_updated,
|
|
72
|
+
WorkOSEventType.organization_membership_deleted,
|
|
73
|
+
],
|
|
74
|
+
),
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def on_invitation_sent() -> TriggerConfig[WorkOSInvitationTrigger]:
|
|
79
|
+
return TriggerConfig(
|
|
80
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
81
|
+
integration_type='workos',
|
|
82
|
+
config_type='workos_input',
|
|
83
|
+
config=_compact_dict(
|
|
84
|
+
eventTypes=[
|
|
85
|
+
WorkOSEventType.invitation_created,
|
|
86
|
+
WorkOSEventType.invitation_resent,
|
|
87
|
+
],
|
|
88
|
+
),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def on_invitation_created() -> TriggerConfig[WorkOSInvitationCreatedTrigger]:
|
|
93
|
+
return TriggerConfig(
|
|
94
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
95
|
+
integration_type='workos',
|
|
96
|
+
config_type='workos_input',
|
|
97
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.invitation_created]),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
@staticmethod
|
|
101
|
+
def on_invitation_resent() -> TriggerConfig[WorkOSInvitationResentTrigger]:
|
|
102
|
+
return TriggerConfig(
|
|
103
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
104
|
+
integration_type='workos',
|
|
105
|
+
config_type='workos_input',
|
|
106
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.invitation_resent]),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def on_invitation_accepted() -> TriggerConfig[WorkOSInvitationAcceptedTrigger]:
|
|
111
|
+
return TriggerConfig(
|
|
112
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
113
|
+
integration_type='workos',
|
|
114
|
+
config_type='workos_input',
|
|
115
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.invitation_accepted]),
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
@staticmethod
|
|
119
|
+
def on_invitation_revoked() -> TriggerConfig[WorkOSInvitationRevokedTrigger]:
|
|
120
|
+
return TriggerConfig(
|
|
121
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
122
|
+
integration_type='workos',
|
|
123
|
+
config_type='workos_input',
|
|
124
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.invitation_revoked]),
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
@staticmethod
|
|
128
|
+
def on_organization_created() -> TriggerConfig[WorkOSOrganizationTrigger]:
|
|
129
|
+
return TriggerConfig(
|
|
130
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
131
|
+
integration_type='workos',
|
|
132
|
+
config_type='workos_input',
|
|
133
|
+
config=_compact_dict(eventTypes=[WorkOSEventType.organization_created]),
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def trigger(
|
|
138
|
+
*,
|
|
139
|
+
event_types: Sequence[WorkOSEventType] | None = None,
|
|
140
|
+
) -> TriggerConfig[WorkOSTrigger]:
|
|
141
|
+
return TriggerConfig(
|
|
142
|
+
integration_id={{{workos.instanceIdRepr}}},
|
|
143
|
+
integration_type='workos',
|
|
144
|
+
config_type='workos_input',
|
|
145
|
+
config=_compact_dict(
|
|
146
|
+
eventTypes=list(event_types) if event_types is not None else None,
|
|
147
|
+
),
|
|
148
|
+
)
|
|
149
|
+
{{~/if}}
|
|
@@ -25,11 +25,11 @@ Edit `src/main.py` to register jobs with `@app.job(...)`.
|
|
|
25
25
|
|
|
26
26
|
## Generated Helpers
|
|
27
27
|
|
|
28
|
-
The starter scaffold
|
|
28
|
+
The starter scaffold shows generated `GitHub` trigger/skill helpers alongside `Slack.skill(...)`.
|
|
29
29
|
|
|
30
|
-
After you connect Attio, Slack, or Snowflake in Terse, rerun `terse generate` to refresh `src/terse_generated.py` with the real integration IDs, generated resources, and deterministic tool wrappers.
|
|
30
|
+
After you connect GitHub, Attio, Slack, or Snowflake in Terse, rerun `terse generate` to refresh `src/terse_generated.py` with the real integration IDs, generated resources, and deterministic tool wrappers.
|
|
31
31
|
|
|
32
|
-
Import helpers like `Attio`, `AttioObject`, `Schedule`, `Slack`, `SlackChannel`, `Snowflake`, and `TerseAgent` from `terse_generated`.
|
|
32
|
+
Import helpers like `GitHub`, `GitHubRepo`, `Attio`, `AttioObject`, `Schedule`, `Slack`, `SlackChannel`, `Snowflake`, and `TerseAgent` from `terse_generated`.
|
|
33
33
|
|
|
34
34
|
If a job includes the integration in `triggers=` or `skills=`, it can call deterministic wrappers like:
|
|
35
35
|
|
|
@@ -38,3 +38,5 @@ agent.tools.snowflake.execute_query(query="select 1")
|
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Use `agent.tools.slack.*` for direct deterministic Slack calls. Use `skills=[Slack.skill(...)]` when you want Slack to be visible to the model during `run()` or `run_and_wait()`.
|
|
41
|
+
|
|
42
|
+
Use `skills=[GitHub.skill(repos=[...])]` when you want repo-scoped GitHub tools to be visible to the model during `run()` or `run_and_wait()`. This does not add deterministic `agent.tools.github.*` wrappers.
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
from terse_sdk import
|
|
2
|
-
from
|
|
1
|
+
from terse_sdk import Terse, TerseAgent
|
|
2
|
+
from terse_sdk.types.events import GithubPRTrigger
|
|
3
|
+
|
|
4
|
+
from terse_generated import GitHub, GitHubRepo, Slack, SlackChannel
|
|
3
5
|
|
|
4
6
|
app = Terse()
|
|
5
7
|
|
|
6
8
|
@app.job(
|
|
7
9
|
name="{{projectName}}",
|
|
8
|
-
triggers=[
|
|
10
|
+
triggers=[GitHub.on_pr(repo=GitHubRepo.Terse)],
|
|
9
11
|
skills=[
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
GitHub.skill(repos=[GitHubRepo.Terse]),
|
|
13
|
+
Slack.skill(channel=SlackChannel.AllTerseInc),
|
|
12
14
|
],
|
|
13
15
|
)
|
|
14
|
-
def run_job(event:
|
|
15
|
-
prompt =
|
|
16
|
-
|
|
17
|
-
f"Context: {event.formatted_content}"
|
|
18
|
-
)
|
|
19
|
-
for stream_event in agent.run(prompt, event):
|
|
20
|
-
if isinstance(stream_event, SdkAgentStreamEventFinalOutput):
|
|
21
|
-
print(stream_event.final_output)
|
|
16
|
+
def run_job(event: GithubPRTrigger, agent: TerseAgent, /) -> None:
|
|
17
|
+
prompt = f"Summarise the PR and send a message to slack: {event.formatted_content}"
|
|
18
|
+
agent.run_and_wait(prompt, event)
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
{{#if github}}{{> github-section github}}{{/if~}}
|
|
4
4
|
{{#if gmail}}{{> gmail-section gmail}}{{/if~}}
|
|
5
5
|
{{#if slack}}{{> slack-section slack}}{{/if~}}
|
|
6
|
-
{{#if figma}}{{> figma-section figma}}{{/if~}}
|
|
7
6
|
{{#if linear}}{{> linear-section linear}}{{/if~}}
|
|
8
|
-
{{#if atlassian}}{{> atlassian-section atlassian}}{{/if~}}
|
|
9
7
|
{{#if notion}}{{> notion-section notion}}{{/if~}}
|
|
10
8
|
{{#if posthog}}{{> posthog-section posthog}}{{/if~}}
|
|
11
9
|
{{#if datadog}}{{> datadog-section datadog}}{{/if~}}
|
|
@@ -31,28 +31,32 @@ export class Repos {
|
|
|
31
31
|
|
|
32
32
|
export const GitHub = {
|
|
33
33
|
/** Trigger on push to a repository */
|
|
34
|
-
onPush(opts: { repo: Repos }): TypedTrigger<
|
|
35
|
-
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PUSH])
|
|
34
|
+
onPush(opts: { repo: Repos }): TypedTrigger<GithubPushTrigger> {
|
|
35
|
+
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PUSH])
|
|
36
36
|
},
|
|
37
37
|
/** Trigger when a pull request is opened */
|
|
38
|
-
onPROpened(opts: { repo: Repos }): TypedTrigger<
|
|
39
|
-
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED])
|
|
38
|
+
onPROpened(opts: { repo: Repos }): TypedTrigger<GithubPROpenedTrigger> {
|
|
39
|
+
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED])
|
|
40
40
|
},
|
|
41
41
|
/** Trigger when a pull request is merged */
|
|
42
|
-
onPRMerged(opts: { repo: Repos }): TypedTrigger<
|
|
43
|
-
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_MERGED])
|
|
42
|
+
onPRMerged(opts: { repo: Repos }): TypedTrigger<GithubPRMergedTrigger> {
|
|
43
|
+
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_MERGED])
|
|
44
44
|
},
|
|
45
45
|
/** Trigger when a pull request is closed */
|
|
46
|
-
onPRClosed(opts: { repo: Repos }): TypedTrigger<
|
|
47
|
-
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_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])
|
|
48
52
|
},
|
|
49
53
|
/** Trigger on any pull request event */
|
|
50
|
-
onPR(opts: { repo: Repos }): TypedTrigger<
|
|
51
|
-
return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED, GitHubEventType.PR_MERGED, GitHubEventType.PR_CLOSED, GitHubEventType.PR_SYNCHRONIZE])
|
|
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])
|
|
52
56
|
},
|
|
53
57
|
/** Trigger on specific GitHub events for the given repositories */
|
|
54
|
-
trigger(opts: { repos: Repos[]; eventTypes?: GitHubEventType[] }): TypedTrigger<
|
|
55
|
-
return new GitHubConfig("{{escape id}}", opts.repos.map(r => r.repositoryId), opts.eventTypes)
|
|
58
|
+
trigger(opts: { repos: Repos[]; eventTypes?: GitHubEventType[] }): TypedTrigger<GithubTrigger> {
|
|
59
|
+
return new GitHubConfig("{{escape id}}", opts.repos.map(r => r.repositoryId), opts.eventTypes)
|
|
56
60
|
},
|
|
57
61
|
/** Use in `skills[]` */
|
|
58
62
|
skill(opts: { repos: Repos[] }): TypedSkill<{{{skillToolType}}}> {
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
export const Gmail = {
|
|
4
4
|
/** Trigger when a new email is received */
|
|
5
|
-
onEmail():
|
|
5
|
+
onEmail(): TypedTrigger<GmailTrigger> {
|
|
6
6
|
return new GmailConfig("{{escape id}}", [GmailEventType.EMAIL_RECEIVED])
|
|
7
7
|
},
|
|
8
8
|
/** Trigger on all Gmail events */
|
|
9
|
-
trigger(opts?: { eventTypes?: GmailEventType[] }):
|
|
9
|
+
trigger(opts?: { eventTypes?: GmailEventType[] }): TypedTrigger<GmailTrigger> {
|
|
10
10
|
return new GmailConfig("{{escape id}}", opts?.eventTypes)
|
|
11
11
|
},
|
|
12
12
|
/** Use in `skills[]` */
|
|
@@ -2,26 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
{{> resource-class teamClass}}
|
|
4
4
|
|
|
5
|
+
{{> resource-class projectClass}}
|
|
6
|
+
|
|
5
7
|
export const Linear = {
|
|
6
|
-
/** Trigger when a new issue is created */
|
|
7
|
-
onIssueCreated(opts?: {
|
|
8
|
-
return new LinearInputConfig("{{escape id}}", opts?.projectId
|
|
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)
|
|
9
11
|
},
|
|
10
12
|
/** Trigger when an issue is updated */
|
|
11
|
-
onIssueUpdated(opts?: {
|
|
12
|
-
return new LinearInputConfig("{{escape id}}", opts?.projectId
|
|
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)
|
|
13
15
|
},
|
|
14
16
|
/** Trigger when a comment is added to an issue */
|
|
15
|
-
onComment(opts?: {
|
|
16
|
-
return new LinearInputConfig("{{escape id}}", opts?.projectId
|
|
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)
|
|
17
19
|
},
|
|
18
20
|
/** Trigger on all Linear events */
|
|
19
|
-
trigger(opts?: {
|
|
20
|
-
return new LinearInputConfig("{{escape id}}", opts?.projectId, opts?.
|
|
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)
|
|
21
23
|
},
|
|
22
|
-
/** Use in `skills[]` */
|
|
23
|
-
skill(opts?: { team?: LinearTeam;
|
|
24
|
-
return new LinearOutputConfig(
|
|
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}}}>
|
|
25
32
|
},
|
|
26
33
|
}
|
|
27
|
-
|
|
@@ -4,19 +4,27 @@
|
|
|
4
4
|
|
|
5
5
|
export const Slack = {
|
|
6
6
|
/** Trigger on any message in a channel */
|
|
7
|
-
onMessage(opts: { channel: SlackChannel; userIds?: string[] }): TypedTrigger<
|
|
8
|
-
return new SlackConfig("{{escape id}}", opts.channel.channelId, opts.channel.name, false, opts.userIds, [SlackEventType.MESSAGE])
|
|
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
9
|
},
|
|
10
10
|
/** Trigger on direct messages to the bot */
|
|
11
|
-
onDm(opts?: { userIds?: string[] }): TypedTrigger<
|
|
12
|
-
return new SlackConfig("{{escape id}}", undefined, undefined, true, opts?.userIds, [SlackEventType.MESSAGE])
|
|
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])
|
|
13
21
|
},
|
|
14
22
|
/** Trigger on all Slack events (messages + DMs) for a channel */
|
|
15
|
-
trigger(opts?: { channel?: SlackChannel; listenToUserDms?: boolean; userIds?: string[]; eventTypes?: SlackEventType[] }): TypedTrigger<
|
|
16
|
-
return new SlackConfig("{{escape id}}", opts?.channel?.channelId, opts?.channel?.name, opts?.listenToUserDms, opts?.userIds, opts?.eventTypes)
|
|
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)
|
|
17
25
|
},
|
|
18
26
|
/** Use in `skills[]` */
|
|
19
27
|
skill(opts: { channel: SlackChannel; userIds?: string[]; userNames?: string[]; listenToUserDms?: boolean }): TypedSkill<{{{skillToolType}}}> {
|
|
20
|
-
return new SlackOutputConfig("{{escape id}}", opts.channel.channelId ?? null, opts.channel.name ?? null, opts.userIds ??
|
|
28
|
+
return new SlackOutputConfig("{{escape id}}", opts.channel.channelId ?? null, opts.channel.name ?? null, opts.userIds ?? [], opts.userNames ?? null, opts.listenToUserDms)
|
|
21
29
|
},
|
|
22
30
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
export const Schedule = {
|
|
4
4
|
/** Use in `triggers[]` — run on a cron schedule */
|
|
5
|
-
cron(opts: { expression: string }):
|
|
6
|
-
return new TimeTriggerConfig(opts.expression)
|
|
5
|
+
cron(opts: { expression: string }): TypedTrigger<CronTrigger> {
|
|
6
|
+
return new TimeTriggerConfig(opts.expression)
|
|
7
7
|
},
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -11,8 +11,8 @@ export const Schedule = {
|
|
|
11
11
|
|
|
12
12
|
export const Webhook = {
|
|
13
13
|
/** Use in `triggers[]` — trigger via an external HTTP request to a generated URL */
|
|
14
|
-
onRequest(): TypedTrigger<
|
|
15
|
-
return new WebhookInputConfig()
|
|
14
|
+
onRequest(): TypedTrigger<WebhookTrigger> {
|
|
15
|
+
return new WebhookInputConfig()
|
|
16
16
|
},
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -2,48 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
export const WorkOS = {
|
|
4
4
|
/** Trigger on user creation */
|
|
5
|
-
onUserCreated(): TypedTrigger<
|
|
6
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_CREATED])
|
|
5
|
+
onUserCreated(): TypedTrigger<WorkOSUserCreatedTrigger> {
|
|
6
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_CREATED])
|
|
7
7
|
},
|
|
8
8
|
/** Trigger on user update */
|
|
9
|
-
onUserUpdated(): TypedTrigger<
|
|
10
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_UPDATED])
|
|
9
|
+
onUserUpdated(): TypedTrigger<WorkOSUserUpdatedTrigger> {
|
|
10
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_UPDATED])
|
|
11
11
|
},
|
|
12
12
|
/** Trigger on user deletion */
|
|
13
|
-
onUserDeleted(): TypedTrigger<
|
|
14
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_DELETED])
|
|
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])
|
|
15
27
|
},
|
|
16
28
|
/** Trigger on organization membership change */
|
|
17
|
-
onMembershipChanged(): TypedTrigger<
|
|
18
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED])
|
|
29
|
+
onMembershipChanged(): TypedTrigger<WorkOSMembershipTrigger> {
|
|
30
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED])
|
|
19
31
|
},
|
|
20
32
|
/** Trigger when an invitation is sent */
|
|
21
|
-
onInvitationSent(): TypedTrigger<
|
|
22
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED, WorkOSEventType.INVITATION_RESENT])
|
|
33
|
+
onInvitationSent(): TypedTrigger<WorkOSInvitationTrigger> {
|
|
34
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED, WorkOSEventType.INVITATION_RESENT])
|
|
23
35
|
},
|
|
24
36
|
/** Trigger when an invitation is first created */
|
|
25
|
-
onInvitationCreated(): TypedTrigger<
|
|
26
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED])
|
|
37
|
+
onInvitationCreated(): TypedTrigger<WorkOSInvitationCreatedTrigger> {
|
|
38
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED])
|
|
27
39
|
},
|
|
28
40
|
/** Trigger when an invitation is resent */
|
|
29
|
-
onInvitationResent(): TypedTrigger<
|
|
30
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_RESENT])
|
|
41
|
+
onInvitationResent(): TypedTrigger<WorkOSInvitationResentTrigger> {
|
|
42
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_RESENT])
|
|
31
43
|
},
|
|
32
44
|
/** Trigger on invitation accepted */
|
|
33
|
-
onInvitationAccepted(): TypedTrigger<
|
|
34
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_ACCEPTED])
|
|
45
|
+
onInvitationAccepted(): TypedTrigger<WorkOSInvitationAcceptedTrigger> {
|
|
46
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_ACCEPTED])
|
|
35
47
|
},
|
|
36
48
|
/** Trigger when an invitation is revoked */
|
|
37
|
-
onInvitationRevoked(): TypedTrigger<
|
|
38
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_REVOKED])
|
|
49
|
+
onInvitationRevoked(): TypedTrigger<WorkOSInvitationRevokedTrigger> {
|
|
50
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_REVOKED])
|
|
39
51
|
},
|
|
40
52
|
/** Trigger on organization creation */
|
|
41
|
-
onOrganizationCreated(): TypedTrigger<
|
|
42
|
-
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_CREATED])
|
|
53
|
+
onOrganizationCreated(): TypedTrigger<WorkOSOrganizationTrigger> {
|
|
54
|
+
return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_CREATED])
|
|
43
55
|
},
|
|
44
56
|
/** Trigger on specific WorkOS event types */
|
|
45
|
-
trigger(opts?: { eventTypes?: WorkOSEventType[] }): TypedTrigger<
|
|
46
|
-
return new WorkOSInputConfig("{{escape id}}", opts?.eventTypes)
|
|
57
|
+
trigger(opts?: { eventTypes?: WorkOSEventType[] }): TypedTrigger<WorkOSTrigger | WorkOSUserTrigger | WorkOSMembershipTrigger | WorkOSInvitationTrigger | WorkOSOrganizationTrigger> {
|
|
58
|
+
return new WorkOSInputConfig("{{escape id}}", opts?.eventTypes)
|
|
47
59
|
},
|
|
48
60
|
/** Use in `skills[]` */
|
|
49
61
|
skill(): TypedSkill<{{{skillToolType}}}> {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Terse, TerseAgent,
|
|
1
|
+
import { Terse, TerseAgent, GithubPRTrigger } from "terse-sdk";
|
|
2
2
|
import { Repos, Slack, GitHub, SlackChannel } from "./terse.generated";
|
|
3
3
|
|
|
4
4
|
const client = new Terse();
|
|
@@ -10,7 +10,7 @@ await client.createJob({
|
|
|
10
10
|
GitHub.skill({ repos: [Repos.TerseAI.LandingPage, Repos.TerseAI.Terse] }),
|
|
11
11
|
Slack.skill({ channel: SlackChannel.AllTerseInc }),
|
|
12
12
|
],
|
|
13
|
-
onTrigger: async (event:
|
|
13
|
+
onTrigger: async (event: GithubPRTrigger, Agent: TerseAgent) => {
|
|
14
14
|
const message = await Agent.tools.slack.sendMessage({
|
|
15
15
|
channelId: SlackChannel.AllTerseInc.channelId,
|
|
16
16
|
message: "New PR from " + event.sender.login + "!",
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{{sectionHeader "Jira & Confluence"}}
|
|
2
|
-
|
|
3
|
-
{{> resource-class jiraProjectClass}}
|
|
4
|
-
|
|
5
|
-
{{> resource-class confluencePageClass}}
|
|
6
|
-
|
|
7
|
-
export const Jira = {
|
|
8
|
-
/** Trigger when a Jira issue is created */
|
|
9
|
-
onIssueCreated(opts?: { project?: JiraProject }): JiraConfig {
|
|
10
|
-
return new JiraConfig("{{escape id}}", opts?.project?.projectKey, opts?.project?.projectId, [JiraEventType.ISSUE_CREATED])
|
|
11
|
-
},
|
|
12
|
-
/** Trigger when a Jira issue is updated */
|
|
13
|
-
onIssueUpdated(opts?: { project?: JiraProject }): JiraConfig {
|
|
14
|
-
return new JiraConfig("{{escape id}}", opts?.project?.projectKey, opts?.project?.projectId, [JiraEventType.ISSUE_UPDATED])
|
|
15
|
-
},
|
|
16
|
-
/** Trigger on all Jira events */
|
|
17
|
-
trigger(opts?: { project?: JiraProject; eventTypes?: JiraEventType[] }): JiraConfig {
|
|
18
|
-
return new JiraConfig("{{escape id}}", opts?.project?.projectKey, opts?.project?.projectId, opts?.eventTypes)
|
|
19
|
-
},
|
|
20
|
-
/** Use in `skills[]` */
|
|
21
|
-
skill(opts?: { project?: JiraProject }): TypedSkill<{{{skillToolType}}}> {
|
|
22
|
-
return new JiraConfig("{{escape id}}", opts?.project?.projectKey, opts?.project?.projectId) as TypedSkill<{{{skillToolType}}}>
|
|
23
|
-
},
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export const Confluence = {
|
|
27
|
-
/** Use in `skills[]` */
|
|
28
|
-
skill(opts: { page: ConfluencePage }): TypedSkill<{{{skillToolType}}}> {
|
|
29
|
-
return new ConfluenceConfig("{{escape id}}", opts.page.spaceName, opts.page.spaceId, opts.page.pageId, opts.page.title) as TypedSkill<{{{skillToolType}}}>
|
|
30
|
-
},
|
|
31
|
-
}
|
|
32
|
-
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{{sectionHeader "Figma"}}
|
|
2
|
-
|
|
3
|
-
export const Figma = {
|
|
4
|
-
/** Trigger when a comment is added to a Figma file */
|
|
5
|
-
onComment(opts: { fileKey: string; fileName: string; teamId: string }): FigmaConfig {
|
|
6
|
-
return new FigmaConfig("{{escape id}}", opts.fileKey, opts.fileName, opts.teamId, [FigmaEventType.FILE_COMMENT])
|
|
7
|
-
},
|
|
8
|
-
/** Trigger on all Figma events */
|
|
9
|
-
trigger(opts: { fileKey: string; fileName: string; teamId: string; eventTypes?: FigmaEventType[] }): FigmaConfig {
|
|
10
|
-
return new FigmaConfig("{{escape id}}", opts.fileKey, opts.fileName, opts.teamId, opts.eventTypes)
|
|
11
|
-
},
|
|
12
|
-
}
|
|
13
|
-
|