holon-sh 0.0.1-dev.15 → 0.0.1-dev.17

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 (48) hide show
  1. package/README.md +32 -0
  2. package/dist/context.d.ts +7 -7
  3. package/dist/context.d.ts.map +1 -1
  4. package/dist/context.js +11 -5
  5. package/dist/context.js.map +1 -1
  6. package/dist/ext/events.client.d.ts +4 -0
  7. package/dist/ext/events.client.d.ts.map +1 -0
  8. package/dist/ext/events.client.js +180 -0
  9. package/dist/ext/events.client.js.map +1 -0
  10. package/dist/ext/events.d.ts +6 -12
  11. package/dist/ext/events.d.ts.map +1 -1
  12. package/dist/ext/events.js +30 -51
  13. package/dist/ext/events.js.map +1 -1
  14. package/dist/ext/files.client.d.ts +2 -3
  15. package/dist/ext/files.client.d.ts.map +1 -1
  16. package/dist/ext/files.client.js +20 -22
  17. package/dist/ext/files.client.js.map +1 -1
  18. package/dist/ext/files.d.ts +1 -1
  19. package/dist/ext/files.d.ts.map +1 -1
  20. package/dist/link.d.ts +35 -0
  21. package/dist/link.d.ts.map +1 -0
  22. package/dist/link.js +118 -0
  23. package/dist/link.js.map +1 -0
  24. package/dist/page.d.ts +24 -0
  25. package/dist/page.d.ts.map +1 -0
  26. package/dist/page.js +25 -0
  27. package/dist/page.js.map +1 -0
  28. package/dist/protocol.d.ts +6 -7
  29. package/dist/protocol.d.ts.map +1 -1
  30. package/dist/protocol.js +0 -1
  31. package/dist/protocol.js.map +1 -1
  32. package/dist/runtime.d.ts +0 -1
  33. package/dist/runtime.d.ts.map +1 -1
  34. package/dist/runtime.js +129 -409
  35. package/dist/runtime.js.map +1 -1
  36. package/dist/serve.js +0 -5
  37. package/dist/serve.js.map +1 -1
  38. package/package.json +8 -1
  39. package/src/context.ts +17 -7
  40. package/src/ext/events.client.ts +157 -0
  41. package/src/ext/events.ts +41 -83
  42. package/src/ext/files.client.ts +21 -20
  43. package/src/ext/files.ts +1 -1
  44. package/src/link.ts +136 -0
  45. package/src/page.ts +36 -0
  46. package/src/protocol.ts +6 -9
  47. package/src/runtime.ts +120 -379
  48. package/src/serve.ts +0 -3
package/README.md CHANGED
@@ -134,6 +134,38 @@ await serve(await import("./server.ts"));
134
134
 
135
135
  The MCP endpoint is at `/mcp` and `/mcp/<app>`, and the files of `frontend` are at every other path. `PORT` and `HOST` change where it listens, 127.0.0.1:3000 unless they are set. Holon answers clients of the 2025 MCP versions in front of an app, and here the app's handler answers them, so create it without `legacy: "reject"`.
136
136
 
137
+ ## The caller and the origin
138
+
139
+ `getContext` reads who called a tool, and where the app was reached, so a link the app makes works wherever it runs:
140
+
141
+ ```ts
142
+ import { getContext } from "holon-sh/context";
143
+
144
+ server.registerTool("share", { description: "Links to the page" }, ctx => {
145
+ const { principal, origin } = getContext(ctx.http);
146
+ return { content: [{ type: "text", text: `${origin}/?by=${principal?.subject}` }] };
147
+ });
148
+ ```
149
+
150
+ `principal` is the user Holon admitted, or null. `origin` is the one Holon or a proxy forwards, or else the one the request reached.
151
+
152
+ ## A page in MCP Apps hosts
153
+
154
+ `holon-sh/page` offers an app's page, built as one HTML file, as the view an MCP Apps host shows with a tool's result:
155
+
156
+ ```ts
157
+ import { createPage } from "holon-sh/page";
158
+
159
+ const page = createPage(new URL("./dist/mcp/index.html", import.meta.url));
160
+
161
+ function createServer() {
162
+ const server = new McpServer({ name: "foo", version: "0.1.0" });
163
+ server.registerTool("open", { description: "Opens the page", _meta: page.meta }, open);
164
+ page.serve(server);
165
+ return server;
166
+ }
167
+ ```
168
+
137
169
  ## Community
