@geohar/pi-mcp-combiner 0.14.2 → 0.16.0-dev.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 (98) hide show
  1. package/README.md +71 -48
  2. package/dist/client/config-ladder.d.ts +1 -1
  3. package/dist/client/config-ladder.d.ts.map +1 -1
  4. package/dist/client/control.d.ts +1 -1
  5. package/dist/client/control.d.ts.map +1 -1
  6. package/dist/client/elicitation.d.ts +4 -2
  7. package/dist/client/elicitation.d.ts.map +1 -1
  8. package/dist/client/elicitation.js +8 -2
  9. package/dist/client/elicitation.js.map +1 -1
  10. package/dist/client/footer.d.ts +1 -1
  11. package/dist/client/footer.d.ts.map +1 -1
  12. package/dist/client/panel.d.ts +1 -1
  13. package/dist/client/panel.d.ts.map +1 -1
  14. package/dist/client/panel.js +1 -1
  15. package/dist/client/panel.js.map +1 -1
  16. package/dist/client/prompts.d.ts +1 -1
  17. package/dist/client/prompts.d.ts.map +1 -1
  18. package/dist/client/proxy-tool.d.ts +1 -1
  19. package/dist/client/proxy-tool.d.ts.map +1 -1
  20. package/dist/client/resource-naming.d.ts +8 -0
  21. package/dist/client/resource-naming.d.ts.map +1 -0
  22. package/dist/client/resource-naming.js +33 -0
  23. package/dist/client/resource-naming.js.map +1 -0
  24. package/dist/client/settings.d.ts +5 -4
  25. package/dist/client/settings.d.ts.map +1 -1
  26. package/dist/client/settings.js +3 -3
  27. package/dist/client/settings.js.map +1 -1
  28. package/dist/client/tool-matching.d.ts +32 -0
  29. package/dist/client/tool-matching.d.ts.map +1 -0
  30. package/dist/client/tool-matching.js +43 -0
  31. package/dist/client/tool-matching.js.map +1 -0
  32. package/dist/client/types.d.ts +71 -0
  33. package/dist/client/types.d.ts.map +1 -0
  34. package/dist/client/types.js +16 -0
  35. package/dist/client/types.js.map +1 -0
  36. package/dist/client/widget-support.d.ts +17 -0
  37. package/dist/client/widget-support.d.ts.map +1 -0
  38. package/dist/client/widget-support.js +89 -0
  39. package/dist/client/widget-support.js.map +1 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +109 -53
  42. package/dist/index.js.map +1 -1
  43. package/dist/{client/connection.d.ts → native/combiner-connection.d.ts} +46 -38
  44. package/dist/native/combiner-connection.d.ts.map +1 -0
  45. package/dist/native/combiner-connection.js +412 -0
  46. package/dist/native/combiner-connection.js.map +1 -0
  47. package/dist/native/index.d.ts +30 -0
  48. package/dist/native/index.d.ts.map +1 -0
  49. package/dist/native/index.js +61 -0
  50. package/dist/native/index.js.map +1 -0
  51. package/dist/native/resources.d.ts +18 -0
  52. package/dist/native/resources.d.ts.map +1 -0
  53. package/dist/native/resources.js +97 -0
  54. package/dist/native/resources.js.map +1 -0
  55. package/dist/native/tool-surface.d.ts +26 -0
  56. package/dist/native/tool-surface.d.ts.map +1 -0
  57. package/dist/native/tool-surface.js +113 -0
  58. package/dist/native/tool-surface.js.map +1 -0
  59. package/dist/pi.d.ts +19 -0
  60. package/dist/pi.d.ts.map +1 -1
  61. package/package.json +4 -6
  62. package/src/client/config-ladder.ts +1 -1
  63. package/src/client/control.ts +1 -1
  64. package/src/client/elicitation.ts +10 -2
  65. package/src/client/footer.ts +1 -1
  66. package/src/client/panel.ts +2 -2
  67. package/src/client/prompts.ts +1 -1
  68. package/src/client/proxy-tool.ts +1 -1
  69. package/src/client/resource-naming.ts +36 -0
  70. package/src/client/settings.ts +7 -6
  71. package/src/client/tool-matching.ts +69 -0
  72. package/src/client/types.ts +80 -0
  73. package/src/client/widget-support.ts +86 -0
  74. package/src/index.ts +109 -65
  75. package/src/native/combiner-connection.ts +483 -0
  76. package/src/native/index.ts +100 -0
  77. package/src/native/resources.ts +112 -0
  78. package/src/native/tool-surface.ts +147 -0
  79. package/src/pi.ts +16 -0
  80. package/dist/client/connection.d.ts.map +0 -1
  81. package/dist/client/connection.js +0 -332
  82. package/dist/client/connection.js.map +0 -1
  83. package/dist/client/direct-tools.d.ts +0 -41
  84. package/dist/client/direct-tools.d.ts.map +0 -1
  85. package/dist/client/direct-tools.js +0 -122
  86. package/dist/client/direct-tools.js.map +0 -1
  87. package/dist/client/resources.d.ts +0 -20
  88. package/dist/client/resources.d.ts.map +0 -1
  89. package/dist/client/resources.js +0 -119
  90. package/dist/client/resources.js.map +0 -1
  91. package/dist/client/script.d.ts +0 -10
  92. package/dist/client/script.d.ts.map +0 -1
  93. package/dist/client/script.js +0 -130
  94. package/dist/client/script.js.map +0 -1
  95. package/src/client/connection.ts +0 -373
  96. package/src/client/direct-tools.ts +0 -146
  97. package/src/client/resources.ts +0 -137
  98. package/src/client/script.ts +0 -150
