@zackbart/connecta 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +403 -0
- package/README.md +163 -308
- package/dist/auth/bearer.d.ts +4 -3
- package/dist/auth/bearer.d.ts.map +1 -1
- package/dist/auth/bearer.js +10 -8
- package/dist/auth/bearer.js.map +1 -1
- package/dist/auth/clerk.d.ts +8 -7
- package/dist/auth/clerk.d.ts.map +1 -1
- package/dist/auth/clerk.js +27 -8
- package/dist/auth/clerk.js.map +1 -1
- package/dist/connector-scope.d.ts +13 -0
- package/dist/connector-scope.d.ts.map +1 -0
- package/dist/connector-scope.js +35 -0
- package/dist/connector-scope.js.map +1 -0
- package/dist/connectors/api.d.ts +5 -5
- package/dist/connectors/api.d.ts.map +1 -1
- package/dist/connectors/remote-mcp.d.ts +3 -3
- package/dist/connectors/remote-mcp.d.ts.map +1 -1
- package/dist/connectors/remote-mcp.js +309 -10
- package/dist/connectors/remote-mcp.js.map +1 -1
- package/dist/credential-health.d.ts +20 -9
- package/dist/credential-health.d.ts.map +1 -1
- package/dist/credential-health.js +127 -63
- package/dist/credential-health.js.map +1 -1
- package/dist/credentials.d.ts +84 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +109 -2
- package/dist/credentials.js.map +1 -1
- package/dist/index.d.ts +83 -82
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +101 -31
- package/dist/index.js.map +1 -1
- package/dist/meta-tools.d.ts +3 -3
- package/dist/meta-tools.d.ts.map +1 -1
- package/dist/meta-tools.js +16 -7
- package/dist/meta-tools.js.map +1 -1
- package/dist/registry.d.ts +3 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -3
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +154 -52
- package/dist/server.js.map +1 -1
- package/dist/skills.js +2 -2
- package/dist/skills.js.map +1 -1
- package/dist/toolkits.js +1 -1
- package/dist/types.d.ts +51 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts +52 -21
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +665 -196
- package/dist/ui.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -2
- package/src/auth/bearer.ts +10 -8
- package/src/auth/clerk.ts +28 -9
- package/src/connector-scope.ts +41 -0
- package/src/connectors/api.ts +5 -5
- package/src/connectors/remote-mcp.ts +348 -25
- package/src/credential-health.ts +151 -71
- package/src/credentials.ts +166 -3
- package/src/index.ts +202 -113
- package/src/meta-tools.ts +22 -7
- package/src/registry.ts +4 -3
- package/src/server.ts +197 -71
- package/src/skills.ts +2 -2
- package/src/toolkits.ts +1 -1
- package/src/types.ts +51 -26
- package/src/ui.ts +703 -195
- package/src/version.ts +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -52,7 +52,7 @@ export interface ConnectorCredentialFieldConfig {
|
|
|
52
52
|
name: string;
|
|
53
53
|
/** Short field label, e.g. "Account email". */
|
|
54
54
|
label: string;
|
|
55
|
-
/** Plain-language guidance shown in /
|
|
55
|
+
/** Plain-language guidance shown in /credentials. Never include the credential itself. */
|
|
56
56
|
description?: string;
|
|
57
57
|
/** Input placeholder, e.g. "you@example.com". */
|
|
58
58
|
placeholder?: string;
|
|
@@ -63,7 +63,7 @@ export interface ConnectorCredentialFieldConfig {
|
|
|
63
63
|
export interface ConnectorCredentialConfig {
|
|
64
64
|
/** Short group or field label, e.g. "API token" or "Service credentials". */
|
|
65
65
|
label: string;
|
|
66
|
-
/** Plain-language guidance shown in /
|
|
66
|
+
/** Plain-language guidance shown in /credentials. Never include the credential itself. */
|
|
67
67
|
description?: string;
|
|
68
68
|
/** Password-field placeholder, e.g. "Paste API token". */
|
|
69
69
|
placeholder?: string;
|
|
@@ -86,13 +86,14 @@ export interface ConnectorContext {
|
|
|
86
86
|
/**
|
|
87
87
|
* Read-only access to this connector's operator-managed credential. Present
|
|
88
88
|
* only when the connector declares `credential` and the deployment configures
|
|
89
|
-
* `
|
|
89
|
+
* `credentials.encryptionKey`.
|
|
90
90
|
*/
|
|
91
91
|
credential?: ConnectorCredentialAccess;
|
|
92
92
|
/**
|
|
93
93
|
* Identity shared by connector calls that belong to one inbound request.
|
|
94
94
|
* Connectors may use it to reuse request-safe resources within that request,
|
|
95
|
-
* but must never retain I/O resources beyond the scope's lifetime.
|
|
95
|
+
* but must never retain I/O resources beyond the scope's lifetime. For
|
|
96
|
+
* probe-only scopes the core owns, `Connector.closeScope` signals that end.
|
|
96
97
|
*
|
|
97
98
|
* Optional for custom/test contexts; the context object itself is the scope
|
|
98
99
|
* when omitted.
|
|
@@ -121,7 +122,7 @@ export interface Connector {
|
|
|
121
122
|
/**
|
|
122
123
|
* Max inline result size (bytes) for this connector's tools before
|
|
123
124
|
* call_tool/batch_call truncate and stash the full text for get_result
|
|
124
|
-
* paging. Overrides
|
|
125
|
+
* paging. Overrides `ConnectaConfig.calls.maxResultBytes`;
|
|
125
126
|
* omit to inherit it (which itself defaults to 50_000). Must be a whole
|
|
126
127
|
* number of bytes >= 1; anything else warns at startup and is ignored, so
|
|
127
128
|
* the connector inherits the deployment-wide cap.
|
|
@@ -135,11 +136,11 @@ export interface Connector {
|
|
|
135
136
|
* and imperative; it is read by agents, not operators.
|
|
136
137
|
*/
|
|
137
138
|
usageGuide?: string;
|
|
138
|
-
/** Optional operator-managed credential slot rendered
|
|
139
|
+
/** Optional operator-managed credential slot rendered on /credentials. */
|
|
139
140
|
credential?: ConnectorCredentialConfig;
|
|
140
|
-
/** Optional server-side check used by /
|
|
141
|
+
/** Optional server-side check used by /credentials' Test action. */
|
|
141
142
|
testCredential?(value: string, ctx: ConnectorContext): Promise<CredentialTestResult>;
|
|
142
|
-
/** Optional multi-field credential check used by /
|
|
143
|
+
/** Optional multi-field credential check used by /credentials' Test action. */
|
|
143
144
|
testCredentials?(values: ConnectorCredentialValues, ctx: ConnectorContext): Promise<CredentialTestResult>;
|
|
144
145
|
/**
|
|
145
146
|
* Optional: whether this connector currently holds a stored downstream
|
|
@@ -162,6 +163,18 @@ export interface Connector {
|
|
|
162
163
|
staticTools?: ToolDef[];
|
|
163
164
|
listTools(ctx: ConnectorContext): Promise<ToolDef[]>;
|
|
164
165
|
callTool(name: string, args: unknown, ctx: ConnectorContext): Promise<unknown>;
|
|
166
|
+
/**
|
|
167
|
+
* Optional best-effort teardown for resources retained under
|
|
168
|
+
* `ctx.requestScope`. The core calls this at most once when a scope it created
|
|
169
|
+
* solely for probing ends, and never uses that scope again. Teardown gets a
|
|
170
|
+
* small, fixed best-effort completion window; a missing, rejected, or
|
|
171
|
+
* never-settling hook cannot change or hold open the operation's result
|
|
172
|
+
* beyond that bound.
|
|
173
|
+
*
|
|
174
|
+
* Per-request `/mcp` scopes are not closed through this hook: their
|
|
175
|
+
* request-local reuse remains in force until the request boundary.
|
|
176
|
+
*/
|
|
177
|
+
closeScope?(ctx: ConnectorContext): Promise<void>;
|
|
165
178
|
/** Optional connector-level health/auth status for list_connectors. */
|
|
166
179
|
status?(ctx: ConnectorContext): Promise<ConnectorStatus>;
|
|
167
180
|
/**
|
|
@@ -174,11 +187,11 @@ export interface Connector {
|
|
|
174
187
|
force?: boolean;
|
|
175
188
|
}): Promise<ConnectorStatus>;
|
|
176
189
|
/**
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* complete consent with their own account.
|
|
190
|
+
* Verify the OAuth `state` returned to /oauth/callback/<id> against the value
|
|
191
|
+
* this connector generated when it started the flow. Required whenever
|
|
192
|
+
* `finishAuth` is present: the callback rejects before `finishAuth` when this
|
|
193
|
+
* hook is absent, throws, or returns false — otherwise anyone holding the
|
|
194
|
+
* pending URL could complete consent with their own account.
|
|
182
195
|
*/
|
|
183
196
|
verifyState?(state: string | null, ctx: ConnectorContext): Promise<boolean>;
|
|
184
197
|
/** Optional: complete a downstream OAuth flow (called by /oauth/callback/<id>). */
|
|
@@ -187,7 +200,8 @@ export interface Connector {
|
|
|
187
200
|
* Optional: serve a connector-owned HTTP route — for example a signed
|
|
188
201
|
* download link minted by one of the connector's tools. Called only after
|
|
189
202
|
* every built-in route misses, so a connector can never shadow `/mcp`,
|
|
190
|
-
* `/
|
|
203
|
+
* `/`, `/credentials`, `/activity`, `/health`, or the credential API. The
|
|
204
|
+
* first connector to return a
|
|
191
205
|
* Response wins, in registration order; return null to decline.
|
|
192
206
|
*
|
|
193
207
|
* These routes are PUBLIC: connecta applies no auth gate to them. A
|
|
@@ -219,9 +233,9 @@ export interface Executor {
|
|
|
219
233
|
}
|
|
220
234
|
/**
|
|
221
235
|
* Which toolkits one inbound identity may open — the membership half of the
|
|
222
|
-
* deployment=org / toolkit=team framing (
|
|
223
|
-
* engine: one identity → the toolkit names it may select, plus whether
|
|
224
|
-
* connect with no `?toolkit=` at all.
|
|
236
|
+
* deployment=org / toolkit=team framing (docs/toolkits.md). A mapping, never a
|
|
237
|
+
* policy engine: one identity → the toolkit names it may select, plus whether
|
|
238
|
+
* it may connect with no `?toolkit=` at all.
|
|
225
239
|
*
|
|
226
240
|
* An identity with NO binding is unbound and keeps the pre-binding behavior:
|
|
227
241
|
* any declared toolkit, or the full registry. A binding is enforced at connect
|
|
@@ -268,19 +282,30 @@ export type UiAuthConfig = {
|
|
|
268
282
|
kind: "clerk";
|
|
269
283
|
publishableKey: string;
|
|
270
284
|
/**
|
|
271
|
-
* Origin
|
|
285
|
+
* Origin the operator shell fetches its browser sign-in loader from. **Must be an absolute
|
|
272
286
|
* `https:` URL** — the value lands in a `<script src>`, so the gate is
|
|
273
287
|
* stricter than the branding href gate: no `http:`, no loopback exemption, and
|
|
274
288
|
* no root-relative form (a relative path is rejected, not resolved). The
|
|
275
289
|
* shipped `clerkAuth` adapter derives this from the publishable key and
|
|
276
290
|
* Clerk's Frontend API is always https, so nothing legitimate needs a
|
|
277
291
|
* carve-out. A value that fails the gate reaches neither the loader tag nor
|
|
278
|
-
* the page's inline auth config:
|
|
292
|
+
* the page's inline auth config: operator pages render without it and report
|
|
279
293
|
* that Clerk could not load, and `createConnecta` names the drop in a startup
|
|
280
294
|
* warning.
|
|
281
295
|
*/
|
|
282
296
|
frontendApiUrl: string;
|
|
297
|
+
/**
|
|
298
|
+
* Hosted Account Portal sign-in address, handed to `Clerk.load`. **Must be an
|
|
299
|
+
* absolute `https:` URL** — the same gate `frontendApiUrl` passes, because
|
|
300
|
+
* this value is where Clerk *navigates* the operator's browser. An Account
|
|
301
|
+
* Portal address is always https, so the stricter gate costs nothing real: a
|
|
302
|
+
* value that fails it (a `javascript:`/`data:` payload, a cleartext `http:`
|
|
303
|
+
* address, a relative path) reaches no part of the page, the shell signs in
|
|
304
|
+
* through Clerk's default instead, and `createConnecta` names the drop in a
|
|
305
|
+
* startup warning.
|
|
306
|
+
*/
|
|
283
307
|
signInUrl?: string;
|
|
308
|
+
/** Hosted Account Portal sign-up address. Gated exactly like `signInUrl`. */
|
|
284
309
|
signUpUrl?: string;
|
|
285
310
|
};
|
|
286
311
|
/**
|
|
@@ -297,7 +322,7 @@ export interface ConnectaBranding {
|
|
|
297
322
|
ownerName?: string;
|
|
298
323
|
/** Optional link for the organization or owner label. */
|
|
299
324
|
ownerUrl?: string;
|
|
300
|
-
/**
|
|
325
|
+
/** Operator-page introduction and meta description. */
|
|
301
326
|
description?: string;
|
|
302
327
|
/**
|
|
303
328
|
* Browser tab title and page meta name. Defaults to
|
|
@@ -325,16 +350,16 @@ export interface ConnectaBranding {
|
|
|
325
350
|
export interface InboundAuth {
|
|
326
351
|
kind: string;
|
|
327
352
|
/**
|
|
328
|
-
* Optional browser sign-in configuration. When present,
|
|
353
|
+
* Optional browser sign-in configuration. When present, operator pages use it
|
|
329
354
|
* provider instead of asking the operator to paste a static bearer secret.
|
|
330
355
|
*/
|
|
331
356
|
uiAuth?: UiAuthConfig;
|
|
332
357
|
/**
|
|
333
|
-
* Optional toolkit binding for every identity this provider admits
|
|
334
|
-
* Declared statically so `createConnecta` can validate the
|
|
335
|
-
* `ConnectaConfig.toolkits` and throw on a typo — a binding
|
|
336
|
-
* not one an operator can reason about. An `authorize` result
|
|
337
|
-
* per identity with its own `toolkitBinding`.
|
|
358
|
+
* Optional toolkit binding for every identity this provider admits
|
|
359
|
+
* (docs/toolkits.md). Declared statically so `createConnecta` can validate the
|
|
360
|
+
* names against `ConnectaConfig.toolkits` and throw on a typo — a binding
|
|
361
|
+
* nobody wrote is not one an operator can reason about. An `authorize` result
|
|
362
|
+
* may narrow it per identity with its own `toolkitBinding`.
|
|
338
363
|
*/
|
|
339
364
|
toolkitBinding?: ToolkitBinding;
|
|
340
365
|
/** Serve/short-circuit .well-known + OPTIONS. Return null when not handled. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,oEAAoE;IACpE,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,eAAgB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/D,qEAAqE;AACrE,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,yEAAyE;IACzE,MAAM,IAAI,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;CACrD;AAED,iEAAiE;AACjE,MAAM,WAAW,8BAA8B;IAC7C,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,oEAAoE;IACpE,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,eAAgB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/D,qEAAqE;AACrE,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,yEAAyE;IACzE,MAAM,IAAI,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;CACrD;AAED,iEAAiE;AACjE,MAAM,WAAW,8BAA8B;IAC7C,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;CAC3C;AAED,2EAA2E;AAC3E,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,8BAA8B,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,eAAe,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,oEAAoE;IACpE,cAAc,CAAC,CACb,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,+EAA+E;IAC/E,eAAe,CAAC,CACd,MAAM,EAAE,yBAAyB,EACjC,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB;;;;;;;;;;OAUG;IACH,UAAU,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,uEAAuE;IACvE,MAAM,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD;;;;;OAKG;IACH,SAAS,CAAC,CACR,GAAG,EAAE,gBAAgB,EACrB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GACzB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,mFAAmF;IACnF,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,CACZ,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC7B;AAED,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9E;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,uCAAuC;AACvC,MAAM,MAAM,UAAU,GAClB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEtC,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,UAAU,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+EAA+E;IAC/E,cAAc,CAAC,CACb,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC9C,sCAAsC;IACtC,SAAS,CACP,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrC"}
|
package/dist/ui.d.ts
CHANGED
|
@@ -37,8 +37,8 @@ export declare function isSafeHttpUrl(url: unknown): boolean;
|
|
|
37
37
|
* default href is the relative `/favicon.svg`, which `isSafeHttpUrl` alone would
|
|
38
38
|
* reject — and it is kept narrow on both ends.
|
|
39
39
|
*
|
|
40
|
-
* Root-relative only, because
|
|
41
|
-
* depths and a document-relative path would resolve differently
|
|
40
|
+
* Root-relative only, because operator and OAuth callback pages sit at
|
|
41
|
+
* different depths and a document-relative path would resolve differently.
|
|
42
42
|
*
|
|
43
43
|
* "Root-relative" is enforced structurally: exactly one leading `/` followed by
|
|
44
44
|
* a character that is neither `/` nor `\`. Both of those would make the value an
|
|
@@ -51,27 +51,44 @@ export declare function isSafeHttpUrl(url: unknown): boolean;
|
|
|
51
51
|
*/
|
|
52
52
|
export declare function isSafeIconHref(href: unknown): boolean;
|
|
53
53
|
/**
|
|
54
|
-
* True only for an absolute `https:` URL — the gate
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* left to remember.
|
|
54
|
+
* True only for an absolute `https:` URL — the gate every `uiAuth` URL passes:
|
|
55
|
+
* `frontendApiUrl`, which becomes the operator shell's sign-in loader source,
|
|
56
|
+
* and `signInUrl`/`signUpUrl`, which ClerkJS uses as *navigation targets* when
|
|
57
|
+
* the operator signs in. With those three gated, no operator-config value
|
|
58
|
+
* reaches the browser in a URL position — attribute or navigation — without
|
|
59
|
+
* validation, and there is no exception left to remember.
|
|
60
60
|
*
|
|
61
|
-
* Stricter than `isSafeHttpUrl` on purpose
|
|
62
|
-
*
|
|
63
|
-
* derives it from the publishable key and Clerk's Frontend API is
|
|
64
|
-
*
|
|
65
|
-
* browser's mixed-content rules had not already blocked
|
|
61
|
+
* Stricter than `isSafeHttpUrl` on purpose: no `http:` carve-out, no loopback
|
|
62
|
+
* carve-out, and no relative form. Nobody types `frontendApiUrl` — the shipped
|
|
63
|
+
* Clerk adapter derives it from the publishable key, and Clerk's Frontend API is
|
|
64
|
+
* always https — and a cleartext script source on an operator page would be a
|
|
65
|
+
* downgrade even where a browser's mixed-content rules had not already blocked
|
|
66
|
+
* it. `signInUrl`/`signUpUrl` *are* typed by the operator, but what belongs
|
|
67
|
+
* there is a hosted Account Portal address (`https://accounts.<domain>` or
|
|
68
|
+
* `https://<slug>.accounts.dev`), which is https as well; `http:` would carry a
|
|
69
|
+
* sign-in over cleartext, and a path relative to this origin is meaningless
|
|
70
|
+
* because this server hosts no sign-in page of its own. So the looser gate would
|
|
71
|
+
* buy nothing real, and the same strictness holds for all three.
|
|
66
72
|
*/
|
|
67
|
-
export declare function
|
|
73
|
+
export declare function isSafeHttpsUrl(url: unknown): boolean;
|
|
68
74
|
/**
|
|
69
75
|
* Names of the `uiAuth` URLs an inbound-auth provider supplied that failed their
|
|
70
76
|
* gate. Lives beside the gate for the same reason `droppedBrandingUrls` does: the
|
|
71
77
|
* startup warning cannot then drift from what rendering actually drops. Every
|
|
72
78
|
* field is read defensively rather than trusted, because a custom `InboundAuth`
|
|
73
|
-
* is untyped at a JS call site — `
|
|
79
|
+
* is untyped at a JS call site — `isSafeHttpsUrl` takes `unknown`, and a
|
|
74
80
|
* `uiAuth` that is not the clerk shape is reported as nothing to warn about.
|
|
81
|
+
*
|
|
82
|
+
* `frontendApiUrl` is required, so anything that fails its gate is a drop.
|
|
83
|
+
* `signInUrl` and `signUpUrl` are optional, so only a value the operator
|
|
84
|
+
* *supplied* and the gate then rejected is worth a warning — an unset field
|
|
85
|
+
* took no default away from anyone. `isSetUrlValue` decides that, the same way
|
|
86
|
+
* and for the same reasons it decides it for the branding URLs: a warning that
|
|
87
|
+
* fires for one and not the other would be reporting on the field rather than
|
|
88
|
+
* on the operator's intent. Rendering is not consulted for this: it drops on
|
|
89
|
+
* the gate alone, and a blank string fails that gate too — it is simply not
|
|
90
|
+
* *reported*, because a blank is indistinguishable from leaving the field
|
|
91
|
+
* alone.
|
|
75
92
|
*/
|
|
76
93
|
export declare function droppedUiAuthUrls(uiAuth?: UiAuthConfig): string[];
|
|
77
94
|
export interface UiTool {
|
|
@@ -120,6 +137,12 @@ export interface UiConnector {
|
|
|
120
137
|
updatedAt?: string;
|
|
121
138
|
testable: boolean;
|
|
122
139
|
error?: string;
|
|
140
|
+
/**
|
|
141
|
+
* Something true and non-blocking about a working credential — today, that
|
|
142
|
+
* the vault still holds fields the connector has stopped declaring.
|
|
143
|
+
* Distinct from `error`, which means the credential cannot be used.
|
|
144
|
+
*/
|
|
145
|
+
notice?: string;
|
|
123
146
|
};
|
|
124
147
|
}
|
|
125
148
|
export interface UiData {
|
|
@@ -129,7 +152,17 @@ export interface UiData {
|
|
|
129
152
|
};
|
|
130
153
|
connectors: UiConnector[];
|
|
131
154
|
activityEnabled: boolean;
|
|
155
|
+
credentialManagement: CredentialManagementCapability;
|
|
132
156
|
}
|
|
157
|
+
export type CredentialManagementCapability = "available" | "requires_clerk" | "vault_not_configured" | "no_slots";
|
|
158
|
+
export type OperatorPage = "connections" | "credentials" | "activity";
|
|
159
|
+
export declare function operatorPageForPath(path: string): OperatorPage | undefined;
|
|
160
|
+
export declare function operatorPageTitle(page: OperatorPage, configuredTitle: string): string;
|
|
161
|
+
export declare function credentialManagementCapability(input: {
|
|
162
|
+
eligibleClerkOperator: boolean;
|
|
163
|
+
hasCredentialSlots: boolean;
|
|
164
|
+
hasCredentialVault: boolean;
|
|
165
|
+
}): CredentialManagementCapability;
|
|
133
166
|
export interface FilteredUiConnector {
|
|
134
167
|
connector: UiConnector;
|
|
135
168
|
tools: UiTool[];
|
|
@@ -148,13 +181,11 @@ export declare function filterUiConnectors(connectors: UiConnector[], query: str
|
|
|
148
181
|
export declare function buildUiData(registry: Registry, baseUrl: string, serverInfo: {
|
|
149
182
|
name: string;
|
|
150
183
|
version: string;
|
|
151
|
-
}, credentialVault?: CredentialVault, activityEnabled?: boolean): Promise<UiData>;
|
|
184
|
+
}, credentialVault?: CredentialVault, activityEnabled?: boolean, credentialManagement?: CredentialManagementCapability): Promise<UiData>;
|
|
152
185
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
* normal sign-in flow and a short-lived session token; bearer-only deployments
|
|
156
|
-
* retain the manual-token fallback.
|
|
186
|
+
* Every operator page serves this same data-free shell. Connector, credential,
|
|
187
|
+
* and activity data arrives only through the authenticated `/ui/*` APIs.
|
|
157
188
|
*/
|
|
158
|
-
export declare function renderUiHtml(uiAuth?: UiAuthConfig, mcpUrl?: string, branding?: ConnectaBranding, nonce?: string): string;
|
|
189
|
+
export declare function renderUiHtml(uiAuth?: UiAuthConfig, mcpUrl?: string, branding?: ConnectaBranding, nonce?: string, page?: OperatorPage): string;
|
|
159
190
|
export {};
|
|
160
191
|
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|