@zackbart/connecta 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +249 -0
  4. package/SECURITY.md +25 -0
  5. package/assets/connecta-clay-hero.png +0 -0
  6. package/dist/activity.d.ts +82 -0
  7. package/dist/activity.d.ts.map +1 -0
  8. package/dist/activity.js +51 -0
  9. package/dist/activity.js.map +1 -0
  10. package/dist/auth/bearer.d.ts +10 -0
  11. package/dist/auth/bearer.d.ts.map +1 -0
  12. package/dist/auth/bearer.js +47 -0
  13. package/dist/auth/bearer.js.map +1 -0
  14. package/dist/auth/clerk.d.ts +20 -0
  15. package/dist/auth/clerk.d.ts.map +1 -0
  16. package/dist/auth/clerk.js +167 -0
  17. package/dist/auth/clerk.js.map +1 -0
  18. package/dist/auth/downstream-oauth.d.ts +78 -0
  19. package/dist/auth/downstream-oauth.d.ts.map +1 -0
  20. package/dist/auth/downstream-oauth.js +180 -0
  21. package/dist/auth/downstream-oauth.js.map +1 -0
  22. package/dist/catalog.d.ts +11 -0
  23. package/dist/catalog.d.ts.map +1 -0
  24. package/dist/catalog.js +144 -0
  25. package/dist/catalog.js.map +1 -0
  26. package/dist/connectors/api.d.ts +34 -0
  27. package/dist/connectors/api.d.ts.map +1 -0
  28. package/dist/connectors/api.js +36 -0
  29. package/dist/connectors/api.js.map +1 -0
  30. package/dist/connectors/remote-mcp.d.ts +33 -0
  31. package/dist/connectors/remote-mcp.d.ts.map +1 -0
  32. package/dist/connectors/remote-mcp.js +255 -0
  33. package/dist/connectors/remote-mcp.js.map +1 -0
  34. package/dist/credentials.d.ts +33 -0
  35. package/dist/credentials.d.ts.map +1 -0
  36. package/dist/credentials.js +177 -0
  37. package/dist/credentials.js.map +1 -0
  38. package/dist/execute.d.ts +40 -0
  39. package/dist/execute.d.ts.map +1 -0
  40. package/dist/execute.js +424 -0
  41. package/dist/execute.js.map +1 -0
  42. package/dist/executors/quickjs.d.ts +26 -0
  43. package/dist/executors/quickjs.d.ts.map +1 -0
  44. package/dist/executors/quickjs.js +267 -0
  45. package/dist/executors/quickjs.js.map +1 -0
  46. package/dist/favicon.d.ts +2 -0
  47. package/dist/favicon.d.ts.map +1 -0
  48. package/dist/favicon.js +49 -0
  49. package/dist/favicon.js.map +1 -0
  50. package/dist/index.d.ts +85 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +73 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/mcp-result.d.ts +9 -0
  55. package/dist/mcp-result.d.ts.map +1 -0
  56. package/dist/mcp-result.js +35 -0
  57. package/dist/mcp-result.js.map +1 -0
  58. package/dist/meta-tools.d.ts +100 -0
  59. package/dist/meta-tools.d.ts.map +1 -0
  60. package/dist/meta-tools.js +797 -0
  61. package/dist/meta-tools.js.map +1 -0
  62. package/dist/node.d.ts +9 -0
  63. package/dist/node.d.ts.map +1 -0
  64. package/dist/node.js +57 -0
  65. package/dist/node.js.map +1 -0
  66. package/dist/registry.d.ts +78 -0
  67. package/dist/registry.d.ts.map +1 -0
  68. package/dist/registry.js +299 -0
  69. package/dist/registry.js.map +1 -0
  70. package/dist/server.d.ts +31 -0
  71. package/dist/server.d.ts.map +1 -0
  72. package/dist/server.js +543 -0
  73. package/dist/server.js.map +1 -0
  74. package/dist/skills.d.ts +8 -0
  75. package/dist/skills.d.ts.map +1 -0
  76. package/dist/skills.js +60 -0
  77. package/dist/skills.js.map +1 -0
  78. package/dist/storage/file.d.ts +8 -0
  79. package/dist/storage/file.d.ts.map +1 -0
  80. package/dist/storage/file.js +53 -0
  81. package/dist/storage/file.js.map +1 -0
  82. package/dist/storage/memory.d.ts +4 -0
  83. package/dist/storage/memory.d.ts.map +1 -0
  84. package/dist/storage/memory.js +29 -0
  85. package/dist/storage/memory.js.map +1 -0
  86. package/dist/types.d.ts +219 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +3 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui.d.ts +91 -0
  91. package/dist/ui.d.ts.map +1 -0
  92. package/dist/ui.js +1031 -0
  93. package/dist/ui.js.map +1 -0
  94. package/package.json +96 -0
  95. package/src/activity.ts +144 -0
  96. package/src/auth/bearer.ts +54 -0
  97. package/src/auth/clerk.ts +226 -0
  98. package/src/auth/downstream-oauth.ts +202 -0
  99. package/src/catalog.ts +166 -0
  100. package/src/connectors/api.ts +80 -0
  101. package/src/connectors/remote-mcp.ts +324 -0
  102. package/src/credentials.ts +259 -0
  103. package/src/execute.ts +550 -0
  104. package/src/executors/quickjs.ts +321 -0
  105. package/src/favicon.ts +53 -0
  106. package/src/index.ts +197 -0
  107. package/src/mcp-result.ts +43 -0
  108. package/src/meta-tools.ts +1120 -0
  109. package/src/node.ts +62 -0
  110. package/src/registry.ts +400 -0
  111. package/src/server.ts +758 -0
  112. package/src/skills.ts +63 -0
  113. package/src/storage/file.ts +62 -0
  114. package/src/storage/memory.ts +34 -0
  115. package/src/types.ts +254 -0
  116. package/src/ui.ts +1121 -0
