@zackbart/connecta 0.7.9 → 0.8.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 (199) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +47 -148
  3. package/dist/activity.d.ts +0 -8
  4. package/dist/activity.d.ts.map +1 -1
  5. package/dist/activity.js +0 -1
  6. package/dist/activity.js.map +1 -1
  7. package/dist/auth/bearer.d.ts +1 -7
  8. package/dist/auth/bearer.d.ts.map +1 -1
  9. package/dist/auth/bearer.js +3 -24
  10. package/dist/auth/bearer.js.map +1 -1
  11. package/dist/auth/clerk.d.ts +2 -11
  12. package/dist/auth/clerk.d.ts.map +1 -1
  13. package/dist/auth/clerk.js +31 -46
  14. package/dist/auth/clerk.js.map +1 -1
  15. package/dist/call-admission.d.ts.map +1 -1
  16. package/dist/call-admission.js +9 -4
  17. package/dist/call-admission.js.map +1 -1
  18. package/dist/catalog-fingerprint.d.ts +20 -0
  19. package/dist/catalog-fingerprint.d.ts.map +1 -0
  20. package/dist/catalog-fingerprint.js +34 -0
  21. package/dist/catalog-fingerprint.js.map +1 -0
  22. package/dist/catalog-limits.d.ts +10 -0
  23. package/dist/catalog-limits.d.ts.map +1 -0
  24. package/dist/catalog-limits.js +10 -0
  25. package/dist/catalog-limits.js.map +1 -0
  26. package/dist/catalog-service.d.ts +137 -0
  27. package/dist/catalog-service.d.ts.map +1 -0
  28. package/dist/catalog-service.js +401 -0
  29. package/dist/catalog-service.js.map +1 -0
  30. package/dist/catalog.d.ts +6 -0
  31. package/dist/catalog.d.ts.map +1 -1
  32. package/dist/catalog.js +53 -2
  33. package/dist/catalog.js.map +1 -1
  34. package/dist/concurrency.d.ts +4 -0
  35. package/dist/concurrency.d.ts.map +1 -0
  36. package/dist/concurrency.js +31 -0
  37. package/dist/concurrency.js.map +1 -0
  38. package/dist/connectors/api.d.ts.map +1 -1
  39. package/dist/connectors/api.js +22 -12
  40. package/dist/connectors/api.js.map +1 -1
  41. package/dist/connectors/remote-mcp.d.ts.map +1 -1
  42. package/dist/connectors/remote-mcp.js +53 -41
  43. package/dist/connectors/remote-mcp.js.map +1 -1
  44. package/dist/credentials.d.ts +3 -2
  45. package/dist/credentials.d.ts.map +1 -1
  46. package/dist/errors.d.ts +19 -1
  47. package/dist/errors.d.ts.map +1 -1
  48. package/dist/errors.js.map +1 -1
  49. package/dist/execute.d.ts +10 -16
  50. package/dist/execute.d.ts.map +1 -1
  51. package/dist/execute.js +143 -330
  52. package/dist/execute.js.map +1 -1
  53. package/dist/executor-result.d.ts +0 -3
  54. package/dist/executor-result.d.ts.map +1 -1
  55. package/dist/executor-result.js +3 -3
  56. package/dist/executor-result.js.map +1 -1
  57. package/dist/executors/quickjs-child.js +3 -3
  58. package/dist/executors/quickjs-child.js.map +1 -1
  59. package/dist/executors/quickjs-protocol.d.ts +4 -1
  60. package/dist/executors/quickjs-protocol.d.ts.map +1 -1
  61. package/dist/executors/quickjs-runtime.d.ts.map +1 -1
  62. package/dist/executors/quickjs-runtime.js +7 -2
  63. package/dist/executors/quickjs-runtime.js.map +1 -1
  64. package/dist/executors/quickjs.d.ts.map +1 -1
  65. package/dist/executors/quickjs.js +4 -1
  66. package/dist/executors/quickjs.js.map +1 -1
  67. package/dist/favicon.js +2 -2
  68. package/dist/favicon.js.map +1 -1
  69. package/dist/index.d.ts +8 -82
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +58 -104
  72. package/dist/index.js.map +1 -1
  73. package/dist/invocation.d.ts +101 -0
  74. package/dist/invocation.d.ts.map +1 -0
  75. package/dist/invocation.js +405 -0
  76. package/dist/invocation.js.map +1 -0
  77. package/dist/meta-tools.d.ts +9 -95
  78. package/dist/meta-tools.d.ts.map +1 -1
  79. package/dist/meta-tools.js +235 -725
  80. package/dist/meta-tools.js.map +1 -1
  81. package/dist/operator-ui/generated.d.ts +3 -0
  82. package/dist/operator-ui/generated.d.ts.map +1 -0
  83. package/dist/operator-ui/generated.js +5 -0
  84. package/dist/operator-ui/generated.js.map +1 -0
  85. package/dist/operator-ui/model.d.ts +73 -0
  86. package/dist/operator-ui/model.d.ts.map +1 -0
  87. package/dist/operator-ui/model.js +28 -0
  88. package/dist/operator-ui/model.js.map +1 -0
  89. package/dist/registry.d.ts +33 -184
  90. package/dist/registry.d.ts.map +1 -1
  91. package/dist/registry.js +345 -330
  92. package/dist/registry.js.map +1 -1
  93. package/dist/retired-toolkits.d.ts +3 -0
  94. package/dist/retired-toolkits.d.ts.map +1 -0
  95. package/dist/retired-toolkits.js +9 -0
  96. package/dist/retired-toolkits.js.map +1 -0
  97. package/dist/routes/activity.d.ts +3 -0
  98. package/dist/routes/activity.d.ts.map +1 -0
  99. package/dist/routes/activity.js +170 -0
  100. package/dist/routes/activity.js.map +1 -0
  101. package/dist/routes/credentials.d.ts +3 -0
  102. package/dist/routes/credentials.d.ts.map +1 -0
  103. package/dist/routes/credentials.js +170 -0
  104. package/dist/routes/credentials.js.map +1 -0
  105. package/dist/routes/mcp.d.ts +8 -0
  106. package/dist/routes/mcp.d.ts.map +1 -0
  107. package/dist/routes/mcp.js +270 -0
  108. package/dist/routes/mcp.js.map +1 -0
  109. package/dist/routes/oauth.d.ts +4 -0
  110. package/dist/routes/oauth.d.ts.map +1 -0
  111. package/dist/routes/oauth.js +263 -0
  112. package/dist/routes/oauth.js.map +1 -0
  113. package/dist/routes/shared.d.ts +76 -0
  114. package/dist/routes/shared.d.ts.map +1 -0
  115. package/dist/routes/shared.js +140 -0
  116. package/dist/routes/shared.js.map +1 -0
  117. package/dist/routes/ui.d.ts +3 -0
  118. package/dist/routes/ui.d.ts.map +1 -0
  119. package/dist/routes/ui.js +116 -0
  120. package/dist/routes/ui.js.map +1 -0
  121. package/dist/server.d.ts +9 -40
  122. package/dist/server.d.ts.map +1 -1
  123. package/dist/server.js +62 -1322
  124. package/dist/server.js.map +1 -1
  125. package/dist/skills.d.ts +3 -21
  126. package/dist/skills.d.ts.map +1 -1
  127. package/dist/skills.js +15 -43
  128. package/dist/skills.js.map +1 -1
  129. package/dist/storage/file.d.ts.map +1 -1
  130. package/dist/storage/file.js +3 -1
  131. package/dist/storage/file.js.map +1 -1
  132. package/dist/storage/memory.d.ts.map +1 -1
  133. package/dist/storage/memory.js +3 -1
  134. package/dist/storage/memory.js.map +1 -1
  135. package/dist/timeout.d.ts.map +1 -1
  136. package/dist/timeout.js +2 -4
  137. package/dist/timeout.js.map +1 -1
  138. package/dist/types.d.ts +9 -59
  139. package/dist/types.d.ts.map +1 -1
  140. package/dist/ui.d.ts +3 -94
  141. package/dist/ui.d.ts.map +1 -1
  142. package/dist/ui.js +30 -1427
  143. package/dist/ui.js.map +1 -1
  144. package/dist/version.d.ts +1 -1
  145. package/dist/version.js +1 -1
  146. package/package.json +15 -8
  147. package/src/activity.ts +0 -9
  148. package/src/auth/bearer.ts +4 -33
  149. package/src/auth/clerk.ts +35 -48
  150. package/src/call-admission.ts +8 -6
  151. package/src/catalog-fingerprint.ts +52 -0
  152. package/src/catalog-limits.ts +11 -0
  153. package/src/catalog-service.ts +601 -0
  154. package/src/catalog.ts +57 -2
  155. package/src/concurrency.ts +39 -0
  156. package/src/connectors/api.ts +22 -12
  157. package/src/connectors/remote-mcp.ts +63 -45
  158. package/src/credentials.ts +2 -2
  159. package/src/errors.ts +21 -1
  160. package/src/execute.ts +193 -423
  161. package/src/executor-result.ts +3 -3
  162. package/src/executors/quickjs-child.ts +8 -4
  163. package/src/executors/quickjs-protocol.ts +1 -1
  164. package/src/executors/quickjs-runtime.ts +5 -1
  165. package/src/executors/quickjs.ts +11 -8
  166. package/src/favicon.ts +2 -2
  167. package/src/index.ts +70 -222
  168. package/src/invocation.ts +580 -0
  169. package/src/meta-tools.ts +393 -985
  170. package/src/operator-ui/browser.css +360 -0
  171. package/src/operator-ui/browser.ts +987 -0
  172. package/src/operator-ui/generated.ts +4 -0
  173. package/src/operator-ui/model.ts +105 -0
  174. package/src/registry.ts +459 -439
  175. package/src/retired-toolkits.ts +14 -0
  176. package/src/routes/activity.ts +215 -0
  177. package/src/routes/credentials.ts +254 -0
  178. package/src/routes/mcp.ts +339 -0
  179. package/src/routes/oauth.ts +322 -0
  180. package/src/routes/shared.ts +240 -0
  181. package/src/routes/ui.ts +143 -0
  182. package/src/server.ts +64 -1731
  183. package/src/skills.ts +15 -43
  184. package/src/storage/file.ts +3 -1
  185. package/src/storage/memory.ts +3 -1
  186. package/src/timeout.ts +2 -4
  187. package/src/types.ts +8 -60
  188. package/src/ui.ts +60 -1538
  189. package/src/version.ts +1 -1
  190. package/dist/credential-health.d.ts +0 -227
  191. package/dist/credential-health.d.ts.map +0 -1
  192. package/dist/credential-health.js +0 -606
  193. package/dist/credential-health.js.map +0 -1
  194. package/dist/toolkits.d.ts +0 -146
  195. package/dist/toolkits.d.ts.map +0 -1
  196. package/dist/toolkits.js +0 -322
  197. package/dist/toolkits.js.map +0 -1
  198. package/src/credential-health.ts +0 -832
  199. package/src/toolkits.ts +0 -461
