terse-cli 0.1.69 → 0.1.70

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 (176) hide show
  1. package/dist/codegen.d.ts +0 -15
  2. package/dist/codegen.d.ts.map +1 -1
  3. package/dist/codegen.js +81 -466
  4. package/dist/codegen.js.map +1 -1
  5. package/dist/commands/deploy.d.ts.map +1 -1
  6. package/dist/commands/deploy.js +13 -0
  7. package/dist/commands/deploy.js.map +1 -1
  8. package/dist/commands/resume.d.ts +5 -0
  9. package/dist/commands/resume.d.ts.map +1 -0
  10. package/dist/commands/resume.js +29 -0
  11. package/dist/commands/resume.js.map +1 -0
  12. package/dist/deploy.d.ts +1 -2
  13. package/dist/deploy.d.ts.map +1 -1
  14. package/dist/deploy.js +38 -61
  15. package/dist/deploy.js.map +1 -1
  16. package/dist/generate.d.ts +1 -2
  17. package/dist/generate.d.ts.map +1 -1
  18. package/dist/generate.js +69 -67
  19. package/dist/generate.js.map +1 -1
  20. package/dist/index.js +18 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/init.d.ts +1 -2
  23. package/dist/init.d.ts.map +1 -1
  24. package/dist/init.js +96 -45
  25. package/dist/init.js.map +1 -1
  26. package/dist/integrate.d.ts +0 -1
  27. package/dist/integrate.d.ts.map +1 -1
  28. package/dist/integrate.js +11 -191
  29. package/dist/integrate.js.map +1 -1
  30. package/dist/jsonOutput.d.ts +19 -0
  31. package/dist/jsonOutput.d.ts.map +1 -0
  32. package/dist/jsonOutput.js +25 -0
  33. package/dist/jsonOutput.js.map +1 -0
  34. package/dist/nonInteractive.d.ts +2 -4
  35. package/dist/nonInteractive.d.ts.map +1 -1
  36. package/dist/nonInteractive.js +2 -5
  37. package/dist/nonInteractive.js.map +1 -1
  38. package/dist/providers/LanguageProvider.d.ts +12 -0
  39. package/dist/providers/LanguageProvider.d.ts.map +1 -1
  40. package/dist/providers/python/PythonProvider.js +0 -1
  41. package/dist/providers/python/PythonProvider.js.map +1 -1
  42. package/dist/providers/typescript/TypeScriptProvider.d.ts +12 -0
  43. package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
  44. package/dist/providers/typescript/TypeScriptProvider.js +27 -95
  45. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
  46. package/dist/providers/typescript/durableRuntime.d.ts +19 -0
  47. package/dist/providers/typescript/durableRuntime.d.ts.map +1 -0
  48. package/dist/providers/typescript/durableRuntime.js +179 -0
  49. package/dist/providers/typescript/durableRuntime.js.map +1 -0
  50. package/dist/providers/typescript/jobMacro.d.ts +12 -0
  51. package/dist/providers/typescript/jobMacro.d.ts.map +1 -0
  52. package/dist/providers/typescript/jobMacro.js +116 -0
  53. package/dist/providers/typescript/jobMacro.js.map +1 -0
  54. package/dist/providers/typescript/parkSignals.d.ts +7 -0
  55. package/dist/providers/typescript/parkSignals.d.ts.map +1 -0
  56. package/dist/providers/typescript/parkSignals.js +45 -0
  57. package/dist/providers/typescript/parkSignals.js.map +1 -0
  58. package/dist/providers/typescript/rewindRun.d.ts +9 -0
  59. package/dist/providers/typescript/rewindRun.d.ts.map +1 -0
  60. package/dist/providers/typescript/rewindRun.js +111 -0
  61. package/dist/providers/typescript/rewindRun.js.map +1 -0
  62. package/dist/providers/typescript/runtimes/JobRuntime.d.ts +23 -0
  63. package/dist/providers/typescript/runtimes/JobRuntime.d.ts.map +1 -0
  64. package/dist/providers/typescript/runtimes/JobRuntime.js +4 -0
  65. package/dist/providers/typescript/runtimes/JobRuntime.js.map +1 -0
  66. package/dist/providers/typescript/runtimes/directJobRuntime.d.ts +3 -0
  67. package/dist/providers/typescript/runtimes/directJobRuntime.d.ts.map +1 -0
  68. package/dist/providers/typescript/runtimes/directJobRuntime.js +50 -0
  69. package/dist/providers/typescript/runtimes/directJobRuntime.js.map +1 -0
  70. package/dist/providers/typescript/runtimes/durableJobRuntime.d.ts +3 -0
  71. package/dist/providers/typescript/runtimes/durableJobRuntime.d.ts.map +1 -0
  72. package/dist/providers/typescript/runtimes/durableJobRuntime.js +95 -0
  73. package/dist/providers/typescript/runtimes/durableJobRuntime.js.map +1 -0
  74. package/dist/providers/typescript/runtimes/index.d.ts +4 -0
  75. package/dist/providers/typescript/runtimes/index.d.ts.map +1 -0
  76. package/dist/providers/typescript/runtimes/index.js +3 -0
  77. package/dist/providers/typescript/runtimes/index.js.map +1 -0
  78. package/dist/providers/typescript/runtimes/session.d.ts +2 -0
  79. package/dist/providers/typescript/runtimes/session.d.ts.map +1 -0
  80. package/dist/providers/typescript/runtimes/session.js +59 -0
  81. package/dist/providers/typescript/runtimes/session.js.map +1 -0
  82. package/dist/providers/typescript/terseWorkflowBuilder.d.ts +7 -0
  83. package/dist/providers/typescript/terseWorkflowBuilder.d.ts.map +1 -0
  84. package/dist/providers/typescript/terseWorkflowBuilder.js +43 -0
  85. package/dist/providers/typescript/terseWorkflowBuilder.js.map +1 -0
  86. package/dist/replay.d.ts +3 -0
  87. package/dist/replay.d.ts.map +1 -0
  88. package/dist/replay.js +20 -0
  89. package/dist/replay.js.map +1 -0
  90. package/dist/run.d.ts +11 -2
  91. package/dist/run.d.ts.map +1 -1
  92. package/dist/run.js +153 -42
  93. package/dist/run.js.map +1 -1
  94. package/dist/sampleEventId.d.ts +4 -0
  95. package/dist/sampleEventId.d.ts.map +1 -1
  96. package/dist/sampleEventId.js +4 -0
  97. package/dist/sampleEventId.js.map +1 -1
  98. package/dist/shared/ApiRoutes.d.ts +0 -19
  99. package/dist/shared/ApiRoutes.d.ts.map +1 -1
  100. package/dist/shared/ApiRoutes.js +1 -17
  101. package/dist/shared/ApiRoutes.js.map +1 -1
  102. package/dist/shared/Configs.d.ts +2 -24
  103. package/dist/shared/Configs.d.ts.map +1 -1
  104. package/dist/shared/Configs.js +2 -32
  105. package/dist/shared/Configs.js.map +1 -1
  106. package/dist/shared/Integrations.d.ts +1 -18
  107. package/dist/shared/Integrations.d.ts.map +1 -1
  108. package/dist/shared/Integrations.js +1 -10
  109. package/dist/shared/Integrations.js.map +1 -1
  110. package/dist/shared/InvalidationKeys.d.ts +0 -1
  111. package/dist/shared/InvalidationKeys.d.ts.map +1 -1
  112. package/dist/shared/InvalidationKeys.js +0 -3
  113. package/dist/shared/InvalidationKeys.js.map +1 -1
  114. package/dist/shared/ModelEvents.d.ts +0 -9
  115. package/dist/shared/ModelEvents.d.ts.map +1 -1
  116. package/dist/shared/ModelEvents.js +0 -15
  117. package/dist/shared/ModelEvents.js.map +1 -1
  118. package/dist/shared/ToolDisplayUtils.d.ts.map +1 -1
  119. package/dist/shared/ToolDisplayUtils.js +11 -107
  120. package/dist/shared/ToolDisplayUtils.js.map +1 -1
  121. package/dist/shared/types.d.ts +108 -1013
  122. package/dist/shared/types.d.ts.map +1 -1
  123. package/dist/shared/types.js.map +1 -1
  124. package/dist/terseWorld.d.ts +4 -0
  125. package/dist/terseWorld.d.ts.map +1 -0
  126. package/dist/terseWorld.js +46 -0
  127. package/dist/terseWorld.js.map +1 -0
  128. package/dist/test.d.ts +1 -2
  129. package/dist/test.d.ts.map +1 -1
  130. package/dist/test.js +23 -43
  131. package/dist/test.js.map +1 -1
  132. package/dist/urls.d.ts +3 -0
  133. package/dist/urls.d.ts.map +1 -0
  134. package/dist/urls.js +27 -0
  135. package/dist/urls.js.map +1 -0
  136. package/dist/util.d.ts +3 -2
  137. package/dist/util.d.ts.map +1 -1
  138. package/dist/util.js +3 -3
  139. package/dist/util.js.map +1 -1
  140. package/package.json +7 -3
  141. package/dist/commands/deployTheme.d.ts +0 -28
  142. package/dist/commands/deployTheme.d.ts.map +0 -1
  143. package/dist/commands/deployTheme.js +0 -68
  144. package/dist/commands/deployTheme.js.map +0 -1
  145. package/dist/commands/dev.d.ts +0 -3
  146. package/dist/commands/dev.d.ts.map +0 -1
  147. package/dist/commands/dev.js +0 -47
  148. package/dist/commands/dev.js.map +0 -1
  149. package/dist/commands/fsExec.d.ts +0 -8
  150. package/dist/commands/fsExec.d.ts.map +0 -1
  151. package/dist/commands/fsExec.js +0 -46
  152. package/dist/commands/fsExec.js.map +0 -1
  153. package/dist/commands/serve.d.ts +0 -1
  154. package/dist/commands/serve.d.ts.map +0 -1
  155. package/dist/commands/serve.js +0 -2
  156. package/dist/commands/serve.js.map +0 -1
  157. package/dist/commands/terseCliTheme.d.ts +0 -28
  158. package/dist/commands/terseCliTheme.d.ts.map +0 -1
  159. package/dist/commands/terseCliTheme.js +0 -68
  160. package/dist/commands/terseCliTheme.js.map +0 -1
  161. package/dist/perf.d.ts +0 -9
  162. package/dist/perf.d.ts.map +0 -1
  163. package/dist/perf.js +0 -59
  164. package/dist/perf.js.map +0 -1
  165. package/dist/providers/codegen.test.d.ts +0 -2
  166. package/dist/providers/codegen.test.d.ts.map +0 -1
  167. package/dist/providers/codegen.test.js +0 -45
  168. package/dist/providers/codegen.test.js.map +0 -1
  169. package/dist/providers/python/PythonProvider.test.d.ts +0 -2
  170. package/dist/providers/python/PythonProvider.test.d.ts.map +0 -1
  171. package/dist/providers/python/PythonProvider.test.js +0 -169
  172. package/dist/providers/python/PythonProvider.test.js.map +0 -1
  173. package/dist/providers/typescript/prepareCodegenData.test.d.ts +0 -2
  174. package/dist/providers/typescript/prepareCodegenData.test.d.ts.map +0 -1
  175. package/dist/providers/typescript/prepareCodegenData.test.js +0 -54
  176. package/dist/providers/typescript/prepareCodegenData.test.js.map +0 -1
