terse-cli 0.1.16 → 0.1.18

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.
Files changed (142) hide show
  1. package/README.md +4 -4
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +6 -9
  4. package/dist/api.js.map +1 -1
  5. package/dist/assertProjectRoot.d.ts +3 -2
  6. package/dist/assertProjectRoot.d.ts.map +1 -1
  7. package/dist/assertProjectRoot.js +6 -9
  8. package/dist/assertProjectRoot.js.map +1 -1
  9. package/dist/auth.d.ts.map +1 -1
  10. package/dist/auth.js +4 -4
  11. package/dist/auth.js.map +1 -1
  12. package/dist/deploy.d.ts +2 -1
  13. package/dist/deploy.d.ts.map +1 -1
  14. package/dist/deploy.js +19 -23
  15. package/dist/deploy.js.map +1 -1
  16. package/dist/generate.d.ts +2 -1
  17. package/dist/generate.d.ts.map +1 -1
  18. package/dist/generate.js +59 -33
  19. package/dist/generate.js.map +1 -1
  20. package/dist/index.js +12 -12
  21. package/dist/index.js.map +1 -1
  22. package/dist/init.d.ts +2 -1
  23. package/dist/init.d.ts.map +1 -1
  24. package/dist/init.js +30 -58
  25. package/dist/init.js.map +1 -1
  26. package/dist/integrate.d.ts.map +1 -1
  27. package/dist/integrate.js +8 -12
  28. package/dist/integrate.js.map +1 -1
  29. package/dist/integrationApi.d.ts +2 -2
  30. package/dist/integrationApi.d.ts.map +1 -1
  31. package/dist/integrationApi.js.map +1 -1
  32. package/dist/loadJob.d.ts +4 -3
  33. package/dist/loadJob.d.ts.map +1 -1
  34. package/dist/loadJob.js +8 -56
  35. package/dist/loadJob.js.map +1 -1
  36. package/dist/providers/LanguageProvider.d.ts +31 -0
  37. package/dist/providers/LanguageProvider.d.ts.map +1 -0
  38. package/dist/providers/LanguageProvider.js +2 -0
  39. package/dist/providers/LanguageProvider.js.map +1 -0
  40. package/dist/providers/codegenTypes.d.ts +119 -0
  41. package/dist/providers/codegenTypes.d.ts.map +1 -0
  42. package/dist/providers/codegenTypes.js +2 -0
  43. package/dist/providers/codegenTypes.js.map +1 -0
  44. package/dist/providers/python/PythonProvider.d.ts +33 -0
  45. package/dist/providers/python/PythonProvider.d.ts.map +1 -0
  46. package/dist/providers/python/PythonProvider.js +362 -0
  47. package/dist/providers/python/PythonProvider.js.map +1 -0
  48. package/dist/providers/python/preparePythonCodegenData.d.ts +89 -0
  49. package/dist/providers/python/preparePythonCodegenData.d.ts.map +1 -0
  50. package/dist/providers/python/preparePythonCodegenData.js +359 -0
  51. package/dist/providers/python/preparePythonCodegenData.js.map +1 -0
  52. package/dist/providers/python/pythonTemplateEngine.d.ts +3 -0
  53. package/dist/providers/python/pythonTemplateEngine.d.ts.map +1 -0
  54. package/dist/providers/python/pythonTemplateEngine.js +30 -0
  55. package/dist/providers/python/pythonTemplateEngine.js.map +1 -0
  56. package/dist/providers/resolveProvider.d.ts +8 -0
  57. package/dist/providers/resolveProvider.d.ts.map +1 -0
  58. package/dist/providers/resolveProvider.js +47 -0
  59. package/dist/providers/resolveProvider.js.map +1 -0
  60. package/dist/providers/shared/sessionStream.d.ts +24 -0
  61. package/dist/providers/shared/sessionStream.d.ts.map +1 -0
  62. package/dist/providers/shared/sessionStream.js +157 -0
  63. package/dist/providers/shared/sessionStream.js.map +1 -0
  64. package/dist/providers/shared/shellUtils.d.ts +13 -0
  65. package/dist/providers/shared/shellUtils.d.ts.map +1 -0
  66. package/dist/providers/shared/shellUtils.js +69 -0
  67. package/dist/providers/shared/shellUtils.js.map +1 -0
  68. package/dist/providers/templateUtils.d.ts +7 -0
  69. package/dist/providers/templateUtils.d.ts.map +1 -0
  70. package/dist/providers/templateUtils.js +30 -0
  71. package/dist/providers/templateUtils.js.map +1 -0
  72. package/dist/providers/typescript/TypeScriptProvider.d.ts +33 -0
  73. package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -0
  74. package/dist/providers/typescript/TypeScriptProvider.js +160 -0
  75. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -0
  76. package/dist/providers/typescript/prepareCodegenData.d.ts +144 -0
  77. package/dist/providers/typescript/prepareCodegenData.d.ts.map +1 -0
  78. package/dist/providers/typescript/prepareCodegenData.js +751 -0
  79. package/dist/providers/typescript/prepareCodegenData.js.map +1 -0
  80. package/dist/providers/typescript/templateEngine.d.ts +3 -0
  81. package/dist/providers/typescript/templateEngine.d.ts.map +1 -0
  82. package/dist/providers/typescript/templateEngine.js +37 -0
  83. package/dist/providers/typescript/templateEngine.js.map +1 -0
  84. package/dist/run.d.ts +2 -11
  85. package/dist/run.d.ts.map +1 -1
  86. package/dist/run.js +7 -194
  87. package/dist/run.js.map +1 -1
  88. package/dist/shared/ToolDisplayUtils.d.ts.map +1 -1
  89. package/dist/shared/ToolDisplayUtils.js +13 -1
  90. package/dist/shared/ToolDisplayUtils.js.map +1 -1
  91. package/dist/shared/types.d.ts +912 -107
  92. package/dist/shared/types.d.ts.map +1 -1
  93. package/dist/test.d.ts +2 -1
  94. package/dist/test.d.ts.map +1 -1
  95. package/dist/test.js +12 -12
  96. package/dist/test.js.map +1 -1
  97. package/dist/util.d.ts +1 -1
  98. package/dist/util.d.ts.map +1 -1
  99. package/dist/util.js.map +1 -1
  100. package/package.json +13 -9
  101. package/templates/python/codegen/generated.hbs +7 -0
  102. package/templates/python/codegen/partials/attio-list-objects-method.hbs +8 -0
  103. package/templates/python/codegen/partials/attio-object-types.hbs +23 -0
  104. package/templates/python/codegen/partials/attio-query-records-method.hbs +45 -0
  105. package/templates/python/codegen/partials/attio-section.hbs +110 -0
  106. package/templates/python/codegen/partials/attio-upsert-record-method.hbs +51 -0
  107. package/templates/python/codegen/partials/deterministic-tools-section.hbs +308 -0
  108. package/templates/python/codegen/partials/file-header.hbs +32 -0
  109. package/templates/python/codegen/partials/schedule-section.hbs +9 -0
  110. package/templates/python/codegen/partials/slack-section.hbs +178 -0
  111. package/templates/python/codegen/partials/snowflake-section.hbs +26 -0
  112. package/templates/python/codegen/partials/tool-name-types.hbs +18 -0
  113. package/templates/python/init/.python-version.hbs +1 -0
  114. package/templates/python/init/README.md.hbs +40 -0
  115. package/templates/python/init/gitignore.hbs +3 -0
  116. package/templates/python/init/pyproject.toml.hbs +16 -0
  117. package/templates/python/init/src/main.py.hbs +21 -0
  118. package/templates/typescript/codegen/generated.hbs +17 -0
  119. package/templates/typescript/codegen/partials/atlassian-section.hbs +32 -0
  120. package/templates/typescript/codegen/partials/attio-section.hbs +38 -0
  121. package/templates/typescript/codegen/partials/datadog-section.hbs +11 -0
  122. package/templates/typescript/codegen/partials/figma-section.hbs +13 -0
  123. package/templates/typescript/codegen/partials/github-section.hbs +62 -0
  124. package/templates/typescript/codegen/partials/gmail-section.hbs +21 -0
  125. package/templates/typescript/codegen/partials/header.hbs +12 -0
  126. package/templates/typescript/codegen/partials/launchdarkly-section.hbs +11 -0
  127. package/templates/typescript/codegen/partials/linear-section.hbs +27 -0
  128. package/templates/typescript/codegen/partials/notion-section.hbs +15 -0
  129. package/templates/typescript/codegen/partials/posthog-section.hbs +11 -0
  130. package/templates/typescript/codegen/partials/resource-class.hbs +9 -0
  131. package/templates/typescript/codegen/partials/slack-section.hbs +22 -0
  132. package/templates/typescript/codegen/partials/snowflake-section.hbs +9 -0
  133. package/templates/typescript/codegen/partials/system-section.hbs +18 -0
  134. package/templates/typescript/codegen/partials/tools-section.hbs +69 -0
  135. package/templates/typescript/codegen/partials/workos-section.hbs +53 -0
  136. package/templates/typescript/init/env.example.hbs +1 -0
  137. package/templates/{package.json.tmpl → typescript/init/package.json.hbs} +1 -1
  138. package/templates/{src/index.ts.tmpl → typescript/init/src/index.ts.hbs} +1 -3
  139. /package/templates/{env.example.tmpl → python/init/env.example.hbs} +0 -0
  140. /package/templates/{.claude/settings.json.tmpl → typescript/init/.claude/settings.json.hbs} +0 -0
  141. /package/templates/{gitignore.tmpl → typescript/init/gitignore.hbs} +0 -0
  142. /package/templates/{tsconfig.json.tmpl → typescript/init/tsconfig.json.hbs} +0 -0
