@carrierllc/mcp 0.2.1 → 0.2.2

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 (130) hide show
  1. package/dist/index.d.ts +0 -13
  2. package/dist/index.js +8394 -77
  3. package/dist/index.js.map +1 -1
  4. package/package.json +10 -10
  5. package/dist/.metadata_never_index +0 -0
  6. package/dist/apps/app-state.d.ts +0 -19
  7. package/dist/apps/app-state.d.ts.map +0 -1
  8. package/dist/apps/app-state.js +0 -28
  9. package/dist/apps/app-state.js.map +0 -1
  10. package/dist/apps/balance-topup.d.ts +0 -19
  11. package/dist/apps/balance-topup.d.ts.map +0 -1
  12. package/dist/apps/balance-topup.js +0 -121
  13. package/dist/apps/balance-topup.js.map +0 -1
  14. package/dist/apps/fleet-health-app.d.ts +0 -29
  15. package/dist/apps/fleet-health-app.d.ts.map +0 -1
  16. package/dist/apps/fleet-health-app.js +0 -152
  17. package/dist/apps/fleet-health-app.js.map +0 -1
  18. package/dist/apps/index.d.ts +0 -37
  19. package/dist/apps/index.d.ts.map +0 -1
  20. package/dist/apps/index.js +0 -42
  21. package/dist/apps/index.js.map +0 -1
  22. package/dist/apps/provisioning-wizard.d.ts +0 -11
  23. package/dist/apps/provisioning-wizard.d.ts.map +0 -1
  24. package/dist/apps/provisioning-wizard.js +0 -345
  25. package/dist/apps/provisioning-wizard.js.map +0 -1
  26. package/dist/audit.d.ts +0 -31
  27. package/dist/audit.d.ts.map +0 -1
  28. package/dist/audit.js +0 -42
  29. package/dist/audit.js.map +0 -1
  30. package/dist/billing-thresholds.d.ts +0 -71
  31. package/dist/billing-thresholds.d.ts.map +0 -1
  32. package/dist/billing-thresholds.js +0 -238
  33. package/dist/billing-thresholds.js.map +0 -1
  34. package/dist/billing.d.ts +0 -95
  35. package/dist/billing.d.ts.map +0 -1
  36. package/dist/billing.js +0 -239
  37. package/dist/billing.js.map +0 -1
  38. package/dist/clerk.d.ts +0 -125
  39. package/dist/clerk.d.ts.map +0 -1
  40. package/dist/clerk.js +0 -389
  41. package/dist/clerk.js.map +0 -1
  42. package/dist/client.d.ts +0 -35
  43. package/dist/client.d.ts.map +0 -1
  44. package/dist/client.js +0 -85
  45. package/dist/client.js.map +0 -1
  46. package/dist/credits.d.ts +0 -165
  47. package/dist/credits.d.ts.map +0 -1
  48. package/dist/credits.js +0 -483
  49. package/dist/credits.js.map +0 -1
  50. package/dist/index.d.ts.map +0 -1
  51. package/dist/intelligence.d.ts +0 -4
  52. package/dist/intelligence.d.ts.map +0 -1
  53. package/dist/intelligence.js +0 -977
  54. package/dist/intelligence.js.map +0 -1
  55. package/dist/list-recent-ocs-events.d.ts +0 -48
  56. package/dist/list-recent-ocs-events.d.ts.map +0 -1
  57. package/dist/list-recent-ocs-events.js +0 -160
  58. package/dist/list-recent-ocs-events.js.map +0 -1
  59. package/dist/manus-client.d.ts +0 -429
  60. package/dist/manus-client.d.ts.map +0 -1
  61. package/dist/manus-client.js +0 -401
  62. package/dist/manus-client.js.map +0 -1
  63. package/dist/manus-common.d.ts +0 -5
  64. package/dist/manus-common.d.ts.map +0 -1
  65. package/dist/manus-common.js +0 -5
  66. package/dist/manus-common.js.map +0 -1
  67. package/dist/manus-schedule.d.ts +0 -74
  68. package/dist/manus-schedule.d.ts.map +0 -1
  69. package/dist/manus-schedule.js +0 -213
  70. package/dist/manus-schedule.js.map +0 -1
  71. package/dist/manus-usage.d.ts +0 -32
  72. package/dist/manus-usage.d.ts.map +0 -1
  73. package/dist/manus-usage.js +0 -120
  74. package/dist/manus-usage.js.map +0 -1
  75. package/dist/manus-webhook.d.ts +0 -60
  76. package/dist/manus-webhook.d.ts.map +0 -1
  77. package/dist/manus-webhook.js +0 -361
  78. package/dist/manus-webhook.js.map +0 -1
  79. package/dist/pricing-tools.d.ts +0 -26
  80. package/dist/pricing-tools.d.ts.map +0 -1
  81. package/dist/pricing-tools.js +0 -428
  82. package/dist/pricing-tools.js.map +0 -1
  83. package/dist/projects-tools.d.ts +0 -39
  84. package/dist/projects-tools.d.ts.map +0 -1
  85. package/dist/projects-tools.js +0 -545
  86. package/dist/projects-tools.js.map +0 -1
  87. package/dist/prompts.d.ts +0 -7
  88. package/dist/prompts.d.ts.map +0 -1
  89. package/dist/prompts.js +0 -151
  90. package/dist/prompts.js.map +0 -1
  91. package/dist/stripe-connect-tools.d.ts +0 -33
  92. package/dist/stripe-connect-tools.d.ts.map +0 -1
  93. package/dist/stripe-connect-tools.js +0 -504
  94. package/dist/stripe-connect-tools.js.map +0 -1
  95. package/dist/timing-safe-equal.d.ts +0 -5
  96. package/dist/timing-safe-equal.d.ts.map +0 -1
  97. package/dist/timing-safe-equal.js +0 -13
  98. package/dist/timing-safe-equal.js.map +0 -1
  99. package/dist/tools-backlog.d.ts +0 -37
  100. package/dist/tools-backlog.d.ts.map +0 -1
  101. package/dist/tools-backlog.js +0 -410
  102. package/dist/tools-backlog.js.map +0 -1
  103. package/dist/tools-carrier-ask.d.ts +0 -138
  104. package/dist/tools-carrier-ask.d.ts.map +0 -1
  105. package/dist/tools-carrier-ask.js +0 -913
  106. package/dist/tools-carrier-ask.js.map +0 -1
  107. package/dist/tools-pricing.d.ts +0 -18
  108. package/dist/tools-pricing.d.ts.map +0 -1
  109. package/dist/tools-pricing.js +0 -172
  110. package/dist/tools-pricing.js.map +0 -1
  111. package/dist/tools-ui-agent-ask.d.ts +0 -29
  112. package/dist/tools-ui-agent-ask.d.ts.map +0 -1
  113. package/dist/tools-ui-agent-ask.js +0 -272
  114. package/dist/tools-ui-agent-ask.js.map +0 -1
  115. package/dist/tools-ui-agent-schedule.d.ts +0 -29
  116. package/dist/tools-ui-agent-schedule.d.ts.map +0 -1
  117. package/dist/tools-ui-agent-schedule.js +0 -517
  118. package/dist/tools-ui-agent-schedule.js.map +0 -1
  119. package/dist/tools-ui-agent.d.ts +0 -40
  120. package/dist/tools-ui-agent.d.ts.map +0 -1
  121. package/dist/tools-ui-agent.js +0 -508
  122. package/dist/tools-ui-agent.js.map +0 -1
  123. package/dist/tools.d.ts +0 -60
  124. package/dist/tools.d.ts.map +0 -1
  125. package/dist/tools.js +0 -1384
  126. package/dist/tools.js.map +0 -1
  127. package/dist/types.d.ts +0 -298
  128. package/dist/types.d.ts.map +0 -1
  129. package/dist/types.js +0 -5
  130. package/dist/types.js.map +0 -1
