@inhuman.tools/plexus-expectations 0.0.0-stage → 0.2.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 (128) 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/actor-machine.d.ts +28 -0
  12. package/dist/driver/actor-machine.d.ts.map +1 -0
  13. package/dist/driver/actor-machine.js +50 -0
  14. package/dist/driver/actor-machine.js.map +1 -0
  15. package/dist/driver/connection-miss.d.ts +9 -0
  16. package/dist/driver/connection-miss.d.ts.map +1 -0
  17. package/dist/driver/connection-miss.js +13 -0
  18. package/dist/driver/connection-miss.js.map +1 -0
  19. package/dist/driver/index.d.ts +6 -0
  20. package/dist/driver/index.d.ts.map +1 -0
  21. package/dist/driver/index.js +5 -0
  22. package/dist/driver/index.js.map +1 -0
  23. package/dist/executor/index.d.ts +4 -0
  24. package/dist/executor/index.d.ts.map +1 -0
  25. package/dist/executor/index.js +4 -0
  26. package/dist/executor/index.js.map +1 -0
  27. package/dist/executor/kernel-intern.d.ts +16 -0
  28. package/dist/executor/kernel-intern.d.ts.map +1 -0
  29. package/dist/executor/kernel-intern.js +98 -0
  30. package/dist/executor/kernel-intern.js.map +1 -0
  31. package/dist/executor/orchestrator.d.ts +97 -0
  32. package/dist/executor/orchestrator.d.ts.map +1 -0
  33. package/dist/executor/orchestrator.js +465 -0
  34. package/dist/executor/orchestrator.js.map +1 -0
  35. package/dist/executor/types.d.ts +8 -0
  36. package/dist/executor/types.d.ts.map +1 -0
  37. package/dist/executor/types.js +2 -0
  38. package/dist/executor/types.js.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/schemas/connection.d.ts +4 -0
  44. package/dist/schemas/connection.d.ts.map +1 -0
  45. package/dist/schemas/connection.js +4 -0
  46. package/dist/schemas/connection.js.map +1 -0
  47. package/dist/schemas/index.d.ts +2 -0
  48. package/dist/schemas/index.d.ts.map +1 -0
  49. package/dist/schemas/index.js +2 -0
  50. package/dist/schemas/index.js.map +1 -0
  51. package/dist/shared/control.d.ts +4 -0
  52. package/dist/shared/control.d.ts.map +1 -0
  53. package/dist/shared/control.js +2 -0
  54. package/dist/shared/control.js.map +1 -0
  55. package/dist/shared/index.d.ts +7 -0
  56. package/dist/shared/index.d.ts.map +1 -0
  57. package/dist/shared/index.js +7 -0
  58. package/dist/shared/index.js.map +1 -0
  59. package/dist/shared/map-field-awareness.d.ts +19 -0
  60. package/dist/shared/map-field-awareness.d.ts.map +1 -0
  61. package/dist/shared/map-field-awareness.js +58 -0
  62. package/dist/shared/map-field-awareness.js.map +1 -0
  63. package/dist/shared/models/ConnectionSpec.d.ts +44 -0
  64. package/dist/shared/models/ConnectionSpec.d.ts.map +1 -0
  65. package/dist/shared/models/ConnectionSpec.js +180 -0
  66. package/dist/shared/models/ConnectionSpec.js.map +1 -0
  67. package/dist/shared/models/DriverSpec.d.ts +45 -0
  68. package/dist/shared/models/DriverSpec.d.ts.map +1 -0
  69. package/dist/shared/models/DriverSpec.js +221 -0
  70. package/dist/shared/models/DriverSpec.js.map +1 -0
  71. package/dist/shared/models/Job.d.ts +85 -0
  72. package/dist/shared/models/Job.d.ts.map +1 -0
  73. package/dist/shared/models/Job.js +261 -0
  74. package/dist/shared/models/Job.js.map +1 -0
  75. package/dist/shared/models/WorkContainer.d.ts +36 -0
  76. package/dist/shared/models/WorkContainer.d.ts.map +1 -0
  77. package/dist/shared/models/WorkContainer.js +140 -0
  78. package/dist/shared/models/WorkContainer.js.map +1 -0
  79. package/dist/shared/models/WorkExpectation.d.ts +63 -0
  80. package/dist/shared/models/WorkExpectation.d.ts.map +1 -0
  81. package/dist/shared/models/WorkExpectation.js +290 -0
  82. package/dist/shared/models/WorkExpectation.js.map +1 -0
  83. package/dist/shared/models/index.d.ts +7 -0
  84. package/dist/shared/models/index.d.ts.map +1 -0
  85. package/dist/shared/models/index.js +6 -0
  86. package/dist/shared/models/index.js.map +1 -0
  87. package/dist/shared/models/jsonRecord.d.ts +14 -0
  88. package/dist/shared/models/jsonRecord.d.ts.map +1 -0
  89. package/dist/shared/models/jsonRecord.js +46 -0
  90. package/dist/shared/models/jsonRecord.js.map +1 -0
  91. package/dist/shared/revalidation-demand.d.ts +27 -0
  92. package/dist/shared/revalidation-demand.d.ts.map +1 -0
  93. package/dist/shared/revalidation-demand.js +116 -0
  94. package/dist/shared/revalidation-demand.js.map +1 -0
  95. package/dist/shared/role.d.ts +12 -0
  96. package/dist/shared/role.d.ts.map +1 -0
  97. package/dist/shared/role.js +21 -0
  98. package/dist/shared/role.js.map +1 -0
  99. package/dist/shared/types.d.ts +43 -0
  100. package/dist/shared/types.d.ts.map +1 -0
  101. package/dist/shared/types.js +12 -0
  102. package/dist/shared/types.js.map +1 -0
  103. package/package.json +79 -3
  104. package/src/driver/ExpectationActor.ts +244 -0
  105. package/src/driver/PEWDriver.ts +302 -0
  106. package/src/driver/actor-machine.ts +54 -0
  107. package/src/driver/connection-miss.ts +13 -0
  108. package/src/driver/index.ts +5 -0
  109. package/src/executor/index.ts +3 -0
  110. package/src/executor/kernel-intern.ts +121 -0
  111. package/src/executor/orchestrator.ts +463 -0
  112. package/src/executor/types.ts +3 -0
  113. package/src/index.ts +1 -0
  114. package/src/schemas/connection.ts +4 -0
  115. package/src/schemas/index.ts +1 -0
  116. package/src/shared/control.ts +4 -0
  117. package/src/shared/index.ts +6 -0
  118. package/src/shared/map-field-awareness.ts +65 -0
  119. package/src/shared/models/ConnectionSpec.ts +84 -0
  120. package/src/shared/models/DriverSpec.ts +102 -0
  121. package/src/shared/models/Job.ts +192 -0
  122. package/src/shared/models/WorkContainer.ts +90 -0
  123. package/src/shared/models/WorkExpectation.ts +229 -0
  124. package/src/shared/models/index.ts +6 -0
  125. package/src/shared/models/jsonRecord.ts +49 -0
  126. package/src/shared/revalidation-demand.ts +121 -0
  127. package/src/shared/role.ts +32 -0
  128. package/src/shared/types.ts +57 -0
