terse-cli 0.3.8 → 0.4.0

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 (247) hide show
  1. package/package.json +3 -3
  2. package/dist/_tmp_create_project.d.ts +0 -2
  3. package/dist/_tmp_create_project.d.ts.map +0 -1
  4. package/dist/_tmp_create_project.js +0 -17
  5. package/dist/_tmp_create_project.js.map +0 -1
  6. package/dist/_tmp_delete_agent.d.ts +0 -2
  7. package/dist/_tmp_delete_agent.d.ts.map +0 -1
  8. package/dist/_tmp_delete_agent.js +0 -14
  9. package/dist/_tmp_delete_agent.js.map +0 -1
  10. package/dist/_tmp_manual_trigger.d.ts +0 -2
  11. package/dist/_tmp_manual_trigger.d.ts.map +0 -1
  12. package/dist/_tmp_manual_trigger.js +0 -17
  13. package/dist/_tmp_manual_trigger.js.map +0 -1
  14. package/dist/_tmp_patch_active.d.ts +0 -2
  15. package/dist/_tmp_patch_active.d.ts.map +0 -1
  16. package/dist/_tmp_patch_active.js +0 -21
  17. package/dist/_tmp_patch_active.js.map +0 -1
  18. package/dist/attach.d.ts +0 -3
  19. package/dist/attach.d.ts.map +0 -1
  20. package/dist/attach.js +0 -61
  21. package/dist/attach.js.map +0 -1
  22. package/dist/auth.d.ts +0 -15
  23. package/dist/auth.d.ts.map +0 -1
  24. package/dist/auth.js +0 -169
  25. package/dist/auth.js.map +0 -1
  26. package/dist/codegen.d.ts +0 -135
  27. package/dist/codegen.d.ts.map +0 -1
  28. package/dist/codegen.js +0 -1196
  29. package/dist/codegen.js.map +0 -1
  30. package/dist/commands/deployTheme.d.ts +0 -28
  31. package/dist/commands/deployTheme.d.ts.map +0 -1
  32. package/dist/commands/deployTheme.js +0 -68
  33. package/dist/commands/deployTheme.js.map +0 -1
  34. package/dist/commands/dev.d.ts +0 -3
  35. package/dist/commands/dev.d.ts.map +0 -1
  36. package/dist/commands/dev.js +0 -47
  37. package/dist/commands/dev.js.map +0 -1
  38. package/dist/commands/fsExec.d.ts +0 -8
  39. package/dist/commands/fsExec.d.ts.map +0 -1
  40. package/dist/commands/fsExec.js +0 -46
  41. package/dist/commands/fsExec.js.map +0 -1
  42. package/dist/commands/metaAdsScope.d.ts +0 -12
  43. package/dist/commands/metaAdsScope.d.ts.map +0 -1
  44. package/dist/commands/metaAdsScope.js +0 -120
  45. package/dist/commands/metaAdsScope.js.map +0 -1
  46. package/dist/commands/serve.d.ts +0 -1
  47. package/dist/commands/serve.d.ts.map +0 -1
  48. package/dist/commands/serve.js +0 -2
  49. package/dist/commands/serve.js.map +0 -1
  50. package/dist/commands/terseCliTheme.d.ts +0 -28
  51. package/dist/commands/terseCliTheme.d.ts.map +0 -1
  52. package/dist/commands/terseCliTheme.js +0 -68
  53. package/dist/commands/terseCliTheme.js.map +0 -1
  54. package/dist/commands/tool.d.ts +0 -6
  55. package/dist/commands/tool.d.ts.map +0 -1
  56. package/dist/commands/tool.js +0 -34
  57. package/dist/commands/tool.js.map +0 -1
  58. package/dist/data/standardSlackEmoji.d.ts +0 -2
  59. package/dist/data/standardSlackEmoji.d.ts.map +0 -1
  60. package/dist/data/standardSlackEmoji.js +0 -1978
  61. package/dist/data/standardSlackEmoji.js.map +0 -1
  62. package/dist/data/standardSlackEmoji.json +0 -1974
  63. package/dist/deploy.d.ts +0 -3
  64. package/dist/deploy.d.ts.map +0 -1
  65. package/dist/deploy.js +0 -124
  66. package/dist/deploy.js.map +0 -1
  67. package/dist/generate.d.ts +0 -3
  68. package/dist/generate.d.ts.map +0 -1
  69. package/dist/generate.js +0 -282
  70. package/dist/generate.js.map +0 -1
  71. package/dist/init.d.ts +0 -3
  72. package/dist/init.d.ts.map +0 -1
  73. package/dist/init.js +0 -98
  74. package/dist/init.js.map +0 -1
  75. package/dist/integrate.d.ts +0 -3
  76. package/dist/integrate.d.ts.map +0 -1
  77. package/dist/integrate.js +0 -214
  78. package/dist/integrate.js.map +0 -1
  79. package/dist/nonInteractive.d.ts +0 -20
  80. package/dist/nonInteractive.d.ts.map +0 -1
  81. package/dist/nonInteractive.js +0 -60
  82. package/dist/nonInteractive.js.map +0 -1
  83. package/dist/perf.d.ts +0 -9
  84. package/dist/perf.d.ts.map +0 -1
  85. package/dist/perf.js +0 -59
  86. package/dist/perf.js.map +0 -1
  87. package/dist/providers/codegen.test.d.ts +0 -2
  88. package/dist/providers/codegen.test.d.ts.map +0 -1
  89. package/dist/providers/codegen.test.js +0 -45
  90. package/dist/providers/codegen.test.js.map +0 -1
  91. package/dist/providers/python/PythonProvider.d.ts +0 -51
  92. package/dist/providers/python/PythonProvider.d.ts.map +0 -1
  93. package/dist/providers/python/PythonProvider.js +0 -414
  94. package/dist/providers/python/PythonProvider.js.map +0 -1
  95. package/dist/providers/python/PythonProvider.test.d.ts +0 -2
  96. package/dist/providers/python/PythonProvider.test.d.ts.map +0 -1
  97. package/dist/providers/python/PythonProvider.test.js +0 -169
  98. package/dist/providers/python/PythonProvider.test.js.map +0 -1
  99. package/dist/providers/python/preparePythonCodegenData.d.ts +0 -139
  100. package/dist/providers/python/preparePythonCodegenData.d.ts.map +0 -1
  101. package/dist/providers/python/preparePythonCodegenData.js +0 -452
  102. package/dist/providers/python/preparePythonCodegenData.js.map +0 -1
  103. package/dist/providers/python/pythonTemplateEngine.d.ts +0 -3
  104. package/dist/providers/python/pythonTemplateEngine.d.ts.map +0 -1
  105. package/dist/providers/python/pythonTemplateEngine.js +0 -30
  106. package/dist/providers/python/pythonTemplateEngine.js.map +0 -1
  107. package/dist/providers/shared/shellUtils.d.ts +0 -2
  108. package/dist/providers/shared/shellUtils.d.ts.map +0 -1
  109. package/dist/providers/shared/shellUtils.js +0 -25
  110. package/dist/providers/shared/shellUtils.js.map +0 -1
  111. package/dist/providers/typescript/attioProjection.d.ts +0 -50
  112. package/dist/providers/typescript/attioProjection.d.ts.map +0 -1
  113. package/dist/providers/typescript/attioProjection.js +0 -358
  114. package/dist/providers/typescript/attioProjection.js.map +0 -1
  115. package/dist/providers/typescript/modules/cursor/CursorModule.d.ts +0 -20
  116. package/dist/providers/typescript/modules/cursor/CursorModule.d.ts.map +0 -1
  117. package/dist/providers/typescript/modules/cursor/CursorModule.js +0 -27
  118. package/dist/providers/typescript/modules/cursor/CursorModule.js.map +0 -1
  119. package/dist/providers/typescript/prepareCodegenData.d.ts +0 -166
  120. package/dist/providers/typescript/prepareCodegenData.d.ts.map +0 -1
  121. package/dist/providers/typescript/prepareCodegenData.js +0 -1431
  122. package/dist/providers/typescript/prepareCodegenData.js.map +0 -1
  123. package/dist/providers/typescript/prepareCodegenData.test.d.ts +0 -2
  124. package/dist/providers/typescript/prepareCodegenData.test.d.ts.map +0 -1
  125. package/dist/providers/typescript/prepareCodegenData.test.js +0 -54
  126. package/dist/providers/typescript/prepareCodegenData.test.js.map +0 -1
  127. package/dist/providers/typescript/projectedTypes.d.ts +0 -11
  128. package/dist/providers/typescript/projectedTypes.d.ts.map +0 -1
  129. package/dist/providers/typescript/projectedTypes.js +0 -53
  130. package/dist/providers/typescript/projectedTypes.js.map +0 -1
  131. package/dist/providers/typescript/projectionPrinter.d.ts +0 -26
  132. package/dist/providers/typescript/projectionPrinter.d.ts.map +0 -1
  133. package/dist/providers/typescript/projectionPrinter.js +0 -110
  134. package/dist/providers/typescript/projectionPrinter.js.map +0 -1
  135. package/dist/providers/typescript/replayLogDedupe.d.ts +0 -6
  136. package/dist/providers/typescript/replayLogDedupe.d.ts.map +0 -1
  137. package/dist/providers/typescript/replayLogDedupe.js +0 -156
  138. package/dist/providers/typescript/replayLogDedupe.js.map +0 -1
  139. package/dist/providers/typescript/triggerPayloads.d.ts +0 -7
  140. package/dist/providers/typescript/triggerPayloads.d.ts.map +0 -1
  141. package/dist/providers/typescript/triggerPayloads.js +0 -60
  142. package/dist/providers/typescript/triggerPayloads.js.map +0 -1
  143. package/dist/providers/typescript/triggerTypeRegistry.d.ts +0 -7
  144. package/dist/providers/typescript/triggerTypeRegistry.d.ts.map +0 -1
  145. package/dist/providers/typescript/triggerTypeRegistry.js +0 -198
  146. package/dist/providers/typescript/triggerTypeRegistry.js.map +0 -1
  147. package/dist/run.d.ts +0 -3
  148. package/dist/run.d.ts.map +0 -1
  149. package/dist/run.js +0 -72
  150. package/dist/run.js.map +0 -1
  151. package/dist/sampleEventCache.d.ts +0 -9
  152. package/dist/sampleEventCache.d.ts.map +0 -1
  153. package/dist/sampleEventCache.js +0 -47
  154. package/dist/sampleEventCache.js.map +0 -1
  155. package/dist/sampleEventId.d.ts +0 -9
  156. package/dist/sampleEventId.d.ts.map +0 -1
  157. package/dist/sampleEventId.js +0 -16
  158. package/dist/sampleEventId.js.map +0 -1
  159. package/dist/shared/ApiRoutes.d.ts +0 -348
  160. package/dist/shared/ApiRoutes.d.ts.map +0 -1
  161. package/dist/shared/ApiRoutes.js +0 -325
  162. package/dist/shared/ApiRoutes.js.map +0 -1
  163. package/dist/shared/ApprovalTypes.d.ts +0 -29
  164. package/dist/shared/ApprovalTypes.d.ts.map +0 -1
  165. package/dist/shared/ApprovalTypes.js +0 -8
  166. package/dist/shared/ApprovalTypes.js.map +0 -1
  167. package/dist/shared/ClientBoundTools.d.ts +0 -37
  168. package/dist/shared/ClientBoundTools.d.ts.map +0 -1
  169. package/dist/shared/ClientBoundTools.js +0 -37
  170. package/dist/shared/ClientBoundTools.js.map +0 -1
  171. package/dist/shared/Configs.d.ts +0 -488
  172. package/dist/shared/Configs.d.ts.map +0 -1
  173. package/dist/shared/Configs.js +0 -785
  174. package/dist/shared/Configs.js.map +0 -1
  175. package/dist/shared/DonatedState.d.ts +0 -5
  176. package/dist/shared/DonatedState.d.ts.map +0 -1
  177. package/dist/shared/DonatedState.js +0 -13
  178. package/dist/shared/DonatedState.js.map +0 -1
  179. package/dist/shared/Entities.d.ts +0 -8
  180. package/dist/shared/Entities.d.ts.map +0 -1
  181. package/dist/shared/Entities.js +0 -9
  182. package/dist/shared/Entities.js.map +0 -1
  183. package/dist/shared/FrontendRoutes.d.ts +0 -54
  184. package/dist/shared/FrontendRoutes.d.ts.map +0 -1
  185. package/dist/shared/FrontendRoutes.js +0 -54
  186. package/dist/shared/FrontendRoutes.js.map +0 -1
  187. package/dist/shared/Integrations.d.ts +0 -235
  188. package/dist/shared/Integrations.d.ts.map +0 -1
  189. package/dist/shared/Integrations.js +0 -143
  190. package/dist/shared/Integrations.js.map +0 -1
  191. package/dist/shared/InvalidationKeys.d.ts +0 -53
  192. package/dist/shared/InvalidationKeys.d.ts.map +0 -1
  193. package/dist/shared/InvalidationKeys.js +0 -166
  194. package/dist/shared/InvalidationKeys.js.map +0 -1
  195. package/dist/shared/ModelEvents.d.ts +0 -176
  196. package/dist/shared/ModelEvents.d.ts.map +0 -1
  197. package/dist/shared/ModelEvents.js +0 -29
  198. package/dist/shared/ModelEvents.js.map +0 -1
  199. package/dist/shared/Notifications.d.ts +0 -43
  200. package/dist/shared/Notifications.d.ts.map +0 -1
  201. package/dist/shared/Notifications.js +0 -6
  202. package/dist/shared/Notifications.js.map +0 -1
  203. package/dist/shared/RunHistoryTypes.d.ts +0 -95
  204. package/dist/shared/RunHistoryTypes.d.ts.map +0 -1
  205. package/dist/shared/RunHistoryTypes.js +0 -11
  206. package/dist/shared/RunHistoryTypes.js.map +0 -1
  207. package/dist/shared/SentNotifications.d.ts +0 -30
  208. package/dist/shared/SentNotifications.d.ts.map +0 -1
  209. package/dist/shared/SentNotifications.js +0 -13
  210. package/dist/shared/SentNotifications.js.map +0 -1
  211. package/dist/shared/SocketEvents.d.ts +0 -49
  212. package/dist/shared/SocketEvents.d.ts.map +0 -1
  213. package/dist/shared/SocketEvents.js +0 -53
  214. package/dist/shared/SocketEvents.js.map +0 -1
  215. package/dist/shared/Survey.d.ts +0 -10
  216. package/dist/shared/Survey.d.ts.map +0 -1
  217. package/dist/shared/Survey.js +0 -2
  218. package/dist/shared/Survey.js.map +0 -1
  219. package/dist/shared/TicketSystem.d.ts +0 -154
  220. package/dist/shared/TicketSystem.d.ts.map +0 -1
  221. package/dist/shared/TicketSystem.js +0 -21
  222. package/dist/shared/TicketSystem.js.map +0 -1
  223. package/dist/shared/ToolDisplayUtils.d.ts +0 -30
  224. package/dist/shared/ToolDisplayUtils.d.ts.map +0 -1
  225. package/dist/shared/ToolDisplayUtils.js +0 -1163
  226. package/dist/shared/ToolDisplayUtils.js.map +0 -1
  227. package/dist/shared/ToolsTypes.d.ts +0 -18
  228. package/dist/shared/ToolsTypes.d.ts.map +0 -1
  229. package/dist/shared/ToolsTypes.js +0 -2
  230. package/dist/shared/ToolsTypes.js.map +0 -1
  231. package/dist/shared/types.d.ts +0 -1732
  232. package/dist/shared/types.d.ts.map +0 -1
  233. package/dist/shared/types.js +0 -17
  234. package/dist/shared/types.js.map +0 -1
  235. package/dist/test.d.ts +0 -3
  236. package/dist/test.d.ts.map +0 -1
  237. package/dist/test.js +0 -82
  238. package/dist/test.js.map +0 -1
  239. package/dist/triggerParseDetail.d.ts +0 -8
  240. package/dist/triggerParseDetail.d.ts.map +0 -1
  241. package/dist/triggerParseDetail.js +0 -30
  242. package/dist/triggerParseDetail.js.map +0 -1
  243. package/dist/util.d.ts +0 -3
  244. package/dist/util.d.ts.map +0 -1
  245. package/dist/util.js +0 -5
  246. package/dist/util.js.map +0 -1
  247. package/templates/typescript/codegen/.impeccable/hook.cache.json +0 -1
