@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.
Files changed (99) hide show
  1. package/dist/bounded-map.d.ts +3 -3
  2. package/dist/bounded-map.js +3 -3
  3. package/dist/channel-base/index.d.ts +1 -7
  4. package/dist/channel-base/index.d.ts.map +1 -1
  5. package/dist/channel-base/index.js +0 -6
  6. package/dist/channel-base/index.js.map +1 -1
  7. package/dist/channel-core-test-support.d.ts +5 -27
  8. package/dist/channel-core-test-support.d.ts.map +1 -1
  9. package/dist/channel-core-test-support.js +2 -90
  10. package/dist/channel-core-test-support.js.map +1 -1
  11. package/dist/channel-core.d.ts +156 -248
  12. package/dist/channel-core.d.ts.map +1 -1
  13. package/dist/channel-core.js +195 -525
  14. package/dist/channel-core.js.map +1 -1
  15. package/dist/cli/commands/start.d.ts +1 -5
  16. package/dist/cli/commands/start.d.ts.map +1 -1
  17. package/dist/cli/commands/start.js +0 -3
  18. package/dist/cli/commands/start.js.map +1 -1
  19. package/dist/harness/client-runtime.d.ts +24 -0
  20. package/dist/harness/client-runtime.d.ts.map +1 -0
  21. package/dist/harness/client-runtime.js +107 -0
  22. package/dist/harness/client-runtime.js.map +1 -0
  23. package/dist/harness/index.d.ts +5 -0
  24. package/dist/harness/index.d.ts.map +1 -0
  25. package/dist/harness/index.js +5 -0
  26. package/dist/harness/index.js.map +1 -0
  27. package/dist/harness/runtime.d.ts +149 -0
  28. package/dist/harness/runtime.d.ts.map +1 -0
  29. package/dist/harness/runtime.js +68 -0
  30. package/dist/harness/runtime.js.map +1 -0
  31. package/dist/harness-client.d.ts +43 -0
  32. package/dist/harness-client.d.ts.map +1 -0
  33. package/dist/harness-client.js +21 -0
  34. package/dist/harness-client.js.map +1 -0
  35. package/dist/harness-mcp-server.d.ts.map +1 -1
  36. package/dist/harness-mcp-server.js +107 -17
  37. package/dist/harness-mcp-server.js.map +1 -1
  38. package/dist/harness-mcp-subscription.d.ts +21 -0
  39. package/dist/harness-mcp-subscription.d.ts.map +1 -0
  40. package/dist/harness-mcp-subscription.js +324 -0
  41. package/dist/harness-mcp-subscription.js.map +1 -0
  42. package/dist/harness-mcp-wire.d.ts +9 -2
  43. package/dist/harness-mcp-wire.d.ts.map +1 -1
  44. package/dist/harness-mcp-wire.js +41 -10
  45. package/dist/harness-mcp-wire.js.map +1 -1
  46. package/dist/index.d.ts +3 -5
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +3 -3
  49. package/dist/index.js.map +1 -1
  50. package/dist/local-daemon-rpc.d.ts +12 -195
  51. package/dist/local-daemon-rpc.d.ts.map +1 -1
  52. package/dist/local-daemon-rpc.js +1 -5
  53. package/dist/local-daemon-rpc.js.map +1 -1
  54. package/dist/moltzapd.d.ts +2 -1
  55. package/dist/moltzapd.d.ts.map +1 -1
  56. package/dist/moltzapd.js +19 -5
  57. package/dist/moltzapd.js.map +1 -1
  58. package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts +14 -14
  59. package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts.map +1 -1
  60. package/dist/notification/__tests__/subscribe-signatures.types-check.js +5 -5
  61. package/dist/notification/__tests__/subscribe-signatures.types-check.js.map +1 -1
  62. package/dist/service-local-daemon.d.ts +1 -1
  63. package/dist/service-local-daemon.d.ts.map +1 -1
  64. package/dist/service-local-daemon.js +2 -4
  65. package/dist/service-local-daemon.js.map +1 -1
  66. package/dist/service.d.ts +4 -25
  67. package/dist/service.d.ts.map +1 -1
  68. package/dist/service.js +7 -44
  69. package/dist/service.js.map +1 -1
  70. package/dist/test-utils/channel-service-fixture.d.ts +1 -3
  71. package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
  72. package/dist/test-utils/channel-service-fixture.js +2 -22
  73. package/dist/test-utils/channel-service-fixture.js.map +1 -1
  74. package/dist/test-utils/ids.d.ts +0 -13
  75. package/dist/test-utils/ids.d.ts.map +1 -1
  76. package/dist/test-utils/ids.js +1 -16
  77. package/dist/test-utils/ids.js.map +1 -1
  78. package/dist/test-utils/index.d.ts +1 -1
  79. package/dist/test-utils/index.d.ts.map +1 -1
  80. package/dist/test-utils/index.js +1 -1
  81. package/dist/test-utils/index.js.map +1 -1
  82. package/dist/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +8 -4
  84. package/dist/app-client.d.ts +0 -5
  85. package/dist/app-client.d.ts.map +0 -1
  86. package/dist/app-client.js +0 -3
  87. package/dist/app-client.js.map +0 -1
  88. package/dist/channel-base/lease-guard.d.ts +0 -31
  89. package/dist/channel-base/lease-guard.d.ts.map +0 -1
  90. package/dist/channel-base/lease-guard.js +0 -44
  91. package/dist/channel-base/lease-guard.js.map +0 -1
  92. package/dist/channel-base/lease-store.d.ts +0 -48
  93. package/dist/channel-base/lease-store.d.ts.map +0 -1
  94. package/dist/channel-base/lease-store.js +0 -77
  95. package/dist/channel-base/lease-store.js.map +0 -1
  96. package/dist/channel-base/lease.d.ts +0 -96
  97. package/dist/channel-base/lease.d.ts.map +0 -1
  98. package/dist/channel-base/lease.js +0 -106
  99. 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;AACnB,OAAO,EAAE,MAAM,EAAQ,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAOlD,UAAU,2BAA2B;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,mBAAmB,EAAE,cAAc,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAkJD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,YAC7B,2BAA2B,KACnC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAShD,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
