@seat-mesh/daemon 0.1.26 → 0.1.29

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 (178) hide show
  1. package/dist/border/border-paint.d.ts +13 -0
  2. package/dist/border/border-paint.d.ts.map +1 -0
  3. package/dist/border/border-paint.js +230 -0
  4. package/dist/border/border-paint.js.map +1 -0
  5. package/dist/checkback/checkback-fire.d.ts +8 -0
  6. package/dist/checkback/checkback-fire.d.ts.map +1 -0
  7. package/dist/checkback/checkback-fire.js +52 -0
  8. package/dist/checkback/checkback-fire.js.map +1 -0
  9. package/dist/checkback/checkback-fire.test.d.ts +2 -0
  10. package/dist/checkback/checkback-fire.test.d.ts.map +1 -0
  11. package/dist/checkback/checkback-fire.test.js +36 -0
  12. package/dist/checkback/checkback-fire.test.js.map +1 -0
  13. package/dist/connectivity/cc-limit-retry.d.ts +11 -0
  14. package/dist/connectivity/cc-limit-retry.d.ts.map +1 -0
  15. package/dist/connectivity/cc-limit-retry.js +73 -0
  16. package/dist/connectivity/cc-limit-retry.js.map +1 -0
  17. package/dist/connectivity/connectivity-recovery.d.ts +88 -0
  18. package/dist/connectivity/connectivity-recovery.d.ts.map +1 -0
  19. package/dist/connectivity/connectivity-recovery.js +529 -0
  20. package/dist/connectivity/connectivity-recovery.js.map +1 -0
  21. package/dist/connectivity/connectivity-recovery.test.d.ts +2 -0
  22. package/dist/connectivity/connectivity-recovery.test.d.ts.map +1 -0
  23. package/dist/connectivity/connectivity-recovery.test.js +170 -0
  24. package/dist/connectivity/connectivity-recovery.test.js.map +1 -0
  25. package/dist/connectivity/oc-resume-ack.d.ts +32 -0
  26. package/dist/connectivity/oc-resume-ack.d.ts.map +1 -0
  27. package/dist/connectivity/oc-resume-ack.js +89 -0
  28. package/dist/connectivity/oc-resume-ack.js.map +1 -0
  29. package/dist/connectivity/oc-resume-ack.test.d.ts +2 -0
  30. package/dist/connectivity/oc-resume-ack.test.d.ts.map +1 -0
  31. package/dist/connectivity/oc-resume-ack.test.js +23 -0
  32. package/dist/connectivity/oc-resume-ack.test.js.map +1 -0
  33. package/dist/connectivity/oc-resume.d.ts +25 -0
  34. package/dist/connectivity/oc-resume.d.ts.map +1 -0
  35. package/dist/connectivity/oc-resume.js +84 -0
  36. package/dist/connectivity/oc-resume.js.map +1 -0
  37. package/dist/inbox/delivery-hold.d.ts +11 -0
  38. package/dist/inbox/delivery-hold.d.ts.map +1 -0
  39. package/dist/inbox/delivery-hold.js +34 -0
  40. package/dist/inbox/delivery-hold.js.map +1 -0
  41. package/dist/inbox/delivery-hold.test.d.ts +2 -0
  42. package/dist/inbox/delivery-hold.test.d.ts.map +1 -0
  43. package/dist/inbox/delivery-hold.test.js +40 -0
  44. package/dist/inbox/delivery-hold.test.js.map +1 -0
  45. package/dist/inbox/inbox-overload.d.ts +19 -0
  46. package/dist/inbox/inbox-overload.d.ts.map +1 -0
  47. package/dist/inbox/inbox-overload.js +45 -0
  48. package/dist/inbox/inbox-overload.js.map +1 -0
  49. package/dist/inbox/inbox-overload.test.d.ts +2 -0
  50. package/dist/inbox/inbox-overload.test.d.ts.map +1 -0
  51. package/dist/inbox/inbox-overload.test.js +43 -0
  52. package/dist/inbox/inbox-overload.test.js.map +1 -0
  53. package/dist/inbox/pane-ops-drain.d.ts +14 -0
  54. package/dist/inbox/pane-ops-drain.d.ts.map +1 -0
  55. package/dist/inbox/pane-ops-drain.js +53 -0
  56. package/dist/inbox/pane-ops-drain.js.map +1 -0
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +2 -2
  60. package/dist/index.js.map +1 -1
  61. package/dist/inject/compose-gate.d.ts +23 -0
  62. package/dist/inject/compose-gate.d.ts.map +1 -0
  63. package/dist/inject/compose-gate.js +113 -0
  64. package/dist/inject/compose-gate.js.map +1 -0
  65. package/dist/inject/compose-gate.test.d.ts +2 -0
  66. package/dist/inject/compose-gate.test.d.ts.map +1 -0
  67. package/dist/inject/compose-gate.test.js +35 -0
  68. package/dist/inject/compose-gate.test.js.map +1 -0
  69. package/dist/inject/inject-delivery.d.ts +39 -0
  70. package/dist/inject/inject-delivery.d.ts.map +1 -0
  71. package/dist/inject/inject-delivery.js +171 -0
  72. package/dist/inject/inject-delivery.js.map +1 -0
  73. package/dist/inject/inject-delivery.test.d.ts +2 -0
  74. package/dist/inject/inject-delivery.test.d.ts.map +1 -0
  75. package/dist/inject/inject-delivery.test.js +33 -0
  76. package/dist/inject/inject-delivery.test.js.map +1 -0
  77. package/dist/jsonl-store.d.ts.map +1 -1
  78. package/dist/jsonl-store.js +4 -0
  79. package/dist/jsonl-store.js.map +1 -1
  80. package/dist/mesh-inbox-server.js +13 -13
  81. package/dist/mesh-inbox-server.js.map +1 -1
  82. package/dist/mesh-orchestrator.d.ts.map +1 -1
  83. package/dist/mesh-orchestrator.js +1 -0
  84. package/dist/mesh-orchestrator.js.map +1 -1
  85. package/dist/notify/notify-act-ui.d.ts +7 -0
  86. package/dist/notify/notify-act-ui.d.ts.map +1 -0
  87. package/dist/notify/notify-act-ui.js +59 -0
  88. package/dist/notify/notify-act-ui.js.map +1 -0
  89. package/dist/notify/notify-act.d.ts +45 -0
  90. package/dist/notify/notify-act.d.ts.map +1 -0
  91. package/dist/notify/notify-act.js +133 -0
  92. package/dist/notify/notify-act.js.map +1 -0
  93. package/dist/notify/notify-act.test.d.ts +2 -0
  94. package/dist/notify/notify-act.test.d.ts.map +1 -0
  95. package/dist/notify/notify-act.test.js +29 -0
  96. package/dist/notify/notify-act.test.js.map +1 -0
  97. package/dist/orchestrator/mesh-orchestrator.d.ts +32 -0
  98. package/dist/orchestrator/mesh-orchestrator.d.ts.map +1 -0
  99. package/dist/orchestrator/mesh-orchestrator.js +642 -0
  100. package/dist/orchestrator/mesh-orchestrator.js.map +1 -0
  101. package/dist/orchestrator/orchestrator.d.ts +17 -0
  102. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  103. package/dist/orchestrator/orchestrator.js +11 -0
  104. package/dist/orchestrator/orchestrator.js.map +1 -0
  105. package/dist/orchestrator/workers.d.ts +11 -0
  106. package/dist/orchestrator/workers.d.ts.map +1 -0
  107. package/dist/orchestrator/workers.js +12 -0
  108. package/dist/orchestrator/workers.js.map +1 -0
  109. package/dist/peer/peer-backlog.d.ts +18 -0
  110. package/dist/peer/peer-backlog.d.ts.map +1 -0
  111. package/dist/peer/peer-backlog.js +288 -0
  112. package/dist/peer/peer-backlog.js.map +1 -0
  113. package/dist/peer/peer-backlog.test.d.ts +2 -0
  114. package/dist/peer/peer-backlog.test.d.ts.map +1 -0
  115. package/dist/peer/peer-backlog.test.js +38 -0
  116. package/dist/peer/peer-backlog.test.js.map +1 -0
  117. package/dist/peer/peer-comms-checkback.d.ts +5 -0
  118. package/dist/peer/peer-comms-checkback.d.ts.map +1 -0
  119. package/dist/peer/peer-comms-checkback.js +68 -0
  120. package/dist/peer/peer-comms-checkback.js.map +1 -0
  121. package/dist/peer/peer-pending.d.ts +9 -0
  122. package/dist/peer/peer-pending.d.ts.map +1 -0
  123. package/dist/peer/peer-pending.js +19 -0
  124. package/dist/peer/peer-pending.js.map +1 -0
  125. package/dist/peer/peer-pending.test.d.ts +2 -0
  126. package/dist/peer/peer-pending.test.d.ts.map +1 -0
  127. package/dist/peer/peer-pending.test.js +76 -0
  128. package/dist/peer/peer-pending.test.js.map +1 -0
  129. package/dist/peer/peer-skip.d.ts +20 -0
  130. package/dist/peer/peer-skip.d.ts.map +1 -0
  131. package/dist/peer/peer-skip.js +56 -0
  132. package/dist/peer/peer-skip.js.map +1 -0
  133. package/dist/peer/peer-skip.test.d.ts +2 -0
  134. package/dist/peer/peer-skip.test.d.ts.map +1 -0
  135. package/dist/peer/peer-skip.test.js +63 -0
  136. package/dist/peer/peer-skip.test.js.map +1 -0
  137. package/dist/peer/peer-target-resolve.d.ts +8 -0
  138. package/dist/peer/peer-target-resolve.d.ts.map +1 -0
  139. package/dist/peer/peer-target-resolve.js +13 -0
  140. package/dist/peer/peer-target-resolve.js.map +1 -0
  141. package/dist/peer-backlog.d.ts.map +1 -1
  142. package/dist/peer-backlog.js +25 -0
  143. package/dist/peer-backlog.js.map +1 -1
  144. package/dist/peer-pending.test.js +17 -0
  145. package/dist/peer-pending.test.js.map +1 -1
  146. package/dist/queue/bullmq-runtime.d.ts +19 -0
  147. package/dist/queue/bullmq-runtime.d.ts.map +1 -0
  148. package/dist/queue/bullmq-runtime.js +78 -0
  149. package/dist/queue/bullmq-runtime.js.map +1 -0
  150. package/dist/state/ppa-state.d.ts +32 -0
  151. package/dist/state/ppa-state.d.ts.map +1 -0
  152. package/dist/state/ppa-state.js +63 -0
  153. package/dist/state/ppa-state.js.map +1 -0
  154. package/dist/store/create-queue-store.d.ts +8 -0
  155. package/dist/store/create-queue-store.d.ts.map +1 -0
  156. package/dist/store/create-queue-store.js +19 -0
  157. package/dist/store/create-queue-store.js.map +1 -0
  158. package/dist/store/jsonl-dedupe.test.d.ts +2 -0
  159. package/dist/store/jsonl-dedupe.test.d.ts.map +1 -0
  160. package/dist/store/jsonl-dedupe.test.js +62 -0
  161. package/dist/store/jsonl-dedupe.test.js.map +1 -0
  162. package/dist/store/jsonl-store.checkback.test.d.ts +2 -0
  163. package/dist/store/jsonl-store.checkback.test.d.ts.map +1 -0
  164. package/dist/store/jsonl-store.checkback.test.js +55 -0
  165. package/dist/store/jsonl-store.checkback.test.js.map +1 -0
  166. package/dist/store/jsonl-store.d.ts +129 -0
  167. package/dist/store/jsonl-store.d.ts.map +1 -0
  168. package/dist/store/jsonl-store.js +316 -0
  169. package/dist/store/jsonl-store.js.map +1 -0
  170. package/dist/store/sqlite-store.d.ts +52 -0
  171. package/dist/store/sqlite-store.d.ts.map +1 -0
  172. package/dist/store/sqlite-store.js +456 -0
  173. package/dist/store/sqlite-store.js.map +1 -0
  174. package/dist/store/sqlite-store.test.d.ts +2 -0
  175. package/dist/store/sqlite-store.test.d.ts.map +1 -0
  176. package/dist/store/sqlite-store.test.js +76 -0
  177. package/dist/store/sqlite-store.test.js.map +1 -0
  178. package/package.json +4 -4
