@moltzap/client 2026.802.0 → 2026.804.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/bounded-map.d.ts +3 -3
- package/dist/bounded-map.js +3 -3
- package/dist/channel-base/index.d.ts +1 -7
- package/dist/channel-base/index.d.ts.map +1 -1
- package/dist/channel-base/index.js +0 -6
- package/dist/channel-base/index.js.map +1 -1
- package/dist/channel-core-test-support.d.ts +5 -27
- package/dist/channel-core-test-support.d.ts.map +1 -1
- package/dist/channel-core-test-support.js +2 -90
- package/dist/channel-core-test-support.js.map +1 -1
- package/dist/channel-core.d.ts +156 -248
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +195 -525
- package/dist/channel-core.js.map +1 -1
- package/dist/cli/commands/start.d.ts +1 -5
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +0 -3
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/harness/client-runtime.d.ts +24 -0
- package/dist/harness/client-runtime.d.ts.map +1 -0
- package/dist/harness/client-runtime.js +107 -0
- package/dist/harness/client-runtime.js.map +1 -0
- package/dist/harness/index.d.ts +5 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +5 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/runtime.d.ts +149 -0
- package/dist/harness/runtime.d.ts.map +1 -0
- package/dist/harness/runtime.js +68 -0
- package/dist/harness/runtime.js.map +1 -0
- package/dist/harness-client.d.ts +43 -0
- package/dist/harness-client.d.ts.map +1 -0
- package/dist/harness-client.js +21 -0
- package/dist/harness-client.js.map +1 -0
- package/dist/harness-mcp-server.d.ts.map +1 -1
- package/dist/harness-mcp-server.js +107 -17
- package/dist/harness-mcp-server.js.map +1 -1
- package/dist/harness-mcp-subscription.d.ts +21 -0
- package/dist/harness-mcp-subscription.d.ts.map +1 -0
- package/dist/harness-mcp-subscription.js +324 -0
- package/dist/harness-mcp-subscription.js.map +1 -0
- package/dist/harness-mcp-wire.d.ts +9 -2
- package/dist/harness-mcp-wire.d.ts.map +1 -1
- package/dist/harness-mcp-wire.js +41 -10
- package/dist/harness-mcp-wire.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/local-daemon-rpc.d.ts +12 -195
- package/dist/local-daemon-rpc.d.ts.map +1 -1
- package/dist/local-daemon-rpc.js +1 -5
- package/dist/local-daemon-rpc.js.map +1 -1
- package/dist/moltzapd.d.ts +2 -1
- package/dist/moltzapd.d.ts.map +1 -1
- package/dist/moltzapd.js +19 -5
- package/dist/moltzapd.js.map +1 -1
- package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts +14 -14
- package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts.map +1 -1
- package/dist/notification/__tests__/subscribe-signatures.types-check.js +5 -5
- package/dist/notification/__tests__/subscribe-signatures.types-check.js.map +1 -1
- package/dist/service-local-daemon.d.ts +1 -1
- package/dist/service-local-daemon.d.ts.map +1 -1
- package/dist/service-local-daemon.js +2 -4
- package/dist/service-local-daemon.js.map +1 -1
- package/dist/service.d.ts +4 -25
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +7 -44
- package/dist/service.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -3
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +2 -22
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/ids.d.ts +0 -13
- package/dist/test-utils/ids.d.ts.map +1 -1
- package/dist/test-utils/ids.js +1 -16
- package/dist/test-utils/ids.js.map +1 -1
- package/dist/test-utils/index.d.ts +1 -1
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +1 -1
- package/dist/test-utils/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -4
- package/dist/app-client.d.ts +0 -5
- package/dist/app-client.d.ts.map +0 -1
- package/dist/app-client.js +0 -3
- package/dist/app-client.js.map +0 -1
- package/dist/channel-base/lease-guard.d.ts +0 -31
- package/dist/channel-base/lease-guard.d.ts.map +0 -1
- package/dist/channel-base/lease-guard.js +0 -44
- package/dist/channel-base/lease-guard.js.map +0 -1
- package/dist/channel-base/lease-store.d.ts +0 -48
- package/dist/channel-base/lease-store.d.ts.map +0 -1
- package/dist/channel-base/lease-store.js +0 -77
- package/dist/channel-base/lease-store.js.map +0 -1
- package/dist/channel-base/lease.d.ts +0 -96
- package/dist/channel-base/lease.d.ts.map +0 -1
- package/dist/channel-base/lease.js +0 -106
- package/dist/channel-base/lease.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-mcp-server.d.ts","sourceRoot":"","sources":["../src/harness-mcp-server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAGL,KAAK,MAAM,IAAI,cAAc,EAC9B,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"harness-mcp-server.d.ts","sourceRoot":"","sources":["../src/harness-mcp-server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAGL,KAAK,MAAM,IAAI,cAAc,EAC9B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAGL,MAAM,EAIN,KAAK,KAAK,EACX,MAAM,QAAQ,CAAC;AAUhB,UAAU,2BAA2B;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,mBAAmB,EAAE,cAAc,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAmRD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,YAC7B,2BAA2B,KACnC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CASF,CAAC"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { localhostHostValidation, localhostOriginValidation, toNodeHandler, } from "@modelcontextprotocol/node";
|
|
2
2
|
// eslint-disable-next-line agent-code-guard/prefer-effect-platform -- The official MCP Node adapter supplies a Node RequestListener, so this package-private process boundary must host that exact interface.
|
|
3
3
|
import { createServer, } from "node:http";
|
|
4
|
-
import { Effect, Exit } from "effect";
|
|
4
|
+
import { Deferred, Duration, Effect, Exit, Fiber, Option, } from "effect";
|
|
5
5
|
const REGISTER_MCP_PATH = "/register/mcp";
|
|
6
6
|
const HARNESS_MCP_PATH = "/mcp";
|
|
7
7
|
const POST_METHOD = "POST";
|
|
8
8
|
const LOOPBACK_HOST = "127.0.0.1";
|
|
9
|
+
// Loopback readers normally drain immediately; one second tolerates scheduler
|
|
10
|
+
// delay without allowing a stopped reader to retain the daemon lifetime.
|
|
11
|
+
const RESPONSE_DRAIN_GRACE_PERIOD = Duration.seconds(1);
|
|
9
12
|
const respond = (status, body, response, headers = {}) => {
|
|
10
13
|
response.writeHead(status, {
|
|
11
14
|
"content-type": "text/plain; charset=utf-8",
|
|
@@ -13,6 +16,45 @@ const respond = (status, body, response, headers = {}) => {
|
|
|
13
16
|
});
|
|
14
17
|
response.end(body);
|
|
15
18
|
};
|
|
19
|
+
const makeResponseTracker = () => {
|
|
20
|
+
const inFlight = new Set();
|
|
21
|
+
const responseWaiters = new Set();
|
|
22
|
+
const finish = (response) => {
|
|
23
|
+
inFlight.delete(response);
|
|
24
|
+
if (inFlight.size === 0) {
|
|
25
|
+
for (const resume of responseWaiters) {
|
|
26
|
+
resume();
|
|
27
|
+
}
|
|
28
|
+
responseWaiters.clear();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
track: (response, nodeResponse) => {
|
|
33
|
+
inFlight.add(response);
|
|
34
|
+
Effect.runFork(Effect.tryPromise({
|
|
35
|
+
try: () => response,
|
|
36
|
+
catch: (error) => error,
|
|
37
|
+
}).pipe(Effect.catchAll((error) => Effect.sync(() => {
|
|
38
|
+
nodeResponse.destroy(error instanceof Error ? error : undefined);
|
|
39
|
+
})), Effect.ensuring(Effect.sync(() => {
|
|
40
|
+
finish(response);
|
|
41
|
+
}))));
|
|
42
|
+
},
|
|
43
|
+
waitForResponses: Effect.async((resume) => {
|
|
44
|
+
if (inFlight.size === 0) {
|
|
45
|
+
resume(Effect.succeed(undefined));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const done = () => {
|
|
49
|
+
resume(Effect.succeed(undefined));
|
|
50
|
+
};
|
|
51
|
+
responseWaiters.add(done);
|
|
52
|
+
return Effect.sync(() => {
|
|
53
|
+
responseWaiters.delete(done);
|
|
54
|
+
});
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
16
58
|
/**
|
|
17
59
|
* Routes the daemon's two loopback MCP surfaces through one Node listener.
|
|
18
60
|
*
|
|
@@ -25,11 +67,12 @@ const makeHarnessMcpRequestListener = (registrationHandler, harnessHandler) => {
|
|
|
25
67
|
const validateOrigin = localhostOriginValidation();
|
|
26
68
|
const registrationNodeHandler = toNodeHandler(registrationHandler);
|
|
27
69
|
const harnessNodeHandler = toNodeHandler(harnessHandler);
|
|
70
|
+
const responses = makeResponseTracker();
|
|
28
71
|
const handlers = new Map([
|
|
29
72
|
[REGISTER_MCP_PATH, registrationNodeHandler],
|
|
30
73
|
[HARNESS_MCP_PATH, harnessNodeHandler],
|
|
31
74
|
]);
|
|
32
|
-
|
|
75
|
+
const listener = (request, response) => {
|
|
33
76
|
if (!validateHost(request, response) ||
|
|
34
77
|
!validateOrigin(request, response)) {
|
|
35
78
|
return;
|
|
@@ -44,20 +87,43 @@ const makeHarnessMcpRequestListener = (registrationHandler, harnessHandler) => {
|
|
|
44
87
|
respond(405, "Method not allowed.", response, { allow: POST_METHOD });
|
|
45
88
|
return;
|
|
46
89
|
}
|
|
47
|
-
handler(request, response)
|
|
48
|
-
|
|
90
|
+
responses.track(handler(request, response), response);
|
|
91
|
+
};
|
|
92
|
+
return {
|
|
93
|
+
listener,
|
|
94
|
+
waitForResponses: responses.waitForResponses,
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
const trackConnections = (server) => {
|
|
98
|
+
const sockets = new Set();
|
|
99
|
+
server.on("connection", (socket) => {
|
|
100
|
+
sockets.add(socket);
|
|
101
|
+
socket.once("close", () => {
|
|
102
|
+
sockets.delete(socket);
|
|
49
103
|
});
|
|
104
|
+
});
|
|
105
|
+
return () => {
|
|
106
|
+
for (const socket of sockets) {
|
|
107
|
+
socket.destroy();
|
|
108
|
+
}
|
|
109
|
+
server.closeAllConnections();
|
|
50
110
|
};
|
|
51
111
|
};
|
|
52
112
|
const listen = (options) => Effect.async((resume) => {
|
|
53
|
-
const
|
|
113
|
+
const requests = makeHarnessMcpRequestListener(options.registrationHandler, options.harnessHandler);
|
|
114
|
+
const server = createServer(requests.listener);
|
|
115
|
+
const destroyConnections = trackConnections(server);
|
|
54
116
|
const onError = (error) => {
|
|
55
117
|
resume(Effect.fail(error));
|
|
56
118
|
};
|
|
57
119
|
server.once("error", onError);
|
|
58
120
|
server.listen(options.port, LOOPBACK_HOST, () => {
|
|
59
121
|
server.off("error", onError);
|
|
60
|
-
resume(Effect.succeed(
|
|
122
|
+
resume(Effect.succeed({
|
|
123
|
+
destroyConnections,
|
|
124
|
+
server,
|
|
125
|
+
waitForResponses: requests.waitForResponses,
|
|
126
|
+
}));
|
|
61
127
|
});
|
|
62
128
|
return Effect.async((cancelResume) => {
|
|
63
129
|
server.off("error", onError);
|
|
@@ -74,23 +140,47 @@ const listen = (options) => Effect.async((resume) => {
|
|
|
74
140
|
}
|
|
75
141
|
});
|
|
76
142
|
});
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
resume(error === undefined
|
|
84
|
-
? Effect.succeed(undefined)
|
|
85
|
-
: Effect.logWarning("Harness MCP HTTP server close failed", error).pipe(Effect.as(undefined)));
|
|
143
|
+
const beginClose = (server) => Effect.gen(function* () {
|
|
144
|
+
const completion = yield* Deferred.make();
|
|
145
|
+
yield* Effect.sync(() => {
|
|
146
|
+
server.close((error) => {
|
|
147
|
+
Effect.runSync(Deferred.succeed(completion, error));
|
|
148
|
+
});
|
|
86
149
|
});
|
|
150
|
+
return Deferred.await(completion).pipe(Effect.flatMap((error) => error === undefined
|
|
151
|
+
? Effect.succeed(undefined)
|
|
152
|
+
: Effect.logWarning("Harness MCP HTTP server close failed", error).pipe(Effect.as(undefined))));
|
|
87
153
|
});
|
|
88
154
|
const closeHandler = (handler) => Effect.tryPromise({
|
|
89
155
|
try: () => handler.close(),
|
|
90
156
|
catch: (error) => error,
|
|
91
157
|
}).pipe(Effect.catchAll((error) => Effect.logWarning("Harness MCP handler close failed").pipe(Effect.annotateLogs({ error: String(error) }))), Effect.asVoid);
|
|
92
158
|
const closeHandlers = (options) => Effect.forEach(new Set([options.registrationHandler, options.harnessHandler]), closeHandler, { concurrency: 2, discard: true });
|
|
93
|
-
const release = (
|
|
159
|
+
const release = (running, options) => Effect.gen(function* () {
|
|
160
|
+
const closeCompletion = yield* beginClose(running.server);
|
|
161
|
+
// Handler closure finishes the Web stream before the Node adapter drains
|
|
162
|
+
// it. A local client that stops reading must not retain the daemon scope,
|
|
163
|
+
// so graceful draining is bounded before active connections are closed.
|
|
164
|
+
const gracefulClose = yield* Effect.fork(Effect.all([closeHandlers(options), running.waitForResponses], {
|
|
165
|
+
concurrency: 2,
|
|
166
|
+
discard: true,
|
|
167
|
+
}));
|
|
168
|
+
// acquireRelease finalizers are uninterruptible. Only this observation is
|
|
169
|
+
// interruptible so the grace timer can win; the close fiber remains owned
|
|
170
|
+
// here and is joined after any forced connection shutdown.
|
|
171
|
+
const drained = yield* Fiber.join(gracefulClose).pipe(Effect.timeoutOption(RESPONSE_DRAIN_GRACE_PERIOD), Effect.interruptible);
|
|
172
|
+
if (Option.isNone(drained)) {
|
|
173
|
+
yield* Effect.logWarning("Harness MCP response drain timed out; closing active connections");
|
|
174
|
+
yield* Effect.sync(running.destroyConnections);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
running.server.closeAllConnections();
|
|
178
|
+
}
|
|
179
|
+
if (Option.isNone(drained)) {
|
|
180
|
+
yield* Fiber.join(gracefulClose);
|
|
181
|
+
}
|
|
182
|
+
yield* closeCompletion;
|
|
183
|
+
});
|
|
94
184
|
/**
|
|
95
185
|
* Acquires the guarded loopback HTTP server for one explicitly supplied port.
|
|
96
186
|
* The caller owns port selection and keeps the returned server alive by
|
|
@@ -101,5 +191,5 @@ const release = (server, options) => closeHandlers(options).pipe(Effect.zipRight
|
|
|
101
191
|
*/
|
|
102
192
|
export const acquireHarnessMcpHttpServer = (options) =>
|
|
103
193
|
// eslint-disable-next-line agent-code-guard/acquire-release-requires-scope -- this package-private helper returns the scoped acquisition to its process owner
|
|
104
|
-
Effect.acquireRelease(listen(options).pipe(Effect.onExit((exit) => Exit.isSuccess(exit) ? Effect.void : closeHandlers(options))), (
|
|
194
|
+
Effect.acquireRelease(listen(options).pipe(Effect.onExit((exit) => Exit.isSuccess(exit) ? Effect.void : closeHandlers(options))), (running) => release(running, options)).pipe(Effect.map((running) => running.server));
|
|
105
195
|
//# sourceMappingURL=harness-mcp-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-mcp-server.js","sourceRoot":"","sources":["../src/harness-mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,GACd,MAAM,4BAA4B,CAAC;AAEpC,8MAA8M;AAC9M,OAAO,EACL,YAAY,GAGb,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"harness-mcp-server.js","sourceRoot":"","sources":["../src/harness-mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,GACd,MAAM,4BAA4B,CAAC;AAEpC,8MAA8M;AAC9M,OAAO,EACL,YAAY,GAGb,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,KAAK,EACL,MAAM,GAEP,MAAM,QAAQ,CAAC;AAEhB,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,8EAA8E;AAC9E,yEAAyE;AACzE,MAAM,2BAA2B,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AA2BxD,MAAM,OAAO,GAAG,CACd,MAAc,EACd,IAAY,EACZ,QAAwC,EACxC,OAAO,GAAqC,EAAE,EACxC,EAAE;IACR,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QACzB,cAAc,EAAE,2BAA2B;QAC3C,GAAG,OAAO;KACX,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAoB,EAAE;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAc,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,QAA2C,EAAQ,EAAE;QACnE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;gBACrC,MAAM,EAAE,CAAC;YACX,CAAC;YACD,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE;YAChC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvB,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,UAAU,CAAC;gBAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ;gBACnB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aACxB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnE,CAAC,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnB,CAAC,CAAC,CACH,CACF,CACF,CAAC;QACJ,CAAC;QACD,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAY,CAAC,MAAM,EAAE,EAAE;YACnD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,GAAS,EAAE;gBACtB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC;YACF,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,6BAA6B,GAAG,CACpC,mBAAwC,EACxC,cAAmC,EACR,EAAE;IAC7B,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAC;IAC/C,MAAM,cAAc,GAAG,yBAAyB,EAAE,CAAC;IACnD,MAAM,uBAAuB,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACnE,MAAM,kBAAkB,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAA+C,IAAI,GAAG,CAAC;QACnE,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;QAC5C,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;KACvC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAoB,CAAC,OAAO,EAAE,QAAQ,EAAQ,EAAE;QAC5D,IACE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC;YAChC,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAClC,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;QAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;KAC7C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAAgB,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CACb,OAAoC,EACe,EAAE,CACrD,MAAM,CAAC,KAAK,CAAqC,CAAC,MAAM,EAAE,EAAE;IAC1D,MAAM,QAAQ,GAAG,6BAA6B,CAC5C,OAAO,CAAC,mBAAmB,EAC3B,OAAO,CAAC,cAAc,CACvB,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;QACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,CACJ,MAAM,CAAC,OAAO,CAAC;YACb,kBAAkB;YAClB,MAAM;YACN,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;SAC5C,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAY,CAAC,YAAY,EAAE,EAAE;QAC9C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,YAAY,CACV,MAAM,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC,IAAI,CAC/D,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAC7C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CACrB,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,MAAM,UAAU,GAAG,CACjB,MAAsB,EACmB,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAqB,CAAC;IAC7D,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACtB,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACrB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CACpC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACvB,KAAK,KAAK,SAAS;QACjB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3B,CAAC,CAAC,MAAM,CAAC,UAAU,CACf,sCAAsC,EACtC,KAAK,CACN,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CACjC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,YAAY,GAAG,CAAC,OAAuB,EAAuB,EAAE,CACpE,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;IAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;CACxB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,IAAI,CACxD,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAC9C,CACF,EACD,MAAM,CAAC,MAAM,CACd,CAAC;AAEJ,MAAM,aAAa,GAAG,CACpB,OAAoC,EACf,EAAE,CACvB,MAAM,CAAC,OAAO,CACZ,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAC9D,YAAY,EACZ,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAClC,CAAC;AAEJ,MAAM,OAAO,GAAG,CACd,OAAoC,EACpC,OAAoC,EACf,EAAE,CACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACtC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE;QAC7D,WAAW,EAAE,CAAC;QACd,OAAO,EAAE,IAAI;KACd,CAAC,CACH,CAAC;IACF,0EAA0E;IAC1E,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CACnD,MAAM,CAAC,aAAa,CAAC,2BAA2B,CAAC,EACjD,MAAM,CAAC,aAAa,CACrB,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,kEAAkE,CACnE,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,CAAC,eAAe,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAoC,EACe,EAAE;AACrD,8JAA8J;AAC9J,MAAM,CAAC,cAAc,CACnB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAClB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAC5D,CACF,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CACvC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Implementation, type McpHttpHandler } from "@modelcontextprotocol/server";
|
|
2
|
+
interface HarnessMcpSubscriptionOptions {
|
|
3
|
+
readonly delegate: McpHttpHandler;
|
|
4
|
+
readonly implementation: Implementation;
|
|
5
|
+
readonly onerror?: (error: Error) => void;
|
|
6
|
+
}
|
|
7
|
+
/** An official MCP handler augmented with one caller-typed event publisher. */
|
|
8
|
+
export interface HarnessMcpSubscriptionHandler<Payload extends object> extends McpHttpHandler {
|
|
9
|
+
/** Publishes one complete custom notification to the retained POST response. */
|
|
10
|
+
readonly publish: (payload: Payload) => boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Adds the MoltZap turn-ready subscription extension to an official MCP HTTP
|
|
14
|
+
* handler. Every non-extension request remains owned by the SDK delegate.
|
|
15
|
+
*
|
|
16
|
+
* @param options Official handler, server identity, and optional error sink.
|
|
17
|
+
* @returns The official handler surface plus a typed custom publisher.
|
|
18
|
+
*/
|
|
19
|
+
export declare const makeHarnessMcpSubscriptionHandler: <Payload extends object>(options: HarnessMcpSubscriptionOptions) => HarnessMcpSubscriptionHandler<Payload>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=harness-mcp-subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-mcp-subscription.d.ts","sourceRoot":"","sources":["../src/harness-mcp-subscription.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAEpB,MAAM,8BAA8B,CAAC;AAyBtC,UAAU,6BAA6B;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3C;AAED,+EAA+E;AAC/E,MAAM,WAAW,6BAA6B,CAAC,OAAO,SAAS,MAAM,CACnE,SAAQ,cAAc;IACtB,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;CACjD;AA4XD;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,GAAI,OAAO,SAAS,MAAM,WAC7D,6BAA6B,KACrC,6BAA6B,CAAC,OAAO,CACuB,CAAC"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/* eslint-disable agent-code-guard/async-keyword, agent-code-guard/promise-type, @typescript-eslint/no-invalid-void-type -- The official MCP handler and retained POST response stream expose Promise-native lifecycle contracts. */
|
|
2
|
+
import { CLIENT_CAPABILITIES_META_KEY, MissingRequiredClientCapabilityError, SERVER_INFO_META_KEY, SUBSCRIPTION_ID_META_KEY, classifyInboundRequest, isJsonContentType, } from "@modelcontextprotocol/server";
|
|
3
|
+
import { HARNESS_EVENTS_EXTENSION, HARNESS_TURN_READY_FILTER, HARNESS_TURN_READY_NOTIFICATION, } from "./harness/index.js";
|
|
4
|
+
// The SDK remains authoritative for the MCP server. Its public event publisher
|
|
5
|
+
// has a closed event union, so this adapter owns only MoltZap's exact
|
|
6
|
+
// turn-ready listen filter and notification. Every other request is delegated
|
|
7
|
+
// unchanged.
|
|
8
|
+
const SUBSCRIPTIONS_LISTEN_METHOD = "subscriptions/listen";
|
|
9
|
+
const SUBSCRIPTIONS_ACKNOWLEDGED_NOTIFICATION = "notifications/subscriptions/acknowledged";
|
|
10
|
+
const JSON_RPC_VERSION = "2.0";
|
|
11
|
+
const MODERN_PROTOCOL_VERSION = "2026-07-28";
|
|
12
|
+
const INTERNAL_ERROR = -32603;
|
|
13
|
+
const SUBSCRIPTION_IN_USE = -32000;
|
|
14
|
+
const BAD_REQUEST_STATUS = 400;
|
|
15
|
+
const CONFLICT_STATUS = 409;
|
|
16
|
+
const INTERNAL_ERROR_STATUS = 500;
|
|
17
|
+
const OK_STATUS = 200;
|
|
18
|
+
const isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
19
|
+
const jsonRpcError = ({ status, id, code, message, data, }) => Response.json({
|
|
20
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
21
|
+
error: {
|
|
22
|
+
code,
|
|
23
|
+
message,
|
|
24
|
+
...(data === undefined ? {} : { data }),
|
|
25
|
+
},
|
|
26
|
+
id,
|
|
27
|
+
}, { status });
|
|
28
|
+
// #ignore-sloppy-code-next-line[async-keyword]: The official handler consumes a Promise-returning Fetch boundary.
|
|
29
|
+
const readRequestBody = async (request, options) => {
|
|
30
|
+
if (options?.parsedBody !== undefined) {
|
|
31
|
+
return options.parsedBody;
|
|
32
|
+
}
|
|
33
|
+
return await request
|
|
34
|
+
.clone()
|
|
35
|
+
.json()
|
|
36
|
+
.catch(() => undefined);
|
|
37
|
+
};
|
|
38
|
+
const modernListenMessage = (request, body) => {
|
|
39
|
+
const outcome = classifyInboundRequest({
|
|
40
|
+
httpMethod: request.method.toUpperCase(),
|
|
41
|
+
protocolVersionHeader: request.headers.get("mcp-protocol-version") ?? undefined,
|
|
42
|
+
mcpMethodHeader: request.headers.get("mcp-method") ?? undefined,
|
|
43
|
+
mcpNameHeader: request.headers.get("mcp-name") ?? undefined,
|
|
44
|
+
body,
|
|
45
|
+
});
|
|
46
|
+
if (outcome.kind !== "modern" || outcome.messageKind !== "request") {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
if (outcome.classification.revision !== MODERN_PROTOCOL_VERSION ||
|
|
50
|
+
outcome.message.method !== SUBSCRIPTIONS_LISTEN_METHOD) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return outcome.message;
|
|
54
|
+
};
|
|
55
|
+
const requiredCapabilityDeclared = (params) => {
|
|
56
|
+
const meta = params._meta;
|
|
57
|
+
if (!isJsonObject(meta)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const capabilities = meta[CLIENT_CAPABILITIES_META_KEY];
|
|
61
|
+
if (!isJsonObject(capabilities) || !isJsonObject(capabilities.extensions)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return Object.hasOwn(capabilities.extensions, HARNESS_EVENTS_EXTENSION);
|
|
65
|
+
};
|
|
66
|
+
const customListenRequest = (request, body) => {
|
|
67
|
+
const message = modernListenMessage(request, body);
|
|
68
|
+
if (message === undefined || !isJsonObject(message.params)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const notifications = message.params.notifications;
|
|
72
|
+
const notificationKeys = isJsonObject(notifications)
|
|
73
|
+
? Object.keys(notifications)
|
|
74
|
+
: [];
|
|
75
|
+
if (!isJsonObject(notifications) ||
|
|
76
|
+
notificationKeys.length !== 1 ||
|
|
77
|
+
notificationKeys[0] !== HARNESS_TURN_READY_FILTER ||
|
|
78
|
+
notifications[HARNESS_TURN_READY_FILTER] !== true) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
id: message.id,
|
|
83
|
+
hasRequiredCapability: requiredCapabilityDeclared(message.params),
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
const shouldInspect = (request) => request.method.toUpperCase() === "POST" &&
|
|
87
|
+
isJsonContentType(request.headers.get("content-type")) &&
|
|
88
|
+
request.headers.get("mcp-method") === SUBSCRIPTIONS_LISTEN_METHOD;
|
|
89
|
+
class HarnessMcpSubscriptionState {
|
|
90
|
+
delegate;
|
|
91
|
+
implementation;
|
|
92
|
+
onerror;
|
|
93
|
+
encoder = new TextEncoder();
|
|
94
|
+
active;
|
|
95
|
+
closed = false;
|
|
96
|
+
closePromise; // #ignore-sloppy-code[promise-type]: McpHttpHandler.close is Promise-native.
|
|
97
|
+
constructor(options) {
|
|
98
|
+
this.delegate = options.delegate;
|
|
99
|
+
this.implementation = options.implementation;
|
|
100
|
+
this.onerror = options.onerror;
|
|
101
|
+
}
|
|
102
|
+
// #ignore-sloppy-code-next-line[async-keyword]: McpHttpHandler.fetch is Promise-native.
|
|
103
|
+
fetch = async (request, options) => {
|
|
104
|
+
if (this.closed || !shouldInspect(request)) {
|
|
105
|
+
return options === undefined
|
|
106
|
+
? await this.delegate.fetch(request)
|
|
107
|
+
: await this.delegate.fetch(request, options);
|
|
108
|
+
}
|
|
109
|
+
const body = options === undefined
|
|
110
|
+
? await readRequestBody(request)
|
|
111
|
+
: await readRequestBody(request, options);
|
|
112
|
+
const listenRequest = customListenRequest(request, body);
|
|
113
|
+
if (this.closed || listenRequest === undefined) {
|
|
114
|
+
return options === undefined
|
|
115
|
+
? await this.delegate.fetch(request)
|
|
116
|
+
: await this.delegate.fetch(request, options);
|
|
117
|
+
}
|
|
118
|
+
return this.serve(request, listenRequest);
|
|
119
|
+
};
|
|
120
|
+
publish = (payload) => {
|
|
121
|
+
const subscription = this.active;
|
|
122
|
+
if (subscription === undefined || subscription.closed) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const published = this.enqueueMessage(subscription, {
|
|
126
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
127
|
+
method: HARNESS_TURN_READY_NOTIFICATION,
|
|
128
|
+
params: {
|
|
129
|
+
...payload,
|
|
130
|
+
_meta: { [SUBSCRIPTION_ID_META_KEY]: subscription.id },
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
if (!published) {
|
|
134
|
+
this.teardown(subscription, false);
|
|
135
|
+
}
|
|
136
|
+
return published;
|
|
137
|
+
};
|
|
138
|
+
// #ignore-sloppy-code-next-line[promise-type]: McpHttpHandler.close is Promise-native.
|
|
139
|
+
close = () => {
|
|
140
|
+
if (this.closePromise !== undefined) {
|
|
141
|
+
return this.closePromise;
|
|
142
|
+
}
|
|
143
|
+
this.closed = true;
|
|
144
|
+
if (this.active !== undefined) {
|
|
145
|
+
this.teardown(this.active, true);
|
|
146
|
+
}
|
|
147
|
+
this.closePromise = this.delegate.close();
|
|
148
|
+
return this.closePromise;
|
|
149
|
+
};
|
|
150
|
+
asHandler() {
|
|
151
|
+
return {
|
|
152
|
+
fetch: this.fetch,
|
|
153
|
+
close: this.close,
|
|
154
|
+
publish: this.publish,
|
|
155
|
+
notify: this.delegate.notify,
|
|
156
|
+
bus: this.delegate.bus,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
reportError(error) {
|
|
160
|
+
if (this.onerror === undefined) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
this.onerror(error instanceof Error ? error : new Error(String(error)));
|
|
165
|
+
}
|
|
166
|
+
catch (reportingError) {
|
|
167
|
+
console.error("Harness MCP subscription error reporter failed", reportingError);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
enqueueMessage(subscription, message) {
|
|
171
|
+
if (subscription.closed || subscription.controller === undefined) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const frame = `data: ${JSON.stringify(message)}\n\n`;
|
|
176
|
+
subscription.controller.enqueue(this.encoder.encode(frame));
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
this.reportError(error);
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
teardown(subscription, graceful) {
|
|
185
|
+
if (subscription.closed) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (graceful) {
|
|
189
|
+
this.enqueueMessage(subscription, this.completeMessage(subscription.id));
|
|
190
|
+
}
|
|
191
|
+
subscription.closed = true;
|
|
192
|
+
subscription.abortCleanup?.();
|
|
193
|
+
if (this.active === subscription) {
|
|
194
|
+
this.active = undefined;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
subscription.controller?.close();
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
this.reportError(error);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
completeMessage(id) {
|
|
204
|
+
return {
|
|
205
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
206
|
+
id,
|
|
207
|
+
result: {
|
|
208
|
+
resultType: "complete",
|
|
209
|
+
_meta: {
|
|
210
|
+
[SUBSCRIPTION_ID_META_KEY]: id,
|
|
211
|
+
[SERVER_INFO_META_KEY]: this.implementation,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
serve(request, listenRequest) {
|
|
217
|
+
const refusal = this.admissionRefusal(listenRequest);
|
|
218
|
+
if (refusal !== undefined) {
|
|
219
|
+
return refusal;
|
|
220
|
+
}
|
|
221
|
+
const subscription = {
|
|
222
|
+
id: listenRequest.id,
|
|
223
|
+
closed: false,
|
|
224
|
+
};
|
|
225
|
+
this.active = subscription;
|
|
226
|
+
const readable = this.makeReadable(request, subscription);
|
|
227
|
+
if (readable === undefined) {
|
|
228
|
+
return jsonRpcError({
|
|
229
|
+
status: INTERNAL_ERROR_STATUS,
|
|
230
|
+
id: listenRequest.id,
|
|
231
|
+
code: INTERNAL_ERROR,
|
|
232
|
+
message: "Internal server error",
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return new Response(readable, {
|
|
236
|
+
status: OK_STATUS,
|
|
237
|
+
headers: {
|
|
238
|
+
"cache-control": "no-cache",
|
|
239
|
+
connection: "keep-alive",
|
|
240
|
+
"content-type": "text/event-stream",
|
|
241
|
+
"x-accel-buffering": "no",
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
admissionRefusal(listenRequest) {
|
|
246
|
+
if (!listenRequest.hasRequiredCapability) {
|
|
247
|
+
const error = new MissingRequiredClientCapabilityError({
|
|
248
|
+
requiredCapabilities: {
|
|
249
|
+
extensions: { [HARNESS_EVENTS_EXTENSION]: {} },
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
return jsonRpcError({
|
|
253
|
+
status: BAD_REQUEST_STATUS,
|
|
254
|
+
id: listenRequest.id,
|
|
255
|
+
code: error.code,
|
|
256
|
+
message: error.message,
|
|
257
|
+
data: error.data,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return this.active === undefined
|
|
261
|
+
? undefined
|
|
262
|
+
: jsonRpcError({
|
|
263
|
+
status: CONFLICT_STATUS,
|
|
264
|
+
id: listenRequest.id,
|
|
265
|
+
code: SUBSCRIPTION_IN_USE,
|
|
266
|
+
message: "Turn-ready subscription already in use",
|
|
267
|
+
data: { kind: "subscription_in_use" },
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
makeReadable(request, subscription) {
|
|
271
|
+
try {
|
|
272
|
+
return new ReadableStream({
|
|
273
|
+
start: (controller) => {
|
|
274
|
+
this.start(request, subscription, controller);
|
|
275
|
+
},
|
|
276
|
+
cancel: () => {
|
|
277
|
+
this.teardown(subscription, false);
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
this.teardown(subscription, false);
|
|
283
|
+
this.reportError(error);
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
start(request, subscription, controller) {
|
|
288
|
+
subscription.controller = controller;
|
|
289
|
+
if (request.signal.aborted) {
|
|
290
|
+
this.teardown(subscription, false);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const onAbort = () => {
|
|
294
|
+
this.teardown(subscription, false);
|
|
295
|
+
};
|
|
296
|
+
request.signal.addEventListener("abort", onAbort, { once: true });
|
|
297
|
+
subscription.abortCleanup = () => {
|
|
298
|
+
request.signal.removeEventListener("abort", onAbort);
|
|
299
|
+
};
|
|
300
|
+
if (!this.enqueueMessage(subscription, this.ackMessage(subscription.id))) {
|
|
301
|
+
this.teardown(subscription, false);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
ackMessage(id) {
|
|
305
|
+
return {
|
|
306
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
307
|
+
method: SUBSCRIPTIONS_ACKNOWLEDGED_NOTIFICATION,
|
|
308
|
+
params: {
|
|
309
|
+
notifications: { [HARNESS_TURN_READY_FILTER]: true },
|
|
310
|
+
_meta: { [SUBSCRIPTION_ID_META_KEY]: id },
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Adds the MoltZap turn-ready subscription extension to an official MCP HTTP
|
|
317
|
+
* handler. Every non-extension request remains owned by the SDK delegate.
|
|
318
|
+
*
|
|
319
|
+
* @param options Official handler, server identity, and optional error sink.
|
|
320
|
+
* @returns The official handler surface plus a typed custom publisher.
|
|
321
|
+
*/
|
|
322
|
+
export const makeHarnessMcpSubscriptionHandler = (options) => new HarnessMcpSubscriptionState(options).asHandler();
|
|
323
|
+
/* eslint-enable agent-code-guard/async-keyword, agent-code-guard/promise-type, @typescript-eslint/no-invalid-void-type -- Restore repository defaults after the Promise-native MCP boundary. */
|
|
324
|
+
//# sourceMappingURL=harness-mcp-subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-mcp-subscription.js","sourceRoot":"","sources":["../src/harness-mcp-subscription.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { type Implementation, type McpHttpHandler } from "@modelcontextprotocol/server";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { ConversationId } from "@moltzap/protocol/conversation";
|
|
4
|
+
import { type HarnessTurnEvent } from "./harness/index.js";
|
|
5
|
+
import { type HarnessMcpSubscriptionHandler } from "./harness-mcp-subscription.js";
|
|
2
6
|
import { type localDaemonCommands, type LocalDaemonHandlers } from "./local-daemon-rpc.js";
|
|
3
7
|
type StatusHandler = LocalDaemonHandlers[typeof localDaemonCommands.status];
|
|
8
|
+
type ReplyHandler = (conversationId: ConversationId, payload: string) => Effect.Effect<void, unknown>;
|
|
4
9
|
interface HarnessMcpHandlerOptions {
|
|
5
10
|
readonly implementation: Implementation;
|
|
11
|
+
readonly reply: ReplyHandler;
|
|
6
12
|
readonly status: StatusHandler;
|
|
7
13
|
}
|
|
8
14
|
/**
|
|
@@ -10,12 +16,13 @@ interface HarnessMcpHandlerOptions {
|
|
|
10
16
|
*
|
|
11
17
|
* @param options Existing daemon capabilities exposed through MCP.
|
|
12
18
|
* @param options.implementation Existing MCP server identity.
|
|
19
|
+
* @param options.reply Conversation-bound raw reply handler.
|
|
13
20
|
* @param options.status Existing local daemon status handler.
|
|
14
21
|
* @returns The registration and active-agent HTTP handlers.
|
|
15
22
|
*/
|
|
16
|
-
export declare const makeHarnessMcpHttpHandlers: ({ implementation, status, }: HarnessMcpHandlerOptions) => {
|
|
23
|
+
export declare const makeHarnessMcpHttpHandlers: ({ implementation, reply, status, }: HarnessMcpHandlerOptions) => {
|
|
17
24
|
readonly registration: McpHttpHandler;
|
|
18
|
-
readonly active:
|
|
25
|
+
readonly active: HarnessMcpSubscriptionHandler<HarnessTurnEvent>;
|
|
19
26
|
};
|
|
20
27
|
export {};
|
|
21
28
|
//# sourceMappingURL=harness-mcp-wire.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-mcp-wire.d.ts","sourceRoot":"","sources":["../src/harness-mcp-wire.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"harness-mcp-wire.d.ts","sourceRoot":"","sources":["../src/harness-mcp-wire.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,MAAM,EAA2B,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAM/B,KAAK,aAAa,GAAG,mBAAmB,CAAC,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5E,KAAK,YAAY,GAAG,CAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAElC,UAAU,wBAAwB;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AA2FD;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,uCAIpC,wBAAwB,KAAG;IAC5B,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC,gBAAgB,CAAC,CAAC;CAgBlE,CAAC"}
|