@polpo-ai/connect-server 0.15.143 → 0.16.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 (83) hide show
  1. package/README.md +352 -1
  2. package/dist/custom-tool-runner-broker.d.ts +29 -0
  3. package/dist/custom-tool-runner-broker.d.ts.map +1 -0
  4. package/dist/custom-tool-runner-broker.js +140 -0
  5. package/dist/custom-tool-runner-broker.js.map +1 -0
  6. package/dist/definition-store.d.ts +10 -0
  7. package/dist/definition-store.d.ts.map +1 -0
  8. package/dist/definition-store.js +25 -0
  9. package/dist/definition-store.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +8 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-capability-resolver.d.ts +22 -0
  15. package/dist/mcp-capability-resolver.d.ts.map +1 -0
  16. package/dist/mcp-capability-resolver.js +110 -0
  17. package/dist/mcp-capability-resolver.js.map +1 -0
  18. package/dist/mcp-discovery.d.ts +7 -0
  19. package/dist/mcp-discovery.d.ts.map +1 -0
  20. package/dist/mcp-discovery.js +27 -0
  21. package/dist/mcp-discovery.js.map +1 -0
  22. package/dist/mcp-execution.d.ts +13 -0
  23. package/dist/mcp-execution.d.ts.map +1 -0
  24. package/dist/mcp-execution.js +14 -0
  25. package/dist/mcp-execution.js.map +1 -0
  26. package/dist/mcp-oauth-redirect.d.ts +4 -0
  27. package/dist/mcp-oauth-redirect.d.ts.map +1 -0
  28. package/dist/mcp-oauth-redirect.js +25 -0
  29. package/dist/mcp-oauth-redirect.js.map +1 -0
  30. package/dist/mcp-oauth.d.ts +12 -9
  31. package/dist/mcp-oauth.d.ts.map +1 -1
  32. package/dist/mcp-oauth.js +18 -6
  33. package/dist/mcp-oauth.js.map +1 -1
  34. package/dist/mcp-runner-broker.d.ts +29 -0
  35. package/dist/mcp-runner-broker.d.ts.map +1 -0
  36. package/dist/mcp-runner-broker.js +181 -0
  37. package/dist/mcp-runner-broker.js.map +1 -0
  38. package/dist/mcp-setup-clients.d.ts +24 -0
  39. package/dist/mcp-setup-clients.d.ts.map +1 -0
  40. package/dist/mcp-setup-clients.js +113 -0
  41. package/dist/mcp-setup-clients.js.map +1 -0
  42. package/dist/mcp-transport.d.ts +20 -0
  43. package/dist/mcp-transport.d.ts.map +1 -0
  44. package/dist/mcp-transport.js +163 -0
  45. package/dist/mcp-transport.js.map +1 -0
  46. package/dist/memory-store.d.ts +11 -2
  47. package/dist/memory-store.d.ts.map +1 -1
  48. package/dist/memory-store.js +81 -6
  49. package/dist/memory-store.js.map +1 -1
  50. package/dist/oauth-identity.d.ts +6 -0
  51. package/dist/oauth-identity.d.ts.map +1 -0
  52. package/dist/oauth-identity.js +30 -0
  53. package/dist/oauth-identity.js.map +1 -0
  54. package/dist/oauth-token-transport.d.ts +19 -0
  55. package/dist/oauth-token-transport.d.ts.map +1 -0
  56. package/dist/oauth-token-transport.js +133 -0
  57. package/dist/oauth-token-transport.js.map +1 -0
  58. package/dist/oauth.js +1 -1
  59. package/dist/oauth.js.map +1 -1
  60. package/dist/public-network.d.ts +11 -0
  61. package/dist/public-network.d.ts.map +1 -0
  62. package/dist/public-network.js +49 -0
  63. package/dist/public-network.js.map +1 -0
  64. package/dist/refresh-lineage.d.ts +21 -0
  65. package/dist/refresh-lineage.d.ts.map +1 -0
  66. package/dist/refresh-lineage.js +83 -0
  67. package/dist/refresh-lineage.js.map +1 -0
  68. package/dist/secrets.d.ts +2 -0
  69. package/dist/secrets.d.ts.map +1 -1
  70. package/dist/secrets.js.map +1 -1
  71. package/dist/service.d.ts +78 -8
  72. package/dist/service.d.ts.map +1 -1
  73. package/dist/service.js +1090 -403
  74. package/dist/service.js.map +1 -1
  75. package/dist/setup-lifecycle.d.ts +5 -0
  76. package/dist/setup-lifecycle.d.ts.map +1 -0
  77. package/dist/setup-lifecycle.js +36 -0
  78. package/dist/setup-lifecycle.js.map +1 -0
  79. package/dist/verification.d.ts +4 -0
  80. package/dist/verification.d.ts.map +1 -0
  81. package/dist/verification.js +76 -0
  82. package/dist/verification.js.map +1 -0
  83. package/package.json +4 -3
