@relayflows/sdk 2.0.0
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/dist/authored-flow-error.d.ts +9 -0
- package/dist/authored-flow-error.d.ts.map +1 -0
- package/dist/authored-flow-error.js +13 -0
- package/dist/authored-flow-error.js.map +1 -0
- package/dist/authored-flow-executor.d.ts +28 -0
- package/dist/authored-flow-executor.d.ts.map +1 -0
- package/dist/authored-flow-executor.js +203 -0
- package/dist/authored-flow-executor.js.map +1 -0
- package/dist/authored-flow-lifecycle.d.ts +61 -0
- package/dist/authored-flow-lifecycle.d.ts.map +1 -0
- package/dist/authored-flow-lifecycle.js +284 -0
- package/dist/authored-flow-lifecycle.js.map +1 -0
- package/dist/authored-flow-loader.d.ts +7 -0
- package/dist/authored-flow-loader.d.ts.map +1 -0
- package/dist/authored-flow-loader.js +39 -0
- package/dist/authored-flow-loader.js.map +1 -0
- package/dist/authored-flow-operation.d.ts +43 -0
- package/dist/authored-flow-operation.d.ts.map +1 -0
- package/dist/authored-flow-operation.js +176 -0
- package/dist/authored-flow-operation.js.map +1 -0
- package/dist/authored-flow.d.ts +12 -0
- package/dist/authored-flow.d.ts.map +1 -0
- package/dist/authored-flow.js +13 -0
- package/dist/authored-flow.js.map +1 -0
- package/dist/authored-promise-graph.d.ts +67 -0
- package/dist/authored-promise-graph.d.ts.map +1 -0
- package/dist/authored-promise-graph.js +206 -0
- package/dist/authored-promise-graph.js.map +1 -0
- package/dist/backlog-picker.d.ts +55 -0
- package/dist/backlog-picker.d.ts.map +1 -0
- package/dist/backlog-picker.js +117 -0
- package/dist/backlog-picker.js.map +1 -0
- package/dist/canonical.d.ts +18 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +55 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli/check.d.ts +30 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +324 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/direct-run.d.ts +3 -0
- package/dist/cli/direct-run.d.ts.map +1 -0
- package/dist/cli/direct-run.js +69 -0
- package/dist/cli/direct-run.js.map +1 -0
- package/dist/cli/hn-monitor.d.ts +107 -0
- package/dist/cli/hn-monitor.d.ts.map +1 -0
- package/dist/cli/hn-monitor.js +220 -0
- package/dist/cli/hn-monitor.js.map +1 -0
- package/dist/cli/interruptible-sleep.d.ts +13 -0
- package/dist/cli/interruptible-sleep.d.ts.map +1 -0
- package/dist/cli/interruptible-sleep.js +31 -0
- package/dist/cli/interruptible-sleep.js.map +1 -0
- package/dist/cli/run.d.ts +54 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +316 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/tick-runner.d.ts +151 -0
- package/dist/cli/tick-runner.d.ts.map +1 -0
- package/dist/cli/tick-runner.js +258 -0
- package/dist/cli/tick-runner.js.map +1 -0
- package/dist/cli-adapter.d.ts +29 -0
- package/dist/cli-adapter.d.ts.map +1 -0
- package/dist/cli-adapter.js +92 -0
- package/dist/cli-adapter.js.map +1 -0
- package/dist/cli-executable.d.ts +3 -0
- package/dist/cli-executable.d.ts.map +1 -0
- package/dist/cli-executable.js +10 -0
- package/dist/cli-executable.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +348 -0
- package/dist/cli.js.map +1 -0
- package/dist/compile.d.ts +42 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +515 -0
- package/dist/compile.js.map +1 -0
- package/dist/demo-hn-monitor.d.ts +2 -0
- package/dist/demo-hn-monitor.d.ts.map +1 -0
- package/dist/demo-hn-monitor.js +118 -0
- package/dist/demo-hn-monitor.js.map +1 -0
- package/dist/dir-watcher-poller.d.ts +73 -0
- package/dist/dir-watcher-poller.d.ts.map +1 -0
- package/dist/dir-watcher-poller.js +80 -0
- package/dist/dir-watcher-poller.js.map +1 -0
- package/dist/direct-input.d.ts +10 -0
- package/dist/direct-input.d.ts.map +1 -0
- package/dist/direct-input.js +61 -0
- package/dist/direct-input.js.map +1 -0
- package/dist/failure-kinds.d.ts +25 -0
- package/dist/failure-kinds.d.ts.map +1 -0
- package/dist/failure-kinds.js +64 -0
- package/dist/failure-kinds.js.map +1 -0
- package/dist/gate-contract.d.ts +24 -0
- package/dist/gate-contract.d.ts.map +1 -0
- package/dist/gate-contract.js +50 -0
- package/dist/gate-contract.js.map +1 -0
- package/dist/hn-poller.d.ts +50 -0
- package/dist/hn-poller.d.ts.map +1 -0
- package/dist/hn-poller.js +79 -0
- package/dist/hn-poller.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/journal-client.d.ts +122 -0
- package/dist/journal-client.d.ts.map +1 -0
- package/dist/journal-client.js +277 -0
- package/dist/journal-client.js.map +1 -0
- package/dist/json-schema-bound.d.ts +7 -0
- package/dist/json-schema-bound.d.ts.map +1 -0
- package/dist/json-schema-bound.js +353 -0
- package/dist/json-schema-bound.js.map +1 -0
- package/dist/json-schema.d.ts +5 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +72 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/json-value.d.ts +6 -0
- package/dist/json-value.d.ts.map +1 -0
- package/dist/json-value.js +94 -0
- package/dist/json-value.js.map +1 -0
- package/dist/model-name.d.ts +7 -0
- package/dist/model-name.d.ts.map +1 -0
- package/dist/model-name.js +21 -0
- package/dist/model-name.js.map +1 -0
- package/dist/output-schema.d.ts +8 -0
- package/dist/output-schema.d.ts.map +1 -0
- package/dist/output-schema.js +28 -0
- package/dist/output-schema.js.map +1 -0
- package/dist/preflight.d.ts +80 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +361 -0
- package/dist/preflight.js.map +1 -0
- package/dist/protocol.d.ts +359 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +15 -0
- package/dist/protocol.js.map +1 -0
- package/dist/spec.d.ts +294 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +13 -0
- package/dist/spec.js.map +1 -0
- package/dist/step-dependencies.d.ts +2 -0
- package/dist/step-dependencies.d.ts.map +1 -0
- package/dist/step-dependencies.js +88 -0
- package/dist/step-dependencies.js.map +1 -0
- package/dist/step-fields.d.ts +17 -0
- package/dist/step-fields.d.ts.map +1 -0
- package/dist/step-fields.js +32 -0
- package/dist/step-fields.js.map +1 -0
- package/dist/tick-source.d.ts +205 -0
- package/dist/tick-source.d.ts.map +1 -0
- package/dist/tick-source.js +234 -0
- package/dist/tick-source.js.map +1 -0
- package/dist/unknown-keys.d.ts +7 -0
- package/dist/unknown-keys.d.ts.map +1 -0
- package/dist/unknown-keys.js +47 -0
- package/dist/unknown-keys.js.map +1 -0
- package/dist/validate.d.ts +7 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +458 -0
- package/dist/validate.js.map +1 -0
- package/dist/work-package-consumer.d.ts +33 -0
- package/dist/work-package-consumer.d.ts.map +1 -0
- package/dist/work-package-consumer.js +44 -0
- package/dist/work-package-consumer.js.map +1 -0
- package/dist/work-package-validator.d.ts +15 -0
- package/dist/work-package-validator.d.ts.map +1 -0
- package/dist/work-package-validator.js +72 -0
- package/dist/work-package-validator.js.map +1 -0
- package/dist/worker-cli.d.ts +16 -0
- package/dist/worker-cli.d.ts.map +1 -0
- package/dist/worker-cli.js +77 -0
- package/dist/worker-cli.js.map +1 -0
- package/dist/worker.d.ts +57 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +129 -0
- package/dist/worker.js.map +1 -0
- package/dist/wrapper-runtime.d.ts +10 -0
- package/dist/wrapper-runtime.d.ts.map +1 -0
- package/dist/wrapper-runtime.js +83 -0
- package/dist/wrapper-runtime.js.map +1 -0
- package/dist/wrapper-session.d.ts +16 -0
- package/dist/wrapper-session.d.ts.map +1 -0
- package/dist/wrapper-session.js +244 -0
- package/dist/wrapper-session.js.map +1 -0
- package/package.json +50 -0
- package/src/authored-flow-error.ts +31 -0
- package/src/authored-flow-executor.ts +365 -0
- package/src/authored-flow-lifecycle.ts +344 -0
- package/src/authored-flow-loader.ts +44 -0
- package/src/authored-flow-operation.ts +252 -0
- package/src/authored-flow.ts +21 -0
- package/src/authored-promise-graph.ts +196 -0
- package/src/backlog-picker.ts +153 -0
- package/src/canonical.ts +57 -0
- package/src/cli/check.ts +391 -0
- package/src/cli/direct-run.ts +86 -0
- package/src/cli/hn-monitor.ts +286 -0
- package/src/cli/interruptible-sleep.ts +27 -0
- package/src/cli/run.ts +439 -0
- package/src/cli/tick-runner.ts +378 -0
- package/src/cli-adapter.ts +115 -0
- package/src/cli-executable.ts +12 -0
- package/src/cli.ts +364 -0
- package/src/compile.ts +573 -0
- package/src/demo-hn-monitor.ts +132 -0
- package/src/dir-watcher-poller.ts +122 -0
- package/src/direct-input.ts +69 -0
- package/src/failure-kinds.ts +77 -0
- package/src/gate-contract.ts +72 -0
- package/src/hn-poller.ts +104 -0
- package/src/index.ts +195 -0
- package/src/journal-client.ts +379 -0
- package/src/json-schema-bound.ts +357 -0
- package/src/json-schema.ts +65 -0
- package/src/json-value.ts +110 -0
- package/src/model-name.ts +20 -0
- package/src/output-schema.ts +33 -0
- package/src/preflight.ts +482 -0
- package/src/protocol.ts +364 -0
- package/src/spec.ts +343 -0
- package/src/step-dependencies.ts +100 -0
- package/src/step-fields.ts +36 -0
- package/src/tick-source.ts +334 -0
- package/src/unknown-keys.ts +52 -0
- package/src/validate.ts +503 -0
- package/src/work-package-consumer.ts +73 -0
- package/src/work-package-validator.ts +90 -0
- package/src/worker-cli.ts +110 -0
- package/src/worker.ts +150 -0
- package/src/wrapper-runtime.ts +93 -0
- package/src/wrapper-session.ts +287 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CompletionReason as ProtocolCompletionReason, RunCompletionReason as ProtocolRunCompletionReason } from './protocol.js';
|
|
2
|
+
export type AuthoredFlowExecutionErrorCode = 'duplicate_completion' | 'journal_protocol_violation' | 'missing_completion' | 'operation_after_completion' | 'operation_callback_failed' | 'step_failed' | 'unsupported_completion' | 'unsupported_gate' | 'unsupported_header' | 'unsettled_derived_work' | 'unsupported_promise_lifecycle' | 'unawaited_step' | 'unsupported_verb';
|
|
3
|
+
export declare class AuthoredFlowExecutionError extends Error {
|
|
4
|
+
readonly code: AuthoredFlowExecutionErrorCode;
|
|
5
|
+
readonly completionReason?: (ProtocolCompletionReason | ProtocolRunCompletionReason) | undefined;
|
|
6
|
+
readonly runId?: string | undefined;
|
|
7
|
+
constructor(code: AuthoredFlowExecutionErrorCode, message: string, completionReason?: (ProtocolCompletionReason | ProtocolRunCompletionReason) | undefined, runId?: string | undefined);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=authored-flow-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-error.d.ts","sourceRoot":"","sources":["../src/authored-flow-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,IAAI,wBAAwB,EAC5C,mBAAmB,IAAI,2BAA2B,EACnD,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,8BAA8B,GACtC,sBAAsB,GACtB,4BAA4B,GAC5B,oBAAoB,GACpB,4BAA4B,GAC5B,2BAA2B,GAC3B,aAAa,GACb,wBAAwB,GACxB,kBAAkB,GAClB,oBAAoB,GACpB,wBAAwB,GACxB,+BAA+B,GAC/B,gBAAgB,GAChB,kBAAkB,CAAC;AAEvB,qBAAa,0BAA2B,SAAQ,KAAK;IAEjD,QAAQ,CAAC,IAAI,EAAE,8BAA8B;IAE7C,QAAQ,CAAC,gBAAgB,CAAC,GAAE,wBAAwB,GAAG,2BAA2B;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM;gBAHd,IAAI,EAAE,8BAA8B,EAC7C,OAAO,EAAE,MAAM,EACN,gBAAgB,CAAC,GAAE,wBAAwB,GAAG,2BAA2B,aAAA,EACzE,KAAK,CAAC,EAAE,MAAM,YAAA;CAK1B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class AuthoredFlowExecutionError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
completionReason;
|
|
4
|
+
runId;
|
|
5
|
+
constructor(code, message, completionReason, runId) {
|
|
6
|
+
super(`${code}: ${message}`);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.completionReason = completionReason;
|
|
9
|
+
this.runId = runId;
|
|
10
|
+
this.name = 'AuthoredFlowExecutionError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=authored-flow-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-error.js","sourceRoot":"","sources":["../src/authored-flow-error.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAExC;IAEA;IACA;IAJX,YACW,IAAoC,EAC7C,OAAe,EACN,gBAAyE,EACzE,KAAc;QAEvB,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QALpB,SAAI,GAAJ,IAAI,CAAgC;QAEpC,qBAAgB,GAAhB,gBAAgB,CAAyD;QACzE,UAAK,GAAL,KAAK,CAAS;QAGvB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { FlowHandle } from '@relayflows/surface/runtime';
|
|
2
|
+
import { AuthoredFlowExecutionError, type AuthoredFlowExecutionErrorCode } from './authored-flow-error.js';
|
|
3
|
+
import { JournalClient } from './journal-client.js';
|
|
4
|
+
import type { CompletionReason as ProtocolCompletionReason, RunCompletionReason as ProtocolRunCompletionReason } from './protocol.js';
|
|
5
|
+
export { AuthoredFlowExecutionError, type AuthoredFlowExecutionErrorCode };
|
|
6
|
+
export interface AuthoredFlowJournalStep {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly runId: string;
|
|
9
|
+
readonly completionReason: ProtocolCompletionReason;
|
|
10
|
+
}
|
|
11
|
+
export interface AuthoredFlowExecutionResult {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly completionReason: ProtocolRunCompletionReason;
|
|
14
|
+
readonly journalSteps: readonly AuthoredFlowJournalStep[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Exercise the internal authored-flow lowering seam through protocol v0.
|
|
18
|
+
*
|
|
19
|
+
* This is deliberately not exported by the SDK package: without a durable
|
|
20
|
+
* authored root, it is not a resumable public runner. The seam is narrow: an
|
|
21
|
+
* empty-header flow may await plain `f.run(...)` steps and must finish with
|
|
22
|
+
* `f.done("success")`. Every run and
|
|
23
|
+
* the terminal marker is a compiled deterministic spec submitted through
|
|
24
|
+
* `JournalClient`; values are read back from `step.completed` journal entries.
|
|
25
|
+
* Unsupported headers, verbs, gates, or completion lowering fail closed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function executeAuthoredFlow<Input = undefined>(handle: FlowHandle, journal: JournalClient, input?: Input): Promise<AuthoredFlowExecutionResult>;
|
|
28
|
+
//# sourceMappingURL=authored-flow-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-executor.d.ts","sourceRoot":"","sources":["../src/authored-flow-executor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EACL,0BAA0B,EAC1B,KAAK,8BAA8B,EACpC,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,IAAI,wBAAwB,EAC5C,mBAAmB,IAAI,2BAA2B,EAEnD,MAAM,eAAe,CAAC;AAqBvB,OAAO,EAAE,0BAA0B,EAAE,KAAK,8BAA8B,EAAE,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;CACrD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAC3D;AASD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,GAAG,SAAS,EACzD,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,2BAA2B,CAAC,CAwJtC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { COMPLETION_REASONS, RUN_COMPLETION_REASONS, } from '@relayflows/surface';
|
|
2
|
+
import { compileSpec, toKernelSpec } from './compile.js';
|
|
3
|
+
import { getAuthoredFlowDefinition } from './authored-flow.js';
|
|
4
|
+
import { AuthoredFlowExecutionError, } from './authored-flow-error.js';
|
|
5
|
+
import { AuthoredFlowOperation, stopAuthoredOperations, verifyAuthoredOperations, } from './authored-flow-operation.js';
|
|
6
|
+
import { AuthoredFlowLifecycle } from './authored-flow-lifecycle.js';
|
|
7
|
+
import { SPEC_SCHEMA_VERSION } from './spec.js';
|
|
8
|
+
export { AuthoredFlowExecutionError };
|
|
9
|
+
/**
|
|
10
|
+
* Exercise the internal authored-flow lowering seam through protocol v0.
|
|
11
|
+
*
|
|
12
|
+
* This is deliberately not exported by the SDK package: without a durable
|
|
13
|
+
* authored root, it is not a resumable public runner. The seam is narrow: an
|
|
14
|
+
* empty-header flow may await plain `f.run(...)` steps and must finish with
|
|
15
|
+
* `f.done("success")`. Every run and
|
|
16
|
+
* the terminal marker is a compiled deterministic spec submitted through
|
|
17
|
+
* `JournalClient`; values are read back from `step.completed` journal entries.
|
|
18
|
+
* Unsupported headers, verbs, gates, or completion lowering fail closed.
|
|
19
|
+
*/
|
|
20
|
+
export async function executeAuthoredFlow(handle, journal, input) {
|
|
21
|
+
const definition = getAuthoredFlowDefinition(handle);
|
|
22
|
+
const headerFields = Object.keys(definition.header);
|
|
23
|
+
if (headerFields.length > 0) {
|
|
24
|
+
throw new AuthoredFlowExecutionError('unsupported_header', `flow "${definition.name}" uses unsupported header fields: ${headerFields.join(', ')}`);
|
|
25
|
+
}
|
|
26
|
+
const journalSteps = [];
|
|
27
|
+
const authoredSteps = [];
|
|
28
|
+
const lifecycle = new AuthoredFlowLifecycle();
|
|
29
|
+
let nextStep = 1;
|
|
30
|
+
let requestedCompletion;
|
|
31
|
+
const lowerDeterministic = async (id, command) => {
|
|
32
|
+
const spec = toKernelSpec(compileSpec({
|
|
33
|
+
version: SPEC_SCHEMA_VERSION,
|
|
34
|
+
name: `${definition.name}/${id}`,
|
|
35
|
+
steps: [{ id, type: 'deterministic', command }],
|
|
36
|
+
}));
|
|
37
|
+
const outcome = await journal.runStart(spec);
|
|
38
|
+
return readSuccessfulOutput(journal, outcome, id, journalSteps);
|
|
39
|
+
};
|
|
40
|
+
const context = {
|
|
41
|
+
run(command) {
|
|
42
|
+
assertOperationAllowed('run', definition.name, requestedCompletion);
|
|
43
|
+
const id = `run-${nextStep++}`;
|
|
44
|
+
return trackStep(authoredSteps, new AuthoredFlowOperation(id, 'run', () => assertOperationAllowed('run', definition.name, requestedCompletion), () => lowerDeterministic(id, command), lifecycle));
|
|
45
|
+
},
|
|
46
|
+
llm() {
|
|
47
|
+
assertOperationAllowed('llm', definition.name, requestedCompletion);
|
|
48
|
+
const id = `llm-${nextStep++}`;
|
|
49
|
+
return trackStep(authoredSteps, unsupportedStep(id, 'llm', () => assertOperationAllowed('llm', definition.name, requestedCompletion), lifecycle));
|
|
50
|
+
},
|
|
51
|
+
agent() {
|
|
52
|
+
assertOperationAllowed('agent', definition.name, requestedCompletion);
|
|
53
|
+
const id = `agent-${nextStep++}`;
|
|
54
|
+
return trackStep(authoredSteps, unsupportedStep(id, 'agent', () => assertOperationAllowed('agent', definition.name, requestedCompletion), lifecycle));
|
|
55
|
+
},
|
|
56
|
+
human() {
|
|
57
|
+
assertOperationAllowed('human', definition.name, requestedCompletion);
|
|
58
|
+
throw unsupportedVerb('human');
|
|
59
|
+
},
|
|
60
|
+
dispatch() {
|
|
61
|
+
assertOperationAllowed('dispatch', definition.name, requestedCompletion);
|
|
62
|
+
throw unsupportedVerb('dispatch');
|
|
63
|
+
},
|
|
64
|
+
done(reason) {
|
|
65
|
+
if (!isSurfaceRunCompletionReason(reason)) {
|
|
66
|
+
throw new AuthoredFlowExecutionError('unsupported_completion', `unknown completion reason: ${String(reason)}`);
|
|
67
|
+
}
|
|
68
|
+
if (requestedCompletion !== undefined) {
|
|
69
|
+
throw new AuthoredFlowExecutionError('duplicate_completion', `flow "${definition.name}" called done() more than once`);
|
|
70
|
+
}
|
|
71
|
+
if (reason !== 'success') {
|
|
72
|
+
throw new AuthoredFlowExecutionError('unsupported_completion', `the initial authored executor cannot lower done("${reason}")`, reason);
|
|
73
|
+
}
|
|
74
|
+
lifecycle.markCompletion();
|
|
75
|
+
requestedCompletion = reason;
|
|
76
|
+
},
|
|
77
|
+
cloud: unsupportedCloud(() => assertOperationAllowed('cloud', definition.name, requestedCompletion)),
|
|
78
|
+
};
|
|
79
|
+
let bodyFailed = false;
|
|
80
|
+
let bodyFailure;
|
|
81
|
+
try {
|
|
82
|
+
const bodyPromise = lifecycle.runBody(() => definition.body(context, input));
|
|
83
|
+
await bodyPromise;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
bodyFailed = true;
|
|
87
|
+
bodyFailure = error;
|
|
88
|
+
}
|
|
89
|
+
if (bodyFailed) {
|
|
90
|
+
try {
|
|
91
|
+
await stopAuthoredOperations(authoredSteps, bodyFailure);
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
lifecycle.close();
|
|
95
|
+
}
|
|
96
|
+
throw bodyFailure;
|
|
97
|
+
}
|
|
98
|
+
// The completion requirement is checked BEFORE operation verification,
|
|
99
|
+
// because without a completion the verification cannot answer its own
|
|
100
|
+
// question. `AuthoredFlowLifecycle.isHandled` decides whether an operation
|
|
101
|
+
// was consumed by asking whether the COMPLETION depends on it; with no
|
|
102
|
+
// completion there is no async id to trace from, so it returns false for
|
|
103
|
+
// every operation. Verifying first therefore reported correctly-awaited
|
|
104
|
+
// steps as `unawaited_step`, naming the step the author had awaited and
|
|
105
|
+
// saying nothing about the `done()` they forgot (#183).
|
|
106
|
+
//
|
|
107
|
+
// A body that both forgets `done()` and leaves a step unawaited now reports
|
|
108
|
+
// the missing completion. That is the honest order: the unawaited-step
|
|
109
|
+
// verdict is not computable until there is a completion to compute it
|
|
110
|
+
// against, and once the author adds `done()` the verification runs normally
|
|
111
|
+
// and will catch it.
|
|
112
|
+
if (requestedCompletion === undefined) {
|
|
113
|
+
const missingCompletion = new AuthoredFlowExecutionError('missing_completion', `flow "${definition.name}" returned without done()`);
|
|
114
|
+
try {
|
|
115
|
+
await stopAuthoredOperations(authoredSteps, missingCompletion);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
lifecycle.close();
|
|
119
|
+
}
|
|
120
|
+
throw missingCompletion;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
await verifyAuthoredOperations(definition.name, authoredSteps, lifecycle);
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
lifecycle.close();
|
|
127
|
+
}
|
|
128
|
+
await lowerDeterministic(`complete-${nextStep}`, ':');
|
|
129
|
+
return Object.freeze({
|
|
130
|
+
name: definition.name,
|
|
131
|
+
completionReason: requestedCompletion,
|
|
132
|
+
journalSteps: Object.freeze([...journalSteps]),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function trackStep(tracked, operation) {
|
|
136
|
+
tracked.push(operation);
|
|
137
|
+
return operation.step;
|
|
138
|
+
}
|
|
139
|
+
function unsupportedStep(id, verb, assertCanStart, lifecycle) {
|
|
140
|
+
return new AuthoredFlowOperation(id, verb, assertCanStart, async () => {
|
|
141
|
+
throw unsupportedVerb(verb);
|
|
142
|
+
}, lifecycle);
|
|
143
|
+
}
|
|
144
|
+
function unsupportedVerb(verb) {
|
|
145
|
+
return new AuthoredFlowExecutionError('unsupported_verb', `the initial authored executor does not lower f.${verb}`);
|
|
146
|
+
}
|
|
147
|
+
function assertOperationAllowed(verb, flowName, completion) {
|
|
148
|
+
if (completion !== undefined) {
|
|
149
|
+
throw new AuthoredFlowExecutionError('operation_after_completion', `flow "${flowName}" called f.${verb} after done()`, completion);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function unsupportedCloud(assertOpen) {
|
|
153
|
+
return new Proxy({}, {
|
|
154
|
+
get() {
|
|
155
|
+
assertOpen();
|
|
156
|
+
throw unsupportedVerb('cloud');
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async function readSuccessfulOutput(journal, outcome, stepId, journalSteps) {
|
|
161
|
+
const entries = (await journal.journalRead(outcome.run_id, 1)).entries;
|
|
162
|
+
const completed = entries.find((entry) => isStepCompleted(entry, stepId));
|
|
163
|
+
if (!isStepCompleted(completed, stepId)) {
|
|
164
|
+
throw protocolViolation(outcome.run_id, `journal has no step.completed for "${stepId}"`);
|
|
165
|
+
}
|
|
166
|
+
const reason = completed.payload.completionReason;
|
|
167
|
+
journalSteps.push(Object.freeze({ id: stepId, runId: outcome.run_id, completionReason: reason }));
|
|
168
|
+
if (reason !== 'success') {
|
|
169
|
+
throw new AuthoredFlowExecutionError('step_failed', `journal step "${stepId}" completed with ${reason}`, reason, outcome.run_id);
|
|
170
|
+
}
|
|
171
|
+
if (outcome.status !== 'completed' || outcome.completion_reason !== 'success') {
|
|
172
|
+
throw protocolViolation(outcome.run_id, `successful step entry conflicts with run outcome ${outcome.status}/${String(outcome.completion_reason)}`);
|
|
173
|
+
}
|
|
174
|
+
const output = completed.payload.output;
|
|
175
|
+
if (!isRecord(output) || typeof output['stdout_tail'] !== 'string') {
|
|
176
|
+
throw protocolViolation(outcome.run_id, `step "${stepId}" has no string stdout_tail`);
|
|
177
|
+
}
|
|
178
|
+
return output['stdout_tail'];
|
|
179
|
+
}
|
|
180
|
+
function isStepCompleted(value, stepId) {
|
|
181
|
+
if (!isRecord(value) || value['entry_type'] !== 'step.completed' || value['step_id'] !== stepId) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
const payload = value['payload'];
|
|
185
|
+
return isRecord(payload)
|
|
186
|
+
&& isSurfaceCompletionReason(payload['completionReason'])
|
|
187
|
+
&& 'output' in payload;
|
|
188
|
+
}
|
|
189
|
+
function isSurfaceCompletionReason(value) {
|
|
190
|
+
return typeof value === 'string'
|
|
191
|
+
&& COMPLETION_REASONS.includes(value);
|
|
192
|
+
}
|
|
193
|
+
function isSurfaceRunCompletionReason(value) {
|
|
194
|
+
return typeof value === 'string'
|
|
195
|
+
&& RUN_COMPLETION_REASONS.includes(value);
|
|
196
|
+
}
|
|
197
|
+
function isRecord(value) {
|
|
198
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
199
|
+
}
|
|
200
|
+
function protocolViolation(runId, detail) {
|
|
201
|
+
return new AuthoredFlowExecutionError('journal_protocol_violation', detail, undefined, runId);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=authored-flow-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-executor.js","sourceRoot":"","sources":["../src/authored-flow-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
type OperationToken = object;
|
|
2
|
+
export interface AuthoredOperationInvocation {
|
|
3
|
+
readonly asyncId: number;
|
|
4
|
+
bound: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Runtime proof that a root operation participates in the continuation which
|
|
8
|
+
* reaches done(). Promise resolver identity is never inferred from callback
|
|
9
|
+
* source: a resolver counts only when invoking it settles the promise job that
|
|
10
|
+
* called the operation's then method.
|
|
11
|
+
*/
|
|
12
|
+
export declare class AuthoredFlowLifecycle {
|
|
13
|
+
private readonly graph;
|
|
14
|
+
private readonly activeResolverProbes;
|
|
15
|
+
private readonly invocations;
|
|
16
|
+
private readonly promiseAllAggregates;
|
|
17
|
+
private readonly promiseAllGroups;
|
|
18
|
+
private readonly callbackFailures;
|
|
19
|
+
private completionAsyncId;
|
|
20
|
+
private closed;
|
|
21
|
+
constructor();
|
|
22
|
+
runBody<T>(body: () => T): T;
|
|
23
|
+
registerStep(step: object, operation: OperationToken): void;
|
|
24
|
+
registerCombinator(values: readonly unknown[], aggregate: Promise<unknown>): void;
|
|
25
|
+
registerInvocation(operation: OperationToken, asyncId: number): AuthoredOperationInvocation;
|
|
26
|
+
markCompletion(): void;
|
|
27
|
+
invokeResolver<T>(invocation: AuthoredOperationInvocation, callback: () => T): T;
|
|
28
|
+
hasBoundConsumer(operation: OperationToken): boolean;
|
|
29
|
+
isHandled(operation: OperationToken): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Operations that still had derived work running when the body returned.
|
|
32
|
+
*
|
|
33
|
+
* This is the question the gate used to get wrong. It previously asked which
|
|
34
|
+
* derived failures had *already landed*, and skipped every promise that had
|
|
35
|
+
* not settled — so the same program passed or failed on how many microtask
|
|
36
|
+
* ticks the failure took. Ten `await null`s, or any real derived I/O, cleared
|
|
37
|
+
* the window.
|
|
38
|
+
*
|
|
39
|
+
* Whether derived work is still in flight when the body returns is not a
|
|
40
|
+
* timing fact, it is a causal one: work the author awaited is settled at that
|
|
41
|
+
* instant in every timing, and work the author did not await is pending in
|
|
42
|
+
* every timing. Refusing on pending work therefore closes the race rather
|
|
43
|
+
* than widening it — and it makes the *settled* set complete, so reading the
|
|
44
|
+
* outcomes of the settled promises stops being a sample and becomes a total
|
|
45
|
+
* answer over a closed set.
|
|
46
|
+
*
|
|
47
|
+
* Must be called before the gate awaits anything.
|
|
48
|
+
*/
|
|
49
|
+
derivedWorkInFlight<T extends OperationToken>(operations: readonly T[]): T[];
|
|
50
|
+
observeCallbackFailures(operations: readonly OperationToken[]): Promise<void>;
|
|
51
|
+
callbackFailure(operation: OperationToken): {
|
|
52
|
+
readonly recorded: boolean;
|
|
53
|
+
readonly value: unknown;
|
|
54
|
+
};
|
|
55
|
+
close(): void;
|
|
56
|
+
private rootsFor;
|
|
57
|
+
private recordCallbackFailure;
|
|
58
|
+
private aggregatesFor;
|
|
59
|
+
}
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=authored-flow-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-lifecycle.d.ts","sourceRoot":"","sources":["../src/authored-flow-lifecycle.ts"],"names":[],"mappings":"AAIA,KAAK,cAAc,GAAG,MAAM,CAAC;AAM7B,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AA2FD;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4D;IACxF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0C;IAC/E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,MAAM,CAAS;;IAkBvB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;IAI5B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI;IAI3D,kBAAkB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAqBjF,kBAAkB,CAChB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,GACd,2BAA2B;IAS9B,cAAc,IAAI,IAAI;IAUtB,cAAc,CAAC,CAAC,EACd,UAAU,EAAE,2BAA2B,EACvC,QAAQ,EAAE,MAAM,CAAC,GAChB,CAAC;IAaJ,gBAAgB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO;IAIpD,SAAS,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO;IAY7C;;;;;;;;;;;;;;;;;;OAkBG;IACH,mBAAmB,CAAC,CAAC,SAAS,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE;IAKtE,uBAAuB,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnF,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG;QAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;KACzB;IAOD,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,aAAa;CActB"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { AsyncLocalStorage, executionAsyncId } from 'node:async_hooks';
|
|
2
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
3
|
+
import { AuthoredPromiseGraph } from './authored-promise-graph.js';
|
|
4
|
+
const nativePromiseThen = Promise.prototype.then;
|
|
5
|
+
const activeLifecycle = new AsyncLocalStorage();
|
|
6
|
+
const stepOwners = new WeakMap();
|
|
7
|
+
/**
|
|
8
|
+
* The four intrinsic combinators, intercepted so that an aggregate's membership
|
|
9
|
+
* is recorded exactly.
|
|
10
|
+
*
|
|
11
|
+
* **Why interception, and why all four.** An aggregate is derived from *every*
|
|
12
|
+
* member, but the runtime supplies an edge to only *one* of them: the aggregate
|
|
13
|
+
* is resolved inside the reaction of whichever member settled last (`all`,
|
|
14
|
+
* `allSettled`) or first (`race`, `any`). Inferring membership from that edge is
|
|
15
|
+
* a sufficient rule, never a necessary one, and it fails in both directions —
|
|
16
|
+
* `Promise.allSettled([step, slowerUnrelated])` hid a rejected derived chain
|
|
17
|
+
* behind an aggregate an unrelated promise resolved, and
|
|
18
|
+
* `await Promise.allSettled([a, b])` refused every member except the last to
|
|
19
|
+
* settle. Membership cannot be recovered from the promise graph, so it is
|
|
20
|
+
* recorded here, where the combinator is called and the member list is in hand.
|
|
21
|
+
*
|
|
22
|
+
* A previous revision registered `Promise.all` only, and claimed a
|
|
23
|
+
* resolution-context rule covered "every combinator, present and future". That
|
|
24
|
+
* claim was wrong: it covered whichever member happened to resolve the
|
|
25
|
+
* aggregate. What is true is narrower and is what the code now implements —
|
|
26
|
+
* these four are exact, and `adoptFromResolvingContext` in the promise graph is
|
|
27
|
+
* a best-effort fallback for aggregates built by hand.
|
|
28
|
+
*
|
|
29
|
+
* The interception is disclosed to authors in `docs/SURFACE.md`. It is spec
|
|
30
|
+
* transparent: `Symbol.iterator` is read exactly once (as the intrinsic does),
|
|
31
|
+
* a non-iterable is handed to the intrinsic so it produces the specified
|
|
32
|
+
* rejected promise, `this` is honoured for subclasses, and `name`/`length`
|
|
33
|
+
* match.
|
|
34
|
+
*/
|
|
35
|
+
const COMBINATORS = ['all', 'allSettled', 'any', 'race'];
|
|
36
|
+
const nativeCombinators = Object.freeze(Object.fromEntries(COMBINATORS.map((name) => [name, Promise[name]])));
|
|
37
|
+
const observedCombinators = Object.fromEntries(COMBINATORS.map((name) => {
|
|
38
|
+
const native = nativeCombinators[name];
|
|
39
|
+
const observed = function (values) {
|
|
40
|
+
const members = collectMembers(values);
|
|
41
|
+
if (members === undefined)
|
|
42
|
+
return native.call(this, values);
|
|
43
|
+
const aggregate = native.call(this, members);
|
|
44
|
+
activeLifecycle.getStore()?.registerCombinator(members, aggregate);
|
|
45
|
+
return aggregate;
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(observed, 'name', { value: name, configurable: true });
|
|
48
|
+
Object.defineProperty(observed, 'length', { value: 1, configurable: true });
|
|
49
|
+
return [name, observed];
|
|
50
|
+
}));
|
|
51
|
+
let combinatorObservers = 0;
|
|
52
|
+
/**
|
|
53
|
+
* Drain an iterable into an array, reading `Symbol.iterator` exactly once.
|
|
54
|
+
*
|
|
55
|
+
* Returns `undefined` when the argument is not iterable or iteration threw, so
|
|
56
|
+
* the caller hands the original value to the intrinsic and the author sees the
|
|
57
|
+
* intrinsic's own behaviour. A previous revision used `isIterable()` followed by
|
|
58
|
+
* `Array.from()`, which invoked a `Symbol.iterator` getter twice where the
|
|
59
|
+
* intrinsic invokes it once.
|
|
60
|
+
*/
|
|
61
|
+
function collectMembers(values) {
|
|
62
|
+
if (values === null || values === undefined)
|
|
63
|
+
return undefined;
|
|
64
|
+
let iteratorMethod;
|
|
65
|
+
try {
|
|
66
|
+
iteratorMethod = values[Symbol.iterator];
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
if (typeof iteratorMethod !== 'function')
|
|
72
|
+
return undefined;
|
|
73
|
+
try {
|
|
74
|
+
return [...values];
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Runtime proof that a root operation participates in the continuation which
|
|
82
|
+
* reaches done(). Promise resolver identity is never inferred from callback
|
|
83
|
+
* source: a resolver counts only when invoking it settles the promise job that
|
|
84
|
+
* called the operation's then method.
|
|
85
|
+
*/
|
|
86
|
+
export class AuthoredFlowLifecycle {
|
|
87
|
+
graph;
|
|
88
|
+
activeResolverProbes = [];
|
|
89
|
+
invocations = new Map();
|
|
90
|
+
promiseAllAggregates = new Map();
|
|
91
|
+
promiseAllGroups = [];
|
|
92
|
+
callbackFailures = new Map();
|
|
93
|
+
completionAsyncId;
|
|
94
|
+
closed = false;
|
|
95
|
+
constructor() {
|
|
96
|
+
this.graph = new AuthoredPromiseGraph(() => activeLifecycle.getStore() === this, (asyncId) => {
|
|
97
|
+
for (const probe of this.activeResolverProbes)
|
|
98
|
+
probe.add(asyncId);
|
|
99
|
+
});
|
|
100
|
+
installPromiseAllObserver();
|
|
101
|
+
try {
|
|
102
|
+
this.graph.enable();
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
uninstallPromiseAllObserver();
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
runBody(body) {
|
|
110
|
+
return activeLifecycle.run(this, body);
|
|
111
|
+
}
|
|
112
|
+
registerStep(step, operation) {
|
|
113
|
+
stepOwners.set(step, { lifecycle: this, operation });
|
|
114
|
+
}
|
|
115
|
+
registerCombinator(values, aggregate) {
|
|
116
|
+
const aggregateId = this.graph.idOf(aggregate);
|
|
117
|
+
if (aggregateId === undefined)
|
|
118
|
+
return;
|
|
119
|
+
this.graph.registerRoot(aggregateId);
|
|
120
|
+
const memberIds = new Set();
|
|
121
|
+
for (const value of values) {
|
|
122
|
+
if ((typeof value !== 'object' && typeof value !== 'function') || value === null)
|
|
123
|
+
continue;
|
|
124
|
+
const memberId = this.graph.idOf(value);
|
|
125
|
+
if (memberId !== undefined)
|
|
126
|
+
memberIds.add(memberId);
|
|
127
|
+
const owner = stepOwners.get(value);
|
|
128
|
+
if (owner?.lifecycle !== this)
|
|
129
|
+
continue;
|
|
130
|
+
let operationAggregates = this.promiseAllAggregates.get(owner.operation);
|
|
131
|
+
if (operationAggregates === undefined) {
|
|
132
|
+
operationAggregates = new Set();
|
|
133
|
+
this.promiseAllAggregates.set(owner.operation, operationAggregates);
|
|
134
|
+
}
|
|
135
|
+
operationAggregates.add(aggregateId);
|
|
136
|
+
}
|
|
137
|
+
this.promiseAllGroups.push({ aggregate: aggregateId, members: memberIds });
|
|
138
|
+
}
|
|
139
|
+
registerInvocation(operation, asyncId) {
|
|
140
|
+
const invocation = { asyncId, bound: false };
|
|
141
|
+
const operationInvocations = this.invocations.get(operation);
|
|
142
|
+
if (operationInvocations === undefined)
|
|
143
|
+
this.invocations.set(operation, [invocation]);
|
|
144
|
+
else
|
|
145
|
+
operationInvocations.push(invocation);
|
|
146
|
+
this.graph.registerRoot(asyncId);
|
|
147
|
+
return invocation;
|
|
148
|
+
}
|
|
149
|
+
markCompletion() {
|
|
150
|
+
if (activeLifecycle.getStore() !== this) {
|
|
151
|
+
throw new AuthoredFlowExecutionError('unsupported_promise_lifecycle', 'done() escaped its authored flow lifecycle scope');
|
|
152
|
+
}
|
|
153
|
+
this.completionAsyncId = executionAsyncId();
|
|
154
|
+
}
|
|
155
|
+
invokeResolver(invocation, callback) {
|
|
156
|
+
const probe = new Set();
|
|
157
|
+
this.activeResolverProbes.push(probe);
|
|
158
|
+
try {
|
|
159
|
+
return callback();
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
this.activeResolverProbes.pop();
|
|
163
|
+
if (invocation.asyncId > 0 && probe.has(invocation.asyncId)) {
|
|
164
|
+
invocation.bound = true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
hasBoundConsumer(operation) {
|
|
169
|
+
return this.invocations.get(operation)?.some((invocation) => invocation.bound) ?? false;
|
|
170
|
+
}
|
|
171
|
+
isHandled(operation) {
|
|
172
|
+
const completion = this.completionAsyncId;
|
|
173
|
+
const operationInvocations = this.invocations.get(operation);
|
|
174
|
+
if (completion === undefined || operationInvocations === undefined)
|
|
175
|
+
return false;
|
|
176
|
+
const aggregates = this.aggregatesFor(operation);
|
|
177
|
+
return operationInvocations.length > 0 && operationInvocations.every((invocation) => invocation.bound && (this.graph.dependsOn(completion, invocation.asyncId)
|
|
178
|
+
|| [...aggregates].some((aggregate) => this.graph.dependsOn(completion, aggregate))));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Operations that still had derived work running when the body returned.
|
|
182
|
+
*
|
|
183
|
+
* This is the question the gate used to get wrong. It previously asked which
|
|
184
|
+
* derived failures had *already landed*, and skipped every promise that had
|
|
185
|
+
* not settled — so the same program passed or failed on how many microtask
|
|
186
|
+
* ticks the failure took. Ten `await null`s, or any real derived I/O, cleared
|
|
187
|
+
* the window.
|
|
188
|
+
*
|
|
189
|
+
* Whether derived work is still in flight when the body returns is not a
|
|
190
|
+
* timing fact, it is a causal one: work the author awaited is settled at that
|
|
191
|
+
* instant in every timing, and work the author did not await is pending in
|
|
192
|
+
* every timing. Refusing on pending work therefore closes the race rather
|
|
193
|
+
* than widening it — and it makes the *settled* set complete, so reading the
|
|
194
|
+
* outcomes of the settled promises stops being a sample and becomes a total
|
|
195
|
+
* answer over a closed set.
|
|
196
|
+
*
|
|
197
|
+
* Must be called before the gate awaits anything.
|
|
198
|
+
*/
|
|
199
|
+
derivedWorkInFlight(operations) {
|
|
200
|
+
return operations.filter((operation) => this.graph.inFlightFrom(this.rootsFor(operation)).length > 0);
|
|
201
|
+
}
|
|
202
|
+
async observeCallbackFailures(operations) {
|
|
203
|
+
const observations = [];
|
|
204
|
+
for (const operation of operations) {
|
|
205
|
+
for (const promise of this.graph.settledFrom(this.rootsFor(operation))) {
|
|
206
|
+
observations.push(nativePromiseThen.call(promise, () => undefined, (error) => { this.recordCallbackFailure(operation, error); }));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
await Promise.all(observations);
|
|
210
|
+
}
|
|
211
|
+
callbackFailure(operation) {
|
|
212
|
+
return {
|
|
213
|
+
recorded: this.callbackFailures.has(operation),
|
|
214
|
+
value: this.callbackFailures.get(operation),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
close() {
|
|
218
|
+
if (this.closed)
|
|
219
|
+
return;
|
|
220
|
+
this.closed = true;
|
|
221
|
+
this.graph.disable();
|
|
222
|
+
this.graph.clear();
|
|
223
|
+
this.invocations.clear();
|
|
224
|
+
this.promiseAllAggregates.clear();
|
|
225
|
+
this.promiseAllGroups.length = 0;
|
|
226
|
+
this.callbackFailures.clear();
|
|
227
|
+
this.activeResolverProbes.length = 0;
|
|
228
|
+
uninstallPromiseAllObserver();
|
|
229
|
+
}
|
|
230
|
+
rootsFor(operation) {
|
|
231
|
+
const roots = new Set((this.invocations.get(operation) ?? [])
|
|
232
|
+
.filter((invocation) => invocation.bound)
|
|
233
|
+
.map((invocation) => invocation.asyncId));
|
|
234
|
+
for (const aggregate of this.aggregatesFor(operation))
|
|
235
|
+
roots.add(aggregate);
|
|
236
|
+
return roots;
|
|
237
|
+
}
|
|
238
|
+
recordCallbackFailure(operation, error) {
|
|
239
|
+
if (!this.callbackFailures.has(operation))
|
|
240
|
+
this.callbackFailures.set(operation, error);
|
|
241
|
+
}
|
|
242
|
+
aggregatesFor(operation) {
|
|
243
|
+
const aggregates = new Set(this.promiseAllAggregates.get(operation) ?? []);
|
|
244
|
+
for (const invocation of this.invocations.get(operation) ?? []) {
|
|
245
|
+
for (const group of this.promiseAllGroups) {
|
|
246
|
+
if (group.members.size > 0
|
|
247
|
+
&& [...group.members].some((member) => this.graph.dependsOn(member, invocation.asyncId))) {
|
|
248
|
+
aggregates.add(group.aggregate);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return aggregates;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function installPromiseAllObserver() {
|
|
256
|
+
if (combinatorObservers === 0) {
|
|
257
|
+
for (const name of COMBINATORS) {
|
|
258
|
+
if (Promise[name] !== nativeCombinators[name]) {
|
|
259
|
+
throw new AuthoredFlowExecutionError('unsupported_promise_lifecycle', `authored flow execution requires the intrinsic Promise.${name}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
for (const name of COMBINATORS) {
|
|
263
|
+
Promise[name] = observedCombinators[name];
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
for (const name of COMBINATORS) {
|
|
268
|
+
if (Promise[name] !== observedCombinators[name]) {
|
|
269
|
+
throw new AuthoredFlowExecutionError('unsupported_promise_lifecycle', `the authored flow Promise.${name} lifecycle contract was replaced`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
combinatorObservers += 1;
|
|
274
|
+
}
|
|
275
|
+
function uninstallPromiseAllObserver() {
|
|
276
|
+
combinatorObservers -= 1;
|
|
277
|
+
if (combinatorObservers > 0)
|
|
278
|
+
return;
|
|
279
|
+
combinatorObservers = 0;
|
|
280
|
+
for (const name of COMBINATORS) {
|
|
281
|
+
Promise[name] = nativeCombinators[name];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=authored-flow-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-lifecycle.js","sourceRoot":"","sources":["../src/authored-flow-lifecycle.ts"],"names":[],"mappings":"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"}
|