pop-pay 0.1.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/cli-vault.d.ts +7 -0
  4. package/dist/cli-vault.d.ts.map +1 -0
  5. package/dist/cli-vault.js +233 -0
  6. package/dist/cli-vault.js.map +1 -0
  7. package/dist/cli.d.ts +6 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +159 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client.d.ts +18 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +68 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/core/models.d.ts +51 -0
  16. package/dist/core/models.d.ts.map +1 -0
  17. package/dist/core/models.js +19 -0
  18. package/dist/core/models.js.map +1 -0
  19. package/dist/core/state.d.ts +15 -0
  20. package/dist/core/state.d.ts.map +1 -0
  21. package/dist/core/state.js +84 -0
  22. package/dist/core/state.js.map +1 -0
  23. package/dist/engine/guardrails.d.ts +6 -0
  24. package/dist/engine/guardrails.d.ts.map +1 -0
  25. package/dist/engine/guardrails.js +128 -0
  26. package/dist/engine/guardrails.js.map +1 -0
  27. package/dist/engine/injector.d.ts +87 -0
  28. package/dist/engine/injector.d.ts.map +1 -0
  29. package/dist/engine/injector.js +955 -0
  30. package/dist/engine/injector.js.map +1 -0
  31. package/dist/engine/known-processors.d.ts +11 -0
  32. package/dist/engine/known-processors.d.ts.map +1 -0
  33. package/dist/engine/known-processors.js +47 -0
  34. package/dist/engine/known-processors.js.map +1 -0
  35. package/dist/engine/llm-guardrails.d.ts +20 -0
  36. package/dist/engine/llm-guardrails.d.ts.map +1 -0
  37. package/dist/engine/llm-guardrails.js +89 -0
  38. package/dist/engine/llm-guardrails.js.map +1 -0
  39. package/dist/index.d.ts +15 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +41 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/mcp-server.d.ts +7 -0
  44. package/dist/mcp-server.d.ts.map +1 -0
  45. package/dist/mcp-server.js +334 -0
  46. package/dist/mcp-server.js.map +1 -0
  47. package/dist/providers/base.d.ts +5 -0
  48. package/dist/providers/base.d.ts.map +1 -0
  49. package/dist/providers/base.js +3 -0
  50. package/dist/providers/base.js.map +1 -0
  51. package/dist/providers/byoc-local.d.ts +12 -0
  52. package/dist/providers/byoc-local.d.ts.map +1 -0
  53. package/dist/providers/byoc-local.js +56 -0
  54. package/dist/providers/byoc-local.js.map +1 -0
  55. package/dist/providers/stripe-mock.d.ts +6 -0
  56. package/dist/providers/stripe-mock.d.ts.map +1 -0
  57. package/dist/providers/stripe-mock.js +34 -0
  58. package/dist/providers/stripe-mock.js.map +1 -0
  59. package/dist/providers/stripe-real.d.ts +9 -0
  60. package/dist/providers/stripe-real.d.ts.map +1 -0
  61. package/dist/providers/stripe-real.js +84 -0
  62. package/dist/providers/stripe-real.js.map +1 -0
  63. package/dist/vault.d.ts +23 -0
  64. package/dist/vault.d.ts.map +1 -0
  65. package/dist/vault.js +283 -0
  66. package/dist/vault.js.map +1 -0
  67. package/package.json +71 -0
