@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.
- package/dist/border/border-paint.d.ts +13 -0
- package/dist/border/border-paint.d.ts.map +1 -0
- package/dist/border/border-paint.js +230 -0
- package/dist/border/border-paint.js.map +1 -0
- package/dist/checkback/checkback-fire.d.ts +8 -0
- package/dist/checkback/checkback-fire.d.ts.map +1 -0
- package/dist/checkback/checkback-fire.js +52 -0
- package/dist/checkback/checkback-fire.js.map +1 -0
- package/dist/checkback/checkback-fire.test.d.ts +2 -0
- package/dist/checkback/checkback-fire.test.d.ts.map +1 -0
- package/dist/checkback/checkback-fire.test.js +36 -0
- package/dist/checkback/checkback-fire.test.js.map +1 -0
- package/dist/connectivity/cc-limit-retry.d.ts +11 -0
- package/dist/connectivity/cc-limit-retry.d.ts.map +1 -0
- package/dist/connectivity/cc-limit-retry.js +73 -0
- package/dist/connectivity/cc-limit-retry.js.map +1 -0
- package/dist/connectivity/connectivity-recovery.d.ts +88 -0
- package/dist/connectivity/connectivity-recovery.d.ts.map +1 -0
- package/dist/connectivity/connectivity-recovery.js +529 -0
- package/dist/connectivity/connectivity-recovery.js.map +1 -0
- package/dist/connectivity/connectivity-recovery.test.d.ts +2 -0
- package/dist/connectivity/connectivity-recovery.test.d.ts.map +1 -0
- package/dist/connectivity/connectivity-recovery.test.js +170 -0
- package/dist/connectivity/connectivity-recovery.test.js.map +1 -0
- package/dist/connectivity/oc-resume-ack.d.ts +32 -0
- package/dist/connectivity/oc-resume-ack.d.ts.map +1 -0
- package/dist/connectivity/oc-resume-ack.js +89 -0
- package/dist/connectivity/oc-resume-ack.js.map +1 -0
- package/dist/connectivity/oc-resume-ack.test.d.ts +2 -0
- package/dist/connectivity/oc-resume-ack.test.d.ts.map +1 -0
- package/dist/connectivity/oc-resume-ack.test.js +23 -0
- package/dist/connectivity/oc-resume-ack.test.js.map +1 -0
- package/dist/connectivity/oc-resume.d.ts +25 -0
- package/dist/connectivity/oc-resume.d.ts.map +1 -0
- package/dist/connectivity/oc-resume.js +84 -0
- package/dist/connectivity/oc-resume.js.map +1 -0
- package/dist/inbox/delivery-hold.d.ts +11 -0
- package/dist/inbox/delivery-hold.d.ts.map +1 -0
- package/dist/inbox/delivery-hold.js +34 -0
- package/dist/inbox/delivery-hold.js.map +1 -0
- package/dist/inbox/delivery-hold.test.d.ts +2 -0
- package/dist/inbox/delivery-hold.test.d.ts.map +1 -0
- package/dist/inbox/delivery-hold.test.js +40 -0
- package/dist/inbox/delivery-hold.test.js.map +1 -0
- package/dist/inbox/inbox-overload.d.ts +19 -0
- package/dist/inbox/inbox-overload.d.ts.map +1 -0
- package/dist/inbox/inbox-overload.js +45 -0
- package/dist/inbox/inbox-overload.js.map +1 -0
- package/dist/inbox/inbox-overload.test.d.ts +2 -0
- package/dist/inbox/inbox-overload.test.d.ts.map +1 -0
- package/dist/inbox/inbox-overload.test.js +43 -0
- package/dist/inbox/inbox-overload.test.js.map +1 -0
- package/dist/inbox/pane-ops-drain.d.ts +14 -0
- package/dist/inbox/pane-ops-drain.d.ts.map +1 -0
- package/dist/inbox/pane-ops-drain.js +53 -0
- package/dist/inbox/pane-ops-drain.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inject/compose-gate.d.ts +23 -0
- package/dist/inject/compose-gate.d.ts.map +1 -0
- package/dist/inject/compose-gate.js +113 -0
- package/dist/inject/compose-gate.js.map +1 -0
- package/dist/inject/compose-gate.test.d.ts +2 -0
- package/dist/inject/compose-gate.test.d.ts.map +1 -0
- package/dist/inject/compose-gate.test.js +35 -0
- package/dist/inject/compose-gate.test.js.map +1 -0
- package/dist/inject/inject-delivery.d.ts +39 -0
- package/dist/inject/inject-delivery.d.ts.map +1 -0
- package/dist/inject/inject-delivery.js +171 -0
- package/dist/inject/inject-delivery.js.map +1 -0
- package/dist/inject/inject-delivery.test.d.ts +2 -0
- package/dist/inject/inject-delivery.test.d.ts.map +1 -0
- package/dist/inject/inject-delivery.test.js +33 -0
- package/dist/inject/inject-delivery.test.js.map +1 -0
- package/dist/jsonl-store.d.ts.map +1 -1
- package/dist/jsonl-store.js +4 -0
- package/dist/jsonl-store.js.map +1 -1
- package/dist/mesh-inbox-server.js +13 -13
- package/dist/mesh-inbox-server.js.map +1 -1
- package/dist/mesh-orchestrator.d.ts.map +1 -1
- package/dist/mesh-orchestrator.js +1 -0
- package/dist/mesh-orchestrator.js.map +1 -1
- package/dist/notify/notify-act-ui.d.ts +7 -0
- package/dist/notify/notify-act-ui.d.ts.map +1 -0
- package/dist/notify/notify-act-ui.js +59 -0
- package/dist/notify/notify-act-ui.js.map +1 -0
- package/dist/notify/notify-act.d.ts +45 -0
- package/dist/notify/notify-act.d.ts.map +1 -0
- package/dist/notify/notify-act.js +133 -0
- package/dist/notify/notify-act.js.map +1 -0
- package/dist/notify/notify-act.test.d.ts +2 -0
- package/dist/notify/notify-act.test.d.ts.map +1 -0
- package/dist/notify/notify-act.test.js +29 -0
- package/dist/notify/notify-act.test.js.map +1 -0
- package/dist/orchestrator/mesh-orchestrator.d.ts +32 -0
- package/dist/orchestrator/mesh-orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/mesh-orchestrator.js +642 -0
- package/dist/orchestrator/mesh-orchestrator.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +17 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +11 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/workers.d.ts +11 -0
- package/dist/orchestrator/workers.d.ts.map +1 -0
- package/dist/orchestrator/workers.js +12 -0
- package/dist/orchestrator/workers.js.map +1 -0
- package/dist/peer/peer-backlog.d.ts +18 -0
- package/dist/peer/peer-backlog.d.ts.map +1 -0
- package/dist/peer/peer-backlog.js +288 -0
- package/dist/peer/peer-backlog.js.map +1 -0
- package/dist/peer/peer-backlog.test.d.ts +2 -0
- package/dist/peer/peer-backlog.test.d.ts.map +1 -0
- package/dist/peer/peer-backlog.test.js +38 -0
- package/dist/peer/peer-backlog.test.js.map +1 -0
- package/dist/peer/peer-comms-checkback.d.ts +5 -0
- package/dist/peer/peer-comms-checkback.d.ts.map +1 -0
- package/dist/peer/peer-comms-checkback.js +68 -0
- package/dist/peer/peer-comms-checkback.js.map +1 -0
- package/dist/peer/peer-pending.d.ts +9 -0
- package/dist/peer/peer-pending.d.ts.map +1 -0
- package/dist/peer/peer-pending.js +19 -0
- package/dist/peer/peer-pending.js.map +1 -0
- package/dist/peer/peer-pending.test.d.ts +2 -0
- package/dist/peer/peer-pending.test.d.ts.map +1 -0
- package/dist/peer/peer-pending.test.js +76 -0
- package/dist/peer/peer-pending.test.js.map +1 -0
- package/dist/peer/peer-skip.d.ts +20 -0
- package/dist/peer/peer-skip.d.ts.map +1 -0
- package/dist/peer/peer-skip.js +56 -0
- package/dist/peer/peer-skip.js.map +1 -0
- package/dist/peer/peer-skip.test.d.ts +2 -0
- package/dist/peer/peer-skip.test.d.ts.map +1 -0
- package/dist/peer/peer-skip.test.js +63 -0
- package/dist/peer/peer-skip.test.js.map +1 -0
- package/dist/peer/peer-target-resolve.d.ts +8 -0
- package/dist/peer/peer-target-resolve.d.ts.map +1 -0
- package/dist/peer/peer-target-resolve.js +13 -0
- package/dist/peer/peer-target-resolve.js.map +1 -0
- package/dist/peer-backlog.d.ts.map +1 -1
- package/dist/peer-backlog.js +25 -0
- package/dist/peer-backlog.js.map +1 -1
- package/dist/peer-pending.test.js +17 -0
- package/dist/peer-pending.test.js.map +1 -1
- package/dist/queue/bullmq-runtime.d.ts +19 -0
- package/dist/queue/bullmq-runtime.d.ts.map +1 -0
- package/dist/queue/bullmq-runtime.js +78 -0
- package/dist/queue/bullmq-runtime.js.map +1 -0
- package/dist/state/ppa-state.d.ts +32 -0
- package/dist/state/ppa-state.d.ts.map +1 -0
- package/dist/state/ppa-state.js +63 -0
- package/dist/state/ppa-state.js.map +1 -0
- package/dist/store/create-queue-store.d.ts +8 -0
- package/dist/store/create-queue-store.d.ts.map +1 -0
- package/dist/store/create-queue-store.js +19 -0
- package/dist/store/create-queue-store.js.map +1 -0
- package/dist/store/jsonl-dedupe.test.d.ts +2 -0
- package/dist/store/jsonl-dedupe.test.d.ts.map +1 -0
- package/dist/store/jsonl-dedupe.test.js +62 -0
- package/dist/store/jsonl-dedupe.test.js.map +1 -0
- package/dist/store/jsonl-store.checkback.test.d.ts +2 -0
- package/dist/store/jsonl-store.checkback.test.d.ts.map +1 -0
- package/dist/store/jsonl-store.checkback.test.js +55 -0
- package/dist/store/jsonl-store.checkback.test.js.map +1 -0
- package/dist/store/jsonl-store.d.ts +129 -0
- package/dist/store/jsonl-store.d.ts.map +1 -0
- package/dist/store/jsonl-store.js +316 -0
- package/dist/store/jsonl-store.js.map +1 -0
- package/dist/store/sqlite-store.d.ts +52 -0
- package/dist/store/sqlite-store.d.ts.map +1 -0
- package/dist/store/sqlite-store.js +456 -0
- package/dist/store/sqlite-store.js.map +1 -0
- package/dist/store/sqlite-store.test.d.ts +2 -0
- package/dist/store/sqlite-store.test.d.ts.map +1 -0
- package/dist/store/sqlite-store.test.js +76 -0
- package/dist/store/sqlite-store.test.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { meshRuntimePaths, providerMonitoredForLimits, resolveConnectivityHooks, resolveUxConfig, uxLimitKinds, } from "@seat-mesh/core";
|
|
5
|
+
import { capturePaneSnapshot, listMeshMonitorPanes } from "@seat-mesh/tmux";
|
|
6
|
+
import { notifyConnectivityStatus } from "./oc-resume.js";
|
|
7
|
+
const PROXY_UP_COOLDOWN_MS = 60_000;
|
|
8
|
+
/** After an episode clears, ignore stale oc-connect re-arm unless streak re-confirms. */
|
|
9
|
+
const PROXY_DOWN_REARM_COOLDOWN_MS = 90_000;
|
|
10
|
+
const ROTATE_COOLDOWN_MS = 180_000;
|
|
11
|
+
const IPIFY_POLL_MS = 30_000;
|
|
12
|
+
/** During PROXY-DOWN episode, still cap sync ipify curls so /health stays responsive. */
|
|
13
|
+
const IPIFY_EPISODE_MIN_MS = 15_000;
|
|
14
|
+
const PANE_SCAN_BATCH = 4;
|
|
15
|
+
/** Grace before clearing a rate-limit episode after the last limited pane clears (flicker). */
|
|
16
|
+
const RATE_LIMIT_EPISODE_CLEAR_MS = 120_000;
|
|
17
|
+
/** How long a PROXY-DOWN episode may run before operator gets a "still down" toast. */
|
|
18
|
+
const PROXY_DOWN_STUCK_NOTIFY_MS = 120_000;
|
|
19
|
+
/** Mirrors scripts/cpe-proxy-smart-restart.sh cooldown file (harness parity — do not fork). */
|
|
20
|
+
const DEFAULT_SMART_RESTART_STAMP = "/tmp/cpe-proxy-smart-restart.last";
|
|
21
|
+
const DEFAULT_SMART_RESTART_COOLDOWN_SEC = 1800;
|
|
22
|
+
/** scripts/cpe-proxy-smart-restart.sh exit code for "cooldown still active, skipped". */
|
|
23
|
+
const SMART_RESTART_COOLDOWN_EXIT_CODE = 2;
|
|
24
|
+
/**
|
|
25
|
+
* Seconds left on the Proxy-SMART file cooldown (0 = none / expired).
|
|
26
|
+
* Reads the same stamp file cpe-proxy-smart-restart.sh writes — never the daemon's
|
|
27
|
+
* own state — so the daemon and any harness script agree on cooldown status.
|
|
28
|
+
*/
|
|
29
|
+
export function smartRestartCooldownLeftSec(stampPath = process.env.CPE_SMART_RESTART_STAMP || DEFAULT_SMART_RESTART_STAMP, cooldownSec = Number(process.env.CPE_SMART_RESTART_COOLDOWN_SEC || DEFAULT_SMART_RESTART_COOLDOWN_SEC), nowMs = Date.now()) {
|
|
30
|
+
try {
|
|
31
|
+
const last = Number(fs.readFileSync(stampPath, "utf8").trim()) || 0;
|
|
32
|
+
if (!last)
|
|
33
|
+
return 0;
|
|
34
|
+
const ageSec = Math.floor(nowMs / 1000) - last;
|
|
35
|
+
return ageSec >= cooldownSec ? 0 : cooldownSec - ageSec;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Consecutive ipify probe failures before treating carrier as down (debounce flaky curls).
|
|
43
|
+
* Exported for unit testing without tmux/process spawning.
|
|
44
|
+
*/
|
|
45
|
+
export function updateIpifyProbeStreak(state, carrierOk, threshold) {
|
|
46
|
+
const need = Math.max(1, threshold);
|
|
47
|
+
if (carrierOk) {
|
|
48
|
+
state.ipifyFailStreak = 0;
|
|
49
|
+
return { confirmedDown: false, streak: 0 };
|
|
50
|
+
}
|
|
51
|
+
state.ipifyFailStreak += 1;
|
|
52
|
+
return {
|
|
53
|
+
confirmedDown: state.ipifyFailStreak >= need,
|
|
54
|
+
streak: state.ipifyFailStreak,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Pure rising-edge/episode reducer for the OC-LIMIT (rate-limit) state machine.
|
|
59
|
+
* Exported for unit testing without tmux/process spawning.
|
|
60
|
+
*/
|
|
61
|
+
export function updateRateLimitEpisode(state, anyRateLimitNow, nowMs = Date.now(), graceMs = RATE_LIMIT_EPISODE_CLEAR_MS) {
|
|
62
|
+
if (anyRateLimitNow) {
|
|
63
|
+
state.lastRateLimitSeenAt = nowMs;
|
|
64
|
+
if (!state.rateLimitEpisodeActive) {
|
|
65
|
+
state.rateLimitEpisodeActive = true;
|
|
66
|
+
return { action: "start" };
|
|
67
|
+
}
|
|
68
|
+
return { action: "continue" };
|
|
69
|
+
}
|
|
70
|
+
if (state.rateLimitEpisodeActive && nowMs - state.lastRateLimitSeenAt > graceMs) {
|
|
71
|
+
state.rateLimitEpisodeActive = false;
|
|
72
|
+
return { action: "clear" };
|
|
73
|
+
}
|
|
74
|
+
return { action: "none" };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Pure decision: after Proxy-SMART exits, should rotate-until run next?
|
|
78
|
+
* Mirrors inbox-server.mjs shouldRunRotateUntilAfterSmart — chain rotate-until
|
|
79
|
+
* when SMART was skipped (cooldown), failed, or the carrier IP did not change.
|
|
80
|
+
*/
|
|
81
|
+
export function shouldChainRotateUntilAfterSmart(input) {
|
|
82
|
+
const { exitCode, ipBefore, ipAfter } = input;
|
|
83
|
+
if (exitCode === SMART_RESTART_COOLDOWN_EXIT_CODE)
|
|
84
|
+
return true;
|
|
85
|
+
if (!ipAfter)
|
|
86
|
+
return true;
|
|
87
|
+
if (ipBefore && ipAfter && ipBefore === ipAfter)
|
|
88
|
+
return true;
|
|
89
|
+
return exitCode !== 0;
|
|
90
|
+
}
|
|
91
|
+
function wifiProbeLockActive(loaded) {
|
|
92
|
+
const lock = meshRuntimePaths(loaded).wifiProbeLock;
|
|
93
|
+
try {
|
|
94
|
+
return fs.existsSync(lock);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
let cachedIpifyUp = null;
|
|
101
|
+
let lastIpifyAt = 0;
|
|
102
|
+
let paneScanOffset = 0;
|
|
103
|
+
/** Last carrier IP actually observed while up — a live fetch during an outage always fails. */
|
|
104
|
+
let lastKnownGoodIp = null;
|
|
105
|
+
const paneLimitCache = new Map();
|
|
106
|
+
/** Per-pane consecutive oc-connect observations (batch scan), not scrollback one-shots. */
|
|
107
|
+
const paneConnectStreak = new Map();
|
|
108
|
+
const paneCcLimitSeen = new Set();
|
|
109
|
+
let lastProxyDownClearAt = 0;
|
|
110
|
+
/** Exported for unit tests. */
|
|
111
|
+
export function updatePaneConnectStreak(streakMap, paneId, sawConnect, threshold) {
|
|
112
|
+
const need = Math.max(1, threshold);
|
|
113
|
+
if (!sawConnect) {
|
|
114
|
+
streakMap.delete(paneId);
|
|
115
|
+
return { confirmed: false, streak: 0 };
|
|
116
|
+
}
|
|
117
|
+
const streak = (streakMap.get(paneId) ?? 0) + 1;
|
|
118
|
+
streakMap.set(paneId, streak);
|
|
119
|
+
return { confirmed: streak >= need, streak };
|
|
120
|
+
}
|
|
121
|
+
function anyRateLimitInCache() {
|
|
122
|
+
for (const flags of paneLimitCache.values()) {
|
|
123
|
+
if (flags.rate)
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
/** Drop OC-LIMIT border state for a pane once resume ack confirms it is working again. */
|
|
129
|
+
export function clearOcLimitBannerForPane(state, paneId) {
|
|
130
|
+
const had = paneLimitCache.has(paneId) ||
|
|
131
|
+
state.ocLimited.has(paneId) ||
|
|
132
|
+
state.connectPanes.has(paneId);
|
|
133
|
+
paneLimitCache.delete(paneId);
|
|
134
|
+
paneConnectStreak.delete(paneId);
|
|
135
|
+
state.ocLimited.delete(paneId);
|
|
136
|
+
state.connectPanes.delete(paneId);
|
|
137
|
+
return had;
|
|
138
|
+
}
|
|
139
|
+
/** When no panes remain limited, end the OC-LIMIT episode so borders and proxy recovery unlock. */
|
|
140
|
+
export function maybeEndRateLimitEpisode(state) {
|
|
141
|
+
if (anyRateLimitInCache())
|
|
142
|
+
return;
|
|
143
|
+
if (!state.rateLimitEpisodeActive && !state.rateLimitRecoveryStarted)
|
|
144
|
+
return;
|
|
145
|
+
state.rateLimitEpisodeActive = false;
|
|
146
|
+
state.rateLimitRecoveryStarted = false;
|
|
147
|
+
state.lastRateLimitSeenAt = 0;
|
|
148
|
+
}
|
|
149
|
+
export function newConnectivityRecoveryState() {
|
|
150
|
+
return {
|
|
151
|
+
ocLimited: new Set(),
|
|
152
|
+
connectPanes: new Set(),
|
|
153
|
+
proxyDownActive: false,
|
|
154
|
+
recoveryRunning: false,
|
|
155
|
+
lastProxyUpAt: 0,
|
|
156
|
+
lastRotateAt: 0,
|
|
157
|
+
carrierIpAtEpisodeStart: null,
|
|
158
|
+
rateLimitEpisodeActive: false,
|
|
159
|
+
lastRateLimitSeenAt: 0,
|
|
160
|
+
proxyDownEpisodeStartAt: 0,
|
|
161
|
+
proxyDownStuckNotified: false,
|
|
162
|
+
rateLimitRecoveryStarted: false,
|
|
163
|
+
ipifyFailStreak: 0,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Pure decision: has a PROXY-DOWN episode been running long enough, with no
|
|
168
|
+
* "still down" toast sent yet, to warrant telling operator it's stuck (not silent)?
|
|
169
|
+
* Exported for unit testing without tmux/process spawning.
|
|
170
|
+
*/
|
|
171
|
+
export function shouldNotifyProxyDownStuck(state, nowMs = Date.now(), thresholdMs = PROXY_DOWN_STUCK_NOTIFY_MS) {
|
|
172
|
+
if (state.proxyDownStuckNotified)
|
|
173
|
+
return false;
|
|
174
|
+
if (!state.proxyDownEpisodeStartAt)
|
|
175
|
+
return false;
|
|
176
|
+
return nowMs - state.proxyDownEpisodeStartAt >= thresholdMs;
|
|
177
|
+
}
|
|
178
|
+
let ipifyProbeInFlight = false;
|
|
179
|
+
/** Non-blocking ipify refresh — poll tick and /health must never wait on curl. */
|
|
180
|
+
function scheduleIpifyProbe(workspace, port) {
|
|
181
|
+
if (ipifyProbeInFlight)
|
|
182
|
+
return;
|
|
183
|
+
ipifyProbeInFlight = true;
|
|
184
|
+
const child = spawn("bash", [
|
|
185
|
+
"-c",
|
|
186
|
+
`HTTPS_PROXY=http://127.0.0.1:${port} HTTP_PROXY=http://127.0.0.1:${port} curl -4 -sS -m 3 https://api.ipify.org 2>/dev/null || true`,
|
|
187
|
+
], { cwd: workspace, stdio: ["ignore", "pipe", "ignore"] });
|
|
188
|
+
let out = "";
|
|
189
|
+
child.stdout?.on("data", (c) => {
|
|
190
|
+
out += String(c);
|
|
191
|
+
});
|
|
192
|
+
child.on("close", () => {
|
|
193
|
+
ipifyProbeInFlight = false;
|
|
194
|
+
lastIpifyAt = Date.now();
|
|
195
|
+
const ip = out.trim();
|
|
196
|
+
cachedIpifyUp = Boolean(ip);
|
|
197
|
+
if (ip)
|
|
198
|
+
lastKnownGoodIp = ip;
|
|
199
|
+
});
|
|
200
|
+
child.on("error", () => {
|
|
201
|
+
ipifyProbeInFlight = false;
|
|
202
|
+
lastIpifyAt = Date.now();
|
|
203
|
+
cachedIpifyUp = false;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function carrierIpCached() {
|
|
207
|
+
return lastKnownGoodIp;
|
|
208
|
+
}
|
|
209
|
+
function ipifyUp(workspace, port, episode = false) {
|
|
210
|
+
const now = Date.now();
|
|
211
|
+
const minGap = episode ? IPIFY_EPISODE_MIN_MS : IPIFY_POLL_MS;
|
|
212
|
+
if (now - lastIpifyAt >= minGap) {
|
|
213
|
+
scheduleIpifyProbe(workspace, port);
|
|
214
|
+
}
|
|
215
|
+
if (cachedIpifyUp !== null)
|
|
216
|
+
return cachedIpifyUp;
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
function runScriptAsync(workspace, scriptPath, log, label, onDone, extraEnv = {}) {
|
|
220
|
+
if (!fs.existsSync(scriptPath)) {
|
|
221
|
+
log(`${label}: missing ${scriptPath}`);
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
const child = spawn("bash", [scriptPath], {
|
|
225
|
+
cwd: workspace,
|
|
226
|
+
stdio: "ignore",
|
|
227
|
+
detached: false,
|
|
228
|
+
env: { ...process.env, CPE_SKIP_DESKTOP_NOTIFY: "1", ...extraEnv },
|
|
229
|
+
});
|
|
230
|
+
child.on("error", (e) => {
|
|
231
|
+
log(`${label}: spawn error ${e.message}`);
|
|
232
|
+
onDone(1);
|
|
233
|
+
});
|
|
234
|
+
child.on("close", (code) => onDone(code ?? 1));
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
/** Scan all monitor panes; update limit sets; trigger async recovery on rising edges only. */
|
|
238
|
+
export function pollConnectivityRecovery(input) {
|
|
239
|
+
const { loaded, registry, workspace, session, baseWindow, workersWindow, minisWindow, state, log, resumeOpenCodePanes, onCcLimitRise, } = input;
|
|
240
|
+
const conn = loaded.profile.connectivity;
|
|
241
|
+
if (!conn?.enabled)
|
|
242
|
+
return;
|
|
243
|
+
const proxyPort = conn.proxyPort ?? 18887;
|
|
244
|
+
const panes = listMeshMonitorPanes(session, baseWindow, workersWindow, minisWindow);
|
|
245
|
+
const liveIds = new Set(panes.map((p) => p.paneId));
|
|
246
|
+
for (const id of paneLimitCache.keys()) {
|
|
247
|
+
if (!liveIds.has(id))
|
|
248
|
+
paneLimitCache.delete(id);
|
|
249
|
+
}
|
|
250
|
+
for (const id of paneConnectStreak.keys()) {
|
|
251
|
+
if (!liveIds.has(id))
|
|
252
|
+
paneConnectStreak.delete(id);
|
|
253
|
+
}
|
|
254
|
+
for (const id of paneCcLimitSeen) {
|
|
255
|
+
if (!liveIds.has(id))
|
|
256
|
+
paneCcLimitSeen.delete(id);
|
|
257
|
+
}
|
|
258
|
+
const connectThreshold = conn.policy?.connectFailBeforeRecovery ??
|
|
259
|
+
conn.policy?.ipifyFailBeforeRecovery ??
|
|
260
|
+
15;
|
|
261
|
+
const prevConnect = new Set(state.connectPanes);
|
|
262
|
+
const prevLimited = new Set(state.ocLimited);
|
|
263
|
+
const batch = [];
|
|
264
|
+
if (panes.length) {
|
|
265
|
+
for (let i = 0; i < Math.min(PANE_SCAN_BATCH, panes.length); i++) {
|
|
266
|
+
batch.push(panes[(paneScanOffset + i) % panes.length]);
|
|
267
|
+
}
|
|
268
|
+
paneScanOffset = (paneScanOffset + batch.length) % panes.length;
|
|
269
|
+
}
|
|
270
|
+
const uxResolved = loaded.profile.ux !== undefined ? resolveUxConfig(loaded.profile.ux) : null;
|
|
271
|
+
const { proxyDownKinds, rateLimitKinds, limitProviders } = uxResolved
|
|
272
|
+
? uxLimitKinds(uxResolved)
|
|
273
|
+
: {
|
|
274
|
+
proxyDownKinds: new Set(["oc-connect"]),
|
|
275
|
+
rateLimitKinds: new Set(["oc-limit"]),
|
|
276
|
+
limitProviders: new Set(["opencode"]),
|
|
277
|
+
};
|
|
278
|
+
for (const { paneId, label } of batch) {
|
|
279
|
+
const snap = capturePaneSnapshot(paneId);
|
|
280
|
+
if (!snap) {
|
|
281
|
+
paneLimitCache.delete(paneId);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const prov = registry.detect(snap);
|
|
285
|
+
if (!prov || !providerMonitoredForLimits(prov.id, limitProviders)) {
|
|
286
|
+
paneLimitCache.delete(paneId);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const st = prov.composerState(snap);
|
|
290
|
+
if (st.phase === "limit" && st.limitKind === "cc-limit" && prov.id === "claude") {
|
|
291
|
+
if (!paneCcLimitSeen.has(paneId)) {
|
|
292
|
+
paneCcLimitSeen.add(paneId);
|
|
293
|
+
onCcLimitRise?.(paneId, snap);
|
|
294
|
+
log(`CC-LIMIT rising ${label} ${paneId}`);
|
|
295
|
+
}
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (st.phase !== "limit" || !st.limitKind) {
|
|
299
|
+
paneLimitCache.delete(paneId);
|
|
300
|
+
paneConnectStreak.delete(paneId);
|
|
301
|
+
paneCcLimitSeen.delete(paneId);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const sawConnect = proxyDownKinds.has(st.limitKind);
|
|
305
|
+
const rate = rateLimitKinds.has(st.limitKind);
|
|
306
|
+
if (!sawConnect && !rate) {
|
|
307
|
+
paneLimitCache.delete(paneId);
|
|
308
|
+
paneConnectStreak.delete(paneId);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
let connect = false;
|
|
312
|
+
if (sawConnect) {
|
|
313
|
+
const { confirmed, streak } = updatePaneConnectStreak(paneConnectStreak, paneId, true, connectThreshold);
|
|
314
|
+
connect = confirmed;
|
|
315
|
+
if (!confirmed) {
|
|
316
|
+
if (streak === 1) {
|
|
317
|
+
log(`PROXY-DOWN defer ${label} ${paneId} (need ${connectThreshold} connect observations — stale scrollback filter)`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else if (!prevConnect.has(paneId)) {
|
|
321
|
+
log(`PROXY-DOWN rising ${label} ${paneId} kind=${st.limitKind} streak=${streak}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
updatePaneConnectStreak(paneConnectStreak, paneId, false, connectThreshold);
|
|
326
|
+
}
|
|
327
|
+
if (connect || rate) {
|
|
328
|
+
paneLimitCache.set(paneId, { connect, rate });
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
paneLimitCache.delete(paneId);
|
|
332
|
+
}
|
|
333
|
+
if (rate && !prevLimited.has(paneId)) {
|
|
334
|
+
log(`OC-LIMIT rising ${label} ${paneId} kind=${st.limitKind}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
state.connectPanes.clear();
|
|
338
|
+
state.ocLimited.clear();
|
|
339
|
+
let anyConnect = false;
|
|
340
|
+
let anyRateLimit = false;
|
|
341
|
+
for (const [paneId, flags] of paneLimitCache) {
|
|
342
|
+
if (!liveIds.has(paneId))
|
|
343
|
+
continue;
|
|
344
|
+
state.ocLimited.add(paneId);
|
|
345
|
+
if (flags.connect) {
|
|
346
|
+
state.connectPanes.add(paneId);
|
|
347
|
+
anyConnect = true;
|
|
348
|
+
}
|
|
349
|
+
else if (flags.rate) {
|
|
350
|
+
anyRateLimit = true;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const hooks = resolveConnectivityHooks(loaded.profile, workspace);
|
|
354
|
+
if (wifiProbeLockActive(loaded)) {
|
|
355
|
+
if (state.proxyDownActive) {
|
|
356
|
+
log("PROXY-DOWN suppressed — cpe-wifi-probe.lock active");
|
|
357
|
+
state.proxyDownActive = false;
|
|
358
|
+
}
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const carrierOk = ipifyUp(workspace, proxyPort, anyConnect || state.proxyDownActive);
|
|
362
|
+
const ipifyThreshold = conn.policy?.ipifyFailBeforeRecovery ?? 15;
|
|
363
|
+
const { confirmedDown: ipifyConfirmedDown, streak: ipifyStreak } = updateIpifyProbeStreak(state, carrierOk, ipifyThreshold);
|
|
364
|
+
if (!carrierOk && !ipifyConfirmedDown && !anyConnect) {
|
|
365
|
+
log(`ipify probe fail streak ${ipifyStreak}/${ipifyThreshold} — defer PROXY-DOWN recovery`);
|
|
366
|
+
}
|
|
367
|
+
// Ipify blips alone must not start PROXY-DOWN / cpe-proxy-up — need OC connect errors and/or
|
|
368
|
+
// an active rate-limit episode before treating carrier ipify as down for recovery.
|
|
369
|
+
const ipifyDownForRecovery = ipifyConfirmedDown && (anyRateLimit || state.rateLimitEpisodeActive);
|
|
370
|
+
let proxyDownNow = anyConnect || ipifyDownForRecovery;
|
|
371
|
+
const wasDown = state.proxyDownActive;
|
|
372
|
+
const rearmBlocked = !wasDown &&
|
|
373
|
+
proxyDownNow &&
|
|
374
|
+
anyConnect &&
|
|
375
|
+
!ipifyDownForRecovery &&
|
|
376
|
+
carrierOk &&
|
|
377
|
+
Date.now() - lastProxyDownClearAt < PROXY_DOWN_REARM_COOLDOWN_MS;
|
|
378
|
+
if (rearmBlocked) {
|
|
379
|
+
log(`PROXY-DOWN re-arm suppressed (episode cooldown ${PROXY_DOWN_REARM_COOLDOWN_MS / 1000}s, ipify up, connect debounced)`);
|
|
380
|
+
proxyDownNow = false;
|
|
381
|
+
}
|
|
382
|
+
state.proxyDownActive = proxyDownNow;
|
|
383
|
+
if (proxyDownNow && !wasDown) {
|
|
384
|
+
state.carrierIpAtEpisodeStart = carrierIpCached();
|
|
385
|
+
state.proxyDownEpisodeStartAt = Date.now();
|
|
386
|
+
state.proxyDownStuckNotified = false;
|
|
387
|
+
log(`PROXY-DOWN episode start ipify=${carrierOk ? "up" : "down"} streak=${ipifyStreak}/${ipifyThreshold} connectPanes=${state.connectPanes.size} carrier=${state.carrierIpAtEpisodeStart ?? "?"}`);
|
|
388
|
+
notifyConnectivityStatus(workspace, "PROXY-DOWN", `Carrier ${state.carrierIpAtEpisodeStart ?? "?"} unreachable. Running cpe-proxy-up.sh now.`, "Wait for resume-sent then complete toasts — no action during starting.", "starting");
|
|
389
|
+
maybeRunProxyUp(hooks, workspace, state, log);
|
|
390
|
+
}
|
|
391
|
+
else if (!proxyDownNow && wasDown) {
|
|
392
|
+
const fromIp = state.carrierIpAtEpisodeStart;
|
|
393
|
+
const toIp = carrierIpCached();
|
|
394
|
+
log(`PROXY-DOWN episode clear -> resume wave carrier=${toIp ?? "?"}`);
|
|
395
|
+
state.carrierIpAtEpisodeStart = null;
|
|
396
|
+
state.proxyDownEpisodeStartAt = 0;
|
|
397
|
+
state.proxyDownStuckNotified = false;
|
|
398
|
+
state.ipifyFailStreak = 0;
|
|
399
|
+
lastProxyDownClearAt = Date.now();
|
|
400
|
+
paneConnectStreak.clear();
|
|
401
|
+
// Keep rate-limit cache entries — clearing all panes made OC-LIMIT episodes re-arm proxy restart.
|
|
402
|
+
for (const [paneId, flags] of [...paneLimitCache.entries()]) {
|
|
403
|
+
if (flags.rate) {
|
|
404
|
+
paneLimitCache.set(paneId, { connect: false, rate: true });
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
paneLimitCache.delete(paneId);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
setImmediate(() => resumeOpenCodePanes("proxy-up", { fromIp, toIp }));
|
|
411
|
+
}
|
|
412
|
+
else if (proxyDownNow && wasDown && shouldNotifyProxyDownStuck(state)) {
|
|
413
|
+
state.proxyDownStuckNotified = true;
|
|
414
|
+
const ageSec = Math.round((Date.now() - state.proxyDownEpisodeStartAt) / 1000);
|
|
415
|
+
log(`PROXY-DOWN still active after ${ageSec}s -> notify operator`);
|
|
416
|
+
notifyConnectivityStatus(workspace, "PROXY-DOWN", `Carrier still unreachable after ${ageSec}s. cpe-proxy-up.sh ran; on cooldown.`, "Check WiFi/CPE manually if this persists.", "incomplete");
|
|
417
|
+
}
|
|
418
|
+
const { action } = updateRateLimitEpisode(state, anyRateLimit);
|
|
419
|
+
if (action === "start") {
|
|
420
|
+
const fromIp = carrierIpCached() ?? state.carrierIpAtEpisodeStart ?? lastKnownGoodIp;
|
|
421
|
+
log(`OC-LIMIT rising-edge episode start carrier=${fromIp ?? "?"}`);
|
|
422
|
+
if (!state.rateLimitRecoveryStarted) {
|
|
423
|
+
notifyConnectivityStatus(workspace, "OC-LIMIT", `Carrier ${fromIp ?? "?"} rate-limited. One proxy recovery run for this episode (no repeat while banner persists).`, "Wait for resume-sent then complete toasts. Ack is automatic when limit screens clear.", "starting");
|
|
424
|
+
const rotateMax = conn.policy?.rotateMaxAttempts ?? 15;
|
|
425
|
+
maybeRunOcLimitRecovery(hooks, workspace, proxyPort, fromIp, state, log, resumeOpenCodePanes, rotateMax);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
log("OC-LIMIT episode active — recovery already ran this episode (skip proxy restart)");
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else if (action === "clear") {
|
|
432
|
+
log("OC-LIMIT episode clear");
|
|
433
|
+
state.rateLimitRecoveryStarted = false;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function maybeRunProxyUp(hooks, workspace, state, log) {
|
|
437
|
+
const now = Date.now();
|
|
438
|
+
if (state.recoveryRunning)
|
|
439
|
+
return;
|
|
440
|
+
if (now - state.lastProxyUpAt < PROXY_UP_COOLDOWN_MS)
|
|
441
|
+
return;
|
|
442
|
+
const script = hooks?.up;
|
|
443
|
+
if (!script) {
|
|
444
|
+
log("PROXY-DOWN: connectivity.hooks.up not configured — skip");
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
state.recoveryRunning = true;
|
|
448
|
+
state.lastProxyUpAt = now;
|
|
449
|
+
log(`PROXY-DOWN -> async ${path.basename(script)}`);
|
|
450
|
+
const started = runScriptAsync(workspace, script, log, "proxy-up", (code) => {
|
|
451
|
+
state.recoveryRunning = false;
|
|
452
|
+
log(`cpe-proxy-up exit=${code} — resume wave waits for PROXY-DOWN episode clear`);
|
|
453
|
+
});
|
|
454
|
+
if (!started)
|
|
455
|
+
state.recoveryRunning = false;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* OC-LIMIT (rate-limit) recovery: Proxy-SMART restart first when off cooldown,
|
|
459
|
+
* else cpe-proxy-rotate-until.sh directly. Chains rotate-until after a SMART
|
|
460
|
+
* run that was skipped/failed/no-op, then notifies operator + resumes OC panes on
|
|
461
|
+
* any real carrier IP change. Mirrors inbox-server.mjs runOcLimitRecoveryAsync.
|
|
462
|
+
*/
|
|
463
|
+
function maybeRunOcLimitRecovery(hooks, workspace, proxyPort, fromIp, state, log, resumeOpenCodePanes, rotateMaxAttempts = 15) {
|
|
464
|
+
const now = Date.now();
|
|
465
|
+
if (state.recoveryRunning)
|
|
466
|
+
return;
|
|
467
|
+
if (state.rateLimitRecoveryStarted)
|
|
468
|
+
return;
|
|
469
|
+
if (now - state.lastRotateAt < ROTATE_COOLDOWN_MS)
|
|
470
|
+
return;
|
|
471
|
+
state.recoveryRunning = true;
|
|
472
|
+
state.rateLimitRecoveryStarted = true;
|
|
473
|
+
state.lastRotateAt = now;
|
|
474
|
+
const finish = (toIp, reason) => {
|
|
475
|
+
state.recoveryRunning = false;
|
|
476
|
+
const ipChanged = Boolean(toIp && fromIp && toIp !== fromIp);
|
|
477
|
+
if (!ipChanged) {
|
|
478
|
+
log(`OC-LIMIT recovery done reason=${reason} ip=${toIp ?? "?"} — skip resume wave (no carrier change)`);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
log(`OC-LIMIT recovery done -> resume wave reason=${reason} ${fromIp} -> ${toIp}`);
|
|
482
|
+
setImmediate(() => resumeOpenCodePanes(reason, { fromIp, toIp }));
|
|
483
|
+
};
|
|
484
|
+
const runRotateUntil = (reason) => {
|
|
485
|
+
const script = hooks?.rotate;
|
|
486
|
+
if (!script || !fs.existsSync(script)) {
|
|
487
|
+
log(`OC-LIMIT recovery: connectivity.hooks.rotate missing (${script ?? "unset"})`);
|
|
488
|
+
state.recoveryRunning = false;
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
log(`OC-LIMIT -> async ${path.basename(script)} (${reason}) max=${rotateMaxAttempts}`);
|
|
492
|
+
const rotateEnv = { CPE_ROTATE_MAX_ATTEMPTS: String(rotateMaxAttempts) };
|
|
493
|
+
const started = runScriptAsync(workspace, script, log, "rotate-until", (code) => {
|
|
494
|
+
log(`rotate-until exit=${code}`);
|
|
495
|
+
scheduleIpifyProbe(workspace, proxyPort);
|
|
496
|
+
finish(carrierIpCached(), "rotate-until");
|
|
497
|
+
}, rotateEnv);
|
|
498
|
+
if (!started)
|
|
499
|
+
state.recoveryRunning = false;
|
|
500
|
+
};
|
|
501
|
+
const cooldownLeft = smartRestartCooldownLeftSec();
|
|
502
|
+
if (cooldownLeft > 0) {
|
|
503
|
+
log(`OC-LIMIT Proxy-SMART cooldown ${cooldownLeft}s -> rotate-until path`);
|
|
504
|
+
runRotateUntil("smart-cooldown");
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
const smartScript = hooks?.smartRestart;
|
|
508
|
+
if (!smartScript || !fs.existsSync(smartScript)) {
|
|
509
|
+
log(`OC-LIMIT rising-edge but hooks.smartRestart missing -> rotate-until`);
|
|
510
|
+
runRotateUntil("no-smart-script");
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
log(`OC-LIMIT rising-edge -> async ${path.basename(smartScript)}`);
|
|
514
|
+
const started = runScriptAsync(workspace, smartScript, log, "cpe-proxy-smart-restart", (code) => {
|
|
515
|
+
log(`cpe-proxy-smart-restart exit=${code}`);
|
|
516
|
+
scheduleIpifyProbe(workspace, proxyPort);
|
|
517
|
+
const ipAfter = carrierIpCached();
|
|
518
|
+
if (shouldChainRotateUntilAfterSmart({ exitCode: code, ipBefore: fromIp, ipAfter })) {
|
|
519
|
+
const chainReason = code === SMART_RESTART_COOLDOWN_EXIT_CODE ? "smart-cooldown" : "smart-unchanged";
|
|
520
|
+
notifyConnectivityStatus(workspace, "OC-LIMIT", `Proxy-SMART did not clear it (${chainReason}). Escalating to cpe-proxy-rotate-until.sh.`, "Wait for resume-sent then complete toasts.", "escalating");
|
|
521
|
+
runRotateUntil(chainReason);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
finish(ipAfter, "proxy-smart-restart");
|
|
525
|
+
});
|
|
526
|
+
if (!started)
|
|
527
|
+
state.recoveryRunning = false;
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=connectivity-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectivity-recovery.js","sourceRoot":"","sources":["../../src/connectivity/connectivity-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectivity-recovery.test.d.ts","sourceRoot":"","sources":["../../src/connectivity/connectivity-recovery.test.ts"],"names":[],"mappings":""}
|