@@ -0,0 +1,9 @@
1
+ export type RewindResult = {
2
+ workflowRunId: string;
3
+ rewoundStepId: string | null;
4
+ deletedEvents: number;
5
+ };
6
+ export declare function resolveWorkflowRunId(dataDir: string, id: string): string;
7
+ export declare function readRunStatus(dataDir: string, workflowRunId: string): string | null;
8
+ export declare function rewindFailedRun(dataDir: string, workflowRunId: string): RewindResult;
9
+ //# sourceMappingURL=rewindRun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewindRun.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/rewindRun.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,YAAY,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAA;AAIzG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,CA8CpF"}
@@ -0,0 +1,111 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const STEP_EVENT_TYPES = new Set(["step_created", "step_started", "step_completed", "step_failed", "step_retrying"]);
4
+ export function resolveWorkflowRunId(dataDir, id) {
5
+ if (id.startsWith("wrun_"))
6
+ return id;
7
+ const runsDir = path.join(dataDir, "runs");
8
+ if (fs.existsSync(runsDir)) {
9
+ for (const file of fs.readdirSync(runsDir)) {
10
+ if (!file.endsWith(".json"))
11
+ continue;
12
+ const run = readJson(path.join(runsDir, file));
13
+ if (run?.attributes?.runId === id)
14
+ return run.runId;
15
+ }
16
+ }
17
+ throw new Error(`No durable run is mapped to Terse run id "${id}". Pass a workflow run id (wrun_...) directly if you have it.`);
18
+ }
19
+ export function readRunStatus(dataDir, workflowRunId) {
20
+ return readJson(path.join(dataDir, "runs", `${workflowRunId}.json`))?.status ?? null;
21
+ }
22
+ export function rewindFailedRun(dataDir, workflowRunId) {
23
+ const runFile = path.join(dataDir, "runs", `${workflowRunId}.json`);
24
+ const run = readJson(runFile);
25
+ if (!run)
26
+ throw new Error(`Run "${workflowRunId}" not found in ${dataDir}.`);
27
+ if (run.status !== "failed")
28
+ throw new Error(`Run "${workflowRunId}" is "${run.status}", not "failed" — nothing to rewind.`);
29
+ const events = listRunEvents(dataDir, workflowRunId);
30
+ // Only operate on journal shapes we can reason about; otherwise the caller
31
+ // should re-run the job fresh instead.
32
+ if (hasUnclosed(events, "wait_created", "wait_completed"))
33
+ throw new Error(`Run "${workflowRunId}" has an open wait; re-drive is not supported. Re-run it fresh instead.`);
34
+ if (hasUnclosed(events, "hook_created", "hook_disposed"))
35
+ throw new Error(`Run "${workflowRunId}" has an open hook; re-drive is not supported. Re-run it fresh instead.`);
36
+ const completed = new Set(events.filter(e => e.eventType === "step_completed").map(e => e.correlationId));
37
+ const touched = new Set(events.filter(e => STEP_EVENT_TYPES.has(e.eventType) && e.correlationId).map(e => e.correlationId));
38
+ const incomplete = [...touched].filter(id => !completed.has(id));
39
+ if (incomplete.length > 1)
40
+ throw new Error(`Run "${workflowRunId}" has ${incomplete.length} incomplete steps; re-drive only supports a single failed step. Re-run it fresh instead.`);
41
+ const rewoundStepId = incomplete[0] ?? null;
42
+ backupRun(dataDir, workflowRunId, runFile, events);
43
+ let deletedEvents = 0;
44
+ for (const e of events) {
45
+ const isFailureMarker = e.eventType === "run_failed";
46
+ const isRewoundStepEvent = rewoundStepId !== null && e.correlationId === rewoundStepId && STEP_EVENT_TYPES.has(e.eventType);
47
+ if (isFailureMarker || isRewoundStepEvent) {
48
+ fs.rmSync(path.join(dataDir, "events", e.file), { force: true });
49
+ deletedEvents++;
50
+ }
51
+ }
52
+ // Drop any non-completed step entity (covers the failed step regardless of how its
53
+ // composite key is derived) so replay re-executes it rather than seeing it terminal.
54
+ for (const file of listRunStepFiles(dataDir, workflowRunId)) {
55
+ const step = readJson(path.join(dataDir, "steps", file));
56
+ if (step && step.status !== "completed")
57
+ fs.rmSync(path.join(dataDir, "steps", file), { force: true });
58
+ }
59
+ delete run.error;
60
+ delete run.completedAt;
61
+ delete run.output;
62
+ run.status = "running";
63
+ run.updatedAt = new Date().toISOString();
64
+ fs.writeFileSync(runFile, JSON.stringify(run, null, 2));
65
+ return { workflowRunId, rewoundStepId, deletedEvents };
66
+ }
67
+ function listRunEvents(dataDir, workflowRunId) {
68
+ const eventsDir = path.join(dataDir, "events");
69
+ if (!fs.existsSync(eventsDir))
70
+ return [];
71
+ const prefix = `${workflowRunId}-`;
72
+ const out = [];
73
+ for (const file of fs.readdirSync(eventsDir)) {
74
+ if (!file.startsWith(prefix) || !file.endsWith(".json"))
75
+ continue;
76
+ const event = readJson(path.join(eventsDir, file));
77
+ if (event?.eventType)
78
+ out.push({ file, eventType: event.eventType, correlationId: event.correlationId });
79
+ }
80
+ return out;
81
+ }
82
+ function listRunStepFiles(dataDir, workflowRunId) {
83
+ const stepsDir = path.join(dataDir, "steps");
84
+ if (!fs.existsSync(stepsDir))
85
+ return [];
86
+ return fs.readdirSync(stepsDir).filter(file => file.startsWith(`${workflowRunId}-`) && file.endsWith(".json"));
87
+ }
88
+ function hasUnclosed(events, openType, closeType) {
89
+ const closed = new Set(events.filter(e => e.eventType === closeType).map(e => e.correlationId));
90
+ return events.some(e => e.eventType === openType && !closed.has(e.correlationId));
91
+ }
92
+ function backupRun(dataDir, workflowRunId, runFile, events) {
93
+ const dir = path.join(dataDir, ".rewind-backup", `${workflowRunId}-${Date.now()}`);
94
+ fs.mkdirSync(path.join(dir, "events"), { recursive: true });
95
+ fs.mkdirSync(path.join(dir, "steps"), { recursive: true });
96
+ fs.mkdirSync(path.join(dir, "runs"), { recursive: true });
97
+ fs.copyFileSync(runFile, path.join(dir, "runs", `${workflowRunId}.json`));
98
+ for (const e of events)
99
+ fs.copyFileSync(path.join(dataDir, "events", e.file), path.join(dir, "events", e.file));
100
+ for (const file of listRunStepFiles(dataDir, workflowRunId))
101
+ fs.copyFileSync(path.join(dataDir, "steps", file), path.join(dir, "steps", file));
102
+ }
103
+ function readJson(file) {
104
+ try {
105
+ return JSON.parse(fs.readFileSync(file, "utf8"));
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ //# sourceMappingURL=rewindRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewindRun.js","sourceRoot":"","sources":["../../../src/providers/typescript/rewindRun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAa5B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC,CAAA;AAEpH,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,EAAU;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAQ;YACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;YAC9C,IAAI,GAAG,EAAE,UAAU,EAAE,KAAK,KAAK,EAAE;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAA;QACvD,CAAC;IACL,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,EAAE,+DAA+D,CAAC,CAAA;AACnI,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,aAAqB;IAChE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,OAAO,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAA;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,aAAqB;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,OAAO,CAAC,CAAA;IACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,aAAa,kBAAkB,OAAO,GAAG,CAAC,CAAA;IAC5E,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,aAAa,SAAS,GAAG,CAAC,MAAM,sCAAsC,CAAC,CAAA;IAE5H,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAEpD,2EAA2E;IAC3E,uCAAuC;IACvC,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,gBAAgB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,aAAa,yEAAyE,CAAC,CAAA;IAC1K,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,aAAa,yEAAyE,CAAC,CAAA;IAEzK,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;IACzG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;IAC3H,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAChE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,aAAa,SAAS,UAAU,CAAC,MAAM,0FAA0F,CAAC,CAAA;IACrL,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAE3C,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAElD,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrB,MAAM,eAAe,GAAG,CAAC,CAAC,SAAS,KAAK,YAAY,CAAA;QACpD,MAAM,kBAAkB,GAAG,aAAa,KAAK,IAAI,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC3H,IAAI,eAAe,IAAI,kBAAkB,EAAE,CAAC;YACxC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAChE,aAAa,EAAE,CAAA;QACnB,CAAC;IACL,CAAC;IAED,mFAAmF;IACnF,qFAAqF;IACrF,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QACxD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1G,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAA;IAChB,OAAO,GAAG,CAAC,WAAW,CAAA;IACtB,OAAO,GAAG,CAAC,MAAM,CAAA;IACjB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAA;IACtB,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACxC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAEvD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,CAAA;AAC1D,CAAC;AAID,SAAS,aAAa,CAAC,OAAe,EAAE,aAAqB;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAA;IACxC,MAAM,MAAM,GAAG,GAAG,aAAa,GAAG,CAAA;IAClC,MAAM,GAAG,GAAe,EAAE,CAAA;IAC1B,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;QAClD,IAAI,KAAK,EAAE,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,aAAqB;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,OAAO,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;AAClH,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB,EAAE,QAAgB,EAAE,SAAiB;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/F,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;AACrF,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,aAAqB,EAAE,OAAe,EAAE,MAAkB;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,OAAO,CAAC,CAAC,CAAA;IACzE,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/G,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;AAClJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC1B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACpD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { CreateJobParameters } from "terse-sdk";
2
+ import type { SerializedEvent } from "terse-types";
3
+ export type RunJobOptions = {
4
+ verbose?: boolean;
5
+ entryFile?: string;
6
+ projectId?: string;
7
+ pauseUiAround?: <T>(fn: () => Promise<T>) => Promise<T>;
8
+ };
9
+ export type ResumeRunOptions = {
10
+ verbose?: boolean;
11
+ pauseUiAround?: <T>(fn: () => Promise<T>) => Promise<T>;
12
+ };
13
+ export type ResumeHookInput = {
14
+ token: string;
15
+ payload: unknown;
16
+ };
17
+ export interface JobRuntime {
18
+ executeJob(job: CreateJobParameters, runId: string | null, event: SerializedEvent, opts?: RunJobOptions): Promise<void>;
19
+ resumeRun(runId: string, opts?: ResumeRunOptions): Promise<void>;
20
+ resumeRunWithInput(runId: string, input: ResumeHookInput, opts?: ResumeRunOptions): Promise<void>;
21
+ }
22
+ export declare function formatErrorDetail(error: unknown): string;
23
+ //# sourceMappingURL=JobRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobRuntime.d.ts","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/JobRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,MAAM,aAAa,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD"}
@@ -0,0 +1,4 @@
1
+ export function formatErrorDetail(error) {
2
+ return error instanceof Error ? error.message : String(error);
3
+ }
4
+ //# sourceMappingURL=JobRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobRuntime.js","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/JobRuntime.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type JobRuntime } from "./JobRuntime.js";
2
+ export declare const directJobRuntime: JobRuntime;
3
+ //# sourceMappingURL=directJobRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directJobRuntime.d.ts","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/directJobRuntime.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,iBAAiB,CAAA;AAGpE,eAAO,MAAM,gBAAgB,EAAE,UAuC9B,CAAA"}
@@ -0,0 +1,50 @@
1
+ import chalk from "chalk";
2
+ import { __buildJobStateAccessor, createSDKTrigger } from "terse-sdk";
3
+ import { runWithJobContext } from "terse-sdk/dist/runIdentity/jobContextStore.js";
4
+ import { readApiKeyOrBail } from "../../../api.js";
5
+ import { CliError } from "../../../cliError.js";
6
+ import { BACKEND_URL } from "../../../config.js";
7
+ import { formatErrorDetail } from "./JobRuntime.js";
8
+ import { withSession } from "./session.js";
9
+ export const directJobRuntime = {
10
+ async executeJob(job, runId, event, opts) {
11
+ const isVerbose = opts?.verbose ?? true;
12
+ const pauseUiAround = opts?.pauseUiAround ?? (async (fn) => fn());
13
+ const apiKey = readApiKeyOrBail({ title: "TERSE_API_KEY is not set.", detail: "Please set it in your environment variables." });
14
+ const inputEvent = createSDKTrigger(event);
15
+ try {
16
+ await withSession(apiKey, isVerbose, pauseUiAround, async (sessionId) => {
17
+ await runWithJobContext({ sessionId, runId, apiBaseUrl: BACKEND_URL, projectId: opts?.projectId, jobName: job.name }, async () => {
18
+ const state = __buildJobStateAccessor(job.states ?? []);
19
+ if (job.filter && !(await job.filter(inputEvent, state))) {
20
+ if (isVerbose)
21
+ console.log(chalk.dim(`\n Job "${job.name}" skipped (filter returned false).\n`));
22
+ return;
23
+ }
24
+ if (isVerbose)
25
+ console.log(chalk.cyan(` Job "${job.name}" started`));
26
+ await job.onTrigger(inputEvent, state);
27
+ });
28
+ });
29
+ }
30
+ catch (error) {
31
+ if (error instanceof CliError)
32
+ throw error;
33
+ if (error instanceof Error && error.name === "DurableOnlyError") {
34
+ throw new CliError("durable_only", error.message, { actionRequired: true });
35
+ }
36
+ throw new CliError("job_execution_failed", `Job "${job.name}" threw an error.`, { detail: formatErrorDetail(error) });
37
+ }
38
+ },
39
+ async resumeRun() {
40
+ throw new CliError("resume_not_durable", "Only durable jobs can be resumed.", {
41
+ detail: "This run belongs to a non-durable job — non-durable jobs run to completion and never suspend."
42
+ });
43
+ },
44
+ async resumeRunWithInput() {
45
+ throw new CliError("resume_not_durable", "Only durable jobs can be resumed.", {
46
+ detail: "This run belongs to a non-durable job — non-durable jobs run to completion and never suspend."
47
+ });
48
+ }
49
+ };
50
+ //# sourceMappingURL=directJobRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directJobRuntime.js","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/directJobRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type JobRuntime } from "./JobRuntime.js";
2
+ export declare const durableJobRuntime: JobRuntime;
3
+ //# sourceMappingURL=durableJobRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durableJobRuntime.d.ts","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/durableJobRuntime.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,UAAU,EAAkE,MAAM,iBAAiB,CAAA;AAGjH,eAAO,MAAM,iBAAiB,EAAE,UA6B/B,CAAA"}
@@ -0,0 +1,95 @@
1
+ import chalk from "chalk";
2
+ import path from "node:path";
3
+ import { readApiKeyOrBail } from "../../../api.js";
4
+ import { CliError } from "../../../cliError.js";
5
+ import { BACKEND_URL } from "../../../config.js";
6
+ import { isCliRunCommandEnabled } from "../../../env.js";
7
+ import { getDurableRuntime } from "../durableRuntime.js";
8
+ import { readRunStatus, resolveWorkflowRunId, rewindFailedRun } from "../rewindRun.js";
9
+ import { formatErrorDetail } from "./JobRuntime.js";
10
+ import { withSession } from "./session.js";
11
+ export const durableJobRuntime = {
12
+ async executeJob(job, runId, event, opts) {
13
+ const isVerbose = opts?.verbose ?? true;
14
+ const pauseUiAround = opts?.pauseUiAround ?? (async (fn) => fn());
15
+ const apiKey = readApiKeyOrBail({ title: "TERSE_API_KEY is not set.", detail: "Please set it in your environment variables." });
16
+ try {
17
+ await withSession(apiKey, isVerbose, pauseUiAround, async (sessionId) => {
18
+ if (isVerbose)
19
+ console.log(chalk.cyan(` Job "${job.name}" started`));
20
+ const rt = await getDurableRuntime(process.cwd());
21
+ await rt.start();
22
+ const dispatched = await rt.dispatchJob(job.name, { sessionId, runId, apiBaseUrl: BACKEND_URL }, event);
23
+ // We can't await in the Modal Sandbox. This polls, and a blocked run will never exit.
24
+ if (!isCliRunCommandEnabled())
25
+ await dispatched.awaitResult();
26
+ });
27
+ }
28
+ catch (error) {
29
+ if (error instanceof CliError)
30
+ throw error;
31
+ throw new CliError("job_execution_failed", `Job "${job.name}" threw an error.`, { detail: formatErrorDetail(error) });
32
+ }
33
+ },
34
+ async resumeRun(runId, opts) {
35
+ return driveResume(runId, opts);
36
+ },
37
+ async resumeRunWithInput(runId, input, opts) {
38
+ return driveResume(runId, opts, input);
39
+ }
40
+ };
41
+ async function driveResume(runId, opts, input) {
42
+ const isVerbose = opts?.verbose ?? true;
43
+ const pauseUiAround = opts?.pauseUiAround ?? (async (fn) => fn());
44
+ const apiKey = readApiKeyOrBail({ title: "TERSE_API_KEY is not set.", detail: "Please set it in your environment variables." });
45
+ const dataDir = resolveDataDir();
46
+ const workflowRunId = resolveWorkflowRunId(dataDir, runId);
47
+ const status = readRunStatus(dataDir, workflowRunId);
48
+ try {
49
+ await withSession(apiKey, isVerbose, pauseUiAround, async () => {
50
+ if (status === "failed") {
51
+ const { rewoundStepId } = rewindFailedRun(dataDir, workflowRunId);
52
+ if (isVerbose)
53
+ console.log(chalk.yellow(` Re-driving failed run ${workflowRunId}${rewoundStepId ? " from the failed step" : ""}; completed steps replay from the journal`));
54
+ }
55
+ else if (isVerbose) {
56
+ console.log(chalk.cyan(` Resuming run ${workflowRunId}`));
57
+ }
58
+ const rt = await getDurableRuntime(process.cwd());
59
+ if (input) {
60
+ await deliverInput(rt, input, isVerbose);
61
+ }
62
+ else {
63
+ await rt.start();
64
+ }
65
+ if (isCliRunCommandEnabled())
66
+ return;
67
+ await rt.awaitRunResult(workflowRunId);
68
+ if (isVerbose)
69
+ console.log(chalk.green(` Run ${workflowRunId} completed`));
70
+ });
71
+ }
72
+ catch (error) {
73
+ if (error instanceof CliError)
74
+ throw error;
75
+ throw new CliError("run_resume_failed", `Run "${runId}" could not be resumed.`, { detail: formatErrorDetail(error) });
76
+ }
77
+ }
78
+ function resolveDataDir() {
79
+ return process.env.WORKFLOW_LOCAL_DATA_DIR ?? path.join(process.cwd(), ".terse", "data");
80
+ }
81
+ // Input resumes skip start(): resumeHook re-queues the run itself, and start()'s
82
+ // crash-recovery wake would add a concurrent second replay.
83
+ async function deliverInput(rt, input, isVerbose) {
84
+ try {
85
+ await rt.deliverInput(input.token, input.payload);
86
+ if (isVerbose)
87
+ console.log(chalk.cyan(` Delivered input response to hook ${input.token}`));
88
+ }
89
+ catch (error) {
90
+ // Stale token: recovery replay instead; the run re-parks on its real wait.
91
+ console.log(chalk.yellow(` Could not deliver input response to hook ${input.token}: ${formatErrorDetail(error)}`));
92
+ await rt.start();
93
+ }
94
+ }
95
+ //# sourceMappingURL=durableJobRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durableJobRuntime.js","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/durableJobRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { directJobRuntime } from "./directJobRuntime.js";
2
+ export { durableJobRuntime } from "./durableJobRuntime.js";
3
+ export type { JobRuntime, ResumeRunOptions, RunJobOptions } from "./JobRuntime.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { directJobRuntime } from "./directJobRuntime.js";
2
+ export { durableJobRuntime } from "./durableJobRuntime.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function withSession<T>(apiKey: string, isVerbose: boolean, pauseUiAround: <U>(fn: () => Promise<U>) => Promise<U>, action: (sessionId: string) => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/session.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmDtL"}
@@ -0,0 +1,59 @@
1
+ import chalk from "chalk";
2
+ import { isAgentApprovalHandlingClaimed } from "terse-sdk";
3
+ import { isCliRunCommandEnabled } from "../../../env.js";
4
+ import { openSessionStream, promptForToolApproval, submitApprovalDecision } from "../../shared/sessionStream.js";
5
+ let sessionPaused = false;
6
+ // Holds a session stream open (for tool-approval routing) for the duration of `action`.
7
+ export async function withSession(apiKey, isVerbose, pauseUiAround, action) {
8
+ let latestRunId = null;
9
+ const handleSessionEvent = async (event) => {
10
+ if (event.type === "run_started") {
11
+ latestRunId = event.runId;
12
+ return;
13
+ }
14
+ if (event.type !== "tool_approval_requested")
15
+ return;
16
+ if (isCliRunCommandEnabled())
17
+ return;
18
+ if (isAgentApprovalHandlingClaimed())
19
+ return;
20
+ const runId = latestRunId;
21
+ if (!runId) {
22
+ console.error(chalk.red(" Received approval request before run_started — cannot route decision."));
23
+ return;
24
+ }
25
+ const { toolName, arguments: rawArguments, stepId } = event.toolApprovalRequested;
26
+ if (!process.stdout.isTTY) {
27
+ console.error(chalk.red(` Approval required for "${toolName}" but no TTY is attached — auto-rejecting.`));
28
+ console.error(chalk.dim(" In non-interactive contexts, set TerseAgent.onApprovalRequired in your job code."));
29
+ try {
30
+ await submitApprovalDecision(apiKey, { runId, stepId, approved: false });
31
+ }
32
+ catch (error) {
33
+ console.error(chalk.red(` Failed to submit auto-reject: ${error.message}`));
34
+ }
35
+ return;
36
+ }
37
+ sessionPaused = true;
38
+ try {
39
+ await pauseUiAround(async () => {
40
+ const approved = await promptForToolApproval(toolName, rawArguments);
41
+ await submitApprovalDecision(apiKey, { runId, stepId, approved });
42
+ });
43
+ }
44
+ catch (error) {
45
+ console.error(chalk.red(` Failed to submit approval decision: ${error.message}`));
46
+ }
47
+ finally {
48
+ sessionPaused = false;
49
+ }
50
+ };
51
+ const session = await openSessionStream(apiKey, { verbose: isVerbose, isPaused: () => sessionPaused, onEvent: handleSessionEvent });
52
+ try {
53
+ return await action(session.sessionId);
54
+ }
55
+ finally {
56
+ session.close?.();
57
+ }
58
+ }
59
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/providers/typescript/runtimes/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseBuilder } from "@workflow/builders";
2
+ export declare class TerseWorkflowBuilder extends BaseBuilder {
3
+ private readonly outDir;
4
+ constructor(workingDir: string, scanDir: string, outDir: string);
5
+ build(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=terseWorkflowBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terseWorkflowBuilder.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/terseWorkflowBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,oBAAoB,CAAA;AAYzE,qBAAa,oBAAqB,SAAQ,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAWzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB/B"}
@@ -0,0 +1,43 @@
1
+ import { BaseBuilder, createBaseBuilderConfig } from "@workflow/builders";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ // Modeled on @workflow/nest's NestLocalBuilder: scan `scanDir` and emit bundles
5
+ // to an out dir OUTSIDE it. The builder globs inputs rooted at `dirs`, so output
6
+ // kept outside `dirs` is never re-globbed as an input — which is what lets
7
+ // re-tests overwrite the bundles cleanly. (StandaloneBuilder forces dirs: ['.'],
8
+ // scanning the whole project, which is why its output collided with itself.)
9
+ // `scanDir` (relative to workingDir) holds the macro-transformed sources, so the
10
+ // builder discovers the `"use workflow"` functions the job macro injected into
11
+ // each createJob's onTrigger.
12
+ export class TerseWorkflowBuilder extends BaseBuilder {
13
+ outDir;
14
+ constructor(workingDir, scanDir, outDir) {
15
+ super({
16
+ ...createBaseBuilderConfig({ workingDir, dirs: [scanDir], watch: false }),
17
+ buildTarget: "standalone",
18
+ stepsBundlePath: path.join(outDir, "steps.cjs"),
19
+ workflowsBundlePath: path.join(outDir, "workflows.cjs"),
20
+ webhookBundlePath: path.join(outDir, "webhook.cjs")
21
+ });
22
+ this.outDir = outDir;
23
+ }
24
+ async build() {
25
+ const inputFiles = await this.getInputFiles();
26
+ fs.mkdirSync(this.outDir, { recursive: true });
27
+ const { manifest: workflows } = await this.createWorkflowsBundle({ outfile: path.join(this.outDir, "workflows.cjs"), format: "cjs", inputFiles });
28
+ const { manifest: steps } = await this.createStepsBundle({ outfile: path.join(this.outDir, "steps.cjs"), format: "cjs", inputFiles });
29
+ await this.createWebhookBundle({ outfile: path.join(this.outDir, "webhook.cjs"), bundle: false });
30
+ await this.createManifest({
31
+ workflowBundlePath: path.join(this.outDir, "workflows.cjs"),
32
+ manifestDir: this.outDir,
33
+ manifest: {
34
+ steps: { ...steps.steps, ...workflows.steps },
35
+ workflows: { ...steps.workflows, ...workflows.workflows },
36
+ classes: { ...steps.classes, ...workflows.classes }
37
+ }
38
+ });
39
+ // generated build output — keep it out of the user's git
40
+ fs.writeFileSync(path.join(this.outDir, ".gitignore"), "*\n");
41
+ }
42
+ }
43
+ //# sourceMappingURL=terseWorkflowBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terseWorkflowBuilder.js","sourceRoot":"","sources":["../../../src/providers/typescript/terseWorkflowBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,gFAAgF;AAChF,iFAAiF;AACjF,2EAA2E;AAC3E,iFAAiF;AACjF,6EAA6E;AAC7E,iFAAiF;AACjF,+EAA+E;AAC/E,8BAA8B;AAC9B,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IAChC,MAAM,CAAQ;IAE/B,YAAY,UAAkB,EAAE,OAAe,EAAE,MAAc;QAC3D,KAAK,CAAC;YACF,GAAG,uBAAuB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACzE,WAAW,EAAE,YAAY;YACzB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/C,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;YACvD,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;SACtD,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC7C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QACjJ,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QACrI,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QAEjG,MAAM,IAAI,CAAC,cAAc,CAAC;YACtB,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;YAC3D,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE;gBAC7C,SAAS,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE;gBACzD,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;aACtD;SACJ,CAAC,CAAA;QAEF,yDAAyD;QACzD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAA;IACjE,CAAC;CACJ"}
@@ -0,0 +1,3 @@
1
+ import type { LanguageProvider } from "./providers/LanguageProvider.js";
2
+ export declare function replay(runId: string, provider?: LanguageProvider): Promise<void>;
3
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,gBAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzG"}
package/dist/replay.js ADDED
@@ -0,0 +1,20 @@
1
+ import chalk from "chalk";
2
+ import { readApiKeyOrBail, resolveEventFromRunId } from "./api.js";
3
+ import { loadJob } from "./loadJob.js";
4
+ import { resolveProvider } from "./providers/resolveProvider.js";
5
+ export async function replay(runId, provider = resolveProvider()) {
6
+ const apiKey = readApiKeyOrBail();
7
+ if (!runId) {
8
+ console.error(chalk.red("Error: --run-id is required.\n"));
9
+ console.error(chalk.dim(" Usage: terse replay --run-id <run-id>"));
10
+ process.exit(1);
11
+ }
12
+ const runHistoryRecord = await resolveEventFromRunId(runId, apiKey);
13
+ if (!runHistoryRecord) {
14
+ console.error(chalk.red("Error: Could not fetch the trigger event for run ${runId}.\n"));
15
+ process.exit(1);
16
+ }
17
+ const { job } = await loadJob(provider, runHistoryRecord.agentName);
18
+ await provider.executeJob(job, null, runHistoryRecord.event, { verbose: true });
19
+ }
20
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,WAA6B,eAAe,EAAE;IACtF,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;IAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAA;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACnE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAA;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAEnE,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACnF,CAAC"}
package/dist/run.d.ts CHANGED
@@ -1,3 +1,12 @@
1
- import type { LanguageProvider } from "./providers/LanguageProvider.js";
2
- export declare function run(jobName?: string, eventJson?: string, eventFile?: string, provider?: LanguageProvider, entryFile?: string): Promise<void>;
1
+ import { CreateJobParameters } from "terse-sdk";
2
+ import type { SerializedEvent } from "./shared/types.js";
3
+ /**
4
+ * Create a TerseAgent scoped to a job's skills and execute onTrigger.
5
+ * Tools are registered from the codegen factory on globalThis (needed because
6
+ * tsx may load a separate module instance of terse-sdk).
7
+ */
8
+ export declare function executeJob(job: CreateJobParameters, event: SerializedEvent, options?: {
9
+ verbose?: boolean;
10
+ }): Promise<void>;
11
+ export declare function run(jobName?: string, eventJson?: string, eventFile?: string): Promise<void>;
3
12
  //# sourceMappingURL=run.d.ts.map
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,gBAAoC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrK"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAc,MAAM,WAAW,CAAA;AAK3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAIxD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCjI;AAED,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCjG"}