@nodetool-ai/execution 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/app-debug/app-spec.d.ts +94 -0
- package/dist/app-debug/app-spec.d.ts.map +1 -0
- package/dist/app-debug/app-spec.js +710 -0
- package/dist/app-debug/app-spec.js.map +1 -0
- package/dist/app-debug/application-target.d.ts +53 -0
- package/dist/app-debug/application-target.d.ts.map +1 -0
- package/dist/app-debug/application-target.js +126 -0
- package/dist/app-debug/application-target.js.map +1 -0
- package/dist/app-debug/bundle-target.d.ts +21 -0
- package/dist/app-debug/bundle-target.d.ts.map +1 -0
- package/dist/app-debug/bundle-target.js +51 -0
- package/dist/app-debug/bundle-target.js.map +1 -0
- package/dist/app-debug/graph-shape.d.ts +14 -0
- package/dist/app-debug/graph-shape.d.ts.map +1 -0
- package/dist/app-debug/graph-shape.js +23 -0
- package/dist/app-debug/graph-shape.js.map +1 -0
- package/dist/app-debug/index.d.ts +26 -0
- package/dist/app-debug/index.d.ts.map +1 -0
- package/dist/app-debug/index.js +19 -0
- package/dist/app-debug/index.js.map +1 -0
- package/dist/app-debug/markdown.d.ts +6 -0
- package/dist/app-debug/markdown.d.ts.map +1 -0
- package/dist/app-debug/markdown.js +133 -0
- package/dist/app-debug/markdown.js.map +1 -0
- package/dist/app-debug/runtime.d.ts +267 -0
- package/dist/app-debug/runtime.d.ts.map +1 -0
- package/dist/app-debug/runtime.js +633 -0
- package/dist/app-debug/runtime.js.map +1 -0
- package/dist/app-debug/script-operation.d.ts +58 -0
- package/dist/app-debug/script-operation.d.ts.map +1 -0
- package/dist/app-debug/script-operation.js +44 -0
- package/dist/app-debug/script-operation.js.map +1 -0
- package/dist/app-debug/simulate.d.ts +85 -0
- package/dist/app-debug/simulate.d.ts.map +1 -0
- package/dist/app-debug/simulate.js +991 -0
- package/dist/app-debug/simulate.js.map +1 -0
- package/dist/app-debug/summarize.d.ts +64 -0
- package/dist/app-debug/summarize.d.ts.map +1 -0
- package/dist/app-debug/summarize.js +65 -0
- package/dist/app-debug/summarize.js.map +1 -0
- package/dist/app-debug/types.d.ts +343 -0
- package/dist/app-debug/types.d.ts.map +1 -0
- package/dist/app-debug/types.js +2 -0
- package/dist/app-debug/types.js.map +1 -0
- package/dist/cost-ledger.d.ts +147 -0
- package/dist/cost-ledger.d.ts.map +1 -0
- package/dist/cost-ledger.js +288 -0
- package/dist/cost-ledger.js.map +1 -0
- package/dist/debug/collector.d.ts +28 -0
- package/dist/debug/collector.d.ts.map +1 -0
- package/dist/debug/collector.js +284 -0
- package/dist/debug/collector.js.map +1 -0
- package/dist/debug/index.d.ts +15 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +16 -0
- package/dist/debug/index.js.map +1 -0
- package/dist/debug/types.d.ts +179 -0
- package/dist/debug/types.d.ts.map +1 -0
- package/dist/debug/types.js +11 -0
- package/dist/debug/types.js.map +1 -0
- package/dist/debug/verdict.d.ts +27 -0
- package/dist/debug/verdict.d.ts.map +1 -0
- package/dist/debug/verdict.js +51 -0
- package/dist/debug/verdict.js.map +1 -0
- package/dist/executor-resolver.d.ts +13 -0
- package/dist/executor-resolver.d.ts.map +1 -0
- package/dist/executor-resolver.js +13 -0
- package/dist/executor-resolver.js.map +1 -0
- package/dist/fal-output-decoder.d.ts +36 -0
- package/dist/fal-output-decoder.d.ts.map +1 -0
- package/dist/fal-output-decoder.js +129 -0
- package/dist/fal-output-decoder.js.map +1 -0
- package/dist/generation-lifecycle.d.ts +54 -0
- package/dist/generation-lifecycle.d.ts.map +1 -0
- package/dist/generation-lifecycle.js +431 -0
- package/dist/generation-lifecycle.js.map +1 -0
- package/dist/generation-recovery-worker.d.ts +100 -0
- package/dist/generation-recovery-worker.d.ts.map +1 -0
- package/dist/generation-recovery-worker.js +995 -0
- package/dist/generation-recovery-worker.js.map +1 -0
- package/dist/generation-tracker.d.ts +83 -0
- package/dist/generation-tracker.d.ts.map +1 -0
- package/dist/generation-tracker.js +436 -0
- package/dist/generation-tracker.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/js-script-debug/index.d.ts +13 -0
- package/dist/js-script-debug/index.d.ts.map +1 -0
- package/dist/js-script-debug/index.js +12 -0
- package/dist/js-script-debug/index.js.map +1 -0
- package/dist/js-script-debug/markdown.d.ts +6 -0
- package/dist/js-script-debug/markdown.d.ts.map +1 -0
- package/dist/js-script-debug/markdown.js +62 -0
- package/dist/js-script-debug/markdown.js.map +1 -0
- package/dist/js-script-debug/outputs.d.ts +20 -0
- package/dist/js-script-debug/outputs.d.ts.map +1 -0
- package/dist/js-script-debug/outputs.js +30 -0
- package/dist/js-script-debug/outputs.js.map +1 -0
- package/dist/js-script-debug/report.d.ts +15 -0
- package/dist/js-script-debug/report.d.ts.map +1 -0
- package/dist/js-script-debug/report.js +90 -0
- package/dist/js-script-debug/report.js.map +1 -0
- package/dist/js-script-debug/types.d.ts +63 -0
- package/dist/js-script-debug/types.d.ts.map +1 -0
- package/dist/js-script-debug/types.js +10 -0
- package/dist/js-script-debug/types.js.map +1 -0
- package/dist/js-script-debug/validate.d.ts +38 -0
- package/dist/js-script-debug/validate.d.ts.map +1 -0
- package/dist/js-script-debug/validate.js +137 -0
- package/dist/js-script-debug/validate.js.map +1 -0
- package/dist/message-stream.d.ts +33 -0
- package/dist/message-stream.d.ts.map +1 -0
- package/dist/message-stream.js +58 -0
- package/dist/message-stream.js.map +1 -0
- package/dist/normalize-graph.d.ts +13 -0
- package/dist/normalize-graph.d.ts.map +1 -0
- package/dist/normalize-graph.js +63 -0
- package/dist/normalize-graph.js.map +1 -0
- package/dist/output-names.d.ts +13 -0
- package/dist/output-names.d.ts.map +1 -0
- package/dist/output-names.js +13 -0
- package/dist/output-names.js.map +1 -0
- package/dist/predicates.d.ts +6 -0
- package/dist/predicates.d.ts.map +1 -0
- package/dist/predicates.js +6 -0
- package/dist/predicates.js.map +1 -0
- package/dist/preflight.d.ts +87 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +139 -0
- package/dist/preflight.js.map +1 -0
- package/dist/provider-secret-key.d.ts +3 -0
- package/dist/provider-secret-key.d.ts.map +1 -0
- package/dist/provider-secret-key.js +7 -0
- package/dist/provider-secret-key.js.map +1 -0
- package/dist/service/app-debug-service.d.ts +78 -0
- package/dist/service/app-debug-service.d.ts.map +1 -0
- package/dist/service/app-debug-service.js +201 -0
- package/dist/service/app-debug-service.js.map +1 -0
- package/dist/service/app-run-server.d.ts +28 -0
- package/dist/service/app-run-server.d.ts.map +1 -0
- package/dist/service/app-run-server.js +104 -0
- package/dist/service/app-run-server.js.map +1 -0
- package/dist/service/debug-sessions.d.ts +158 -0
- package/dist/service/debug-sessions.d.ts.map +1 -0
- package/dist/service/debug-sessions.js +358 -0
- package/dist/service/debug-sessions.js.map +1 -0
- package/dist/service/index.d.ts +22 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +17 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/job-progress.d.ts +40 -0
- package/dist/service/job-progress.d.ts.map +1 -0
- package/dist/service/job-progress.js +53 -0
- package/dist/service/job-progress.js.map +1 -0
- package/dist/service/workflow-run.d.ts +279 -0
- package/dist/service/workflow-run.d.ts.map +1 -0
- package/dist/service/workflow-run.js +598 -0
- package/dist/service/workflow-run.js.map +1 -0
- package/dist/service/workflow-workspace.d.ts +89 -0
- package/dist/service/workflow-workspace.d.ts.map +1 -0
- package/dist/service/workflow-workspace.js +160 -0
- package/dist/service/workflow-workspace.js.map +1 -0
- package/dist/session.d.ts +62 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +353 -0
- package/dist/session.js.map +1 -0
- package/dist/sketch-debug/index.d.ts +11 -0
- package/dist/sketch-debug/index.d.ts.map +1 -0
- package/dist/sketch-debug/index.js +10 -0
- package/dist/sketch-debug/index.js.map +1 -0
- package/dist/sketch-debug/markdown.d.ts +6 -0
- package/dist/sketch-debug/markdown.d.ts.map +1 -0
- package/dist/sketch-debug/markdown.js +93 -0
- package/dist/sketch-debug/markdown.js.map +1 -0
- package/dist/sketch-debug/report.d.ts +15 -0
- package/dist/sketch-debug/report.d.ts.map +1 -0
- package/dist/sketch-debug/report.js +98 -0
- package/dist/sketch-debug/report.js.map +1 -0
- package/dist/sketch-debug/types.d.ts +62 -0
- package/dist/sketch-debug/types.d.ts.map +1 -0
- package/dist/sketch-debug/types.js +10 -0
- package/dist/sketch-debug/types.js.map +1 -0
- package/dist/sketch-debug/validate.d.ts +14 -0
- package/dist/sketch-debug/validate.d.ts.map +1 -0
- package/dist/sketch-debug/validate.js +478 -0
- package/dist/sketch-debug/validate.js.map +1 -0
- package/dist/supervisor.d.ts +45 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +97 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/timeline-debug/index.d.ts +11 -0
- package/dist/timeline-debug/index.d.ts.map +1 -0
- package/dist/timeline-debug/index.js +10 -0
- package/dist/timeline-debug/index.js.map +1 -0
- package/dist/timeline-debug/legibility.d.ts +23 -0
- package/dist/timeline-debug/legibility.d.ts.map +1 -0
- package/dist/timeline-debug/legibility.js +240 -0
- package/dist/timeline-debug/legibility.js.map +1 -0
- package/dist/timeline-debug/markdown.d.ts +6 -0
- package/dist/timeline-debug/markdown.d.ts.map +1 -0
- package/dist/timeline-debug/markdown.js +103 -0
- package/dist/timeline-debug/markdown.js.map +1 -0
- package/dist/timeline-debug/motion.d.ts +20 -0
- package/dist/timeline-debug/motion.d.ts.map +1 -0
- package/dist/timeline-debug/motion.js +362 -0
- package/dist/timeline-debug/motion.js.map +1 -0
- package/dist/timeline-debug/report.d.ts +16 -0
- package/dist/timeline-debug/report.d.ts.map +1 -0
- package/dist/timeline-debug/report.js +100 -0
- package/dist/timeline-debug/report.js.map +1 -0
- package/dist/timeline-debug/showcase.d.ts +7 -0
- package/dist/timeline-debug/showcase.d.ts.map +1 -0
- package/dist/timeline-debug/showcase.js +347 -0
- package/dist/timeline-debug/showcase.js.map +1 -0
- package/dist/timeline-debug/types.d.ts +64 -0
- package/dist/timeline-debug/types.d.ts.map +1 -0
- package/dist/timeline-debug/types.js +10 -0
- package/dist/timeline-debug/types.js.map +1 -0
- package/dist/timeline-debug/validate.d.ts +24 -0
- package/dist/timeline-debug/validate.d.ts.map +1 -0
- package/dist/timeline-debug/validate.js +1432 -0
- package/dist/timeline-debug/validate.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless driver for the shared app runtime core.
|
|
3
|
+
*
|
|
4
|
+
* The fold rules, the state namespaces, the run policy, and the action
|
|
5
|
+
* vocabulary all live in `@nodetool-ai/app-runtime` — the same code the web and
|
|
6
|
+
* mobile runtimes run. This file only supplies what a headless run needs: a
|
|
7
|
+
* workflow executor per operation and the bookkeeping that turns an awaited run
|
|
8
|
+
* into an invocation, plus the in-memory resource collections a run gets in
|
|
9
|
+
* place of the server-backed ones the web runtime reads.
|
|
10
|
+
*
|
|
11
|
+
* The web engine's reactive subgraph runs collapse to full workflow runs here
|
|
12
|
+
* (the headless kernel has no browser worker), which the report notes rather
|
|
13
|
+
* than simulates.
|
|
14
|
+
*/
|
|
15
|
+
import { applyEvent, applyEvents, createInstanceState, decideRun, evaluateCondition, formatTemplate, initialVariableValues, isMissingRequiredMediaValue, isLiveInvocation, liveInvocations, messagesToEvents, operationError, outputVariableTargets, parseCondition, readRef, resolveOperationParams, stateKey } from "@nodetool-ai/app-runtime";
|
|
16
|
+
import { isString } from "../predicates.js";
|
|
17
|
+
/**
|
|
18
|
+
* A condition as a failure message names it: `draft notEmpty`, `count gt 3`.
|
|
19
|
+
* The stored props are what an author sees in the builder, so the message
|
|
20
|
+
* points at something they can find.
|
|
21
|
+
*/
|
|
22
|
+
export const describeCondition = (props) => {
|
|
23
|
+
if (!props?.binding)
|
|
24
|
+
return null;
|
|
25
|
+
const op = props.op ?? "notEmpty";
|
|
26
|
+
const value = props.value === undefined || props.value === "" ? "" : ` ${props.value}`;
|
|
27
|
+
return `${props.binding} ${op}${value}`;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Why a ref cannot be written, or null when it can.
|
|
31
|
+
*
|
|
32
|
+
* Only a run fills an output slot or an operation's execution state, so a
|
|
33
|
+
* script that writes one has named the wrong thing — the value would land in
|
|
34
|
+
* the inputs namespace, where nothing reads it.
|
|
35
|
+
*/
|
|
36
|
+
export const writeRefusal = (ref) => {
|
|
37
|
+
switch (ref.kind) {
|
|
38
|
+
case "output":
|
|
39
|
+
return "resolves to an output, which only a run can fill, and cannot be set";
|
|
40
|
+
case "execution":
|
|
41
|
+
return "resolves to execution state, which only a run can fill, and cannot be set";
|
|
42
|
+
default:
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
/** How to seed a collection, named in every message about an unseeded one. */
|
|
47
|
+
export const seedResourceHint = (resourceBindingId) => `seed it with an interaction step {"seedResource":{"id":"${resourceBindingId}","items":[{"id":"item-1"}]}} or a "resource:${resourceBindingId}" param`;
|
|
48
|
+
/**
|
|
49
|
+
* The collection behind one resource binding, held in memory for the length of
|
|
50
|
+
* one debug run.
|
|
51
|
+
*
|
|
52
|
+
* The web runtime reads collections over tRPC and hands widgets a `ResourceRef`
|
|
53
|
+
* to act on; a headless run has no server and no user, so it gets the same
|
|
54
|
+
* envelope from a seeded provider instead. Nothing here touches the database —
|
|
55
|
+
* a run only ever sees what the interaction script or `--params` put in.
|
|
56
|
+
*
|
|
57
|
+
* Selection follows `useBoundResource`: a pinned `fixedId` wins, else the item
|
|
58
|
+
* the last command or `select` chose, else the first member — so a picker that
|
|
59
|
+
* nobody touched still has something to send.
|
|
60
|
+
*/
|
|
61
|
+
export class InMemoryResourceProvider {
|
|
62
|
+
kind;
|
|
63
|
+
items = [];
|
|
64
|
+
pinnedId;
|
|
65
|
+
chosenId = null;
|
|
66
|
+
seq = 0;
|
|
67
|
+
constructor(init) {
|
|
68
|
+
this.kind = init.kind;
|
|
69
|
+
this.pinnedId = init.pinnedId ?? null;
|
|
70
|
+
for (const seed of init.items ?? [])
|
|
71
|
+
this.items.push(this.toItem(seed));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Timestamps come from a counter, not the clock, so two runs of the same
|
|
75
|
+
* script produce identical reports.
|
|
76
|
+
*/
|
|
77
|
+
toItem(seed) {
|
|
78
|
+
this.seq += 1;
|
|
79
|
+
return {
|
|
80
|
+
ref: { kind: this.kind, id: seed.id, revision: seed.revision ?? 1 },
|
|
81
|
+
name: seed.name ?? seed.id,
|
|
82
|
+
projectId: seed.projectId ?? null,
|
|
83
|
+
contentType: seed.contentType ?? null,
|
|
84
|
+
updatedAt: seed.updatedAt ?? new Date(this.seq * 1000).toISOString(),
|
|
85
|
+
document: seed.document
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
list() {
|
|
89
|
+
return [...this.items];
|
|
90
|
+
}
|
|
91
|
+
get(id) {
|
|
92
|
+
return this.items.find((item) => item.ref.id === id) ?? null;
|
|
93
|
+
}
|
|
94
|
+
/** The item a `from: "resource"` param sends and a command acts on. */
|
|
95
|
+
selected() {
|
|
96
|
+
const targetId = this.pinnedId ?? this.chosenId ?? this.items[0]?.ref.id ?? null;
|
|
97
|
+
if (!targetId)
|
|
98
|
+
return null;
|
|
99
|
+
// A pinned id can sit outside the collection; point at it anyway, the way
|
|
100
|
+
// the web runtime does.
|
|
101
|
+
return this.get(targetId)?.ref ?? { kind: this.kind, id: targetId };
|
|
102
|
+
}
|
|
103
|
+
select(ref) {
|
|
104
|
+
this.chosenId = ref?.id ?? null;
|
|
105
|
+
}
|
|
106
|
+
apply(op) {
|
|
107
|
+
const args = op.args ?? {};
|
|
108
|
+
const name = isString(args.name) ? args.name : undefined;
|
|
109
|
+
switch (op.command) {
|
|
110
|
+
case "read": {
|
|
111
|
+
const ref = op.ref ?? this.selected();
|
|
112
|
+
return ref ? this.get(ref.id) : null;
|
|
113
|
+
}
|
|
114
|
+
case "create":
|
|
115
|
+
case "upload": {
|
|
116
|
+
const seed = {
|
|
117
|
+
id: isString(args.id) ? args.id : this.nextId(),
|
|
118
|
+
document: args.document
|
|
119
|
+
};
|
|
120
|
+
if (name !== undefined) {
|
|
121
|
+
seed.name = name;
|
|
122
|
+
}
|
|
123
|
+
if (isString(args.contentType)) {
|
|
124
|
+
seed.contentType = args.contentType;
|
|
125
|
+
}
|
|
126
|
+
const item = this.toItem(seed);
|
|
127
|
+
this.items.push(item);
|
|
128
|
+
this.chosenId = item.ref.id;
|
|
129
|
+
return item;
|
|
130
|
+
}
|
|
131
|
+
case "update": {
|
|
132
|
+
const ref = op.ref ?? this.selected();
|
|
133
|
+
const index = ref
|
|
134
|
+
? this.items.findIndex((i) => i.ref.id === ref.id)
|
|
135
|
+
: -1;
|
|
136
|
+
if (!ref || index < 0) {
|
|
137
|
+
throw new Error(`Resource command "update" has nothing to write: the collection holds no resource "${ref?.id ?? ""}".`);
|
|
138
|
+
}
|
|
139
|
+
const current = this.items[index];
|
|
140
|
+
// The web providers reject a write whose revision is behind the row;
|
|
141
|
+
// headless keeps the rule so a script cannot pretend a stale write works.
|
|
142
|
+
if (ref.revision !== undefined &&
|
|
143
|
+
current.ref.revision !== undefined &&
|
|
144
|
+
ref.revision < current.ref.revision) {
|
|
145
|
+
throw new Error(`Resource command "update" carries revision ${ref.revision} but resource "${ref.id}" is at ${current.ref.revision}.`);
|
|
146
|
+
}
|
|
147
|
+
this.seq += 1;
|
|
148
|
+
const next = {
|
|
149
|
+
...current,
|
|
150
|
+
ref: { ...current.ref, revision: (current.ref.revision ?? 0) + 1 },
|
|
151
|
+
name: name ?? current.name,
|
|
152
|
+
document: "document" in args ? args.document : current.document,
|
|
153
|
+
updatedAt: new Date(this.seq * 1000).toISOString()
|
|
154
|
+
};
|
|
155
|
+
this.items[index] = next;
|
|
156
|
+
return next;
|
|
157
|
+
}
|
|
158
|
+
case "delete": {
|
|
159
|
+
const ref = op.ref ?? this.selected();
|
|
160
|
+
const index = ref
|
|
161
|
+
? this.items.findIndex((i) => i.ref.id === ref.id)
|
|
162
|
+
: -1;
|
|
163
|
+
if (!ref || index < 0) {
|
|
164
|
+
throw new Error(`Resource command "delete" has nothing to remove: the collection holds no resource "${ref?.id ?? ""}".`);
|
|
165
|
+
}
|
|
166
|
+
const [removed] = this.items.splice(index, 1);
|
|
167
|
+
if (this.chosenId === removed.ref.id)
|
|
168
|
+
this.chosenId = null;
|
|
169
|
+
return removed;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** An id no member holds, so `create` twice makes two resources. */
|
|
174
|
+
nextId() {
|
|
175
|
+
let n = this.items.length + 1;
|
|
176
|
+
while (this.get(`${this.kind}-${n}`))
|
|
177
|
+
n += 1;
|
|
178
|
+
return `${this.kind}-${n}`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The timeout a run actually gets: the operation's own `timeoutMs` capped by
|
|
183
|
+
* the harness-wide ceiling, so `--timeout` always shortens and never extends.
|
|
184
|
+
*/
|
|
185
|
+
export const effectiveTimeoutMs = (operationTimeoutMs, ceilingMs) => {
|
|
186
|
+
const candidates = [operationTimeoutMs, ceilingMs].filter((value) => value != null && value > 0);
|
|
187
|
+
return candidates.length > 0 ? Math.min(...candidates) : null;
|
|
188
|
+
};
|
|
189
|
+
const TIMED_OUT = Symbol("timed-out");
|
|
190
|
+
/** Resolve, or hand back {@link TIMED_OUT} once `ms` elapses. */
|
|
191
|
+
const withTimeout = async (promise, ms) => {
|
|
192
|
+
if (ms == null)
|
|
193
|
+
return promise;
|
|
194
|
+
let timer;
|
|
195
|
+
const expiry = new Promise((resolve) => {
|
|
196
|
+
timer = setTimeout(() => resolve(TIMED_OUT), ms);
|
|
197
|
+
});
|
|
198
|
+
try {
|
|
199
|
+
return await Promise.race([promise, expiry]);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
if (timer)
|
|
203
|
+
clearTimeout(timer);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
export class HeadlessAppRuntime {
|
|
207
|
+
_state = createInstanceState();
|
|
208
|
+
runCount = 0;
|
|
209
|
+
/**
|
|
210
|
+
* Every state write goes through here, so a widget's conditions are re-read
|
|
211
|
+
* after each fold — exactly where the web runtime re-renders.
|
|
212
|
+
*/
|
|
213
|
+
get state() {
|
|
214
|
+
return this._state;
|
|
215
|
+
}
|
|
216
|
+
set state(next) {
|
|
217
|
+
this._state = next;
|
|
218
|
+
this.refreshWidgets();
|
|
219
|
+
}
|
|
220
|
+
/** Every invocation started, in order. */
|
|
221
|
+
invocations = [];
|
|
222
|
+
/** Every activity label reported, in order. */
|
|
223
|
+
activity = [];
|
|
224
|
+
init;
|
|
225
|
+
byId = new Map();
|
|
226
|
+
/** Runs the harness stopped waiting for, still settling in the background. */
|
|
227
|
+
inFlight = new Map();
|
|
228
|
+
invocationSeq = 0;
|
|
229
|
+
/** Widget conditions, parsed once, plus the state each evaluation writes. */
|
|
230
|
+
compiled = [];
|
|
231
|
+
widgetStates = new Map();
|
|
232
|
+
/** Declared resource bindings, keyed by id. */
|
|
233
|
+
resourceBindings = new Map();
|
|
234
|
+
/** Seeded collections, keyed by resource binding id. */
|
|
235
|
+
providers = new Map();
|
|
236
|
+
/** Every resource command dispatched, in order. */
|
|
237
|
+
resourceCommands = [];
|
|
238
|
+
constructor(init) {
|
|
239
|
+
this.init = init;
|
|
240
|
+
const scope = init.scope;
|
|
241
|
+
for (const binding of init.resources ?? []) {
|
|
242
|
+
this.resourceBindings.set(binding.id, binding);
|
|
243
|
+
}
|
|
244
|
+
for (const widget of init.widgets ?? []) {
|
|
245
|
+
const state = {
|
|
246
|
+
visible: true,
|
|
247
|
+
disabled: false,
|
|
248
|
+
everReachable: false,
|
|
249
|
+
visibleWhen: describeCondition(widget.visibleWhen),
|
|
250
|
+
disabledWhen: describeCondition(widget.disabledWhen)
|
|
251
|
+
};
|
|
252
|
+
this.compiled.push({
|
|
253
|
+
init: widget,
|
|
254
|
+
visible: scope ? parseCondition(widget.visibleWhen, scope) : null,
|
|
255
|
+
disabled: scope ? parseCondition(widget.disabledWhen, scope) : null,
|
|
256
|
+
state
|
|
257
|
+
});
|
|
258
|
+
this.widgetStates.set(widget.id, state);
|
|
259
|
+
}
|
|
260
|
+
for (const operation of init.operations) {
|
|
261
|
+
this.byId.set(operation.binding.id, operation);
|
|
262
|
+
this.state = applyEvent(this.state, {
|
|
263
|
+
type: "seedInputs",
|
|
264
|
+
values: operation.defaults
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
this.state = applyEvent(this.state, {
|
|
268
|
+
type: "seedVariables",
|
|
269
|
+
values: initialVariableValues(init.variables ?? [])
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Re-evaluate every widget's `visibleWhen`/`disabledWhen` against the current
|
|
274
|
+
* state. An unset or unresolvable condition leaves the widget visible and
|
|
275
|
+
* enabled, the same fallback the web runtime uses.
|
|
276
|
+
*/
|
|
277
|
+
refreshWidgets() {
|
|
278
|
+
for (const widget of this.compiled) {
|
|
279
|
+
const visible = widget.visible
|
|
280
|
+
? evaluateCondition(this._state, widget.visible)
|
|
281
|
+
: true;
|
|
282
|
+
const disabled = widget.disabled
|
|
283
|
+
? evaluateCondition(this._state, widget.disabled)
|
|
284
|
+
: false;
|
|
285
|
+
widget.state.visible = visible;
|
|
286
|
+
widget.state.disabled = disabled;
|
|
287
|
+
widget.state.everReachable ||= visible && !disabled;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/** A widget's current visibility, or null when the runtime has no such widget. */
|
|
291
|
+
widgetState(widgetId) {
|
|
292
|
+
return this.widgetStates.get(widgetId) ?? null;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* What a widget displays: its `format` template rendered against the current
|
|
296
|
+
* state, or null when it has none and shows its bound value raw.
|
|
297
|
+
*/
|
|
298
|
+
display(widgetId) {
|
|
299
|
+
const widget = this.compiled.find((w) => w.init.id === widgetId);
|
|
300
|
+
if (!widget?.init.format || !this.init.scope)
|
|
301
|
+
return null;
|
|
302
|
+
return formatTemplate(widget.init.format, this._state, this.init.scope);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Attach a collection to a declared resource binding, replacing whatever was
|
|
306
|
+
* seeded before. Seeding is the only way a headless run gets resources.
|
|
307
|
+
*/
|
|
308
|
+
seedResource(resourceBindingId, items) {
|
|
309
|
+
const binding = this.resourceBindings.get(resourceBindingId);
|
|
310
|
+
if (!binding) {
|
|
311
|
+
const declared = [...this.resourceBindings.keys()];
|
|
312
|
+
throw new Error(`No resource binding "${resourceBindingId}" is declared by this app` +
|
|
313
|
+
(declared.length > 0 ? ` (declared: ${declared.join(", ")}).` : "."));
|
|
314
|
+
}
|
|
315
|
+
const providerOptions = { kind: binding.kind, items };
|
|
316
|
+
if (binding.scope.fixedId) {
|
|
317
|
+
providerOptions.pinnedId = binding.scope.fixedId;
|
|
318
|
+
}
|
|
319
|
+
const provider = new InMemoryResourceProvider(providerOptions);
|
|
320
|
+
this.providers.set(resourceBindingId, provider);
|
|
321
|
+
return provider;
|
|
322
|
+
}
|
|
323
|
+
/** The collection behind a resource binding, or null when nothing seeded it. */
|
|
324
|
+
resourceProvider(resourceBindingId) {
|
|
325
|
+
return this.providers.get(resourceBindingId) ?? null;
|
|
326
|
+
}
|
|
327
|
+
/** Resource bindings the document declares, in document order. */
|
|
328
|
+
get resourceBindingList() {
|
|
329
|
+
return [...this.resourceBindings.values()];
|
|
330
|
+
}
|
|
331
|
+
/** Last error reported against an operation's active invocation. */
|
|
332
|
+
errorFor(operationId) {
|
|
333
|
+
return operationError(this.state, operationId) ?? null;
|
|
334
|
+
}
|
|
335
|
+
get error() {
|
|
336
|
+
return this.errorFor(this.init.defaultOperationId);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Write a value through its resolved binding.
|
|
340
|
+
*
|
|
341
|
+
* A ref {@link writeRefusal} rejects throws instead of landing in the inputs
|
|
342
|
+
* namespace: an output slot only a run fills, written as an input, is a value
|
|
343
|
+
* no reader ever sees, and the step that wrote it must not report success.
|
|
344
|
+
*/
|
|
345
|
+
write(ref, value) {
|
|
346
|
+
const refusal = writeRefusal(ref);
|
|
347
|
+
if (refusal)
|
|
348
|
+
throw new Error(refusal);
|
|
349
|
+
const key = stateKey(ref);
|
|
350
|
+
switch (ref.kind) {
|
|
351
|
+
case "variable":
|
|
352
|
+
this.state = applyEvent(this.state, {
|
|
353
|
+
type: "setVariable",
|
|
354
|
+
variableId: ref.variableId,
|
|
355
|
+
value
|
|
356
|
+
});
|
|
357
|
+
break;
|
|
358
|
+
case "view":
|
|
359
|
+
this.state = applyEvent(this.state, { type: "setView", key, value });
|
|
360
|
+
break;
|
|
361
|
+
default:
|
|
362
|
+
this.state = applyEvent(this.state, { type: "setInput", key, value });
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* HOLDOUT (anti-slop/no-unknown-returns): a slot holds a workflow value —
|
|
367
|
+
* the open domain `AppInstanceState` stores as `unknown`.
|
|
368
|
+
*/
|
|
369
|
+
read(ref) {
|
|
370
|
+
if (!ref)
|
|
371
|
+
return undefined;
|
|
372
|
+
const key = stateKey(ref);
|
|
373
|
+
switch (ref.kind) {
|
|
374
|
+
case "output":
|
|
375
|
+
return this.state.outputs[key]?.value;
|
|
376
|
+
case "variable":
|
|
377
|
+
return this.state.variables[key];
|
|
378
|
+
case "view":
|
|
379
|
+
return this.state.view[key];
|
|
380
|
+
case "execution":
|
|
381
|
+
return readRef(this.state, {
|
|
382
|
+
source: "execution",
|
|
383
|
+
operationId: ref.operationId,
|
|
384
|
+
field: ref.field
|
|
385
|
+
});
|
|
386
|
+
default:
|
|
387
|
+
return this.state.inputs[key]?.value;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Params for one operation's run: every input resolved through its mapping
|
|
392
|
+
* (widget value, variable, constant, or resource), keyed by node name.
|
|
393
|
+
*/
|
|
394
|
+
collectParams(operationId) {
|
|
395
|
+
const operation = this.byId.get(operationId);
|
|
396
|
+
if (!operation)
|
|
397
|
+
return {};
|
|
398
|
+
return resolveOperationParams({
|
|
399
|
+
operation: operation.binding,
|
|
400
|
+
state: this.state,
|
|
401
|
+
inputName: (nodeId) => operation.inputNameByNodeId.get(nodeId),
|
|
402
|
+
inputNodeIds: operation.inputNodeIds,
|
|
403
|
+
resourceRef: (resourceBindingId) => this.providers.get(resourceBindingId)?.selected() ?? undefined
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Refuse to run an operation whose inputs read a collection nothing seeded.
|
|
408
|
+
* Sending no param for it would look like a passing run against an app that
|
|
409
|
+
* cannot work, which is the failure this harness exists to catch.
|
|
410
|
+
*/
|
|
411
|
+
assertResourcesSeeded(binding) {
|
|
412
|
+
for (const [nodeId, mapping] of Object.entries(binding.inputs)) {
|
|
413
|
+
if (mapping.from !== "resource")
|
|
414
|
+
continue;
|
|
415
|
+
const id = mapping.resourceBindingId;
|
|
416
|
+
const provider = this.providers.get(id);
|
|
417
|
+
if (!provider) {
|
|
418
|
+
throw new Error(`Operation "${binding.id}" input "${nodeId}" comes from resource binding "${id}", which nothing seeded — ${seedResourceHint(id)}.`);
|
|
419
|
+
}
|
|
420
|
+
if (!provider.selected()) {
|
|
421
|
+
throw new Error(`Operation "${binding.id}" input "${nodeId}" comes from resource binding "${id}", which was seeded empty — the run has no resource to send. Seed at least one item.`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
assertRequiredInputs(operation) {
|
|
426
|
+
const params = this.collectParams(operation.binding.id);
|
|
427
|
+
for (const nodeId of operation.inputNodeIds) {
|
|
428
|
+
const nodeType = operation.inputNodeTypeByNodeId?.get(nodeId);
|
|
429
|
+
const name = operation.inputNameByNodeId.get(nodeId);
|
|
430
|
+
if (nodeType &&
|
|
431
|
+
name &&
|
|
432
|
+
isMissingRequiredMediaValue(nodeType, params[name])) {
|
|
433
|
+
throw new Error(`Input "${name}" requires a media value before operation "${operation.binding.name}" can run.`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/** Dispatch one action; a `run` executes the workflow and folds its stream. */
|
|
438
|
+
async dispatch(action) {
|
|
439
|
+
switch (action.kind) {
|
|
440
|
+
case "run":
|
|
441
|
+
await this.run(action.operationId);
|
|
442
|
+
break;
|
|
443
|
+
case "cancel":
|
|
444
|
+
this.cancel(action.operationId ?? this.init.defaultOperationId, action.invocationId);
|
|
445
|
+
break;
|
|
446
|
+
case "setVariable":
|
|
447
|
+
this.state = applyEvent(this.state, {
|
|
448
|
+
type: "setVariable",
|
|
449
|
+
variableId: action.variableId,
|
|
450
|
+
value: action.value
|
|
451
|
+
});
|
|
452
|
+
break;
|
|
453
|
+
case "toggleVariable":
|
|
454
|
+
this.state = applyEvent(this.state, {
|
|
455
|
+
type: "toggleVariable",
|
|
456
|
+
variableId: action.variableId
|
|
457
|
+
});
|
|
458
|
+
break;
|
|
459
|
+
case "resourceCommand": {
|
|
460
|
+
const provider = this.providers.get(action.resourceBindingId);
|
|
461
|
+
if (!provider) {
|
|
462
|
+
throw new Error(`Resource command "${action.command}" targets resource binding "${action.resourceBindingId}", which nothing seeded — ${seedResourceHint(action.resourceBindingId)}.`);
|
|
463
|
+
}
|
|
464
|
+
const command = {
|
|
465
|
+
command: action.command,
|
|
466
|
+
ref: provider.selected()
|
|
467
|
+
};
|
|
468
|
+
if (action.args) {
|
|
469
|
+
command.args = action.args;
|
|
470
|
+
}
|
|
471
|
+
provider.apply(command);
|
|
472
|
+
this.resourceCommands.push({
|
|
473
|
+
resourceBindingId: action.resourceBindingId,
|
|
474
|
+
command: action.command
|
|
475
|
+
});
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
case "openResource":
|
|
479
|
+
// Opening a resource in its own editor is the host app's job, and a
|
|
480
|
+
// headless run has no editor — record the request and move on.
|
|
481
|
+
this.resourceCommands.push({
|
|
482
|
+
resourceBindingId: action.resourceBindingId,
|
|
483
|
+
command: "open"
|
|
484
|
+
});
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/** Cancel an operation's live invocations (or one named invocation). */
|
|
489
|
+
cancel(operationId, invocationId) {
|
|
490
|
+
// A named invocation is filtered on liveness like the bare path: cancelling
|
|
491
|
+
// one that already completed or failed would overwrite what it reported.
|
|
492
|
+
const targets = invocationId
|
|
493
|
+
? [invocationId].filter((id) => {
|
|
494
|
+
const invocation = this.state.invocations[id];
|
|
495
|
+
return invocation ? isLiveInvocation(invocation) : false;
|
|
496
|
+
})
|
|
497
|
+
: liveInvocations(this.state, operationId).map((i) => i.id);
|
|
498
|
+
for (const id of targets) {
|
|
499
|
+
this.state = applyEvent(this.state, {
|
|
500
|
+
type: "invocationStatus",
|
|
501
|
+
invocationId: id,
|
|
502
|
+
status: "cancelled"
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
return targets;
|
|
506
|
+
}
|
|
507
|
+
timeoutFor(operation) {
|
|
508
|
+
return effectiveTimeoutMs(operation.timeoutMs, this.init.timeoutMs);
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Start one run, after `decideRun` says what the operation's policy makes of
|
|
512
|
+
* whatever is already in flight.
|
|
513
|
+
*/
|
|
514
|
+
async run(operationId) {
|
|
515
|
+
const operation = this.byId.get(operationId);
|
|
516
|
+
if (!operation) {
|
|
517
|
+
throw new Error(`No operation "${operationId}" is declared by this app.`);
|
|
518
|
+
}
|
|
519
|
+
if (!operation.runWorkflow) {
|
|
520
|
+
throw new Error(`Operation "${operationId}" has no runnable workflow — its binding could not be resolved.`);
|
|
521
|
+
}
|
|
522
|
+
this.assertResourcesSeeded(operation.binding);
|
|
523
|
+
this.assertRequiredInputs(operation);
|
|
524
|
+
const decision = decideRun(this.state, operation.binding);
|
|
525
|
+
const targets = decision.kind === "replace"
|
|
526
|
+
? decision.cancel
|
|
527
|
+
: decision.kind === "queue"
|
|
528
|
+
? decision.after
|
|
529
|
+
: [];
|
|
530
|
+
const timeoutMs = this.timeoutFor(operation.binding);
|
|
531
|
+
if (decision.kind === "replace") {
|
|
532
|
+
for (const id of targets)
|
|
533
|
+
this.cancel(operationId, id);
|
|
534
|
+
}
|
|
535
|
+
else if (decision.kind === "queue") {
|
|
536
|
+
// Wait for what is ahead. A run the harness already gave up on is bounded
|
|
537
|
+
// by the same timeout, so queueing cannot hang the report.
|
|
538
|
+
for (const id of targets) {
|
|
539
|
+
const pending = this.inFlight.get(id);
|
|
540
|
+
if (pending)
|
|
541
|
+
await withTimeout(pending, timeoutMs);
|
|
542
|
+
this.cancel(operationId, id);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
this.invocationSeq += 1;
|
|
546
|
+
const invocation = {
|
|
547
|
+
id: `headless-${this.invocationSeq}`,
|
|
548
|
+
operationId,
|
|
549
|
+
status: "running",
|
|
550
|
+
// Deterministic, so two harness runs produce identical reports.
|
|
551
|
+
startedAt: this.invocationSeq
|
|
552
|
+
};
|
|
553
|
+
const record = {
|
|
554
|
+
id: invocation.id,
|
|
555
|
+
operationId,
|
|
556
|
+
decision: decision.kind,
|
|
557
|
+
decisionTargets: targets,
|
|
558
|
+
runIndex: null,
|
|
559
|
+
timedOutMs: null,
|
|
560
|
+
activity: []
|
|
561
|
+
};
|
|
562
|
+
this.invocations.push(record);
|
|
563
|
+
this.state = applyEvent(this.state, {
|
|
564
|
+
type: "runStarted",
|
|
565
|
+
invocation,
|
|
566
|
+
outputKeys: [...operation.outputKeyByNodeId.values()],
|
|
567
|
+
variableKeys: Object.values(operation.binding.outputs)
|
|
568
|
+
.filter((mapping) => mapping.to === "variable")
|
|
569
|
+
.map((mapping) => mapping.variableId)
|
|
570
|
+
});
|
|
571
|
+
this.runCount += 1;
|
|
572
|
+
const pending = operation.runWorkflow(this.collectParams(operationId));
|
|
573
|
+
// A run the harness never sees the end of must not take the process with
|
|
574
|
+
// it: swallow its eventual settlement and keep it for a queued successor.
|
|
575
|
+
this.inFlight.set(invocation.id, pending.then(() => undefined, () => undefined));
|
|
576
|
+
const outcome = await withTimeout(pending, timeoutMs);
|
|
577
|
+
if (outcome === TIMED_OUT) {
|
|
578
|
+
// The invocation stays live: the job is still running on the server, the
|
|
579
|
+
// harness simply stopped waiting. A later run of the same operation
|
|
580
|
+
// collides with it, which is exactly what the policy is for.
|
|
581
|
+
record.timedOutMs = timeoutMs;
|
|
582
|
+
this.state = applyEvent(this.state, {
|
|
583
|
+
type: "invocationError",
|
|
584
|
+
invocationId: invocation.id,
|
|
585
|
+
error: `timed out after ${timeoutMs}ms`
|
|
586
|
+
});
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
this.inFlight.delete(invocation.id);
|
|
590
|
+
record.runIndex = outcome.runIndex;
|
|
591
|
+
// The headless runner awaits the whole stream, so every message belongs to
|
|
592
|
+
// the invocation just started — including the `job_update` and `edge_update`
|
|
593
|
+
// the kernel stamps with the *server's* job id, which the fold would
|
|
594
|
+
// otherwise fail to resolve and drop, losing a job-level failure.
|
|
595
|
+
const stamped = outcome.messages.map((message) => ({
|
|
596
|
+
...message,
|
|
597
|
+
job_id: invocation.id
|
|
598
|
+
}));
|
|
599
|
+
const outputVariables = new Map(outputVariableTargets(operation.binding).map((t) => [
|
|
600
|
+
t.nodeId,
|
|
601
|
+
t.variableId
|
|
602
|
+
]));
|
|
603
|
+
const events = messagesToEvents(stamped, {
|
|
604
|
+
resolveInvocation: (jobId) => jobId ? (this.state.invocations[jobId] ?? null) : null,
|
|
605
|
+
outputKey: (_operationId, nodeId) => operation.outputKeyByNodeId.get(nodeId) ?? null,
|
|
606
|
+
outputVariable: (_operationId, nodeId) => outputVariables.get(nodeId) ?? null
|
|
607
|
+
});
|
|
608
|
+
this.recordActivity(record, events);
|
|
609
|
+
this.state = applyEvents(this.state, events);
|
|
610
|
+
this.state = applyEvent(this.state, {
|
|
611
|
+
type: "invocationStatus",
|
|
612
|
+
invocationId: invocation.id,
|
|
613
|
+
status: this.state.invocations[invocation.id]?.status === "failed"
|
|
614
|
+
? "failed"
|
|
615
|
+
: "completed"
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
recordActivity(record, events) {
|
|
619
|
+
for (const event of events) {
|
|
620
|
+
if (event.type !== "invocationActivity")
|
|
621
|
+
continue;
|
|
622
|
+
if (record.activity.at(-1) === event.label)
|
|
623
|
+
continue;
|
|
624
|
+
record.activity.push(event.label);
|
|
625
|
+
this.activity.push({
|
|
626
|
+
invocationId: record.id,
|
|
627
|
+
operationId: record.operationId,
|
|
628
|
+
label: event.label
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/app-debug/runtime.ts"],"names":[],"mappings":"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"}
|