@@ -1,414 +0,0 @@
1
- import chalk from "chalk";
2
- import { execFileSync, spawn } from "node:child_process";
3
- import fs from "node:fs";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { readApiKey } from "../../api.js";
7
- import { CliError } from "../../cliError.js";
8
- import { printMissingEntryFileGuidance } from "../shared/entryFileGuidance.js";
9
- import { openSessionStream, promptForToolApproval, submitApprovalDecision } from "../shared/sessionStream.js";
10
- import { ensureUvAvailable, execUv, loadDotenv, withTempScript } from "../shared/shellUtils.js";
11
- import { preparePythonTemplateContext } from "./preparePythonCodegenData.js";
12
- import { renderPythonGeneratedCode } from "./pythonTemplateEngine.js";
13
- const JOB_REGISTRY_MARKER = "__TERSE_JOB_REGISTRY__=";
14
- const JOB_SKIPPED_MARKER = "__TERSE_SKIPPED__";
15
- export class PythonProvider {
16
- language = "python";
17
- displayName = "Python";
18
- detectionMarkers = {
19
- requiredFiles: ["pyproject.toml"],
20
- description: "Python project"
21
- };
22
- projectMarkers = {
23
- requiredFiles: ["pyproject.toml"],
24
- description: "Python Terse project"
25
- };
26
- entryFile = "src/main.py";
27
- generatedCodePath = "src/terse_generated.py";
28
- deployExclusions = {
29
- dirs: new Set([".venv", "__pycache__", ".pytest_cache", ".mypy_cache", ".ruff_cache", ".git"]),
30
- files: new Set([".env", ".DS_Store"])
31
- };
32
- scaffoldFiles() {
33
- return [
34
- { template: "python/init/pyproject.toml.hbs", output: "pyproject.toml" },
35
- { template: "python/init/src/main.py.hbs", output: "src/main.py" },
36
- { template: "python/init/.python-version.hbs", output: ".python-version" },
37
- { template: "python/init/env.example.hbs", output: ".env.example" },
38
- { template: "python/init/gitignore.hbs", output: ".gitignore" },
39
- { template: "python/init/README.md.hbs", output: "README.md" }
40
- ];
41
- }
42
- buildInitTemplateContext(projectName, sdkVersion) {
43
- return {
44
- projectName,
45
- sdkDependency: `terse-sdk==${sdkVersion}`
46
- };
47
- }
48
- getPostInitSteps(_packageManager) {
49
- return ["uv run ty check Type-check the project", "terse test Run a sample event locally"];
50
- }
51
- detectPackageManager() {
52
- return "uv";
53
- }
54
- async installDependencies(targetDir) {
55
- await this.execUvCommand(["sync"], { cwd: targetDir, env: this.buildPythonEnv(targetDir) });
56
- }
57
- resolveGeneratedCodePath(cwd) {
58
- return path.join(cwd, fs.existsSync(path.join(cwd, "src")) ? "src/terse_generated.py" : "terse_generated.py");
59
- }
60
- renderGeneratedCode(input) {
61
- const code = renderPythonGeneratedCode(preparePythonTemplateContext(input));
62
- validatePythonSyntax(code);
63
- return code;
64
- }
65
- async loadJobRegistry(entryFile) {
66
- const cwd = process.cwd();
67
- const env = this.buildPythonEnv(cwd);
68
- const resolvedEntryFile = entryFile ?? this.entryFile;
69
- const entryPath = path.join(cwd, resolvedEntryFile);
70
- if (!fs.existsSync(entryPath)) {
71
- printMissingEntryFileGuidance({
72
- languageDisplayName: this.displayName,
73
- defaultEntryFile: this.entryFile,
74
- requestedEntryFile: entryFile,
75
- overrideExample: "src/server.py",
76
- createHint: `Create ${this.entryFile} and register at least one job with @app.job(...).`
77
- });
78
- }
79
- try {
80
- const script = this.buildLoadRegistryScript(resolvedEntryFile);
81
- return await this.withTempPythonScript(script, async (scriptPath) => {
82
- const { stdout } = await this.execUvCommand(["run", "python", scriptPath], { cwd, env });
83
- const payload = extractRegistryPayload(stdout);
84
- const parsed = JSON.parse(payload);
85
- const registry = new Map();
86
- for (const [name, data] of Object.entries(parsed)) {
87
- registry.set(name, createJobParametersFromPython(data));
88
- }
89
- if (registry.size === 0) {
90
- throw new CliError("no_jobs_found", "No jobs found.", {
91
- detail: `Make sure your ${resolvedEntryFile} registers at least one job with @app.job(...).`
92
- });
93
- }
94
- return registry;
95
- });
96
- }
97
- catch (error) {
98
- if (error instanceof CliError) {
99
- throw error;
100
- }
101
- throw new CliError("entry_import_failed", `Could not import ${resolvedEntryFile}.`, {
102
- detail: formatPythonCommandErrorDetail(error)
103
- });
104
- }
105
- }
106
- async executeJob(job, runId, event, opts) {
107
- const cwd = process.cwd();
108
- const env = {
109
- ...this.buildPythonEnv(cwd),
110
- TERSE_JOB_NAME: job.name,
111
- TERSE_EVENT_JSON: JSON.stringify(event)
112
- };
113
- const isVerbose = opts?.verbose ?? false;
114
- const resolvedEntryFile = opts?.entryFile ?? this.entryFile;
115
- const isSandbox = !!process.env.TERSE_RUN_ID;
116
- const apiKey = env.TERSE_API_KEY ?? null;
117
- const approvalState = { paused: false };
118
- let closeSession;
119
- try {
120
- if (apiKey && (isVerbose || !isSandbox)) {
121
- const session = await openSessionStream(apiKey, {
122
- verbose: isVerbose,
123
- isPaused: () => approvalState.paused,
124
- onEvent: !isSandbox ? createApprovalHandler(apiKey, approvalState) : undefined
125
- });
126
- closeSession = session.close;
127
- env.TERSE_SESSION_ID = session.sessionId;
128
- }
129
- const script = this.buildExecuteJobScript(resolvedEntryFile);
130
- await this.ensureUvAvailable(cwd);
131
- await this.withTempPythonScript(script, async (scriptPath) => {
132
- await runStreamingPython(cwd, env, scriptPath, job.name);
133
- });
134
- }
135
- catch (error) {
136
- throw new CliError("job_execution_failed", `Job "${job.name}" failed.`, {
137
- detail: formatPythonCommandErrorDetail(error)
138
- });
139
- }
140
- finally {
141
- closeSession?.();
142
- }
143
- }
144
- buildPythonEnv(cwd) {
145
- const env = {
146
- ...loadDotenv(cwd),
147
- UV_CACHE_DIR: path.join(os.tmpdir(), "terse-uv-cache")
148
- };
149
- // Inject the resolved CLI key (process.env > user config > legacy .env) so the Python
150
- // subprocess sees TERSE_API_KEY even when it lives in the global CLI auth file rather
151
- // than the project's .env. process.env still wins, matching readApiKey() precedence.
152
- const resolvedKey = readApiKey();
153
- if (resolvedKey && !env.TERSE_API_KEY) {
154
- env.TERSE_API_KEY = resolvedKey;
155
- }
156
- return env;
157
- }
158
- async execUvCommand(args, opts) {
159
- return execUv(args, opts);
160
- }
161
- async withTempPythonScript(source, fn) {
162
- return withTempScript(source, ".py", fn);
163
- }
164
- async ensureUvAvailable(cwd) {
165
- await ensureUvAvailable(cwd);
166
- }
167
- buildLoadRegistryScript(entryFile) {
168
- return buildLoadRegistryScript(entryFile);
169
- }
170
- buildExecuteJobScript(entryFile) {
171
- return buildExecuteJobScript(entryFile);
172
- }
173
- }
174
- export const pythonProvider = new PythonProvider();
175
- function createJobParametersFromPython(data) {
176
- const jobParams = {
177
- name: data.name,
178
- // TODO: Temporarily adding unknown, fixing this later.
179
- triggers: (data.triggers ?? []).map(reconstructPythonConfig),
180
- onTrigger: async () => {
181
- throw new Error("Python job execution must go through provider.executeJob()");
182
- },
183
- filter: data.hasFilter
184
- ? async () => {
185
- throw new Error("Python filter execution must go through provider.executeJob()");
186
- }
187
- : undefined
188
- };
189
- return jobParams;
190
- }
191
- function reconstructPythonConfig(config) {
192
- return {
193
- ...config,
194
- isComplete: () => true,
195
- formatForAgent: () => JSON.stringify(config)
196
- };
197
- }
198
- function buildLoadRegistryScript(entryFile) {
199
- return `
200
- import importlib.util
201
- import json
202
- import os
203
- import sys
204
- import uuid
205
-
206
- from terse_sdk import clear_job_registry, get_job_registry
207
-
208
- PROJECT_ROOT = os.getcwd()
209
- SRC_DIR = os.path.join(PROJECT_ROOT, "src")
210
- ENTRY_FILE = ${JSON.stringify(entryFile)}
211
- sys.path[:0] = [PROJECT_ROOT, SRC_DIR]
212
-
213
- clear_job_registry()
214
- module_name = f"__terse_main_{uuid.uuid4().hex}"
215
- spec = importlib.util.spec_from_file_location(module_name, os.path.join(PROJECT_ROOT, ENTRY_FILE))
216
- if spec is None or spec.loader is None:
217
- raise RuntimeError(f"Could not create an import spec for {ENTRY_FILE}.")
218
-
219
- module = importlib.util.module_from_spec(spec)
220
- sys.modules[module_name] = module
221
- spec.loader.exec_module(module)
222
-
223
- registry = get_job_registry()
224
- result = {}
225
- for name, job in registry.items():
226
- def serialize_config(config):
227
- payload = dict(config.config)
228
- payload["integrationId"] = config.integration_id
229
- payload["integrationType"] = config.integration_type
230
- payload["configType"] = config.config_type
231
- return payload
232
-
233
- result[name] = {
234
- "name": name,
235
- "triggers": [serialize_config(trigger) for trigger in job.triggers],
236
- "hasFilter": job.filter is not None,
237
- }
238
-
239
- print(${JSON.stringify(JOB_REGISTRY_MARKER)} + json.dumps(result))
240
- `.trim();
241
- }
242
- function buildExecuteJobScript(entryFile) {
243
- return `
244
- import importlib.util
245
- import json
246
- import os
247
- import sys
248
- import uuid
249
-
250
- from terse_sdk import clear_job_registry, deserialize_input_event, execute_registered_job, get_job_registry
251
-
252
- PROJECT_ROOT = os.getcwd()
253
- SRC_DIR = os.path.join(PROJECT_ROOT, "src")
254
- ENTRY_FILE = ${JSON.stringify(entryFile)}
255
- sys.path[:0] = [PROJECT_ROOT, SRC_DIR]
256
-
257
- clear_job_registry()
258
- module_name = f"__terse_main_{uuid.uuid4().hex}"
259
- spec = importlib.util.spec_from_file_location(module_name, os.path.join(PROJECT_ROOT, ENTRY_FILE))
260
- if spec is None or spec.loader is None:
261
- raise RuntimeError(f"Could not create an import spec for {ENTRY_FILE}.")
262
-
263
- module = importlib.util.module_from_spec(spec)
264
- sys.modules[module_name] = module
265
- spec.loader.exec_module(module)
266
-
267
- registry = get_job_registry()
268
- job_name = os.environ["TERSE_JOB_NAME"]
269
- event = deserialize_input_event(json.loads(os.environ["TERSE_EVENT_JSON"]))
270
- # TERSE_SESSION_ID / TERSE_RUN_ID are read by TerseAgent.__init__ when the
271
- # user's handler constructs an agent, so the outgoing /sdk/agent-run request
272
- # carries the right headers for the CLI's session stream to receive events.
273
- job = registry[job_name]
274
- skipped = execute_registered_job(job, event)
275
- if skipped:
276
- print(${JSON.stringify(JOB_SKIPPED_MARKER)})
277
- `.trim();
278
- }
279
- function extractRegistryPayload(stdout) {
280
- const line = stdout
281
- .split(/\r?\n/)
282
- .map(entry => entry.trim())
283
- .filter(Boolean)
284
- .reverse()
285
- .find(entry => entry.startsWith(JOB_REGISTRY_MARKER));
286
- if (!line) {
287
- throw new Error("Python job loader did not return registry JSON.");
288
- }
289
- return line.slice(JOB_REGISTRY_MARKER.length);
290
- }
291
- function createApprovalHandler(apiKey, state) {
292
- return async (event) => {
293
- if (event.type === "run_started") {
294
- state.runId = event.runId;
295
- return;
296
- }
297
- if (event.type !== "tool_approval_requested")
298
- return;
299
- if (!state.runId) {
300
- throw new Error("Received tool approval request before run_started.");
301
- }
302
- state.paused = true;
303
- try {
304
- const info = event.toolApprovalRequested;
305
- const approved = await promptForToolApproval(info.toolName, info.arguments);
306
- await submitApprovalDecision(apiKey, {
307
- runId: state.runId,
308
- stepId: info.stepId,
309
- approved
310
- });
311
- }
312
- finally {
313
- state.paused = false;
314
- }
315
- };
316
- }
317
- async function runStreamingPython(cwd, env, scriptPath, jobName) {
318
- await new Promise((resolve, reject) => {
319
- const child = spawn("uv", ["run", "python", scriptPath], {
320
- cwd,
321
- env,
322
- stdio: ["ignore", "pipe", "pipe"]
323
- });
324
- let skipped = false;
325
- let stdoutBuffer = "";
326
- child.stdout.on("data", (chunk) => {
327
- stdoutBuffer += chunk.toString();
328
- stdoutBuffer = flushStdoutBuffer(stdoutBuffer, line => {
329
- if (line === JOB_SKIPPED_MARKER) {
330
- skipped = true;
331
- return;
332
- }
333
- process.stdout.write(`${line}\n`);
334
- });
335
- });
336
- child.stdout.on("end", () => {
337
- if (!stdoutBuffer)
338
- return;
339
- if (stdoutBuffer === JOB_SKIPPED_MARKER) {
340
- skipped = true;
341
- return;
342
- }
343
- process.stdout.write(stdoutBuffer);
344
- });
345
- child.stderr.on("data", (chunk) => {
346
- process.stderr.write(chunk);
347
- });
348
- child.on("error", reject);
349
- child.on("close", code => {
350
- if (code !== 0) {
351
- reject(new Error(`uv run python exited with code ${code ?? "unknown"}`));
352
- return;
353
- }
354
- if (skipped) {
355
- console.log(chalk.dim(`\n Job "${jobName}" skipped (filter returned false).\n`));
356
- }
357
- resolve();
358
- });
359
- });
360
- }
361
- function flushStdoutBuffer(buffer, onLine) {
362
- let newlineIndex = buffer.indexOf("\n");
363
- while (newlineIndex !== -1) {
364
- const line = buffer.slice(0, newlineIndex).replace(/\r$/, "");
365
- onLine(line);
366
- buffer = buffer.slice(newlineIndex + 1);
367
- newlineIndex = buffer.indexOf("\n");
368
- }
369
- return buffer;
370
- }
371
- function validatePythonSyntax(code) {
372
- for (const executable of ["python3", "python"]) {
373
- try {
374
- execFileSync(executable, ["-c", "import sys; compile(sys.stdin.read(), 'terse_generated.py', 'exec')"], {
375
- input: code,
376
- stdio: ["pipe", "ignore", "pipe"]
377
- });
378
- return;
379
- }
380
- catch (error) {
381
- const code = error.code;
382
- if (code === "ENOENT")
383
- continue;
384
- const stderr = Buffer.isBuffer(error.stderr) ? error.stderr.toString().trim() : "";
385
- if (stderr) {
386
- console.warn(chalk.yellow(`Warning: generated Python did not pass syntax validation.\n${stderr}`));
387
- }
388
- else {
389
- console.warn(chalk.yellow("Warning: generated Python did not pass syntax validation."));
390
- }
391
- return;
392
- }
393
- }
394
- }
395
- function formatPythonCommandErrorDetail(error) {
396
- if (error instanceof Error) {
397
- const parts = [error.message];
398
- const stderr = error.stderr;
399
- if (typeof stderr === "string" && stderr.trim()) {
400
- if (stderr.trim() !== error.message.trim()) {
401
- parts.push(stderr.trim());
402
- }
403
- }
404
- else if (Buffer.isBuffer(stderr) && stderr.toString().trim()) {
405
- const stderrText = stderr.toString().trim();
406
- if (stderrText !== error.message.trim()) {
407
- parts.push(stderrText);
408
- }
409
- }
410
- return parts.join("\n");
411
- }
412
- return String(error);
413
- }
414
- //# sourceMappingURL=PythonProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PythonProvider.js","sourceRoot":"","sources":["../../../src/providers/python/PythonProvider.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=PythonProvider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PythonProvider.test.d.ts","sourceRoot":"","sources":["../../../src/providers/python/PythonProvider.test.ts"],"names":[],"mappings":""}
@@ -1,169 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import fs from "node:fs";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { afterEach, beforeEach, describe, it, mock } from "node:test";
6
- import { PythonProvider } from "./PythonProvider.js";
7
- const JOB_REGISTRY_MARKER = "__TERSE_JOB_REGISTRY__=";
8
- const CREATED_DIRS = [];
9
- class ExitSignal extends Error {
10
- code;
11
- constructor(code) {
12
- super(`process.exit(${code ?? 0})`);
13
- this.code = code;
14
- }
15
- }
16
- class TestPythonProvider extends PythonProvider {
17
- execStdout = "";
18
- capturedScripts = [];
19
- execCalls = [];
20
- async execUvCommand(args, opts) {
21
- this.execCalls.push({ args, cwd: opts.cwd, env: opts.env });
22
- return { stdout: this.execStdout, stderr: "" };
23
- }
24
- async withTempPythonScript(source, fn) {
25
- this.capturedScripts.push(source);
26
- return fn("/tmp/terse-python-provider-test.py");
27
- }
28
- async ensureUvAvailable(_cwd) { }
29
- }
30
- describe("PythonProvider entry file resolution", () => {
31
- const originalCwd = process.cwd();
32
- beforeEach(() => {
33
- mock.restoreAll();
34
- });
35
- afterEach(() => {
36
- process.chdir(originalCwd);
37
- mock.restoreAll();
38
- while (CREATED_DIRS.length > 0) {
39
- const dir = CREATED_DIRS.pop();
40
- if (dir)
41
- fs.rmSync(dir, { recursive: true, force: true });
42
- }
43
- });
44
- it("loads the canonical default entry file from src/main.py", async () => {
45
- const dir = createPythonProject({
46
- "src/main.py": "from terse_sdk import Terse\napp = Terse()\n"
47
- });
48
- process.chdir(dir);
49
- const provider = new TestPythonProvider();
50
- provider.execStdout = buildRegistryPayload("default-job");
51
- const registry = await provider.loadJobRegistry();
52
- assert.deepEqual([...registry.keys()], ["default-job"]);
53
- assert.match(provider.capturedScripts[0], /ENTRY_FILE = "src\/main\.py"/);
54
- assert.deepEqual(provider.execCalls[0]?.args, ["run", "python", "/tmp/terse-python-provider-test.py"]);
55
- assert.equal(fs.realpathSync(provider.execCalls[0]?.cwd ?? ""), fs.realpathSync(dir));
56
- assert.match(provider.execCalls[0]?.env?.UV_CACHE_DIR ?? "", /terse-uv-cache$/);
57
- });
58
- it("prints guidance when the default entry file is missing", async () => {
59
- const dir = createPythonProject({
60
- "src/server.py": "from terse_sdk import Terse\napp = Terse()\n"
61
- });
62
- process.chdir(dir);
63
- const provider = new TestPythonProvider();
64
- const errors = [];
65
- mock.method(console, "error", (...args) => {
66
- errors.push(args.map(String).join(" "));
67
- });
68
- mock.method(process, "exit", (code) => {
69
- throw new ExitSignal(code);
70
- });
71
- await assert.rejects(provider.loadJobRegistry(), (error) => error instanceof ExitSignal && error.code === 1);
72
- const output = stripAnsi(errors.join("\n"));
73
- assert.match(output, /default Python Terse entry file at src\/main\.py/);
74
- assert.match(output, /register at least one job with @app\.job/);
75
- assert.match(output, /terse test --entry-file src\/server\.py/);
76
- assert.match(output, /terse run my-job --entry-file src\/server\.py --event-file \.\/event\.json/);
77
- assert.match(output, /terse deploy --entry-file src\/server\.py/);
78
- assert.equal(provider.execCalls.length, 0);
79
- });
80
- it("loads a non-canonical entry file when --entry-file is provided", async () => {
81
- const dir = createPythonProject({
82
- "src/server.py": "from terse_sdk import Terse\napp = Terse()\n"
83
- });
84
- process.chdir(dir);
85
- const provider = new TestPythonProvider();
86
- provider.execStdout = buildRegistryPayload("self-hosted-job");
87
- const registry = await provider.loadJobRegistry("src/server.py");
88
- assert.deepEqual([...registry.keys()], ["self-hosted-job"]);
89
- assert.match(provider.capturedScripts[0], /ENTRY_FILE = "src\/server\.py"/);
90
- });
91
- });
92
- describe("PythonProvider GitHub codegen parity", () => {
93
- it("renders GitHub.skill() with repositoryIds via PythonProvider.renderGeneratedCode()", () => {
94
- const provider = new PythonProvider();
95
- const code = provider.renderGeneratedCode(buildCodegenInput({
96
- github: [
97
- {
98
- integration: {
99
- id: "github-integration-id",
100
- installation_id: 123,
101
- account_name: "TerseAI"
102
- },
103
- repositories: [
104
- {
105
- id: 1076128380,
106
- name: "Terse",
107
- owner: "TerseAI",
108
- fullName: "TerseAI/Terse"
109
- }
110
- ]
111
- }
112
- ]
113
- }));
114
- assert.match(code, /class GitHub:/);
115
- assert.match(code, /def skill\(\*, repos: Sequence\[GitHubRepo\]\) -> SkillConfig\[str\]:/);
116
- assert.match(code, /integration_id='github-integration-id'/);
117
- assert.match(code, /config_type='github'/);
118
- assert.match(code, /repositoryIds=\[repo\.repository_id for repo in repos\]/);
119
- });
120
- it("does not emit GitHub helpers when no GitHub integration is present", () => {
121
- const provider = new PythonProvider();
122
- const code = provider.renderGeneratedCode(buildCodegenInput());
123
- assert.doesNotMatch(code, /# === GitHub ===/);
124
- assert.doesNotMatch(code, /def skill\(\*, repos: Sequence\[GitHubRepo\]\)/);
125
- });
126
- });
127
- function createPythonProject(files) {
128
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), "terse-python-provider-"));
129
- CREATED_DIRS.push(dir);
130
- fs.writeFileSync(path.join(dir, "pyproject.toml"), ["[project]", 'name = "provider-test"', 'version = "0.0.1"', 'requires-python = ">=3.11"', "dependencies = []", ""].join("\n"), "utf-8");
131
- for (const [relativePath, contents] of Object.entries(files)) {
132
- const filePath = path.join(dir, relativePath);
133
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
134
- fs.writeFileSync(filePath, contents, "utf-8");
135
- }
136
- return dir;
137
- }
138
- function buildRegistryPayload(jobName) {
139
- return `${JOB_REGISTRY_MARKER}${JSON.stringify({
140
- [jobName]: {
141
- name: jobName,
142
- triggers: [],
143
- skills: [],
144
- toolApprovals: [],
145
- hasFilter: false
146
- }
147
- })}`;
148
- }
149
- function stripAnsi(value) {
150
- return value.replace(/\u001B\[[0-9;]*m/g, "");
151
- }
152
- function buildCodegenInput(overrides = {}) {
153
- return {
154
- github: [],
155
- slack: [],
156
- gmail: [],
157
- linear: [],
158
- notion: [],
159
- posthog: [],
160
- datadog: [],
161
- launchdarkly: [],
162
- workos: [],
163
- attio: [],
164
- snowflake: [],
165
- tools: [],
166
- ...overrides
167
- };
168
- }
169
- //# sourceMappingURL=PythonProvider.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PythonProvider.test.js","sourceRoot":"","sources":["../../../src/providers/python/PythonProvider.test.ts"],"names":[],"mappings":"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"}