@inhuman.tools/plexus-expectations 0.0.0-stage → 0.1.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 (160) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +144 -2
  3. package/dist/driver/ExpectationActor.d.ts +56 -0
  4. package/dist/driver/ExpectationActor.d.ts.map +1 -0
  5. package/dist/driver/ExpectationActor.js +210 -0
  6. package/dist/driver/ExpectationActor.js.map +1 -0
  7. package/dist/driver/PEWDriver.d.ts +144 -0
  8. package/dist/driver/PEWDriver.d.ts.map +1 -0
  9. package/dist/driver/PEWDriver.js +303 -0
  10. package/dist/driver/PEWDriver.js.map +1 -0
  11. package/dist/driver/PEWDriverConnection.d.ts +139 -0
  12. package/dist/driver/PEWDriverConnection.d.ts.map +1 -0
  13. package/dist/driver/PEWDriverConnection.js +298 -0
  14. package/dist/driver/PEWDriverConnection.js.map +1 -0
  15. package/dist/driver/actor-machine.d.ts +28 -0
  16. package/dist/driver/actor-machine.d.ts.map +1 -0
  17. package/dist/driver/actor-machine.js +50 -0
  18. package/dist/driver/actor-machine.js.map +1 -0
  19. package/dist/driver/connection-miss.d.ts +9 -0
  20. package/dist/driver/connection-miss.d.ts.map +1 -0
  21. package/dist/driver/connection-miss.js +13 -0
  22. package/dist/driver/connection-miss.js.map +1 -0
  23. package/dist/driver/index.d.ts +6 -0
  24. package/dist/driver/index.d.ts.map +1 -0
  25. package/dist/driver/index.js +5 -0
  26. package/dist/driver/index.js.map +1 -0
  27. package/dist/error-with-invariant.d.ts +9 -0
  28. package/dist/error-with-invariant.d.ts.map +1 -0
  29. package/dist/error-with-invariant.js +12 -0
  30. package/dist/error-with-invariant.js.map +1 -0
  31. package/dist/executor/index.d.ts +4 -0
  32. package/dist/executor/index.d.ts.map +1 -0
  33. package/dist/executor/index.js +4 -0
  34. package/dist/executor/index.js.map +1 -0
  35. package/dist/executor/kernel-intern.d.ts +16 -0
  36. package/dist/executor/kernel-intern.d.ts.map +1 -0
  37. package/dist/executor/kernel-intern.js +98 -0
  38. package/dist/executor/kernel-intern.js.map +1 -0
  39. package/dist/executor/orchestrator.d.ts +97 -0
  40. package/dist/executor/orchestrator.d.ts.map +1 -0
  41. package/dist/executor/orchestrator.js +465 -0
  42. package/dist/executor/orchestrator.js.map +1 -0
  43. package/dist/executor/types.d.ts +8 -0
  44. package/dist/executor/types.d.ts.map +1 -0
  45. package/dist/executor/types.js +2 -0
  46. package/dist/executor/types.js.map +1 -0
  47. package/dist/index.d.ts +2 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +2 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/schemas/connection.d.ts +4 -0
  52. package/dist/schemas/connection.d.ts.map +1 -0
  53. package/dist/schemas/connection.js +4 -0
  54. package/dist/schemas/connection.js.map +1 -0
  55. package/dist/schemas/index.d.ts +2 -0
  56. package/dist/schemas/index.d.ts.map +1 -0
  57. package/dist/schemas/index.js +2 -0
  58. package/dist/schemas/index.js.map +1 -0
  59. package/dist/shared/attention.d.ts +27 -0
  60. package/dist/shared/attention.d.ts.map +1 -0
  61. package/dist/shared/attention.js +116 -0
  62. package/dist/shared/attention.js.map +1 -0
  63. package/dist/shared/control.d.ts +4 -0
  64. package/dist/shared/control.d.ts.map +1 -0
  65. package/dist/shared/control.js +2 -0
  66. package/dist/shared/control.js.map +1 -0
  67. package/dist/shared/index.d.ts +7 -0
  68. package/dist/shared/index.d.ts.map +1 -0
  69. package/dist/shared/index.js +7 -0
  70. package/dist/shared/index.js.map +1 -0
  71. package/dist/shared/map-field-awareness.d.ts +19 -0
  72. package/dist/shared/map-field-awareness.d.ts.map +1 -0
  73. package/dist/shared/map-field-awareness.js +58 -0
  74. package/dist/shared/map-field-awareness.js.map +1 -0
  75. package/dist/shared/models/ApprovableExpectation.d.ts +15 -0
  76. package/dist/shared/models/ApprovableExpectation.d.ts.map +1 -0
  77. package/dist/shared/models/ApprovableExpectation.js +138 -0
  78. package/dist/shared/models/ApprovableExpectation.js.map +1 -0
  79. package/dist/shared/models/ConnectionSpec.d.ts +44 -0
  80. package/dist/shared/models/ConnectionSpec.d.ts.map +1 -0
  81. package/dist/shared/models/ConnectionSpec.js +180 -0
  82. package/dist/shared/models/ConnectionSpec.js.map +1 -0
  83. package/dist/shared/models/DriverSpec.d.ts +45 -0
  84. package/dist/shared/models/DriverSpec.d.ts.map +1 -0
  85. package/dist/shared/models/DriverSpec.js +221 -0
  86. package/dist/shared/models/DriverSpec.js.map +1 -0
  87. package/dist/shared/models/IntrospectingPlexusModel.d.ts +8 -0
  88. package/dist/shared/models/IntrospectingPlexusModel.d.ts.map +1 -0
  89. package/dist/shared/models/IntrospectingPlexusModel.js +48 -0
  90. package/dist/shared/models/IntrospectingPlexusModel.js.map +1 -0
  91. package/dist/shared/models/Job.d.ts +85 -0
  92. package/dist/shared/models/Job.d.ts.map +1 -0
  93. package/dist/shared/models/Job.js +261 -0
  94. package/dist/shared/models/Job.js.map +1 -0
  95. package/dist/shared/models/ProgrammaticJob.d.ts +6 -0
  96. package/dist/shared/models/ProgrammaticJob.d.ts.map +1 -0
  97. package/dist/shared/models/ProgrammaticJob.js +80 -0
  98. package/dist/shared/models/ProgrammaticJob.js.map +1 -0
  99. package/dist/shared/models/WorkContainer.d.ts +36 -0
  100. package/dist/shared/models/WorkContainer.d.ts.map +1 -0
  101. package/dist/shared/models/WorkContainer.js +140 -0
  102. package/dist/shared/models/WorkContainer.js.map +1 -0
  103. package/dist/shared/models/WorkExpectation.d.ts +63 -0
  104. package/dist/shared/models/WorkExpectation.d.ts.map +1 -0
  105. package/dist/shared/models/WorkExpectation.js +290 -0
  106. package/dist/shared/models/WorkExpectation.js.map +1 -0
  107. package/dist/shared/models/WorkExpectationWithIntrospection.d.ts +4 -0
  108. package/dist/shared/models/WorkExpectationWithIntrospection.d.ts.map +1 -0
  109. package/dist/shared/models/WorkExpectationWithIntrospection.js +28 -0
  110. package/dist/shared/models/WorkExpectationWithIntrospection.js.map +1 -0
  111. package/dist/shared/models/index.d.ts +7 -0
  112. package/dist/shared/models/index.d.ts.map +1 -0
  113. package/dist/shared/models/index.js +6 -0
  114. package/dist/shared/models/index.js.map +1 -0
  115. package/dist/shared/models/jsonRecord.d.ts +14 -0
  116. package/dist/shared/models/jsonRecord.d.ts.map +1 -0
  117. package/dist/shared/models/jsonRecord.js +46 -0
  118. package/dist/shared/models/jsonRecord.js.map +1 -0
  119. package/dist/shared/resolution.d.ts +39 -0
  120. package/dist/shared/resolution.d.ts.map +1 -0
  121. package/dist/shared/resolution.js +124 -0
  122. package/dist/shared/resolution.js.map +1 -0
  123. package/dist/shared/revalidation-demand.d.ts +27 -0
  124. package/dist/shared/revalidation-demand.d.ts.map +1 -0
  125. package/dist/shared/revalidation-demand.js +116 -0
  126. package/dist/shared/revalidation-demand.js.map +1 -0
  127. package/dist/shared/role.d.ts +12 -0
  128. package/dist/shared/role.d.ts.map +1 -0
  129. package/dist/shared/role.js +21 -0
  130. package/dist/shared/role.js.map +1 -0
  131. package/dist/shared/types.d.ts +43 -0
  132. package/dist/shared/types.d.ts.map +1 -0
  133. package/dist/shared/types.js +12 -0
  134. package/dist/shared/types.js.map +1 -0
  135. package/package.json +79 -3
  136. package/src/driver/ExpectationActor.ts +244 -0
  137. package/src/driver/PEWDriver.ts +302 -0
  138. package/src/driver/actor-machine.ts +54 -0
  139. package/src/driver/connection-miss.ts +13 -0
  140. package/src/driver/index.ts +5 -0
  141. package/src/executor/index.ts +3 -0
  142. package/src/executor/kernel-intern.ts +121 -0
  143. package/src/executor/orchestrator.ts +463 -0
  144. package/src/executor/types.ts +3 -0
  145. package/src/index.ts +1 -0
  146. package/src/schemas/connection.ts +4 -0
  147. package/src/schemas/index.ts +1 -0
  148. package/src/shared/control.ts +4 -0
  149. package/src/shared/index.ts +6 -0
  150. package/src/shared/map-field-awareness.ts +65 -0
  151. package/src/shared/models/ConnectionSpec.ts +84 -0
  152. package/src/shared/models/DriverSpec.ts +102 -0
  153. package/src/shared/models/Job.ts +192 -0
  154. package/src/shared/models/WorkContainer.ts +90 -0
  155. package/src/shared/models/WorkExpectation.ts +229 -0
  156. package/src/shared/models/index.ts +6 -0
  157. package/src/shared/models/jsonRecord.ts +49 -0
  158. package/src/shared/revalidation-demand.ts +121 -0
  159. package/src/shared/role.ts +32 -0
  160. package/src/shared/types.ts +57 -0
