@relayflows/sdk 2.0.51 → 2.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/authored-budget.d.ts +1 -1
  2. package/dist/authored-budget.d.ts.map +1 -1
  3. package/dist/authored-budget.js +3 -3
  4. package/dist/authored-budget.js.map +1 -1
  5. package/dist/authored-flow-error.d.ts +3 -1
  6. package/dist/authored-flow-error.d.ts.map +1 -1
  7. package/dist/authored-flow-error.js.map +1 -1
  8. package/dist/authored-flow-executor.d.ts +2 -0
  9. package/dist/authored-flow-executor.d.ts.map +1 -1
  10. package/dist/authored-flow-executor.js +93 -12
  11. package/dist/authored-flow-executor.js.map +1 -1
  12. package/dist/authored-flow-lifecycle.d.ts +28 -3
  13. package/dist/authored-flow-lifecycle.d.ts.map +1 -1
  14. package/dist/authored-flow-lifecycle.js +206 -10
  15. package/dist/authored-flow-lifecycle.js.map +1 -1
  16. package/dist/authored-node-entry.js +16 -0
  17. package/dist/authored-node-entry.js.map +1 -1
  18. package/dist/authored-node-runner.d.ts.map +1 -1
  19. package/dist/authored-node-runner.js +26 -3
  20. package/dist/authored-node-runner.js.map +1 -1
  21. package/dist/authored-parallel-body.d.ts +10 -0
  22. package/dist/authored-parallel-body.d.ts.map +1 -0
  23. package/dist/authored-parallel-body.js +68 -0
  24. package/dist/authored-parallel-body.js.map +1 -0
  25. package/dist/authored-parallel-eligibility.d.ts +22 -0
  26. package/dist/authored-parallel-eligibility.d.ts.map +1 -0
  27. package/dist/authored-parallel-eligibility.js +335 -0
  28. package/dist/authored-parallel-eligibility.js.map +1 -0
  29. package/dist/authored-promise-graph.d.ts +16 -0
  30. package/dist/authored-promise-graph.d.ts.map +1 -1
  31. package/dist/authored-promise-graph.js +36 -0
  32. package/dist/authored-promise-graph.js.map +1 -1
  33. package/dist/authored-root-readback.d.ts +1 -2
  34. package/dist/authored-root-readback.d.ts.map +1 -1
  35. package/dist/authored-root-readback.js +1 -1
  36. package/dist/authored-root-readback.js.map +1 -1
  37. package/dist/authored-root.d.ts +6 -1
  38. package/dist/authored-root.d.ts.map +1 -1
  39. package/dist/authored-root.js +78 -8
  40. package/dist/authored-root.js.map +1 -1
  41. package/dist/authored-step-graph.d.ts +19 -4
  42. package/dist/authored-step-graph.d.ts.map +1 -1
  43. package/dist/authored-step-graph.js +49 -6
  44. package/dist/authored-step-graph.js.map +1 -1
  45. package/dist/authored-step-index.d.ts +2 -1
  46. package/dist/authored-step-index.d.ts.map +1 -1
  47. package/dist/authored-step-index.js +2 -1
  48. package/dist/authored-step-index.js.map +1 -1
  49. package/dist/authored-verdict.d.ts +4 -0
  50. package/dist/authored-verdict.d.ts.map +1 -1
  51. package/dist/authored-verdict.js +7 -1
  52. package/dist/authored-verdict.js.map +1 -1
  53. package/dist/authored-worker-step.d.ts +2 -1
  54. package/dist/authored-worker-step.d.ts.map +1 -1
  55. package/dist/authored-worker-step.js +12 -5
  56. package/dist/authored-worker-step.js.map +1 -1
  57. package/dist/cli/run.d.ts.map +1 -1
  58. package/dist/cli/run.js +4 -2
  59. package/dist/cli/run.js.map +1 -1
  60. package/dist/failure-kinds.d.ts +1 -1
  61. package/dist/failure-kinds.d.ts.map +1 -1
  62. package/dist/failure-kinds.js +2 -0
  63. package/dist/failure-kinds.js.map +1 -1
  64. package/dist/journal-client.d.ts +3 -1
  65. package/dist/journal-client.d.ts.map +1 -1
  66. package/dist/journal-client.js +18 -1
  67. package/dist/journal-client.js.map +1 -1
  68. package/package.json +3 -2
  69. package/src/authored-budget.ts +4 -3
  70. package/src/authored-flow-error.ts +2 -0
  71. package/src/authored-flow-executor.ts +85 -11
  72. package/src/authored-flow-lifecycle.ts +215 -9
  73. package/src/authored-node-entry.ts +17 -0
  74. package/src/authored-node-runner.ts +24 -3
  75. package/src/authored-parallel-body.ts +67 -0
  76. package/src/authored-parallel-eligibility.ts +296 -0
  77. package/src/authored-promise-graph.ts +35 -0
  78. package/src/authored-root-readback.ts +1 -2
  79. package/src/authored-root.ts +80 -9
  80. package/src/authored-step-graph.ts +50 -5
  81. package/src/authored-step-index.ts +2 -1
  82. package/src/authored-verdict.ts +7 -1
  83. package/src/authored-worker-step.ts +12 -3
  84. package/src/cli/run.ts +4 -2
  85. package/src/failure-kinds.ts +2 -0
  86. package/src/journal-client.ts +19 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Execute a certified body with its branch-call promises marked at the call
