@arnaudjnn/billing-tools 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-billing.d.ts +27 -0
- package/dist/create-billing.d.ts.map +1 -1
- package/dist/create-billing.js +24 -0
- package/dist/create-billing.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/metering.d.ts +6 -0
- package/dist/metering.d.ts.map +1 -1
- package/dist/metering.js +46 -7
- package/dist/metering.js.map +1 -1
- package/dist/seats.d.ts +10 -0
- package/dist/seats.d.ts.map +1 -0
- package/dist/seats.js +36 -0
- package/dist/seats.js.map +1 -0
- package/dist/tools/management.d.ts +7 -0
- package/dist/tools/management.d.ts.map +1 -0
- package/dist/tools/management.js +127 -0
- package/dist/tools/management.js.map +1 -0
- package/dist/tools/register.d.ts +1 -1
- package/dist/tools/register.d.ts.map +1 -1
- package/dist/tools/register.js +10 -0
- package/dist/tools/register.js.map +1 -1
- package/dist/topup.d.ts +7 -17
- package/dist/topup.d.ts.map +1 -1
- package/dist/topup.js +11 -25
- package/dist/topup.js.map +1 -1
- package/package.json +1 -1
package/dist/create-billing.d.ts
CHANGED
|
@@ -47,6 +47,27 @@ export interface CreateBillingOptions {
|
|
|
47
47
|
* `billing.oauth` exposes the four route handlers. Requires
|
|
48
48
|
* REFRESH_TOKEN_SECRET. */
|
|
49
49
|
oauthProxy?: OAuthProxyOptions | true;
|
|
50
|
+
/** Enable the bound call-site meter (`billing.meter`) + the API route guard
|
|
51
|
+
* (`billing.meterRequest`). Pass your rate card; the meter uses `plans` above
|
|
52
|
+
* for seat packs. Plan resolution defaults to the org's `plan` metadata key
|
|
53
|
+
* (override via `resolvePlan`). Omit to leave metering off. */
|
|
54
|
+
meter?: {
|
|
55
|
+
/** action → token cost (per unit). Consumer-authored product data. */
|
|
56
|
+
rateCard?: Record<string, number>;
|
|
57
|
+
/** Resolve the org's current plan key. Default: the org's `plan` metadata
|
|
58
|
+
* (via adapter.getOrgMetadata). Override to read a subscription, etc. */
|
|
59
|
+
resolvePlan?: (orgId: string) => Promise<string | null>;
|
|
60
|
+
/** Seat-type keys a caller maps to by identity. Default standard / api. */
|
|
61
|
+
seatDefaults?: {
|
|
62
|
+
user?: string;
|
|
63
|
+
api?: string;
|
|
64
|
+
};
|
|
65
|
+
/** Plan-cache TTL (ms). Default 60_000. */
|
|
66
|
+
planCacheTtlMs?: number;
|
|
67
|
+
/** Cycle window (unix s) + key. Default: 1st-of-month UTC / "YYYY-MM". */
|
|
68
|
+
cycleStart?: () => number;
|
|
69
|
+
cycleKey?: () => string;
|
|
70
|
+
};
|
|
50
71
|
}
|
|
51
72
|
export declare function createBilling(opts: CreateBillingOptions): {
|
|
52
73
|
adapter: BillingAdapter;
|
|
@@ -72,6 +93,12 @@ export declare function createBilling(opts: CreateBillingOptions): {
|
|
|
72
93
|
}) => Promise<Response>;
|
|
73
94
|
/** Stripe webhook POST handler (undefined if `webhook: false`). */
|
|
74
95
|
webhook: ((request: Request) => Promise<Response>) | undefined;
|
|
96
|
+
/** Bound call-site meter (undefined unless `meter` was configured):
|
|
97
|
+
* `await meter(orgId, action, { caller })`. */
|
|
98
|
+
meter: import("./metering.js").Meter<Record<string, number>> | undefined;
|
|
99
|
+
/** API route guard (undefined unless `meter` was configured):
|
|
100
|
+
* `const gate = await meterRequest(req, action); if (gate) return gate`. */
|
|
101
|
+
meterRequest: import("./metering.js").ApiMeterGuard<Record<string, number>> | undefined;
|
|
75
102
|
/** auth.md handlers (undefined unless `agentAuth` was configured). */
|
|
76
103
|
agentAuth: {
|
|
77
104
|
protectedResource: (request: Request) => Response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-billing.d.ts","sourceRoot":"","sources":["../src/create-billing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhE,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAgD,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-billing.d.ts","sourceRoot":"","sources":["../src/create-billing.ts"],"names":[],"mappings":"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"}
|
package/dist/create-billing.js
CHANGED
|
@@ -7,6 +7,7 @@ import { createStripeWebhookHandler } from "./routes/webhook.js";
|
|
|
7
7
|
import { CLAIM_GRANT_TYPE, createAgentAuth, } from "./agent-auth/index.js";
|
|
8
8
|
import { createMachinePaymentHandler, createPaymentMd } from "./machine-payment/index.js";
|
|
9
9
|
import { createOAuthProxy } from "./oauth-proxy/index.js";
|
|
10
|
+
import { createMeter, createApiMeterGuard } from "./metering.js";
|
|
10
11
|
export function createBilling(opts) {
|
|
11
12
|
const resolved = resolveConfig(opts.config);
|
|
12
13
|
// MCP OAuth 2.1 + DCR proxy (opt-in). Built first so agentAuth can advertise
|
|
@@ -90,6 +91,23 @@ export function createBilling(opts) {
|
|
|
90
91
|
currency: opts.machinePayment.currency ?? resolved.currency,
|
|
91
92
|
})
|
|
92
93
|
: undefined;
|
|
94
|
+
// Bound call-site meter + API route guard (opt-in). Plan resolution defaults to
|
|
95
|
+
// the org's `plan` metadata so the common case needs no resolver.
|
|
96
|
+
const meter = opts.meter
|
|
97
|
+
? createMeter(opts.adapter, resolved, {
|
|
98
|
+
plans: opts.plans ?? {},
|
|
99
|
+
rateCard: opts.meter.rateCard,
|
|
100
|
+
resolvePlan: opts.meter.resolvePlan ??
|
|
101
|
+
(async (orgId) => (await opts.adapter.getOrgMetadata?.(orgId))?.plan ?? null),
|
|
102
|
+
seatDefaults: opts.meter.seatDefaults,
|
|
103
|
+
planCacheTtlMs: opts.meter.planCacheTtlMs,
|
|
104
|
+
cycleStart: opts.meter.cycleStart,
|
|
105
|
+
cycleKey: opts.meter.cycleKey,
|
|
106
|
+
})
|
|
107
|
+
: undefined;
|
|
108
|
+
const meterRequest = meter
|
|
109
|
+
? createApiMeterGuard(opts.adapter, meter, { realm: opts.realm })
|
|
110
|
+
: undefined;
|
|
93
111
|
return {
|
|
94
112
|
adapter: opts.adapter,
|
|
95
113
|
config: resolved,
|
|
@@ -103,6 +121,12 @@ export function createBilling(opts) {
|
|
|
103
121
|
restDispatch,
|
|
104
122
|
/** Stripe webhook POST handler (undefined if `webhook: false`). */
|
|
105
123
|
webhook,
|
|
124
|
+
/** Bound call-site meter (undefined unless `meter` was configured):
|
|
125
|
+
* `await meter(orgId, action, { caller })`. */
|
|
126
|
+
meter,
|
|
127
|
+
/** API route guard (undefined unless `meter` was configured):
|
|
128
|
+
* `const gate = await meterRequest(req, action); if (gate) return gate`. */
|
|
129
|
+
meterRequest,
|
|
106
130
|
/** auth.md handlers (undefined unless `agentAuth` was configured). */
|
|
107
131
|
agentAuth,
|
|
108
132
|
/** MPP handler `{ requirePayment, buildChallenges }` (undefined unless `machinePayment` was configured). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-billing.js","sourceRoot":"","sources":["../src/create-billing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,eAAe,GAKhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAA8B,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,gBAAgB,EAA0B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-billing.js","sourceRoot":"","sources":["../src/create-billing.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ export { resolveConfig, internalDomainsFromEnv } from "./types.js";
|
|
|
3
3
|
export { authContext, runWithAuth, runWithResolvedOrg, enforceAccess, enforceTokens, } from "./auth.js";
|
|
4
4
|
export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getTokenBalance, deductTokens, creditTokens, usageSince, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, type StripePrice, } from "./billing.js";
|
|
5
5
|
export { ensurePlans, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, type PlanDef, type SeatTypeDef, type PlansConfig, type BillingInterval, type EnsuredPrice, } from "./plans.js";
|
|
6
|
-
export { meterUsage, createMeter, type MeterCaller, type MeterInput, type MeterResult, type MeterConfig, type MeterCallOpts, type Meter, } from "./metering.js";
|
|
7
|
-
export { requestTopUp, listTopUpRequests, approveTopUp, denyTopUp, extraAllowance,
|
|
6
|
+
export { meterUsage, createMeter, createApiMeterGuard, type MeterCaller, type MeterInput, type MeterResult, type MeterConfig, type MeterCallOpts, type Meter, type ApiMeterGuard, } from "./metering.js";
|
|
7
|
+
export { requestTopUp, listTopUpRequests, approveTopUp, denyTopUp, extraAllowance, type TopUpRequest, } from "./topup.js";
|
|
8
|
+
export { assignSeatType, listSeatAssignments, getSeatType, } from "./seats.js";
|
|
8
9
|
export { sendMagicAuth, verifyMagicAuth } from "./magic-auth.js";
|
|
9
10
|
export { createWorkOSInvitations, type InvitationService, type Invitation, type InvitationHooks, type InvitationEmailContext, type WorkOSInvitationsOptions, } from "./invitations.js";
|
|
10
11
|
export { pollStripeEvents, pollWorkOSEvents, type PollResult } from "./events.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGnE,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,10 +8,12 @@ export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId
|
|
|
8
8
|
export { ensurePlans, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, } from "./plans.js";
|
|
9
9
|
// Per-execution metering engine (prepaid balance; per-seat packs or a global
|
|
10
10
|
// pool; usage summed from Stripe balance-transaction metadata — no new backend).
|
|
11
|
-
export { meterUsage, createMeter, } from "./metering.js";
|
|
11
|
+
export { meterUsage, createMeter, createApiMeterGuard, } from "./metering.js";
|
|
12
12
|
// Top-up requests (user → owner approval) + admin-gated auto-top-up. Stored in
|
|
13
13
|
// WorkOS org metadata via the adapter — no new backend.
|
|
14
|
-
export { requestTopUp, listTopUpRequests, approveTopUp, denyTopUp, extraAllowance,
|
|
14
|
+
export { requestTopUp, listTopUpRequests, approveTopUp, denyTopUp, extraAllowance, } from "./topup.js";
|
|
15
|
+
// Seat-type assignments (per-member seat, stored in org metadata)
|
|
16
|
+
export { assignSeatType, listSeatAssignments, getSeatType, } from "./seats.js";
|
|
15
17
|
// WorkOS magic-auth
|
|
16
18
|
export { sendMagicAuth, verifyMagicAuth } from "./magic-auth.js";
|
|
17
19
|
// WorkOS organization invitations (shared, hook-configurable)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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,UAAU,EACV,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,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,GAMnB,MAAM,YAAY,CAAC;AAEpB,6EAA6E;AAC7E,iFAAiF;AACjF,OAAO,EACL,UAAU,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/metering.d.ts
CHANGED
|
@@ -75,4 +75,10 @@ export interface MeterCallOpts {
|
|
|
75
75
|
}
|
|
76
76
|
export type Meter<R extends Record<string, number>> = (orgId: string, action: keyof R & string, opts?: MeterCallOpts) => Promise<MeterResult>;
|
|
77
77
|
export declare function createMeter<R extends Record<string, number> = Record<string, number>>(adapter: BillingAdapter, config: ResolvedConfig, meterCfg: MeterConfig<R>): Meter<R>;
|
|
78
|
+
export type ApiMeterGuard<R extends Record<string, number>> = (req: Request, action: keyof R & string, opts?: {
|
|
79
|
+
units?: number;
|
|
80
|
+
}) => Promise<Response | null>;
|
|
81
|
+
export declare function createApiMeterGuard<R extends Record<string, number>>(adapter: BillingAdapter, meter: Meter<R>, cfg?: {
|
|
82
|
+
realm?: string;
|
|
83
|
+
}): ApiMeterGuard<R>;
|
|
78
84
|
//# sourceMappingURL=metering.d.ts.map
|
package/dist/metering.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metering.d.ts","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metering.d.ts","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"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"}
|
package/dist/metering.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { deductTokens, getBillingCustomerId, getTokenBalance, stripeConfigured, tryAutoReload, usageSince, } from "./billing.js";
|
|
2
2
|
import { isInternalOrg } from "./auth.js";
|
|
3
3
|
import { extraAllowance } from "./topup.js";
|
|
4
|
+
import { getSeatType } from "./seats.js";
|
|
4
5
|
// The shared metering engine (used by every consumer). Pricing is per execution
|
|
5
6
|
// at a uniform cost regardless of surface. The org's prepaid Stripe balance is
|
|
6
7
|
// the shared reserve; in `per_seat` plans each caller's per-cycle pack caps how
|
|
@@ -79,13 +80,15 @@ export function createMeter(adapter, config, meterCfg) {
|
|
|
79
80
|
}
|
|
80
81
|
return async function meter(orgId, action, opts = {}) {
|
|
81
82
|
const cost = opts.cost ?? (rateCard?.[action] ?? 0) * (opts.units ?? 1);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
// Seat type by auth identity: an API key → the shared api seat; a member →
|
|
84
|
+
// their assigned seat type (falling back to the default user seat).
|
|
85
|
+
let caller;
|
|
86
|
+
if (opts.caller) {
|
|
87
|
+
const seatType = opts.caller.kind === "api"
|
|
88
|
+
? apiSeat
|
|
89
|
+
: (opts.caller.id && (await getSeatType(adapter, orgId, opts.caller.id))) || userSeat;
|
|
90
|
+
caller = { kind: opts.caller.kind, id: opts.caller.id, seatType };
|
|
91
|
+
}
|
|
89
92
|
// Owner-approved extra allowance for a user seat this cycle (top-up flow).
|
|
90
93
|
const extra = caller?.kind === "user" && caller.id
|
|
91
94
|
? await extraAllowance(adapter, orgId, caller.id, cycleKey())
|
|
@@ -102,4 +105,40 @@ export function createMeter(adapter, config, meterCfg) {
|
|
|
102
105
|
});
|
|
103
106
|
};
|
|
104
107
|
}
|
|
108
|
+
export function createApiMeterGuard(adapter, meter, cfg) {
|
|
109
|
+
const realm = cfg?.realm ?? "api";
|
|
110
|
+
return async function meterRequest(req, action, opts) {
|
|
111
|
+
const token = req.headers
|
|
112
|
+
.get("authorization")
|
|
113
|
+
?.replace(/^Bearer\s+/i, "")
|
|
114
|
+
.trim();
|
|
115
|
+
if (!token)
|
|
116
|
+
return unauthorized(realm);
|
|
117
|
+
const auth = await adapter.validateApiKey(token);
|
|
118
|
+
if (!auth)
|
|
119
|
+
return unauthorized(realm);
|
|
120
|
+
const res = await meter(auth.orgId, action, {
|
|
121
|
+
caller: { kind: "api", id: auth.orgId },
|
|
122
|
+
units: opts?.units,
|
|
123
|
+
});
|
|
124
|
+
if (!res.ok)
|
|
125
|
+
return jsonResponse(402, { error: res.message ?? "Insufficient balance." });
|
|
126
|
+
return null;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function jsonResponse(status, body) {
|
|
130
|
+
return new Response(JSON.stringify(body), {
|
|
131
|
+
status,
|
|
132
|
+
headers: { "content-type": "application/json" },
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function unauthorized(realm) {
|
|
136
|
+
return new Response(JSON.stringify({ error: "Unauthorized: provide a workspace API key as a Bearer token." }), {
|
|
137
|
+
status: 401,
|
|
138
|
+
headers: {
|
|
139
|
+
"content-type": "application/json",
|
|
140
|
+
"www-authenticate": `Bearer realm="${realm}"`,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
105
144
|
//# sourceMappingURL=metering.js.map
|
package/dist/metering.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../src/metering.ts"],"names":[],"mappings":"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"}
|
package/dist/seats.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BillingAdapter } from "./types.js";
|
|
2
|
+
type Assignments = Record<string, string>;
|
|
3
|
+
/** Assign a member to a seat type (pass null/"" to clear → default seat). */
|
|
4
|
+
export declare function assignSeatType(adapter: BillingAdapter, orgId: string, memberId: string, seatType: string | null): Promise<void>;
|
|
5
|
+
/** The full member → seat-type map for the org. */
|
|
6
|
+
export declare function listSeatAssignments(adapter: BillingAdapter, orgId: string): Promise<Assignments>;
|
|
7
|
+
/** A single member's assigned seat type, or null if unassigned. */
|
|
8
|
+
export declare function getSeatType(adapter: BillingAdapter, orgId: string, memberId: string): Promise<string | null>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=seats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seats.d.ts","sourceRoot":"","sources":["../src/seats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAUjD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAa1C,6EAA6E;AAC7E,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,mDAAmD;AACnD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAEtB;AAED,mEAAmE;AACnE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB"}
|
package/dist/seats.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Per-member seat-type assignments, stored in the org's metadata via the adapter
|
|
2
|
+
// (no new database). A member's seat type decides which per-cycle token pack their
|
|
3
|
+
// usage draws (see createMeter). Absent an assignment, the meter falls back to the
|
|
4
|
+
// default user seat. Org-scoped writes — a consumer that wants a per-user admin
|
|
5
|
+
// gate checks adapter.isAdmin(orgId, userId) before calling.
|
|
6
|
+
const KEY = "seatAssignments"; // org metadata → JSON { [memberId]: seatType }
|
|
7
|
+
async function read(adapter, orgId) {
|
|
8
|
+
const md = (await adapter.getOrgMetadata?.(orgId)) ?? {};
|
|
9
|
+
const raw = md[KEY];
|
|
10
|
+
if (!raw)
|
|
11
|
+
return {};
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Assign a member to a seat type (pass null/"" to clear → default seat). */
|
|
20
|
+
export async function assignSeatType(adapter, orgId, memberId, seatType) {
|
|
21
|
+
const map = await read(adapter, orgId);
|
|
22
|
+
if (seatType == null || seatType === "")
|
|
23
|
+
delete map[memberId];
|
|
24
|
+
else
|
|
25
|
+
map[memberId] = seatType;
|
|
26
|
+
await adapter.setOrgMetadata?.(orgId, { [KEY]: JSON.stringify(map) });
|
|
27
|
+
}
|
|
28
|
+
/** The full member → seat-type map for the org. */
|
|
29
|
+
export async function listSeatAssignments(adapter, orgId) {
|
|
30
|
+
return read(adapter, orgId);
|
|
31
|
+
}
|
|
32
|
+
/** A single member's assigned seat type, or null if unassigned. */
|
|
33
|
+
export async function getSeatType(adapter, orgId, memberId) {
|
|
34
|
+
return (await read(adapter, orgId))[memberId] ?? null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=seats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seats.js","sourceRoot":"","sources":["../src/seats.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,mFAAmF;AACnF,mFAAmF;AACnF,gFAAgF;AAChF,6DAA6D;AAE7D,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,+CAA+C;AAI9E,KAAK,UAAU,IAAI,CAAC,OAAuB,EAAE,KAAa;IACxD,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,KAAa,EACb,QAAgB,EAChB,QAAuB;IAEvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;;QACzD,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IAC9B,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAuB,EACvB,KAAa;IAEb,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB,EACvB,KAAa,EACb,QAAgB;IAEhB,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { BillingAdapter, ResolvedConfig } from "../types.js";
|
|
3
|
+
import type { PlansConfig } from "../plans.js";
|
|
4
|
+
export declare function registerManagementTools(server: McpServer, adapter: BillingAdapter, _config: ResolvedConfig, opts?: {
|
|
5
|
+
plans?: PlansConfig;
|
|
6
|
+
}): void;
|
|
7
|
+
//# sourceMappingURL=management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"management.d.ts","sourceRoot":"","sources":["../../src/tools/management.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqB/C,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,WAAW,CAAA;CAAO,QAqInC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { enforceAccess } from "../auth.js";
|
|
3
|
+
import { getBillingCustomerId, usageSince, stripeConfigured } from "../billing.js";
|
|
4
|
+
import { requestTopUp, listTopUpRequests, approveTopUp, denyTopUp } from "../topup.js";
|
|
5
|
+
import { assignSeatType, listSeatAssignments } from "../seats.js";
|
|
6
|
+
function json(obj) {
|
|
7
|
+
return { content: [{ type: "text", text: JSON.stringify(obj, null, 2) }] };
|
|
8
|
+
}
|
|
9
|
+
function err(text) {
|
|
10
|
+
return { isError: true, content: [{ type: "text", text }] };
|
|
11
|
+
}
|
|
12
|
+
function monthStartUnix() {
|
|
13
|
+
const d = new Date();
|
|
14
|
+
return Math.floor(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1) / 1000);
|
|
15
|
+
}
|
|
16
|
+
function monthKey() {
|
|
17
|
+
const d = new Date();
|
|
18
|
+
return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}`;
|
|
19
|
+
}
|
|
20
|
+
// Workspace-management tools: usage read, per-member seat assignment, and the
|
|
21
|
+
// user-seat top-up request/approval flow. All ORG-SCOPED (auth = the org's key /
|
|
22
|
+
// session). Seat + top-up tools require the adapter's metadata methods; when they
|
|
23
|
+
// are absent (an adapter without an org-metadata store) only get_usage registers.
|
|
24
|
+
export function registerManagementTools(server, adapter, _config, opts = {}) {
|
|
25
|
+
server.tool("get_usage", `Get your workspace's token usage for the current cycle (summed from the Stripe
|
|
26
|
+
balance-transaction ledger). Optionally filter by caller (user/api) or look back a
|
|
27
|
+
number of days instead of the calendar month.`, {
|
|
28
|
+
caller_kind: z.enum(["user", "api"]).optional().describe("Only count usage by this caller kind"),
|
|
29
|
+
caller_id: z.string().optional().describe("Only count usage by this caller id (member or API-key id)"),
|
|
30
|
+
since_days: z.number().int().min(1).max(366).optional().describe("Look back this many days instead of the current calendar month"),
|
|
31
|
+
}, async ({ caller_kind, caller_id, since_days }) => {
|
|
32
|
+
const auth = await enforceAccess(adapter);
|
|
33
|
+
if ("isError" in auth)
|
|
34
|
+
return auth;
|
|
35
|
+
if (!stripeConfigured())
|
|
36
|
+
return err("Billing is not configured (STRIPE_SECRET_KEY unset).");
|
|
37
|
+
const cid = await getBillingCustomerId(adapter, auth.orgId);
|
|
38
|
+
if (!cid)
|
|
39
|
+
return json({ usage: 0, note: "No billing account yet." });
|
|
40
|
+
const since = since_days ? Math.floor(Date.now() / 1000) - since_days * 86400 : monthStartUnix();
|
|
41
|
+
const filter = caller_kind ? { callerKind: caller_kind, callerId: caller_id } : undefined;
|
|
42
|
+
const usage = await usageSince(cid, since, filter);
|
|
43
|
+
return json({ usage, since, cycle: monthKey(), filter: filter ?? null });
|
|
44
|
+
});
|
|
45
|
+
// The rest need an org-metadata store on the adapter.
|
|
46
|
+
if (!adapter.getOrgMetadata || !adapter.setOrgMetadata)
|
|
47
|
+
return;
|
|
48
|
+
// Union of seat-type keys across all plans, for validating assign_seat_type.
|
|
49
|
+
const knownSeatTypes = new Set();
|
|
50
|
+
for (const def of Object.values(opts.plans ?? {})) {
|
|
51
|
+
for (const t of Object.keys(def.seatTypes ?? {}))
|
|
52
|
+
knownSeatTypes.add(t);
|
|
53
|
+
}
|
|
54
|
+
server.tool("list_seats", `List the workspace's per-member seat-type assignments. Members without an entry
|
|
55
|
+
draw the default seat.`, {}, async () => {
|
|
56
|
+
const auth = await enforceAccess(adapter);
|
|
57
|
+
if ("isError" in auth)
|
|
58
|
+
return auth;
|
|
59
|
+
return json({
|
|
60
|
+
assignments: await listSeatAssignments(adapter, auth.orgId),
|
|
61
|
+
seat_types: [...knownSeatTypes],
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
server.tool("assign_seat_type", `Assign a workspace member to a seat type (e.g. standard, premium). The member's
|
|
65
|
+
usage then draws that seat's per-cycle token pack. Pass an empty seat_type to clear
|
|
66
|
+
the assignment (back to the default seat).`, {
|
|
67
|
+
member_id: z.string().describe("The member's user id"),
|
|
68
|
+
seat_type: z.string().optional().describe("Seat type key, or empty to clear"),
|
|
69
|
+
}, async ({ member_id, seat_type }) => {
|
|
70
|
+
const auth = await enforceAccess(adapter);
|
|
71
|
+
if ("isError" in auth)
|
|
72
|
+
return auth;
|
|
73
|
+
const st = seat_type && seat_type.length ? seat_type : null;
|
|
74
|
+
if (st && knownSeatTypes.size && !knownSeatTypes.has(st)) {
|
|
75
|
+
return err(`Unknown seat type "${st}". Known: ${[...knownSeatTypes].join(", ") || "(none configured)"}.`);
|
|
76
|
+
}
|
|
77
|
+
await assignSeatType(adapter, auth.orgId, member_id, st);
|
|
78
|
+
return json({ status: "ok", member_id, seat_type: st });
|
|
79
|
+
});
|
|
80
|
+
server.tool("list_top_up_requests", `List the workspace's token top-up requests (pending and handled) — the extra
|
|
81
|
+
allowance members have asked the owner to grant this cycle.`, {}, async () => {
|
|
82
|
+
const auth = await enforceAccess(adapter);
|
|
83
|
+
if ("isError" in auth)
|
|
84
|
+
return auth;
|
|
85
|
+
return json({ requests: await listTopUpRequests(adapter, auth.orgId) });
|
|
86
|
+
});
|
|
87
|
+
server.tool("request_top_up", `Request extra tokens for a member's seat this cycle (the owner approves with
|
|
88
|
+
approve_top_up). Use when a user seat has hit its per-cycle pack.`, {
|
|
89
|
+
member_id: z.string().describe("The member the extra allowance is for"),
|
|
90
|
+
amount: z.number().int().min(1).describe("Extra tokens requested (e.g. 25% of the seat pack)"),
|
|
91
|
+
cycle: z.string().optional().describe('Cycle key the grant applies to (default current "YYYY-MM")'),
|
|
92
|
+
}, async ({ member_id, amount, cycle }) => {
|
|
93
|
+
const auth = await enforceAccess(adapter);
|
|
94
|
+
if ("isError" in auth)
|
|
95
|
+
return auth;
|
|
96
|
+
const id = crypto.randomUUID();
|
|
97
|
+
const c = cycle ?? monthKey();
|
|
98
|
+
await requestTopUp(adapter, auth.orgId, {
|
|
99
|
+
id,
|
|
100
|
+
memberId: member_id,
|
|
101
|
+
amount,
|
|
102
|
+
cycle: c,
|
|
103
|
+
createdAt: new Date().toISOString(),
|
|
104
|
+
});
|
|
105
|
+
return json({ status: "requested", id, member_id, amount, cycle: c });
|
|
106
|
+
});
|
|
107
|
+
server.tool("approve_top_up", `Approve a pending top-up request → grants the requested extra tokens to that
|
|
108
|
+
member for the cycle (added on top of their seat pack by the meter).`, { request_id: z.string().describe("The request id from list_top_up_requests") }, async ({ request_id }) => {
|
|
109
|
+
const auth = await enforceAccess(adapter);
|
|
110
|
+
if ("isError" in auth)
|
|
111
|
+
return auth;
|
|
112
|
+
const r = await approveTopUp(adapter, auth.orgId, request_id);
|
|
113
|
+
if (!r.ok)
|
|
114
|
+
return err(`Request not found or already handled: ${request_id}`);
|
|
115
|
+
return json({ status: "approved", request_id });
|
|
116
|
+
});
|
|
117
|
+
server.tool("deny_top_up", `Deny a pending top-up request.`, { request_id: z.string().describe("The request id from list_top_up_requests") }, async ({ request_id }) => {
|
|
118
|
+
const auth = await enforceAccess(adapter);
|
|
119
|
+
if ("isError" in auth)
|
|
120
|
+
return auth;
|
|
121
|
+
const r = await denyTopUp(adapter, auth.orgId, request_id);
|
|
122
|
+
if (!r.ok)
|
|
123
|
+
return err(`Request not found or already handled: ${request_id}`);
|
|
124
|
+
return json({ status: "denied", request_id });
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=management.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"management.js","sourceRoot":"","sources":["../../src/tools/management.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/register.d.ts
CHANGED
|
@@ -16,5 +16,5 @@ export interface RegisterBillingToolsOptions {
|
|
|
16
16
|
defaultPlan?: string;
|
|
17
17
|
}
|
|
18
18
|
export declare function registerBillingTools(server: McpServer, opts: RegisterBillingToolsOptions): void;
|
|
19
|
-
export declare const BILLING_TOOL_NAMES: readonly ["get_api_key", "list_api_keys", "revoke_api_key", "get_token_balance", "buy_tokens", "set_auto_reload", "get_billing_portal", "list_invoices"];
|
|
19
|
+
export declare const BILLING_TOOL_NAMES: readonly ["get_api_key", "list_api_keys", "revoke_api_key", "get_token_balance", "buy_tokens", "set_auto_reload", "get_billing_portal", "list_invoices", "get_usage", "list_seats", "assign_seat_type", "list_top_up_requests", "request_top_up", "approve_top_up", "deny_top_up"];
|
|
20
20
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjE,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAyB5D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,QAkBpD;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;+EAC2E;IAC3E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,QAOxF;AAiCD,eAAO,MAAM,kBAAkB,oRAiBrB,CAAC"}
|
package/dist/tools/register.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolveConfig } from "../types.js";
|
|
2
2
|
import { registerKeyTools } from "./keys.js";
|
|
3
3
|
import { registerBillingOnlyTools } from "./billing.js";
|
|
4
|
+
import { registerManagementTools } from "./management.js";
|
|
4
5
|
import { ensurePlans } from "../plans.js";
|
|
5
6
|
// Keys whose values must never hit the logs (magic-auth codes, API keys, etc.).
|
|
6
7
|
const SENSITIVE_KEY_RE = /cookie|token|secret|password|passwd|authorization|api[_-]?key|session|credential|code/i;
|
|
@@ -52,6 +53,7 @@ export function registerBillingTools(server, opts) {
|
|
|
52
53
|
installInputLogging(server);
|
|
53
54
|
registerKeyTools(server, opts.adapter, config);
|
|
54
55
|
registerBillingOnlyTools(server, opts.adapter, config, opts.toolCosts ?? {});
|
|
56
|
+
registerManagementTools(server, opts.adapter, config, { plans: opts.plans });
|
|
55
57
|
if (opts.plans)
|
|
56
58
|
registerPlanTools(server, opts.plans, opts.defaultPlan, config.currency);
|
|
57
59
|
}
|
|
@@ -83,5 +85,13 @@ export const BILLING_TOOL_NAMES = [
|
|
|
83
85
|
"set_auto_reload",
|
|
84
86
|
"get_billing_portal",
|
|
85
87
|
"list_invoices",
|
|
88
|
+
// Workspace-management tools (registerManagementTools).
|
|
89
|
+
"get_usage",
|
|
90
|
+
"list_seats",
|
|
91
|
+
"assign_seat_type",
|
|
92
|
+
"list_top_up_requests",
|
|
93
|
+
"request_top_up",
|
|
94
|
+
"approve_top_up",
|
|
95
|
+
"deny_top_up",
|
|
86
96
|
];
|
|
87
97
|
//# sourceMappingURL=register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"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"}
|
package/dist/topup.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BillingAdapter
|
|
1
|
+
import type { BillingAdapter } from "./types.js";
|
|
2
2
|
export interface TopUpRequest {
|
|
3
3
|
id: string;
|
|
4
4
|
memberId: string;
|
|
@@ -16,28 +16,18 @@ export declare function requestTopUp(adapter: BillingAdapter, orgId: string, req
|
|
|
16
16
|
createdAt: string;
|
|
17
17
|
}): Promise<void>;
|
|
18
18
|
export declare function listTopUpRequests(adapter: BillingAdapter, orgId: string): Promise<TopUpRequest[]>;
|
|
19
|
-
/**
|
|
20
|
-
|
|
19
|
+
/** Approve a request → adds its amount to the member's cycle grant. Org-scoped;
|
|
20
|
+
* gate on adapter.isAdmin(orgId, userId) upstream if you need a per-user check. */
|
|
21
|
+
export declare function approveTopUp(adapter: BillingAdapter, orgId: string, requestId: string): Promise<{
|
|
21
22
|
ok: boolean;
|
|
22
|
-
reason?: "
|
|
23
|
+
reason?: "not_found";
|
|
23
24
|
}>;
|
|
24
|
-
export declare function denyTopUp(adapter: BillingAdapter, orgId: string,
|
|
25
|
+
export declare function denyTopUp(adapter: BillingAdapter, orgId: string, requestId: string): Promise<{
|
|
25
26
|
ok: boolean;
|
|
26
|
-
reason?: "
|
|
27
|
+
reason?: "not_found";
|
|
27
28
|
}>;
|
|
28
29
|
/** A member's approved extra allowance for a cycle. The consumer reads this and
|
|
29
30
|
* passes it into `meterUsage` as `extraAllowance` so the meter adds it to the
|
|
30
31
|
* seat pack. */
|
|
31
32
|
export declare function extraAllowance(adapter: BillingAdapter, orgId: string, memberId: string, cycle: string): Promise<number>;
|
|
32
|
-
/** Enable/disable auto-top-up (auto-reload) for the shared reserve — admin only.
|
|
33
|
-
* The card itself is added via the Stripe billing portal / a saved payment
|
|
34
|
-
* method; this just sets the reload threshold + target. */
|
|
35
|
-
export declare function setAutoTopUp(adapter: BillingAdapter, _config: ResolvedConfig, orgId: string, actingUserId: string, opts: {
|
|
36
|
-
threshold: number;
|
|
37
|
-
reloadTo: number;
|
|
38
|
-
enabled: boolean;
|
|
39
|
-
}): Promise<{
|
|
40
|
-
ok: boolean;
|
|
41
|
-
reason?: "forbidden" | "no_billing";
|
|
42
|
-
}>;
|
|
43
33
|
//# sourceMappingURL=topup.d.ts.map
|
package/dist/topup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topup.d.ts","sourceRoot":"","sources":["../src/topup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"topup.d.ts","sourceRoot":"","sources":["../src/topup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAmBD,+EAA+E;AAC/E,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtF,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAEvG;AAED;oFACoF;AACpF,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,CAWhD;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,CAOhD;AAED;;iBAEiB;AACjB,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
package/dist/topup.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
1
|
+
// Top-up requests, stored entirely in the org's metadata via the adapter (no new
|
|
2
|
+
// database): a user-seat over its cap requests extra tokens → an owner approves →
|
|
3
|
+
// a per-member EXTRA ALLOWANCE for the current cycle that the meter adds on top of
|
|
4
|
+
// the seat pack. Actions are ORG-SCOPED (the caller already holds an org key /
|
|
5
|
+
// authenticated session); a consumer that wants a per-user admin gate on approval
|
|
6
|
+
// checks adapter.isAdmin(orgId, userId) itself before calling. Auto-top-up for the
|
|
7
|
+
// shared reserve is just `setAutoReloadSettings` (the set_auto_reload tool).
|
|
7
8
|
const REQUESTS_KEY = "topUpRequests"; // org metadata → JSON TopUpRequest[]
|
|
8
9
|
const GRANTS_KEY = "topUpGrants"; // org metadata → JSON { [memberId]: { [cycle]: tokens } }
|
|
9
10
|
const MAX_STORED_REQUESTS = 50;
|
|
@@ -31,10 +32,9 @@ export async function requestTopUp(adapter, orgId, req) {
|
|
|
31
32
|
export async function listTopUpRequests(adapter, orgId) {
|
|
32
33
|
return readJson(adapter, orgId, REQUESTS_KEY, []);
|
|
33
34
|
}
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return { ok: false, reason: "forbidden" };
|
|
35
|
+
/** Approve a request → adds its amount to the member's cycle grant. Org-scoped;
|
|
36
|
+
* gate on adapter.isAdmin(orgId, userId) upstream if you need a per-user check. */
|
|
37
|
+
export async function approveTopUp(adapter, orgId, requestId) {
|
|
38
38
|
const list = await readJson(adapter, orgId, REQUESTS_KEY, []);
|
|
39
39
|
const req = list.find((r) => r.id === requestId);
|
|
40
40
|
if (!req || req.status !== "pending")
|
|
@@ -47,9 +47,7 @@ export async function approveTopUp(adapter, orgId, actingUserId, requestId) {
|
|
|
47
47
|
await writeJson(adapter, orgId, GRANTS_KEY, grants);
|
|
48
48
|
return { ok: true };
|
|
49
49
|
}
|
|
50
|
-
export async function denyTopUp(adapter, orgId,
|
|
51
|
-
if (!(await adapter.isAdmin?.(orgId, actingUserId)))
|
|
52
|
-
return { ok: false, reason: "forbidden" };
|
|
50
|
+
export async function denyTopUp(adapter, orgId, requestId) {
|
|
53
51
|
const list = await readJson(adapter, orgId, REQUESTS_KEY, []);
|
|
54
52
|
const req = list.find((r) => r.id === requestId);
|
|
55
53
|
if (!req || req.status !== "pending")
|
|
@@ -65,16 +63,4 @@ export async function extraAllowance(adapter, orgId, memberId, cycle) {
|
|
|
65
63
|
const grants = await readJson(adapter, orgId, GRANTS_KEY, {});
|
|
66
64
|
return grants[memberId]?.[cycle] ?? 0;
|
|
67
65
|
}
|
|
68
|
-
/** Enable/disable auto-top-up (auto-reload) for the shared reserve — admin only.
|
|
69
|
-
* The card itself is added via the Stripe billing portal / a saved payment
|
|
70
|
-
* method; this just sets the reload threshold + target. */
|
|
71
|
-
export async function setAutoTopUp(adapter, _config, orgId, actingUserId, opts) {
|
|
72
|
-
if (!(await adapter.isAdmin?.(orgId, actingUserId)))
|
|
73
|
-
return { ok: false, reason: "forbidden" };
|
|
74
|
-
const customerId = await getBillingCustomerId(adapter, orgId);
|
|
75
|
-
if (!customerId)
|
|
76
|
-
return { ok: false, reason: "no_billing" };
|
|
77
|
-
await setAutoReloadSettings(customerId, opts.threshold, opts.reloadTo, opts.enabled);
|
|
78
|
-
return { ok: true };
|
|
79
|
-
}
|
|
80
66
|
//# sourceMappingURL=topup.js.map
|
package/dist/topup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topup.js","sourceRoot":"","sources":["../src/topup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"topup.js","sourceRoot":"","sources":["../src/topup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arnaudjnn/billing-tools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "The get-paid engine for Stripe + WorkOS apps, for humans and AI agents. Drop-in API-key auth, token/credit + subscription billing, auth.md agent registration, and MPP machine payments, as MCP tools, a REST API, and a CLI. Framework-agnostic, storage-pluggable.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Arnaud Jeannin",
|