instar 1.3.507 → 1.3.509
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/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +154 -13
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +16 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/coordination/AnchoredAuthorization.d.ts +66 -0
- package/dist/coordination/AnchoredAuthorization.d.ts.map +1 -0
- package/dist/coordination/AnchoredAuthorization.js +71 -0
- package/dist/coordination/AnchoredAuthorization.js.map +1 -0
- package/dist/core/AutonomousSessions.d.ts +8 -0
- package/dist/core/AutonomousSessions.d.ts.map +1 -1
- package/dist/core/AutonomousSessions.js +34 -0
- package/dist/core/AutonomousSessions.js.map +1 -1
- package/dist/core/ExternalOperationGate.d.ts +12 -0
- package/dist/core/ExternalOperationGate.d.ts.map +1 -1
- package/dist/core/ExternalOperationGate.js +6 -0
- package/dist/core/ExternalOperationGate.js.map +1 -1
- package/dist/core/MeshRpc.d.ts +6 -1
- package/dist/core/MeshRpc.d.ts.map +1 -1
- package/dist/core/MeshRpc.js +7 -0
- package/dist/core/MeshRpc.js.map +1 -1
- package/dist/core/OwnershipReconciler.d.ts.map +1 -1
- package/dist/core/OwnershipReconciler.js +17 -0
- package/dist/core/OwnershipReconciler.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +9 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SessionDrainRunner.d.ts +116 -0
- package/dist/core/SessionDrainRunner.d.ts.map +1 -0
- package/dist/core/SessionDrainRunner.js +162 -0
- package/dist/core/SessionDrainRunner.js.map +1 -0
- package/dist/core/SessionOwnership.d.ts +22 -1
- package/dist/core/SessionOwnership.d.ts.map +1 -1
- package/dist/core/SessionOwnership.js +17 -1
- package/dist/core/SessionOwnership.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +5 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/seamlessnessConfig.d.ts +8 -1
- package/dist/core/seamlessnessConfig.d.ts.map +1 -1
- package/dist/core/seamlessnessConfig.js +8 -1
- package/dist/core/seamlessnessConfig.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +8 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +8 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +1 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/middleware.d.ts +14 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +17 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/routes.d.ts +11 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +206 -17
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/ContentClassifier.d.ts +15 -0
- package/dist/threadline/ContentClassifier.d.ts.map +1 -1
- package/dist/threadline/ContentClassifier.js +39 -0
- package/dist/threadline/ContentClassifier.js.map +1 -1
- package/dist/threadline/ConversationStore.d.ts +32 -0
- package/dist/threadline/ConversationStore.d.ts.map +1 -1
- package/dist/threadline/ConversationStore.js +74 -0
- package/dist/threadline/ConversationStore.js.map +1 -1
- package/dist/threadline/NegotiatorGate.d.ts +88 -0
- package/dist/threadline/NegotiatorGate.d.ts.map +1 -0
- package/dist/threadline/NegotiatorGate.js +148 -0
- package/dist/threadline/NegotiatorGate.js.map +1 -0
- package/dist/threadline/NegotiatorLease.d.ts +156 -0
- package/dist/threadline/NegotiatorLease.d.ts.map +1 -0
- package/dist/threadline/NegotiatorLease.js +202 -0
- package/dist/threadline/NegotiatorLease.js.map +1 -0
- package/dist/threadline/ThreadlineEndpoints.d.ts +2 -1
- package/dist/threadline/ThreadlineEndpoints.d.ts.map +1 -1
- package/dist/threadline/ThreadlineEndpoints.js +21 -1
- package/dist/threadline/ThreadlineEndpoints.js.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.d.ts +8 -0
- package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.js +14 -1
- package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
- package/dist/threadline/mcp-http-client.d.ts.map +1 -1
- package/dist/threadline/mcp-http-client.js +6 -0
- package/dist/threadline/mcp-http-client.js.map +1 -1
- package/dist/threadline/recordInboundAck.d.ts +48 -0
- package/dist/threadline/recordInboundAck.d.ts.map +1 -0
- package/dist/threadline/recordInboundAck.js +46 -0
- package/dist/threadline/recordInboundAck.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +8 -0
- package/upgrades/1.3.508.md +83 -0
- package/upgrades/1.3.509.md +74 -0
- package/upgrades/side-effects/multi-machine-seamlessness-ws12b-drain.md +205 -0
- package/upgrades/side-effects/threadline-single-negotiator.md +106 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionDrainRunner — the OWNER-side bounded drain for an active-topic
|
|
3
|
+
* transfer (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC).
|
|
4
|
+
*
|
|
5
|
+
* Executes the receiver half of the `drain` mesh verb: the router (transfer
|
|
6
|
+
* planner) has ordered this machine — the topic's CURRENT owner — to hand the
|
|
7
|
+
* topic to `target`. The runner:
|
|
8
|
+
*
|
|
9
|
+
* 1. Re-validates ownership + the sender's observed epoch, then CASes
|
|
10
|
+
* active → transferring(target). A stale/replayed drain dies HERE at the
|
|
11
|
+
* fence (reach ≠ authority — RBAC proved the sender may ask; the CAS
|
|
12
|
+
* proves the ask still matches reality).
|
|
13
|
+
* 2. Suspends the topic's autonomous run for the move (the REMOTE arm of
|
|
14
|
+
* WS1.4 — the state file survives, rides the working-set carrier).
|
|
15
|
+
* 3. Waits for the session's turn boundary, bounded by `drainBoundMs`,
|
|
16
|
+
* checking the emergency stop EVERY poll.
|
|
17
|
+
* 4. On the boundary (or the bound): closes the local session — forced at
|
|
18
|
+
* the bound, marked `interrupted-mid-task` with ONE honest notice — and
|
|
19
|
+
* COMPLETES the transfer by landing the target's claim CAS (the FSM
|
|
20
|
+
* permits a non-target sender to land a claim NAMING the target — the
|
|
21
|
+
* established router-confirmClaim precedent), so the durable queue's
|
|
22
|
+
* barrier releases to the new owner exactly at drain completion.
|
|
23
|
+
* 5. On emergency stop: CAS abort-transfer — the topic STAYS HERE, the
|
|
24
|
+
* sender marks the transfer failed-needs-retry, nothing is left split.
|
|
25
|
+
*
|
|
26
|
+
* The drain BARRIER needs no new machinery: while the record is
|
|
27
|
+
* `transferring`, route() queues inbound (ownership-contention); the claim in
|
|
28
|
+
* step 4 is the release point. The WS1.3 reconciler's transferring-to-me claim
|
|
29
|
+
* is held back by `drainClaimGraceMs` so it backstops a dead-mid-drain owner
|
|
30
|
+
* WITHOUT front-running a live one.
|
|
31
|
+
*
|
|
32
|
+
* Honest bound (named in the side-effects artifact): the spec's full "final
|
|
33
|
+
* context flush durably replicated" release gate is the Track H ledger
|
|
34
|
+
* machinery; today's release point is drain completion, with the target's
|
|
35
|
+
* spawn-time history + working-set fetch carrying the context.
|
|
36
|
+
*
|
|
37
|
+
* All I/O is injected — the sequence is deterministic and unit-testable.
|
|
38
|
+
* P19: one bounded poll loop (drainBoundMs / pollMs), no retries, no timers
|
|
39
|
+
* that outlive run().
|
|
40
|
+
*/
|
|
41
|
+
import type { OwnershipAction, SessionOwnershipRecord } from './SessionOwnership.js';
|
|
42
|
+
export interface DrainRequest {
|
|
43
|
+
/** The topic key being transferred. */
|
|
44
|
+
sessionKey: string;
|
|
45
|
+
/** The machine the topic is moving to. */
|
|
46
|
+
target: string;
|
|
47
|
+
/** The ownership epoch the SENDER observed when planning the transfer. */
|
|
48
|
+
senderObservedEpoch: number;
|
|
49
|
+
}
|
|
50
|
+
export type DrainStatus = 'drained' | 'drained-interrupted' | 'aborted-emergency-stop' | 'refused-not-owner' | 'refused-stale-epoch' | 'refused-cas-lost';
|
|
51
|
+
export interface DrainOutcome {
|
|
52
|
+
status: DrainStatus;
|
|
53
|
+
/** True when the topic's autonomous run was suspended for the move. */
|
|
54
|
+
autonomousRunSuspended: boolean;
|
|
55
|
+
/** Milliseconds spent waiting for the turn boundary. */
|
|
56
|
+
drainedInMs?: number;
|
|
57
|
+
detail?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface SessionDrainRunnerDeps {
|
|
60
|
+
selfMachineId: string;
|
|
61
|
+
readOwnership: (sessionKey: string) => SessionOwnershipRecord | null;
|
|
62
|
+
/** The registry CAS (epoch-fenced; legality enforced by the FSM). */
|
|
63
|
+
cas: (action: OwnershipAction, ctx: {
|
|
64
|
+
sessionKey: string;
|
|
65
|
+
sender: string;
|
|
66
|
+
nonce: string;
|
|
67
|
+
}) => {
|
|
68
|
+
ok: boolean;
|
|
69
|
+
reason?: string;
|
|
70
|
+
};
|
|
71
|
+
/** WS1.4 remote arm: suspend the topic's autonomous run, file survives. */
|
|
72
|
+
suspendAutonomousRun: (topic: string, target: string) => {
|
|
73
|
+
suspended: boolean;
|
|
74
|
+
};
|
|
75
|
+
/** Turn-boundary signal: is the topic's local session quiet (no turn in flight)?
|
|
76
|
+
* `true` when there is no local session at all — nothing to drain. */
|
|
77
|
+
sessionQuiet: (sessionKey: string) => boolean;
|
|
78
|
+
/** The emergency-stop flag (checked EVERY poll — user safety preempts the move). */
|
|
79
|
+
emergencyStopActive: () => boolean;
|
|
80
|
+
/** Close the topic's local session. `force` at the bound (the session did not
|
|
81
|
+
* reach a boundary in time); implementations escalate to hard-kill if wedged. */
|
|
82
|
+
terminateSession: (sessionKey: string, reason: string, opts: {
|
|
83
|
+
force: boolean;
|
|
84
|
+
}) => Promise<{
|
|
85
|
+
terminated: boolean;
|
|
86
|
+
skipped?: string;
|
|
87
|
+
}>;
|
|
88
|
+
/** Stamp the topic's suspended run file `interrupted_mid_task: true` (no-op without a run). */
|
|
89
|
+
markInterrupted: (topic: string) => void;
|
|
90
|
+
/** ONE honest notice for a forced close ("moved to X mid-task — final turn may be partial"). */
|
|
91
|
+
notifyInterrupted: (topic: string, target: string, detail: string) => void;
|
|
92
|
+
audit?: (event: Record<string, unknown>) => void;
|
|
93
|
+
now: () => number;
|
|
94
|
+
sleep: (ms: number) => Promise<void>;
|
|
95
|
+
nonce: () => string;
|
|
96
|
+
}
|
|
97
|
+
export interface SessionDrainRunnerConfig {
|
|
98
|
+
/** Hard bound on the turn-boundary wait (spec: a long reply must not block a transfer). */
|
|
99
|
+
drainBoundMs: number;
|
|
100
|
+
/** Poll cadence inside the bound. */
|
|
101
|
+
pollMs: number;
|
|
102
|
+
}
|
|
103
|
+
export declare const DEFAULT_DRAIN_RUNNER_CONFIG: SessionDrainRunnerConfig;
|
|
104
|
+
/**
|
|
105
|
+
* How long the WS1.3 reconciler must hold back its transferring-to-me claim so
|
|
106
|
+
* it backstops a dead-mid-drain owner without front-running a live drain:
|
|
107
|
+
* the drain bound plus slack for the close + claim CAS to land.
|
|
108
|
+
*/
|
|
109
|
+
export declare const DEFAULT_DRAIN_CLAIM_GRACE_MS: number;
|
|
110
|
+
export declare class SessionDrainRunner {
|
|
111
|
+
private readonly deps;
|
|
112
|
+
private readonly cfg;
|
|
113
|
+
constructor(deps: SessionDrainRunnerDeps, cfg?: Partial<SessionDrainRunnerConfig>);
|
|
114
|
+
run(req: DrainRequest): Promise<DrainOutcome>;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=SessionDrainRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionDrainRunner.d.ts","sourceRoot":"","sources":["../../src/core/SessionDrainRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionDrainRunner — the OWNER-side bounded drain for an active-topic
|
|
3
|
+
* transfer (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC).
|
|
4
|
+
*
|
|
5
|
+
* Executes the receiver half of the `drain` mesh verb: the router (transfer
|
|
6
|
+
* planner) has ordered this machine — the topic's CURRENT owner — to hand the
|
|
7
|
+
* topic to `target`. The runner:
|
|
8
|
+
*
|
|
9
|
+
* 1. Re-validates ownership + the sender's observed epoch, then CASes
|
|
10
|
+
* active → transferring(target). A stale/replayed drain dies HERE at the
|
|
11
|
+
* fence (reach ≠ authority — RBAC proved the sender may ask; the CAS
|
|
12
|
+
* proves the ask still matches reality).
|
|
13
|
+
* 2. Suspends the topic's autonomous run for the move (the REMOTE arm of
|
|
14
|
+
* WS1.4 — the state file survives, rides the working-set carrier).
|
|
15
|
+
* 3. Waits for the session's turn boundary, bounded by `drainBoundMs`,
|
|
16
|
+
* checking the emergency stop EVERY poll.
|
|
17
|
+
* 4. On the boundary (or the bound): closes the local session — forced at
|
|
18
|
+
* the bound, marked `interrupted-mid-task` with ONE honest notice — and
|
|
19
|
+
* COMPLETES the transfer by landing the target's claim CAS (the FSM
|
|
20
|
+
* permits a non-target sender to land a claim NAMING the target — the
|
|
21
|
+
* established router-confirmClaim precedent), so the durable queue's
|
|
22
|
+
* barrier releases to the new owner exactly at drain completion.
|
|
23
|
+
* 5. On emergency stop: CAS abort-transfer — the topic STAYS HERE, the
|
|
24
|
+
* sender marks the transfer failed-needs-retry, nothing is left split.
|
|
25
|
+
*
|
|
26
|
+
* The drain BARRIER needs no new machinery: while the record is
|
|
27
|
+
* `transferring`, route() queues inbound (ownership-contention); the claim in
|
|
28
|
+
* step 4 is the release point. The WS1.3 reconciler's transferring-to-me claim
|
|
29
|
+
* is held back by `drainClaimGraceMs` so it backstops a dead-mid-drain owner
|
|
30
|
+
* WITHOUT front-running a live one.
|
|
31
|
+
*
|
|
32
|
+
* Honest bound (named in the side-effects artifact): the spec's full "final
|
|
33
|
+
* context flush durably replicated" release gate is the Track H ledger
|
|
34
|
+
* machinery; today's release point is drain completion, with the target's
|
|
35
|
+
* spawn-time history + working-set fetch carrying the context.
|
|
36
|
+
*
|
|
37
|
+
* All I/O is injected — the sequence is deterministic and unit-testable.
|
|
38
|
+
* P19: one bounded poll loop (drainBoundMs / pollMs), no retries, no timers
|
|
39
|
+
* that outlive run().
|
|
40
|
+
*/
|
|
41
|
+
export const DEFAULT_DRAIN_RUNNER_CONFIG = {
|
|
42
|
+
drainBoundMs: 30_000,
|
|
43
|
+
pollMs: 1_000,
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* How long the WS1.3 reconciler must hold back its transferring-to-me claim so
|
|
47
|
+
* it backstops a dead-mid-drain owner without front-running a live drain:
|
|
48
|
+
* the drain bound plus slack for the close + claim CAS to land.
|
|
49
|
+
*/
|
|
50
|
+
export const DEFAULT_DRAIN_CLAIM_GRACE_MS = DEFAULT_DRAIN_RUNNER_CONFIG.drainBoundMs + 15_000;
|
|
51
|
+
export class SessionDrainRunner {
|
|
52
|
+
deps;
|
|
53
|
+
cfg;
|
|
54
|
+
constructor(deps, cfg = {}) {
|
|
55
|
+
this.deps = deps;
|
|
56
|
+
this.cfg = { ...DEFAULT_DRAIN_RUNNER_CONFIG, ...cfg };
|
|
57
|
+
}
|
|
58
|
+
async run(req) {
|
|
59
|
+
const d = this.deps;
|
|
60
|
+
const audit = (event, detail = {}) => d.audit?.({ event, sessionKey: req.sessionKey, target: req.target, ...detail });
|
|
61
|
+
// ── 1. Re-validate + fence ────────────────────────────────────────────
|
|
62
|
+
const rec = d.readOwnership(req.sessionKey);
|
|
63
|
+
const resumingOwnDrain = rec?.status === 'transferring' && rec.ownerMachineId === d.selfMachineId && rec.transferTo === req.target;
|
|
64
|
+
if (!resumingOwnDrain) {
|
|
65
|
+
if (!rec || rec.status !== 'active' || rec.ownerMachineId !== d.selfMachineId) {
|
|
66
|
+
audit('drain-refused', { reason: 'not-owner', observedStatus: rec?.status ?? 'none' });
|
|
67
|
+
return { status: 'refused-not-owner', autonomousRunSuspended: false };
|
|
68
|
+
}
|
|
69
|
+
if (rec.ownershipEpoch !== req.senderObservedEpoch) {
|
|
70
|
+
// The transfer this drain belongs to no longer matches reality
|
|
71
|
+
// (replayed drain, or ownership moved since the plan) — refuse.
|
|
72
|
+
audit('drain-refused', { reason: 'stale-epoch', observed: rec.ownershipEpoch, sent: req.senderObservedEpoch });
|
|
73
|
+
return { status: 'refused-stale-epoch', autonomousRunSuspended: false };
|
|
74
|
+
}
|
|
75
|
+
const t = d.cas({ type: 'transfer', to: req.target, drain: true }, { sessionKey: req.sessionKey, sender: d.selfMachineId, nonce: d.nonce() });
|
|
76
|
+
if (!t.ok) {
|
|
77
|
+
audit('drain-refused', { reason: 'cas-lost', casReason: t.reason });
|
|
78
|
+
return { status: 'refused-cas-lost', autonomousRunSuspended: false, detail: t.reason };
|
|
79
|
+
}
|
|
80
|
+
audit('drain-started', { epoch: req.senderObservedEpoch });
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// A re-delivered drain for the transfer we are ALREADY draining —
|
|
84
|
+
// idempotent resume of the wait loop, no second CAS.
|
|
85
|
+
audit('drain-resumed');
|
|
86
|
+
}
|
|
87
|
+
// ── 2. WS1.4 remote arm: suspend the run for the move ────────────────
|
|
88
|
+
let autonomousRunSuspended = false;
|
|
89
|
+
try {
|
|
90
|
+
autonomousRunSuspended = d.suspendAutonomousRun(req.sessionKey, req.target).suspended;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// @silent-fallback-ok — reported via the outcome field (false); the run's
|
|
94
|
+
// own stop hook keeps it honest on this machine either way.
|
|
95
|
+
}
|
|
96
|
+
// ── 3. Bounded wait for the turn boundary, emergency stop every poll ─
|
|
97
|
+
const startedAt = d.now();
|
|
98
|
+
let interrupted = false;
|
|
99
|
+
for (;;) {
|
|
100
|
+
if (d.emergencyStopActive()) {
|
|
101
|
+
const ab = d.cas({ type: 'abort-transfer', machineId: d.selfMachineId }, { sessionKey: req.sessionKey, sender: d.selfMachineId, nonce: d.nonce() });
|
|
102
|
+
audit('drain-aborted-emergency-stop', { abortLanded: ab.ok, casReason: ab.reason });
|
|
103
|
+
// If the abort CAS lost (e.g. the grace expired and the target already
|
|
104
|
+
// claimed), the transfer has completed under us — report honestly; the
|
|
105
|
+
// emergency stop still stops local work via its own machinery.
|
|
106
|
+
return {
|
|
107
|
+
status: 'aborted-emergency-stop',
|
|
108
|
+
autonomousRunSuspended,
|
|
109
|
+
detail: ab.ok ? 'transfer-aborted-topic-stays' : `abort-cas-${ab.reason ?? 'lost'}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (d.sessionQuiet(req.sessionKey))
|
|
113
|
+
break;
|
|
114
|
+
if (d.now() - startedAt >= this.cfg.drainBoundMs) {
|
|
115
|
+
interrupted = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
await d.sleep(this.cfg.pollMs);
|
|
119
|
+
}
|
|
120
|
+
const drainedInMs = d.now() - startedAt;
|
|
121
|
+
// ── 4. Close the local session, complete the transfer ────────────────
|
|
122
|
+
const reason = interrupted
|
|
123
|
+
? `topic ${req.sessionKey} transferring to ${req.target} — drain bound reached, closing mid-task`
|
|
124
|
+
: `topic ${req.sessionKey} transferring to ${req.target} — turn boundary reached, clean close`;
|
|
125
|
+
let closeSkipped;
|
|
126
|
+
try {
|
|
127
|
+
const res = await d.terminateSession(req.sessionKey, reason, { force: interrupted });
|
|
128
|
+
if (!res.terminated)
|
|
129
|
+
closeSkipped = res.skipped ?? 'unknown';
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
closeSkipped = err instanceof Error ? err.message : String(err);
|
|
133
|
+
}
|
|
134
|
+
if (interrupted) {
|
|
135
|
+
try {
|
|
136
|
+
d.markInterrupted(req.sessionKey);
|
|
137
|
+
}
|
|
138
|
+
catch { /* @silent-fallback-ok — marker is best-effort; the notice below is the user-facing record */ }
|
|
139
|
+
try {
|
|
140
|
+
d.notifyInterrupted(req.sessionKey, req.target, `drain bound (${this.cfg.drainBoundMs}ms) reached — final turn may be partial`);
|
|
141
|
+
}
|
|
142
|
+
catch { /* @silent-fallback-ok — notice failure must not strand the transfer; the audit row below is the durable record */ }
|
|
143
|
+
}
|
|
144
|
+
// Land the target's claim — the owner completing the handoff it was
|
|
145
|
+
// ordered to perform (router-confirmClaim precedent: the FSM checks the
|
|
146
|
+
// claim NAMES the transfer target, not who sent the CAS). This is the
|
|
147
|
+
// barrier release point: the queue stops holding and forwards to the
|
|
148
|
+
// new owner. If the CAS lost, the reconciler's post-grace claim is the
|
|
149
|
+
// backstop — the transfer still completes, just later.
|
|
150
|
+
const claim = d.cas({ type: 'claim', machineId: req.target }, { sessionKey: req.sessionKey, sender: d.selfMachineId, nonce: d.nonce() });
|
|
151
|
+
audit(interrupted ? 'drain-completed-interrupted' : 'drain-completed', {
|
|
152
|
+
drainedInMs, claimLanded: claim.ok, ...(closeSkipped ? { closeSkipped } : {}),
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
status: interrupted ? 'drained-interrupted' : 'drained',
|
|
156
|
+
autonomousRunSuspended,
|
|
157
|
+
drainedInMs,
|
|
158
|
+
...(closeSkipped ? { detail: `close-skipped:${closeSkipped}` } : {}),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=SessionDrainRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionDrainRunner.js","sourceRoot":"","sources":["../../src/core/SessionDrainRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,13 @@ export interface SessionOwnershipRecord {
|
|
|
26
26
|
status: SessionOwnershipStatus;
|
|
27
27
|
/** During `transferring`: the target machine the session is moving to. */
|
|
28
28
|
transferTo?: string;
|
|
29
|
+
/** WS1.2: this transferring record was set by the DRAIN flow — the owner's
|
|
30
|
+
* SessionDrainRunner will land the target's claim itself at drain
|
|
31
|
+
* completion. Consumers (the WS1.3 reconciler) hold their backstop claim
|
|
32
|
+
* for the drain grace instead of front-running the live drain. Absent on
|
|
33
|
+
* reconciler-cooperative transfers (claim promptly) and on records from
|
|
34
|
+
* pre-WS1.2 peers. */
|
|
35
|
+
drainInFlight?: boolean;
|
|
29
36
|
nonce: string;
|
|
30
37
|
timestamp: number;
|
|
31
38
|
updatedAt: string;
|
|
@@ -40,6 +47,7 @@ export type OwnershipAction = {
|
|
|
40
47
|
} | {
|
|
41
48
|
type: 'transfer';
|
|
42
49
|
to: string;
|
|
50
|
+
drain?: boolean;
|
|
43
51
|
} | {
|
|
44
52
|
type: 'release';
|
|
45
53
|
machineId: string;
|
|
@@ -58,8 +66,21 @@ export type OwnershipAction = {
|
|
|
58
66
|
| {
|
|
59
67
|
type: 'force-claim';
|
|
60
68
|
machineId: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* WS1.2 (MULTI-MACHINE-SEAMLESSNESS-SPEC): the emergency-stop-during-drain
|
|
72
|
+
* path — the CURRENT owner aborts its own in-flight transfer and returns to
|
|
73
|
+
* `active` at epoch+1, so the topic STAYS on the old machine and nothing is
|
|
74
|
+
* left split. The fenced epoch increment makes the stale target's later
|
|
75
|
+
* claim fail (claim-out-of-sequence on an active record at a newer epoch).
|
|
76
|
+
* Owner-only by construction: only the machine the transferring record
|
|
77
|
+
* names may abort.
|
|
78
|
+
*/
|
|
79
|
+
| {
|
|
80
|
+
type: 'abort-transfer';
|
|
81
|
+
machineId: string;
|
|
61
82
|
};
|
|
62
|
-
export type OwnershipReason = 'ok' | 'already-placed' | 'claim-out-of-sequence' | 'claim-wrong-machine' | 'transfer-not-active' | 'release-not-owner' | 'release-requires-active' | 'force-claim-self' | 'no-record';
|
|
83
|
+
export type OwnershipReason = 'ok' | 'already-placed' | 'claim-out-of-sequence' | 'claim-wrong-machine' | 'transfer-not-active' | 'release-not-owner' | 'release-requires-active' | 'force-claim-self' | 'abort-not-transferring' | 'abort-not-owner' | 'no-record';
|
|
63
84
|
/**
|
|
64
85
|
* Pure transition. Given the CURRENT record (or null for a never-seen session)
|
|
65
86
|
* and an action, returns the next record (the CAS candidate, at epoch+1) or a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionOwnership.d.ts","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAExF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"SessionOwnership.d.ts","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAExF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;2BAKuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACxC;;;;;;;;;;GAUG;GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC5C;;;;;;;;GAQG;GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,eAAe,GACvB,IAAI,GACJ,gBAAgB,GAChB,uBAAuB,GACvB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,GACnB,yBAAyB,GACzB,kBAAkB,GAClB,wBAAwB,GACxB,iBAAiB,GACjB,WAAW,CAAC;AAEhB;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAsFrF;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAGhH;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,sBAAsB,GAAG,IAAI,EACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,YAAY,CAkBd;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnH"}
|
|
@@ -68,7 +68,10 @@ export function applyOwnershipAction(current, action, ctx) {
|
|
|
68
68
|
return { ok: false, reason: 'transfer-not-active' };
|
|
69
69
|
return {
|
|
70
70
|
ok: true,
|
|
71
|
-
next: {
|
|
71
|
+
next: {
|
|
72
|
+
...base, ownerMachineId: current.ownerMachineId, ownershipEpoch: epoch + 1, status: 'transferring', transferTo: action.to,
|
|
73
|
+
...(action.drain ? { drainInFlight: true } : {}),
|
|
74
|
+
},
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
77
|
case 'force-claim': {
|
|
@@ -85,6 +88,19 @@ export function applyOwnershipAction(current, action, ctx) {
|
|
|
85
88
|
}
|
|
86
89
|
return { ok: true, next: { ...base, ownerMachineId: action.machineId, ownershipEpoch: epoch + 1, status: 'active' } };
|
|
87
90
|
}
|
|
91
|
+
case 'abort-transfer': {
|
|
92
|
+
// WS1.2 emergency-stop-during-drain: only the DRAINING OWNER of a
|
|
93
|
+
// `transferring` record may abort, returning itself to `active` at
|
|
94
|
+
// epoch+1 (the fence that invalidates the stale target's claim).
|
|
95
|
+
if (!current || current.status !== 'transferring')
|
|
96
|
+
return { ok: false, reason: 'abort-not-transferring' };
|
|
97
|
+
if (current.ownerMachineId !== action.machineId)
|
|
98
|
+
return { ok: false, reason: 'abort-not-owner' };
|
|
99
|
+
return {
|
|
100
|
+
ok: true,
|
|
101
|
+
next: { ...base, ownerMachineId: action.machineId, ownershipEpoch: epoch + 1, status: 'active' },
|
|
102
|
+
};
|
|
103
|
+
}
|
|
88
104
|
case 'release': {
|
|
89
105
|
if (!current)
|
|
90
106
|
return { ok: false, reason: 'no-record' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionOwnership.js","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"SessionOwnership.js","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA2E/C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,sBAAsB,GACtB,cAAc,GACd,iBAAiB,GACjB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA2E/C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,sBAAsB,GACtB,cAAc,GACd,iBAAiB,GACjB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAyHnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
|
|
@@ -163,6 +163,11 @@ export const DARK_GATE_EXCLUSIONS = [
|
|
|
163
163
|
reason: 'hold-for-stability policy; trails inboundQueue one rollout stage behind (operator discipline)',
|
|
164
164
|
},
|
|
165
165
|
// ── deliberate-fleet-default — off for everyone by design (incl. dev) ──
|
|
166
|
+
{
|
|
167
|
+
configPath: 'threadline.singleNegotiator.enabled',
|
|
168
|
+
category: 'deliberate-fleet-default',
|
|
169
|
+
reason: 'lease send-gate withholds a non-owner content send; off+dry-run-first for everyone until dry-run telemetry shows an acceptable false-positive rate (THREADLINE-SINGLE-NEGOTIATOR-SPEC FD-7)',
|
|
170
|
+
},
|
|
166
171
|
{
|
|
167
172
|
configPath: 'monitoring.bootHealthBeacon.enabled',
|
|
168
173
|
category: 'deliberate-fleet-default',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,15 @@ import type { MultiMachineConfig } from './types.js';
|
|
|
15
15
|
* The mesh protocol version this build speaks. A machine below this version
|
|
16
16
|
* is ineligible for the awake lease during a seamless handoff (spec §11
|
|
17
17
|
* partial-migration safety). Bump only on a breaking coordination change.
|
|
18
|
+
*
|
|
19
|
+
* v2 (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC): the `drain` mesh verb — an
|
|
20
|
+
* active-topic transfer now drains the owner's live session through an
|
|
21
|
+
* authorized, epoch-bound signal. Verb-level skew is additionally handled by
|
|
22
|
+
* the 501/no-handler degrade (an old owner falls back to today's
|
|
23
|
+
* idle-closeout-only transfer), so mixed pools keep working; the version
|
|
24
|
+
* gates only lease eligibility during a handoff window.
|
|
18
25
|
*/
|
|
19
|
-
export declare const SEAMLESSNESS_PROTOCOL_VERSION =
|
|
26
|
+
export declare const SEAMLESSNESS_PROTOCOL_VERSION = 2;
|
|
20
27
|
/** Fully-resolved seamlessness knobs (every field concrete). */
|
|
21
28
|
export interface ResolvedSeamlessnessConfig {
|
|
22
29
|
ingressHeartbeatMs: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seamlessnessConfig.d.ts","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD
|
|
1
|
+
{"version":3,"file":"seamlessnessConfig.d.ts","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,gEAAgE;AAChE,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,QAAQ,GAAG,KAAK,CAAC;IACpC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8BAA8B,EAAE,MAAM,CAAC;IACvC,UAAU,EAAE,cAAc,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAG1E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,0BAA0B,CAgD7F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAgDtF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,0BAA0B,CAUhG"}
|
|
@@ -14,8 +14,15 @@
|
|
|
14
14
|
* The mesh protocol version this build speaks. A machine below this version
|
|
15
15
|
* is ineligible for the awake lease during a seamless handoff (spec §11
|
|
16
16
|
* partial-migration safety). Bump only on a breaking coordination change.
|
|
17
|
+
*
|
|
18
|
+
* v2 (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC): the `drain` mesh verb — an
|
|
19
|
+
* active-topic transfer now drains the owner's live session through an
|
|
20
|
+
* authorized, epoch-bound signal. Verb-level skew is additionally handled by
|
|
21
|
+
* the 501/no-handler degrade (an old owner falls back to today's
|
|
22
|
+
* idle-closeout-only transfer), so mixed pools keep working; the version
|
|
23
|
+
* gates only lease eligibility during a handoff window.
|
|
17
24
|
*/
|
|
18
|
-
export const SEAMLESSNESS_PROTOCOL_VERSION =
|
|
25
|
+
export const SEAMLESSNESS_PROTOCOL_VERSION = 2;
|
|
19
26
|
export class SeamlessnessConfigError extends Error {
|
|
20
27
|
constructor(message) {
|
|
21
28
|
super(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seamlessnessConfig.js","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH
|
|
1
|
+
{"version":3,"file":"seamlessnessConfig.js","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAgC/C,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,EAAuB;IAChE,MAAM,OAAO,GAAG,EAAE,EAAE,sBAAsB,IAAI,EAAE,CAAC;IACjD,OAAO,OAAO,GAAG,MAAM,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,EAAuB;IAC/D,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,kBAAkB,GAAG,EAAE,EAAE,kBAAkB,IAAI,MAAM,CAAC;IAC5D,MAAM,UAAU,GAAG,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,kBAAkB,CAAC;IAC5D,MAAM,sBAAsB,GAAG,EAAE,EAAE,sBAAsB,IAAI,KAAK,CAAC;IAEnE,OAAO;QACL,kBAAkB;QAClB,sBAAsB,EAAE,EAAE,EAAE,sBAAsB,IAAI,MAAM;QAC5D,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,wEAAwE;QACxE,wDAAwD;QACxD,qBAAqB,EACnB,EAAE,EAAE,qBAAqB;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC3E,0EAA0E;QAC1E,0EAA0E;QAC1E,mEAAmE;QACnE,mBAAmB,EAAE,EAAE,EAAE,mBAAmB,IAAI,KAAK;QACrD,mBAAmB;QACnB,UAAU;QACV,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,IAAI,QAAQ;QACpD,sBAAsB;QACtB,kBAAkB,EAAE,EAAE,EAAE,kBAAkB,IAAI,sBAAsB;QACpE,2BAA2B,EAAE,EAAE,EAAE,2BAA2B,IAAI,UAAU;QAC1E,wBAAwB,EAAE,EAAE,EAAE,wBAAwB,IAAI,GAAG,GAAG,IAAI;QACpE,mBAAmB,EAAE,EAAE,EAAE,mBAAmB,IAAI,KAAK;QACrD,oBAAoB,EAAE,EAAE,EAAE,oBAAoB,IAAI,MAAM;QACxD,8BAA8B,EAAE,EAAE,EAAE,8BAA8B,IAAI,CAAC,GAAG,MAAM;QAChF,UAAU,EAAE,EAAE,EAAE,UAAU,IAAI,cAAc;QAC5C,eAAe,EAAE,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,MAAM;QAClD,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,iEAAiE;QACjE,oEAAoE;QACpE,kEAAkE;QAClE,iEAAiE;QACjE,sEAAsE;QACtE,oEAAoE;QACpE,6BAA6B;QAC7B,kBAAkB,EAChB,EAAE,EAAE,kBAAkB;YACtB,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,KAAK,eAAe,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,KAAK,WAAW,CAAC;QACxF,eAAe,EAAE,EAAE,EAAE,eAAe,IAAI,6BAA6B;KACtE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,8BAA8B,CAAC,CAA6B;IAC1E,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAsD;QACnE,CAAC,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,CAAC;QAC5C,CAAC,wBAAwB,EAAE,CAAC,CAAC,sBAAsB,CAAC;QACpD,CAAC,uBAAuB,EAAE,CAAC,CAAC,qBAAqB,CAAC;QAClD,CAAC,qBAAqB,EAAE,CAAC,CAAC,mBAAmB,CAAC;QAC9C,CAAC,qBAAqB,EAAE,CAAC,CAAC,mBAAmB,CAAC;QAC9C,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC;QAC5B,CAAC,wBAAwB,EAAE,CAAC,CAAC,sBAAsB,CAAC;QACpD,CAAC,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,CAAC;QAC5C,CAAC,qBAAqB,EAAE,CAAC,CAAC,mBAAmB,CAAC;KAC/C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,CAAC,qBAAqB,IAAI,CAAC,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CACT,uCAAuC,CAAC,CAAC,qBAAqB,sCAAsC;YACpG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,uEAAuE,CACjH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,qBAAqB,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CACT,uCAAuC,CAAC,CAAC,qBAAqB,2BAA2B;YACzF,IAAI,CAAC,CAAC,UAAU,2FAA2F,CAC5G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,sBAAsB,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CACT,oCAAoC,CAAC,CAAC,kBAAkB,uCAAuC;YAC/F,IAAI,CAAC,CAAC,sBAAsB,8CAA8C,CAC3E,CAAC;IACJ,CAAC;IACD,+EAA+E;IAC/E,8EAA8E;IAC9E,6EAA6E;IAC7E,kFAAkF;IAClF,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CACT,qCAAqC,CAAC,CAAC,mBAAmB,2BAA2B;YACrF,IAAI,CAAC,CAAC,UAAU,kFAAkF,CACnG,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAAuB;IAClE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,uBAAuB,CAC/B,iEAAiE;YACjE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACzC,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1780,6 +1780,11 @@ export interface MachineCapacity {
|
|
|
1780
1780
|
/** This machine can durably RECEIVE forwarded inbound messages (the
|
|
1781
1781
|
* 'deliverMessage' receiver handler + live durable queue). */
|
|
1782
1782
|
ws11DeliverReceive?: boolean;
|
|
1783
|
+
/** WS1.2: this machine can execute the owner-side `drain` verb (bounded
|
|
1784
|
+
* turn-boundary drain + claim handoff for an active-topic transfer).
|
|
1785
|
+
* ABSENT/false → the transfer sender degrades to today's pin-and-
|
|
1786
|
+
* idle-closeout path — never a doomed drain order. */
|
|
1787
|
+
ws12DrainReceive?: boolean;
|
|
1783
1788
|
};
|
|
1784
1789
|
/** Compact guard-posture summary self-reported in the capacity heartbeat
|
|
1785
1790
|
* (GUARD-POSTURE-ENDPOINT-SPEC §2.3). Bound to the AUTHENTICATED sender at
|