@arnaudjnn/billing-tools 21.7.0 → 22.0.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 (58) hide show
  1. package/dist/alerts.d.ts +53 -0
  2. package/dist/alerts.d.ts.map +1 -0
  3. package/dist/alerts.js +181 -0
  4. package/dist/alerts.js.map +1 -0
  5. package/dist/allowance.d.ts +9 -0
  6. package/dist/allowance.d.ts.map +1 -1
  7. package/dist/allowance.js +2 -1
  8. package/dist/allowance.js.map +1 -1
  9. package/dist/auth.d.ts +49 -1
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +62 -3
  12. package/dist/auth.js.map +1 -1
  13. package/dist/billing.d.ts +49 -0
  14. package/dist/billing.d.ts.map +1 -1
  15. package/dist/billing.js +82 -0
  16. package/dist/billing.js.map +1 -1
  17. package/dist/bound-api.d.ts +28 -0
  18. package/dist/bound-api.d.ts.map +1 -1
  19. package/dist/bound-api.js +15 -0
  20. package/dist/bound-api.js.map +1 -1
  21. package/dist/cli/commands.d.ts.map +1 -1
  22. package/dist/cli/commands.js +51 -0
  23. package/dist/cli/commands.js.map +1 -1
  24. package/dist/create-billing.d.ts +27 -0
  25. package/dist/create-billing.d.ts.map +1 -1
  26. package/dist/create-billing.js +5 -0
  27. package/dist/create-billing.js.map +1 -1
  28. package/dist/credit-quotes.d.ts +102 -0
  29. package/dist/credit-quotes.d.ts.map +1 -0
  30. package/dist/credit-quotes.js +119 -0
  31. package/dist/credit-quotes.js.map +1 -0
  32. package/dist/entries/tools.d.ts +1 -0
  33. package/dist/entries/tools.d.ts.map +1 -1
  34. package/dist/entries/tools.js +1 -0
  35. package/dist/entries/tools.js.map +1 -1
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +10 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/metering.d.ts +9 -0
  41. package/dist/metering.d.ts.map +1 -1
  42. package/dist/metering.js +17 -0
  43. package/dist/metering.js.map +1 -1
  44. package/dist/notifications/index.d.ts +32 -1
  45. package/dist/notifications/index.d.ts.map +1 -1
  46. package/dist/notifications/index.js.map +1 -1
  47. package/dist/routes/rest.d.ts.map +1 -1
  48. package/dist/routes/rest.js +7 -1
  49. package/dist/routes/rest.js.map +1 -1
  50. package/dist/tools/quotes.d.ts +9 -0
  51. package/dist/tools/quotes.d.ts.map +1 -0
  52. package/dist/tools/quotes.js +154 -0
  53. package/dist/tools/quotes.js.map +1 -0
  54. package/dist/tools/register.d.ts +1 -1
  55. package/dist/tools/register.d.ts.map +1 -1
  56. package/dist/tools/register.js +11 -0
  57. package/dist/tools/register.js.map +1 -1
  58. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ import type { AllowanceState } from "./allowance.js";