@@ -0,0 +1,221 @@
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
+ var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
36
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
37
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
38
+ };
39
+ /**
40
+ * Advertised driver inventory. `can` is a plexus list — file tokens, no load required.
41
+ * PEW process facts are `readyState` / `error` / `offersJson` plus {@link live}.
42
+ * YAML file fill does not touch process facts.
43
+ */
44
+ import { PlexusModel, syncing } from "@here.build/plexus";
45
+ import { computed } from "mobx";
46
+ import invariant from "tiny-invariant";
47
+ import { readJsonRecord, writeJsonRecord } from "./jsonRecord.js";
48
+ let DriverSpec = (() => {
49
+ var _a, _b, _c, _d, _e;
50
+ let _classDecorators = [syncing("@inhuman.tools/plexus-expectations:DriverSpec")];
51
+ let _classDescriptor;
52
+ let _classExtraInitializers = [];
53
+ let _classThis;
54
+ let _classSuper = PlexusModel;
55
+ let _instanceExtraInitializers = [];
56
+ let _name_decorators;
57
+ let _name_initializers = [];
58
+ let _name_extraInitializers = [];
59
+ let _description_decorators;
60
+ let _description_initializers = [];
61
+ let _description_extraInitializers = [];
62
+ let _importPath_decorators;
63
+ let _importPath_initializers = [];
64
+ let _importPath_extraInitializers = [];
65
+ let _abilityClaim_decorators;
66
+ let _abilityClaim_initializers = [];
67
+ let _abilityClaim_extraInitializers = [];
68
+ let _multiplicity_decorators;
69
+ let _multiplicity_initializers = [];
70
+ let _multiplicity_extraInitializers = [];
71
+ let _readyState_decorators;
72
+ let _readyState_initializers = [];
73
+ let _readyState_extraInitializers = [];
74
+ let _error_decorators;
75
+ let _error_initializers = [];
76
+ let _error_extraInitializers = [];
77
+ let _offersJson_decorators;
78
+ let _offersJson_initializers = [];
79
+ let _offersJson_extraInitializers = [];
80
+ let _liveMap_decorators;
81
+ let _liveMap_initializers = [];
82
+ let _liveMap_extraInitializers = [];
83
+ let _get_live_decorators;
84
+ let _private_writeLive_decorators;
85
+ let _private_writeLive_descriptor;
86
+ let _stampLoad_decorators;
87
+ let _get_offers_decorators;
88
+ let _private_writeOffers_decorators;
89
+ let _private_writeOffers_descriptor;
90
+ var DriverSpec = class extends _classSuper {
91
+ static { _classThis = this; }
92
+ static {
93
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
94
+ _name_decorators = [syncing];
95
+ _description_decorators = [syncing];
96
+ _importPath_decorators = [syncing];
97
+ _abilityClaim_decorators = [(_a = syncing).list.bind(_a)];
98
+ _multiplicity_decorators = [syncing];
99
+ _readyState_decorators = [syncing];
100
+ _error_decorators = [syncing];
101
+ _offersJson_decorators = [syncing];
102
+ _liveMap_decorators = [(_b = syncing).record.bind(_b)];
103
+ _get_live_decorators = [computed];
104
+ _private_writeLive_decorators = [(_c = syncing).action.bind(_c)];
105
+ _stampLoad_decorators = [(_d = syncing).action.bind(_d)];
106
+ _get_offers_decorators = [computed];
107
+ _private_writeOffers_decorators = [(_e = syncing).action.bind(_e)];
108
+ __esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
109
+ __esDecorate(this, null, _description_decorators, { kind: "accessor", name: "description", static: false, private: false, access: { has: obj => "description" in obj, get: obj => obj.description, set: (obj, value) => { obj.description = value; } }, metadata: _metadata }, _description_initializers, _description_extraInitializers);
110
+ __esDecorate(this, null, _importPath_decorators, { kind: "accessor", name: "importPath", static: false, private: false, access: { has: obj => "importPath" in obj, get: obj => obj.importPath, set: (obj, value) => { obj.importPath = value; } }, metadata: _metadata }, _importPath_initializers, _importPath_extraInitializers);
111
+ __esDecorate(this, null, _abilityClaim_decorators, { kind: "accessor", name: "abilityClaim", static: false, private: false, access: { has: obj => "abilityClaim" in obj, get: obj => obj.abilityClaim, set: (obj, value) => { obj.abilityClaim = value; } }, metadata: _metadata }, _abilityClaim_initializers, _abilityClaim_extraInitializers);
112
+ __esDecorate(this, null, _multiplicity_decorators, { kind: "accessor", name: "multiplicity", static: false, private: false, access: { has: obj => "multiplicity" in obj, get: obj => obj.multiplicity, set: (obj, value) => { obj.multiplicity = value; } }, metadata: _metadata }, _multiplicity_initializers, _multiplicity_extraInitializers);
113
+ __esDecorate(this, null, _readyState_decorators, { kind: "accessor", name: "readyState", static: false, private: false, access: { has: obj => "readyState" in obj, get: obj => obj.readyState, set: (obj, value) => { obj.readyState = value; } }, metadata: _metadata }, _readyState_initializers, _readyState_extraInitializers);
114
+ __esDecorate(this, null, _error_decorators, { kind: "accessor", name: "error", static: false, private: false, access: { has: obj => "error" in obj, get: obj => obj.error, set: (obj, value) => { obj.error = value; } }, metadata: _metadata }, _error_initializers, _error_extraInitializers);
115
+ __esDecorate(this, null, _offersJson_decorators, { kind: "accessor", name: "offersJson", static: false, private: false, access: { has: obj => "offersJson" in obj, get: obj => obj.offersJson, set: (obj, value) => { obj.offersJson = value; } }, metadata: _metadata }, _offersJson_initializers, _offersJson_extraInitializers);
116
+ __esDecorate(this, null, _liveMap_decorators, { kind: "accessor", name: "liveMap", static: false, private: false, access: { has: obj => "liveMap" in obj, get: obj => obj.liveMap, set: (obj, value) => { obj.liveMap = value; } }, metadata: _metadata }, _liveMap_initializers, _liveMap_extraInitializers);
117
+ __esDecorate(this, null, _get_live_decorators, { kind: "getter", name: "live", static: false, private: false, access: { has: obj => "live" in obj, get: obj => obj.live }, metadata: _metadata }, null, _instanceExtraInitializers);
118
+ __esDecorate(this, _private_writeLive_descriptor = { value: __setFunctionName(function (next) {
119
+ writeJsonRecord(this.liveMap, next);
120
+ }, "#writeLive") }, _private_writeLive_decorators, { kind: "method", name: "#writeLive", static: false, private: true, access: { has: obj => #writeLive in obj, get: obj => obj.#writeLive }, metadata: _metadata }, null, _instanceExtraInitializers);
121
+ __esDecorate(this, null, _stampLoad_decorators, { kind: "method", name: "stampLoad", static: false, private: false, access: { has: obj => "stampLoad" in obj, get: obj => obj.stampLoad }, metadata: _metadata }, null, _instanceExtraInitializers);
122
+ __esDecorate(this, null, _get_offers_decorators, { kind: "getter", name: "offers", static: false, private: false, access: { has: obj => "offers" in obj, get: obj => obj.offers }, metadata: _metadata }, null, _instanceExtraInitializers);
123
+ __esDecorate(this, _private_writeOffers_descriptor = { value: __setFunctionName(function (next) {
124
+ this.offersJson = next == null ? null : JSON.stringify(next);
125
+ }, "#writeOffers") }, _private_writeOffers_decorators, { kind: "method", name: "#writeOffers", static: false, private: true, access: { has: obj => #writeOffers in obj, get: obj => obj.#writeOffers }, metadata: _metadata }, null, _instanceExtraInitializers);
126
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
127
+ DriverSpec = _classThis = _classDescriptor.value;
128
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
129
+ __runInitializers(_classThis, _classExtraInitializers);
130
+ }
131
+ #name_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _name_initializers, ""));
132
+ get name() { return this.#name_accessor_storage; }
133
+ set name(value) { this.#name_accessor_storage = value; }
134
+ #description_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _description_initializers, ""));
135
+ get description() { return this.#description_accessor_storage; }
136
+ set description(value) { this.#description_accessor_storage = value; }
137
+ #importPath_accessor_storage = (__runInitializers(this, _description_extraInitializers), __runInitializers(this, _importPath_initializers, ""));
138
+ get importPath() { return this.#importPath_accessor_storage; }
139
+ set importPath(value) { this.#importPath_accessor_storage = value; }
140
+ #abilityClaim_accessor_storage = (__runInitializers(this, _importPath_extraInitializers), __runInitializers(this, _abilityClaim_initializers, []));
141
+ /** Expectation kind names this driver handles. Not tool names. */
142
+ get abilityClaim() { return this.#abilityClaim_accessor_storage; }
143
+ set abilityClaim(value) { this.#abilityClaim_accessor_storage = value; }
144
+ #multiplicity_accessor_storage = (__runInitializers(this, _abilityClaim_extraInitializers), __runInitializers(this, _multiplicity_initializers, "add-as-secondary"));
145
+ get multiplicity() { return this.#multiplicity_accessor_storage; }
146
+ set multiplicity(value) { this.#multiplicity_accessor_storage = value; }
147
+ #readyState_accessor_storage = (__runInitializers(this, _multiplicity_extraInitializers), __runInitializers(this, _readyState_initializers, null));
148
+ /** Module-load self-report. `null` = never loaded. YAML fill does not touch this. */
149
+ get readyState() { return this.#readyState_accessor_storage; }
150
+ set readyState(value) { this.#readyState_accessor_storage = value; }
151
+ #error_accessor_storage = (__runInitializers(this, _readyState_extraInitializers), __runInitializers(this, _error_initializers, ""));
152
+ get error() { return this.#error_accessor_storage; }
153
+ set error(value) { this.#error_accessor_storage = value; }
154
+ #offersJson_accessor_storage = (__runInitializers(this, _error_extraInitializers), __runInitializers(this, _offersJson_initializers, null));
155
+ /** Offer list JSON. Null = no offers. */
156
+ get offersJson() { return this.#offersJson_accessor_storage; }
157
+ set offersJson(value) { this.#offersJson_accessor_storage = value; }
158
+ #liveMap_accessor_storage = (__runInitializers(this, _offersJson_extraInitializers), __runInitializers(this, _liveMap_initializers, {}));
159
+ get liveMap() { return this.#liveMap_accessor_storage; }
160
+ set liveMap(value) { this.#liveMap_accessor_storage = value; }
161
+ get live() {
162
+ return readJsonRecord(this.liveMap);
163
+ }
164
+ set live(next) {
165
+ this.#writeLive(next);
166
+ }
167
+ get #writeLive() { return _private_writeLive_descriptor.value; }
168
+ /**
169
+ * Module-load self-report. Omitted `offersJson` / `live` stay
170
+ * (failure must not wipe a previous load).
171
+ */
172
+ stampLoad(next) {
173
+ this.readyState = next.readyState;
174
+ this.error = next.error;
175
+ if (next.offersJson !== undefined)
176
+ this.offersJson = next.offersJson;
177
+ if (next.live !== undefined)
178
+ this.live = next.live;
179
+ }
180
+ /**
181
+ * Class-bootstrap offers. Null, blank, and the string `"null"` are no offers.
182
+ * A non-string cell or malformed JSON throws: a silent [] hides a driver defect.
183
+ */
184
+ get offers() {
185
+ return readDriverOffers(this.offersJson);
186
+ }
187
+ set offers(next) {
188
+ this.#writeOffers(next);
189
+ }
190
+ get #writeOffers() { return _private_writeOffers_descriptor.value; }
191
+ constructor() {
192
+ super(...arguments);
193
+ __runInitializers(this, _liveMap_extraInitializers);
194
+ }
195
+ };
196
+ return DriverSpec = _classThis;
197
+ })();
198
+ export { DriverSpec };
199
+ export function readDriverOffers(raw) {
200
+ if (raw == null)
201
+ return [];
202
+ invariant(typeof raw === "string", "harness/kernel/offers: offersJson must be a JSON string");
203
+ const text = raw.trim();
204
+ if (text === "" || text === "null")
205
+ return [];
206
+ let parsed;
207
+ try {
208
+ parsed = JSON.parse(text);
209
+ }
210
+ catch (error) {
211
+ throw new Error(`harness/kernel/offers: offersJson is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
212
+ }
213
+ invariant(Array.isArray(parsed), "harness/kernel/offers: offersJson must be a JSON array of offer objects");
214
+ for (const item of parsed) {
215
+ invariant(typeof item === "object", "harness/kernel/offers: offersJson entries must be objects");
216
+ invariant(item !== null, "harness/kernel/offers: offersJson entries cannot be null");
217
+ invariant(!Array.isArray(item), "harness/kernel/offers: offersJson entries cannot be arrays");
218
+ }
219
+ return parsed;
220
+ }
221
+ //# sourceMappingURL=DriverSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriverSpec.js","sourceRoot":"","sources":["../../../src/shared/models/DriverSpec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Advertised driver inventory. `can` is a plexus list — file tokens, no load required.\n * PEW process facts are `readyState` / `error` / `offersJson` plus {@link live}.\n * YAML file fill does not touch process facts.\n */\nimport { PlexusModel, syncing } from \"@here.build/plexus\";\nimport { computed } from \"mobx\";\nimport invariant from \"tiny-invariant\";\n\nimport type { ReadyState, SpecCatalog } from \"../types.js\";\nimport { readJsonRecord, writeJsonRecord, type LiveFacts } from \"./jsonRecord.js\";\n\n/** How a new connection of this driver is offered, before the class loads. */\nexport type DriverMultiplicity = \"add-by-default\" | \"add-as-secondary\";\n\n@syncing(\"@inhuman.tools/plexus-expectations:DriverSpec\")\nexport class DriverSpec extends PlexusModel<SpecCatalog | null> {\n @syncing accessor name: string = \"\";\n @syncing accessor description: string = \"\";\n @syncing accessor importPath: string = \"\";\n /** Expectation kind names this driver handles. Not tool names. */\n @syncing.list accessor abilityClaim: string[] = [];\n @syncing accessor multiplicity: DriverMultiplicity = \"add-as-secondary\";\n\n /** Module-load self-report. `null` = never loaded. YAML fill does not touch this. */\n @syncing accessor readyState: ReadyState = null;\n @syncing accessor error: string = \"\";\n /** Offer list JSON. Null = no offers. */\n @syncing private accessor offersJson: string | null = null;\n @syncing.record private accessor liveMap: Record<string, string> = {};\n\n @computed\n get live(): LiveFacts {\n return readJsonRecord(this.liveMap) as LiveFacts;\n }\n\n set live(next: Readonly<Record<string, unknown>> | undefined) {\n this.#writeLive(next);\n }\n\n @syncing.action\n #writeLive(next: Readonly<Record<string, unknown>> | undefined): void {\n writeJsonRecord(this.liveMap, next);\n }\n\n /**\n * Module-load self-report. Omitted `offersJson` / `live` stay\n * (failure must not wipe a previous load).\n */\n @syncing.action\n stampLoad(next: {\n readonly readyState: ReadyState;\n readonly error: string;\n readonly offersJson?: string | null;\n readonly live?: Readonly<Record<string, unknown>>;\n }): void {\n this.readyState = next.readyState;\n this.error = next.error;\n if (next.offersJson !== undefined) this.offersJson = next.offersJson;\n if (next.live !== undefined) this.live = next.live;\n }\n\n /**\n * Class-bootstrap offers. Null, blank, and the string `\"null\"` are no offers.\n * A non-string cell or malformed JSON throws: a silent [] hides a driver defect.\n */\n @computed\n get offers(): readonly object[] {\n return readDriverOffers(this.offersJson);\n }\n\n set offers(next: readonly object[] | null) {\n this.#writeOffers(next);\n }\n\n @syncing.action\n #writeOffers(next: readonly object[] | null): void {\n this.offersJson = next == null ? null : JSON.stringify(next);\n }\n}\n\nexport function readDriverOffers(raw: unknown): object[] {\n if (raw == null) return [];\n invariant(typeof raw === \"string\", \"harness/kernel/offers: offersJson must be a JSON string\");\n const text = raw.trim();\n if (text === \"\" || text === \"null\") return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n throw new Error(\n `harness/kernel/offers: offersJson is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n invariant(Array.isArray(parsed), \"harness/kernel/offers: offersJson must be a JSON array of offer objects\");\n for (const item of parsed) {\n invariant(typeof item === \"object\", \"harness/kernel/offers: offersJson entries must be objects\");\n invariant(item !== null, \"harness/kernel/offers: offersJson entries cannot be null\");\n invariant(!Array.isArray(item), \"harness/kernel/offers: offersJson entries cannot be arrays\");\n }\n return parsed as object[];\n}\n"]}
@@ -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":"AAeA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,IACvC;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvH,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,CAAC;AAE/D,wCAAwC;AACxC,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,cAAc,GAAG,gBAAgB,GAAG,aAAa,GAAG,OAAO,CAAC;AAE7G,kEAAkE;AAClE,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAE5F,8BACsB,GAAG,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,CAAE,SAAQ,aAAc,YAAW,OAAO,CAAC,MAAM,CAAC;;IAG7G,wFAAwF;IACpE,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAM;IAC3D,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAS;IACrC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAS;IAChD,+CAA+C;IACtC,QAAQ,CAAC,mBAAmB,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAAQ;IAClE,wEAAwE;IAC/D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAS;IAC7C,qDAAqD;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAS;IAC7C;;;;OAIG;IACM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAM;IACrC;;;;OAIG;IACW,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAM;IAE3D;;;;OAIG;IAEH,YAAY,CAAC,GAAG,SAAa,GAAG,IAAI;IAKpC,oEAAoE;IAEpE,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAIxD;;;OAGG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,mDAAmD;IACnD,IACI,aAAa,IAAI,OAAO,CAE3B;IAED,qFAAqF;IACrF,WAAW,CAAC,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAKzD,IACI,YAAY,IAAI,OAAO,CAE1B;IAED,6DAA6D;IAC7D,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,kEAAkE;IAClE,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,4DAA4D;IAC5D,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAE1C,IACI,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAQlC;IAED,IACI,cAAc,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAE5C;IAED,IACI,cAAc,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAE5C;IAED,IACI,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGlD;IAED,IACI,IAAI,IAAI,SAAS,aAAa,EAAE,CAEnC;IAED,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,SAAS,GAAG,KAAK,EACzC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,EAC9E,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,MAAM,GAAG,SAAS,CAAC;IAI9B,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;CAcF"}
@@ -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"]}