@classcad/mcp 0.2.2 → 0.3.1

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 (72) hide show
  1. package/README.md +128 -87
  2. package/dist/app/SOURCE.txt +4 -0
  3. package/dist/app/assets/index-54a14bc0.css +8 -0
  4. package/dist/app/assets/index-c650c783.js +11257 -0
  5. package/dist/app/assets/troika-three-text.esm-188d86b5.js +220 -0
  6. package/dist/app/favicon.svg +98 -0
  7. package/dist/app/index.html +19 -0
  8. package/dist/app/manifest.json +14 -0
  9. package/dist/auth.d.ts +8 -0
  10. package/dist/auth.js +49 -10
  11. package/dist/auth.js.map +1 -1
  12. package/dist/backend.d.ts +8 -0
  13. package/dist/backend.js +39 -0
  14. package/dist/backend.js.map +1 -0
  15. package/dist/client.d.ts +48 -11
  16. package/dist/client.js +152 -167
  17. package/dist/client.js.map +1 -1
  18. package/dist/daemon.d.ts +0 -2
  19. package/dist/daemon.js +77 -62
  20. package/dist/daemon.js.map +1 -1
  21. package/dist/engine/key.d.ts +29 -0
  22. package/dist/engine/key.js +145 -0
  23. package/dist/engine/key.js.map +1 -0
  24. package/dist/engine/wasm-worker.js +7 -7
  25. package/dist/engine/wasm-worker.js.map +1 -1
  26. package/dist/engine/wasm.d.ts +16 -14
  27. package/dist/engine/wasm.js +22 -30
  28. package/dist/engine/wasm.js.map +1 -1
  29. package/dist/mcp-server.d.ts +4 -4
  30. package/dist/mcp-server.js +72 -28
  31. package/dist/mcp-server.js.map +1 -1
  32. package/dist/queue.js +1 -1
  33. package/dist/queue.js.map +1 -1
  34. package/dist/server.js +69 -36
  35. package/dist/server.js.map +1 -1
  36. package/dist/share/hub.d.ts +70 -0
  37. package/dist/share/hub.js +494 -0
  38. package/dist/share/hub.js.map +1 -0
  39. package/dist/share/protocol.d.ts +87 -0
  40. package/dist/share/protocol.js +54 -0
  41. package/dist/share/protocol.js.map +1 -0
  42. package/dist/share/relay.d.ts +45 -0
  43. package/dist/share/relay.js +230 -0
  44. package/dist/share/relay.js.map +1 -0
  45. package/dist/share/server.d.ts +27 -0
  46. package/dist/share/server.js +399 -0
  47. package/dist/share/server.js.map +1 -0
  48. package/dist/share/session.d.ts +120 -0
  49. package/dist/share/session.js +336 -0
  50. package/dist/share/session.js.map +1 -0
  51. package/dist/tools/auth.js +1 -1
  52. package/dist/tools/auth.js.map +1 -1
  53. package/dist/tools/docs.js +3 -2
  54. package/dist/tools/docs.js.map +1 -1
  55. package/dist/tools/lifecycle.js +36 -9
  56. package/dist/tools/lifecycle.js.map +1 -1
  57. package/dist/tools/share.d.ts +18 -0
  58. package/dist/tools/share.js +277 -0
  59. package/dist/tools/share.js.map +1 -0
  60. package/dist/tools/viewer.d.ts +1 -1
  61. package/dist/tools/viewer.js +11 -6
  62. package/dist/tools/viewer.js.map +1 -1
  63. package/package.json +4 -3
  64. package/dist/bridge/protocol.d.ts +0 -87
  65. package/dist/bridge/protocol.js +0 -14
  66. package/dist/bridge/protocol.js.map +0 -1
  67. package/dist/bridge/server.d.ts +0 -35
  68. package/dist/bridge/server.js +0 -236
  69. package/dist/bridge/server.js.map +0 -1
  70. package/dist/tools/bridge.d.ts +0 -4
  71. package/dist/tools/bridge.js +0 -115
  72. package/dist/tools/bridge.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/share/hub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /** What an invite lets its guest do. Advisory: the clients honour it, the engine does not check. */
