@apnex/network-adapter 0.1.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/dist/hub-error.d.ts +42 -0
- package/dist/hub-error.js +74 -0
- package/dist/hub-error.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/agent-client.d.ts +192 -0
- package/dist/kernel/agent-client.js +44 -0
- package/dist/kernel/agent-client.js.map +1 -0
- package/dist/kernel/event-router.d.ts +49 -0
- package/dist/kernel/event-router.js +150 -0
- package/dist/kernel/event-router.js.map +1 -0
- package/dist/kernel/handshake.d.ts +161 -0
- package/dist/kernel/handshake.js +257 -0
- package/dist/kernel/handshake.js.map +1 -0
- package/dist/kernel/instance.d.ts +40 -0
- package/dist/kernel/instance.js +79 -0
- package/dist/kernel/instance.js.map +1 -0
- package/dist/kernel/mcp-agent-client.d.ts +139 -0
- package/dist/kernel/mcp-agent-client.js +505 -0
- package/dist/kernel/mcp-agent-client.js.map +1 -0
- package/dist/kernel/poll-backstop.d.ts +108 -0
- package/dist/kernel/poll-backstop.js +243 -0
- package/dist/kernel/poll-backstop.js.map +1 -0
- package/dist/kernel/session-claim.d.ts +67 -0
- package/dist/kernel/session-claim.js +106 -0
- package/dist/kernel/session-claim.js.map +1 -0
- package/dist/kernel/state-sync.d.ts +43 -0
- package/dist/kernel/state-sync.js +85 -0
- package/dist/kernel/state-sync.js.map +1 -0
- package/dist/logger.d.ts +82 -0
- package/dist/logger.js +114 -0
- package/dist/logger.js.map +1 -0
- package/dist/notification-log.d.ts +29 -0
- package/dist/notification-log.js +66 -0
- package/dist/notification-log.js.map +1 -0
- package/dist/prompt-format.d.ts +38 -0
- package/dist/prompt-format.js +220 -0
- package/dist/prompt-format.js.map +1 -0
- package/dist/tool-manager/dispatcher.d.ts +180 -0
- package/dist/tool-manager/dispatcher.js +379 -0
- package/dist/tool-manager/dispatcher.js.map +1 -0
- package/dist/tool-manager/tool-catalog-cache.d.ts +85 -0
- package/dist/tool-manager/tool-catalog-cache.js +137 -0
- package/dist/tool-manager/tool-catalog-cache.js.map +1 -0
- package/dist/wire/mcp-transport.d.ts +120 -0
- package/dist/wire/mcp-transport.js +447 -0
- package/dist/wire/mcp-transport.js.map +1 -0
- package/dist/wire/transport.d.ts +174 -0
- package/dist/wire/transport.js +43 -0
- package/dist/wire/transport.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpAgentClient — Layer-7 `IAgentClient` implementation built on top
|
|
3
|
+
* of `McpTransport`.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3 of the L4/L7 refactor. This class owns everything that
|
|
6
|
+
* `McpConnectionManager` + `UniversalClientAdapter` together own today:
|
|
7
|
+
*
|
|
8
|
+
* - The session FSM (disconnected → connecting → synchronizing →
|
|
9
|
+
* streaming → reconnecting).
|
|
10
|
+
* - Role registration. Plain `register_role` when `handshake` is omitted;
|
|
11
|
+
* the full enriched handshake via `performHandshake` when `handshake`
|
|
12
|
+
* is supplied.
|
|
13
|
+
* - State sync on entry to `synchronizing` (`get_task` +
|
|
14
|
+
* `get_pending_actions` via `performStateSync`).
|
|
15
|
+
* - `session_invalid` retry-once on `call()`: close the wire, reopen,
|
|
16
|
+
* re-handshake, retry the failed call exactly once on the fresh
|
|
17
|
+
* session.
|
|
18
|
+
* - Hub-event dedup, classification (actionable / informational /
|
|
19
|
+
* unhandled), and routing into the shim callbacks.
|
|
20
|
+
* - SyncBuffer: hub-events that arrive while the session is
|
|
21
|
+
* `synchronizing` or `reconnecting` are buffered and flushed on
|
|
22
|
+
* entry to `streaming`, so shims never observe events from a
|
|
23
|
+
* half-bound session.
|
|
24
|
+
*
|
|
25
|
+
* It is NOT responsible for wire framing, SSE watchdogs, heartbeat
|
|
26
|
+
* POSTs, or HTTP retries. Those live in the `McpTransport` below, which
|
|
27
|
+
* this class either constructs (if a `TransportConfig` is passed) or
|
|
28
|
+
* accepts by injection (so tests can swap in a fake transport).
|
|
29
|
+
*
|
|
30
|
+
* Runtime note: no existing consumer uses this class yet. Phase 4 will
|
|
31
|
+
* swap `UniversalClientAdapter` over to this surface and delete the
|
|
32
|
+
* `McpConnectionManager` path. Until then, `McpConnectionManager` stays
|
|
33
|
+
* intact and this class lives alongside it.
|
|
34
|
+
*/
|
|
35
|
+
import type { IAgentClient, AgentClientConfig, AgentClientCallbacks, AgentClientMetrics, SessionState } from "./agent-client.js";
|
|
36
|
+
import type { ITransport, TransportConfig } from "../wire/transport.js";
|
|
37
|
+
import type { CognitivePipeline, Tool as CognitiveTool } from "@apnex/cognitive-layer";
|
|
38
|
+
export interface McpAgentClientOptions {
|
|
39
|
+
/**
|
|
40
|
+
* Explicit transport instance. Caller retains ownership — `stop()`
|
|
41
|
+
* will NOT close a transport passed this way, to keep injection
|
|
42
|
+
* ergonomic for tests. Mutually exclusive with `transportConfig`.
|
|
43
|
+
*
|
|
44
|
+
* Typed as `ITransport` so test harnesses can plug in a loopback
|
|
45
|
+
* transport (or any future non-MCP wire) without touching this class.
|
|
46
|
+
*/
|
|
47
|
+
transport?: ITransport;
|
|
48
|
+
/**
|
|
49
|
+
* Transport config. When set, the AgentClient constructs its own
|
|
50
|
+
* `McpTransport` and closes it on `stop()`.
|
|
51
|
+
*/
|
|
52
|
+
transportConfig?: TransportConfig;
|
|
53
|
+
/** Dedup cache size. Default 100, matching `UniversalClientAdapter`. */
|
|
54
|
+
dedupCacheSize?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Opt-in cognitive-layer pipeline (ADR-018 / `@apnex/cognitive-layer`).
|
|
57
|
+
* When provided, every `call()` is wrapped through the pipeline's
|
|
58
|
+
* `runToolCall` phase with the raw transport request as the terminal;
|
|
59
|
+
* thrown errors are routed through `runToolError`. Omit for legacy
|
|
60
|
+
* behavior (zero cost — no pipeline overhead). Use
|
|
61
|
+
* `CognitivePipeline.standard({...})` for the ADR-018 canonical stack.
|
|
62
|
+
*/
|
|
63
|
+
cognitive?: CognitivePipeline;
|
|
64
|
+
/**
|
|
65
|
+
* Legacy-compatible mode: when true, `runSynchronizingPhase` performs
|
|
66
|
+
* the handshake(s) but does NOT run `performStateSync` or advance the
|
|
67
|
+
* FSM out of `synchronizing`. The caller must drive `completeSync()`
|
|
68
|
+
* manually — used by shims that own their own state-sync pipeline.
|
|
69
|
+
*
|
|
70
|
+
* Default false: full auto-sync (handshake → state sync → streaming).
|
|
71
|
+
*/
|
|
72
|
+
manualSync?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export declare class McpAgentClient implements IAgentClient {
|
|
75
|
+
private readonly cfg;
|
|
76
|
+
private readonly log;
|
|
77
|
+
private readonly transport;
|
|
78
|
+
private readonly ownsTransport;
|
|
79
|
+
private readonly manualSync;
|
|
80
|
+
private readonly dedup;
|
|
81
|
+
private readonly cognitive?;
|
|
82
|
+
private _state;
|
|
83
|
+
private callbacks;
|
|
84
|
+
private syncBuffer;
|
|
85
|
+
private synchronizingInFlight;
|
|
86
|
+
private sessionReconnecting;
|
|
87
|
+
private stopped;
|
|
88
|
+
private _agentId?;
|
|
89
|
+
private _sessionEpoch?;
|
|
90
|
+
private _lastEpoch;
|
|
91
|
+
private totalHandshakes;
|
|
92
|
+
private totalSessionInvalidRetries;
|
|
93
|
+
private dedupDropCount;
|
|
94
|
+
private lastEventId;
|
|
95
|
+
constructor(config: AgentClientConfig, options?: McpAgentClientOptions);
|
|
96
|
+
get state(): SessionState;
|
|
97
|
+
get isConnected(): boolean;
|
|
98
|
+
start(): Promise<void>;
|
|
99
|
+
stop(): Promise<void>;
|
|
100
|
+
call(method: string, params: Record<string, unknown>): Promise<unknown>;
|
|
101
|
+
/**
|
|
102
|
+
* Route `tools/list` through the cognitive pipeline when one is
|
|
103
|
+
* configured; otherwise fall through to `transport.listToolsRaw()`
|
|
104
|
+
* directly (shim-compatible signature). Enables
|
|
105
|
+
* `ToolDescriptionEnricher` and any future list-tools middleware
|
|
106
|
+
* to observe the tool-surface request before it reaches the Hub
|
|
107
|
+
* client. Shims that previously reached into `getTransport()
|
|
108
|
+
* .listToolsRaw()` should migrate to this method.
|
|
109
|
+
*/
|
|
110
|
+
listTools(): Promise<CognitiveTool[]>;
|
|
111
|
+
/**
|
|
112
|
+
* Raw transport call with the session_invalid retry-once semantics.
|
|
113
|
+
* Separated from `call()` so the cognitive pipeline wraps this whole
|
|
114
|
+
* retry-capable primitive (cache/dedup/circuit all observe one logical
|
|
115
|
+
* invocation regardless of internal session-cycling).
|
|
116
|
+
*/
|
|
117
|
+
private rawCall;
|
|
118
|
+
listMethods(): Promise<string[]>;
|
|
119
|
+
setCallbacks(callbacks: AgentClientCallbacks): void;
|
|
120
|
+
getSessionId(): string | undefined;
|
|
121
|
+
getMetrics(): AgentClientMetrics;
|
|
122
|
+
getTransport(): ITransport;
|
|
123
|
+
private transition;
|
|
124
|
+
private handleWireEvent;
|
|
125
|
+
private mapWireCause;
|
|
126
|
+
private runSynchronizingPhase;
|
|
127
|
+
/**
|
|
128
|
+
* Public sync-completion hook. Only meaningful when the client was
|
|
129
|
+
* constructed with `manualSync: true`: the caller drives the
|
|
130
|
+
* synchronizing → streaming transition after its own state sync is
|
|
131
|
+
* done. Called automatically under `manualSync: false`.
|
|
132
|
+
*/
|
|
133
|
+
completeSync(): void;
|
|
134
|
+
private runHandshake;
|
|
135
|
+
private completeSyncInternal;
|
|
136
|
+
private reconnectSession;
|
|
137
|
+
private handleHubEvent;
|
|
138
|
+
private routeEvent;
|
|
139
|
+
}
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpAgentClient — Layer-7 `IAgentClient` implementation built on top
|
|
3
|
+
* of `McpTransport`.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3 of the L4/L7 refactor. This class owns everything that
|
|
6
|
+
* `McpConnectionManager` + `UniversalClientAdapter` together own today:
|
|
7
|
+
*
|
|
8
|
+
* - The session FSM (disconnected → connecting → synchronizing →
|
|
9
|
+
* streaming → reconnecting).
|
|
10
|
+
* - Role registration. Plain `register_role` when `handshake` is omitted;
|
|
11
|
+
* the full enriched handshake via `performHandshake` when `handshake`
|
|
12
|
+
* is supplied.
|
|
13
|
+
* - State sync on entry to `synchronizing` (`get_task` +
|
|
14
|
+
* `get_pending_actions` via `performStateSync`).
|
|
15
|
+
* - `session_invalid` retry-once on `call()`: close the wire, reopen,
|
|
16
|
+
* re-handshake, retry the failed call exactly once on the fresh
|
|
17
|
+
* session.
|
|
18
|
+
* - Hub-event dedup, classification (actionable / informational /
|
|
19
|
+
* unhandled), and routing into the shim callbacks.
|
|
20
|
+
* - SyncBuffer: hub-events that arrive while the session is
|
|
21
|
+
* `synchronizing` or `reconnecting` are buffered and flushed on
|
|
22
|
+
* entry to `streaming`, so shims never observe events from a
|
|
23
|
+
* half-bound session.
|
|
24
|
+
*
|
|
25
|
+
* It is NOT responsible for wire framing, SSE watchdogs, heartbeat
|
|
26
|
+
* POSTs, or HTTP retries. Those live in the `McpTransport` below, which
|
|
27
|
+
* this class either constructs (if a `TransportConfig` is passed) or
|
|
28
|
+
* accepts by injection (so tests can swap in a fake transport).
|
|
29
|
+
*
|
|
30
|
+
* Runtime note: no existing consumer uses this class yet. Phase 4 will
|
|
31
|
+
* swap `UniversalClientAdapter` over to this surface and delete the
|
|
32
|
+
* `McpConnectionManager` path. Until then, `McpConnectionManager` stays
|
|
33
|
+
* intact and this class lives alongside it.
|
|
34
|
+
*/
|
|
35
|
+
import { McpTransport } from "../wire/mcp-transport.js";
|
|
36
|
+
import { normalizeToILogger } from "../logger.js";
|
|
37
|
+
import { parseHubEvent, classifyEvent, createDedupFilter, } from "./event-router.js";
|
|
38
|
+
import { performHandshake } from "./handshake.js";
|
|
39
|
+
import { HubReturnedError, isErrorEnvelope } from "../hub-error.js";
|
|
40
|
+
import { performStateSync } from "./state-sync.js";
|
|
41
|
+
// Same list as McpConnectionManager. Matched case-insensitively.
|
|
42
|
+
const SESSION_INVALID_PATTERNS = [
|
|
43
|
+
"No valid session ID",
|
|
44
|
+
"Bad Request",
|
|
45
|
+
"Session not found",
|
|
46
|
+
"invalid session",
|
|
47
|
+
];
|
|
48
|
+
function isSessionInvalidError(err) {
|
|
49
|
+
const msg = String(err).toLowerCase();
|
|
50
|
+
return SESSION_INVALID_PATTERNS.some((p) => msg.includes(p.toLowerCase()));
|
|
51
|
+
}
|
|
52
|
+
export class McpAgentClient {
|
|
53
|
+
cfg;
|
|
54
|
+
log;
|
|
55
|
+
transport;
|
|
56
|
+
ownsTransport;
|
|
57
|
+
manualSync;
|
|
58
|
+
dedup;
|
|
59
|
+
cognitive;
|
|
60
|
+
_state = "disconnected";
|
|
61
|
+
callbacks = {};
|
|
62
|
+
// Events buffered during non-streaming states so shims don't see
|
|
63
|
+
// traffic from a half-bound session.
|
|
64
|
+
syncBuffer = [];
|
|
65
|
+
// Re-entrancy guard on the synchronizing phase — the transport can
|
|
66
|
+
// emit `reconnected` mid-handshake in pathological cases and we must
|
|
67
|
+
// not double-run.
|
|
68
|
+
synchronizingInFlight = false;
|
|
69
|
+
// True while `reconnectSession()` is manually cycling the wire for a
|
|
70
|
+
// session_invalid retry. Suppresses the `closed` wire event from
|
|
71
|
+
// flipping the session FSM to `disconnected` — we handle FSM
|
|
72
|
+
// transitions ourselves in that path.
|
|
73
|
+
sessionReconnecting = false;
|
|
74
|
+
// True once `stop()` is called. Suppresses handleWireEvent work.
|
|
75
|
+
stopped = false;
|
|
76
|
+
// Session identity + metrics.
|
|
77
|
+
_agentId;
|
|
78
|
+
_sessionEpoch;
|
|
79
|
+
_lastEpoch = 0;
|
|
80
|
+
totalHandshakes = 0;
|
|
81
|
+
totalSessionInvalidRetries = 0;
|
|
82
|
+
dedupDropCount = 0;
|
|
83
|
+
// Mission-56 W2.2: most-recent Hub event id observed on the SSE
|
|
84
|
+
// stream. Surfaced to the wire layer via the `getLastEventId`
|
|
85
|
+
// TransportConfig hook so reconnects send the canonical
|
|
86
|
+
// `Last-Event-ID` header to drive Hub-side W1b backfill replay.
|
|
87
|
+
lastEventId;
|
|
88
|
+
constructor(config, options = {}) {
|
|
89
|
+
this.cfg = config;
|
|
90
|
+
this.log = normalizeToILogger(config.logger, "McpAgentClient");
|
|
91
|
+
this.manualSync = options.manualSync ?? false;
|
|
92
|
+
this.dedup = createDedupFilter(options.dedupCacheSize ?? 100);
|
|
93
|
+
this.cognitive = options.cognitive;
|
|
94
|
+
if (options.transport && options.transportConfig) {
|
|
95
|
+
throw new Error("McpAgentClient: pass `transport` OR `transportConfig`, not both");
|
|
96
|
+
}
|
|
97
|
+
if (options.transport) {
|
|
98
|
+
this.transport = options.transport;
|
|
99
|
+
this.ownsTransport = false;
|
|
100
|
+
}
|
|
101
|
+
else if (options.transportConfig) {
|
|
102
|
+
this.transport = new McpTransport({
|
|
103
|
+
...options.transportConfig,
|
|
104
|
+
logger: config.logger ?? options.transportConfig.logger,
|
|
105
|
+
// Caller-supplied provider wins; otherwise the kernel's tracked
|
|
106
|
+
// lastEventId backs the SSE Last-Event-ID header on reconnect.
|
|
107
|
+
getLastEventId: options.transportConfig.getLastEventId ?? (() => this.lastEventId),
|
|
108
|
+
});
|
|
109
|
+
this.ownsTransport = true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
throw new Error("McpAgentClient: either `transport` or `transportConfig` is required");
|
|
113
|
+
}
|
|
114
|
+
this.transport.onWireEvent((e) => this.handleWireEvent(e));
|
|
115
|
+
}
|
|
116
|
+
// ── IAgentClient: public surface ────────────────────────────────────
|
|
117
|
+
get state() {
|
|
118
|
+
return this._state;
|
|
119
|
+
}
|
|
120
|
+
get isConnected() {
|
|
121
|
+
return this._state === "streaming";
|
|
122
|
+
}
|
|
123
|
+
async start() {
|
|
124
|
+
if (this._state !== "disconnected") {
|
|
125
|
+
this.log.log("agent.start.ignored", { state: this._state }, `start() ignored in state=${this._state}`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.stopped = false;
|
|
129
|
+
this.transition("connecting");
|
|
130
|
+
try {
|
|
131
|
+
await this.transport.connect();
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
this.log.log("agent.start.failed", { error: String(err) }, `start: transport.connect failed: ${err}`);
|
|
135
|
+
this.transition("disconnected");
|
|
136
|
+
throw err;
|
|
137
|
+
}
|
|
138
|
+
// Wire is up. Now run the session bring-up. Rethrow on first-boot
|
|
139
|
+
// so a non-retriable handshake failure (e.g. 401) propagates out
|
|
140
|
+
// of `start()` instead of best-efforting into streaming on a
|
|
141
|
+
// broken session. Wire-reconnect re-entry keeps the best-effort
|
|
142
|
+
// path because a transient reconnect failure should not tear
|
|
143
|
+
// the shim down.
|
|
144
|
+
await this.runSynchronizingPhase({ rethrowOnFailure: true });
|
|
145
|
+
}
|
|
146
|
+
async stop() {
|
|
147
|
+
this.stopped = true;
|
|
148
|
+
this.syncBuffer.length = 0;
|
|
149
|
+
if (this.ownsTransport) {
|
|
150
|
+
await this.transport.close();
|
|
151
|
+
}
|
|
152
|
+
this.transition("disconnected");
|
|
153
|
+
this.dedup.clear();
|
|
154
|
+
}
|
|
155
|
+
async call(method, params) {
|
|
156
|
+
if (this._state !== "streaming" && this._state !== "synchronizing") {
|
|
157
|
+
throw new Error(`McpAgentClient.call: session state=${this._state}`);
|
|
158
|
+
}
|
|
159
|
+
// Legacy path: no cognitive pipeline configured. Zero-cost passthrough.
|
|
160
|
+
if (!this.cognitive) {
|
|
161
|
+
return this.rawCall(method, params);
|
|
162
|
+
}
|
|
163
|
+
// Cognitive path (ADR-018): wrap raw call through the pipeline.
|
|
164
|
+
// runToolCall threads every registered middleware's onToolCall around
|
|
165
|
+
// the terminal; runToolError routes any thrown error through the
|
|
166
|
+
// error phase (ErrorNormalizer, etc.) with a re-throw fallback.
|
|
167
|
+
const startedAt = Date.now();
|
|
168
|
+
const ctx = {
|
|
169
|
+
tool: method,
|
|
170
|
+
args: params,
|
|
171
|
+
sessionId: this.transport.getSessionId() ?? "",
|
|
172
|
+
agentId: this._agentId,
|
|
173
|
+
startedAt,
|
|
174
|
+
tags: {},
|
|
175
|
+
};
|
|
176
|
+
try {
|
|
177
|
+
return await this.cognitive.runToolCall(ctx, async (c) => {
|
|
178
|
+
const result = await this.rawCall(c.tool, c.args);
|
|
179
|
+
// Hub-layer application errors come back as `{isError, content}`
|
|
180
|
+
// envelopes — NOT thrown. For ErrorNormalizer (and any other
|
|
181
|
+
// onToolError middleware) to observe them, convert to a throw
|
|
182
|
+
// HERE. Legacy (non-cognitive) call path preserves the
|
|
183
|
+
// envelope-as-return-value contract unchanged.
|
|
184
|
+
if (isErrorEnvelope(result)) {
|
|
185
|
+
throw new HubReturnedError(result);
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
const errCtx = {
|
|
192
|
+
tool: method,
|
|
193
|
+
args: params,
|
|
194
|
+
sessionId: ctx.sessionId,
|
|
195
|
+
agentId: this._agentId,
|
|
196
|
+
error: err,
|
|
197
|
+
durationMs: Date.now() - startedAt,
|
|
198
|
+
startedAt,
|
|
199
|
+
tags: ctx.tags,
|
|
200
|
+
};
|
|
201
|
+
// Error phase: any middleware may transform the error into a
|
|
202
|
+
// recovered value; fallback terminal re-throws.
|
|
203
|
+
return await this.cognitive.runToolError(errCtx, async () => {
|
|
204
|
+
throw err;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Route `tools/list` through the cognitive pipeline when one is
|
|
210
|
+
* configured; otherwise fall through to `transport.listToolsRaw()`
|
|
211
|
+
* directly (shim-compatible signature). Enables
|
|
212
|
+
* `ToolDescriptionEnricher` and any future list-tools middleware
|
|
213
|
+
* to observe the tool-surface request before it reaches the Hub
|
|
214
|
+
* client. Shims that previously reached into `getTransport()
|
|
215
|
+
* .listToolsRaw()` should migrate to this method.
|
|
216
|
+
*/
|
|
217
|
+
async listTools() {
|
|
218
|
+
const raw = await this.transport.listToolsRaw();
|
|
219
|
+
const tools = raw;
|
|
220
|
+
if (!this.cognitive)
|
|
221
|
+
return tools;
|
|
222
|
+
const ctx = {
|
|
223
|
+
sessionId: this.transport.getSessionId() ?? "",
|
|
224
|
+
agentId: this._agentId,
|
|
225
|
+
startedAt: Date.now(),
|
|
226
|
+
tags: {},
|
|
227
|
+
};
|
|
228
|
+
return this.cognitive.runListTools(ctx, async () => tools);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Raw transport call with the session_invalid retry-once semantics.
|
|
232
|
+
* Separated from `call()` so the cognitive pipeline wraps this whole
|
|
233
|
+
* retry-capable primitive (cache/dedup/circuit all observe one logical
|
|
234
|
+
* invocation regardless of internal session-cycling).
|
|
235
|
+
*/
|
|
236
|
+
async rawCall(method, params) {
|
|
237
|
+
try {
|
|
238
|
+
return await this.transport.request(method, params);
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
if (!isSessionInvalidError(err))
|
|
242
|
+
throw err;
|
|
243
|
+
this.totalSessionInvalidRetries++;
|
|
244
|
+
this.log.log("agent.session.invalid_retry", { method }, `call(${method}): session_invalid — cycling session`);
|
|
245
|
+
await this.reconnectSession("session_invalid");
|
|
246
|
+
// Retry exactly once on the fresh session.
|
|
247
|
+
return await this.transport.request(method, params);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async listMethods() {
|
|
251
|
+
return this.transport.listMethods();
|
|
252
|
+
}
|
|
253
|
+
setCallbacks(callbacks) {
|
|
254
|
+
this.callbacks = callbacks;
|
|
255
|
+
}
|
|
256
|
+
getSessionId() {
|
|
257
|
+
return this.transport.getSessionId();
|
|
258
|
+
}
|
|
259
|
+
getMetrics() {
|
|
260
|
+
return {
|
|
261
|
+
sessionState: this._state,
|
|
262
|
+
agentId: this._agentId,
|
|
263
|
+
sessionEpoch: this._sessionEpoch,
|
|
264
|
+
totalHandshakes: this.totalHandshakes,
|
|
265
|
+
totalSessionInvalidRetries: this.totalSessionInvalidRetries,
|
|
266
|
+
dedupDropCount: this.dedupDropCount,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
getTransport() {
|
|
270
|
+
return this.transport;
|
|
271
|
+
}
|
|
272
|
+
// ── Internal: FSM and wire-event glue ───────────────────────────────
|
|
273
|
+
transition(to, reason) {
|
|
274
|
+
if (this._state === to)
|
|
275
|
+
return;
|
|
276
|
+
const from = this._state;
|
|
277
|
+
this._state = to;
|
|
278
|
+
this.log.log("agent.session.state", { from, to, reason }, `session ${from} → ${to}${reason ? ` (${reason})` : ""}`);
|
|
279
|
+
try {
|
|
280
|
+
this.callbacks.onStateChange?.(to, from, reason);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
this.log.log("agent.state.handler_error", { error: String(err) }, `onStateChange handler error: ${err}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
handleWireEvent(event) {
|
|
287
|
+
if (this.stopped)
|
|
288
|
+
return;
|
|
289
|
+
switch (event.type) {
|
|
290
|
+
case "push":
|
|
291
|
+
if (event.method === "hub-event")
|
|
292
|
+
this.handleHubEvent(event.payload);
|
|
293
|
+
return;
|
|
294
|
+
case "reconnecting":
|
|
295
|
+
// Map wire cause to session reconnect reason with the same
|
|
296
|
+
// vocabulary the legacy manager used. `peer_closed` and
|
|
297
|
+
// `wire_error` both fall under the "sse_watchdog" bucket
|
|
298
|
+
// because the session-level FSM doesn't distinguish them.
|
|
299
|
+
this.transition("reconnecting", this.mapWireCause(event.cause));
|
|
300
|
+
return;
|
|
301
|
+
case "reconnected":
|
|
302
|
+
// Transport brought up a fresh wire. Re-run the session
|
|
303
|
+
// bring-up on it.
|
|
304
|
+
void this.runSynchronizingPhase();
|
|
305
|
+
return;
|
|
306
|
+
case "closed":
|
|
307
|
+
if (this.sessionReconnecting)
|
|
308
|
+
return;
|
|
309
|
+
this.transition("disconnected");
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
mapWireCause(cause) {
|
|
314
|
+
switch (cause) {
|
|
315
|
+
case "heartbeat_failed":
|
|
316
|
+
return "heartbeat_failed";
|
|
317
|
+
case "sse_never_opened":
|
|
318
|
+
return "sse_never_opened";
|
|
319
|
+
case "sse_watchdog":
|
|
320
|
+
case "peer_closed":
|
|
321
|
+
case "wire_error":
|
|
322
|
+
default:
|
|
323
|
+
return "sse_watchdog";
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// ── Internal: session bring-up (handshake + sync) ───────────────────
|
|
327
|
+
async runSynchronizingPhase(opts = {}) {
|
|
328
|
+
if (this.synchronizingInFlight) {
|
|
329
|
+
this.log.log("agent.sync.in_flight", undefined, "runSynchronizingPhase: already in flight — skipping");
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
this.synchronizingInFlight = true;
|
|
333
|
+
try {
|
|
334
|
+
this.transition("synchronizing");
|
|
335
|
+
await this.runHandshake();
|
|
336
|
+
if (this.manualSync) {
|
|
337
|
+
// Caller owns sync. Stay in synchronizing until completeSync().
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
// State sync. `performStateSync` calls `completeSync` on success
|
|
341
|
+
// AND on the failure path, so we always exit synchronizing.
|
|
342
|
+
await performStateSync({
|
|
343
|
+
executeTool: (n, a) => this.transport.request(n, a),
|
|
344
|
+
completeSync: () => this.completeSyncInternal(),
|
|
345
|
+
log: this.log,
|
|
346
|
+
onPendingTask: this.cfg.handshake?.onPendingTask,
|
|
347
|
+
onPendingActionItem: this.cfg.handshake?.onPendingActionItem,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
this.log.log("agent.sync.failed", { error: String(err) }, `runSynchronizingPhase failed: ${err}`);
|
|
352
|
+
if (opts.rethrowOnFailure) {
|
|
353
|
+
// First-boot path: propagate to `start()`. Leave the session
|
|
354
|
+
// in `disconnected` so the shim sees a clean failure surface.
|
|
355
|
+
this.transition("disconnected");
|
|
356
|
+
throw err;
|
|
357
|
+
}
|
|
358
|
+
if (!this.manualSync) {
|
|
359
|
+
// Best-effort: flush buffer and move to streaming anyway so the
|
|
360
|
+
// shim isn't stuck. A subsequent wire death will re-drive this.
|
|
361
|
+
this.completeSyncInternal();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
this.synchronizingInFlight = false;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Public sync-completion hook. Only meaningful when the client was
|
|
370
|
+
* constructed with `manualSync: true`: the caller drives the
|
|
371
|
+
* synchronizing → streaming transition after its own state sync is
|
|
372
|
+
* done. Called automatically under `manualSync: false`.
|
|
373
|
+
*/
|
|
374
|
+
completeSync() {
|
|
375
|
+
this.completeSyncInternal();
|
|
376
|
+
}
|
|
377
|
+
async runHandshake() {
|
|
378
|
+
const handshake = this.cfg.handshake;
|
|
379
|
+
// Bare `register_role` first — proves the wire is alive and the
|
|
380
|
+
// session is bound before spending round-trips on the enriched
|
|
381
|
+
// payload. This ordering is invariant: the enriched handshake below
|
|
382
|
+
// re-registers on the same session to stamp its semantics onto it.
|
|
383
|
+
//
|
|
384
|
+
// Labels are intentionally NOT forwarded here: the Hub's legacy
|
|
385
|
+
// bare-path handler drops them silently (it doesn't create an Agent
|
|
386
|
+
// entity). Labels must ride the enriched payload below so they
|
|
387
|
+
// persist on the Agent and subsequent task.labels / dispatch
|
|
388
|
+
// selectors pick them up.
|
|
389
|
+
await this.transport.request("register_role", { role: this.cfg.role });
|
|
390
|
+
this.totalHandshakes++;
|
|
391
|
+
this.log.log("agent.handshake.plain_ok", { role: this.cfg.role }, `registered as ${this.cfg.role} (plain)`);
|
|
392
|
+
if (!handshake)
|
|
393
|
+
return;
|
|
394
|
+
const result = await performHandshake({
|
|
395
|
+
executeTool: (n, a) => this.transport.request(n, a),
|
|
396
|
+
config: {
|
|
397
|
+
role: this.cfg.role,
|
|
398
|
+
globalInstanceId: handshake.globalInstanceId,
|
|
399
|
+
clientInfo: handshake.getClientInfo(),
|
|
400
|
+
proxyName: handshake.proxyName,
|
|
401
|
+
proxyVersion: handshake.proxyVersion,
|
|
402
|
+
transport: handshake.transport,
|
|
403
|
+
sdkVersion: handshake.sdkVersion,
|
|
404
|
+
llmModel: handshake.llmModel,
|
|
405
|
+
labels: this.cfg.labels,
|
|
406
|
+
wakeEndpoint: handshake.wakeEndpoint,
|
|
407
|
+
receiptSla: handshake.receiptSla,
|
|
408
|
+
},
|
|
409
|
+
previousEpoch: this._lastEpoch,
|
|
410
|
+
log: this.log,
|
|
411
|
+
onFatalHalt: handshake.onFatalHalt,
|
|
412
|
+
});
|
|
413
|
+
this.totalHandshakes++;
|
|
414
|
+
if (result.response) {
|
|
415
|
+
this._lastEpoch = result.epoch;
|
|
416
|
+
this._sessionEpoch = result.response.sessionEpoch;
|
|
417
|
+
this._agentId = result.response.agentId;
|
|
418
|
+
if (handshake.onHandshakeComplete) {
|
|
419
|
+
try {
|
|
420
|
+
handshake.onHandshakeComplete(result.response);
|
|
421
|
+
}
|
|
422
|
+
catch (err) {
|
|
423
|
+
this.log.log("agent.handshake.handler_error", { error: String(err) }, `onHandshakeComplete handler error: ${err}`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
completeSyncInternal() {
|
|
429
|
+
if (this._state !== "synchronizing")
|
|
430
|
+
return;
|
|
431
|
+
const buffered = this.syncBuffer.splice(0);
|
|
432
|
+
this.transition("streaming");
|
|
433
|
+
if (buffered.length > 0) {
|
|
434
|
+
this.log.log("agent.sync.flush", { count: buffered.length }, `flushing ${buffered.length} buffered event(s)`);
|
|
435
|
+
for (const ev of buffered)
|
|
436
|
+
this.routeEvent(ev);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
// ── Internal: session-invalid reconnect ─────────────────────────────
|
|
440
|
+
async reconnectSession(reason) {
|
|
441
|
+
this.sessionReconnecting = true;
|
|
442
|
+
try {
|
|
443
|
+
this.transition("reconnecting", reason);
|
|
444
|
+
await this.transport.close();
|
|
445
|
+
await this.transport.connect();
|
|
446
|
+
}
|
|
447
|
+
finally {
|
|
448
|
+
this.sessionReconnecting = false;
|
|
449
|
+
}
|
|
450
|
+
// Synchronously (well, awaited) run the bring-up before returning
|
|
451
|
+
// so the retry-in-call() sees a bound session.
|
|
452
|
+
await this.runSynchronizingPhase();
|
|
453
|
+
}
|
|
454
|
+
// ── Internal: hub-event intake ──────────────────────────────────────
|
|
455
|
+
handleHubEvent(payload) {
|
|
456
|
+
if (!payload || typeof payload !== "object")
|
|
457
|
+
return;
|
|
458
|
+
const parsed = parseHubEvent(payload);
|
|
459
|
+
if (this.dedup.isDuplicate(parsed)) {
|
|
460
|
+
this.dedupDropCount++;
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const event = {
|
|
464
|
+
id: parsed.id,
|
|
465
|
+
event: parsed.event,
|
|
466
|
+
data: parsed.data,
|
|
467
|
+
timestamp: parsed.timestamp,
|
|
468
|
+
};
|
|
469
|
+
// Mission-56 W2.2: the Hub stamps every SSE event's `id:` field
|
|
470
|
+
// with a Message ID (ULID monotonic) — track the most-recent one
|
|
471
|
+
// so a subsequent reconnect's Last-Event-ID header can drive the
|
|
472
|
+
// Hub W1b backfill replay. Skip when no id was present on the
|
|
473
|
+
// event (legacy / non-Hub events).
|
|
474
|
+
if (event.id !== undefined) {
|
|
475
|
+
this.lastEventId = String(event.id);
|
|
476
|
+
}
|
|
477
|
+
// Buffer during any non-streaming state so shims don't see events
|
|
478
|
+
// from a half-bound (or torn-down) session.
|
|
479
|
+
if (this._state !== "streaming") {
|
|
480
|
+
this.syncBuffer.push(event);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
this.routeEvent(event);
|
|
484
|
+
}
|
|
485
|
+
routeEvent(event) {
|
|
486
|
+
const disposition = classifyEvent(event.event, this.cfg.role);
|
|
487
|
+
try {
|
|
488
|
+
switch (disposition) {
|
|
489
|
+
case "actionable":
|
|
490
|
+
this.callbacks.onActionableEvent?.(event);
|
|
491
|
+
return;
|
|
492
|
+
case "informational":
|
|
493
|
+
this.callbacks.onInformationalEvent?.(event);
|
|
494
|
+
return;
|
|
495
|
+
case "unhandled":
|
|
496
|
+
this.log.log("agent.event.unhandled", { event: event.event }, `unhandled event: ${event.event}`);
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch (err) {
|
|
501
|
+
this.log.log("agent.route.handler_error", { error: String(err) }, `route handler error: ${err}`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=mcp-agent-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-agent-client.js","sourceRoot":"","sources":["../../src/kernel/mcp-agent-client.ts"],"names":[],"mappings":"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"}
|