@carrierllc/mcp 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/.metadata_never_index +0 -0
  2. package/dist/apps/app-state.d.ts +19 -0
  3. package/dist/apps/app-state.d.ts.map +1 -0
  4. package/dist/apps/app-state.js +28 -0
  5. package/dist/apps/app-state.js.map +1 -0
  6. package/dist/apps/balance-topup.d.ts +19 -0
  7. package/dist/apps/balance-topup.d.ts.map +1 -0
  8. package/dist/apps/balance-topup.js +121 -0
  9. package/dist/apps/balance-topup.js.map +1 -0
  10. package/dist/apps/fleet-health-app.d.ts +29 -0
  11. package/dist/apps/fleet-health-app.d.ts.map +1 -0
  12. package/dist/apps/fleet-health-app.js +152 -0
  13. package/dist/apps/fleet-health-app.js.map +1 -0
  14. package/dist/apps/index.d.ts +37 -0
  15. package/dist/apps/index.d.ts.map +1 -0
  16. package/dist/apps/index.js +42 -0
  17. package/dist/apps/index.js.map +1 -0
  18. package/dist/apps/provisioning-wizard.d.ts +11 -0
  19. package/dist/apps/provisioning-wizard.d.ts.map +1 -0
  20. package/dist/apps/provisioning-wizard.js +345 -0
  21. package/dist/apps/provisioning-wizard.js.map +1 -0
  22. package/dist/audit.d.ts +31 -0
  23. package/dist/audit.d.ts.map +1 -0
  24. package/dist/audit.js +42 -0
  25. package/dist/audit.js.map +1 -0
  26. package/dist/billing-thresholds.d.ts +71 -0
  27. package/dist/billing-thresholds.d.ts.map +1 -0
  28. package/dist/billing-thresholds.js +238 -0
  29. package/dist/billing-thresholds.js.map +1 -0
  30. package/dist/billing.d.ts +95 -0
  31. package/dist/billing.d.ts.map +1 -0
  32. package/dist/billing.js +239 -0
  33. package/dist/billing.js.map +1 -0
  34. package/dist/clerk.d.ts +125 -0
  35. package/dist/clerk.d.ts.map +1 -0
  36. package/dist/clerk.js +389 -0
  37. package/dist/clerk.js.map +1 -0
  38. package/dist/client.d.ts +12 -15
  39. package/dist/client.d.ts.map +1 -1
  40. package/dist/client.js +56 -53
  41. package/dist/client.js.map +1 -1
  42. package/dist/credits.d.ts +165 -0
  43. package/dist/credits.d.ts.map +1 -0
  44. package/dist/credits.js +483 -0
  45. package/dist/credits.js.map +1 -0
  46. package/dist/index.d.ts +6 -11
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +74 -23
  49. package/dist/index.js.map +1 -1
  50. package/dist/intelligence.d.ts +2 -8
  51. package/dist/intelligence.d.ts.map +1 -1
  52. package/dist/intelligence.js +399 -154
  53. package/dist/intelligence.js.map +1 -1
  54. package/dist/list-recent-ocs-events.d.ts +48 -0
  55. package/dist/list-recent-ocs-events.d.ts.map +1 -0
  56. package/dist/list-recent-ocs-events.js +160 -0
  57. package/dist/list-recent-ocs-events.js.map +1 -0
  58. package/dist/manus-client.d.ts +429 -0
  59. package/dist/manus-client.d.ts.map +1 -0
  60. package/dist/manus-client.js +401 -0
  61. package/dist/manus-client.js.map +1 -0
  62. package/dist/manus-common.d.ts +5 -0
  63. package/dist/manus-common.d.ts.map +1 -0
  64. package/dist/manus-common.js +5 -0
  65. package/dist/manus-common.js.map +1 -0
  66. package/dist/manus-schedule.d.ts +74 -0
  67. package/dist/manus-schedule.d.ts.map +1 -0
  68. package/dist/manus-schedule.js +213 -0
  69. package/dist/manus-schedule.js.map +1 -0
  70. package/dist/manus-usage.d.ts +32 -0
  71. package/dist/manus-usage.d.ts.map +1 -0
  72. package/dist/manus-usage.js +120 -0
  73. package/dist/manus-usage.js.map +1 -0
  74. package/dist/manus-webhook.d.ts +60 -0
  75. package/dist/manus-webhook.d.ts.map +1 -0
  76. package/dist/manus-webhook.js +361 -0
  77. package/dist/manus-webhook.js.map +1 -0
  78. package/dist/pricing-tools.d.ts +26 -0
  79. package/dist/pricing-tools.d.ts.map +1 -0
  80. package/dist/pricing-tools.js +428 -0
  81. package/dist/pricing-tools.js.map +1 -0
  82. package/dist/projects-tools.d.ts +39 -0
  83. package/dist/projects-tools.d.ts.map +1 -0
  84. package/dist/projects-tools.js +545 -0
  85. package/dist/projects-tools.js.map +1 -0
  86. package/dist/prompts.d.ts +1 -0
  87. package/dist/prompts.d.ts.map +1 -1
  88. package/dist/prompts.js +1 -0
  89. package/dist/prompts.js.map +1 -1
  90. package/dist/stripe-connect-tools.d.ts +33 -0
  91. package/dist/stripe-connect-tools.d.ts.map +1 -0
  92. package/dist/stripe-connect-tools.js +504 -0
  93. package/dist/stripe-connect-tools.js.map +1 -0
  94. package/dist/timing-safe-equal.d.ts +5 -0
  95. package/dist/timing-safe-equal.d.ts.map +1 -0
  96. package/dist/timing-safe-equal.js +13 -0
  97. package/dist/timing-safe-equal.js.map +1 -0
  98. package/dist/tools-backlog.d.ts +37 -0
  99. package/dist/tools-backlog.d.ts.map +1 -0
  100. package/dist/tools-backlog.js +410 -0
  101. package/dist/tools-backlog.js.map +1 -0
  102. package/dist/tools-carrier-ask.d.ts +138 -0
  103. package/dist/tools-carrier-ask.d.ts.map +1 -0
  104. package/dist/tools-carrier-ask.js +913 -0
  105. package/dist/tools-carrier-ask.js.map +1 -0
  106. package/dist/tools-pricing.d.ts +18 -0
  107. package/dist/tools-pricing.d.ts.map +1 -0
  108. package/dist/tools-pricing.js +172 -0
  109. package/dist/tools-pricing.js.map +1 -0
  110. package/dist/tools-ui-agent-ask.d.ts +29 -0
  111. package/dist/tools-ui-agent-ask.d.ts.map +1 -0
  112. package/dist/tools-ui-agent-ask.js +272 -0
  113. package/dist/tools-ui-agent-ask.js.map +1 -0
  114. package/dist/tools-ui-agent-schedule.d.ts +29 -0
  115. package/dist/tools-ui-agent-schedule.d.ts.map +1 -0
  116. package/dist/tools-ui-agent-schedule.js +517 -0
  117. package/dist/tools-ui-agent-schedule.js.map +1 -0
  118. package/dist/tools-ui-agent.d.ts +40 -0
  119. package/dist/tools-ui-agent.d.ts.map +1 -0
  120. package/dist/tools-ui-agent.js +508 -0
  121. package/dist/tools-ui-agent.js.map +1 -0
  122. package/dist/tools.d.ts +44 -13
  123. package/dist/tools.d.ts.map +1 -1
  124. package/dist/tools.js +892 -210
  125. package/dist/tools.js.map +1 -1
  126. package/dist/types.d.ts +298 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +5 -0
  129. package/dist/types.js.map +1 -0
  130. package/package.json +15 -8
