terse-cli 0.3.8 → 0.4.1

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 (270) hide show
  1. package/dist/cliUi.js +1 -1
  2. package/dist/cliUi.js.map +1 -1
  3. package/dist/commands/deploy.d.ts.map +1 -1
  4. package/dist/commands/deploy.js +138 -22
  5. package/dist/commands/deploy.js.map +1 -1
  6. package/dist/providers/typescript/TypeScriptProvider.js +2 -2
  7. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
  8. package/dist/providers/typescript/durableRuntime.d.ts +1 -1
  9. package/dist/providers/typescript/durableRuntime.d.ts.map +1 -1
  10. package/dist/providers/typescript/durableRuntime.js +7 -6
  11. package/dist/providers/typescript/durableRuntime.js.map +1 -1
  12. package/dist/providers/typescript/workflowShim.d.ts +2 -0
  13. package/dist/providers/typescript/workflowShim.d.ts.map +1 -0
  14. package/dist/providers/typescript/workflowShim.js +51 -0
  15. package/dist/providers/typescript/workflowShim.js.map +1 -0
  16. package/package.json +5 -5
  17. package/templates/typescript/init/package.json.hbs +1 -1
  18. package/templates/typescript/workflow-shim/api.js +5 -0
  19. package/templates/typescript/workflow-shim/index.js +2 -0
  20. package/templates/typescript/workflow-shim/internal/builtins.js +83 -0
  21. package/templates/typescript/workflow-shim/internal/class-serialization.js +1 -0
  22. package/templates/typescript/workflow-shim/runtime.js +1 -0
  23. package/templates/typescript/workflow-shim/stdlib.js +18 -0
  24. package/templates/typescript/workflow-shim/workflow.js +2 -0
  25. package/dist/_tmp_create_project.d.ts +0 -2
  26. package/dist/_tmp_create_project.d.ts.map +0 -1
  27. package/dist/_tmp_create_project.js +0 -17
  28. package/dist/_tmp_create_project.js.map +0 -1
  29. package/dist/_tmp_delete_agent.d.ts +0 -2
  30. package/dist/_tmp_delete_agent.d.ts.map +0 -1
  31. package/dist/_tmp_delete_agent.js +0 -14
  32. package/dist/_tmp_delete_agent.js.map +0 -1
  33. package/dist/_tmp_manual_trigger.d.ts +0 -2
  34. package/dist/_tmp_manual_trigger.d.ts.map +0 -1
  35. package/dist/_tmp_manual_trigger.js +0 -17
  36. package/dist/_tmp_manual_trigger.js.map +0 -1
  37. package/dist/_tmp_patch_active.d.ts +0 -2
  38. package/dist/_tmp_patch_active.d.ts.map +0 -1
  39. package/dist/_tmp_patch_active.js +0 -21
  40. package/dist/_tmp_patch_active.js.map +0 -1
  41. package/dist/attach.d.ts +0 -3
  42. package/dist/attach.d.ts.map +0 -1
  43. package/dist/attach.js +0 -61
  44. package/dist/attach.js.map +0 -1
  45. package/dist/auth.d.ts +0 -15
  46. package/dist/auth.d.ts.map +0 -1
  47. package/dist/auth.js +0 -169
  48. package/dist/auth.js.map +0 -1
  49. package/dist/codegen.d.ts +0 -135
  50. package/dist/codegen.d.ts.map +0 -1
  51. package/dist/codegen.js +0 -1196
  52. package/dist/codegen.js.map +0 -1
  53. package/dist/commands/deployTheme.d.ts +0 -28
  54. package/dist/commands/deployTheme.d.ts.map +0 -1
  55. package/dist/commands/deployTheme.js +0 -68
  56. package/dist/commands/deployTheme.js.map +0 -1
  57. package/dist/commands/dev.d.ts +0 -3
  58. package/dist/commands/dev.d.ts.map +0 -1
  59. package/dist/commands/dev.js +0 -47
  60. package/dist/commands/dev.js.map +0 -1
  61. package/dist/commands/fsExec.d.ts +0 -8
  62. package/dist/commands/fsExec.d.ts.map +0 -1
  63. package/dist/commands/fsExec.js +0 -46
  64. package/dist/commands/fsExec.js.map +0 -1
  65. package/dist/commands/metaAdsScope.d.ts +0 -12
  66. package/dist/commands/metaAdsScope.d.ts.map +0 -1
  67. package/dist/commands/metaAdsScope.js +0 -120
  68. package/dist/commands/metaAdsScope.js.map +0 -1
  69. package/dist/commands/serve.d.ts +0 -1
  70. package/dist/commands/serve.d.ts.map +0 -1
  71. package/dist/commands/serve.js +0 -2
  72. package/dist/commands/serve.js.map +0 -1
  73. package/dist/commands/terseCliTheme.d.ts +0 -28
  74. package/dist/commands/terseCliTheme.d.ts.map +0 -1
  75. package/dist/commands/terseCliTheme.js +0 -68
  76. package/dist/commands/terseCliTheme.js.map +0 -1
  77. package/dist/commands/tool.d.ts +0 -6
  78. package/dist/commands/tool.d.ts.map +0 -1
  79. package/dist/commands/tool.js +0 -34
  80. package/dist/commands/tool.js.map +0 -1
  81. package/dist/data/standardSlackEmoji.d.ts +0 -2
  82. package/dist/data/standardSlackEmoji.d.ts.map +0 -1
  83. package/dist/data/standardSlackEmoji.js +0 -1978
  84. package/dist/data/standardSlackEmoji.js.map +0 -1
  85. package/dist/data/standardSlackEmoji.json +0 -1974
  86. package/dist/deploy.d.ts +0 -3
  87. package/dist/deploy.d.ts.map +0 -1
  88. package/dist/deploy.js +0 -124
  89. package/dist/deploy.js.map +0 -1
  90. package/dist/generate.d.ts +0 -3
  91. package/dist/generate.d.ts.map +0 -1
  92. package/dist/generate.js +0 -282
  93. package/dist/generate.js.map +0 -1
  94. package/dist/init.d.ts +0 -3
  95. package/dist/init.d.ts.map +0 -1
  96. package/dist/init.js +0 -98
  97. package/dist/init.js.map +0 -1
  98. package/dist/integrate.d.ts +0 -3
  99. package/dist/integrate.d.ts.map +0 -1
  100. package/dist/integrate.js +0 -214
  101. package/dist/integrate.js.map +0 -1
  102. package/dist/nonInteractive.d.ts +0 -20
  103. package/dist/nonInteractive.d.ts.map +0 -1
  104. package/dist/nonInteractive.js +0 -60
  105. package/dist/nonInteractive.js.map +0 -1
  106. package/dist/perf.d.ts +0 -9
  107. package/dist/perf.d.ts.map +0 -1
  108. package/dist/perf.js +0 -59
  109. package/dist/perf.js.map +0 -1
  110. package/dist/providers/codegen.test.d.ts +0 -2
  111. package/dist/providers/codegen.test.d.ts.map +0 -1
  112. package/dist/providers/codegen.test.js +0 -45
  113. package/dist/providers/codegen.test.js.map +0 -1
  114. package/dist/providers/python/PythonProvider.d.ts +0 -51
  115. package/dist/providers/python/PythonProvider.d.ts.map +0 -1
  116. package/dist/providers/python/PythonProvider.js +0 -414
  117. package/dist/providers/python/PythonProvider.js.map +0 -1
  118. package/dist/providers/python/PythonProvider.test.d.ts +0 -2
  119. package/dist/providers/python/PythonProvider.test.d.ts.map +0 -1
  120. package/dist/providers/python/PythonProvider.test.js +0 -169
  121. package/dist/providers/python/PythonProvider.test.js.map +0 -1
  122. package/dist/providers/python/preparePythonCodegenData.d.ts +0 -139
  123. package/dist/providers/python/preparePythonCodegenData.d.ts.map +0 -1
  124. package/dist/providers/python/preparePythonCodegenData.js +0 -452
  125. package/dist/providers/python/preparePythonCodegenData.js.map +0 -1
  126. package/dist/providers/python/pythonTemplateEngine.d.ts +0 -3
  127. package/dist/providers/python/pythonTemplateEngine.d.ts.map +0 -1
  128. package/dist/providers/python/pythonTemplateEngine.js +0 -30
  129. package/dist/providers/python/pythonTemplateEngine.js.map +0 -1
  130. package/dist/providers/shared/shellUtils.d.ts +0 -2
  131. package/dist/providers/shared/shellUtils.d.ts.map +0 -1
  132. package/dist/providers/shared/shellUtils.js +0 -25
  133. package/dist/providers/shared/shellUtils.js.map +0 -1
  134. package/dist/providers/typescript/attioProjection.d.ts +0 -50
  135. package/dist/providers/typescript/attioProjection.d.ts.map +0 -1
  136. package/dist/providers/typescript/attioProjection.js +0 -358
  137. package/dist/providers/typescript/attioProjection.js.map +0 -1
  138. package/dist/providers/typescript/modules/cursor/CursorModule.d.ts +0 -20
  139. package/dist/providers/typescript/modules/cursor/CursorModule.d.ts.map +0 -1
  140. package/dist/providers/typescript/modules/cursor/CursorModule.js +0 -27
  141. package/dist/providers/typescript/modules/cursor/CursorModule.js.map +0 -1
  142. package/dist/providers/typescript/prepareCodegenData.d.ts +0 -166
  143. package/dist/providers/typescript/prepareCodegenData.d.ts.map +0 -1
  144. package/dist/providers/typescript/prepareCodegenData.js +0 -1431
  145. package/dist/providers/typescript/prepareCodegenData.js.map +0 -1
  146. package/dist/providers/typescript/prepareCodegenData.test.d.ts +0 -2
  147. package/dist/providers/typescript/prepareCodegenData.test.d.ts.map +0 -1
  148. package/dist/providers/typescript/prepareCodegenData.test.js +0 -54
  149. package/dist/providers/typescript/prepareCodegenData.test.js.map +0 -1
  150. package/dist/providers/typescript/projectedTypes.d.ts +0 -11
  151. package/dist/providers/typescript/projectedTypes.d.ts.map +0 -1
  152. package/dist/providers/typescript/projectedTypes.js +0 -53
  153. package/dist/providers/typescript/projectedTypes.js.map +0 -1
  154. package/dist/providers/typescript/projectionPrinter.d.ts +0 -26
  155. package/dist/providers/typescript/projectionPrinter.d.ts.map +0 -1
  156. package/dist/providers/typescript/projectionPrinter.js +0 -110
  157. package/dist/providers/typescript/projectionPrinter.js.map +0 -1
  158. package/dist/providers/typescript/replayLogDedupe.d.ts +0 -6
  159. package/dist/providers/typescript/replayLogDedupe.d.ts.map +0 -1
  160. package/dist/providers/typescript/replayLogDedupe.js +0 -156
  161. package/dist/providers/typescript/replayLogDedupe.js.map +0 -1
  162. package/dist/providers/typescript/triggerPayloads.d.ts +0 -7
  163. package/dist/providers/typescript/triggerPayloads.d.ts.map +0 -1
  164. package/dist/providers/typescript/triggerPayloads.js +0 -60
  165. package/dist/providers/typescript/triggerPayloads.js.map +0 -1
  166. package/dist/providers/typescript/triggerTypeRegistry.d.ts +0 -7
  167. package/dist/providers/typescript/triggerTypeRegistry.d.ts.map +0 -1
  168. package/dist/providers/typescript/triggerTypeRegistry.js +0 -198
  169. package/dist/providers/typescript/triggerTypeRegistry.js.map +0 -1
  170. package/dist/run.d.ts +0 -3
  171. package/dist/run.d.ts.map +0 -1
  172. package/dist/run.js +0 -72
  173. package/dist/run.js.map +0 -1
  174. package/dist/sampleEventCache.d.ts +0 -9
  175. package/dist/sampleEventCache.d.ts.map +0 -1
  176. package/dist/sampleEventCache.js +0 -47
  177. package/dist/sampleEventCache.js.map +0 -1
  178. package/dist/sampleEventId.d.ts +0 -9
  179. package/dist/sampleEventId.d.ts.map +0 -1
  180. package/dist/sampleEventId.js +0 -16
  181. package/dist/sampleEventId.js.map +0 -1
  182. package/dist/shared/ApiRoutes.d.ts +0 -348
  183. package/dist/shared/ApiRoutes.d.ts.map +0 -1
  184. package/dist/shared/ApiRoutes.js +0 -325
  185. package/dist/shared/ApiRoutes.js.map +0 -1
  186. package/dist/shared/ApprovalTypes.d.ts +0 -29
  187. package/dist/shared/ApprovalTypes.d.ts.map +0 -1
  188. package/dist/shared/ApprovalTypes.js +0 -8
  189. package/dist/shared/ApprovalTypes.js.map +0 -1
  190. package/dist/shared/ClientBoundTools.d.ts +0 -37
  191. package/dist/shared/ClientBoundTools.d.ts.map +0 -1
  192. package/dist/shared/ClientBoundTools.js +0 -37
  193. package/dist/shared/ClientBoundTools.js.map +0 -1
  194. package/dist/shared/Configs.d.ts +0 -488
  195. package/dist/shared/Configs.d.ts.map +0 -1
  196. package/dist/shared/Configs.js +0 -785
  197. package/dist/shared/Configs.js.map +0 -1
  198. package/dist/shared/DonatedState.d.ts +0 -5
  199. package/dist/shared/DonatedState.d.ts.map +0 -1
  200. package/dist/shared/DonatedState.js +0 -13
  201. package/dist/shared/DonatedState.js.map +0 -1
  202. package/dist/shared/Entities.d.ts +0 -8
  203. package/dist/shared/Entities.d.ts.map +0 -1
  204. package/dist/shared/Entities.js +0 -9
  205. package/dist/shared/Entities.js.map +0 -1
  206. package/dist/shared/FrontendRoutes.d.ts +0 -54
  207. package/dist/shared/FrontendRoutes.d.ts.map +0 -1
  208. package/dist/shared/FrontendRoutes.js +0 -54
  209. package/dist/shared/FrontendRoutes.js.map +0 -1
  210. package/dist/shared/Integrations.d.ts +0 -235
  211. package/dist/shared/Integrations.d.ts.map +0 -1
  212. package/dist/shared/Integrations.js +0 -143
  213. package/dist/shared/Integrations.js.map +0 -1
  214. package/dist/shared/InvalidationKeys.d.ts +0 -53
  215. package/dist/shared/InvalidationKeys.d.ts.map +0 -1
  216. package/dist/shared/InvalidationKeys.js +0 -166
  217. package/dist/shared/InvalidationKeys.js.map +0 -1
  218. package/dist/shared/ModelEvents.d.ts +0 -176
  219. package/dist/shared/ModelEvents.d.ts.map +0 -1
  220. package/dist/shared/ModelEvents.js +0 -29
  221. package/dist/shared/ModelEvents.js.map +0 -1
  222. package/dist/shared/Notifications.d.ts +0 -43
  223. package/dist/shared/Notifications.d.ts.map +0 -1
  224. package/dist/shared/Notifications.js +0 -6
  225. package/dist/shared/Notifications.js.map +0 -1
  226. package/dist/shared/RunHistoryTypes.d.ts +0 -95
  227. package/dist/shared/RunHistoryTypes.d.ts.map +0 -1
  228. package/dist/shared/RunHistoryTypes.js +0 -11
  229. package/dist/shared/RunHistoryTypes.js.map +0 -1
  230. package/dist/shared/SentNotifications.d.ts +0 -30
  231. package/dist/shared/SentNotifications.d.ts.map +0 -1
  232. package/dist/shared/SentNotifications.js +0 -13
  233. package/dist/shared/SentNotifications.js.map +0 -1
  234. package/dist/shared/SocketEvents.d.ts +0 -49
  235. package/dist/shared/SocketEvents.d.ts.map +0 -1
  236. package/dist/shared/SocketEvents.js +0 -53
  237. package/dist/shared/SocketEvents.js.map +0 -1
  238. package/dist/shared/Survey.d.ts +0 -10
  239. package/dist/shared/Survey.d.ts.map +0 -1
  240. package/dist/shared/Survey.js +0 -2
  241. package/dist/shared/Survey.js.map +0 -1
  242. package/dist/shared/TicketSystem.d.ts +0 -154
  243. package/dist/shared/TicketSystem.d.ts.map +0 -1
  244. package/dist/shared/TicketSystem.js +0 -21
  245. package/dist/shared/TicketSystem.js.map +0 -1
  246. package/dist/shared/ToolDisplayUtils.d.ts +0 -30
  247. package/dist/shared/ToolDisplayUtils.d.ts.map +0 -1
  248. package/dist/shared/ToolDisplayUtils.js +0 -1163
  249. package/dist/shared/ToolDisplayUtils.js.map +0 -1
  250. package/dist/shared/ToolsTypes.d.ts +0 -18
  251. package/dist/shared/ToolsTypes.d.ts.map +0 -1
  252. package/dist/shared/ToolsTypes.js +0 -2
  253. package/dist/shared/ToolsTypes.js.map +0 -1
  254. package/dist/shared/types.d.ts +0 -1732
  255. package/dist/shared/types.d.ts.map +0 -1
  256. package/dist/shared/types.js +0 -17
  257. package/dist/shared/types.js.map +0 -1
  258. package/dist/test.d.ts +0 -3
  259. package/dist/test.d.ts.map +0 -1
  260. package/dist/test.js +0 -82
  261. package/dist/test.js.map +0 -1
  262. package/dist/triggerParseDetail.d.ts +0 -8
  263. package/dist/triggerParseDetail.d.ts.map +0 -1
  264. package/dist/triggerParseDetail.js +0 -30
  265. package/dist/triggerParseDetail.js.map +0 -1
  266. package/dist/util.d.ts +0 -3
  267. package/dist/util.d.ts.map +0 -1
  268. package/dist/util.js +0 -5
  269. package/dist/util.js.map +0 -1
  270. 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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"}