@@ -0,0 +1,32 @@
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
+
@@ -0,0 +1,38 @@
1
+ {{sectionHeader "Attio"}}
2
+
3
+ export type AttioAttributeDefinition<TSlug extends string = string, TType extends string = string> = {
4
+ apiSlug: TSlug
5
+ title?: string
6
+ type?: TType
7
+ isRequired?: boolean
8
+ isUnique?: boolean
9
+ }
10
+
11
+ export class AttioObject<
12
+ TSlug extends string = string,
13
+ TRecordValues extends Record<string, unknown> = Record<string, unknown>,
14
+ TInputValues extends Record<string, unknown> = TRecordValues
15
+ > {
16
+ constructor(
17
+ public readonly apiSlug: TSlug,
18
+ public readonly name: string,
19
+ public readonly attributes: readonly AttioAttributeDefinition[] = []
20
+ ) {}
21
+
22
+ declare readonly __recordValues: TRecordValues
23
+ declare readonly __inputValues: TInputValues
24
+ {{#if objects.length}}
25
+
26
+ {{#each objects}}
27
+ static {{staticName}} = new AttioObject<"{{escape apiSlug}}", {{{recordValuesType}}}, {{{inputValuesType}}}>("{{escape apiSlug}}", "{{escape singularNoun}}", {{{attributeSource}}})
28
+ {{/each}}
29
+ {{/if}}
30
+ }
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
+
@@ -0,0 +1,11 @@
1
+ {{sectionHeader "Datadog"}}
2
+
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
+
@@ -0,0 +1,13 @@
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
+
@@ -0,0 +1,62 @@
1
+ {{sectionHeader "GitHub"}}
2
+
3
+ export class GithubOwner {
4
+ constructor(public readonly name: string) {}
5
+ {{#if owners.length}}
6
+
7
+ {{#each owners}}
8
+ static {{staticName}} = new GithubOwner("{{escape name}}")
9
+ {{/each}}
10
+ {{/if}}
11
+ }
12
+
13
+ export class Repos {
14
+ constructor(
15
+ public readonly repositoryId: number,
16
+ public readonly name: string,
17
+ public readonly owner: GithubOwner,
18
+ public readonly fullName: string
19
+ ) {}
20
+ {{#if repoGroups.length}}
21
+
22
+ {{#each repoGroups}}
23
+ static {{ownerStaticName}} = {
24
+ {{#each repos}}
25
+ {{staticName}}: new Repos({{id}}, "{{escape name}}", GithubOwner.{{../ownerStaticName}}, "{{escape fullName}}"),
26
+ {{/each}}
27
+ } as const
28
+ {{/each}}
29
+ {{/if}}
30
+ }
31
+
32
+ export const GitHub = {
33
+ /** Trigger on push to a repository */
34
+ onPush(opts: { repo: Repos }): TypedTrigger<GithubPushInputEvent> {
35
+ return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PUSH]) as TypedTrigger<GithubPushInputEvent>
36
+ },
37
+ /** Trigger when a pull request is opened */
38
+ onPROpened(opts: { repo: Repos }): TypedTrigger<GithubPRInputEvent> {
39
+ return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED]) as TypedTrigger<GithubPRInputEvent>
40
+ },
41
+ /** Trigger when a pull request is merged */
42
+ onPRMerged(opts: { repo: Repos }): TypedTrigger<GithubPRInputEvent> {
43
+ return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_MERGED]) as TypedTrigger<GithubPRInputEvent>
44
+ },
45
+ /** Trigger when a pull request is closed */
46
+ onPRClosed(opts: { repo: Repos }): TypedTrigger<GithubPRInputEvent> {
47
+ return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_CLOSED]) as TypedTrigger<GithubPRInputEvent>
48
+ },
49
+ /** Trigger on any pull request event */
50
+ onPR(opts: { repo: Repos }): TypedTrigger<GithubPRInputEvent> {
51
+ return new GitHubConfig("{{escape id}}", [opts.repo.repositoryId], [GitHubEventType.PR_OPENED, GitHubEventType.PR_MERGED, GitHubEventType.PR_CLOSED, GitHubEventType.PR_SYNCHRONIZE]) as TypedTrigger<GithubPRInputEvent>
52
+ },
53
+ /** Trigger on specific GitHub events for the given repositories */
54
+ trigger(opts: { repos: Repos[]; eventTypes?: GitHubEventType[] }): TypedTrigger<GithubInputEvent> {
55
+ return new GitHubConfig("{{escape id}}", opts.repos.map(r => r.repositoryId), opts.eventTypes) as TypedTrigger<GithubInputEvent>
56
+ },
57
+ /** Use in `skills[]` */
58
+ skill(opts: { repos: Repos[] }): TypedSkill<{{{skillToolType}}}> {
59
+ return new GitHubConfig("{{escape id}}", opts.repos.map(r => r.repositoryId)) as TypedSkill<{{{skillToolType}}}>
60
+ },
61
+ }
62
+
@@ -0,0 +1,21 @@
1
+ {{sectionHeader "Gmail"}}
2
+
3
+ export const Gmail = {
4
+ /** Trigger when a new email is received */
5
+ onEmail(): GmailConfig {
6
+ return new GmailConfig("{{escape id}}", [GmailEventType.EMAIL_RECEIVED])
7
+ },
8
+ /** Trigger on all Gmail events */
9
+ trigger(opts?: { eventTypes?: GmailEventType[] }): GmailConfig {
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
+
@@ -0,0 +1,12 @@
1
+ // Auto-generated by `terse generate` — do not edit manually
2
+ // Re-run `terse generate` to update.
3
+
4
+ {{#if useMultilineImports}}
5
+ import {
6
+ {{#each imports}}
7
+ {{this}},
8
+ {{/each}}
9
+ } from "terse-sdk"
10
+ {{else}}
11
+ import { {{#each imports}}{{this}}{{#unless @last}}, {{/unless}}{{/each}} } from "terse-sdk"
12
+ {{/if}}
@@ -0,0 +1,11 @@
1
+ {{sectionHeader "LaunchDarkly"}}
2
+
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
+
@@ -0,0 +1,27 @@
1
+ {{sectionHeader "Linear"}}
2
+
3
+ {{> resource-class teamClass}}
4
+
5
+ export const Linear = {
6
+ /** Trigger when a new issue is created */
7
+ onIssueCreated(opts?: { projectId?: string; projectName?: string }): LinearInputConfig {
8
+ return new LinearInputConfig("{{escape id}}", opts?.projectId, opts?.projectName, [LinearEventType.ISSUE_CREATED])
9
+ },
10
+ /** Trigger when an issue is updated */
11
+ onIssueUpdated(opts?: { projectId?: string; projectName?: string }): LinearInputConfig {
12
+ return new LinearInputConfig("{{escape id}}", opts?.projectId, opts?.projectName, [LinearEventType.ISSUE_UPDATED])
13
+ },
14
+ /** Trigger when a comment is added to an issue */
15
+ onComment(opts?: { projectId?: string; projectName?: string }): LinearInputConfig {
16
+ return new LinearInputConfig("{{escape id}}", opts?.projectId, opts?.projectName, [LinearEventType.COMMENT_CREATED])
17
+ },
18
+ /** Trigger on all Linear events */
19
+ trigger(opts?: { projectId?: string; projectName?: string; eventTypes?: LinearEventType[] }): LinearInputConfig {
20
+ return new LinearInputConfig("{{escape id}}", opts?.projectId, opts?.projectName, opts?.eventTypes)
21
+ },
22
+ /** Use in `skills[]` */
23
+ skill(opts?: { team?: LinearTeam; projectId?: string; projectName?: string }): TypedSkill<{{{skillToolType}}}> {
24
+ return new LinearOutputConfig("{{escape id}}", opts?.team?.teamId, opts?.team?.name, opts?.projectId, opts?.projectName) as TypedSkill<{{{skillToolType}}}>
25
+ },
26
+ }
27
+
@@ -0,0 +1,15 @@
1
+ {{sectionHeader "Notion"}}
2
+
3
+ {{> resource-class databaseClass}}
4
+
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
+
@@ -0,0 +1,11 @@
1
+ {{sectionHeader "PostHog"}}
2
+
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,9 @@
1
+ export class {{className}} {
2
+ constructor({{{constructorParams}}}) {}
3
+ {{#if items.length}}
4
+
5
+ {{#each items}}
6
+ static {{staticName}} = new {{../className}}({{{argsText}}})
7
+ {{/each}}
8
+ {{/if}}
9
+ }
@@ -0,0 +1,22 @@
1
+ {{sectionHeader "Slack"}}
2
+
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<SlackMessageEvent> {
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<SlackMessageEvent> {
12
+ return new SlackConfig("{{escape id}}", undefined, undefined, true, opts?.userIds, [SlackEventType.MESSAGE])
13
+ },
14
+ /** Trigger on all Slack events (messages + DMs) for a channel */
15
+ trigger(opts?: { channel?: SlackChannel; listenToUserDms?: boolean; userIds?: string[]; eventTypes?: SlackEventType[] }): TypedTrigger<SlackMessageEvent> {
16
+ return new SlackConfig("{{escape id}}", opts?.channel?.channelId, opts?.channel?.name, opts?.listenToUserDms, opts?.userIds, opts?.eventTypes)
17
+ },
18
+ /** Use in `skills[]` */
19
+ 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 ?? null, opts.userNames ?? null, opts.listenToUserDms)
21
+ },
22
+ }
@@ -0,0 +1,9 @@
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
+
@@ -0,0 +1,18 @@
1
+ {{sectionHeader "Schedule"}}
2
+
3
+ export const Schedule = {
4
+ /** Use in `triggers[]` — run on a cron schedule */
5
+ cron(opts: { expression: string }): TimeTriggerConfig {
6
+ return new TimeTriggerConfig(opts.expression)
7
+ },
8
+ }
9
+
10
+ {{sectionHeader "Terse"}}
11
+
12
+ export const Terse = {
13
+ /** Use in `skills[]` — built-in web search */
14
+ skill(): TypedSkill<{{{skillToolType}}}> {
15
+ return new TerseConfig() as TypedSkill<{{{skillToolType}}}>
16
+ },
17
+ }
18
+
@@ -0,0 +1,69 @@
1
+ {{sectionHeader "Typed Tools"}}
2
+
3
+ {{#each attioPreludeLines}}
4
+ {{{this}}}
5
+ {{/each}}
6
+ {{#each paramTypes}}
7
+ {{#if description}}/** {{description}} */
8
+ {{/if}}export type {{typeName}} = {{{tsType}}}
9
+
10
+ {{/each}}
11
+ {{#if githubRepoMappings.length}}
12
+ const __githubRepoNameToFullName = new Map<string, string>([
13
+ {{#each githubRepoMappings}}
14
+ ["{{escape name}}", "{{escape fullName}}"],
15
+ {{/each}}
16
+ ])
17
+
18
+ function __normalizeGitHubRepos(repo: unknown): string {
19
+ if (repo && typeof repo === "object" && "fullName" in (repo as Record<string, unknown>)) {
20
+ const fullName = (repo as { fullName?: unknown }).fullName
21
+ if (typeof fullName === "string" && fullName.length > 0) return fullName
22
+ }
23
+ if (typeof repo === "string") {
24
+ if (repo.includes("/")) return repo
25
+ return __githubRepoNameToFullName.get(repo) ?? repo
26
+ }
27
+ return String(repo ?? "")
28
+ }
29
+
30
+ function __normalizeGitHubReposNames(repositories: unknown): string[] {
31
+ if (!Array.isArray(repositories)) return []
32
+ return repositories.map(repo => __normalizeGitHubRepos(repo))
33
+ }
34
+
35
+ {{/if}}
36
+ export type GeneratedTools = {
37
+ {{#each groups}}
38
+ {{key}}: {
39
+ {{#each methods}}
40
+ {{#if description}} /** {{description}} */
41
+ {{/if}} {{{generatedSignature}}}
42
+ {{/each}}
43
+ }
44
+ {{/each}}
45
+ }
46
+
47
+ declare module "terse-sdk" {
48
+ interface TerseAgent {
49
+ readonly tools: GeneratedTools
50
+ }
51
+ }
52
+
53
+ function createTools(agent: TerseAgent): GeneratedTools {
54
+ const manualToolConfigs = agent.manualToolConfigs ?? agent.skills
55
+ const allowed: Set<string> = new Set(manualToolConfigs.map(config => config.integrationType))
56
+ return {
57
+ {{#each groups}}
58
+ ...(allowed.has("{{escape integrationType}}") ? { {{key}}: {
59
+ {{#each methods}}
60
+ {{#each runtimeLines}}
61
+ {{{this}}}
62
+ {{/each}}
63
+ {{/each}}
64
+ } } : {}),
65
+ {{/each}}
66
+ } as GeneratedTools
67
+ }
68
+
69
+ ;(globalThis as any).__terse_createTools = createTools
@@ -0,0 +1,53 @@
1
+ {{sectionHeader "WorkOS"}}
2
+
3
+ export const WorkOS = {
4
+ /** Trigger on user creation */
5
+ onUserCreated(): TypedTrigger<WorkOSUserInputEvent> {
6
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_CREATED]) as TypedTrigger<WorkOSUserInputEvent>
7
+ },
8
+ /** Trigger on user update */
9
+ onUserUpdated(): TypedTrigger<WorkOSUserInputEvent> {
10
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_UPDATED]) as TypedTrigger<WorkOSUserInputEvent>
11
+ },
12
+ /** Trigger on user deletion */
13
+ onUserDeleted(): TypedTrigger<WorkOSUserInputEvent> {
14
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.USER_DELETED]) as TypedTrigger<WorkOSUserInputEvent>
15
+ },
16
+ /** Trigger on organization membership change */
17
+ onMembershipChanged(): TypedTrigger<WorkOSMembershipInputEvent> {
18
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_MEMBERSHIP_CREATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_UPDATED, WorkOSEventType.ORGANIZATION_MEMBERSHIP_DELETED]) as TypedTrigger<WorkOSMembershipInputEvent>
19
+ },
20
+ /** Trigger when an invitation is sent */
21
+ onInvitationSent(): TypedTrigger<WorkOSInvitationInputEvent> {
22
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED, WorkOSEventType.INVITATION_RESENT]) as TypedTrigger<WorkOSInvitationInputEvent>
23
+ },
24
+ /** Trigger when an invitation is first created */
25
+ onInvitationCreated(): TypedTrigger<WorkOSInvitationInputEvent> {
26
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_CREATED]) as TypedTrigger<WorkOSInvitationInputEvent>
27
+ },
28
+ /** Trigger when an invitation is resent */
29
+ onInvitationResent(): TypedTrigger<WorkOSInvitationInputEvent> {
30
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_RESENT]) as TypedTrigger<WorkOSInvitationInputEvent>
31
+ },
32
+ /** Trigger on invitation accepted */
33
+ onInvitationAccepted(): TypedTrigger<WorkOSInvitationInputEvent> {
34
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_ACCEPTED]) as TypedTrigger<WorkOSInvitationInputEvent>
35
+ },
36
+ /** Trigger when an invitation is revoked */
37
+ onInvitationRevoked(): TypedTrigger<WorkOSInvitationInputEvent> {
38
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.INVITATION_REVOKED]) as TypedTrigger<WorkOSInvitationInputEvent>
39
+ },
40
+ /** Trigger on organization creation */
41
+ onOrganizationCreated(): TypedTrigger<WorkOSOrganizationInputEvent> {
42
+ return new WorkOSInputConfig("{{escape id}}", [WorkOSEventType.ORGANIZATION_CREATED]) as TypedTrigger<WorkOSOrganizationInputEvent>
43
+ },
44
+ /** Trigger on specific WorkOS event types */
45
+ trigger(opts?: { eventTypes?: WorkOSEventType[] }): TypedTrigger<WorkOSInputEvent | WorkOSUserInputEvent | WorkOSMembershipInputEvent | WorkOSInvitationInputEvent | WorkOSOrganizationInputEvent> {
46
+ return new WorkOSInputConfig("{{escape id}}", opts?.eventTypes) as TypedTrigger<WorkOSInputEvent | WorkOSUserInputEvent | WorkOSMembershipInputEvent | WorkOSInvitationInputEvent | WorkOSOrganizationInputEvent>
47
+ },
48
+ /** Use in `skills[]` */
49
+ skill(): TypedSkill<{{{skillToolType}}}> {
50
+ return new WorkOSOutputConfig("{{escape id}}") as TypedSkill<{{{skillToolType}}}>
51
+ },
52
+ }
53
+
@@ -0,0 +1 @@
1
+ TERSE_API_KEY=
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "{{PROJECT_NAME}}",
2
+ "name": "{{projectName}}",
3
3
  "version": "0.1.0",
4
4
  "type": "module",
5
5
  "scripts": {
@@ -14,8 +14,6 @@ await client.createJob({
14
14
  const message = await Agent.tools.slack.sendMessage({
15
15
  channelId: SlackChannel.AllTerseInc.channelId,
16
16
  message: "New PR from " + event.sender.login + "!",
17
- thread_ts: "",
18
- blocks: "",
19
17
  });
20
18
 
21
19
  const prompt =
@@ -25,4 +23,4 @@ await client.createJob({
25
23
 
26
24
  await Agent.runAndWait(prompt);
27
25
  }
28
- });
26
+ });