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.
- package/LICENSE +21 -0
- package/README.md +35 -0
- package/dist/cli-vault.d.ts +7 -0
- package/dist/cli-vault.d.ts.map +1 -0
- package/dist/cli-vault.js +233 -0
- package/dist/cli-vault.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +159 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +68 -0
- package/dist/client.js.map +1 -0
- package/dist/core/models.d.ts +51 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +19 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/state.d.ts +15 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +84 -0
- package/dist/core/state.js.map +1 -0
- package/dist/engine/guardrails.d.ts +6 -0
- package/dist/engine/guardrails.d.ts.map +1 -0
- package/dist/engine/guardrails.js +128 -0
- package/dist/engine/guardrails.js.map +1 -0
- package/dist/engine/injector.d.ts +87 -0
- package/dist/engine/injector.d.ts.map +1 -0
- package/dist/engine/injector.js +955 -0
- package/dist/engine/injector.js.map +1 -0
- package/dist/engine/known-processors.d.ts +11 -0
- package/dist/engine/known-processors.d.ts.map +1 -0
- package/dist/engine/known-processors.js +47 -0
- package/dist/engine/known-processors.js.map +1 -0
- package/dist/engine/llm-guardrails.d.ts +20 -0
- package/dist/engine/llm-guardrails.d.ts.map +1 -0
- package/dist/engine/llm-guardrails.js +89 -0
- package/dist/engine/llm-guardrails.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +7 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +334 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/providers/base.d.ts +5 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +3 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/byoc-local.d.ts +12 -0
- package/dist/providers/byoc-local.d.ts.map +1 -0
- package/dist/providers/byoc-local.js +56 -0
- package/dist/providers/byoc-local.js.map +1 -0
- package/dist/providers/stripe-mock.d.ts +6 -0
- package/dist/providers/stripe-mock.d.ts.map +1 -0
- package/dist/providers/stripe-mock.js +34 -0
- package/dist/providers/stripe-mock.js.map +1 -0
- package/dist/providers/stripe-real.d.ts +9 -0
- package/dist/providers/stripe-real.d.ts.map +1 -0
- package/dist/providers/stripe-real.js +84 -0
- package/dist/providers/stripe-real.js.map +1 -0
- package/dist/vault.d.ts +23 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +283 -0
- package/dist/vault.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|