@classcad/mcp 0.2.1 → 0.3.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/README.md +128 -87
- package/dist/app/SOURCE.txt +4 -0
- package/dist/app/assets/index-54a14bc0.css +8 -0
- package/dist/app/assets/index-c650c783.js +11257 -0
- package/dist/app/assets/troika-three-text.esm-188d86b5.js +220 -0
- package/dist/app/favicon.svg +98 -0
- package/dist/app/index.html +19 -0
- package/dist/app/manifest.json +14 -0
- package/dist/auth.d.ts +8 -0
- package/dist/auth.js +49 -10
- package/dist/auth.js.map +1 -1
- package/dist/backend.d.ts +8 -0
- package/dist/backend.js +39 -0
- package/dist/backend.js.map +1 -0
- package/dist/client.d.ts +48 -11
- package/dist/client.js +152 -167
- package/dist/client.js.map +1 -1
- package/dist/daemon.d.ts +0 -2
- package/dist/daemon.js +77 -62
- package/dist/daemon.js.map +1 -1
- package/dist/engine/key.d.ts +29 -0
- package/dist/engine/key.js +145 -0
- package/dist/engine/key.js.map +1 -0
- package/dist/engine/wasm-worker.js +7 -7
- package/dist/engine/wasm-worker.js.map +1 -1
- package/dist/engine/wasm.d.ts +16 -14
- package/dist/engine/wasm.js +22 -30
- package/dist/engine/wasm.js.map +1 -1
- package/dist/mcp-server.d.ts +4 -4
- package/dist/mcp-server.js +72 -28
- package/dist/mcp-server.js.map +1 -1
- package/dist/queue.js +1 -1
- package/dist/queue.js.map +1 -1
- package/dist/server.js +69 -36
- package/dist/server.js.map +1 -1
- package/dist/share/hub.d.ts +70 -0
- package/dist/share/hub.js +494 -0
- package/dist/share/hub.js.map +1 -0
- package/dist/share/protocol.d.ts +87 -0
- package/dist/share/protocol.js +54 -0
- package/dist/share/protocol.js.map +1 -0
- package/dist/share/relay.d.ts +45 -0
- package/dist/share/relay.js +230 -0
- package/dist/share/relay.js.map +1 -0
- package/dist/share/server.d.ts +27 -0
- package/dist/share/server.js +399 -0
- package/dist/share/server.js.map +1 -0
- package/dist/share/session.d.ts +120 -0
- package/dist/share/session.js +336 -0
- package/dist/share/session.js.map +1 -0
- package/dist/tools/auth.js +1 -1
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/docs.js +3 -2
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/lifecycle.js +36 -9
- package/dist/tools/lifecycle.js.map +1 -1
- package/dist/tools/share.d.ts +18 -0
- package/dist/tools/share.js +277 -0
- package/dist/tools/share.js.map +1 -0
- package/dist/tools/viewer.d.ts +1 -1
- package/dist/tools/viewer.js +11 -6
- package/dist/tools/viewer.js.map +1 -1
- package/dist/viewer-page/viewer.js +19 -2
- package/package.json +4 -3
- package/dist/bridge/protocol.d.ts +0 -87
- package/dist/bridge/protocol.js +0 -14
- package/dist/bridge/protocol.js.map +0 -1
- package/dist/bridge/server.d.ts +0 -35
- package/dist/bridge/server.js +0 -236
- package/dist/bridge/server.js.map +0 -1
- package/dist/tools/bridge.d.ts +0 -4
- package/dist/tools/bridge.js +0 -115
- package/dist/tools/bridge.js.map +0 -1
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// share/session.ts — an MCP session as a participant of a shared session.
|
|
2
|
+
//
|
|
3
|
+
// Whichever engine the session runs on, it can have company: apps docked into
|
|
4
|
+
// the MCP's own engine (share/hub.ts, the MCP is the host), or the other
|
|
5
|
+
// participants of a session on a ClassCAD server (the MCP hosts it or joined
|
|
6
|
+
// it by invite). This module is the one view of that company the tools use:
|
|
7
|
+
// • who is there, and what they say about themselves ('client' presence)
|
|
8
|
+
// • what they have selected ('selection' presence), and asking them to
|
|
9
|
+
// select something ('select' presence)
|
|
10
|
+
// • the link of the app that docks into this session, and opening it
|
|
11
|
+
// • the link for everybody else: the session offered on the share relay
|
|
12
|
+
// (share/relay.ts), where it is joined from anywhere
|
|
13
|
+
// The frames come from the hub (own engine) or from the server (worker) — the
|
|
14
|
+
// same frames either way.
|
|
15
|
+
import { randomUUID } from 'node:crypto';
|
|
16
|
+
import { openBrowser } from '../auth.js';
|
|
17
|
+
import { createSessionHub } from './hub.js';
|
|
18
|
+
import { offerOnRelay, relayUrl } from './relay.js';
|
|
19
|
+
import { appAvailable, listen, offerInvite } from './server.js';
|
|
20
|
+
import { CLIENT_CHANNEL, SELECT_CHANNEL, SELECTION_CHANNEL, } from './protocol.js';
|
|
21
|
+
/** What the environment says about it: CLASSCAD_VIEWER_OPEN (browser | host | 0), else by the host that started the MCP. */
|
|
22
|
+
export function showFromEnv(env = process.env) {
|
|
23
|
+
const set = env.CLASSCAD_VIEWER_OPEN;
|
|
24
|
+
if (set === '0' || set === 'off')
|
|
25
|
+
return 'off';
|
|
26
|
+
if (set === 'browser' || set === 'host')
|
|
27
|
+
return set;
|
|
28
|
+
// The Claude desktop app shows web pages in a pane of its own, beside the conversation: the app belongs there.
|
|
29
|
+
return env.CLAUDE_CODE_ENTRYPOINT === 'claude-desktop' ? 'host' : 'browser';
|
|
30
|
+
}
|
|
31
|
+
/** What the environment says about it. Without a relay there is nothing to share on. */
|
|
32
|
+
export function sharingFromEnv(env = process.env) {
|
|
33
|
+
if (!relayUrl(env))
|
|
34
|
+
return 'off';
|
|
35
|
+
const set = env.CLASSCAD_SHARE;
|
|
36
|
+
return set === 'ask' ? 'ask' : set === 'off' || set === '0' ? 'off' : 'always';
|
|
37
|
+
}
|
|
38
|
+
/** How long the first model's answer waits for a relay that has not answered, where every session is shared. (It was asked when the tool started, and the app takes its time to come up anyway.) */
|
|
39
|
+
const OFFER_PATIENCE_MS = 6_000;
|
|
40
|
+
/** How long somebody who asked for the link waits for the relay. */
|
|
41
|
+
const SHARE_PATIENCE_MS = 12_000;
|
|
42
|
+
/** Tests set this: nothing is opened on the machine they run on. */
|
|
43
|
+
const noBrowser = () => process.env.CLASSCAD_VIEWER_NO_BROWSER === '1';
|
|
44
|
+
/** A drawing nobody modeled in yet: nothing in its tree but the root. */
|
|
45
|
+
const isEmpty = (tree) => !tree || Object.values(tree).every(n => n?.class === 'AllObjects');
|
|
46
|
+
/**
|
|
47
|
+
* Opens a session's sharing: its hub, the app's invite on the listener, and an
|
|
48
|
+
* ear for whoever is in the session. Nothing is started: the engine comes up
|
|
49
|
+
* with the first tool call, or with the first guest.
|
|
50
|
+
*/
|
|
51
|
+
export async function openShare(opts) {
|
|
52
|
+
const { client } = opts;
|
|
53
|
+
const log = opts.log ?? (() => { });
|
|
54
|
+
let published = '';
|
|
55
|
+
// ── Who is there, and what they last said ──
|
|
56
|
+
const peers = new Map();
|
|
57
|
+
const said = new Map();
|
|
58
|
+
const listeners = new Set();
|
|
59
|
+
const forget = (peerId) => {
|
|
60
|
+
peers.delete(peerId);
|
|
61
|
+
said.delete(peerId);
|
|
62
|
+
};
|
|
63
|
+
// The engine link this session's company belongs to.
|
|
64
|
+
let transport = null;
|
|
65
|
+
const hear = (frame) => {
|
|
66
|
+
const peerId = typeof frame.peerId === 'string' ? frame.peerId : '';
|
|
67
|
+
if (frame.command === 'Connected') {
|
|
68
|
+
// Another engine link: whoever was docked or known belongs to the old one.
|
|
69
|
+
// (The MCP's own engine restarting is not one: its guests stay, the hub sends them the model anew.)
|
|
70
|
+
const moved = transport !== null && (frame.transport !== transport || frame.transport === 'ws');
|
|
71
|
+
transport = frame.transport;
|
|
72
|
+
if (moved) {
|
|
73
|
+
hub.kick('the session moved to another engine');
|
|
74
|
+
peers.clear();
|
|
75
|
+
said.clear();
|
|
76
|
+
}
|
|
77
|
+
published = '';
|
|
78
|
+
if (frame.transport === 'ws')
|
|
79
|
+
publishIdentity();
|
|
80
|
+
}
|
|
81
|
+
else if (frame.command === 'PeerJoined' && peerId) {
|
|
82
|
+
peers.set(peerId, { ...peers.get(peerId), peerId, invite: frame.invite, inviteName: frame.inviteName, role: frame.role === 'view' ? 'view' : 'edit' });
|
|
83
|
+
publishIdentity(true);
|
|
84
|
+
}
|
|
85
|
+
else if (frame.command === 'PeerLeft' && peerId)
|
|
86
|
+
forget(peerId);
|
|
87
|
+
else if (frame.command === 'Presence' && peerId) {
|
|
88
|
+
if (frame.channel === 'leave')
|
|
89
|
+
return forget(peerId);
|
|
90
|
+
const data = frame.data && typeof frame.data === 'object' ? frame.data : {};
|
|
91
|
+
// A guest never hears of joins: whoever speaks is there.
|
|
92
|
+
const peer = peers.get(peerId) ?? { peerId };
|
|
93
|
+
if (frame.channel === CLIENT_CHANNEL && typeof data.app === 'string') {
|
|
94
|
+
peer.identity = { app: data.app, version: typeof data.version === 'string' ? data.version : undefined, name: typeof data.name === 'string' ? data.name : undefined, kind: data.kind === 'agent' ? 'agent' : 'app' };
|
|
95
|
+
}
|
|
96
|
+
peers.set(peerId, peer);
|
|
97
|
+
let channels = said.get(peerId);
|
|
98
|
+
if (!channels)
|
|
99
|
+
said.set(peerId, (channels = new Map()));
|
|
100
|
+
channels.set(frame.channel, data);
|
|
101
|
+
for (const tell of listeners)
|
|
102
|
+
tell(peerId, frame.channel);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
// ── The two sources of those frames ──
|
|
106
|
+
const hub = createSessionHub({ client, queue: opts.queue, toHost: hear, log });
|
|
107
|
+
const unsubServer = client.onSessionFrame(hear);
|
|
108
|
+
const sendPresence = (channel, data) => {
|
|
109
|
+
if (client.transport === 'wasm')
|
|
110
|
+
hub.sendPresence(channel, data);
|
|
111
|
+
else
|
|
112
|
+
client.sendFrame({ command: 'Presence', channel, data });
|
|
113
|
+
};
|
|
114
|
+
// Who this session is. Published again whenever it changed or the audience did.
|
|
115
|
+
const publishIdentity = (again = false) => {
|
|
116
|
+
const identity = opts.identity();
|
|
117
|
+
const key = `${client.transport}:${client.generation}:${JSON.stringify(identity)}`;
|
|
118
|
+
if (key === published && !again)
|
|
119
|
+
return;
|
|
120
|
+
published = key;
|
|
121
|
+
sendPresence(CLIENT_CHANNEL, identity);
|
|
122
|
+
};
|
|
123
|
+
// ── The app's link ──
|
|
124
|
+
let url = null;
|
|
125
|
+
let invite = null;
|
|
126
|
+
let unoffer = null;
|
|
127
|
+
try {
|
|
128
|
+
// The listener is there for more than this session's app: pages offer their own sessions on it.
|
|
129
|
+
const { port } = await listen();
|
|
130
|
+
// The app this build carries — or one that is hosted elsewhere (CLASSCAD_APP_URL): any buerli app
|
|
131
|
+
// that joins a page's session finds this listener by itself, on its usual port.
|
|
132
|
+
const hosted = process.env.CLASSCAD_APP_URL;
|
|
133
|
+
if (opts.app && (hosted || appAvailable())) {
|
|
134
|
+
invite = hub.createInvite('edit', 'user');
|
|
135
|
+
unoffer = offerInvite(invite.invite, hub);
|
|
136
|
+
url = hosted ? `${hosted}${hosted.includes('?') ? '&' : '?'}invite=${invite.invite}` : `http://127.0.0.1:${port}/?invite=${invite.invite}`;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
// No listener is no reason to have no MCP.
|
|
141
|
+
log(`share: the listener for apps did not start (${err?.message ?? err})`);
|
|
142
|
+
}
|
|
143
|
+
// ── The link for everybody else ──
|
|
144
|
+
// An invite of its own: it is taken back without a word to the user's app.
|
|
145
|
+
const sharing = opts.sharing ?? sharingFromEnv();
|
|
146
|
+
let shared = null;
|
|
147
|
+
/** The share link was taken back (`share` with stop): the session is not shared again by itself, only when asked. */
|
|
148
|
+
let stopped = false;
|
|
149
|
+
/** Offers the session on the relay, if it is not: returns at once, the relay is asked in the background. */
|
|
150
|
+
const offerShared = () => {
|
|
151
|
+
if (shared)
|
|
152
|
+
return shared.offer;
|
|
153
|
+
const relay = relayUrl();
|
|
154
|
+
if (!relay || sharing === 'off')
|
|
155
|
+
throw new Error('Sessions are not shared from this MCP: no relay is configured (CLASSCAD_RELAY_URL), or sharing is switched off (CLASSCAD_SHARE=off).');
|
|
156
|
+
// A guest cannot invite: the session is its host's to share.
|
|
157
|
+
if (client.shareToken)
|
|
158
|
+
throw new Error('This session belongs to an app the user has open: it is shared from there (its Sessions panel), not from here.');
|
|
159
|
+
// Where the share link is the app's link, the user comes in with it too.
|
|
160
|
+
const guest = hub.createInvite('edit', sharing === 'always' ? 'user' : 'guest');
|
|
161
|
+
shared = { invite: guest, offer: offerOnRelay({ relay, hub, invite: guest.invite, log }) };
|
|
162
|
+
return shared.offer;
|
|
163
|
+
};
|
|
164
|
+
const publish = async (patience = SHARE_PATIENCE_MS) => {
|
|
165
|
+
const offer = offerShared();
|
|
166
|
+
stopped = false;
|
|
167
|
+
const live = await offer.whenLive(patience);
|
|
168
|
+
return { url: offer.url, live, problem: live ? null : offer.problem ?? 'the relay has not answered yet' };
|
|
169
|
+
};
|
|
170
|
+
const warm = () => {
|
|
171
|
+
if (sharing !== 'always' || stopped || shared || client.shareToken)
|
|
172
|
+
return;
|
|
173
|
+
try {
|
|
174
|
+
offerShared();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* not a session to share: the app is still there */
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const unpublish = () => {
|
|
181
|
+
if (!shared)
|
|
182
|
+
return null;
|
|
183
|
+
const { invite: guest, offer } = shared;
|
|
184
|
+
shared = null;
|
|
185
|
+
stopped = true;
|
|
186
|
+
// Whoever had the app open under that link is told by whoever took it back: it is not offered again on its own.
|
|
187
|
+
if (offeredOn === 'relay')
|
|
188
|
+
offeredOn = 'here';
|
|
189
|
+
// Each guest hears why it has to go, before the relay ends what is left.
|
|
190
|
+
const { kicked } = hub.revokeInvite(guest.invite);
|
|
191
|
+
offer.close();
|
|
192
|
+
log(`share: the session is not shared any more (${kicked} guest(s) disconnected)`);
|
|
193
|
+
return { kicked };
|
|
194
|
+
};
|
|
195
|
+
/** The link the app is offered under right now. */
|
|
196
|
+
const appUrl = () => (sharing === 'always' && shared?.offer.live ? shared.offer.url : url);
|
|
197
|
+
// The app is offered once per session. Said again and again, an agent repeats its link in every answer.
|
|
198
|
+
let offered = false;
|
|
199
|
+
/** Which link it was offered under: one on the relay may stop working, and then the app is offered again, on this machine. */
|
|
200
|
+
let offeredOn = null;
|
|
201
|
+
const handed = (link) => {
|
|
202
|
+
offered = true;
|
|
203
|
+
offeredOn = link !== null && link === shared?.offer.url ? 'relay' : 'here';
|
|
204
|
+
};
|
|
205
|
+
const open = (link = appUrl()) => {
|
|
206
|
+
if (!link)
|
|
207
|
+
return false;
|
|
208
|
+
handed(link);
|
|
209
|
+
return noBrowser() ? false : openBrowser(link);
|
|
210
|
+
};
|
|
211
|
+
/** The app under `link`, the way this session's host shows it. */
|
|
212
|
+
const present = (link, more) => {
|
|
213
|
+
handed(link);
|
|
214
|
+
if (opts.show === 'host')
|
|
215
|
+
return { url: link, how: 'host', ...more };
|
|
216
|
+
if (opts.show === 'browser' && open(link))
|
|
217
|
+
return { url: link, how: 'opened', ...more };
|
|
218
|
+
return { url: link, how: 'link', ...more };
|
|
219
|
+
};
|
|
220
|
+
const docked = () => Math.max(hub.guests, [...peers.values()].filter(peer => peer.identity?.kind !== 'agent').length);
|
|
221
|
+
const touch = async () => {
|
|
222
|
+
if (client.connected)
|
|
223
|
+
publishIdentity();
|
|
224
|
+
// A session that became somebody's guest (use_session with an invite) is not this MCP's to share any more.
|
|
225
|
+
if (client.shareToken && shared)
|
|
226
|
+
unpublish();
|
|
227
|
+
// A guest has nothing to offer: the host's app is open.
|
|
228
|
+
if (!url || client.shareToken)
|
|
229
|
+
return null;
|
|
230
|
+
if (offered) {
|
|
231
|
+
// The app was offered under the share link, the relay does not hold the session any more, and nobody is left
|
|
232
|
+
// in it: whoever had the app open lost it. It is offered again, once, on this machine.
|
|
233
|
+
if (offeredOn !== 'relay' || shared?.offer.live || docked() > 0)
|
|
234
|
+
return null;
|
|
235
|
+
log('share: the share link stopped working — the app is offered on this machine');
|
|
236
|
+
return present(url, { fallback: true });
|
|
237
|
+
}
|
|
238
|
+
// Somebody has it open already: there is nothing to bring up, and nothing to say.
|
|
239
|
+
if (docked() > 0) {
|
|
240
|
+
offered = true;
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
if (!client.connected || isEmpty((await client.getTree())))
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
// The first model of the session: now.
|
|
251
|
+
// Where every session is shared, the app's link is the share link — if the relay holds the session by now.
|
|
252
|
+
// A relay that does not is no reason to have no app: then the link is this machine's.
|
|
253
|
+
let link = null;
|
|
254
|
+
if (sharing === 'always' && !stopped) {
|
|
255
|
+
try {
|
|
256
|
+
const relayed = offerShared();
|
|
257
|
+
// An offer the relay has turned down already is not waited for: it is made again in the background.
|
|
258
|
+
link = relayed.live || !relayed.problem ? await publish(OFFER_PATIENCE_MS) : { url: relayed.url, live: false, problem: relayed.problem };
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
/* not a session to share */
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (link && !link.live)
|
|
265
|
+
log(`share: the app is offered on this machine only (${link.problem})`);
|
|
266
|
+
return link?.live ? present(link.url, { shared: true }) : present(url, {});
|
|
267
|
+
};
|
|
268
|
+
const selections = () => {
|
|
269
|
+
const out = [];
|
|
270
|
+
for (const [peerId, channels] of said) {
|
|
271
|
+
const frame = channels.get(SELECTION_CHANNEL);
|
|
272
|
+
if (!frame || !Array.isArray(frame.items))
|
|
273
|
+
continue;
|
|
274
|
+
out.push({ peer: peers.get(peerId) ?? { peerId }, items: frame.items, total: typeof frame.total === 'number' ? frame.total : frame.items.length });
|
|
275
|
+
}
|
|
276
|
+
return out;
|
|
277
|
+
};
|
|
278
|
+
const select = async (items, replace = true) => {
|
|
279
|
+
const id = randomUUID();
|
|
280
|
+
// Whoever follows the request publishes its selection anew: wait for that, briefly.
|
|
281
|
+
const answered = new Promise(resolve => {
|
|
282
|
+
const done = () => {
|
|
283
|
+
listeners.delete(tell);
|
|
284
|
+
clearTimeout(timer);
|
|
285
|
+
resolve();
|
|
286
|
+
};
|
|
287
|
+
const tell = (_peerId, channel) => {
|
|
288
|
+
if (channel === SELECTION_CHANNEL)
|
|
289
|
+
setTimeout(done, 60);
|
|
290
|
+
};
|
|
291
|
+
const timer = setTimeout(done, 1500);
|
|
292
|
+
listeners.add(tell);
|
|
293
|
+
});
|
|
294
|
+
sendPresence(SELECT_CHANNEL, { id, items, replace });
|
|
295
|
+
// The frame a server keeps for those who join later must ask for nothing.
|
|
296
|
+
sendPresence(SELECT_CHANNEL, { id, done: true });
|
|
297
|
+
await answered;
|
|
298
|
+
return selections();
|
|
299
|
+
};
|
|
300
|
+
return {
|
|
301
|
+
get url() {
|
|
302
|
+
return url;
|
|
303
|
+
},
|
|
304
|
+
get hosting() {
|
|
305
|
+
return !client.shareToken;
|
|
306
|
+
},
|
|
307
|
+
show: opts.show,
|
|
308
|
+
sharing,
|
|
309
|
+
get appUrl() {
|
|
310
|
+
return appUrl();
|
|
311
|
+
},
|
|
312
|
+
get sharedUrl() {
|
|
313
|
+
return shared?.offer.live ? shared.offer.url : null;
|
|
314
|
+
},
|
|
315
|
+
publish,
|
|
316
|
+
warm,
|
|
317
|
+
unpublish,
|
|
318
|
+
open,
|
|
319
|
+
touch,
|
|
320
|
+
offered: (link = appUrl() ?? undefined) => handed(link ?? null),
|
|
321
|
+
docked,
|
|
322
|
+
peers: () => [...peers.values()],
|
|
323
|
+
selections,
|
|
324
|
+
select,
|
|
325
|
+
close: () => {
|
|
326
|
+
unoffer?.();
|
|
327
|
+
unsubServer();
|
|
328
|
+
shared?.offer.close();
|
|
329
|
+
shared = null;
|
|
330
|
+
hub.close();
|
|
331
|
+
peers.clear();
|
|
332
|
+
said.clear();
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/share/session.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/auth.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { z } from 'zod';
|
|
9
9
|
import { authStatus, beginLogin, logout, pendingLogin, waitForLogin } from '../auth.js';
|
|
10
10
|
/** Tools that work without a sign-in: the sign-in itself, status, and the public docs. */
|
|
11
|
-
export const OPEN_TOOLS = new Set(['login', 'session_info', 'list_methods', 'describe_method', 'docs'
|
|
11
|
+
export const OPEN_TOOLS = new Set(['login', 'session_info', 'list_methods', 'describe_method', 'docs']);
|
|
12
12
|
/** How long one `login` call waits (under Codex's 60 s default tool timeout). */
|
|
13
13
|
const WAIT_MS = 50_000;
|
|
14
14
|
export const SIGN_IN_NOTE = 'SIGN-IN: the ClassCAD MCP needs a free classcad.ch account, once per machine. Right after installing or setting up this MCP, and whenever the user asks to sign in, call `login` at once — do not leave the sign-in for later. When a tool answers "Sign-in required", do the same. `login` opens the sign-in page in the user\'s browser; ALSO show the user the link it returns, as a clickable link on its own line, then call `login` again — it waits and returns as soon as they have signed in. Docs tools work without a sign-in.';
|
package/dist/tools/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,0EAA0E;AAC1E,2EAA2E;AAC3E,kCAAkC;AAGlC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEvF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/docs.js
CHANGED
|
@@ -85,8 +85,9 @@ export function serverInstructions() {
|
|
|
85
85
|
'REFERENCE IMAGES: ' +
|
|
86
86
|
REFERENCE_IMAGE_POINTER,
|
|
87
87
|
'',
|
|
88
|
-
'ENGINES: the MCP runs on a ClassCAD worker (Drogon server)
|
|
89
|
-
'
|
|
88
|
+
'ENGINES: the MCP runs on a ClassCAD worker (Drogon server) or on its OWN local WASM engine (no server, no browser); ' +
|
|
89
|
+
'either way apps can dock into its session, and with an app\'s invite link it joins the session of that app. ' +
|
|
90
|
+
'An invite link/URL decides by itself; otherwise use_session(engine="auto"|"drogon"|"wasm") — ' +
|
|
90
91
|
'auto = worker if reachable else local WASM; a worker that comes up later takes over while the local drawing is still empty (a modeled session stays put). ' +
|
|
91
92
|
'"use WASM / local / offline" → engine "wasm"; "my Drogon/ClassCAD server" → "drogon". ' +
|
|
92
93
|
'session_info shows what is in use.',
|
package/dist/tools/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/lifecycle.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Lifecycle tools: clear, save, load.
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { dirname, isAbsolute } from 'node:path';
|
|
5
5
|
import { buildScene, sceneToGlb } from '../viewer/scene.js';
|
|
6
|
+
import { exportAllowed } from '../engine/key.js';
|
|
6
7
|
export function registerLifecycleTools(server, client) {
|
|
7
8
|
server.registerTool('clear', {
|
|
8
9
|
title: 'Clear drawing',
|
|
@@ -25,13 +26,18 @@ export function registerLifecycleTools(server, client) {
|
|
|
25
26
|
title: 'Save drawing',
|
|
26
27
|
description: 'Write the current drawing to a file, or return it as base64. Formats: STP (STEP, exact geometry), STL (triangles), GLB (binary glTF: triangles with colours, for 3D viewers and the web), OFB (ClassCAD\'s own format: the model with its features, to open again in ClassCAD or Buerligons), JSON. ' +
|
|
27
28
|
'With `path` the file is written to disk and only its path and size come back — the way to hand the user a model (give them the path); without it the content is returned base64-encoded, which is large. ' +
|
|
28
|
-
'The user can also
|
|
29
|
+
'The user can also save the model themselves from what `view` opens.',
|
|
29
30
|
inputSchema: {
|
|
30
31
|
format: z.enum(['STP', 'STL', 'GLB', 'OFB', 'JSON']).describe('Output format.'),
|
|
31
32
|
path: z.string().optional()
|
|
32
33
|
.describe('Absolute file path to write, e.g. /Users/me/Desktop/flange.stp (folders are created). Omit to get the content back as base64.'),
|
|
34
|
+
analytic: z.boolean().optional()
|
|
35
|
+
.describe('STP only: write planes, cylinders, cones, spheres and tori as such instead of as B-spline surfaces. Other CAD systems read such a file faster and recognise its holes and flats.'),
|
|
33
36
|
},
|
|
34
|
-
}, async ({ format, path }) => {
|
|
37
|
+
}, async ({ format, path, analytic }) => {
|
|
38
|
+
const allowed = exportAllowed(format);
|
|
39
|
+
if (!allowed.ok)
|
|
40
|
+
return { isError: true, content: [{ type: 'text', text: JSON.stringify({ format, success: false, error: allowed.message }) }] };
|
|
35
41
|
let data = null;
|
|
36
42
|
let maxLevel = 0;
|
|
37
43
|
if (format === 'GLB') {
|
|
@@ -43,7 +49,7 @@ export function registerLifecycleTools(server, client) {
|
|
|
43
49
|
else {
|
|
44
50
|
const args = { format, encoding: 'base64' };
|
|
45
51
|
if (format === 'STP')
|
|
46
|
-
args.stp = { version: 2 };
|
|
52
|
+
args.stp = analytic === undefined ? { version: 2 } : { version: 2, analytic: analytic ? 1 : 0 };
|
|
47
53
|
if (format === 'STL')
|
|
48
54
|
args.stl = { binary: true, facetingTol: 0.1, angleTol: 6 };
|
|
49
55
|
const r = await client.execute({ 'v1.common.save': [args] });
|
|
@@ -70,21 +76,42 @@ export function registerLifecycleTools(server, client) {
|
|
|
70
76
|
});
|
|
71
77
|
server.registerTool('load', {
|
|
72
78
|
title: 'Load drawing',
|
|
73
|
-
description: 'Load a
|
|
79
|
+
description: 'Load a drawing, replacing the current one: from a file on disk (`path`) or from base64-encoded content. Formats: STP (STEP), STL, OFB, JSON. ' +
|
|
80
|
+
'Prefer `path`: the file is read here and never passes through the conversation, which is the only practical way for a model file of real size. ' +
|
|
81
|
+
'Give exactly one of `path` and `content`.',
|
|
74
82
|
inputSchema: {
|
|
75
83
|
format: z.enum(['OFB', 'STP', 'STL', 'JSON']).describe('Input format.'),
|
|
76
|
-
|
|
84
|
+
path: z.string().optional()
|
|
85
|
+
.describe('Absolute path of the file to load, e.g. /Users/me/parts/bracket.step.'),
|
|
86
|
+
content: z.string().optional().describe('Base64-encoded payload, when there is no file.'),
|
|
77
87
|
},
|
|
78
|
-
}, async ({ format, content }) => {
|
|
88
|
+
}, async ({ format, path, content }) => {
|
|
89
|
+
const fail = (error) => ({ isError: true, content: [{ type: 'text', text: JSON.stringify({ format, ok: false, error }) }] });
|
|
90
|
+
if ((path === undefined) === (content === undefined))
|
|
91
|
+
return fail('Give exactly one of path and content.');
|
|
92
|
+
let data = content;
|
|
93
|
+
let bytes;
|
|
94
|
+
if (path !== undefined) {
|
|
95
|
+
if (!isAbsolute(path))
|
|
96
|
+
return fail(`path must be absolute: ${path}`);
|
|
97
|
+
try {
|
|
98
|
+
const file = readFileSync(path);
|
|
99
|
+
bytes = file.length;
|
|
100
|
+
data = file.toString('base64');
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
return fail(`Cannot read ${path}: ${e.message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
79
106
|
// NOTE: the engine's load parameter is `data` (a prior save's payload) —
|
|
80
107
|
// `content` is silently ignored (error 1004 "Either data, file or url…").
|
|
81
108
|
const r = await client.execute({
|
|
82
|
-
'v1.common.load': [{ format, encoding: 'base64', data
|
|
109
|
+
'v1.common.load': [{ format, encoding: 'base64', data, doClear: 1 }],
|
|
83
110
|
});
|
|
84
111
|
return {
|
|
85
112
|
content: [{
|
|
86
113
|
type: 'text',
|
|
87
|
-
text: JSON.stringify({ ok: r.maxLevel <= 31, maxLevel: r.maxLevel, messages: r.messages }),
|
|
114
|
+
text: JSON.stringify({ ok: r.maxLevel <= 31, ...(path !== undefined ? { path, bytes } : {}), maxLevel: r.maxLevel, messages: r.messages }),
|
|
88
115
|
}],
|
|
89
116
|
};
|
|
90
117
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Client } from '../client.js';
|
|
3
|
+
import { type Share, type Sharing, type Show } from '../share/session.js';
|
|
4
|
+
import type { ViewerSession } from '../viewer/server.js';
|
|
5
|
+
/** The part of the server instructions about the app, written for the way this session's app reaches the user and for how it is shared. */
|
|
6
|
+
export declare const appNote: (show: Show, sharing?: Sharing) => string;
|
|
7
|
+
/**
|
|
8
|
+
* Opens the session's sharing and wires it into the tools registered after it:
|
|
9
|
+
* a tool that may have changed the model offers the app with the first model
|
|
10
|
+
* (once), and the sharing ends when the engine client is closed.
|
|
11
|
+
*/
|
|
12
|
+
export declare function attachShare(server: McpServer, client: Client, version: string, show: Show, sharing: Sharing, log?: (msg: string) => void): Promise<Share>;
|
|
13
|
+
/** `view`: the app docked into this session — or, where this build has none, the read-only 3D view. */
|
|
14
|
+
export declare function registerViewTool(server: McpServer, share: Share, viewer: ViewerSession | null): void;
|
|
15
|
+
/** `share`: a link to this session that works beyond this machine, and taking it back. */
|
|
16
|
+
export declare function registerShareTool(server: McpServer, share: Share): void;
|
|
17
|
+
/** `get_selection` / `set_selection`: pointing between the user at an app and the agent, both ways. */
|
|
18
|
+
export declare function registerSelectionTools(server: McpServer, client: Client, share: Share): void;
|