terse-cli 0.1.62 → 0.1.63

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 (129) hide show
  1. package/dist/codegen.d.ts +15 -0
  2. package/dist/codegen.d.ts.map +1 -1
  3. package/dist/codegen.js +466 -81
  4. package/dist/codegen.js.map +1 -1
  5. package/dist/commands/auth.d.ts.map +1 -1
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/deployTheme.d.ts +28 -0
  8. package/dist/commands/deployTheme.d.ts.map +1 -0
  9. package/dist/commands/deployTheme.js +68 -0
  10. package/dist/commands/deployTheme.js.map +1 -0
  11. package/dist/commands/dev.d.ts +3 -0
  12. package/dist/commands/dev.d.ts.map +1 -0
  13. package/dist/commands/dev.js +47 -0
  14. package/dist/commands/dev.js.map +1 -0
  15. package/dist/commands/integrate.d.ts.map +1 -1
  16. package/dist/commands/integrate.js +3 -2
  17. package/dist/commands/integrate.js.map +1 -1
  18. package/dist/commands/serve.d.ts +1 -0
  19. package/dist/commands/serve.d.ts.map +1 -0
  20. package/dist/commands/serve.js +2 -0
  21. package/dist/commands/serve.js.map +1 -0
  22. package/dist/commands/terseCliTheme.d.ts +28 -0
  23. package/dist/commands/terseCliTheme.d.ts.map +1 -0
  24. package/dist/commands/terseCliTheme.js +68 -0
  25. package/dist/commands/terseCliTheme.js.map +1 -0
  26. package/dist/config.d.ts +3 -0
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +6 -3
  29. package/dist/config.js.map +1 -1
  30. package/dist/deploy.d.ts +2 -1
  31. package/dist/deploy.d.ts.map +1 -1
  32. package/dist/deploy.js +61 -38
  33. package/dist/deploy.js.map +1 -1
  34. package/dist/env.js +1 -1
  35. package/dist/env.js.map +1 -1
  36. package/dist/generate.d.ts +2 -1
  37. package/dist/generate.d.ts.map +1 -1
  38. package/dist/generate.js +67 -69
  39. package/dist/generate.js.map +1 -1
  40. package/dist/index.js +41 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/init.d.ts +2 -1
  43. package/dist/init.d.ts.map +1 -1
  44. package/dist/init.js +45 -96
  45. package/dist/init.js.map +1 -1
  46. package/dist/integrate.d.ts +1 -0
  47. package/dist/integrate.d.ts.map +1 -1
  48. package/dist/integrate.js +191 -11
  49. package/dist/integrate.js.map +1 -1
  50. package/dist/nonInteractive.d.ts +4 -2
  51. package/dist/nonInteractive.d.ts.map +1 -1
  52. package/dist/nonInteractive.js +5 -2
  53. package/dist/nonInteractive.js.map +1 -1
  54. package/dist/perf.d.ts +9 -0
  55. package/dist/perf.d.ts.map +1 -0
  56. package/dist/perf.js +59 -0
  57. package/dist/perf.js.map +1 -0
  58. package/dist/providers/codegen.test.d.ts +2 -0
  59. package/dist/providers/codegen.test.d.ts.map +1 -0
  60. package/dist/providers/codegen.test.js +45 -0
  61. package/dist/providers/codegen.test.js.map +1 -0
  62. package/dist/providers/python/PythonProvider.js +1 -0
  63. package/dist/providers/python/PythonProvider.js.map +1 -1
  64. package/dist/providers/python/PythonProvider.test.d.ts +2 -0
  65. package/dist/providers/python/PythonProvider.test.d.ts.map +1 -0
  66. package/dist/providers/python/PythonProvider.test.js +169 -0
  67. package/dist/providers/python/PythonProvider.test.js.map +1 -0
  68. package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
  69. package/dist/providers/typescript/TypeScriptProvider.js +3 -0
  70. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
  71. package/dist/providers/typescript/prepareCodegenData.test.d.ts +2 -0
  72. package/dist/providers/typescript/prepareCodegenData.test.d.ts.map +1 -0
  73. package/dist/providers/typescript/prepareCodegenData.test.js +54 -0
  74. package/dist/providers/typescript/prepareCodegenData.test.js.map +1 -0
  75. package/dist/run.d.ts +2 -11
  76. package/dist/run.d.ts.map +1 -1
  77. package/dist/run.js +42 -153
  78. package/dist/run.js.map +1 -1
  79. package/dist/sampleEventId.d.ts +0 -4
  80. package/dist/sampleEventId.d.ts.map +1 -1
  81. package/dist/sampleEventId.js +0 -4
  82. package/dist/sampleEventId.js.map +1 -1
  83. package/dist/shared/ApiRoutes.d.ts +19 -0
  84. package/dist/shared/ApiRoutes.d.ts.map +1 -1
  85. package/dist/shared/ApiRoutes.js +17 -1
  86. package/dist/shared/ApiRoutes.js.map +1 -1
  87. package/dist/shared/Configs.d.ts +24 -2
  88. package/dist/shared/Configs.d.ts.map +1 -1
  89. package/dist/shared/Configs.js +32 -2
  90. package/dist/shared/Configs.js.map +1 -1
  91. package/dist/shared/Integrations.d.ts +18 -1
  92. package/dist/shared/Integrations.d.ts.map +1 -1
  93. package/dist/shared/Integrations.js +10 -1
  94. package/dist/shared/Integrations.js.map +1 -1
  95. package/dist/shared/InvalidationKeys.d.ts +1 -0
  96. package/dist/shared/InvalidationKeys.d.ts.map +1 -1
  97. package/dist/shared/InvalidationKeys.js +3 -0
  98. package/dist/shared/InvalidationKeys.js.map +1 -1
  99. package/dist/shared/ModelEvents.d.ts +9 -0
  100. package/dist/shared/ModelEvents.d.ts.map +1 -1
  101. package/dist/shared/ModelEvents.js +15 -0
  102. package/dist/shared/ModelEvents.js.map +1 -1
  103. package/dist/shared/ToolDisplayUtils.d.ts.map +1 -1
  104. package/dist/shared/ToolDisplayUtils.js +107 -11
  105. package/dist/shared/ToolDisplayUtils.js.map +1 -1
  106. package/dist/shared/types.d.ts +1013 -108
  107. package/dist/shared/types.d.ts.map +1 -1
  108. package/dist/shared/types.js.map +1 -1
  109. package/dist/test.d.ts +2 -1
  110. package/dist/test.d.ts.map +1 -1
  111. package/dist/test.js +43 -23
  112. package/dist/test.js.map +1 -1
  113. package/dist/util.d.ts +2 -3
  114. package/dist/util.d.ts.map +1 -1
  115. package/dist/util.js +3 -3
  116. package/dist/util.js.map +1 -1
  117. package/package.json +3 -3
  118. package/dist/jsonOutput.d.ts +0 -19
  119. package/dist/jsonOutput.d.ts.map +0 -1
  120. package/dist/jsonOutput.js +0 -25
  121. package/dist/jsonOutput.js.map +0 -1
  122. package/dist/replay.d.ts +0 -3
  123. package/dist/replay.d.ts.map +0 -1
  124. package/dist/replay.js +0 -20
  125. package/dist/replay.js.map +0 -1
  126. package/dist/urls.d.ts +0 -3
  127. package/dist/urls.d.ts.map +0 -1
  128. package/dist/urls.js +0 -27
  129. package/dist/urls.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Brand-colored wrappers for @clack/prompts.