@@ -1,4 +1,4 @@
1
- import { ConnectError, } from "@polpo-ai/connect";
1
+ import { ConnectError, canCommitMcpOAuthConnection, canCommitMcpOAuthSetup, canFailMcpOAuthSetup, failedMcpOAuthState, completedMcpOAuthState, matchesOAuthReconnect, canConsumeConnectionSetup, finishConnectionSetup, prepareConnectionSetupCompletion, reconcileConnectionSetup, } from "@polpo-ai/connect";
2
2
  export class MemoryConnectStore {
3
3
  connections = new Map();
4
4
  oauthStates = new Map();
@@ -26,6 +26,14 @@ export class MemoryConnectStore {
26
26
  async deleteConnection(id) {
27
27
  this.connections.delete(id);
28
28
  }
29
+ async replaceOAuthCredential(expected, replacement) {
30
+ const current = this.connections.get(expected.connectionId);
31
+ if (!current || !matchesOAuthReconnect(current, expected))
32
+ return null;
33
+ const next = { ...current, ...clone(replacement) };
34
+ this.connections.set(current.id, next);
35
+ return clone(next);
36
+ }
29
37
  async saveOAuthState(record) {
30
38
  this.oauthStates.set(record.state, clone(record));
31
39
  }
@@ -38,10 +46,40 @@ export class MemoryConnectStore {
38
46
  const record = this.oauthStates.get(state);
39
47
  return record ? clone(record) : null;
40
48
  }
49
+ async commitMcpOAuthConnection(input) {
50
+ const state = this.oauthStates.get(input.state);
51
+ if (!state || !canCommitMcpOAuthConnection(state, input) || this.connections.has(input.connection.id))
52
+ return null;
53
+ const connection = clone(input.connection);
54
+ this.connections.set(connection.id, connection);
55
+ this.oauthStates.set(input.state, clone(completedMcpOAuthState(state, connection.id)));
56
+ return clone(connection);
57
+ }
58
+ async commitMcpOAuthSetup(input) {
59
+ const state = this.oauthStates.get(input.state), setup = this.setupSessions.get(input.setupReference);
60
+ if (!state || !setup || !canCommitMcpOAuthSetup(state, setup, input)
61
+ || this.connections.has(input.connection.id) || this.links.has(input.link.id)
62
+ || [...this.links.values()].some(link => link.connectionId === input.connection.id && link.projectId === input.link.projectId))
63
+ return null;
64
+ this.connections.set(input.connection.id, clone(input.connection));
65
+ this.links.set(input.link.id, clone(input.link));
66
+ this.setupSessions.set(setup.id, clone(finishConnectionSetup(setup, { status: "completed", connectionId: input.connection.id })));
67
+ this.oauthStates.set(input.state, clone(completedMcpOAuthState(state, input.connection.id)));
68
+ return clone(input.connection);
69
+ }
70
+ async failMcpOAuthSetup(input) {
71
+ const state = this.oauthStates.get(input.state), setup = this.setupSessions.get(input.setupReference);
72
+ if (!state || !setup || !canFailMcpOAuthSetup(state, setup, input))
73
+ return null;
74
+ const failed = finishConnectionSetup(setup, { status: "error" });
75
+ this.setupSessions.set(setup.id, clone(failed));
76
+ this.oauthStates.set(input.state, clone(failedMcpOAuthState(state)));
77
+ return clone(failed);
78
+ }
41
79
  async claimOAuthState(state, claimToken, claimExpiresAt, now) {
42
80
  const record = this.oauthStates.get(state);
43
- if (!record || record.status === "completed")
44
- return record ? clone(record) : null;
81
+ if (!record || record.status === "completed" || record.status === "failed" || !(Date.parse(record.expiresAt) > Date.parse(now)))
82
+ return null;
45
83
  if (record.status === "processing"
46
84
  && record.claimExpiresAt
47
85
  && new Date(record.claimExpiresAt).getTime() > new Date(now).getTime())
@@ -114,14 +152,51 @@ export class MemoryConnectStore {
114
152
  const session = this.setupSessions.get(id);
115
153
  return session ? clone(session) : null;
116
154
  }
117
- async consumeConnectionSetupSession(id, consumedAt) {
155
+ getConnectionSetupSessionByReference(reference) {
156
+ return this.getConnectionSetupSession(reference);
157
+ }
158
+ async consumeConnectionSetupSession(id, consumedAt, authorizationExpiresAt) {
118
159
  const session = this.setupSessions.get(id);
119
- if (!session || session.consumedAt)
160
+ if (!session || !canConsumeConnectionSetup(session, consumedAt))
120
161
  return null;
121
- const consumed = { ...session, consumedAt };
162
+ const consumed = { ...session, status: "started", consumedAt, authorizationExpiresAt };
122
163
  this.setupSessions.set(id, clone(consumed));
123
164
  return clone(session);
124
165
  }
166
+ async cancelConnectionSetupSession(id, cancelledAt) {
167
+ const session = this.setupSessions.get(id);
168
+ if (!session || !canConsumeConnectionSetup(session, cancelledAt))
169
+ return null;
170
+ const cancelled = { ...session, status: "cancelled" };
171
+ this.setupSessions.set(id, clone(cancelled));
172
+ return clone(cancelled);
173
+ }
174
+ async prepareConnectionSetupCompletion(reference, intent) {
175
+ const session = this.setupSessions.get(reference);
176
+ const prepared = session ? prepareConnectionSetupCompletion(session, intent) : null;
177
+ if (!prepared)
178
+ return null;
179
+ this.setupSessions.set(reference, clone(prepared));
180
+ return clone(prepared);
181
+ }
182
+ async reconcileConnectionSetupSession(reference) {
183
+ const session = this.setupSessions.get(reference);
184
+ if (!session)
185
+ return null;
186
+ const intent = session.completionIntent;
187
+ const reconciled = intent ? reconcileConnectionSetup(session, this.connections.get(intent.connection.connectionId) ?? null, this.links.get(intent.link.id) ?? null) : null;
188
+ if (reconciled)
189
+ this.setupSessions.set(reference, clone(reconciled));
190
+ return clone(reconciled ?? session);
191
+ }
192
+ async finishConnectionSetupSession(reference, outcome, _finishedAt) {
193
+ const session = this.setupSessions.get(reference);
194
+ const finished = session ? finishConnectionSetup(session, outcome) : null;
195
+ if (!finished)
196
+ return null;
197
+ this.setupSessions.set(reference, clone(finished));
198
+ return clone(finished);
199
+ }
125
200
  }
126
201
  function matchesFilter(connection, filter) {
127
202
  if (filter.providerId && connection.providerId !== filter.providerId)
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type OAuth2AuthConfig, type OAuthAccountIdentity, type OAuthUserInfoPolicy } from "@polpo-ai/connect";
2
+ import { type TokenTransportOptions } from "./oauth-token-transport.js";
3
+ export declare function oauthIdentityPolicyFingerprint(policy?: OAuthUserInfoPolicy): string | undefined;
4
+ export declare function normalizeOAuthTokenScopes(auth: OAuth2AuthConfig, scopes: string[]): string[];
5
+ export declare function resolveOAuthAccountIdentity(options: TokenTransportOptions, policy: OAuthUserInfoPolicy, accessToken: string, now: Date): Promise<OAuthAccountIdentity>;
6
+ //# sourceMappingURL=oauth-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-identity.d.ts","sourceRoot":"","sources":["../src/oauth-identity.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC9I,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE1F,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAK/F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAG5F;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,oBAAoB,CAAC,CAa/B"}
@@ -0,0 +1,30 @@
1
+ import { createHash } from "node:crypto";
2
+ import { ConnectError, normalizeScopes } from "@polpo-ai/connect";
3
+ import { requestOAuthJson } from "./oauth-token-transport.js";
4
+ export function oauthIdentityPolicyFingerprint(policy) {
5
+ return policy ? createHash("sha256").update(JSON.stringify([
6
+ policy.method, policy.issuer, policy.url, [...policy.requiredScopes].sort(),
7
+ Object.entries(policy.scopeAliases ?? {}).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0),
8
+ ])).digest("hex") : undefined;
9
+ }
10
+ export function normalizeOAuthTokenScopes(auth, scopes) {
11
+ const aliases = auth.identity?.scopeAliases;
12
+ return normalizeScopes(scopes.map(scope => aliases && Object.hasOwn(aliases, scope) ? aliases[scope] : scope));
13
+ }
14
+ export async function resolveOAuthAccountIdentity(options, policy, accessToken, now) {
15
+ const fail = (category, status) => new ConnectError("setup_invalid", "OAuth account identity could not be verified", {
16
+ details: { category, ...(status === undefined ? {} : { providerStatus: status }) },
17
+ });
18
+ const body = await requestOAuthJson({ ...options, requireJsonContentType: true }, policy.url, {
19
+ method: "GET", headers: { authorization: `Bearer ${accessToken}`, accept: "application/json" },
20
+ }, fail);
21
+ if (!body || typeof body !== "object" || Array.isArray(body))
22
+ throw fail("invalid_identity");
23
+ const value = body;
24
+ if (typeof value.sub !== "string" || !/^[\x21-\x7e]{1,255}$/.test(value.sub)
25
+ || (value.iss !== undefined && value.iss !== policy.issuer))
26
+ throw fail("invalid_identity");
27
+ return { issuer: policy.issuer, subject: value.sub, verifiedAt: now.toISOString(),
28
+ policyFingerprint: oauthIdentityPolicyFingerprint(policy) };
29
+ }
30
+ //# sourceMappingURL=oauth-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-identity.js","sourceRoot":"","sources":["../src/oauth-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ConnectError } from "@polpo-ai/connect";
2
+ export interface ProviderTokenResponse {
3
+ access_token: string;
4
+ refresh_token?: string;
5
+ token_type?: string;
6
+ expires_in?: number;
7
+ scope?: string;
8
+ }
9
+ export interface TokenTransportOptions {
10
+ fetch: typeof fetch;
11
+ resolveHostname: (hostname: string) => Promise<readonly string[]>;
12
+ timeoutMs?: number;
13
+ requireJsonContentType?: boolean;
14
+ }
15
+ /** The same bounded transport is used for code exchange and refresh. No error contains a provider body. */
16
+ export declare function requestOAuthToken(options: TokenTransportOptions, tokenUrl: string, body: Record<string, string | undefined>): Promise<ProviderTokenResponse>;
17
+ /** Bounded server-to-provider transport shared by token exchange and account identity checks. */
18
+ export declare function requestOAuthJson(options: TokenTransportOptions, tokenUrl: string, request: Pick<RequestInit, "method" | "headers" | "body">, errorFactory: (category: string, status?: number) => ConnectError): Promise<unknown>;
19
+ //# sourceMappingURL=oauth-token-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-token-transport.d.ts","sourceRoot":"","sources":["../src/oauth-token-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6B,MAAM,mBAAmB,CAAC;AAG5E,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AASD,2GAA2G;AAC3G,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACvC,OAAO,CAAC,qBAAqB,CAAC,CAKhC;AAED,iGAAiG;AACjG,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC,EACzD,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,GAChE,OAAO,CAAC,OAAO,CAAC,CAoElB"}
@@ -0,0 +1,133 @@
1
+ import { ConnectError, connectorHostnameIsUnsafe } from "@polpo-ai/connect";
2
+ import { toFormBody } from "./oauth.js";
3
+ const MAX_RESPONSE_BYTES = 256 * 1024;
4
+ function failed(category, status) {
5
+ return new ConnectError("token_exchange_failed", "OAuth token exchange failed", {
6
+ details: { category, ...(status === undefined ? {} : { providerStatus: status }) },
7
+ });
8
+ }
9
+ /** The same bounded transport is used for code exchange and refresh. No error contains a provider body. */
10
+ export async function requestOAuthToken(options, tokenUrl, body) {
11
+ return normalizeResponse(await requestOAuthJson(options, tokenUrl, {
12
+ method: "POST", headers: { "content-type": "application/x-www-form-urlencoded", accept: "application/json" },
13
+ body: toFormBody(body),
14
+ }, failed));
15
+ }
16
+ /** Bounded server-to-provider transport shared by token exchange and account identity checks. */
17
+ export async function requestOAuthJson(options, tokenUrl, request, errorFactory) {
18
+ const failed = errorFactory;
19
+ let url;
20
+ try {
21
+ url = new URL(tokenUrl);
22
+ }
23
+ catch {
24
+ throw failed("invalid_endpoint");
25
+ }
26
+ if (url.protocol !== "https:" || url.username || url.password || url.hash || connectorHostnameIsUnsafe(url.hostname)) {
27
+ throw failed("network_denied");
28
+ }
29
+ const controller = new AbortController();
30
+ let reader;
31
+ let timer;
32
+ const deadline = new Promise((_, reject) => {
33
+ timer = setTimeout(() => {
34
+ controller.abort();
35
+ void reader?.cancel().catch(() => undefined);
36
+ reject(failed("timeout"));
37
+ }, options.timeoutMs ?? 10_000);
38
+ });
39
+ try {
40
+ return await Promise.race([deadline, (async () => {
41
+ const addresses = await options.resolveHostname(url.hostname);
42
+ if (controller.signal.aborted)
43
+ throw failed("timeout");
44
+ if (!addresses.length || addresses.some(connectorHostnameIsUnsafe))
45
+ throw failed("network_denied");
46
+ const response = await options.fetch(url, {
47
+ ...request, redirect: "error", signal: controller.signal,
48
+ });
49
+ if (!response.ok) {
50
+ void response.body?.cancel().catch(() => undefined);
51
+ throw failed("provider_rejected", response.status);
52
+ }
53
+ if (options.requireJsonContentType && response.headers.get("content-type")?.split(";", 1)[0].trim().toLowerCase() !== "application/json") {
54
+ void response.body?.cancel().catch(() => undefined);
55
+ throw failed("invalid_response");
56
+ }
57
+ if (Number(response.headers.get("content-length")) > MAX_RESPONSE_BYTES) {
58
+ void response.body?.cancel().catch(() => undefined);
59
+ throw failed("response_too_large");
60
+ }
61
+ if (controller.signal.aborted) {
62
+ void response.body?.cancel().catch(() => undefined);
63
+ throw failed("timeout");
64
+ }
65
+ reader = response.body?.getReader();
66
+ const chunks = [];
67
+ let size = 0;
68
+ while (reader) {
69
+ const { value, done } = await reader.read();
70
+ if (controller.signal.aborted)
71
+ throw failed("timeout");
72
+ if (done)
73
+ break;
74
+ size += value.byteLength;
75
+ if (size > MAX_RESPONSE_BYTES) {
76
+ void reader.cancel().catch(() => undefined);
77
+ throw failed("response_too_large");
78
+ }
79
+ chunks.push(value);
80
+ }
81
+ const bytes = new Uint8Array(size);
82
+ let offset = 0;
83
+ for (const chunk of chunks) {
84
+ bytes.set(chunk, offset);
85
+ offset += chunk.byteLength;
86
+ }
87
+ let value;
88
+ try {
89
+ value = JSON.parse(new TextDecoder().decode(bytes));
90
+ }
91
+ catch {
92
+ throw failed("invalid_response");
93
+ }
94
+ return value;
95
+ })()]);
96
+ }
97
+ catch (error) {
98
+ if (error instanceof ConnectError)
99
+ throw error;
100
+ throw failed(controller.signal.aborted ? "timeout" : "transport_failed");
101
+ }
102
+ finally {
103
+ clearTimeout(timer);
104
+ }
105
+ }
106
+ function normalizeResponse(value) {
107
+ if (!value || typeof value !== "object" || Array.isArray(value))
108
+ throw failed("invalid_response");
109
+ const input = value;
110
+ for (const key of ["access_token", "refresh_token"]) {
111
+ if (key === "refresh_token" && input[key] === undefined)
112
+ continue;
113
+ if (typeof input[key] !== "string" || !input[key].trim() || input[key].length > 65_536 || /[\r\n]/.test(input[key])) {
114
+ throw failed("invalid_response");
115
+ }
116
+ }
117
+ if (input.token_type !== undefined && (typeof input.token_type !== "string" || !/^[A-Za-z][A-Za-z0-9-]{0,31}$/.test(input.token_type))) {
118
+ throw failed("invalid_response");
119
+ }
120
+ if (input.scope !== undefined && (typeof input.scope !== "string" || input.scope.length > 32_768))
121
+ throw failed("invalid_response");
122
+ if (input.expires_in !== undefined && (typeof input.expires_in !== "number" || !Number.isSafeInteger(input.expires_in)
123
+ || input.expires_in < 0 || input.expires_in > 1_000_000_000))
124
+ throw failed("invalid_response");
125
+ return {
126
+ access_token: input.access_token,
127
+ ...(input.refresh_token === undefined ? {} : { refresh_token: input.refresh_token }),
128
+ ...(input.token_type === undefined ? {} : { token_type: input.token_type }),
129
+ ...(input.scope === undefined ? {} : { scope: input.scope }),
130
+ ...(input.expires_in === undefined ? {} : { expires_in: input.expires_in }),
131
+ };
132
+ }
133
+ //# sourceMappingURL=oauth-token-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-token-transport.js","sourceRoot":"","sources":["../src/oauth-token-transport.ts"],"names":[],"mappings":"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"}
package/dist/oauth.js CHANGED
@@ -16,7 +16,7 @@ export function toFormBody(input) {
16
16
  return body;
17
17
  }
18
18
  export function parseScopes(scope, fallback) {
19
- if (!scope)
19
+ if (scope === undefined)
20
20
  return [...fallback];
21
21
  return scope.split(/[,\s]+/).map((part) => part.trim()).filter(Boolean);
22
22
  }
package/dist/oauth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,iBAAiB,CAAC,KAAK,GAAG,EAAE;IAC1C,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAyC;IAClE,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAyB,EAAE,QAA2B;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,iBAAiB,CAAC,KAAK,GAAG,EAAE;IAC1C,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAyC;IAClE,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAyB,EAAE,QAA2B;IAChF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type LookupFunction } from "node:net";
2
+ type ResolveHostname = (hostname: string) => Promise<readonly string[]>;
3
+ /** Validate the exact addresses returned to net/tls.connect; no second DNS lookup. */
4
+ export declare function publicAddressLookup(resolve: ResolveHostname): LookupFunction;
5
+ export declare function createPublicNetworkTransport(resolve?: ResolveHostname): {
6
+ fetch: typeof fetch;
7
+ close: () => Promise<void>;
8
+ };
9
+ export declare const publicNetworkFetch: typeof fetch;
10
+ export {};
11
+ //# sourceMappingURL=public-network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-network.d.ts","sourceRoot":"","sources":["../src/public-network.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAIrD,KAAK,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAKxE,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAgB5E;AAED,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,eAAiC;;;EAgBtF;AAID,eAAO,MAAM,kBAAkB,cAAuC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { lookup } from "node:dns/promises";
2
+ import { isIP } from "node:net";
3
+ import { Agent } from "undici";
4
+ import { connectorHostnameIsUnsafe } from "@polpo-ai/connect";
5
+ const resolveHostname = async (hostname) => (await lookup(hostname, { all: true, verbatim: true })).map(answer => answer.address);
6
+ const denied = () => new Error("Public network destination required");
7
+ /** Validate the exact addresses returned to net/tls.connect; no second DNS lookup. */
8
+ export function publicAddressLookup(resolve) {
9
+ return (hostname, options, callback) => {
10
+ void resolve(hostname).then(addresses => {
11
+ if (!addresses.length || addresses.some(address => !isIP(address) || connectorHostnameIsUnsafe(address))) {
12
+ callback(denied(), "");
13
+ return;
14
+ }
15
+ const answers = addresses.map(address => ({ address, family: isIP(address) }));
16
+ if (options.all)
17
+ callback(null, answers);
18
+ else {
19
+ const selected = answers.find(answer => !options.family || answer.family === options.family);
20
+ if (!selected)
21
+ callback(denied(), "");
22
+ else
23
+ callback(null, selected.address, selected.family);
24
+ }
25
+ }, () => callback(denied(), ""));
26
+ };
27
+ }
28
+ export function createPublicNetworkTransport(resolve = resolveHostname) {
29
+ const dispatcher = new Agent({
30
+ connect: { lookup: publicAddressLookup(resolve), timeout: 10_000 },
31
+ connections: 8, headersTimeout: 10_000, bodyTimeout: 10_000,
32
+ });
33
+ const fetchPublic = async (input, init) => {
34
+ const url = new URL(input instanceof Request ? input.url : String(input));
35
+ if (url.protocol !== "https:" || url.username || url.password || url.hash || connectorHostnameIsUnsafe(url.hostname))
36
+ throw denied();
37
+ // The service owns redirect policy. Never let fetch follow an unvalidated
38
+ // Location before the service can reapply origin/path/auth restrictions.
39
+ const request = {
40
+ ...init, redirect: init?.redirect === "manual" ? "manual" : "error", dispatcher,
41
+ };
42
+ return globalThis.fetch(input, request);
43
+ };
44
+ return { fetch: fetchPublic, close: () => dispatcher.destroy() };
45
+ }
46
+ // A process-wide dispatcher reuses validated sockets across short-lived service
47
+ // instances. Custom fetch adapters own equivalent socket/egress enforcement.
48
+ export const publicNetworkFetch = createPublicNetworkTransport().fetch;
49
+ //# sourceMappingURL=public-network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-network.js","sourceRoot":"","sources":["../src/public-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAuB,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,MAAM,eAAe,GAAoB,KAAK,EAAC,QAAQ,EAAC,EAAE,CACxD,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACxF,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AAEtE,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QACrC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACzG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,OAAO,CAAC,GAAG;gBAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;iBACpC,CAAC;gBACJ,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7F,IAAI,CAAC,QAAQ;oBAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;;oBACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,UAA2B,eAAe;IACrF,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC;QAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;QAClE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;KAC5D,CAAC,CAAC;IACH,MAAM,WAAW,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,IAAI,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,MAAM,MAAM,EAAE,CAAC;QACrI,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,OAAO,GAAwC;YACnD,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU;SAChF,CAAC;QACF,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;AACnE,CAAC;AAED,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,4BAA4B,EAAE,CAAC,KAAK,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type StoredConnectionSecret } from "@polpo-ai/connect";
2
+ import { type ConnectionSecretStore, type VersionedConnectionSecret } from "./secrets.js";
3
+ export declare function hasPendingRefresh(secret: StoredConnectionSecret): boolean;
4
+ export declare function assertRefreshAvailable(secret: StoredConnectionSecret): void;
5
+ /** Persist intent BEFORE consuming a potentially single-use refresh token.
6
+ * A coordinator lease is an optimization: CAS is the durable exclusion fence.
7
+ * An uncertain provider outcome remains pending until reconnection; guessing a
8
+ * retry could invalidate the only refresh-token lineage we still possess.
9
+ * Unversioned single-process stores retain their existing coordinator contract.
10
+ */
11
+ export declare function refreshConnectionSecret(input: {
12
+ store: ConnectionSecretStore;
13
+ ref: string;
14
+ previous: StoredConnectionSecret;
15
+ snapshot?: VersionedConnectionSecret | null;
16
+ now: () => Date;
17
+ /** Authorization and local metadata only; must never send a token to a provider. */
18
+ beforeRefresh?: () => Promise<void>;
19
+ refresh: () => Promise<StoredConnectionSecret>;
20
+ }): Promise<StoredConnectionSecret>;
21
+ //# sourceMappingURL=refresh-lineage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-lineage.d.ts","sourceRoot":"","sources":["../src/refresh-lineage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAoC,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAO5H,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAQzE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAE3E;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,KAAK,EAAE,qBAAqB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,sBAAsB,CAAC;IACjC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC5C,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAChD,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAyClC"}
@@ -0,0 +1,83 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { ConnectError } from "@polpo-ai/connect";
4
+ import { isVersionedConnectionSecretStore } from "./secrets.js";
5
+ // Private encrypted material only. Never Connection metadata or a public DTO.
6
+ const KEY = "polpo:oauth-refresh:v1";
7
+ const unavailable = () => new ConnectError("refresh_unavailable", "Connection refresh is in progress or its outcome is uncertain; retry later or reconnect the account", { status: 503 });
8
+ export function hasPendingRefresh(secret) {
9
+ const state = secret.metadata?.[KEY];
10
+ if (state === undefined)
11
+ return false;
12
+ if (!state || typeof state !== "object" || Array.isArray(state))
13
+ return true;
14
+ const record = state;
15
+ return record.status !== "completed" || typeof record.id !== "string" || !record.id
16
+ || typeof record.startedAt !== "string" || !Number.isFinite(Date.parse(record.startedAt))
17
+ || typeof record.completedAt !== "string" || !Number.isFinite(Date.parse(record.completedAt));
18
+ }
19
+ export function assertRefreshAvailable(secret) {
20
+ if (hasPendingRefresh(secret))
21
+ throw unavailable();
22
+ }
23
+ /** Persist intent BEFORE consuming a potentially single-use refresh token.
24
+ * A coordinator lease is an optimization: CAS is the durable exclusion fence.
25
+ * An uncertain provider outcome remains pending until reconnection; guessing a
26
+ * retry could invalidate the only refresh-token lineage we still possess.
27
+ * Unversioned single-process stores retain their existing coordinator contract.
28
+ */
29
+ export async function refreshConnectionSecret(input) {
30
+ assertRefreshAvailable(input.previous);
31
+ const store = input.store;
32
+ if (!isVersionedConnectionSecretStore(store)) {
33
+ await input.beforeRefresh?.();
34
+ const refreshed = await input.refresh();
35
+ await store.setSecret(input.ref, refreshed);
36
+ return refreshed;
37
+ }
38
+ if (!input.snapshot)
39
+ throw unavailable();
40
+ const id = randomUUID();
41
+ const startedAt = input.now().toISOString();
42
+ const pending = { ...input.previous, metadata: { ...input.previous.metadata,
43
+ [KEY]: { id, status: "pending", startedAt } } };
44
+ let claimed;
45
+ try {
46
+ claimed = await store.compareAndSet(input.ref, input.snapshot.version, pending);
47
+ }
48
+ catch { /* An acknowledgement can be lost after the durable write. */ }
49
+ if (claimed === false)
50
+ throw unavailable();
51
+ const claim = await store.getVersioned(input.ref);
52
+ if (!claim || !sameSecret(claim.secret, pending))
53
+ throw unavailable();
54
+ try {
55
+ await input.beforeRefresh?.();
56
+ }
57
+ catch (error) {
58
+ // No provider dispatch has occurred. Restore only the exact intent we own;
59
+ // never overwrite a reconnect, revocation or another credential generation.
60
+ // If storage cannot confirm restoration, retain the conservative fence.
61
+ await store.compareAndSet(input.ref, claim.version, input.previous).catch(() => false);
62
+ throw error;
63
+ }
64
+ // Do not clear a pending intent on provider error or process death: we cannot
65
+ // know whether a single-use token was consumed before the response was lost.
66
+ const result = await input.refresh();
67
+ const completed = { ...result, metadata: { ...result.metadata,
68
+ [KEY]: { id, status: "completed", startedAt, completedAt: input.now().toISOString() } } };
69
+ try {
70
+ if (await store.compareAndSet(input.ref, claim.version, completed))
71
+ return completed;
72
+ }
73
+ catch { /* Recover only our exact committed result, never another writer. */ }
74
+ const persisted = await store.getVersioned(input.ref);
75
+ if (persisted && sameSecret(persisted.secret, completed))
76
+ return persisted.secret;
77
+ throw unavailable();
78
+ }
79
+ function sameSecret(left, right) {
80
+ // JSON stores omit undefined fields and may reorder object properties.
81
+ return isDeepStrictEqual(JSON.parse(JSON.stringify(left)), JSON.parse(JSON.stringify(right)));
82
+ }
83
+ //# sourceMappingURL=refresh-lineage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-lineage.js","sourceRoot":"","sources":["../src/refresh-lineage.ts"],"names":[],"mappings":"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"}
package/dist/secrets.d.ts CHANGED
@@ -2,6 +2,8 @@ import type { StoredConnectionSecret } from "@polpo-ai/connect";
2
2
  export interface ConnectionSecretStore {
3
3
  setSecret(ref: string, secret: StoredConnectionSecret): Promise<void>;
4
4
  getSecret(ref: string): Promise<StoredConnectionSecret | null>;
5
+ /** Destructive: does not check Connection/OAuth references. Do not use as
6
+ * compensation after an uncertain reference write. */
5
7
  deleteSecret(ref: string): Promise<void>;
6
8
  }
7
9
  export interface VersionedConnectionSecret {
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC/D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA+B,SAAQ,qBAAqB;IAC3E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IACrE,aAAa,CACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzE;AAED,qBAAa,2BAA4B,YAAW,qBAAqB;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEhD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAK9D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IASpE,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,OAAO,CAAC;CAOpB;AAED,qBAAa,6BAA8B,YAAW,uBAAuB;IAC3E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAEpD,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAc9E;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,qBAAqB,GAC3B,KAAK,IAAI,8BAA8B,CAIzC"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC/D;0DACsD;IACtD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA+B,SAAQ,qBAAqB;IAC3E,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IACrE,aAAa,CACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzE;AAED,qBAAa,2BAA4B,YAAW,qBAAqB;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEhD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAK9D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IASpE,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,OAAO,CAAC;CAOpB;AAED,qBAAa,6BAA8B,YAAW,uBAAuB;IAC3E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAEpD,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAc9E;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,qBAAqB,GAC3B,KAAK,IAAI,8BAA8B,CAIzC"}