@apnex/network-adapter 0.1.2 → 0.1.6
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/build-info.json +6 -0
- package/dist/file-logger.d.ts +42 -0
- package/dist/file-logger.js +122 -0
- package/dist/file-logger.js.map +1 -0
- package/dist/index.d.ts +37 -13
- package/dist/index.js +42 -15
- package/dist/index.js.map +1 -1
- package/dist/kernel/adapter-config.d.ts +47 -0
- package/dist/kernel/adapter-config.js +90 -0
- package/dist/kernel/adapter-config.js.map +1 -0
- package/dist/kernel/agent-client.d.ts +25 -20
- package/dist/kernel/build-identity.d.ts +24 -0
- package/dist/kernel/build-identity.js +45 -0
- package/dist/kernel/build-identity.js.map +1 -0
- package/dist/kernel/event-router.d.ts +22 -1
- package/dist/kernel/event-router.js +45 -7
- package/dist/kernel/event-router.js.map +1 -1
- package/dist/kernel/handshake.d.ts +40 -4
- package/dist/kernel/handshake.js +46 -7
- package/dist/kernel/handshake.js.map +1 -1
- package/dist/kernel/harness-manifest.d.ts +51 -0
- package/dist/kernel/harness-manifest.js +96 -0
- package/dist/kernel/harness-manifest.js.map +1 -0
- package/dist/kernel/liveness-signal.d.ts +35 -0
- package/dist/kernel/liveness-signal.js +61 -0
- package/dist/kernel/liveness-signal.js.map +1 -0
- package/dist/kernel/liveness-watchdog.d.ts +78 -0
- package/dist/kernel/liveness-watchdog.js +115 -0
- package/dist/kernel/liveness-watchdog.js.map +1 -0
- package/dist/kernel/mcp-agent-client.d.ts +2 -2
- package/dist/kernel/mcp-agent-client.js +49 -3
- package/dist/kernel/mcp-agent-client.js.map +1 -1
- package/dist/kernel/poll-backstop.d.ts +134 -4
- package/dist/kernel/poll-backstop.js +254 -24
- package/dist/kernel/poll-backstop.js.map +1 -1
- package/dist/kernel/state-sync.d.ts +2 -13
- package/dist/kernel/state-sync.js.map +1 -1
- package/dist/notification-log.d.ts +8 -0
- package/dist/notification-log.js +10 -0
- package/dist/notification-log.js.map +1 -1
- package/dist/observability.d.ts +24 -0
- package/dist/observability.js +52 -0
- package/dist/observability.js.map +1 -0
- package/dist/prompt-format.js +82 -9
- package/dist/prompt-format.js.map +1 -1
- package/dist/tool-manager/catalog/health-revision.d.ts +43 -0
- package/dist/tool-manager/catalog/health-revision.js +61 -0
- package/dist/tool-manager/catalog/health-revision.js.map +1 -0
- package/dist/tool-manager/{tool-catalog-cache.d.ts → catalog/tool-catalog-cache.d.ts} +39 -19
- package/dist/tool-manager/{tool-catalog-cache.js → catalog/tool-catalog-cache.js} +53 -26
- package/dist/tool-manager/catalog/tool-catalog-cache.js.map +1 -0
- package/dist/tool-manager/catalog/tool-surface-reconciler.d.ts +93 -0
- package/dist/tool-manager/catalog/tool-surface-reconciler.js +101 -0
- package/dist/tool-manager/catalog/tool-surface-reconciler.js.map +1 -0
- package/dist/tool-manager/contracts.d.ts +91 -0
- package/dist/tool-manager/contracts.js +20 -0
- package/dist/tool-manager/contracts.js.map +1 -0
- package/dist/tool-manager/dispatch/dispatch.d.ts +77 -0
- package/dist/tool-manager/dispatch/dispatch.js +170 -0
- package/dist/tool-manager/dispatch/dispatch.js.map +1 -0
- package/dist/tool-manager/dispatch/tool-call-policy.d.ts +32 -0
- package/dist/tool-manager/dispatch/tool-call-policy.js +56 -0
- package/dist/tool-manager/dispatch/tool-call-policy.js.map +1 -0
- package/dist/tool-manager/{dispatcher.d.ts → orchestrator/dispatcher.d.ts} +110 -31
- package/dist/tool-manager/orchestrator/dispatcher.js +559 -0
- package/dist/tool-manager/orchestrator/dispatcher.js.map +1 -0
- package/dist/tool-manager/work-protocol/claimable-digest-tracker.d.ts +60 -0
- package/dist/tool-manager/work-protocol/claimable-digest-tracker.js +66 -0
- package/dist/tool-manager/work-protocol/claimable-digest-tracker.js.map +1 -0
- package/dist/tool-manager/work-protocol/work-lease-tracker.d.ts +70 -0
- package/dist/tool-manager/work-protocol/work-lease-tracker.js +146 -0
- package/dist/tool-manager/work-protocol/work-lease-tracker.js.map +1 -0
- package/dist/wire/mcp-transport.d.ts +1 -1
- package/dist/wire/mcp-transport.js +31 -7
- package/dist/wire/mcp-transport.js.map +1 -1
- package/dist/wire/slot-gate.d.ts +40 -0
- package/dist/wire/slot-gate.js +61 -0
- package/dist/wire/slot-gate.js.map +1 -0
- package/dist/wire/transport.d.ts +18 -0
- package/package.json +6 -3
- package/dist/kernel/instance.d.ts +0 -40
- package/dist/kernel/instance.js +0 -79
- package/dist/kernel/instance.js.map +0 -1
- package/dist/tool-manager/dispatcher.js +0 -379
- package/dist/tool-manager/dispatcher.js.map +0 -1
- package/dist/tool-manager/tool-catalog-cache.js.map +0 -1
|
@@ -32,6 +32,53 @@ import { dirname, join } from "node:path";
|
|
|
32
32
|
import { homedir } from "node:os";
|
|
33
33
|
const DEFAULT_CADENCE_SECONDS = 300; // 5 minutes
|
|
34
34
|
const MIN_CADENCE_SECONDS = 60; // 1 minute floor — anti-pattern guard
|
|
35
|
+
/**
|
|
36
|
+
* mission-75 (M-TTL-Liveliness-Design) v1.0 §3.3 — second 30s heartbeat
|
|
37
|
+
* timer alongside the existing 300s message-poll timer. Calls the new
|
|
38
|
+
* `transport_heartbeat` MCP tool periodically so the Hub's
|
|
39
|
+
* `lastHeartbeatAt` doesn't age monotonically for idle agents (no
|
|
40
|
+
* pending actions queued; drain is queue-driven NOT periodic per
|
|
41
|
+
* round-2 N1 fold).
|
|
42
|
+
*
|
|
43
|
+
* Defaults match Hub-side env-ified constants:
|
|
44
|
+
* TRANSPORT_HEARTBEAT_INTERVAL_MS = 30_000 (min 10_000)
|
|
45
|
+
* TRANSPORT_HEARTBEAT_ENABLED = true
|
|
46
|
+
*
|
|
47
|
+
* Hub remains source-of-truth for these defaults; adapter reads its
|
|
48
|
+
* own env vars at construction time. Per-agent override (livenessConfig
|
|
49
|
+
* sub-object) is Hub-side only — adapter uses env defaults.
|
|
50
|
+
*/
|
|
51
|
+
const DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000;
|
|
52
|
+
const MIN_HEARTBEAT_INTERVAL_MS = 10_000;
|
|
53
|
+
const HEARTBEAT_RETRY_BACKOFF_MS = 5_000;
|
|
54
|
+
/**
|
|
55
|
+
* mission-99 slice (c) / F2 — ±20% per-agent jitter fraction on the periodic
|
|
56
|
+
* timers (spec docs/designs/m-swarm-footer/ratified-spec.md §6 anti-stampede).
|
|
57
|
+
*
|
|
58
|
+
* WHY: every fleet agent's poll + heartbeat timers otherwise fire on the SAME
|
|
59
|
+
* fixed cadence. If a shared trigger aligns their phases (a fleet-wide restart,
|
|
60
|
+
* a Hub redeploy that reconnects everyone at once), fixed `setInterval` produces
|
|
61
|
+
* a SYNCHRONIZED poll burst — N agents hammering the Hub on the same tick. A
|
|
62
|
+
* per-fire ±20% jitter desynchronizes the phases so the load spreads across the
|
|
63
|
+
* window instead of spiking. The AVERAGE cadence is preserved (jitter is
|
|
64
|
+
* symmetric about 1.0), so the mission-75 TTL margin + the anti-pattern cadence
|
|
65
|
+
* guard both still hold.
|
|
66
|
+
*
|
|
67
|
+
* Implemented by rescheduling each cycle with a freshly-jittered delay (a self-
|
|
68
|
+
* rescheduling setTimeout loop) rather than a fixed setInterval — so the jitter
|
|
69
|
+
* is re-rolled every fire, not frozen at start.
|
|
70
|
+
*/
|
|
71
|
+
export const JITTER_FRACTION = 0.2; // ±20%
|
|
72
|
+
/**
|
|
73
|
+
* Apply ±`fraction` symmetric jitter to `baseMs`. `rand` is an injectable
|
|
74
|
+
* [0,1) source (default Math.random) for deterministic tests. Result is
|
|
75
|
+
* clamped to ≥ 1ms so a timer always makes forward progress.
|
|
76
|
+
*/
|
|
77
|
+
export function jitter(baseMs, fraction = JITTER_FRACTION, rand = Math.random) {
|
|
78
|
+
// rand() ∈ [0,1) → factor ∈ [1-fraction, 1+fraction).
|
|
79
|
+
const factor = 1 + (rand() * 2 - 1) * fraction;
|
|
80
|
+
return Math.max(1, Math.round(baseMs * factor));
|
|
81
|
+
}
|
|
35
82
|
/**
|
|
36
83
|
* Resolve the cursor file path. Defaults to
|
|
37
84
|
* `~/.ois/poll-cursor-<role>-<agentId>.json`. The agentId is
|
|
@@ -41,6 +88,18 @@ const MIN_CADENCE_SECONDS = 60; // 1 minute floor — anti-pattern guard
|
|
|
41
88
|
export function defaultCursorFile(role, agentId) {
|
|
42
89
|
return join(homedir(), ".ois", `poll-cursor-${role}-${agentId}.json`);
|
|
43
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolve a {@link PollBackstopOptions.role} to its current string value.
|
|
93
|
+
* A plain string is returned as-is; a `() => string` thunk is invoked at
|
|
94
|
+
* call-time (bug-173 — lets a dispatcher constructed at MODULE-INIT track
|
|
95
|
+
* the host's configured role once `config.role` has loaded, instead of
|
|
96
|
+
* freezing whatever the env default was at construction). Used by both the
|
|
97
|
+
* PollBackstop tick (target.role filter) and the dispatcher's idea-353
|
|
98
|
+
* wake/stall reconcile so the two read the SAME resolved role.
|
|
99
|
+
*/
|
|
100
|
+
export function resolveRole(role) {
|
|
101
|
+
return typeof role === "function" ? role() : role;
|
|
102
|
+
}
|
|
44
103
|
/**
|
|
45
104
|
* Read the persisted cursor (or undefined if no cursor file exists).
|
|
46
105
|
* Corruption-tolerant: returns undefined on parse failure (cold-start
|
|
@@ -92,16 +151,27 @@ export function writeCursor(path, lastSeenId, log = () => { }) {
|
|
|
92
151
|
log(`[poll-backstop] writeFileSync(${path}) failed: ${err}`);
|
|
93
152
|
}
|
|
94
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Coerce an `agent.call("list_messages")` return into a ListMessagesBody.
|
|
156
|
+
*
|
|
157
|
+
* bug-103: `IAgentClient.call` → `McpTransport.request` ALREADY unwraps the
|
|
158
|
+
* MCP tool-result envelope — it reads `result.content[0].text` and
|
|
159
|
+
* `JSON.parse`s it (see `mcp-transport.ts` request()). So `raw` here is the
|
|
160
|
+
* `list_messages` body — `{ messages, count }` — directly, NOT the
|
|
161
|
+
* `{ content: [{ text }] }` envelope. The prior implementation re-expected
|
|
162
|
+
* the envelope; since the first-timer was disabled from bug-53 until the
|
|
163
|
+
* bug-103 slice, this path never ran against the real transport, so the
|
|
164
|
+
* contract drift went uncaught (the harness-verify is the dispositive
|
|
165
|
+
* real-transport guard). Returns null on any other shape — defensive
|
|
166
|
+
* against a non-JSON error string, null, or a cognitive-layer summarized
|
|
167
|
+
* result that drops the `messages[]` array.
|
|
168
|
+
*/
|
|
95
169
|
function parseListMessagesResult(raw) {
|
|
96
|
-
|
|
97
|
-
if (!env || !env.content || !env.content[0] || env.isError)
|
|
170
|
+
if (!raw || typeof raw !== "object")
|
|
98
171
|
return null;
|
|
99
|
-
|
|
100
|
-
return JSON.parse(env.content[0].text);
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
172
|
+
if (!Array.isArray(raw.messages))
|
|
103
173
|
return null;
|
|
104
|
-
|
|
174
|
+
return raw;
|
|
105
175
|
}
|
|
106
176
|
/**
|
|
107
177
|
* The PollBackstop runs the periodic `list_messages` tick loop and
|
|
@@ -114,39 +184,123 @@ function parseListMessagesResult(raw) {
|
|
|
114
184
|
export class PollBackstop {
|
|
115
185
|
opts;
|
|
116
186
|
timer = null;
|
|
187
|
+
heartbeatTimer = null;
|
|
188
|
+
// mission-99 F2: self-rescheduling loops set these true so a late-returning
|
|
189
|
+
// tick doesn't re-arm after stop() (the stop-race guard for setTimeout loops).
|
|
190
|
+
pollRunning = false;
|
|
191
|
+
heartbeatRunning = false;
|
|
117
192
|
resolvedCursorFile = null;
|
|
118
193
|
inFlight = false;
|
|
194
|
+
heartbeatInFlight = false;
|
|
195
|
+
/**
|
|
196
|
+
* bug-173 — the role resolved at USE-time (`this.opts.role` may be a
|
|
197
|
+
* `() => string` thunk for hosts that construct the dispatcher before
|
|
198
|
+
* config loads). Every role read (poll filter, cursor file, log) goes
|
|
199
|
+
* through here so a configured role propagates without re-construction.
|
|
200
|
+
*/
|
|
201
|
+
get currentRole() {
|
|
202
|
+
return resolveRole(this.opts.role);
|
|
203
|
+
}
|
|
119
204
|
constructor(opts) {
|
|
120
205
|
const fromEnv = parseInt(process.env.OIS_ADAPTER_POLL_BACKSTOP_S ?? "", 10);
|
|
121
206
|
const cadence = Math.max(MIN_CADENCE_SECONDS, opts.cadenceSeconds ??
|
|
122
207
|
(Number.isFinite(fromEnv) ? fromEnv : DEFAULT_CADENCE_SECONDS));
|
|
208
|
+
// mission-75 v1.0 §3.3 — heartbeat timer config (separate from
|
|
209
|
+
// message-poll cadence). Reads TRANSPORT_HEARTBEAT_INTERVAL_MS +
|
|
210
|
+
// TRANSPORT_HEARTBEAT_ENABLED env vars; explicit options override.
|
|
211
|
+
const hbFromEnv = Number(process.env.TRANSPORT_HEARTBEAT_INTERVAL_MS);
|
|
212
|
+
const heartbeatIntervalMs = Math.max(MIN_HEARTBEAT_INTERVAL_MS, opts.heartbeatIntervalMs ??
|
|
213
|
+
(Number.isFinite(hbFromEnv) ? hbFromEnv : DEFAULT_HEARTBEAT_INTERVAL_MS));
|
|
214
|
+
const heartbeatEnabled = opts.heartbeatEnabled ??
|
|
215
|
+
(process.env.TRANSPORT_HEARTBEAT_ENABLED === "false" ? false : true);
|
|
216
|
+
// bug-53: firstTimerEnabled defaults true for backwards-compat with
|
|
217
|
+
// existing mission-56 W3.3 Pull-mode callers; heartbeat-only hosts pass
|
|
218
|
+
// false to skip the first-timer scheduling.
|
|
219
|
+
const firstTimerEnabled = opts.firstTimerEnabled ?? true;
|
|
123
220
|
this.opts = {
|
|
124
221
|
role: opts.role,
|
|
125
222
|
cadenceSeconds: cadence,
|
|
126
223
|
cursorFile: opts.cursorFile,
|
|
127
224
|
log: opts.log ?? (() => { }),
|
|
128
|
-
onPolledMessage: opts.onPolledMessage,
|
|
225
|
+
onPolledMessage: opts.onPolledMessage ?? (() => { }),
|
|
226
|
+
onHeartbeatTick: opts.onHeartbeatTick ?? (() => { }),
|
|
227
|
+
heartbeatIntervalMs,
|
|
228
|
+
heartbeatEnabled,
|
|
229
|
+
firstTimerEnabled,
|
|
230
|
+
random: opts.random ?? Math.random,
|
|
129
231
|
};
|
|
130
232
|
}
|
|
131
|
-
/**
|
|
233
|
+
/** Next poll delay with ±20% jitter (mission-99 F2, spec §6). */
|
|
234
|
+
nextPollDelayMs() {
|
|
235
|
+
return jitter(this.opts.cadenceSeconds * 1000, JITTER_FRACTION, this.opts.random);
|
|
236
|
+
}
|
|
237
|
+
/** Next heartbeat delay with ±20% jitter (mission-99 F2, spec §6). */
|
|
238
|
+
nextHeartbeatDelayMs() {
|
|
239
|
+
return jitter(this.opts.heartbeatIntervalMs, JITTER_FRACTION, this.opts.random);
|
|
240
|
+
}
|
|
241
|
+
/** Start the periodic poll + heartbeat (if enabled). Idempotent. */
|
|
132
242
|
start(getAgent) {
|
|
133
|
-
if
|
|
243
|
+
// Idempotency guard: if EITHER timer is already set, treat as started.
|
|
244
|
+
// bug-53: previously checked only `this.timer`; under heartbeat-only
|
|
245
|
+
// mode (firstTimerEnabled=false) timer is null but heartbeatTimer may
|
|
246
|
+
// be set — guard against duplicate-start re-scheduling the heartbeat.
|
|
247
|
+
if (this.pollRunning || this.heartbeatRunning)
|
|
134
248
|
return;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
249
|
+
this.opts.log(`[poll-backstop] starting (role=${this.currentRole}, cadenceS=${this.opts.firstTimerEnabled ? this.opts.cadenceSeconds : "disabled"}, heartbeatMs=${this.opts.heartbeatEnabled ? this.opts.heartbeatIntervalMs : "disabled"}, jitter=±${JITTER_FRACTION * 100}%)`);
|
|
250
|
+
// mission-99 F2: self-rescheduling setTimeout loops (NOT setInterval) so each
|
|
251
|
+
// cycle re-rolls a fresh ±20% jitter (spec §6 anti-stampede). The average
|
|
252
|
+
// cadence is preserved; the phases desynchronize across the fleet so a
|
|
253
|
+
// synchronized restart/reconnect does not produce a poll BURST on one tick.
|
|
254
|
+
//
|
|
255
|
+
// bug-53: skip first-timer scheduling when firstTimerEnabled === false
|
|
256
|
+
// (heartbeat-only hosts use SSE for inline message delivery).
|
|
257
|
+
if (this.opts.firstTimerEnabled) {
|
|
258
|
+
this.pollRunning = true;
|
|
259
|
+
this.schedulePoll(getAgent);
|
|
260
|
+
}
|
|
261
|
+
// mission-75 v1.0 §3.3 — transport_heartbeat loop. Only started when
|
|
262
|
+
// heartbeatEnabled === true (TRANSPORT_HEARTBEAT_ENABLED env-disable path).
|
|
263
|
+
if (this.opts.heartbeatEnabled) {
|
|
264
|
+
this.heartbeatRunning = true;
|
|
265
|
+
this.scheduleHeartbeat(getAgent);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/** Arm the next jittered poll tick (mission-99 F2 self-rescheduling loop). */
|
|
269
|
+
schedulePoll(getAgent) {
|
|
270
|
+
if (!this.pollRunning)
|
|
271
|
+
return;
|
|
272
|
+
this.timer = setTimeout(() => {
|
|
273
|
+
// Fire-and-forget; tick() handles its own errors. Reschedule AFTER the
|
|
274
|
+
// tick settles so a slow tick doesn't overlap its successor.
|
|
275
|
+
void this.tick(getAgent).finally(() => this.schedulePoll(getAgent));
|
|
276
|
+
}, this.nextPollDelayMs());
|
|
141
277
|
if (this.timer.unref)
|
|
142
278
|
this.timer.unref();
|
|
143
279
|
}
|
|
144
|
-
/**
|
|
145
|
-
|
|
146
|
-
if (!this.
|
|
280
|
+
/** Arm the next jittered heartbeat tick (mission-99 F2 self-rescheduling loop). */
|
|
281
|
+
scheduleHeartbeat(getAgent) {
|
|
282
|
+
if (!this.heartbeatRunning)
|
|
147
283
|
return;
|
|
148
|
-
|
|
149
|
-
|
|
284
|
+
this.heartbeatTimer = setTimeout(() => {
|
|
285
|
+
void this.tickHeartbeat(getAgent).finally(() => this.scheduleHeartbeat(getAgent));
|
|
286
|
+
}, this.nextHeartbeatDelayMs());
|
|
287
|
+
if (this.heartbeatTimer.unref)
|
|
288
|
+
this.heartbeatTimer.unref();
|
|
289
|
+
}
|
|
290
|
+
/** Stop the periodic poll + heartbeat. Idempotent. */
|
|
291
|
+
stop() {
|
|
292
|
+
// Clear the running flags FIRST so an in-flight tick's .finally() reschedule
|
|
293
|
+
// is a no-op (the stop-race guard for the self-rescheduling loops).
|
|
294
|
+
this.pollRunning = false;
|
|
295
|
+
this.heartbeatRunning = false;
|
|
296
|
+
if (this.timer) {
|
|
297
|
+
clearTimeout(this.timer);
|
|
298
|
+
this.timer = null;
|
|
299
|
+
}
|
|
300
|
+
if (this.heartbeatTimer) {
|
|
301
|
+
clearTimeout(this.heartbeatTimer);
|
|
302
|
+
this.heartbeatTimer = null;
|
|
303
|
+
}
|
|
150
304
|
this.opts.log("[poll-backstop] stopped");
|
|
151
305
|
}
|
|
152
306
|
/**
|
|
@@ -175,20 +329,23 @@ export class PollBackstop {
|
|
|
175
329
|
// session id which cycles on reconnect.
|
|
176
330
|
const metrics = agent.getMetrics?.();
|
|
177
331
|
const id = metrics?.agentId ?? agentId;
|
|
178
|
-
this.resolvedCursorFile = defaultCursorFile(this.
|
|
332
|
+
this.resolvedCursorFile = defaultCursorFile(this.currentRole, id);
|
|
179
333
|
}
|
|
180
334
|
}
|
|
181
335
|
const cursorFile = this.resolvedCursorFile;
|
|
182
336
|
const since = readCursor(cursorFile);
|
|
183
337
|
const args = {
|
|
184
|
-
targetRole: this.
|
|
338
|
+
targetRole: this.currentRole,
|
|
185
339
|
status: "new",
|
|
186
340
|
};
|
|
187
341
|
if (since !== undefined)
|
|
188
342
|
args.since = since;
|
|
189
343
|
let raw;
|
|
190
344
|
try {
|
|
191
|
-
|
|
345
|
+
// bug-106: `internal` — this catch-up poll is machinery, not an LLM
|
|
346
|
+
// tool-call; the result must NOT be cognitive-layer-summarized
|
|
347
|
+
// (a summarized/truncated messages[] silently drops recovery).
|
|
348
|
+
raw = await agent.call("list_messages", args, { internal: true });
|
|
192
349
|
}
|
|
193
350
|
catch (err) {
|
|
194
351
|
this.opts.log(`[poll-backstop] list_messages failed (non-fatal): ${err?.message ?? String(err)}`);
|
|
@@ -239,5 +396,78 @@ export class PollBackstop {
|
|
|
239
396
|
this.inFlight = false;
|
|
240
397
|
}
|
|
241
398
|
}
|
|
399
|
+
/**
|
|
400
|
+
* mission-75 v1.0 §3.3 — single transport_heartbeat tick. Lightweight
|
|
401
|
+
* no-payload; the call itself is the heartbeat. Failure handling per
|
|
402
|
+
* Design §3.3:
|
|
403
|
+
* - retry once with 5s backoff;
|
|
404
|
+
* - skip cycle on second failure (next cycle attempts);
|
|
405
|
+
* - poll-backstop existing retry semantics for transient blips.
|
|
406
|
+
*
|
|
407
|
+
* Reentrant-safe via heartbeatInFlight guard. Exposed for tests
|
|
408
|
+
* (force-tick on demand).
|
|
409
|
+
*/
|
|
410
|
+
async tickHeartbeat(getAgent) {
|
|
411
|
+
if (this.heartbeatInFlight)
|
|
412
|
+
return;
|
|
413
|
+
this.heartbeatInFlight = true;
|
|
414
|
+
try {
|
|
415
|
+
// idea-355 §4.3 (review fix — LIVENESS DECOUPLING): the host tick hook now
|
|
416
|
+
// carries the idea-355 wake/stall reconcile (a Hub round-trip) on top of the
|
|
417
|
+
// bug-180 /health live-refresh. Start it, but do NOT let it gate the liveness
|
|
418
|
+
// heartbeat — transport_heartbeat must never wait on the reconcile's Hub
|
|
419
|
+
// latency, or a slow read erodes the mission-75 TTL margin and can trip a
|
|
420
|
+
// FALSE-unresponsive (the exact bug-186 class). The hook runs CONCURRENTLY
|
|
421
|
+
// with the heartbeat; it has its own error handling + (for the reconcile)
|
|
422
|
+
// its own in-flight latch + read-timeout. bug-180's /health is still fired
|
|
423
|
+
// before/independent of the streaming gate, so an in-life redeploy is caught
|
|
424
|
+
// within one interval regardless of agent state. Best-effort.
|
|
425
|
+
const hookSettled = Promise.resolve()
|
|
426
|
+
.then(() => this.opts.onHeartbeatTick())
|
|
427
|
+
.catch((err) => {
|
|
428
|
+
this.opts.log(`[poll-backstop] onHeartbeatTick threw (non-fatal): ${err?.message ?? String(err)}`);
|
|
429
|
+
});
|
|
430
|
+
// Liveness heartbeat — independent of the hook.
|
|
431
|
+
await this.sendHeartbeat(getAgent);
|
|
432
|
+
// Settle the hook before releasing heartbeatInFlight (bounded by the
|
|
433
|
+
// reconcile's read-timeout) so a slow reconcile can't overlap the next tick.
|
|
434
|
+
await hookSettled;
|
|
435
|
+
}
|
|
436
|
+
finally {
|
|
437
|
+
this.heartbeatInFlight = false;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Send `transport_heartbeat` with one backoff retry. Gated on a streaming
|
|
442
|
+
* agent (the heartbeat needs the agent transport); a non-streaming agent is a
|
|
443
|
+
* no-op. Split out of `tickHeartbeat` so its early returns stay local — the
|
|
444
|
+
* caller must still settle the concurrent tick hook before releasing the
|
|
445
|
+
* heartbeatInFlight guard.
|
|
446
|
+
*/
|
|
447
|
+
async sendHeartbeat(getAgent) {
|
|
448
|
+
const agent = getAgent();
|
|
449
|
+
if (!agent || agent.state !== "streaming")
|
|
450
|
+
return;
|
|
451
|
+
try {
|
|
452
|
+
await agent.call("transport_heartbeat", {}, { internal: true });
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
catch (firstErr) {
|
|
456
|
+
this.opts.log(`[poll-backstop] transport_heartbeat failed (1st; retrying in ${HEARTBEAT_RETRY_BACKOFF_MS}ms): ${firstErr?.message ?? String(firstErr)}`);
|
|
457
|
+
}
|
|
458
|
+
// Single retry with backoff. If this fails too, skip the cycle —
|
|
459
|
+
// next cycle (heartbeatIntervalMs from now) will try again.
|
|
460
|
+
await new Promise((resolve) => setTimeout(resolve, HEARTBEAT_RETRY_BACKOFF_MS));
|
|
461
|
+
try {
|
|
462
|
+
// Re-check agent state after the backoff (could have torn down).
|
|
463
|
+
const agent2 = getAgent();
|
|
464
|
+
if (!agent2 || agent2.state !== "streaming")
|
|
465
|
+
return;
|
|
466
|
+
await agent2.call("transport_heartbeat", {}, { internal: true });
|
|
467
|
+
}
|
|
468
|
+
catch (secondErr) {
|
|
469
|
+
this.opts.log(`[poll-backstop] transport_heartbeat failed (2nd; skipping cycle): ${secondErr?.message ?? String(secondErr)}`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
242
472
|
}
|
|
243
473
|
//# sourceMappingURL=poll-backstop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll-backstop.js","sourceRoot":"","sources":["../../src/kernel/poll-backstop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"poll-backstop.js","sourceRoot":"","sources":["../../src/kernel/poll-backstop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,MAAM,uBAAuB,GAAG,GAAG,CAAC,CAAC,YAAY;AACjD,MAAM,mBAAmB,GAAG,EAAE,CAAC,CAAC,sCAAsC;AAEtE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAC7C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEzC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,OAAO;AAE3C;;;;GAIG;AACH,MAAM,UAAU,MAAM,CACpB,MAAc,EACd,QAAQ,GAAG,eAAe,EAC1B,OAAqB,IAAI,CAAC,MAAM;IAEhC,sDAAsD;IACtD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC;AA+GD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAe;IAC7D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,IAA6B;IACvD,OAAO,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;QAC7C,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,EAC1E,CAAC;YACD,OAAO,MAAM,CAAC,UAAU,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,UAA8B,EAC9B,MAA6B,GAAG,EAAE,GAAE,CAAC;IAErC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,6BAA6B,GAAG,aAAa,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAe;QACvB,UAAU;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,CAAC;KACX,CAAC;IACF,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,iCAAiC,IAAI,aAAa,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAOD;;;;;;;;;;;;;;GAcG;AACH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,GAA8B,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,GAAuB,CAAC;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACN,IAAI,CAUnB;IACM,KAAK,GAA0B,IAAI,CAAC;IACpC,cAAc,GAA0B,IAAI,CAAC;IACrD,4EAA4E;IAC5E,+EAA+E;IACvE,WAAW,GAAG,KAAK,CAAC;IACpB,gBAAgB,GAAG,KAAK,CAAC;IACzB,kBAAkB,GAAkB,IAAI,CAAC;IACzC,QAAQ,GAAG,KAAK,CAAC;IACjB,iBAAiB,GAAG,KAAK,CAAC;IAElC;;;;;OAKG;IACH,IAAY,WAAW;QACrB,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,YAAY,IAAyB;QACnC,MAAM,OAAO,GAAG,QAAQ,CACtB,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,EAC7C,EAAE,CACH,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,mBAAmB,EACnB,IAAI,CAAC,cAAc;YACjB,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CACjE,CAAC;QACF,+DAA+D;QAC/D,iEAAiE;QACjE,mEAAmE;QACnE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACtE,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAClC,yBAAyB,EACzB,IAAI,CAAC,mBAAmB;YACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAC3E,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB;YAC5C,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvE,oEAAoE;QACpE,wEAAwE;QACxE,4CAA4C;QAC5C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,cAAc,EAAE,OAAO;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC3B,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YACnD,mBAAmB;YACnB,gBAAgB;YAChB,iBAAiB;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;SACnC,CAAC;IACJ,CAAC;IAED,iEAAiE;IACzD,eAAe;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,CAAC;IAED,sEAAsE;IAC9D,oBAAoB;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,QAAmC;QACvC,uEAAuE;QACvE,qEAAqE;QACrE,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,kCAAkC,IAAI,CAAC,WAAW,cAAc,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,iBAAiB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,aAAa,eAAe,GAAG,GAAG,IAAI,CAClQ,CAAC;QACF,8EAA8E;QAC9E,0EAA0E;QAC1E,uEAAuE;QACvE,4EAA4E;QAC5E,EAAE;QACF,uEAAuE;QACvE,8DAA8D;QAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,qEAAqE;QACrE,4EAA4E;QAC5E,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,8EAA8E;IACtE,YAAY,CAAC,QAAmC;QACtD,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,uEAAuE;YACvE,6DAA6D;YAC7D,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,mFAAmF;IAC3E,iBAAiB,CAAC,QAAmC;QAC3D,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC7C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;QACJ,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED,sDAAsD;IACtD,IAAI;QACF,6EAA6E;QAC7E,oEAAoE;QACpE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,QAAmC;QAC5C,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;gBAAE,OAAO;YAElD,2DAA2D;YAC3D,iCAAiC;YACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACjD,CAAC;qBAAM,CAAC;oBACN,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,SAAS,CAAC;oBAClD,0DAA0D;oBAC1D,0DAA0D;oBAC1D,wCAAwC;oBACxC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;oBACrC,MAAM,EAAE,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC;oBACvC,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAE3C,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,IAAI,GAA4B;gBACpC,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,MAAM,EAAE,KAAK;aACd,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAE5C,IAAI,GAAY,CAAC;YACjB,IAAI,CAAC;gBACH,oEAAoE;gBACpE,+DAA+D;gBAC/D,+DAA+D;gBAC/D,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,qDAAsD,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9F,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,sEAAsE,CACvE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,8DAA8D;gBAC9D,iCAAiC;gBACjC,OAAO;YACT,CAAC;YAED,gEAAgE;YAChE,8DAA8D;YAC9D,8CAA8C;YAC9C,IAAI,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;YACxB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;oBAAE,SAAS;gBACzD,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK;oBAAE,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAe;oBACxB,KAAK,EAAE,iBAAiB;oBACxB,IAAI,EAAE,EAAE,OAAO,EAAE;oBACjB,4DAA4D;oBAC5D,0DAA0D;oBAC1D,4DAA4D;oBAC5D,EAAE,EAAE,OAAO,CAAC,EAAE;iBACf,CAAC;gBACF,IAAI,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,8DAA+D,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CACvG,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,oEAAoE;YACpE,iEAAiE;YACjE,6BAA6B;YAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;gBACzC,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,aAAa,CAAC,QAAmC;QACrD,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC;YACH,2EAA2E;YAC3E,6EAA6E;YAC7E,8EAA8E;YAC9E,yEAAyE;YACzE,0EAA0E;YAC1E,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;YAC3E,6EAA6E;YAC7E,8DAA8D;YAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;iBAClC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;iBACvC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,sDAAuD,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/F,CAAC;YACJ,CAAC,CAAC,CAAC;YAEL,gDAAgD;YAChD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAEnC,qEAAqE;YACrE,6EAA6E;YAC7E,MAAM,WAAW,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,aAAa,CAAC,QAAmC;QAC7D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAClD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,gEAAgE,0BAA0B,QAAS,QAAkB,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CACrJ,CAAC;QACJ,CAAC;QACD,iEAAiE;QACjE,4DAA4D;QAC5D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;gBAAE,OAAO;YACpD,MAAM,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,qEAAsE,SAAmB,EAAE,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAC1H,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -9,19 +9,8 @@
|
|
|
9
9
|
* engineer has its canonical agentId by the time it queries pending state.
|
|
10
10
|
*/
|
|
11
11
|
import type { ILogger, LegacyStringLogger } from "../logger.js";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* Adapter-facing shape — subset of the Hub's canonical type that's
|
|
15
|
-
* relevant for consumption. `id` is the queue item's surrogate ID which
|
|
16
|
-
* MUST be passed back as `sourceQueueItemId` on the settling tool call
|
|
17
|
-
* (e.g., create_thread_reply) for completion-ACK.
|
|
18
|
-
*/
|
|
19
|
-
export interface DrainedPendingAction {
|
|
20
|
-
id: string;
|
|
21
|
-
dispatchType: string;
|
|
22
|
-
entityRef: string;
|
|
23
|
-
payload: Record<string, unknown>;
|
|
24
|
-
}
|
|
12
|
+
import type { DrainedPendingAction } from "@apnex/message-router";
|
|
13
|
+
export type { DrainedPendingAction };
|
|
25
14
|
export interface StateSyncContext {
|
|
26
15
|
executeTool: (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
27
16
|
completeSync: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-sync.js","sourceRoot":"","sources":["../../src/kernel/state-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"state-sync.js","sourceRoot":"","sources":["../../src/kernel/state-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,3 +27,11 @@ export interface NotificationLogOptions {
|
|
|
27
27
|
* break the runtime).
|
|
28
28
|
*/
|
|
29
29
|
export declare function appendNotification(entry: NotificationLogEntry, opts: NotificationLogOptions): void;
|
|
30
|
+
/**
|
|
31
|
+
* idea-355 SLICE-1 dedup: the both-shim-identical pending-task notification
|
|
32
|
+
* payload (was duplicated verbatim in the claude + opencode onPendingTask
|
|
33
|
+
* callbacks). Each shim feeds the returned entry to its own
|
|
34
|
+
* appendNotification(..., { logPath, mirror? }) — the host-specific log sink
|
|
35
|
+
* stays in the shim (the last mile).
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildPendingTaskNotification(task: Record<string, unknown>): NotificationLogEntry;
|
package/dist/notification-log.js
CHANGED
|
@@ -63,4 +63,14 @@ export function appendNotification(entry, opts) {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* idea-355 SLICE-1 dedup: the both-shim-identical pending-task notification
|
|
68
|
+
* payload (was duplicated verbatim in the claude + opencode onPendingTask
|
|
69
|
+
* callbacks). Each shim feeds the returned entry to its own
|
|
70
|
+
* appendNotification(..., { logPath, mirror? }) — the host-specific log sink
|
|
71
|
+
* stays in the shim (the last mile).
|
|
72
|
+
*/
|
|
73
|
+
export function buildPendingTaskNotification(task) {
|
|
74
|
+
return { event: "task_issued", data: task, action: "Pick up with get_task" };
|
|
75
|
+
}
|
|
66
76
|
//# sourceMappingURL=notification-log.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-log.js","sourceRoot":"","sources":["../src/notification-log.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notification-log.js","sourceRoot":"","sources":["../src/notification-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* observability.ts — pure helpers for shim observability formalization.
|
|
3
|
+
*
|
|
4
|
+
* Mission-66 W1+W2 commit 4 (per Design §2.2 + ADR-031 §3, §5; spec
|
|
5
|
+
* `docs/specs/shim-observability-events.md` §3 + §5). idea-355 SLICE-1
|
|
6
|
+
* single-home: hoisted from the claude shim so any host's file-logger can
|
|
7
|
+
* redact + level-filter through one implementation (it can't drift).
|
|
8
|
+
*
|
|
9
|
+
* Pure functions: tests import them without triggering a shim's module-init
|
|
10
|
+
* `loadConfig()` side effect.
|
|
11
|
+
*/
|
|
12
|
+
import type { LogFields } from "./logger.js";
|
|
13
|
+
export declare const REDACT_KEYS: Set<string>;
|
|
14
|
+
export declare function redactFields(fields: LogFields): LogFields;
|
|
15
|
+
export declare const LOG_LEVELS: readonly ["DEBUG", "INFO", "WARN", "ERROR"];
|
|
16
|
+
export type LogLevel = typeof LOG_LEVELS[number];
|
|
17
|
+
export declare function parseLogLevel(raw: string | undefined): LogLevel;
|
|
18
|
+
/**
|
|
19
|
+
* Decides whether an event with optional `level` field should be emitted
|
|
20
|
+
* given the configured threshold. Pure function for unit-test tractability;
|
|
21
|
+
* the shim runtime binds threshold via the `OIS_SHIM_LOG_LEVEL` env var read
|
|
22
|
+
* at module init.
|
|
23
|
+
*/
|
|
24
|
+
export declare function shouldEmitLevel(eventLevel: string | undefined, threshold: LogLevel): boolean;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// ── Redaction discipline (ADR-031 §5) ────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Sensitive field names that MUST be redacted before persisting to the
|
|
4
|
+
// events file. Defensive — current callers don't pass these, but a future
|
|
5
|
+
// field rename could accidentally leak. Whole-key match (case-insensitive);
|
|
6
|
+
// any field whose name matches is replaced with `<redacted>`.
|
|
7
|
+
export const REDACT_KEYS = new Set([
|
|
8
|
+
"hubtoken",
|
|
9
|
+
"token",
|
|
10
|
+
"authorization",
|
|
11
|
+
"bearer",
|
|
12
|
+
"apikey",
|
|
13
|
+
"api_key",
|
|
14
|
+
"secret",
|
|
15
|
+
"password",
|
|
16
|
+
]);
|
|
17
|
+
export function redactFields(fields) {
|
|
18
|
+
const out = {};
|
|
19
|
+
for (const k of Object.keys(fields)) {
|
|
20
|
+
out[k] = REDACT_KEYS.has(k.toLowerCase()) ? "<redacted>" : fields[k];
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
// ── Log-level filter (ADR-031 §3; OIS_SHIM_LOG_LEVEL env var) ────────
|
|
25
|
+
//
|
|
26
|
+
// Levels: DEBUG < INFO < WARN < ERROR. Default INFO. Filter applied at
|
|
27
|
+
// FileBackedLogger emit boundary; events tagged with `fields.level` below
|
|
28
|
+
// threshold are suppressed (no-op). Events without `level` always emit
|
|
29
|
+
// (default INFO behavior — preserves Phase 1 emit semantics).
|
|
30
|
+
export const LOG_LEVELS = ["DEBUG", "INFO", "WARN", "ERROR"];
|
|
31
|
+
export function parseLogLevel(raw) {
|
|
32
|
+
const normalized = (raw ?? "").toUpperCase();
|
|
33
|
+
return LOG_LEVELS.includes(normalized)
|
|
34
|
+
? normalized
|
|
35
|
+
: "INFO";
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decides whether an event with optional `level` field should be emitted
|
|
39
|
+
* given the configured threshold. Pure function for unit-test tractability;
|
|
40
|
+
* the shim runtime binds threshold via the `OIS_SHIM_LOG_LEVEL` env var read
|
|
41
|
+
* at module init.
|
|
42
|
+
*/
|
|
43
|
+
export function shouldEmitLevel(eventLevel, threshold) {
|
|
44
|
+
if (!eventLevel)
|
|
45
|
+
return true; // unlevelled events always emit (default INFO)
|
|
46
|
+
const idx = LOG_LEVELS.indexOf(eventLevel.toUpperCase());
|
|
47
|
+
if (idx < 0)
|
|
48
|
+
return true; // unknown level treated as unlevelled
|
|
49
|
+
const thresholdIdx = LOG_LEVELS.indexOf(threshold);
|
|
50
|
+
return idx >= thresholdIdx;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,UAAU;IACV,OAAO;IACP,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAgB,CAAC;AAC1B,CAAC;AAED,wEAAwE;AACxE,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,uEAAuE;AACvE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAGtE,MAAM,UAAU,aAAa,CAAC,GAAuB;IACnD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAQ,UAAgC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC3D,CAAC,CAAE,UAAuB;QAC1B,CAAC,CAAC,MAAM,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA8B,EAC9B,SAAmB;IAEnB,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,CAAC,+CAA+C;IAC7E,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAc,CAAC,CAAC;IACrE,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,sCAAsC;IAChE,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,GAAG,IAAI,YAAY,CAAC;AAC7B,CAAC"}
|