3
+ *
4
+ * Clack uses hardcoded named ANSI colors with no theme API. We replicate its
5
+ * chrome here using chalk true-color (24-bit RGB) derived from the design
6
+ * token OKLCH values:
7
+ *
8
+ * primary: oklch(65% .16 155) → rgb(4, 171, 98) teal-green
9
+ * secondary: oklch(65% .12 145) → rgb(93, 162, 96) muted green
10
+ * tertiary: oklch(65% .15 30) → rgb(219, 102, 86) warm orange
11
+ * destructive: oklch(60% .22 25) → rgb(230, 43, 52) red
12
+ */
13
+ export declare const primary: import("chalk").ChalkInstance;
14
+ export declare const secondary: import("chalk").ChalkInstance;
15
+ export declare const tertiary: import("chalk").ChalkInstance;
16
+ export declare const destructive: import("chalk").ChalkInstance;
17
+ /** Pass as the `styleFrame` option to `spinner()`. */
18
+ export declare const spinnerStyle: (frame: string) => string;
19
+ export declare const brandLog: {
20
+ step: (msg: string) => void;
21
+ info: (msg: string) => void;
22
+ warn: (msg: string) => void;
23
+ error: (msg: string) => void;
24
+ };
25
+ export declare function brandIntro(title?: string): void;
26
+ export declare function brandOutro(message?: string): void;
27
+ export declare function brandNote(message: string, title?: string): void;
28
+ //# sourceMappingURL=terseCliTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terseCliTheme.d.ts","sourceRoot":"","sources":["../../src/commands/terseCliTheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,eAAO,MAAM,OAAO,+BAA+B,CAAA;AACnD,eAAO,MAAM,SAAS,+BAA6B,CAAA;AACnD,eAAO,MAAM,QAAQ,+BAA8B,CAAA;AACnD,eAAO,MAAM,WAAW,+BAA2B,CAAA;AAInD,sDAAsD;AACtD,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,WAAmB,CAAA;AAW7D,eAAO,MAAM,QAAQ;gBACJ,MAAM;gBACN,MAAM;gBACN,MAAM;iBACN,MAAM;CACtB,CAAA;AAUD,wBAAgB,UAAU,CAAC,KAAK,SAAK,QAEpC;AAED,wBAAgB,UAAU,CAAC,OAAO,SAAK,QAEtC;AAWD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,QAepD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Brand-colored wrappers for @clack/prompts.
3
+ *
4
+ * Clack uses hardcoded named ANSI colors with no theme API. We replicate its
5
+ * chrome here using chalk true-color (24-bit RGB) derived from the design
6
+ * token OKLCH values:
7
+ *
8
+ * primary: oklch(65% .16 155) → rgb(4, 171, 98) teal-green
9
+ * secondary: oklch(65% .12 145) → rgb(93, 162, 96) muted green
10
+ * tertiary: oklch(65% .15 30) → rgb(219, 102, 86) warm orange
11
+ * destructive: oklch(60% .22 25) → rgb(230, 43, 52) red
12
+ */
13
+ import { log } from "@clack/prompts";
14
+ import chalk from "chalk";
15
+ // ── Color tokens ──────────────────────────────────────────────────────────────
16
+ export const primary = chalk.rgb(4, 171, 98);
17
+ export const secondary = chalk.rgb(93, 162, 96);
18
+ export const tertiary = chalk.rgb(219, 102, 86);
19
+ export const destructive = chalk.rgb(230, 43, 52);
20
+ // ── Spinner ───────────────────────────────────────────────────────────────────
21
+ /** Pass as the `styleFrame` option to `spinner()`. */
22
+ export const spinnerStyle = (frame) => primary(frame);
23
+ // ── Log helpers ───────────────────────────────────────────────────────────────
24
+ // Clack's log.step / log.info / log.warn / log.error hardcode their symbol
25
+ // colors. We call log.message() directly with a branded symbol instead.
26
+ const S_STEP = "◇";
27
+ const S_INFO = "●";
28
+ const S_WARN = "▲";
29
+ const S_ERROR = "■";
30
+ export const brandLog = {
31
+ step: (msg) => log.message(msg, { symbol: primary(S_STEP) }),
32
+ info: (msg) => log.message(msg, { symbol: secondary(S_INFO) }),
33
+ warn: (msg) => log.message(msg, { symbol: tertiary(S_WARN) }),
34
+ error: (msg) => log.message(msg, { symbol: destructive(S_ERROR) })
35
+ };
36
+ // ── Intro / Outro ─────────────────────────────────────────────────────────────
37
+ // Clack's intro/outro output a gray guide bar. We replicate the same chrome
38
+ // using our secondary color.
39
+ const S_BAR_START = "┌";
40
+ const S_BAR = "│";
41
+ const S_BAR_END = "└";
42
+ export function brandIntro(title = "") {
43
+ process.stdout.write(`${secondary(S_BAR_START)} ${title}\n`);
44
+ }
45
+ export function brandOutro(message = "") {
46
+ process.stdout.write(`${secondary(S_BAR)}\n${secondary(S_BAR_END)} ${message}\n\n`);
47
+ }
48
+ // ── Note ─────────────────────────────────────────────────────────────────────
49
+ // Clack's note() hardcodes green for the title symbol and gray for borders.
50
+ // We replicate the layout using our primary/secondary colors.
51
+ const S_BAR_H = "─";
52
+ const S_CORNER_TR = "╮";
53
+ const S_TEE_L = "├";
54
+ const S_CORNER_BR = "┴";
55
+ export function brandNote(message, title = "") {
56
+ const lines = message.split("\n");
57
+ const width = Math.max(...lines.map(l => l.length), title.length) + 4;
58
+ const pad = (s) => s + " ".repeat(width - s.length - 2);
59
+ const border = S_BAR_H.repeat(width - title.length - 1);
60
+ process.stdout.write([
61
+ `${secondary(S_BAR)}`,
62
+ `${primary(S_STEP)} ${chalk.reset(title)} ${secondary(border + S_CORNER_TR)}`,
63
+ ...lines.map(l => `${secondary(S_BAR)} ${chalk.dim(pad(l))}${secondary(S_BAR)}`),
64
+ `${secondary(S_TEE_L + S_BAR_H.repeat(width + 2) + S_CORNER_BR)}`,
65
+ ""
66
+ ].join("\n"));
67
+ }
68
+ //# sourceMappingURL=terseCliTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terseCliTheme.js","sourceRoot":"","sources":["../../src/commands/terseCliTheme.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ export declare const PRODUCTION_FRONTEND_URL = "https://app.useterse.ai";
2
+ export declare const PRODUCTION_BACKEND_URL = "https://api.useterse.ai";
3
+ export declare const PRODUCTION_DOCS_URL = "https://docs.useterse.ai";
1
4
  export declare const FRONTEND_URL: string;