138
170
 
139
171
  Ask questions and share what you're building on the [Holon Discord](https://discord.gg/jXExyBdy).
package/dist/context.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { AuthInfo } from "@modelcontextprotocol/client";
1
2
  /** Standard OpenID Connect address claims. */
2
3
  export interface AddressClaims {
3
4
  formatted?: string;
@@ -40,16 +41,15 @@ export interface Principal {
40
41
  claims: IdentityClaims;
41
42
  actor?: Record<string, unknown>;
42
43
  }
43
- /** The caller of the current MCP request. principal is null for anonymous requests. */
44
+ /** The caller of the current MCP request, and the origin it reached the app at. principal is null for anonymous requests, and origin without HTTP. */
44
45
  export interface RequestContext {
45
46
  principal: Principal | null;
47
+ origin: string | null;
46
48
  }
47
- /** Read the caller from the context an MCP server receives: a tool callback's ctx.http, or the McpRequestContext of a createMcpHandler factory. */
49
+ /** Read the caller and the app's origin from the context an MCP server receives: a tool callback's ctx.http, or the McpRequestContext of a createMcpHandler factory. */
48
50
  export declare function getContext(context?: {
49
- authInfo?: {
50
- clientId: string;
51
- scopes: string[];
52
- extra?: Record<string, unknown>;
53
- };
51
+ authInfo?: Pick<AuthInfo, "clientId" | "scopes" | "extra">;
52
+ req?: Request;
53
+ requestInfo?: Request;
54
54
  }): RequestContext;
55
55
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IACxH,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AACD,yHAAyH;AACzH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAClG,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IACrG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AACD,yDAAyD;AACzD,MAAM,WAAW,SAAS;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AAC3J,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAAG,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE;AAM/D,mJAAmJ;AACnJ,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAO,GAAG,cAAc,CAK/I"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IACxH,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AACD,yHAAyH;AACzH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAClG,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IACrG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AACD,yDAAyD;AACzD,MAAM,WAAW,SAAS;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AAC3J,sJAAsJ;AACtJ,MAAM,WAAW,cAAc;IAAG,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAMtF,wKAAwK;AACxK,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,cAAc,CAM7J"}
package/dist/context.js CHANGED
@@ -1,9 +1,15 @@
1
- /** Read the caller from the context an MCP server receives: a tool callback's ctx.http, or the McpRequestContext of a createMcpHandler factory. */
1
+ /** Read the caller and the app's origin from the context an MCP server receives: a tool callback's ctx.http, or the McpRequestContext of a createMcpHandler factory. */
2
2
  export function getContext(context = {}) {
3
- const { authInfo } = context;
3
+ const { authInfo, req = context.requestInfo } = context;
4
4
  const { iss, sub, claims, act } = (authInfo?.extra ?? {});
5
- if (!authInfo || typeof iss !== "string" || typeof sub !== "string")
6
- return { principal: null };
7
- return { principal: { issuer: iss, subject: sub, clientId: authInfo.clientId, scopes: authInfo.scopes, claims: claims ?? {}, ...(act && { actor: act }) } };
5
+ const principal = !authInfo || typeof iss !== "string" || typeof sub !== "string" ? null
6
+ : { issuer: iss, subject: sub, clientId: authInfo.clientId, scopes: authInfo.scopes, claims: claims ?? {}, ...(act && { actor: act }) };
7
+ return { principal, origin: req ? origin(req) : null };
8
+ }
9
+ // Holon forwards the origin it serves the app at, as a proxy in front may. Otherwise the request reached the app where it
10
+ // listens.
11
+ function origin({ url, headers }) {
12
+ const { protocol, host } = new URL(url);
13
+ return `${headers.get("x-forwarded-proto") ?? protocol.slice(0, -1)}://${headers.get("x-forwarded-host") ?? host}`;
8
14
  }