package/dist/server.js ADDED
@@ -0,0 +1,543 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
3
+ import { registerExecuteTool } from "./execute.js";
4
+ import { registerMetaTools } from "./meta-tools.js";
5
+ import { CONNECTA_INSTRUCTIONS } from "./skills.js";
6
+ import { InvalidActivityCursorError } from "./activity.js";
7
+ import { CONNECTA_FAVICON_ICO } from "./favicon.js";
8
+ import { buildUiData, CONNECTA_FAVICON_SVG, resolveBranding, renderUiHtml, } from "./ui.js";
9
+ const CORS_HEADERS = {
10
+ "Access-Control-Allow-Origin": "*",
11
+ "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
12
+ "Access-Control-Allow-Headers": "Content-Type, Authorization, mcp-protocol-version, mcp-session-id",
13
+ };
14
+ function msg(err) {
15
+ return err instanceof Error ? err.message : String(err);
16
+ }
17
+ function escapeHtml(s) {
18
+ return s
19
+ .replaceAll("&", "&")
20
+ .replaceAll("<", "&lt;")
21
+ .replaceAll(">", "&gt;")
22
+ .replaceAll('"', "&quot;");
23
+ }
24
+ /** `body` is escaped — callback params and error messages are attacker-influenced. */
25
+ function html(body, status = 200, branding) {
26
+ const brand = resolveBranding(branding);
27
+ const title = brand.ownerName
28
+ ? `${brand.productName} — ${brand.ownerName}`
29
+ : brand.productName;
30
+ const owner = brand.ownerName
31
+ ? brand.ownerUrl
32
+ ? `<a class="brand" href="${escapeHtml(brand.ownerUrl)}">${escapeHtml(brand.ownerName)}</a>`
33
+ : `<span class="brand">${escapeHtml(brand.ownerName)}</span>`
34
+ : `<span class="brand">${escapeHtml(brand.productName)}</span>`;
35
+ const product = brand.ownerName
36
+ ? `<span class="product">${escapeHtml(brand.productName)}</span>`
37
+ : "";
38
+ return new Response(`<!doctype html>
39
+ <html lang="en">
40
+ <head>
41
+ <meta charset="utf-8">
42
+ <meta name="viewport" content="width=device-width,initial-scale=1">
43
+ <meta name="theme-color" content="#ffffff">
44
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
45
+ <link rel="shortcut icon" href="/favicon.ico">
46
+ <title>${escapeHtml(title)}</title>
47
+ <style>
48
+ * { border-radius: 0; box-sizing: border-box; }
49
+ html { color: #000; background: #fff; font: 16px/1.5 "Helvetica Neue",
50
+ Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
51
+ body { margin: 0; min-height: 100vh; }
52
+ ::selection { color: #fff; background: #000; }
53
+ .shell { margin: 0 auto; max-width: 70rem; padding: 1rem; }
54
+ .grid { display: grid; gap: 1rem 1.5rem;
55
+ grid-template-columns: repeat(3, minmax(0, 1fr)); }
56
+ .brand { font-weight: 500; grid-column: 1; text-decoration: none; }
57
+ .product { grid-column: 2 / -1; }
58
+ main { margin-top: 5rem; }
59
+ h1, p { font: inherit; margin: 0; }
60
+ h1 { grid-column: 1; }
61
+ .copy { grid-column: 2 / -1; max-width: 34em; }
62
+ .copy > * + * { margin-top: 1.5rem; }
63
+ a { color: inherit; text-decoration: underline; text-decoration-thickness: 1.5px;
64
+ text-underline-offset: .22em; }
65
+ a:hover { text-decoration-color: transparent; }
66
+ a:focus-visible { outline: 1px solid #000; outline-offset: 2px; }
67
+ @media (max-width: 36.99rem) {
68
+ .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
69
+ .product { grid-column: 2; }
70
+ main { margin-top: 3rem; }
71
+ h1, .copy { grid-column: 1 / -1; }
72
+ }
73
+ </style>
74
+ </head>
75
+ <body>
76
+ <header class="shell grid">
77
+ ${owner}
78
+ ${product}
79
+ </header>
80
+ <main class="shell grid">
81
+ <h1>Connection status</h1>
82
+ <div class="copy">
83
+ <p>${escapeHtml(body)}</p>
84
+ <p><a href="/ui">Return to ${escapeHtml(brand.productName)}</a></p>
85
+ </div>
86
+ </main>
87
+ </body>
88
+ </html>`, { status, headers: { "Content-Type": "text/html; charset=utf-8" } });
89
+ }
90
+ async function authorize(request, baseUrl, auth) {
91
+ if (auth.length === 0) {
92
+ return { ok: true, actor: { kind: "anonymous" } };
93
+ }
94
+ let lastResponse = null;
95
+ for (const provider of auth) {
96
+ const result = await provider.authorize(request, baseUrl);
97
+ if (result.ok) {
98
+ const subjectId = result.subjectId ?? result.userId;
99
+ return {
100
+ ok: true,
101
+ actor: {
102
+ kind: provider.kind,
103
+ ...(subjectId ? { id: subjectId } : {}),
104
+ },
105
+ providerKind: provider.kind,
106
+ ...(result.userId ? { userId: result.userId } : {}),
107
+ };
108
+ }
109
+ lastResponse = result.response;
110
+ }
111
+ return {
112
+ ok: false,
113
+ response: lastResponse ??
114
+ new Response(JSON.stringify({ error: "unauthorized" }), {
115
+ status: 401,
116
+ headers: {
117
+ "Content-Type": "application/json",
118
+ "WWW-Authenticate": "Bearer",
119
+ },
120
+ }),
121
+ };
122
+ }
123
+ function privateJson(body, init = {}) {
124
+ const headers = new Headers(init.headers);
125
+ headers.set("Content-Type", "application/json");
126
+ headers.set("Cache-Control", "no-store");
127
+ headers.set("Referrer-Policy", "no-referrer");
128
+ return new Response(JSON.stringify(body), { ...init, headers });
129
+ }
130
+ // Browser-based MCP clients call /mcp cross-origin. Without CORS on every
131
+ // response — errors included — the browser hides the 401, the client cannot
132
+ // read WWW-Authenticate, and OAuth discovery silently never starts.
133
+ function withMcpCors(response) {
134
+ const headers = new Headers(response.headers);
135
+ for (const [name, value] of Object.entries(CORS_HEADERS)) {
136
+ headers.set(name, value);
137
+ }
138
+ headers.set("Access-Control-Expose-Headers", "WWW-Authenticate, mcp-session-id, mcp-protocol-version");
139
+ return new Response(response.body, {
140
+ status: response.status,
141
+ statusText: response.statusText,
142
+ headers,
143
+ });
144
+ }
145
+ function withSecurityHeaders(response, requestUrl, path) {
146
+ const headers = new Headers(response.headers);
147
+ headers.set("X-Content-Type-Options", "nosniff");
148
+ headers.set("Referrer-Policy", "no-referrer");
149
+ if (requestUrl.protocol === "https:") {
150
+ headers.set("Strict-Transport-Security", "max-age=31536000");
151
+ }
152
+ if (path === "/ui") {
153
+ // A directive-only CSP does not interfere with the UI's existing scripts,
154
+ // while preventing the authenticated operator surface from being framed.
155
+ headers.set("Content-Security-Policy", "frame-ancestors 'none'");
156
+ headers.set("X-Frame-Options", "DENY");
157
+ }
158
+ return new Response(response.body, {
159
+ status: response.status,
160
+ statusText: response.statusText,
161
+ headers,
162
+ });
163
+ }
164
+ async function authorizeUiAdmin(request, baseUrl, auth) {
165
+ // Credential mutation is intentionally narrower than /mcp and /ui/data:
166
+ // only the interactive Clerk provider may admit it. A static bearer token is
167
+ // useful for headless tool calls but must not become a vault-admin key.
168
+ const provider = auth.find((candidate) => candidate.uiAuth?.kind === "clerk");
169
+ if (!provider) {
170
+ return {
171
+ ok: false,
172
+ response: privateJson({ error: "credential management requires Clerk authentication" }, { status: 403 }),
173
+ };
174
+ }
175
+ const result = await provider.authorize(request, baseUrl);
176
+ if (!result.ok)
177
+ return result;
178
+ if (!result.userId) {
179
+ return {
180
+ ok: false,
181
+ response: privateJson({ error: "authenticated user required" }, { status: 403 }),
182
+ };
183
+ }
184
+ return { ok: true, userId: result.userId };
185
+ }
186
+ function isSameOrigin(request, baseUrl) {
187
+ const origin = request.headers.get("origin");
188
+ if (!origin)
189
+ return false;
190
+ try {
191
+ return new URL(origin).origin === new URL(baseUrl).origin;
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ }
197
+ async function readCredentialInput(request, config) {
198
+ if (!request.headers
199
+ .get("content-type")
200
+ ?.toLowerCase()
201
+ .startsWith("application/json")) {
202
+ return {
203
+ ok: false,
204
+ response: privateJson({ error: "Content-Type must be application/json" }, { status: 415 }),
205
+ };
206
+ }
207
+ const raw = await request.text();
208
+ if (raw.length > 20_000) {
209
+ return {
210
+ ok: false,
211
+ response: privateJson({ error: "request body is too large" }, { status: 413 }),
212
+ };
213
+ }
214
+ try {
215
+ const body = JSON.parse(raw);
216
+ if (!config.fields?.length) {
217
+ if (typeof body.value !== "string" || !body.value.trim()) {
218
+ return {
219
+ ok: false,
220
+ response: privateJson({ error: "value must be a non-empty string" }, { status: 400 }),
221
+ };
222
+ }
223
+ return { ok: true, input: { kind: "single", value: body.value } };
224
+ }
225
+ if (!body.values ||
226
+ typeof body.values !== "object" ||
227
+ Array.isArray(body.values)) {
228
+ return {
229
+ ok: false,
230
+ response: privateJson({ error: "values must be an object" }, { status: 400 }),
231
+ };
232
+ }
233
+ const rawValues = body.values;
234
+ const expected = new Set(config.fields.map((field) => field.name));
235
+ const unexpected = Object.keys(rawValues).find((field) => !expected.has(field));
236
+ if (unexpected) {
237
+ return {
238
+ ok: false,
239
+ response: privateJson({ error: `unexpected credential field "${unexpected}"` }, { status: 400 }),
240
+ };
241
+ }
242
+ const values = {};
243
+ for (const field of config.fields) {
244
+ const value = rawValues[field.name];
245
+ if (typeof value !== "string" || !value.trim()) {
246
+ return {
247
+ ok: false,
248
+ response: privateJson({ error: `${field.name} must be a non-empty string` }, { status: 400 }),
249
+ };
250
+ }
251
+ values[field.name] = value;
252
+ }
253
+ return { ok: true, input: { kind: "multiple", values } };
254
+ }
255
+ catch {
256
+ return {
257
+ ok: false,
258
+ response: privateJson({ error: "invalid JSON body" }, { status: 400 }),
259
+ };
260
+ }
261
+ }
262
+ async function handleCredentialRequest(request, connectorId, action, opts, baseUrl) {
263
+ if (!opts.credentialVault) {
264
+ return privateJson({ error: "credential storage is not configured" }, { status: 503 });
265
+ }
266
+ if (!isSameOrigin(request, baseUrl)) {
267
+ return privateJson({ error: "same-origin request required" }, { status: 403 });
268
+ }
269
+ const admin = await authorizeUiAdmin(request, baseUrl, opts.auth);
270
+ if (!admin.ok)
271
+ return admin.response;
272
+ const connector = opts.registry.getConnector(connectorId);
273
+ if (!connector?.credential) {
274
+ return privateJson({ error: "unknown credential slot" }, { status: 404 });
275
+ }
276
+ if (action === "test") {
277
+ if (request.method !== "POST") {
278
+ return privateJson({ error: "method not allowed" }, { status: 405 });
279
+ }
280
+ if (!connector.testCredential && !connector.testCredentials) {
281
+ return privateJson({ error: "this connector does not support credential testing" }, { status: 400 });
282
+ }
283
+ try {
284
+ const ctx = opts.registry.contextFor(connectorId, baseUrl);
285
+ let result;
286
+ if (connector.testCredentials) {
287
+ const values = await opts.credentialVault.getAll(connectorId);
288
+ if (!values) {
289
+ return privateJson({ error: "configure the credentials before testing them" }, { status: 409 });
290
+ }
291
+ result = await connector.testCredentials(values, ctx);
292
+ }
293
+ else {
294
+ const value = await opts.credentialVault.get(connectorId);
295
+ if (!value) {
296
+ return privateJson({ error: "configure the credential before testing it" }, { status: 409 });
297
+ }
298
+ result = await connector.testCredential(value, ctx);
299
+ }
300
+ return privateJson(result);
301
+ }
302
+ catch (err) {
303
+ return privateJson({ ok: false, message: msg(err) });
304
+ }
305
+ }
306
+ if (action) {
307
+ return privateJson({ error: "not found" }, { status: 404 });
308
+ }
309
+ if (request.method === "PUT") {
310
+ const input = await readCredentialInput(request, connector.credential);
311
+ if (!input.ok)
312
+ return input.response;
313
+ try {
314
+ const metadata = input.input.kind === "single"
315
+ ? await opts.credentialVault.set(connectorId, input.input.value, admin.userId)
316
+ : await opts.credentialVault.setAll(connectorId, input.input.values, admin.userId);
317
+ opts.registry.invalidate(connectorId);
318
+ return privateJson({ credential: metadata });
319
+ }
320
+ catch (err) {
321
+ return privateJson({ error: msg(err) }, { status: 400 });
322
+ }
323
+ }
324
+ if (request.method === "DELETE") {
325
+ await opts.credentialVault.delete(connectorId);
326
+ opts.registry.invalidate(connectorId);
327
+ return new Response(null, {
328
+ status: 204,
329
+ headers: {
330
+ "Cache-Control": "no-store",
331
+ "Referrer-Policy": "no-referrer",
332
+ },
333
+ });
334
+ }
335
+ return privateJson({ error: "method not allowed" }, { status: 405 });
336
+ }
337
+ async function serveMcp(request, opts, baseUrl, actor, runtimeContext) {
338
+ // Fresh McpServer + transport per request (SDK ≥1.26 requirement), stateless.
339
+ const server = new McpServer(opts.serverInfo, {
340
+ instructions: CONNECTA_INSTRUCTIONS,
341
+ });
342
+ const activity = opts.activity
343
+ ? {
344
+ sink: opts.activity,
345
+ actor,
346
+ requestId: crypto.randomUUID(),
347
+ serverInfo: opts.serverInfo,
348
+ ...(opts.activityDeploymentId
349
+ ? { deploymentId: opts.activityDeploymentId }
350
+ : {}),
351
+ ...(runtimeContext?.waitUntil
352
+ ? { defer: runtimeContext.waitUntil.bind(runtimeContext) }
353
+ : {}),
354
+ logger: opts.logger,
355
+ }
356
+ : undefined;
357
+ registerMetaTools(server, opts.registry, { baseUrl, activity });
358
+ if (opts.executor) {
359
+ registerExecuteTool(server, opts.registry, {
360
+ baseUrl,
361
+ executor: opts.executor,
362
+ logger: opts.logger,
363
+ activity,
364
+ });
365
+ }
366
+ const transport = new WebStandardStreamableHTTPServerTransport({
367
+ enableJsonResponse: true,
368
+ });
369
+ await server.connect(transport);
370
+ return transport.handleRequest(request);
371
+ }
372
+ async function handleOAuthCallback(url, registry, baseUrl, branding) {
373
+ const id = url.pathname.slice("/oauth/callback/".length);
374
+ const connector = registry.getConnector(id);
375
+ if (!connector || !connector.finishAuth) {
376
+ return html(`Unknown connector "${id}".`, 404, branding);
377
+ }
378
+ const error = url.searchParams.get("error");
379
+ if (error)
380
+ return html(`Authorization denied: ${error}`, 400, branding);
381
+ const code = url.searchParams.get("code");
382
+ if (!code)
383
+ return html("Missing authorization code.", 400, branding);
384
+ const context = registry.contextFor(id, baseUrl);
385
+ // CSRF / login-fixation guard: this route is intentionally public, so verify
386
+ // the `state` matches the flow connecta started BEFORE exchanging the code.
387
+ if (connector.verifyState) {
388
+ const state = url.searchParams.get("state");
389
+ const ok = await connector.verifyState(state, context);
390
+ if (!ok) {
391
+ return html("Authorization state mismatch — this callback did not originate from " +
392
+ "a flow started by connecta. Re-run authorization and try again.", 400, branding);
393
+ }
394
+ }
395
+ try {
396
+ await connector.finishAuth(code, context);
397
+ await registry.invalidateStored(id);
398
+ return html(`Connected "${id}". You can close this window.`, 200, branding);
399
+ }
400
+ catch (err) {
401
+ return html(`Authorization failed: ${msg(err)}`, 500, branding);
402
+ }
403
+ }
404
+ /** Build the Web-standard fetch handler that serves connecta. */
405
+ export function createFetchHandler(opts) {
406
+ const { registry, auth, publicUrl, serverInfo } = opts;
407
+ return async function fetch(request, runtimeContext) {
408
+ const url = new URL(request.url);
409
+ const baseUrl = publicUrl ?? url.origin;
410
+ const path = url.pathname;
411
+ if (publicUrl &&
412
+ new URL(publicUrl).protocol === "https:" &&
413
+ url.protocol === "http:") {
414
+ const target = new URL(`${url.pathname}${url.search}`, publicUrl);
415
+ return withSecurityHeaders(new Response(null, {
416
+ status: 308,
417
+ headers: { Location: target.toString() },
418
+ }), url, path);
419
+ }
420
+ const route = async () => {
421
+ const credentialMatch = /^\/ui\/credentials\/([a-z0-9_-]+)(?:\/([a-z]+))?$/.exec(path);
422
+ if (credentialMatch) {
423
+ // Never opt these mutation routes into the server's wildcard CORS
424
+ // preflight behavior.
425
+ if (request.method === "OPTIONS") {
426
+ return privateJson({ error: "method not allowed" }, { status: 405 });
427
+ }
428
+ return handleCredentialRequest(request, credentialMatch[1], credentialMatch[2], opts, baseUrl);
429
+ }
430
+ if (request.method === "OPTIONS") {
431
+ for (const a of auth) {
432
+ if (a.handleMetadata) {
433
+ const r = await a.handleMetadata(request, baseUrl);
434
+ if (r)
435
+ return r;
436
+ }
437
+ }
438
+ return new Response(null, { status: 204, headers: CORS_HEADERS });
439
+ }
440
+ if (path.startsWith("/.well-known/")) {
441
+ for (const a of auth) {
442
+ if (a.handleMetadata) {
443
+ const r = await a.handleMetadata(request, baseUrl);
444
+ if (r)
445
+ return r;
446
+ }
447
+ }
448
+ return new Response("Not Found", { status: 404 });
449
+ }
450
+ if (path === "/health") {
451
+ return Response.json({
452
+ status: "ok",
453
+ connectors: registry.listConnectors().length,
454
+ server: opts.serverInfo,
455
+ ...(opts.deploymentInfo ? { deployment: opts.deploymentInfo } : {}),
456
+ });
457
+ }
458
+ if (path.startsWith("/oauth/callback/")) {
459
+ return handleOAuthCallback(url, registry, baseUrl, opts.branding);
460
+ }
461
+ if (request.method === "GET" && path === "/favicon.svg") {
462
+ return new Response(CONNECTA_FAVICON_SVG, {
463
+ headers: {
464
+ "Content-Type": "image/svg+xml",
465
+ "Cache-Control": "public, max-age=86400",
466
+ },
467
+ });
468
+ }
469
+ if (request.method === "GET" && path === "/favicon.ico") {
470
+ return new Response(CONNECTA_FAVICON_ICO, {
471
+ headers: {
472
+ "Content-Type": "image/x-icon",
473
+ "Cache-Control": "public, max-age=86400",
474
+ },
475
+ });
476
+ }
477
+ if (path === "/ui") {
478
+ // Open shell — carries no data; data comes only from the gated /ui/data.
479
+ const uiAuth = auth.find((provider) => provider.uiAuth)?.uiAuth;
480
+ const mcpUrl = new URL("/mcp", baseUrl).toString();
481
+ return new Response(renderUiHtml(uiAuth, mcpUrl, opts.branding), {
482
+ status: 200,
483
+ headers: { "Content-Type": "text/html; charset=utf-8" },
484
+ });
485
+ }
486
+ if (path === "/ui/data") {
487
+ const authz = await authorize(request, baseUrl, auth);
488
+ if (!authz.ok)
489
+ return authz.response;
490
+ const data = await buildUiData(registry, baseUrl, serverInfo,
491
+ // The static headless bearer may read connector health, but only a
492
+ // Clerk-authenticated operator receives credential metadata.
493
+ authz.providerKind === "clerk" && authz.userId
494
+ ? opts.credentialVault
495
+ : undefined, Boolean(opts.activity?.list));
496
+ return privateJson(data);
497
+ }
498
+ if (path === "/ui/activity") {
499
+ if (request.method !== "GET") {
500
+ return privateJson({ error: "method not allowed" }, { status: 405 });
501
+ }
502
+ const authz = await authorize(request, baseUrl, auth);
503
+ if (!authz.ok)
504
+ return authz.response;
505
+ if (opts.activityReadGate &&
506
+ !(await opts.activityReadGate(authz.actor))) {
507
+ return privateJson({ error: "forbidden" }, { status: 403 });
508
+ }
509
+ if (!opts.activity?.list) {
510
+ return privateJson({ error: "activity history is not configured" }, { status: 404 });
511
+ }
512
+ const cursor = url.searchParams.get("cursor") ?? undefined;
513
+ if (cursor && cursor.length > 500) {
514
+ return privateJson({ error: "invalid cursor" }, { status: 400 });
515
+ }
516
+ const requestedLimit = Number(url.searchParams.get("limit") ?? "50");
517
+ const limit = Number.isFinite(requestedLimit)
518
+ ? Math.min(100, Math.max(1, Math.trunc(requestedLimit)))
519
+ : 50;
520
+ try {
521
+ return privateJson(await opts.activity.list({ cursor, limit }));
522
+ }
523
+ catch (error) {
524
+ if (error instanceof InvalidActivityCursorError) {
525
+ return privateJson({ error: error.message }, { status: 400 });
526
+ }
527
+ opts.logger.error("[connecta] activity read failed", error);
528
+ return privateJson({ error: "activity history is temporarily unavailable" }, { status: 503 });
529
+ }
530
+ }
531
+ if (path === "/mcp") {
532
+ const authz = await authorize(request, baseUrl, auth);
533
+ const response = authz.ok
534
+ ? await serveMcp(request, opts, baseUrl, authz.actor, runtimeContext)
535
+ : authz.response;
536
+ return withMcpCors(response);
537
+ }
538
+ return new Response("Not Found", { status: 404 });
539
+ };
540
+ return withSecurityHeaders(await route(), url, path);
541
+ };
542
+ }
543
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAOpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAW3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,MAAM,YAAY,GAAG;IACnB,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,4BAA4B;IAC5D,8BAA8B,EAC5B,mEAAmE;CACtE,CAAC;AAoBF,SAAS,GAAG,CAAC,GAAY;IACvB,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,sFAAsF;AACtF,SAAS,IAAI,CACX,IAAY,EACZ,MAAM,GAAG,GAAG,EACZ,QAA2B;IAE3B,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS;QAC3B,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,SAAS,EAAE;QAC7C,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS;QAC3B,CAAC,CAAC,KAAK,CAAC,QAAQ;YACd,CAAC,CAAC,0BAA0B,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;YAC5F,CAAC,CAAC,uBAAuB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS;QAC/D,CAAC,CAAC,uBAAuB,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS;QAC7B,CAAC,CAAC,yBAAyB,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS;QACjE,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,IAAI,QAAQ,CACjB;;;;;;;;SAQK,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+BpB,KAAK;MACL,OAAO;;;;;WAKF,UAAU,CAAC,IAAI,CAAC;mCACQ,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;;;;QAIxD,EACJ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,EAAE,CACpE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAgB,EAChB,OAAe,EACf,IAAmB;IAUnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,YAAY,GAAoB,IAAI,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC;YACpD,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxC;gBACD,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC;QACJ,CAAC;QACD,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,QAAQ,EACN,YAAY;YACZ,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;gBACtD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,kBAAkB,EAAE,QAAQ;iBAC7B;aACF,CAAC;KACL,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAa,EAAE,OAAqB,EAAE;IACzD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAC9C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,0EAA0E;AAC1E,4EAA4E;AAC5E,oEAAoE;AACpE,SAAS,WAAW,CAAC,QAAkB;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,GAAG,CACT,+BAA+B,EAC/B,wDAAwD,CACzD,CAAC;IACF,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAkB,EAClB,UAAe,EACf,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,kBAAkB,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,0EAA0E;QAC1E,yEAAyE;QACzE,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAgB,EAChB,OAAe,EACf,IAAmB;IAEnB,wEAAwE;IACxE,6EAA6E;IAC7E,wEAAwE;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,qDAAqD,EAAE,EAChE,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;SACF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,6BAA6B,EAAE,EACxC,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB,EAAE,OAAe;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAMD,KAAK,UAAU,mBAAmB,CAChC,OAAgB,EAChB,MAAiC;IAIjC,IACE,CAAC,OAAO,CAAC,OAAO;SACb,GAAG,CAAC,cAAc,CAAC;QACpB,EAAE,WAAW,EAAE;SACd,UAAU,CAAC,kBAAkB,CAAC,EACjC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAClD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;SACF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,2BAA2B,EAAE,EACtC,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAG1B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAC3B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzD,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAC7C,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QACpE,CAAC;QACD,IACE,CAAC,IAAI,CAAC,MAAM;YACZ,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAC/B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAC1B,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,0BAA0B,EAAE,EACrC,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;aACF,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAiC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAChC,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,gCAAgC,UAAU,GAAG,EAAE,EACxD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;aACF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC/C,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,WAAW,CACnB,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,6BAA6B,EAAE,EACrD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,OAAgB,EAChB,WAAmB,EACnB,MAA0B,EAC1B,IAAmB,EACnB,OAAe;IAEf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,sCAAsC,EAAE,EACjD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,8BAA8B,EAAE,EACzC,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IAErC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5D,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,oDAAoD,EAAE,EAC/D,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC;YACX,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,+CAA+C,EAAE,EAC1D,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;gBACJ,CAAC;gBACD,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,4CAA4C,EAAE,EACvD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;gBACJ,CAAC;gBACD,MAAM,GAAG,MAAM,SAAS,CAAC,cAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GACZ,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC3B,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAC5B,WAAW,EACX,KAAK,CAAC,KAAK,CAAC,KAAK,EACjB,KAAK,CAAC,MAAM,CACb;gBACH,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAC/B,WAAW,EACX,KAAK,CAAC,KAAK,CAAC,MAAM,EAClB,KAAK,CAAC,MAAM,CACb,CAAC;YACR,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACtC,OAAO,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU;gBAC3B,iBAAiB,EAAE,aAAa;aACjC;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAgB,EAChB,IAAmB,EACnB,OAAe,EACf,KAAoB,EACpB,cAAwC;IAExC,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE;QAC5C,YAAY,EAAE,qBAAqB;KACpC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAuC,IAAI,CAAC,QAAQ;QAChE,CAAC,CAAC;YACE,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,KAAK;YACL,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;YAC9B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,oBAAoB;gBAC3B,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,oBAAoB,EAAE;gBAC7C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,cAAc,EAAE,SAAS;gBAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;gBAC1D,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;QACH,CAAC,CAAC,SAAS,CAAC;IACd,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzC,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,wCAAwC,CAAC;QAC7D,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAQ,EACR,QAAkB,EAClB,OAAe,EACf,QAA2B;IAE3B,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,yBAAyB,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACjD,6EAA6E;IAC7E,4EAA4E;IAC5E,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,IAAI,CACT,sEAAsE;gBACpE,iEAAiE,EACnE,GAAG,EACH,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACpC,OAAO,IAAI,CACT,cAAc,EAAE,+BAA+B,EAC/C,GAAG,EACH,QAAQ,CACT,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,yBAAyB,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAChC,IAAmB;IAKnB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACvD,OAAO,KAAK,UAAU,KAAK,CACzB,OAAgB,EAChB,cAAwC;QAExC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC1B,IACE,SAAS;YACT,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,QAAQ;YACxC,GAAG,CAAC,QAAQ,KAAK,OAAO,EACxB,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;YAClE,OAAO,mBAAmB,CACxB,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACjB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;aACzC,CAAC,EACF,GAAG,EACH,IAAI,CACL,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,IAAuB,EAAE;YAC1C,MAAM,eAAe,GACnB,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,eAAe,EAAE,CAAC;gBACpB,kEAAkE;gBAClE,sBAAsB;gBACtB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvE,CAAC;gBACD,OAAO,uBAAuB,CAC5B,OAAO,EACP,eAAe,CAAC,CAAC,CAAC,EAClB,eAAe,CAAC,CAAC,CAAC,EAClB,IAAI,EACJ,OAAO,CACR,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;wBACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACnD,IAAI,CAAC;4BAAE,OAAO,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;wBACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACnD,IAAI,CAAC;4BAAE,OAAO,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,QAAQ,CAAC,IAAI,CAAC;oBACnB,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM;oBAC5C,MAAM,EAAE,IAAI,CAAC,UAAU;oBACvB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACxC,OAAO,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBACxD,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE;oBACxC,OAAO,EAAE;wBACP,cAAc,EAAE,eAAe;wBAC/B,eAAe,EAAE,uBAAuB;qBACzC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBACxD,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE;oBACxC,OAAO,EAAE;wBACP,cAAc,EAAE,cAAc;wBAC9B,eAAe,EAAE,uBAAuB;qBACzC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,yEAAyE;gBACzE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACnD,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAC/D,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;iBACxD,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBACtD,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;gBACrC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,QAAQ,EACR,OAAO,EACP,UAAU;gBACV,mEAAmE;gBACnE,6DAA6D;gBAC7D,KAAK,CAAC,YAAY,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM;oBAC5C,CAAC,CAAC,IAAI,CAAC,eAAe;oBACtB,CAAC,CAAC,SAAS,EACb,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAC7B,CAAC;gBACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBAC7B,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBACtD,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;gBACrC,IACE,IAAI,CAAC,gBAAgB;oBACrB,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAC3C,CAAC;oBACD,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACzB,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,oCAAoC,EAAE,EAC/C,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;gBAC3D,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAClC,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACnE,CAAC;gBACD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;gBACrE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;oBACxD,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC;oBACH,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;wBAChD,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;oBAChE,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;oBAC5D,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,6CAA6C,EAAE,EACxD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE;oBACvB,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC;oBACrE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACnB,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,OAAO,mBAAmB,CAAC,MAAM,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const CONNECTA_INSTRUCTIONS = "Connecta exposes many integrations behind meta-tools. When an address is unknown, start with search_tools and includeSchemas=\"compact\"; use describe_tools only when that schema is insufficient. Use call_tool for one explicitly read-only call, batch_call for 2\u201310 independent explicitly read-only calls, and execute_code (when available) only for dependent read-only steps, loops, joins, or reducing large results. Unannotated, write-capable, and destructive tools must use call_destructive_tool individually. Use authorize_connector only after auth_required and get_result only for truncated results. For the detailed workflow, call skills({ name: \"usage\" }) once per task.";
2
+ export declare const USAGE_SKILL = "# Connecta usage\n\n## Choose the smallest execution tool\n\n- Unknown address: `search_tools({ query, includeSchemas: \"compact\" })`.\n- Schema still unclear: `describe_tools({ addresses: [...] })`.\n- One explicitly read-only call: `call_tool`.\n- Two to ten independent explicitly read-only calls: `batch_call`.\n- Dependent read-only calls, loops, joins, branching, or large-result reduction: `execute_code` when available.\n- Any unannotated, write-capable, or destructive call: `call_destructive_tool`, individually and only after reviewing its schema and consequences.\n- Truncated result: retry with `fields` when possible; otherwise page it with `get_result`.\n- `auth_required`: use `authorize_connector`, have the operator complete consent, then confirm with `list_connectors`.\n\nUse `list_connectors({ probe: false })` for a fast inventory. Use `probe: true` only when diagnosing live health or authorization.\n\n## Code mode\n\nUse code mode when a later call depends on an earlier result, when joining across connectors, or when filtering or aggregating data in the sandbox will substantially shrink the response. Use `Promise.all` or `connecta.batch` for independent calls inside one execution.\n\nDo not use code mode for one straightforward call, for independent calls already handled by `batch_call`, or for any tool not explicitly annotated `readOnlyHint: true`. Code mode has a bounded host-call budget and per-call deadline. Return only the reduced value the agent needs; do not return a large upstream payload unchanged.\n\n## Examples\n\nThese addresses are illustrative; always use the exact address returned by `search_tools`.\n\nSingle call:\n```json\n{ \"address\": \"crm.get_account\", \"args\": { \"id\": \"acct_123\" }, \"resultMode\": \"value\" }\n```\n\nIndependent calls:\n```json\n{ \"calls\": [\n { \"address\": \"crm.get_account\", \"args\": { \"id\": \"acct_123\" } },\n { \"address\": \"billing.list_invoices\", \"args\": { \"status\": \"open\" } }\n] }\n```\n\nDependent code with reduction:\n```js\nasync () => {\n const accounts = await crm.search_accounts({ query: \"renewal\" });\n const details = await Promise.all(\n accounts.results.slice(0, 5).map((account) =>\n crm.get_account({ id: account.id })\n )\n );\n return details.map(({ id, name, status }) => ({ id, name, status }));\n}\n```\n";
3
+ export declare const AVAILABLE_SKILLS: readonly [{
4
+ readonly name: "usage";
5
+ readonly description: "How to choose among Connecta discovery, direct, batch, destructive, and code-mode tools.";
6
+ readonly content: "# Connecta usage\n\n## Choose the smallest execution tool\n\n- Unknown address: `search_tools({ query, includeSchemas: \"compact\" })`.\n- Schema still unclear: `describe_tools({ addresses: [...] })`.\n- One explicitly read-only call: `call_tool`.\n- Two to ten independent explicitly read-only calls: `batch_call`.\n- Dependent read-only calls, loops, joins, branching, or large-result reduction: `execute_code` when available.\n- Any unannotated, write-capable, or destructive call: `call_destructive_tool`, individually and only after reviewing its schema and consequences.\n- Truncated result: retry with `fields` when possible; otherwise page it with `get_result`.\n- `auth_required`: use `authorize_connector`, have the operator complete consent, then confirm with `list_connectors`.\n\nUse `list_connectors({ probe: false })` for a fast inventory. Use `probe: true` only when diagnosing live health or authorization.\n\n## Code mode\n\nUse code mode when a later call depends on an earlier result, when joining across connectors, or when filtering or aggregating data in the sandbox will substantially shrink the response. Use `Promise.all` or `connecta.batch` for independent calls inside one execution.\n\nDo not use code mode for one straightforward call, for independent calls already handled by `batch_call`, or for any tool not explicitly annotated `readOnlyHint: true`. Code mode has a bounded host-call budget and per-call deadline. Return only the reduced value the agent needs; do not return a large upstream payload unchanged.\n\n## Examples\n\nThese addresses are illustrative; always use the exact address returned by `search_tools`.\n\nSingle call:\n```json\n{ \"address\": \"crm.get_account\", \"args\": { \"id\": \"acct_123\" }, \"resultMode\": \"value\" }\n```\n\nIndependent calls:\n```json\n{ \"calls\": [\n { \"address\": \"crm.get_account\", \"args\": { \"id\": \"acct_123\" } },\n { \"address\": \"billing.list_invoices\", \"args\": { \"status\": \"open\" } }\n] }\n```\n\nDependent code with reduction:\n```js\nasync () => {\n const accounts = await crm.search_accounts({ query: \"renewal\" });\n const details = await Promise.all(\n accounts.results.slice(0, 5).map((account) =>\n crm.get_account({ id: account.id })\n )\n );\n return details.map(({ id, name, status }) => ({ id, name, status }));\n}\n```\n";
7
+ }];
8
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,+qBACmoB,CAAC;AAEtqB,eAAO,MAAM,WAAW,wzEAkDvB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;EAOnB,CAAC"}
package/dist/skills.js ADDED
@@ -0,0 +1,60 @@
1
+ export const CONNECTA_INSTRUCTIONS = 'Connecta exposes many integrations behind meta-tools. When an address is unknown, start with search_tools and includeSchemas="compact"; use describe_tools only when that schema is insufficient. Use call_tool for one explicitly read-only call, batch_call for 2–10 independent explicitly read-only calls, and execute_code (when available) only for dependent read-only steps, loops, joins, or reducing large results. Unannotated, write-capable, and destructive tools must use call_destructive_tool individually. Use authorize_connector only after auth_required and get_result only for truncated results. For the detailed workflow, call skills({ name: "usage" }) once per task.';
2
+ export const USAGE_SKILL = `# Connecta usage
3
+
4
+ ## Choose the smallest execution tool
5
+
6
+ - Unknown address: \`search_tools({ query, includeSchemas: "compact" })\`.
7
+ - Schema still unclear: \`describe_tools({ addresses: [...] })\`.
8
+ - One explicitly read-only call: \`call_tool\`.
9
+ - Two to ten independent explicitly read-only calls: \`batch_call\`.
10
+ - Dependent read-only calls, loops, joins, branching, or large-result reduction: \`execute_code\` when available.
11
+ - Any unannotated, write-capable, or destructive call: \`call_destructive_tool\`, individually and only after reviewing its schema and consequences.
12
+ - Truncated result: retry with \`fields\` when possible; otherwise page it with \`get_result\`.
13
+ - \`auth_required\`: use \`authorize_connector\`, have the operator complete consent, then confirm with \`list_connectors\`.
14
+
15
+ Use \`list_connectors({ probe: false })\` for a fast inventory. Use \`probe: true\` only when diagnosing live health or authorization.
16
+
17
+ ## Code mode
18
+
19
+ Use code mode when a later call depends on an earlier result, when joining across connectors, or when filtering or aggregating data in the sandbox will substantially shrink the response. Use \`Promise.all\` or \`connecta.batch\` for independent calls inside one execution.
20
+
21
+ Do not use code mode for one straightforward call, for independent calls already handled by \`batch_call\`, or for any tool not explicitly annotated \`readOnlyHint: true\`. Code mode has a bounded host-call budget and per-call deadline. Return only the reduced value the agent needs; do not return a large upstream payload unchanged.
22
+
23
+ ## Examples
24
+
25
+ These addresses are illustrative; always use the exact address returned by \`search_tools\`.
26
+
27
+ Single call:
28
+ \`\`\`json
29
+ { "address": "crm.get_account", "args": { "id": "acct_123" }, "resultMode": "value" }
30
+ \`\`\`
31
+
32
+ Independent calls:
33
+ \`\`\`json
34
+ { "calls": [
35
+ { "address": "crm.get_account", "args": { "id": "acct_123" } },
36
+ { "address": "billing.list_invoices", "args": { "status": "open" } }
37
+ ] }
38
+ \`\`\`
39
+
40
+ Dependent code with reduction:
41
+ \`\`\`js
42
+ async () => {
43
+ const accounts = await crm.search_accounts({ query: "renewal" });
44
+ const details = await Promise.all(
45
+ accounts.results.slice(0, 5).map((account) =>
46
+ crm.get_account({ id: account.id })
47
+ )
48
+ );
49
+ return details.map(({ id, name, status }) => ({ id, name, status }));
50
+ }
51
+ \`\`\`
52
+ `;
53
+ export const AVAILABLE_SKILLS = [
54
+ {
55
+ name: "usage",
56
+ description: "How to choose among Connecta discovery, direct, batch, destructive, and code-mode tools.",
57
+ content: USAGE_SKILL,
58
+ },
59
+ ];
60
+ //# sourceMappingURL=skills.js.map