terse-cli 0.1.16 → 0.1.17

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 (122) hide show
  1. package/dist/assertProjectRoot.d.ts +3 -2
  2. package/dist/assertProjectRoot.d.ts.map +1 -1
  3. package/dist/assertProjectRoot.js +5 -8
  4. package/dist/assertProjectRoot.js.map +1 -1
  5. package/dist/deploy.d.ts +2 -1
  6. package/dist/deploy.d.ts.map +1 -1
  7. package/dist/deploy.js +11 -12
  8. package/dist/deploy.js.map +1 -1
  9. package/dist/generate.d.ts +2 -1
  10. package/dist/generate.d.ts.map +1 -1
  11. package/dist/generate.js +12 -11
  12. package/dist/generate.js.map +1 -1
  13. package/dist/index.js +10 -7
  14. package/dist/index.js.map +1 -1
  15. package/dist/init.d.ts +2 -1
  16. package/dist/init.d.ts.map +1 -1
  17. package/dist/init.js +29 -57
  18. package/dist/init.js.map +1 -1
  19. package/dist/loadJob.d.ts +4 -3
  20. package/dist/loadJob.d.ts.map +1 -1
  21. package/dist/loadJob.js +6 -54
  22. package/dist/loadJob.js.map +1 -1
  23. package/dist/providers/LanguageProvider.d.ts +31 -0
  24. package/dist/providers/LanguageProvider.d.ts.map +1 -0
  25. package/dist/providers/LanguageProvider.js +2 -0
  26. package/dist/providers/LanguageProvider.js.map +1 -0
  27. package/dist/providers/codegenTypes.d.ts +130 -0
  28. package/dist/providers/codegenTypes.d.ts.map +1 -0
  29. package/dist/providers/codegenTypes.js +2 -0
  30. package/dist/providers/codegenTypes.js.map +1 -0
  31. package/dist/providers/python/PythonProvider.d.ts +33 -0
  32. package/dist/providers/python/PythonProvider.d.ts.map +1 -0
  33. package/dist/providers/python/PythonProvider.js +369 -0
  34. package/dist/providers/python/PythonProvider.js.map +1 -0
  35. package/dist/providers/python/preparePythonCodegenData.d.ts +73 -0
  36. package/dist/providers/python/preparePythonCodegenData.d.ts.map +1 -0
  37. package/dist/providers/python/preparePythonCodegenData.js +338 -0
  38. package/dist/providers/python/preparePythonCodegenData.js.map +1 -0
  39. package/dist/providers/python/pythonTemplateEngine.d.ts +3 -0
  40. package/dist/providers/python/pythonTemplateEngine.d.ts.map +1 -0
  41. package/dist/providers/python/pythonTemplateEngine.js +30 -0
  42. package/dist/providers/python/pythonTemplateEngine.js.map +1 -0
  43. package/dist/providers/resolveProvider.d.ts +8 -0
  44. package/dist/providers/resolveProvider.d.ts.map +1 -0
  45. package/dist/providers/resolveProvider.js +47 -0
  46. package/dist/providers/resolveProvider.js.map +1 -0
  47. package/dist/providers/shared/sessionStream.d.ts +24 -0
  48. package/dist/providers/shared/sessionStream.d.ts.map +1 -0
  49. package/dist/providers/shared/sessionStream.js +159 -0
  50. package/dist/providers/shared/sessionStream.js.map +1 -0
  51. package/dist/providers/shared/shellUtils.d.ts +13 -0
  52. package/dist/providers/shared/shellUtils.d.ts.map +1 -0
  53. package/dist/providers/shared/shellUtils.js +70 -0
  54. package/dist/providers/shared/shellUtils.js.map +1 -0
  55. package/dist/providers/templateUtils.d.ts +7 -0
  56. package/dist/providers/templateUtils.d.ts.map +1 -0
  57. package/dist/providers/templateUtils.js +30 -0
  58. package/dist/providers/templateUtils.js.map +1 -0
  59. package/dist/providers/typescript/TypeScriptProvider.d.ts +33 -0
  60. package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -0
  61. package/dist/providers/typescript/TypeScriptProvider.js +162 -0
  62. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -0
  63. package/dist/providers/typescript/prepareCodegenData.d.ts +145 -0
  64. package/dist/providers/typescript/prepareCodegenData.d.ts.map +1 -0
  65. package/dist/providers/typescript/prepareCodegenData.js +834 -0
  66. package/dist/providers/typescript/prepareCodegenData.js.map +1 -0
  67. package/dist/providers/typescript/templateEngine.d.ts +3 -0
  68. package/dist/providers/typescript/templateEngine.d.ts.map +1 -0
  69. package/dist/providers/typescript/templateEngine.js +37 -0
  70. package/dist/providers/typescript/templateEngine.js.map +1 -0
  71. package/dist/run.d.ts +2 -11
  72. package/dist/run.d.ts.map +1 -1
  73. package/dist/run.js +5 -192
  74. package/dist/run.js.map +1 -1
  75. package/dist/shared/types.d.ts +899 -107
  76. package/dist/shared/types.d.ts.map +1 -1
  77. package/dist/test.d.ts +2 -1
  78. package/dist/test.d.ts.map +1 -1
  79. package/dist/test.js +5 -5
  80. package/dist/test.js.map +1 -1
  81. package/package.json +2 -2
  82. package/templates/python/codegen/generated.hbs +6 -0
  83. package/templates/python/codegen/partials/attio-list-objects-method.hbs +8 -0
  84. package/templates/python/codegen/partials/attio-object-types.hbs +23 -0
  85. package/templates/python/codegen/partials/attio-query-records-method.hbs +45 -0
  86. package/templates/python/codegen/partials/attio-section.hbs +111 -0
  87. package/templates/python/codegen/partials/attio-upsert-record-method.hbs +51 -0
  88. package/templates/python/codegen/partials/deterministic-tools-section.hbs +194 -0
  89. package/templates/python/codegen/partials/file-header.hbs +32 -0
  90. package/templates/python/codegen/partials/schedule-section.hbs +9 -0
  91. package/templates/python/codegen/partials/snowflake-section.hbs +26 -0
  92. package/templates/python/codegen/partials/tool-name-types.hbs +15 -0
  93. package/templates/python/init/.python-version.hbs +1 -0
  94. package/templates/python/init/README.md.hbs +38 -0
  95. package/templates/python/init/gitignore.hbs +3 -0
  96. package/templates/python/init/pyproject.toml.hbs +16 -0
  97. package/templates/python/init/src/main.py.hbs +21 -0
  98. package/templates/typescript/codegen/generated.hbs +17 -0
  99. package/templates/typescript/codegen/partials/atlassian-section.hbs +32 -0
  100. package/templates/typescript/codegen/partials/attio-section.hbs +38 -0
  101. package/templates/typescript/codegen/partials/datadog-section.hbs +11 -0
  102. package/templates/typescript/codegen/partials/figma-section.hbs +13 -0
  103. package/templates/typescript/codegen/partials/github-section.hbs +62 -0
  104. package/templates/typescript/codegen/partials/gmail-section.hbs +21 -0
  105. package/templates/typescript/codegen/partials/header.hbs +12 -0
  106. package/templates/typescript/codegen/partials/launchdarkly-section.hbs +11 -0
  107. package/templates/typescript/codegen/partials/linear-section.hbs +27 -0
  108. package/templates/typescript/codegen/partials/notion-section.hbs +15 -0
  109. package/templates/typescript/codegen/partials/posthog-section.hbs +11 -0
  110. package/templates/typescript/codegen/partials/resource-class.hbs +9 -0
  111. package/templates/typescript/codegen/partials/slack-section.hbs +23 -0
  112. package/templates/typescript/codegen/partials/snowflake-section.hbs +9 -0
  113. package/templates/typescript/codegen/partials/system-section.hbs +18 -0
  114. package/templates/typescript/codegen/partials/tools-section.hbs +68 -0
  115. package/templates/typescript/codegen/partials/workos-section.hbs +53 -0
  116. package/templates/typescript/init/env.example.hbs +1 -0
  117. package/templates/{package.json.tmpl → typescript/init/package.json.hbs} +1 -1
  118. package/templates/{src/index.ts.tmpl → typescript/init/src/index.ts.hbs} +1 -3
  119. /package/templates/{env.example.tmpl → python/init/env.example.hbs} +0 -0
  120. /package/templates/{.claude/settings.json.tmpl → typescript/init/.claude/settings.json.hbs} +0 -0
  121. /package/templates/{gitignore.tmpl → typescript/init/gitignore.hbs} +0 -0
  122. /package/templates/{tsconfig.json.tmpl → typescript/init/tsconfig.json.hbs} +0 -0