2
+ export type Role = 'edit' | 'view';
3
+ /** A frame of the session protocol that answers no request. */
4
+ export type SessionFrame = {
5
+ command: string;
6
+ [key: string]: any;
7
+ };
8
+ /** A presence frame: what one participant (`peerId`) says on a channel, relayed to everyone else in the session. */
9
+ export type PresenceFrame = {
10
+ command: 'Presence';
11
+ channel: string;
12
+ peerId: string;
13
+ data: Record<string, any>;
14
+ };
15
+ /** Largest presence frame a server relays; larger ones are dropped without a word. The hub does the same. */
16
+ export declare const PRESENCE_MAX_BYTES: number;
17
+ /** Channels only the host may publish on. */
18
+ export declare const HOST_CHANNELS: Set<string>;
19
+ /** The channel only the server writes: a participant is gone. */
20
+ export declare const SERVER_CHANNELS: Set<string>;
21
+ export declare const CLIENT_CHANNEL = "client";
22
+ export declare const SELECTION_CHANNEL = "selection";
23
+ export declare const SELECT_CHANNEL = "select";
24
+ /** What a participant says about itself on the 'client' channel. */
25
+ export type ClientIdentity = {
26
+ /** The program: 'buerligons', 'classcad-mcp', … */
27
+ app: string;
28
+ version?: string;
29
+ /** A name to show for this participant ("Claude Code"). */
30
+ name?: string;
31
+ /** 'agent' for an AI agent's session, 'app' for a person at an app. */
32
+ kind?: 'app' | 'agent';
33
+ };
34
+ /**
35
+ * One selected thing, as published on the 'selection' channel: a face, edge or
36
+ * vertex of a body, or an object of the model tree (a sketch entity, a
37
+ * dimension, a feature). The ids are the engine's own.
38
+ */
39
+ export type SelectionItem = {
40
+ kind: 'face' | 'edge' | 'vertex' | 'object';
41
+ /** The model tree object: the picked object itself, or the owner of the picked geometry (a solid). */
42
+ objectId: number;
43
+ /** The product or assembly instance the pick was made in. */
44
+ prodRefId?: number | null;
45
+ /** Geometry: the body's graphic container. It is replaced whenever the body is rebuilt. */
46
+ containerId?: number;
47
+ /** Geometry: the element in the container. This is the id API calls take for a face, an edge or a vertex. */
48
+ graphicId?: number;
49
+ /** Geometry: the element's type (plane, cylinder, line, arc, …). Objects: their class. */
50
+ type?: string;
51
+ /** Objects: their name in the model tree. */
52
+ name?: string;
53
+ };
54
+ /** The 'selection' channel's payload. `total` counts the whole selection; `items` may be cut to fit a presence frame. */
55
+ export type SelectionFrame = {
56
+ items: SelectionItem[];
57
+ total: number;
58
+ };
59
+ /** What a 'select' request names: a tree object by its id, or geometry by its element id (and container, when known). */
60
+ export type SelectTarget = {
61
+ objectId?: number;
62
+ prodRefId?: number | null;
63
+ containerId?: number;
64
+ graphicId?: number;
65
+ };
66
+ /**
67
+ * The 'select' channel's payload. A request carries the items; right after it
68
+ * the sender publishes `{ id, done: true }`, so that the frame a server keeps
69
+ * for late joiners asks for nothing.
70
+ */
71
+ export type SelectFrame = {
72
+ id: string;
73
+ items?: SelectTarget[];
74
+ replace?: boolean;
75
+ done?: boolean;
76
+ };
77
+ /** A participant other than this MCP session, as far as it is known here. */
78
+ export type Peer = {
79
+ peerId: string;
80
+ /** Known when this session is the host: the invite the guest joined with. */
81
+ invite?: string;
82
+ inviteName?: string;
83
+ role?: Role;
84
+ identity?: ClientIdentity;
85
+ };
86
+ /** The emission config a fresh connection has on a server: full content, bundled on the Result. */
87
+ export declare const DEFAULT_EMISSION: Record<string, boolean | number>;
@@ -0,0 +1,54 @@
1
+ // share/protocol.ts — the session protocol, as far as the MCP names it.
2
+ //
3
+ // A ClassCAD server (Drogon) shares a session by invite: the host mints
4
+ // tokens, guests connect with ?invite=<token>, the server fans every
5
+ // command's frames out to everyone in the session and relays presence. The
6
+ // specification is SessionSharing.md in the ClassCAD sources
7
+ // (runtime/Source/NetworkService/docs); buerli's WSClient is the client side.
8
+ // share/hub.ts speaks the server's part for the MCP's own engine.
9
+ //
10
+ // On top of the server's protocol sit presence channels the buerli packages
11
+ // define (@buerli.io/classcad: session/selection.ts and session/identity.ts;
12
+ // @buerli.io/react-cad: session/sessionClient.ts) and the MCP speaks too.
13
+ // Presence needs nothing from the server but its fan-out, so they work the
14
+ // same on a server and on the hub:
15
+ // client who a participant is: the app, its version, a name to show
16
+ // selection what a participant has selected, published whenever it changes
17
+ // select a request to the others to select something (an agent pointing)
18
+ // config a host's word on what its guests are offered (host only). The
19
+ // MCP's own sessions offer everything an app can do, and say nothing.
20
+ /** Largest presence frame a server relays; larger ones are dropped without a word. The hub does the same. */
21
+ export const PRESENCE_MAX_BYTES = 8 * 1024;
22
+ /** Channels only the host may publish on. */
23
+ export const HOST_CHANNELS = new Set(['config']);
24
+ /** The channel only the server writes: a participant is gone. */
25
+ export const SERVER_CHANNELS = new Set(['leave']);
26
+ // The channels this MCP speaks on, by name.
27
+ export const CLIENT_CHANNEL = 'client';
28
+ export const SELECTION_CHANNEL = 'selection';
29
+ export const SELECT_CHANNEL = 'select';
30
+ /** The emission config a fresh connection has on a server: full content, bundled on the Result. */
31
+ export const DEFAULT_EMISSION = {
32
+ sendStructure: true,
33
+ sendStructure_Patch: false,
34
+ sendStructure_Compressed: false,
35
+ sendStructure_Immediately: false,
36
+ sendStructure_ImmediatelyBinary: false,
37
+ sendGraphic_Kernel: true,
38
+ sendGraphic_StructureObj: true,
39
+ sendGraphic_Sketch: true,
40
+ sendGraphic_Invisible: true,
41
+ sendGraphic_Compressed: false,
42
+ sendGraphic_Immediately: false,
43
+ sendGraphic_ImmediatelyBinary: false,
44
+ sendGraphic_Multipackage: false,
45
+ sendGraphic_UseDraco: false,
46
+ sendGraphic_UseDracoHybrid: false,
47
+ sendGraphic_AdvancedNotifications: false,
48
+ sendMessages: true,
49
+ sendMessages_Immediately: false,
50
+ sendMessages_MinLevel: 31,
51
+ storeState: false,
52
+ safeApi: false,
53
+ };
54
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/share/protocol.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,wEAAwE;AACxE,qEAAqE;AACrE,2EAA2E;AAC3E,6DAA6D;AAC7D,8EAA8E;AAC9E,kEAAkE;AAClE,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,0EAA0E;AAC1E,2EAA2E;AAC3E,mCAAmC;AACnC,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAC7E,mFAAmF;AAWnF,6GAA6G;AAC7G,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAA;AAE1C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;AAChD,iEAAiE;AACjE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;AAEjD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAA;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAA;AAyDtC,mGAAmG;AACnG,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,aAAa,EAAE,IAAI;IACnB,mBAAmB,EAAE,KAAK;IAC1B,wBAAwB,EAAE,KAAK;IAC/B,yBAAyB,EAAE,KAAK;IAChC,+BAA+B,EAAE,KAAK;IACtC,kBAAkB,EAAE,IAAI;IACxB,wBAAwB,EAAE,IAAI;IAC9B,kBAAkB,EAAE,IAAI;IACxB,qBAAqB,EAAE,IAAI;IAC3B,sBAAsB,EAAE,KAAK;IAC7B,uBAAuB,EAAE,KAAK;IAC9B,6BAA6B,EAAE,KAAK;IACpC,wBAAwB,EAAE,KAAK;IAC/B,oBAAoB,EAAE,KAAK;IAC3B,0BAA0B,EAAE,KAAK;IACjC,iCAAiC,EAAE,KAAK;IACxC,YAAY,EAAE,IAAI;IAClB,wBAAwB,EAAE,KAAK;IAC/B,qBAAqB,EAAE,EAAE;IACzB,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,KAAK;CACf,CAAA"}
@@ -0,0 +1,45 @@
1
+ import type { SessionHub } from './hub.js';
2
+ /**
3
+ * The relay sessions are shared on when nothing names another one: the backend's
4
+ * (backend.ts), the one packages/relay deploys, or the develop relay for the
5
+ * develop and staging backends. Without a relay (`off`) a session stays on its
6
+ * machine, and the `share` tool is not there.
7
+ */
8
+ export declare const DEFAULT_RELAY_URL: string;
9
+ /** The relay's address (https://…), or null where sessions are not shared: CLASSCAD_RELAY_URL (`off`: none), else the default. */
10
+ export declare function relayUrl(env?: NodeJS.ProcessEnv): string | null;
11
+ /**
12
+ * An invite, offered on the relay — or about to be: an offer the relay does
13
+ * not take (it cannot be reached, it is down, the machine's sign-in is not
14
+ * confirmed) is made again until it does, and so is one that was lost.
15
+ * Nothing here fails for good, and nothing has to wait for it.
16
+ */
17
+ export type RelayOffer = {
18
+ /** The link that docks the app into the session, from anywhere: good while the offer is `live`. */
19
+ readonly url: string;
20
+ /** True while the relay holds the offer. */
21
+ readonly live: boolean;
22
+ /** Why the relay does not hold the offer right now; null while it does, and before it answered the first time. */
23
+ readonly problem: string | null;
24
+ /** Waits until the relay holds the offer, `ms` at most. False when it still does not by then (it is still being offered). */
25
+ whenLive: (ms: number) => Promise<boolean>;
26
+ /** Takes the offer back. The relay ends the guests' connections with it. */
27
+ close: () => void;
28
+ };
29
+ export type RelayOptions = {
30
+ /** The relay's address (https://… or http://…). */
31
+ relay: string;
32
+ /** The session's hub: guests the relay brings are handed to it. */
33
+ hub: SessionHub;
34
+ /** The invite to offer: one the hub minted. */
35
+ invite: string;
36
+ log?: (msg: string) => void;
37
+ };
38
+ /**
39
+ * Offers an invite of a session on the relay, and keeps it offered: an offer
40
+ * the relay does not take, and a connection that is lost (a sleeping laptop,
41
+ * another network, a relay that was redeployed), is made again. Guests the
42
+ * relay brings are met and handed to the hub. Returns at once: whenLive()
43
+ * tells when the relay has it.
44
+ */
45
+ export declare function offerOnRelay(opts: RelayOptions): RelayOffer;
@@ -0,0 +1,230 @@
1
+ // share/relay.ts — a session's address beyond this machine.
2
+ //
3
+ // The listener sessions are joined on binds 127.0.0.1 (share/server.ts): the
4
+ // app on this machine docks there, and nobody else can. A session that
5
+ // somebody elsewhere is to join is offered on the share relay instead
6
+ // (packages/relay, a Cloudflare Worker) — the way a page that hosts its own
7
+ // session offers it on the listener, with the same three connections. Only
8
+ // that here the MCP is the one that dials out:
9
+ //
10
+ // wss://<relay>/session/?host=<invite> a standing connection: the invite is offered for as long as it lasts
11
+ // { relay: 'guest', guest: <id> } the relay's word on it: somebody joined with the invite
12
+ // wss://<relay>/session/?host=<invite>&guest=<id> the MCP meets that guest on one more connection, and hands it to
13
+ // the session's hub — which serves it like a guest of the listener
14
+ // https://<relay>/?invite=<invite> what the guest opened: the app, served by the relay
15
+ //
16
+ // Nothing here listens for the outside: every connection is one this process
17
+ // opened. The relay takes an offer only from a signed-in machine (it is shown
18
+ // the Firebase ID token of the sign-in), passes the frames of a meeting and
19
+ // keeps none. The invite is the key, as on the listener: whoever has the link
20
+ // is in, until the offer is closed.
21
+ import WebSocket from 'ws';
22
+ import { authStatus, idToken } from '../auth.js';
23
+ import { RELAY_URL } from '../backend.js';
24
+ import { SESSION_PATH } from './server.js';
25
+ /**
26
+ * The relay sessions are shared on when nothing names another one: the backend's
27
+ * (backend.ts), the one packages/relay deploys, or the develop relay for the
28
+ * develop and staging backends. Without a relay (`off`) a session stays on its
29
+ * machine, and the `share` tool is not there.
30
+ */
31
+ export const DEFAULT_RELAY_URL = RELAY_URL;
32
+ /** The relay's address (https://…), or null where sessions are not shared: CLASSCAD_RELAY_URL (`off`: none), else the default. */
33
+ export function relayUrl(env = process.env) {
34
+ const named = (env.CLASSCAD_RELAY_URL ?? DEFAULT_RELAY_URL).trim();
35
+ if (!named || named === 'off' || named === '0')
36
+ return null;
37
+ return named.replace(/\/+$/, '');
38
+ }
39
+ /** How often the standing connection is pinged; one that misses a beat is taken for dead. */
40
+ const HEARTBEAT_MS = 30_000;
41
+ /** How long a handshake with the relay may take. */
42
+ const HANDSHAKE_MS = 15_000;
43
+ /** The pauses before an offer that was lost is made again: the last one is repeated. */
44
+ const RETRY_MS = [1_000, 2_000, 5_000, 10_000, 30_000];
45
+ /** After the relay said the plan does not share (Free): asked again this much later, with a fresh sign-in, so an upgrade counts. */
46
+ const PLAN_RETRY_MS = 10 * 60_000;
47
+ /** The largest frame taken from a guest: what the listener takes (share/server.ts). */
48
+ const MAX_PAYLOAD = 256 * 1024 * 1024;
49
+ /** Why the relay did not take a connection, in words for the user. */
50
+ const refusal = (status) => status === 401
51
+ ? 'the relay did not accept this machine\'s sign-in'
52
+ : status === 403
53
+ ? 'sharing a session comes with Solo and up (https://classcad.ch/subscriptions); on Free the session stays on this machine'
54
+ : status === 409
55
+ ? 'the relay holds this invite for somebody else'
56
+ : `the relay answered HTTP ${status ?? '?'}`;
57
+ /**
58
+ * Offers an invite of a session on the relay, and keeps it offered: an offer
59
+ * the relay does not take, and a connection that is lost (a sleeping laptop,
60
+ * another network, a relay that was redeployed), is made again. Guests the
61
+ * relay brings are met and handed to the hub. Returns at once: whenLive()
62
+ * tells when the relay has it.
63
+ */
64
+ export function offerOnRelay(opts) {
65
+ const { hub, invite } = opts;
66
+ const log = opts.log ?? (() => { });
67
+ const relay = opts.relay.replace(/\/+$/, '');
68
+ const offerUrl = `${relay.replace(/^http/i, 'ws')}${SESSION_PATH}/?host=${encodeURIComponent(invite)}`;
69
+ let closed = false;
70
+ let live = false;
71
+ let problem = null;
72
+ /** Whoever waits for the offer to be taken (whenLive). */
73
+ const waiters = new Set();
74
+ let control = null;
75
+ let retry = null;
76
+ let failures = 0;
77
+ /** The relay turned the last offer down for the plan. */
78
+ let planRefused = false;
79
+ let offeredBefore = false;
80
+ /** The connections guests were met on. */
81
+ const links = new Set();
82
+ /** Somebody joined with the invite: met on a connection of its own, and from there on a guest of the hub. */
83
+ const meet = async (guest) => {
84
+ // The engine behind the session is the signed-in machine's. (A guest nobody meets is sent away by the relay.)
85
+ if (closed || !(await authStatus()).signedIn)
86
+ return;
87
+ const link = new WebSocket(`${offerUrl}&guest=${encodeURIComponent(guest)}`, { handshakeTimeout: HANDSHAKE_MS, maxPayload: MAX_PAYLOAD });
88
+ links.add(link);
89
+ link.once('open', () => hub.join(link, invite));
90
+ link.once('close', () => links.delete(link));
91
+ link.on('error', err => {
92
+ links.delete(link);
93
+ log(`share: a guest of the relay was not met (${err.message})`);
94
+ });
95
+ };
96
+ /** Opens the standing connection. Resolves when the relay took the offer. */
97
+ const offer = async () => {
98
+ const token = await idToken(planRefused);
99
+ if (!token)
100
+ throw new Error('this machine is not signed in (or the sign-in could not be confirmed)');
101
+ if (closed)
102
+ return;
103
+ await new Promise((resolve, reject) => {
104
+ const ws = new WebSocket(offerUrl, { headers: { authorization: `Bearer ${token}` }, handshakeTimeout: HANDSHAKE_MS });
105
+ control = ws;
106
+ let alive = true;
107
+ let beat = null;
108
+ ws.once('open', () => {
109
+ if (closed)
110
+ return ws.close(1000);
111
+ live = true;
112
+ problem = null;
113
+ failures = 0;
114
+ planRefused = false;
115
+ for (const tell of [...waiters])
116
+ tell(true);
117
+ ws.on('pong', () => (alive = true));
118
+ beat = setInterval(() => {
119
+ if (!alive)
120
+ return ws.terminate();
121
+ alive = false;
122
+ ws.ping();
123
+ }, HEARTBEAT_MS);
124
+ beat.unref();
125
+ resolve();
126
+ });
127
+ ws.once('unexpected-response', (_req, res) => {
128
+ res.resume();
129
+ planRefused = res.statusCode === 403;
130
+ reject(new Error(refusal(res.statusCode)));
131
+ ws.terminate();
132
+ });
133
+ ws.on('message', data => {
134
+ let frame;
135
+ try {
136
+ frame = JSON.parse(data.toString());
137
+ }
138
+ catch {
139
+ return;
140
+ }
141
+ if (frame?.relay === 'guest' && typeof frame.guest === 'string')
142
+ void meet(frame.guest).catch(err => log(`share: ${err?.message ?? err}`));
143
+ });
144
+ ws.on('error', err => reject(err));
145
+ ws.on('close', () => {
146
+ if (beat)
147
+ clearInterval(beat);
148
+ if (control !== ws)
149
+ return;
150
+ control = null;
151
+ // An offer that was taken and then lost is made again. (One that was not taken: whoever made it does that.)
152
+ if (live && !closed) {
153
+ problem = 'the connection to the relay was lost';
154
+ log(`share: ${problem}`);
155
+ again();
156
+ }
157
+ live = false;
158
+ });
159
+ });
160
+ };
161
+ /** Makes the offer; one the relay does not take is made again after a pause, for as long as it takes. */
162
+ const attempt = () => {
163
+ offer().then(() => {
164
+ if (closed)
165
+ return;
166
+ log(`share: offered on the relay${offeredBefore ? ' again' : ''}`);
167
+ offeredBefore = true;
168
+ }, err => {
169
+ if (closed)
170
+ return;
171
+ problem = err?.message || String(err);
172
+ // Said once per outage: the pauses grow, the reason stays the same.
173
+ if (!failures)
174
+ log(`share: the relay did not take the offer (${problem}) — it is made again until it does`);
175
+ again();
176
+ });
177
+ };
178
+ const again = () => {
179
+ const pause = planRefused ? PLAN_RETRY_MS : RETRY_MS[Math.min(failures, RETRY_MS.length - 1)];
180
+ failures++;
181
+ retry = setTimeout(() => {
182
+ retry = null;
183
+ if (!closed)
184
+ attempt();
185
+ }, pause);
186
+ retry.unref();
187
+ };
188
+ attempt();
189
+ return {
190
+ url: `${relay}/?invite=${encodeURIComponent(invite)}`,
191
+ get live() {
192
+ return live;
193
+ },
194
+ get problem() {
195
+ return problem;
196
+ },
197
+ whenLive: ms => live || closed
198
+ ? Promise.resolve(live)
199
+ : new Promise(resolve => {
200
+ const tell = (now) => {
201
+ clearTimeout(timer);
202
+ waiters.delete(tell);
203
+ resolve(now);
204
+ };
205
+ const timer = setTimeout(() => tell(false), ms);
206
+ timer.unref();
207
+ waiters.add(tell);
208
+ }),
209
+ close: () => {
210
+ if (closed)
211
+ return;
212
+ closed = true;
213
+ live = false;
214
+ for (const tell of [...waiters])
215
+ tell(false);
216
+ if (retry)
217
+ clearTimeout(retry);
218
+ for (const ws of [control, ...links]) {
219
+ try {
220
+ ws?.close(1001, 'the session is over');
221
+ }
222
+ catch {
223
+ /* already closing */
224
+ }
225
+ }
226
+ links.clear();
227
+ },
228
+ };
229
+ }
230
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/share/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type Server } from 'node:http';
2
+ import type { SessionHub } from './hub.js';
3
+ /** The WebSocket path the app's build connects to (its WSCLIENT_URL). */
4
+ export declare const SESSION_PATH = "/session";
5
+ /** True when this build carries the app (dist/app/index.html). */
6
+ export declare function appAvailable(): boolean;
7
+ /** Makes an invite joinable on the listener. Returns the function that takes it off again. */
8
+ export declare function offerInvite(token: string, hub: SessionHub): () => void;
9
+ /** True when the invite is joined on this listener: a page offers it here right now, or it is of an MCP session of this process. */
10
+ export declare function joinedHere(token: string): boolean;
11
+ /** Waits until a page offers the invite (a page finds the MCP again within seconds of its start). False after `timeoutMs`. */
12
+ export declare function waitForPage(token: string, timeoutMs: number): Promise<boolean>;
13
+ /** How many apps are in a session here: docked into the MCP's own, or hosting one of theirs. */
14
+ export declare function dockedApps(): number;
15
+ /** How many pages offer a session of their own here. While one does, somebody may be about to join it. */
16
+ export declare function offeringPages(): number;
17
+ /**
18
+ * Stops the listener (the process is shutting down). Every WebSocket is ended
19
+ * with it: a page that offers a session keeps its connection open for as long
20
+ * as it can, and a server waits for its connections before it is closed.
21
+ */
22
+ export declare function closeListener(): Promise<void>;
23
+ /** Starts the listener (once per process) and returns its port. */
24
+ export declare function listen(): Promise<{
25
+ server: Server;
26
+ port: number;
27
+ }>;