2
+ import type { Notify } from "./notifications/index.js";
3
+ import type { BillingAdapter } from "./types.js";
4
+ /** Where a threshold was crossed. `key` is stable, and is what dedupe is keyed on. */
5
+ export interface AlertCrossing {
6
+ key: "pack" | "pool" | "spend";
7
+ scope: "member" | "org";
8
+ threshold: number;
9
+ unit: "percent" | "credits";
10
+ every: string;
11
+ label: string | null;
12
+ used: number;
13
+ limit: number;
14
+ percent: number;
15
+ }
16
+ export declare const DEFAULT_ALERT_THRESHOLDS: readonly [80, 100];
17
+ /**
18
+ * Which thresholds this state is AT, highest first — pure, and knows nothing about what has
19
+ * already been sent.
20
+ *
21
+ * Highest first because only the top one is worth an email: crossing 80 and 100 in the same
22
+ * call is one piece of news ("you are out"), not two.
23
+ */
24
+ export declare function crossings(state: Pick<AllowanceState, "pack" | "pool" | "limits">, thresholds?: readonly number[]): AlertCrossing[];
25
+ /**
26
+ * Filter to the crossings nobody has been told about, and record them.
27
+ *
28
+ * Read-modify-write, and NOT transactional — two concurrent calls can both decide to send.
29
+ * That is deliberate and safe: every notification carries a derived id
30
+ * (`alert:<org>:<cycle>:<key>:<threshold>`), so a receiver deduping on it turns the race
31
+ * into one email. Locking a metered call to avoid a rare duplicate would be the wrong trade
32
+ * by a wide margin.
33
+ */
34
+ export declare function claimCrossings(adapter: BillingAdapter, input: {
35
+ orgId: string;
36
+ memberId?: string | null;
37
+ cycleKey: string;
38
+ crossings: AlertCrossing[];
39
+ }): Promise<AlertCrossing[]>;
40
+ /**
41
+ * The whole thing, as the meter calls it: notice, claim, say. Never awaited by the caller.
42
+ *
43
+ * Failures are swallowed here rather than at the meter, for the reason every notification
44
+ * follows: the call this describes already happened and was already charged.
45
+ */
46
+ export declare function maybeAlert(adapter: BillingAdapter, notify: Notify | undefined, input: {
47
+ orgId: string;
48
+ memberId?: string | null;
49
+ cycleKey: string;
50
+ state: Pick<AllowanceState, "pack" | "pool" | "limits">;
51
+ thresholds?: readonly number[];
52
+ }): void;
53
+ //# sourceMappingURL=alerts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../src/alerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsBjD,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/B,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB,oBAAqB,CAAC;AAK3D;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,EACvD,UAAU,GAAE,SAAS,MAAM,EAA6B,GACvD,aAAa,EAAE,CAkDjB;AA8BD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,aAAa,EAAE,CAAA;CAAE,GAC/F,OAAO,CAAC,aAAa,EAAE,CAAC,CAW1B;AAkDD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GACA,IAAI,CAoCN"}
package/dist/alerts.js ADDED
@@ -0,0 +1,181 @@
1
+ export const DEFAULT_ALERT_THRESHOLDS = [80, 100];
2
+ const pct = (used, size) => size <= 0 ? 100 : Math.min(100, Math.max(0, Math.round((used / size) * 100)));
3
+ /**
4
+ * Which thresholds this state is AT, highest first — pure, and knows nothing about what has
5
+ * already been sent.
6
+ *
7
+ * Highest first because only the top one is worth an email: crossing 80 and 100 in the same
8
+ * call is one piece of news ("you are out"), not two.
9
+ */
10
+ export function crossings(state, thresholds = DEFAULT_ALERT_THRESHOLDS) {
11
+ const levels = [...thresholds].sort((a, b) => b - a);
12
+ const out = [];
13
+ const allowance = (key, scope, w) => {
14
+ if (!w || w.size <= 0)
15
+ return;
16
+ const percent = pct(w.used, w.size);
17
+ const hit = levels.find((t) => percent >= t);
18
+ if (hit == null)
19
+ return;
20
+ out.push({
21
+ key,
22
+ scope,
23
+ threshold: hit,
24
+ unit: "percent",
25
+ every: "cycle",
26
+ label: null,
27
+ used: w.used,
28
+ limit: w.size,
29
+ percent,
30
+ });
31
+ };
32
+ allowance("pack", "member", state.pack);
33
+ allowance("pool", "org", state.pool);
34
+ // The customer's own ceiling, at the figures the customer chose.
35
+ const spend = (state.limits ?? []).find((l) => l.kind === "spend");
36
+ if (spend && spend.size > 0) {
37
+ const chosen = [...(spend.alertsAt ?? [])].sort((a, b) => b - a);
38
+ const hit = chosen.find((credits) => spend.used >= credits);
39
+ if (hit != null) {
40
+ out.push({
41
+ key: "spend",
42
+ scope: "org",
43
+ threshold: hit,
44
+ unit: "credits",
45
+ every: spend.every,
46
+ label: spend.label,
47
+ used: spend.used,
48
+ limit: spend.size,
49
+ percent: pct(spend.used, spend.size),
50
+ });
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ // ── What has already been said ───────────────────────────────────────────────
56
+ //
57
+ // One record per subject per cycle, holding only the HIGHEST threshold announced. That is
58
+ // the whole state: "already told them about 80" answers both "tell them about 80 again?"
59
+ // (no) and "tell them about 100?" (yes). A list of everything ever sent would grow without
60
+ // bound inside a metadata value measured in hundreds of characters.
61
+ //
62
+ // Bounded by construction: the current cycle only. A new cycle replaces the record rather
63
+ // than appending to it, because an allowance that reset has nothing to say about the last
64
+ // one — which is also what makes the alerts fire again next month, as they should.
65
+ const ORG_KEY = "btAlerts";
66
+ const MEMBER_KEY = "btAlerts";
67
+ /** Same ceiling `topup.ts` respects, for the same WorkOS reason. */
68
+ const ORGS_PER_MEMBER = 3;
69
+ function parse(raw) {
70
+ if (!raw)
71
+ return {};
72
+ try {
73
+ const v = JSON.parse(raw);
74
+ return v && typeof v === "object" ? v : {};
75
+ }
76
+ catch {
77
+ return {};
78
+ }
79
+ }
80
+ /**
81
+ * Filter to the crossings nobody has been told about, and record them.
82
+ *
83
+ * Read-modify-write, and NOT transactional — two concurrent calls can both decide to send.
84
+ * That is deliberate and safe: every notification carries a derived id
85
+ * (`alert:<org>:<cycle>:<key>:<threshold>`), so a receiver deduping on it turns the race
86
+ * into one email. Locking a metered call to avoid a rare duplicate would be the wrong trade
87
+ * by a wide margin.
88
+ */
89
+ export async function claimCrossings(adapter, input) {
90
+ const org = input.crossings.filter((c) => c.scope === "org");
91
+ const member = input.crossings.filter((c) => c.scope === "member");
92
+ const [orgFresh, memberFresh] = await Promise.all([
93
+ org.length ? claimOrg(adapter, input.orgId, input.cycleKey, org) : Promise.resolve([]),
94
+ member.length && input.memberId
95
+ ? claimMember(adapter, input.orgId, input.memberId, input.cycleKey, member)
96
+ : Promise.resolve([]),
97
+ ]);
98
+ return [...orgFresh, ...memberFresh];
99
+ }
100
+ async function claimOrg(adapter, orgId, cycleKey, want) {
101
+ if (!adapter.getOrgMetadata || !adapter.setOrgMetadata)
102
+ return want;
103
+ const md = (await adapter.getOrgMetadata(orgId)) ?? {};
104
+ const current = parse(md[ORG_KEY])[orgId];
105
+ const sent = current?.c === cycleKey ? current.w : {};
106
+ const fresh = want.filter((c) => (sent[c.key] ?? -1) < c.threshold);
107
+ if (!fresh.length)
108
+ return [];
109
+ const next = { c: cycleKey, w: { ...sent } };
110
+ for (const c of fresh)
111
+ next.w[c.key] = c.threshold;
112
+ await adapter.setOrgMetadata(orgId, { [ORG_KEY]: JSON.stringify({ [orgId]: next }) });
113
+ return fresh;
114
+ }
115
+ async function claimMember(adapter, orgId, memberId, cycleKey, want) {
116
+ // An adapter with no per-member store cannot remember what it said, and repeating an
117
+ // alert every call would be worse than not sending it. The receiver's dedupe on the id
118
+ // still holds the line for a deployment that wants them anyway.
119
+ if (!adapter.getUserMetadata || !adapter.setUserMetadata)
120
+ return [];
121
+ const md = (await adapter.getUserMetadata(memberId)) ?? {};
122
+ const all = parse(md[MEMBER_KEY]);
123
+ const current = all[orgId];
124
+ const sent = current?.c === cycleKey ? current.w : {};
125
+ const fresh = want.filter((c) => (sent[c.key] ?? -1) < c.threshold);
126
+ if (!fresh.length)
127
+ return [];
128
+ const next = { c: cycleKey, w: { ...sent } };
129
+ for (const c of fresh)
130
+ next.w[c.key] = c.threshold;
131
+ // Oldest orgs shed first, the same discipline the grants store follows: one member of
132
+ // many workspaces must not be able to overflow a value every one of them writes to.
133
+ const entries = Object.entries({ ...all, [orgId]: next });
134
+ const kept = entries.slice(Math.max(0, entries.length - ORGS_PER_MEMBER));
135
+ await adapter.setUserMetadata(memberId, { [MEMBER_KEY]: JSON.stringify(Object.fromEntries(kept)) });
136
+ return fresh;
137
+ }
138
+ /**
139
+ * The whole thing, as the meter calls it: notice, claim, say. Never awaited by the caller.
140
+ *
141
+ * Failures are swallowed here rather than at the meter, for the reason every notification
142
+ * follows: the call this describes already happened and was already charged.
143
+ */
144
+ export function maybeAlert(adapter, notify, input) {
145
+ if (!notify)
146
+ return;
147
+ const at = crossings(input.state, input.thresholds);
148
+ if (!at.length)
149
+ return;
150
+ void claimCrossings(adapter, { ...input, crossings: at })
151
+ .then((fresh) => {
152
+ for (const c of fresh) {
153
+ notify({
154
+ id: `alert:${input.orgId}:${input.cycleKey}:${c.key}:${c.threshold}`,
155
+ type: "usage.threshold",
156
+ orgId: input.orgId,
157
+ to: [],
158
+ audience: c.scope === "member" && input.memberId
159
+ ? { kind: "member", memberId: input.memberId }
160
+ : { kind: "admins" },
161
+ data: {
162
+ scope: c.scope,
163
+ member: c.scope === "member" && input.memberId ? { id: input.memberId, email: null } : null,
164
+ window: {
165
+ every: c.every,
166
+ label: c.label,
167
+ used: c.used,
168
+ limit: c.limit,
169
+ percent: c.percent,
170
+ },
171
+ threshold: c.threshold,
172
+ unit: c.unit,
173
+ },
174
+ });
175
+ }
176
+ })
177
+ .catch(() => {
178
+ // Alerting is the least important thing happening on this call.
179
+ });
180
+ }
181
+ //# sourceMappingURL=alerts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.js","sourceRoot":"","sources":["../src/alerts.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,15 @@ export interface LimitState {
28
28
  * why this is a field on one shape rather than a second kind of limit.
29
29
  */
30
30
  kind?: "rate" | "spend";
31
+ /**
32
+ * The credit figures the CUSTOMER asked to be warned at (`setSpendControls`).
33
+ *
34
+ * Only on the `spend` limit, because only that one is theirs. It comes off the customer
35
+ * object this read already retrieves, so carrying it costs nothing — and it was being
36
+ * dropped, which is why a billing page could offer "warn me at 10 000" and nothing
37
+ * anywhere ever looked at the answer.
38
+ */
39
+ alertsAt?: number[];
31
40
  }
32
41
  export interface AllowanceState {
33
42
  plan: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"allowance.d.ts","sourceRoot":"","sources":["../src/allowance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"allowance.d.ts","sourceRoot":"","sources":["../src/allowance.ts"],"names":[],"mappings":"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"}
package/dist/allowance.js CHANGED
@@ -152,7 +152,7 @@ export async function resolveAllowance(adapter, config, input) {
152
152
  ? Promise.resolve([])
153
153
  : customerPromise
154
154
  .then((c) => getSpendControls(customerId, c))
155
- .then(({ limitCredits }) => {
155
+ .then(({ limitCredits, alertCredits }) => {
156
156
  // The deployment's default when the customer named none. This is what makes a
157
157
  // configured ceiling a REAL one: the previous arrangement had a consumer persist
158
158
  // the default on first read of its billing page, so a workspace nobody had opened
@@ -181,6 +181,7 @@ export async function resolveAllowance(adapter, config, input) {
181
181
  remaining: Math.max(0, ceiling - used),
182
182
  window,
183
183
  kind: "spend",
184
+ ...(alertCredits?.length ? { alertsAt: alertCredits } : {}),
184
185
  },
185
186
  ]);
186
187
  });
@@ -1 +1 @@
1
- {"version":3,"file":"allowance.js","sourceRoot":"","sources":["../src/allowance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"allowance.js","sourceRoot":"","sources":["../src/allowance.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts CHANGED
@@ -15,14 +15,32 @@ export interface Principal {
15
15
  userId: string;
16
16
  /** Pre-resolved role, when the caller already knows it — skips the lookup. */
17
17
  isAdmin?: boolean;
18
+ /**
19
+ * Their address, when the surface knows it.
20
+ *
21
+ * Only `enforceOperator` reads it, and it has to: a platform operator is identified by
22
+ * WHO THEY ARE across every workspace, not by a role inside one — an operator answering a
23
+ * customer's quote is typically not a member of that customer's workspace at all.
24
+ */
25
+ email?: string;
18
26
  }
19
27
  interface AuthStore {
20
28
  authHeader: string | null;
29
+ /**
30
+ * A platform-operator credential presented by a machine (`X-Operator-Token`).
31
+ *
32
+ * Separate from `authHeader` because it answers a different question: that one says which
33
+ * WORKSPACE is calling, this says the caller acts for the deployment itself. An agent
34
+ * doing operator work holds both — its own workspace key, and this.
35
+ */
36
+ operatorToken?: string;
21
37
  orgId?: string;
22
38
  principal?: Principal;
23
39
  }
24
40
  export declare const authContext: AsyncLocalStorage<AuthStore>;
25
- export declare function runWithAuth<T>(header: string | null, fn: () => T): T;
41
+ export declare function runWithAuth<T>(header: string | null, fn: () => T, extra?: {
42
+ operatorToken?: string;
43
+ }): T;
26
44
  export declare function runWithResolvedOrg<T>(header: string | null, orgId: string, fn: () => T): T;
27
45
  /** Run with a known caller, so admin-only tools can check their role. Use this
28
46
  * from a session-backed surface (a server action, an OAuth token carrying a
@@ -31,9 +49,39 @@ export declare function runWithPrincipal<T>(ctx: {
31
49
  authHeader?: string | null;
32
50
  orgId?: string;
33
51
  principal: Principal;
52
+ operatorToken?: string;
34
53
  }, fn: () => T): T;
35
54
  /** The caller, if this surface established one. */
36
55
  export declare function currentPrincipal(): Principal | null;
56
+ /** The machine operator credential this call presented, if any. */
57
+ export declare function currentOperatorToken(): string | null;
58
+ /**
59
+ * Who the deployment lets sell at a negotiated price.
60
+ *
61
+ * `BILLING_OPERATOR_EMAILS` (comma-separated) plus `BILLING_OPERATOR_TOKEN` for a machine.
62
+ * Read at call time rather than at boot so rotating either needs a restart of nothing.
63
+ */
64
+ export declare function operatorConfig(): {
65
+ emails: string[];
66
+ token: string | null;
67
+ };
68
+ /**
69
+ * The platform's own staff — and the ONE gate in this library that fails CLOSED.
70
+ *
71
+ * Everywhere else, an unanswerable question allows: `enforceAdmin` lets an org API key
72
+ * through because that credential has no user behind it, and an adapter that cannot report
73
+ * roles must not lock every admin tool. Both are the right trade when the thing being
74
+ * prevented is smaller than the thing being broken.
75
+ *
76
+ * Here it is the other way round. This gate stands between a customer and their own
77
+ * discount: "unknown allows" would mean any workspace key could approve the price its own
78
+ * admin just asked for, which is not a permission that should exist at any level of doubt.
79
+ * So a caller who cannot be identified as an operator is refused, and a deployment that has
80
+ * configured no operators has nobody who can approve — which is correct, and says so.
81
+ */
82
+ export declare function enforceOperator(action: string): {
83
+ authorized: true;
84
+ } | ToolErrorResult;
37
85
  export declare function enforceAccess(adapter: BillingAdapter): Promise<{
38
86
  authorized: true;
39
87
  orgId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlF;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,eAAO,MAAM,WAAW,8BAAqC,CAAC;AAE9D,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEpE;AAGD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE1F;AAED;;iEAEiE;AACjE,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,GAAG,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,EACzE,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAKH;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,IAAI,SAAS,GAAG,IAAI,CAEnD;AAKD,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAAC,CAyBhE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,GAAG,eAAe,CAAC,CAsB7F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAejC;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,OAAO,CAAC,CAKlB;AAKD,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA2BjC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/auth.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { getBillingCustomerId, getCreditBalance, deductCredits, autoReloadFor, stripeConfigured, } from "./billing.js";
3
3
  export const authContext = new AsyncLocalStorage();
4
- export function runWithAuth(header, fn) {
5
- return authContext.run({ authHeader: header }, fn);
4
+ export function runWithAuth(header, fn, extra) {
5
+ return authContext.run({ authHeader: header, ...extra }, fn);
6
6
  }
7
7
  // Used by the MCP transport's OAuth path: run with a pre-resolved org.
8
8
  export function runWithResolvedOrg(header, orgId, fn) {
@@ -12,12 +12,71 @@ export function runWithResolvedOrg(header, orgId, fn) {
12
12
  * from a session-backed surface (a server action, an OAuth token carrying a
13
13
  * user). The org may be pre-resolved or left to the API key. */
14
14
  export function runWithPrincipal(ctx, fn) {
15
- return authContext.run({ authHeader: ctx.authHeader ?? null, orgId: ctx.orgId, principal: ctx.principal }, fn);
15
+ return authContext.run({
16
+ authHeader: ctx.authHeader ?? null,
17
+ orgId: ctx.orgId,
18
+ principal: ctx.principal,
19
+ operatorToken: ctx.operatorToken,
20
+ }, fn);
16
21
  }
17
22
  /** The caller, if this surface established one. */
18
23
  export function currentPrincipal() {
19
24
  return authContext.getStore()?.principal ?? null;
20
25
  }
26
+ /** The machine operator credential this call presented, if any. */
27
+ export function currentOperatorToken() {
28
+ return authContext.getStore()?.operatorToken ?? null;
29
+ }
30
+ /**
31
+ * Who the deployment lets sell at a negotiated price.
32
+ *
33
+ * `BILLING_OPERATOR_EMAILS` (comma-separated) plus `BILLING_OPERATOR_TOKEN` for a machine.
34
+ * Read at call time rather than at boot so rotating either needs a restart of nothing.
35
+ */
36
+ export function operatorConfig() {
37
+ return {
38
+ emails: (process.env.BILLING_OPERATOR_EMAILS ?? "")
39
+ .split(",")
40
+ .map((e) => e.trim().toLowerCase())
41
+ .filter(Boolean),
42
+ token: process.env.BILLING_OPERATOR_TOKEN?.trim() || null,
43
+ };
44
+ }
45
+ /**
46
+ * The platform's own staff — and the ONE gate in this library that fails CLOSED.
47
+ *
48
+ * Everywhere else, an unanswerable question allows: `enforceAdmin` lets an org API key
49
+ * through because that credential has no user behind it, and an adapter that cannot report
50
+ * roles must not lock every admin tool. Both are the right trade when the thing being
51
+ * prevented is smaller than the thing being broken.
52
+ *
53
+ * Here it is the other way round. This gate stands between a customer and their own
54
+ * discount: "unknown allows" would mean any workspace key could approve the price its own
55
+ * admin just asked for, which is not a permission that should exist at any level of doubt.
56
+ * So a caller who cannot be identified as an operator is refused, and a deployment that has
57
+ * configured no operators has nobody who can approve — which is correct, and says so.
58
+ */
59
+ export function enforceOperator(action) {
60
+ const { emails, token } = operatorConfig();
61
+ const presented = currentOperatorToken();
62
+ const email = currentPrincipal()?.email?.trim().toLowerCase();
63
+ const byToken = Boolean(token && presented && presented === token);
64
+ const byEmail = Boolean(email && emails.includes(email));
65
+ if (byToken || byEmail)
66
+ return { authorized: true };
67
+ return {
68
+ isError: true,
69
+ content: [
70
+ {
71
+ type: "text",
72
+ text: `Forbidden (403): ${action} is a platform-operator action. ` +
73
+ (emails.length || token
74
+ ? "Sign in as an operator, or present X-Operator-Token."
75
+ : "This deployment has configured no operators (BILLING_OPERATOR_EMAILS)."),
76
+ },
77
+ ],
78
+ };
79
+ }
21
80
  // Resolve the caller's org from the Bearer API key (via the adapter). Returns
22
81
  // the org id or a parseable 401 envelope (REST/MCP layers sniff "Unauthorized
23
82
  // (401)" to map to HTTP 401 + WWW-Authenticate).
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/billing.d.ts CHANGED
@@ -255,6 +255,55 @@ export type PurchaseResult = {
255
255
  reason: "no_card" | "no_email" | "charge_failed";
256
256
  message: string;
257
257
  };
258
+ /**
259
+ * Sell credits at a price that is not the list price.
260
+ *
261
+ * The one thing no other path here can do. Everywhere else `credits` IS the money —
262
+ * `CREDITS_PER_UNIT = 100` makes them the same number, deliberately, so a customer typing an
263
+ * amount and an agent calling `buy_credits` cannot be quoted differently. A negotiated deal
264
+ * is precisely the case where they must differ: 600 000 credits for €4 000 is the whole
265
+ * point of an Enterprise conversation, and until now the library could describe that plan and
266
+ * not sell it.
267
+ *
268
+ * So the two numbers are separated HERE and nowhere else, behind an operator gate, and only
269
+ * as an INVOICE:
270
+ *
271
+ * • The invoice item carries `amountMinor` — what they agreed to pay.
272
+ * • `metadata.credits` carries the quantity — what they agreed to get.
273
+ * • Paying it credits the wallet through the `invoice.paid` branch that already exists,
274
+ * with the `credit:invoice:<id>` key it already uses.
275
+ *
276
+ * That last point is why this is not a grant. There is no second crediting path to keep in
277
+ * step with the first, an unpaid quote hands over nothing, and a refund reverses through the
278
+ * same machinery as any other invoice.
279
+ */
280
+ export declare function sellCredits(stripeCustomerId: string, orgId: string, input: {
281
+ /** What they get. */
282
+ credits: number;
283
+ /** What they pay, in minor units of `currency`. Deliberately unrelated to `credits`. */
284
+ amountMinor: number;
285
+ currency?: string;
286
+ /** Shown on the invoice — the deal, in the customer's own words. */
287
+ description?: string;
288
+ /** Net terms. Procurement rarely pays on receipt; 30 is the usual answer here. */
289
+ daysUntilDue?: number;
290
+ /** Their PO, on the invoice rather than in an email, because that is what unblocks
291
+ * payment. */
292
+ purchaseOrder?: string;
293
+ taxRates?: string[] | null;
294
+ /** Reuse an existing invoice for a retried approval rather than raising a second one. */
295
+ idempotencyKey?: string;
296
+ }): Promise<{
297
+ status: "invoiced";
298
+ invoiceId: string;
299
+ hostedInvoiceUrl: string | null;
300
+ dueAt: number | null;
301
+ emailed: boolean;
302
+ } | {
303
+ status: "refused";
304
+ reason: "no_email" | "invalid_amount" | "charge_failed";
305
+ message: string;
306
+ }>;
258
307
  /**
259
308
  * Buy credits, by whichever method the caller can actually complete.
260
309
  *