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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Point One Percent Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # pop-pay
2
+
3
+ **Point One Percent** — Semantic Payment Guardrail for AI Agents.
4
+
5
+ > It only takes 0.1% of hallucination to drain 100% of your wallet.
6
+
7
+ TypeScript + Rust implementation of the pop-pay runtime security layer for AI agent commerce.
8
+
9
+ ## Features
10
+
11
+ - **Vault**: AES-256-GCM encrypted credential storage with Rust native security layer
12
+ - **Guardrails**: Keyword + LLM-based payment intent validation
13
+ - **MCP Server**: Model Context Protocol server for AI agent integration
14
+ - **Providers**: Stripe Issuing, BYOC (Bring Your Own Card), Mock
15
+ - **Security Scan**: Prompt injection detection on checkout pages
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install pop-pay
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ```bash
26
+ # Initialize vault
27
+ pop-init-vault
28
+
29
+ # Launch MCP server
30
+ pop-launch
31
+ ```
32
+
33
+ ## License
34
+
35
+ MIT
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * pop-init-vault: Interactive setup to encrypt card credentials.
4
+ * pop-unlock: Unlock vault for passphrase mode sessions.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli-vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-vault.d.ts","sourceRoot":"","sources":["../src/cli-vault.ts"],"names":[],"mappings":";AACA;;;GAGG"}
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * pop-init-vault: Interactive setup to encrypt card credentials.
5
+ * pop-unlock: Unlock vault for passphrase mode sessions.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const node_fs_1 = require("node:fs");
9
+ const node_readline_1 = require("node:readline");
10
+ const node_os_1 = require("node:os");
11
+ const node_path_1 = require("node:path");
12
+ const vault_js_1 = require("./vault.js");
13
+ const VAULT_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), ".config", "pop-pay");
14
+ const VAULT_PATH = (0, node_path_1.join)(VAULT_DIR, "vault.enc");
15
+ function prompt(question) {
16
+ const rl = (0, node_readline_1.createInterface)({ input: process.stdin, output: process.stdout });
17
+ return new Promise((resolve) => {
18
+ rl.question(question, (answer) => {
19
+ rl.close();
20
+ resolve(answer.trim());
21
+ });
22
+ });
23
+ }
24
+ function promptHidden(question) {
25
+ return new Promise((resolve) => {
26
+ process.stdout.write(question);
27
+ const stdin = process.stdin;
28
+ const wasRaw = stdin.isRaw;
29
+ if (stdin.isTTY)
30
+ stdin.setRawMode(true);
31
+ stdin.resume();
32
+ let input = "";
33
+ const onData = (char) => {
34
+ const c = char.toString("utf8");
35
+ if (c === "\n" || c === "\r" || c === "\u0004") {
36
+ if (stdin.isTTY)
37
+ stdin.setRawMode(wasRaw ?? false);
38
+ stdin.pause();
39
+ stdin.removeListener("data", onData);
40
+ process.stdout.write("\n");
41
+ resolve(input.trim());
42
+ }
43
+ else if (c === "\u0003") {
44
+ process.exit(1);
45
+ }
46
+ else if (c === "\u007f" || c === "\b") {
47
+ input = input.slice(0, -1);
48
+ }
49
+ else {
50
+ input += c;
51
+ }
52
+ };
53
+ stdin.on("data", onData);
54
+ });
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // pop-init-vault
58
+ // ---------------------------------------------------------------------------
59
+ async function cmdInitVault() {
60
+ const usePassphrase = process.argv.includes("--passphrase");
61
+ console.log("pop-pay vault setup");
62
+ console.log("=".repeat(40));
63
+ console.log("Your card credentials will be encrypted and stored at:");
64
+ console.log(` ${VAULT_PATH}`);
65
+ console.log();
66
+ console.log(vault_js_1.OSS_WARNING);
67
+ if ((0, vault_js_1.vaultExists)()) {
68
+ const overwrite = await prompt("A vault already exists. Overwrite? [y/N]: ");
69
+ if (overwrite.toLowerCase() !== "y") {
70
+ console.log("Aborted.");
71
+ process.exit(0);
72
+ }
73
+ }
74
+ let keyOverride;
75
+ if (usePassphrase) {
76
+ console.log("\nPassphrase mode: your vault will be encrypted with a passphrase.");
77
+ console.log("You must run `pop-unlock` before each MCP server session.\n");
78
+ while (true) {
79
+ const p1 = await promptHidden(" Choose passphrase: ");
80
+ const p2 = await promptHidden(" Confirm passphrase: ");
81
+ if (p1 !== p2) {
82
+ console.log(" Passphrases do not match. Try again.");
83
+ continue;
84
+ }
85
+ if (p1.length < 8) {
86
+ console.log(" Passphrase must be at least 8 characters.");
87
+ continue;
88
+ }
89
+ keyOverride = (0, vault_js_1.deriveKeyFromPassphrase)(p1);
90
+ (0, vault_js_1.storeKeyInKeyring)(keyOverride);
91
+ console.log(" Passphrase set. Vault unlocked for this session.");
92
+ break;
93
+ }
94
+ }
95
+ console.log("Enter your card credentials (input is hidden):");
96
+ const cardNumber = (await promptHidden(" Card number: "))
97
+ .replace(/\s/g, "")
98
+ .replace(/-/g, "");
99
+ const expMonth = await promptHidden(" Expiry month (MM): ");
100
+ const expYear = await promptHidden(" Expiry year (YY): ");
101
+ const cvv = await promptHidden(" CVV: ");
102
+ const creds = {
103
+ card_number: cardNumber,
104
+ cvv,
105
+ exp_month: expMonth,
106
+ exp_year: expYear,
107
+ expiration_date: `${expMonth}/${expYear}`,
108
+ };
109
+ console.log("\nEncrypting and writing vault...");
110
+ try {
111
+ (0, vault_js_1.saveVault)(creds, keyOverride);
112
+ }
113
+ catch (e) {
114
+ console.error(`ERROR: ${e.message}`);
115
+ process.exit(1);
116
+ }
117
+ console.log(`Vault written to ${VAULT_PATH}`);
118
+ // Handle policy .env
119
+ const policyEnvPath = (0, node_path_1.join)(VAULT_DIR, ".env");
120
+ const envCandidates = [policyEnvPath, (0, node_path_1.join)(process.cwd(), ".env")];
121
+ let wipedPolicyEnv = false;
122
+ for (const envPath of envCandidates) {
123
+ if ((0, node_fs_1.existsSync)(envPath)) {
124
+ const content = (0, node_fs_1.readFileSync)(envPath, "utf8");
125
+ if (content.includes("POP_BYOC_NUMBER") || content.includes("POP_BYOC_CVV")) {
126
+ const wipe = await prompt(`\n\x1b[1;31m${envPath} contains card credentials. Securely wipe it?\x1b[0m [y/N]: `);
127
+ if (wipe.toLowerCase() === "y") {
128
+ (0, vault_js_1.secureWipeEnv)(envPath);
129
+ console.log(`${envPath} wiped.`);
130
+ if (envPath === policyEnvPath)
131
+ wipedPolicyEnv = true;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ // Offer to create policy template
137
+ if (!(0, node_fs_1.existsSync)(policyEnvPath) || wipedPolicyEnv) {
138
+ console.log(`\nNo policy config found at ${policyEnvPath}.`);
139
+ const create = await prompt("Create a policy template .env? [y/N]: ");
140
+ if (create.toLowerCase() === "y") {
141
+ (0, node_fs_1.mkdirSync)(VAULT_DIR, { recursive: true });
142
+ (0, node_fs_1.writeFileSync)(policyEnvPath, `# pop-pay policy configuration
143
+ # Card credentials are stored in vault.enc — do not add them here.
144
+
145
+ # Vendors the agent is allowed to pay (JSON array)
146
+ POP_ALLOWED_CATEGORIES=["aws", "cloudflare", "openai", "github", "Wikipedia", "donation", "Wikimedia"]
147
+
148
+ # Spending limits
149
+ POP_MAX_PER_TX=100.0
150
+ POP_MAX_DAILY=500.0
151
+ POP_BLOCK_LOOPS=true
152
+
153
+ # CDP injection (required for BYOC card filling)
154
+ POP_AUTO_INJECT=true
155
+ POP_CDP_URL=http://localhost:9222
156
+
157
+ # Guardrail engine: keyword (default, zero-cost) or llm
158
+ # POP_GUARDRAIL_ENGINE=keyword
159
+
160
+ # Billing info for auto-filling name/address fields on checkout pages
161
+ # POP_BILLING_FIRST_NAME=Bob
162
+ # POP_BILLING_LAST_NAME=Smith
163
+ # POP_BILLING_EMAIL=bob@example.com
164
+ # POP_BILLING_PHONE_COUNTRY_CODE=+1
165
+ # POP_BILLING_PHONE=+14155551234
166
+ # POP_BILLING_STREET=123 Main St
167
+ # POP_BILLING_CITY=Redwood City
168
+ # POP_BILLING_ZIP=94043
169
+ # POP_BILLING_STATE=CA
170
+ # POP_BILLING_COUNTRY=US
171
+ `, { mode: 0o600 });
172
+ console.log(`Template created at ${policyEnvPath} — edit to set your policy.`);
173
+ }
174
+ }
175
+ if (usePassphrase) {
176
+ console.log("\nSetup complete. This session is already unlocked.");
177
+ console.log("Run `pop-unlock` before each new MCP server session.");
178
+ }
179
+ else {
180
+ console.log("\nSetup complete. The MCP server will auto-decrypt the vault at startup.");
181
+ }
182
+ }
183
+ // ---------------------------------------------------------------------------
184
+ // pop-unlock
185
+ // ---------------------------------------------------------------------------
186
+ async function cmdUnlock() {
187
+ const doLock = process.argv.includes("--lock");
188
+ if (doLock) {
189
+ await (0, vault_js_1.clearKeyring)();
190
+ console.log("Vault locked — key removed from keyring.");
191
+ console.log("Restart the MCP server to apply.");
192
+ return;
193
+ }
194
+ if (!(0, vault_js_1.vaultExists)()) {
195
+ console.log("No vault found. Run `pop-init-vault` first.");
196
+ process.exit(1);
197
+ }
198
+ const passphrase = await promptHidden("Vault passphrase: ");
199
+ if (!passphrase) {
200
+ console.log("Passphrase cannot be empty.");
201
+ process.exit(1);
202
+ }
203
+ const key = (0, vault_js_1.deriveKeyFromPassphrase)(passphrase);
204
+ try {
205
+ const blob = (0, node_fs_1.readFileSync)(VAULT_PATH);
206
+ (0, vault_js_1.decryptCredentials)(blob, undefined, key);
207
+ }
208
+ catch {
209
+ console.log("Wrong passphrase — vault not unlocked.");
210
+ process.exit(1);
211
+ }
212
+ (0, vault_js_1.storeKeyInKeyring)(key);
213
+ console.log("Vault unlocked for this session.");
214
+ console.log("Start (or restart) the MCP server — it will auto-decrypt using the stored key.");
215
+ console.log("Run `pop-unlock --lock` to re-lock when done.");
216
+ }
217
+ // ---------------------------------------------------------------------------
218
+ // Main dispatch
219
+ // ---------------------------------------------------------------------------
220
+ const command = process.argv[1] ?? "";
221
+ if (command.includes("pop-unlock") || process.argv.includes("unlock")) {
222
+ cmdUnlock().catch((e) => {
223
+ console.error(e);
224
+ process.exit(1);
225
+ });
226
+ }
227
+ else {
228
+ cmdInitVault().catch((e) => {
229
+ console.error(e);
230
+ process.exit(1);
231
+ });
232
+ }
233
+ //# sourceMappingURL=cli-vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-vault.js","sourceRoot":"","sources":["../src/cli-vault.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * pop-launch: Launch Chrome with CDP + start MCP server.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;GAEG"}
package/dist/cli.js ADDED
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * pop-launch: Launch Chrome with CDP + start MCP server.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const node_fs_1 = require("node:fs");
8
+ const node_fs_2 = require("node:fs");
9
+ const node_os_1 = require("node:os");
10
+ const node_os_2 = require("node:os");
11
+ const node_path_1 = require("node:path");
12
+ const node_child_process_1 = require("node:child_process");
13
+ function findChrome() {
14
+ const system = (0, node_os_1.platform)();
15
+ if (system === "darwin") {
16
+ const candidates = [
17
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
18
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
19
+ ];
20
+ for (const p of candidates) {
21
+ if ((0, node_fs_1.existsSync)(p))
22
+ return p;
23
+ }
24
+ }
25
+ else if (system === "linux") {
26
+ const { execSync } = require("node:child_process");
27
+ const candidates = ["google-chrome", "google-chrome-stable", "chromium", "chromium-browser"];
28
+ for (const name of candidates) {
29
+ try {
30
+ const found = execSync(`which ${name}`, { encoding: "utf8" }).trim();
31
+ if (found)
32
+ return found;
33
+ }
34
+ catch { }
35
+ }
36
+ }
37
+ else if (system === "win32") {
38
+ const candidates = [
39
+ String.raw `C:\Program Files\Google\Chrome\Application\chrome.exe`,
40
+ String.raw `C:\Program Files (x86)\Google\Chrome\Application\chrome.exe`,
41
+ ];
42
+ for (const p of candidates) {
43
+ if ((0, node_fs_1.existsSync)(p))
44
+ return p;
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ async function waitForChrome(port, timeout = 10000) {
50
+ const url = `http://localhost:${port}/json/version`;
51
+ const deadline = Date.now() + timeout;
52
+ while (Date.now() < deadline) {
53
+ try {
54
+ const resp = await fetch(url, { signal: AbortSignal.timeout(1000) });
55
+ return await resp.json();
56
+ }
57
+ catch {
58
+ await new Promise((r) => setTimeout(r, 500));
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ function printMcpInstructions(port) {
64
+ const cdpEndpoint = `http://localhost:${port}`;
65
+ console.log();
66
+ console.log("Point One Percent is ready. Add it to Claude Code with:");
67
+ console.log();
68
+ console.log(` claude mcp add pop-pay -- npx pop-pay launch-mcp`);
69
+ console.log(` claude mcp add playwright -- npx @playwright/mcp@latest --cdp-endpoint ${cdpEndpoint}`);
70
+ console.log();
71
+ console.log("Then start Claude Code and you're set.");
72
+ }
73
+ function parseArgs(argv) {
74
+ const opts = {
75
+ port: 9222,
76
+ profileDir: (0, node_path_1.join)((0, node_os_2.homedir)(), ".pop", "chrome-profile"),
77
+ url: null,
78
+ printMcp: false,
79
+ headless: false,
80
+ help: false,
81
+ };
82
+ for (let i = 0; i < argv.length; i++) {
83
+ const arg = argv[i];
84
+ if (arg === "--port" && argv[i + 1]) {
85
+ opts.port = parseInt(argv[++i], 10);
86
+ }
87
+ else if (arg === "--profile-dir" && argv[i + 1]) {
88
+ opts.profileDir = argv[++i];
89
+ }
90
+ else if (arg === "--url" && argv[i + 1]) {
91
+ opts.url = argv[++i];
92
+ }
93
+ else if (arg === "--print-mcp") {
94
+ opts.printMcp = true;
95
+ }
96
+ else if (arg === "--headless") {
97
+ opts.headless = true;
98
+ }
99
+ else if (arg === "--help" || arg === "-h") {
100
+ opts.help = true;
101
+ }
102
+ }
103
+ return opts;
104
+ }
105
+ async function main() {
106
+ const args = parseArgs(process.argv.slice(2));
107
+ if (args.help) {
108
+ console.log(`pop-launch: Launch Chrome with CDP remote debugging for pop-pay.
109
+
110
+ Usage: pop-launch [options]
111
+
112
+ Options:
113
+ --port <number> Chrome remote debugging port (default: 9222)
114
+ --profile-dir <path> Chrome user-data-dir (default: ~/.pop/chrome-profile)
115
+ --url <url> Optional URL to open in Chrome on launch
116
+ --print-mcp Print the claude mcp add commands after Chrome is ready
117
+ --headless Launch headless Chromium (for Docker/CI)
118
+ -h, --help Show this help message`);
119
+ return 0;
120
+ }
121
+ // Resolve profile directory
122
+ const profileDir = (0, node_path_1.resolve)(args.profileDir.replace(/^~/, (0, node_os_2.homedir)()));
123
+ (0, node_fs_2.mkdirSync)(profileDir, { recursive: true });
124
+ const chrome = findChrome();
125
+ if (!chrome) {
126
+ process.stderr.write("ERROR: Could not find Chrome or Chromium. Please install Google Chrome and try again.\n");
127
+ return 1;
128
+ }
129
+ const cmd = [
130
+ `--remote-debugging-port=${args.port}`,
131
+ `--user-data-dir=${profileDir}`,
132
+ ];
133
+ if (args.url)
134
+ cmd.push(args.url);
135
+ console.log(`Launching Chrome: ${chrome}`);
136
+ console.log(` --remote-debugging-port=${args.port}`);
137
+ console.log(` --user-data-dir=${profileDir}`);
138
+ if (args.url)
139
+ console.log(` Opening URL: ${args.url}`);
140
+ // Launch Chrome as a detached background process
141
+ (0, node_child_process_1.spawn)(chrome, cmd, {
142
+ detached: true,
143
+ stdio: "ignore",
144
+ }).unref();
145
+ console.log(`\nWaiting for Chrome to be ready on port ${args.port}...`);
146
+ const info = await waitForChrome(args.port);
147
+ if (!info) {
148
+ process.stderr.write(`ERROR: Chrome did not become ready within 10 seconds on port ${args.port}.\n`);
149
+ return 1;
150
+ }
151
+ const browserVersion = info.Browser ?? "unknown";
152
+ console.log(`Chrome is ready. Browser: ${browserVersion}`);
153
+ if (args.printMcp) {
154
+ printMcpInstructions(args.port);
155
+ }
156
+ return 0;
157
+ }
158
+ main().then((code) => process.exit(code));
159
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { PaymentIntent, GuardrailPolicy, VirtualSeal } from "./core/models.js";
2
+ import type { VirtualCardProvider } from "./providers/base.js";
3
+ import { GuardrailEngine } from "./engine/guardrails.js";
4
+ import { PopStateTracker } from "./core/state.js";
5
+ export declare class PopClient {
6
+ provider: VirtualCardProvider;
7
+ policy: GuardrailPolicy;
8
+ stateTracker: PopStateTracker;
9
+ engine: GuardrailEngine;
10
+ constructor(provider: VirtualCardProvider, policy: GuardrailPolicy, engine?: GuardrailEngine, dbPath?: string);
11
+ processPayment(intent: PaymentIntent): Promise<VirtualSeal>;
12
+ executePayment(sealId: string, amount: number): Promise<{
13
+ status: string;
14
+ reason?: string;
15
+ amount?: number;
16
+ }>;
17
+ }
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,SAAS;IACpB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,eAAe,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;gBAGtB,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,eAAe,EACxB,MAAM,GAAE,MAAuB;IAQ3B,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAoD3D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAOpH"}
package/dist/client.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PopClient = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const guardrails_js_1 = require("./engine/guardrails.js");
6
+ const state_js_1 = require("./core/state.js");
7
+ class PopClient {
8
+ provider;
9
+ policy;
10
+ stateTracker;
11
+ engine;
12
+ constructor(provider, policy, engine, dbPath = "pop_state.db") {
13
+ this.provider = provider;
14
+ this.policy = policy;
15
+ this.stateTracker = new state_js_1.PopStateTracker(dbPath);
16
+ this.engine = engine ?? new guardrails_js_1.GuardrailEngine();
17
+ }
18
+ async processPayment(intent) {
19
+ // Check daily budget
20
+ if (!this.stateTracker.canSpend(intent.requestedAmount, this.policy.maxDailyBudget)) {
21
+ const seal = {
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: "Daily budget exceeded",
29
+ };
30
+ this.stateTracker.recordSeal(seal.sealId, seal.authorizedAmount, intent.targetVendor, seal.status);
31
+ return seal;
32
+ }
33
+ // Evaluate intent
34
+ const [approved, reason] = await this.engine.evaluateIntent(intent, this.policy);
35
+ if (!approved) {
36
+ const seal = {
37
+ sealId: (0, node_crypto_1.randomUUID)(),
38
+ cardNumber: null,
39
+ cvv: null,
40
+ expirationDate: null,
41
+ authorizedAmount: 0.0,
42
+ status: "Rejected",
43
+ rejectionReason: reason,
44
+ };
45
+ this.stateTracker.recordSeal(seal.sealId, seal.authorizedAmount, intent.targetVendor, seal.status);
46
+ return seal;
47
+ }
48
+ // Issue card
49
+ const seal = await this.provider.issueCard(intent, this.policy);
50
+ const maskedCard = seal.cardNumber
51
+ ? `****-****-****-${seal.cardNumber.slice(-4)}`
52
+ : "****-****-****-????";
53
+ this.stateTracker.recordSeal(seal.sealId, seal.authorizedAmount, intent.targetVendor, seal.status, maskedCard, seal.expirationDate);
54
+ if (seal.status !== "Rejected") {
55
+ this.stateTracker.addSpend(intent.requestedAmount);
56
+ }
57
+ return seal;
58
+ }
59
+ async executePayment(sealId, amount) {
60
+ if (this.stateTracker.isUsed(sealId)) {
61
+ return { status: "rejected", reason: "Burn-after-use enforced" };
62
+ }
63
+ this.stateTracker.markUsed(sealId);
64
+ return { status: "success", amount };
65
+ }
66
+ }
67
+ exports.PopClient = PopClient;
68
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAGzC,0DAAyD;AACzD,8CAAkD;AAElD,MAAa,SAAS;IACpB,QAAQ,CAAsB;IAC9B,MAAM,CAAkB;IACxB,YAAY,CAAkB;IAC9B,MAAM,CAAkB;IAExB,YACE,QAA6B,EAC7B,MAAuB,EACvB,MAAwB,EACxB,SAAiB,cAAc;QAE/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,0BAAe,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,+BAAe,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAqB;QACxC,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,GAAgB;gBACxB,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,uBAAuB;aACzC,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kBAAkB;QAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,GAAgB;gBACxB,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;aACxB,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,aAAa;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;YAChC,CAAC,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YAC/C,CAAC,CAAC,qBAAqB,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,UAAU,CAC1B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,gBAAgB,EACrB,MAAM,CAAC,YAAY,EACnB,IAAI,CAAC,MAAM,EACX,UAAU,EACV,IAAI,CAAC,cAAc,CACpB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,MAAc;QACjD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;CACF;AA7ED,8BA6EC"}
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ export declare const GuardrailPolicySchema: z.ZodObject<{
3
+ allowedCategories: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
4
+ maxAmountPerTx: z.ZodNumber;
5
+ maxDailyBudget: z.ZodNumber;
6
+ blockHallucinationLoops: z.ZodDefault<z.ZodBoolean>;
7
+ webhookUrl: z.ZodDefault<z.ZodNullable<z.ZodString>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ allowedCategories: string[];
10
+ maxAmountPerTx: number;
11
+ maxDailyBudget: number;
12
+ blockHallucinationLoops: boolean;
13
+ webhookUrl: string | null;
14
+ }, {
15
+ maxAmountPerTx: number;
16
+ maxDailyBudget: number;
17
+ allowedCategories?: string[] | undefined;
18
+ blockHallucinationLoops?: boolean | undefined;
19
+ webhookUrl?: string | null | undefined;
20
+ }>;
21
+ export type GuardrailPolicy = z.infer<typeof GuardrailPolicySchema>;
22
+ export declare const PaymentIntentSchema: z.ZodObject<{
23
+ agentId: z.ZodString;
24
+ requestedAmount: z.ZodNumber;
25
+ targetVendor: z.ZodString;
26
+ reasoning: z.ZodString;
27
+ pageUrl: z.ZodDefault<z.ZodNullable<z.ZodString>>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ agentId: string;
30
+ requestedAmount: number;
31
+ targetVendor: string;
32
+ reasoning: string;
33
+ pageUrl: string | null;
34
+ }, {
35
+ agentId: string;
36
+ requestedAmount: number;
37
+ targetVendor: string;
38
+ reasoning: string;
39
+ pageUrl?: string | null | undefined;
40
+ }>;
41
+ export type PaymentIntent = z.infer<typeof PaymentIntentSchema>;
42
+ export interface VirtualSeal {
43
+ sealId: string;
44
+ cardNumber: string | null;
45
+ cvv: string | null;
46
+ expirationDate: string | null;
47
+ authorizedAmount: number;
48
+ status: "Issued" | "Rejected" | "Revoked" | "Used";
49
+ rejectionReason: string | null;
50
+ }
51
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACnD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC"}