@@ -0,0 +1,159 @@
1
+ import chalk from "chalk";
2
+ import { confirm } from "@inquirer/prompts";
3
+ import { BACKEND_URL } from "../../config.js";
4
+ import { ApiRoutes } from "../../shared/ApiRoutes.js";
5
+ export async function openSessionStream(apiKey, options = {}) {
6
+ const response = await fetch(`${BACKEND_URL}${ApiRoutes.SDK.SESSION_EVENTS}`, {
7
+ headers: { Authorization: `Bearer ${apiKey}`, Accept: "text/event-stream" },
8
+ });
9
+ if (!response.ok || !response.body) {
10
+ throw new Error(`Failed to open session event stream (HTTP ${response.status})`);
11
+ }
12
+ const reader = response.body.getReader();
13
+ const decoder = new TextDecoder();
14
+ let buffer = "";
15
+ const sessionId = await readSessionId(reader, decoder, buffer);
16
+ buffer = sessionId.remainingBuffer;
17
+ startEventConsumer(reader, decoder, buffer, options);
18
+ return {
19
+ sessionId: sessionId.value,
20
+ close: () => reader.cancel().catch(() => { }),
21
+ };
22
+ }
23
+ export async function submitApprovalDecision(apiKey, params) {
24
+ const response = await fetch(`${BACKEND_URL}${ApiRoutes.SDK.APPROVAL_DECISION}`, {
25
+ method: "POST",
26
+ headers: {
27
+ Authorization: `Bearer ${apiKey}`,
28
+ "Content-Type": "application/json",
29
+ },
30
+ body: JSON.stringify(params),
31
+ });
32
+ if (!response.ok) {
33
+ const body = (await response.json().catch(() => ({})));
34
+ throw new Error(`Approval decision failed: ${String(body.error ?? response.statusText)}`);
35
+ }
36
+ }
37
+ export function logSessionEvent(event, options = {}) {
38
+ if (!options.verbose)
39
+ return;
40
+ if (options.isPaused?.())
41
+ return;
42
+ if (event.type === "session_started" || event.type === "tool_approval_requested" || event.type === "run_started") {
43
+ return;
44
+ }
45
+ switch (event.type) {
46
+ case "tool_call_started":
47
+ console.log(chalk.blue(` [tool:start] ${event.toolCallStarted}`));
48
+ break;
49
+ case "tool_call_completed": {
50
+ const parsed = safeParseJson(event.toolCallCompleted);
51
+ const toolName = parsed?.tool || "unknown_tool";
52
+ const status = parsed?.status || "unknown";
53
+ const symbol = status === "completed" ? chalk.green("ok") : chalk.red("failed");
54
+ console.log(` [tool:done] ${toolName} (${symbol})`);
55
+ break;
56
+ }
57
+ case "action": {
58
+ const action = event.action;
59
+ const actionName = action?.action || "action";
60
+ const target = action?.target ? ` -> ${action.target}` : "";
61
+ console.log(chalk.magenta(` [action] ${actionName}${target}`));
62
+ break;
63
+ }
64
+ case "final_output":
65
+ console.log(chalk.green(`\n [final_output] ${event.finalOutput}\n`));
66
+ break;
67
+ case "error":
68
+ console.log(chalk.red(` [error] ${event.message}`));
69
+ break;
70
+ }
71
+ }
72
+ export async function promptForToolApproval(toolName, rawArguments) {
73
+ console.log("");
74
+ console.log(chalk.yellow.bold(` Approval required: ${toolName}`));
75
+ if (rawArguments) {
76
+ try {
77
+ const parsed = JSON.parse(rawArguments);
78
+ const formatted = JSON.stringify(parsed, null, 2)
79
+ .split("\n")
80
+ .map(line => ` ${chalk.dim(line)}`)
81
+ .join("\n");
82
+ console.log(formatted);
83
+ }
84
+ catch {
85
+ console.log(` ${chalk.dim(rawArguments)}`);
86
+ }
87
+ }
88
+ console.log("");
89
+ const approved = await confirm({
90
+ message: `Approve ${toolName}?`,
91
+ default: true,
92
+ });
93
+ console.log(approved
94
+ ? chalk.green(" Approved. Resuming...\n")
95
+ : chalk.red(" Rejected.\n"));
96
+ return approved;
97
+ }
98
+ async function readSessionId(reader, decoder, buffer) {
99
+ while (true) {
100
+ const { done, value } = await reader.read();
101
+ if (done) {
102
+ throw new Error("Session stream ended before sending sessionId");
103
+ }
104
+ buffer += decoder.decode(value, { stream: true });
105
+ const lines = buffer.split("\n");
106
+ buffer = lines.pop() ?? "";
107
+ for (const line of lines) {
108
+ if (!line.startsWith("data: "))
109
+ continue;
110
+ const event = safeParseJson(line.slice(6));
111
+ if (event?.type === "session_started" && typeof event.sessionId === "string") {
112
+ return { value: event.sessionId, remainingBuffer: buffer };
113
+ }
114
+ }
115
+ }
116
+ }
117
+ function startEventConsumer(reader, decoder, initialBuffer, options) {
118
+ let buffer = initialBuffer;
119
+ void (async () => {
120
+ try {
121
+ while (true) {
122
+ const { done, value } = await reader.read();
123
+ if (done)
124
+ break;
125
+ buffer += decoder.decode(value, { stream: true });
126
+ const lines = buffer.split("\n");
127
+ buffer = lines.pop() ?? "";
128
+ for (const line of lines) {
129
+ if (!line.startsWith("data: "))
130
+ continue;
131
+ const event = safeParseJson(line.slice(6));
132
+ if (!event)
133
+ continue;
134
+ if (options.onEvent) {
135
+ try {
136
+ await options.onEvent(event);
137
+ }
138
+ catch (error) {
139
+ console.error(chalk.red(` Session event handler failed: ${error.message}`));
140
+ }
141
+ }
142
+ logSessionEvent(event, options);
143
+ }
144
+ }
145
+ }
146
+ catch {
147
+ // Stream cancelled by close() — expected
148
+ }
149
+ })();
150
+ }
151
+ function safeParseJson(value) {
152
+ try {
153
+ return JSON.parse(value);
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ //# sourceMappingURL=sessionStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStream.js","sourceRoot":"","sources":["../../../src/providers/shared/sessionStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const UV_INSTALL_DOCS_URL = "https://docs.astral.sh/uv/getting-started/installation/";
2
+ export declare function shellEscape(value: string): string;
3
+ export declare function loadDotenv(cwd: string): NodeJS.ProcessEnv;
4
+ export declare function ensureUvAvailable(cwd: string): Promise<void>;
5
+ export declare function execUv(args: string[], opts: {
6
+ cwd: string;
7
+ env?: NodeJS.ProcessEnv;
8
+ }): Promise<{
9
+ stdout: string;
10
+ stderr: string;
11
+ }>;
12
+ export declare function withTempScript<T>(source: string, extension: string, fn: (scriptPath: string) => Promise<T>): Promise<T>;
13
+ //# sourceMappingURL=shellUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellUtils.d.ts","sourceRoot":"","sources":["../../../src/providers/shared/shellUtils.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,4DAA4D,CAAA;AAE5F,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CA0BzD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED,wBAAsB,MAAM,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IACF,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAC1B,GACF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ7C;AAED,wBAAsB,cAAc,CAAC,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,CAUZ"}
@@ -0,0 +1,70 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { execFile } from "node:child_process";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ export const UV_INSTALL_DOCS_URL = "https://docs.astral.sh/uv/getting-started/installation/";
8
+ export function shellEscape(value) {
9
+ return `'${value.replace(/'/g, `'\\''`)}'`;
10
+ }
11
+ export function loadDotenv(cwd) {
12
+ const env = { ...process.env };
13
+ const envPath = path.join(cwd, ".env");
14
+ if (!fs.existsSync(envPath))
15
+ return env;
16
+ const lines = fs.readFileSync(envPath, "utf-8").split(/\r?\n/);
17
+ for (const line of lines) {
18
+ const trimmed = line.trim();
19
+ if (!trimmed || trimmed.startsWith("#"))
20
+ continue;
21
+ const separatorIndex = trimmed.indexOf("=");
22
+ if (separatorIndex === -1)
23
+ continue;
24
+ const key = trimmed.slice(0, separatorIndex).trim();
25
+ let value = trimmed.slice(separatorIndex + 1).trim();
26
+ if ((value.startsWith('"') && value.endsWith('"')) ||
27
+ (value.startsWith("'") && value.endsWith("'"))) {
28
+ value = value.slice(1, -1);
29
+ }
30
+ env[key] = value;
31
+ }
32
+ return env;
33
+ }
34
+ export async function ensureUvAvailable(cwd) {
35
+ try {
36
+ await execFileAsync("uv", ["--version"], { cwd });
37
+ }
38
+ catch (error) {
39
+ if (isMissingExecutableError(error)) {
40
+ throw new Error(`Python projects require uv. Install: ${UV_INSTALL_DOCS_URL}`);
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ export async function execUv(args, opts) {
46
+ await ensureUvAvailable(opts.cwd);
47
+ return execFileAsync("uv", args, {
48
+ cwd: opts.cwd,
49
+ env: opts.env,
50
+ maxBuffer: 20 * 1024 * 1024,
51
+ });
52
+ }
53
+ export async function withTempScript(source, extension, fn) {
54
+ const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "terse-cli-"));
55
+ const scriptPath = path.join(tempDir, `script${extension}`);
56
+ try {
57
+ await fs.promises.writeFile(scriptPath, source, "utf-8");
58
+ return await fn(scriptPath);
59
+ }
60
+ finally {
61
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
62
+ }
63
+ }
64
+ function isMissingExecutableError(error) {
65
+ if (!(error instanceof Error))
66
+ return false;
67
+ const code = error.code;
68
+ return code === "ENOENT" || code === "ENOTDIR";
69
+ }
70
+ //# sourceMappingURL=shellUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellUtils.js","sourceRoot":"","sources":["../../../src/providers/shared/shellUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import Handlebars from "handlebars";
2
+ export declare function getCliPackageRoot(): string;
3
+ export declare function getTemplatesRoot(): string;
4
+ export declare function readTemplateFile(relativePath: string): string;
5
+ export declare function renderTemplate(relativePath: string, context: Record<string, unknown>, handlebars?: typeof Handlebars): string;
6
+ export declare function readTemplateDir(relativePath: string): string[];
7
+ //# sourceMappingURL=templateUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateUtils.d.ts","sourceRoot":"","sources":["../../src/providers/templateUtils.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,YAAY,CAAA;AAKnC,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,cAAc,CAC1B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,UAAU,GAAE,OAAO,UAAuB,GAC3C,MAAM,CAGR;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAI9D"}
@@ -0,0 +1,30 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import Handlebars from "handlebars";
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ export function getCliPackageRoot() {
8
+ return path.resolve(__dirname, "..", "..");
9
+ }
10
+ export function getTemplatesRoot() {
11
+ const templatesRoot = path.join(getCliPackageRoot(), "templates");
12
+ if (!fs.existsSync(templatesRoot)) {
13
+ throw new Error("Could not find templates directory");
14
+ }
15
+ return templatesRoot;
16
+ }
17
+ export function readTemplateFile(relativePath) {
18
+ return fs.readFileSync(path.join(getTemplatesRoot(), relativePath), "utf-8");
19
+ }
20
+ export function renderTemplate(relativePath, context, handlebars = Handlebars) {
21
+ const source = readTemplateFile(relativePath);
22
+ return handlebars.compile(source, { noEscape: true })(context);
23
+ }
24
+ export function readTemplateDir(relativePath) {
25
+ const dir = path.join(getTemplatesRoot(), relativePath);
26
+ if (!fs.existsSync(dir))
27
+ return [];
28
+ return fs.readdirSync(dir).sort();
29
+ }
30
+ //# sourceMappingURL=templateUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateUtils.js","sourceRoot":"","sources":["../../src/providers/templateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,UAAU,MAAM,YAAY,CAAA;AAEnC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1C,MAAM,UAAU,iBAAiB;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,WAAW,CAAC,CAAA;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,aAAa,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACjD,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,cAAc,CAC1B,YAAoB,EACpB,OAAgC,EAChC,aAAgC,UAAU;IAE1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAA;IAC7C,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,YAAY,CAAC,CAAA;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACrC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { CreateJobParameters } from "terse-sdk";
2
+ import type { SerializedEvent } from "../../shared/types.js";
3
+ import type { LanguageProvider } from "../LanguageProvider.js";
4
+ import type { CodegenInput } from "../codegenTypes.js";
5
+ export declare class TypeScriptProvider implements LanguageProvider {
6
+ readonly language: "typescript";
7
+ readonly displayName = "TypeScript";
8
+ readonly projectMarkers: {
9
+ requiredFiles: string[];
10
+ description: string;
11
+ };
12
+ readonly entryFile = "src/index.ts";
13
+ readonly generatedCodePath = "src/terse.generated.ts";
14
+ readonly deployExclusions: {
15
+ dirs: Set<string>;
16
+ files: Set<string>;
17
+ };
18
+ scaffoldFiles(): Array<{
19
+ template: string;
20
+ output: string;
21
+ }>;
22
+ buildInitTemplateContext(projectName: string): Record<string, unknown>;
23
+ getPostInitSteps(packageManager: string): string[];
24
+ detectPackageManager(): string;
25
+ installDependencies(targetDir: string): Promise<void>;
26
+ renderGeneratedCode(input: CodegenInput): string;
27
+ loadJobRegistry(): Promise<Map<string, CreateJobParameters>>;
28
+ executeJob(job: CreateJobParameters, event: SerializedEvent, opts?: {
29
+ verbose?: boolean;
30
+ }): Promise<void>;
31
+ }
32
+ export declare const typeScriptProvider: TypeScriptProvider;
33
+ //# sourceMappingURL=TypeScriptProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeScriptProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/TypeScriptProvider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAuB,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAOtD,qBAAa,kBAAmB,YAAW,gBAAgB;IACvD,QAAQ,CAAC,QAAQ,EAAG,YAAY,CAAS;IACzC,QAAQ,CAAC,WAAW,gBAAe;IACnC,QAAQ,CAAC,cAAc;;;MAGtB;IACD,QAAQ,CAAC,SAAS,kBAAiB;IACnC,QAAQ,CAAC,iBAAiB,4BAA2B;IACrD,QAAQ,CAAC,gBAAgB;;;MAGxB;IAED,aAAa,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAW5D,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItE,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAOlD,oBAAoB,IAAI,MAAM;IASxB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAI1C,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAuC5D,UAAU,CACZ,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,OAAO,CAAC,IAAI,CAAC;CA0DnB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAA"}
@@ -0,0 +1,162 @@
1
+ import { exec, execSync } from "node:child_process";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { promisify } from "node:util";
5
+ import chalk from "chalk";
6
+ import { tsImport } from "tsx/esm/api";
7
+ import { TerseAgent } from "terse-sdk";
8
+ import { BACKEND_URL } from "../../config.js";
9
+ import { convertSerializedEventToInputEvent } from "../../util.js";
10
+ import { openSessionStream, promptForToolApproval } from "../shared/sessionStream.js";
11
+ import { prepareTemplateContext } from "./prepareCodegenData.js";
12
+ import { renderGeneratedCode } from "./templateEngine.js";
13
+ const execAsync = promisify(exec);
14
+ export class TypeScriptProvider {
15
+ language = "typescript";
16
+ displayName = "TypeScript";
17
+ projectMarkers = {
18
+ requiredFiles: ["package.json", "src/index.ts"],
19
+ description: "TypeScript Terse project",
20
+ };
21
+ entryFile = "src/index.ts";
22
+ generatedCodePath = "src/terse.generated.ts";
23
+ deployExclusions = {
24
+ dirs: new Set(["node_modules", ".git", "dist", ".next", ".turbo"]),
25
+ files: new Set([".env", ".DS_Store"]),
26
+ };
27
+ scaffoldFiles() {
28
+ return [
29
+ { template: "typescript/init/package.json.hbs", output: "package.json" },
30
+ { template: "typescript/init/tsconfig.json.hbs", output: "tsconfig.json" },
31
+ { template: "typescript/init/src/index.ts.hbs", output: "src/index.ts" },
32
+ { template: "typescript/init/env.example.hbs", output: ".env.example" },
33
+ { template: "typescript/init/gitignore.hbs", output: ".gitignore" },
34
+ { template: "typescript/init/.claude/settings.json.hbs", output: ".claude/settings.json" },
35
+ ];
36
+ }
37
+ buildInitTemplateContext(projectName) {
38
+ return { projectName };
39
+ }
40
+ getPostInitSteps(packageManager) {
41
+ return [
42
+ `${packageManager} run build Build the project`,
43
+ `${packageManager} run dev Run in development mode`,
44
+ ];
45
+ }
46
+ detectPackageManager() {
47
+ try {
48
+ execSync("pnpm --version", { stdio: "ignore" });
49
+ return "pnpm";
50
+ }
51
+ catch {
52
+ return "npm";
53
+ }
54
+ }
55
+ async installDependencies(targetDir) {
56
+ const packageManager = this.detectPackageManager();
57
+ await execAsync(`${packageManager} install`, { cwd: targetDir });
58
+ }
59
+ renderGeneratedCode(input) {
60
+ return renderGeneratedCode(prepareTemplateContext(input));
61
+ }
62
+ async loadJobRegistry() {
63
+ const cwd = process.cwd();
64
+ const entryPath = path.join(cwd, this.entryFile);
65
+ const parentURL = pathToFileURL(path.join(cwd, "package.json")).href;
66
+ try {
67
+ await tsImport(entryPath, parentURL);
68
+ }
69
+ catch (error) {
70
+ if (isModuleNotFoundError(error)) {
71
+ const missingPackage = extractMissingPackage(error);
72
+ console.error(chalk.red(`Error: Cannot find package '${missingPackage}' imported from ${this.entryFile}`));
73
+ if (missingPackage === "terse-sdk") {
74
+ console.error(chalk.dim("\nMake sure terse-sdk is installed in your project:"));
75
+ console.error(chalk.dim(" npm install terse-sdk"));
76
+ console.error(chalk.dim(" # or, for local SDK development"));
77
+ console.error(chalk.dim(" npm link terse-sdk"));
78
+ }
79
+ else {
80
+ console.error(chalk.dim(`\nInstall the missing package: npm install ${missingPackage}`));
81
+ }
82
+ }
83
+ else {
84
+ console.error(chalk.red(`Error importing ${this.entryFile}:\n`));
85
+ console.error(error);
86
+ }
87
+ process.exit(1);
88
+ }
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ const registry = globalThis.__terse_jobRegistry;
91
+ if (!registry || registry.size === 0) {
92
+ console.error(chalk.red(`No jobs found. Make sure your ${this.entryFile} calls client.createJob().`));
93
+ process.exit(1);
94
+ }
95
+ return registry;
96
+ }
97
+ async executeJob(job, event, opts) {
98
+ const inputEvent = convertSerializedEventToInputEvent(event);
99
+ const isVerbose = opts?.verbose ?? false;
100
+ const apiKey = process.env.TERSE_API_KEY ?? null;
101
+ let sessionId;
102
+ let closeSession;
103
+ if (isVerbose && apiKey) {
104
+ const session = await openSessionStream(apiKey, {
105
+ verbose: true,
106
+ isPaused: () => sessionPaused,
107
+ });
108
+ sessionId = session.sessionId;
109
+ closeSession = session.close;
110
+ }
111
+ const agent = new TerseAgent(job.skills, BACKEND_URL, sessionId, job.toolApprovals);
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ const createTools = globalThis.__terse_createTools;
114
+ if (createTools) {
115
+ Object.defineProperty(agent, "tools", { value: createTools(agent) });
116
+ }
117
+ const isSandbox = !!process.env.TERSE_RUN_ID;
118
+ if (!isSandbox) {
119
+ agent.onApprovalRequired = async (info) => {
120
+ sessionPaused = true;
121
+ try {
122
+ return await promptForToolApproval(info.toolName, info.arguments);
123
+ }
124
+ finally {
125
+ sessionPaused = false;
126
+ }
127
+ };
128
+ }
129
+ try {
130
+ if (job.filter) {
131
+ const shouldRun = await job.filter(inputEvent);
132
+ if (!shouldRun) {
133
+ console.log(chalk.dim(`\n Job "${job.name}" skipped (filter returned false).\n`));
134
+ return;
135
+ }
136
+ }
137
+ if (isVerbose) {
138
+ console.log(chalk.cyan(` Job "${job.name}" started`));
139
+ }
140
+ await job.onTrigger(inputEvent, agent);
141
+ console.log(chalk.green(`\n Job "${job.name}" completed successfully.\n`));
142
+ }
143
+ catch (error) {
144
+ console.error(chalk.red(`\n Job "${job.name}" threw an error:\n`));
145
+ console.error(error);
146
+ process.exit(1);
147
+ }
148
+ finally {
149
+ closeSession?.();
150
+ }
151
+ }
152
+ }
153
+ export const typeScriptProvider = new TypeScriptProvider();
154
+ let sessionPaused = false;
155
+ function isModuleNotFoundError(error) {
156
+ return error instanceof Error && error.code === "ERR_MODULE_NOT_FOUND";
157
+ }
158
+ function extractMissingPackage(error) {
159
+ const match = error.message.match(/Cannot find package '([^']+)'/);
160
+ return match?.[1] ?? "unknown";
161
+ }
162
+ //# sourceMappingURL=TypeScriptProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeScriptProvider.js","sourceRoot":"","sources":["../../../src/providers/typescript/TypeScriptProvider.ts"],"names":[],"mappings":"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"}