3
+ * site. A combinator member is not evidence that it is a safe branch: it may
4
+ * be a hand-built join that resolves from whichever child finishes first.
5
+ *
6
+ * The closed grammar has no module captures, so re-evaluating this function
7
+ * preserves its meaning. Unknown source is refused before the first effect.
8
+ */
9
+ export declare function instrumentParallelBody<T extends Function>(body: T, certifyBranch: (promise: Promise<unknown>) => void): T;
10
+ //# sourceMappingURL=authored-parallel-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-parallel-body.d.ts","sourceRoot":"","sources":["../src/authored-parallel-body.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,QAAQ,EACvD,IAAI,EAAE,CAAC,EACP,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,GACjD,CAAC,CAkDH"}
@@ -0,0 +1,68 @@
1
+ import ts from 'typescript';
2
+ import { AuthoredFlowExecutionError } from './authored-flow-error.js';
3
+ import { authoredFunctionSource } from './authored-flow-lifecycle.js';
4
+ import { parallelBodySyntaxEligible, unwrapParallelExpression } from './authored-parallel-eligibility.js';
5
+ /**
6
+ * Execute a certified body with its branch-call promises marked at the call
7
+ * site. A combinator member is not evidence that it is a safe branch: it may
8
+ * be a hand-built join that resolves from whichever child finishes first.
9
+ *
10
+ * The closed grammar has no module captures, so re-evaluating this function
11
+ * preserves its meaning. Unknown source is refused before the first effect.
12
+ */
13
+ export function instrumentParallelBody(body, certifyBranch) {
14
+ const source = authoredFunctionSource(body);
15
+ if (!parallelBodySyntaxEligible(body)) {
16
+ throw new AuthoredFlowExecutionError('step_failed', 'parallel f.run body lost its source certificate');
17
+ }
18
+ const prefix = 'const body = ';
19
+ const file = ts.createSourceFile('parallel-body.js', `${prefix}${source};`, ts.ScriptTarget.ES2022, true, ts.ScriptKind.JS);
20
+ const declaration = file.statements[0];
21
+ if (!declaration || !ts.isVariableStatement(declaration))
22
+ throw new Error('certified body parse failed');
23
+ const arrow = declaration.declarationList.declarations[0]?.initializer;
24
+ if (!arrow || !ts.isArrowFunction(arrow) || !ts.isBlock(arrow.body))
25
+ throw new Error('certified body changed');
26
+ const branches = new Set();
27
+ for (const statement of arrow.body.statements) {
28
+ if (!ts.isVariableStatement(statement))
29
+ continue;
30
+ for (const item of statement.declarationList.declarations) {
31
+ if (ts.isIdentifier(item.name) && item.initializer && ts.isArrowFunction(item.initializer)) {
32
+ branches.add(item.name.text);
33
+ }
34
+ }
35
+ }
36
+ const calls = [];
37
+ const visit = (node) => {
38
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)
39
+ && ts.isIdentifier(node.expression.expression) && node.expression.expression.text === 'Promise'
40
+ && node.expression.name.text === 'all' && node.arguments.length === 1) {
41
+ const members = node.arguments[0];
42
+ if (members && ts.isArrayLiteralExpression(members)) {
43
+ for (const outer of members.elements) {
44
+ if (!ts.isExpression(outer))
45
+ continue;
46
+ const member = unwrapParallelExpression(outer);
47
+ if (!ts.isCallExpression(member) || member.arguments.length !== 0)
48
+ continue;
49
+ const named = ts.isIdentifier(member.expression) && branches.has(member.expression.text);
50
+ const inline = ts.isParenthesizedExpression(member.expression)
51
+ && ts.isArrowFunction(member.expression.expression);
52
+ if (named || inline)
53
+ calls.push({ start: outer.getStart(file) - prefix.length,
54
+ end: outer.getEnd() - prefix.length });
55
+ }
56
+ }
57
+ }
58
+ ts.forEachChild(node, visit);
59
+ };
60
+ visit(arrow);
61
+ let instrumented = source;
62
+ for (const { start, end } of calls.sort((left, right) => right.start - left.start)) {
63
+ instrumented = `${instrumented.slice(0, start)}__certifyParallelBranch(${instrumented.slice(start, end)})${instrumented.slice(end)}`;
64
+ }
65
+ const factory = new Function('__certifyParallelBranch', `return (${instrumented});`);
66
+ return factory((promise) => { certifyBranch(promise); return promise; });
67
+ }
68
+ //# sourceMappingURL=authored-parallel-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-parallel-body.js","sourceRoot":"","sources":["../src/authored-parallel-body.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import ts from 'typescript';
2
+ /** Keep admission and call-site instrumentation in agreement on parentheses. */
3
+ export declare function unwrapParallelExpression(node: ts.Expression): ts.Expression;
4
+ /** A closed grammar for deterministic Promise.all branches. Unknown bodies stay serial. */
5
+ export declare function parallelRunEligible(body: Function, moduleSource: string): boolean;
6
+ /**
7
+ * Match the body Node actually loaded against the same type-stripped source its
8
+ * TypeScript loader serves. First certify the original bytes: transforming
9
+ * away a declaration must never make an unsafe module appear closed.
10
+ */
11
+ export declare function parallelLoadedBodyEligible(body: Function, moduleSource: string, sourceUrl: string, mode: 'strip' | 'transform'): Promise<boolean>;
12
+ /**
13
+ * The compiled Bun CLI owns the root lease, but the pinned source is executed
14
+ * by its embedded Node child. Bun reformats function toString output, so its
15
+ * in-memory body cannot be compared byte-for-byte with the source. Certify
16
+ * the closed source module instead; the Node child loads those hash-pinned
17
+ * bytes and checks exact body/source identity and grammar before any child starts.
18
+ */
19
+ export declare function parallelPinnedSourceEligible(moduleSource: string): boolean;
20
+ /** Independently re-check the closed body grammar at execution time. */
21
+ export declare function parallelBodySyntaxEligible(body: Function): boolean;
22
+ //# sourceMappingURL=authored-parallel-eligibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-parallel-eligibility.d.ts","sourceRoot":"","sources":["../src/authored-parallel-eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAK5B,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAE3E;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAMjF;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACvD,IAAI,EAAE,OAAO,GAAG,WAAW,GAC1B,OAAO,CAAC,OAAO,CAAC,CAwBlB;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED,wEAAwE;AACxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElE"}
@@ -0,0 +1,335 @@
1
+ import ts from 'typescript';
2
+ import { authoredFunctionSource } from './authored-flow-lifecycle.js';
3
+ const reservedCertifier = '__certifyParallelBranch';
4
+ /** Keep admission and call-site instrumentation in agreement on parentheses. */
5
+ export function unwrapParallelExpression(node) {
6
+ return ts.isParenthesizedExpression(node) ? unwrapParallelExpression(node.expression) : node;
7
+ }
8
+ /** A closed grammar for deterministic Promise.all branches. Unknown bodies stay serial. */
9
+ export function parallelRunEligible(body, moduleSource) {
10
+ // Promise.all is intercepted only when `Promise` resolves to the intrinsic.
11
+ // Function.toString cannot see a module-level lexical binding, so inspect
12
+ // the complete source before using the body's narrower grammar.
13
+ const bodySource = authoredFunctionSource(body);
14
+ return certifiedModuleBody(moduleSource, bodySource) !== undefined && parallelBodySyntaxEligible(body);
15
+ }
16
+ /**
17
+ * Match the body Node actually loaded against the same type-stripped source its
18
+ * TypeScript loader serves. First certify the original bytes: transforming
19
+ * away a declaration must never make an unsafe module appear closed.
20
+ */
21
+ export async function parallelLoadedBodyEligible(body, moduleSource, sourceUrl, mode) {
22
+ if (!parallelPinnedSourceEligible(moduleSource))
23
+ return false;
24
+ const { stripTypeScriptTypes } = await import('node:module');
25
+ if (typeof stripTypeScriptTypes !== 'function')
26
+ return false;
27
+ // The pinned loader suppresses this one Node warning on its own thread.
28
+ // Recomputing the text here happens on the main thread; suppress only this
29
+ // call's warning and restore the original writer before yielding again.
30
+ const emitWarning = process.emitWarning;
31
+ let transformed;
32
+ try {
33
+ process.emitWarning = ((warning, ...rest) => {
34
+ if (rest[0] === 'ExperimentalWarning' && String(warning).startsWith('stripTypeScriptTypes'))
35
+ return;
36
+ emitWarning.call(process, warning, ...rest);
37
+ });
38
+ transformed = stripTypeScriptTypes(moduleSource, { mode, sourceUrl });
39
+ }
40
+ catch {
41
+ // A loader mode unavailable in this Node version cannot certify a body.
42
+ return false;
43
+ }
44
+ finally {
45
+ process.emitWarning = emitWarning;
46
+ }
47
+ return parallelRunEligible(body, transformed);
48
+ }
49
+ /**
50
+ * The compiled Bun CLI owns the root lease, but the pinned source is executed
51
+ * by its embedded Node child. Bun reformats function toString output, so its
52
+ * in-memory body cannot be compared byte-for-byte with the source. Certify
53
+ * the closed source module instead; the Node child loads those hash-pinned
54
+ * bytes and checks exact body/source identity and grammar before any child starts.
55
+ */
56
+ export function parallelPinnedSourceEligible(moduleSource) {
57
+ const bodySource = certifiedModuleBody(moduleSource);
58
+ return bodySource !== undefined && parallelBodySourceSyntaxEligible(bodySource);
59
+ }
60
+ /** Independently re-check the closed body grammar at execution time. */
61
+ export function parallelBodySyntaxEligible(body) {
62
+ return parallelBodySourceSyntaxEligible(authoredFunctionSource(body));
63
+ }
64
+ function parallelBodySourceSyntaxEligible(bodySource) {
65
+ const file = ts.createSourceFile('authored-body.js', `const body = ${bodySource};`, ts.ScriptTarget.ES2022, true, ts.ScriptKind.JS);
66
+ if (file.statements.length !== 1)
67
+ return false;
68
+ const declaration = file.statements[0];
69
+ if (!declaration || !ts.isVariableStatement(declaration))
70
+ return false;
71
+ const expression = declaration.declarationList.declarations[0]?.initializer;
72
+ // Function expressions can obtain the context through `arguments[0]`.
73
+ if (expression === undefined || !ts.isArrowFunction(expression) || !ts.isBlock(expression.body)
74
+ || expression.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.AsyncKeyword) !== true)
75
+ return false;
76
+ const parameter = expression.parameters[0]?.name;
77
+ if (parameter === undefined || !ts.isIdentifier(parameter) || expression.parameters.length !== 1)
78
+ return false;
79
+ const context = parameter.text;
80
+ if (['Promise', 'globalThis', 'global'].includes(context))
81
+ return false;
82
+ // The instrumented body is re-evaluated with a private callback parameter.
83
+ // A lexical binding or reference with that spelling could capture it.
84
+ let namesCertifier = false;
85
+ const checkCertifierName = (node) => {
86
+ if (ts.isIdentifier(node) && node.text === reservedCertifier)
87
+ namesCertifier = true;
88
+ ts.forEachChild(node, checkCertifierName);
89
+ };
90
+ checkCertifierName(expression);
91
+ if (namesCertifier)
92
+ return false;
93
+ const branches = new Map();
94
+ const rootValues = new Set();
95
+ let groups = 0;
96
+ let runs = 0;
97
+ const unwrap = unwrapParallelExpression;
98
+ const method = (node, owner, name) => {
99
+ const value = unwrap(node);
100
+ return ts.isCallExpression(value) && ts.isPropertyAccessExpression(value.expression)
101
+ && ts.isIdentifier(value.expression.expression) && value.expression.expression.text === owner
102
+ && value.expression.name.text === name;
103
+ };
104
+ const pure = (node, values) => {
105
+ const value = unwrap(node);
106
+ if (ts.isStringLiteral(value) || ts.isNumericLiteral(value) || ts.isNoSubstitutionTemplateLiteral(value)
107
+ || value.kind === ts.SyntaxKind.TrueKeyword || value.kind === ts.SyntaxKind.FalseKeyword
108
+ || value.kind === ts.SyntaxKind.NullKeyword)
109
+ return true;
110
+ if (ts.isIdentifier(value))
111
+ return values.has(value.text);
112
+ if (ts.isTemplateExpression(value))
113
+ return value.templateSpans.every(span => pure(span.expression, values));
114
+ if (ts.isPrefixUnaryExpression(value))
115
+ return [ts.SyntaxKind.PlusToken, ts.SyntaxKind.MinusToken,
116
+ ts.SyntaxKind.ExclamationToken].includes(value.operator) && pure(value.operand, values);
117
+ if (ts.isBinaryExpression(value))
118
+ return [ts.SyntaxKind.PlusToken, ts.SyntaxKind.MinusToken,
119
+ ts.SyntaxKind.AsteriskToken, ts.SyntaxKind.SlashToken, ts.SyntaxKind.EqualsEqualsEqualsToken,
120
+ ts.SyntaxKind.ExclamationEqualsEqualsToken, ts.SyntaxKind.LessThanToken,
121
+ ts.SyntaxKind.GreaterThanToken].includes(value.operatorToken.kind)
122
+ && pure(value.left, values) && pure(value.right, values);
123
+ if (ts.isConditionalExpression(value))
124
+ return pure(value.condition, values)
125
+ && pure(value.whenTrue, values) && pure(value.whenFalse, values);
126
+ if (ts.isElementAccessExpression(value))
127
+ return value.argumentExpression !== undefined
128
+ && pure(value.expression, values) && pure(value.argumentExpression, values);
129
+ if (ts.isPropertyAccessExpression(value))
130
+ return pure(value.expression, values);
131
+ if (ts.isArrayLiteralExpression(value))
132
+ return value.elements.every(element => ts.isExpression(element) && pure(element, values));
133
+ if (ts.isObjectLiteralExpression(value))
134
+ return value.properties.every(property => ts.isPropertyAssignment(property) && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name))
135
+ && pure(property.initializer, values));
136
+ return false;
137
+ };
138
+ const run = (node, values) => {
139
+ const value = unwrap(node);
140
+ if (!method(value, context, 'run') || value.arguments.length < 1 || value.arguments.length > 2
141
+ || !value.arguments.every(argument => pure(argument, values)))
142
+ return false;
143
+ runs++;
144
+ return true;
145
+ };
146
+ const group = (node, values, depth) => {
147
+ const value = unwrap(node);
148
+ if (!method(value, 'Promise', 'all') || value.arguments.length !== 1 || depth > 4)
149
+ return false;
150
+ groups++;
151
+ const members = value.arguments[0];
152
+ if (ts.isArrayLiteralExpression(members)) {
153
+ if (members.elements.length < 2)
154
+ return false;
155
+ return members.elements.every(member => {
156
+ if (!ts.isExpression(member))
157
+ return false;
158
+ if (run(member, values))
159
+ return true;
160
+ const call = unwrap(member);
161
+ if (depth === 0 && ts.isCallExpression(call) && ts.isIdentifier(call.expression)
162
+ && call.arguments.length === 0 && branches.has(call.expression.text)) {
163
+ return branch(branches.get(call.expression.text), depth + 1);
164
+ }
165
+ if (depth === 0 && ts.isCallExpression(call) && call.arguments.length === 0
166
+ && ts.isParenthesizedExpression(call.expression) && ts.isArrowFunction(call.expression.expression)) {
167
+ return branch(call.expression.expression, depth + 1);
168
+ }
169
+ return false;
170
+ });
171
+ }
172
+ return false;
173
+ };
174
+ const awaitStep = (node, values, depth) => {
175
+ const value = unwrap(node);
176
+ if (!ts.isAwaitExpression(value))
177
+ return false;
178
+ return run(value.expression, values) || group(value.expression, values, depth);
179
+ };
180
+ const statements = (block, values, depth) => {
181
+ for (const statement of block.statements) {
182
+ if (ts.isExpressionStatement(statement)) {
183
+ if (awaitStep(statement.expression, values, depth))
184
+ continue;
185
+ const value = unwrap(statement.expression);
186
+ if (depth === 0 && method(value, context, 'done') && value.arguments.length >= 1
187
+ && value.arguments.every(argument => pure(argument, values))
188
+ && statement === block.statements[block.statements.length - 1])
189
+ continue;
190
+ return false;
191
+ }
192
+ if (ts.isReturnStatement(statement) && depth > 0 && statement.expression !== undefined
193
+ && awaitStep(statement.expression, values, depth))
194
+ continue;
195
+ if (!ts.isVariableStatement(statement) || (statement.declarationList.flags & ts.NodeFlags.Const) === 0)
196
+ return false;
197
+ for (const item of statement.declarationList.declarations) {
198
+ if (!ts.isIdentifier(item.name) || item.initializer === undefined)
199
+ return false;
200
+ if (['Promise', 'globalThis', 'global'].includes(item.name.text))
201
+ return false;
202
+ if (depth === 0 && ts.isArrowFunction(item.initializer)) {
203
+ if (branches.has(item.name.text) || item.initializer.parameters.length !== 0
204
+ || item.initializer.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.AsyncKeyword) !== true)
205
+ return false;
206
+ branches.set(item.name.text, item.initializer);
207
+ continue;
208
+ }
209
+ if (!awaitStep(item.initializer, values, depth))
210
+ return false;
211
+ values.add(item.name.text);
212
+ }
213
+ }
214
+ return true;
215
+ };
216
+ const branch = (arrow, depth) => {
217
+ if (arrow.parameters.length !== 0)
218
+ return false;
219
+ const before = runs;
220
+ const valid = ts.isBlock(arrow.body) ? statements(arrow.body, new Set(rootValues), depth)
221
+ : awaitStep(arrow.body, rootValues, depth);
222
+ // An empty async branch creates a join with no causal step predecessor.
223
+ return valid && runs > before;
224
+ };
225
+ if (!statements(expression.body, rootValues, 0))
226
+ return false;
227
+ return groups > 0 && runs > 0;
228
+ }
229
+ /** Reject any source that can change what a free `Promise` identifier means. */
230
+ function certifiedModuleBody(source, bodySource) {
231
+ const file = ts.createSourceFile('authored-module.ts', source, ts.ScriptTarget.ES2022, true, ts.ScriptKind.TS);
232
+ if ((file.parseDiagnostics?.length ?? 0) > 0) {
233
+ return undefined;
234
+ }
235
+ // Top-level code can alter the constructor or its methods without binding
236
+ // the name. Leave these modules on the established serial scheduler too.
237
+ const touchesPromiseOutsideDefinition = (node) => {
238
+ if (ts.isIdentifier(node) && ['Promise', 'globalThis', 'global'].includes(node.text))
239
+ return true;
240
+ return ts.forEachChild(node, touchesPromiseOutsideDefinition) === true;
241
+ };
242
+ let definesDefaultBody = false;
243
+ let importsSurfaceFlow = false;
244
+ let certifiedBody;
245
+ for (const statement of file.statements) {
246
+ if (ts.isImportDeclaration(statement)) {
247
+ // Imports can execute code before the body starts. Only the direct,
248
+ // immutable Surface binding can certify the exported body's identity.
249
+ if (statement.moduleSpecifier.getText(file) !== "'@relayflows/surface'"
250
+ && statement.moduleSpecifier.getText(file) !== '"@relayflows/surface"')
251
+ return undefined;
252
+ const bindings = statement.importClause?.namedBindings;
253
+ if (statement.importClause?.name !== undefined || bindings === undefined
254
+ || !ts.isNamedImports(bindings) || bindings.elements.length !== 1
255
+ || bindings.elements[0]?.name.text !== 'flow'
256
+ || bindings.elements[0]?.propertyName !== undefined || importsSurfaceFlow)
257
+ return undefined;
258
+ importsSurfaceFlow = true;
259
+ continue;
260
+ }
261
+ if (ts.isExportAssignment(statement)) {
262
+ // Only the final body argument is allowed to mention Promise.all. Do
263
+ // not let an expression around flow() mutate Promise while we skip it.
264
+ const call = statement.expression;
265
+ if (statement.isExportEquals || !ts.isCallExpression(call)
266
+ || !ts.isIdentifier(call.expression) || call.expression.text !== 'flow')
267
+ return undefined;
268
+ const args = call.arguments;
269
+ if (args.length !== 2 || !ts.isStringLiteral(args[0]))
270
+ return undefined;
271
+ if (!ts.isArrowFunction(args[args.length - 1]))
272
+ return undefined;
273
+ certifiedBody = args[args.length - 1].getText(file);
274
+ if (bodySource !== undefined && certifiedBody !== bodySource)
275
+ return undefined;
276
+ if (args.slice(0, -1).some(touchesPromiseOutsideDefinition))
277
+ return undefined;
278
+ if (definesDefaultBody)
279
+ return undefined;
280
+ definesDefaultBody = true;
281
+ continue;
282
+ }
283
+ // The certified body cannot use module captures. Other top-level code is
284
+ // unnecessary for it and may schedule a later mutation through an alias.
285
+ return undefined;
286
+ }
287
+ const forbidden = new Set(['Promise', 'globalThis']);
288
+ const bindsForbidden = (name) => ts.isIdentifier(name)
289
+ ? forbidden.has(name.text)
290
+ : name.elements.some(element => ts.isBindingElement(element) && bindsForbidden(element.name));
291
+ const isGlobalPromise = (node) => {
292
+ if (ts.isIdentifier(node))
293
+ return forbidden.has(node.text);
294
+ if (ts.isPropertyAccessExpression(node))
295
+ return ts.isIdentifier(node.expression)
296
+ && node.expression.text === 'globalThis' && node.name.text === 'Promise';
297
+ return ts.isElementAccessExpression(node) && ts.isIdentifier(node.expression)
298
+ && node.expression.text === 'globalThis' && ts.isStringLiteral(node.argumentExpression)
299
+ && node.argumentExpression.text === 'Promise';
300
+ };
301
+ let unsafe = false;
302
+ const visit = (node) => {
303
+ if (unsafe)
304
+ return;
305
+ if ((ts.isVariableDeclaration(node) || ts.isParameter(node) || ts.isBindingElement(node))
306
+ && bindsForbidden(node.name))
307
+ unsafe = true;
308
+ if ((ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node)
309
+ || ts.isClassDeclaration(node) || ts.isClassExpression(node)
310
+ || ts.isEnumDeclaration(node) || ts.isImportEqualsDeclaration(node)
311
+ || ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node))
312
+ && node.name !== undefined && forbidden.has(node.name.text))
313
+ unsafe = true;
314
+ if (ts.isImportClause(node) && node.name !== undefined && forbidden.has(node.name.text))
315
+ unsafe = true;
316
+ if (ts.isNamespaceImport(node) && forbidden.has(node.name.text))
317
+ unsafe = true;
318
+ if (ts.isImportSpecifier(node) && forbidden.has(node.name.text))
319
+ unsafe = true;
320
+ if (ts.isBinaryExpression(node)
321
+ && node.operatorToken.kind >= ts.SyntaxKind.FirstAssignment
322
+ && node.operatorToken.kind <= ts.SyntaxKind.LastAssignment
323
+ && isGlobalPromise(node.left))
324
+ unsafe = true;
325
+ if ((ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node))
326
+ && isGlobalPromise(node.operand))
327
+ unsafe = true;
328
+ ts.forEachChild(node, visit);
329
+ };
330
+ visit(file);
331
+ // The body may come from another module, where a free Promise name can be
332
+ // shadowed without appearing in this source. In that case use serial IDs.
333
+ return importsSurfaceFlow && definesDefaultBody && !unsafe ? certifiedBody : undefined;
334
+ }
335
+ //# sourceMappingURL=authored-parallel-eligibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-parallel-eligibility.js","sourceRoot":"","sources":["../src/authored-parallel-eligibility.ts"],"names":[],"mappings":"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"}
@@ -29,12 +29,15 @@ export declare class AuthoredPromiseGraph {
29
29
  private readonly triggers;
30
30
  private readonly creationContexts;
31
31
  private readonly resolutionCauses;
32
+ /** Promises attributed only when another promise's reaction resolved them. */
33
+ private readonly adoptedFromResolvingContext;
32
34
  private readonly promiseIds;
33
35
  private readonly handles;
34
36
  private readonly unattributedChildren;
35
37
  private readonly attributedRoots;
36
38
  private readonly roots;
37
39
  private readonly pending;
40
+ private readonly combinatorCaptures;
38
41
  private dependencyCache;
39
42
  /** Bumped by every graph change, so derived answers can be cached between changes. */
40
43
  private changes;
@@ -42,6 +45,12 @@ export declare class AuthoredPromiseGraph {
42
45
  enable(): void;
43
46
  disable(): void;
44
47
  idOf(value: object): number | undefined;
48
+ isPending(asyncId: number): boolean;
49
+ /** The intrinsic creates per-member reaction promises as well as its aggregate. */
50
+ captureCombinator<T>(call: () => T): {
51
+ readonly value: T;
52
+ readonly created: ReadonlySet<number>;
53
+ };
45
54
  /** Mark a promise whose descendants belong to an authored operation. */
46
55
  registerRoot(asyncId: number): void;
47
56
  /** The roots that still have derived promises in flight. One pass over `pending`. */
@@ -53,6 +62,13 @@ export declare class AuthoredPromiseGraph {
53
62
  }>;
54
63
  /** The three recorded edges out of one promise, for walks that stop early. */
55
64
  causesOf(asyncId: number): number[];
65
+ /**
66
+ * A promise created directly in one async context but settled in another
67
+ * can be a join. Its resolution edge names only the settling member, so a
68
+ * frontier may use it only when a combinator registered all members.
69
+ */
70
+ hasUnobservedJoinShape(asyncId: number): boolean;
71
+ wasAdoptedFromResolvingContext(asyncId: number): boolean;
56
72
  dependsOn(descendant: number, ancestor: number): boolean;
57
73
  /** A counter that changes whenever the graph does; equal values mean equal answers. */
58
74
  get version(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"authored-promise-graph.d.ts","sourceRoot":"","sources":["../src/authored-promise-graph.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,oBAAoB;IAgB7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAhBnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA+B;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,eAAe,CAAwG;IAC/H,sFAAsF;IACtF,OAAO,CAAC,OAAO,CAAK;gBAGD,OAAO,EAAE,MAAM,OAAO,EACtB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IA8C9D,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC,wEAAwE;IACxE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUnC,qFAAqF;IACrF,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC;IAS5B,mFAAmF;IACnF,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAUvF,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAYnC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxD,uFAAuF;IACvF,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAI1G,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,IAAI;IAMZ;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;CAcvB"}
1
+ {"version":3,"file":"authored-promise-graph.d.ts","sourceRoot":"","sources":["../src/authored-promise-graph.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,oBAAoB;IAmB7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAnBnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAqB;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA+B;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,eAAe,CAAwG;IAC/H,sFAAsF;IACtF,OAAO,CAAC,OAAO,CAAK;gBAGD,OAAO,EAAE,MAAM,OAAO,EACtB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAgD9D,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInC,mFAAmF;IACnF,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE;IAOjG,wEAAwE;IACxE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUnC,qFAAqF;IACrF,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC;IAS5B,mFAAmF;IACnF,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAUvF,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAYnC;;;;OAIG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOhD,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxD,uFAAuF;IACvF,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAI1G,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,IAAI;IAMZ;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;CAcvB"}
@@ -31,12 +31,15 @@ export class AuthoredPromiseGraph {
31
31
  triggers = new Map();
32
32
  creationContexts = new Map();
33
33
  resolutionCauses = new Map();
34
+ /** Promises attributed only when another promise's reaction resolved them. */
35
+ adoptedFromResolvingContext = new Set();
34
36
  promiseIds = new WeakMap();
35
37
  handles = new Map();
36
38
  unattributedChildren = new Map();
37
39
  attributedRoots = new Map();
38
40
  roots = new Set();
39
41
  pending = new Set();
42
+ combinatorCaptures = [];
40
43
  dependencyCache;
41
44
  /** Bumped by every graph change, so derived answers can be cached between changes. */
42
45
  changes = 0;
@@ -53,6 +56,8 @@ export class AuthoredPromiseGraph {
53
56
  this.triggers.set(asyncId, triggerAsyncId);
54
57
  this.creationContexts.set(asyncId, executionAsyncId());
55
58
  this.promiseIds.set(resource, asyncId);
59
+ for (const capture of this.combinatorCaptures)
60
+ capture.add(asyncId);
56
61
  this.handles.set(asyncId, resource);
57
62
  this.pending.add(asyncId);
58
63
  const root = this.roots.has(triggerAsyncId)
@@ -83,6 +88,7 @@ export class AuthoredPromiseGraph {
83
88
  // success. Measured; see ops/probes/pr134-repair-0903/combinators.mjs.
84
89
  const adopted = this.attributedRoots.get(cause);
85
90
  if (adopted !== undefined) {
91
+ this.adoptedFromResolvingContext.add(asyncId);
86
92
  this.attribute(asyncId, adopted);
87
93
  return;
88
94
  }
@@ -102,6 +108,20 @@ export class AuthoredPromiseGraph {
102
108
  idOf(value) {
103
109
  return this.promiseIds.get(value);
104
110
  }
111
+ isPending(asyncId) {
112
+ return this.pending.has(asyncId);
113
+ }
114
+ /** The intrinsic creates per-member reaction promises as well as its aggregate. */
115
+ captureCombinator(call) {
116
+ const created = new Set();
117
+ this.combinatorCaptures.push(created);
118
+ try {
119
+ return { value: call(), created };
120
+ }
121
+ finally {
122
+ this.combinatorCaptures.pop();
123
+ }
124
+ }
105
125
  /** Mark a promise whose descendants belong to an authored operation. */
106
126
  registerRoot(asyncId) {
107
127
  if (asyncId <= 0 || this.roots.has(asyncId))
@@ -150,6 +170,20 @@ export class AuthoredPromiseGraph {
150
170
  }
151
171
  return causes;
152
172
  }
173
+ /**
174
+ * A promise created directly in one async context but settled in another
175
+ * can be a join. Its resolution edge names only the settling member, so a
176
+ * frontier may use it only when a combinator registered all members.
177
+ */
178
+ hasUnobservedJoinShape(asyncId) {
179
+ const trigger = this.triggers.get(asyncId);
180
+ const resolution = this.resolutionCauses.get(asyncId);
181
+ return trigger !== undefined && trigger === this.creationContexts.get(asyncId)
182
+ && resolution !== undefined && resolution !== trigger;
183
+ }
184
+ wasAdoptedFromResolvingContext(asyncId) {
185
+ return this.adoptedFromResolvingContext.has(asyncId);
186
+ }
153
187
  dependsOn(descendant, ancestor) {
154
188
  return this.dependenciesOf(descendant).has(ancestor);
155
189
  }
@@ -169,11 +203,13 @@ export class AuthoredPromiseGraph {
169
203
  this.triggers.clear();
170
204
  this.creationContexts.clear();
171
205
  this.resolutionCauses.clear();
206
+ this.adoptedFromResolvingContext.clear();
172
207
  this.handles.clear();
173
208
  this.unattributedChildren.clear();
174
209
  this.attributedRoots.clear();
175
210
  this.roots.clear();
176
211
  this.pending.clear();
212
+ this.combinatorCaptures.length = 0;
177
213
  this.dependencyCache = undefined;
178
214
  }
179
215
  attribute(start, root) {