@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.
- package/LICENSE.md +7 -0
- package/README.md +144 -2
- package/dist/driver/ExpectationActor.d.ts +56 -0
- package/dist/driver/ExpectationActor.d.ts.map +1 -0
- package/dist/driver/ExpectationActor.js +210 -0
- package/dist/driver/ExpectationActor.js.map +1 -0
- package/dist/driver/PEWDriver.d.ts +144 -0
- package/dist/driver/PEWDriver.d.ts.map +1 -0
- package/dist/driver/PEWDriver.js +303 -0
- package/dist/driver/PEWDriver.js.map +1 -0
- package/dist/driver/PEWDriverConnection.d.ts +139 -0
- package/dist/driver/PEWDriverConnection.d.ts.map +1 -0
- package/dist/driver/PEWDriverConnection.js +298 -0
- package/dist/driver/PEWDriverConnection.js.map +1 -0
- package/dist/driver/actor-machine.d.ts +28 -0
- package/dist/driver/actor-machine.d.ts.map +1 -0
- package/dist/driver/actor-machine.js +50 -0
- package/dist/driver/actor-machine.js.map +1 -0
- package/dist/driver/connection-miss.d.ts +9 -0
- package/dist/driver/connection-miss.d.ts.map +1 -0
- package/dist/driver/connection-miss.js +13 -0
- package/dist/driver/connection-miss.js.map +1 -0
- package/dist/driver/index.d.ts +6 -0
- package/dist/driver/index.d.ts.map +1 -0
- package/dist/driver/index.js +5 -0
- package/dist/driver/index.js.map +1 -0
- package/dist/error-with-invariant.d.ts +9 -0
- package/dist/error-with-invariant.d.ts.map +1 -0
- package/dist/error-with-invariant.js +12 -0
- package/dist/error-with-invariant.js.map +1 -0
- package/dist/executor/index.d.ts +4 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +4 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/kernel-intern.d.ts +16 -0
- package/dist/executor/kernel-intern.d.ts.map +1 -0
- package/dist/executor/kernel-intern.js +98 -0
- package/dist/executor/kernel-intern.js.map +1 -0
- package/dist/executor/orchestrator.d.ts +97 -0
- package/dist/executor/orchestrator.d.ts.map +1 -0
- package/dist/executor/orchestrator.js +465 -0
- package/dist/executor/orchestrator.js.map +1 -0
- package/dist/executor/types.d.ts +8 -0
- package/dist/executor/types.d.ts.map +1 -0
- package/dist/executor/types.js +2 -0
- package/dist/executor/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/connection.d.ts +4 -0
- package/dist/schemas/connection.d.ts.map +1 -0
- package/dist/schemas/connection.js +4 -0
- package/dist/schemas/connection.js.map +1 -0
- package/dist/schemas/index.d.ts +2 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +2 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/shared/attention.d.ts +27 -0
- package/dist/shared/attention.d.ts.map +1 -0
- package/dist/shared/attention.js +116 -0
- package/dist/shared/attention.js.map +1 -0
- package/dist/shared/control.d.ts +4 -0
- package/dist/shared/control.d.ts.map +1 -0
- package/dist/shared/control.js +2 -0
- package/dist/shared/control.js.map +1 -0
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +7 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/map-field-awareness.d.ts +19 -0
- package/dist/shared/map-field-awareness.d.ts.map +1 -0
- package/dist/shared/map-field-awareness.js +58 -0
- package/dist/shared/map-field-awareness.js.map +1 -0
- package/dist/shared/models/ApprovableExpectation.d.ts +15 -0
- package/dist/shared/models/ApprovableExpectation.d.ts.map +1 -0
- package/dist/shared/models/ApprovableExpectation.js +138 -0
- package/dist/shared/models/ApprovableExpectation.js.map +1 -0
- package/dist/shared/models/ConnectionSpec.d.ts +44 -0
- package/dist/shared/models/ConnectionSpec.d.ts.map +1 -0
- package/dist/shared/models/ConnectionSpec.js +180 -0
- package/dist/shared/models/ConnectionSpec.js.map +1 -0
- package/dist/shared/models/DriverSpec.d.ts +45 -0
- package/dist/shared/models/DriverSpec.d.ts.map +1 -0
- package/dist/shared/models/DriverSpec.js +221 -0
- package/dist/shared/models/DriverSpec.js.map +1 -0
- package/dist/shared/models/IntrospectingPlexusModel.d.ts +8 -0
- package/dist/shared/models/IntrospectingPlexusModel.d.ts.map +1 -0
- package/dist/shared/models/IntrospectingPlexusModel.js +48 -0
- package/dist/shared/models/IntrospectingPlexusModel.js.map +1 -0
- package/dist/shared/models/Job.d.ts +85 -0
- package/dist/shared/models/Job.d.ts.map +1 -0
- package/dist/shared/models/Job.js +261 -0
- package/dist/shared/models/Job.js.map +1 -0
- package/dist/shared/models/ProgrammaticJob.d.ts +6 -0
- package/dist/shared/models/ProgrammaticJob.d.ts.map +1 -0
- package/dist/shared/models/ProgrammaticJob.js +80 -0
- package/dist/shared/models/ProgrammaticJob.js.map +1 -0
- package/dist/shared/models/WorkContainer.d.ts +36 -0
- package/dist/shared/models/WorkContainer.d.ts.map +1 -0
- package/dist/shared/models/WorkContainer.js +140 -0
- package/dist/shared/models/WorkContainer.js.map +1 -0
- package/dist/shared/models/WorkExpectation.d.ts +63 -0
- package/dist/shared/models/WorkExpectation.d.ts.map +1 -0
- package/dist/shared/models/WorkExpectation.js +290 -0
- package/dist/shared/models/WorkExpectation.js.map +1 -0
- package/dist/shared/models/WorkExpectationWithIntrospection.d.ts +4 -0
- package/dist/shared/models/WorkExpectationWithIntrospection.d.ts.map +1 -0
- package/dist/shared/models/WorkExpectationWithIntrospection.js +28 -0
- package/dist/shared/models/WorkExpectationWithIntrospection.js.map +1 -0
- package/dist/shared/models/index.d.ts +7 -0
- package/dist/shared/models/index.d.ts.map +1 -0
- package/dist/shared/models/index.js +6 -0
- package/dist/shared/models/index.js.map +1 -0
- package/dist/shared/models/jsonRecord.d.ts +14 -0
- package/dist/shared/models/jsonRecord.d.ts.map +1 -0
- package/dist/shared/models/jsonRecord.js +46 -0
- package/dist/shared/models/jsonRecord.js.map +1 -0
- package/dist/shared/resolution.d.ts +39 -0
- package/dist/shared/resolution.d.ts.map +1 -0
- package/dist/shared/resolution.js +124 -0
- package/dist/shared/resolution.js.map +1 -0
- package/dist/shared/revalidation-demand.d.ts +27 -0
- package/dist/shared/revalidation-demand.d.ts.map +1 -0
- package/dist/shared/revalidation-demand.js +116 -0
- package/dist/shared/revalidation-demand.js.map +1 -0
- package/dist/shared/role.d.ts +12 -0
- package/dist/shared/role.d.ts.map +1 -0
- package/dist/shared/role.js +21 -0
- package/dist/shared/role.js.map +1 -0
- package/dist/shared/types.d.ts +43 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +12 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +79 -3
- package/src/driver/ExpectationActor.ts +244 -0
- package/src/driver/PEWDriver.ts +302 -0
- package/src/driver/actor-machine.ts +54 -0
- package/src/driver/connection-miss.ts +13 -0
- package/src/driver/index.ts +5 -0
- package/src/executor/index.ts +3 -0
- package/src/executor/kernel-intern.ts +121 -0
- package/src/executor/orchestrator.ts +463 -0
- package/src/executor/types.ts +3 -0
- package/src/index.ts +1 -0
- package/src/schemas/connection.ts +4 -0
- package/src/schemas/index.ts +1 -0
- package/src/shared/control.ts +4 -0
- package/src/shared/index.ts +6 -0
- package/src/shared/map-field-awareness.ts +65 -0
- package/src/shared/models/ConnectionSpec.ts +84 -0
- package/src/shared/models/DriverSpec.ts +102 -0
- package/src/shared/models/Job.ts +192 -0
- package/src/shared/models/WorkContainer.ts +90 -0
- package/src/shared/models/WorkExpectation.ts +229 -0
- package/src/shared/models/index.ts +6 -0
- package/src/shared/models/jsonRecord.ts +49 -0
- package/src/shared/revalidation-demand.ts +121 -0
- package/src/shared/role.ts +32 -0
- package/src/shared/types.ts +57 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-local connection intern table keyed by the kernel root object.
|
|
3
|
+
*
|
|
4
|
+
* Session wrap is Yjs load. Park drops an owner ref and must not dispose the
|
|
5
|
+
* instance — {@link disposeKernelConnections} is kernel teardown only.
|
|
6
|
+
* Rejected: last-ref dispose. Switching seats reminted every driver.
|
|
7
|
+
*/
|
|
8
|
+
import { DefaultedWeakMap } from "@here.build/collections";
|
|
9
|
+
import { comparer, reaction } from "mobx";
|
|
10
|
+
import { ConnectionMiss } from "../driver/connection-miss.js";
|
|
11
|
+
import { extraLiveFromState } from "../driver/PEWDriver.js";
|
|
12
|
+
import { asReadyState } from "../shared/types.js";
|
|
13
|
+
function internOwnerOf(owner) {
|
|
14
|
+
return typeof owner.forgetConnection === "function" ? owner : undefined;
|
|
15
|
+
}
|
|
16
|
+
const internByKernel = new DefaultedWeakMap(() => ({ connections: new Map() }));
|
|
17
|
+
export function acquireConnection(kernel, owner, connectionId, construct) {
|
|
18
|
+
const bag = internByKernel.get(kernel);
|
|
19
|
+
const existing = bag.connections.get(connectionId);
|
|
20
|
+
if (existing !== undefined) {
|
|
21
|
+
existing.refs.add(owner);
|
|
22
|
+
return existing.pending;
|
|
23
|
+
}
|
|
24
|
+
const lease = {
|
|
25
|
+
refs: new Set([owner]),
|
|
26
|
+
pending: Promise.resolve().then(construct).then((instance) => {
|
|
27
|
+
lease.mirror = reaction(() => {
|
|
28
|
+
const spec = kernel.connections[connectionId];
|
|
29
|
+
if (spec === undefined)
|
|
30
|
+
return null;
|
|
31
|
+
const ready = asReadyState(instance.readyState);
|
|
32
|
+
// Bootstrapping remint must not wipe a ready catalog.
|
|
33
|
+
if (ready !== "ready" && ready !== "failed" && spec.readyState === "ready")
|
|
34
|
+
return null;
|
|
35
|
+
return { ready, error: instance.error, live: extraLiveFromState(instance.state) };
|
|
36
|
+
}, (snap) => {
|
|
37
|
+
if (snap == null)
|
|
38
|
+
return;
|
|
39
|
+
kernel.connections[connectionId]?.stampProcess({
|
|
40
|
+
readyState: snap.ready,
|
|
41
|
+
error: snap.error,
|
|
42
|
+
live: snap.live,
|
|
43
|
+
});
|
|
44
|
+
}, { fireImmediately: true, equals: comparer.structural });
|
|
45
|
+
return instance;
|
|
46
|
+
}),
|
|
47
|
+
mirror: undefined,
|
|
48
|
+
};
|
|
49
|
+
bag.connections.set(connectionId, lease);
|
|
50
|
+
void lease.pending.then(undefined, () => {
|
|
51
|
+
if (lease.refs.size === 0)
|
|
52
|
+
bag.connections.delete(connectionId);
|
|
53
|
+
});
|
|
54
|
+
return lease.pending;
|
|
55
|
+
}
|
|
56
|
+
export function releaseConnection(kernel, owner, connectionId) {
|
|
57
|
+
if (!internByKernel.has(kernel))
|
|
58
|
+
return;
|
|
59
|
+
internByKernel.get(kernel).connections.get(connectionId)?.refs.delete(owner);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Remint door. Logout/drop — not park, not last-ref.
|
|
63
|
+
* Pending lease still `asyncDispose`s when it fulfills. Next `ensure` remints.
|
|
64
|
+
*/
|
|
65
|
+
export async function dropConnection(kernel, connectionId) {
|
|
66
|
+
if (!internByKernel.has(kernel))
|
|
67
|
+
return;
|
|
68
|
+
const bag = internByKernel.get(kernel);
|
|
69
|
+
const lease = bag.connections.get(connectionId);
|
|
70
|
+
if (lease === undefined)
|
|
71
|
+
return;
|
|
72
|
+
bag.connections.delete(connectionId);
|
|
73
|
+
lease.mirror?.();
|
|
74
|
+
const owners = [...lease.refs];
|
|
75
|
+
lease.refs.clear();
|
|
76
|
+
const miss = new ConnectionMiss("connection-dropped", `connection ${connectionId} dropped`);
|
|
77
|
+
const disposing = lease.pending.then((instance) => {
|
|
78
|
+
instance.abortOnDrop(miss);
|
|
79
|
+
return instance[Symbol.asyncDispose]();
|
|
80
|
+
}, () => { });
|
|
81
|
+
for (const owner of owners)
|
|
82
|
+
internOwnerOf(owner)?.forgetConnection(connectionId);
|
|
83
|
+
await disposing;
|
|
84
|
+
}
|
|
85
|
+
/** Kernel teardown only. Session park is a document wrap, not a connection lifetime. */
|
|
86
|
+
export function disposeKernelConnections(kernel) {
|
|
87
|
+
if (!internByKernel.has(kernel))
|
|
88
|
+
return;
|
|
89
|
+
const bag = internByKernel.get(kernel);
|
|
90
|
+
internByKernel.delete(kernel);
|
|
91
|
+
for (const lease of bag.connections.values()) {
|
|
92
|
+
lease.refs.clear();
|
|
93
|
+
lease.mirror?.();
|
|
94
|
+
void lease.pending.then((instance) => instance[Symbol.asyncDispose](), () => { });
|
|
95
|
+
}
|
|
96
|
+
bag.connections.clear();
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=kernel-intern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel-intern.js","sourceRoot":"","sources":["../../src/executor/kernel-intern.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAA0B,MAAM,MAAM,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAkB,MAAM,wBAAwB,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,OAAQ,KAAqB,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAE,KAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5G,CAAC;AAUD,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAuB,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAEtG,MAAM,UAAU,iBAAiB,CAC/B,MAAkB,EAClB,KAAa,EACb,YAAoB,EACpB,SAA+C;IAE/C,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IACD,MAAM,KAAK,GAAmB;QAC5B,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3D,KAAK,CAAC,MAAM,GAAG,QAAQ,CACrB,GAAG,EAAE;gBACH,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;gBAC9C,IAAI,IAAI,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBACpC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChD,sDAAsD;gBACtD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO;oBAAE,OAAO,IAAI,CAAC;gBACxF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpF,CAAC,EACD,CAAC,IAAI,EAAE,EAAE;gBACP,IAAI,IAAI,IAAI,IAAI;oBAAE,OAAO;gBACzB,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;oBAC7C,UAAU,EAAE,IAAI,CAAC,KAAK;oBACtB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,CACvD,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,EAAE,SAAS;KAClB,CAAC;IACF,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACzC,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QACtC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAa,EAAE,YAAoB;IACnF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IACxC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB,EAAE,YAAoB;IAC3E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IACxC,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,oBAAoB,EAAE,cAAc,YAAY,UAAU,CAAC,CAAC;IAC5F,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAClC,CAAC,QAAQ,EAAE,EAAE;QACX,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;IACzC,CAAC,EACD,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,aAAa,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACjF,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IACxC,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACjB,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CACrB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAC7C,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC","sourcesContent":["/**\n * Process-local connection intern table keyed by the kernel root object.\n *\n * Session wrap is Yjs load. Park drops an owner ref and must not dispose the\n * instance — {@link disposeKernelConnections} is kernel teardown only.\n * Rejected: last-ref dispose. Switching seats reminted every driver.\n */\nimport { DefaultedWeakMap } from \"@here.build/collections\";\nimport { comparer, reaction, type IReactionDisposer } from \"mobx\";\n\nimport { ConnectionMiss } from \"../driver/connection-miss.js\";\nimport { extraLiveFromState, type PEWDriver } from \"../driver/PEWDriver.js\";\nimport type { ConnectionSpec } from \"../shared/models/ConnectionSpec.js\";\nimport { asReadyState } from \"../shared/types.js\";\n\ntype InternOwner = { forgetConnection(id: string): void };\n\nfunction internOwnerOf(owner: object): InternOwner | undefined {\n return typeof (owner as InternOwner).forgetConnection === \"function\" ? (owner as InternOwner) : undefined;\n}\n\ntype KernelRoot = { readonly connections: Record<string, ConnectionSpec | undefined> };\ntype ConnectionHold = {\n readonly refs: Set<object>;\n readonly pending: Promise<PEWDriver>;\n mirror: IReactionDisposer | undefined;\n};\ntype KernelIntern = { readonly connections: Map<string, ConnectionHold> };\n\nconst internByKernel = new DefaultedWeakMap<object, KernelIntern>(() => ({ connections: new Map() }));\n\nexport function acquireConnection(\n kernel: KernelRoot,\n owner: object,\n connectionId: string,\n construct: () => PEWDriver | Promise<PEWDriver>,\n): Promise<PEWDriver> {\n const bag = internByKernel.get(kernel);\n const existing = bag.connections.get(connectionId);\n if (existing !== undefined) {\n existing.refs.add(owner);\n return existing.pending;\n }\n const lease: ConnectionHold = {\n refs: new Set([owner]),\n pending: Promise.resolve().then(construct).then((instance) => {\n lease.mirror = reaction(\n () => {\n const spec = kernel.connections[connectionId];\n if (spec === undefined) return null;\n const ready = asReadyState(instance.readyState);\n // Bootstrapping remint must not wipe a ready catalog.\n if (ready !== \"ready\" && ready !== \"failed\" && spec.readyState === \"ready\") return null;\n return { ready, error: instance.error, live: extraLiveFromState(instance.state) };\n },\n (snap) => {\n if (snap == null) return;\n kernel.connections[connectionId]?.stampProcess({\n readyState: snap.ready,\n error: snap.error,\n live: snap.live,\n });\n },\n { fireImmediately: true, equals: comparer.structural },\n );\n return instance;\n }),\n mirror: undefined,\n };\n bag.connections.set(connectionId, lease);\n void lease.pending.then(undefined, () => {\n if (lease.refs.size === 0) bag.connections.delete(connectionId);\n });\n return lease.pending;\n}\n\nexport function releaseConnection(kernel: object, owner: object, connectionId: string): void {\n if (!internByKernel.has(kernel)) return;\n internByKernel.get(kernel).connections.get(connectionId)?.refs.delete(owner);\n}\n\n/**\n * Remint door. Logout/drop — not park, not last-ref.\n * Pending lease still `asyncDispose`s when it fulfills. Next `ensure` remints.\n */\nexport async function dropConnection(kernel: KernelRoot, connectionId: string): Promise<void> {\n if (!internByKernel.has(kernel)) return;\n const bag = internByKernel.get(kernel);\n const lease = bag.connections.get(connectionId);\n if (lease === undefined) return;\n bag.connections.delete(connectionId);\n lease.mirror?.();\n const owners = [...lease.refs];\n lease.refs.clear();\n const miss = new ConnectionMiss(\"connection-dropped\", `connection ${connectionId} dropped`);\n const disposing = lease.pending.then(\n (instance) => {\n instance.abortOnDrop(miss);\n return instance[Symbol.asyncDispose]();\n },\n () => {},\n );\n for (const owner of owners) internOwnerOf(owner)?.forgetConnection(connectionId);\n await disposing;\n}\n\n/** Kernel teardown only. Session park is a document wrap, not a connection lifetime. */\nexport function disposeKernelConnections(kernel: object): void {\n if (!internByKernel.has(kernel)) return;\n const bag = internByKernel.get(kernel);\n internByKernel.delete(kernel);\n for (const lease of bag.connections.values()) {\n lease.refs.clear();\n lease.mirror?.();\n void lease.pending.then(\n (instance) => instance[Symbol.asyncDispose](),\n () => {},\n );\n }\n bag.connections.clear();\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ExpectationActor } from "../driver/ExpectationActor.js";
|
|
2
|
+
import { type ConnectionSecretsView, type DriverConnectionClass, type PEWDriver } from "../driver/PEWDriver.js";
|
|
3
|
+
import { DriverSpec } from "../shared/models/DriverSpec.js";
|
|
4
|
+
import { Job } from "../shared/models/Job.js";
|
|
5
|
+
import { type AnyWorkExpectation, WorkExpectation } from "../shared/models/WorkExpectation.js";
|
|
6
|
+
import { type KernelPlexus, type SessionPlexus } from "../shared/types.js";
|
|
7
|
+
/** Class identity for `instanceof`. `registerExecutor` never constructs. */
|
|
8
|
+
export type JobConstructor<T extends Job = Job> = abstract new (...args: any[]) => T;
|
|
9
|
+
/**
|
|
10
|
+
* Seam: session work graph → honor (PEW) and claim (Job).
|
|
11
|
+
*
|
|
12
|
+
* Honor is reachable PEW → handle. Unstarted cancel writes the durable
|
|
13
|
+
* ending here and must not poke `ensure` — MCP: an unstarted tool must not
|
|
14
|
+
* spin the server. Do not call `Actor.complete` — unstarted Work has no
|
|
15
|
+
* Actor. `handle` is not the sealer. License is phase 1 on an Approvable
|
|
16
|
+
* leaf. A sealed parent is not honored (the
|
|
17
|
+
* child is already ending in the agentic runtime, or must not start).
|
|
18
|
+
*
|
|
19
|
+
* INTERN TABLE IS NOT AN ATOM. `#connections` is a plain Map of kernel-interned
|
|
20
|
+
* instances (one live driver per kernel connection id). Honor re-enters by
|
|
21
|
+
* reading catalog `spec.readyState` and, once minted, `instance.readyState`.
|
|
22
|
+
* `handle` only when `ready`.
|
|
23
|
+
*
|
|
24
|
+
* A rejected ensure/load memo IS the sticky failure (no hot loop).
|
|
25
|
+
*
|
|
26
|
+
* Honor and Job claim do not start in the constructor. PEW autorun used to
|
|
27
|
+
* run during `super()`, so a readiness Promise after construct was not a
|
|
28
|
+
* gate. Call {@link activate} after replicas are pinned and recovery ran.
|
|
29
|
+
*
|
|
30
|
+
* Import discipline: this module does not import harness or the session document.
|
|
31
|
+
*/
|
|
32
|
+
export declare abstract class Orchestrator<K extends KernelPlexus = KernelPlexus, S extends SessionPlexus = SessionPlexus> implements Disposable {
|
|
33
|
+
#private;
|
|
34
|
+
readonly kernel: K;
|
|
35
|
+
readonly session: S;
|
|
36
|
+
/**
|
|
37
|
+
* Origin-dispatched PEW skip. Lives here, not on the session subclass:
|
|
38
|
+
* honor used to run during `super()`, and subclass fields are unassigned
|
|
39
|
+
* then (JS). A child WeakSet made `shouldHonor` throw `undefined.has`.
|
|
40
|
+
*/
|
|
41
|
+
protected readonly originCompletions: WeakSet<WorkExpectation<unknown, unknown>>;
|
|
42
|
+
constructor(kernel: K, session: S);
|
|
43
|
+
protected get reachableJobs(): Job[];
|
|
44
|
+
/**
|
|
45
|
+
* Two functions. License (phase 1) returns `true` | `false` and writes
|
|
46
|
+
* `orchestrationResult` (`orchestrated` follows). `true` → await execute
|
|
47
|
+
* (phase 2). `false` → skip execute, `completed = true`. Bootstrap
|
|
48
|
+
* `orchestrated && !completed` skips the license and runs execute.
|
|
49
|
+
* `signal` aborts when the job leaves the graph or the orchestrator disposes.
|
|
50
|
+
*/
|
|
51
|
+
registerExecutor<T extends Job>(Class: JobConstructor<T>, license: (job: T, orchestrator: this) => boolean | Promise<boolean>, execute: (job: T, signal: AbortSignal, orchestrator: this) => void | Promise<void>, options?: {
|
|
52
|
+
readonly seal?: boolean;
|
|
53
|
+
}): void;
|
|
54
|
+
/**
|
|
55
|
+
* Host hook: a guard or body threw. `job.crash` is set; write the receipt
|
|
56
|
+
* the job's joiners read (a tool outcome, a call failure). The orchestrator
|
|
57
|
+
* completes the job right after.
|
|
58
|
+
*/
|
|
59
|
+
protected stampCrash(_job: Job, _phase: "license" | "body", _detail: string): void;
|
|
60
|
+
/** In-flight claimed Jobs (handler has not `finally`'d). */
|
|
61
|
+
protected inFlightJobs(): Iterable<Job>;
|
|
62
|
+
/** Abort an in-flight executor. No-op if the job is not claimed here. */
|
|
63
|
+
abortJob(job: Job, reason?: unknown): void;
|
|
64
|
+
abstract loadDriverModule(driver: DriverSpec): Promise<DriverConnectionClass>;
|
|
65
|
+
/**
|
|
66
|
+
* Honor still `handle`s leftover attach PEW. Origin-dispatched completions
|
|
67
|
+
* return false (PR4). Default true unless the node is in {@link originCompletions}.
|
|
68
|
+
*/
|
|
69
|
+
protected shouldHonor(node: WorkExpectation): boolean;
|
|
70
|
+
/** Process-local. Secrets are never a Plexus field. */
|
|
71
|
+
protected connectionSecrets(_connectionId: string): ConnectionSecretsView;
|
|
72
|
+
/** After bootstrap, before ensure settles. The session host binds the settings writer here. */
|
|
73
|
+
protected attachConnection(_connectionId: string, _instance: PEWDriver): void;
|
|
74
|
+
connectionOf(expectation: WorkExpectation): PEWDriver | undefined;
|
|
75
|
+
actorOf<T extends AnyWorkExpectation>(expectation: T): ExpectationActor<T> | undefined;
|
|
76
|
+
ensure(connectionId: string): Promise<PEWDriver>;
|
|
77
|
+
/** True once the connection memo has been poked — without poking it. */
|
|
78
|
+
protected isEnsured(connectionId: string): boolean;
|
|
79
|
+
/** Intern-owner remint. Deletes the sticky `#ensured` memo. */
|
|
80
|
+
forgetConnection(id: string): void;
|
|
81
|
+
/** True after {@link activate}; constructor and registerExecutor do not honor. */
|
|
82
|
+
get activated(): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Start honor, Job claim, and driver discovery. Idempotent. No-op after
|
|
85
|
+
* park/dispose — those already stopped admission.
|
|
86
|
+
*/
|
|
87
|
+
activate(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Stop honor and new claim. In-flight BODY and live connections stay —
|
|
90
|
+
* park waits dispatched MCP before {@link Symbol.dispose} releases them.
|
|
91
|
+
*/
|
|
92
|
+
protected stopAdmission(): void;
|
|
93
|
+
[Symbol.dispose](): void;
|
|
94
|
+
get drivers(): Record<string, DriverSpec>;
|
|
95
|
+
get connections(): Record<string, import("../index.js").ConnectionSpec>;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/executor/orchestrator.ts"],"names":[],"mappings":"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"}
|