@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.
Files changed (231) hide show
  1. package/dist/authored-flow-error.d.ts +9 -0
  2. package/dist/authored-flow-error.d.ts.map +1 -0
  3. package/dist/authored-flow-error.js +13 -0
  4. package/dist/authored-flow-error.js.map +1 -0
  5. package/dist/authored-flow-executor.d.ts +28 -0
  6. package/dist/authored-flow-executor.d.ts.map +1 -0
  7. package/dist/authored-flow-executor.js +203 -0
  8. package/dist/authored-flow-executor.js.map +1 -0
  9. package/dist/authored-flow-lifecycle.d.ts +61 -0
  10. package/dist/authored-flow-lifecycle.d.ts.map +1 -0
  11. package/dist/authored-flow-lifecycle.js +284 -0
  12. package/dist/authored-flow-lifecycle.js.map +1 -0
  13. package/dist/authored-flow-loader.d.ts +7 -0
  14. package/dist/authored-flow-loader.d.ts.map +1 -0
  15. package/dist/authored-flow-loader.js +39 -0
  16. package/dist/authored-flow-loader.js.map +1 -0
  17. package/dist/authored-flow-operation.d.ts +43 -0
  18. package/dist/authored-flow-operation.d.ts.map +1 -0
  19. package/dist/authored-flow-operation.js +176 -0
  20. package/dist/authored-flow-operation.js.map +1 -0
  21. package/dist/authored-flow.d.ts +12 -0
  22. package/dist/authored-flow.d.ts.map +1 -0
  23. package/dist/authored-flow.js +13 -0
  24. package/dist/authored-flow.js.map +1 -0
  25. package/dist/authored-promise-graph.d.ts +67 -0
  26. package/dist/authored-promise-graph.d.ts.map +1 -0
  27. package/dist/authored-promise-graph.js +206 -0
  28. package/dist/authored-promise-graph.js.map +1 -0
  29. package/dist/backlog-picker.d.ts +55 -0
  30. package/dist/backlog-picker.d.ts.map +1 -0
  31. package/dist/backlog-picker.js +117 -0
  32. package/dist/backlog-picker.js.map +1 -0
  33. package/dist/canonical.d.ts +18 -0
  34. package/dist/canonical.d.ts.map +1 -0
  35. package/dist/canonical.js +55 -0
  36. package/dist/canonical.js.map +1 -0
  37. package/dist/cli/check.d.ts +30 -0
  38. package/dist/cli/check.d.ts.map +1 -0
  39. package/dist/cli/check.js +324 -0
  40. package/dist/cli/check.js.map +1 -0
  41. package/dist/cli/direct-run.d.ts +3 -0
  42. package/dist/cli/direct-run.d.ts.map +1 -0
  43. package/dist/cli/direct-run.js +69 -0
  44. package/dist/cli/direct-run.js.map +1 -0
  45. package/dist/cli/hn-monitor.d.ts +107 -0
  46. package/dist/cli/hn-monitor.d.ts.map +1 -0
  47. package/dist/cli/hn-monitor.js +220 -0
  48. package/dist/cli/hn-monitor.js.map +1 -0
  49. package/dist/cli/interruptible-sleep.d.ts +13 -0
  50. package/dist/cli/interruptible-sleep.d.ts.map +1 -0
  51. package/dist/cli/interruptible-sleep.js +31 -0
  52. package/dist/cli/interruptible-sleep.js.map +1 -0
  53. package/dist/cli/run.d.ts +54 -0
  54. package/dist/cli/run.d.ts.map +1 -0
  55. package/dist/cli/run.js +316 -0
  56. package/dist/cli/run.js.map +1 -0
  57. package/dist/cli/tick-runner.d.ts +151 -0
  58. package/dist/cli/tick-runner.d.ts.map +1 -0
  59. package/dist/cli/tick-runner.js +258 -0
  60. package/dist/cli/tick-runner.js.map +1 -0
  61. package/dist/cli-adapter.d.ts +29 -0
  62. package/dist/cli-adapter.d.ts.map +1 -0
  63. package/dist/cli-adapter.js +92 -0
  64. package/dist/cli-adapter.js.map +1 -0
  65. package/dist/cli-executable.d.ts +3 -0
  66. package/dist/cli-executable.d.ts.map +1 -0
  67. package/dist/cli-executable.js +10 -0
  68. package/dist/cli-executable.js.map +1 -0
  69. package/dist/cli.d.ts +9 -0
  70. package/dist/cli.d.ts.map +1 -0
  71. package/dist/cli.js +348 -0
  72. package/dist/cli.js.map +1 -0
  73. package/dist/compile.d.ts +42 -0
  74. package/dist/compile.d.ts.map +1 -0
  75. package/dist/compile.js +515 -0
  76. package/dist/compile.js.map +1 -0
  77. package/dist/demo-hn-monitor.d.ts +2 -0
  78. package/dist/demo-hn-monitor.d.ts.map +1 -0
  79. package/dist/demo-hn-monitor.js +118 -0
  80. package/dist/demo-hn-monitor.js.map +1 -0
  81. package/dist/dir-watcher-poller.d.ts +73 -0
  82. package/dist/dir-watcher-poller.d.ts.map +1 -0
  83. package/dist/dir-watcher-poller.js +80 -0
  84. package/dist/dir-watcher-poller.js.map +1 -0
  85. package/dist/direct-input.d.ts +10 -0
  86. package/dist/direct-input.d.ts.map +1 -0
  87. package/dist/direct-input.js +61 -0
  88. package/dist/direct-input.js.map +1 -0
  89. package/dist/failure-kinds.d.ts +25 -0
  90. package/dist/failure-kinds.d.ts.map +1 -0
  91. package/dist/failure-kinds.js +64 -0
  92. package/dist/failure-kinds.js.map +1 -0
  93. package/dist/gate-contract.d.ts +24 -0
  94. package/dist/gate-contract.d.ts.map +1 -0
  95. package/dist/gate-contract.js +50 -0
  96. package/dist/gate-contract.js.map +1 -0
  97. package/dist/hn-poller.d.ts +50 -0
  98. package/dist/hn-poller.d.ts.map +1 -0
  99. package/dist/hn-poller.js +79 -0
  100. package/dist/hn-poller.js.map +1 -0
  101. package/dist/index.d.ts +21 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +30 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/journal-client.d.ts +122 -0
  106. package/dist/journal-client.d.ts.map +1 -0
  107. package/dist/journal-client.js +277 -0
  108. package/dist/journal-client.js.map +1 -0
  109. package/dist/json-schema-bound.d.ts +7 -0
  110. package/dist/json-schema-bound.d.ts.map +1 -0
  111. package/dist/json-schema-bound.js +353 -0
  112. package/dist/json-schema-bound.js.map +1 -0
  113. package/dist/json-schema.d.ts +5 -0
  114. package/dist/json-schema.d.ts.map +1 -0
  115. package/dist/json-schema.js +72 -0
  116. package/dist/json-schema.js.map +1 -0
  117. package/dist/json-value.d.ts +6 -0
  118. package/dist/json-value.d.ts.map +1 -0
  119. package/dist/json-value.js +94 -0
  120. package/dist/json-value.js.map +1 -0
  121. package/dist/model-name.d.ts +7 -0
  122. package/dist/model-name.d.ts.map +1 -0
  123. package/dist/model-name.js +21 -0
  124. package/dist/model-name.js.map +1 -0
  125. package/dist/output-schema.d.ts +8 -0
  126. package/dist/output-schema.d.ts.map +1 -0
  127. package/dist/output-schema.js +28 -0
  128. package/dist/output-schema.js.map +1 -0
  129. package/dist/preflight.d.ts +80 -0
  130. package/dist/preflight.d.ts.map +1 -0
  131. package/dist/preflight.js +361 -0
  132. package/dist/preflight.js.map +1 -0
  133. package/dist/protocol.d.ts +359 -0
  134. package/dist/protocol.d.ts.map +1 -0
  135. package/dist/protocol.js +15 -0
  136. package/dist/protocol.js.map +1 -0
  137. package/dist/spec.d.ts +294 -0
  138. package/dist/spec.d.ts.map +1 -0
  139. package/dist/spec.js +13 -0
  140. package/dist/spec.js.map +1 -0
  141. package/dist/step-dependencies.d.ts +2 -0
  142. package/dist/step-dependencies.d.ts.map +1 -0
  143. package/dist/step-dependencies.js +88 -0
  144. package/dist/step-dependencies.js.map +1 -0
  145. package/dist/step-fields.d.ts +17 -0
  146. package/dist/step-fields.d.ts.map +1 -0
  147. package/dist/step-fields.js +32 -0
  148. package/dist/step-fields.js.map +1 -0
  149. package/dist/tick-source.d.ts +205 -0
  150. package/dist/tick-source.d.ts.map +1 -0
  151. package/dist/tick-source.js +234 -0
  152. package/dist/tick-source.js.map +1 -0
  153. package/dist/unknown-keys.d.ts +7 -0
  154. package/dist/unknown-keys.d.ts.map +1 -0
  155. package/dist/unknown-keys.js +47 -0
  156. package/dist/unknown-keys.js.map +1 -0
  157. package/dist/validate.d.ts +7 -0
  158. package/dist/validate.d.ts.map +1 -0
  159. package/dist/validate.js +458 -0
  160. package/dist/validate.js.map +1 -0
  161. package/dist/work-package-consumer.d.ts +33 -0
  162. package/dist/work-package-consumer.d.ts.map +1 -0
  163. package/dist/work-package-consumer.js +44 -0
  164. package/dist/work-package-consumer.js.map +1 -0
  165. package/dist/work-package-validator.d.ts +15 -0
  166. package/dist/work-package-validator.d.ts.map +1 -0
  167. package/dist/work-package-validator.js +72 -0
  168. package/dist/work-package-validator.js.map +1 -0
  169. package/dist/worker-cli.d.ts +16 -0
  170. package/dist/worker-cli.d.ts.map +1 -0
  171. package/dist/worker-cli.js +77 -0
  172. package/dist/worker-cli.js.map +1 -0
  173. package/dist/worker.d.ts +57 -0
  174. package/dist/worker.d.ts.map +1 -0
  175. package/dist/worker.js +129 -0
  176. package/dist/worker.js.map +1 -0
  177. package/dist/wrapper-runtime.d.ts +10 -0
  178. package/dist/wrapper-runtime.d.ts.map +1 -0
  179. package/dist/wrapper-runtime.js +83 -0
  180. package/dist/wrapper-runtime.js.map +1 -0
  181. package/dist/wrapper-session.d.ts +16 -0
  182. package/dist/wrapper-session.d.ts.map +1 -0
  183. package/dist/wrapper-session.js +244 -0
  184. package/dist/wrapper-session.js.map +1 -0
  185. package/package.json +50 -0
  186. package/src/authored-flow-error.ts +31 -0
  187. package/src/authored-flow-executor.ts +365 -0
  188. package/src/authored-flow-lifecycle.ts +344 -0
  189. package/src/authored-flow-loader.ts +44 -0
  190. package/src/authored-flow-operation.ts +252 -0
  191. package/src/authored-flow.ts +21 -0
  192. package/src/authored-promise-graph.ts +196 -0
  193. package/src/backlog-picker.ts +153 -0
  194. package/src/canonical.ts +57 -0
  195. package/src/cli/check.ts +391 -0
  196. package/src/cli/direct-run.ts +86 -0
  197. package/src/cli/hn-monitor.ts +286 -0
  198. package/src/cli/interruptible-sleep.ts +27 -0
  199. package/src/cli/run.ts +439 -0
  200. package/src/cli/tick-runner.ts +378 -0
  201. package/src/cli-adapter.ts +115 -0
  202. package/src/cli-executable.ts +12 -0
  203. package/src/cli.ts +364 -0
  204. package/src/compile.ts +573 -0
  205. package/src/demo-hn-monitor.ts +132 -0
  206. package/src/dir-watcher-poller.ts +122 -0
  207. package/src/direct-input.ts +69 -0
  208. package/src/failure-kinds.ts +77 -0
  209. package/src/gate-contract.ts +72 -0
  210. package/src/hn-poller.ts +104 -0
  211. package/src/index.ts +195 -0
  212. package/src/journal-client.ts +379 -0
  213. package/src/json-schema-bound.ts +357 -0
  214. package/src/json-schema.ts +65 -0
  215. package/src/json-value.ts +110 -0
  216. package/src/model-name.ts +20 -0
  217. package/src/output-schema.ts +33 -0
  218. package/src/preflight.ts +482 -0
  219. package/src/protocol.ts +364 -0
  220. package/src/spec.ts +343 -0
  221. package/src/step-dependencies.ts +100 -0
  222. package/src/step-fields.ts +36 -0
  223. package/src/tick-source.ts +334 -0
  224. package/src/unknown-keys.ts +52 -0
  225. package/src/validate.ts +503 -0
  226. package/src/work-package-consumer.ts +73 -0
  227. package/src/work-package-validator.ts +90 -0
  228. package/src/worker-cli.ts +110 -0
  229. package/src/worker.ts +150 -0
  230. package/src/wrapper-runtime.ts +93 -0
  231. 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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"}