package/dist/clerk.d.ts DELETED
@@ -1,125 +0,0 @@
1
- /**
2
- * Clerk integration for the Carrier MCP Worker.
3
- *
4
- * Human identity is delegated to Clerk (sign-in, sign-up, MFA, social).
5
- * MCP-client tokens are still minted by @cloudflare/workers-oauth-provider —
6
- * the Clerk session only gates the OAuth `/authorize` consent step.
7
- *
8
- * v1.1a: org_id / org_role / org_name from the "carrier-mcp" JWT template
9
- * are read from sessionClaims. Email + publicMetadata still come from
10
- * users.getUser() until the template carries email.
11
- * v1.1c: reads Clerk Billing plan + features from session claims via auth.has()
12
- * so tier checks don't require a round-trip when Clerk Billing is enabled.
13
- * v1.1f: surfaces twoFactorVerified + factorVerificationAge for the MFA gate
14
- * on admin-scope OAuth grants (see mfa.ts).
15
- * v1.2: M2M JWT acceptance — Authorization: Bearer <clerk_m2m_jwt> issued via
16
- * Clerk client_credentials flow. Subject is a machine ID (mch_ prefix).
17
- * Custom claims (reseller_id, reseller_name, tier, scopes) are read from
18
- * the M2M client's privateMetadata-backed JWT claims.
19
- */
20
- import { type ClerkClient } from "@clerk/backend";
21
- import type { ClerkPublicMetadata, OcsPortalCredentials, Env } from "./types.js";
22
- export declare function getClerkClient(env: Env): ClerkClient;
23
- export type ClerkPlan = "free" | "pro" | "enterprise";
24
- export interface ClerkAuthResult {
25
- /** Clerk user ID (e.g. "user_2pXkL9aB..."). Prefix with "clerk_" for our `sub`. */
26
- userId: string;
27
- email: string;
28
- publicMetadata: ClerkPublicMetadata;
29
- /** v1.1a — Active Clerk organisation ID from sessionClaims (carrier-mcp JWT template). */
30
- orgId?: string;
31
- /** v1.1a — Active Clerk organisation role, e.g. "org:admin". */
32
- orgRole?: string;
33
- /** v1.1a — Active Clerk organisation display name (org_name claim). */
34
- orgName?: string;
35
- /**
36
- * v1.1c Clerk Billing — active subscription plan resolved via auth.has({ plan }).
37
- * `undefined` when Clerk Billing is not enabled or the user has no plan claim.
38
- */
39
- plan?: ClerkPlan;
40
- /**
41
- * v1.1c Clerk Billing — feature entitlements resolved via auth.has({ feature }).
42
- * Populated when CLERK_BILLING_FEATURES env lists features to probe.
43
- */
44
- features: Record<string, boolean>;
45
- /**
46
- * v1.1f MFA gate — true if the session JWT carries two-factor verification.
47
- * Computed from auth.sessionClaims.two_factor || factor_verification_age.
48
- */
49
- twoFactorVerified: boolean;
50
- /**
51
- * v1.1f MFA gate — seconds since the user last completed a 2FA challenge,
52
- * or `undefined` when the session predates the JWT template's second_factor_age claim.
53
- */
54
- factorVerificationAge?: number;
55
- /**
56
- * v1.2 — How this auth result was produced.
57
- * "session" → Clerk session cookie / session token (existing path).
58
- * "m2m" → Clerk M2M JWT (Authorization: Bearer <mch_ subject JWT>).
59
- * Downstream code (audit log, tools-call) uses this to tag machine vs human traffic.
60
- */
61
- auth_method: "session" | "m2m";
62
- }
63
- /**
64
- * v1.2 — Validate a Clerk M2M JWT from `Authorization: Bearer <jwt>`.
65
- *
66
- * Uses `acceptsToken: 'm2m_token'` so the Clerk SDK handles JWKS fetch,
67
- * signature verification, and `iss` / expiry checks natively.
68
- *
69
- * Custom claims (reseller_id, reseller_name, tier, scopes) must be
70
- * configured in the Clerk Dashboard → M2M client → JWT template or
71
- * privateMetadata-backed claims.
72
- *
73
- * Returns null when:
74
- * - No Authorization: Bearer header present
75
- * - The JWT is not a valid M2M token (wrong iss, bad sig, expired)
76
- * - The subject does not start with the M2M prefix (mch_)
77
- */
78
- export declare function authenticateM2MRequest(request: Request, env: Env): Promise<ClerkAuthResult | null>;
79
- /**
80
- * Validate the incoming request against Clerk.
81
- * Returns null when the request is unauthenticated.
82
- *
83
- * v1.2: When `Authorization: Bearer <jwt>` is present, tries M2M acceptance
84
- * first. If the JWT is a valid Clerk M2M token (subject starts with mch_),
85
- * returns immediately without a users.getUser() round-trip.
86
- * Falls through to session-cookie path only when M2M validation yields null.
87
- *
88
- * Calls users.getUser() once for email and publicMetadata (reseller_id, tier,
89
- * scopes, role). org_id / org_role / org_name are read from sessionClaims when
90
- * the JWT template includes them.
91
- */
92
- export declare function authenticateClerkRequest(request: Request, env: Env): Promise<ClerkAuthResult | null>;
93
- /**
94
- * Build the Clerk-hosted sign-in URL with a redirect back to the current request.
95
- */
96
- export declare function buildSignInRedirect(env: Env, requestUrl: string): string;
97
- export declare function buildSignUpRedirect(env: Env, requestUrl: string): string;
98
- /**
99
- * Fetch OCS portal credentials from Clerk privateMetadata.
100
- * Uses the Clerk REST API directly (no SDK method for privateMetadata on CF Workers).
101
- */
102
- export declare function getOcsPortalCredentials(env: Env, orgId?: string, userId?: string): Promise<OcsPortalCredentials | null>;
103
- export interface CreateOrgOptions {
104
- name: string;
105
- slug: string;
106
- email: string;
107
- }
108
- /**
109
- * Provision a Clerk organisation for a Stripe Projects operator install.
110
- * If an org with the given slug already exists, returns the existing org ID.
111
- * Creates a membership for the provided email address (creates the user if absent).
112
- */
113
- export declare function createClerkOrgForOperator(env: Env, opts: CreateOrgOptions): Promise<string>;
114
- /**
115
- * Mint a Carrier OAuth bearer token for a Stripe Projects operator.
116
- * Token is bound to the org, has read+write scope, and 30-day TTL.
117
- * Stored in OAUTH_KV so it's validated by OAuthProvider on subsequent requests.
118
- */
119
- export declare function mintProjectsToken(env: Env, orgId: string): Promise<string>;
120
- /**
121
- * Store OCS portal credentials in Clerk org (or user) privateMetadata.
122
- * Called from the /setup endpoint or the console settings page.
123
- */
124
- export declare function setOcsPortalCredentials(env: Env, credentials: OcsPortalCredentials, orgId?: string, userId?: string): Promise<boolean>;
125
- //# sourceMappingURL=clerk.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clerk.d.ts","sourceRoot":"","sources":["../src/clerk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAkB,mBAAmB,EAA0B,oBAAoB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAOzH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAWpD;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,mBAAmB,CAAC;IACpC,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,EAAE,SAAS,GAAG,KAAK,CAAC;CAChC;AAKD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0EjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAyEjC;AAqCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAMxE;AAeD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAsCtC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,oBAAoB,EACjC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
package/dist/clerk.js DELETED
@@ -1,389 +0,0 @@
1
- /**
2
- * Clerk integration for the Carrier MCP Worker.
3
- *
4
- * Human identity is delegated to Clerk (sign-in, sign-up, MFA, social).
5
- * MCP-client tokens are still minted by @cloudflare/workers-oauth-provider —
6
- * the Clerk session only gates the OAuth `/authorize` consent step.
7
- *
8
- * v1.1a: org_id / org_role / org_name from the "carrier-mcp" JWT template
9
- * are read from sessionClaims. Email + publicMetadata still come from
10
- * users.getUser() until the template carries email.
11
- * v1.1c: reads Clerk Billing plan + features from session claims via auth.has()
12
- * so tier checks don't require a round-trip when Clerk Billing is enabled.
13
- * v1.1f: surfaces twoFactorVerified + factorVerificationAge for the MFA gate
14
- * on admin-scope OAuth grants (see mfa.ts).
15
- * v1.2: M2M JWT acceptance — Authorization: Bearer <clerk_m2m_jwt> issued via
16
- * Clerk client_credentials flow. Subject is a machine ID (mch_ prefix).
17
- * Custom claims (reseller_id, reseller_name, tier, scopes) are read from
18
- * the M2M client's privateMetadata-backed JWT claims.
19
- */
20
- import { createClerkClient } from "@clerk/backend";
21
- /** Prefix Clerk uses for M2M machine subject IDs. */
22
- const M2M_SUBJECT_PREFIX = "mch_";
23
- let cached = null;
24
- export function getClerkClient(env) {
25
- if (!cached) {
26
- cached = createClerkClient({
27
- secretKey: env.CLERK_SECRET_KEY,
28
- publishableKey: env.CLERK_PUBLISHABLE_KEY,
29
- ...(env.CLERK_MACHINE_SECRET_KEY
30
- ? { machineSecretKey: env.CLERK_MACHINE_SECRET_KEY }
31
- : {}),
32
- });
33
- }
34
- return cached;
35
- }
36
- /** Clerk Billing plans we probe via auth.has({ plan }). Order matches tier hierarchy. */
37
- const CLERK_PLANS = ["enterprise", "pro", "free"];
38
- /**
39
- * v1.2 — Validate a Clerk M2M JWT from `Authorization: Bearer <jwt>`.
40
- *
41
- * Uses `acceptsToken: 'm2m_token'` so the Clerk SDK handles JWKS fetch,
42
- * signature verification, and `iss` / expiry checks natively.
43
- *
44
- * Custom claims (reseller_id, reseller_name, tier, scopes) must be
45
- * configured in the Clerk Dashboard → M2M client → JWT template or
46
- * privateMetadata-backed claims.
47
- *
48
- * Returns null when:
49
- * - No Authorization: Bearer header present
50
- * - The JWT is not a valid M2M token (wrong iss, bad sig, expired)
51
- * - The subject does not start with the M2M prefix (mch_)
52
- */
53
- export async function authenticateM2MRequest(request, env) {
54
- const authHeader = request.headers.get("Authorization");
55
- if (!authHeader || !/^Bearer\s+/i.test(authHeader))
56
- return null;
57
- const token = authHeader.replace(/^Bearer\s+/i, "").trim();
58
- if (!token)
59
- return null;
60
- const client = getClerkClient(env);
61
- const origin = new URL(request.url).origin;
62
- let requestState;
63
- try {
64
- requestState = await client.authenticateRequest(request, {
65
- acceptsToken: "m2m_token",
66
- authorizedParties: [origin, "https://accounts.carrier.llc"],
67
- });
68
- }
69
- catch {
70
- return null;
71
- }
72
- if (requestState.status !== "signed-in")
73
- return null;
74
- const auth = requestState.toAuth();
75
- // M2M auth object carries `subject` (the machine ID) and `claims`.
76
- if (!auth ||
77
- typeof auth.subject !== "string" ||
78
- !auth.subject.startsWith(M2M_SUBJECT_PREFIX)) {
79
- return null;
80
- }
81
- // Claims are set in the Clerk M2M client's JWT template / privateMetadata.
82
- const claims = (auth.claims ?? {});
83
- const resellerId = typeof claims.reseller_id === "number" ? claims.reseller_id : undefined;
84
- const resellerName = typeof claims.reseller_name === "string" ? claims.reseller_name : "";
85
- const tier = claims.tier === "free" ||
86
- claims.tier === "pro" ||
87
- claims.tier === "enterprise"
88
- ? claims.tier
89
- : undefined;
90
- const scopes = Array.isArray(claims.scopes)
91
- ? claims.scopes
92
- : undefined;
93
- return {
94
- // Use the machine subject as the userId so downstream code (sub = `clerk_${userId}`)
95
- // produces a stable, unique identity for audit logging.
96
- userId: auth.subject,
97
- email: "",
98
- publicMetadata: {
99
- reseller_id: resellerId,
100
- reseller_name: resellerName || undefined,
101
- tier,
102
- scopes,
103
- role: "user",
104
- },
105
- orgId: typeof claims.org_id === "string" ? claims.org_id : undefined,
106
- orgRole: typeof claims.org_role === "string" ? claims.org_role : undefined,
107
- orgName: typeof claims.org_name === "string" ? claims.org_name : undefined,
108
- plan: tier,
109
- features: {},
110
- twoFactorVerified: false,
111
- factorVerificationAge: undefined,
112
- auth_method: "m2m",
113
- };
114
- }
115
- /**
116
- * Validate the incoming request against Clerk.
117
- * Returns null when the request is unauthenticated.
118
- *
119
- * v1.2: When `Authorization: Bearer <jwt>` is present, tries M2M acceptance
120
- * first. If the JWT is a valid Clerk M2M token (subject starts with mch_),
121
- * returns immediately without a users.getUser() round-trip.
122
- * Falls through to session-cookie path only when M2M validation yields null.
123
- *
124
- * Calls users.getUser() once for email and publicMetadata (reseller_id, tier,
125
- * scopes, role). org_id / org_role / org_name are read from sessionClaims when
126
- * the JWT template includes them.
127
- */
128
- export async function authenticateClerkRequest(request, env) {
129
- // v1.2 — M2M fast-path: try before session cookie so machine clients that
130
- // send a valid Bearer JWT never hit the session-token branch.
131
- const authHeader = request.headers.get("Authorization");
132
- const hasBearer = authHeader !== null && /^Bearer\s+/i.test(authHeader);
133
- if (hasBearer) {
134
- const m2mResult = await authenticateM2MRequest(request, env);
135
- if (m2mResult !== null)
136
- return m2mResult;
137
- // Bearer present but NOT a Clerk M2M JWT — fall through so the
138
- // OAuthProvider's regular bearer handler (OAUTH_KV tokens) stays intact.
139
- // The session-cookie branch below will also return null for a Bearer-only
140
- // request, which is the correct behaviour.
141
- }
142
- const client = getClerkClient(env);
143
- const origin = new URL(request.url).origin;
144
- const requestState = await client.authenticateRequest(request, {
145
- acceptsToken: "session_token",
146
- authorizedParties: [origin, "https://accounts.carrier.llc"],
147
- });
148
- if (requestState.status !== "signed-in")
149
- return null;
150
- const auth = requestState.toAuth();
151
- if (!auth || !("userId" in auth) || !auth.userId)
152
- return null;
153
- const claims = (auth.sessionClaims ?? {});
154
- const user = await client.users.getUser(auth.userId);
155
- const email = user.emailAddresses.find((e) => e.id === user.primaryEmailAddressId)
156
- ?.emailAddress ??
157
- user.emailAddresses[0]?.emailAddress ??
158
- "";
159
- const publicMetadata = (user.publicMetadata ?? {});
160
- // v1.1c Clerk Billing — probe plan + features via the session's has() helper.
161
- const plan = resolvePlan(auth);
162
- const features = resolveFeatures(auth, env);
163
- // v1.1f MFA — extract second-factor verification state from session claims.
164
- const twoFactorVerified = Boolean(claims.two_factor_verified ??
165
- claims.second_factor_verified ??
166
- (typeof claims.fva === "object" &&
167
- claims.fva !== null &&
168
- Array.isArray(claims.fva) &&
169
- claims.fva[1] !== -1));
170
- const factorVerificationAge = typeof claims.second_factor_age === "number"
171
- ? claims.second_factor_age
172
- : Array.isArray(claims.fva) &&
173
- typeof claims.fva[1] === "number" &&
174
- (claims.fva[1] ?? -1) >= 0
175
- ? // Clerk's `fva` tuple is ages in minutes; MFA compares seconds (mfa.ts).
176
- claims.fva[1] * 60
177
- : undefined;
178
- return {
179
- userId: auth.userId,
180
- email,
181
- publicMetadata,
182
- orgId: claims.org_id ?? auth.orgId ?? undefined,
183
- orgRole: claims.org_role ?? auth.orgRole ?? undefined,
184
- orgName: claims.org_name,
185
- plan,
186
- features,
187
- twoFactorVerified,
188
- factorVerificationAge,
189
- auth_method: "session",
190
- };
191
- }
192
- function resolvePlan(auth) {
193
- if (typeof auth.has !== "function")
194
- return undefined;
195
- for (const plan of CLERK_PLANS) {
196
- try {
197
- if (auth.has({ plan }))
198
- return plan;
199
- }
200
- catch {
201
- // has() may throw for an unconfigured plan — try the next tier
202
- continue;
203
- }
204
- }
205
- return undefined;
206
- }
207
- function resolveFeatures(auth, env) {
208
- const list = (env.CLERK_BILLING_FEATURES ?? "")
209
- .split(",")
210
- .map((s) => s.trim())
211
- .filter(Boolean);
212
- const out = {};
213
- if (typeof auth.has !== "function")
214
- return out;
215
- for (const feature of list) {
216
- try {
217
- out[feature] = auth.has({ feature });
218
- }
219
- catch {
220
- out[feature] = false;
221
- }
222
- }
223
- return out;
224
- }
225
- /**
226
- * Build the Clerk-hosted sign-in URL with a redirect back to the current request.
227
- */
228
- export function buildSignInRedirect(env, requestUrl) {
229
- const signInBase = env.CLERK_SIGN_IN_URL ?? "https://accounts.carrier.llc/sign-in";
230
- const url = new URL(signInBase);
231
- url.searchParams.set("redirect_url", requestUrl);
232
- return url.toString();
233
- }
234
- export function buildSignUpRedirect(env, requestUrl) {
235
- const signUpBase = env.CLERK_SIGN_UP_URL ?? "https://accounts.carrier.llc/sign-up";
236
- const url = new URL(signUpBase);
237
- url.searchParams.set("redirect_url", requestUrl);
238
- return url.toString();
239
- }
240
- // ---------------------------------------------------------------------------
241
- // v1.1.1 — OCS portal credentials from Clerk privateMetadata.
242
- // Used by tools-ui-agent.ts to authenticate the Manus browser agent against
243
- // the OCS web dashboard for UI-only operations.
244
- //
245
- // Resolution order:
246
- // 1. Organization privateMetadata (org_id present)
247
- // 2. User privateMetadata (solo user, no org)
248
- //
249
- // Returns null when no credentials are stored — the UI agent tool surfaces
250
- // a clear "link your OCS portal" message to the user.
251
- // ---------------------------------------------------------------------------
252
- /**
253
- * Fetch OCS portal credentials from Clerk privateMetadata.
254
- * Uses the Clerk REST API directly (no SDK method for privateMetadata on CF Workers).
255
- */
256
- export async function getOcsPortalCredentials(env, orgId, userId) {
257
- const baseUrl = "https://api.clerk.com/v1";
258
- const headers = {
259
- Authorization: `Bearer ${env.CLERK_SECRET_KEY}`,
260
- "Content-Type": "application/json",
261
- };
262
- // Try org-level first
263
- if (orgId) {
264
- try {
265
- const res = await fetch(`${baseUrl}/organizations/${orgId}`, { headers });
266
- if (res.ok) {
267
- const org = (await res.json());
268
- if (org.private_metadata?.ocs_portal?.username && org.private_metadata.ocs_portal.password) {
269
- return org.private_metadata.ocs_portal;
270
- }
271
- }
272
- }
273
- catch {
274
- // Fall through to user-level
275
- }
276
- }
277
- // Fallback: user-level privateMetadata
278
- if (userId) {
279
- try {
280
- const res = await fetch(`${baseUrl}/users/${userId}`, { headers });
281
- if (res.ok) {
282
- const user = (await res.json());
283
- if (user.private_metadata?.ocs_portal?.username && user.private_metadata.ocs_portal.password) {
284
- return user.private_metadata.ocs_portal;
285
- }
286
- }
287
- }
288
- catch {
289
- // No credentials available
290
- }
291
- }
292
- return null;
293
- }
294
- /**
295
- * Provision a Clerk organisation for a Stripe Projects operator install.
296
- * If an org with the given slug already exists, returns the existing org ID.
297
- * Creates a membership for the provided email address (creates the user if absent).
298
- */
299
- export async function createClerkOrgForOperator(env, opts) {
300
- const baseUrl = "https://api.clerk.com/v1";
301
- const headers = {
302
- Authorization: `Bearer ${env.CLERK_SECRET_KEY}`,
303
- "Content-Type": "application/json",
304
- };
305
- // Check if org slug already exists
306
- const listRes = await fetch(`${baseUrl}/organizations?query=${encodeURIComponent(opts.slug)}&limit=1`, { headers });
307
- if (listRes.ok) {
308
- const list = (await listRes.json());
309
- const existing = list.data?.find((o) => o.slug === opts.slug);
310
- if (existing)
311
- return existing.id;
312
- }
313
- // Create new org
314
- const createRes = await fetch(`${baseUrl}/organizations`, {
315
- method: "POST",
316
- headers,
317
- body: JSON.stringify({
318
- name: opts.name,
319
- slug: opts.slug,
320
- public_metadata: { source: "stripe_projects", email: opts.email },
321
- }),
322
- });
323
- if (!createRes.ok) {
324
- const errText = await createRes.text();
325
- throw new Error(`Failed to create Clerk org: ${errText}`);
326
- }
327
- const org = (await createRes.json());
328
- return org.id;
329
- }
330
- // ---------------------------------------------------------------------------
331
- // OAuth token minting for Stripe Projects
332
- // ---------------------------------------------------------------------------
333
- /**
334
- * Mint a Carrier OAuth bearer token for a Stripe Projects operator.
335
- * Token is bound to the org, has read+write scope, and 30-day TTL.
336
- * Stored in OAUTH_KV so it's validated by OAuthProvider on subsequent requests.
337
- */
338
- export async function mintProjectsToken(env, orgId) {
339
- // Generate a cryptographically random bearer token
340
- const tokenBytes = crypto.getRandomValues(new Uint8Array(32));
341
- const token = Array.from(tokenBytes)
342
- .map((b) => b.toString(16).padStart(2, "0"))
343
- .join("");
344
- const ttl = 30 * 24 * 60 * 60; // 30 days in seconds
345
- const expiresAt = Date.now() + ttl * 1000;
346
- const record = {
347
- sub: `clerk_org_${orgId}`,
348
- org_id: orgId,
349
- scopes: ["read", "write"],
350
- issued_at: new Date().toISOString(),
351
- expires_at: new Date(expiresAt).toISOString(),
352
- source: "stripe_projects",
353
- };
354
- // Store under OAUTH_KV so the OAuthProvider validates it as a bearer token.
355
- // Key matches the pattern used by @cloudflare/workers-oauth-provider for bearer lookup.
356
- await env.OAUTH_KV.put(`token:${token}`, JSON.stringify(record), { expirationTtl: ttl });
357
- return token;
358
- }
359
- /**
360
- * Store OCS portal credentials in Clerk org (or user) privateMetadata.
361
- * Called from the /setup endpoint or the console settings page.
362
- */
363
- export async function setOcsPortalCredentials(env, credentials, orgId, userId) {
364
- const baseUrl = "https://api.clerk.com/v1";
365
- const headers = {
366
- Authorization: `Bearer ${env.CLERK_SECRET_KEY}`,
367
- "Content-Type": "application/json",
368
- };
369
- const body = JSON.stringify({
370
- private_metadata: { ocs_portal: credentials },
371
- });
372
- // Prefer org-level storage
373
- const entityType = orgId ? "organizations" : "users";
374
- const entityId = orgId ?? userId;
375
- if (!entityId)
376
- return false;
377
- try {
378
- const res = await fetch(`${baseUrl}/${entityType}/${entityId}/metadata`, {
379
- method: "PATCH",
380
- headers,
381
- body,
382
- });
383
- return res.ok;
384
- }
385
- catch {
386
- return false;
387
- }
388
- }
389
- //# sourceMappingURL=clerk.js.map
package/dist/clerk.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"clerk.js","sourceRoot":"","sources":["../src/clerk.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * eSIMVault OCS API client.
3
- * All requests are POST to /v1?token=<api_key> with JSON body { methodName: <params> }.
4
- * Responses: { status: { code, msg }, methodName: { ...data } }.
5
- *
6
- * params may be a plain object OR a bare scalar (number/string) for OCS methods that
7
- * expect a primitive as the request value rather than a nested object (e.g. listSponsor,
8
- * listSteeringList, getCustomerTariff, listDetailedLocationZone, getSimProviderStatus).
9
- */
10
- export interface OcsStatus {
11
- code: number;
12
- msg: string;
13
- }
14
- export interface OcsResponse<T = Record<string, unknown>> {
15
- status: OcsStatus;
16
- [method: string]: T | OcsStatus;
17
- }
18
- export declare class OcsApiError extends Error {
19
- readonly code: number;
20
- readonly method: string;
21
- constructor(code: number, message: string, method: string);
22
- }
23
- export declare class OcsClient {
24
- private readonly baseUrl;
25
- private readonly token;
26
- constructor(baseUrl: string, token: string);
27
- call<T = Record<string, unknown>>(method: string, params?: Record<string, unknown> | number | string): Promise<T>;
28
- }
29
- export declare function getClient(): OcsClient;
30
- /**
31
- * Fetch the token owner's reseller ID via getResellerInfo.
32
- * Used as a fallback when bare-integer methods are called without an explicit resellerId.
33
- */
34
- export declare function getDefaultResellerId(): Promise<number>;
35
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtD,MAAM,EAAE,SAAS,CAAC;IAClB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CACjC;AAED,qBAAa,WAAY,SAAQ,KAAK;aAElB,IAAI,EAAE,MAAM;aAEZ,MAAM,EAAE,MAAM;gBAFd,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM;CAKjC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKpC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAW,GACrD,OAAO,CAAC,CAAC,CAAC;CAuCd;AAID,wBAAgB,SAAS,IAAI,SAAS,CAarC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAO5D"}
package/dist/client.js DELETED
@@ -1,85 +0,0 @@
1
- /**
2
- * eSIMVault OCS API client.
3
- * All requests are POST to /v1?token=<api_key> with JSON body { methodName: <params> }.
4
- * Responses: { status: { code, msg }, methodName: { ...data } }.
5
- *
6
- * params may be a plain object OR a bare scalar (number/string) for OCS methods that
7
- * expect a primitive as the request value rather than a nested object (e.g. listSponsor,
8
- * listSteeringList, getCustomerTariff, listDetailedLocationZone, getSimProviderStatus).
9
- */
10
- export class OcsApiError extends Error {
11
- code;
12
- method;
13
- constructor(code, message, method) {
14
- super(`[${method}] OCS error ${code}: ${message}`);
15
- this.code = code;
16
- this.method = method;
17
- this.name = "OcsApiError";
18
- }
19
- }
20
- export class OcsClient {
21
- baseUrl;
22
- token;
23
- constructor(baseUrl, token) {
24
- this.baseUrl = baseUrl.replace(/\/+$/, "");
25
- this.token = token;
26
- }
27
- async call(method, params = {}) {
28
- const url = `${this.baseUrl}/v1?token=${this.token}`;
29
- const body = JSON.stringify({ [method]: params });
30
- const res = await fetch(url, {
31
- method: "POST",
32
- headers: { "Content-Type": "application/json" },
33
- body,
34
- });
35
- if (!res.ok) {
36
- throw new OcsApiError(res.status, `HTTP ${res.status} ${res.statusText}`, method);
37
- }
38
- const json = (await res.json());
39
- if (json.status?.code !== 0) {
40
- throw new OcsApiError(json.status?.code ?? -1, json.status?.msg ?? "Unknown error", method);
41
- }
42
- // getCustomerTariff response is keyed as "listTariffRule" not "getCustomerTariff"
43
- if (method === "getCustomerTariff" && json["listTariffRule"] !== undefined) {
44
- return json["listTariffRule"];
45
- }
46
- // GeoSense: live OCS returns coordinates under "subscriberLocation", not the method name
47
- if (method === "getSubscriberLocationByCellId") {
48
- const byMethod = json[method];
49
- if (byMethod !== undefined) {
50
- return byMethod;
51
- }
52
- if (json["subscriberLocation"] !== undefined) {
53
- return json["subscriberLocation"];
54
- }
55
- }
56
- // Return the method-specific payload
57
- return json[method] ?? json;
58
- }
59
- }
60
- let _client = null;
61
- export function getClient() {
62
- if (!_client) {
63
- const baseUrl = process.env.ESIMVAULT_BASE_URL;
64
- const token = process.env.ESIMVAULT_API_TOKEN;
65
- if (!baseUrl || !token) {
66
- throw new Error("Missing ESIMVAULT_BASE_URL or ESIMVAULT_API_TOKEN environment variables. " +
67
- "Set them before starting the MCP server.");
68
- }
69
- _client = new OcsClient(baseUrl, token);
70
- }
71
- return _client;
72
- }
73
- /**
74
- * Fetch the token owner's reseller ID via getResellerInfo.
75
- * Used as a fallback when bare-integer methods are called without an explicit resellerId.
76
- */
77
- export async function getDefaultResellerId() {
78
- const info = await getClient().call("getResellerInfo", {});
79
- const id = info?.id;
80
- if (typeof id !== "number") {
81
- throw new Error("Could not determine resellerId from getResellerInfo");
82
- }
83
- return id;
84
- }
85
- //# sourceMappingURL=client.js.map