9
15
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAsBA,mJAAmJ;AACnJ,MAAM,UAAU,UAAU,CAAC,OAAO,GAA2F,EAAE;IAC7H,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAa,CAAC;IACtE,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChG,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC9J,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAwBA,wKAAwK;AACxK,MAAM,UAAU,UAAU,CAAC,OAAO,GAAyG,EAAE;IAC3I,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAa,CAAC;IACtE,MAAM,SAAS,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI;QACtF,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC1I,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,0HAA0H;AAC1H,WAAW;AACX,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAW;IACvC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC;AACrH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Link } from "../link.js";
2
+ import type { Contract, RuntimeClient } from "../runtime.js";
3
+ export declare function events(link: Link, contract: Contract | null, expect: (schema: object, label: string) => (value: unknown) => void): RuntimeClient["ext"]["events"];
4
+ //# sourceMappingURL=events.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.client.d.ts","sourceRoot":"","sources":["../../src/ext/events.client.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2C,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAW7D,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CA4IjK"}
@@ -0,0 +1,180 @@
1
+ import { patient, sleep, unchecked, untilAborted } from "../link.js";
2
+ // A stream that has said nothing for twice the longest heartbeat interval is dead: https://github.com/modelcontextprotocol/experimental-ext-triggers-events/blob/main/docs/design-sketch-proposal.md#lifecycle
3
+ const QUIET = 60_000;
4
+ // A server's refusal ends a subscription: a client error, or an answer that the event type is gone, that access was
5
+ // lost, or that the request is no longer valid. Anything else is tried again from the cursor.
6
+ const refused = (error) => error?.status >= 400 && error.status < 500 || error?.data?.status >= 400 && error.data.status < 500 || [-32602, -32023, -32024, -32026].includes(error?.code);
7
+ export function events(link, contract, expect) {
8
+ const { name } = link;
9
+ const connected = (options, run) => link.session(options, (_, connection) => {
10
+ if (!connection)
11
+ throw new Error(`MCP Events of ${name} require an endpoint binding.`);
12
+ return run(connection.client);
13
+ });
14
+ const list = (options) => connected(options, async (client) => {
15
+ const events = [];
16
+ for (let cursor;;) {
17
+ const page = await client.request({ method: "events/list", params: { ...(cursor && { cursor }) } }, unchecked(), patient(options));
18
+ events.push(...page.events ?? []);
19
+ if (!(cursor = page.nextCursor))
20
+ return events;
21
+ }
22
+ });
23
+ const subscribe = async (event, args = {}, { signal, onGap, maxAgeMs, ...options } = {}) => {
24
+ const resolved = link.endpoint(`Subscribing to ${name} ${event}`);
25
+ const offered = (await list(signal && { signal })).find(type => type.name === event)?.delivery;
26
+ if (!offered)
27
+ throw new Error(`${name} has no event ${event}.`);
28
+ const delivery = options.delivery ?? ["push", "poll"].find(mode => offered.includes(mode));
29
+ // The sketch's NoCompatibleDeliveryMode: none of the modes the server offers is one this client uses.
30
+ if (!delivery || !offered.includes(delivery))
31
+ throw Object.assign(new Error(`${name} does not deliver ${event} by ${delivery ?? "poll or push"}.`), { name: "NoCompatibleDeliveryMode" });
32
+ const cancelled = new AbortController();
33
+ const ended = signal ? AbortSignal.any([signal, cancelled.signal]) : cancelled.signal;
34
+ let cursor = options.cursor ?? null;
35
+ const queue = [];
36
+ const seen = new Set();
37
+ let wake = () => { };
38
+ let done = false;
39
+ let failure;
40
+ const reach = (next, truncated) => {
41
+ cursor = next ?? null;
42
+ if (truncated)
43
+ onGap?.();
44
+ };
45
+ const expected = contract?.events?.find(type => type.name === event)?.payloadSchema;
46
+ const check = expected && expect(expected, `data of ${name} ${event}`);
47
+ const deliver = ({ cursor: _, _meta, ...occurrence }) => {
48
+ if (seen.has(occurrence.eventId))
49
+ return;
50
+ seen.add(occurrence.eventId);
51
+ if (seen.size > 1024)
52
+ seen.delete(seen.values().next().value);
53
+ check?.(occurrence.data);
54
+ queue.push(occurrence);
55
+ wake();
56
+ };
57
+ const request = { name: event, arguments: args, ...(maxAgeMs !== undefined && { maxAgeMs }) };
58
+ let confirmed = false;
59
+ const established = Promise.withResolvers();
60
+ const confirm = () => { confirmed = true; established.resolve(); };
61
+ const poll = async () => {
62
+ while (!ended.aborted) {
63
+ let wait = 1000;
64
+ try {
65
+ const result = await connected({ signal: ended }, client => client.request({ method: "events/poll", params: { ...request, cursor } }, unchecked(), patient({ signal: ended })));
66
+ try {
67
+ for (const occurrence of result.events ?? [])
68
+ deliver(occurrence);
69
+ }
70
+ catch (error) {
71
+ failure = error;
72
+ return cancelled.abort();
73
+ }
74
+ reach(result.cursor, result.truncated);
75
+ confirm();
76
+ // A server that asks for a tight loop is not obeyed.
77
+ wait = result.hasMore ? 0 : Math.max(1000, result.nextPollMs ?? 0);
78
+ }
79
+ catch (error) {
80
+ if (ended.aborted)
81
+ return;
82
+ if (!confirmed || refused(error))
83
+ throw error;
84
+ }
85
+ await sleep(wait, ended);
86
+ }
87
+ };
88
+ const stream = async () => {
89
+ while (!ended.aborted) {
90
+ let wait = 1000;
91
+ const quiet = new AbortController();
92
+ // The MCP client keeps waiting for the answer of a request whose stream has ended, so the end is watched for here.
93
+ // Only the stream's own response is watched: a 2025 server answers its initialization as a stream too.
94
+ const watched = async (input, init) => {
95
+ const response = await (resolved.fetch ?? fetch)(input, init);
96
+ const streaming = typeof init?.body === "string" && init.body.includes('"method":"events/stream"');
97
+ if (!streaming || !response.body || !response.headers.get("content-type")?.startsWith("text/event-stream"))
98
+ return response;
99
+ const reader = response.body.getReader();
100
+ const body = new ReadableStream({
101
+ pull: controller => reader.read().then(({ done, value }) => {
102
+ if (!done)
103
+ return controller.enqueue(value);
104
+ controller.close();
105
+ // The answer, when the stream ended with one, is handled first.
106
+ setTimeout(() => quiet.abort());
107
+ }, error => { controller.error(error); quiet.abort(); }),
108
+ cancel: reason => reader.cancel(reason),
109
+ });
110
+ return new Response(body, response);
111
+ };
112
+ // Each stream has its own connection, so every event notification on it is this subscription's.
113
+ const connection = link.connect({ ...resolved, fetch: watched });
114
+ let timer;
115
+ const heard = () => {
116
+ clearTimeout(timer);
117
+ timer = setTimeout(() => quiet.abort(), QUIET);
118
+ };
119
+ let terminated;
120
+ try {
121
+ await untilAborted(connection.ready, ended);
122
+ const on = (method, handle) => connection.client.setNotificationHandler(`notifications/events/${method}`, { params: unchecked() }, params => { heard(); handle(params); });
123
+ on("active", ({ cursor: next, truncated }) => { reach(next, truncated); confirm(); });
124
+ on("event", occurrence => {
125
+ wait = 0;
126
+ try {
127
+ deliver(occurrence);
128
+ }
129
+ catch (error) {
130
+ failure = error;
131
+ return cancelled.abort();
132
+ }
133
+ reach(occurrence.cursor);
134
+ });
135
+ on("heartbeat", ({ cursor: next }) => reach(next));
136
+ // The server recovers from an error by itself, and the stream stays open.
137
+ on("error", () => { });
138
+ on("terminated", ({ error }) => { terminated = error; quiet.abort(); });
139
+ heard();
140
+ await connection.client.request({ method: "events/stream", params: { ...request, cursor } }, unchecked(), { signal: AbortSignal.any([ended, quiet.signal]), timeout: 2 ** 31 - 1 });
141
+ }
142
+ catch (error) {
143
+ if (!terminated && !ended.aborted && (!confirmed || refused(error)))
144
+ throw error;
145
+ }
146
+ finally {
147
+ clearTimeout(timer);
148
+ await connection.close();
149
+ }
150
+ if (terminated)
151
+ throw Object.assign(new Error(`${name} ended the subscription to ${event}: ${terminated.message}`), { code: terminated.code, data: terminated.data });
152
+ await sleep(wait, ended);
153
+ }
154
+ };
155
+ void (delivery === "push" ? stream() : poll())
156
+ .catch(error => { failure ??= error; })
157
+ .finally(() => { done = true; wake(); established.reject(failure ?? ended.reason); });
158
+ await established.promise;
159
+ return {
160
+ delivery,
161
+ get cursor() { return cursor; },
162
+ cancel: () => cancelled.abort(),
163
+ [Symbol.asyncIterator]: () => ({
164
+ next: async () => {
165
+ while (!queue.length && !done)
166
+ await new Promise(resolve => { wake = resolve; });
167
+ const value = queue.shift();
168
+ if (value)
169
+ return { value, done: false };
170
+ if (failure)
171
+ throw failure;
172
+ return { value: undefined, done: true };
173
+ },
174
+ return: async () => { cancelled.abort(); return { value: undefined, done: true }; },
175
+ }),
176
+ };
177
+ };
178
+ return Object.freeze({ list, subscribe: subscribe });
179
+ }
180
+ //# sourceMappingURL=events.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.client.js","sourceRoot":"","sources":["../../src/ext/events.client.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- import type { AuthInfo, JSONRPCErrorResponse, McpServer, Server, StandardSchemaWithJSON } from "@modelcontextprotocol/server";
1
+ import type { JSONRPCErrorResponse, McpServer, Server, ServerContext, StandardSchemaWithJSON } from "@modelcontextprotocol/server";
2
+ import type { EventOccurrence as Occurrence } from "../protocol.js";
2
3
  /** The request a subscription came in, as Holon admitted it: read its caller with getContext. */
