instar 1.3.43 → 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.
Files changed (99) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +292 -3
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/HandoffReceiver.d.ts +56 -0
  5. package/dist/core/HandoffReceiver.d.ts.map +1 -0
  6. package/dist/core/HandoffReceiver.js +103 -0
  7. package/dist/core/HandoffReceiver.js.map +1 -0
  8. package/dist/core/HandoffWireTransport.d.ts +61 -0
  9. package/dist/core/HandoffWireTransport.d.ts.map +1 -0
  10. package/dist/core/HandoffWireTransport.js +114 -0
  11. package/dist/core/HandoffWireTransport.js.map +1 -0
  12. package/dist/core/HttpLeaseTransport.d.ts +68 -0
  13. package/dist/core/HttpLeaseTransport.d.ts.map +1 -0
  14. package/dist/core/HttpLeaseTransport.js +97 -0
  15. package/dist/core/HttpLeaseTransport.js.map +1 -0
  16. package/dist/core/HttpLiveTailTransport.d.ts +88 -0
  17. package/dist/core/HttpLiveTailTransport.d.ts.map +1 -0
  18. package/dist/core/HttpLiveTailTransport.js +95 -0
  19. package/dist/core/HttpLiveTailTransport.js.map +1 -0
  20. package/dist/core/LeaseCoordinator.d.ts +14 -0
  21. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  22. package/dist/core/LeaseCoordinator.js +38 -0
  23. package/dist/core/LeaseCoordinator.js.map +1 -1
  24. package/dist/core/LiveTailSource.d.ts +65 -0
  25. package/dist/core/LiveTailSource.d.ts.map +1 -0
  26. package/dist/core/LiveTailSource.js +87 -0
  27. package/dist/core/LiveTailSource.js.map +1 -0
  28. package/dist/core/MultiMachineCoordinator.d.ts +14 -0
  29. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  30. package/dist/core/MultiMachineCoordinator.js +22 -0
  31. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  32. package/dist/core/ReplyMarkerTransport.d.ts +58 -0
  33. package/dist/core/ReplyMarkerTransport.d.ts.map +1 -0
  34. package/dist/core/ReplyMarkerTransport.js +66 -0
  35. package/dist/core/ReplyMarkerTransport.js.map +1 -0
  36. package/dist/core/handoffReceiverWiring.d.ts +57 -0
  37. package/dist/core/handoffReceiverWiring.d.ts.map +1 -0
  38. package/dist/core/handoffReceiverWiring.js +65 -0
  39. package/dist/core/handoffReceiverWiring.js.map +1 -0
  40. package/dist/core/handoffSentinelBootWiring.d.ts +53 -0
  41. package/dist/core/handoffSentinelBootWiring.d.ts.map +1 -0
  42. package/dist/core/handoffSentinelBootWiring.js +52 -0
  43. package/dist/core/handoffSentinelBootWiring.js.map +1 -0
  44. package/dist/core/handoffSentinelWiring.d.ts +60 -0
  45. package/dist/core/handoffSentinelWiring.d.ts.map +1 -0
  46. package/dist/core/handoffSentinelWiring.js +59 -0
  47. package/dist/core/handoffSentinelWiring.js.map +1 -0
  48. package/dist/core/seamlessnessConfig.d.ts +8 -0
  49. package/dist/core/seamlessnessConfig.d.ts.map +1 -1
  50. package/dist/core/seamlessnessConfig.js +1 -0
  51. package/dist/core/seamlessnessConfig.js.map +1 -1
  52. package/dist/core/types.d.ts +6 -0
  53. package/dist/core/types.d.ts.map +1 -1
  54. package/dist/core/types.js.map +1 -1
  55. package/dist/messaging/TelegramAdapter.d.ts +6 -0
  56. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  57. package/dist/messaging/TelegramAdapter.js +8 -0
  58. package/dist/messaging/TelegramAdapter.js.map +1 -1
  59. package/dist/messaging/ingressDedup.d.ts +55 -0
  60. package/dist/messaging/ingressDedup.d.ts.map +1 -0
  61. package/dist/messaging/ingressDedup.js +69 -0
  62. package/dist/messaging/ingressDedup.js.map +1 -0
  63. package/dist/messaging/stuckMessageRecovery.d.ts +46 -0
  64. package/dist/messaging/stuckMessageRecovery.d.ts.map +1 -0
  65. package/dist/messaging/stuckMessageRecovery.js +52 -0
  66. package/dist/messaging/stuckMessageRecovery.js.map +1 -0
  67. package/dist/server/AgentServer.d.ts +64 -0
  68. package/dist/server/AgentServer.d.ts.map +1 -1
  69. package/dist/server/AgentServer.js +24 -0
  70. package/dist/server/AgentServer.js.map +1 -1
  71. package/dist/server/handoffInitiateRoutes.d.ts +40 -0
  72. package/dist/server/handoffInitiateRoutes.d.ts.map +1 -0
  73. package/dist/server/handoffInitiateRoutes.js +57 -0
  74. package/dist/server/handoffInitiateRoutes.js.map +1 -0
  75. package/dist/server/machineRoutes.d.ts +47 -0
  76. package/dist/server/machineRoutes.d.ts.map +1 -1
  77. package/dist/server/machineRoutes.js +138 -0
  78. package/dist/server/machineRoutes.js.map +1 -1
  79. package/dist/server/routes.d.ts +20 -0
  80. package/dist/server/routes.d.ts.map +1 -1
  81. package/dist/server/routes.js +65 -0
  82. package/dist/server/routes.js.map +1 -1
  83. package/package.json +1 -1
  84. package/src/data/builtin-manifest.json +49 -49
  85. package/upgrades/1.3.44.md +72 -0
  86. package/upgrades/side-effects/cross-machine-seamlessness-consent-acquire.md +52 -0
  87. package/upgrades/side-effects/cross-machine-seamlessness-exactly-once-ingress.md +73 -0
  88. package/upgrades/side-effects/cross-machine-seamlessness-handoff-ack-yield.md +82 -0
  89. package/upgrades/side-effects/cross-machine-seamlessness-handoff-begin.md +48 -0
  90. package/upgrades/side-effects/cross-machine-seamlessness-handoff-boot-wiring.md +68 -0
  91. package/upgrades/side-effects/cross-machine-seamlessness-handoff-receiver-wiring.md +52 -0
  92. package/upgrades/side-effects/cross-machine-seamlessness-handoff-receiver.md +46 -0
  93. package/upgrades/side-effects/cross-machine-seamlessness-handoff-sentinel-wiring.md +47 -0
  94. package/upgrades/side-effects/cross-machine-seamlessness-lease-wire.md +46 -0
  95. package/upgrades/side-effects/cross-machine-seamlessness-livetail-source.md +50 -0
  96. package/upgrades/side-effects/cross-machine-seamlessness-livetail-streaming.md +50 -0
  97. package/upgrades/side-effects/cross-machine-seamlessness-livetail-wire.md +65 -0
  98. package/upgrades/side-effects/cross-machine-seamlessness-noloss-recovery.md +61 -0
  99. package/upgrades/side-effects/cross-machine-seamlessness-reply-marker.md +65 -0