@@ -0,0 +1,334 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * pop-pay MCP Server — stdio transport.
5
+ * Tools: request_virtual_card, request_purchaser_info, request_x402_payment
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
9
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
10
+ const zod_1 = require("zod");
11
+ const node_crypto_1 = require("node:crypto");
12
+ const dotenv_1 = require("dotenv");
13
+ const node_fs_1 = require("node:fs");
14
+ const node_path_1 = require("node:path");
15
+ const node_os_1 = require("node:os");
16
+ const client_js_1 = require("./client.js");
17
+ const stripe_mock_js_1 = require("./providers/stripe-mock.js");
18
+ const byoc_local_js_1 = require("./providers/byoc-local.js");
19
+ const guardrails_js_1 = require("./engine/guardrails.js");
20
+ async function main() {
21
+ // Load .env from config dir first, then fallback
22
+ const configEnv = (0, node_path_1.join)((0, node_os_1.homedir)(), ".config", "pop-pay", ".env");
23
+ if ((0, node_fs_1.existsSync)(configEnv)) {
24
+ (0, dotenv_1.config)({ path: configEnv });
25
+ }
26
+ else {
27
+ (0, dotenv_1.config)();
28
+ }
29
+ // Load vault credentials
30
+ let vaultCreds = {};
31
+ try {
32
+ const { vaultExists, loadVault, loadKeyFromKeyring, OSS_WARNING } = await import("./vault.js");
33
+ if (vaultExists()) {
34
+ const keyringKey = await loadKeyFromKeyring();
35
+ if (!keyringKey) {
36
+ process.stderr.write(OSS_WARNING);
37
+ }
38
+ vaultCreds = await loadVault();
39
+ }
40
+ }
41
+ catch { }
42
+ // Set vault creds as env defaults
43
+ if (vaultCreds.card_number)
44
+ process.env.POP_BYOC_NUMBER ??= vaultCreds.card_number;
45
+ if (vaultCreds.cvv)
46
+ process.env.POP_BYOC_CVV ??= vaultCreds.cvv;
47
+ if (vaultCreds.exp_month)
48
+ process.env.POP_BYOC_EXP_MONTH ??= vaultCreds.exp_month;
49
+ if (vaultCreds.exp_year)
50
+ process.env.POP_BYOC_EXP_YEAR ??= vaultCreds.exp_year;
51
+ // Configuration
52
+ const allowedCategories = JSON.parse(process.env.POP_ALLOWED_CATEGORIES ?? '["aws", "cloudflare"]');
53
+ const maxPerTx = parseFloat(process.env.POP_MAX_PER_TX ?? "100.0");
54
+ const maxDaily = parseFloat(process.env.POP_MAX_DAILY ?? "500.0");
55
+ const blockLoops = (process.env.POP_BLOCK_LOOPS ?? "true").toLowerCase() === "true";
56
+ const stripeKey = process.env.POP_STRIPE_KEY;
57
+ const webhookUrl = process.env.POP_WEBHOOK_URL ?? null;
58
+ const policy = {
59
+ allowedCategories,
60
+ maxAmountPerTx: maxPerTx,
61
+ maxDailyBudget: maxDaily,
62
+ blockHallucinationLoops: blockLoops,
63
+ webhookUrl,
64
+ };
65
+ // Provider selection
66
+ let provider;
67
+ if (stripeKey) {
68
+ const { StripeIssuingProvider } = await import("./providers/stripe-real.js");
69
+ provider = new StripeIssuingProvider(stripeKey);
70
+ }
71
+ else if (process.env.POP_BYOC_NUMBER) {
72
+ provider = new byoc_local_js_1.LocalVaultProvider();
73
+ }
74
+ else {
75
+ provider = new stripe_mock_js_1.MockStripeProvider();
76
+ }
77
+ // Engine selection
78
+ let engine;
79
+ const engineType = (process.env.POP_GUARDRAIL_ENGINE ?? "keyword").toLowerCase();
80
+ if (engineType === "llm") {
81
+ const { HybridGuardrailEngine, LLMGuardrailEngine } = await import("./engine/llm-guardrails.js");
82
+ engine = new HybridGuardrailEngine(new LLMGuardrailEngine({
83
+ apiKey: process.env.POP_LLM_API_KEY ?? "",
84
+ baseUrl: process.env.POP_LLM_BASE_URL ?? undefined,
85
+ model: process.env.POP_LLM_MODEL ?? "gpt-4o-mini",
86
+ useJsonMode: true,
87
+ }));
88
+ }
89
+ else {
90
+ engine = new guardrails_js_1.GuardrailEngine();
91
+ }
92
+ const client = new client_js_1.PopClient(provider, policy, engine);
93
+ // Snapshot cache for security scans
94
+ const snapshotCache = new Map();
95
+ const SNAPSHOT_CACHE_MAX = 200;
96
+ // Hidden element detection regex
97
+ const HIDDEN_STYLE_RE = /(?:style\s*=\s*["'](?:[^"']*(?:display\s*:\s*none|visibility\s*:\s*hidden|opacity\s*:\s*0|font-size\s*:\s*0|height\s*:\s*0|width\s*:\s*0))[^"']*["'])|(?:class\s*=\s*["'](?:[^"']*(?:hidden|visually-hidden|sr-only|d-none))[^"']*["'])/i;
98
+ const PRICE_RE = /[\$\u00a3\u20ac\u00a5]\s?\d+(?:\.\d{2})?/g;
99
+ async function scanPage(pageUrl) {
100
+ const snapshotId = (0, node_crypto_1.randomUUID)();
101
+ const flags = [];
102
+ // SSRF guard
103
+ try {
104
+ const parsed = new URL(pageUrl);
105
+ if (parsed.protocol !== "https:") {
106
+ return { flags: ["invalid_url"], snapshotId, safe: false, error: "pop-pay only accepts https:// URLs." };
107
+ }
108
+ }
109
+ catch {
110
+ return { flags: ["invalid_url"], snapshotId, safe: false, error: "Invalid URL." };
111
+ }
112
+ // Fetch HTML
113
+ let html = "";
114
+ try {
115
+ const resp = await fetch(pageUrl, { redirect: "follow", signal: AbortSignal.timeout(10000) });
116
+ html = await resp.text();
117
+ const finalUrl = new URL(resp.url);
118
+ const origUrl = new URL(pageUrl);
119
+ if (finalUrl.hostname !== origUrl.hostname) {
120
+ flags.push("unexpected_redirect");
121
+ }
122
+ }
123
+ catch (e) {
124
+ flags.push("ssl_anomaly");
125
+ return { flags, snapshotId, safe: false, error: `Error fetching page: ${e.message}` };
126
+ }
127
+ // Prompt injection scan
128
+ const instructionKeywords = [
129
+ "ignore", "instead", "system", "user", "override", "instruction", "always", "never", "prompt",
130
+ ];
131
+ let hiddenInstructionsDetected = false;
132
+ let match;
133
+ const re = new RegExp(HIDDEN_STYLE_RE.source, "gi");
134
+ while ((match = re.exec(html)) !== null) {
135
+ const context = html.slice(match.index + match[0].length, match.index + match[0].length + 300).toLowerCase();
136
+ if (instructionKeywords.some((kw) => context.includes(kw))) {
137
+ hiddenInstructionsDetected = true;
138
+ break;
139
+ }
140
+ }
141
+ if (hiddenInstructionsDetected)
142
+ flags.push("hidden_instructions_detected");
143
+ // Price mismatch
144
+ const prices = new Set(html.match(PRICE_RE) ?? []);
145
+ if (prices.size > 2)
146
+ flags.push("price_mismatch");
147
+ // Cache
148
+ if (snapshotCache.size >= SNAPSHOT_CACHE_MAX) {
149
+ let oldest = null;
150
+ let oldestTime = Infinity;
151
+ for (const [k, v] of snapshotCache) {
152
+ if (v.timestamp.getTime() < oldestTime) {
153
+ oldest = k;
154
+ oldestTime = v.timestamp.getTime();
155
+ }
156
+ }
157
+ if (oldest)
158
+ snapshotCache.delete(oldest);
159
+ }
160
+ snapshotCache.set(pageUrl, { snapshotId, timestamp: new Date(), flags });
161
+ const safe = !flags.includes("hidden_instructions_detected");
162
+ return { flags, snapshotId, safe, error: null };
163
+ }
164
+ function ssrfValidateUrl(url) {
165
+ try {
166
+ const parsed = new URL(url);
167
+ if (!["http:", "https:"].includes(parsed.protocol)) {
168
+ return "Only http/https URLs are allowed.";
169
+ }
170
+ }
171
+ catch {
172
+ return "Invalid URL.";
173
+ }
174
+ return null;
175
+ }
176
+ // MCP Server
177
+ const server = new mcp_js_1.McpServer({ name: "pop-pay", version: "0.1.0" });
178
+ server.tool("request_virtual_card", "Request a one-time virtual credit card for an automated purchase. ONLY call when card input fields are visible on the checkout page.", {
179
+ requested_amount: zod_1.z.number().positive().describe("Amount to authorize"),
180
+ target_vendor: zod_1.z.string().describe("Human-readable vendor name (e.g. 'AWS', 'Wikipedia')"),
181
+ reasoning: zod_1.z.string().describe("Agent reasoning for the payment"),
182
+ page_url: zod_1.z.string().optional().describe("Current checkout page URL"),
183
+ }, async ({ requested_amount, target_vendor, reasoning, page_url }) => {
184
+ // Security scan
185
+ let scanNote = "";
186
+ if (page_url) {
187
+ const cached = snapshotCache.get(page_url);
188
+ let scanResult;
189
+ if (cached && Date.now() - cached.timestamp.getTime() < 5 * 60 * 1000) {
190
+ scanResult = {
191
+ flags: cached.flags,
192
+ snapshotId: cached.snapshotId,
193
+ safe: !cached.flags.includes("hidden_instructions_detected"),
194
+ error: null,
195
+ };
196
+ }
197
+ else {
198
+ scanResult = await scanPage(page_url);
199
+ }
200
+ if (scanResult.error) {
201
+ return {
202
+ content: [
203
+ {
204
+ type: "text",
205
+ text: `Payment rejected. Security scan failed: ${scanResult.error} Snapshot ID: ${scanResult.snapshotId}.`,
206
+ },
207
+ ],
208
+ };
209
+ }
210
+ if (!scanResult.safe) {
211
+ return {
212
+ content: [
213
+ {
214
+ type: "text",
215
+ text: `Payment rejected. Security scan detected hidden prompt injection. Snapshot ID: ${scanResult.snapshotId}. Flags: ${scanResult.flags.join(", ")}. Do not retry this payment.`,
216
+ },
217
+ ],
218
+ };
219
+ }
220
+ }
221
+ else {
222
+ scanNote = " (security scan skipped \u2014 no page_url provided)";
223
+ }
224
+ const intent = {
225
+ agentId: "mcp-agent",
226
+ requestedAmount: requested_amount,
227
+ targetVendor: target_vendor,
228
+ reasoning,
229
+ pageUrl: page_url ?? null,
230
+ };
231
+ const seal = await client.processPayment(intent);
232
+ if (seal.status === "Rejected") {
233
+ return {
234
+ content: [
235
+ { type: "text", text: `Payment rejected by guardrails. Reason: ${seal.rejectionReason}` },
236
+ ],
237
+ };
238
+ }
239
+ const last4 = seal.cardNumber?.slice(-4) ?? "????";
240
+ const maskedCard = `****-****-****-${last4}`;
241
+ return {
242
+ content: [
243
+ {
244
+ type: "text",
245
+ text: `Payment approved. Card Issued: ${maskedCard}, Expiry: ${seal.expirationDate}, Amount: ${seal.authorizedAmount}${scanNote}`,
246
+ },
247
+ ],
248
+ };
249
+ });
250
+ server.tool("request_purchaser_info", "Auto-fill purchaser/billing info (name, email, phone, address) from the user's pre-configured profile. Call when on a billing/contact info page WITHOUT card fields visible.", {
251
+ target_vendor: zod_1.z.string().describe("Human-readable vendor or event name"),
252
+ page_url: zod_1.z.string().optional().describe("Current page URL"),
253
+ reasoning: zod_1.z.string().optional().describe("Why billing info is needed"),
254
+ }, async ({ target_vendor, page_url, reasoning }) => {
255
+ const pageDomain = page_url
256
+ ? new URL(page_url).hostname.toLowerCase().replace(/^www\./, "")
257
+ : "";
258
+ const vendorAllowed = (0, guardrails_js_1.matchVendor)(target_vendor, allowedCategories, pageDomain);
259
+ if (!vendorAllowed) {
260
+ return {
261
+ content: [
262
+ {
263
+ type: "text",
264
+ text: `Vendor '${target_vendor}' is not in your allowed categories. Update POP_ALLOWED_CATEGORIES to add it.`,
265
+ },
266
+ ],
267
+ };
268
+ }
269
+ return {
270
+ content: [
271
+ {
272
+ type: "text",
273
+ text: `Billing info request acknowledged for '${target_vendor}'. Browser injection is not yet implemented in the TypeScript version. Please fill billing fields manually.`,
274
+ },
275
+ ],
276
+ };
277
+ });
278
+ server.tool("request_x402_payment", "Pay for an API call or service using the x402 HTTP payment protocol.", {
279
+ amount: zod_1.z.number().positive().describe("Payment amount"),
280
+ service_url: zod_1.z.string().describe("Service URL to pay"),
281
+ reasoning: zod_1.z.string().describe("Reason for the payment"),
282
+ }, async ({ amount, service_url, reasoning }) => {
283
+ const walletKey = process.env.POP_X402_WALLET_KEY ?? "";
284
+ if (!walletKey) {
285
+ return {
286
+ content: [
287
+ {
288
+ type: "text",
289
+ text: "x402 payment rejected: POP_X402_WALLET_KEY environment variable is not set.",
290
+ },
291
+ ],
292
+ };
293
+ }
294
+ const ssrfError = ssrfValidateUrl(service_url);
295
+ if (ssrfError) {
296
+ return {
297
+ content: [
298
+ { type: "text", text: `x402 payment rejected: SSRF validation failed. ${ssrfError}` },
299
+ ],
300
+ };
301
+ }
302
+ const intent = {
303
+ agentId: "mcp-agent-x402",
304
+ requestedAmount: amount,
305
+ targetVendor: service_url,
306
+ reasoning,
307
+ pageUrl: service_url,
308
+ };
309
+ const seal = await client.processPayment(intent);
310
+ if (seal.status === "Rejected") {
311
+ return {
312
+ content: [
313
+ { type: "text", text: `x402 payment rejected by guardrails. Reason: ${seal.rejectionReason}` },
314
+ ],
315
+ };
316
+ }
317
+ return {
318
+ content: [
319
+ {
320
+ type: "text",
321
+ text: `x402 payment approved (STUBBED). seal_id=${seal.sealId}, amount=$${amount.toFixed(2)}, service_url=${service_url}. Note: actual x402 blockchain payment is not yet implemented.`,
322
+ },
323
+ ],
324
+ };
325
+ });
326
+ // Start stdio transport
327
+ const transport = new stdio_js_1.StdioServerTransport();
328
+ await server.connect(transport);
329
+ } // end main
330
+ main().catch((err) => {
331
+ process.stderr.write(`pop-pay MCP server fatal error: ${err}\n`);
332
+ process.exit(1);
333
+ });
334
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { PaymentIntent, GuardrailPolicy, VirtualSeal } from "../core/models.js";
2
+ export interface VirtualCardProvider {
3
+ issueCard(intent: PaymentIntent, policy: GuardrailPolicy): Promise<VirtualSeal>;
4
+ }
5
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACjF"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { VirtualCardProvider } from "./base.js";
2
+ import type { PaymentIntent, GuardrailPolicy, VirtualSeal } from "../core/models.js";
3
+ export declare class LocalVaultProvider implements VirtualCardProvider {
4
+ readonly cardNumber: string;
5
+ readonly expMonth: string;
6
+ readonly expYear: string;
7
+ readonly cvv: string;
8
+ readonly billingInfo: Record<string, string>;
9
+ constructor();
10
+ issueCard(intent: PaymentIntent, policy: GuardrailPolicy): Promise<VirtualSeal>;
11
+ }
12
+ //# sourceMappingURL=byoc-local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byoc-local.d.ts","sourceRoot":"","sources":["../../src/providers/byoc-local.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErF,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;IA4BvC,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;CAuBtF"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalVaultProvider = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ class LocalVaultProvider {
6
+ cardNumber;
7
+ expMonth;
8
+ expYear;
9
+ cvv;
10
+ billingInfo;
11
+ constructor() {
12
+ this.cardNumber = process.env.POP_BYOC_NUMBER ?? "";
13
+ this.expMonth = process.env.POP_BYOC_EXP_MONTH ?? "";
14
+ this.expYear = process.env.POP_BYOC_EXP_YEAR ?? "";
15
+ this.cvv = process.env.POP_BYOC_CVV ?? "";
16
+ if (!this.cardNumber || !this.expMonth || !this.expYear || !this.cvv) {
17
+ throw new Error("Missing BYOC environment variables. Check POP_BYOC_NUMBER, POP_BYOC_EXP_MONTH, POP_BYOC_EXP_YEAR, POP_BYOC_CVV.");
18
+ }
19
+ this.billingInfo = {
20
+ firstName: process.env.POP_BILLING_FIRST_NAME?.trim() ?? "",
21
+ lastName: process.env.POP_BILLING_LAST_NAME?.trim() ?? "",
22
+ street: process.env.POP_BILLING_STREET?.trim() ?? "",
23
+ city: process.env.POP_BILLING_CITY?.trim() ?? "",
24
+ state: process.env.POP_BILLING_STATE?.trim() ?? "",
25
+ country: process.env.POP_BILLING_COUNTRY?.trim() ?? "",
26
+ zip: process.env.POP_BILLING_ZIP?.trim() ?? "",
27
+ email: process.env.POP_BILLING_EMAIL?.trim() ?? "",
28
+ phone: process.env.POP_BILLING_PHONE?.trim() ?? "",
29
+ phoneCountryCode: process.env.POP_BILLING_PHONE_COUNTRY_CODE?.trim() ?? "",
30
+ };
31
+ }
32
+ async issueCard(intent, policy) {
33
+ if (intent.requestedAmount > policy.maxAmountPerTx) {
34
+ return {
35
+ sealId: (0, node_crypto_1.randomUUID)(),
36
+ cardNumber: null,
37
+ cvv: null,
38
+ expirationDate: null,
39
+ authorizedAmount: 0.0,
40
+ status: "Rejected",
41
+ rejectionReason: "Amount exceeds policy limit",
42
+ };
43
+ }
44
+ return {
45
+ sealId: (0, node_crypto_1.randomUUID)(),
46
+ cardNumber: this.cardNumber,
47
+ cvv: this.cvv,
48
+ expirationDate: `${this.expMonth}/${this.expYear}`,
49
+ authorizedAmount: intent.requestedAmount,
50
+ status: "Issued",
51
+ rejectionReason: null,
52
+ };
53
+ }
54
+ }
55
+ exports.LocalVaultProvider = LocalVaultProvider;
56
+ //# sourceMappingURL=byoc-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byoc-local.js","sourceRoot":"","sources":["../../src/providers/byoc-local.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAIzC,MAAa,kBAAkB;IACpB,UAAU,CAAS;IACnB,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,GAAG,CAAS;IACZ,WAAW,CAAyB;IAE7C;QACE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QAE1C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,WAAW,GAAG;YACjB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,EAAE;YAC3D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE;YACzD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE;YACpD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE;YAChD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE;YAClD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE;YACtD,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE;YAC9C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE;YAClD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE;YAClD,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,IAAI,EAAE,IAAI,EAAE;SAC3E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAqB,EAAE,MAAuB;QAC5D,IAAI,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YACnD,OAAO;gBACL,MAAM,EAAE,IAAA,wBAAU,GAAE;gBACpB,UAAU,EAAE,IAAI;gBAChB,GAAG,EAAE,IAAI;gBACT,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,GAAG;gBACrB,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,6BAA6B;aAC/C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAA,wBAAU,GAAE;YACpB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE;YAClD,gBAAgB,EAAE,MAAM,CAAC,eAAe;YACxC,MAAM,EAAE,QAAQ;YAChB,eAAe,EAAE,IAAI;SACtB,CAAC;IACJ,CAAC;CACF;AAxDD,gDAwDC"}
@@ -0,0 +1,6 @@
1
+ import type { VirtualCardProvider } from "./base.js";
2
+ import type { PaymentIntent, GuardrailPolicy, VirtualSeal } from "../core/models.js";
3
+ export declare class MockStripeProvider implements VirtualCardProvider {
4
+ issueCard(intent: PaymentIntent, policy: GuardrailPolicy): Promise<VirtualSeal>;
5
+ }
6
+ //# sourceMappingURL=stripe-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-mock.d.ts","sourceRoot":"","sources":["../../src/providers/stripe-mock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErF,qBAAa,kBAAmB,YAAW,mBAAmB;IACtD,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;CA4BtF"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockStripeProvider = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ class MockStripeProvider {
6
+ async issueCard(intent, policy) {
7
+ if (intent.requestedAmount > policy.maxAmountPerTx) {
8
+ return {
9
+ sealId: (0, node_crypto_1.randomUUID)(),
10
+ cardNumber: null,
11
+ cvv: null,
12
+ expirationDate: null,
13
+ authorizedAmount: 0.0,
14
+ status: "Rejected",
15
+ rejectionReason: `Exceeds single transaction limit of ${policy.maxAmountPerTx}`,
16
+ };
17
+ }
18
+ const cardNumber = Array.from({ length: 16 }, () => Math.floor(Math.random() * 10)).join("");
19
+ const cvv = Array.from({ length: 3 }, () => Math.floor(Math.random() * 10)).join("");
20
+ const expDate = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000);
21
+ const expirationDate = `${String(expDate.getMonth() + 1).padStart(2, "0")}/${String(expDate.getFullYear()).slice(-2)}`;
22
+ return {
23
+ sealId: (0, node_crypto_1.randomUUID)(),
24
+ cardNumber,
25
+ cvv,
26
+ expirationDate,
27
+ authorizedAmount: intent.requestedAmount,
28
+ status: "Issued",
29
+ rejectionReason: null,
30
+ };
31
+ }
32
+ }
33
+ exports.MockStripeProvider = MockStripeProvider;
34
+ //# sourceMappingURL=stripe-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-mock.js","sourceRoot":"","sources":["../../src/providers/stripe-mock.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAIzC,MAAa,kBAAkB;IAC7B,KAAK,CAAC,SAAS,CAAC,MAAqB,EAAE,MAAuB;QAC5D,IAAI,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YACnD,OAAO;gBACL,MAAM,EAAE,IAAA,wBAAU,GAAE;gBACpB,UAAU,EAAE,IAAI;gBAChB,GAAG,EAAE,IAAI;gBACT,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,GAAG;gBACrB,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,uCAAuC,MAAM,CAAC,cAAc,EAAE;aAChF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvH,OAAO;YACL,MAAM,EAAE,IAAA,wBAAU,GAAE;YACpB,UAAU;YACV,GAAG;YACH,cAAc;YACd,gBAAgB,EAAE,MAAM,CAAC,eAAe;YACxC,MAAM,EAAE,QAAQ;YAChB,eAAe,EAAE,IAAI;SACtB,CAAC;IACJ,CAAC;CACF;AA7BD,gDA6BC"}
@@ -0,0 +1,9 @@
1
+ import type { VirtualCardProvider } from "./base.js";
2
+ import type { PaymentIntent, GuardrailPolicy, VirtualSeal } from "../core/models.js";
3
+ export declare class StripeIssuingProvider implements VirtualCardProvider {
4
+ private stripe;
5
+ private cardholderId;
6
+ constructor(apiKey: string);
7
+ issueCard(intent: PaymentIntent, policy: GuardrailPolicy): Promise<VirtualSeal>;
8
+ }
9
+ //# sourceMappingURL=stripe-real.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-real.d.ts","sourceRoot":"","sources":["../../src/providers/stripe-real.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErF,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAuB;gBAE/B,MAAM,EAAE,MAAM;IAUpB,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;CAkEtF"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StripeIssuingProvider = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ class StripeIssuingProvider {
6
+ stripe;
7
+ cardholderId = null;
8
+ constructor(apiKey) {
9
+ // Lazy import — stripe is an optional dependency
10
+ try {
11
+ const Stripe = require("stripe");
12
+ this.stripe = new Stripe(apiKey);
13
+ }
14
+ catch {
15
+ throw new Error("stripe package required. Install with: npm install stripe");
16
+ }
17
+ }
18
+ async issueCard(intent, policy) {
19
+ try {
20
+ if (intent.requestedAmount > policy.maxAmountPerTx) {
21
+ return {
22
+ sealId: (0, node_crypto_1.randomUUID)(),
23
+ cardNumber: null,
24
+ cvv: null,
25
+ expirationDate: null,
26
+ authorizedAmount: 0.0,
27
+ status: "Rejected",
28
+ rejectionReason: "Amount exceeds policy limit",
29
+ };
30
+ }
31
+ if (!this.cardholderId) {
32
+ const cardholder = await this.stripe.issuing.cardholders.create({
33
+ type: "individual",
34
+ name: "POP Agent",
35
+ billing: {
36
+ address: {
37
+ line1: "123 AI St",
38
+ city: "San Francisco",
39
+ state: "CA",
40
+ postal_code: "94105",
41
+ country: "US",
42
+ },
43
+ },
44
+ });
45
+ this.cardholderId = cardholder.id;
46
+ }
47
+ const card = await this.stripe.issuing.cards.create({
48
+ cardholder: this.cardholderId,
49
+ type: "virtual",
50
+ currency: "usd",
51
+ spending_controls: {
52
+ spending_limits: [
53
+ {
54
+ amount: Math.round(intent.requestedAmount * 100),
55
+ interval: "all_time",
56
+ },
57
+ ],
58
+ },
59
+ });
60
+ return {
61
+ sealId: (0, node_crypto_1.randomUUID)(),
62
+ cardNumber: `****${card.last4}`,
63
+ cvv: "***",
64
+ expirationDate: `${card.exp_month}/${card.exp_year}`,
65
+ authorizedAmount: intent.requestedAmount,
66
+ status: "Issued",
67
+ rejectionReason: null,
68
+ };
69
+ }
70
+ catch (e) {
71
+ return {
72
+ sealId: (0, node_crypto_1.randomUUID)(),
73
+ cardNumber: null,
74
+ cvv: null,
75
+ expirationDate: null,
76
+ authorizedAmount: 0.0,
77
+ status: "Rejected",
78
+ rejectionReason: String(e.message ?? e),
79
+ };
80
+ }
81
+ }
82
+ }
83
+ exports.StripeIssuingProvider = StripeIssuingProvider;
84
+ //# sourceMappingURL=stripe-real.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-real.js","sourceRoot":"","sources":["../../src/providers/stripe-real.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAIzC,MAAa,qBAAqB;IACxB,MAAM,CAAM;IACZ,YAAY,GAAkB,IAAI,CAAC;IAE3C,YAAY,MAAc;QACxB,iDAAiD;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAqB,EAAE,MAAuB;QAC5D,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;gBACnD,OAAO;oBACL,MAAM,EAAE,IAAA,wBAAU,GAAE;oBACpB,UAAU,EAAE,IAAI;oBAChB,GAAG,EAAE,IAAI;oBACT,cAAc,EAAE,IAAI;oBACpB,gBAAgB,EAAE,GAAG;oBACrB,MAAM,EAAE,UAAU;oBAClB,eAAe,EAAE,6BAA6B;iBAC/C,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;oBAC9D,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE;wBACP,OAAO,EAAE;4BACP,KAAK,EAAE,WAAW;4BAClB,IAAI,EAAE,eAAe;4BACrB,KAAK,EAAE,IAAI;4BACX,WAAW,EAAE,OAAO;4BACpB,OAAO,EAAE,IAAI;yBACd;qBACF;iBACF,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC;YACpC,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClD,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,KAAK;gBACf,iBAAiB,EAAE;oBACjB,eAAe,EAAE;wBACf;4BACE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,GAAG,GAAG,CAAC;4BAChD,QAAQ,EAAE,UAAU;yBACrB;qBACF;iBACF;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,MAAM,EAAE,IAAA,wBAAU,GAAE;gBACpB,UAAU,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE;gBAC/B,GAAG,EAAE,KAAK;gBACV,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACpD,gBAAgB,EAAE,MAAM,CAAC,eAAe;gBACxC,MAAM,EAAE,QAAQ;gBAChB,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO;gBACL,MAAM,EAAE,IAAA,wBAAU,GAAE;gBACpB,UAAU,EAAE,IAAI;gBAChB,GAAG,EAAE,IAAI;gBACT,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,GAAG;gBACrB,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAhFD,sDAgFC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * pop-pay credential vault — AES-256-GCM encrypted credential storage.
3
+ *
4
+ * Security model:
5
+ * - Credentials are encrypted at rest using AES-256-GCM with a machine-derived key.
6
+ * - The key is derived from a stable machine identifier using scrypt.
7
+ * - Plaintext credentials never touch disk after init-vault completes.
8
+ * - OSS version uses a public salt (documented limitation).
9
+ * - Option B passphrase mode: key derived from user passphrase via PBKDF2-HMAC-SHA256
10
+ * (600k iterations); stored in OS keyring for the session.
11
+ */
12
+ export declare const OSS_WARNING: string;
13
+ export declare function deriveKeyFromPassphrase(passphrase: string): Buffer;
14
+ export declare function storeKeyInKeyring(key: Buffer): void;
15
+ export declare function loadKeyFromKeyring(): Promise<Buffer | null>;
16
+ export declare function clearKeyring(): Promise<void>;
17
+ export declare function encryptCredentials(creds: Record<string, string>, salt?: Buffer, keyOverride?: Buffer): Buffer;
18
+ export declare function decryptCredentials(blob: Buffer, salt?: Buffer, keyOverride?: Buffer): Record<string, string>;
19
+ export declare function vaultExists(): boolean;
20
+ export declare function loadVault(): Promise<Record<string, string>>;
21
+ export declare function saveVault(creds: Record<string, string>, keyOverride?: Buffer): void;
22
+ export declare function secureWipeEnv(envPath: string): void;
23
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,eAAO,MAAM,WAAW,QAKwC,CAAC;AA4EjE,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGlE;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CASnD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOjE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAKlD;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CASR;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAqBD,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkCjE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAenF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKnD"}