2
5
  export declare const DOCS_URL: string;
3
6
  export declare const BACKEND_URL: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAA8D,CAAA;AACvF,eAAO,MAAM,QAAQ,QAA2D,CAAA;AAChF,eAAO,MAAM,WAAW,QAA6D,CAAA;AACrF,eAAO,MAAM,gBAAgB,QAA4E,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,4BAA4B,CAAA;AAChE,eAAO,MAAM,sBAAsB,4BAA4B,CAAA;AAC/D,eAAO,MAAM,mBAAmB,6BAA6B,CAAA;AAE7D,eAAO,MAAM,YAAY,QAA4D,CAAA;AACrF,eAAO,MAAM,QAAQ,QAAoD,CAAA;AACzE,eAAO,MAAM,WAAW,QAA0D,CAAA;AAClF,eAAO,MAAM,gBAAgB,QAA4E,CAAA"}
package/dist/config.js CHANGED
@@ -1,5 +1,8 @@
1
- export const FRONTEND_URL = process.env.TERSE_FRONTEND_URL || "https://app.useterse.ai";
2
- export const DOCS_URL = process.env.TERSE_DOCS_URL || "https://docs.useterse.ai";
3
- export const BACKEND_URL = process.env.TERSE_BACKEND_URL || "https://api.useterse.ai";
1
+ export const PRODUCTION_FRONTEND_URL = "https://app.useterse.ai";
2
+ export const PRODUCTION_BACKEND_URL = "https://api.useterse.ai";
3
+ export const PRODUCTION_DOCS_URL = "https://docs.useterse.ai";
4
+ export const FRONTEND_URL = process.env.TERSE_FRONTEND_URL || PRODUCTION_FRONTEND_URL;
5
+ export const DOCS_URL = process.env.TERSE_DOCS_URL || PRODUCTION_DOCS_URL;
6
+ export const BACKEND_URL = process.env.TERSE_BACKEND_URL || PRODUCTION_BACKEND_URL;
4
7
  export const WORKOS_CLIENT_ID = process.env.TERSE_WORKOS_CLIENT_ID || "client_01KG311KNK0QM1J09RJ6R8DSC5";
