@hua-labs/tap 0.5.1 → 0.6.0
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/AI_GUIDE.md +165 -0
- package/CHANGELOG.md +67 -0
- package/README.md +201 -12
- package/dist/bridges/codex-app-server-auth-gateway.mjs +16 -1
- package/dist/bridges/codex-app-server-auth-gateway.mjs.map +1 -1
- package/dist/bridges/codex-app-server-bridge.d.mts +105 -12
- package/dist/bridges/codex-app-server-bridge.mjs +3149 -251
- package/dist/bridges/codex-app-server-bridge.mjs.map +1 -1
- package/dist/bridges/codex-bridge-runner.d.mts +4 -1
- package/dist/bridges/codex-bridge-runner.mjs +512 -58
- package/dist/bridges/codex-bridge-runner.mjs.map +1 -1
- package/dist/bridges/codex-remote-ipc-relay.d.mts +1 -0
- package/dist/bridges/codex-remote-ipc-relay.mjs +1912 -0
- package/dist/bridges/codex-remote-ipc-relay.mjs.map +1 -0
- package/dist/bridges/gemini-ide-companion-runner.mjs.map +1 -1
- package/dist/cli.mjs +30944 -8415
- package/dist/cli.mjs.map +1 -1
- package/dist/codex-a2a/index.d.mts +2 -0
- package/dist/codex-a2a/index.mjs +416 -0
- package/dist/codex-a2a/index.mjs.map +1 -0
- package/dist/codex-health/index.d.mts +76 -0
- package/dist/codex-health/index.mjs +153 -0
- package/dist/codex-health/index.mjs.map +1 -0
- package/dist/codex-ipc/index.d.mts +2 -0
- package/dist/codex-ipc/index.mjs +1834 -0
- package/dist/codex-ipc/index.mjs.map +1 -0
- package/dist/index-D4Khz2Mh.d.mts +206 -0
- package/dist/index-DMToLyGd.d.mts +256 -0
- package/dist/index.d.mts +763 -8
- package/dist/index.mjs +11600 -3449
- package/dist/index.mjs.map +1 -1
- package/dist/mcp-server.mjs +8838 -811
- package/dist/mcp-server.mjs.map +1 -1
- package/dist/types-FWvKrFUt.d.mts +43 -0
- package/examples/01-logic-battle-known-broken.md +46 -0
- package/examples/02-cross-model-review-root-cause.md +37 -0
- package/examples/03-convergence-pattern.md +42 -0
- package/examples/04-tower-broadcast.md +41 -0
- package/examples/05-self-awareness-paradox.md +49 -0
- package/examples/06-session-resurrection.md +37 -0
- package/examples/07-ghost-agent.md +31 -0
- package/examples/08-naming-creates-identity.md +36 -0
- package/examples/09-ceo-as-middleware.md +52 -0
- package/examples/10-files-as-interface.md +67 -0
- package/examples/README.md +34 -0
- package/examples/tap-profile-pack.example.json +71 -0
- package/package.json +21 -3
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { B as BuildCodexBindingRegistryOptions, C as CodexA2AAdapterKind, a as CodexA2ADeliveryRequest, b as CodexA2ADeliveryResult, c as CodexA2AFailureReason, d as CodexA2AMessageEnvelope, e as CodexA2ATargetTuple, f as CodexBinding, g as CodexBindingAddress, h as CodexBindingBlockReason, i as CodexBindingHeartbeat, j as CodexBindingRegistry, E as CodexBindingRuntimeHealth, F as CodexBindingRuntimeHealthStatus, k as CodexBindingSource, l as CodexBindingStatus, m as ConsentDriveReceipt, n as ConsentDriveResponse, o as ConsentDriveTransport, p as ConsentDriveTransportFactory, R as RemoteCodexRelayConfig, q as RemoteCodexRelayExecutor, r as RemoteCodexRelayInput, s as RemoteCodexRelayResult, t as ResolveCodexBindingOptions, u as ResolveCodexBindingResult, v as ResolveCodexBindingTarget, w as buildCodexBindingRegistry, D as resolveCodexBinding } from '../index-D4Khz2Mh.mjs';
|
|
2
|
+
import '../types-FWvKrFUt.mjs';
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
// src/routing/receive-transports.ts
|
|
2
|
+
import { basename } from "path";
|
|
3
|
+
var VALID_RECEIVE_TRANSPORTS = [
|
|
4
|
+
"mcp-channel",
|
|
5
|
+
"consent-drive",
|
|
6
|
+
"polling"
|
|
7
|
+
];
|
|
8
|
+
function normalizeString(value) {
|
|
9
|
+
const normalized = value?.trim();
|
|
10
|
+
return normalized ? normalized : null;
|
|
11
|
+
}
|
|
12
|
+
function normalizeReceiveTransports(values) {
|
|
13
|
+
const transports = [];
|
|
14
|
+
for (const value of values ?? []) {
|
|
15
|
+
if (!VALID_RECEIVE_TRANSPORTS.includes(value)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const transport = value;
|
|
19
|
+
if (transports.includes(transport)) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
transports.push(transport);
|
|
23
|
+
}
|
|
24
|
+
return transports;
|
|
25
|
+
}
|
|
26
|
+
function canUseConsentDriveForAddress(options) {
|
|
27
|
+
const address = options.address;
|
|
28
|
+
if (!address?.conversationId?.trim() || !address.ownerClientId?.trim()) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const localHostId = normalizeString(options.localHostId);
|
|
32
|
+
const targetHostId = normalizeString(address.hostId);
|
|
33
|
+
if (!localHostId || !targetHostId) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return localHostId.toLowerCase() === targetHostId.toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/codex-a2a/binding-registry.ts
|
|
40
|
+
var DEFAULT_STALE_AFTER_MS = 30 * 60 * 1e3;
|
|
41
|
+
var HEALTH_SEVERITY = {
|
|
42
|
+
"stuck-turn": 90,
|
|
43
|
+
"stale-owner": 80,
|
|
44
|
+
"stale-active-turn": 75,
|
|
45
|
+
"active-turn": 70,
|
|
46
|
+
partial: 60,
|
|
47
|
+
"adapter-unavailable": 50,
|
|
48
|
+
degraded: 40,
|
|
49
|
+
"not-observed": 30,
|
|
50
|
+
unknown: 20,
|
|
51
|
+
ready: 10
|
|
52
|
+
};
|
|
53
|
+
var HEALTH_STATUSES = new Set(
|
|
54
|
+
Object.keys(HEALTH_SEVERITY)
|
|
55
|
+
);
|
|
56
|
+
function normalizeString2(value) {
|
|
57
|
+
const normalized = value?.trim();
|
|
58
|
+
return normalized ? normalized : null;
|
|
59
|
+
}
|
|
60
|
+
function normalizeToken(value) {
|
|
61
|
+
return normalizeString2(value)?.replace(/-/g, "_").toLowerCase() ?? null;
|
|
62
|
+
}
|
|
63
|
+
function isCodexLike(value) {
|
|
64
|
+
const token = normalizeToken(value);
|
|
65
|
+
return token === "codex" || Boolean(token?.startsWith("codex_"));
|
|
66
|
+
}
|
|
67
|
+
function toTime(value) {
|
|
68
|
+
if (value instanceof Date) return value.getTime();
|
|
69
|
+
if (typeof value === "number") return value;
|
|
70
|
+
if (typeof value === "string") {
|
|
71
|
+
const parsed = Date.parse(value);
|
|
72
|
+
return Number.isFinite(parsed) ? parsed : Date.now();
|
|
73
|
+
}
|
|
74
|
+
return Date.now();
|
|
75
|
+
}
|
|
76
|
+
function normalizeAliases(values) {
|
|
77
|
+
const aliases = [];
|
|
78
|
+
for (const value of values) {
|
|
79
|
+
const normalized = normalizeString2(value);
|
|
80
|
+
if (!normalized || aliases.includes(normalized)) continue;
|
|
81
|
+
aliases.push(normalized);
|
|
82
|
+
}
|
|
83
|
+
return aliases;
|
|
84
|
+
}
|
|
85
|
+
function metadataString(value) {
|
|
86
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
87
|
+
}
|
|
88
|
+
function normalizeRuntimeHealth(value) {
|
|
89
|
+
if (!value || typeof value !== "object") return null;
|
|
90
|
+
const status = typeof value.status === "string" && HEALTH_STATUSES.has(value.status) ? value.status : null;
|
|
91
|
+
if (!status) return null;
|
|
92
|
+
return {
|
|
93
|
+
status,
|
|
94
|
+
reason: normalizeString2(value.reason),
|
|
95
|
+
checkedAt: normalizeString2(value.checkedAt),
|
|
96
|
+
adapter: normalizeString2(value.adapter),
|
|
97
|
+
recovery: normalizeString2(value.recovery)
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function runtimeHealthTime(value) {
|
|
101
|
+
const parsed = Date.parse(value.checkedAt ?? "");
|
|
102
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
103
|
+
}
|
|
104
|
+
function mergeRuntimeHealth(existing, next) {
|
|
105
|
+
if (!existing) return next;
|
|
106
|
+
if (!next) return existing;
|
|
107
|
+
const severityDelta = HEALTH_SEVERITY[next.status] - HEALTH_SEVERITY[existing.status];
|
|
108
|
+
if (severityDelta > 0) return next;
|
|
109
|
+
if (severityDelta < 0) return existing;
|
|
110
|
+
const existingTime = runtimeHealthTime(existing);
|
|
111
|
+
const nextTime = runtimeHealthTime(next);
|
|
112
|
+
if (nextTime > existingTime) return next;
|
|
113
|
+
return existing;
|
|
114
|
+
}
|
|
115
|
+
function deriveStaleReason(options) {
|
|
116
|
+
const status = normalizeString2(options.status);
|
|
117
|
+
if (status && status !== "active") {
|
|
118
|
+
return `status:${status}`;
|
|
119
|
+
}
|
|
120
|
+
if (!options.lastSeenAt) {
|
|
121
|
+
return "missing-last-seen";
|
|
122
|
+
}
|
|
123
|
+
const lastSeenMs = Date.parse(options.lastSeenAt);
|
|
124
|
+
if (!Number.isFinite(lastSeenMs)) {
|
|
125
|
+
return "invalid-last-seen";
|
|
126
|
+
}
|
|
127
|
+
const ageMs = options.nowMs - lastSeenMs;
|
|
128
|
+
if (ageMs > options.staleAfterMs) {
|
|
129
|
+
return `stale:${ageMs}ms`;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
function bindingKey(binding) {
|
|
134
|
+
return [
|
|
135
|
+
binding.routingAddress,
|
|
136
|
+
binding.hostId ?? "",
|
|
137
|
+
binding.clientId ?? "",
|
|
138
|
+
binding.conversationId ?? "",
|
|
139
|
+
binding.ownerClientId ?? ""
|
|
140
|
+
].join("\0");
|
|
141
|
+
}
|
|
142
|
+
function mergeBinding(existing, next) {
|
|
143
|
+
const nextIsLiveObserve = next.sources.includes("observe") && next.staleReason === null;
|
|
144
|
+
return {
|
|
145
|
+
...existing,
|
|
146
|
+
agentName: existing.agentName ?? next.agentName,
|
|
147
|
+
hostId: existing.hostId ?? next.hostId,
|
|
148
|
+
clientId: existing.clientId ?? next.clientId,
|
|
149
|
+
conversationId: existing.conversationId ?? next.conversationId,
|
|
150
|
+
ownerClientId: existing.ownerClientId ?? next.ownerClientId,
|
|
151
|
+
instanceId: existing.instanceId ?? next.instanceId,
|
|
152
|
+
receiveTransports: normalizeReceiveTransports([
|
|
153
|
+
...existing.receiveTransports,
|
|
154
|
+
...next.receiveTransports
|
|
155
|
+
]),
|
|
156
|
+
bindingStatus: existing.bindingStatus === "ready" || next.bindingStatus === "ready" ? "ready" : existing.bindingStatus === "partial" || next.bindingStatus === "partial" ? "partial" : "stale",
|
|
157
|
+
lastSeenAt: nextIsLiveObserve ? next.lastSeenAt ?? existing.lastSeenAt : existing.lastSeenAt ?? next.lastSeenAt,
|
|
158
|
+
staleReason: nextIsLiveObserve ? null : existing.staleReason ?? next.staleReason,
|
|
159
|
+
health: mergeRuntimeHealth(existing.health, next.health),
|
|
160
|
+
sources: [.../* @__PURE__ */ new Set([...existing.sources, ...next.sources])],
|
|
161
|
+
aliases: normalizeAliases([...existing.aliases, ...next.aliases])
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function shouldIncludeHeartbeatBinding(heartbeat, receiveTransports) {
|
|
165
|
+
return receiveTransports.includes("consent-drive") || isCodexLike(heartbeat.instanceId) || isCodexLike(heartbeat.address?.clientId) || isCodexLike(heartbeat.address?.routingAddress) || isCodexLike(heartbeat.source);
|
|
166
|
+
}
|
|
167
|
+
function buildHeartbeatBinding(key, heartbeat, nowMs, staleAfterMs) {
|
|
168
|
+
const receiveTransports = normalizeReceiveTransports([
|
|
169
|
+
...heartbeat.receiveTransports ?? [],
|
|
170
|
+
...heartbeat.capabilities?.receiveTransports ?? []
|
|
171
|
+
]);
|
|
172
|
+
if (!shouldIncludeHeartbeatBinding(heartbeat, receiveTransports)) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
const id = normalizeString2(heartbeat.id) ?? key;
|
|
176
|
+
const routingAddress = normalizeString2(heartbeat.address?.routingAddress) ?? normalizeString2(heartbeat.instanceId) ?? id;
|
|
177
|
+
const lastSeenAt = normalizeString2(heartbeat.lastActivity) ?? normalizeString2(heartbeat.timestamp);
|
|
178
|
+
const conversationId = normalizeString2(heartbeat.capabilities?.conversationId) ?? normalizeString2(heartbeat.address?.conversationId);
|
|
179
|
+
const ownerClientId = normalizeString2(heartbeat.capabilities?.ownerClientId) ?? normalizeString2(heartbeat.address?.ownerClientId);
|
|
180
|
+
const bindingStatus = deriveBindingStatus({
|
|
181
|
+
conversationId,
|
|
182
|
+
ownerClientId,
|
|
183
|
+
staleReason: deriveStaleReason({
|
|
184
|
+
status: heartbeat.status,
|
|
185
|
+
lastSeenAt,
|
|
186
|
+
nowMs,
|
|
187
|
+
staleAfterMs
|
|
188
|
+
})
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
agentName: normalizeString2(heartbeat.agent),
|
|
192
|
+
routingAddress,
|
|
193
|
+
runtime: "codex",
|
|
194
|
+
hostId: normalizeString2(heartbeat.address?.hostId),
|
|
195
|
+
clientId: normalizeString2(heartbeat.address?.clientId) ?? normalizeString2(heartbeat.instanceId),
|
|
196
|
+
conversationId,
|
|
197
|
+
ownerClientId,
|
|
198
|
+
instanceId: normalizeString2(heartbeat.instanceId),
|
|
199
|
+
receiveTransports,
|
|
200
|
+
lastSeenAt,
|
|
201
|
+
staleReason: bindingStatus === "stale" ? deriveStaleReason({
|
|
202
|
+
status: heartbeat.status,
|
|
203
|
+
lastSeenAt,
|
|
204
|
+
nowMs,
|
|
205
|
+
staleAfterMs
|
|
206
|
+
}) : null,
|
|
207
|
+
health: normalizeRuntimeHealth(heartbeat.health),
|
|
208
|
+
bindingStatus,
|
|
209
|
+
sources: ["heartbeat"],
|
|
210
|
+
aliases: normalizeAliases([
|
|
211
|
+
id,
|
|
212
|
+
heartbeat.agent,
|
|
213
|
+
routingAddress,
|
|
214
|
+
heartbeat.instanceId,
|
|
215
|
+
...heartbeat.address?.aliases ?? []
|
|
216
|
+
])
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function findAgentNameForClient(snapshot, clientId) {
|
|
220
|
+
if (!clientId) return null;
|
|
221
|
+
const agent = snapshot.agents.find((candidate) => candidate.id === clientId);
|
|
222
|
+
return agent?.name ?? null;
|
|
223
|
+
}
|
|
224
|
+
function buildObserveBindings(snapshot, nowIso) {
|
|
225
|
+
if (!snapshot.connected) {
|
|
226
|
+
return [];
|
|
227
|
+
}
|
|
228
|
+
const bindings = [];
|
|
229
|
+
for (const conversation of snapshot.conversations) {
|
|
230
|
+
const ownerClientId = normalizeString2(conversation.address.ownerClientId);
|
|
231
|
+
const conversationId = normalizeString2(conversation.id);
|
|
232
|
+
if (!ownerClientId || !conversationId) continue;
|
|
233
|
+
const metadata = conversation.metadata;
|
|
234
|
+
const lastSeenAt = metadataString(metadata.lastActivity) ?? nowIso;
|
|
235
|
+
const routingAddress = normalizeString2(conversation.address.clientId) ?? ownerClientId;
|
|
236
|
+
bindings.push({
|
|
237
|
+
agentName: findAgentNameForClient(snapshot, ownerClientId),
|
|
238
|
+
routingAddress,
|
|
239
|
+
runtime: "codex",
|
|
240
|
+
hostId: normalizeString2(conversation.address.hostId),
|
|
241
|
+
clientId: normalizeString2(conversation.address.clientId) ?? ownerClientId,
|
|
242
|
+
conversationId,
|
|
243
|
+
ownerClientId,
|
|
244
|
+
instanceId: null,
|
|
245
|
+
receiveTransports: ["consent-drive"],
|
|
246
|
+
bindingStatus: "ready",
|
|
247
|
+
lastSeenAt,
|
|
248
|
+
staleReason: null,
|
|
249
|
+
health: null,
|
|
250
|
+
sources: ["observe"],
|
|
251
|
+
aliases: normalizeAliases([routingAddress, ownerClientId])
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return bindings;
|
|
255
|
+
}
|
|
256
|
+
function buildCodexBindingRegistry(options = {}) {
|
|
257
|
+
const nowMs = toTime(options.now);
|
|
258
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
259
|
+
const staleAfterMs = options.staleAfterMs ?? DEFAULT_STALE_AFTER_MS;
|
|
260
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
261
|
+
for (const [key, heartbeat] of Object.entries(options.heartbeats ?? {})) {
|
|
262
|
+
const binding = buildHeartbeatBinding(key, heartbeat, nowMs, staleAfterMs);
|
|
263
|
+
if (!binding) continue;
|
|
264
|
+
const existing = byKey.get(bindingKey(binding));
|
|
265
|
+
byKey.set(
|
|
266
|
+
bindingKey(binding),
|
|
267
|
+
existing ? mergeBinding(existing, binding) : binding
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
if (options.observeSnapshot) {
|
|
271
|
+
for (const binding of buildObserveBindings(
|
|
272
|
+
options.observeSnapshot,
|
|
273
|
+
nowIso
|
|
274
|
+
)) {
|
|
275
|
+
const existing = byKey.get(bindingKey(binding));
|
|
276
|
+
byKey.set(
|
|
277
|
+
bindingKey(binding),
|
|
278
|
+
existing ? mergeBinding(existing, binding) : binding
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
bindings: [...byKey.values()].sort(
|
|
284
|
+
(a, b) => a.routingAddress.localeCompare(b.routingAddress)
|
|
285
|
+
),
|
|
286
|
+
builtAt: nowIso,
|
|
287
|
+
staleAfterMs
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function deriveBindingStatus(options) {
|
|
291
|
+
if (options.staleReason) return "stale";
|
|
292
|
+
if (options.conversationId && options.ownerClientId) return "ready";
|
|
293
|
+
if (options.conversationId || options.ownerClientId) return "partial";
|
|
294
|
+
return "partial";
|
|
295
|
+
}
|
|
296
|
+
function matchesTarget(binding, target) {
|
|
297
|
+
const requestedAddress = normalizeString2(target.routingAddress);
|
|
298
|
+
const requestedAgent = normalizeString2(target.agentName);
|
|
299
|
+
if (requestedAddress && binding.routingAddress !== requestedAddress && !binding.aliases.includes(requestedAddress)) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
if (requestedAgent && binding.agentName !== requestedAgent && !binding.aliases.includes(requestedAgent)) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
const constraints = [
|
|
306
|
+
[target.hostId, binding.hostId],
|
|
307
|
+
[target.clientId, binding.clientId],
|
|
308
|
+
[target.conversationId, binding.conversationId],
|
|
309
|
+
[target.ownerClientId, binding.ownerClientId]
|
|
310
|
+
];
|
|
311
|
+
return constraints.every(([requested, actual]) => {
|
|
312
|
+
const normalizedRequested = normalizeString2(requested);
|
|
313
|
+
return !normalizedRequested || normalizedRequested === actual;
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
function hasExplicitTargetSelector(target) {
|
|
317
|
+
return Boolean(
|
|
318
|
+
normalizeString2(target.routingAddress) || normalizeString2(target.agentName) || normalizeString2(target.clientId) || normalizeString2(target.conversationId) || normalizeString2(target.ownerClientId)
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
function liveSnapshotMatches(binding, snapshot) {
|
|
322
|
+
if (!snapshot || !binding.conversationId || !binding.ownerClientId) {
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
if (!snapshot.connected) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
return snapshot.conversations.some((conversation) => {
|
|
329
|
+
const address = conversation.address;
|
|
330
|
+
return conversation.id === binding.conversationId && address.ownerClientId === binding.ownerClientId && (!binding.hostId || !address.hostId || address.hostId === binding.hostId);
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
function toAddress(binding) {
|
|
334
|
+
return {
|
|
335
|
+
hostId: binding.hostId,
|
|
336
|
+
clientId: binding.clientId,
|
|
337
|
+
conversationId: binding.conversationId,
|
|
338
|
+
ownerClientId: binding.ownerClientId
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function blocked(reason, candidates, message) {
|
|
342
|
+
return {
|
|
343
|
+
status: "blocked",
|
|
344
|
+
reason,
|
|
345
|
+
candidates,
|
|
346
|
+
message
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
function resolveCodexBinding(options) {
|
|
350
|
+
if (!hasExplicitTargetSelector(options.target)) {
|
|
351
|
+
return blocked(
|
|
352
|
+
"missing-target",
|
|
353
|
+
[],
|
|
354
|
+
"Codex binding resolution requires an explicit target selector."
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
const candidates = options.registry.bindings.filter(
|
|
358
|
+
(binding) => matchesTarget(binding, options.target)
|
|
359
|
+
);
|
|
360
|
+
if (candidates.length === 0) {
|
|
361
|
+
return blocked("not-found", [], "No Codex binding matched the target.");
|
|
362
|
+
}
|
|
363
|
+
const freshCandidates = candidates.filter((binding) => !binding.staleReason);
|
|
364
|
+
if (freshCandidates.length === 0) {
|
|
365
|
+
return blocked("stale", candidates, "Only stale Codex bindings matched.");
|
|
366
|
+
}
|
|
367
|
+
const readyCandidates = freshCandidates.filter(
|
|
368
|
+
(binding) => binding.bindingStatus === "ready"
|
|
369
|
+
);
|
|
370
|
+
if (readyCandidates.length === 0) {
|
|
371
|
+
return blocked(
|
|
372
|
+
"partial",
|
|
373
|
+
freshCandidates,
|
|
374
|
+
"Only partial Codex bindings matched; conversationId and ownerClientId are both required."
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
const liveCandidates = readyCandidates.filter(
|
|
378
|
+
(binding) => liveSnapshotMatches(binding, options.liveSnapshot)
|
|
379
|
+
);
|
|
380
|
+
if (liveCandidates.length === 0) {
|
|
381
|
+
return blocked(
|
|
382
|
+
"binding-mismatch",
|
|
383
|
+
freshCandidates,
|
|
384
|
+
"Matched Codex bindings were not present in the live observe snapshot."
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
const reachableCandidates = liveCandidates.filter(
|
|
388
|
+
(binding) => canUseConsentDriveForAddress({
|
|
389
|
+
localHostId: options.localHostId,
|
|
390
|
+
address: toAddress(binding)
|
|
391
|
+
})
|
|
392
|
+
);
|
|
393
|
+
if (reachableCandidates.length === 0) {
|
|
394
|
+
return blocked(
|
|
395
|
+
"not-reachable",
|
|
396
|
+
liveCandidates,
|
|
397
|
+
"Matched Codex bindings are not reachable from the local host."
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
if (reachableCandidates.length > 1) {
|
|
401
|
+
return blocked(
|
|
402
|
+
"ambiguous",
|
|
403
|
+
reachableCandidates,
|
|
404
|
+
"Multiple fresh Codex bindings matched the target."
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
status: "resolved",
|
|
409
|
+
binding: reachableCandidates[0]
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
export {
|
|
413
|
+
buildCodexBindingRegistry,
|
|
414
|
+
resolveCodexBinding
|
|
415
|
+
};
|
|
416
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routing/receive-transports.ts","../../src/codex-a2a/binding-registry.ts"],"mappings":"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","names":["normalizeString"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
declare const DEFAULT_STUCK_TURN_SECONDS = 120;
|
|
2
|
+
declare const DEFAULT_STALE_ACTIVE_TURN_SECONDS: number;
|
|
3
|
+
type CodexRuntimeHealthStatus = "ready" | "partial" | "stale-owner" | "active-turn" | "stale-active-turn" | "stuck-turn" | "degraded" | "not-observed" | "adapter-unavailable" | "unknown";
|
|
4
|
+
interface CodexRuntimeHealth {
|
|
5
|
+
status: CodexRuntimeHealthStatus;
|
|
6
|
+
reason: string | null;
|
|
7
|
+
checkedAt: string;
|
|
8
|
+
adapter: string;
|
|
9
|
+
recovery: string | null;
|
|
10
|
+
}
|
|
11
|
+
interface CodexRuntimeTurnEvidence {
|
|
12
|
+
turnId?: string | null;
|
|
13
|
+
status?: string | null;
|
|
14
|
+
turnStartedAgeSeconds?: number | null;
|
|
15
|
+
durationMs?: number | null;
|
|
16
|
+
finalAssistantStartedAtMs?: number | null;
|
|
17
|
+
hasError?: boolean | null;
|
|
18
|
+
itemCount?: number | null;
|
|
19
|
+
}
|
|
20
|
+
interface CodexRuntimeConversationEvidence {
|
|
21
|
+
conversationId?: string | null;
|
|
22
|
+
hostId?: string | null;
|
|
23
|
+
ownerClientId?: string | null;
|
|
24
|
+
lastChangeType?: string | null;
|
|
25
|
+
lastTurn?: CodexRuntimeTurnEvidence | null;
|
|
26
|
+
lastSeenAt?: string | null;
|
|
27
|
+
}
|
|
28
|
+
interface CodexRuntimeBindingEvidence {
|
|
29
|
+
source?: string | null;
|
|
30
|
+
filePath?: string | null;
|
|
31
|
+
id?: string | null;
|
|
32
|
+
agent?: string | null;
|
|
33
|
+
routingAddress?: string | null;
|
|
34
|
+
aliases?: string[];
|
|
35
|
+
timestamp?: string | null;
|
|
36
|
+
ageSeconds?: number | null;
|
|
37
|
+
receiveTransports?: string[];
|
|
38
|
+
hostId?: string | null;
|
|
39
|
+
clientId?: string | null;
|
|
40
|
+
conversationId?: string | null;
|
|
41
|
+
ownerClientId?: string | null;
|
|
42
|
+
consentDriveStatus?: string | null;
|
|
43
|
+
lifecycleStatus?: string | null;
|
|
44
|
+
runtimeHealthStatus?: string | null;
|
|
45
|
+
message?: string | null;
|
|
46
|
+
}
|
|
47
|
+
interface CodexRuntimeIpcEvidence {
|
|
48
|
+
supported?: boolean | null;
|
|
49
|
+
connected?: boolean | null;
|
|
50
|
+
initializedClientId?: string | null;
|
|
51
|
+
conversations?: CodexRuntimeConversationEvidence[];
|
|
52
|
+
agents?: unknown[];
|
|
53
|
+
error?: string | null;
|
|
54
|
+
}
|
|
55
|
+
interface CodexRuntimeHealthOptions {
|
|
56
|
+
checkedAt?: string | null;
|
|
57
|
+
adapter?: string | null;
|
|
58
|
+
stuckTurnSeconds?: number;
|
|
59
|
+
staleActiveTurnSeconds?: number;
|
|
60
|
+
}
|
|
61
|
+
type ClassifiedCodexRuntimeBinding = CodexRuntimeBindingEvidence & {
|
|
62
|
+
lifecycleStatus: string;
|
|
63
|
+
runtimeHealthStatus: CodexRuntimeHealthStatus;
|
|
64
|
+
message: string;
|
|
65
|
+
liveOwnerClientId: string | null;
|
|
66
|
+
liveHostId: string | null;
|
|
67
|
+
liveLastChangeType: string | null;
|
|
68
|
+
liveLastSeenAt: string | null;
|
|
69
|
+
health: CodexRuntimeHealth;
|
|
70
|
+
};
|
|
71
|
+
declare function isStuckInProgressConversation(conversation: CodexRuntimeConversationEvidence | null | undefined, options?: Pick<CodexRuntimeHealthOptions, "stuckTurnSeconds">): boolean;
|
|
72
|
+
declare function isStaleActiveInProgressConversation(conversation: CodexRuntimeConversationEvidence | null | undefined, options?: Pick<CodexRuntimeHealthOptions, "staleActiveTurnSeconds">): boolean;
|
|
73
|
+
declare function deriveRuntimeHealthForBinding(binding: Pick<CodexRuntimeBindingEvidence, "runtimeHealthStatus" | "lifecycleStatus" | "message">, options?: Pick<CodexRuntimeHealthOptions, "checkedAt" | "adapter">): CodexRuntimeHealth;
|
|
74
|
+
declare function classifyCodexBindings(bindings: CodexRuntimeBindingEvidence[], ipc: CodexRuntimeIpcEvidence, options?: CodexRuntimeHealthOptions): ClassifiedCodexRuntimeBinding[];
|
|
75
|
+
|
|
76
|
+
export { type ClassifiedCodexRuntimeBinding, type CodexRuntimeBindingEvidence, type CodexRuntimeConversationEvidence, type CodexRuntimeHealth, type CodexRuntimeHealthOptions, type CodexRuntimeHealthStatus, type CodexRuntimeIpcEvidence, type CodexRuntimeTurnEvidence, DEFAULT_STALE_ACTIVE_TURN_SECONDS, DEFAULT_STUCK_TURN_SECONDS, classifyCodexBindings, deriveRuntimeHealthForBinding, isStaleActiveInProgressConversation, isStuckInProgressConversation };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// src/codex-health/index.ts
|
|
2
|
+
var DEFAULT_STUCK_TURN_SECONDS = 120;
|
|
3
|
+
var DEFAULT_STALE_ACTIVE_TURN_SECONDS = 10 * 60;
|
|
4
|
+
function normalizeString(value) {
|
|
5
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
6
|
+
}
|
|
7
|
+
function asRecord(value) {
|
|
8
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
9
|
+
}
|
|
10
|
+
function normalizeStatus(value) {
|
|
11
|
+
return normalizeString(value) ?? "unknown";
|
|
12
|
+
}
|
|
13
|
+
function recoveryForStatus(status) {
|
|
14
|
+
switch (status) {
|
|
15
|
+
case "partial":
|
|
16
|
+
return "Run tap_register_capabilities with the conversationId on the target Codex session.";
|
|
17
|
+
case "stale-owner":
|
|
18
|
+
return "Run tap_register_capabilities from the target runtime with the conversationId and omit ownerClientId.";
|
|
19
|
+
case "active-turn":
|
|
20
|
+
return "Wait for the active turn to finish before retrying realtime delivery.";
|
|
21
|
+
case "stale-active-turn":
|
|
22
|
+
return "Re-observe or restart the target Codex runtime, or rerun lifecycle recovery with --interrupt-stale-active if the UI is idle.";
|
|
23
|
+
case "stuck-turn":
|
|
24
|
+
return "Run codex:windows with --conversation-id and --interrupt-stuck if the UI/model is frozen.";
|
|
25
|
+
case "not-observed":
|
|
26
|
+
return "Focus or reopen the target Codex session and rerun the lifecycle check.";
|
|
27
|
+
case "adapter-unavailable":
|
|
28
|
+
return "Run this check on a host with Codex IPC visibility, or use the matching runtime adapter.";
|
|
29
|
+
case "degraded":
|
|
30
|
+
return "Check adapter-specific diagnostics and the matching runtime runbook.";
|
|
31
|
+
case "unknown":
|
|
32
|
+
return "Runtime health evidence is incomplete; refresh the target runtime capabilities.";
|
|
33
|
+
default:
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function toRuntimeHealthStatus(status) {
|
|
38
|
+
if (status === "unavailable") return "adapter-unavailable";
|
|
39
|
+
if (status === "ready" || status === "partial" || status === "stale-owner" || status === "active-turn" || status === "stale-active-turn" || status === "stuck-turn" || status === "degraded" || status === "not-observed" || status === "adapter-unavailable" || status === "unknown") {
|
|
40
|
+
return status;
|
|
41
|
+
}
|
|
42
|
+
return "unknown";
|
|
43
|
+
}
|
|
44
|
+
function isStuckInProgressConversation(conversation, options = {}) {
|
|
45
|
+
const turn = asRecord(conversation?.lastTurn);
|
|
46
|
+
const stuckTurnSeconds = typeof options.stuckTurnSeconds === "number" ? options.stuckTurnSeconds : DEFAULT_STUCK_TURN_SECONDS;
|
|
47
|
+
return turn?.status === "inProgress" && turn.itemCount === 0 && turn.durationMs === null && turn.finalAssistantStartedAtMs === null && typeof turn.turnStartedAgeSeconds === "number" && turn.turnStartedAgeSeconds >= stuckTurnSeconds;
|
|
48
|
+
}
|
|
49
|
+
function isStaleActiveInProgressConversation(conversation, options = {}) {
|
|
50
|
+
const turn = asRecord(conversation?.lastTurn);
|
|
51
|
+
const staleActiveTurnSeconds = typeof options.staleActiveTurnSeconds === "number" ? options.staleActiveTurnSeconds : DEFAULT_STALE_ACTIVE_TURN_SECONDS;
|
|
52
|
+
return turn?.status === "inProgress" && typeof turn.turnStartedAgeSeconds === "number" && turn.turnStartedAgeSeconds >= staleActiveTurnSeconds;
|
|
53
|
+
}
|
|
54
|
+
function deriveRuntimeHealthForBinding(binding, options = {}) {
|
|
55
|
+
const checkedAt = normalizeString(options.checkedAt) ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
56
|
+
const adapter = normalizeString(options.adapter) ?? "codex-desktop-ipc";
|
|
57
|
+
const status = toRuntimeHealthStatus(
|
|
58
|
+
normalizeStatus(binding.runtimeHealthStatus ?? binding.lifecycleStatus)
|
|
59
|
+
);
|
|
60
|
+
return {
|
|
61
|
+
status,
|
|
62
|
+
reason: normalizeString(binding.message),
|
|
63
|
+
checkedAt,
|
|
64
|
+
adapter,
|
|
65
|
+
recovery: recoveryForStatus(status)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function classifyCodexBindings(bindings, ipc, options = {}) {
|
|
69
|
+
const checkedAt = normalizeString(options.checkedAt) ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
70
|
+
const adapter = normalizeString(options.adapter) ?? "codex-desktop-ipc";
|
|
71
|
+
if (!ipc?.supported || !ipc?.connected) {
|
|
72
|
+
return bindings.map((binding) => {
|
|
73
|
+
const extensionUnknown = adapter === "codex-extension-mcp";
|
|
74
|
+
const classified = {
|
|
75
|
+
...binding,
|
|
76
|
+
lifecycleStatus: "unavailable",
|
|
77
|
+
runtimeHealthStatus: extensionUnknown ? "unknown" : "adapter-unavailable",
|
|
78
|
+
message: extensionUnknown ? "Codex extension MCP presence is visible, but no IPC observe surface is available." : ipc?.supported ? normalizeString(ipc.error) ?? "Codex IPC observe is unavailable." : "Codex IPC observe is not supported on this host.",
|
|
79
|
+
liveOwnerClientId: null,
|
|
80
|
+
liveHostId: null,
|
|
81
|
+
liveLastChangeType: null,
|
|
82
|
+
liveLastSeenAt: null
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
...classified,
|
|
86
|
+
health: deriveRuntimeHealthForBinding(classified, {
|
|
87
|
+
checkedAt,
|
|
88
|
+
adapter
|
|
89
|
+
})
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const conversations = Array.isArray(ipc.conversations) ? ipc.conversations : [];
|
|
94
|
+
const byConversation = new Map(
|
|
95
|
+
conversations.map((entry) => [entry.conversationId, entry])
|
|
96
|
+
);
|
|
97
|
+
return bindings.map((binding) => {
|
|
98
|
+
const live = binding.conversationId ? byConversation.get(binding.conversationId) : null;
|
|
99
|
+
let lifecycleStatus = "unavailable";
|
|
100
|
+
let runtimeHealthStatus = "adapter-unavailable";
|
|
101
|
+
let message = "Binding does not include a conversationId.";
|
|
102
|
+
if (binding.conversationId && !binding.ownerClientId) {
|
|
103
|
+
lifecycleStatus = "partial";
|
|
104
|
+
runtimeHealthStatus = "partial";
|
|
105
|
+
message = "Binding has conversationId but no ownerClientId.";
|
|
106
|
+
} else if (binding.conversationId && binding.ownerClientId && !live) {
|
|
107
|
+
lifecycleStatus = "not-observed";
|
|
108
|
+
runtimeHealthStatus = "not-observed";
|
|
109
|
+
message = "No live IPC conversation was observed for this conversationId.";
|
|
110
|
+
} else if (binding.conversationId && binding.ownerClientId && live?.ownerClientId === binding.ownerClientId) {
|
|
111
|
+
lifecycleStatus = "ready";
|
|
112
|
+
runtimeHealthStatus = "ready";
|
|
113
|
+
message = "Stored ownerClientId matches live IPC owner.";
|
|
114
|
+
if (isStuckInProgressConversation(live, options)) {
|
|
115
|
+
runtimeHealthStatus = "stuck-turn";
|
|
116
|
+
message = "Live Codex conversation has an in-progress turn with no emitted items.";
|
|
117
|
+
} else if (isStaleActiveInProgressConversation(live, options)) {
|
|
118
|
+
runtimeHealthStatus = "stale-active-turn";
|
|
119
|
+
message = "Live Codex conversation has an old in-progress turn; the UI may be idle but IPC still reports it active.";
|
|
120
|
+
} else if (live?.lastTurn?.status === "inProgress") {
|
|
121
|
+
runtimeHealthStatus = "active-turn";
|
|
122
|
+
message = "Live Codex conversation has an active in-progress turn.";
|
|
123
|
+
}
|
|
124
|
+
} else if (binding.conversationId && binding.ownerClientId && live) {
|
|
125
|
+
lifecycleStatus = "stale-owner";
|
|
126
|
+
runtimeHealthStatus = "stale-owner";
|
|
127
|
+
message = "Stored ownerClientId differs from live IPC owner.";
|
|
128
|
+
}
|
|
129
|
+
const classified = {
|
|
130
|
+
...binding,
|
|
131
|
+
lifecycleStatus,
|
|
132
|
+
runtimeHealthStatus,
|
|
133
|
+
message,
|
|
134
|
+
liveOwnerClientId: live?.ownerClientId ?? null,
|
|
135
|
+
liveHostId: live?.hostId ?? null,
|
|
136
|
+
liveLastChangeType: live?.lastChangeType ?? null,
|
|
137
|
+
liveLastSeenAt: live?.lastSeenAt ?? null
|
|
138
|
+
};
|
|
139
|
+
return {
|
|
140
|
+
...classified,
|
|
141
|
+
health: deriveRuntimeHealthForBinding(classified, { checkedAt, adapter })
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
DEFAULT_STALE_ACTIVE_TURN_SECONDS,
|
|
147
|
+
DEFAULT_STUCK_TURN_SECONDS,
|
|
148
|
+
classifyCodexBindings,
|
|
149
|
+
deriveRuntimeHealthForBinding,
|
|
150
|
+
isStaleActiveInProgressConversation,
|
|
151
|
+
isStuckInProgressConversation
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/codex-health/index.ts"],"mappings":"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","names":[]}
|