@@ -0,0 +1,85 @@
1
+ import { WorkContainer } from "./WorkContainer.js";
2
+ export type JobResolution<TValue, TReason> = {
3
+ readonly status: "fulfilled";
4
+ readonly value: TValue;
5
+ } | {
6
+ readonly status: "rejected";
7
+ readonly reason: TReason;
8
+ };
9
+ export type JobKind = "command" | "agent" | "bot" | "workflow";
10
+ /** Runtime that owns a job's effect. */
11
+ export type JobEffectOwner = "session-runtime" | "tool-runtime" | "scheme-runtime" | "agent-calls" | "honor";
12
+ /** What a restart does with a job whose outcome it cannot see. */
13
+ export type UnknownOutcomeRecovery = "resume-queued" | "resume-inner" | "unknown-no-replay";
14
+ export declare abstract class Job<TValue = unknown, TReason = unknown> extends WorkContainer implements Promise<TValue> {
15
+ #private;
16
+ /** Not this instantiation — a parent holds jobs with other fulfill and reject types. */
17
+ accessor children: Job<unknown, unknown>[];
18
+ accessor background: boolean;
19
+ accessor walkBoundary: boolean;
20
+ /** Guard return. `null` = phase 1 not done. */
21
+ accessor orchestrationResult: true | false | null;
22
+ /** Cancel fact. `false → true`. Not a deny and not a human approval. */
23
+ accessor cancelled: boolean;
24
+ /** This job's own work has finalized (ok or not). */
25
+ accessor completed: boolean;
26
+ /**
27
+ * Crash ending: the license guard or the executor body threw. Empty means
28
+ * no crash. The message is the fact; the host stamps a receipt from it and
29
+ * the job completes, so whoever joins the job is released with an outcome.
30
+ */
31
+ accessor crash: string;
32
+ /**
33
+ * Ordering as data: jobs that must be released before this one is claimed
34
+ * (license and body). Refs to earlier siblings, never a cycle. The
35
+ * orchestrator honours it on every pass, so it holds across a restart.
36
+ */
37
+ accessor after: Job<unknown, unknown>[];
38
+ /**
39
+ * Seal + end clock, in one update: `result` keys on `endedAtMs`, so a
40
+ * crash between the two writes would leave a completed job unawaitable.
41
+ * Deny-without-BODY leaves `startedAtMs` null.
42
+ */
43
+ markComplete(now?: number): void;
44
+ /** Replace {@link after}. Call before the job becomes reachable. */
45
+ stampAfter(jobs: readonly Job<unknown, unknown>[]): void;
46
+ /**
47
+ * Released for a successor: done, cancelled, or a background job that has
48
+ * started. A denied or failed predecessor is done too; order is not success.
49
+ */
50
+ get released(): boolean;
51
+ /** Every {@link after} predecessor is released. */
52
+ get afterReleased(): boolean;
53
+ /** Parent `child` when it is not already in `children`. Does not enqueue or wait. */
54
+ registerJob<T extends Job<unknown, unknown>>(child: T): T;
55
+ get orchestrated(): boolean;
56
+ /** Not one call. Agent, bot, shell, and program override. */
57
+ get kind(): JobKind;
58
+ /** Not the background flag. Call, program, and shell override. */
59
+ get isTrackedBackground(): boolean;
60
+ /** Not the wire name. Call, program, and shell override. */
61
+ get object(): string;
62
+ /**
63
+ * Effect contract for this class. Not synced. An abstract intermediate
64
+ * declares none, so every concrete kind has to state its own.
65
+ */
66
+ abstract readonly owner: JobEffectOwner;
67
+ abstract readonly intent: string;
68
+ abstract readonly checkpoint: string;
69
+ abstract readonly dispatch: string;
70
+ abstract readonly settlement: string;
71
+ abstract readonly cancel: string;
72
+ abstract readonly unknownRecovery: UnknownOutcomeRecovery;
73
+ abstract readonly unknownNote: string;
74
+ abstract readonly intentRequired: boolean;
75
+ get jobs(): Job<unknown, unknown>[];
76
+ get foregroundJobs(): Job<unknown, unknown>[];
77
+ get backgroundJobs(): Job<unknown, unknown>[];
78
+ get result(): JobResolution<TValue, TReason> | null;
79
+ get work(): readonly WorkContainer[];
80
+ then<TFulfilled = TValue, TRejected = never>(onfulfilled?: ((value: TValue) => TFulfilled | PromiseLike<TFulfilled>) | null, onrejected?: ((reason: TReason) => TRejected | PromiseLike<TRejected>) | null): Promise<TFulfilled | TRejected>;
81
+ catch<TRejected = never>(onrejected?: ((reason: TReason) => TRejected | PromiseLike<TRejected>) | null): Promise<TValue | TRejected>;
82
+ finally(onfinally?: (() => void) | null): Promise<TValue>;
83
+ get [Symbol.toStringTag](): string;
84
+ }
85
+ //# sourceMappingURL=Job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Job.d.ts","sourceRoot":"","sources":["../../../src/shared/models/Job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ /**
36
+ * COLLECTORS ARE NOT `.work`. Collectors expand until `walkBoundary`.
37
+ * Job is a WorkContainer, not a WorkExpectation.
38
+ *
39
+ * `orchestrationResult` is the guard's boolean. `orchestrated` is computed
40
+ * (`!== null`). `cancelled` is the cancel fact. Do not assign `orchestrated`.
41
+ *
42
+ * Await settles on `result`, not on this object. `result` stays null until
43
+ * `endedAtMs` is set, then this class fulfills `undefined`. `cancelled` alone
44
+ * does not settle. A subclass names its value and rejection by overriding `result`.
45
+ */
46
+ import { syncing } from "@here.build/plexus";
47
+ import { computed, when } from "mobx";
48
+ import invariant from "tiny-invariant";
49
+ import { WorkContainer } from "./WorkContainer.js";
50
+ let Job = (() => {
51
+ var _a, _b, _c, _d;
52
+ let _classDecorators = [syncing("@inhuman.tools/plexus-expectations:Job")];
53
+ let _classDescriptor;
54
+ let _classExtraInitializers = [];
55
+ let _classThis;
56
+ let _classSuper = WorkContainer;
57
+ let _instanceExtraInitializers = [];
58
+ let _children_decorators;
59
+ let _children_initializers = [];
60
+ let _children_extraInitializers = [];
61
+ let _background_decorators;
62
+ let _background_initializers = [];
63
+ let _background_extraInitializers = [];
64
+ let _walkBoundary_decorators;
65
+ let _walkBoundary_initializers = [];
66
+ let _walkBoundary_extraInitializers = [];
67
+ let _orchestrationResult_decorators;
68
+ let _orchestrationResult_initializers = [];
69
+ let _orchestrationResult_extraInitializers = [];
70
+ let _cancelled_decorators;
71
+ let _cancelled_initializers = [];
72
+ let _cancelled_extraInitializers = [];
73
+ let _completed_decorators;
74
+ let _completed_initializers = [];
75
+ let _completed_extraInitializers = [];
76
+ let _crash_decorators;
77
+ let _crash_initializers = [];
78
+ let _crash_extraInitializers = [];
79
+ let _after_decorators;
80
+ let _after_initializers = [];
81
+ let _after_extraInitializers = [];
82
+ let _markComplete_decorators;
83
+ let _stampAfter_decorators;
84
+ let _get_afterReleased_decorators;
85
+ let _get_orchestrated_decorators;
86
+ let _get_jobs_decorators;
87
+ let _get_foregroundJobs_decorators;
88
+ let _get_backgroundJobs_decorators;
89
+ let _get_result_decorators;
90
+ let _get_work_decorators;
91
+ var Job = class extends _classSuper {
92
+ static { _classThis = this; }
93
+ static {
94
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
95
+ __esDecorate(this, null, _children_decorators, { kind: "accessor", name: "children", static: false, private: false, access: { has: obj => "children" in obj, get: obj => obj.children, set: (obj, value) => { obj.children = value; } }, metadata: _metadata }, _children_initializers, _children_extraInitializers);
96
+ __esDecorate(this, null, _background_decorators, { kind: "accessor", name: "background", static: false, private: false, access: { has: obj => "background" in obj, get: obj => obj.background, set: (obj, value) => { obj.background = value; } }, metadata: _metadata }, _background_initializers, _background_extraInitializers);
97
+ __esDecorate(this, null, _walkBoundary_decorators, { kind: "accessor", name: "walkBoundary", static: false, private: false, access: { has: obj => "walkBoundary" in obj, get: obj => obj.walkBoundary, set: (obj, value) => { obj.walkBoundary = value; } }, metadata: _metadata }, _walkBoundary_initializers, _walkBoundary_extraInitializers);
98
+ __esDecorate(this, null, _orchestrationResult_decorators, { kind: "accessor", name: "orchestrationResult", static: false, private: false, access: { has: obj => "orchestrationResult" in obj, get: obj => obj.orchestrationResult, set: (obj, value) => { obj.orchestrationResult = value; } }, metadata: _metadata }, _orchestrationResult_initializers, _orchestrationResult_extraInitializers);
99
+ __esDecorate(this, null, _cancelled_decorators, { kind: "accessor", name: "cancelled", static: false, private: false, access: { has: obj => "cancelled" in obj, get: obj => obj.cancelled, set: (obj, value) => { obj.cancelled = value; } }, metadata: _metadata }, _cancelled_initializers, _cancelled_extraInitializers);
100
+ __esDecorate(this, null, _completed_decorators, { kind: "accessor", name: "completed", static: false, private: false, access: { has: obj => "completed" in obj, get: obj => obj.completed, set: (obj, value) => { obj.completed = value; } }, metadata: _metadata }, _completed_initializers, _completed_extraInitializers);
101
+ __esDecorate(this, null, _crash_decorators, { kind: "accessor", name: "crash", static: false, private: false, access: { has: obj => "crash" in obj, get: obj => obj.crash, set: (obj, value) => { obj.crash = value; } }, metadata: _metadata }, _crash_initializers, _crash_extraInitializers);
102
+ __esDecorate(this, null, _after_decorators, { kind: "accessor", name: "after", static: false, private: false, access: { has: obj => "after" in obj, get: obj => obj.after, set: (obj, value) => { obj.after = value; } }, metadata: _metadata }, _after_initializers, _after_extraInitializers);
103
+ __esDecorate(this, null, _markComplete_decorators, { kind: "method", name: "markComplete", static: false, private: false, access: { has: obj => "markComplete" in obj, get: obj => obj.markComplete }, metadata: _metadata }, null, _instanceExtraInitializers);
104
+ __esDecorate(this, null, _stampAfter_decorators, { kind: "method", name: "stampAfter", static: false, private: false, access: { has: obj => "stampAfter" in obj, get: obj => obj.stampAfter }, metadata: _metadata }, null, _instanceExtraInitializers);
105
+ __esDecorate(this, null, _get_afterReleased_decorators, { kind: "getter", name: "afterReleased", static: false, private: false, access: { has: obj => "afterReleased" in obj, get: obj => obj.afterReleased }, metadata: _metadata }, null, _instanceExtraInitializers);
106
+ __esDecorate(this, null, _get_orchestrated_decorators, { kind: "getter", name: "orchestrated", static: false, private: false, access: { has: obj => "orchestrated" in obj, get: obj => obj.orchestrated }, metadata: _metadata }, null, _instanceExtraInitializers);
107
+ __esDecorate(this, null, _get_jobs_decorators, { kind: "getter", name: "jobs", static: false, private: false, access: { has: obj => "jobs" in obj, get: obj => obj.jobs }, metadata: _metadata }, null, _instanceExtraInitializers);
108
+ __esDecorate(this, null, _get_foregroundJobs_decorators, { kind: "getter", name: "foregroundJobs", static: false, private: false, access: { has: obj => "foregroundJobs" in obj, get: obj => obj.foregroundJobs }, metadata: _metadata }, null, _instanceExtraInitializers);
109
+ __esDecorate(this, null, _get_backgroundJobs_decorators, { kind: "getter", name: "backgroundJobs", static: false, private: false, access: { has: obj => "backgroundJobs" in obj, get: obj => obj.backgroundJobs }, metadata: _metadata }, null, _instanceExtraInitializers);
110
+ __esDecorate(this, null, _get_result_decorators, { kind: "getter", name: "result", static: false, private: false, access: { has: obj => "result" in obj, get: obj => obj.result }, metadata: _metadata }, null, _instanceExtraInitializers);
111
+ __esDecorate(this, null, _get_work_decorators, { kind: "getter", name: "work", static: false, private: false, access: { has: obj => "work" in obj, get: obj => obj.work }, metadata: _metadata }, null, _instanceExtraInitializers);
112
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
113
+ Job = _classThis = _classDescriptor.value;
114
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
115
+ __runInitializers(_classThis, _classExtraInitializers);
116
+ }
117
+ #pending = (__runInitializers(this, _instanceExtraInitializers), null);
118
+ #children_accessor_storage = __runInitializers(this, _children_initializers, []);
119
+ /** Not this instantiation — a parent holds jobs with other fulfill and reject types. */
120
+ get children() { return this.#children_accessor_storage; }
121
+ set children(value) { this.#children_accessor_storage = value; }
122
+ #background_accessor_storage = (__runInitializers(this, _children_extraInitializers), __runInitializers(this, _background_initializers, false));
123
+ get background() { return this.#background_accessor_storage; }
124
+ set background(value) { this.#background_accessor_storage = value; }
125
+ #walkBoundary_accessor_storage = (__runInitializers(this, _background_extraInitializers), __runInitializers(this, _walkBoundary_initializers, false));
126
+ get walkBoundary() { return this.#walkBoundary_accessor_storage; }
127
+ set walkBoundary(value) { this.#walkBoundary_accessor_storage = value; }
128
+ #orchestrationResult_accessor_storage = (__runInitializers(this, _walkBoundary_extraInitializers), __runInitializers(this, _orchestrationResult_initializers, null));
129
+ /** Guard return. `null` = phase 1 not done. */
130
+ get orchestrationResult() { return this.#orchestrationResult_accessor_storage; }
131
+ set orchestrationResult(value) { this.#orchestrationResult_accessor_storage = value; }
132
+ #cancelled_accessor_storage = (__runInitializers(this, _orchestrationResult_extraInitializers), __runInitializers(this, _cancelled_initializers, false));
133
+ /** Cancel fact. `false → true`. Not a deny and not a human approval. */
134
+ get cancelled() { return this.#cancelled_accessor_storage; }
135
+ set cancelled(value) { this.#cancelled_accessor_storage = value; }
136
+ #completed_accessor_storage = (__runInitializers(this, _cancelled_extraInitializers), __runInitializers(this, _completed_initializers, false));
137
+ /** This job's own work has finalized (ok or not). */
138
+ get completed() { return this.#completed_accessor_storage; }
139
+ set completed(value) { this.#completed_accessor_storage = value; }
140
+ #crash_accessor_storage = (__runInitializers(this, _completed_extraInitializers), __runInitializers(this, _crash_initializers, ""));
141
+ /**
142
+ * Crash ending: the license guard or the executor body threw. Empty means
143
+ * no crash. The message is the fact; the host stamps a receipt from it and
144
+ * the job completes, so whoever joins the job is released with an outcome.
145
+ */
146
+ get crash() { return this.#crash_accessor_storage; }
147
+ set crash(value) { this.#crash_accessor_storage = value; }
148
+ #after_accessor_storage = (__runInitializers(this, _crash_extraInitializers), __runInitializers(this, _after_initializers, []));
149
+ /**
150
+ * Ordering as data: jobs that must be released before this one is claimed
151
+ * (license and body). Refs to earlier siblings, never a cycle. The
152
+ * orchestrator honours it on every pass, so it holds across a restart.
153
+ */
154
+ get after() { return this.#after_accessor_storage; }
155
+ set after(value) { this.#after_accessor_storage = value; }
156
+ /**
157
+ * Seal + end clock, in one update: `result` keys on `endedAtMs`, so a
158
+ * crash between the two writes would leave a completed job unawaitable.
159
+ * Deny-without-BODY leaves `startedAtMs` null.
160
+ */
161
+ markComplete(now = Date.now()) {
162
+ if (!this.completed)
163
+ this.completed = true;
164
+ this.markEnded(now);
165
+ }
166
+ /** Replace {@link after}. Call before the job becomes reachable. */
167
+ stampAfter(jobs) {
168
+ this.after.splice(0, this.after.length, ...jobs);
169
+ }
170
+ /**
171
+ * Released for a successor: done, cancelled, or a background job that has
172
+ * started. A denied or failed predecessor is done too; order is not success.
173
+ */
174
+ get released() {
175
+ return this.completed || this.cancelled || (this.orchestrated && this.background);
176
+ }
177
+ /** Every {@link after} predecessor is released. */
178
+ get afterReleased() {
179
+ return this.after.every((job) => job.released);
180
+ }
181
+ /** Parent `child` when it is not already in `children`. Does not enqueue or wait. */
182
+ registerJob(child) {
183
+ if (!this.children.includes(child))
184
+ this.children.push(child);
185
+ return child;
186
+ }
187
+ get orchestrated() {
188
+ return this.orchestrationResult !== null;
189
+ }
190
+ /** Not one call. Agent, bot, shell, and program override. */
191
+ get kind() {
192
+ return "workflow";
193
+ }
194
+ /** Not the background flag. Call, program, and shell override. */
195
+ get isTrackedBackground() {
196
+ return false;
197
+ }
198
+ /** Not the wire name. Call, program, and shell override. */
199
+ get object() {
200
+ return "";
201
+ }
202
+ get jobs() {
203
+ const out = [];
204
+ for (const child of this.children) {
205
+ if (!(child instanceof Job))
206
+ continue;
207
+ out.push(child);
208
+ if (!child.walkBoundary)
209
+ out.push(...child.jobs);
210
+ }
211
+ return out;
212
+ }
213
+ get foregroundJobs() {
214
+ return this.jobs.filter((node) => !node.background);
215
+ }
216
+ get backgroundJobs() {
217
+ return this.jobs.filter((node) => node.background);
218
+ }
219
+ get result() {
220
+ if (this.endedAtMs == null)
221
+ return null;
222
+ return { status: "fulfilled", value: undefined };
223
+ }
224
+ get work() {
225
+ return this.children;
226
+ }
227
+ then(onfulfilled, onrejected) {
228
+ return this.#settled().then(onfulfilled, onrejected);
229
+ }
230
+ catch(onrejected) {
231
+ return this.#settled().catch(onrejected);
232
+ }
233
+ finally(onfinally) {
234
+ return this.#settled().finally(onfinally);
235
+ }
236
+ get [(_children_decorators = [(_a = syncing.child).list.bind(_a)], _background_decorators = [syncing], _walkBoundary_decorators = [syncing], _orchestrationResult_decorators = [syncing], _cancelled_decorators = [syncing], _completed_decorators = [syncing], _crash_decorators = [syncing], _after_decorators = [(_b = syncing).list.bind(_b)], _markComplete_decorators = [(_c = syncing).action.bind(_c)], _stampAfter_decorators = [(_d = syncing).action.bind(_d)], _get_afterReleased_decorators = [computed], _get_orchestrated_decorators = [computed], _get_jobs_decorators = [computed], _get_foregroundJobs_decorators = [computed], _get_backgroundJobs_decorators = [computed], _get_result_decorators = [computed], _get_work_decorators = [computed], Symbol.toStringTag)]() {
237
+ return "Job";
238
+ }
239
+ #settled() {
240
+ if (this.#pending != null)
241
+ return this.#pending;
242
+ const deliver = () => {
243
+ const resolution = this.result;
244
+ invariant(resolution != null, "Job settled without result");
245
+ if (resolution.status === "rejected")
246
+ throw resolution.reason;
247
+ return resolution.value;
248
+ };
249
+ this.#pending =
250
+ this.result != null ? Promise.resolve().then(deliver) : when(() => this.result != null).then(deliver);
251
+ return this.#pending;
252
+ }
253
+ constructor() {
254
+ super(...arguments);
255
+ __runInitializers(this, _after_extraInitializers);
256
+ }
257
+ };
258
+ return Job = _classThis;
259
+ })();
260
+ export { Job };
261
+ //# sourceMappingURL=Job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Job.js","sourceRoot":"","sources":["../../../src/shared/models/Job.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * COLLECTORS ARE NOT `.work`. Collectors expand until `walkBoundary`.\n * Job is a WorkContainer, not a WorkExpectation.\n *\n * `orchestrationResult` is the guard's boolean. `orchestrated` is computed\n * (`!== null`). `cancelled` is the cancel fact. Do not assign `orchestrated`.\n *\n * Await settles on `result`, not on this object. `result` stays null until\n * `endedAtMs` is set, then this class fulfills `undefined`. `cancelled` alone\n * does not settle. A subclass names its value and rejection by overriding `result`.\n */\nimport { syncing } from \"@here.build/plexus\";\nimport { computed, when } from \"mobx\";\nimport invariant from \"tiny-invariant\";\n\nimport { WorkContainer } from \"./WorkContainer.js\";\n\nexport type JobResolution<TValue, TReason> =\n { readonly status: \"fulfilled\"; readonly value: TValue } | { readonly status: \"rejected\"; readonly reason: TReason };\n\nexport type JobKind = \"command\" | \"agent\" | \"bot\" | \"workflow\";\n\n/** Runtime that owns a job's effect. */\nexport type JobEffectOwner = \"session-runtime\" | \"tool-runtime\" | \"scheme-runtime\" | \"agent-calls\" | \"honor\";\n\n/** What a restart does with a job whose outcome it cannot see. */\nexport type UnknownOutcomeRecovery = \"resume-queued\" | \"resume-inner\" | \"unknown-no-replay\";\n\n@syncing(\"@inhuman.tools/plexus-expectations:Job\")\nexport abstract class Job<TValue = unknown, TReason = unknown> extends WorkContainer implements Promise<TValue> {\n #pending: Promise<TValue> | null = null;\n\n /** Not this instantiation — a parent holds jobs with other fulfill and reject types. */\n @syncing.child.list accessor children: Job<unknown, unknown>[] = [];\n @syncing accessor background: boolean = false;\n @syncing accessor walkBoundary: boolean = false;\n /** Guard return. `null` = phase 1 not done. */\n @syncing accessor orchestrationResult: true | false | null = null;\n /** Cancel fact. `false → true`. Not a deny and not a human approval. */\n @syncing accessor cancelled: boolean = false;\n /** This job's own work has finalized (ok or not). */\n @syncing accessor completed: boolean = false;\n /**\n * Crash ending: the license guard or the executor body threw. Empty means\n * no crash. The message is the fact; the host stamps a receipt from it and\n * the job completes, so whoever joins the job is released with an outcome.\n */\n @syncing accessor crash: string = \"\";\n /**\n * Ordering as data: jobs that must be released before this one is claimed\n * (license and body). Refs to earlier siblings, never a cycle. The\n * orchestrator honours it on every pass, so it holds across a restart.\n */\n @syncing.list accessor after: Job<unknown, unknown>[] = [];\n\n /**\n * Seal + end clock, in one update: `result` keys on `endedAtMs`, so a\n * crash between the two writes would leave a completed job unawaitable.\n * Deny-without-BODY leaves `startedAtMs` null.\n */\n @syncing.action\n markComplete(now = Date.now()): void {\n if (!this.completed) this.completed = true;\n this.markEnded(now);\n }\n\n /** Replace {@link after}. Call before the job becomes reachable. */\n @syncing.action\n stampAfter(jobs: readonly Job<unknown, unknown>[]): void {\n this.after.splice(0, this.after.length, ...jobs);\n }\n\n /**\n * Released for a successor: done, cancelled, or a background job that has\n * started. A denied or failed predecessor is done too; order is not success.\n */\n get released(): boolean {\n return this.completed || this.cancelled || (this.orchestrated && this.background);\n }\n\n /** Every {@link after} predecessor is released. */\n @computed\n get afterReleased(): boolean {\n return this.after.every((job) => job.released);\n }\n\n /** Parent `child` when it is not already in `children`. Does not enqueue or wait. */\n registerJob<T extends Job<unknown, unknown>>(child: T): T {\n if (!this.children.includes(child)) this.children.push(child);\n return child;\n }\n\n @computed\n get orchestrated(): boolean {\n return this.orchestrationResult !== null;\n }\n\n /** Not one call. Agent, bot, shell, and program override. */\n get kind(): JobKind {\n return \"workflow\";\n }\n\n /** Not the background flag. Call, program, and shell override. */\n get isTrackedBackground(): boolean {\n return false;\n }\n\n /** Not the wire name. Call, program, and shell override. */\n get object(): string {\n return \"\";\n }\n\n /**\n * Effect contract for this class. Not synced. An abstract intermediate\n * declares none, so every concrete kind has to state its own.\n */\n abstract readonly owner: JobEffectOwner;\n abstract readonly intent: string;\n abstract readonly checkpoint: string;\n abstract readonly dispatch: string;\n abstract readonly settlement: string;\n abstract readonly cancel: string;\n abstract readonly unknownRecovery: UnknownOutcomeRecovery;\n abstract readonly unknownNote: string;\n abstract readonly intentRequired: boolean;\n\n @computed\n get jobs(): Job<unknown, unknown>[] {\n const out: Job<unknown, unknown>[] = [];\n for (const child of this.children) {\n if (!(child instanceof Job)) continue;\n out.push(child);\n if (!child.walkBoundary) out.push(...child.jobs);\n }\n return out;\n }\n\n @computed\n get foregroundJobs(): Job<unknown, unknown>[] {\n return this.jobs.filter((node) => !node.background);\n }\n\n @computed\n get backgroundJobs(): Job<unknown, unknown>[] {\n return this.jobs.filter((node) => node.background);\n }\n\n @computed\n get result(): JobResolution<TValue, TReason> | null {\n if (this.endedAtMs == null) return null;\n return { status: \"fulfilled\", value: undefined as TValue };\n }\n\n @computed\n get work(): readonly WorkContainer[] {\n return this.children;\n }\n\n then<TFulfilled = TValue, TRejected = never>(\n onfulfilled?: ((value: TValue) => TFulfilled | PromiseLike<TFulfilled>) | null,\n onrejected?: ((reason: TReason) => TRejected | PromiseLike<TRejected>) | null,\n ): Promise<TFulfilled | TRejected> {\n return this.#settled().then(onfulfilled, onrejected);\n }\n\n catch<TRejected = never>(\n onrejected?: ((reason: TReason) => TRejected | PromiseLike<TRejected>) | null,\n ): Promise<TValue | TRejected> {\n return this.#settled().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<TValue> {\n return this.#settled().finally(onfinally);\n }\n\n get [Symbol.toStringTag](): string {\n return \"Job\";\n }\n\n #settled(): Promise<TValue> {\n if (this.#pending != null) return this.#pending;\n const deliver = (): TValue => {\n const resolution = this.result;\n invariant(resolution != null, \"Job settled without result\");\n if (resolution.status === \"rejected\") throw resolution.reason;\n return resolution.value;\n };\n this.#pending =\n this.result != null ? Promise.resolve().then(deliver) : when(() => this.result != null).then(deliver);\n return this.#pending;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { Job } from "./Job.js";
2
+ export declare class ProgrammaticJob extends Job {
3
+ accessor programText: string | null;
4
+ accessor resolved: boolean;
5
+ }
6
+ //# sourceMappingURL=ProgrammaticJob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgrammaticJob.d.ts","sourceRoot":"","sources":["../../../src/shared/models/ProgrammaticJob.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,qBACa,eAAgB,SAAQ,GAAG;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpD,SAA2B,QAAQ,EAAE,OAAO,CAAS;CACtD"}
@@ -0,0 +1,80 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ /**
36
+ * Stored `resolved` — writing it does not require writing children.
37
+ * `walkBoundary` stays false: not every program is a two-plane contour.
38
+ */
39
+ import { syncing } from "@here.build/plexus";
40
+ import { Job } from "./Job.js";
41
+ let ProgrammaticJob = (() => {
42
+ let _classDecorators = [syncing("@inhuman.tools/plexus-expectations:ProgrammaticJob")];
43
+ let _classDescriptor;
44
+ let _classExtraInitializers = [];
45
+ let _classThis;
46
+ let _classSuper = Job;
47
+ let _programText_decorators;
48
+ let _programText_initializers = [];
49
+ let _programText_extraInitializers = [];
50
+ let _resolved_decorators;
51
+ let _resolved_initializers = [];
52
+ let _resolved_extraInitializers = [];
53
+ var ProgrammaticJob = class extends _classSuper {
54
+ static { _classThis = this; }
55
+ static {
56
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
57
+ _programText_decorators = [syncing];
58
+ _resolved_decorators = [syncing];
59
+ __esDecorate(this, null, _programText_decorators, { kind: "accessor", name: "programText", static: false, private: false, access: { has: obj => "programText" in obj, get: obj => obj.programText, set: (obj, value) => { obj.programText = value; } }, metadata: _metadata }, _programText_initializers, _programText_extraInitializers);
60
+ __esDecorate(this, null, _resolved_decorators, { kind: "accessor", name: "resolved", static: false, private: false, access: { has: obj => "resolved" in obj, get: obj => obj.resolved, set: (obj, value) => { obj.resolved = value; } }, metadata: _metadata }, _resolved_initializers, _resolved_extraInitializers);
61
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
62
+ ProgrammaticJob = _classThis = _classDescriptor.value;
63
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
64
+ __runInitializers(_classThis, _classExtraInitializers);
65
+ }
66
+ #programText_accessor_storage = __runInitializers(this, _programText_initializers, null);
67
+ get programText() { return this.#programText_accessor_storage; }
68
+ set programText(value) { this.#programText_accessor_storage = value; }
69
+ #resolved_accessor_storage = (__runInitializers(this, _programText_extraInitializers), __runInitializers(this, _resolved_initializers, false));
70
+ get resolved() { return this.#resolved_accessor_storage; }
71
+ set resolved(value) { this.#resolved_accessor_storage = value; }
72
+ constructor() {
73
+ super(...arguments);
74
+ __runInitializers(this, _resolved_extraInitializers);
75
+ }
76
+ };
77
+ return ProgrammaticJob = _classThis;
78
+ })();
79
+ export { ProgrammaticJob };
80
+ //# sourceMappingURL=ProgrammaticJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgrammaticJob.js","sourceRoot":"","sources":["../../../src/shared/models/ProgrammaticJob.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;IAGlB,eAAe;4BAD3B,OAAO,CAAC,oDAAoD,CAAC;;;;sBACzB,GAAG;;;;;;;+BAAX,SAAQ,WAAG;;;;uCACrC,OAAO;oCACP,OAAO;YADC,sLAAS,WAAW,6BAAX,WAAW,iGAAuB;YAC3C,6KAAkB,QAAQ,6BAAR,QAAQ,2FAAkB;YAFvD,6KAGC;;;YAHY,uDAAe;;QACjB,mFAAsC,IAAI,EAAC;QAA3C,IAAS,WAAW,iDAAuB;QAA3C,IAAS,WAAW,uDAAuB;QAC3C,uIAAsC,KAAK,GAAC;QAA5C,IAAkB,QAAQ,8CAAkB;QAA5C,IAAkB,QAAQ,oDAAkB;;;;;;;;SAF1C,eAAe","sourcesContent":["/**\n * Stored `resolved` — writing it does not require writing children.\n * `walkBoundary` stays false: not every program is a two-plane contour.\n */\nimport { syncing } from \"@here.build/plexus\";\n\nimport { Job } from \"./Job.js\";\n\n@syncing(\"@inhuman.tools/plexus-expectations:ProgrammaticJob\")\nexport class ProgrammaticJob extends Job {\n @syncing accessor programText: string | null = null;\n @syncing override accessor resolved: boolean = false;\n}\n"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Work graph node. `work` may be a synced list or a computed getter.
3
+ * Walking `.work` from the document root is the whole out-reachable set.
4
+ *
5
+ * Brand is on this class — do not duck-type `.work`.
6
+ *
7
+ * Thenable. The fulfillment is not `this` — a thenable that resolves to itself
8
+ * never settles. This class settles when `endedAtMs` is set, fulfills
9
+ * `undefined`, and does not reject. {@link WorkExpectation} fulfills its
10
+ * outcome. {@link Job} fulfills or rejects from `result`. The promise value
11
+ * here is `unknown` so both stay containers.
12
+ */
13
+ import { PlexusModel } from "@here.build/plexus";
14
+ export declare const workContainer: unique symbol;
15
+ /** Base promise value. An expectation narrows it to the outcome; a job narrows it per class. */
16
+ export type WorkFulfillment = unknown;
17
+ export declare abstract class WorkContainer extends PlexusModel implements Promise<WorkFulfillment> {
18
+ #private;
19
+ readonly [workContainer]: true;
20
+ /** Epoch ms. Write-once. BODY / actor start — not mint, not the guard. */
21
+ accessor startedAtMs: number | null;
22
+ /** Epoch ms. Write-once. Job complete / PEW succeed|fail. This class's thenable settles on this. */
23
+ accessor endedAtMs: number | null;
24
+ abstract readonly work: readonly WorkContainer[];
25
+ markStarted(now?: number): void;
26
+ markEnded(now?: number): void;
27
+ /** Live: `now - startedAtMs`. Sealed: `endedAtMs - startedAtMs`. Null if start was never stamped. */
28
+ durationMs(now?: number): number | null;
29
+ then<TFulfilled = WorkFulfillment, TRejected = never>(onfulfilled?: ((value: WorkFulfillment) => TFulfilled | PromiseLike<TFulfilled>) | null, onrejected?: ((reason: unknown) => TRejected | PromiseLike<TRejected>) | null): Promise<TFulfilled | TRejected>;
30
+ catch<TRejected = never>(onrejected?: ((reason: unknown) => TRejected | PromiseLike<TRejected>) | null): Promise<WorkFulfillment | TRejected>;
31
+ finally(onfinally?: (() => void) | null): Promise<WorkFulfillment>;
32
+ get [Symbol.toStringTag](): string;
33
+ }
34
+ /** Preorder walk of `.work`, cycle-safe. `item === container` stops a leaf `[this]` from recursing. */
35
+ export declare function walkWork(container: WorkContainer, seen?: Set<WorkContainer>): Generator<WorkContainer>;
36
+ //# sourceMappingURL=WorkContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkContainer.d.ts","sourceRoot":"","sources":["../../../src/shared/models/WorkContainer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAW,MAAM,oBAAoB,CAAC;AAG1D,eAAO,MAAM,aAAa,EAAE,OAAO,MAA8C,CAAC;AAElF,gGAAgG;AAChG,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;AAEtC,8BACsB,aAAc,SAAQ,WAAY,YAAW,OAAO,CAAC,eAAe,CAAC;;IACzF,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAG,IAAI,CAAU;IAGzC,0EAA0E;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpD,oGAAoG;IAC3F,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAElD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IAEjD,WAAW,CAAC,GAAG,SAAa,GAAG,IAAI;IAKnC,SAAS,CAAC,GAAG,SAAa,GAAG,IAAI;IAKjC,qGAAqG;IACrG,UAAU,CAAC,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI;IAO3C,IAAI,CAAC,UAAU,GAAG,eAAe,EAAE,SAAS,GAAG,KAAK,EAClD,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,EACvF,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAC5E,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAIlC,KAAK,CAAC,SAAS,GAAG,KAAK,EACrB,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAC5E,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAIvC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IAIlE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;CASF;AAED,uGAAuG;AACvG,wBAAiB,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,GAAE,GAAG,CAAC,aAAa,CAAa,GAAG,SAAS,CAAC,aAAa,CAAC,CAQlH"}