@arnaudjnn/billing-tools 0.14.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +243 -0
  3. package/dist/adapters/workos-org.d.ts +80 -0
  4. package/dist/adapters/workos-org.d.ts.map +1 -0
  5. package/dist/adapters/workos-org.js +176 -0
  6. package/dist/adapters/workos-org.js.map +1 -0
  7. package/dist/agent-auth/claim-store.d.ts +37 -0
  8. package/dist/agent-auth/claim-store.d.ts.map +1 -0
  9. package/dist/agent-auth/claim-store.js +64 -0
  10. package/dist/agent-auth/claim-store.js.map +1 -0
  11. package/dist/agent-auth/index.d.ts +65 -0
  12. package/dist/agent-auth/index.d.ts.map +1 -0
  13. package/dist/agent-auth/index.js +365 -0
  14. package/dist/agent-auth/index.js.map +1 -0
  15. package/dist/auth.d.ts +16 -0
  16. package/dist/auth.d.ts.map +1 -0
  17. package/dist/auth.js +80 -0
  18. package/dist/auth.js.map +1 -0
  19. package/dist/billing.d.ts +59 -0
  20. package/dist/billing.d.ts.map +1 -0
  21. package/dist/billing.js +258 -0
  22. package/dist/billing.js.map +1 -0
  23. package/dist/cli/client.d.ts +10 -0
  24. package/dist/cli/client.d.ts.map +1 -0
  25. package/dist/cli/client.js +22 -0
  26. package/dist/cli/client.js.map +1 -0
  27. package/dist/cli/commands.d.ts +4 -0
  28. package/dist/cli/commands.d.ts.map +1 -0
  29. package/dist/cli/commands.js +94 -0
  30. package/dist/cli/commands.js.map +1 -0
  31. package/dist/cli/config.d.ts +16 -0
  32. package/dist/cli/config.d.ts.map +1 -0
  33. package/dist/cli/config.js +40 -0
  34. package/dist/cli/config.js.map +1 -0
  35. package/dist/create-billing.d.ts +78 -0
  36. package/dist/create-billing.d.ts.map +1 -0
  37. package/dist/create-billing.js +59 -0
  38. package/dist/create-billing.js.map +1 -0
  39. package/dist/dispatch.d.ts +9 -0
  40. package/dist/dispatch.d.ts.map +1 -0
  41. package/dist/dispatch.js +73 -0
  42. package/dist/dispatch.js.map +1 -0
  43. package/dist/events.d.ts +26 -0
  44. package/dist/events.d.ts.map +1 -0
  45. package/dist/events.js +72 -0
  46. package/dist/events.js.map +1 -0
  47. package/dist/index.d.ts +24 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +40 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/invitations.d.ts +56 -0
  52. package/dist/invitations.d.ts.map +1 -0
  53. package/dist/invitations.js +117 -0
  54. package/dist/invitations.js.map +1 -0
  55. package/dist/machine-payment/index.d.ts +57 -0
  56. package/dist/machine-payment/index.d.ts.map +1 -0
  57. package/dist/machine-payment/index.js +117 -0
  58. package/dist/machine-payment/index.js.map +1 -0
  59. package/dist/magic-auth.d.ts +4 -0
  60. package/dist/magic-auth.d.ts.map +1 -0
  61. package/dist/magic-auth.js +30 -0
  62. package/dist/magic-auth.js.map +1 -0
  63. package/dist/mirror.d.ts +35 -0
  64. package/dist/mirror.d.ts.map +1 -0
  65. package/dist/mirror.js +63 -0
  66. package/dist/mirror.js.map +1 -0
  67. package/dist/plans.d.ts +38 -0
  68. package/dist/plans.d.ts.map +1 -0
  69. package/dist/plans.js +132 -0
  70. package/dist/plans.js.map +1 -0
  71. package/dist/routes/mcp.d.ts +19 -0
  72. package/dist/routes/mcp.d.ts.map +1 -0
  73. package/dist/routes/mcp.js +39 -0
  74. package/dist/routes/mcp.js.map +1 -0
  75. package/dist/routes/rest.d.ts +20 -0
  76. package/dist/routes/rest.d.ts.map +1 -0
  77. package/dist/routes/rest.js +66 -0
  78. package/dist/routes/rest.js.map +1 -0
  79. package/dist/routes/webhook.d.ts +8 -0
  80. package/dist/routes/webhook.d.ts.map +1 -0
  81. package/dist/routes/webhook.js +39 -0
  82. package/dist/routes/webhook.js.map +1 -0
  83. package/dist/sync.d.ts +58 -0
  84. package/dist/sync.d.ts.map +1 -0
  85. package/dist/sync.js +202 -0
  86. package/dist/sync.js.map +1 -0
  87. package/dist/tools/billing.d.ts +4 -0
  88. package/dist/tools/billing.d.ts.map +1 -0
  89. package/dist/tools/billing.js +125 -0
  90. package/dist/tools/billing.js.map +1 -0
  91. package/dist/tools/keys.d.ts +4 -0
  92. package/dist/tools/keys.d.ts.map +1 -0
  93. package/dist/tools/keys.js +107 -0
  94. package/dist/tools/keys.js.map +1 -0
  95. package/dist/tools/register.d.ts +20 -0
  96. package/dist/tools/register.d.ts.map +1 -0
  97. package/dist/tools/register.js +87 -0
  98. package/dist/tools/register.js.map +1 -0
  99. package/dist/types.d.ts +90 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +28 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/util/clearout.d.ts +5 -0
  104. package/dist/util/clearout.d.ts.map +1 -0
  105. package/dist/util/clearout.js +18 -0
  106. package/dist/util/clearout.js.map +1 -0
  107. package/dist/workos.d.ts +6 -0
  108. package/dist/workos.d.ts.map +1 -0
  109. package/dist/workos.js +24 -0
  110. package/dist/workos.js.map +1 -0
  111. package/package.json +81 -0
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare class ToolValidationError extends Error {
3
+ }
4
+ export type RegisterFn = (server: McpServer) => void;
5
+ export declare function createDispatcher(register: RegisterFn): {
6
+ dispatchTool: (name: string, args: Record<string, unknown>) => Promise<unknown>;
7
+ getToolNames: () => string[];
8
+ };
9
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AAOjD,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU;yBA6BjB,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,OAAO,CAAC;wBAiCjE,MAAM,EAAE;EAMlC"}
@@ -0,0 +1,73 @@
1
+ import { z } from "zod";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ export class ToolValidationError extends Error {
4
+ }
5
+ export function createDispatcher(register) {
6
+ let handlers = null;
7
+ function init() {
8
+ if (handlers)
9
+ return;
10
+ const map = new Map();
11
+ const server = new McpServer({ name: "rest-dispatch", version: "0.0.0" });
12
+ const origTool = server.tool.bind(server);
13
+ server.tool = function (...args) {
14
+ const name = args[0];
15
+ const cb = args[args.length - 1];
16
+ let validator = null;
17
+ const shape = args.length >= 4 ? args[2] : null;
18
+ if (shape && typeof shape === "object" && !Array.isArray(shape)) {
19
+ try {
20
+ validator = z.object(shape);
21
+ }
22
+ catch {
23
+ validator = null;
24
+ }
25
+ }
26
+ if (typeof cb === "function" && typeof name === "string") {
27
+ map.set(name, { cb: cb, validator });
28
+ }
29
+ return origTool(...args);
30
+ };
31
+ register(server);
32
+ handlers = map;
33
+ }
34
+ async function dispatchTool(name, args) {
35
+ init();
36
+ const entry = handlers.get(name);
37
+ if (!entry)
38
+ throw new Error(`Unknown tool: ${name}`);
39
+ if (args && typeof args === "object") {
40
+ args = Object.fromEntries(Object.entries(args).filter(([, v]) => v !== null && v !== undefined));
41
+ }
42
+ let callArgs = args;
43
+ if (entry.validator) {
44
+ const parsed = entry.validator.safeParse(args ?? {});
45
+ if (!parsed.success) {
46
+ const detail = parsed.error.issues
47
+ .map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`)
48
+ .join("; ");
49
+ throw new ToolValidationError(`Invalid arguments for ${name}: ${detail}`);
50
+ }
51
+ callArgs = parsed.data;
52
+ }
53
+ const extra = { _meta: {}, sendNotification: async () => { } };
54
+ const result = await entry.cb(callArgs, extra);
55
+ if (result?.isError)
56
+ throw new Error(result.content?.[0]?.text || "Tool error");
57
+ const text = result?.content?.[0]?.text;
58
+ if (!text)
59
+ return result;
60
+ try {
61
+ return JSON.parse(text);
62
+ }
63
+ catch {
64
+ return text;
65
+ }
66
+ }
67
+ function getToolNames() {
68
+ init();
69
+ return Array.from(handlers.keys());
70
+ }
71
+ return { dispatchTool, getToolNames };
72
+ }
73
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type Stripe from "stripe";
2
+ export interface PollResult {
3
+ cursor: string | null;
4
+ count: number;
5
+ }
6
+ /** Poll Stripe events newer than `after` (last processed event id), oldest
7
+ * first. No `after` → baseline to the newest event, process nothing. */
8
+ export declare function pollStripeEvents(opts: {
9
+ after?: string | null;
10
+ types?: string[];
11
+ onEvent: (event: Stripe.Event) => Promise<void>;
12
+ maxPerPoll?: number;
13
+ }): Promise<PollResult>;
14
+ /** Poll WorkOS events of the given types newer than `after`, oldest first.
15
+ * No `after` → baseline to the newest event, process nothing. */
16
+ export declare function pollWorkOSEvents(opts: {
17
+ after?: string | null;
18
+ events: string[];
19
+ onEvent: (event: {
20
+ id: string;
21
+ event: string;
22
+ data: unknown;
23
+ }) => Promise<void>;
24
+ maxPerPoll?: number;
25
+ }): Promise<PollResult>;
26
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAejC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;yEACyE;AACzE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsBtB;AAED;kEACkE;AAClE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsCtB"}
package/dist/events.js ADDED
@@ -0,0 +1,72 @@
1
+ import { getStripe } from "./billing.js";
2
+ import { getWorkOS } from "./workos.js";
3
+ /** Poll Stripe events newer than `after` (last processed event id), oldest
4
+ * first. No `after` → baseline to the newest event, process nothing. */
5
+ export async function pollStripeEvents(opts) {
6
+ const stripe = getStripe();
7
+ const listParams = { limit: 100, ...(opts.types ? { types: opts.types } : {}) };
8
+ if (!opts.after) {
9
+ const latest = await stripe.events.list({ ...listParams, limit: 1 });
10
+ return { cursor: latest.data[0]?.id ?? null, count: 0 };
11
+ }
12
+ const max = opts.maxPerPoll ?? 500;
13
+ const fresh = [];
14
+ for await (const event of stripe.events.list(listParams)) {
15
+ if (event.id === opts.after)
16
+ break; // caught up
17
+ fresh.push(event);
18
+ if (fresh.length >= max)
19
+ break;
20
+ }
21
+ fresh.reverse(); // oldest → newest
22
+ for (const event of fresh)
23
+ await opts.onEvent(event);
24
+ return {
25
+ cursor: fresh.length ? fresh[fresh.length - 1].id : opts.after,
26
+ count: fresh.length,
27
+ };
28
+ }
29
+ /** Poll WorkOS events of the given types newer than `after`, oldest first.
30
+ * No `after` → baseline to the newest event, process nothing. */
31
+ export async function pollWorkOSEvents(opts) {
32
+ const wos = getWorkOS();
33
+ // WorkOS requires the event-name filter (narrow to the SDK's EventName union).
34
+ const events = opts.events;
35
+ const page = (after) => wos.events.listEvents({ events, order: "asc", limit: 100, ...(after ? { after } : {}) });
36
+ // Baseline (no cursor): page ascending to the very end and take the last id
37
+ // WITHOUT processing. (WorkOS's `order:desc` isn't reliable for "newest", so
38
+ // we walk forward to the end rather than trust a single desc query.)
39
+ // NOTE: listEvents returns a plain List (not an AutoPaginatable), so this
40
+ // manual walk is required — see the AGENTS.md "deliberate exceptions".
41
+ if (!opts.after) {
42
+ let cursor = null;
43
+ for (;;) {
44
+ const { data } = await page(cursor ?? undefined);
45
+ if (data.length === 0)
46
+ break;
47
+ cursor = data[data.length - 1].id;
48
+ if (data.length < 100)
49
+ break;
50
+ }
51
+ return { cursor, count: 0 };
52
+ }
53
+ const max = opts.maxPerPoll ?? 500;
54
+ let cursor = opts.after;
55
+ let count = 0;
56
+ for (;;) {
57
+ const { data } = await page(cursor);
58
+ if (data.length === 0)
59
+ break;
60
+ for (const event of data) {
61
+ await opts.onEvent({ id: event.id, event: event.event, data: event.data });
62
+ cursor = event.id;
63
+ count++;
64
+ if (count >= max)
65
+ break;
66
+ }
67
+ if (count >= max || data.length < 100)
68
+ break;
69
+ }
70
+ return { cursor, count };
71
+ }
72
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type { BillingAdapter, BillingUser, ApiKeyInfo, BillingConfig, ResolvedConfig, ToolResult, ToolErrorResult, } from "./types.js";
2
+ export { resolveConfig, internalDomainsFromEnv } from "./types.js";
3
+ export { authContext, runWithAuth, runWithResolvedOrg, enforceAccess, enforceTokens, } from "./auth.js";
4
+ export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getTokenBalance, deductTokens, creditTokens, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, type StripePrice, } from "./billing.js";
5
+ export { ensurePlans, planPriceId, planForPriceId, seatLimit, includedTokens, lookupKeyFor, type PlanDef, type PlansConfig, type BillingInterval, type EnsuredPrice, } from "./plans.js";
6
+ export { sendMagicAuth, verifyMagicAuth } from "./magic-auth.js";
7
+ export { createWorkOSInvitations, type InvitationService, type Invitation, type InvitationHooks, type InvitationEmailContext, type WorkOSInvitationsOptions, } from "./invitations.js";
8
+ export { pollStripeEvents, pollWorkOSEvents, type PollResult } from "./events.js";
9
+ export { createBillingSync, createSyncRoute, type BillingSync, type BillingSyncOptions, type CursorStore, } from "./sync.js";
10
+ export { createMirror, type Mirror, type MirrorOptions, type MirrorQuery, type MirrorQueryResult, } from "./mirror.js";
11
+ export { registerBillingTools, installInputLogging, BILLING_TOOL_NAMES, type RegisterBillingToolsOptions, } from "./tools/register.js";
12
+ export { createDispatcher, ToolValidationError, type RegisterFn } from "./dispatch.js";
13
+ export { createBilling, type CreateBillingOptions } from "./create-billing.js";
14
+ export { createAgentAuth, CLAIM_GRANT_TYPE, type AgentAuthOptions, type AgentAuthBranding, type AgentAuthPaths, type AgentAuthPolicy, type AgentIdentityType, } from "./agent-auth/index.js";
15
+ export { inMemoryClaimStore, type ClaimStore, type ClaimStatus, type ClaimReadResult, } from "./agent-auth/claim-store.js";
16
+ export { createMachinePaymentHandler, createPaymentMd, type MachinePaymentOptions, type MachinePaymentMethod, type PaymentChallenge, type SettleFn, type PaymentMdOptions, } from "./machine-payment/index.js";
17
+ export { createToolListHandler, createToolDispatchHandler, type Dispatcher } from "./routes/rest.js";
18
+ export { createMcpTransport, type McpTransportOptions } from "./routes/mcp.js";
19
+ export { createStripeWebhookHandler, type WebhookOptions } from "./routes/webhook.js";
20
+ export { registerBillingCommands } from "./cli/commands.js";
21
+ export { callTool, listTools, type ApiClientConfig } from "./cli/client.js";
22
+ export { type CliOptions, type CliConfig, configPath, readConfig, writeConfig, resolveBaseUrl, resolveApiKey, } from "./cli/config.js";
23
+ export { lookupCompany } from "./util/clearout.js";
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ // billing-tools — make your Stripe + WorkOS app ready to get paid.
2
+ export { resolveConfig, internalDomainsFromEnv } from "./types.js";
3
+ // Auth engine
4
+ export { authContext, runWithAuth, runWithResolvedOrg, enforceAccess, enforceTokens, } from "./auth.js";
5
+ // Billing engine (Stripe math)
6
+ export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getTokenBalance, deductTokens, creditTokens, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, } from "./billing.js";
7
+ // Declarative plans (auto-provision Stripe products/prices from config)
8
+ export { ensurePlans, planPriceId, planForPriceId, seatLimit, includedTokens, lookupKeyFor, } from "./plans.js";
9
+ // WorkOS magic-auth
10
+ export { sendMagicAuth, verifyMagicAuth } from "./magic-auth.js";
11
+ // WorkOS organization invitations (shared, hook-configurable)
12
+ export { createWorkOSInvitations, } from "./invitations.js";
13
+ // Event-polling sync (zero-webhook: poll Stripe + WorkOS Events APIs)
14
+ export { pollStripeEvents, pollWorkOSEvents } from "./events.js";
15
+ // Turn-key billing sync engine (owns the poll→dispatch→plan/token/mirror loop)
16
+ export { createBillingSync, createSyncRoute, } from "./sync.js";
17
+ // Generic DB mirror for WorkOS entities (table-agnostic; org + user shapes)
18
+ export { createMirror, } from "./mirror.js";
19
+ // Tool registration
20
+ export { registerBillingTools, installInputLogging, BILLING_TOOL_NAMES, } from "./tools/register.js";
21
+ // REST dispatch bridge
22
+ export { createDispatcher, ToolValidationError } from "./dispatch.js";
23
+ // One-call composition helper (mount every surface from one config)
24
+ export { createBilling } from "./create-billing.js";
25
+ // auth.md — agent self-registration protocol (framework-agnostic handlers)
26
+ export { createAgentAuth, CLAIM_GRANT_TYPE, } from "./agent-auth/index.js";
27
+ export { inMemoryClaimStore, } from "./agent-auth/claim-store.js";
28
+ // Machine payments — MPP (the 402 payment sibling of auth.md)
29
+ export { createMachinePaymentHandler, createPaymentMd, } from "./machine-payment/index.js";
30
+ // Next route factories
31
+ export { createToolListHandler, createToolDispatchHandler } from "./routes/rest.js";
32
+ export { createMcpTransport } from "./routes/mcp.js";
33
+ export { createStripeWebhookHandler } from "./routes/webhook.js";
34
+ // CLI factory
35
+ export { registerBillingCommands } from "./cli/commands.js";
36
+ export { callTool, listTools } from "./cli/client.js";
37
+ export { configPath, readConfig, writeConfig, resolveBaseUrl, resolveApiKey, } from "./cli/config.js";
38
+ // Utils
39
+ export { lookupCompany } from "./util/clearout.js";
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAYnE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEnE,cAAc;AACd,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,+BAA+B;AAC/B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AAEtB,wEAAwE;AACxE,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,SAAS,EACT,cAAc,EACd,YAAY,GAKb,MAAM,YAAY,CAAC;AAEpB,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjE,8DAA8D;AAC9D,OAAO,EACL,uBAAuB,GAMxB,MAAM,kBAAkB,CAAC;AAE1B,sEAAsE;AACtE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAElF,+EAA+E;AAC/E,OAAO,EACL,iBAAiB,EACjB,eAAe,GAIhB,MAAM,WAAW,CAAC;AAEnB,4EAA4E;AAC5E,OAAO,EACL,YAAY,GAKb,MAAM,aAAa,CAAC;AAErB,oBAAoB;AACpB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,uBAAuB;AACvB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAmB,MAAM,eAAe,CAAC;AAEvF,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAE/E,2EAA2E;AAC3E,OAAO,EACL,eAAe,EACf,gBAAgB,GAMjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,GAInB,MAAM,6BAA6B,CAAC;AAErC,8DAA8D;AAC9D,OAAO,EACL,2BAA2B,EAC3B,eAAe,GAMhB,MAAM,4BAA4B,CAAC;AAEpC,uBAAuB;AACvB,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAmB,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAA4B,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAuB,MAAM,qBAAqB,CAAC;AAEtF,cAAc;AACd,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAGL,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { BillingUser } from "./types.js";
2
+ import type { WorkOSOrgMap } from "./adapters/workos-org.js";
3
+ export interface InvitationEmailContext {
4
+ /** WorkOS invitation id (use it in your accept link). */
5
+ id: string;
6
+ email: string;
7
+ roleSlug: string;
8
+ /** App orgId (post-map). */
9
+ orgId: string;
10
+ /** WorkOS organization id. */
11
+ organizationId: string;
12
+ /** `${baseUrl}${acceptPath}/${id}` — ready-made link for a custom email. */
13
+ acceptUrl: string;
14
+ inviterUserId?: string;
15
+ }
16
+ export interface InvitationHooks {
17
+ /** Send a branded email. Omit → rely on WorkOS's default invitation email. */
18
+ sendEmail?(ctx: InvitationEmailContext): Promise<void>;
19
+ /** Decide whether `user` may accept an invite addressed to `invitedEmail`.
20
+ * Omit → case-insensitive match against the user's WorkOS primary email.
21
+ * Return false for a generic rejection, or throw for a custom message. */
22
+ canAccept?(invitedEmail: string, user: BillingUser): Promise<boolean>;
23
+ }
24
+ export interface Invitation {
25
+ id: string;
26
+ email: string;
27
+ roleSlug: string;
28
+ /** App orgId (post-map), or "" if it can't be resolved. */
29
+ orgId: string;
30
+ organizationId: string;
31
+ state: "pending" | "accepted" | "expired" | "revoked";
32
+ createdAt: string;
33
+ expiresAt: string;
34
+ }
35
+ export interface WorkOSInvitationsOptions {
36
+ apiKey?: string;
37
+ clientId?: string;
38
+ /** ws↔org id map (share the adapter's). Omit → orgId IS the WorkOS org id. */
39
+ map?: WorkOSOrgMap;
40
+ /** Base URL for the custom-email accept link. */
41
+ baseUrl?: string;
42
+ /** Accept-link path prefix. Default "/invita". */
43
+ acceptPath?: string;
44
+ hooks?: InvitationHooks;
45
+ }
46
+ export interface InvitationService {
47
+ send(orgId: string, email: string, roleSlug: string, inviterUserId?: string): Promise<Invitation>;
48
+ list(orgId: string): Promise<Invitation[]>;
49
+ get(invitationId: string): Promise<Invitation | null>;
50
+ accept(invitationId: string, user: BillingUser): Promise<{
51
+ orgId: string;
52
+ }>;
53
+ revoke(orgId: string, invitationId: string): Promise<void>;
54
+ }
55
+ export declare function createWorkOSInvitations(opts?: WorkOSInvitationsOptions): InvitationService;
56
+ //# sourceMappingURL=invitations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.d.ts","sourceRoot":"","sources":["../src/invitations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgB7D,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,SAAS,CAAC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD;;+EAE2E;IAC3E,SAAS,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAID,wBAAgB,uBAAuB,CACrC,IAAI,GAAE,wBAA6B,GAClC,iBAAiB,CAwHnB"}
@@ -0,0 +1,117 @@
1
+ import { NotFoundException, ConflictException } from "@workos-inc/node";
2
+ import { getWorkOS } from "./workos.js";
3
+ const PAGE = 100;
4
+ export function createWorkOSInvitations(opts = {}) {
5
+ // Shared, lazily-memoized WorkOS client (see workos.ts).
6
+ const workos = () => getWorkOS({ apiKey: opts.apiKey, clientId: opts.clientId });
7
+ const hooks = opts.hooks ?? {};
8
+ const baseUrl = opts.baseUrl ?? "";
9
+ const acceptPath = opts.acceptPath ?? "/invita";
10
+ const toWid = (orgId) => opts.map ? opts.map.toWorkosOrgId(orgId) : Promise.resolve(orgId);
11
+ const toOrgId = (workosOrgId) => opts.map ? opts.map.toOrgId(workosOrgId) : Promise.resolve(workosOrgId);
12
+ async function normalize(inv, orgId) {
13
+ const resolved = orgId ?? (inv.organizationId ? await toOrgId(inv.organizationId) : null);
14
+ return {
15
+ id: inv.id,
16
+ email: inv.email,
17
+ roleSlug: inv.roleSlug ?? "member",
18
+ orgId: resolved ?? "",
19
+ organizationId: inv.organizationId ?? "",
20
+ state: inv.state,
21
+ createdAt: inv.createdAt,
22
+ expiresAt: inv.expiresAt,
23
+ };
24
+ }
25
+ async function get(invitationId) {
26
+ let inv;
27
+ try {
28
+ inv = await workos().userManagement.getInvitation(invitationId);
29
+ }
30
+ catch (e) {
31
+ if (e instanceof NotFoundException)
32
+ return null;
33
+ throw e;
34
+ }
35
+ if (inv.state !== "pending")
36
+ return null;
37
+ return normalize(inv);
38
+ }
39
+ async function send(orgId, email, roleSlug, inviterUserId) {
40
+ const organizationId = await toWid(orgId);
41
+ const inv = await workos().userManagement.sendInvitation({
42
+ email: email.trim().toLowerCase(),
43
+ organizationId,
44
+ roleSlug,
45
+ inviterUserId,
46
+ });
47
+ if (hooks.sendEmail) {
48
+ await hooks.sendEmail({
49
+ id: inv.id,
50
+ email: inv.email,
51
+ roleSlug: inv.roleSlug ?? roleSlug,
52
+ orgId,
53
+ organizationId,
54
+ acceptUrl: `${baseUrl}${acceptPath}/${inv.id}`,
55
+ inviterUserId,
56
+ });
57
+ }
58
+ return normalize(inv, orgId);
59
+ }
60
+ async function list(orgId) {
61
+ const organizationId = await toWid(orgId);
62
+ const paginatable = await workos().userManagement.listInvitations({ organizationId, limit: PAGE });
63
+ const pending = (await paginatable.autoPagination()).filter((i) => i.state === "pending");
64
+ return Promise.all(pending.map((i) => normalize(i, orgId)));
65
+ }
66
+ async function accept(invitationId, user) {
67
+ const inv = await get(invitationId);
68
+ if (!inv)
69
+ throw new Error("Invitation is invalid or already used");
70
+ const allowed = hooks.canAccept
71
+ ? await hooks.canAccept(inv.email, user)
72
+ : inv.email.toLowerCase() === user.email.toLowerCase();
73
+ if (!allowed) {
74
+ throw new Error(`This invitation is for ${inv.email}.`);
75
+ }
76
+ const organizationId = await toWid(inv.orgId);
77
+ // Tolerate an already-present membership (never downgrade).
78
+ try {
79
+ await workos().userManagement.createOrganizationMembership({
80
+ organizationId,
81
+ userId: user.id,
82
+ roleSlug: inv.roleSlug,
83
+ });
84
+ }
85
+ catch (e) {
86
+ if (!(e instanceof ConflictException))
87
+ throw e;
88
+ }
89
+ // Consume the pending invitation.
90
+ try {
91
+ await workos().userManagement.revokeInvitation(invitationId);
92
+ }
93
+ catch (e) {
94
+ if (!(e instanceof NotFoundException))
95
+ throw e;
96
+ }
97
+ return { orgId: inv.orgId };
98
+ }
99
+ async function revoke(orgId, invitationId) {
100
+ const organizationId = await toWid(orgId);
101
+ let inv;
102
+ try {
103
+ inv = await workos().userManagement.getInvitation(invitationId);
104
+ }
105
+ catch (e) {
106
+ if (e instanceof NotFoundException)
107
+ return;
108
+ throw e;
109
+ }
110
+ // Belongs-to check: the invitation must target this org.
111
+ if (inv.organizationId !== organizationId)
112
+ return;
113
+ await workos().userManagement.revokeInvitation(invitationId);
114
+ }
115
+ return { send, list, get, accept, revoke };
116
+ }
117
+ //# sourceMappingURL=invitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.js","sourceRoot":"","sources":["../src/invitations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export type MachinePaymentMethod = "stripe" | "tempo" | "solana" | "base";
2
+ export interface PaymentChallenge {
3
+ id: string;
4
+ method: MachinePaymentMethod;
5
+ intent: "charge";
6
+ amount: number;
7
+ currency: string;
8
+ /** SPT profile id (`profile_…`) for method "stripe", or a deposit address for crypto. */
9
+ payTo?: string;
10
+ }
11
+ /** Settle a presented payment credential against a challenge. Provided by the
12
+ * app once its Stripe account is machine-payments-eligible (e.g. `stripe.charge`
13
+ * with the SPT, or a crypto verification). Resolve with a receipt on success;
14
+ * throw / return null to reject. */
15
+ export type SettleFn = (credential: string, challenge: PaymentChallenge) => Promise<{
16
+ receipt: string;
17
+ } | null>;
18
+ export interface MachinePaymentOptions {
19
+ /** Accepted methods, in preference order. Default ["stripe"]. */
20
+ methods?: MachinePaymentMethod[];
21
+ /** Price in minor units — fixed, or resolved per request (e.g. by path/tool). */
22
+ amount: number | ((request: Request) => number | Promise<number>);
23
+ currency?: string;
24
+ /** SPT profile id (`profile_…`) advertised for method "stripe". */
25
+ networkId?: string;
26
+ /** Crypto deposit address advertised for crypto methods. */
27
+ payToAddress?: string;
28
+ /** Inject the actual charge once the account is eligible. Omit → 402 with a
29
+ * "settlement not enabled" note (protocol ready, money path pending). */
30
+ settle?: SettleFn;
31
+ /** Called after a successful settle; use to record the payment / grant access. */
32
+ onPaid?: (challenge: PaymentChallenge, receipt: string, request: Request) => Promise<void> | void;
33
+ }
34
+ /** Build the MPP payment gate. Returns `requirePayment(request)` → either a 402
35
+ * `Response` (payment needed / rejected / not-settled) or `{ paid: true,
36
+ * challenge, receipt }` when settlement succeeds — the caller then serves the
37
+ * paid resource. */
38
+ export declare function createMachinePaymentHandler(opts: MachinePaymentOptions): {
39
+ requirePayment: (request: Request) => Promise<Response | {
40
+ paid: true;
41
+ challenge: PaymentChallenge;
42
+ receipt: string;
43
+ }>;
44
+ buildChallenges: (request: Request) => Promise<PaymentChallenge[]>;
45
+ };
46
+ export interface PaymentMdOptions {
47
+ productName: string;
48
+ methods?: MachinePaymentMethod[];
49
+ currency?: string;
50
+ /** Path the paid resource lives at, for the doc examples. Default "/mcp". */
51
+ resourcePath?: string;
52
+ baseUrl?: string | ((request: Request) => string);
53
+ }
54
+ /** `/payment.md` — the agent-facing "how to pay per request" narrative; the
55
+ * payment equivalent of auth.md. */
56
+ export declare function createPaymentMd(opts: PaymentMdOptions): (request: Request) => Response;
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/machine-payment/index.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;qCAGqC;AACrC,MAAM,MAAM,QAAQ,GAAG,CACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,gBAAgB,KACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAEzC,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,iFAAiF;IACjF,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;8EAC0E;IAC1E,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,kFAAkF;IAClF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACnG;AAyBD;;;qBAGqB;AACrB,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB;8BAiC1D,OAAO,KACf,OAAO,CAAC,QAAQ,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;+BA9B3C,OAAO,KAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;EAmD9E;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;CACnD;AAED;qCACqC;AACrC,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,IAC1B,SAAS,OAAO,KAAG,QAAQ,CAqCtD"}