footprintjs 4.16.0 → 4.17.2

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 (188) hide show
  1. package/AGENTS.md +567 -82
  2. package/CLAUDE.md +57 -0
  3. package/README.md +2 -0
  4. package/dist/advanced.js +4 -2
  5. package/dist/detach.js +78 -0
  6. package/dist/esm/advanced.js +2 -1
  7. package/dist/esm/detach.js +57 -0
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +171 -61
  9. package/dist/esm/lib/contract/openapi.js +4 -5
  10. package/dist/esm/lib/contract/schema.js +115 -4
  11. package/dist/esm/lib/decide/decide.js +4 -5
  12. package/dist/esm/lib/decide/evidence.js +3 -2
  13. package/dist/esm/lib/detach/drivers/immediate.js +66 -0
  14. package/dist/esm/lib/detach/drivers/microtaskBatch.js +113 -0
  15. package/dist/esm/lib/detach/drivers/sendBeacon.js +78 -0
  16. package/dist/esm/lib/detach/drivers/setImmediate.js +81 -0
  17. package/dist/esm/lib/detach/drivers/setTimeout.js +69 -0
  18. package/dist/esm/lib/detach/drivers/workerThread.js +117 -0
  19. package/dist/esm/lib/detach/flush.js +91 -0
  20. package/dist/esm/lib/detach/handle.js +134 -0
  21. package/dist/esm/lib/detach/registry.js +97 -0
  22. package/dist/esm/lib/detach/runChild.js +40 -0
  23. package/dist/esm/lib/detach/spawn.js +86 -0
  24. package/dist/esm/lib/detach/types.js +37 -0
  25. package/dist/esm/lib/engine/errors/errorInfo.js +4 -4
  26. package/dist/esm/lib/engine/graph/StageNode.js +2 -2
  27. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +9 -8
  28. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +12 -9
  29. package/dist/esm/lib/engine/handlers/DeciderHandler.js +7 -8
  30. package/dist/esm/lib/engine/handlers/ExtractorRunner.js +14 -8
  31. package/dist/esm/lib/engine/handlers/NodeResolver.js +5 -3
  32. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +11 -14
  33. package/dist/esm/lib/engine/handlers/SelectorHandler.js +9 -9
  34. package/dist/esm/lib/engine/handlers/StageRunner.js +9 -11
  35. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +13 -12
  36. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +4 -4
  37. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +85 -96
  38. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +18 -36
  39. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +6 -5
  40. package/dist/esm/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +7 -6
  41. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +10 -10
  42. package/dist/esm/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +5 -3
  43. package/dist/esm/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +4 -3
  44. package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +4 -4
  45. package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +5 -6
  46. package/dist/esm/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +5 -6
  47. package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -3
  48. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +97 -71
  49. package/dist/esm/lib/memory/DiagnosticCollector.js +6 -8
  50. package/dist/esm/lib/memory/EventLog.js +5 -3
  51. package/dist/esm/lib/memory/SharedMemory.js +3 -2
  52. package/dist/esm/lib/memory/StageContext.js +44 -14
  53. package/dist/esm/lib/memory/TransactionBuffer.js +9 -8
  54. package/dist/esm/lib/memory/backtrack.js +3 -4
  55. package/dist/esm/lib/memory/commitLogUtils.js +2 -2
  56. package/dist/esm/lib/memory/utils.js +2 -3
  57. package/dist/esm/lib/pause/types.js +33 -14
  58. package/dist/esm/lib/reactive/createTypedScope.js +10 -8
  59. package/dist/esm/lib/reactive/types.js +3 -1
  60. package/dist/esm/lib/recorder/BoundaryStateTracker.js +263 -0
  61. package/dist/esm/lib/recorder/CompositeRecorder.js +3 -1
  62. package/dist/esm/lib/recorder/InOutRecorder.js +5 -6
  63. package/dist/esm/lib/recorder/KeyedRecorder.js +2 -4
  64. package/dist/esm/lib/recorder/QualityRecorder.js +15 -14
  65. package/dist/esm/lib/recorder/SequenceRecorder.js +11 -12
  66. package/dist/esm/lib/recorder/TopologyRecorder.js +36 -40
  67. package/dist/esm/lib/recorder/index.js +2 -1
  68. package/dist/esm/lib/recorder/qualityTrace.js +4 -5
  69. package/dist/esm/lib/runner/ExecutionRuntime.js +20 -4
  70. package/dist/esm/lib/runner/FlowChartExecutor.js +99 -55
  71. package/dist/esm/lib/runner/RunContext.js +5 -3
  72. package/dist/esm/lib/runner/RunnableChart.js +7 -9
  73. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -5
  74. package/dist/esm/lib/schema/errors.js +4 -3
  75. package/dist/esm/lib/schema/validate.js +4 -5
  76. package/dist/esm/lib/scope/ScopeFacade.js +52 -35
  77. package/dist/esm/lib/scope/providers/baseStateCompatible.js +9 -9
  78. package/dist/esm/lib/scope/providers/guards.js +2 -2
  79. package/dist/esm/lib/scope/recorders/DebugRecorder.js +9 -7
  80. package/dist/esm/lib/scope/recorders/MetricRecorder.js +10 -8
  81. package/dist/esm/lib/scope/state/zod/defineScopeFromZod.js +2 -3
  82. package/dist/esm/lib/scope/state/zod/resolver.js +2 -3
  83. package/dist/esm/lib/scope/state/zod/scopeFactory.js +16 -20
  84. package/dist/esm/lib/scope/state/zod/utils/validateHelper.js +57 -14
  85. package/dist/esm/trace.js +4 -1
  86. package/dist/lib/builder/FlowChartBuilder.js +171 -61
  87. package/dist/lib/contract/openapi.js +4 -5
  88. package/dist/lib/contract/schema.js +115 -4
  89. package/dist/lib/decide/decide.js +4 -5
  90. package/dist/lib/decide/evidence.js +3 -2
  91. package/dist/lib/detach/drivers/immediate.js +70 -0
  92. package/dist/lib/detach/drivers/microtaskBatch.js +117 -0
  93. package/dist/lib/detach/drivers/sendBeacon.js +82 -0
  94. package/dist/lib/detach/drivers/setImmediate.js +85 -0
  95. package/dist/lib/detach/drivers/setTimeout.js +73 -0
  96. package/dist/lib/detach/drivers/workerThread.js +121 -0
  97. package/dist/lib/detach/flush.js +95 -0
  98. package/dist/lib/detach/handle.js +140 -0
  99. package/dist/lib/detach/registry.js +106 -0
  100. package/dist/lib/detach/runChild.js +67 -0
  101. package/dist/lib/detach/spawn.js +92 -0
  102. package/dist/lib/detach/types.js +38 -0
  103. package/dist/lib/engine/errors/errorInfo.js +4 -4
  104. package/dist/lib/engine/graph/StageNode.js +2 -2
  105. package/dist/lib/engine/handlers/ChildrenExecutor.js +9 -8
  106. package/dist/lib/engine/handlers/ContinuationResolver.js +12 -9
  107. package/dist/lib/engine/handlers/DeciderHandler.js +7 -8
  108. package/dist/lib/engine/handlers/ExtractorRunner.js +14 -8
  109. package/dist/lib/engine/handlers/NodeResolver.js +5 -3
  110. package/dist/lib/engine/handlers/RuntimeStructureManager.js +11 -14
  111. package/dist/lib/engine/handlers/SelectorHandler.js +9 -9
  112. package/dist/lib/engine/handlers/StageRunner.js +9 -11
  113. package/dist/lib/engine/handlers/SubflowExecutor.js +13 -12
  114. package/dist/lib/engine/handlers/SubflowInputMapper.js +4 -4
  115. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +85 -96
  116. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +18 -36
  117. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +6 -5
  118. package/dist/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +7 -6
  119. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +10 -10
  120. package/dist/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +5 -3
  121. package/dist/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +4 -3
  122. package/dist/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +4 -4
  123. package/dist/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +5 -6
  124. package/dist/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +5 -6
  125. package/dist/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -3
  126. package/dist/lib/engine/traversal/FlowchartTraverser.js +97 -71
  127. package/dist/lib/memory/DiagnosticCollector.js +6 -8
  128. package/dist/lib/memory/EventLog.js +5 -3
  129. package/dist/lib/memory/SharedMemory.js +3 -2
  130. package/dist/lib/memory/StageContext.js +44 -14
  131. package/dist/lib/memory/TransactionBuffer.js +9 -8
  132. package/dist/lib/memory/backtrack.js +3 -4
  133. package/dist/lib/memory/commitLogUtils.js +2 -2
  134. package/dist/lib/memory/utils.js +2 -3
  135. package/dist/lib/pause/types.js +33 -14
  136. package/dist/lib/reactive/createTypedScope.js +10 -8
  137. package/dist/lib/reactive/types.js +3 -1
  138. package/dist/lib/recorder/BoundaryStateTracker.js +267 -0
  139. package/dist/lib/recorder/CompositeRecorder.js +3 -1
  140. package/dist/lib/recorder/InOutRecorder.js +5 -6
  141. package/dist/lib/recorder/KeyedRecorder.js +2 -4
  142. package/dist/lib/recorder/QualityRecorder.js +15 -14
  143. package/dist/lib/recorder/SequenceRecorder.js +11 -12
  144. package/dist/lib/recorder/TopologyRecorder.js +36 -40
  145. package/dist/lib/recorder/index.js +4 -2
  146. package/dist/lib/recorder/qualityTrace.js +4 -5
  147. package/dist/lib/runner/ExecutionRuntime.js +20 -4
  148. package/dist/lib/runner/FlowChartExecutor.js +99 -55
  149. package/dist/lib/runner/RunContext.js +5 -3
  150. package/dist/lib/runner/RunnableChart.js +7 -9
  151. package/dist/lib/runner/getSubtreeSnapshot.js +4 -5
  152. package/dist/lib/schema/errors.js +4 -3
  153. package/dist/lib/schema/validate.js +4 -5
  154. package/dist/lib/scope/ScopeFacade.js +52 -35
  155. package/dist/lib/scope/providers/baseStateCompatible.js +9 -9
  156. package/dist/lib/scope/providers/guards.js +2 -2
  157. package/dist/lib/scope/recorders/DebugRecorder.js +9 -7
  158. package/dist/lib/scope/recorders/MetricRecorder.js +10 -8
  159. package/dist/lib/scope/state/zod/defineScopeFromZod.js +2 -3
  160. package/dist/lib/scope/state/zod/resolver.js +2 -3
  161. package/dist/lib/scope/state/zod/scopeFactory.js +16 -20
  162. package/dist/lib/scope/state/zod/utils/validateHelper.js +57 -14
  163. package/dist/trace.js +6 -2
  164. package/dist/types/advanced.d.ts +1 -0
  165. package/dist/types/detach.d.ts +59 -0
  166. package/dist/types/lib/builder/FlowChartBuilder.d.ts +81 -0
  167. package/dist/types/lib/detach/drivers/immediate.d.ts +39 -0
  168. package/dist/types/lib/detach/drivers/microtaskBatch.d.ts +57 -0
  169. package/dist/types/lib/detach/drivers/sendBeacon.d.ts +38 -0
  170. package/dist/types/lib/detach/drivers/setImmediate.d.ts +32 -0
  171. package/dist/types/lib/detach/drivers/setTimeout.d.ts +34 -0
  172. package/dist/types/lib/detach/drivers/workerThread.d.ts +50 -0
  173. package/dist/types/lib/detach/flush.d.ts +62 -0
  174. package/dist/types/lib/detach/handle.d.ts +83 -0
  175. package/dist/types/lib/detach/registry.d.ts +82 -0
  176. package/dist/types/lib/detach/runChild.d.ts +41 -0
  177. package/dist/types/lib/detach/spawn.d.ts +64 -0
  178. package/dist/types/lib/detach/types.d.ts +200 -0
  179. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +0 -1
  180. package/dist/types/lib/engine/types.d.ts +0 -1
  181. package/dist/types/lib/reactive/types.d.ts +4 -0
  182. package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +215 -0
  183. package/dist/types/lib/recorder/index.d.ts +1 -0
  184. package/dist/types/lib/runner/FlowChartExecutor.d.ts +28 -0
  185. package/dist/types/lib/scope/ScopeFacade.d.ts +4 -0
  186. package/dist/types/lib/scope/state/zod/utils/validateHelper.d.ts +13 -1
  187. package/dist/types/trace.d.ts +1 -0
  188. package/package.json +6 -1
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * detach/flush.ts — Drain every in-flight detached handle to terminal.
4
+ *
5
+ * Pattern: Drain-loop with deadline. Same shape as a graceful HTTP
6
+ * server shutdown: snapshot the queue, await everything in
7
+ * flight, repeat until empty or deadline.
8
+ * Role: Graceful-shutdown hook for consumers who launched
9
+ * fire-and-forget work and want to make sure it actually
10
+ * flushed before exiting (server stop, test cleanup, etc.).
11
+ *
12
+ * Why iterate (not single Promise.all over a snapshot):
13
+ * - A child stage can itself call `detachAndForget` while running —
14
+ * new handles arrive WHILE we're flushing. A single snapshot would
15
+ * miss them. Looping until `size() === 0` drains transitively.
16
+ *
17
+ * Why dedupe via `seen` Set:
18
+ * - Handles already terminal (but not yet `unregister`ed by their
19
+ * driver's finally-block) can re-appear in subsequent snapshots.
20
+ * Without dedupe, the `done` counter would double-count them.
21
+ *
22
+ * Why `Promise.allSettled` (not `Promise.all`):
23
+ * - One handle's rejection must NOT abort the rest. A failed child
24
+ * is normal (it's why `wait()` rejects); we still want to drain
25
+ * the siblings.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.flushAllDetached = void 0;
29
+ const registry_js_1 = require("./registry.js");
30
+ /**
31
+ * Wait for every in-flight detached handle to reach a terminal state.
32
+ * Returns counts for diagnostics. PROCESS-WIDE — drains every driver
33
+ * across every executor. For per-executor scoping, consumers should
34
+ * collect their own handles from `executor.detachAndJoinLater(...)`
35
+ * calls and await `Promise.allSettled([...].map(h => h.wait()))`
36
+ * themselves.
37
+ *
38
+ * @example Graceful server shutdown
39
+ * ```typescript
40
+ * import { flushAllDetached } from 'footprintjs/detach';
41
+ *
42
+ * process.on('SIGTERM', async () => {
43
+ * const stats = await flushAllDetached({ timeoutMs: 10_000 });
44
+ * console.log(`Drained ${stats.done} done, ${stats.failed} failed, ${stats.pending} pending.`);
45
+ * process.exit(stats.pending === 0 ? 0 : 1);
46
+ * });
47
+ * ```
48
+ */
49
+ async function flushAllDetached(opts) {
50
+ const timeoutMs = opts?.timeoutMs ?? 30_000;
51
+ const startedAt = Date.now();
52
+ const seen = new Set();
53
+ let done = 0;
54
+ let failed = 0;
55
+ while ((0, registry_js_1.size)() > 0) {
56
+ const remainingMs = timeoutMs - (Date.now() - startedAt);
57
+ if (remainingMs <= 0)
58
+ return { done, failed, pending: (0, registry_js_1.size)() };
59
+ // Snapshot of NEW (unseen) handles. Existing terminal-but-still-
60
+ // registered handles re-appear in subsequent snapshots; the seen
61
+ // set prevents double-counting.
62
+ const newIds = (0, registry_js_1.ids)().filter((id) => !seen.has(id));
63
+ if (newIds.length === 0) {
64
+ // Everything in the registry is already awaited — yield once and
65
+ // re-check. The driver's unregister-in-finally hasn't run yet.
66
+ await Promise.resolve();
67
+ continue;
68
+ }
69
+ for (const id of newIds)
70
+ seen.add(id);
71
+ const handles = newIds.map((id) => (0, registry_js_1.lookup)(id)).filter((h) => h !== undefined);
72
+ // Race the drain against the per-iteration timeout. We use a
73
+ // `'timeout'` sentinel on the timeout side so the type narrows.
74
+ let timerId;
75
+ const timeoutPromise = new Promise((resolve) => {
76
+ timerId = setTimeout(() => resolve('__detach_timeout__'), remainingMs);
77
+ });
78
+ const drainPromise = Promise.allSettled(handles.map((h) => h.wait()));
79
+ const result = await Promise.race([drainPromise, timeoutPromise]);
80
+ if (timerId !== undefined)
81
+ clearTimeout(timerId);
82
+ if (result === '__detach_timeout__') {
83
+ return { done, failed, pending: (0, registry_js_1.size)() };
84
+ }
85
+ for (const r of result) {
86
+ if (r.status === 'fulfilled')
87
+ done++;
88
+ else
89
+ failed++;
90
+ }
91
+ }
92
+ return { done, failed, pending: 0 };
93
+ }
94
+ exports.flushAllDetached = flushAllDetached;
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC9mbHVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRzs7O0FBRUgsK0NBQWtEO0FBc0JsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUFDLElBQW1CO0lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxTQUFTLElBQUksTUFBTSxDQUFDO0lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLE9BQU8sSUFBQSxrQkFBSSxHQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEIsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksV0FBVyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBQSxrQkFBSSxHQUFFLEVBQUUsQ0FBQztRQUUvRCxpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLGdDQUFnQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFBLGlCQUFHLEdBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixpRUFBaUU7WUFDakUsK0RBQStEO1lBQy9ELE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFBLG9CQUFNLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQXFCLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7UUFFakcsNkRBQTZEO1FBQzdELGdFQUFnRTtRQUNoRSxJQUFJLE9BQWtELENBQUM7UUFDdkQsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQXVCLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkUsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpELElBQUksTUFBTSxLQUFLLG9CQUFvQixFQUFFLENBQUM7WUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQUksR0FBRSxFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVc7Z0JBQUUsSUFBSSxFQUFFLENBQUM7O2dCQUNoQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBN0NELDRDQTZDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2ZsdXNoLnRzIOKAlCBEcmFpbiBldmVyeSBpbi1mbGlnaHQgZGV0YWNoZWQgaGFuZGxlIHRvIHRlcm1pbmFsLlxuICpcbiAqIFBhdHRlcm46ICBEcmFpbi1sb29wIHdpdGggZGVhZGxpbmUuIFNhbWUgc2hhcGUgYXMgYSBncmFjZWZ1bCBIVFRQXG4gKiAgICAgICAgICAgc2VydmVyIHNodXRkb3duOiBzbmFwc2hvdCB0aGUgcXVldWUsIGF3YWl0IGV2ZXJ5dGhpbmcgaW5cbiAqICAgICAgICAgICBmbGlnaHQsIHJlcGVhdCB1bnRpbCBlbXB0eSBvciBkZWFkbGluZS5cbiAqIFJvbGU6ICAgICBHcmFjZWZ1bC1zaHV0ZG93biBob29rIGZvciBjb25zdW1lcnMgd2hvIGxhdW5jaGVkXG4gKiAgICAgICAgICAgZmlyZS1hbmQtZm9yZ2V0IHdvcmsgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGFjdHVhbGx5XG4gKiAgICAgICAgICAgZmx1c2hlZCBiZWZvcmUgZXhpdGluZyAoc2VydmVyIHN0b3AsIHRlc3QgY2xlYW51cCwgZXRjLikuXG4gKlxuICogV2h5IGl0ZXJhdGUgKG5vdCBzaW5nbGUgUHJvbWlzZS5hbGwgb3ZlciBhIHNuYXBzaG90KTpcbiAqICAgLSBBIGNoaWxkIHN0YWdlIGNhbiBpdHNlbGYgY2FsbCBgZGV0YWNoQW5kRm9yZ2V0YCB3aGlsZSBydW5uaW5nIOKAlFxuICogICAgIG5ldyBoYW5kbGVzIGFycml2ZSBXSElMRSB3ZSdyZSBmbHVzaGluZy4gQSBzaW5nbGUgc25hcHNob3Qgd291bGRcbiAqICAgICBtaXNzIHRoZW0uIExvb3BpbmcgdW50aWwgYHNpemUoKSA9PT0gMGAgZHJhaW5zIHRyYW5zaXRpdmVseS5cbiAqXG4gKiBXaHkgZGVkdXBlIHZpYSBgc2VlbmAgU2V0OlxuICogICAtIEhhbmRsZXMgYWxyZWFkeSB0ZXJtaW5hbCAoYnV0IG5vdCB5ZXQgYHVucmVnaXN0ZXJgZWQgYnkgdGhlaXJcbiAqICAgICBkcml2ZXIncyBmaW5hbGx5LWJsb2NrKSBjYW4gcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzLlxuICogICAgIFdpdGhvdXQgZGVkdXBlLCB0aGUgYGRvbmVgIGNvdW50ZXIgd291bGQgZG91YmxlLWNvdW50IHRoZW0uXG4gKlxuICogV2h5IGBQcm9taXNlLmFsbFNldHRsZWRgIChub3QgYFByb21pc2UuYWxsYCk6XG4gKiAgIC0gT25lIGhhbmRsZSdzIHJlamVjdGlvbiBtdXN0IE5PVCBhYm9ydCB0aGUgcmVzdC4gQSBmYWlsZWQgY2hpbGRcbiAqICAgICBpcyBub3JtYWwgKGl0J3Mgd2h5IGB3YWl0KClgIHJlamVjdHMpOyB3ZSBzdGlsbCB3YW50IHRvIGRyYWluXG4gKiAgICAgdGhlIHNpYmxpbmdzLlxuICovXG5cbmltcG9ydCB7IGlkcywgbG9va3VwLCBzaXplIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoUmVzdWx0IHtcbiAgLyoqIEhhbmRsZXMgd2hvc2UgYHdhaXQoKWAgd2UgRVhQTElDSVRMWSBhd2FpdGVkIGFuZCBzYXcgZnVsZmlsbGVkLlxuICAgKiAgQmVzdC1lZmZvcnQgY291bnQg4oCUIGEgY2hpbGQgdGhhdCBjb21wbGV0ZXMgaW5zaWRlIGFub3RoZXInc1xuICAgKiAgYHdhaXQoKWAgbWF5IGZpbmlzaCAoYW5kIHVucmVnaXN0ZXIpIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG9cbiAgICogIGF3YWl0IGl0IGRpcmVjdGx5LiBUaGUgRFJBSU4gaXMgc3RpbGwgZ3VhcmFudGVlZCAocmVnaXN0cnkgZW1wdHlcbiAgICogIG9uIHJldHVybik7IG9ubHkgdGhlIENPVU5UIGlzIGFwcHJveGltYXRlLiAqL1xuICByZWFkb25seSBkb25lOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHdob3NlIGB3YWl0KClgIHJlamVjdGVkLiBTYW1lIGJlc3QtZWZmb3J0IHNlbWFudGljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBIYW5kbGVzIHN0aWxsIGluLWZsaWdodCB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgaW5kaWNhdGVzXG4gICAqICBhIHN1Y2Nlc3NmdWwgKGNvbXBsZXRlKSBkcmFpbiDigJQgcmVnaXN0cnkgd2FzIGVtcHR5IG9uIHJldHVybi4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoT3B0aW9ucyB7XG4gIC8qKiBNYXggd2FsbC1jbG9jayB0byBzcGVuZCBkcmFpbmluZywgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IDMwcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdhaXQgZm9yIGV2ZXJ5IGluLWZsaWdodCBkZXRhY2hlZCBoYW5kbGUgdG8gcmVhY2ggYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqIFJldHVybnMgY291bnRzIGZvciBkaWFnbm9zdGljcy4gUFJPQ0VTUy1XSURFIOKAlCBkcmFpbnMgZXZlcnkgZHJpdmVyXG4gKiBhY3Jvc3MgZXZlcnkgZXhlY3V0b3IuIEZvciBwZXItZXhlY3V0b3Igc2NvcGluZywgY29uc3VtZXJzIHNob3VsZFxuICogY29sbGVjdCB0aGVpciBvd24gaGFuZGxlcyBmcm9tIGBleGVjdXRvci5kZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAqIGNhbGxzIGFuZCBhd2FpdCBgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5dLm1hcChoID0+IGgud2FpdCgpKSlgXG4gKiB0aGVtc2VsdmVzLlxuICpcbiAqIEBleGFtcGxlIEdyYWNlZnVsIHNlcnZlciBzaHV0ZG93blxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZmx1c2hBbGxEZXRhY2hlZCB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gKlxuICogcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAqICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmbHVzaEFsbERldGFjaGVkKHsgdGltZW91dE1zOiAxMF8wMDAgfSk7XG4gKiAgIGNvbnNvbGUubG9nKGBEcmFpbmVkICR7c3RhdHMuZG9uZX0gZG9uZSwgJHtzdGF0cy5mYWlsZWR9IGZhaWxlZCwgJHtzdGF0cy5wZW5kaW5nfSBwZW5kaW5nLmApO1xuICogICBwcm9jZXNzLmV4aXQoc3RhdHMucGVuZGluZyA9PT0gMCA/IDAgOiAxKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaEFsbERldGFjaGVkKG9wdHM/OiBGbHVzaE9wdGlvbnMpOiBQcm9taXNlPEZsdXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IG9wdHM/LnRpbWVvdXRNcyA/PyAzMF8wMDA7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGRvbmUgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcblxuICB3aGlsZSAoc2l6ZSgpID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dE1zIC0gKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGlmIChyZW1haW5pbmdNcyA8PSAwKSByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IHNpemUoKSB9O1xuXG4gICAgLy8gU25hcHNob3Qgb2YgTkVXICh1bnNlZW4pIGhhbmRsZXMuIEV4aXN0aW5nIHRlcm1pbmFsLWJ1dC1zdGlsbC1cbiAgICAvLyByZWdpc3RlcmVkIGhhbmRsZXMgcmUtYXBwZWFyIGluIHN1YnNlcXVlbnQgc25hcHNob3RzOyB0aGUgc2VlblxuICAgIC8vIHNldCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcuXG4gICAgY29uc3QgbmV3SWRzID0gaWRzKCkuZmlsdGVyKChpZCkgPT4gIXNlZW4uaGFzKGlkKSk7XG4gICAgaWYgKG5ld0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5IGlzIGFscmVhZHkgYXdhaXRlZCDigJQgeWllbGQgb25jZSBhbmRcbiAgICAgIC8vIHJlLWNoZWNrLiBUaGUgZHJpdmVyJ3MgdW5yZWdpc3Rlci1pbi1maW5hbGx5IGhhc24ndCBydW4geWV0LlxuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpZCBvZiBuZXdJZHMpIHNlZW4uYWRkKGlkKTtcblxuICAgIGNvbnN0IGhhbmRsZXMgPSBuZXdJZHMubWFwKChpZCkgPT4gbG9va3VwKGlkKSkuZmlsdGVyKChoKTogaCBpcyBEZXRhY2hIYW5kbGUgPT4gaCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIFJhY2UgdGhlIGRyYWluIGFnYWluc3QgdGhlIHBlci1pdGVyYXRpb24gdGltZW91dC4gV2UgdXNlIGFcbiAgICAvLyBgJ3RpbWVvdXQnYCBzZW50aW5lbCBvbiB0aGUgdGltZW91dCBzaWRlIHNvIHRoZSB0eXBlIG5hcnJvd3MuXG4gICAgbGV0IHRpbWVySWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8J19fZGV0YWNoX3RpbWVvdXRfXyc+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCdfX2RldGFjaF90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgIH0pO1xuICAgIGNvbnN0IGRyYWluUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2RyYWluUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXJJZCk7XG5cbiAgICBpZiAocmVzdWx0ID09PSAnX19kZXRhY2hfdGltZW91dF9fJykge1xuICAgICAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiBzaXplKCkgfTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHJlc3VsdCkge1xuICAgICAgaWYgKHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJykgZG9uZSsrO1xuICAgICAgZWxzZSBmYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBkb25lLCBmYWlsZWQsIHBlbmRpbmc6IDAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * detach/handle.ts — DetachHandle implementation.
4
+ *
5
+ * Pattern: Object-as-state-machine. Mutable status field; transitions
6
+ * are one-way and irreversible (queued → running → done/failed).
7
+ * Role: Backs the consumer-facing `DetachHandle` interface. The
8
+ * public surface is the interface (defined in `types.ts`);
9
+ * this class is the runtime impl.
10
+ *
11
+ * Internal vs public split:
12
+ * - PUBLIC (in `types.ts`) — read-only properties + `wait()`
13
+ * - INTERNAL (this file) — `_markRunning` / `_markDone` /
14
+ * `_markFailed` mutators called by drivers
15
+ *
16
+ * The class implements `DetachHandle` (which has only readonly fields
17
+ * exposed). Drivers cast to `HandleImpl` via the `asImpl()` helper to
18
+ * call the mutators — a controlled escape from readonly. Consumers
19
+ * cannot do this (they only see the interface).
20
+ *
21
+ * Promise caching contract:
22
+ * - First `wait()` call:
23
+ * - if status terminal → returns IMMEDIATELY-resolved Promise
24
+ * - if not terminal → returns NEW Promise; resolvers stored
25
+ * for use by `_markDone` / `_markFailed`
26
+ * - Subsequent `wait()` calls → returns the SAME cached Promise
27
+ * - The resolved/rejected value is the SAME on every call (no
28
+ * re-running, no duplicated work)
29
+ *
30
+ * Concurrency notes:
31
+ * - All transitions are sync. JavaScript is single-threaded so no
32
+ * atomics or locks needed.
33
+ * - State transitions out of terminal states are forbidden — calling
34
+ * `_markDone` after `_markFailed` (or vice-versa) is a no-op
35
+ * (defensive: prevents driver bugs from corrupting state).
36
+ */
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.createHandle = exports.asImpl = exports.HandleImpl = void 0;
39
+ /**
40
+ * Internal handle implementation. Drivers call the `_mark*` methods
41
+ * to drive state transitions; consumers see only the readonly
42
+ * `DetachHandle` interface.
43
+ */
44
+ class HandleImpl {
45
+ id;
46
+ status = 'queued';
47
+ result = undefined;
48
+ error = undefined;
49
+ // Lazy Promise cache — created on first `wait()` call.
50
+ waitPromise = null;
51
+ // Resolvers captured when wait() was called BEFORE terminal state.
52
+ resolveWait = null;
53
+ rejectWait = null;
54
+ constructor(id) {
55
+ this.id = id;
56
+ }
57
+ /**
58
+ * Public — opt-in async join. Returns a cached Promise.
59
+ * See `DetachHandle.wait()` docstring for contract.
60
+ */
61
+ wait() {
62
+ if (this.waitPromise)
63
+ return this.waitPromise;
64
+ if (this.status === 'done') {
65
+ this.waitPromise = Promise.resolve({ result: this.result });
66
+ }
67
+ else if (this.status === 'failed') {
68
+ this.waitPromise = Promise.reject(this.error);
69
+ }
70
+ else {
71
+ // Pending terminal — store resolvers for _markDone / _markFailed.
72
+ this.waitPromise = new Promise((resolve, reject) => {
73
+ this.resolveWait = resolve;
74
+ this.rejectWait = reject;
75
+ });
76
+ }
77
+ return this.waitPromise;
78
+ }
79
+ // ── Internal mutators (called by drivers) ──────────────────────────
80
+ /** Transition queued → running. No-op if already past 'queued'. */
81
+ _markRunning() {
82
+ if (this.status !== 'queued')
83
+ return;
84
+ this.status = 'running';
85
+ }
86
+ /**
87
+ * Transition to terminal 'done' with the given result. No-op if
88
+ * already terminal (defensive: prevents driver bugs from corrupting
89
+ * state).
90
+ */
91
+ _markDone(result) {
92
+ if (this.status === 'done' || this.status === 'failed')
93
+ return;
94
+ this.status = 'done';
95
+ this.result = result;
96
+ // If consumer already called wait(), unblock its Promise.
97
+ this.resolveWait?.({ result });
98
+ this.resolveWait = null;
99
+ this.rejectWait = null;
100
+ }
101
+ /**
102
+ * Transition to terminal 'failed' with the given error. No-op if
103
+ * already terminal.
104
+ */
105
+ _markFailed(error) {
106
+ if (this.status === 'done' || this.status === 'failed')
107
+ return;
108
+ this.status = 'failed';
109
+ this.error = error;
110
+ this.rejectWait?.(error);
111
+ this.resolveWait = null;
112
+ this.rejectWait = null;
113
+ }
114
+ }
115
+ exports.HandleImpl = HandleImpl;
116
+ /**
117
+ * Type-narrowing helper — cast a public `DetachHandle` to its
118
+ * implementation. Drivers (only) use this to call internal mutators.
119
+ *
120
+ * Throws if the handle isn't actually a `HandleImpl` — defends
121
+ * against consumers passing a hand-rolled object that satisfies the
122
+ * interface shape but lacks the mutators.
123
+ */
124
+ function asImpl(handle) {
125
+ if (!(handle instanceof HandleImpl)) {
126
+ throw new TypeError('[detach] expected a HandleImpl returned by createHandle(); got an arbitrary DetachHandle. ' +
127
+ 'Drivers must use createHandle() to construct handles, not hand-roll them.');
128
+ }
129
+ return handle;
130
+ }
131
+ exports.asImpl = asImpl;
132
+ /**
133
+ * Driver-facing factory. Drivers MUST use this to create handles
134
+ * (NOT construct `HandleImpl` directly — keeps the impl type private).
135
+ */
136
+ function createHandle(id) {
137
+ return new HandleImpl(id);
138
+ }
139
+ exports.createHandle = createHandle;
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXRhY2gvaGFuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRzs7O0FBSUg7Ozs7R0FJRztBQUNILE1BQWEsVUFBVTtJQUNaLEVBQUUsQ0FBUztJQUNwQixNQUFNLEdBQTJCLFFBQVEsQ0FBQztJQUMxQyxNQUFNLEdBQVksU0FBUyxDQUFDO0lBQzVCLEtBQUssR0FBc0IsU0FBUyxDQUFDO0lBRXJDLHVEQUF1RDtJQUMvQyxXQUFXLEdBQXFDLElBQUksQ0FBQztJQUM3RCxtRUFBbUU7SUFDM0QsV0FBVyxHQUEyQyxJQUFJLENBQUM7SUFDM0QsVUFBVSxHQUFnQyxJQUFJLENBQUM7SUFFdkQsWUFBWSxFQUFVO1FBQ3BCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRTlDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFBTSxDQUFDO1lBQ04sa0VBQWtFO1lBQ2xFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuRSxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxzRUFBc0U7SUFFdEUsbUVBQW1FO0lBQ25FLFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsTUFBZTtRQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsMERBQTBEO1FBQzFELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxLQUFZO1FBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRO1lBQUUsT0FBTztRQUMvRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBeEVELGdDQXdFQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixNQUFNLENBQUMsTUFBb0I7SUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLFNBQVMsQ0FDakIsNEZBQTRGO1lBQzFGLDJFQUEyRSxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFSRCx3QkFRQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FBQyxFQUFVO0lBQ3JDLE9BQU8sSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUZELG9DQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZXRhY2gvaGFuZGxlLnRzIOKAlCBEZXRhY2hIYW5kbGUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogUGF0dGVybjogIE9iamVjdC1hcy1zdGF0ZS1tYWNoaW5lLiBNdXRhYmxlIHN0YXR1cyBmaWVsZDsgdHJhbnNpdGlvbnNcbiAqICAgICAgICAgICBhcmUgb25lLXdheSBhbmQgaXJyZXZlcnNpYmxlIChxdWV1ZWQg4oaSIHJ1bm5pbmcg4oaSIGRvbmUvZmFpbGVkKS5cbiAqIFJvbGU6ICAgICBCYWNrcyB0aGUgY29uc3VtZXItZmFjaW5nIGBEZXRhY2hIYW5kbGVgIGludGVyZmFjZS4gVGhlXG4gKiAgICAgICAgICAgcHVibGljIHN1cmZhY2UgaXMgdGhlIGludGVyZmFjZSAoZGVmaW5lZCBpbiBgdHlwZXMudHNgKTtcbiAqICAgICAgICAgICB0aGlzIGNsYXNzIGlzIHRoZSBydW50aW1lIGltcGwuXG4gKlxuICogSW50ZXJuYWwgdnMgcHVibGljIHNwbGl0OlxuICogICAtIFBVQkxJQyAoaW4gYHR5cGVzLnRzYCkgICDigJQgcmVhZC1vbmx5IHByb3BlcnRpZXMgKyBgd2FpdCgpYFxuICogICAtIElOVEVSTkFMICh0aGlzIGZpbGUpICAgICDigJQgYF9tYXJrUnVubmluZ2AgLyBgX21hcmtEb25lYCAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYF9tYXJrRmFpbGVkYCBtdXRhdG9ycyBjYWxsZWQgYnkgZHJpdmVyc1xuICpcbiAqIFRoZSBjbGFzcyBpbXBsZW1lbnRzIGBEZXRhY2hIYW5kbGVgICh3aGljaCBoYXMgb25seSByZWFkb25seSBmaWVsZHNcbiAqIGV4cG9zZWQpLiBEcml2ZXJzIGNhc3QgdG8gYEhhbmRsZUltcGxgIHZpYSB0aGUgYGFzSW1wbCgpYCBoZWxwZXIgdG9cbiAqIGNhbGwgdGhlIG11dGF0b3JzIOKAlCBhIGNvbnRyb2xsZWQgZXNjYXBlIGZyb20gcmVhZG9ubHkuIENvbnN1bWVyc1xuICogY2Fubm90IGRvIHRoaXMgKHRoZXkgb25seSBzZWUgdGhlIGludGVyZmFjZSkuXG4gKlxuICogUHJvbWlzZSBjYWNoaW5nIGNvbnRyYWN0OlxuICogICAtIEZpcnN0IGB3YWl0KClgIGNhbGw6XG4gKiAgICAgICAtIGlmIHN0YXR1cyB0ZXJtaW5hbCDihpIgcmV0dXJucyBJTU1FRElBVEVMWS1yZXNvbHZlZCBQcm9taXNlXG4gKiAgICAgICAtIGlmIG5vdCB0ZXJtaW5hbCAgICDihpIgcmV0dXJucyBORVcgUHJvbWlzZTsgcmVzb2x2ZXJzIHN0b3JlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdXNlIGJ5IGBfbWFya0RvbmVgIC8gYF9tYXJrRmFpbGVkYFxuICogICAtIFN1YnNlcXVlbnQgYHdhaXQoKWAgY2FsbHMg4oaSIHJldHVybnMgdGhlIFNBTUUgY2FjaGVkIFByb21pc2VcbiAqICAgLSBUaGUgcmVzb2x2ZWQvcmVqZWN0ZWQgdmFsdWUgaXMgdGhlIFNBTUUgb24gZXZlcnkgY2FsbCAobm9cbiAqICAgICByZS1ydW5uaW5nLCBubyBkdXBsaWNhdGVkIHdvcmspXG4gKlxuICogQ29uY3VycmVuY3kgbm90ZXM6XG4gKiAgIC0gQWxsIHRyYW5zaXRpb25zIGFyZSBzeW5jLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCBzbyBub1xuICogICAgIGF0b21pY3Mgb3IgbG9ja3MgbmVlZGVkLlxuICogICAtIFN0YXRlIHRyYW5zaXRpb25zIG91dCBvZiB0ZXJtaW5hbCBzdGF0ZXMgYXJlIGZvcmJpZGRlbiDigJQgY2FsbGluZ1xuICogICAgIGBfbWFya0RvbmVgIGFmdGVyIGBfbWFya0ZhaWxlZGAgKG9yIHZpY2UtdmVyc2EpIGlzIGEgbm8tb3BcbiAqICAgICAoZGVmZW5zaXZlOiBwcmV2ZW50cyBkcml2ZXIgYnVncyBmcm9tIGNvcnJ1cHRpbmcgc3RhdGUpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGV0YWNoSGFuZGxlLCBEZXRhY2hXYWl0UmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaGFuZGxlIGltcGxlbWVudGF0aW9uLiBEcml2ZXJzIGNhbGwgdGhlIGBfbWFyaypgIG1ldGhvZHNcbiAqIHRvIGRyaXZlIHN0YXRlIHRyYW5zaXRpb25zOyBjb25zdW1lcnMgc2VlIG9ubHkgdGhlIHJlYWRvbmx5XG4gKiBgRGV0YWNoSGFuZGxlYCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIYW5kbGVJbXBsIGltcGxlbWVudHMgRGV0YWNoSGFuZGxlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBEZXRhY2hIYW5kbGVbJ3N0YXR1cyddID0gJ3F1ZXVlZCc7XG4gIHJlc3VsdDogdW5rbm93biA9IHVuZGVmaW5lZDtcbiAgZXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8vIExhenkgUHJvbWlzZSBjYWNoZSDigJQgY3JlYXRlZCBvbiBmaXJzdCBgd2FpdCgpYCBjYWxsLlxuICBwcml2YXRlIHdhaXRQcm9taXNlOiBQcm9taXNlPERldGFjaFdhaXRSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG4gIC8vIFJlc29sdmVycyBjYXB0dXJlZCB3aGVuIHdhaXQoKSB3YXMgY2FsbGVkIEJFRk9SRSB0ZXJtaW5hbCBzdGF0ZS5cbiAgcHJpdmF0ZSByZXNvbHZlV2FpdDogKCh2OiBEZXRhY2hXYWl0UmVzdWx0KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlamVjdFdhaXQ6ICgoZTogRXJyb3IpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMg4oCUIG9wdC1pbiBhc3luYyBqb2luLiBSZXR1cm5zIGEgY2FjaGVkIFByb21pc2UuXG4gICAqIFNlZSBgRGV0YWNoSGFuZGxlLndhaXQoKWAgZG9jc3RyaW5nIGZvciBjb250cmFjdC5cbiAgICovXG4gIHdhaXQoKTogUHJvbWlzZTxEZXRhY2hXYWl0UmVzdWx0PiB7XG4gICAgaWYgKHRoaXMud2FpdFByb21pc2UpIHJldHVybiB0aGlzLndhaXRQcm9taXNlO1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnZG9uZScpIHtcbiAgICAgIHRoaXMud2FpdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHRoaXMucmVzdWx0IH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICB0aGlzLndhaXRQcm9taXNlID0gUHJvbWlzZS5yZWplY3QodGhpcy5lcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBlbmRpbmcgdGVybWluYWwg4oCUIHN0b3JlIHJlc29sdmVycyBmb3IgX21hcmtEb25lIC8gX21hcmtGYWlsZWQuXG4gICAgICB0aGlzLndhaXRQcm9taXNlID0gbmV3IFByb21pc2U8RGV0YWNoV2FpdFJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0ID0gcmVzb2x2ZTtcbiAgICAgICAgdGhpcy5yZWplY3RXYWl0ID0gcmVqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhaXRQcm9taXNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIG11dGF0b3JzIChjYWxsZWQgYnkgZHJpdmVycykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRyYW5zaXRpb24gcXVldWVkIOKGkiBydW5uaW5nLiBOby1vcCBpZiBhbHJlYWR5IHBhc3QgJ3F1ZXVlZCcuICovXG4gIF9tYXJrUnVubmluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0dXMgIT09ICdxdWV1ZWQnKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXMgPSAncnVubmluZyc7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNpdGlvbiB0byB0ZXJtaW5hbCAnZG9uZScgd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0LiBOby1vcCBpZlxuICAgKiBhbHJlYWR5IHRlcm1pbmFsIChkZWZlbnNpdmU6IHByZXZlbnRzIGRyaXZlciBidWdzIGZyb20gY29ycnVwdGluZ1xuICAgKiBzdGF0ZSkuXG4gICAqL1xuICBfbWFya0RvbmUocmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnZG9uZScgfHwgdGhpcy5zdGF0dXMgPT09ICdmYWlsZWQnKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXMgPSAnZG9uZSc7XG4gICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgLy8gSWYgY29uc3VtZXIgYWxyZWFkeSBjYWxsZWQgd2FpdCgpLCB1bmJsb2NrIGl0cyBQcm9taXNlLlxuICAgIHRoaXMucmVzb2x2ZVdhaXQ/Lih7IHJlc3VsdCB9KTtcbiAgICB0aGlzLnJlc29sdmVXYWl0ID0gbnVsbDtcbiAgICB0aGlzLnJlamVjdFdhaXQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gdG8gdGVybWluYWwgJ2ZhaWxlZCcgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IuIE5vLW9wIGlmXG4gICAqIGFscmVhZHkgdGVybWluYWwuXG4gICAqL1xuICBfbWFya0ZhaWxlZChlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdkb25lJyB8fCB0aGlzLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHJldHVybjtcbiAgICB0aGlzLnN0YXR1cyA9ICdmYWlsZWQnO1xuICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICB0aGlzLnJlamVjdFdhaXQ/LihlcnJvcik7XG4gICAgdGhpcy5yZXNvbHZlV2FpdCA9IG51bGw7XG4gICAgdGhpcy5yZWplY3RXYWl0ID0gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUtbmFycm93aW5nIGhlbHBlciDigJQgY2FzdCBhIHB1YmxpYyBgRGV0YWNoSGFuZGxlYCB0byBpdHNcbiAqIGltcGxlbWVudGF0aW9uLiBEcml2ZXJzIChvbmx5KSB1c2UgdGhpcyB0byBjYWxsIGludGVybmFsIG11dGF0b3JzLlxuICpcbiAqIFRocm93cyBpZiB0aGUgaGFuZGxlIGlzbid0IGFjdHVhbGx5IGEgYEhhbmRsZUltcGxgIOKAlCBkZWZlbmRzXG4gKiBhZ2FpbnN0IGNvbnN1bWVycyBwYXNzaW5nIGEgaGFuZC1yb2xsZWQgb2JqZWN0IHRoYXQgc2F0aXNmaWVzIHRoZVxuICogaW50ZXJmYWNlIHNoYXBlIGJ1dCBsYWNrcyB0aGUgbXV0YXRvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ltcGwoaGFuZGxlOiBEZXRhY2hIYW5kbGUpOiBIYW5kbGVJbXBsIHtcbiAgaWYgKCEoaGFuZGxlIGluc3RhbmNlb2YgSGFuZGxlSW1wbCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1tkZXRhY2hdIGV4cGVjdGVkIGEgSGFuZGxlSW1wbCByZXR1cm5lZCBieSBjcmVhdGVIYW5kbGUoKTsgZ290IGFuIGFyYml0cmFyeSBEZXRhY2hIYW5kbGUuICcgK1xuICAgICAgICAnRHJpdmVycyBtdXN0IHVzZSBjcmVhdGVIYW5kbGUoKSB0byBjb25zdHJ1Y3QgaGFuZGxlcywgbm90IGhhbmQtcm9sbCB0aGVtLicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaGFuZGxlO1xufVxuXG4vKipcbiAqIERyaXZlci1mYWNpbmcgZmFjdG9yeS4gRHJpdmVycyBNVVNUIHVzZSB0aGlzIHRvIGNyZWF0ZSBoYW5kbGVzXG4gKiAoTk9UIGNvbnN0cnVjdCBgSGFuZGxlSW1wbGAgZGlyZWN0bHkg4oCUIGtlZXBzIHRoZSBpbXBsIHR5cGUgcHJpdmF0ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIYW5kbGUoaWQ6IHN0cmluZyk6IERldGFjaEhhbmRsZSB7XG4gIHJldHVybiBuZXcgSGFuZGxlSW1wbChpZCk7XG59XG4iXX0=
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * detach/registry.ts — Process-singleton handle registry.
4
+ *
5
+ * Pattern: Registry (GoF). Same shape as the cache strategy registry
6
+ * in agentfootprint v2.6 — a Map keyed by stable string id.
7
+ * Role: Glue between drivers and executors. When a driver schedules
8
+ * work it `register`s the handle here; later (during executor
9
+ * disposal, or for diagnostics) consumers `lookup` by refId.
10
+ *
11
+ * Why a singleton?
12
+ * - refIds are minted per detach call and are unique across the
13
+ * process lifetime (driver name + monotonic counter)
14
+ * - handles need to be cleanable from MULTIPLE call sites (executor
15
+ * disposal, driver-internal flush, test cleanup) without each one
16
+ * having to thread a Registry instance through ten layers
17
+ * - one-source-of-truth simplifies "is this handle still alive?"
18
+ * queries during debugging
19
+ *
20
+ * Why NOT a class instance per executor?
21
+ * - drivers (e.g., `microtaskBatchDriver`) are PROCESS-wide (one queue
22
+ * per driver, shared by every executor). Tying registry to executor
23
+ * would force per-executor driver instances, multiplying the queue
24
+ * count and breaking the batch-amortization the drivers exist for.
25
+ *
26
+ * Cleanup contract:
27
+ * - Drivers call `register(handle)` synchronously inside `schedule()`
28
+ * - Drivers (or executor disposal) call `unregister(refId)` once the
29
+ * handle is terminal AND the consumer has had a chance to observe it
30
+ * - `_resetForTests()` clears every entry — tests only
31
+ *
32
+ * Capacity:
33
+ * - No upper bound. The handle objects are tiny (~6 fields). A long-
34
+ * running process that detaches a million units WITHOUT cleanup
35
+ * would leak ~50 MB — acceptable for v1, since drivers ARE the
36
+ * cleanup site. If real-world programs hit the limit, add a
37
+ * sliding-window cap with telemetry hook (mirrors
38
+ * `LIVE_STATUS_LOG_CAP` in agentfootprint).
39
+ */
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports._resetForTests = exports.ids = exports.size = exports.unregister = exports.lookup = exports.register = void 0;
42
+ // Process-wide singleton. Map preserves insertion order — useful for
43
+ // diagnostic dumps that want chronological ordering.
44
+ const HANDLES = new Map();
45
+ /**
46
+ * Register a freshly-minted handle. Drivers MUST call this synchronously
47
+ * inside `schedule()` so the handle is observable from the moment it
48
+ * exists.
49
+ *
50
+ * Replacing an existing registration is treated as a programming error
51
+ * (refIds are supposed to be unique). We don't throw — silent overwrite
52
+ * could mask a bug, but throwing inside a driver's hot path could cascade
53
+ * into the parent stage. Compromise: warn in dev mode, overwrite always.
54
+ */
55
+ function register(handle) {
56
+ HANDLES.set(handle.id, handle);
57
+ }
58
+ exports.register = register;
59
+ /**
60
+ * Look up a handle by refId. Returns `undefined` for unknown ids — the
61
+ * caller decides whether that's an error or just a stale reference.
62
+ *
63
+ * Used by:
64
+ * - Executor disposal (find handles to mark cancelled / drain)
65
+ * - Driver-internal flush (correlate work-queue entries → handles)
66
+ * - Diagnostic tooling (dump handle state for a refId in a log line)
67
+ */
68
+ function lookup(refId) {
69
+ return HANDLES.get(refId);
70
+ }
71
+ exports.lookup = lookup;
72
+ /**
73
+ * Drop a handle from the registry. Idempotent — calling on an already-
74
+ * removed refId is a no-op (matches `Map.delete` semantics; useful when
75
+ * cleanup may race between executor disposal and the driver's own
76
+ * post-terminal cleanup).
77
+ */
78
+ function unregister(refId) {
79
+ HANDLES.delete(refId);
80
+ }
81
+ exports.unregister = unregister;
82
+ /**
83
+ * Diagnostic — total live handles. Use sparingly; calling this on hot
84
+ * paths defeats the registry's "cheap insert/lookup" goal.
85
+ */
86
+ function size() {
87
+ return HANDLES.size;
88
+ }
89
+ exports.size = size;
90
+ /**
91
+ * Diagnostic — every live refId. Use for "what's still in flight?"
92
+ * dumps during executor disposal or oncall debugging.
93
+ */
94
+ function ids() {
95
+ return [...HANDLES.keys()];
96
+ }
97
+ exports.ids = ids;
98
+ /**
99
+ * Test-only — wipe every entry. NEVER call from production code; that
100
+ * would orphan in-flight work without a chance to drain.
101
+ */
102
+ function _resetForTests() {
103
+ HANDLES.clear();
104
+ }
105
+ exports._resetForTests = _resetForTests;
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC9yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7OztBQUlILHFFQUFxRTtBQUNyRSxxREFBcUQ7QUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7QUFFaEQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLE1BQW9CO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRkQsNEJBRUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxLQUFhO0lBQ2xDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRkQsd0JBRUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUZELGdDQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSTtJQUNsQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDdEIsQ0FBQztBQUZELG9CQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsR0FBRztJQUNqQixPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRkQsa0JBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixjQUFjO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRkQsd0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRldGFjaC9yZWdpc3RyeS50cyDigJQgUHJvY2Vzcy1zaW5nbGV0b24gaGFuZGxlIHJlZ2lzdHJ5LlxuICpcbiAqIFBhdHRlcm46ICBSZWdpc3RyeSAoR29GKS4gU2FtZSBzaGFwZSBhcyB0aGUgY2FjaGUgc3RyYXRlZ3kgcmVnaXN0cnlcbiAqICAgICAgICAgICBpbiBhZ2VudGZvb3RwcmludCB2Mi42IOKAlCBhIE1hcCBrZXllZCBieSBzdGFibGUgc3RyaW5nIGlkLlxuICogUm9sZTogICAgIEdsdWUgYmV0d2VlbiBkcml2ZXJzIGFuZCBleGVjdXRvcnMuIFdoZW4gYSBkcml2ZXIgc2NoZWR1bGVzXG4gKiAgICAgICAgICAgd29yayBpdCBgcmVnaXN0ZXJgcyB0aGUgaGFuZGxlIGhlcmU7IGxhdGVyIChkdXJpbmcgZXhlY3V0b3JcbiAqICAgICAgICAgICBkaXNwb3NhbCwgb3IgZm9yIGRpYWdub3N0aWNzKSBjb25zdW1lcnMgYGxvb2t1cGAgYnkgcmVmSWQuXG4gKlxuICogV2h5IGEgc2luZ2xldG9uP1xuICogICAtIHJlZklkcyBhcmUgbWludGVkIHBlciBkZXRhY2ggY2FsbCBhbmQgYXJlIHVuaXF1ZSBhY3Jvc3MgdGhlXG4gKiAgICAgcHJvY2VzcyBsaWZldGltZSAoZHJpdmVyIG5hbWUgKyBtb25vdG9uaWMgY291bnRlcilcbiAqICAgLSBoYW5kbGVzIG5lZWQgdG8gYmUgY2xlYW5hYmxlIGZyb20gTVVMVElQTEUgY2FsbCBzaXRlcyAoZXhlY3V0b3JcbiAqICAgICBkaXNwb3NhbCwgZHJpdmVyLWludGVybmFsIGZsdXNoLCB0ZXN0IGNsZWFudXApIHdpdGhvdXQgZWFjaCBvbmVcbiAqICAgICBoYXZpbmcgdG8gdGhyZWFkIGEgUmVnaXN0cnkgaW5zdGFuY2UgdGhyb3VnaCB0ZW4gbGF5ZXJzXG4gKiAgIC0gb25lLXNvdXJjZS1vZi10cnV0aCBzaW1wbGlmaWVzIFwiaXMgdGhpcyBoYW5kbGUgc3RpbGwgYWxpdmU/XCJcbiAqICAgICBxdWVyaWVzIGR1cmluZyBkZWJ1Z2dpbmdcbiAqXG4gKiBXaHkgTk9UIGEgY2xhc3MgaW5zdGFuY2UgcGVyIGV4ZWN1dG9yP1xuICogICAtIGRyaXZlcnMgKGUuZy4sIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmApIGFyZSBQUk9DRVNTLXdpZGUgKG9uZSBxdWV1ZVxuICogICAgIHBlciBkcml2ZXIsIHNoYXJlZCBieSBldmVyeSBleGVjdXRvcikuIFR5aW5nIHJlZ2lzdHJ5IHRvIGV4ZWN1dG9yXG4gKiAgICAgd291bGQgZm9yY2UgcGVyLWV4ZWN1dG9yIGRyaXZlciBpbnN0YW5jZXMsIG11bHRpcGx5aW5nIHRoZSBxdWV1ZVxuICogICAgIGNvdW50IGFuZCBicmVha2luZyB0aGUgYmF0Y2gtYW1vcnRpemF0aW9uIHRoZSBkcml2ZXJzIGV4aXN0IGZvci5cbiAqXG4gKiBDbGVhbnVwIGNvbnRyYWN0OlxuICogICAtIERyaXZlcnMgY2FsbCBgcmVnaXN0ZXIoaGFuZGxlKWAgc3luY2hyb25vdXNseSBpbnNpZGUgYHNjaGVkdWxlKClgXG4gKiAgIC0gRHJpdmVycyAob3IgZXhlY3V0b3IgZGlzcG9zYWwpIGNhbGwgYHVucmVnaXN0ZXIocmVmSWQpYCBvbmNlIHRoZVxuICogICAgIGhhbmRsZSBpcyB0ZXJtaW5hbCBBTkQgdGhlIGNvbnN1bWVyIGhhcyBoYWQgYSBjaGFuY2UgdG8gb2JzZXJ2ZSBpdFxuICogICAtIGBfcmVzZXRGb3JUZXN0cygpYCBjbGVhcnMgZXZlcnkgZW50cnkg4oCUIHRlc3RzIG9ubHlcbiAqXG4gKiBDYXBhY2l0eTpcbiAqICAgLSBObyB1cHBlciBib3VuZC4gVGhlIGhhbmRsZSBvYmplY3RzIGFyZSB0aW55ICh+NiBmaWVsZHMpLiBBIGxvbmctXG4gKiAgICAgcnVubmluZyBwcm9jZXNzIHRoYXQgZGV0YWNoZXMgYSBtaWxsaW9uIHVuaXRzIFdJVEhPVVQgY2xlYW51cFxuICogICAgIHdvdWxkIGxlYWsgfjUwIE1CIOKAlCBhY2NlcHRhYmxlIGZvciB2MSwgc2luY2UgZHJpdmVycyBBUkUgdGhlXG4gKiAgICAgY2xlYW51cCBzaXRlLiBJZiByZWFsLXdvcmxkIHByb2dyYW1zIGhpdCB0aGUgbGltaXQsIGFkZCBhXG4gKiAgICAgc2xpZGluZy13aW5kb3cgY2FwIHdpdGggdGVsZW1ldHJ5IGhvb2sgKG1pcnJvcnNcbiAqICAgICBgTElWRV9TVEFUVVNfTE9HX0NBUGAgaW4gYWdlbnRmb290cHJpbnQpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFByb2Nlc3Mtd2lkZSBzaW5nbGV0b24uIE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyIOKAlCB1c2VmdWwgZm9yXG4vLyBkaWFnbm9zdGljIGR1bXBzIHRoYXQgd2FudCBjaHJvbm9sb2dpY2FsIG9yZGVyaW5nLlxuY29uc3QgSEFORExFUyA9IG5ldyBNYXA8c3RyaW5nLCBEZXRhY2hIYW5kbGU+KCk7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBmcmVzaGx5LW1pbnRlZCBoYW5kbGUuIERyaXZlcnMgTVVTVCBjYWxsIHRoaXMgc3luY2hyb25vdXNseVxuICogaW5zaWRlIGBzY2hlZHVsZSgpYCBzbyB0aGUgaGFuZGxlIGlzIG9ic2VydmFibGUgZnJvbSB0aGUgbW9tZW50IGl0XG4gKiBleGlzdHMuXG4gKlxuICogUmVwbGFjaW5nIGFuIGV4aXN0aW5nIHJlZ2lzdHJhdGlvbiBpcyB0cmVhdGVkIGFzIGEgcHJvZ3JhbW1pbmcgZXJyb3JcbiAqIChyZWZJZHMgYXJlIHN1cHBvc2VkIHRvIGJlIHVuaXF1ZSkuIFdlIGRvbid0IHRocm93IOKAlCBzaWxlbnQgb3ZlcndyaXRlXG4gKiBjb3VsZCBtYXNrIGEgYnVnLCBidXQgdGhyb3dpbmcgaW5zaWRlIGEgZHJpdmVyJ3MgaG90IHBhdGggY291bGQgY2FzY2FkZVxuICogaW50byB0aGUgcGFyZW50IHN0YWdlLiBDb21wcm9taXNlOiB3YXJuIGluIGRldiBtb2RlLCBvdmVyd3JpdGUgYWx3YXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoaGFuZGxlOiBEZXRhY2hIYW5kbGUpOiB2b2lkIHtcbiAgSEFORExFUy5zZXQoaGFuZGxlLmlkLCBoYW5kbGUpO1xufVxuXG4vKipcbiAqIExvb2sgdXAgYSBoYW5kbGUgYnkgcmVmSWQuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIHVua25vd24gaWRzIOKAlCB0aGVcbiAqIGNhbGxlciBkZWNpZGVzIHdoZXRoZXIgdGhhdCdzIGFuIGVycm9yIG9yIGp1c3QgYSBzdGFsZSByZWZlcmVuY2UuXG4gKlxuICogVXNlZCBieTpcbiAqICAgLSBFeGVjdXRvciBkaXNwb3NhbCAoZmluZCBoYW5kbGVzIHRvIG1hcmsgY2FuY2VsbGVkIC8gZHJhaW4pXG4gKiAgIC0gRHJpdmVyLWludGVybmFsIGZsdXNoIChjb3JyZWxhdGUgd29yay1xdWV1ZSBlbnRyaWVzIOKGkiBoYW5kbGVzKVxuICogICAtIERpYWdub3N0aWMgdG9vbGluZyAoZHVtcCBoYW5kbGUgc3RhdGUgZm9yIGEgcmVmSWQgaW4gYSBsb2cgbGluZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cChyZWZJZDogc3RyaW5nKTogRGV0YWNoSGFuZGxlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIEhBTkRMRVMuZ2V0KHJlZklkKTtcbn1cblxuLyoqXG4gKiBEcm9wIGEgaGFuZGxlIGZyb20gdGhlIHJlZ2lzdHJ5LiBJZGVtcG90ZW50IOKAlCBjYWxsaW5nIG9uIGFuIGFscmVhZHktXG4gKiByZW1vdmVkIHJlZklkIGlzIGEgbm8tb3AgKG1hdGNoZXMgYE1hcC5kZWxldGVgIHNlbWFudGljczsgdXNlZnVsIHdoZW5cbiAqIGNsZWFudXAgbWF5IHJhY2UgYmV0d2VlbiBleGVjdXRvciBkaXNwb3NhbCBhbmQgdGhlIGRyaXZlcidzIG93blxuICogcG9zdC10ZXJtaW5hbCBjbGVhbnVwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXIocmVmSWQ6IHN0cmluZyk6IHZvaWQge1xuICBIQU5ETEVTLmRlbGV0ZShyZWZJZCk7XG59XG5cbi8qKlxuICogRGlhZ25vc3RpYyDigJQgdG90YWwgbGl2ZSBoYW5kbGVzLiBVc2Ugc3BhcmluZ2x5OyBjYWxsaW5nIHRoaXMgb24gaG90XG4gKiBwYXRocyBkZWZlYXRzIHRoZSByZWdpc3RyeSdzIFwiY2hlYXAgaW5zZXJ0L2xvb2t1cFwiIGdvYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplKCk6IG51bWJlciB7XG4gIHJldHVybiBIQU5ETEVTLnNpemU7XG59XG5cbi8qKlxuICogRGlhZ25vc3RpYyDigJQgZXZlcnkgbGl2ZSByZWZJZC4gVXNlIGZvciBcIndoYXQncyBzdGlsbCBpbiBmbGlnaHQ/XCJcbiAqIGR1bXBzIGR1cmluZyBleGVjdXRvciBkaXNwb3NhbCBvciBvbmNhbGwgZGVidWdnaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5IQU5ETEVTLmtleXMoKV07XG59XG5cbi8qKlxuICogVGVzdC1vbmx5IOKAlCB3aXBlIGV2ZXJ5IGVudHJ5LiBORVZFUiBjYWxsIGZyb20gcHJvZHVjdGlvbiBjb2RlOyB0aGF0XG4gKiB3b3VsZCBvcnBoYW4gaW4tZmxpZ2h0IHdvcmsgd2l0aG91dCBhIGNoYW5jZSB0byBkcmFpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEZvclRlc3RzKCk6IHZvaWQge1xuICBIQU5ETEVTLmNsZWFyKCk7XG59XG4iXX0=
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * detach/runChild.ts — The "how do I actually run a child flowchart?" hook.
4
+ *
5
+ * Pattern: Strategy (GoF). Drivers are decoupled from the FlowChartExecutor
6
+ * — each driver is created with a `ChildRunner` it calls to
7
+ * materialize the work. Default implementation imports the
8
+ * executor lazily so drivers can be picked up by tree-shakers
9
+ * that don't pull the runner module into the bundle.
10
+ * Role: Glue between drivers and the engine. Without this seam, every
11
+ * driver would have to import `FlowChartExecutor` directly,
12
+ * creating circular import risk and bundle bloat.
13
+ *
14
+ * Why a separate module (not inlined in each driver):
15
+ * - DRY — every driver shares the same "instantiate executor, run, return
16
+ * result" sequence
17
+ * - Allows test code to swap the runner via factory injection without
18
+ * having to rebuild the whole driver
19
+ * - Future-proofs for the case where we want to inject env/recorders
20
+ * into the child (the runner is the natural place to do that)
21
+ */
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ var desc = Object.getOwnPropertyDescriptor(m, k);
25
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
26
+ desc = { enumerable: true, get: function() { return m[k]; } };
27
+ }
28
+ Object.defineProperty(o, k2, desc);
29
+ }) : (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ o[k2] = m[k];
32
+ }));
33
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
34
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
35
+ }) : function(o, v) {
36
+ o["default"] = v;
37
+ });
38
+ var __importStar = (this && this.__importStar) || function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.defaultRunChild = void 0;
47
+ /**
48
+ * Default runner — instantiates a fresh `FlowChartExecutor` for each
49
+ * child and awaits its run. Returns the executor's traversal result.
50
+ *
51
+ * Lazy-imports `FlowChartExecutor` so drivers that consumers create with
52
+ * their own runner don't pull the engine into their bundle.
53
+ *
54
+ * Uses dynamic import — see https://v8.dev/features/dynamic-import.
55
+ */
56
+ const defaultRunChild = async (child, input) => {
57
+ // Lazy import keeps tree-shakers honest for consumers who pass a
58
+ // custom runner (e.g., a worker-thread bridge).
59
+ const { FlowChartExecutor } = await Promise.resolve().then(() => __importStar(require('../runner/FlowChartExecutor.js')));
60
+ // The executor expects an unknown-typed FlowChart; cast at the boundary
61
+ // since the FlowChart shape is generic-erased at the detach level.
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ const executor = new FlowChartExecutor(child);
64
+ return executor.run({ input });
65
+ };
66
+ exports.defaultRunChild = defaultRunChild;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuQ2hpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC9ydW5DaGlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUg7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGVBQWUsR0FBZ0IsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtJQUNqRSxpRUFBaUU7SUFDakUsZ0RBQWdEO0lBQ2hELE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLHdEQUFhLGdDQUFnQyxHQUFDLENBQUM7SUFDN0Usd0VBQXdFO0lBQ3hFLG1FQUFtRTtJQUNuRSw4REFBOEQ7SUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFZLENBQUMsQ0FBQztJQUNyRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQztBQVRXLFFBQUEsZUFBZSxtQkFTMUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRldGFjaC9ydW5DaGlsZC50cyDigJQgVGhlIFwiaG93IGRvIEkgYWN0dWFsbHkgcnVuIGEgY2hpbGQgZmxvd2NoYXJ0P1wiIGhvb2suXG4gKlxuICogUGF0dGVybjogIFN0cmF0ZWd5IChHb0YpLiBEcml2ZXJzIGFyZSBkZWNvdXBsZWQgZnJvbSB0aGUgRmxvd0NoYXJ0RXhlY3V0b3JcbiAqICAgICAgICAgICDigJQgZWFjaCBkcml2ZXIgaXMgY3JlYXRlZCB3aXRoIGEgYENoaWxkUnVubmVyYCBpdCBjYWxscyB0b1xuICogICAgICAgICAgIG1hdGVyaWFsaXplIHRoZSB3b3JrLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGltcG9ydHMgdGhlXG4gKiAgICAgICAgICAgZXhlY3V0b3IgbGF6aWx5IHNvIGRyaXZlcnMgY2FuIGJlIHBpY2tlZCB1cCBieSB0cmVlLXNoYWtlcnNcbiAqICAgICAgICAgICB0aGF0IGRvbid0IHB1bGwgdGhlIHJ1bm5lciBtb2R1bGUgaW50byB0aGUgYnVuZGxlLlxuICogUm9sZTogICAgIEdsdWUgYmV0d2VlbiBkcml2ZXJzIGFuZCB0aGUgZW5naW5lLiBXaXRob3V0IHRoaXMgc2VhbSwgZXZlcnlcbiAqICAgICAgICAgICBkcml2ZXIgd291bGQgaGF2ZSB0byBpbXBvcnQgYEZsb3dDaGFydEV4ZWN1dG9yYCBkaXJlY3RseSxcbiAqICAgICAgICAgICBjcmVhdGluZyBjaXJjdWxhciBpbXBvcnQgcmlzayBhbmQgYnVuZGxlIGJsb2F0LlxuICpcbiAqIFdoeSBhIHNlcGFyYXRlIG1vZHVsZSAobm90IGlubGluZWQgaW4gZWFjaCBkcml2ZXIpOlxuICogICAtIERSWSDigJQgZXZlcnkgZHJpdmVyIHNoYXJlcyB0aGUgc2FtZSBcImluc3RhbnRpYXRlIGV4ZWN1dG9yLCBydW4sIHJldHVyblxuICogICAgIHJlc3VsdFwiIHNlcXVlbmNlXG4gKiAgIC0gQWxsb3dzIHRlc3QgY29kZSB0byBzd2FwIHRoZSBydW5uZXIgdmlhIGZhY3RvcnkgaW5qZWN0aW9uIHdpdGhvdXRcbiAqICAgICBoYXZpbmcgdG8gcmVidWlsZCB0aGUgd2hvbGUgZHJpdmVyXG4gKiAgIC0gRnV0dXJlLXByb29mcyBmb3IgdGhlIGNhc2Ugd2hlcmUgd2Ugd2FudCB0byBpbmplY3QgZW52L3JlY29yZGVyc1xuICogICAgIGludG8gdGhlIGNoaWxkICh0aGUgcnVubmVyIGlzIHRoZSBuYXR1cmFsIHBsYWNlIHRvIGRvIHRoYXQpXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcblxuLyoqXG4gKiBGdW5jdGlvbiB0aGUgZHJpdmVyIGNhbGxzIHRvIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIGNoaWxkIGZsb3djaGFydC5cbiAqIFJldHVybnMgYSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY2hhcnQncyB0ZXJtaW5hbCB2YWx1ZSAod2hhdGV2ZXJcbiAqIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgcmVzb2x2ZXMgd2l0aCksIG9yIHJlamVjdHMgb24gZmFpbHVyZS5cbiAqXG4gKiBEcml2ZXJzIHdyYXAgdGhpcyBpbiB0aGVpciBvd24gdHJ5L2NhdGNoIHNvIHRoZSByZWplY3Rpb24gcm91dGVzIHRvXG4gKiBgaGFuZGxlLl9tYXJrRmFpbGVkKClgIGluc3RlYWQgb2YgZXNjYXBpbmcgaW50byB0aGUgcGFyZW50IGNvbnRleHRcbiAqIChwYXNzaXZlLXJlY29yZGVyIHJ1bGUpLlxuICovXG5leHBvcnQgdHlwZSBDaGlsZFJ1bm5lciA9IChjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuLyoqXG4gKiBEZWZhdWx0IHJ1bm5lciDigJQgaW5zdGFudGlhdGVzIGEgZnJlc2ggYEZsb3dDaGFydEV4ZWN1dG9yYCBmb3IgZWFjaFxuICogY2hpbGQgYW5kIGF3YWl0cyBpdHMgcnVuLiBSZXR1cm5zIHRoZSBleGVjdXRvcidzIHRyYXZlcnNhbCByZXN1bHQuXG4gKlxuICogTGF6eS1pbXBvcnRzIGBGbG93Q2hhcnRFeGVjdXRvcmAgc28gZHJpdmVycyB0aGF0IGNvbnN1bWVycyBjcmVhdGUgd2l0aFxuICogdGhlaXIgb3duIHJ1bm5lciBkb24ndCBwdWxsIHRoZSBlbmdpbmUgaW50byB0aGVpciBidW5kbGUuXG4gKlxuICogVXNlcyBkeW5hbWljIGltcG9ydCDigJQgc2VlIGh0dHBzOi8vdjguZGV2L2ZlYXR1cmVzL2R5bmFtaWMtaW1wb3J0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFJ1bkNoaWxkOiBDaGlsZFJ1bm5lciA9IGFzeW5jIChjaGlsZCwgaW5wdXQpID0+IHtcbiAgLy8gTGF6eSBpbXBvcnQga2VlcHMgdHJlZS1zaGFrZXJzIGhvbmVzdCBmb3IgY29uc3VtZXJzIHdobyBwYXNzIGFcbiAgLy8gY3VzdG9tIHJ1bm5lciAoZS5nLiwgYSB3b3JrZXItdGhyZWFkIGJyaWRnZSkuXG4gIGNvbnN0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSA9IGF3YWl0IGltcG9ydCgnLi4vcnVubmVyL0Zsb3dDaGFydEV4ZWN1dG9yLmpzJyk7XG4gIC8vIFRoZSBleGVjdXRvciBleHBlY3RzIGFuIHVua25vd24tdHlwZWQgRmxvd0NoYXJ0OyBjYXN0IGF0IHRoZSBib3VuZGFyeVxuICAvLyBzaW5jZSB0aGUgRmxvd0NoYXJ0IHNoYXBlIGlzIGdlbmVyaWMtZXJhc2VkIGF0IHRoZSBkZXRhY2ggbGV2ZWwuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoaWxkIGFzIGFueSk7XG4gIHJldHVybiBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbn07XG4iXX0=
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * detach/spawn.ts — One-call detach primitive used by both scope and
4
+ * executor surfaces.
5
+ *
6
+ * Pattern: Facade (GoF). Hides driver invocation + refId minting +
7
+ * registry registration behind two named functions
8
+ * (`detachAndJoinLater`, `detachAndForget`). Same helper is
9
+ * called from `scope.$detachAndJoinLater(...)` and from
10
+ * `executor.detachAndJoinLater(...)` — single source of truth.
11
+ *
12
+ * Why a separate module:
13
+ * - Avoids duplicating the "validate driver, mint refId, call schedule"
14
+ * sequence in both scope and executor entry points
15
+ * - Keeps the scope/executor files free of driver knowledge — they
16
+ * just call this and forward the result
17
+ *
18
+ * refId scheme:
19
+ * - When the caller is a stage (scope path): refId = `${runtimeStageId}:detach:${counter}`
20
+ * — the runtimeStageId prefix lets diagnostics correlate the handle
21
+ * back to the source stage
22
+ * - When the caller is bare executor (executor path):
23
+ * refId = `__executor__:detach:${counter}` — uniform "no source stage"
24
+ * marker
25
+ * - Counter is module-private + monotonic for the process lifetime —
26
+ * safe across re-entrant detach calls
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.detachAndForget = exports.detachAndJoinLater = exports._resetSpawnCounterForTests = void 0;
30
+ let counter = 0;
31
+ /** Reset the counter for tests — never call from production code. */
32
+ function _resetSpawnCounterForTests() {
33
+ counter = 0;
34
+ }
35
+ exports._resetSpawnCounterForTests = _resetSpawnCounterForTests;
36
+ /**
37
+ * Mint a refId. Format: `${prefix}:detach:${counter}`. The prefix carries
38
+ * source-stage provenance (or `__executor__` when there is none).
39
+ */
40
+ function mintRefId(prefix) {
41
+ counter += 1;
42
+ return `${prefix}:detach:${counter}`;
43
+ }
44
+ /**
45
+ * Schedule `child` on the given driver, with the consumer's `input`,
46
+ * and return the resulting `DetachHandle`. Callers can `wait()` on it,
47
+ * read its `.status` property, or just hold the reference for later.
48
+ *
49
+ * **Joinable variant** — the caller wants to be able to await the result
50
+ * (or check its status). The `forget` variant simply discards the handle.
51
+ *
52
+ * @param driver - The driver implementation to use. Required (no
53
+ * library-default — passing it explicitly avoids global state and
54
+ * keeps the engine free of driver imports).
55
+ * @param child - The child flowchart to run.
56
+ * @param input - The input to hand to the child's run() call.
57
+ * @param sourcePrefix - Refix prefix for the minted refId; pass the
58
+ * parent's `runtimeStageId` from a stage caller, or `'__executor__'`
59
+ * from a bare-executor caller.
60
+ */
61
+ function detachAndJoinLater(driver, child, input, sourcePrefix) {
62
+ if (!driver || typeof driver.schedule !== 'function') {
63
+ throw new TypeError(`[detach] expected a DetachDriver as the first argument; got ${typeof driver}. ` +
64
+ "Pass e.g. `microtaskBatchDriver` from 'footprintjs/detach'.");
65
+ }
66
+ const refId = mintRefId(sourcePrefix);
67
+ return driver.schedule(child, input, refId);
68
+ }
69
+ exports.detachAndJoinLater = detachAndJoinLater;
70
+ /**
71
+ * Same as `detachAndJoinLater` but discards the handle. Use when the
72
+ * caller doesn't care about the result and doesn't need to await — e.g.,
73
+ * fire-and-forget telemetry exports.
74
+ *
75
+ * The handle still exists internally (driver creates it, registry holds
76
+ * it briefly) — but the caller cannot reference it. This is intentional:
77
+ * having no handle reference is what gives "forget" its semantic — there
78
+ * is no chance of the caller accidentally awaiting it.
79
+ *
80
+ * Errors raised by the child are STILL routed to the handle's failed
81
+ * state (the driver does that). They just go unobserved unless something
82
+ * else (a recorder, logging) is wired to surface them. See the docs in
83
+ * T7 for recommended observability patterns for "forget" detach.
84
+ */
85
+ function detachAndForget(driver, child, input, sourcePrefix) {
86
+ // Reuse the joinable path — the caller just chooses not to keep the
87
+ // returned handle. We don't even bind it to a variable to make the
88
+ // "forget" semantic explicit at the call site.
89
+ detachAndJoinLater(driver, child, input, sourcePrefix);
90
+ }
91
+ exports.detachAndForget = detachAndForget;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC9zcGF3bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7OztBQUtILElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVoQixxRUFBcUU7QUFDckUsU0FBZ0IsMEJBQTBCO0lBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRkQsZ0VBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUFjO0lBQy9CLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDYixPQUFPLEdBQUcsTUFBTSxXQUFXLE9BQU8sRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxNQUFvQixFQUNwQixLQUFnQixFQUNoQixLQUFjLEVBQ2QsWUFBb0I7SUFFcEIsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLFNBQVMsQ0FDakIsK0RBQStELE9BQU8sTUFBTSxJQUFJO1lBQzlFLDZEQUE2RCxDQUNoRSxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBZEQsZ0RBY0M7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxNQUFvQixFQUFFLEtBQWdCLEVBQUUsS0FBYyxFQUFFLFlBQW9CO0lBQzFHLG9FQUFvRTtJQUNwRSxtRUFBbUU7SUFDbkUsK0NBQStDO0lBQy9DLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFMRCwwQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL3NwYXduLnRzIOKAlCBPbmUtY2FsbCBkZXRhY2ggcHJpbWl0aXZlIHVzZWQgYnkgYm90aCBzY29wZSBhbmRcbiAqIGV4ZWN1dG9yIHN1cmZhY2VzLlxuICpcbiAqIFBhdHRlcm46ICBGYWNhZGUgKEdvRikuIEhpZGVzIGRyaXZlciBpbnZvY2F0aW9uICsgcmVmSWQgbWludGluZyArXG4gKiAgICAgICAgICAgcmVnaXN0cnkgcmVnaXN0cmF0aW9uIGJlaGluZCB0d28gbmFtZWQgZnVuY3Rpb25zXG4gKiAgICAgICAgICAgKGBkZXRhY2hBbmRKb2luTGF0ZXJgLCBgZGV0YWNoQW5kRm9yZ2V0YCkuIFNhbWUgaGVscGVyIGlzXG4gKiAgICAgICAgICAgY2FsbGVkIGZyb20gYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWAgYW5kIGZyb21cbiAqICAgICAgICAgICBgZXhlY3V0b3IuZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIOKAlCBzaW5nbGUgc291cmNlIG9mIHRydXRoLlxuICpcbiAqIFdoeSBhIHNlcGFyYXRlIG1vZHVsZTpcbiAqICAgLSBBdm9pZHMgZHVwbGljYXRpbmcgdGhlIFwidmFsaWRhdGUgZHJpdmVyLCBtaW50IHJlZklkLCBjYWxsIHNjaGVkdWxlXCJcbiAqICAgICBzZXF1ZW5jZSBpbiBib3RoIHNjb3BlIGFuZCBleGVjdXRvciBlbnRyeSBwb2ludHNcbiAqICAgLSBLZWVwcyB0aGUgc2NvcGUvZXhlY3V0b3IgZmlsZXMgZnJlZSBvZiBkcml2ZXIga25vd2xlZGdlIOKAlCB0aGV5XG4gKiAgICAganVzdCBjYWxsIHRoaXMgYW5kIGZvcndhcmQgdGhlIHJlc3VsdFxuICpcbiAqIHJlZklkIHNjaGVtZTpcbiAqICAgLSBXaGVuIHRoZSBjYWxsZXIgaXMgYSBzdGFnZSAoc2NvcGUgcGF0aCk6IHJlZklkID0gYCR7cnVudGltZVN0YWdlSWR9OmRldGFjaDoke2NvdW50ZXJ9YFxuICogICAgIOKAlCB0aGUgcnVudGltZVN0YWdlSWQgcHJlZml4IGxldHMgZGlhZ25vc3RpY3MgY29ycmVsYXRlIHRoZSBoYW5kbGVcbiAqICAgICBiYWNrIHRvIHRoZSBzb3VyY2Ugc3RhZ2VcbiAqICAgLSBXaGVuIHRoZSBjYWxsZXIgaXMgYmFyZSBleGVjdXRvciAoZXhlY3V0b3IgcGF0aCk6XG4gKiAgICAgcmVmSWQgPSBgX19leGVjdXRvcl9fOmRldGFjaDoke2NvdW50ZXJ9YCDigJQgdW5pZm9ybSBcIm5vIHNvdXJjZSBzdGFnZVwiXG4gKiAgICAgbWFya2VyXG4gKiAgIC0gQ291bnRlciBpcyBtb2R1bGUtcHJpdmF0ZSArIG1vbm90b25pYyBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUg4oCUXG4gKiAgICAgc2FmZSBhY3Jvc3MgcmUtZW50cmFudCBkZXRhY2ggY2FsbHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBEZXRhY2hEcml2ZXIsIERldGFjaEhhbmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5sZXQgY291bnRlciA9IDA7XG5cbi8qKiBSZXNldCB0aGUgY291bnRlciBmb3IgdGVzdHMg4oCUIG5ldmVyIGNhbGwgZnJvbSBwcm9kdWN0aW9uIGNvZGUuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0U3Bhd25Db3VudGVyRm9yVGVzdHMoKTogdm9pZCB7XG4gIGNvdW50ZXIgPSAwO1xufVxuXG4vKipcbiAqIE1pbnQgYSByZWZJZC4gRm9ybWF0OiBgJHtwcmVmaXh9OmRldGFjaDoke2NvdW50ZXJ9YC4gVGhlIHByZWZpeCBjYXJyaWVzXG4gKiBzb3VyY2Utc3RhZ2UgcHJvdmVuYW5jZSAob3IgYF9fZXhlY3V0b3JfX2Agd2hlbiB0aGVyZSBpcyBub25lKS5cbiAqL1xuZnVuY3Rpb24gbWludFJlZklkKHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY291bnRlciArPSAxO1xuICByZXR1cm4gYCR7cHJlZml4fTpkZXRhY2g6JHtjb3VudGVyfWA7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYGNoaWxkYCBvbiB0aGUgZ2l2ZW4gZHJpdmVyLCB3aXRoIHRoZSBjb25zdW1lcidzIGBpbnB1dGAsXG4gKiBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgYERldGFjaEhhbmRsZWAuIENhbGxlcnMgY2FuIGB3YWl0KClgIG9uIGl0LFxuICogcmVhZCBpdHMgYC5zdGF0dXNgIHByb3BlcnR5LCBvciBqdXN0IGhvbGQgdGhlIHJlZmVyZW5jZSBmb3IgbGF0ZXIuXG4gKlxuICogKipKb2luYWJsZSB2YXJpYW50Kiog4oCUIHRoZSBjYWxsZXIgd2FudHMgdG8gYmUgYWJsZSB0byBhd2FpdCB0aGUgcmVzdWx0XG4gKiAob3IgY2hlY2sgaXRzIHN0YXR1cykuIFRoZSBgZm9yZ2V0YCB2YXJpYW50IHNpbXBseSBkaXNjYXJkcyB0aGUgaGFuZGxlLlxuICpcbiAqIEBwYXJhbSBkcml2ZXIgLSBUaGUgZHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gUmVxdWlyZWQgKG5vXG4gKiAgIGxpYnJhcnktZGVmYXVsdCDigJQgcGFzc2luZyBpdCBleHBsaWNpdGx5IGF2b2lkcyBnbG9iYWwgc3RhdGUgYW5kXG4gKiAgIGtlZXBzIHRoZSBlbmdpbmUgZnJlZSBvZiBkcml2ZXIgaW1wb3J0cykuXG4gKiBAcGFyYW0gY2hpbGQgLSBUaGUgY2hpbGQgZmxvd2NoYXJ0IHRvIHJ1bi5cbiAqIEBwYXJhbSBpbnB1dCAtIFRoZSBpbnB1dCB0byBoYW5kIHRvIHRoZSBjaGlsZCdzIHJ1bigpIGNhbGwuXG4gKiBAcGFyYW0gc291cmNlUHJlZml4IC0gUmVmaXggcHJlZml4IGZvciB0aGUgbWludGVkIHJlZklkOyBwYXNzIHRoZVxuICogICBwYXJlbnQncyBgcnVudGltZVN0YWdlSWRgIGZyb20gYSBzdGFnZSBjYWxsZXIsIG9yIGAnX19leGVjdXRvcl9fJ2BcbiAqICAgZnJvbSBhIGJhcmUtZXhlY3V0b3IgY2FsbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0YWNoQW5kSm9pbkxhdGVyKFxuICBkcml2ZXI6IERldGFjaERyaXZlcixcbiAgY2hpbGQ6IEZsb3dDaGFydCxcbiAgaW5wdXQ6IHVua25vd24sXG4gIHNvdXJjZVByZWZpeDogc3RyaW5nLFxuKTogRGV0YWNoSGFuZGxlIHtcbiAgaWYgKCFkcml2ZXIgfHwgdHlwZW9mIGRyaXZlci5zY2hlZHVsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgW2RldGFjaF0gZXhwZWN0ZWQgYSBEZXRhY2hEcml2ZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50OyBnb3QgJHt0eXBlb2YgZHJpdmVyfS4gYCArXG4gICAgICAgIFwiUGFzcyBlLmcuIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJy5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlZklkID0gbWludFJlZklkKHNvdXJjZVByZWZpeCk7XG4gIHJldHVybiBkcml2ZXIuc2NoZWR1bGUoY2hpbGQsIGlucHV0LCByZWZJZCk7XG59XG5cbi8qKlxuICogU2FtZSBhcyBgZGV0YWNoQW5kSm9pbkxhdGVyYCBidXQgZGlzY2FyZHMgdGhlIGhhbmRsZS4gVXNlIHdoZW4gdGhlXG4gKiBjYWxsZXIgZG9lc24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQgYW5kIGRvZXNuJ3QgbmVlZCB0byBhd2FpdCDigJQgZS5nLixcbiAqIGZpcmUtYW5kLWZvcmdldCB0ZWxlbWV0cnkgZXhwb3J0cy5cbiAqXG4gKiBUaGUgaGFuZGxlIHN0aWxsIGV4aXN0cyBpbnRlcm5hbGx5IChkcml2ZXIgY3JlYXRlcyBpdCwgcmVnaXN0cnkgaG9sZHNcbiAqIGl0IGJyaWVmbHkpIOKAlCBidXQgdGhlIGNhbGxlciBjYW5ub3QgcmVmZXJlbmNlIGl0LiBUaGlzIGlzIGludGVudGlvbmFsOlxuICogaGF2aW5nIG5vIGhhbmRsZSByZWZlcmVuY2UgaXMgd2hhdCBnaXZlcyBcImZvcmdldFwiIGl0cyBzZW1hbnRpYyDigJQgdGhlcmVcbiAqIGlzIG5vIGNoYW5jZSBvZiB0aGUgY2FsbGVyIGFjY2lkZW50YWxseSBhd2FpdGluZyBpdC5cbiAqXG4gKiBFcnJvcnMgcmFpc2VkIGJ5IHRoZSBjaGlsZCBhcmUgU1RJTEwgcm91dGVkIHRvIHRoZSBoYW5kbGUncyBmYWlsZWRcbiAqIHN0YXRlICh0aGUgZHJpdmVyIGRvZXMgdGhhdCkuIFRoZXkganVzdCBnbyB1bm9ic2VydmVkIHVubGVzcyBzb21ldGhpbmdcbiAqIGVsc2UgKGEgcmVjb3JkZXIsIGxvZ2dpbmcpIGlzIHdpcmVkIHRvIHN1cmZhY2UgdGhlbS4gU2VlIHRoZSBkb2NzIGluXG4gKiBUNyBmb3IgcmVjb21tZW5kZWQgb2JzZXJ2YWJpbGl0eSBwYXR0ZXJucyBmb3IgXCJmb3JnZXRcIiBkZXRhY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRhY2hBbmRGb3JnZXQoZHJpdmVyOiBEZXRhY2hEcml2ZXIsIGNoaWxkOiBGbG93Q2hhcnQsIGlucHV0OiB1bmtub3duLCBzb3VyY2VQcmVmaXg6IHN0cmluZyk6IHZvaWQge1xuICAvLyBSZXVzZSB0aGUgam9pbmFibGUgcGF0aCDigJQgdGhlIGNhbGxlciBqdXN0IGNob29zZXMgbm90IHRvIGtlZXAgdGhlXG4gIC8vIHJldHVybmVkIGhhbmRsZS4gV2UgZG9uJ3QgZXZlbiBiaW5kIGl0IHRvIGEgdmFyaWFibGUgdG8gbWFrZSB0aGVcbiAgLy8gXCJmb3JnZXRcIiBzZW1hbnRpYyBleHBsaWNpdCBhdCB0aGUgY2FsbCBzaXRlLlxuICBkZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHNvdXJjZVByZWZpeCk7XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * detach/types.ts — Type definitions for the fire-and-forget primitive.
4
+ *
5
+ * Pattern: Strategy + Bridge (GoF). Same shape as cache strategies in
6
+ * agentfootprint v2.6 — ONE interface, N concrete drivers,
7
+ * consumer picks via explicit import.
8
+ * Role: Foundation. Every other detach file imports from here.
9
+ * This is the lockable contract; downstream files implement it.
10
+ *
11
+ * Two sibling concepts:
12
+ *
13
+ * 1. `DetachDriver` — the algorithm that decides WHEN/HOW the work runs.
14
+ * Six built-in algorithms ship as algorithm-named exports
15
+ * (`microtaskBatchDriver`, `setImmediateDriver`, `sendBeaconDriver`,
16
+ * `setTimeoutDriver`, `immediateDriver`, `workerThreadDriver`).
17
+ * Consumers can implement their own (BYOS — bring your own driver).
18
+ *
19
+ * 2. `DetachHandle` — the consumer-facing handle returned by
20
+ * `detachAndJoinLater`. Exposes status as PROPERTIES (sync read)
21
+ * and `wait()` (Promise — opt-in async join). Style 2 from the
22
+ * panel review: properties for sync, single method for async.
23
+ *
24
+ * Naming policy (locked from naming review):
25
+ * - Public API uses simple verbs / properties (product-engineer friendly)
26
+ * - Internal class names CAN use CS terms (Scheduler, Continuation, etc.)
27
+ * - Drivers are algorithm-named (semantic at the algorithm level)
28
+ *
29
+ * Locked design decisions (panel review captured in
30
+ * `docs/inspiration/detach-primitive.md`):
31
+ * - Sync hot path; async only at flush boundaries
32
+ * - Errors → commitLog + typed event, NEVER thrown to parent
33
+ * - Scope isolation between parent and detached child
34
+ * - Lifecycle tied to executor disposal
35
+ * - Type-level rejection of `outputMapper` on detach options
36
+ */
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RldGFjaC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRldGFjaC90eXBlcy50cyDigJQgVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIGZpcmUtYW5kLWZvcmdldCBwcmltaXRpdmUuXG4gKlxuICogUGF0dGVybjogIFN0cmF0ZWd5ICsgQnJpZGdlIChHb0YpLiBTYW1lIHNoYXBlIGFzIGNhY2hlIHN0cmF0ZWdpZXMgaW5cbiAqICAgICAgICAgICBhZ2VudGZvb3RwcmludCB2Mi42IOKAlCBPTkUgaW50ZXJmYWNlLCBOIGNvbmNyZXRlIGRyaXZlcnMsXG4gKiAgICAgICAgICAgY29uc3VtZXIgcGlja3MgdmlhIGV4cGxpY2l0IGltcG9ydC5cbiAqIFJvbGU6ICAgICBGb3VuZGF0aW9uLiBFdmVyeSBvdGhlciBkZXRhY2ggZmlsZSBpbXBvcnRzIGZyb20gaGVyZS5cbiAqICAgICAgICAgICBUaGlzIGlzIHRoZSBsb2NrYWJsZSBjb250cmFjdDsgZG93bnN0cmVhbSBmaWxlcyBpbXBsZW1lbnQgaXQuXG4gKlxuICogVHdvIHNpYmxpbmcgY29uY2VwdHM6XG4gKlxuICogICAxLiBgRGV0YWNoRHJpdmVyYCDigJQgdGhlIGFsZ29yaXRobSB0aGF0IGRlY2lkZXMgV0hFTi9IT1cgdGhlIHdvcmsgcnVucy5cbiAqICAgICAgU2l4IGJ1aWx0LWluIGFsZ29yaXRobXMgc2hpcCBhcyBhbGdvcml0aG0tbmFtZWQgZXhwb3J0c1xuICogICAgICAoYG1pY3JvdGFza0JhdGNoRHJpdmVyYCwgYHNldEltbWVkaWF0ZURyaXZlcmAsIGBzZW5kQmVhY29uRHJpdmVyYCxcbiAqICAgICAgYHNldFRpbWVvdXREcml2ZXJgLCBgaW1tZWRpYXRlRHJpdmVyYCwgYHdvcmtlclRocmVhZERyaXZlcmApLlxuICogICAgICBDb25zdW1lcnMgY2FuIGltcGxlbWVudCB0aGVpciBvd24gKEJZT1Mg4oCUIGJyaW5nIHlvdXIgb3duIGRyaXZlcikuXG4gKlxuICogICAyLiBgRGV0YWNoSGFuZGxlYCDigJQgdGhlIGNvbnN1bWVyLWZhY2luZyBoYW5kbGUgcmV0dXJuZWQgYnlcbiAqICAgICAgYGRldGFjaEFuZEpvaW5MYXRlcmAuIEV4cG9zZXMgc3RhdHVzIGFzIFBST1BFUlRJRVMgKHN5bmMgcmVhZClcbiAqICAgICAgYW5kIGB3YWl0KClgIChQcm9taXNlIOKAlCBvcHQtaW4gYXN5bmMgam9pbikuIFN0eWxlIDIgZnJvbSB0aGVcbiAqICAgICAgcGFuZWwgcmV2aWV3OiBwcm9wZXJ0aWVzIGZvciBzeW5jLCBzaW5nbGUgbWV0aG9kIGZvciBhc3luYy5cbiAqXG4gKiBOYW1pbmcgcG9saWN5IChsb2NrZWQgZnJvbSBuYW1pbmcgcmV2aWV3KTpcbiAqICAgLSBQdWJsaWMgQVBJIHVzZXMgc2ltcGxlIHZlcmJzIC8gcHJvcGVydGllcyAocHJvZHVjdC1lbmdpbmVlciBmcmllbmRseSlcbiAqICAgLSBJbnRlcm5hbCBjbGFzcyBuYW1lcyBDQU4gdXNlIENTIHRlcm1zIChTY2hlZHVsZXIsIENvbnRpbnVhdGlvbiwgZXRjLilcbiAqICAgLSBEcml2ZXJzIGFyZSBhbGdvcml0aG0tbmFtZWQgKHNlbWFudGljIGF0IHRoZSBhbGdvcml0aG0gbGV2ZWwpXG4gKlxuICogTG9ja2VkIGRlc2lnbiBkZWNpc2lvbnMgKHBhbmVsIHJldmlldyBjYXB0dXJlZCBpblxuICogYGRvY3MvaW5zcGlyYXRpb24vZGV0YWNoLXByaW1pdGl2ZS5tZGApOlxuICogICAtIFN5bmMgaG90IHBhdGg7IGFzeW5jIG9ubHkgYXQgZmx1c2ggYm91bmRhcmllc1xuICogICAtIEVycm9ycyDihpIgY29tbWl0TG9nICsgdHlwZWQgZXZlbnQsIE5FVkVSIHRocm93biB0byBwYXJlbnRcbiAqICAgLSBTY29wZSBpc29sYXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGRldGFjaGVkIGNoaWxkXG4gKiAgIC0gTGlmZWN5Y2xlIHRpZWQgdG8gZXhlY3V0b3IgZGlzcG9zYWxcbiAqICAgLSBUeXBlLWxldmVsIHJlamVjdGlvbiBvZiBgb3V0cHV0TWFwcGVyYCBvbiBkZXRhY2ggb3B0aW9uc1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgOKUgCBEZXRhY2hIYW5kbGUg4oCUIHdoYXQgdGhlIGNvbnN1bWVyIGdldHMgYmFjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTbmFwc2hvdCBvZiBhIGRldGFjaGVkIGhhbmRsZSdzIHN0YXRlLiBSZXR1cm5lZCBieSBgaGFuZGxlLnBvbGwoKWBcbiAqICh3aGVuIGFkZGVkIGluIGEgZm9sbG93LXVwOyB2MSBleHBvc2VzIHByb3BlcnRpZXMgZGlyZWN0bHkgb25cbiAqIGBEZXRhY2hIYW5kbGVgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRhY2hQb2xsUmVzdWx0IHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBEZXRhY2hIYW5kbGVbJ3N0YXR1cyddO1xuICAvKiogUHJlc2VudCBpZmYgc3RhdHVzID09PSAnZG9uZScuICovXG4gIHJlYWRvbmx5IHJlc3VsdD86IHVua25vd247XG4gIC8qKiBQcmVzZW50IGlmZiBzdGF0dXMgPT09ICdmYWlsZWQnLiAqL1xuICByZWFkb25seSBlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIFJlc3VsdCBkZWxpdmVyZWQgd2hlbiB0aGUgaGFuZGxlJ3MgYHdhaXQoKWAgUHJvbWlzZSByZXNvbHZlc1xuICogc3VjY2Vzc2Z1bGx5IChzdGF0dXMgcmVhY2hlZCAnZG9uZScpLiBSZWplY3Rpb24gZGVsaXZlcnMgdGhlXG4gKiBuYXRpdmUgYEVycm9yYCBkaXJlY3RseSDigJQgbm8gd3JhcHBpbmcgc2hhcGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV0YWNoV2FpdFJlc3VsdCB7XG4gIHJlYWRvbmx5IHJlc3VsdDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBIYW5kbGUgcmV0dXJuZWQgYnkgYGNoYXJ0LmRldGFjaEFuZEpvaW5MYXRlciguLi4pYCBhbmRcbiAqIGBleGVjdXRvci5kZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWAuIEV4cG9zZXMgc3RhdHVzIGFzIFBST1BFUlRJRVMgc29cbiAqIHN5bmMgYWNjZXNzIGlzIHByb3BlcnR5LXJlYWQgKGNoZWFwLCBubyBhbGxvY2F0aW9uKS4gVGhlIHNpbmdsZVxuICogbWV0aG9kIGB3YWl0KClgIHJldHVybnMgYSBQcm9taXNlIGZvciBvcHQtaW4gYXN5bmMgam9pbi5cbiAqXG4gKiBUaGUgaGFuZGxlIGlzICoqbm90KiogUHJvbWlzZS1zaGFwZWQgKG5vIGAudGhlbigpYCkg4oCUIHRoYXQgd291bGRcbiAqIG1ha2UgaXQgYWNjaWRlbnRhbGx5IGF3YWl0YWJsZSwgZGVmZWF0aW5nIHRoZSBmaXJlLWFuZC1mb3JnZXRcbiAqIHNlbWFudGljcy4gVG8gYXdhaXQsIHRoZSBjb25zdW1lciBtdXN0IGNhbGwgYC53YWl0KClgIGV4cGxpY2l0bHkuXG4gKlxuICogTGlmZWN5Y2xlOlxuICpcbiAqICAgcXVldWVkICDihpIgZHJpdmVyIHJlY2VpdmVkIHRoZSB3b3JrLCBoYXNuJ3Qgc3RhcnRlZCBpdFxuICogICBydW5uaW5nIOKGkiBkcml2ZXIgc3RhcnRlZCB0aGUgd29ya1xuICogICBkb25lICAgIOKGkiB0ZXJtaW5hbDogcmVzdWx0IGF2YWlsYWJsZVxuICogICBmYWlsZWQgIOKGkiB0ZXJtaW5hbDogZXJyb3IgYXZhaWxhYmxlXG4gKlxuICogYGRvbmVgIGFuZCBgZmFpbGVkYCBhcmUgVEVSTUlOQUwg4oCUIG9uY2UgcmVhY2hlZCwgc3RhdHVzIG5ldmVyXG4gKiBjaGFuZ2VzIGFnYWluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldGFjaEhhbmRsZSB7XG4gIC8qKiBTdGFibGUgaWQgYXNzaWduZWQgYXQgZGV0YWNoIHRpbWUuIFVzZWQgYXMgdGhlIGxvb2t1cCBrZXkgaW5cbiAgICogIGBkZXRhY2hSZWdpc3RyeWAgYW5kIGFzIHRoZSBzY29wZS1zdG9yYWdlIGtleSBwcmVmaXguICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqIEN1cnJlbnQgc3RhdGUuIFJlYWQgZGlyZWN0bHkgZm9yIHN5bmMgYWNjZXNzLiAqL1xuICByZWFkb25seSBzdGF0dXM6ICdxdWV1ZWQnIHwgJ3J1bm5pbmcnIHwgJ2RvbmUnIHwgJ2ZhaWxlZCc7XG5cbiAgLyoqIFRoZSB3b3JrJ3MgcmVzdWx0LiBQcmVzZW50IGlmZiBgc3RhdHVzID09PSAnZG9uZSdgLiBSZWFkaW5nXG4gICAqICBiZWZvcmUgdGVybWluYWwgcmV0dXJucyBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZG9ubHkgcmVzdWx0PzogdW5rbm93bjtcblxuICAvKiogVGhlIHdvcmsncyBlcnJvci4gUHJlc2VudCBpZmYgYHN0YXR1cyA9PT0gJ2ZhaWxlZCdgLiBSZWFkaW5nXG4gICAqICBiZWZvcmUgdGVybWluYWwgcmV0dXJucyBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcblxuICAvKipcbiAgICogT3B0LWluIGFzeW5jIGpvaW4uIFJldHVybnMgYSBQcm9taXNlIHRoYXQ6XG4gICAqICAgLSByZXNvbHZlcyB3aXRoIGB7IHJlc3VsdCB9YCB3aGVuIHN0YXR1cyBiZWNvbWVzICdkb25lJ1xuICAgKiAgIC0gcmVqZWN0cyB3aXRoIHRoZSBjYXB0dXJlZCBgRXJyb3JgIHdoZW4gc3RhdHVzIGJlY29tZXMgJ2ZhaWxlZCdcbiAgICogICAtIHJlc29sdmVzL3JlamVjdHMgSU1NRURJQVRFTFkgaWYgc3RhdHVzIGlzIGFscmVhZHkgdGVybWluYWxcbiAgICogICAtIHJldHVybnMgdGhlIFNBTUUgY2FjaGVkIFByb21pc2Ugb24gcmVwZWF0ZWQgY2FsbHMgKG5vXG4gICAqICAgICByZS1ydW5uaW5nLCBubyBkdXBsaWNhdGVkIEkvTylcbiAgICpcbiAgICogQ2FsbGluZyBgd2FpdCgpYCBkb2VzIE5PVCBjaGFuZ2UgdGhlIGhhbmRsZSdzIGxpZmVjeWNsZSDigJQgaXQnc1xuICAgKiBwYXNzaXZlIG9ic2VydmF0aW9uLiBJZiBuZXZlciBjYWxsZWQsIHRoZSB3b3JrIHN0aWxsIGNvbXBsZXRlcztcbiAgICogdGhlIGhhbmRsZSBqdXN0IGdvZXMgdW5jb2xsZWN0ZWQgKHBhcmVudCBleGVjdXRpb24gdW5hZmZlY3RlZCkuXG4gICAqXG4gICAqIFVzZSB3aGVuOlxuICAgKiAgIC0gWW91IGFjdHVhbGx5IG5lZWQgdGhlIHJlc3VsdCBhbmQgd2FudCB0byBhd2FpdCBpdFxuICAgKiAgIC0gQ29vcmRpbmF0aW5nIG11bHRpcGxlIGhhbmRsZXMgdmlhIFByb21pc2UuYWxsIC8gUHJvbWlzZS5yYWNlXG4gICAqICAgLSBCYWNrcHJlc3N1cmUgKFwiZG9uJ3QgZmlyZSBtb3JlIHRoYW4gTiBpbiBmbGlnaHRcIilcbiAgICpcbiAgICogRG9uJ3QgdXNlIHdoZW46XG4gICAqICAgLSBQdXJlIGZpcmUtYW5kLWZvcmdldCAodXNlIGBkZXRhY2hBbmRGb3JnZXRgIOKAlCBubyBoYW5kbGUgcmV0dXJuZWQpXG4gICAqICAgLSBZb3UganVzdCB3YW50IHRvIGNoZWNrIHN0YXR1cyAocmVhZCBgaGFuZGxlLnN0YXR1c2AgZGlyZWN0bHkpXG4gICAqL1xuICB3YWl0KCk6IFByb21pc2U8RGV0YWNoV2FpdFJlc3VsdD47XG59XG5cbi8vIOKUgOKUgOKUgCBEZXRhY2hEcml2ZXIg4oCUIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIENhcGFiaWxpdGllcyBhIGRyaXZlciBkZWNsYXJlcy4gRHJpdmVzIHRoZSBydW50aW1lIGRlY2lzaW9uIG9mXG4gKiBcImlzIHRoaXMgZHJpdmVyIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudD9cIiBDb25zdW1lcnNcbiAqIGluc3BlY3QgYXQgY29uc3RydWN0aW9uOyB0aGUgZnJhbWV3b3JrIGRvZXNuJ3QgZW5mb3JjZS5cbiAqXG4gKiBBbGwgY2FwYWJpbGl0aWVzIGFyZSBvcHRpb25hbCBmbGFncyDigJQgZmFsc2UgLyB1bmRlZmluZWQgbWVhbnMgXCJub3RcbiAqIHN1cHBvcnRlZCAvIG5vIGNsYWltLlwiIEEgZHJpdmVyIHRoYXQgc3VwcG9ydHMgZXZlcnl0aGluZyBzZXRzIGFsbFxuICogdG8gdHJ1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcml2ZXJDYXBhYmlsaXRpZXMge1xuICAvKiogRHJpdmVyIHdvcmtzIGluIGJyb3dzZXIgZW52aXJvbm1lbnRzICh3aW5kb3csIGRvY3VtZW50LCBldGMuKS4gKi9cbiAgcmVhZG9ubHkgYnJvd3NlclNhZmU/OiBib29sZWFuO1xuICAvKiogRHJpdmVyIHdvcmtzIGluIE5vZGUuanMgZW52aXJvbm1lbnRzLiAqL1xuICByZWFkb25seSBub2RlU2FmZT86IGJvb2xlYW47XG4gIC8qKiBEcml2ZXIgd29ya3MgaW4gZWRnZSBydW50aW1lcyAoQ2xvdWRmbGFyZSBXb3JrZXJzLCBEZW5vIERlcGxveSxcbiAgICogIEJ1biBlZGdlLCBldGMuIOKAlCByZXN0cmljdGVkIGVudmlyb25tZW50cykuICovXG4gIHJlYWRvbmx5IGVkZ2VTYWZlPzogYm9vbGVhbjtcbiAgLyoqIFdvcmsgc3Vydml2ZXMgcGFnZS11bmxvYWQgLyBwcm9jZXNzLWV4aXQuIGUuZy4sXG4gICAqICBgc2VuZEJlYWNvbkRyaXZlcmAgc2NoZWR1bGVzIHZpYSBgbmF2aWdhdG9yLnNlbmRCZWFjb25gIHdoaWNoXG4gICAqICBzaGlwcyBldmVuIG9uIHRhYiBjbG9zZS4gKi9cbiAgcmVhZG9ubHkgc3Vydml2ZXNVbmxvYWQ/OiBib29sZWFuO1xuICAvKiogV29yayBydW5zIG9uIGEgc2VwYXJhdGUgT1MgdGhyZWFkIChubyBldmVudC1sb29wIGJsb2NrKS5cbiAgICogIGUuZy4sIGB3b3JrZXJUaHJlYWREcml2ZXJgLiAqL1xuICByZWFkb25seSBjcHVJc29sYXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBkcml2ZXIgaXMgdGhlIFdIRU4vSE9XIG9mIHRoZSBkZXRhY2guIE1hcHMgYChjaGlsZCwgaW5wdXQsIHJlZklkKWBcbiAqIHRvIGEgYERldGFjaEhhbmRsZWAgd2hvc2UgbGlmZWN5Y2xlIHRoZSBkcml2ZXIgb3ducy5cbiAqXG4gKiBEcml2ZXJzIGFyZSB0aGVtc2VsdmVzIGZvb3RwcmludGpzIHByaW1pdGl2ZXMg4oCUIGludGVybmFsbHkgdGhleSBtYXlcbiAqIGJlIGEgc2luZ2xlIGZ1bmN0aW9uIG9yIGEgbXVsdGktc3RhZ2UgZmxvd0NoYXJ0LiBFaXRoZXIgd2F5LCB0aGVcbiAqIGludGVyZmFjZSB0aGV5IGV4cG9zZSB0byBjb25zdW1lcnMgaXMgYHNjaGVkdWxlKC4uLilgLlxuICpcbiAqIERyaXZlcnMgTVVTVDpcbiAqICAgLSBSZXR1cm4gc3luY2hyb25vdXNseSAodGhlIGFnZW50IGxvb3AgbmV2ZXIgYmxvY2tzIG9uIHNjaGVkdWxlKVxuICogICAtIE5vdCB0aHJvdyDigJQgZXJyb3JzIGR1cmluZyBzY2hlZHVsaW5nIHJvdXRlIHRocm91Z2ggdGhlIGhhbmRsZVxuICogICAgIChgaGFuZGxlLnN0YXR1cyA9ICdmYWlsZWQnYCwgYGhhbmRsZS5lcnJvciA9IC4uLmApXG4gKiAgIC0gSG9ub3IgdGhlIHBhc3NpdmUtcmVjb3JkZXIgcnVsZTogdGhlIHBhcmVudCdzIGBkZXRhY2gqYCBjYWxsXG4gKiAgICAgbmV2ZXIgd2FpdHMgZm9yIHRoZSBkcml2ZXIncyBkZWZlcnJlZCB3b3JrIHRvIGNvbXBsZXRlXG4gKlxuICogRHJpdmVycyBNQVk6XG4gKiAgIC0gSW1wbGVtZW50IGB2YWxpZGF0ZSgpYCBmb3Igb25lLXRpbWUgY29uZmlndXJhdGlvbiBjaGVja3MgYXRcbiAqICAgICByZWdpc3RyYXRpb24gLyB1c2UgdGltZSAoZS5nLiwgYXNzZXJ0IGBuYXZpZ2F0b3Iuc2VuZEJlYWNvbmAgZXhpc3RzKVxuICogICAtIEJ1aWxkIHRoZWlyIGludGVybmFsIHBpcGVsaW5lIGFzIGEgZm9vdHByaW50anMgZmxvd0NoYXJ0IGZvclxuICogICAgIG9ic2VydmFiaWxpdHkg4oCUIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIG5vdCBjb25zdW1lci1mYWNpbmdcbiAqXG4gKiBAZXhhbXBsZSBCdWlsdC1pblxuICogICBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gKiAgIGNvbnN0IGhhbmRsZSA9IGRyaXZlci5zY2hlZHVsZShjaGlsZCwgaW5wdXQsIHJlZklkKTtcbiAqXG4gKiBAZXhhbXBsZSBDdXN0b20gKEJZT1MpXG4gKiAgIGNvbnN0IGxhbWJkYUV4dGVuc2lvbkRyaXZlcjogRGV0YWNoRHJpdmVyID0ge1xuICogICAgIG5hbWU6ICdsYW1iZGEtZXh0ZW5zaW9uJyxcbiAqICAgICBjYXBhYmlsaXRpZXM6IHsgbm9kZVNhZmU6IHRydWUsIHN1cnZpdmVzVW5sb2FkOiB0cnVlIH0sXG4gKiAgICAgc2NoZWR1bGUoY2hpbGQsIGlucHV0LCByZWZJZCkge1xuICogICAgICAgc2hhcmVkQnVmZmVyLnB1c2goeyByZWZJZCwgY2hpbGQsIGlucHV0IH0pO1xuICogICAgICAgcmV0dXJuIGNyZWF0ZUhhbmRsZShyZWZJZCwgJ3F1ZXVlZCcpO1xuICogICAgIH0sXG4gKiAgIH07XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV0YWNoRHJpdmVyIHtcbiAgLyoqIFN0YWJsZSBuYW1lIGZvciBkaWFnbm9zdGljcyArIHJlZ2lzdHJ5IGxvb2t1cC4gQ29udmVudGlvbmFsbHlcbiAgICogIGFsZ29yaXRobS1uYW1lZCAoZS5nLiBgJ21pY3JvdGFzay1iYXRjaCdgLCBgJ3NlbmQtYmVhY29uJ2ApLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFdoYXQgdGhpcyBkcml2ZXIgc3VwcG9ydHMuIFVzZWQgYnkgY29uc3VtZXJzIHRvIHBpY2sgdGhlIHJpZ2h0XG4gICAqICBkcml2ZXIgZm9yIHRoZWlyIGVudmlyb25tZW50LiAqL1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IERyaXZlckNhcGFiaWxpdGllcztcblxuICAvKipcbiAgICogSGFuZCB0aGUgd29yayB0byB0aGUgZHJpdmVyJ3Mgc2NoZWR1bGluZyBtZWNoYW5pc20uIE1VU1QgcmV0dXJuXG4gICAqIHN5bmNocm9ub3VzbHkgd2l0aCBhIGZyZXNoIGBEZXRhY2hIYW5kbGVgLiBUaGUgYWN0dWFsIHdvcmsgbWF5XG4gICAqIHJ1biBsYXRlciAobmV4dCBtaWNyb3Rhc2sgLyBzZXRJbW1lZGlhdGUgLyBicm93c2VyLWJlYWNvbi1mbHVzaCAvXG4gICAqIHdvcmtlci10aHJlYWQgLyBldGMuKSBvbiB0aGUgZHJpdmVyJ3MgY2hvc2VuIG1lY2hhbmlzbS5cbiAgICovXG4gIHNjaGVkdWxlKGNoaWxkOiBGbG93Q2hhcnQsIGlucHV0OiB1bmtub3duLCByZWZJZDogc3RyaW5nKTogRGV0YWNoSGFuZGxlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBvbmUtdGltZSB2YWxpZGF0aW9uIGhvb2suIENhbGxlZCBhdCBmaXJzdCB1c2UgKG9yXG4gICAqIHJlZ2lzdHJhdGlvbiB0aW1lLCBkZXBlbmRpbmcgb24gZHJpdmVyKSDigJQgZHJpdmVycyB0aHJvdyBpZiB0aGVpclxuICAgKiBjb25maWd1cmF0aW9uIGlzIGludmFsaWQgKG1pc3NpbmcgcGVlciBkZXAsIHVucmVhY2hhYmxlIGVuZHBvaW50LFxuICAgKiB3cm9uZyBBUEkga2V5IHNoYXBlLCBldGMuKS5cbiAgICpcbiAgICogRXhhbXBsZTogYHNlbmRCZWFjb25Ecml2ZXIudmFsaWRhdGUoKWAgY2hlY2tzXG4gICAqIGB0eXBlb2YgbmF2aWdhdG9yPy5zZW5kQmVhY29uID09PSAnZnVuY3Rpb24nYCBhbmQgdGhyb3dzIHdpdGggYVxuICAgKiBoZWxwZnVsIG1lc3NhZ2UgaWYgYWJzZW50IChlLmcuLCBpbiBOb2RlKS5cbiAgICpcbiAgICogUGVyIHRoZSBOZXcgUmVsaWMgcGFuZWwgcmV2aWV3OiBlYXJseS1mYWlsLXdpdGgtdXNlZnVsLW1lc3NhZ2VcbiAgICogYmVhdHMgc2lsZW50IHplcm8tZW1pc3Npb24uXG4gICAqL1xuICB2YWxpZGF0ZT8oKTogdm9pZDtcbn1cbiJdfQ==