@@ -0,0 +1,345 @@
1
+ /**
2
+ * v1.2b — eSIM Provisioning Wizard MCP App
3
+ *
4
+ * 3-step wizard: select subscriber → select package → confirm + execute.
5
+ * Tier-gated: pro and enterprise only (free tier is skipped).
6
+ * Step 2→3 fetches package template details for preview; step 3 (confirm) calls affectPackageToSubscriber.
7
+ */
8
+ import { z } from "zod";
9
+ import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, } from "@modelcontextprotocol/ext-apps/server";
10
+ import { OcsClient } from "../client.js";
11
+ import { loadWizardSession, saveWizardSession, deleteWizardSession, } from "./app-state.js";
12
+ // ── Helpers ───────────────────────────────────────────────────────────────────
13
+ async function safeCallWithToken(client, _token, method, params = {}) {
14
+ try {
15
+ return { data: await client.call(method, params), error: null };
16
+ }
17
+ catch (err) {
18
+ return {
19
+ data: null,
20
+ error: err instanceof Error ? err.message : String(err),
21
+ };
22
+ }
23
+ }
24
+ function generateWizardId() {
25
+ const arr = new Uint8Array(4);
26
+ crypto.getRandomValues(arr);
27
+ return Array.from(arr)
28
+ .map((b) => b.toString(16).padStart(2, "0"))
29
+ .join("");
30
+ }
31
+ // ── Registration ──────────────────────────────────────────────────────────────
32
+ export function registerProvisioningWizard(server, ctx) {
33
+ // Tier guard — free tier does not get this wizard
34
+ if (ctx.props.tier === "free")
35
+ return;
36
+ // ── Resource ───────────────────────────────────────────────────────────────
37
+ registerAppResource(server, "eSIM Provisioning Wizard", "ui://esim-provisioning-wizard", {
38
+ description: "3-step eSIM provisioning wizard — pick subscriber, pick package, confirm + execute.",
39
+ }, async () => {
40
+ let html;
41
+ try {
42
+ const resp = await ctx.env.ASSETS.fetch(new Request("https://internal/views/provisioning-wizard/index.html"));
43
+ html = await resp.text();
44
+ }
45
+ catch {
46
+ html = "<html><body><p>Provisioning wizard unavailable.</p></body></html>";
47
+ }
48
+ return {
49
+ contents: [
50
+ {
51
+ uri: "ui://esim-provisioning-wizard",
52
+ mimeType: RESOURCE_MIME_TYPE,
53
+ text: html,
54
+ _meta: { ui: {} },
55
+ },
56
+ ],
57
+ };
58
+ });
59
+ // ── Tool ───────────────────────────────────────────────────────────────────
60
+ registerAppTool(server, "provision_esim_wizard", {
61
+ title: "eSIM Provisioning Wizard",
62
+ description: "Interactive 3-step wizard to provision an eSIM: select subscriber, choose package template, preview (dry_run) and confirm execution.",
63
+ inputSchema: {
64
+ step: z
65
+ .enum(["init", "select-package", "preview", "confirm"])
66
+ .describe("Current wizard step"),
67
+ wizardId: z
68
+ .string()
69
+ .optional()
70
+ .describe("Wizard session ID (absent on init)"),
71
+ subscriber_iccid: z
72
+ .string()
73
+ .optional()
74
+ .describe("Subscriber ICCID (required for select-package)"),
75
+ package_template_id: z
76
+ .number()
77
+ .optional()
78
+ .describe("Package template ID (required for preview)"),
79
+ },
80
+ _meta: {
81
+ ui: {
82
+ resourceUri: "ui://esim-provisioning-wizard",
83
+ visibility: ["model", "app"],
84
+ },
85
+ },
86
+ }, async ({ step, wizardId, subscriber_iccid, package_template_id }) => {
87
+ const token = await ctx.getUserToken(ctx.props.sub);
88
+ const client = new OcsClient(ctx.env.CARRIER_OCS_BASE_URL, token);
89
+ // ── init ────────────────────────────────────────────────────────────────
90
+ if (step === "init") {
91
+ const newWizardId = generateWizardId();
92
+ const subscribersResult = await safeCallWithToken(client, token, "listResellerAccount", {});
93
+ const session = {
94
+ step: "select-subscriber",
95
+ dry_run: false,
96
+ initiated_at: new Date().toISOString(),
97
+ };
98
+ await saveWizardSession(ctx.env, ctx.props.sub, newWizardId, session);
99
+ return {
100
+ content: [
101
+ {
102
+ type: "text",
103
+ text: `Wizard started (id: ${newWizardId}). Select a subscriber to provision.`,
104
+ },
105
+ ],
106
+ structuredContent: {
107
+ wizardId: newWizardId,
108
+ step: "select-subscriber",
109
+ subscribers: subscribersResult.data ?? [],
110
+ error: subscribersResult.error,
111
+ },
112
+ };
113
+ }
114
+ // All subsequent steps require a wizardId
115
+ if (!wizardId) {
116
+ return {
117
+ content: [{ type: "text", text: "Missing wizardId." }],
118
+ isError: true,
119
+ };
120
+ }
121
+ // ── select-package ──────────────────────────────────────────────────────
122
+ if (step === "select-package") {
123
+ const session = await loadWizardSession(ctx.env, ctx.props.sub, wizardId);
124
+ if (!session) {
125
+ return {
126
+ content: [
127
+ {
128
+ type: "text",
129
+ text: "Wizard session not found or expired.",
130
+ },
131
+ ],
132
+ isError: true,
133
+ };
134
+ }
135
+ if (session.step !== "select-subscriber") {
136
+ return {
137
+ content: [
138
+ {
139
+ type: "text",
140
+ text: `Invalid step transition: expected select-subscriber, got ${session.step}.`,
141
+ },
142
+ ],
143
+ isError: true,
144
+ };
145
+ }
146
+ if (!subscriber_iccid) {
147
+ return {
148
+ content: [
149
+ {
150
+ type: "text",
151
+ text: "subscriber_iccid is required for select-package step.",
152
+ },
153
+ ],
154
+ isError: true,
155
+ };
156
+ }
157
+ const packagesResult = await safeCallWithToken(client, token, "listPackageTemplates", {});
158
+ const updated = {
159
+ ...session,
160
+ step: "select-package",
161
+ subscriber_iccid,
162
+ };
163
+ await saveWizardSession(ctx.env, ctx.props.sub, wizardId, updated);
164
+ return {
165
+ content: [
166
+ {
167
+ type: "text",
168
+ text: `Subscriber ${subscriber_iccid} selected. Choose a package template.`,
169
+ },
170
+ ],
171
+ structuredContent: {
172
+ wizardId,
173
+ step: "select-package",
174
+ subscriber_iccid,
175
+ packages: packagesResult.data ?? [],
176
+ error: packagesResult.error,
177
+ },
178
+ };
179
+ }
180
+ // ── preview ─────────────────────────────────────────────────────────────
181
+ if (step === "preview") {
182
+ const session = await loadWizardSession(ctx.env, ctx.props.sub, wizardId);
183
+ if (!session) {
184
+ return {
185
+ content: [
186
+ {
187
+ type: "text",
188
+ text: "Wizard session not found or expired.",
189
+ },
190
+ ],
191
+ isError: true,
192
+ };
193
+ }
194
+ if (session.step !== "select-package") {
195
+ return {
196
+ content: [
197
+ {
198
+ type: "text",
199
+ text: `Invalid step transition: expected select-package, got ${session.step}.`,
200
+ },
201
+ ],
202
+ isError: true,
203
+ };
204
+ }
205
+ if (package_template_id === undefined) {
206
+ return {
207
+ content: [
208
+ {
209
+ type: "text",
210
+ text: "package_template_id is required for preview step.",
211
+ },
212
+ ],
213
+ isError: true,
214
+ };
215
+ }
216
+ // Fix #19: modifyAccountPackage does not exist in OCS v1.
217
+ // Preview step fetches the package template details (read-only) to show
218
+ // the operator what will be assigned before confirm executes the real call.
219
+ const previewResult = await safeCallWithToken(client, token, "listPrepaidPackageTemplate", {});
220
+ const list = previewResult.data;
221
+ let preview = null;
222
+ if (Array.isArray(list)) {
223
+ preview =
224
+ list.find((item) => {
225
+ if (!item || typeof item !== "object")
226
+ return false;
227
+ const rec = item;
228
+ const tid = rec.templateId ?? rec.packageTemplateId;
229
+ return Number(tid) === package_template_id;
230
+ }) ?? null;
231
+ }
232
+ else if (list && typeof list === "object") {
233
+ const rec = list;
234
+ const tid = rec.templateId ?? rec.packageTemplateId;
235
+ if (Number(tid) === package_template_id)
236
+ preview = list;
237
+ }
238
+ const updated = {
239
+ ...session,
240
+ step: "confirm",
241
+ package_template_id,
242
+ dry_run: true,
243
+ };
244
+ await saveWizardSession(ctx.env, ctx.props.sub, wizardId, updated);
245
+ return {
246
+ content: [
247
+ {
248
+ type: "text",
249
+ text: `Preview ready. Review changes and confirm to proceed.`,
250
+ },
251
+ ],
252
+ structuredContent: {
253
+ wizardId,
254
+ step: "confirm",
255
+ subscriber_iccid: session.subscriber_iccid,
256
+ package_template_id,
257
+ preview,
258
+ previewError: previewResult.error,
259
+ },
260
+ };
261
+ }
262
+ // ── confirm ─────────────────────────────────────────────────────────────
263
+ if (step === "confirm") {
264
+ const session = await loadWizardSession(ctx.env, ctx.props.sub, wizardId);
265
+ if (!session) {
266
+ return {
267
+ content: [
268
+ {
269
+ type: "text",
270
+ text: "Wizard session not found or expired.",
271
+ },
272
+ ],
273
+ isError: true,
274
+ };
275
+ }
276
+ if (session.step !== "confirm") {
277
+ return {
278
+ content: [
279
+ {
280
+ type: "text",
281
+ text: `Invalid step transition: expected confirm, got ${session.step}.`,
282
+ },
283
+ ],
284
+ isError: true,
285
+ };
286
+ }
287
+ // Fix #19: modifyAccountPackage does not exist in OCS v1. The correct method
288
+ // for provisioning a package is affectPackageToSubscriber, which expects an
289
+ // integer subscriberId (not ICCID string). Resolve via getSingleSubscriber first.
290
+ const subRecord = await safeCallWithToken(client, token, "getSingleSubscriber", { iccid: session.subscriber_iccid });
291
+ if (subRecord.error || !subRecord.data) {
292
+ return {
293
+ content: [
294
+ {
295
+ type: "text",
296
+ text: `Provisioning failed: could not resolve subscriber for ICCID ${session.subscriber_iccid}: ${subRecord.error ?? "empty response"}`,
297
+ },
298
+ ],
299
+ isError: true,
300
+ };
301
+ }
302
+ const subscriberId = subRecord.data.id ?? subRecord.data.subscriberId;
303
+ if (subscriberId === undefined) {
304
+ return {
305
+ content: [
306
+ {
307
+ type: "text",
308
+ text: `Provisioning failed: getSingleSubscriber returned no id for ICCID ${session.subscriber_iccid}`,
309
+ },
310
+ ],
311
+ isError: true,
312
+ };
313
+ }
314
+ const result = await safeCallWithToken(client, token, "affectPackageToSubscriber", {
315
+ subscriber: Number(subscriberId),
316
+ packageTemplateId: session.package_template_id,
317
+ });
318
+ await deleteWizardSession(ctx.env, ctx.props.sub, wizardId);
319
+ if (result.error) {
320
+ return {
321
+ content: [
322
+ {
323
+ type: "text",
324
+ text: `Provisioning failed: ${result.error}`,
325
+ },
326
+ ],
327
+ isError: true,
328
+ };
329
+ }
330
+ return {
331
+ content: [{ type: "text", text: "Provisioned." }],
332
+ structuredContent: {
333
+ wizardId,
334
+ step: "done",
335
+ result: result.data,
336
+ },
337
+ };
338
+ }
339
+ return {
340
+ content: [{ type: "text", text: `Unknown step: ${step}.` }],
341
+ isError: true,
342
+ };
343
+ });
344
+ }
345
+ //# sourceMappingURL=provisioning-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning-wizard.js","sourceRoot":"","sources":["../../src/apps/provisioning-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Env, AuditRow } from "./types.js";
2
+ /**
3
+ * Fire-and-forget Analytics Engine write.
4
+ * Never await — AE writes are non-blocking and best-effort.
5
+ *
6
+ * Schema:
7
+ * blobs[0] = tool_name
8
+ * blobs[1] = ocs_method
9
+ * blobs[2] = status ('ok' | 'error' | 'scope_denied' | 'dry_run')
10
+ * blobs[3] = dry_run ('0' | '1')
11
+ * blobs[4] = sub (user email)
12
+ * blobs[5] = manus_task_id (empty when not a Manus dispatch)
13
+ * blobs[6] = manus_profile (empty when absent)
14
+ * blobs[7] = manus_key_used: "primary" | "fallback" (empty when absent)
15
+ * doubles[0] = duration_ms
16
+ * doubles[1] = ocs_status_code (0 = success, -1 = network error)
17
+ * indexes[0] = reseller_id (string; enables per-reseller filtering in SQL queries)
18
+ *
19
+ * Query example (Workers Analytics Engine SQL API):
20
+ * SELECT blob1 AS tool, SUM(_sample_interval) AS calls
21
+ * FROM carrier_mcp_audit
22
+ * WHERE timestamp > NOW() - INTERVAL '7' DAY
23
+ * GROUP BY tool ORDER BY calls DESC
24
+ *
25
+ * Note: use SUM(_sample_interval) not COUNT(*) — AE downsamples at high volume.
26
+ */
27
+ export declare function writeAudit(env: Env, row: AuditRow & {
28
+ sub: string;
29
+ reseller_id: number;
30
+ }): void;
31
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,QAAQ,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACnD,IAAI,CAeN"}
package/dist/audit.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Fire-and-forget Analytics Engine write.
3
+ * Never await — AE writes are non-blocking and best-effort.
4
+ *
5
+ * Schema:
6
+ * blobs[0] = tool_name
7
+ * blobs[1] = ocs_method
8
+ * blobs[2] = status ('ok' | 'error' | 'scope_denied' | 'dry_run')
9
+ * blobs[3] = dry_run ('0' | '1')
10
+ * blobs[4] = sub (user email)
11
+ * blobs[5] = manus_task_id (empty when not a Manus dispatch)
12
+ * blobs[6] = manus_profile (empty when absent)
13
+ * blobs[7] = manus_key_used: "primary" | "fallback" (empty when absent)
14
+ * doubles[0] = duration_ms
15
+ * doubles[1] = ocs_status_code (0 = success, -1 = network error)
16
+ * indexes[0] = reseller_id (string; enables per-reseller filtering in SQL queries)
17
+ *
18
+ * Query example (Workers Analytics Engine SQL API):
19
+ * SELECT blob1 AS tool, SUM(_sample_interval) AS calls
20
+ * FROM carrier_mcp_audit
21
+ * WHERE timestamp > NOW() - INTERVAL '7' DAY
22
+ * GROUP BY tool ORDER BY calls DESC
23
+ *
24
+ * Note: use SUM(_sample_interval) not COUNT(*) — AE downsamples at high volume.
25
+ */
26
+ export function writeAudit(env, row) {
27
+ env.AUDIT_LOG.writeDataPoint({
28
+ blobs: [
29
+ row.tool_name,
30
+ row.ocs_method,
31
+ row.status,
32
+ row.dry_run ? "1" : "0",
33
+ row.sub,
34
+ row.manus_task_id ?? "",
35
+ row.manus_profile ?? "",
36
+ row.manus_key_used ?? "",
37
+ ],
38
+ doubles: [row.duration_ms, row.ocs_status_code ?? 0],
39
+ indexes: [String(row.reseller_id)],
40
+ });
41
+ }
42
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,UAAU,CACxB,GAAQ,EACR,GAAoD;IAEpD,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC;QAC3B,KAAK,EAAE;YACL,GAAG,CAAC,SAAS;YACb,GAAG,CAAC,UAAU;YACd,GAAG,CAAC,MAAM;YACV,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACvB,GAAG,CAAC,GAAG;YACP,GAAG,CAAC,aAAa,IAAI,EAAE;YACvB,GAAG,CAAC,aAAa,IAAI,EAAE;YACvB,GAAG,CAAC,cAAc,IAAI,EAAE;SACzB;QACD,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KACnC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Carrier MCP — Billing Thresholds (Hex Pattern)
3
+ *
4
+ * Prevents bill shock by:
5
+ * 1. Triggering invoices at predefined spend levels
6
+ * 2. Sending notifications at configurable usage percentages
7
+ * 3. Hard-stopping overages at a user-defined maximum
8
+ *
9
+ * Integrates with Stripe:
10
+ * - Uses Stripe Billing Thresholds on subscriptions
11
+ * - Creates threshold-triggered invoices for overage accumulation
12
+ * - Sends webhook events for notification dispatch
13
+ *
14
+ * Reference: Hex case study — "Mitigating the risk of bill shock"
15
+ * - Invoices trigger automatically at predefined amounts
16
+ * - Acts as spend alerts, preventing unexpected charges
17
+ */
18
+ import type { Env } from "./types.js";
19
+ import type { Tier } from "./billing.js";
20
+ export interface ThresholdConfig {
21
+ /** Soft thresholds — trigger notifications (percentage of limit) */
22
+ notification_thresholds: number[];
23
+ /** Hard threshold — stop overages at this amount (cents). 0 = no hard cap */
24
+ hard_cap_cents: number;
25
+ /** Invoice threshold — trigger invoice at this overage amount (cents) */
26
+ invoice_threshold_cents: number;
27
+ /** Whether to auto-pause overages when hard cap is hit */
28
+ auto_pause_on_cap: boolean;
29
+ /** Email for threshold notifications */
30
+ notification_email: string | null;
31
+ /** Webhook URL for threshold events */
32
+ webhook_url: string | null;
33
+ }
34
+ export interface ThresholdEvent {
35
+ type: "notification" | "invoice_triggered" | "hard_cap_reached" | "overage_paused";
36
+ sub: string;
37
+ tier: Tier;
38
+ current_spend_cents: number;
39
+ threshold_cents: number;
40
+ pct_of_limit: number;
41
+ timestamp: string;
42
+ }
43
+ export interface ThresholdCheckResult {
44
+ /** Whether the user can continue consuming overage credits */
45
+ overage_allowed: boolean;
46
+ /** Events triggered by this check */
47
+ events: ThresholdEvent[];
48
+ /** Current spend as percentage of hard cap (0 if no cap) */
49
+ spend_pct: number;
50
+ /** Remaining before hard cap (Infinity if no cap) */
51
+ remaining_cents: number;
52
+ }
53
+ /**
54
+ * Check billing thresholds before allowing overage consumption.
55
+ * Returns whether overage is still allowed and any triggered events.
56
+ */
57
+ export declare function checkBillingThresholds(env: Env, sub: string, tier: Tier, currentSpendCents: number, additionalSpendCents: number): Promise<ThresholdCheckResult>;
58
+ /**
59
+ * Get threshold config for a user, with fallback to tier defaults.
60
+ */
61
+ export declare function getThresholdConfig(env: Env, sub: string, tier: Tier): Promise<ThresholdConfig>;
62
+ /**
63
+ * Update threshold config for a user.
64
+ */
65
+ export declare function updateThresholdConfig(env: Env, sub: string, updates: Partial<ThresholdConfig>): Promise<ThresholdConfig>;
66
+ /**
67
+ * Set up Stripe subscription billing thresholds.
68
+ * Called when a user upgrades to Pro or changes their threshold config.
69
+ */
70
+ export declare function syncStripeThresholds(env: Env, sub: string, config: ThresholdConfig): Promise<boolean>;
71
+ //# sourceMappingURL=billing-thresholds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing-thresholds.d.ts","sourceRoot":"","sources":["../src/billing-thresholds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAMzC,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,6EAA6E;IAC7E,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,uBAAuB,EAAE,MAAM,CAAC;IAChC,0DAA0D;IAC1D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,wCAAwC;IACxC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,uCAAuC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;CACzB;AAqCD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,EACV,iBAAiB,EAAE,MAAM,EACzB,oBAAoB,EAAE,MAAM,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA6F/B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,eAAe,CAAC,CAO1B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC,CAO1B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,OAAO,CAAC,CA8BlB"}