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
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentIntentSchema = exports.GuardrailPolicySchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
exports.GuardrailPolicySchema = zod_1.z.object({
|
|
6
|
+
allowedCategories: zod_1.z.array(zod_1.z.string()).default([]),
|
|
7
|
+
maxAmountPerTx: zod_1.z.number().positive(),
|
|
8
|
+
maxDailyBudget: zod_1.z.number().positive(),
|
|
9
|
+
blockHallucinationLoops: zod_1.z.boolean().default(true),
|
|
10
|
+
webhookUrl: zod_1.z.string().nullable().default(null),
|
|
11
|
+
});
|
|
12
|
+
exports.PaymentIntentSchema = zod_1.z.object({
|
|
13
|
+
agentId: zod_1.z.string(),
|
|
14
|
+
requestedAmount: zod_1.z.number().positive(),
|
|
15
|
+
targetVendor: zod_1.z.string().max(200),
|
|
16
|
+
reasoning: zod_1.z.string().max(2000),
|
|
17
|
+
pageUrl: zod_1.z.string().nullable().default(null),
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,iBAAiB,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClD,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,uBAAuB,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAChD,CAAC,CAAC;AAIU,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC7C,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class PopStateTracker {
|
|
2
|
+
private db;
|
|
3
|
+
dailySpendTotal: number;
|
|
4
|
+
constructor(dbPath?: string);
|
|
5
|
+
private initDb;
|
|
6
|
+
private getTodaySpent;
|
|
7
|
+
canSpend(amount: number, maxDailyBudget: number): boolean;
|
|
8
|
+
addSpend(amount: number): void;
|
|
9
|
+
recordSeal(sealId: string, amount: number, vendor: string, status?: string, maskedCard?: string | null, expirationDate?: string | null): void;
|
|
10
|
+
getSealMaskedCard(sealId: string): string;
|
|
11
|
+
markUsed(sealId: string): void;
|
|
12
|
+
isUsed(sealId: string): boolean;
|
|
13
|
+
close(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAoB;IAC9B,eAAe,EAAE,MAAM,CAAC;gBAEZ,MAAM,GAAE,MAAuB;IAO3C,OAAO,CAAC,MAAM;IAoBd,OAAO,CAAC,aAAa;IAQrB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAKzD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY9B,UAAU,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAiB,EACzB,UAAU,GAAE,MAAM,GAAG,IAAW,EAChC,cAAc,GAAE,MAAM,GAAG,IAAW,GACnC,IAAI;IASP,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOzC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM9B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAO/B,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PopStateTracker = void 0;
|
|
7
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
8
|
+
class PopStateTracker {
|
|
9
|
+
db;
|
|
10
|
+
dailySpendTotal;
|
|
11
|
+
constructor(dbPath = "pop_state.db") {
|
|
12
|
+
this.db = new better_sqlite3_1.default(dbPath);
|
|
13
|
+
this.db.pragma("journal_mode = WAL");
|
|
14
|
+
this.initDb();
|
|
15
|
+
this.dailySpendTotal = this.getTodaySpent();
|
|
16
|
+
}
|
|
17
|
+
initDb() {
|
|
18
|
+
this.db.exec(`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS daily_budget (
|
|
20
|
+
date TEXT PRIMARY KEY,
|
|
21
|
+
spent_amount REAL
|
|
22
|
+
)
|
|
23
|
+
`);
|
|
24
|
+
this.db.exec(`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS issued_seals (
|
|
26
|
+
seal_id TEXT PRIMARY KEY,
|
|
27
|
+
amount REAL,
|
|
28
|
+
vendor TEXT,
|
|
29
|
+
status TEXT,
|
|
30
|
+
masked_card TEXT,
|
|
31
|
+
expiration_date TEXT,
|
|
32
|
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
33
|
+
)
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
getTodaySpent() {
|
|
37
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
38
|
+
const row = this.db
|
|
39
|
+
.prepare("SELECT spent_amount FROM daily_budget WHERE date = ?")
|
|
40
|
+
.get(today);
|
|
41
|
+
return row?.spent_amount ?? 0.0;
|
|
42
|
+
}
|
|
43
|
+
canSpend(amount, maxDailyBudget) {
|
|
44
|
+
const spentToday = this.getTodaySpent();
|
|
45
|
+
return spentToday + amount <= maxDailyBudget;
|
|
46
|
+
}
|
|
47
|
+
addSpend(amount) {
|
|
48
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
49
|
+
this.db
|
|
50
|
+
.prepare(`INSERT INTO daily_budget (date, spent_amount)
|
|
51
|
+
VALUES (?, ?)
|
|
52
|
+
ON CONFLICT(date) DO UPDATE SET spent_amount = spent_amount + ?`)
|
|
53
|
+
.run(today, amount, amount);
|
|
54
|
+
this.dailySpendTotal = this.getTodaySpent();
|
|
55
|
+
}
|
|
56
|
+
recordSeal(sealId, amount, vendor, status = "Issued", maskedCard = null, expirationDate = null) {
|
|
57
|
+
this.db
|
|
58
|
+
.prepare(`INSERT INTO issued_seals (seal_id, amount, vendor, status, masked_card, expiration_date)
|
|
59
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
60
|
+
.run(sealId, amount, vendor, status, maskedCard, expirationDate);
|
|
61
|
+
}
|
|
62
|
+
getSealMaskedCard(sealId) {
|
|
63
|
+
const row = this.db
|
|
64
|
+
.prepare("SELECT masked_card FROM issued_seals WHERE seal_id = ?")
|
|
65
|
+
.get(sealId);
|
|
66
|
+
return row?.masked_card ?? "";
|
|
67
|
+
}
|
|
68
|
+
markUsed(sealId) {
|
|
69
|
+
this.db
|
|
70
|
+
.prepare("UPDATE issued_seals SET status = 'Used' WHERE seal_id = ?")
|
|
71
|
+
.run(sealId);
|
|
72
|
+
}
|
|
73
|
+
isUsed(sealId) {
|
|
74
|
+
const row = this.db
|
|
75
|
+
.prepare("SELECT status FROM issued_seals WHERE seal_id = ?")
|
|
76
|
+
.get(sealId);
|
|
77
|
+
return row?.status === "Used";
|
|
78
|
+
}
|
|
79
|
+
close() {
|
|
80
|
+
this.db.close();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.PopStateTracker = PopStateTracker;
|
|
84
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAsC;AAEtC,MAAa,eAAe;IAClB,EAAE,CAAoB;IAC9B,eAAe,CAAS;IAExB,YAAY,SAAiB,cAAc;QACzC,IAAI,CAAC,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;KAKZ,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;KAUZ,CAAC,CAAC;IACL,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,sDAAsD,CAAC;aAC/D,GAAG,CAAC,KAAK,CAAyC,CAAC;QACtD,OAAO,GAAG,EAAE,YAAY,IAAI,GAAG,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,MAAc,EAAE,cAAsB;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,OAAO,UAAU,GAAG,MAAM,IAAI,cAAc,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;yEAEiE,CAClE;aACA,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC;IAED,UAAU,CACR,MAAc,EACd,MAAc,EACd,MAAc,EACd,SAAiB,QAAQ,EACzB,aAA4B,IAAI,EAChC,iBAAgC,IAAI;QAEpC,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;mCAC2B,CAC5B;aACA,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IACrE,CAAC;IAED,iBAAiB,CAAC,MAAc;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,wDAAwD,CAAC;aACjE,GAAG,CAAC,MAAM,CAAwC,CAAC;QACtD,OAAO,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,mDAAmD,CAAC;aAC5D,GAAG,CAAC,MAAM,CAAmC,CAAC;QACjD,OAAO,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AA/FD,0CA+FC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PaymentIntent, GuardrailPolicy } from "../core/models.js";
|
|
2
|
+
export declare function matchVendor(vendorName: string, allowedCategories: string[], pageDomain?: string): boolean;
|
|
3
|
+
export declare class GuardrailEngine {
|
|
4
|
+
evaluateIntent(intent: PaymentIntent, policy: GuardrailPolicy): Promise<[boolean, string]>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=guardrails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/engine/guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMxE,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,UAAU,GAAE,MAAW,GACtB,OAAO,CAuCT;AAmBD,qBAAa,eAAe;IACpB,cAAc,CAClB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAsE9B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GuardrailEngine = void 0;
|
|
4
|
+
exports.matchVendor = matchVendor;
|
|
5
|
+
function tokenize(s) {
|
|
6
|
+
return new Set(s.toLowerCase().split(/[\s\-_./]+/).filter(Boolean));
|
|
7
|
+
}
|
|
8
|
+
function matchVendor(vendorName, allowedCategories, pageDomain = "") {
|
|
9
|
+
const vendorLower = vendorName.toLowerCase();
|
|
10
|
+
const vendorTokens = tokenize(vendorName);
|
|
11
|
+
const allowedLower = allowedCategories.map((c) => c.toLowerCase());
|
|
12
|
+
const pageDomainTokens = pageDomain
|
|
13
|
+
? new Set(pageDomain
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/^www\./, "")
|
|
16
|
+
.split(/[\s\-_./]+/)
|
|
17
|
+
.filter((tok) => tok && tok.length >= 4))
|
|
18
|
+
: new Set();
|
|
19
|
+
// Exact match
|
|
20
|
+
if (allowedLower.includes(vendorLower))
|
|
21
|
+
return true;
|
|
22
|
+
// Token-in-allowed
|
|
23
|
+
for (const tok of vendorTokens) {
|
|
24
|
+
if (allowedLower.includes(tok))
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// Allowed-subset-of-vendor
|
|
28
|
+
for (const cat of allowedLower) {
|
|
29
|
+
const catTokens = tokenize(cat);
|
|
30
|
+
catTokens.delete("");
|
|
31
|
+
if (catTokens.size > 0 && [...catTokens].every((t) => vendorTokens.has(t)))
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
// Page domain match
|
|
35
|
+
if (pageDomain) {
|
|
36
|
+
for (const cat of allowedLower) {
|
|
37
|
+
const catTokens = tokenize(cat);
|
|
38
|
+
catTokens.delete("");
|
|
39
|
+
if (catTokens.size > 0 && [...catTokens].every((t) => pageDomainTokens.has(t)))
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const KNOWN_VENDOR_DOMAINS = {
|
|
46
|
+
aws: ["amazonaws.com", "aws.amazon.com"],
|
|
47
|
+
amazon: ["amazon.com", "amazon.co.uk", "amazon.co.jp"],
|
|
48
|
+
github: ["github.com"],
|
|
49
|
+
cloudflare: ["cloudflare.com"],
|
|
50
|
+
openai: ["openai.com", "platform.openai.com"],
|
|
51
|
+
stripe: ["stripe.com", "dashboard.stripe.com"],
|
|
52
|
+
anthropic: ["anthropic.com", "claude.ai"],
|
|
53
|
+
google: ["google.com", "cloud.google.com", "console.cloud.google.com"],
|
|
54
|
+
microsoft: ["microsoft.com", "azure.microsoft.com", "portal.azure.com"],
|
|
55
|
+
wikipedia: ["wikipedia.org", "wikimedia.org", "donate.wikimedia.org"],
|
|
56
|
+
digitalocean: ["digitalocean.com", "cloud.digitalocean.com"],
|
|
57
|
+
heroku: ["heroku.com", "dashboard.heroku.com"],
|
|
58
|
+
vercel: ["vercel.com", "app.vercel.com"],
|
|
59
|
+
netlify: ["netlify.com", "app.netlify.com"],
|
|
60
|
+
};
|
|
61
|
+
class GuardrailEngine {
|
|
62
|
+
async evaluateIntent(intent, policy) {
|
|
63
|
+
// Rule 1: Vendor/Category check
|
|
64
|
+
if (!matchVendor(intent.targetVendor, policy.allowedCategories)) {
|
|
65
|
+
return [false, "Vendor not in allowed categories"];
|
|
66
|
+
}
|
|
67
|
+
// Rule 2: Hallucination/Loop detection
|
|
68
|
+
if (policy.blockHallucinationLoops) {
|
|
69
|
+
const reasoningLower = intent.reasoning.toLowerCase();
|
|
70
|
+
const loopKeywords = ["retry", "failed again", "loop", "ignore previous", "stuck"];
|
|
71
|
+
for (const kw of loopKeywords) {
|
|
72
|
+
if (reasoningLower.includes(kw)) {
|
|
73
|
+
return [false, "Hallucination or infinite loop detected in reasoning"];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Rule 3: Injection pattern detection
|
|
77
|
+
const injectionPatterns = [
|
|
78
|
+
/\{.*".*".*:/,
|
|
79
|
+
/output\s*:/,
|
|
80
|
+
/you are now/,
|
|
81
|
+
/ignore (all |previous |your |the )/,
|
|
82
|
+
/already (approved|authorized|confirmed)/,
|
|
83
|
+
/system (says|has|override)/,
|
|
84
|
+
];
|
|
85
|
+
for (const pattern of injectionPatterns) {
|
|
86
|
+
if (pattern.test(reasoningLower)) {
|
|
87
|
+
return [false, "Potential prompt injection detected in reasoning"];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// User-defined extra keywords from env
|
|
91
|
+
const extraKeywordsRaw = process.env.POP_EXTRA_BLOCK_KEYWORDS ?? "";
|
|
92
|
+
const extraKeywords = extraKeywordsRaw
|
|
93
|
+
.split(",")
|
|
94
|
+
.map((kw) => kw.trim().toLowerCase())
|
|
95
|
+
.filter(Boolean);
|
|
96
|
+
for (const kw of extraKeywords) {
|
|
97
|
+
if (reasoningLower.includes(kw)) {
|
|
98
|
+
return [false, `Blocked by custom keyword policy: '${kw}'`];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Rule 4: page_url domain cross-validation
|
|
103
|
+
if (intent.pageUrl) {
|
|
104
|
+
try {
|
|
105
|
+
const parsed = new URL(intent.pageUrl);
|
|
106
|
+
let netloc = parsed.hostname.toLowerCase();
|
|
107
|
+
if (netloc.startsWith("www."))
|
|
108
|
+
netloc = netloc.slice(4);
|
|
109
|
+
const vendorTokens = tokenize(intent.targetVendor);
|
|
110
|
+
for (const [knownVendor, knownDomains] of Object.entries(KNOWN_VENDOR_DOMAINS)) {
|
|
111
|
+
if (vendorTokens.has(knownVendor)) {
|
|
112
|
+
const domainOk = knownDomains.some((d) => netloc === d || netloc.endsWith("." + d));
|
|
113
|
+
if (!domainOk) {
|
|
114
|
+
return [false, "Page URL domain does not match expected vendor domain"];
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Invalid URL — skip domain validation
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return [true, "Approved"];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.GuardrailEngine = GuardrailEngine;
|
|
128
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../src/engine/guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PopBrowserInjector: CDP-based browser injector with iframe + Shadow DOM traversal.
|
|
3
|
+
*
|
|
4
|
+
* Connects to an already-running Chromium browser (via --remote-debugging-port)
|
|
5
|
+
* and auto-fills credit card fields on the active page — including fields inside
|
|
6
|
+
* Stripe and other third-party payment iframes. Also fills billing detail fields
|
|
7
|
+
* (name, address, email) that live in the main page frame.
|
|
8
|
+
*
|
|
9
|
+
* New in TS port: Shadow DOM piercing support.
|
|
10
|
+
*/
|
|
11
|
+
export declare const CARD_NUMBER_SELECTORS: string[];
|
|
12
|
+
export declare const EXPIRY_SELECTORS: string[];
|
|
13
|
+
export declare const CVV_SELECTORS: string[];
|
|
14
|
+
export declare const FIRST_NAME_SELECTORS: string[];
|
|
15
|
+
export declare const LAST_NAME_SELECTORS: string[];
|
|
16
|
+
export declare const FULL_NAME_SELECTORS: string[];
|
|
17
|
+
export declare const STREET_SELECTORS: string[];
|
|
18
|
+
export declare const ZIP_SELECTORS: string[];
|
|
19
|
+
export declare const EMAIL_SELECTORS: string[];
|
|
20
|
+
export declare const PHONE_SELECTORS: string[];
|
|
21
|
+
export declare const PHONE_COUNTRY_CODE_SELECTORS: string[];
|
|
22
|
+
export declare const COUNTRY_SELECTORS: string[];
|
|
23
|
+
export declare const STATE_SELECTORS: string[];
|
|
24
|
+
export declare const CITY_SELECTORS: string[];
|
|
25
|
+
export declare function ssrfValidateUrl(url: string): string | null;
|
|
26
|
+
export interface InjectionResult {
|
|
27
|
+
cardFilled: boolean;
|
|
28
|
+
billingFilled: boolean;
|
|
29
|
+
blockedReason: string;
|
|
30
|
+
billingDetails?: {
|
|
31
|
+
filled: string[];
|
|
32
|
+
failed: string[];
|
|
33
|
+
skipped: string[];
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface BillingInfo {
|
|
37
|
+
firstName: string;
|
|
38
|
+
lastName: string;
|
|
39
|
+
street: string;
|
|
40
|
+
city: string;
|
|
41
|
+
state: string;
|
|
42
|
+
country: string;
|
|
43
|
+
zip: string;
|
|
44
|
+
email: string;
|
|
45
|
+
phone: string;
|
|
46
|
+
phoneCountryCode: string;
|
|
47
|
+
}
|
|
48
|
+
export interface PageSnapshot {
|
|
49
|
+
url: string;
|
|
50
|
+
title: string;
|
|
51
|
+
html: string;
|
|
52
|
+
frames: {
|
|
53
|
+
url: string;
|
|
54
|
+
html: string;
|
|
55
|
+
}[];
|
|
56
|
+
}
|
|
57
|
+
export declare function verifyDomainToctou(pageUrl: string, approvedVendor: string): string | null;
|
|
58
|
+
export declare class PopBrowserInjector {
|
|
59
|
+
private cdpUrl;
|
|
60
|
+
private headless;
|
|
61
|
+
constructor(cdpUrl?: string, headless?: boolean);
|
|
62
|
+
injectPaymentInfo(opts: {
|
|
63
|
+
sealId: string;
|
|
64
|
+
cardNumber: string;
|
|
65
|
+
cvv: string;
|
|
66
|
+
expirationDate: string;
|
|
67
|
+
pageUrl?: string;
|
|
68
|
+
approvedVendor?: string;
|
|
69
|
+
}): Promise<InjectionResult>;
|
|
70
|
+
injectBillingOnly(opts: {
|
|
71
|
+
pageUrl?: string;
|
|
72
|
+
approvedVendor?: string;
|
|
73
|
+
}): Promise<InjectionResult>;
|
|
74
|
+
pageSnapshot(pageUrl?: string): Promise<PageSnapshot | null>;
|
|
75
|
+
private findBestTarget;
|
|
76
|
+
private fillCardAcrossFrames;
|
|
77
|
+
private fillCardInContext;
|
|
78
|
+
private fillCardInShadowDom;
|
|
79
|
+
private fillInputViaEval;
|
|
80
|
+
private selectOption;
|
|
81
|
+
private fillBillingField;
|
|
82
|
+
private fillBillingFields;
|
|
83
|
+
private loadBillingInfo;
|
|
84
|
+
private enableBlackout;
|
|
85
|
+
static maskedCard(cardNumber: string): string;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/engine/injector.ts"],"names":[],"mappings":"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"}
|