instar 1.3.42 → 1.3.44
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 +292 -3
- package/dist/commands/server.js.map +1 -1
- package/dist/core/HandoffReceiver.d.ts +56 -0
- package/dist/core/HandoffReceiver.d.ts.map +1 -0
- package/dist/core/HandoffReceiver.js +103 -0
- package/dist/core/HandoffReceiver.js.map +1 -0
- package/dist/core/HandoffWireTransport.d.ts +61 -0
- package/dist/core/HandoffWireTransport.d.ts.map +1 -0
- package/dist/core/HandoffWireTransport.js +114 -0
- package/dist/core/HandoffWireTransport.js.map +1 -0
- package/dist/core/HttpLeaseTransport.d.ts +68 -0
- package/dist/core/HttpLeaseTransport.d.ts.map +1 -0
- package/dist/core/HttpLeaseTransport.js +97 -0
- package/dist/core/HttpLeaseTransport.js.map +1 -0
- package/dist/core/HttpLiveTailTransport.d.ts +88 -0
- package/dist/core/HttpLiveTailTransport.d.ts.map +1 -0
- package/dist/core/HttpLiveTailTransport.js +95 -0
- package/dist/core/HttpLiveTailTransport.js.map +1 -0
- package/dist/core/LeaseCoordinator.d.ts +14 -0
- package/dist/core/LeaseCoordinator.d.ts.map +1 -1
- package/dist/core/LeaseCoordinator.js +38 -0
- package/dist/core/LeaseCoordinator.js.map +1 -1
- package/dist/core/LiveTailSource.d.ts +65 -0
- package/dist/core/LiveTailSource.d.ts.map +1 -0
- package/dist/core/LiveTailSource.js +87 -0
- package/dist/core/LiveTailSource.js.map +1 -0
- package/dist/core/MultiMachineCoordinator.d.ts +14 -0
- package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
- package/dist/core/MultiMachineCoordinator.js +22 -0
- package/dist/core/MultiMachineCoordinator.js.map +1 -1
- package/dist/core/ReplyMarkerTransport.d.ts +58 -0
- package/dist/core/ReplyMarkerTransport.d.ts.map +1 -0
- package/dist/core/ReplyMarkerTransport.js +66 -0
- package/dist/core/ReplyMarkerTransport.js.map +1 -0
- package/dist/core/SafeGitExecutor.d.ts.map +1 -1
- package/dist/core/SafeGitExecutor.js +21 -2
- package/dist/core/SafeGitExecutor.js.map +1 -1
- package/dist/core/featureRolloutScan.d.ts.map +1 -1
- package/dist/core/featureRolloutScan.js +5 -4
- package/dist/core/featureRolloutScan.js.map +1 -1
- package/dist/core/handoffReceiverWiring.d.ts +57 -0
- package/dist/core/handoffReceiverWiring.d.ts.map +1 -0
- package/dist/core/handoffReceiverWiring.js +65 -0
- package/dist/core/handoffReceiverWiring.js.map +1 -0
- package/dist/core/handoffSentinelBootWiring.d.ts +53 -0
- package/dist/core/handoffSentinelBootWiring.d.ts.map +1 -0
- package/dist/core/handoffSentinelBootWiring.js +52 -0
- package/dist/core/handoffSentinelBootWiring.js.map +1 -0
- package/dist/core/handoffSentinelWiring.d.ts +60 -0
- package/dist/core/handoffSentinelWiring.d.ts.map +1 -0
- package/dist/core/handoffSentinelWiring.js +59 -0
- package/dist/core/handoffSentinelWiring.js.map +1 -0
- package/dist/core/seamlessnessConfig.d.ts +8 -0
- package/dist/core/seamlessnessConfig.d.ts.map +1 -1
- package/dist/core/seamlessnessConfig.js +1 -0
- package/dist/core/seamlessnessConfig.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/TelegramAdapter.d.ts +6 -0
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +8 -0
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/messaging/ingressDedup.d.ts +55 -0
- package/dist/messaging/ingressDedup.d.ts.map +1 -0
- package/dist/messaging/ingressDedup.js +69 -0
- package/dist/messaging/ingressDedup.js.map +1 -0
- package/dist/messaging/stuckMessageRecovery.d.ts +46 -0
- package/dist/messaging/stuckMessageRecovery.d.ts.map +1 -0
- package/dist/messaging/stuckMessageRecovery.js +52 -0
- package/dist/messaging/stuckMessageRecovery.js.map +1 -0
- package/dist/monitoring/releaseReadinessWiring.d.ts.map +1 -1
- package/dist/monitoring/releaseReadinessWiring.js +4 -2
- package/dist/monitoring/releaseReadinessWiring.js.map +1 -1
- package/dist/server/AgentServer.d.ts +64 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +24 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/handoffInitiateRoutes.d.ts +40 -0
- package/dist/server/handoffInitiateRoutes.d.ts.map +1 -0
- package/dist/server/handoffInitiateRoutes.js +57 -0
- package/dist/server/handoffInitiateRoutes.js.map +1 -0
- package/dist/server/machineRoutes.d.ts +47 -0
- package/dist/server/machineRoutes.d.ts.map +1 -1
- package/dist/server/machineRoutes.js +138 -0
- package/dist/server/machineRoutes.js.map +1 -1
- package/dist/server/routes.d.ts +20 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +65 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +49 -49
- package/upgrades/1.3.41.md +9 -5
- package/upgrades/1.3.43.md +21 -0
- package/upgrades/1.3.44.md +72 -0
- package/upgrades/side-effects/cross-machine-seamlessness-consent-acquire.md +52 -0
- package/upgrades/side-effects/cross-machine-seamlessness-exactly-once-ingress.md +73 -0
- package/upgrades/side-effects/cross-machine-seamlessness-handoff-ack-yield.md +82 -0
- package/upgrades/side-effects/cross-machine-seamlessness-handoff-begin.md +48 -0
- package/upgrades/side-effects/cross-machine-seamlessness-handoff-boot-wiring.md +68 -0
- package/upgrades/side-effects/cross-machine-seamlessness-handoff-receiver-wiring.md +52 -0
- package/upgrades/side-effects/cross-machine-seamlessness-handoff-receiver.md +46 -0
- package/upgrades/side-effects/cross-machine-seamlessness-handoff-sentinel-wiring.md +47 -0
- package/upgrades/side-effects/cross-machine-seamlessness-lease-wire.md +46 -0
- package/upgrades/side-effects/cross-machine-seamlessness-livetail-source.md +50 -0
- package/upgrades/side-effects/cross-machine-seamlessness-livetail-streaming.md +50 -0
- package/upgrades/side-effects/cross-machine-seamlessness-livetail-wire.md +65 -0
- package/upgrades/side-effects/cross-machine-seamlessness-noloss-recovery.md +61 -0
- package/upgrades/side-effects/cross-machine-seamlessness-reply-marker.md +65 -0
- package/upgrades/side-effects/source-tree-guard-readsync-bypass.md +34 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ingressDedup — the exactly-once ingress decision (spec §8 G3a), extracted from
|
|
3
|
+
* the route so the gate logic is a tested unit (both sides of the boundary) and
|
|
4
|
+
* routes.ts stays thin.
|
|
5
|
+
*
|
|
6
|
+
* The inbound forward path asks `decideIngress` whether to ACT on an inbound
|
|
7
|
+
* event or DROP it as a duplicate; the outbound reply path calls
|
|
8
|
+
* `commitInboundReply` when a reply actually goes out. Together they give the
|
|
9
|
+
* no-duplicate-reply half of G3a:
|
|
10
|
+
* - A `dedupeKey` already reply_committed/cursor_advanced → DROP (the user was
|
|
11
|
+
* already answered; this is a provider redelivery or a handoff-window replay).
|
|
12
|
+
* - A `dedupeKey` still `processing` and NOT stuck → DROP (already in flight on
|
|
13
|
+
* this machine — a rapid Telegram retry).
|
|
14
|
+
* - A `processing` entry past `maxProcessingMs` (the old holder was fenced
|
|
15
|
+
* mid-turn) → re-claim and PROCESS from the new holder.
|
|
16
|
+
* - A fresh / `received` entry → claim (beginProcessing under the lease epoch)
|
|
17
|
+
* and PROCESS.
|
|
18
|
+
*
|
|
19
|
+
* The no-LOSS half (replay an un-committed entry after a crash) is a separate
|
|
20
|
+
* step; this module never advances anything past the durable ledger, so it is
|
|
21
|
+
* safe on its own — worst case it drops nothing it shouldn't (the gate only ever
|
|
22
|
+
* drops an event the ledger shows was already handled or is actively in flight).
|
|
23
|
+
*/
|
|
24
|
+
import { MessageProcessingLedger } from './MessageProcessingLedger.js';
|
|
25
|
+
/** Stable provider-level identity for an inbound event (spec §2 contract item 4). */
|
|
26
|
+
export declare function dedupeKeyFor(platform: string, topicId: number | string, eventId: number | string): string;
|
|
27
|
+
export type IngressAction = 'process' | 'drop';
|
|
28
|
+
export interface IngressDecision {
|
|
29
|
+
action: IngressAction;
|
|
30
|
+
/** Why — for the route log + observability. */
|
|
31
|
+
reason: 'first-seen' | 'reclaimed-stuck' | 'already-replied' | 'in-flight';
|
|
32
|
+
}
|
|
33
|
+
export interface DecideIngressOpts {
|
|
34
|
+
platform: string;
|
|
35
|
+
topic?: string | null;
|
|
36
|
+
/** The raw inbound text/context, stored so a future replay can re-run it. */
|
|
37
|
+
input?: string;
|
|
38
|
+
/** The lease fencing epoch this machine holds (0 if no lease). */
|
|
39
|
+
epoch: number;
|
|
40
|
+
/** A 'processing' entry older than this was abandoned by a fenced holder. */
|
|
41
|
+
maxProcessingMs: number;
|
|
42
|
+
now?: () => number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Decide whether to act on an inbound event, recording its lifecycle in the
|
|
46
|
+
* ledger. Returns `process` (the caller routes the message) or `drop` (a
|
|
47
|
+
* duplicate / in-flight event the caller must NOT route).
|
|
48
|
+
*/
|
|
49
|
+
export declare function decideIngress(ledger: MessageProcessingLedger, dedupeKey: string, opts: DecideIngressOpts): IngressDecision;
|
|
50
|
+
/**
|
|
51
|
+
* Commit that a reply for the given inbound event was sent (outbound path).
|
|
52
|
+
* Idempotent — committing twice is a no-op. Advances the cursor on commit.
|
|
53
|
+
*/
|
|
54
|
+
export declare function commitInboundReply(ledger: MessageProcessingLedger, dedupeKey: string, epoch: number, replyIndex?: number): void;
|
|
55
|
+
//# sourceMappingURL=ingressDedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingressDedup.d.ts","sourceRoot":"","sources":["../../src/messaging/ingressDedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,uBAAuB,EAExB,MAAM,8BAA8B,CAAC;AAEtC,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEzG;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,+CAA+C;IAC/C,MAAM,EAAE,YAAY,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,WAAW,CAAC;CAC5E;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,GACtB,eAAe,CA8BjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,SAAI,GACb,IAAI,CAGN"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ingressDedup — the exactly-once ingress decision (spec §8 G3a), extracted from
|
|
3
|
+
* the route so the gate logic is a tested unit (both sides of the boundary) and
|
|
4
|
+
* routes.ts stays thin.
|
|
5
|
+
*
|
|
6
|
+
* The inbound forward path asks `decideIngress` whether to ACT on an inbound
|
|
7
|
+
* event or DROP it as a duplicate; the outbound reply path calls
|
|
8
|
+
* `commitInboundReply` when a reply actually goes out. Together they give the
|
|
9
|
+
* no-duplicate-reply half of G3a:
|
|
10
|
+
* - A `dedupeKey` already reply_committed/cursor_advanced → DROP (the user was
|
|
11
|
+
* already answered; this is a provider redelivery or a handoff-window replay).
|
|
12
|
+
* - A `dedupeKey` still `processing` and NOT stuck → DROP (already in flight on
|
|
13
|
+
* this machine — a rapid Telegram retry).
|
|
14
|
+
* - A `processing` entry past `maxProcessingMs` (the old holder was fenced
|
|
15
|
+
* mid-turn) → re-claim and PROCESS from the new holder.
|
|
16
|
+
* - A fresh / `received` entry → claim (beginProcessing under the lease epoch)
|
|
17
|
+
* and PROCESS.
|
|
18
|
+
*
|
|
19
|
+
* The no-LOSS half (replay an un-committed entry after a crash) is a separate
|
|
20
|
+
* step; this module never advances anything past the durable ledger, so it is
|
|
21
|
+
* safe on its own — worst case it drops nothing it shouldn't (the gate only ever
|
|
22
|
+
* drops an event the ledger shows was already handled or is actively in flight).
|
|
23
|
+
*/
|
|
24
|
+
import { computeReplyIdempotencyKey, } from './MessageProcessingLedger.js';
|
|
25
|
+
/** Stable provider-level identity for an inbound event (spec §2 contract item 4). */
|
|
26
|
+
export function dedupeKeyFor(platform, topicId, eventId) {
|
|
27
|
+
return `${platform}:${topicId}:${eventId}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Decide whether to act on an inbound event, recording its lifecycle in the
|
|
31
|
+
* ledger. Returns `process` (the caller routes the message) or `drop` (a
|
|
32
|
+
* duplicate / in-flight event the caller must NOT route).
|
|
33
|
+
*/
|
|
34
|
+
export function decideIngress(ledger, dedupeKey, opts) {
|
|
35
|
+
const now = opts.now ?? Date.now;
|
|
36
|
+
// Idempotent insert — firstSeen tells us if this is a brand-new event.
|
|
37
|
+
ledger.record(dedupeKey, { platform: opts.platform, topic: opts.topic ?? null, input: opts.input });
|
|
38
|
+
const entry = ledger.get(dedupeKey);
|
|
39
|
+
// Defensive: record() just inserted-or-found it, so entry is non-null.
|
|
40
|
+
if (!entry) {
|
|
41
|
+
return { action: 'process', reason: 'first-seen' };
|
|
42
|
+
}
|
|
43
|
+
if (entry.state === 'reply_committed' || entry.state === 'cursor_advanced') {
|
|
44
|
+
return { action: 'drop', reason: 'already-replied' };
|
|
45
|
+
}
|
|
46
|
+
if (entry.state === 'processing') {
|
|
47
|
+
// Stuck (old holder fenced mid-turn) → the new holder re-claims it.
|
|
48
|
+
const startedMs = entry.processingStartedAt ? Date.parse(entry.processingStartedAt) : NaN;
|
|
49
|
+
const stuck = !Number.isNaN(startedMs) && now() - startedMs > opts.maxProcessingMs;
|
|
50
|
+
if (stuck) {
|
|
51
|
+
ledger.beginProcessing(dedupeKey, opts.epoch);
|
|
52
|
+
return { action: 'process', reason: 'reclaimed-stuck' };
|
|
53
|
+
}
|
|
54
|
+
// Actively in flight on this machine — a rapid redelivery. Drop.
|
|
55
|
+
return { action: 'drop', reason: 'in-flight' };
|
|
56
|
+
}
|
|
57
|
+
// 'received' (fresh, or a replay that never reached processing) → claim it.
|
|
58
|
+
ledger.beginProcessing(dedupeKey, opts.epoch);
|
|
59
|
+
return { action: 'process', reason: 'first-seen' };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Commit that a reply for the given inbound event was sent (outbound path).
|
|
63
|
+
* Idempotent — committing twice is a no-op. Advances the cursor on commit.
|
|
64
|
+
*/
|
|
65
|
+
export function commitInboundReply(ledger, dedupeKey, epoch, replyIndex = 0) {
|
|
66
|
+
ledger.commitReply(dedupeKey, computeReplyIdempotencyKey(dedupeKey, replyIndex), epoch);
|
|
67
|
+
ledger.advanceCursor(dedupeKey);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ingressDedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingressDedup.js","sourceRoot":"","sources":["../../src/messaging/ingressDedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAEL,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAEtC,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAwB,EAAE,OAAwB;IAC/F,OAAO,GAAG,QAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;AAC7C,CAAC;AAsBD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA+B,EAC/B,SAAiB,EACjB,IAAuB;IAEvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,uEAAuE;IACvE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAEpG,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,uEAAuE;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC,KAAK,KAAK,iBAAiB,EAAE,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACjC,oEAAoE;QACpE,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1F,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;QACnF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC1D,CAAC;QACD,iEAAiE;QACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA+B,EAC/B,SAAiB,EACjB,KAAa,EACb,UAAU,GAAG,CAAC;IAEd,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,0BAA0B,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IACxF,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stuckMessageRecovery — the no-LOSS half of exactly-once ingress (spec §8 G3a,
|
|
3
|
+
* "Stuck-`processing` recovery"): an inbound event claimed but never
|
|
4
|
+
* reply_committed (the holder crashed or was fenced mid-turn) is re-run by the
|
|
5
|
+
* CURRENT lease holder from the ledger entry's stored input. The fenced/crashed
|
|
6
|
+
* holder's abandoned output is discarded; the re-run produces the reply that was
|
|
7
|
+
* lost, and the gate's dedup makes a provider redelivery of the same event a
|
|
8
|
+
* no-op.
|
|
9
|
+
*
|
|
10
|
+
* Pure orchestration over injected deps so it is a tested unit (no Telegram /
|
|
11
|
+
* server coupling here). server.ts supplies `reinject` (set the per-topic
|
|
12
|
+
* current-inbound key, then route the stored text exactly as a fresh forward
|
|
13
|
+
* would) and `holdsLease`.
|
|
14
|
+
*
|
|
15
|
+
* Bounded against replay-storms: only entries stuck past `maxProcessingMs` (a
|
|
16
|
+
* turn that genuinely timed out, not one in flight) and only while
|
|
17
|
+
* `attempts < maxReplayAttempts` (a message the agent legitimately never
|
|
18
|
+
* answered is not re-run forever). Lease-gated: a standby never re-injects.
|
|
19
|
+
*/
|
|
20
|
+
import type { MessageProcessingLedger } from './MessageProcessingLedger.js';
|
|
21
|
+
export interface StuckRecoveryDeps {
|
|
22
|
+
ledger: MessageProcessingLedger;
|
|
23
|
+
/** Only the awake machine recovers; a standby must not inject. */
|
|
24
|
+
holdsLease: () => boolean;
|
|
25
|
+
/** Current lease fencing epoch, stamped on the re-claim. */
|
|
26
|
+
epoch: number;
|
|
27
|
+
/** A 'processing' entry older than this is a timed-out turn, eligible for re-run. */
|
|
28
|
+
maxProcessingMs: number;
|
|
29
|
+
/** Give up re-running an entry after this many attempts (avoid storms). Default 3. */
|
|
30
|
+
maxReplayAttempts?: number;
|
|
31
|
+
/** Re-route the stored input as the holder (set current-inbound key, then inject). */
|
|
32
|
+
reinject: (topicId: string, dedupeKey: string, text: string) => void;
|
|
33
|
+
now?: () => number;
|
|
34
|
+
logger?: (msg: string) => void;
|
|
35
|
+
}
|
|
36
|
+
export interface StuckRecoveryResult {
|
|
37
|
+
recovered: number;
|
|
38
|
+
skipped: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Re-run inbound events stranded in `processing`. Idempotent-safe to call
|
|
42
|
+
* repeatedly (boot + on a cadence): a re-run re-claims under the current epoch,
|
|
43
|
+
* and the eventual reply commits the entry so it is not re-run again.
|
|
44
|
+
*/
|
|
45
|
+
export declare function recoverStuckMessages(deps: StuckRecoveryDeps): StuckRecoveryResult;
|
|
46
|
+
//# sourceMappingURL=stuckMessageRecovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stuckMessageRecovery.d.ts","sourceRoot":"","sources":["../../src/messaging/stuckMessageRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,uBAAuB,CAAC;IAChC,kEAAkE;IAClE,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CA0BjF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stuckMessageRecovery — the no-LOSS half of exactly-once ingress (spec §8 G3a,
|
|
3
|
+
* "Stuck-`processing` recovery"): an inbound event claimed but never
|
|
4
|
+
* reply_committed (the holder crashed or was fenced mid-turn) is re-run by the
|
|
5
|
+
* CURRENT lease holder from the ledger entry's stored input. The fenced/crashed
|
|
6
|
+
* holder's abandoned output is discarded; the re-run produces the reply that was
|
|
7
|
+
* lost, and the gate's dedup makes a provider redelivery of the same event a
|
|
8
|
+
* no-op.
|
|
9
|
+
*
|
|
10
|
+
* Pure orchestration over injected deps so it is a tested unit (no Telegram /
|
|
11
|
+
* server coupling here). server.ts supplies `reinject` (set the per-topic
|
|
12
|
+
* current-inbound key, then route the stored text exactly as a fresh forward
|
|
13
|
+
* would) and `holdsLease`.
|
|
14
|
+
*
|
|
15
|
+
* Bounded against replay-storms: only entries stuck past `maxProcessingMs` (a
|
|
16
|
+
* turn that genuinely timed out, not one in flight) and only while
|
|
17
|
+
* `attempts < maxReplayAttempts` (a message the agent legitimately never
|
|
18
|
+
* answered is not re-run forever). Lease-gated: a standby never re-injects.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Re-run inbound events stranded in `processing`. Idempotent-safe to call
|
|
22
|
+
* repeatedly (boot + on a cadence): a re-run re-claims under the current epoch,
|
|
23
|
+
* and the eventual reply commits the entry so it is not re-run again.
|
|
24
|
+
*/
|
|
25
|
+
export function recoverStuckMessages(deps) {
|
|
26
|
+
const maxAttempts = deps.maxReplayAttempts ?? 3;
|
|
27
|
+
if (!deps.holdsLease())
|
|
28
|
+
return { recovered: 0, skipped: 0 };
|
|
29
|
+
const stuck = deps.ledger.reclaimStuck(deps.maxProcessingMs, deps.now ? deps.now() : undefined);
|
|
30
|
+
let recovered = 0;
|
|
31
|
+
let skipped = 0;
|
|
32
|
+
for (const entry of stuck) {
|
|
33
|
+
if (!entry.inputSnapshot || !entry.topic) {
|
|
34
|
+
skipped++;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (entry.attempts >= maxAttempts) {
|
|
38
|
+
// Re-run budget exhausted — leave it (a message that legitimately never
|
|
39
|
+
// got a reply, or a persistently failing turn) rather than loop forever.
|
|
40
|
+
deps.logger?.(`stuck-recovery: giving up on ${entry.dedupeKey} after ${entry.attempts} attempts`);
|
|
41
|
+
skipped++;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Re-claim under the current epoch (bumps attempts) and re-route the turn.
|
|
45
|
+
deps.ledger.beginProcessing(entry.dedupeKey, deps.epoch);
|
|
46
|
+
deps.reinject(entry.topic, entry.dedupeKey, entry.inputSnapshot);
|
|
47
|
+
deps.logger?.(`stuck-recovery: re-ran ${entry.dedupeKey} (attempt ${entry.attempts + 1})`);
|
|
48
|
+
recovered++;
|
|
49
|
+
}
|
|
50
|
+
return { recovered, skipped };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=stuckMessageRecovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stuckMessageRecovery.js","sourceRoot":"","sources":["../../src/messaging/stuckMessageRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyBH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAE5D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChG,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;YAClC,wEAAwE;YACxE,yEAAyE;YACzE,IAAI,CAAC,MAAM,EAAE,CAAC,gCAAgC,KAAK,CAAC,SAAS,UAAU,KAAK,CAAC,QAAQ,WAAW,CAAC,CAAC;YAClG,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC,0BAA0B,KAAK,CAAC,SAAS,aAAa,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3F,SAAS,EAAE,CAAC;IACd,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"releaseReadinessWiring.d.ts","sourceRoot":"","sources":["../../src/monitoring/releaseReadinessWiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EACV,4BAA4B,EAC5B,cAAc,EAGd,aAAa,EACd,MAAM,+BAA+B,CAAC;AAGvC,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,QAA0E,CAAC;AAE3G,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAoBzC;AAgBD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,0BAA0B,GAAG,4BAA4B,
|
|
1
|
+
{"version":3,"file":"releaseReadinessWiring.d.ts","sourceRoot":"","sources":["../../src/monitoring/releaseReadinessWiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EACV,4BAA4B,EAC5B,cAAc,EAGd,aAAa,EACd,MAAM,+BAA+B,CAAC;AAGvC,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,QAA0E,CAAC;AAE3G,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAoBzC;AAgBD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,0BAA0B,GAAG,4BAA4B,CAmJxG;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,yBAAyB,UAAQ,GAAG,cAAc,CAevG;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAKjF;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,eAAe,CAclB"}
|
|
@@ -38,7 +38,7 @@ export function isAnalyzableRepo(repoPath) {
|
|
|
38
38
|
export function resolveCanonicalRemote(repoPath, configured) {
|
|
39
39
|
let remotesRaw = '';
|
|
40
40
|
try {
|
|
41
|
-
remotesRaw = SafeGitExecutor.run(['remote', '-v'], { cwd: repoPath, operation: 'releaseReadinessWiring:resolveRemote' });
|
|
41
|
+
remotesRaw = SafeGitExecutor.run(['remote', '-v'], { cwd: repoPath, operation: 'releaseReadinessWiring:resolveRemote', sourceTreeReadOk: true });
|
|
42
42
|
}
|
|
43
43
|
catch {
|
|
44
44
|
return { remote: configured ?? 'origin', overridden: configured != null };
|
|
@@ -109,6 +109,7 @@ export function buildReleaseReadinessDeps(opts) {
|
|
|
109
109
|
const headSha = SafeGitExecutor.run(['rev-parse', 'FETCH_HEAD'], {
|
|
110
110
|
cwd: opts.repoPath,
|
|
111
111
|
operation: 'releaseReadinessWiring:revparse',
|
|
112
|
+
sourceTreeReadOk: true,
|
|
112
113
|
}).trim();
|
|
113
114
|
return { ok: true, headSha };
|
|
114
115
|
}
|
|
@@ -149,7 +150,7 @@ export function buildReleaseReadinessDeps(opts) {
|
|
|
149
150
|
},
|
|
150
151
|
oldestUnreleasedCommit: async (lastTag, ref) => {
|
|
151
152
|
try {
|
|
152
|
-
const raw = SafeGitExecutor.run(['log', `${lastTag}..${ref}`, '--no-merges', '--reverse', '--format=%H %ct'], { cwd: opts.repoPath, operation: 'releaseReadinessWiring:oldest' }).trim();
|
|
153
|
+
const raw = SafeGitExecutor.run(['log', `${lastTag}..${ref}`, '--no-merges', '--reverse', '--format=%H %ct'], { cwd: opts.repoPath, operation: 'releaseReadinessWiring:oldest', sourceTreeReadOk: true }).trim();
|
|
153
154
|
const first = raw.split('\n').filter(Boolean)[0];
|
|
154
155
|
if (!first)
|
|
155
156
|
return null;
|
|
@@ -198,6 +199,7 @@ export function buildReleaseReadinessDeps(opts) {
|
|
|
198
199
|
SafeGitExecutor.run(['merge-base', '--is-ancestor', sha, ref], {
|
|
199
200
|
cwd: opts.repoPath,
|
|
200
201
|
operation: 'releaseReadinessWiring:isAncestor',
|
|
202
|
+
sourceTreeReadOk: true,
|
|
201
203
|
});
|
|
202
204
|
return true;
|
|
203
205
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"releaseReadinessWiring.js","sourceRoot":"","sources":["../../src/monitoring/releaseReadinessWiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAQ7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,uEAAuE,CAAC;AAmB3G,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;YACnE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,UAAmB;IAEnB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,sCAAsC,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"releaseReadinessWiring.js","sourceRoot":"","sources":["../../src/monitoring/releaseReadinessWiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -125,6 +125,70 @@ export declare class AgentServer {
|
|
|
125
125
|
autonomousEvolution?: import('../core/AutonomousEvolution.js').AutonomousEvolution;
|
|
126
126
|
coordinator?: MultiMachineCoordinator;
|
|
127
127
|
localSigningKeyPem?: string;
|
|
128
|
+
/** Lease wire transport — receives peer lease broadcasts at /api/lease (spec §6). */
|
|
129
|
+
leaseTransport?: {
|
|
130
|
+
recordObserved: (lease: any) => void;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Handoff wire transport — the point-to-point ack/yield channel for the
|
|
134
|
+
* planned handoff (spec §8 G3d/G3e). The /api/handoff/ack route delivers the
|
|
135
|
+
* incoming machine's verified echo via recordAck (resolves the outgoing's
|
|
136
|
+
* awaitAck); /api/handoff/yield delivers the explicit yield via recordYield
|
|
137
|
+
* (fires the incoming's registered yield handler → lease CAS). Absent → both
|
|
138
|
+
* routes 503 (honest not-wired), never a silent ok.
|
|
139
|
+
*/
|
|
140
|
+
handoffWireTransport?: {
|
|
141
|
+
recordAck: (ack: any) => void;
|
|
142
|
+
recordYield: () => void;
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Incoming-side begin handler — invoked when a peer POSTs /api/handoff/begin
|
|
146
|
+
* with its flush manifest (spec §8 G3d). server.ts binds this to store the
|
|
147
|
+
* manifest and drive the HandoffReceiver's onBeginHandoff (build + send ack).
|
|
148
|
+
* Absent → the begin route 503s.
|
|
149
|
+
*/
|
|
150
|
+
onHandoffBegin?: (manifest: unknown, fromMachineId: string) => void;
|
|
151
|
+
/**
|
|
152
|
+
* Outgoing-side planned-handoff trigger (spec §8 G3e). server.ts binds this
|
|
153
|
+
* to handoffSentinelWiring.initiate — the operator/test "hand off now" entry
|
|
154
|
+
* point behind POST /handoff/initiate. Absent → the route 503s (not wired).
|
|
155
|
+
*/
|
|
156
|
+
onHandoffInitiate?: () => Promise<'handed-off' | 'aborted-stay-awake' | 'failed'>;
|
|
157
|
+
/**
|
|
158
|
+
* Race-guard read for the planned handoff (HandoffSentinel.inProgress). The
|
|
159
|
+
* reaper/scheduler can consult it so they do not act mid-handoff; also
|
|
160
|
+
* surfaced at GET /handoff/status.
|
|
161
|
+
*/
|
|
162
|
+
handoffInProgress?: () => boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Exactly-once ingress ledger (spec §8 G3a) — present ONLY when
|
|
165
|
+
* multiMachine.exactlyOnceIngress is enabled (server.ts constructs it).
|
|
166
|
+
* Absent → the inbound/outbound message path behaves exactly as before.
|
|
167
|
+
*/
|
|
168
|
+
messageLedger?: import('../messaging/MessageProcessingLedger.js').MessageProcessingLedger;
|
|
169
|
+
/** Per-topic current-inbound dedupeKey map; paired with messageLedger. */
|
|
170
|
+
currentInboundByTopic?: Map<string, string>;
|
|
171
|
+
/**
|
|
172
|
+
* Cross-machine reply-marker propagation (spec §8 G3a). The outbound reply
|
|
173
|
+
* path broadcasts a marker to standby peers when a reply commits; present only
|
|
174
|
+
* when the exactly-once ledger is wired. Absent → no cross-machine propagation.
|
|
175
|
+
*/
|
|
176
|
+
replyMarkerTransport?: import('../core/ReplyMarkerTransport.js').ReplyMarkerTransport;
|
|
177
|
+
/** Apply a peer's reply marker (→ machineRoutes /api/message-marker → ledger.applyRemoteReplyMarker). */
|
|
178
|
+
onReplyMarker?: (marker: unknown, fromMachineId: string) => void;
|
|
179
|
+
/**
|
|
180
|
+
* Live-tail receiver — decrypts + applies a peer's encrypted live-tail flush
|
|
181
|
+
* received at /api/live-tail (spec §8 G3b/c). Throws on decrypt/verify failure.
|
|
182
|
+
*/
|
|
183
|
+
liveTailReceiver?: (flush: {
|
|
184
|
+
topic: string;
|
|
185
|
+
seq: number;
|
|
186
|
+
enc: unknown;
|
|
187
|
+
redactionVersion?: number;
|
|
188
|
+
}, fromMachineId: string) => {
|
|
189
|
+
applied: boolean;
|
|
190
|
+
reason: string;
|
|
191
|
+
} | void;
|
|
128
192
|
whatsapp?: import('../messaging/WhatsAppAdapter.js').WhatsAppAdapter;
|
|
129
193
|
slack?: import('../messaging/slack/SlackAdapter.js').SlackAdapter;
|
|
130
194
|
imessage?: import('../messaging/imessage/IMessageAdapter.js').IMessageAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAgB,EAAE,KAAK,OAAO,EAA+B,MAAM,SAAS,CAAC;AAM7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ import { FailureAttributionEngine } from '../monitoring/FailureAttributionEngine
|
|
|
25
25
|
import { SafeGitExecutor } from '../core/SafeGitExecutor.js';
|
|
26
26
|
import { createSpecReviewRoutes } from './specReviewRoutes.js';
|
|
27
27
|
import { createUsherRoutes } from './usherRoutes.js';
|
|
28
|
+
import { createHandoffInitiateRoutes } from './handoffInitiateRoutes.js';
|
|
28
29
|
import { corsMiddleware, authMiddleware, requestTimeout, buildRequestTimeoutOverrides, errorHandler, dashboardSecurityHeaders } from './middleware.js';
|
|
29
30
|
import { WebSocketManager } from './WebSocketManager.js';
|
|
30
31
|
import { assertSqliteAvailable, PendingRelayStore } from '../messaging/pending-relay-store.js';
|
|
@@ -195,6 +196,18 @@ export class AgentServer {
|
|
|
195
196
|
state: { jobs: [], sessions: [] },
|
|
196
197
|
}),
|
|
197
198
|
messageRouter: options.messageRouter ?? null,
|
|
199
|
+
onLeaseReceived: options.leaseTransport
|
|
200
|
+
? (lease) => options.leaseTransport.recordObserved(lease)
|
|
201
|
+
: undefined,
|
|
202
|
+
onLiveTailReceived: options.liveTailReceiver,
|
|
203
|
+
onHandoffAck: options.handoffWireTransport
|
|
204
|
+
? (ack) => options.handoffWireTransport.recordAck(ack)
|
|
205
|
+
: undefined,
|
|
206
|
+
onHandoffYield: options.handoffWireTransport
|
|
207
|
+
? () => options.handoffWireTransport.recordYield()
|
|
208
|
+
: undefined,
|
|
209
|
+
onHandoffBegin: options.onHandoffBegin,
|
|
210
|
+
onReplyMarker: options.onReplyMarker,
|
|
198
211
|
});
|
|
199
212
|
this.app.use(machineRoutes);
|
|
200
213
|
}
|
|
@@ -454,6 +467,9 @@ export class AgentServer {
|
|
|
454
467
|
taskFlowRegistry: options.taskFlowRegistry ?? null,
|
|
455
468
|
threadlineFlowBridge: options.threadlineFlowBridge ?? null,
|
|
456
469
|
coordinator: options.coordinator ?? null,
|
|
470
|
+
messageLedger: options.messageLedger ?? null,
|
|
471
|
+
currentInboundByTopic: options.currentInboundByTopic ?? null,
|
|
472
|
+
replyMarkerTransport: options.replyMarkerTransport ?? null,
|
|
457
473
|
startTime: this.startTime,
|
|
458
474
|
};
|
|
459
475
|
this.routeContext = routeCtx;
|
|
@@ -523,6 +539,14 @@ export class AgentServer {
|
|
|
523
539
|
// Mounted unconditionally; 503-stubs when the store is absent. Signal-only.
|
|
524
540
|
// Spec: docs/specs/cwa-usher.md.
|
|
525
541
|
this.app.use(createUsherRoutes({ signalStore: options.usherSignalStore ?? null }));
|
|
542
|
+
// Planned-handoff operator/test trigger (spec §8 G3e). Bearer-authed (mounted
|
|
543
|
+
// after the global auth middleware). server.ts supplies onHandoffInitiate +
|
|
544
|
+
// handoffInProgress from the outgoing-side handoffSentinelWiring; absent →
|
|
545
|
+
// the /handoff surface 503s honestly.
|
|
546
|
+
this.app.use(createHandoffInitiateRoutes({
|
|
547
|
+
onInitiate: options.onHandoffInitiate ?? null,
|
|
548
|
+
inProgress: options.handoffInProgress ?? null,
|
|
549
|
+
}));
|
|
526
550
|
// Error handler (must be last)
|
|
527
551
|
this.app.use(errorHandler);
|
|
528
552
|
}
|