3
- export type SubscriptionContext = {
4
- authInfo?: AuthInfo | undefined;
5
- } | undefined;
4
+ export type SubscriptionContext = ServerContext["http"];
6
5
  /** How a subscription receives its events. */
7
6
  export type DeliveryModeName = "poll" | "push";
8
7
  /** A JSON-RPC error, as a subscription that is terminated or fails is told it. */
@@ -24,14 +23,9 @@ export interface Subscription<A> {
24
23
  readonly context: SubscriptionContext;
25
24
  }
26
25
  /** An occurrence as subscriptions receive it: the sketch's EventOccurrence. `cursor` is the position after it. */
27
- export interface EventOccurrence<D = unknown> {
28
- eventId: string;
29
- name: string;
30
- /** When it happened, in ISO 8601. */
31
- timestamp: string;
32
- data: D;
26
+ export type EventOccurrence<D = unknown> = Occurrence<D> & {
33
27
  cursor?: string;
34
- }
28
+ };
35
29
  /** An event type: the arguments a subscription gives, and the data each occurrence carries. */
36
30
  export interface EventDefinition<A, D> {
37
31
  description?: string;
@@ -51,7 +45,7 @@ export interface EventDefinition<A, D> {
51
45
  /** The data a subscription with these arguments receives of an emitted event. Without it, the data as emitted. */
52
46
  transform?: (data: D, args: A, context: SubscriptionContext) => unknown;
53
47
  /** The delivery modes this event type offers: poll and push unless given. */
54
- delivery?: DeliveryModeName[];
48
+ delivery?: [DeliveryModeName, ...DeliveryModeName[]];
55
49
  /**
56
50
  * Whether the caller may subscribe with these arguments. A subscription is refused with Forbidden when it may not,
57
51
  * and one already open is ended when it no longer may: each poll asks, and a stream asks at each heartbeat. A
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/ext/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/ext/events.ts"],"names":[],"mappings":"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"}