@nodetool-ai/execution 0.8.1 → 0.8.3
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.
- package/README.md +23 -127
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/app-debug/app-spec.d.ts.map +1 -1
- package/dist/app-debug/app-spec.js +3 -0
- package/dist/app-debug/app-spec.js.map +1 -1
- package/dist/app-debug/application-target.d.ts +1 -1
- package/dist/app-debug/application-target.d.ts.map +1 -1
- package/dist/app-debug/application-target.js +5 -3
- package/dist/app-debug/application-target.js.map +1 -1
- package/dist/app-debug/index.d.ts +4 -2
- package/dist/app-debug/index.d.ts.map +1 -1
- package/dist/app-debug/index.js +3 -2
- package/dist/app-debug/index.js.map +1 -1
- package/dist/app-debug/run-recording.d.ts +20 -0
- package/dist/app-debug/run-recording.d.ts.map +1 -0
- package/dist/app-debug/run-recording.js +105 -0
- package/dist/app-debug/run-recording.js.map +1 -0
- package/dist/app-debug/runtime.d.ts +2 -0
- package/dist/app-debug/runtime.d.ts.map +1 -1
- package/dist/app-debug/runtime.js +19 -4
- package/dist/app-debug/runtime.js.map +1 -1
- package/dist/app-debug/simulate.d.ts +10 -1
- package/dist/app-debug/simulate.d.ts.map +1 -1
- package/dist/app-debug/simulate.js +67 -27
- package/dist/app-debug/simulate.js.map +1 -1
- package/dist/app-debug/summarize.d.ts +1 -0
- package/dist/app-debug/summarize.d.ts.map +1 -1
- package/dist/app-debug/summarize.js +1 -0
- package/dist/app-debug/summarize.js.map +1 -1
- package/dist/app-debug/types.d.ts +6 -4
- package/dist/app-debug/types.d.ts.map +1 -1
- package/dist/app-run-generation.d.ts +8 -0
- package/dist/app-run-generation.d.ts.map +1 -0
- package/dist/app-run-generation.js +61 -0
- package/dist/app-run-generation.js.map +1 -0
- package/dist/browser-app-run.d.ts +10 -0
- package/dist/browser-app-run.d.ts.map +1 -0
- package/dist/browser-app-run.js +108 -0
- package/dist/browser-app-run.js.map +1 -0
- package/dist/browser-run-spans.d.ts +4 -0
- package/dist/browser-run-spans.d.ts.map +1 -0
- package/dist/browser-run-spans.js +115 -0
- package/dist/browser-run-spans.js.map +1 -0
- package/dist/browser-trace-policy.d.ts +12 -0
- package/dist/browser-trace-policy.d.ts.map +1 -0
- package/dist/browser-trace-policy.js +40 -0
- package/dist/browser-trace-policy.js.map +1 -0
- package/dist/cost-ledger.d.ts +3 -0
- package/dist/cost-ledger.d.ts.map +1 -1
- package/dist/cost-ledger.js +23 -2
- package/dist/cost-ledger.js.map +1 -1
- package/dist/debug/types.d.ts +1 -0
- package/dist/debug/types.d.ts.map +1 -1
- package/dist/debug/verdict.d.ts +26 -1
- package/dist/debug/verdict.d.ts.map +1 -1
- package/dist/debug/verdict.js +36 -0
- package/dist/debug/verdict.js.map +1 -1
- package/dist/generation-lifecycle.d.ts +5 -4
- package/dist/generation-lifecycle.d.ts.map +1 -1
- package/dist/generation-lifecycle.js +71 -10
- package/dist/generation-lifecycle.js.map +1 -1
- package/dist/generation-recovery-worker.d.ts.map +1 -1
- package/dist/generation-recovery-worker.js +2 -0
- package/dist/generation-recovery-worker.js.map +1 -1
- package/dist/generation-tracker.d.ts +2 -15
- package/dist/generation-tracker.d.ts.map +1 -1
- package/dist/generation-tracker.js +92 -6
- package/dist/generation-tracker.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/js-script-debug/index.d.ts +1 -0
- package/dist/js-script-debug/index.d.ts.map +1 -1
- package/dist/js-script-debug/index.js +1 -0
- package/dist/js-script-debug/index.js.map +1 -1
- package/dist/js-script-debug/report.d.ts.map +1 -1
- package/dist/js-script-debug/report.js +9 -24
- package/dist/js-script-debug/report.js.map +1 -1
- package/dist/js-script-debug/type-check.d.ts +16 -0
- package/dist/js-script-debug/type-check.d.ts.map +1 -0
- package/dist/js-script-debug/type-check.js +150 -0
- package/dist/js-script-debug/type-check.js.map +1 -0
- package/dist/js-script-debug/validate.d.ts +8 -0
- package/dist/js-script-debug/validate.d.ts.map +1 -1
- package/dist/js-script-debug/validate.js +4 -0
- package/dist/js-script-debug/validate.js.map +1 -1
- package/dist/message-stream.d.ts +1 -32
- package/dist/message-stream.d.ts.map +1 -1
- package/dist/message-stream.js +1 -57
- package/dist/message-stream.js.map +1 -1
- package/dist/partial-run.d.ts +65 -0
- package/dist/partial-run.d.ts.map +1 -0
- package/dist/partial-run.js +300 -0
- package/dist/partial-run.js.map +1 -0
- package/dist/preflight.d.ts +43 -2
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +78 -4
- package/dist/preflight.js.map +1 -1
- package/dist/run-trace-store.d.ts +9 -0
- package/dist/run-trace-store.d.ts.map +1 -0
- package/dist/run-trace-store.js +57 -0
- package/dist/run-trace-store.js.map +1 -0
- package/dist/runs.d.ts +16 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +431 -0
- package/dist/runs.js.map +1 -0
- package/dist/service/app-debug-service.d.ts +4 -2
- package/dist/service/app-debug-service.d.ts.map +1 -1
- package/dist/service/app-debug-service.js +73 -31
- package/dist/service/app-debug-service.js.map +1 -1
- package/dist/service/app-operation.d.ts +39 -0
- package/dist/service/app-operation.d.ts.map +1 -0
- package/dist/service/app-operation.js +271 -0
- package/dist/service/app-operation.js.map +1 -0
- package/dist/service/app-run-server.d.ts +3 -1
- package/dist/service/app-run-server.d.ts.map +1 -1
- package/dist/service/app-run-server.js +22 -14
- package/dist/service/app-run-server.js.map +1 -1
- package/dist/service/index.d.ts +5 -1
- package/dist/service/index.d.ts.map +1 -1
- package/dist/service/index.js +2 -0
- package/dist/service/index.js.map +1 -1
- package/dist/service/run-trace-lifecycle.d.ts +34 -0
- package/dist/service/run-trace-lifecycle.d.ts.map +1 -0
- package/dist/service/run-trace-lifecycle.js +135 -0
- package/dist/service/run-trace-lifecycle.js.map +1 -0
- package/dist/service/workflow-run.d.ts +47 -16
- package/dist/service/workflow-run.d.ts.map +1 -1
- package/dist/service/workflow-run.js +210 -78
- package/dist/service/workflow-run.js.map +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +109 -100
- package/dist/session.js.map +1 -1
- package/dist/sketch-debug/markdown.d.ts.map +1 -1
- package/dist/sketch-debug/markdown.js +1 -0
- package/dist/sketch-debug/markdown.js.map +1 -1
- package/dist/sketch-debug/report.d.ts.map +1 -1
- package/dist/sketch-debug/report.js +19 -28
- package/dist/sketch-debug/report.js.map +1 -1
- package/dist/sketch-debug/types.d.ts +2 -0
- package/dist/sketch-debug/types.d.ts.map +1 -1
- package/dist/timeline-debug/frame-geometry.d.ts +120 -0
- package/dist/timeline-debug/frame-geometry.d.ts.map +1 -0
- package/dist/timeline-debug/frame-geometry.js +238 -0
- package/dist/timeline-debug/frame-geometry.js.map +1 -0
- package/dist/timeline-debug/index.d.ts +1 -0
- package/dist/timeline-debug/index.d.ts.map +1 -1
- package/dist/timeline-debug/index.js +1 -0
- package/dist/timeline-debug/index.js.map +1 -1
- package/dist/timeline-debug/legibility.d.ts +8 -4
- package/dist/timeline-debug/legibility.d.ts.map +1 -1
- package/dist/timeline-debug/legibility.js +47 -18
- package/dist/timeline-debug/legibility.js.map +1 -1
- package/dist/timeline-debug/report.d.ts.map +1 -1
- package/dist/timeline-debug/report.js +16 -25
- package/dist/timeline-debug/report.js.map +1 -1
- package/dist/timeline-debug/score.d.ts +110 -0
- package/dist/timeline-debug/score.d.ts.map +1 -0
- package/dist/timeline-debug/score.js +231 -0
- package/dist/timeline-debug/score.js.map +1 -0
- package/dist/timeline-debug/showcase.d.ts +12 -0
- package/dist/timeline-debug/showcase.d.ts.map +1 -1
- package/dist/timeline-debug/showcase.js +669 -13
- package/dist/timeline-debug/showcase.js.map +1 -1
- package/dist/timeline-debug/validate.d.ts.map +1 -1
- package/dist/timeline-debug/validate.js +121 -2
- package/dist/timeline-debug/validate.js.map +1 -1
- package/dist/types.d.ts +18 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -13
|
@@ -18,9 +18,12 @@
|
|
|
18
18
|
* or `done`.
|
|
19
19
|
*/
|
|
20
20
|
import { randomUUID } from "node:crypto";
|
|
21
|
-
import { createLogger } from "@nodetool-ai/config";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
21
|
+
import { createLogger, getDefaultAssetsPath } from "@nodetool-ai/config";
|
|
22
|
+
import { FileStorageAdapter } from "@nodetool-ai/storage";
|
|
23
|
+
import { parseApplicationBundle } from "@nodetool-ai/app-runtime";
|
|
24
|
+
import { Application, AppRunError, Workflow, WorkflowVersion, getSecret, resolveAppInstanceApplicationId, createJsScriptResolver } from "@nodetool-ai/models";
|
|
25
|
+
import { ProcessingContext } from "@nodetool-ai/runtime";
|
|
26
|
+
import { applicationTarget, bundleTarget, createAppDebugRunRecording, inlineDocumentTarget, simulateApp, summarizeAppReport } from "../app-debug/index.js";
|
|
24
27
|
import { createAppServerRunner } from "./app-run-server.js";
|
|
25
28
|
import { debugSessions, InteractiveEscalationHandle } from "./debug-sessions.js";
|
|
26
29
|
import { isNonEmptyString, isPositiveFiniteNumber } from "../predicates.js";
|
|
@@ -44,14 +47,34 @@ async function loadUserJsScript(userId, scriptId, scriptVersion) {
|
|
|
44
47
|
return resolved ? { name: resolved.name, document: resolved.document } : null;
|
|
45
48
|
}
|
|
46
49
|
/** A workflow the user can read, in the shape the simulator wants. */
|
|
47
|
-
async function loadUserWorkflow(userId, id) {
|
|
50
|
+
async function loadUserWorkflow(userId, id, version) {
|
|
48
51
|
const workflow = await Workflow.find(userId, id);
|
|
49
|
-
|
|
52
|
+
if (!workflow) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const pinned = version === undefined ? null : await WorkflowVersion.findByVersion(workflow.id, version);
|
|
56
|
+
if (version !== undefined && (!pinned || pinned.user_id !== workflow.user_id)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const graph = pinned?.graph ?? workflow.getGraph();
|
|
50
60
|
return graph ? { graph } : null;
|
|
51
61
|
}
|
|
52
62
|
/** An application the user owns, with its document still unparsed. */
|
|
53
63
|
async function loadUserApplication(userId, id) {
|
|
54
|
-
|
|
64
|
+
let fullId;
|
|
65
|
+
try {
|
|
66
|
+
fullId = await resolveAppInstanceApplicationId(userId, id);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof AppRunError && error.code === "not_found") {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (error instanceof AppRunError) {
|
|
73
|
+
throw new AppServiceError("invalid_input", error.message);
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
const application = await Application.findById(fullId);
|
|
55
78
|
if (!application || application.user_id !== userId)
|
|
56
79
|
return null;
|
|
57
80
|
return {
|
|
@@ -97,7 +120,7 @@ async function resolveTarget(userId, body, deps) {
|
|
|
97
120
|
throw new AppServiceError("invalid_input", "Pass either application_id or document, not both — a saved row and a " +
|
|
98
121
|
"live draft are different apps the moment the draft changes.");
|
|
99
122
|
}
|
|
100
|
-
const loadFromDb = (id) => (deps.loadWorkflow ?? loadUserWorkflow)(userId, id);
|
|
123
|
+
const loadFromDb = (id, version) => (deps.loadWorkflow ?? loadUserWorkflow)(userId, id, version);
|
|
101
124
|
if (hasId) {
|
|
102
125
|
const id = body.application_id;
|
|
103
126
|
const application = await (deps.loadApplication ?? loadUserApplication)(userId, id);
|
|
@@ -107,6 +130,10 @@ async function resolveTarget(userId, body, deps) {
|
|
|
107
130
|
return applicationTarget(id, application, loadFromDb);
|
|
108
131
|
}
|
|
109
132
|
if (hasDocument) {
|
|
133
|
+
const bundle = parseApplicationBundle(body.document);
|
|
134
|
+
if (bundle) {
|
|
135
|
+
return bundleTarget(bundle, "inline");
|
|
136
|
+
}
|
|
110
137
|
return inlineDocumentTarget(body.document, loadFromDb);
|
|
111
138
|
}
|
|
112
139
|
throw new AppServiceError("invalid_input", "An app debug run needs either an application_id or a document.");
|
|
@@ -120,14 +147,14 @@ export async function runApplicationDebug(userId, body, defaultRegistry, deps =
|
|
|
120
147
|
const resolved = await resolveTarget(userId, body, deps);
|
|
121
148
|
const registry = deps.registry ?? defaultRegistry;
|
|
122
149
|
const timeoutMs = positive(body.timeout_ms);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
150
|
+
const controller = new AbortController();
|
|
151
|
+
const context = deps.context
|
|
152
|
+
? deps.context.copy({ jobId: debugId })
|
|
153
|
+
: new ProcessingContext({ userId, jobId: debugId,
|
|
154
|
+
secretResolver: (key) => getSecret(key, userId),
|
|
155
|
+
storage: new FileStorageAdapter(getDefaultAssetsPath()), assetStorage: deps.assetStorage ?? null });
|
|
156
|
+
context.signal = deps.context ? AbortSignal.any([deps.context.signal, controller.signal]) : controller.signal;
|
|
157
|
+
const runIds = new Set();
|
|
131
158
|
// The promise a session fronts must never reject: a rejected run would leave
|
|
132
159
|
// the session parked forever with no report to hand back.
|
|
133
160
|
const simulation = (async () => {
|
|
@@ -146,24 +173,47 @@ export async function runApplicationDebug(userId, body, defaultRegistry, deps =
|
|
|
146
173
|
simulateOptions.timeoutMs = timeoutMs;
|
|
147
174
|
}
|
|
148
175
|
const simulateDeps = {
|
|
149
|
-
loadFromDb: (id) => (deps.loadWorkflow ?? loadUserWorkflow)(userId, id),
|
|
176
|
+
loadFromDb: (id, version) => (deps.loadWorkflow ?? loadUserWorkflow)(userId, id, version),
|
|
150
177
|
runOnServer: createAppServerRunner(userId, registry, {
|
|
151
178
|
jobPrefix: "app-debug-run",
|
|
152
179
|
assetStorage: deps.assetStorage ?? null
|
|
153
180
|
}),
|
|
154
181
|
loadScript: (scriptId, scriptVersion) => loadUserJsScript(userId, scriptId, scriptVersion)
|
|
155
182
|
};
|
|
156
|
-
|
|
157
|
-
|
|
183
|
+
const scriptRunner = deps.scriptRunner;
|
|
184
|
+
const runScript = scriptRunner
|
|
185
|
+
? (input) => scriptRunner(context, input)
|
|
186
|
+
: deps.runScript;
|
|
187
|
+
if (runScript) {
|
|
188
|
+
simulateDeps.runScript = runScript;
|
|
158
189
|
}
|
|
190
|
+
const recording = createAppDebugRunRecording({ userId, target: resolved, registry, context,
|
|
191
|
+
onRunCreated: (id) => { runIds.add(id); },
|
|
192
|
+
loadWorkflow: simulateDeps.loadFromDb, loadScript: simulateDeps.loadScript,
|
|
193
|
+
applicationId: body.application_id,
|
|
194
|
+
runWorkflow: (parent, input) => createAppServerRunner(userId, registry, { context: parent })(input),
|
|
195
|
+
runScript: (parent, input) => {
|
|
196
|
+
if (deps.scriptRunner) {
|
|
197
|
+
return deps.scriptRunner(parent, input);
|
|
198
|
+
}
|
|
199
|
+
if (deps.runScript) {
|
|
200
|
+
return deps.runScript(input);
|
|
201
|
+
}
|
|
202
|
+
throw new Error("Host does not provide script execution");
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
Object.assign(simulateDeps, recording);
|
|
159
206
|
const report = await simulateApp(resolved, simulateOptions, simulateDeps);
|
|
160
|
-
|
|
207
|
+
report.run_ids = [...runIds];
|
|
208
|
+
const payload = debugPayload(report, debugId);
|
|
209
|
+
return controller.signal.aborted ? { ...payload, status: "failed", error: "cancelled" } : payload;
|
|
161
210
|
}
|
|
162
211
|
catch (error) {
|
|
163
212
|
const message = error instanceof Error ? error.message : String(error);
|
|
164
213
|
log.error("app debug failed outside the report", { debugId, message });
|
|
165
214
|
return {
|
|
166
215
|
debug_id: debugId,
|
|
216
|
+
run_ids: [...runIds],
|
|
167
217
|
status: "failed",
|
|
168
218
|
error: message,
|
|
169
219
|
verdict: {
|
|
@@ -175,24 +225,16 @@ export async function runApplicationDebug(userId, body, defaultRegistry, deps =
|
|
|
175
225
|
};
|
|
176
226
|
}
|
|
177
227
|
})();
|
|
178
|
-
const done =
|
|
228
|
+
const done = simulation;
|
|
179
229
|
const session = debugSessions.create({
|
|
180
230
|
userId,
|
|
181
231
|
workflowId: resolved.info.workflowId,
|
|
182
232
|
jobId: debugId,
|
|
183
233
|
handle: new InteractiveEscalationHandle(),
|
|
184
234
|
done,
|
|
185
|
-
cancel: () =>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
error: "cancelled",
|
|
189
|
-
verdict: {
|
|
190
|
-
ok: false,
|
|
191
|
-
headline: "App debug cancelled before it finished.",
|
|
192
|
-
issues: ["cancelled"],
|
|
193
|
-
warnings: []
|
|
194
|
-
}
|
|
195
|
-
})
|
|
235
|
+
cancel: () => {
|
|
236
|
+
controller.abort();
|
|
237
|
+
}
|
|
196
238
|
});
|
|
197
239
|
if (body.poll === true)
|
|
198
240
|
return runningPayload(session, debugId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-debug-service.js","sourceRoot":"","sources":["../../src/service/app-debug-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"app-debug-service.js","sourceRoot":"","sources":["../../src/service/app-debug-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,SAAS,EACT,+BAA+B,EAC/B,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,iBAAiB,EAAuB,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,0BAA0B,EAC1B,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,2BAA2B,EAE5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,GAAG,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAE7B,IAAI;IADf,YACW,IAAmC,EAC5C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;oBAHN,IAAI;QAIb,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAiDD,qEAAqE;AACrE,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,QAAgB,EAChB,aAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,sBAAsB,EAAE,CAAC,OAAO,CACrD,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,EACxC,MAAM,CACP,CAAC;IACF,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,sEAAsE;AACtE,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACxG,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,sEAAsE;AACtE,KAAK,UAAU,mBAAmB,CAChC,MAAc,EACd,EAAU;IAEV,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QAAC,MAAM,GAAG,MAAM,+BAA+B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAAC,CAAC;IACnE,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAChF,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YAAC,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAChG,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,SAAS,QAAQ,CAAC,KAAyB;IACzC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,0DAA0D;AAC1D,SAAS,cAAc,CACrB,OAAqB,EACrB,OAAe;IAEf,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,OAAO,CAAC,EAAE;QACtB,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,2BAA2B,OAAO,CAAC,EAAE,EAAE;QAC7C,MAAM,EAAE,4BAA4B,OAAO,CAAC,EAAE,SAAS;KACxD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,MAAsB,EACtB,OAAe;IAEf,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;QAClD,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;KAClE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,IAAqB,EACrB,IAAkB;IAElB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC1E,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CACvB,eAAe,EACf,uEAAuE;YACrE,6DAA6D,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,OAAgB,EAAqC,EAAE,CACrF,CAAC,IAAI,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAE/D,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,EAAE,GAAG,IAAI,CAAC,cAAwB,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,mBAAmB,CAAC,CACrE,MAAM,EACN,EAAE,CACH,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,eAAe,CAAC,WAAW,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,MAAM,EAAE,CAAC;YAAC,OAAO,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAAC,CAAC;QACtD,OAAO,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,eAAe,CACvB,eAAe,EACf,gEAAgE,CACjE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,IAAqB,EACrB,eAA6B,EAC7B,IAAI,GAAiB,EAAE;IAEvB,MAAM,OAAO,GAAG,aAAa,UAAU,EAAE,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAC;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;YAC9C,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;YAC/C,OAAO,EAAE,IAAI,kBAAkB,CAAC,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC;IACxG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IAE9G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,6EAA6E;IAC7E,0DAA0D;IAC1D,MAAM,UAAU,GAAqC,CAAC,KAAK,IAAI,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,eAAe,GAAsC,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACvC,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,eAAe,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC3C,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACjC,CAAC;YACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;YACxC,CAAC;YACD,MAAM,YAAY,GAAsC;gBACtD,UAAU,EAAE,CAAC,EAAU,EAAE,OAAgB,EAAE,EAAE,CAC3C,CAAC,IAAI,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC;gBAC9D,WAAW,EAAE,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE;oBACnD,SAAS,EAAE,eAAe;oBAC1B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;iBACxC,CAAC;gBACF,UAAU,EAAE,CAAC,QAAgB,EAAE,aAAqB,EAAE,EAAE,CACtD,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;aACpD,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,MAAM,SAAS,GAAG,YAAY;gBAC5B,CAAC,CAAC,CAAC,KAA6C,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC;gBACjF,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC;YACrC,CAAC;YACD,MAAM,SAAS,GAAG,0BAA0B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO;gBACxF,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,YAAY,EAAE,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,UAAU;gBAC1E,aAAa,EAAE,IAAI,CAAC,cAAc;gBAClC,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC;gBACnG,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC3B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBAAC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAAC,CAAC;oBACnE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBAAC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAAC,CAAC;oBACrD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,CAAC;aACF,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,OAAO;gBACL,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC;gBACpB,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,CAAC,OAAO,CAAC;oBACjB,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,IAAI,GAAG,UAAU,CAAC;IAExB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;QACnC,MAAM;QACN,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;QACpC,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,IAAI,2BAA2B,EAAE;QACzC,IAAI;QACJ,MAAM,EAAE,GAAG,EAAE;YACX,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type ResourceRef, type ScriptRunResult } from "@nodetool-ai/app-runtime";
|
|
2
|
+
import type { AppRunRecord } from "@nodetool-ai/protocol/api-schemas/app-runs.js";
|
|
3
|
+
import { ProcessingContext } from "@nodetool-ai/runtime";
|
|
4
|
+
import type { NodeRegistry } from "@nodetool-ai/node-sdk";
|
|
5
|
+
import { type JsScriptOperationRunner } from "../app-debug/script-operation.js";
|
|
6
|
+
import type { AppServerRunInput, AppServerRunOutcome } from "../app-debug/simulate.js";
|
|
7
|
+
export interface ExecuteAppOperationOptions {
|
|
8
|
+
readonly userId: string;
|
|
9
|
+
readonly instanceId: string;
|
|
10
|
+
readonly operationId: string;
|
|
11
|
+
readonly invocationId: string;
|
|
12
|
+
readonly origin: AppRunRecord["origin"];
|
|
13
|
+
readonly context: ProcessingContext;
|
|
14
|
+
readonly registry: NodeRegistry;
|
|
15
|
+
/** Already reserved by a trusted host. */
|
|
16
|
+
readonly runId?: string;
|
|
17
|
+
readonly estimatedUsd?: number;
|
|
18
|
+
readonly runnerInstance?: string | null;
|
|
19
|
+
readonly requireFiniteBudget?: boolean;
|
|
20
|
+
readonly inputValues?: Readonly<Record<string, unknown>>;
|
|
21
|
+
/** Inputs already resolved by the headless app runtime against its interaction state. */
|
|
22
|
+
readonly resolvedInputs?: Record<string, unknown>;
|
|
23
|
+
/** Effective workflow property bindings alongside its operation parameters. */
|
|
24
|
+
readonly inputSnapshot?: Record<string, unknown>;
|
|
25
|
+
readonly onReserved?: (run: AppRunRecord) => void;
|
|
26
|
+
readonly resourceRef?: (id: string) => ResourceRef | undefined;
|
|
27
|
+
readonly scriptRunner?: (context: ProcessingContext, input: Parameters<JsScriptOperationRunner>[0]) => Promise<ScriptRunResult>;
|
|
28
|
+
readonly workflowRunner?: (context: ProcessingContext, input: AppServerRunInput) => Promise<AppServerRunOutcome>;
|
|
29
|
+
}
|
|
30
|
+
export interface AppOperationOutcome {
|
|
31
|
+
/** Deleted history returns a content-free terminal snapshot that is not persisted. */
|
|
32
|
+
readonly run: AppRunRecord;
|
|
33
|
+
readonly variables: Readonly<Record<string, unknown>>;
|
|
34
|
+
readonly messages: ReadonlyArray<Record<string, unknown>>;
|
|
35
|
+
readonly reused: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** Reserve before resolving bindings, secrets, or executable targets. */
|
|
38
|
+
export declare function executeAppOperation(options: ExecuteAppOperationOptions): Promise<AppOperationOutcome>;
|
|
39
|
+
//# sourceMappingURL=app-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-operation.d.ts","sourceRoot":"","sources":["../../src/service/app-operation.ts"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAWlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAuB,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAA+D,KAAK,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC7I,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMvF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,yFAAyF;IACzF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,KAC1C,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,sFAAsF;IACtF,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,yEAAyE;AACzE,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAoQ9B"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { registerAppRunTrace, withRegisteredRunTrace, settleRegisteredRunTrace } from "./run-trace-lifecycle.js";
|
|
2
|
+
import { applyEvents, createInstanceState, messagesToEvents, operationTarget, parseApplicationDocument, outputVariableTargets, resolveOperationParams, stateKey } from "@nodetool-ai/app-runtime";
|
|
3
|
+
import { AppRunError, getAppRun, claimAppRun, reconcileAppRunCost, getAppInstance, reserveAppRun, setAppRunInputs, settleAppRun } from "@nodetool-ai/models";
|
|
4
|
+
import { inAppRunCostAccount } from "@nodetool-ai/runtime";
|
|
5
|
+
import { debugGraphOf } from "../app-debug/graph-shape.js";
|
|
6
|
+
import { documentOperations, extractAppIO } from "../app-debug/app-spec.js";
|
|
7
|
+
import { jsScriptRunMessages, scriptAppIO, scriptOperationInvocation } from "../app-debug/script-operation.js";
|
|
8
|
+
import { isRecord } from "../predicates.js";
|
|
9
|
+
import { attachRunCostLedger } from "../cost-ledger.js";
|
|
10
|
+
import { createFalGenerationLifecycleHooks } from "../generation-lifecycle.js";
|
|
11
|
+
import { createAppServerRunner } from "./app-run-server.js";
|
|
12
|
+
/** Reserve before resolving bindings, secrets, or executable targets. */
|
|
13
|
+
export async function executeAppOperation(options) {
|
|
14
|
+
let run;
|
|
15
|
+
if (options.runId) {
|
|
16
|
+
const existing = await getAppRun(options.userId, options.runId);
|
|
17
|
+
if (!existing ||
|
|
18
|
+
existing.instance_id !== options.instanceId ||
|
|
19
|
+
existing.operation_id !== options.operationId) {
|
|
20
|
+
throw new Error("App run does not match the requested operation");
|
|
21
|
+
}
|
|
22
|
+
run = existing;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const reservation = await reserveAppRun({
|
|
26
|
+
userId: options.userId,
|
|
27
|
+
instanceId: options.instanceId,
|
|
28
|
+
operationId: options.operationId,
|
|
29
|
+
invocationId: options.invocationId,
|
|
30
|
+
origin: options.origin,
|
|
31
|
+
estimatedUsd: options.estimatedUsd,
|
|
32
|
+
requireFiniteBudget: options.requireFiniteBudget
|
|
33
|
+
});
|
|
34
|
+
if (!reservation.allowed) {
|
|
35
|
+
throw new Error(reservation.reason);
|
|
36
|
+
}
|
|
37
|
+
run = reservation.run;
|
|
38
|
+
if (!reservation.created) {
|
|
39
|
+
return { run, variables: {}, messages: [], reused: true };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
options.onReserved?.(run);
|
|
43
|
+
if (run.status !== "running" ||
|
|
44
|
+
!(await claimAppRun(options.userId, run.id, options.runnerInstance))) {
|
|
45
|
+
return { run, variables: {}, messages: [], reused: true };
|
|
46
|
+
}
|
|
47
|
+
const identity = {
|
|
48
|
+
userId: options.userId,
|
|
49
|
+
instanceId: run.instance_id,
|
|
50
|
+
appRunId: run.id,
|
|
51
|
+
traceId: run.trace_id,
|
|
52
|
+
origin: run.origin
|
|
53
|
+
};
|
|
54
|
+
const context = options.context.copy({
|
|
55
|
+
jobId: run.id,
|
|
56
|
+
appRunContext: identity,
|
|
57
|
+
generationLifecycle: createFalGenerationLifecycleHooks({
|
|
58
|
+
userId: options.userId,
|
|
59
|
+
jobId: run.id,
|
|
60
|
+
appRunContext: identity,
|
|
61
|
+
publicUrl: process.env["NODETOOL_PUBLIC_URL"] ?? null
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
try {
|
|
65
|
+
await registerAppRunTrace(context, run);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
await settleOperationRun(options.userId, run, { status: "failed", actualUsd: 0, knownLlmUsd: 0, error: error instanceof Error ? error.message : String(error), secretValues: [...context.getResolvedSecretValues()] });
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
return withRegisteredRunTrace(context, "app.run", async () => {
|
|
72
|
+
const messages = [];
|
|
73
|
+
let variableChanges = {};
|
|
74
|
+
try {
|
|
75
|
+
context.signal.throwIfAborted();
|
|
76
|
+
const instance = await getAppInstance(options.userId, run.instance_id);
|
|
77
|
+
if (!instance) {
|
|
78
|
+
throw new Error("App instance was deleted before execution");
|
|
79
|
+
}
|
|
80
|
+
if (instance.version !== run.version ||
|
|
81
|
+
(run.snapshot !== null && JSON.stringify(instance.snapshot) !== JSON.stringify(run.snapshot))) {
|
|
82
|
+
const error = "App instance snapshot changed before execution. Start a new run.";
|
|
83
|
+
run = await settleOperationRun(options.userId, run, {
|
|
84
|
+
status: "failed", actualUsd: 0, knownLlmUsd: 0, updateInstance: false, error
|
|
85
|
+
});
|
|
86
|
+
throw new Error(error);
|
|
87
|
+
}
|
|
88
|
+
const snapshot = run.snapshot ?? instance.snapshot;
|
|
89
|
+
const document = parseApplicationDocument(snapshot.document);
|
|
90
|
+
if (!document) {
|
|
91
|
+
throw new Error("Pinned application document is invalid");
|
|
92
|
+
}
|
|
93
|
+
const operation = documentOperations(document).find((candidate) => candidate.id === run.operation_id);
|
|
94
|
+
if (!operation) {
|
|
95
|
+
throw new Error("Operation is missing from the pinned application");
|
|
96
|
+
}
|
|
97
|
+
const target = operationTarget(operation);
|
|
98
|
+
const carriedScript = target.kind === "script"
|
|
99
|
+
? snapshot.script_documents[`${target.scriptId}@${target.scriptVersion}`] ?? snapshot.script_documents[target.scriptId]
|
|
100
|
+
: undefined;
|
|
101
|
+
const graph = target.kind === "workflow"
|
|
102
|
+
? debugGraphOf(snapshot.workflow_graphs[`${target.workflowId}@${target.workflowVersion ?? "latest"}`] ?? snapshot.workflow_graphs[target.workflowId])
|
|
103
|
+
: null;
|
|
104
|
+
const io = carriedScript
|
|
105
|
+
? scriptAppIO(carriedScript)
|
|
106
|
+
: graph
|
|
107
|
+
? extractAppIO(graph)
|
|
108
|
+
: null;
|
|
109
|
+
if (!io) {
|
|
110
|
+
throw new Error("Execution target is missing from the pinned application");
|
|
111
|
+
}
|
|
112
|
+
let state = createInstanceState();
|
|
113
|
+
state.variables = run.origin === "public" ? {} : { ...instance.variables };
|
|
114
|
+
const cachedInputs = state.variables["__app_inputs"];
|
|
115
|
+
const inputValues = options.inputValues ?? (isRecord(cachedInputs) ? cachedInputs : {});
|
|
116
|
+
for (const input of io.inputs) {
|
|
117
|
+
const key = stateKey({
|
|
118
|
+
kind: "input",
|
|
119
|
+
operationId: operation.id,
|
|
120
|
+
nodeId: input.nodeId
|
|
121
|
+
});
|
|
122
|
+
const stored = inputValues[key];
|
|
123
|
+
const value = stored && typeof stored === "object" && "value" in stored
|
|
124
|
+
? stored.value
|
|
125
|
+
: (stored ?? input.defaultValue);
|
|
126
|
+
state.inputs[key] = { value, dirty: stored !== undefined, revision: 0 };
|
|
127
|
+
}
|
|
128
|
+
const params = options.resolvedInputs ?? resolveOperationParams({
|
|
129
|
+
operation,
|
|
130
|
+
state,
|
|
131
|
+
inputNodeIds: io.inputs.map((input) => input.nodeId),
|
|
132
|
+
inputName: (id) => io.inputs.find((input) => input.nodeId === id)?.name,
|
|
133
|
+
resourceRef: options.resourceRef
|
|
134
|
+
});
|
|
135
|
+
await setAppRunInputs(options.userId, run.id, options.inputSnapshot ?? params, [
|
|
136
|
+
...context.getResolvedSecretValues()
|
|
137
|
+
]);
|
|
138
|
+
const variableTargets = new Map(outputVariableTargets(operation).map((target) => [
|
|
139
|
+
target.nodeId,
|
|
140
|
+
target.variableId
|
|
141
|
+
]));
|
|
142
|
+
state = applyEvents(state, [
|
|
143
|
+
{
|
|
144
|
+
type: "runStarted",
|
|
145
|
+
invocation: {
|
|
146
|
+
id: run.id,
|
|
147
|
+
operationId: operation.id,
|
|
148
|
+
status: "running",
|
|
149
|
+
startedAt: Date.parse(run.created_at)
|
|
150
|
+
},
|
|
151
|
+
outputKeys: io.outputs.map((output) => `${operation.id}:${output.nodeId}`),
|
|
152
|
+
variableKeys: [...variableTargets.values()]
|
|
153
|
+
}
|
|
154
|
+
]);
|
|
155
|
+
let status = "completed";
|
|
156
|
+
let error = null;
|
|
157
|
+
if (target.kind === "script" && carriedScript) {
|
|
158
|
+
if (!options.scriptRunner) {
|
|
159
|
+
throw new Error("Host does not provide script execution");
|
|
160
|
+
}
|
|
161
|
+
const ledger = attachRunCostLedger(context, {
|
|
162
|
+
userId: options.userId,
|
|
163
|
+
workflowId: null,
|
|
164
|
+
appRunContext: identity
|
|
165
|
+
});
|
|
166
|
+
try {
|
|
167
|
+
const scriptRunner = options.scriptRunner;
|
|
168
|
+
const result = await inAppRunCostAccount(context.appRunCostAccount, () => scriptRunner(context, {
|
|
169
|
+
scriptId: target.scriptId,
|
|
170
|
+
scriptVersion: target.scriptVersion,
|
|
171
|
+
name: operation.name,
|
|
172
|
+
document: carriedScript,
|
|
173
|
+
...scriptOperationInvocation(carriedScript, params),
|
|
174
|
+
timeoutMs: operation.timeoutMs
|
|
175
|
+
}));
|
|
176
|
+
messages.push(...jsScriptRunMessages(result));
|
|
177
|
+
if (!result.ok) {
|
|
178
|
+
status = context.signal.aborted ? "cancelled" : "failed";
|
|
179
|
+
error = result.error ?? "Script operation failed";
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
await ledger.settled();
|
|
184
|
+
ledger();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (target.kind === "workflow" && graph) {
|
|
188
|
+
const runner = options.workflowRunner ??
|
|
189
|
+
((parent, input) => createAppServerRunner(options.userId, options.registry, {
|
|
190
|
+
context: parent
|
|
191
|
+
})(input));
|
|
192
|
+
const outcome = await runner(context, {
|
|
193
|
+
graph,
|
|
194
|
+
workflowId: target.workflowId,
|
|
195
|
+
params,
|
|
196
|
+
timeoutMs: operation.timeoutMs
|
|
197
|
+
});
|
|
198
|
+
messages.push(...outcome.rawMessages);
|
|
199
|
+
status = outcome.report.ok
|
|
200
|
+
? "completed"
|
|
201
|
+
: outcome.report.status === "cancelled"
|
|
202
|
+
? "cancelled"
|
|
203
|
+
: "failed";
|
|
204
|
+
error = outcome.report.error;
|
|
205
|
+
}
|
|
206
|
+
state = applyEvents(state, messagesToEvents(messages, {
|
|
207
|
+
resolveInvocation: () => state.invocations[run.id] ?? null,
|
|
208
|
+
outputKey: (_, nodeId) => `${operation.id}:${nodeId}`,
|
|
209
|
+
outputVariable: (_, nodeId) => variableTargets.get(nodeId) ?? null
|
|
210
|
+
}));
|
|
211
|
+
variableChanges = Object.fromEntries([...variableTargets.values()]
|
|
212
|
+
.filter((id) => id in state.variables)
|
|
213
|
+
.map((id) => [id, state.variables[id]]));
|
|
214
|
+
variableChanges["__app_outputs"] = Object.fromEntries(Object.entries(state.outputs).map(([key, slot]) => [key, slot.value]));
|
|
215
|
+
const settlement = {
|
|
216
|
+
status,
|
|
217
|
+
error: context.runTraceContext?.policy.contentSuppressed && error ? "Execution failed" : error,
|
|
218
|
+
outputs: variableChanges,
|
|
219
|
+
documents: context.getAppRunDocuments(),
|
|
220
|
+
expectedRevision: run.instance_revision,
|
|
221
|
+
contentSuppressed: context.runTraceContext?.policy.contentSuppressed,
|
|
222
|
+
secretValues: [...context.getResolvedSecretValues()]
|
|
223
|
+
};
|
|
224
|
+
const knownLlmUsd = context.getAppRunLlmCost();
|
|
225
|
+
if (knownLlmUsd !== null) {
|
|
226
|
+
settlement.knownLlmUsd = knownLlmUsd;
|
|
227
|
+
}
|
|
228
|
+
run = await settleOperationRun(options.userId, run, settlement);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
const settlement = {
|
|
232
|
+
status: context.signal.aborted ? "cancelled" : "failed",
|
|
233
|
+
error: context.runTraceContext?.policy.contentSuppressed ? "Execution failed" : error instanceof Error ? error.message : String(error),
|
|
234
|
+
contentSuppressed: context.runTraceContext?.policy.contentSuppressed,
|
|
235
|
+
secretValues: [...context.getResolvedSecretValues()],
|
|
236
|
+
documents: context.getAppRunDocuments()
|
|
237
|
+
};
|
|
238
|
+
const knownLlmUsd = context.getAppRunLlmCost();
|
|
239
|
+
if (knownLlmUsd !== null) {
|
|
240
|
+
settlement.knownLlmUsd = knownLlmUsd;
|
|
241
|
+
}
|
|
242
|
+
run = await settleOperationRun(options.userId, run, settlement);
|
|
243
|
+
}
|
|
244
|
+
await reconcileAppRunCost(options.userId, run.id);
|
|
245
|
+
run = (await getAppRun(options.userId, run.id)) ?? run;
|
|
246
|
+
await settleRegisteredRunTrace(context, run.status === "running" ? "failed" : run.status, run.error, run.actual_usd);
|
|
247
|
+
return { run, variables: variableChanges, messages, reused: false };
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
async function settleOperationRun(userId, run, settlement) {
|
|
251
|
+
try {
|
|
252
|
+
return await settleAppRun(userId, run.id, settlement);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
if (!(error instanceof AppRunError) || error.code !== "not_found") {
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
...run,
|
|
260
|
+
status: settlement.status,
|
|
261
|
+
snapshot: null,
|
|
262
|
+
inputs: null,
|
|
263
|
+
outputs: null,
|
|
264
|
+
documents: null,
|
|
265
|
+
error: null,
|
|
266
|
+
content_expired: 1,
|
|
267
|
+
settled_at: new Date().toISOString()
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=app-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-operation.js","sourceRoot":"","sources":["../../src/service/app-operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EAGT,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAqB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,yBAAyB,EAAgC,MAAM,kCAAkC,CAAC;AAE7I,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAwC5D,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAmC;IAEnC,IAAI,GAAiB,CAAC;IACtB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE,IACE,CAAC,QAAQ;YACT,QAAQ,CAAC,WAAW,KAAK,OAAO,CAAC,UAAU;YAC3C,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,WAAW,EAC7C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,GAAG,GAAG,QAAQ,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;SACjD,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,IACE,GAAG,CAAC,MAAM,KAAK,SAAS;QACxB,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EACpE,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,EAAE;QAChB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACnC,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,aAAa,EAAE,QAAQ;QACvB,mBAAmB,EAAE,iCAAiC,CAAC;YACrD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;SACtD,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC;QACvN,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,QAAQ,GAAmC,EAAE,CAAC;QACpD,IAAI,eAAe,GAA4B,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO;gBAClC,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAChG,MAAM,KAAK,GAAG,kEAAkE,CAAC;gBACjF,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE;oBAClD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK;iBAC7E,CAAC,CAAC;gBACH,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;YACnD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,IAAI,CACjD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,YAAY,CACjD,CAAC;YACF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,aAAa,GACjB,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACtB,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACvH,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,KAAK,GACT,MAAM,CAAC,IAAI,KAAK,UAAU;gBACxB,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,eAAe,IAAI,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACrJ,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,GAAG,aAAa;gBACtB,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC;gBAC5B,CAAC,CAAC,KAAK;oBACL,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;oBACrB,CAAC,CAAC,IAAI,CAAC;YACX,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,GAAG,mBAAmB,EAAE,CAAC;YAClC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC3E,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC;oBACnB,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,SAAS,CAAC,EAAE;oBACzB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM,KAAK,GACT,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;oBACvD,CAAC,CAAC,MAAM,CAAC,KAAK;oBACd,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;gBACrC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC1E,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;gBAC9D,SAAS;gBACT,KAAK;gBACL,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;gBACpD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE,IAAI;gBACvE,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;YACH,MAAM,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,aAAa,IAAI,MAAM,EAAE;gBAC7E,GAAG,OAAO,CAAC,uBAAuB,EAAE;aACrC,CAAC,CAAC;YACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,qBAAqB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC/C,MAAM,CAAC,MAAM;gBACb,MAAM,CAAC,UAAU;aAClB,CAAC,CACH,CAAC;YACF,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE;gBACzB;oBACE,IAAI,EAAE,YAAY;oBAClB,UAAU,EAAE;wBACV,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,WAAW,EAAE,SAAS,CAAC,EAAE;wBACzB,MAAM,EAAE,SAAS;wBACjB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;qBACtC;oBACD,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CACxB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,CAC/C;oBACD,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;iBAC5C;aACF,CAAC,CAAC;YACH,IAAI,MAAM,GAAyC,WAAW,CAAC;YAC/D,IAAI,KAAK,GAAkB,IAAI,CAAC;YAChC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE;oBAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,UAAU,EAAE,IAAI;oBAChB,aAAa,EAAE,QAAQ;iBACxB,CAAC,CAAC;gBACH,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;oBAC1C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,OAAO,CAAC,iBAAiB,EACzB,GAAG,EAAE,CACH,YAAY,CAAC,OAAO,EAAE;wBACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;wBACnC,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,QAAQ,EAAE,aAAa;wBACvB,GAAG,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC;wBACnD,SAAS,EAAE,SAAS,CAAC,SAAS;qBAC/B,CAAC,CACL,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;wBACf,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;wBACzD,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,yBAAyB,CAAC;oBACpD,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,EAAE,CAAC;gBAC/C,MAAM,MAAM,GACV,OAAO,CAAC,cAAc;oBACtB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACjB,qBAAqB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE;wBACtD,OAAO,EAAE,MAAM;qBAChB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE;oBACpC,KAAK;oBACL,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,MAAM;oBACN,SAAS,EAAE,SAAS,CAAC,SAAS;iBAC/B,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;gBACtC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE;oBACxB,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW;wBACrC,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,QAAQ,CAAC;gBACf,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/B,CAAC;YACD,KAAK,GAAG,WAAW,CACjB,KAAK,EACL,gBAAgB,CAAC,QAAQ,EAAE;gBACzB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;gBAC1D,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,MAAM,EAAE;gBACrD,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;aACnE,CAAC,CACH,CAAC;YACF,eAAe,GAAG,MAAM,CAAC,WAAW,CAClC,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;iBAC1B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC;iBACrC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAC1C,CAAC;YACF,eAAe,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,WAAW,CACnD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CACtE,CAAC;YACF,MAAM,UAAU,GAAuC;gBACrD,MAAM;gBACN,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK;gBAC9F,OAAO,EAAE,eAAe;gBACxB,SAAS,EAAE,OAAO,CAAC,kBAAkB,EAAE;gBACvC,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;gBACvC,iBAAiB,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB;gBACpE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;aACrD,CAAC;YACF,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC/C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,UAAU,CAAC,WAAW,GAAG,WAAW,CAAC;YACvC,CAAC;YACD,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAuC;gBACrD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;gBACvD,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACtI,iBAAiB,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB;gBACpE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;gBACpD,SAAS,EAAE,OAAO,CAAC,kBAAkB,EAAE;aACxC,CAAC;YACF,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC/C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,UAAU,CAAC,WAAW,GAAG,WAAW,CAAC;YACvC,CAAC;YACD,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClD,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;QACvD,MAAM,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACrH,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,GAAiB,EACjB,UAA8C;IAE9C,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClE,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO;YACL,GAAG,GAAG;YACN,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,CAAC;YAClB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -13,10 +13,12 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { AppServerRunInput, AppServerRunOutcome } from "../app-debug/index.js";
|
|
15
15
|
import type { NodeRegistry } from "@nodetool-ai/node-sdk";
|
|
16
|
-
import { type StorageAdapter } from "@nodetool-ai/runtime";
|
|
16
|
+
import { ProcessingContext, type StorageAdapter } from "@nodetool-ai/runtime";
|
|
17
17
|
export interface AppServerRunnerOptions {
|
|
18
18
|
/** Job-id prefix, so a run is attributable to the surface that started it. */
|
|
19
19
|
jobPrefix?: string;
|
|
20
|
+
/** Operation context inherited by this workflow child. */
|
|
21
|
+
context?: ProcessingContext;
|
|
20
22
|
/**
|
|
21
23
|
* The store `asset://<id>` inputs resolve through. Only the local assets dir
|
|
22
24
|
* on a `file` backend, so a host on S3/Supabase must pass its own or the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-run-server.d.ts","sourceRoot":"","sources":["../../src/service/app-run-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"app-run-server.d.ts","sourceRoot":"","sources":["../../src/service/app-run-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,WAAW,sBAAsB;IACrC,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACtC;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,sBAA2B,GACnC,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAqF5D"}
|
|
@@ -25,20 +25,22 @@ export function createAppServerRunner(userId, registry, options = {}) {
|
|
|
25
25
|
return async (input) => {
|
|
26
26
|
const startedAt = Date.now();
|
|
27
27
|
const jobId = `${jobPrefix}-${randomUUID()}`;
|
|
28
|
-
const context =
|
|
29
|
-
jobId,
|
|
30
|
-
|
|
31
|
-
userId,
|
|
32
|
-
secretResolver: (key) => getSecret(key, userId),
|
|
33
|
-
storage: new FileStorageAdapter(getDefaultAssetsPath()),
|
|
34
|
-
assetStorage: options.assetStorage ?? null,
|
|
35
|
-
generationLifecycle: createFalGenerationLifecycleHooks({
|
|
36
|
-
userId,
|
|
28
|
+
const context = options.context
|
|
29
|
+
? options.context.copy({ jobId, workflowId: input.workflowId })
|
|
30
|
+
: new ProcessingContext({
|
|
37
31
|
jobId,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
32
|
+
workflowId: input.workflowId,
|
|
33
|
+
userId,
|
|
34
|
+
secretResolver: (key) => getSecret(key, userId),
|
|
35
|
+
storage: new FileStorageAdapter(getDefaultAssetsPath()),
|
|
36
|
+
assetStorage: options.assetStorage ?? null,
|
|
37
|
+
generationLifecycle: createFalGenerationLifecycleHooks({
|
|
38
|
+
userId,
|
|
39
|
+
jobId,
|
|
40
|
+
projectId: null,
|
|
41
|
+
publicUrl: process.env["NODETOOL_PUBLIC_URL"] ?? null
|
|
42
|
+
})
|
|
43
|
+
});
|
|
42
44
|
const sessionOptions = {
|
|
43
45
|
graph: input.graph,
|
|
44
46
|
registry,
|
|
@@ -78,7 +80,13 @@ export function createAppServerRunner(userId, registry, options = {}) {
|
|
|
78
80
|
}
|
|
79
81
|
// `session.result` never rejects: a kernel failure resolves as
|
|
80
82
|
// `status: "failed"`, which the simulator turns into a complaint.
|
|
81
|
-
const
|
|
83
|
+
const cancel = () => session.cancel("cancelled");
|
|
84
|
+
options.context?.signal.addEventListener("abort", cancel, { once: true });
|
|
85
|
+
if (options.context?.signal.aborted)
|
|
86
|
+
cancel();
|
|
87
|
+
const result = await session.result.finally(() => {
|
|
88
|
+
options.context?.signal.removeEventListener("abort", cancel);
|
|
89
|
+
});
|
|
82
90
|
const messages = result.messages ?? [];
|
|
83
91
|
const summary = collectExecutionSummary(messages);
|
|
84
92
|
summary.status = result.status ?? summary.status;
|