5
8
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,yBAAyB,CAAA;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,0BAA0B,CAAA;AAChF,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,yBAAyB,CAAA;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,mCAAmC,CAAA"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAA;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAA;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAA;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,uBAAuB,CAAA;AACrF,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,mBAAmB,CAAA;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,sBAAsB,CAAA;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,mCAAmC,CAAA"}
package/dist/deploy.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export declare function deploy(): Promise<void>;
1
+ import type { LanguageProvider } from "./providers/LanguageProvider.js";
2
+ export declare function deploy(provider?: LanguageProvider, entryFile?: string): Promise<void>;
2
3
  //# sourceMappingURL=deploy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAeA,wBAAsB,MAAM,kBA2D3B"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,MAAM,CAAC,QAAQ,GAAE,gBAAoC,EAAE,SAAS,CAAC,EAAE,MAAM,iBA2F9F"}
package/dist/deploy.js CHANGED
@@ -1,35 +1,45 @@
1
+ import chalk from "chalk";
2
+ import { zipSync } from "fflate";
1
3
  import fs from "node:fs";
2
4
  import path from "node:path";
3
- import chalk from "chalk";
4
5
  import ora from "ora";
5
- import { zipSync } from "fflate";
6
- import { fetchWithAuth, readApiKey } from "./api.js";
7
- import { assertProjectRoot } from "./assertProjectRoot.js";
6
+ import { ApiRoutes, sdkDeployRequestBodySchema } from "terse-types";
7
+ import { fetchWithAuth, readApiKeyOrBail, readEnvVar } from "./api.js";
8
8
  import { loadJobRegistry } from "./loadJob.js";