@@ -0,0 +1,412 @@
1
+ // NATIVE CONNECTION : the combiner MCP client rebuilt
2
+ // on @earendil-works/pi-mcp (peer dependency on pi's own published MCP package) so the
3
+ // connection is OURS and therefore the elicitation capability is OURS to declare:
4
+ //
5
+ // capabilities: { elicitation: {} } // advertised, because we CAN answer
6
+ // client.setRequestHandler("elicitation/create", …) // elicitation.ts bridge
7
+ //
8
+ // Everything else falls through to pi-mcp: transports, reconnection of dropped SSE
9
+ // streams, protocol negotiation, tool/resource listing with pagination, roots. We add
10
+ // only what the combiner needs on top: the per-Pi-session grouping token in the URL
11
+ // path, the optional inbound bearer, tools/prompts/resources caches, one stale-session
12
+ // retry, and the widget log-notification tap.
13
+ //
14
+ // CONTRACT: this class matches client/connection.ts's public surface structurally, so
15
+ // existing consumers (prompts.ts, resources.ts, footer.ts, panel.ts, control.ts) work
16
+ // unchanged and index.ts's mode gate can pick either implementation. The model-facing
17
+ // difference from the SDK client half is registration: see native/tool-surface.ts —
18
+ // tools are declared to pi NATIVELY (pi.registerTool with exposure/namespace), there is
19
+ // no mcp() proxy and no script tool.
20
+ //
21
+ // Why instantiate instead of wrapping: pi's built-in MCP extension owns its client
22
+ // instances privately; no hook reaches them (verified 0.99→1.0). Owning the connection
23
+ // is the only sanctioned way to advertise elicitation today. The two-switch upstream
24
+ // design (per-server config + handler-availability negotiation) remains the ecosystem
25
+ // endgame; this class is what the extension ships until and after that lands.
26
+ import { appendFileSync } from "node:fs";
27
+ import { McpClient, McpSessionExpiredError, StreamableHttpTransport } from "@earendil-works/pi-mcp";
28
+ import { handleElicitation } from "../client/elicitation.js";
29
+ function ncDbg(s) {
30
+ try {
31
+ appendFileSync("/tmp/pi-combiner-dbg.log", `${new Date().toISOString()} ${s}\n`);
32
+ }
33
+ catch {
34
+ // debug only
35
+ }
36
+ }
37
+ const CLIENT_INFO = { name: "pi-mcp-combiner", version: "0.14.3" };
38
+ const CONNECT_TIMEOUT_MS = 8_000;
39
+ const LIST_CACHE_MS = 5_000;
40
+ function isRecord(v) {
41
+ return typeof v === "object" && v !== null && !Array.isArray(v);
42
+ }
43
+ /** Build the tokened endpoint URL: <origin>/mcp/<token> (identical to client/connection.ts). */
44
+ export function tokenedUrl(baseUrl, token) {
45
+ try {
46
+ const u = new URL(baseUrl);
47
+ const path = u.pathname.replace(/\/mcp(?:\/[^/]*)*\/?$/, "/mcp");
48
+ u.pathname = `${path.replace(/\/$/, "")}/${encodeURIComponent(token)}`;
49
+ return u.toString();
50
+ }
51
+ catch {
52
+ return baseUrl;
53
+ }
54
+ }
55
+ export class NativeCombinerConnection {
56
+ conn;
57
+ log;
58
+ elicitUi = { hasUI: false };
59
+ token;
60
+ client;
61
+ connecting;
62
+ tools;
63
+ toolsFetchedAt = 0;
64
+ prompts;
65
+ promptsFetchedAt = 0;
66
+ resources;
67
+ resourcesFetchedAt = 0;
68
+ hooks = {};
69
+ state = "disconnected";
70
+ lastError;
71
+ constructor(conn, log) {
72
+ this.conn = conn;
73
+ this.log = log;
74
+ }
75
+ setHooks(hooks) {
76
+ this.hooks = hooks;
77
+ }
78
+ /** Effective grouping token for this session (explicit URL token wins). */
79
+ get sessionToken() {
80
+ return this.effectiveToken();
81
+ }
82
+ /** Bind the UI slice used by elicitation (called from session_start). */
83
+ bindUi(ui) {
84
+ this.elicitUi = ui;
85
+ }
86
+ /** Swap connection inputs (base URL / bearer env); drops the client when changed. */
87
+ rebind(conn) {
88
+ if (conn.baseUrl === this.conn.baseUrl &&
89
+ conn.bearerTokenEnv === this.conn.bearerTokenEnv &&
90
+ conn.urlToken === this.conn.urlToken) {
91
+ return false;
92
+ }
93
+ this.conn = conn;
94
+ void this.reset("connection rebound (session config changed)");
95
+ return true;
96
+ }
97
+ /** Set the grouping token for this session; resets any open connection. */
98
+ setToken(token) {
99
+ if (this.token === token)
100
+ return;
101
+ this.token = token;
102
+ void this.reset("token changed");
103
+ }
104
+ /** Drop the connection + caches (session reset / shutdown). Never throws. */
105
+ async reset(reason) {
106
+ const client = this.client;
107
+ this.client = undefined;
108
+ this.connecting = undefined;
109
+ this.tools = undefined;
110
+ this.prompts = undefined;
111
+ this.resources = undefined;
112
+ this.state = "disconnected";
113
+ try {
114
+ await client?.close();
115
+ }
116
+ catch {
117
+ // best-effort
118
+ }
119
+ if (reason)
120
+ this.log("info", `connection reset (${reason})`);
121
+ }
122
+ effectiveToken() {
123
+ return this.conn.urlToken ?? this.token;
124
+ }
125
+ /** Connect (idempotent, single-flight). THE elicitation-relevant site: the
126
+ * capability + request handler live HERE, on a client we own. */
127
+ async ensureConnected() {
128
+ if (this.client)
129
+ return this.client;
130
+ if (this.connecting)
131
+ return this.connecting;
132
+ const token = this.effectiveToken();
133
+ if (!token)
134
+ throw new Error("no grouping token set (session not started)");
135
+ const endpoint = tokenedUrl(this.conn.baseUrl, token);
136
+ let url;
137
+ try {
138
+ url = new URL(endpoint);
139
+ }
140
+ catch {
141
+ throw new Error(`combiner URL "${endpoint}" is not parseable; set a valid url (…/mcp) in settings or mcp.json`);
142
+ }
143
+ const bearer = this.conn.bearerTokenEnv ? process.env[this.conn.bearerTokenEnv] : undefined;
144
+ this.state = "connecting";
145
+ this.connecting = (async () => {
146
+ const client = new McpClient({
147
+ name: CLIENT_INFO.name,
148
+ version: CLIENT_INFO.version,
149
+ // Advertised elicitation — the combiner's permission gate depends on it,
150
+ // and our handler below CAN answer (decline when no dialog UI exists).
151
+ capabilities: { elicitation: {} },
152
+ // Widget holds keep a call in flight up to MCP_COMBINER_UI_HOLD_TIMEOUT
153
+ // (default 50s combiner-side); 90s headroom so the native call outlives it.
154
+ requestTimeoutMs: 90_000,
155
+ });
156
+ client.setRequestHandler("elicitation/create", async (raw, { signal }) => {
157
+ const params = isRecord(raw) ? raw : undefined;
158
+ const message = typeof params?.message === "string" ? params.message : undefined;
159
+ const requestedSchema = isRecord(params?.requestedSchema) ? params?.requestedSchema : undefined;
160
+ if (!message && !requestedSchema)
161
+ return { action: "decline" };
162
+ const result = await handleElicitation({ message, requestedSchema }, this.elicitUi, signal);
163
+ return result;
164
+ });
165
+ // pi-mcp's onNotification listeners receive the notification PARAMS directly
166
+ // (not the raw envelope) — params shape for notifications/message is
167
+ // { level, logger, data }.
168
+ client.onNotification("notifications/tools/list_changed", () => {
169
+ this.tools = undefined;
170
+ this.prompts = undefined;
171
+ this.resources = undefined;
172
+ try {
173
+ this.hooks.onToolsChanged?.();
174
+ }
175
+ catch {
176
+ // hook errors must never break the notification path
177
+ }
178
+ });
179
+ client.onNotification("notifications/resources/list_changed", () => {
180
+ this.resources = undefined;
181
+ try {
182
+ this.hooks.onToolsChanged?.();
183
+ }
184
+ catch {
185
+ // hook errors must never break the notification path
186
+ }
187
+ });
188
+ // Widget hold announces its UI URL via a log notification mid-flight.
189
+ client.onNotification("notifications/message", (params) => {
190
+ const data = (isRecord(params) ? params.data : undefined);
191
+ if (typeof data !== "string")
192
+ return;
193
+ const m = data.match(/Interactive UI ready: (\S+)/);
194
+ if (m) {
195
+ try {
196
+ this.hooks.onWidgetUrl?.(m[1]);
197
+ }
198
+ catch {
199
+ // hook errors must never break the notification path
200
+ }
201
+ }
202
+ });
203
+ client.onClose(() => {
204
+ if (this.client === client) {
205
+ this.client = undefined;
206
+ this.state = "disconnected";
207
+ this.hooks.onStateChange?.(this.state);
208
+ }
209
+ });
210
+ const transport = new StreamableHttpTransport({
211
+ url,
212
+ authProvider: bearer ? { token: async () => bearer } : undefined,
213
+ });
214
+ await Promise.race([
215
+ client.connect(transport),
216
+ new Promise((_, reject) => setTimeout(() => reject(new Error("connect timeout")), CONNECT_TIMEOUT_MS)),
217
+ ]);
218
+ this.client = client;
219
+ ncDbg(`ensureConnected: CONNECTED session=${client.sessionId ?? "?"} state=${client.transport?.sessionId ?? "?"}`);
220
+ this.state = "connected";
221
+ this.lastError = undefined;
222
+ // Catch-up after (re)connect — same rationale as client/connection.ts:
223
+ // MCP notifications are lossy for disconnected clients, so re-sync every
224
+ // surface the moment the stream is live again. Idempotent upstream.
225
+ try {
226
+ this.hooks.onToolsChanged?.();
227
+ }
228
+ catch {
229
+ // hook errors must never break the connect path
230
+ }
231
+ this.hooks.onStateChange?.(this.state);
232
+ return client;
233
+ })();
234
+ try {
235
+ return await this.connecting;
236
+ }
237
+ catch (e) {
238
+ this.state = "failed";
239
+ this.lastError = e instanceof Error ? e.message : String(e);
240
+ this.log("warn", `combiner connect failed (${this.lastError})`);
241
+ this.hooks.onStateChange?.(this.state);
242
+ throw new Error(`cannot reach the combiner at ${this.conn.baseUrl}: ${this.lastError} — the combiner may have restarted; this call did not run and is safe to retry (carried state: grants, filters, parked sessions survives restarts)`);
243
+ }
244
+ finally {
245
+ this.connecting = undefined;
246
+ }
247
+ }
248
+ /** One-shot stale-session retry shared by EVERY request method — a combiner
249
+ * bounce invalidates the transport session, and the first operation to notice
250
+ * can be any of them (the router's listTools lookup runs BEFORE callTool;
251
+ * without this it surfaced raw McpSessionExpiredError and never reset the
252
+ * client, wedging the connection until reload). Same classification as
253
+ * callTool: the typed McpSessionExpiredError first, the message regex as belt. */
254
+ async withStaleRetry(label, op) {
255
+ const client = await this.ensureConnected();
256
+ try {
257
+ return await op(client);
258
+ }
259
+ catch (e) {
260
+ const typedStale = e instanceof McpSessionExpiredError;
261
+ const msg = e instanceof Error ? e.message : String(e);
262
+ ncDbg(`${label} THROW typed=${typedStale} ${msg.slice(0, 140)}`);
263
+ const stale = typedStale || /404|stale|session|not found|closed|fetch failed|illegal/i.test(msg);
264
+ if (!stale)
265
+ throw e;
266
+ ncDbg(`${label} stale-retry FIRED`);
267
+ this.log("info", `${label} went stale (${msg}); reconnecting once`);
268
+ await this.reset("stale session");
269
+ return await op(await this.ensureConnected());
270
+ }
271
+ }
272
+ /** tools/list, cached until invalidated (list_changed / reset / reconnect).
273
+ * pi-mcp returns the tools array directly (pagination already resolved). */
274
+ async listTools(force = false) {
275
+ if (!force && this.tools && Date.now() - this.toolsFetchedAt < LIST_CACHE_MS)
276
+ return this.tools;
277
+ const client = await this.ensureConnected();
278
+ const tools = (await this.withStaleRetry("listTools", (c) => c.listTools())).map((t) => ({
279
+ name: t.name,
280
+ description: t.description,
281
+ inputSchema: t.inputSchema,
282
+ annotations: t.annotations,
283
+ }));
284
+ this.tools = tools;
285
+ this.toolsFetchedAt = Date.now();
286
+ return tools;
287
+ }
288
+ /** prompts/list, cached alongside tools. pi-mcp has no prompts convenience (yet);
289
+ * the generic request() is the sanctioned path for server-initiated methods the
290
+ * client doesn't model. */
291
+ async listPrompts(force = false) {
292
+ if (!force && this.prompts && Date.now() - this.promptsFetchedAt < LIST_CACHE_MS)
293
+ return this.prompts;
294
+ const res = await this.withStaleRetry("listPrompts", (c) => c.request("prompts/list"));
295
+ this.prompts = res.prompts ?? [];
296
+ this.promptsFetchedAt = Date.now();
297
+ return this.prompts;
298
+ }
299
+ /** prompts/get through the combiner. */
300
+ async getPrompt(name, args) {
301
+ return this.withStaleRetry(`getPrompt ${name}`, (c) => c.request("prompts/get", { name, arguments: args }));
302
+ }
303
+ /** resources/list, cached alongside tools/prompts.
304
+ * SAFETY: pi-mcp's Resource adds typed `_meta` variance the combiner surfaces as
305
+ * Record<string, unknown> — the shapes agree on the fields we consume
306
+ * (uri/name/description/mimeType), so the cast narrows only metadata typing. */
307
+ async listResources(force = false) {
308
+ if (!force && this.resources && Date.now() - this.resourcesFetchedAt < LIST_CACHE_MS)
309
+ return this.resources;
310
+ const resources = (await this.withStaleRetry("listResources", (c) => c.listResources()));
311
+ this.resources = resources;
312
+ this.resourcesFetchedAt = Date.now();
313
+ return resources;
314
+ }
315
+ /** resources/read through the combiner. */
316
+ async readResource(uri) {
317
+ return this.withStaleRetry(`readResource ${uri}`, (c) => c.readResource(uri));
318
+ }
319
+ /** callTool with one stale-session retry (combiner bounce; handover keeps token).
320
+ * A server-marked error (CallToolResult.isError) THROWS so pi records the call
321
+ * as a tool error — same convention the rest of the extension uses. */
322
+ async callTool(name, args) {
323
+ const attempt = async () => {
324
+ const client = await this.ensureConnected();
325
+ const result = await client.callTool(name, args);
326
+ if (result.isError) {
327
+ const text = (result.content ?? [])
328
+ .map((b) => (isRecord(b) && b.type === "text" && typeof b.text === "string" ? b.text : JSON.stringify(b)))
329
+ .filter(Boolean)
330
+ .join("\n");
331
+ throw new Error(`combiner tool error (${name}): ${text}`);
332
+ }
333
+ return result;
334
+ };
335
+ try {
336
+ return await attempt();
337
+ }
338
+ catch (e) {
339
+ // pi-mcp raises a TYPED McpSessionExpiredError on 404-with-session-id (the
340
+ // combiner's stale-session 404) — catch it first-class, exactly like pi's
341
+ // own builtin does ("retry once on a new session; the old client is
342
+ // detached, not closed, so other in-flight calls get their own 404 and
343
+ // retry the same way"). The message regex stays as a belt for anything
344
+ // the transport doesn't classify.
345
+ const typedStale = e instanceof McpSessionExpiredError;
346
+ const msg = e instanceof Error ? e.message : String(e);
347
+ ncDbg(`callTool ${name} THROW typed=${typedStale} status=${e?.status} ${msg.slice(0, 140)}`);
348
+ const stale = typedStale || /404|stale|session|not found|closed|fetch failed|illegal/i.test(msg);
349
+ if (!stale)
350
+ throw e;
351
+ ncDbg(`callTool ${name} stale-retry FIRED`);
352
+ this.log("info", `call "${name}" went stale (${typedStale ? "session expired (typed)" : msg}); reconnecting once`);
353
+ await this.reset("stale session");
354
+ ncDbg(`callTool ${name} reset done; retrying`);
355
+ try {
356
+ const result = await attempt();
357
+ ncDbg(`callTool ${name} RETRY SUCCEEDED`);
358
+ return result;
359
+ }
360
+ catch (e2) {
361
+ ncDbg(`callTool ${name} RETRY FAILED: ${e2 instanceof Error ? e2.message : String(e2)}`);
362
+ throw e2;
363
+ }
364
+ }
365
+ }
366
+ // ── control plane (unchanged from client/connection.ts) ─────────────────────────
367
+ controlOrigin() {
368
+ try {
369
+ return new URL(this.conn.baseUrl).origin;
370
+ }
371
+ catch {
372
+ return this.conn.baseUrl;
373
+ }
374
+ }
375
+ uiUrlFor(resourceUri) {
376
+ const token = this.effectiveToken();
377
+ if (!token || !resourceUri)
378
+ return "";
379
+ return `${this.controlOrigin()}/ui/${encodeURIComponent(token)}/?resource=${encodeURIComponent(resourceUri)}`;
380
+ }
381
+ controlHeaders() {
382
+ const token = this.conn.bearerTokenEnv ? process.env[this.conn.bearerTokenEnv] : undefined;
383
+ return token ? { authorization: `Bearer ${token}` } : {};
384
+ }
385
+ async applyFilter(filter) {
386
+ const token = this.effectiveToken();
387
+ if (!token)
388
+ throw new Error("no grouping token set (session not started)");
389
+ const body = {};
390
+ if (filter.allow?.length)
391
+ body.allowed_servers = filter.allow;
392
+ else if (filter.deny?.length)
393
+ body.disabled_servers = filter.deny;
394
+ else
395
+ return;
396
+ const res = await fetch(`${this.controlOrigin()}/sessions/token/${encodeURIComponent(token)}/filter`, {
397
+ method: "POST",
398
+ headers: { "content-type": "application/json", ...this.controlHeaders() },
399
+ body: JSON.stringify(body),
400
+ });
401
+ if (!res.ok)
402
+ throw new Error(`filter apply failed: ${res.status} ${await res.text().catch(() => "")}`);
403
+ this.log("info", `session server filter applied (${filter.allow ? "allow" : "deny"}-list)`);
404
+ }
405
+ async health() {
406
+ const res = await fetch(`${this.controlOrigin()}/health`, { headers: this.controlHeaders() });
407
+ if (!res.ok)
408
+ throw new Error(`/health returned ${res.status}`);
409
+ return res.json();
410
+ }
411
+ }
412
+ //# sourceMappingURL=combiner-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combiner-connection.js","sourceRoot":"","sources":["../../src/native/combiner-connection.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,uFAAuF;AACvF,kFAAkF;AAClF,EAAE;AACF,sFAAsF;AACtF,mFAAmF;AACnF,EAAE;AACF,mFAAmF;AACnF,sFAAsF;AACtF,oFAAoF;AACpF,uFAAuF;AACvF,8CAA8C;AAC9C,EAAE;AACF,sFAAsF;AACtF,sFAAsF;AACtF,sFAAsF;AACtF,oFAAoF;AACpF,wFAAwF;AACxF,qCAAqC;AACrC,EAAE;AACF,mFAAmF;AACnF,uFAAuF;AACvF,qFAAqF;AACrF,sFAAsF;AACtF,8EAA8E;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAEnG,OAAO,EAAE,iBAAiB,EAAsC,MAAM,0BAA0B,CAAA;AAwDhG,SAAS,KAAK,CAAC,CAAS;IACpB,IAAI,CAAC;QACD,cAAc,CAAC,0BAA0B,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACpF,CAAC;IAAC,MAAM,CAAC;QACL,aAAa;IACjB,CAAC;AACL,CAAC;AAED,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AAClE,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAChC,MAAM,aAAa,GAAG,KAAK,CAAA;AAE3B,SAAS,QAAQ,CAAC,CAAU;IACxB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,KAAa;IACrD,IAAI,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;QAChE,CAAC,CAAC,QAAQ,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;QACtE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,OAAO,CAAA;IAClB,CAAC;AACL,CAAC;AAED,MAAM,OAAO,wBAAwB;IACzB,IAAI,CAAoB;IACf,GAAG,CAAO;IACnB,QAAQ,GAAa,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACrC,KAAK,CAAoB;IACzB,MAAM,CAAuB;IAC7B,UAAU,CAAgC;IAC1C,KAAK,CAA2B;IAChC,cAAc,GAAG,CAAC,CAAA;IAClB,OAAO,CAA6B;IACpC,gBAAgB,GAAG,CAAC,CAAA;IACpB,SAAS,CAA+B;IACxC,kBAAkB,GAAG,CAAC,CAAA;IACtB,KAAK,GAAoB,EAAE,CAAA;IACnC,KAAK,GAAoB,cAAc,CAAA;IACvC,SAAS,CAAoB;IAE7B,YAAY,IAAwB,EAAE,GAAU;QAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAClB,CAAC;IAED,QAAQ,CAAC,KAAsB;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,2EAA2E;IAC3E,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,cAAc,EAAE,CAAA;IAChC,CAAC;IAED,yEAAyE;IACzE,MAAM,CAAC,EAAY;QACf,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;IACtB,CAAC;IAED,qFAAqF;IACrF,MAAM,CAAC,IAAwB;QAC3B,IACI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAClC,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc;YAChD,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EACtC,CAAC;YACC,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,KAAK,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACf,CAAC;IAED,2EAA2E;IAC3E,QAAQ,CAAC,KAAa;QAClB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,OAAM;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IACpC,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,KAAK,CAAC,MAAc;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,KAAK,GAAG,cAAc,CAAA;QAC3B,IAAI,CAAC;YACD,MAAM,MAAM,EAAE,KAAK,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACL,cAAc;QAClB,CAAC;QACD,IAAI,MAAM;YAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,MAAM,GAAG,CAAC,CAAA;IAChE,CAAC;IAEO,cAAc;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAA;IAC3C,CAAC;IAED;sEACkE;IAClE,KAAK,CAAC,eAAe;QACjB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QACnC,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAA;QAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACrD,IAAI,GAAQ,CAAA;QACZ,IAAI,CAAC;YACD,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3B,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,qEAAqE,CAAC,CAAA;QACnH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAE3F,IAAI,CAAC,KAAK,GAAG,YAAY,CAAA;QACzB,IAAI,CAAC,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;gBACzB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,yEAAyE;gBACzE,uEAAuE;gBACvE,YAAY,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;gBACjC,wEAAwE;gBACxE,4EAA4E;gBAC5E,gBAAgB,EAAE,MAAM;aAC3B,CAAC,CAAA;YAEF,MAAM,CAAC,iBAAiB,CACpB,oBAAoB,EACpB,KAAK,EAAE,GAAY,EAAE,EAAE,MAAM,EAA2B,EAAyB,EAAE;gBAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC9C,MAAM,OAAO,GAAG,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;gBAChF,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC/F,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe;oBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;gBAC9D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC3F,OAAO,MAAsB,CAAA;YACjC,CAAC,CACJ,CAAA;YAED,6EAA6E;YAC7E,qEAAqE;YACrE,2BAA2B;YAC3B,MAAM,CAAC,cAAc,CAAC,kCAAkC,EAAE,GAAG,EAAE;gBAC3D,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;gBACtB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;gBACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;gBAC1B,IAAI,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAA;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACL,qDAAqD;gBACzD,CAAC;YACL,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,cAAc,CAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC/D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;gBAC1B,IAAI,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAA;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACL,qDAAqD;gBACzD,CAAC;YACL,CAAC,CAAC,CAAA;YACF,sEAAsE;YACtE,MAAM,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC,MAAe,EAAE,EAAE;gBAC/D,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;gBACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAM;gBACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;gBACnD,IAAI,CAAC,EAAE,CAAC;oBACJ,IAAI,CAAC;wBACD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBAClC,CAAC;oBAAC,MAAM,CAAC;wBACL,qDAAqD;oBACzD,CAAC;gBACL,CAAC;YACL,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACzB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;oBACvB,IAAI,CAAC,KAAK,GAAG,cAAc,CAAA;oBAC3B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC1C,CAAC;YACL,CAAC,CAAC,CAAA;YAEF,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC;gBAC1C,GAAG;gBACH,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aACnE,CAAC,CAAA;YACF,MAAM,OAAO,CAAC,IAAI,CAAC;gBACf,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;gBACzB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;aACzG,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;YACpB,KAAK,CAAC,sCAAuC,MAA4C,CAAC,SAAS,IAAI,GAAG,UAAW,MAA4D,CAAC,SAAS,EAAE,SAAS,IAAI,GAAG,EAAE,CAAC,CAAA;YAChN,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;YACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;YAC1B,uEAAuE;YACvE,yEAAyE;YACzE,oEAAoE;YACpE,IAAI,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAA;YACjC,CAAC;YAAC,MAAM,CAAC;gBACL,gDAAgD;YACpD,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACtC,OAAO,MAAM,CAAA;QACjB,CAAC,CAAC,EAAE,CAAA;QAEJ,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAA;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;YACrB,IAAI,CAAC,SAAS,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC3D,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,4BAA4B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAC/D,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,oJAAoJ,CAAC,CAAA;QAC7O,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC/B,CAAC;IACL,CAAC;IAED;;;;;uFAKmF;IAC3E,KAAK,CAAC,cAAc,CAAI,KAAa,EAAE,EAAqC;QAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAC3C,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAA;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,UAAU,GAAG,CAAC,YAAY,sBAAsB,CAAA;YACtD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACtD,KAAK,CAAC,GAAG,KAAK,gBAAgB,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;YAChE,MAAM,KAAK,GACP,UAAU,IAAI,0DAA0D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACtF,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,CAAA;YACnB,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAA;YACnC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,gBAAgB,GAAG,sBAAsB,CAAC,CAAA;YACnE,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YACjC,OAAO,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;QACjD,CAAC;IACL,CAAC;IAED;iFAC6E;IAC7E,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK;QACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,GAAG,aAAa;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QAC/F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAC3C,MAAM,KAAK,GAAkB,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpG,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAiD;SACnE,CAAC,CAAC,CAAA;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAChC,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;gCAE4B;IAC5B,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK;QAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,aAAa;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACrG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CACvD,CAAC,CAAC,OAAO,CAA+B,cAAc,CAAC,CAC1D,CAAA;QACD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAA;QAChC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAClC,OAAO,IAAI,CAAC,OAAO,CAAA;IACvB,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAA4B;QACtD,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAClD,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CACtD,CAAA;IACL,CAAC;IAED;;;qFAGiF;IACjF,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK;QAC7B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,GAAG,aAAa;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QAC3G,MAAM,SAAS,GAAuB,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CACpF,CAAC,CAAC,aAAa,EAAE,CACpB,CAAkC,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACpC,OAAO,SAAS,CAAA;IACpB,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,YAAY,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IACjF,CAAC;IAED;;4EAEwE;IACxE,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAyC;QAClE,MAAM,OAAO,GAAG,KAAK,IAA6B,EAAE;YAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;YAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAChD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;qBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;qBACzG,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,IAAI,CAAC,CAAA;gBACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,MAAM,IAAI,EAAE,CAAC,CAAA;YAC7D,CAAC;YACD,OAAO,MAAM,CAAA;QACjB,CAAC,CAAA;QACD,IAAI,CAAC;YACD,OAAO,MAAM,OAAO,EAAE,CAAA;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,2EAA2E;YAC3E,0EAA0E;YAC1E,oEAAoE;YACpE,uEAAuE;YACvE,uEAAuE;YACvE,kCAAkC;YAClC,MAAM,UAAU,GAAG,CAAC,YAAY,sBAAsB,CAAA;YACtD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACtD,KAAK,CAAC,YAAY,IAAI,gBAAgB,UAAU,WAAY,CAAgC,EAAE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;YAC5H,MAAM,KAAK,GAAG,UAAU,IAAI,0DAA0D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChG,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,CAAA;YACnB,KAAK,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAA;YAC3C,IAAI,CAAC,GAAG,CACJ,MAAM,EACN,SAAS,IAAI,iBAAiB,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,sBAAsB,CACnG,CAAA;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YACjC,KAAK,CAAC,YAAY,IAAI,uBAAuB,CAAC,CAAA;YAC9C,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAA;gBAC9B,KAAK,CAAC,YAAY,IAAI,kBAAkB,CAAC,CAAA;gBACzC,OAAO,MAAM,CAAA;YACjB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACV,KAAK,CAAC,YAAY,IAAI,kBAAkB,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBACxF,MAAM,EAAE,CAAA;YACZ,CAAC;QACL,CAAC;IACL,CAAC;IAED,mFAAmF;IAEnF,aAAa;QACT,IAAI,CAAC;YACD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAA;QAC5B,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,WAAmB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACnC,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAA;QACrC,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,cAAc,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAA;IACjH,CAAC;IAEO,cAAc;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1F,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAoB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC1E,MAAM,IAAI,GAA4B,EAAE,CAAA;QACxC,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM;YAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAA;aACxD,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM;YAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAA;;YAC5D,OAAM;QACX,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE;YAClG,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE;YACzE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACtG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,kCAAkC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAA;IAC/F,CAAC;IAED,KAAK,CAAC,MAAM;QACR,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;QAC7F,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC9D,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IACrB,CAAC;CACJ"}
@@ -0,0 +1,30 @@
1
+ import type { ExtensionAPI, ExtensionContext } from "../pi.js";
2
+ import type { ServerFilter } from "../client/config-ladder.js";
3
+ import { NativeCombinerConnection } from "./combiner-connection.js";
4
+ export { NativeCombinerConnection } from "./combiner-connection.js";
5
+ export { activateNativeTools, type NativeToolSurfaceOptions } from "./tool-surface.js";
6
+ export { tokenedUrl } from "./combiner-connection.js";
7
+ export { activateNativeResources, filterInteractiveResources, type NativeResourceOptions } from "./resources.js";
8
+ export type NativeActivationOptions = {
9
+ connection: NativeCombinerConnection;
10
+ directSpec?: string[] | "search";
11
+ serverFilter?: ServerFilter;
12
+ /** Register the interactive read_<resource> tools (index.ts's exposeResources
13
+ * setting); default true. */
14
+ exposeResources?: boolean;
15
+ /** Auto-open widget URLs (index.ts's uiAutoOpen setting); default true. */
16
+ uiAutoOpen?: boolean;
17
+ /** Warn when the direct-exposure set grows large; settings kill-switch
18
+ * warnLargeDirectExposure disables it (default true, i.e. warn). */
19
+ warnLargeDirectExposure?: boolean;
20
+ log: (level: "info" | "warn" | "error", message: string) => void;
21
+ };
22
+ /** Register the declared tool surface + interactive-resource read_* tools + the
23
+ * list_changed re-registration handler. Called once at session_start; the
24
+ * list_changed hook re-syncs both surfaces on the same names. */
25
+ export declare function activateNativeMode(pi: ExtensionAPI, opts: NativeActivationOptions): {
26
+ run(): void;
27
+ dispose(): void;
28
+ };
29
+ export type { ExtensionContext };
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAInE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEhH,MAAM,MAAM,uBAAuB,GAAG;IAClC,UAAU,EAAE,wBAAwB,CAAA;IACpC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;IAChC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;kCAC8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;yEACqE;IACrE,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACnE,CAAA;AAED;;kEAEkE;AAClE,wBAAgB,kBAAkB,CAC9B,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,uBAAuB,GAC9B;IAAE,GAAG,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAwClC;AAaD,YAAY,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,61 @@
1
+ // NATIVE MODE : activation entry for the
2
+ // pi-mcp-based combiner connection + native tool surface. This file exists so the
3
+ // wire-in stays a few lines in src/index.ts's mode gate while the shape is reviewed:
4
+ //
5
+ // const native = settings.integration === "nativeTools" // new tri-state member
6
+ // const conn = native ? new NativeCombinerConnection(…, clientLog) // same contract
7
+ // : new CombinerConnection(…, clientLog)
8
+ // if (native) void activateNativeTools(pi, { connection: conn, ... }) as needed
9
+ //
10
+ // Mode matrix (the native-migration plan item):: extension-owned connection (peer dep on @earendil-works/pi-mcp) + native
11
+ // tool declaration via pi.registerTool(exposure/namespace/annotations) = native
12
+ // exposure with elicitation STILL ANSWERED (capability advertised on the owned
13
+ // connection) — no mcp() proxy, no script tool, no upstream PR required for v1.
14
+ import { activateNativeTools } from "./tool-surface.js";
15
+ import { activateNativeResources } from "./resources.js";
16
+ export { NativeCombinerConnection } from "./combiner-connection.js";
17
+ export { activateNativeTools } from "./tool-surface.js";
18
+ export { tokenedUrl } from "./combiner-connection.js";
19
+ export { activateNativeResources, filterInteractiveResources } from "./resources.js";
20
+ /** Register the declared tool surface + interactive-resource read_* tools + the
21
+ * list_changed re-registration handler. Called once at session_start; the
22
+ * list_changed hook re-syncs both surfaces on the same names. */
23
+ export function activateNativeMode(pi, opts) {
24
+ const resourceRegistered = new Set();
25
+ let active = true;
26
+ const resourceOpts = {
27
+ connection: opts.connection,
28
+ serverFilter: opts.serverFilter,
29
+ uiAutoOpen: opts.uiAutoOpen,
30
+ log: opts.log,
31
+ };
32
+ const run = () => {
33
+ if (!active)
34
+ return;
35
+ void activateNativeTools(pi, {
36
+ connection: opts.connection,
37
+ serverFilter: opts.serverFilter,
38
+ directSpec: opts.directSpec,
39
+ warnLargeDirectExposure: opts.warnLargeDirectExposure,
40
+ log: opts.log,
41
+ }).catch((e) => opts.log("warn", `native tool surface failed: ${e instanceof Error ? e.message : String(e)}`));
42
+ if (opts.exposeResources !== false) {
43
+ void activateNativeResources(pi, resourceOpts, resourceRegistered).catch((e) => opts.log("warn", `native resource surface failed: ${e instanceof Error ? e.message : String(e)}`));
44
+ }
45
+ };
46
+ // The FIRST run is the caller's to schedule: the grouping token only exists
47
+ // after session_start (the connection refuses to connect without it), so a
48
+ // factory-time run() would fail with "no grouping token set" — the startup
49
+ // warnings this signature used to emit. index.ts calls run() at
50
+ // session_start (post-setToken) and from its own onToolsChanged hook; we
51
+ // deliberately do NOT setHooks here — a second setHooks call from the
52
+ // wiring would replace ours wholesale (last-wins), so the re-sync lives in
53
+ // ONE hook set, index.ts's.
54
+ return {
55
+ run,
56
+ dispose() {
57
+ active = false;
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,kFAAkF;AAClF,qFAAqF;AACrF,EAAE;AACF,oFAAoF;AACpF,wFAAwF;AACxF,gEAAgE;AAChE,kFAAkF;AAClF,EAAE;AACF,0HAA0H;AAC1H,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAKhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAiC,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAA8B,MAAM,gBAAgB,CAAA;AAiBhH;;kEAEkE;AAClE,MAAM,UAAU,kBAAkB,CAC9B,EAAgB,EAChB,IAA6B;IAE7B,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC5C,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,MAAM,YAAY,GAAG;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;KAChB,CAAA;IACD,MAAM,GAAG,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,KAAK,mBAAmB,CAAC,EAAE,EAAE;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,GAAG,EAAE,IAAI,CAAC,GAAG;SAChB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,+BAA+B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAChG,CAAA;QACD,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YACjC,KAAK,uBAAuB,CAAC,EAAE,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3E,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mCAAmC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CACpG,CAAA;QACL,CAAC;IACL,CAAC,CAAA;IACD,4EAA4E;IAC5E,2EAA2E;IAC3E,2EAA2E;IAC3E,gEAAgE;IAChE,yEAAyE;IACzE,sEAAsE;IACtE,2EAA2E;IAC3E,4BAA4B;IAC5B,OAAO;QACH,GAAG;QACH,OAAO;YACH,MAAM,GAAG,KAAK,CAAA;QAClB,CAAC;KACJ,CAAA;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ExtensionAPI } from "../pi.js";
2
+ import type { NativeCombinerConnection, ResourceSummary } from "./combiner-connection.js";
3
+ import type { ServerFilter } from "../client/config-ladder.js";
4
+ export type NativeResourceOptions = {
5
+ connection: NativeCombinerConnection;
6
+ /** Per-project server filter, same semantics as legacy filterResources. */
7
+ serverFilter?: ServerFilter;
8
+ /** Auto-open the widget URL on read (index.ts's uiAutoOpen setting). */
9
+ uiAutoOpen?: boolean;
10
+ log: (level: "info" | "warn" | "error", message: string) => void;
11
+ };
12
+ /** Project server filter for resources — mirrors legacy filterResources
13
+ * attribution semantics (uri host first, `<server>_` name-prefix fallback). */
14
+ export declare function filterInteractiveResources(resources: ResourceSummary[], filter: ServerFilter | undefined): ResourceSummary[];
15
+ /** Register read_* tools for the interactive resources (idempotent, like legacy).
16
+ * Returns the tool names registered this pass. */
17
+ export declare function activateNativeResources(pi: ExtensionAPI, opts: NativeResourceOptions, registered: Set<string>): Promise<string[]>;
18
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/native/resources.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,UAAU,CAAA;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAGzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,MAAM,qBAAqB,GAAG;IAChC,UAAU,EAAE,wBAAwB,CAAA;IACpC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACnE,CAAA;AAED;gFACgF;AAChF,wBAAgB,0BAA0B,CACtC,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,YAAY,GAAG,SAAS,GACjC,eAAe,EAAE,CAUnB;AAoCD;mDACmD;AACnD,wBAAsB,uBAAuB,CACzC,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,qBAAqB,EAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}