@@ -0,0 +1,65 @@
1
+ # Side-Effects Review — Cross-Machine Seamlessness: reply-marker propagation (D-xmachine)
2
+
3
+ **Spec:** docs/specs/CROSS-MACHINE-SEAMLESSNESS-SPEC.md §8 G3a ("dual-medium reply_committed marker")
4
+
5
+ The cross-machine half of exactly-once. The same-machine dedup gate + no-loss recovery handle
6
+ one machine; this closes the window where, AFTER a handoff/failover, a provider redelivery of a
7
+ message the OLD holder already answered arrives at the NEW holder — whose ledger wouldn't know,
8
+ so it would re-answer. The holder now propagates a `reply_committed` marker to standby peers on
9
+ each commit; the standby applies it via `applyRemoteReplyMarker`, so the new holder's dedup gate
10
+ drops the redelivery. Still flag-gated dark (`multiMachine.exactlyOnceIngress`, default false).
11
+
12
+ ## What changed
13
+ - `src/core/ReplyMarkerTransport.ts` — NEW. `broadcast(marker)` signs + POSTs
14
+ {dedupeKey, platform, replyIdempotencyKey, epoch, topic} to each standby peer's
15
+ `/api/message-marker` over the authenticated machine channel. NO encryption (the marker
16
+ carries no conversation content — authentication only). No peers → reachable no-op. Never
17
+ throws (best-effort; the dedup gate + provider redelivery are the backstop).
18
+ - `src/server/machineRoutes.ts` — `POST /api/message-marker` (machineAuth) + `onReplyMarker`
19
+ ctx callback. Validates the marker shape; 503 when no receiver (exactly-once off).
20
+ - `src/server/AgentServer.ts` — `replyMarkerTransport?` + `onReplyMarker?` options → routeCtx /
21
+ machineRoutes.
22
+ - `src/server/routes.ts` — RouteContext.replyMarkerTransport; the outbound commit at
23
+ `/telegram/reply/:topicId` reads the just-committed `replyIdempotencyKey` from the ledger and
24
+ fires `replyMarkerTransport.broadcast(...)` (fire-and-forget, after the local commit).
25
+ - `src/commands/server.ts` — constructs `ReplyMarkerTransport` (peer resolver = registry
26
+ machines with a lastKnownUrl) ONLY when `exactlyOnceIngress` + coordinator.enabled; wires
27
+ `onReplyMarker` → `messageLedger.applyRemoteReplyMarker`.
28
+
29
+ ## Over-block / under-block
30
+ - The marker NEVER over-marks a fresh event: `applyRemoteReplyMarker` only sets reply_committed
31
+ on an entry not already acted-on, and the dedupeKey is the same provider-stable id both
32
+ machines compute — so a marker for event X can only dedup event X. The deterministic
33
+ `replyIdempotencyKey` (hash(dedupeKey+index)) is identical on both machines.
34
+ - UNDER-propagate (a lost marker): best-effort — if the marker doesn't reach the standby, the
35
+ provider's at-least-once redelivery + the standby's own ledger (once it catches up) still
36
+ dedup; the residual is the documented single-duplicate Two-Generals floor, not a new failure.
37
+ - Signed channel: `/api/message-marker` requires machineAuth (unsigned → 401, proven in the e2e);
38
+ the marker carries no secrets so no encryption is needed.
39
+
40
+ ## Signal vs authority
41
+ - The transport propagates; the receiving ledger's `applyRemoteReplyMarker` is the authority on
42
+ its own state (only promotes a not-yet-acted entry). The dedup gate remains the single drop authority.
43
+
44
+ ## Interactions
45
+ - Fires AFTER the local `commitInboundReply` (the local guarantee never depends on propagation).
46
+ - Skipped for proxy/system sends (same guard as the commit) — a proxy message isn't a user reply.
47
+ - Peer resolver mirrors the live-tail/handoff resolvers (registry machines with lastKnownUrl,
48
+ excludes self/revoked). Solo agent → no peers → no-op.
49
+
50
+ ## Rollback cost
51
+ - Low. Flag default-off ⇒ transport not constructed, route 503s, no propagation. Revert = drop
52
+ the transport + route + the broadcast call. No persisted schema.
53
+
54
+ ## Tests
55
+ - `tests/unit/reply-marker-transport.test.ts` (3): no-peers no-op; signs + POSTs to each peer;
56
+ resolves false (never throws) when all peers reject.
57
+ - `tests/e2e/reply-marker-cross-machine-e2e.test.ts` (2): a PEER-signed marker over real HTTP +
58
+ machine-auth applies to the receiver's ledger, then a redelivery of that message is DEDUPED
59
+ (already-replied) — the cross-machine guarantee end-to-end; + unsigned marker rejected (401).
60
+
61
+ ## Completion status
62
+ - With D-dedup + D-noloss + D-xmachine, the exactly-once guarantee is COMPLETE in all dimensions
63
+ (no-dup same+cross machine, no-loss on crash), all DARK behind the flag. Remaining before the
64
+ flag flips: D3 (CONTINUATION resume verify) + the over-Telegram two-machine test-as-self (the
65
+ live acceptance bar, needs the operator's machines).