9
- import { ApiRoutes } from "./shared/ApiRoutes.js";
10
- const EXCLUDED_DIRS = new Set(["node_modules", ".git", "dist", ".next", ".turbo"]);
11
- const EXCLUDED_FILES = new Set([".env", ".DS_Store"]);
12
- export async function deploy() {
13
- assertProjectRoot();
14
- const apiKey = readApiKey();
15
- if (!apiKey) {
16
- console.error(chalk.red("Error: No TERSE_API_KEY found in .env"));
17
- console.error(chalk.dim("Run `terse init` to set up your project, or add TERSE_API_KEY to your .env file."));
18
- process.exit(1);
19
- }
20
- const registry = await loadJobRegistry();
9
+ import { resolveProvider } from "./providers/resolveProvider.js";
10
+ export async function deploy(provider = resolveProvider(), entryFile) {
11
+ const apiKey = readApiKeyOrBail({
12
+ title: "Error: No TERSE_API_KEY found in .env",
13
+ detail: "Run `terse init` to set up your project, or add TERSE_API_KEY to your .env file."
14
+ });
15
+ const registry = await loadJobRegistry(provider, entryFile);
21
16
  const jobs = [...registry.values()];
22
- const { sourceZipBase64, fileCount, zipSizeBytes } = buildZipPayload();
17
+ // If TERSE_REMOTE_SERVER_URL (or legacy TERSE_JOB_URL) is set in .env, deploy
18
+ // in URL mode (user infrastructure). No source code is zipped or uploaded.
19
+ const remoteServerUrl = readEnvVar("TERSE_REMOTE_SERVER_URL") ?? readEnvVar("TERSE_JOB_URL");
20
+ const isUrlMode = !!remoteServerUrl;
21
+ let sourceZipBase64;
22
+ let fileCount = 0;
23
+ let zipSizeBytes = 0;
24
+ if (!isUrlMode) {
25
+ const zipPayload = buildZipPayload(provider);
26
+ sourceZipBase64 = zipPayload.sourceZipBase64;
27
+ fileCount = zipPayload.fileCount;
28
+ zipSizeBytes = zipPayload.zipSizeBytes;
29
+ }
23
30
  const spinner = ora(`Deploying ${jobs.length} job${jobs.length === 1 ? "" : "s"}...`).start();
24
31
  try {
25
- const result = await fetchWithAuth(ApiRoutes.SDK.DEPLOY, apiKey, {
32
+ const body = sdkDeployRequestBodySchema.parse({
26
33
  jobs: jobs.map(job => ({
27
34
  jobName: job.name,
28
- triggers: job.triggers.map(serializeTrigger),
29
- webhookURL: job.webhookURL
35
+ triggers: job.triggers,
36
+ outputs: job.skills ?? [],
37
+ toolApprovals: job.toolApprovals ?? []
30
38
  })),
39
+ remoteServerUrl: isUrlMode ? remoteServerUrl : undefined,
31
40
  sourceZipBase64
32
- }, "POST");
41
+ });
42
+ const result = await fetchWithAuth(ApiRoutes.SDK.DEPLOY, apiKey, body, "POST");
33
43
  if (!result.success) {
34
44
  spinner.fail(chalk.red(`Deploy failed: ${result.error}`));
35
45
  if (result.details) {
@@ -41,9 +51,31 @@ export async function deploy() {
41
51
  for (const r of result.results) {
42
52
  const verb = r.isUpdate ? "Updated" : "Created";
43
53
  console.log(chalk.dim(` ${verb} "${r.jobName}" (${r.automationId})`));
54
+ if (r.triggers) {
55
+ for (const t of r.triggers) {
56
+ if (t.metadata?.webhookUrl) {
57
+ console.log(chalk.cyan(` Webhook URL: ${t.metadata.webhookUrl}`));
58
+ }
59
+ }
60
+ }
61
+ }
62
+ if (isUrlMode) {
63
+ console.log(chalk.dim(` Mode: user infrastructure`));
64
+ console.log(chalk.dim(` Server URL: ${remoteServerUrl}`));
65
+ const signingSecret = result.results.find(r => r.signingSecret)?.signingSecret;
66
+ if (signingSecret) {
67
+ const existingSecret = readEnvVar("TERSE_SIGNING_SECRET");
68
+ if (!existingSecret) {
69
+ console.log(`\n Add this to your ${chalk.bold(".env")} file:\n`);
70
+ console.log(`TERSE_SIGNING_SECRET=${signingSecret}`);
71
+ console.log("");
72
+ }
73
+ }
74
+ }
75
+ else {
76
+ console.log(chalk.dim(` Files: ${fileCount}`));
77
+ console.log(chalk.dim(` Zip size: ${(zipSizeBytes / 1024).toFixed(1)} KB`));
44
78
  }
45
- console.log(chalk.dim(` Files: ${fileCount}`));
46
- console.log(chalk.dim(` Zip size: ${(zipSizeBytes / 1024).toFixed(1)} KB`));
47
79
  if (result.removed.length > 0) {
48
80
  console.log(chalk.yellow(`\nRemoved ${result.removed.length} stale job${result.removed.length === 1 ? "" : "s"} no longer in project:`));
49
81
  for (const r of result.removed) {
@@ -56,17 +88,17 @@ export async function deploy() {
56
88
  process.exit(1);
57
89
  }
58
90
  }
59
- function collectFiles(dir, baseDir) {
91
+ function collectFiles(dir, baseDir, provider) {
60
92
  const entries = {};
61
93
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
62
- if (EXCLUDED_DIRS.has(entry.name))
94
+ if (provider.deployExclusions.dirs.has(entry.name))
63
95
  continue;
64
- if (EXCLUDED_FILES.has(entry.name))
96
+ if (provider.deployExclusions.files.has(entry.name))
65
97
  continue;
66
98
  const fullPath = path.join(dir, entry.name);
67
99
  const relativePath = path.relative(baseDir, fullPath);
68
100
  if (entry.isDirectory()) {
69
- Object.assign(entries, collectFiles(fullPath, baseDir));
101
+ Object.assign(entries, collectFiles(fullPath, baseDir, provider));
70
102
  }
71
103
  else if (entry.isFile()) {
72
104
  entries[relativePath] = new Uint8Array(fs.readFileSync(fullPath));
@@ -74,18 +106,9 @@ function collectFiles(dir, baseDir) {
74
106
  }
75
107
  return entries;
76
108
  }
77
- function serializeTrigger(config) {
78
- const { isComplete, formatForAgent, configType, integrationType, integrationId, ...rest } = config;
79
- return {
80
- configType,
81
- integrationType,
82
- integrationId,
83
- config: rest
84
- };
85
- }
86
- function buildZipPayload() {
109
+ function buildZipPayload(provider) {
87
110
  const cwd = process.cwd();
88
- const files = collectFiles(cwd, cwd);
111
+ const files = collectFiles(cwd, cwd, provider);
89
112
  const fileCount = Object.keys(files).length;
90
113
  if (fileCount === 0) {
91
114
  console.error(chalk.red("No files found to deploy"));
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
package/dist/env.js CHANGED
@@ -1,4 +1,4 @@
1
- /** When this variable is present in the environment (any value), the `terse run` subcommand is registered. Modal SDK sandboxes set it for job execution. */
1
+ /** When this variable is present in the environment (any value), the `terse run` subcommand is registered. Backend-managed SDK sandboxes (Modal in cloud, LocalSandboxService in self-host) set it for job execution. */
2
2
  const TERSE_CLI_ENABLE_RUN_ENV = "TERSE_CLI_ENABLE_RUN";
3
3
  export function isCliRunCommandEnabled() {
4
4
  return process.env[TERSE_CLI_ENABLE_RUN_ENV] !== undefined;
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,4JAA4J;AAC5J,MAAM,wBAAwB,GAAG,sBAAsB,CAAA;AAEvD,MAAM,UAAU,sBAAsB;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,SAAS,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,yNAAyN;AACzN,MAAM,wBAAwB,GAAG,sBAAsB,CAAA;AAEvD,MAAM,UAAU,sBAAsB;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,SAAS,CAAA;AAC9D,CAAC"}
@@ -1,2 +1,3 @@
1
- export declare function generate(): Promise<void>;
1
+ import type { LanguageProvider } from "./providers/LanguageProvider.js";
2
+ export declare function generate(provider?: LanguageProvider): Promise<void>;
2
3
  //# sourceMappingURL=generate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAwCA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAmQ9C"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAkBvE,wBAAsB,QAAQ,CAAC,QAAQ,GAAE,gBAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoT5F"}
package/dist/generate.js CHANGED
@@ -1,23 +1,21 @@
1
+ import chalk from "chalk";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
- import chalk from "chalk";
4
4
  import ora from "ora";
5
+ import { IntegrationType, isValidToolName } from "terse-types";
6
+ import { ApiRoutes, buildRoute } from "terse-types";
7
+ import { fetchWithAuth, readApiKeyOrBail } from "./api.js";
5
8
  import { assertProjectRoot } from "./assertProjectRoot.js";
6
- import { generateCode, } from "./codegen.js";
7
- import { IntegrationType } from "./shared/Integrations.js";
8
- import { ApiRoutes } from "./shared/ApiRoutes.js";
9
- import { fetchWithAuth, readApiKey } from "./api.js";
9
+ import { resolveProvider } from "./providers/resolveProvider.js";
10
10
  // ── Main ──────────────────────────────────────────────────────────────
11
- export async function generate() {
12
- assertProjectRoot();
11
+ export async function generate(provider = resolveProvider()) {
12
+ assertProjectRoot(provider, provider.detectionMarkers);
13
13
  const totalStart = performance.now();
14
14
  // 1. Read API key
15
- const apiKey = readApiKey();
16
- if (!apiKey) {
17
- console.error(chalk.red("\n Missing TERSE_API_KEY in .env\n") +
18
- chalk.dim(" Create a project with `terse init` or add TERSE_API_KEY to your .env file.\n"));
19
- process.exit(1);
20
- }
15
+ const apiKey = readApiKeyOrBail({
16
+ title: "\n Missing TERSE_API_KEY in .env\n",
17
+ detail: " Create a project with `terse init` or add TERSE_API_KEY to your .env file.\n"
18
+ });
21
19
  // 2. Fetch active integrations
22
20
  const spinner = ora("Fetching integrations...").start();
23
21
  let activeTypes;
@@ -33,8 +31,7 @@ export async function generate() {
33
31
  message.toLowerCase().includes("unauthorized") ||
34
32
  message.toLowerCase().includes("forbidden");
35
33
  if (isAuthError) {
36
- console.error(chalk.red("\n Authentication failed: your TERSE_API_KEY was rejected.\n") +
37
- chalk.dim(" Update TERSE_API_KEY in .env and try again.\n"));
34
+ console.error(chalk.red("\n Authentication failed: your TERSE_API_KEY was rejected.\n") + chalk.dim(" Update TERSE_API_KEY in .env and try again.\n"));
38
35
  }
39
36
  else {
40
37
  console.error(chalk.red(`\n ${message}\n`));
@@ -49,6 +46,11 @@ export async function generate() {
49
46
  // Filter to only tools whose integration matches an active integration type
50
47
  const activeSet = new Set(activeTypes);
51
48
  toolDefs = resp.tools.filter(t => activeSet.has(t.integration));
49
+ const skippedToolNames = [...new Set(toolDefs.filter(t => !isValidToolName(t.name)).map(t => t.name))].sort();
50
+ toolDefs = toolDefs.filter(t => isValidToolName(t.name));
51
+ if (skippedToolNames.length > 0) {
52
+ console.warn(chalk.yellow(`\n Skipped ${skippedToolNames.length} tool(s) absent from terse-types ToolDefinitions: ${skippedToolNames.join(", ")}\n`));
53
+ }
52
54
  }
53
55
  catch {
54
56
  // Non-fatal: proceed without tool definitions
@@ -56,11 +58,18 @@ export async function generate() {
56
58
  // 4. Fetch all integration instances + resources in parallel
57
59
  spinner.text = "Fetching integration details...";
58
60
  const input = {
59
- github: [], slack: [], gmail: [], figma: [],
60
- linear: [], atlassian: [], notion: [],
61
- posthog: [], datadog: [], launchdarkly: [],
62
- workos: [], attio: [],
63
- tools: toolDefs,
61
+ github: [],
62
+ slack: [],
63
+ gmail: [],
64
+ linear: [],
65
+ notion: [],
66
+ posthog: [],
67
+ datadog: [],
68
+ launchdarkly: [],
69
+ workos: [],
70
+ attio: [],
71
+ snowflake: [],
72
+ tools: toolDefs
64
73
  };
65
74
  const has = (t) => activeTypes.includes(t);
66
75
  const promises = [];
@@ -91,37 +100,18 @@ export async function generate() {
91
100
  }));
92
101
  }));
93
102
  }
94
- // ── Figma (no resources) ──
95
- if (has(IntegrationType.FIGMA)) {
96
- promises.push(safely(async () => {
97
- const instances = await fetchWithAuth(ApiRoutes.FIGMA.INTEGRATIONS, apiKey);
98
- input.figma = instances.map(inst => ({ id: inst.id, displayName: inst.handle || inst.id }));
99
- }));
100
- }
101
103
  // ── Linear (fetches teams per instance) ──
102
104
  if (has(IntegrationType.LINEAR)) {
103
105
  promises.push(safely(async () => {
104
106
  const instances = await fetchWithAuth(ApiRoutes.LINEAR.INTEGRATIONS, apiKey);
105
107
  input.linear = await Promise.all(instances.map(async (inst) => {
106
108
  const teams = await fetchWithAuth(`${ApiRoutes.LINEAR.TEAMS}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => []);
107
- return { id: inst.id, displayName: inst.workspaceName || inst.id, teams: Array.isArray(teams) ? teams : [] };
108
- }));
109
- }));
110
- }
111
- // ── Atlassian — fetches Jira projects + Confluence pages per instance ──
112
- if (has(IntegrationType.ATLASSIAN)) {
113
- promises.push(safely(async () => {
114
- const instances = await fetchWithAuth(ApiRoutes.ATLASSIAN.INTEGRATIONS, apiKey);
115
- input.atlassian = await Promise.all(instances.map(async (inst) => {
116
- const [jiraResp, confResp] = await Promise.all([
117
- fetchWithAuth(`${ApiRoutes.JIRA.RESOURCES}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => null),
118
- fetchWithAuth(`${ApiRoutes.CONFLUENCE.RESOURCES}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => null),
119
- ]);
109
+ const projects = await fetchWithAuth(`${ApiRoutes.LINEAR.PROJECTS}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => []);
120
110
  return {
121
111
  id: inst.id,
122
- displayName: inst.siteName || inst.email || inst.id,
123
- jiraProjects: jiraResp?.resources?.projects || [],
124
- confluencePages: confResp?.resources || [],
112
+ displayName: inst.workspaceName || inst.id,
113
+ teams: Array.isArray(teams) ? teams : [],
114
+ projects: Array.isArray(projects) ? projects : []
125
115
  };
126
116
  }));
127
117
  }));
@@ -137,7 +127,7 @@ export async function generate() {
137
127
  id: inst.id,
138
128
  displayName: inst.workspaceName || inst.id,
139
129
  databases: resources.filter(r => r.type === "database"),
140
- pages: resources.filter(r => r.type === "page"),
130
+ pages: resources.filter(r => r.type === "page")
141
131
  };
142
132
  }));
143
133
  }));
@@ -157,7 +147,9 @@ export async function generate() {
157
147
  promises.push(safely(async () => {
158
148
  const instances = await fetchWithAuth(ApiRoutes.DATADOG.INTEGRATIONS, apiKey);
159
149
  input.datadog = await Promise.all(instances.map(async (inst) => {
160
- const resp = await fetchWithAuth(`${ApiRoutes.DATADOG.INDEXES}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => ({ indexes: [] }));
150
+ const resp = await fetchWithAuth(`${ApiRoutes.DATADOG.INDEXES}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => ({
151
+ indexes: []
152
+ }));
161
153
  return { id: inst.id, displayName: inst.region || inst.id, indexes: resp.indexes || [] };
162
154
  }));
163
155
  }));
@@ -167,7 +159,7 @@ export async function generate() {
167
159
  promises.push(safely(async () => {
168
160
  const instances = await fetchWithAuth(ApiRoutes.LAUNCHDARKLY.INTEGRATIONS, apiKey);
169
161
  input.launchdarkly = await Promise.all(instances.map(async (inst) => {
170
- const resp = await fetchWithAuth(ApiRoutes.LAUNCHDARKLY.PROJECTS_BY_INTEGRATION_ID.build(inst.id), apiKey).catch(() => ({ projects: [] }));
162
+ const resp = await fetchWithAuth(buildRoute(ApiRoutes.LAUNCHDARKLY.PROJECTS_BY_INTEGRATION_ID, { integrationId: inst.id }), apiKey).catch(() => ({ projects: [] }));
171
163
  return { id: inst.id, displayName: inst.tokenName || inst.email || inst.id, projects: resp.projects || [] };
172
164
  }));
173
165
  }));
@@ -184,23 +176,35 @@ export async function generate() {
184
176
  promises.push(safely(async () => {
185
177
  const instances = await fetchWithAuth(ApiRoutes.ATTIO.INTEGRATIONS, apiKey);
186
178
  input.attio = await Promise.all(instances.map(async (inst) => {
187
- const objects = await fetchWithAuth(ApiRoutes.ATTIO.OBJECTS.build(inst.id), apiKey).catch(() => []);
179
+ const objects = await fetchWithAuth(buildRoute(ApiRoutes.ATTIO.OBJECTS, { integrationId: inst.id }), apiKey).catch(() => []);
188
180
  return { id: inst.id, displayName: inst.workspaceName || inst.id, objects: Array.isArray(objects) ? objects : [] };
189
181
  }));
190
182
  }));
191
183
  }
184
+ if (has(IntegrationType.SNOWFLAKE)) {
185
+ promises.push(safely(async () => {
186
+ const instances = await fetchWithAuth(ApiRoutes.SNOWFLAKE.INTEGRATIONS, apiKey);
187
+ input.snowflake = instances.map(inst => ({ id: inst.id, name: inst.accountIdentifier }));
188
+ }));
189
+ }
192
190
  await Promise.all(promises);
193
- const integrationCount = input.github.length + input.slack.length + input.gmail.length + input.figma.length +
194
- input.linear.length + input.atlassian.length + input.notion.length +
195
- input.posthog.length + input.datadog.length + input.launchdarkly.length +
196
- input.workos.length + input.attio.length;
191
+ const integrationCount = input.github.length +
192
+ input.slack.length +
193
+ input.gmail.length +
194
+ input.linear.length +
195
+ input.notion.length +
196
+ input.posthog.length +
197
+ input.datadog.length +
198
+ input.launchdarkly.length +
199
+ input.workos.length +
200
+ input.attio.length;
197
201
  spinner.succeed(`Fetched ${integrationCount} integration(s)`);
198
202
  // 5. Generate code
199
203
  const codegenStart = performance.now();
200
- const code = generateCode(input);
204
+ const code = provider.renderGeneratedCode(input);
201
205
  const codegenMs = performance.now() - codegenStart;
202
206
  // 6. Write output
203
- writeOutput(code);
207
+ writeOutput(code, provider);
204
208
  // 7. Summary
205
209
  const totalMs = performance.now() - totalStart;
206
210
  console.log("");
@@ -211,7 +215,7 @@ export async function generate() {
211
215
  console.log(` ${chalk.green("+")} Schedule trigger`);
212
216
  console.log(` ${chalk.green("+")} Terse skills (web search)`);
213
217
  console.log("");
214
- console.log(` ${chalk.green.bold("Generated")} src/terse.generated.ts`);
218
+ console.log(` ${chalk.green.bold("Generated")} ${path.relative(process.cwd(), provider.resolveGeneratedCodePath(process.cwd()))}`);
215
219
  console.log(` ${chalk.dim(`Codegen: ${codegenMs.toFixed(0)}ms | Total: ${totalMs.toFixed(0)}ms`)}`);
216
220
  console.log("");
217
221
  }
@@ -220,14 +224,17 @@ async function safely(fn) {
220
224
  try {
221
225
  await fn();
222
226
  }
223
- catch { /* skip failed integrations */ }
227
+ catch {
228
+ /* skip failed integrations */
229
+ }
224
230
  }
225
- function writeOutput(code) {
226
- const srcDir = path.resolve(process.cwd(), "src");
227
- if (!fs.existsSync(srcDir)) {
228
- fs.mkdirSync(srcDir, { recursive: true });
231
+ function writeOutput(code, provider) {
232
+ const outputPath = provider.resolveGeneratedCodePath(process.cwd());
233
+ const outputDir = path.dirname(outputPath);
234
+ if (!fs.existsSync(outputDir)) {
235
+ fs.mkdirSync(outputDir, { recursive: true });
229
236
  }
230
- fs.writeFileSync(path.join(srcDir, "terse.generated.ts"), code);
237
+ fs.writeFileSync(outputPath, code);
231
238
  }
232
239
  function printSummary(input) {
233
240
  const g = chalk.green("+");
@@ -243,19 +250,10 @@ function printSummary(input) {
243
250
  const n = inst.channels.length;
244
251
  console.log(` ${g} Slack (${inst.displayName}) — ${n} ${n === 1 ? "channel" : "channels"}`);
245
252
  }
246
- for (const inst of input.figma) {
247
- console.log(` ${g} Figma (${inst.displayName})`);
248
- }
249
253
  for (const inst of input.linear) {
250
254
  const n = inst.teams.length;
251
255
  console.log(` ${g} Linear (${inst.displayName}) — ${n} ${n === 1 ? "team" : "teams"}`);
252
256
  }
253
- for (const inst of input.atlassian) {
254
- const jp = inst.jiraProjects.length;
255
- const cp = inst.confluencePages.length;
256
- console.log(` ${g} Jira (${inst.displayName}) — ${jp} ${jp === 1 ? "project" : "projects"}`);
257
- console.log(` ${g} Confluence (${inst.displayName}) — ${cp} ${cp === 1 ? "page" : "pages"}`);
258
- }
259
257
  for (const inst of input.notion) {
260
258
  const d = inst.databases.length;
261
259
  const p = inst.pages.length;