@@ -0,0 +1,140 @@
1
+ import { operatorPageForPath } from "../ui.js";
2
+ export function msg(err) {
3
+ return err instanceof Error ? err.message : String(err);
4
+ }
5
+ export function privateJson(body, init = {}) {
6
+ const headers = new Headers(init.headers);
7
+ headers.set("Content-Type", "application/json");
8
+ headers.set("Cache-Control", "no-store");
9
+ headers.set("Referrer-Policy", "no-referrer");
10
+ return new Response(JSON.stringify(body), { ...init, headers });
11
+ }
12
+ const MAX_LOGGED_VALUE_LENGTH = 64;
13
+ /**
14
+ * Bounded, escaped form of a caller-influenced value (an identity id or OAuth
15
+ * callback connector id) for the operator log. Goes
16
+ * through JSON.stringify so a caller-controlled newline or control character
17
+ * cannot forge a log line, plus a hand-rolled escape for U+2028/U+2029, which
18
+ * JSON.stringify leaves raw even though a log reader treats them as line
19
+ * terminators. Truncated to a small shared cap so an oversized value cannot
20
+ * flood the log either.
21
+ */
22
+ export function loggableValue(requested) {
23
+ const bounded = requested.slice(0, MAX_LOGGED_VALUE_LENGTH);
24
+ const escaped = JSON.stringify(bounded).replace(/[\u2028\u2029]/g, (ch) => `\\u${ch.charCodeAt(0).toString(16)}`);
25
+ return escaped + (bounded.length < requested.length ? " (truncated)" : "");
26
+ }
27
+ const ACTIVITY_ACTOR_NAMESPACE_RE = /^[\x21-\x7e]{1,256}$/;
28
+ export function activityActorNamespace(provider) {
29
+ return typeof provider.activityActorNamespace === "string" &&
30
+ ACTIVITY_ACTOR_NAMESPACE_RE.test(provider.activityActorNamespace)
31
+ ? provider.activityActorNamespace
32
+ : undefined;
33
+ }
34
+ export async function authorize(request, baseUrl, auth) {
35
+ if (auth.length === 0) {
36
+ return { ok: true, actor: { kind: "anonymous" } };
37
+ }
38
+ let lastResponse = null;
39
+ for (const provider of auth) {
40
+ const result = await provider.authorize(request, baseUrl);
41
+ if (result.ok) {
42
+ const subjectId = result.subjectId ?? result.userId;
43
+ const actorNamespace = activityActorNamespace(provider);
44
+ return {
45
+ ok: true,
46
+ actor: {
47
+ kind: provider.kind,
48
+ ...(subjectId ? { id: subjectId } : {}),
49
+ ...(subjectId && actorNamespace
50
+ ? { namespace: actorNamespace }
51
+ : {}),
52
+ },
53
+ ...(result.userId && provider.uiAuth?.kind === "clerk"
54
+ ? { uiAdminEligible: true }
55
+ : {}),
56
+ };
57
+ }
58
+ lastResponse = result.response;
59
+ }
60
+ return {
61
+ ok: false,
62
+ response: lastResponse ??
63
+ new Response(JSON.stringify({ error: "unauthorized" }), {
64
+ status: 401,
65
+ headers: {
66
+ "Content-Type": "application/json",
67
+ "WWW-Authenticate": "Bearer",
68
+ },
69
+ }),
70
+ };
71
+ }
72
+ export async function authorizeUiAdmin(request, baseUrl, auth, purpose = "credential management") {
73
+ // Operator mutation is intentionally narrower than /mcp and /ui/data: only
74
+ // an interactive Clerk provider may admit it. A static bearer token is useful
75
+ // for headless tool calls but must not become a deployment-admin key.
76
+ //
77
+ // Every Clerk provider gets a turn, the way the /mcp gate does. Stopping at
78
+ // the first would make admission depend on config order: a failed gate or
79
+ // missing user may simply mean a later provider is the one meant to admit.
80
+ // The last refusal is returned if none do.
81
+ const providers = auth.filter((candidate) => candidate.uiAuth?.kind === "clerk");
82
+ if (providers.length === 0) {
83
+ return {
84
+ ok: false,
85
+ response: privateJson({ error: `${purpose} requires Clerk authentication` }, { status: 403 }),
86
+ };
87
+ }
88
+ let lastResponse = null;
89
+ for (const provider of providers) {
90
+ const result = await provider.authorize(request, baseUrl);
91
+ if (!result.ok) {
92
+ lastResponse = result.response;
93
+ continue;
94
+ }
95
+ if (!result.userId) {
96
+ lastResponse = privateJson({ error: "authenticated user required" }, { status: 403 });
97
+ continue;
98
+ }
99
+ return { ok: true, userId: result.userId };
100
+ }
101
+ return {
102
+ ok: false,
103
+ response: lastResponse ??
104
+ privateJson({ error: "forbidden" }, { status: 403 }),
105
+ };
106
+ }
107
+ export function isSameOrigin(request, baseUrl) {
108
+ const origin = request.headers.get("origin");
109
+ if (!origin)
110
+ return false;
111
+ try {
112
+ return new URL(origin).origin === new URL(baseUrl).origin;
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ export function withSecurityHeaders(response, requestUrl, path) {
119
+ const headers = new Headers(response.headers);
120
+ headers.set("X-Content-Type-Options", "nosniff");
121
+ headers.set("Referrer-Policy", "no-referrer");
122
+ if (requestUrl.protocol === "https:") {
123
+ headers.set("Strict-Transport-Security", "max-age=31536000");
124
+ }
125
+ if (operatorPageForPath(path) || path === "/ui") {
126
+ // Operator HTML responses ship their own nonce-based script CSP (which
127
+ // already includes frame-ancestors 'none'); only fall back to the
128
+ // framing-only directive when no CSP is present (for example redirects).
129
+ if (!headers.has("Content-Security-Policy")) {
130
+ headers.set("Content-Security-Policy", "frame-ancestors 'none'");
131
+ }
132
+ headers.set("X-Frame-Options", "DENY");
133
+ }
134
+ return new Response(response.body, {
135
+ status: response.status,
136
+ statusText: response.statusText,
137
+ headers,
138
+ });
139
+ }
140
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/routes/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type RouteContext } from "./shared.js";
2
+ export declare function routeUi(context: RouteContext): Promise<Response | null>;
3
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAuCrB,wBAAsB,OAAO,CAC3B,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyF1B"}
@@ -0,0 +1,116 @@
1
+ import { CONNECTA_FAVICON_ICO } from "../favicon.js";
2
+ import { buildUiData, CONNECTA_FAVICON_SVG, credentialManagementCapability, operatorPageForPath, renderUiHtml, } from "../ui.js";
3
+ import { authorize, privateJson, } from "./shared.js";
4
+ /**
5
+ * Headers that make an operator-supplied favicon body inert on this origin.
6
+ * The SVG route is the sharp one: `image/svg+xml` is an *active* content type,
7
+ * so a `<script>` inside a branding SVG would run on the deployment origin the
8
+ * moment anyone navigated straight to `/favicon.svg` — strictly more powerful
9
+ * than the `favicon.href` vector the branding gates close, because the payload
10
+ * is same-origin. Neutralizing the response rather than inspecting the body
11
+ * keeps every valid static SVG (the built-in mark included) byte-identical:
12
+ *
13
+ * - `sandbox` (no tokens ⇒ every restriction) drops the document into an opaque
14
+ * origin with scripting off, so even a script that ran would have nothing to
15
+ * reach.
16
+ * - `default-src 'none'` denies script, network, and framing outright.
17
+ * - `style-src 'unsafe-inline'` is the single allowance: the default mark styles
18
+ * itself inline to follow the OS colour scheme, and CSS cannot script.
19
+ * - `nosniff` keeps the declared type authoritative in both directions — an SVG
20
+ * can never be re-read as HTML, and `.ico` bytes can never be re-read as SVG.
21
+ *
22
+ * `.ico` bodies are deliberately in scope: they are inert bytes rather than
23
+ * active content, so they are still served verbatim, but they carry the same
24
+ * headers so the invariant is "every favicon route is neutralized" rather than
25
+ * "whichever route got attention".
26
+ */
27
+ const INERT_ICON_HEADERS = {
28
+ "Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'; sandbox",
29
+ "X-Content-Type-Options": "nosniff",
30
+ };
31
+ /** Per-request base64 nonce for an operator shell's scripts (Node 20+ and Workers). */
32
+ function uiScriptNonce() {
33
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
34
+ let binary = "";
35
+ for (const byte of bytes)
36
+ binary += String.fromCharCode(byte);
37
+ return btoa(binary);
38
+ }
39
+ export async function routeUi(context) {
40
+ const { request, url, path, baseUrl, opts, defer } = context;
41
+ if (request.method === "GET" && path === "/favicon.svg") {
42
+ return new Response(opts.branding?.favicon?.svg ?? CONNECTA_FAVICON_SVG, {
43
+ headers: {
44
+ "Content-Type": "image/svg+xml",
45
+ "Cache-Control": "public, max-age=86400",
46
+ ...INERT_ICON_HEADERS,
47
+ },
48
+ });
49
+ }
50
+ if (request.method === "GET" && path === "/favicon.ico") {
51
+ return new Response(opts.branding?.favicon?.ico ?? CONNECTA_FAVICON_ICO, {
52
+ headers: {
53
+ "Content-Type": "image/x-icon",
54
+ "Cache-Control": "public, max-age=86400",
55
+ ...INERT_ICON_HEADERS,
56
+ },
57
+ });
58
+ }
59
+ if (path === "/ui") {
60
+ if (request.method !== "GET") {
61
+ return privateJson({ error: "method not allowed" }, { status: 405 });
62
+ }
63
+ const target = new URL(`/${url.search}`, baseUrl);
64
+ return new Response(null, {
65
+ status: 308,
66
+ headers: { Location: target.toString() },
67
+ });
68
+ }
69
+ const operatorPage = operatorPageForPath(path);
70
+ if (operatorPage) {
71
+ if (request.method !== "GET" && request.method !== "HEAD") {
72
+ return privateJson({ error: "method not allowed" }, { status: 405 });
73
+ }
74
+ // Open shell — carries no operator data; everything comes from the
75
+ // authenticated /ui/* APIs after the browser establishes a session.
76
+ const uiAuth = opts.auth.find((provider) => provider.uiAuth)?.uiAuth;
77
+ const mcpUrl = new URL("/mcp", baseUrl).toString();
78
+ // Nonce the page's inline script (and the Clerk loader). 'strict-dynamic'
79
+ // lets scripts the nonced Clerk loader injects at runtime execute; the
80
+ // https:/'unsafe-inline' fallbacks are ignored by CSP3 browsers that
81
+ // honour the nonce and only cover legacy ones. No default-src, so Clerk's
82
+ // style/font/network needs and the page's inline <style> stay unrestricted
83
+ // — only script execution, the XSS sink, is gated.
84
+ const nonce = uiScriptNonce();
85
+ return new Response(request.method === "HEAD"
86
+ ? null
87
+ : renderUiHtml(uiAuth, mcpUrl, opts.branding, nonce, operatorPage), {
88
+ status: 200,
89
+ headers: {
90
+ "Content-Type": "text/html; charset=utf-8",
91
+ "Content-Security-Policy": `script-src 'nonce-${nonce}' 'strict-dynamic' https: 'unsafe-inline'; ` +
92
+ "object-src 'none'; base-uri 'none'; frame-ancestors 'none'",
93
+ "X-Content-Type-Options": "nosniff",
94
+ },
95
+ });
96
+ }
97
+ if (path !== "/ui/data")
98
+ return null;
99
+ const authz = await authorize(request, baseUrl, opts.auth);
100
+ if (!authz.ok)
101
+ return authz.response;
102
+ const eligibleClerkOperator = authz.uiAdminEligible === true;
103
+ const credentialManagement = credentialManagementCapability({
104
+ eligibleClerkOperator,
105
+ hasCredentialSlots: opts.registry
106
+ .listConnectors()
107
+ .some((connector) => Boolean(connector.credential)),
108
+ hasCredentialVault: Boolean(opts.credentialVault),
109
+ });
110
+ const data = await buildUiData(opts.registry, baseUrl, opts.serverInfo,
111
+ // The static headless bearer may read connector health, but only a
112
+ // Clerk-authenticated operator receives credential metadata.
113
+ eligibleClerkOperator ? opts.credentialVault : undefined, Boolean(opts.activity?.list), credentialManagement, defer, eligibleClerkOperator, opts.discoveryConcurrency);
114
+ return privateJson(data);
115
+ }
116
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,42 +1,11 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import type { ActivityReadGate, ActivityStore } from "./activity.js";
3
- import type { CredentialVault } from "./credentials.js";
4
- import { type Registry } from "./registry.js";
5
- import { type Toolkit } from "./toolkits.js";
6
- import type { ConnectaBranding, Executor, InboundAuth, Logger } from "./types.js";
7
- import { type AdmissionController } from "./executor-admission.js";
8
- export interface ServerOptions {
9
- registry: Registry;
10
- auth: InboundAuth[];
11
- publicUrl?: string;
12
- serverInfo: ConstructorParameters<typeof McpServer>[0];
13
- logger: Logger;
14
- activity?: ActivityStore;
15
- activityReadGate?: ActivityReadGate;
16
- activityDeploymentId?: string;
17
- deploymentInfo?: Record<string, unknown>;
18
- /** Deadline for call_tool/batch_call calls that pass no timeoutMs. Off when unset. */
19
- defaultToolTimeoutMs?: number;
20
- /** Per-connector deadline for the list/search/describe probe fan-out. Default 30_000. */
21
- probeTimeoutMs?: number;
22
- /** When set, the execute_code meta-tool is registered on top of the nine. */
23
- executor?: Executor;
24
- /** Global FIFO boundary for all non-preflight `/mcp` requests. */
25
- requestAdmission: AdmissionController;
26
- /** Encrypted connector-credential storage backing the Credentials page. */
27
- credentialVault?: CredentialVault;
28
- /** Optional browser UI and OAuth result-page labels. */
29
- branding?: ConnectaBranding;
30
- /**
31
- * Validated named scopes, selected per connection with `?toolkit=<name>` on
32
- * `/mcp`. Omit (or leave empty) and every connection sees the full registry.
33
- */
34
- toolkits?: ReadonlyMap<string, Toolkit>;
35
- }
36
- /** Build the Web-standard fetch handler that serves connecta. */
1
+ import { type RuntimeExecutionContext, type ServerOptions } from "./routes/shared.js";
2
+ export type { ServerOptions } from "./routes/shared.js";
3
+ /**
4
+ * Build the Web-standard fetch handler.
5
+ *
6
+ * Route ordering is the contract: private mutation routes precede wildcard
7
+ * OPTIONS, every built-in precedes connector-owned routes, and the security
8
+ * wrapper is applied to every response.
9
+ */
37
10
  export declare function createFetchHandler(opts: ServerOptions): (request: Request, runtimeContext?: RuntimeExecutionContext) => Promise<Response>;
38
- interface RuntimeExecutionContext {
39
- waitUntil(promise: Promise<unknown>): void;
40
- }
41
- export {};
42
11
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,KAAK,EAGV,gBAAgB,EAGhB,aAAa,EACd,MAAM,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAkB,KAAK,QAAQ,EAAqB,MAAM,eAAe,CAAC;AACjF,OAAO,EAGL,KAAK,OAAO,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAKV,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,MAAM,EAEP,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,yBAAyB,CAAC;AAoDjC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,UAAU,EAAE,qBAAqB,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,sFAAsF;IACtF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kEAAkE;IAClE,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,2EAA2E;IAC3E,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AA2wCD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,GAClB,CACD,OAAO,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,uBAAuB,KACrC,OAAO,CAAC,QAAQ,CAAC,CA+arB;AAED,UAAU,uBAAuB;IAC/B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,GAClB,CACD,OAAO,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,uBAAuB,KACrC,OAAO,CAAC,QAAQ,CAAC,CA+JrB"}