@@ -0,0 +1,642 @@
1
+ import { chatRoomConfigForLoaded, formatCompactSeat, formatGenericCheckback, formatRoomCallCheckback, formatRoomCommsCheckback, isRoomCallExpect, lastInboundRoomFrom, listRoomMessages, meshInboxContinueLead, meshInboxDigestBlock, meshInboxDigestIncomplete, loadBalanceVendorContract, contractsDirFor, hubLockActive, isManagerKind, isSecretaryKind, meshInboxBalanceLeadTick, meshInboxBalanceStatus, parseRoomCommsExpect, resolveAgentId, } from "@seat-mesh/core";
2
+ import { buildMiniCampaignDigest, capturePaneSnapshot, coordPaneForRole, meshManagerPane, meshSecretaryPane, paneMetaForPane, readSeatSnapshot, handleCoordExpectDue, parseCoordExpect, runBalanceAutoActions, runBalanceTick, runSuperviseTick, } from "@seat-mesh/tmux";
3
+ import { paintMeshBorders, paintMeshBordersAsync, } from "../border/border-paint.js";
4
+ import { deliverToPane } from "../inject/inject-delivery.js";
5
+ import { ccLimitRetryFingerprintFromExpect, meshInboxCcLimitRetryContinue, paneMatchesCcLimitFingerprint, } from "../connectivity/cc-limit-retry.js";
6
+ import { isInboxDelivered } from "../store/create-queue-store.js";
7
+ import { drainPaneOpsOnce } from "../inbox/pane-ops-drain.js";
8
+ import { armRecipientCheckbackAfterPeer } from "../peer/peer-comms-checkback.js";
9
+ import { deferCheckbackAfterFailedFire, sortDueCheckbackIndices, } from "../checkback/checkback-fire.js";
10
+ import { isAckClassPeer, parkPeerToBacklog, pendingPeerRows, promotePeerBacklog, shouldBacklogPeerHold, } from "../peer/peer-backlog.js";
11
+ import { markPeerRowSkipped, shouldSkipDeliveredColdStart, shouldSkipDuplicateColdStartResummon, shouldSkipGlobalWorkerRoomPing, shouldSkipManagerStatusRoomPing, isThinRoomUnseenPing, } from "../peer/peer-skip.js";
12
+ import { deliveryHoldForPane } from "../inbox/delivery-hold.js";
13
+ import { refreshPeerTargetPane } from "../peer/peer-target-resolve.js";
14
+ import { evaluateInboxOverload } from "../inbox/inbox-overload.js";
15
+ import { markColdStartDelivered } from "@seat-mesh/tmux";
16
+ function borderConnectivity(ctx) {
17
+ return {
18
+ proxyDownActive: ctx.proxyDownActive === true,
19
+ ocLimitedPaneIds: ctx.ocLimitedPaneIds,
20
+ };
21
+ }
22
+ function gateDelivery(ctx, paneId, opts = {}) {
23
+ const hold = deliveryHoldForPane(ctx, paneId, opts);
24
+ if (hold.hold)
25
+ return { blocked: true, reason: hold.reason };
26
+ if (opts.skipOverload)
27
+ return { blocked: false };
28
+ const ov = evaluateInboxOverload(ctx.store, paneId);
29
+ if (ov.warn && ov.warnMessage) {
30
+ ctx.log(`INBOX overload warn pane=${paneId} triggers=${ov.count} cooldown=10m`);
31
+ deliverToPane(paneId, ov.warnMessage, ctx.registry, {
32
+ force: true,
33
+ skipVerify: true,
34
+ loaded: ctx.loaded,
35
+ workspace: ctx.loaded.workspace,
36
+ });
37
+ }
38
+ if (ov.hold) {
39
+ ctx.log(`INBOX overload hold pane=${paneId} triggers=${ov.count} reason=${ov.reason}`);
40
+ return { blocked: true, reason: ov.reason };
41
+ }
42
+ return { blocked: false };
43
+ }
44
+ /** ACK-class worker mail -> secretary first (harness parity); substance -> manager. */
45
+ export function isAckClassInbox(row) {
46
+ const msg = String(row.msg ?? "").trim();
47
+ return /^(ACK|FYI|STAND-?BY|BUSY|MCP-?SYNCED)\b/i.test(msg);
48
+ }
49
+ function drainInboxLaneOnce(ctx, lane) {
50
+ const rows = ctx.store.readInbox();
51
+ const row = rows.find((r) => {
52
+ if (r.resolved || isInboxDelivered(r))
53
+ return false;
54
+ const ack = isAckClassInbox(r);
55
+ return lane === "secretary" ? ack : !ack;
56
+ });
57
+ if (!row)
58
+ return { attempted: 0, delivered: 0, held: 0 };
59
+ if (row.sent && !row.sentAt) {
60
+ ctx.log(`INBOX forge-reset id=${row.id} (sent:true without sentAt/deliverPane)`);
61
+ row.sent = false;
62
+ }
63
+ const secPane = meshSecretaryPane(ctx.session, ctx.baseWindow);
64
+ const mgrPane = meshManagerPane(ctx.session, ctx.baseWindow);
65
+ const targetPane = lane === "secretary" ? secPane : mgrPane;
66
+ if (!targetPane)
67
+ return { attempted: 0, delivered: 0, held: 0 };
68
+ const payload = ctx.store.formatInboxInject(row, lane);
69
+ const gate = gateDelivery(ctx, targetPane);
70
+ if (gate.blocked) {
71
+ ctx.log(`INBOX held id=${row.id} lane=${lane} reason=${gate.reason}`);
72
+ return { attempted: 1, delivered: 0, held: 1 };
73
+ }
74
+ const result = deliverToPane(targetPane, payload, ctx.registry, { loaded: ctx.loaded,
75
+ workspace: ctx.loaded.workspace });
76
+ if (!result.ok) {
77
+ ctx.log(`INBOX held id=${row.id} lane=${lane} reason=${result.reason}`);
78
+ return { attempted: 1, delivered: 0, held: 1 };
79
+ }
80
+ const at = new Date().toISOString();
81
+ row.sent = true;
82
+ row.sentAt = at;
83
+ row.deliveredTo = lane === "secretary" ? "secretary" : "manager";
84
+ row.deliverPane = targetPane;
85
+ row.deliverMode = result.mode;
86
+ ctx.store.writeInbox(rows);
87
+ ctx.log(`INBOX inject id=${row.id} lane=${lane} slot=${row.slot ?? "-"} to=${row.deliveredTo} provider=${result.providerId} mode=${result.mode} verified=${result.verified}`);
88
+ return { attempted: 1, delivered: 1, held: 0 };
89
+ }
90
+ /** Harness parity: secretary ACK lane + manager substance lane each poll tick. */
91
+ export function drainInboxOnce(ctx) {
92
+ const sec = drainInboxLaneOnce(ctx, "secretary");
93
+ const mgr = drainInboxLaneOnce(ctx, "manager");
94
+ return {
95
+ attempted: sec.attempted + mgr.attempted,
96
+ delivered: sec.delivered + mgr.delivered,
97
+ held: sec.held + mgr.held,
98
+ };
99
+ }
100
+ /** Permanent skip only — empty seats / no_provider must backlog until a CLI loads. */
101
+ const PEER_SKIP_REASONS = new Set(["no_snapshot"]);
102
+ const PEER_KIND_PRIORITY = {
103
+ prompt: 0,
104
+ remind: 1,
105
+ "to-slot": 2,
106
+ "to-mini": 3,
107
+ room: 4,
108
+ };
109
+ function peerRowPriority(row) {
110
+ if (row.fromSlot === "mesh-cold-start")
111
+ return -1;
112
+ return PEER_KIND_PRIORITY[row.kind] ?? 9;
113
+ }
114
+ export function drainPeerOnce(ctx) {
115
+ promotePeerBacklog(ctx.store, ctx.registry, ctx.log);
116
+ const compacted = ctx.store.compactPeer();
117
+ if (compacted > 0) {
118
+ ctx.log(`PEER compact removed ${compacted} duplicate row(s)`);
119
+ }
120
+ const pending = pendingPeerRows(ctx.store).sort((a, b) => peerRowPriority(a) - peerRowPriority(b) || a.at.localeCompare(b.at));
121
+ if (!pending.length)
122
+ return { attempted: 0, delivered: 0, held: 0 };
123
+ let attempted = 0;
124
+ let delivered = 0;
125
+ let held = 0;
126
+ for (const row of pending) {
127
+ if (row.sent && !row.sentAt) {
128
+ ctx.log(`PEER forge-reset id=${row.id} (sent:true without proof)`);
129
+ row.sent = false;
130
+ }
131
+ const { paneId: livePane, rerouted } = refreshPeerTargetPane(ctx.loaded, row);
132
+ if (rerouted) {
133
+ ctx.log(`PEER reroute id=${row.id.slice(0, 8)} ${row.targetLabel} ${row.targetPane}->${livePane}`);
134
+ row.targetPane = livePane;
135
+ const all = ctx.store.readPeer();
136
+ const ri = all.findIndex((r) => r.id === row.id);
137
+ if (ri >= 0) {
138
+ all[ri].targetPane = livePane;
139
+ ctx.store.writePeer(all);
140
+ }
141
+ }
142
+ if (shouldSkipDeliveredColdStart(row)) {
143
+ markPeerRowSkipped(ctx.store, row);
144
+ if (row.fromSlot === "mesh-cold-start") {
145
+ markColdStartDelivered(ctx.loaded, row.targetPane);
146
+ }
147
+ ctx.log(`PEER skip id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=cold-start-already-delivered`);
148
+ continue;
149
+ }
150
+ if (shouldSkipDuplicateColdStartResummon(row, ctx.loaded)) {
151
+ markPeerRowSkipped(ctx.store, row);
152
+ ctx.log(`PEER skip id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=cold-start-resummon-dup`);
153
+ continue;
154
+ }
155
+ if (shouldSkipGlobalWorkerRoomPing(row)) {
156
+ markPeerRowSkipped(ctx.store, row);
157
+ ctx.log(`PEER skip id=${row.id} -> ${row.targetLabel} reason=global-worker-thin-fyi`);
158
+ continue;
159
+ }
160
+ if (shouldSkipManagerStatusRoomPing(row)) {
161
+ markPeerRowSkipped(ctx.store, row);
162
+ ctx.log(`PEER skip id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=manager-status-room`);
163
+ continue;
164
+ }
165
+ if (hubLockActive(ctx.loaded.workspace) &&
166
+ isAckClassPeer(row.msg) &&
167
+ (isManagerKind(row.targetLabel) || isSecretaryKind(row.targetLabel))) {
168
+ markPeerRowSkipped(ctx.store, row);
169
+ ctx.log(`PEER skip id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=hub-lock`);
170
+ continue;
171
+ }
172
+ const isColdStart = row.fromSlot === "mesh-cold-start";
173
+ const gate = gateDelivery(ctx, row.targetPane, { isColdStart });
174
+ if (gate.blocked) {
175
+ if (isThinRoomUnseenPing(row)) {
176
+ markPeerRowSkipped(ctx.store, row);
177
+ ctx.log(`PEER skip id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=thin-room-busy:${gate.reason}`);
178
+ continue;
179
+ }
180
+ ctx.log(`PEER held id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=${gate.reason}`);
181
+ held++;
182
+ continue;
183
+ }
184
+ attempted++;
185
+ const roomPing = row.kind === "room";
186
+ const thinRoomPing = roomPing && /\[mesh-inbox-room\]/.test(row.msg);
187
+ const toManager = isManagerKind(row.targetLabel) ||
188
+ row.targetLabel === "master" ||
189
+ isManagerKind(paneMetaForPane(row.targetPane)?.role ?? "");
190
+ const lightweight = isAckClassPeer(row.msg) || roomPing;
191
+ const result = deliverToPane(row.targetPane, row.msg, ctx.registry, {
192
+ lightweight,
193
+ // Verify cursor-agent pastes — skipVerify hid the pane_input_off inject drop.
194
+ // OpenCode/claude still skip inside deliverToPane when provider needs it.
195
+ // Thin room ledger pings bypass coord idle-settle (manager/manager-b/secretary) —
196
+ // except humanCoTyped panes (profile layout.base.humanCoTyped), which never get that bypass.
197
+ roomPing: thinRoomPing || (roomPing && !toManager),
198
+ loaded: ctx.loaded,
199
+ workspace: ctx.loaded.workspace,
200
+ });
201
+ if (!result.ok) {
202
+ if (PEER_SKIP_REASONS.has(result.reason)) {
203
+ const rows = ctx.store.readPeer();
204
+ const i = rows.findIndex((r) => r.id === row.id);
205
+ if (i >= 0) {
206
+ rows[i].sent = true;
207
+ rows[i].sentAt = new Date().toISOString();
208
+ rows[i].deliverPane = "skipped";
209
+ rows[i].deliverMode = "idle";
210
+ ctx.store.writePeer(rows);
211
+ }
212
+ if (isColdStart) {
213
+ markColdStartDelivered(ctx.loaded, row.targetPane);
214
+ }
215
+ ctx.log(`PEER skip id=${row.id} -> ${row.targetLabel} reason=${result.reason}`);
216
+ continue;
217
+ }
218
+ if (shouldBacklogPeerHold(result.reason, row.msg)) {
219
+ if (isThinRoomUnseenPing(row)) {
220
+ markPeerRowSkipped(ctx.store, row);
221
+ ctx.log(`PEER skip id=${row.id.slice(0, 8)} -> ${row.targetLabel} reason=thin-room-no-backlog:${result.reason}`);
222
+ continue;
223
+ }
224
+ parkPeerToBacklog(ctx.store, row, result.reason, ctx.log);
225
+ continue;
226
+ }
227
+ ctx.log(`PEER held id=${row.id} reason=${result.reason}`);
228
+ held++;
229
+ continue;
230
+ }
231
+ const rows = ctx.store.readPeer();
232
+ const i = rows.findIndex((r) => r.id === row.id);
233
+ if (i >= 0) {
234
+ const at = new Date().toISOString();
235
+ rows[i].sent = true;
236
+ rows[i].sentAt = at;
237
+ rows[i].deliverPane = row.targetPane;
238
+ rows[i].deliverMode = result.mode;
239
+ rows[i].injectedPane = row.targetPane;
240
+ rows[i].injectedAt = at;
241
+ ctx.store.writePeer(rows);
242
+ }
243
+ const from = row.kind === "room"
244
+ ? row.fromSlot
245
+ : row.kind === "prompt" || row.kind === "remind"
246
+ ? row.fromSlot
247
+ : `slot-${row.fromSlot}`;
248
+ ctx.log(`PEER inject ${row.kind} -> ${row.targetLabel} from ${from} provider=${result.providerId} mode=${result.mode}`);
249
+ if (isColdStart) {
250
+ markColdStartDelivered(ctx.loaded, row.targetPane);
251
+ }
252
+ armRecipientCheckbackAfterPeer(ctx.store, ctx.loaded, row);
253
+ delivered++;
254
+ }
255
+ return { attempted, delivered, held };
256
+ }
257
+ /** Due checkbacks per drain tick — supervise lane + comms (raise when many armed). */
258
+ const CHECKBACK_FIRE_BUDGET = 6;
259
+ /** Cancel legacy per-pane STATUS checkbacks (they spammed manager with Check: injects). */
260
+ function cancelSuperviseStatusCheckbacks(ctx) {
261
+ const rows = ctx.store.readCheckbacks();
262
+ let changed = false;
263
+ for (const row of rows) {
264
+ if (row.status !== "active")
265
+ continue;
266
+ if (row.kind !== "supervise-status" && !row.id.startsWith("cb-supervise-status-"))
267
+ continue;
268
+ row.status = "cancelled";
269
+ row.updatedAt = new Date().toISOString();
270
+ changed = true;
271
+ }
272
+ if (changed)
273
+ ctx.store.writeCheckbacks(rows);
274
+ }
275
+ /** Daemon-native supervise — ledger + optional room STATUS + idle lead CONTINUE (no secretary inject). */
276
+ function deliverSecretarySuperviseTick(ctx, _secPane) {
277
+ cancelSuperviseStatusCheckbacks(ctx);
278
+ const tick = runSuperviseTick(ctx.loaded, {
279
+ session: ctx.session,
280
+ baseWindow: ctx.baseWindow,
281
+ registry: ctx.registry,
282
+ deliverContinue: (role, leadPane) => {
283
+ const msg = meshInboxContinueLead(role);
284
+ const r = deliverToPane(leadPane, msg, ctx.registry, {
285
+ skipVerify: true,
286
+ intent: "continue",
287
+ loaded: ctx.loaded,
288
+ workspace: ctx.loaded.workspace,
289
+ });
290
+ ctx.log(`supervise-continue ${role} ${r.ok ? "ok" : r.reason} pane=${leadPane}`);
291
+ return r.ok;
292
+ },
293
+ });
294
+ ctx.log(`supervise-tick ledger=${tick.wroteLedger} material=${tick.materialChange} room=${tick.roomStatusPosted} nudged=${tick.nudged.join(",") || "none"} line=${tick.statusLine}`);
295
+ return tick.wroteLedger;
296
+ }
297
+ /** Balance lead tick — ledger + room STATUS + auto-assign; pane inject is best-effort only. */
298
+ function deliverBalanceLeadTick(ctx, leadPane) {
299
+ const tick = runBalanceTick(ctx.loaded);
300
+ const auto = runBalanceAutoActions(ctx.loaded, tick);
301
+ const msg = `${meshInboxBalanceStatus(tick.statusLine)} ${meshInboxBalanceLeadTick().replace(/^\[mesh-inbox\] /, "")}`;
302
+ const r = deliverToPane(leadPane, msg, ctx.registry, {
303
+ skipVerify: true,
304
+ force: true,
305
+ intent: "status",
306
+ loaded: ctx.loaded,
307
+ workspace: ctx.loaded.workspace,
308
+ });
309
+ const material = tick.wroteLedger &&
310
+ (auto.roomStatusPosted || auto.autoPullAssigned || auto.balanceeAssigned.length > 0 || r.ok);
311
+ try {
312
+ const doc = loadBalanceVendorContract(contractsDirFor(ctx.loaded));
313
+ ctx.log(`balance-lead-tick material=${material} inject=${r.ok ? "ok" : r.reason} room=${auto.roomStatusPosted} pull=${auto.autoPullAssigned} balancees=${auto.balanceeAssigned.join(",") || "none"} lead=${doc.balance_lead}`);
314
+ }
315
+ catch {
316
+ ctx.log(`balance-lead-tick material=${material} inject=${r.ok ? "ok" : r.reason} pane=${leadPane}`);
317
+ }
318
+ return material;
319
+ }
320
+ function deferFailedFire(ctx, row, now, reason) {
321
+ deferCheckbackAfterFailedFire(row, now);
322
+ ctx.log(`checkback hold-defer id=${row.id} kind=${row.kind ?? "?"} reason=${reason}`);
323
+ }
324
+ export function fireDueCheckbacks(ctx) {
325
+ const now = Date.now();
326
+ const rows = ctx.store.readCheckbacks();
327
+ const dueIndices = sortDueCheckbackIndices(rows, now);
328
+ let processed = 0;
329
+ for (const idx of dueIndices) {
330
+ if (processed >= CHECKBACK_FIRE_BUDGET)
331
+ break;
332
+ processed++;
333
+ const row = rows[idx];
334
+ const pane = row.ownerPane;
335
+ if (!pane)
336
+ continue;
337
+ if (row.kind !== "manager-nudge") {
338
+ const cbGate = gateDelivery(ctx, pane, { allowCheckbackComms: true });
339
+ if (cbGate.blocked) {
340
+ ctx.log(`checkback held id=${row.id} kind=${row.kind} pane=${pane} reason=${cbGate.reason}`);
341
+ deferFailedFire(ctx, row, now, cbGate.reason ?? "overload");
342
+ continue;
343
+ }
344
+ }
345
+ if (row.kind === "mesh-watch") {
346
+ const digest = buildMiniCampaignDigest(ctx.loaded);
347
+ if (digest.allDone) {
348
+ row.status = "cancelled";
349
+ row.updatedAt = new Date().toISOString();
350
+ ctx.log(`mesh-watch AUTO-OFF campaign complete ${digest.done}/${digest.total}`);
351
+ continue;
352
+ }
353
+ const mgrPane = meshManagerPane(ctx.session, ctx.baseWindow);
354
+ const digestBlock = meshInboxDigestBlock(digest.text);
355
+ if (mgrPane) {
356
+ deliverToPane(mgrPane, digestBlock, ctx.registry, { skipVerify: true, loaded: ctx.loaded,
357
+ workspace: ctx.loaded.workspace });
358
+ }
359
+ const secMsg = `${formatCompactSeat({ role: "secretary" })} | ${meshInboxDigestIncomplete({
360
+ done: digest.done,
361
+ total: digest.total,
362
+ openIds: digest.openIds,
363
+ })}`;
364
+ deliverToPane(pane, secMsg, ctx.registry, { skipVerify: true, loaded: ctx.loaded,
365
+ workspace: ctx.loaded.workspace });
366
+ ctx.log(`mesh-watch digest done=${digest.done}/${digest.total} open=${digest.openIds.join(",") || "none"}`);
367
+ }
368
+ else if (row.kind === "manager-nudge") {
369
+ row.status = "cancelled";
370
+ row.updatedAt = new Date().toISOString();
371
+ ctx.log("manager-nudge cancelled (disabled — protect manager lead health)");
372
+ }
373
+ else if (row.kind === "coord-nudge" || (row.kind?.endsWith("-nudge") && row.kind !== "manager-nudge")) {
374
+ const role = row.recipientLabel?.trim() ||
375
+ paneMetaForPane(pane)?.role ||
376
+ "";
377
+ if (!role) {
378
+ ctx.log(`${row.kind} skip (no recipient)`);
379
+ continue;
380
+ }
381
+ const leadPane = coordPaneForRole(ctx.session, ctx.baseWindow, role) || undefined;
382
+ if (leadPane && pane && pane !== leadPane) {
383
+ ctx.log(`${row.kind} retarget ${pane} -> ${leadPane} (supervisee must be ${role})`);
384
+ row.ownerPane = leadPane;
385
+ ctx.store.writeCheckbacks(rows);
386
+ }
387
+ if (leadPane) {
388
+ const snap = readSeatSnapshot(ctx.loaded, { role });
389
+ if ((snap?.tasks.open ?? 0) === 0) {
390
+ ctx.log(`${row.kind} skip (0 open TASKS) pane=${leadPane}`);
391
+ }
392
+ else {
393
+ const cap = capturePaneSnapshot(leadPane);
394
+ const prov = cap ? ctx.registry.detect(cap) : null;
395
+ const state = prov && cap ? prov.composerState(cap) : null;
396
+ const idle = !state ||
397
+ state.phase === "empty" ||
398
+ state.phase === "afk" ||
399
+ state.phase === "plain_shell";
400
+ if (idle) {
401
+ const msg = meshInboxContinueLead(role);
402
+ const r = deliverToPane(leadPane, msg, ctx.registry, {
403
+ skipVerify: true,
404
+ intent: "continue",
405
+ loaded: ctx.loaded,
406
+ workspace: ctx.loaded.workspace,
407
+ });
408
+ ctx.log(`${row.kind} ${r.ok ? "delivered" : r.reason} pane=${leadPane}`);
409
+ // Transient gate hold (e.g. wait-settle) — retry on the next drain tick
410
+ // instead of silently re-arming for the full renewSec (was: nudge could
411
+ // go dark for a whole 5min cycle every time it raced a settle window).
412
+ if (!r.ok) {
413
+ deferFailedFire(ctx, row, now, r.reason ?? "deliver");
414
+ continue;
415
+ }
416
+ }
417
+ else {
418
+ ctx.log(`${row.kind} skip (phase=${state?.phase ?? "?"}) pane=${leadPane}`);
419
+ }
420
+ }
421
+ }
422
+ }
423
+ else if (row.kind === "secretary-supervise") {
424
+ const ok = deliverSecretarySuperviseTick(ctx, pane);
425
+ if (!ok) {
426
+ deferFailedFire(ctx, row, now, "supervise-tick");
427
+ continue;
428
+ }
429
+ }
430
+ else if (row.kind === "cc-limit-retry") {
431
+ const fp = row.sessionFingerprint ??
432
+ ccLimitRetryFingerprintFromExpect(row.expect ?? "") ??
433
+ "";
434
+ if (!fp || !paneMatchesCcLimitFingerprint(ctx.registry, pane, fp)) {
435
+ row.status = "cancelled";
436
+ row.updatedAt = new Date().toISOString();
437
+ ctx.log(`cc-limit-retry cancel pane=${pane} (session replaced)`);
438
+ continue;
439
+ }
440
+ const meta = pane ? paneMetaForPane(pane) : null;
441
+ const role = meta?.role ?? "worker";
442
+ const leadRole = isManagerKind(role) ? role : null;
443
+ const msg = leadRole
444
+ ? meshInboxCcLimitRetryContinue(leadRole)
445
+ : `${formatCompactSeat({
446
+ role,
447
+ slot: meta?.slot,
448
+ mini: meta?.mini,
449
+ ports: meta?.ports,
450
+ })} | [mesh-inbox] intent=limit-retry CONTINUE: limit window passed — resume open TASK/hub (no chat reply)`;
451
+ const r = deliverToPane(pane, msg, ctx.registry, {
452
+ skipVerify: true,
453
+ intent: "limit-retry",
454
+ loaded: ctx.loaded,
455
+ workspace: ctx.loaded.workspace,
456
+ });
457
+ if (!r.ok) {
458
+ deferFailedFire(ctx, row, now, r.reason ?? "deliver");
459
+ continue;
460
+ }
461
+ row.status = "cancelled";
462
+ row.updatedAt = new Date().toISOString();
463
+ ctx.log(`cc-limit-retry delivered pane=${pane}`);
464
+ }
465
+ else if (row.kind === "coord-expect" && row.expect) {
466
+ const parsed = parseCoordExpect(row.expect);
467
+ const pane = row.ownerPane;
468
+ if (!pane)
469
+ continue;
470
+ const outcome = handleCoordExpectDue(ctx.loaded, row.expect);
471
+ if (outcome.met) {
472
+ row.status = "cancelled";
473
+ row.updatedAt = new Date().toISOString();
474
+ ctx.log(`coord-expect met target=${parsed?.target ?? "?"} hub=${parsed?.hub ?? "?"}`);
475
+ continue;
476
+ }
477
+ const msg = `[mesh-inbox] intent=checkback-verify manager | Check: ${row.expect.slice(0, 100)} — ` +
478
+ `${outcome.retried ? "re-assigned" : "stale"} (${outcome.reason}); nudge ${parsed?.target ?? "lead"}`;
479
+ const r = deliverToPane(pane, msg, ctx.registry, {
480
+ skipVerify: true,
481
+ intent: "checkback-verify",
482
+ loaded: ctx.loaded,
483
+ workspace: ctx.loaded.workspace,
484
+ });
485
+ if (!r.ok)
486
+ deferFailedFire(ctx, row, now, r.reason ?? "deliver");
487
+ ctx.log(`coord-expect ${outcome.retried ? "retry" : "hold"} ${outcome.reason}`);
488
+ }
489
+ else if (row.kind === "balance-lead-tick") {
490
+ let role = row.recipientLabel?.trim() || "";
491
+ if (!role) {
492
+ try {
493
+ role = loadBalanceVendorContract(contractsDirFor(ctx.loaded)).balance_lead;
494
+ }
495
+ catch {
496
+ role = "";
497
+ }
498
+ }
499
+ const leadPane = coordPaneForRole(ctx.session, ctx.baseWindow, role) || pane;
500
+ if (leadPane && pane && pane !== leadPane) {
501
+ row.ownerPane = leadPane;
502
+ ctx.store.writeCheckbacks(rows);
503
+ }
504
+ const ok = deliverBalanceLeadTick(ctx, leadPane ?? pane);
505
+ if (!ok) {
506
+ deferFailedFire(ctx, row, now, "balance-tick");
507
+ continue;
508
+ }
509
+ }
510
+ else if (row.expect && (row.kind === "room-call" || isRoomCallExpect(row.expect))) {
511
+ const meta = pane ? paneMetaForPane(pane) : null;
512
+ const msg = formatRoomCallCheckback(row.expect, {
513
+ role: meta?.role || row.recipientLabel || "worker",
514
+ slot: meta?.slot,
515
+ mini: meta?.mini,
516
+ ports: meta?.ports,
517
+ workerCount: ctx.loaded.profile.session.workerCount,
518
+ miniMax: ctx.loaded.profile.session.miniMax,
519
+ });
520
+ const r = deliverToPane(pane, msg, ctx.registry, {
521
+ skipVerify: true,
522
+ intent: "checkback-verify",
523
+ loaded: ctx.loaded,
524
+ workspace: ctx.loaded.workspace,
525
+ });
526
+ if (!r.ok) {
527
+ deferFailedFire(ctx, row, now, r.reason ?? "deliver");
528
+ continue;
529
+ }
530
+ ctx.log(`room-call checkback pane=${pane} expect=${row.expect}`);
531
+ }
532
+ else if (row.expect &&
533
+ (row.kind === "room-comms" || row.expect.startsWith("chat-room:"))) {
534
+ const meta = pane ? paneMetaForPane(pane) : null;
535
+ const parsed = parseRoomCommsExpect(row.expect);
536
+ const selfId = resolveAgentId({
537
+ role: meta?.role || row.recipientLabel || "worker",
538
+ slot: meta?.slot != null ? Number(meta.slot) : null,
539
+ mini: meta?.mini ?? null,
540
+ });
541
+ let from = null;
542
+ if (parsed) {
543
+ try {
544
+ const cfg = chatRoomConfigForLoaded(ctx.loaded);
545
+ from = lastInboundRoomFrom(listRoomMessages(ctx.loaded.workspace, cfg, parsed.slug), selfId);
546
+ }
547
+ catch {
548
+ from = null;
549
+ }
550
+ }
551
+ const msg = formatRoomCommsCheckback(row.expect, {
552
+ role: meta?.role || row.recipientLabel || "worker",
553
+ slot: meta?.slot,
554
+ mini: meta?.mini,
555
+ ports: meta?.ports,
556
+ workerCount: ctx.loaded.profile.session.workerCount,
557
+ miniMax: ctx.loaded.profile.session.miniMax,
558
+ }, from, { verifyOnly: true });
559
+ const r = deliverToPane(pane, msg, ctx.registry, {
560
+ skipVerify: true,
561
+ intent: "checkback-verify",
562
+ loaded: ctx.loaded,
563
+ workspace: ctx.loaded.workspace,
564
+ });
565
+ if (!r.ok) {
566
+ deferFailedFire(ctx, row, now, r.reason ?? "deliver");
567
+ continue;
568
+ }
569
+ ctx.log(`room-comms checkback pane=${pane} expect=${row.expect}`);
570
+ }
571
+ else {
572
+ const meta = pane ? paneMetaForPane(pane) : null;
573
+ const cbCtx = {
574
+ role: meta?.role || row.recipientLabel || "worker",
575
+ slot: meta?.slot,
576
+ mini: meta?.mini,
577
+ ports: meta?.ports,
578
+ workerCount: ctx.loaded.profile.session.workerCount,
579
+ miniMax: ctx.loaded.profile.session.miniMax,
580
+ };
581
+ const expect = row.expect ?? row.kind;
582
+ const msg = formatGenericCheckback(expect, cbCtx);
583
+ const r = deliverToPane(pane, msg, ctx.registry, {
584
+ skipVerify: true,
585
+ intent: "checkback-verify",
586
+ loaded: ctx.loaded,
587
+ workspace: ctx.loaded.workspace,
588
+ });
589
+ if (!r.ok) {
590
+ deferFailedFire(ctx, row, now, r.reason ?? "deliver");
591
+ continue;
592
+ }
593
+ ctx.log(`checkback pane=${pane} expect=${expect.slice(0, 80)}`);
594
+ }
595
+ if (row.renewSec && row.renewSec > 0) {
596
+ row.expiresAt = new Date(now + row.renewSec * 1000).toISOString();
597
+ row.updatedAt = new Date().toISOString();
598
+ }
599
+ else {
600
+ row.status = "cancelled";
601
+ row.updatedAt = new Date().toISOString();
602
+ }
603
+ }
604
+ ctx.store.writeCheckbacks(rows);
605
+ }
606
+ function yieldEventLoop() {
607
+ return new Promise((resolve) => setImmediate(resolve));
608
+ }
609
+ export function orchestratorDrainTick(ctx) {
610
+ if (ctx.paneOps) {
611
+ drainPaneOpsOnce(ctx.paneOps);
612
+ }
613
+ const a = drainInboxOnce(ctx);
614
+ const b = drainPeerOnce(ctx);
615
+ fireDueCheckbacks(ctx);
616
+ paintMeshBorders(ctx.loaded, ctx.registry, ctx.store, ctx.session, ctx.baseWindow, ctx.workersWindow, ctx.minisWindow, new Set(), borderConnectivity(ctx), ctx.store.stateDir);
617
+ return {
618
+ attempted: a.attempted + b.attempted,
619
+ delivered: a.delivered + b.delivered,
620
+ held: a.held + b.held,
621
+ };
622
+ }
623
+ /** Yield between heavy steps so daemon /health can answer during drain. */
624
+ export async function orchestratorDrainTickAsync(ctx) {
625
+ if (ctx.paneOps) {
626
+ drainPaneOpsOnce(ctx.paneOps);
627
+ }
628
+ await yieldEventLoop();
629
+ const a = drainInboxOnce(ctx);
630
+ await yieldEventLoop();
631
+ const b = drainPeerOnce(ctx);
632
+ await yieldEventLoop();
633
+ fireDueCheckbacks(ctx);
634
+ await yieldEventLoop();
635
+ await paintMeshBordersAsync(ctx.loaded, ctx.registry, ctx.store, ctx.session, ctx.baseWindow, ctx.workersWindow, ctx.minisWindow, new Set(), borderConnectivity(ctx), ctx.store.stateDir);
636
+ return {
637
+ attempted: a.attempted + b.attempted,
638
+ delivered: a.delivered + b.delivered,
639
+ held: a.held + b.held,
640
+ };
641
+ }
642
+ //# sourceMappingURL=mesh-orchestrator.js.map