- return (request, response) => {
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).catch((error) => {
48
- response.destroy(error instanceof Error ? error : undefined);
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 server = createServer(makeHarnessMcpRequestListener(options.registrationHandler, options.harnessHandler));
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(server));
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 close = (server) => Effect.async((resume) => {
78
- if (!server.listening) {
79
- resume(Effect.succeed(undefined));
80
- return;
81
- }
82
- server.close((error) => {
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 = (server, options) => closeHandlers(options).pipe(Effect.zipRight(close(server)));
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))), (server) => release(server, 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":"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"}
1
+ {"version":3,"file":"harness-mcp-server.js","sourceRoot":"","sources":["../src/harness-mcp-server.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA,oOAAoO;AACpO,OAAO,EACL,4BAA4B,EAC5B,oCAAoC,EACpC,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,GAKlB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAE5B,+EAA+E;AAC/E,sEAAsE;AACtE,8EAA8E;AAC9E,aAAa;AACb,MAAM,2BAA2B,GAAG,sBAAsB,CAAC;AAC3D,MAAM,uCAAuC,GAC3C,0CAA0C,CAAC;AAC7C,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAC7C,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC;AAC9B,MAAM,mBAAmB,GAAG,CAAC,KAAK,CAAC;AACnC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,SAAS,GAAG,GAAG,CAAC;AAqCtB,MAAM,YAAY,GAAG,CAAC,KAAc,EAAuB,EAAE,CAC3D,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,YAAY,GAAG,CAAC,EACpB,MAAM,EACN,EAAE,EACF,IAAI,EACJ,OAAO,EACP,IAAI,GACgB,EAAY,EAAE,CAClC,QAAQ,CAAC,IAAI,CACX;IACE,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE;QACL,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;KACxC;IACD,EAAE;CACH,EACD,EAAE,MAAM,EAAE,CACX,CAAC;AAEJ,kHAAkH;AAClH,MAAM,eAAe,GAAG,KAAK,EAC3B,OAAgB,EAChB,OAAkC,EAEhB,EAAE;IACpB,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,UAAU,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,OAAO;SACjB,KAAK,EAAE;SACP,IAAI,EAAE;SACN,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAE,IAAa,EAAE,EAAE;IAC9D,MAAM,OAAO,GAAG,sBAAsB,CAAC;QACrC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;QACxC,qBAAqB,EACnB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,SAAS;QAC1D,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS;QAC/D,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,SAAS;QAC3D,IAAI;KACL,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,OAAO,CAAC,cAAc,CAAC,QAAQ,KAAK,uBAAuB;QAC3D,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,2BAA2B,EACtD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,MAAkB,EAAW,EAAE;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACxD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,OAAgB,EAChB,IAAa,EACoB,EAAE;IACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;IACnD,MAAM,gBAAgB,GAAG,YAAY,CAAC,aAAa,CAAC;QAClD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC,CAAC,EAAE,CAAC;IACP,IACE,CAAC,YAAY,CAAC,aAAa,CAAC;QAC5B,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAC7B,gBAAgB,CAAC,CAAC,CAAC,KAAK,yBAAyB;QACjD,aAAa,CAAC,yBAAyB,CAAC,KAAK,IAAI,EACjD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,qBAAqB,EAAE,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC;KAClE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAW,EAAE,CAClD,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM;IACvC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,2BAA2B,CAAC;AAEpE,MAAM,2BAA2B;IACd,QAAQ,CAAiB;IACzB,cAAc,CAAiB;IAC/B,OAAO,CAA0B;IACjC,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IACrC,MAAM,CAAsB;IAC5B,MAAM,GAAG,KAAK,CAAC;IACf,YAAY,CAAiB,CAAC,6EAA6E;IAEnH,YAAY,OAAsC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,wFAAwF;IAC/E,KAAK,GAA4B,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACnE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,OAAO,KAAK,SAAS;gBAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;gBACpC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,IAAI,GACR,OAAO,KAAK,SAAS;YACnB,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC;YAChC,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,OAAO,KAAK,SAAS;gBAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;gBACpC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEO,OAAO,GAAG,CAAC,OAAgB,EAAW,EAAE;QAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;YAClD,OAAO,EAAE,gBAAgB;YACzB,MAAM,EAAE,+BAA+B;YACvC,MAAM,EAAE;gBACN,GAAG,OAAO;gBACV,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,YAAY,CAAC,EAAE,EAAE;aACvD;SACF,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,uFAAuF;IAC9E,KAAK,GAAG,GAAkB,EAAE;QACnC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC,CAAC;IAEF,SAAS;QACP,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;SACvB,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,cAAc,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CACX,gDAAgD,EAChD,cAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,YAAgC,EAChC,OAAmB;QAEnB,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;YACrD,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,YAAgC,EAAE,QAAiB;QAClE,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;QAC3B,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,EAAa;QACnC,OAAO;YACL,OAAO,EAAE,gBAAgB;YACzB,EAAE;YACF,MAAM,EAAE;gBACN,UAAU,EAAE,UAAU;gBACtB,KAAK,EAAE;oBACL,CAAC,wBAAwB,CAAC,EAAE,EAAE;oBAC9B,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,cAAc;iBAC5C;aACF;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CACX,OAAgB,EAChB,aAAkC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,YAAY,GAAuB;YACvC,EAAE,EAAE,aAAa,CAAC,EAAE;YACpB,MAAM,EAAE,KAAK;SACd,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,YAAY,CAAC;gBAClB,MAAM,EAAE,qBAAqB;gBAC7B,EAAE,EAAE,aAAa,CAAC,EAAE;gBACpB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE;YAC5B,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU;gBAC3B,UAAU,EAAE,YAAY;gBACxB,cAAc,EAAE,mBAAmB;gBACnC,mBAAmB,EAAE,IAAI;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CACtB,aAAkC;QAElC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,oCAAoC,CAAC;gBACrD,oBAAoB,EAAE;oBACpB,UAAU,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,EAAE;iBAC/C;aACF,CAAC,CAAC;YACH,OAAO,YAAY,CAAC;gBAClB,MAAM,EAAE,kBAAkB;gBAC1B,EAAE,EAAE,aAAa,CAAC,EAAE;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS;YAC9B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,YAAY,CAAC;gBACX,MAAM,EAAE,eAAe;gBACvB,EAAE,EAAE,aAAa,CAAC,EAAE;gBACpB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,wCAAwC;gBACjD,IAAI,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;aACtC,CAAC,CAAC;IACT,CAAC;IAEO,YAAY,CAClB,OAAgB,EAChB,YAAgC;QAEhC,IAAI,CAAC;YACH,OAAO,IAAI,cAAc,CAAa;gBACpC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;oBACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;gBAChD,CAAC;gBACD,MAAM,EAAE,GAAG,EAAE;oBACX,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,KAAK,CACX,OAAgB,EAChB,YAAgC,EAChC,UAAuD;QAEvD,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,YAAY,CAAC,YAAY,GAAG,GAAG,EAAE;YAC/B,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,EAAa;QAC9B,OAAO;YACL,OAAO,EAAE,gBAAgB;YACzB,MAAM,EAAE,uCAAuC;YAC/C,MAAM,EAAE;gBACN,aAAa,EAAE,EAAE,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE;gBACpD,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,EAAE;aAC1C;SACF,CAAC;IACJ,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,OAAsC,EACE,EAAE,CAC1C,IAAI,2BAA2B,CAAU,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;AAEhE,gMAAgM"}
@@ -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: McpHttpHandler;
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;AAItC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAM/B,KAAK,aAAa,GAAG,mBAAmB,CAAC,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAE5E,UAAU,wBAAwB;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAmDD;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,gCAGpC,wBAAwB,KAAG;IAC5B,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CAQhC,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"}