@jackclaw/payment-vault 0.2.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.
@@ -0,0 +1,7 @@
1
+ export { PaymentVault } from './vault';
2
+ export { readPaymentLog, computeDailyTotal } from './isolation';
3
+ export { SandboxPaymentProvider } from './sandbox';
4
+ export type { SandboxPaymentResult } from './sandbox';
5
+ /** True when PAYMENT_SANDBOX=true — no real payments are processed */
6
+ export declare const isSandboxMode: boolean;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAErD,sEAAsE;AACtE,eAAO,MAAM,aAAa,SAAyC,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSandboxMode = exports.SandboxPaymentProvider = exports.computeDailyTotal = exports.readPaymentLog = exports.PaymentVault = void 0;
4
+ var vault_1 = require("./vault");
5
+ Object.defineProperty(exports, "PaymentVault", { enumerable: true, get: function () { return vault_1.PaymentVault; } });
6
+ var isolation_1 = require("./isolation");
7
+ Object.defineProperty(exports, "readPaymentLog", { enumerable: true, get: function () { return isolation_1.readPaymentLog; } });
8
+ Object.defineProperty(exports, "computeDailyTotal", { enumerable: true, get: function () { return isolation_1.computeDailyTotal; } });
9
+ var sandbox_1 = require("./sandbox");
10
+ Object.defineProperty(exports, "SandboxPaymentProvider", { enumerable: true, get: function () { return sandbox_1.SandboxPaymentProvider; } });
11
+ /** True when PAYMENT_SANDBOX=true — no real payments are processed */
12
+ exports.isSandboxMode = process.env.PAYMENT_SANDBOX === 'true';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAsC;AAA7B,qGAAA,YAAY,OAAA;AACrB,yCAA+D;AAAtD,2GAAA,cAAc,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAC1C,qCAAkD;AAAzC,iHAAA,sBAAsB,OAAA;AAG/B,sEAAsE;AACzD,QAAA,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * VaultIsolationStore — Payment Vault 隔离存储层
3
+ *
4
+ * 规则(同 Watchdog isolation 模式):
5
+ * - 存储路径 ~/.jackclaw/vault/<nodeId>/,独立于 Watchdog/Memory
6
+ * - payments.jsonl chmod 444,只追加不可修改
7
+ * - 本模块不暴露删除/覆盖接口
8
+ */
9
+ import type { PaymentRequest } from '@jackclaw/protocol';
10
+ declare const VAULT_BASE_DEFAULT: string;
11
+ export declare function appendPaymentLog(baseDir: string, nodeId: string, entry: PaymentRequest): void;
12
+ export declare function readPaymentLog(baseDir: string, nodeId: string): PaymentRequest[];
13
+ export declare function computeDailyTotal(baseDir: string, nodeId: string): number;
14
+ export { VAULT_BASE_DEFAULT };
15
+ //# sourceMappingURL=isolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.d.ts","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,QAAA,MAAM,kBAAkB,QAAgD,CAAA;AAYxE,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,GACpB,IAAI,CAYN;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,cAAc,EAAE,CAMlB;AAID,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,CAYR;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * VaultIsolationStore — Payment Vault 隔离存储层
4
+ *
5
+ * 规则(同 Watchdog isolation 模式):
6
+ * - 存储路径 ~/.jackclaw/vault/<nodeId>/,独立于 Watchdog/Memory
7
+ * - payments.jsonl chmod 444,只追加不可修改
8
+ * - 本模块不暴露删除/覆盖接口
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.VAULT_BASE_DEFAULT = void 0;
45
+ exports.appendPaymentLog = appendPaymentLog;
46
+ exports.readPaymentLog = readPaymentLog;
47
+ exports.computeDailyTotal = computeDailyTotal;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const os = __importStar(require("os"));
51
+ const VAULT_BASE_DEFAULT = path.join(os.homedir(), '.jackclaw', 'vault');
52
+ exports.VAULT_BASE_DEFAULT = VAULT_BASE_DEFAULT;
53
+ function nodeDir(baseDir, nodeId) {
54
+ return path.join(baseDir, nodeId);
55
+ }
56
+ function ensureDir(dir) {
57
+ fs.mkdirSync(dir, { recursive: true });
58
+ }
59
+ // ── Append-only payment log ──────────────────────────────────────────────────
60
+ function appendPaymentLog(baseDir, nodeId, entry) {
61
+ const dir = nodeDir(baseDir, nodeId);
62
+ ensureDir(dir);
63
+ const filePath = path.join(dir, 'payments.jsonl');
64
+ // Temporarily unlock if exists
65
+ if (fs.existsSync(filePath)) {
66
+ try {
67
+ fs.chmodSync(filePath, 0o644);
68
+ }
69
+ catch { /* ignore */ }
70
+ }
71
+ fs.appendFileSync(filePath, JSON.stringify(entry) + '\n', 'utf8');
72
+ fs.chmodSync(filePath, 0o444);
73
+ }
74
+ function readPaymentLog(baseDir, nodeId) {
75
+ const filePath = path.join(nodeDir(baseDir, nodeId), 'payments.jsonl');
76
+ if (!fs.existsSync(filePath))
77
+ return [];
78
+ const lines = fs.readFileSync(filePath, 'utf8').split('\n').filter(Boolean);
79
+ return lines.map(line => JSON.parse(line));
80
+ }
81
+ // ── Daily totals (computed from log) ─────────────────────────────────────────
82
+ function computeDailyTotal(baseDir, nodeId) {
83
+ const todayStart = new Date();
84
+ todayStart.setHours(0, 0, 0, 0);
85
+ const todayMs = todayStart.getTime();
86
+ const entries = readPaymentLog(baseDir, nodeId);
87
+ return entries
88
+ .filter(e => e.createdAt >= todayMs &&
89
+ (e.status === 'executed' || e.status === 'approved' || e.status === 'pending_human' || e.status === 'pending_compliance'))
90
+ .reduce((sum, e) => sum + e.amount, 0);
91
+ }
92
+ //# sourceMappingURL=isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.js","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBH,4CAgBC;AAED,wCASC;AAID,8CAeC;AA/DD,uCAAwB;AACxB,2CAA4B;AAC5B,uCAAwB;AAGxB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;AA4D/D,gDAAkB;AA1D3B,SAAS,OAAO,CAAC,OAAe,EAAE,MAAc;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,gFAAgF;AAEhF,SAAgB,gBAAgB,CAC9B,OAAe,EACf,MAAc,EACd,KAAqB;IAErB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACpC,SAAS,CAAC,GAAG,CAAC,CAAA;IACd,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;IAEjD,+BAA+B;IAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAA;IACjE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC/B,CAAC;AAED,SAAgB,cAAc,CAC5B,OAAe,EACf,MAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3E,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAA;AAC9D,CAAC;AAED,gFAAgF;AAEhF,SAAgB,iBAAiB,CAC/B,OAAe,EACf,MAAc;IAEd,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAA;IAC7B,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;IAEpC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC/C,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,CACV,CAAC,CAAC,SAAS,IAAI,OAAO;QACtB,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAC1H;SACA,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * PaymentVault Sandbox Mode
3
+ * 开发/测试环境使用,不发起真实支付
4
+ * PAYMENT_SANDBOX=true 时自动启用
5
+ */
6
+ export interface SandboxPaymentResult {
7
+ transactionId: string;
8
+ status: "approved" | "declined" | "pending";
9
+ amount: number;
10
+ currency: string;
11
+ timestamp: number;
12
+ note: string;
13
+ }
14
+ export declare class SandboxPaymentProvider {
15
+ readonly isSandbox = true;
16
+ charge(amount: number, currency?: string, description?: string): Promise<SandboxPaymentResult>;
17
+ refund(transactionId: string, amount?: number): Promise<SandboxPaymentResult>;
18
+ static testCards: {
19
+ success: string;
20
+ decline: string;
21
+ insufficient: string;
22
+ };
23
+ }
24
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,sBAAsB;IACjC,QAAQ,CAAC,SAAS,QAAO;IAGnB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAQ,EAAE,WAAW,SAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiBzF,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAanF,MAAM,CAAC,SAAS;;;;MAIf;CACF"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * PaymentVault Sandbox Mode
4
+ * 开发/测试环境使用,不发起真实支付
5
+ * PAYMENT_SANDBOX=true 时自动启用
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SandboxPaymentProvider = void 0;
9
+ class SandboxPaymentProvider {
10
+ isSandbox = true;
11
+ // 模拟支付(固定成功,除非金额>9999)
12
+ async charge(amount, currency = "USD", description = "") {
13
+ void description;
14
+ await new Promise(r => setTimeout(r, 200)); // 模拟网络延迟
15
+ const approved = amount <= 9999;
16
+ return {
17
+ transactionId: `sandbox_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
18
+ status: approved ? "approved" : "declined",
19
+ amount,
20
+ currency,
21
+ timestamp: Date.now(),
22
+ note: approved
23
+ ? "✅ Sandbox payment approved — no real money moved"
24
+ : "❌ Sandbox decline — amount exceeds sandbox limit ($9,999)",
25
+ };
26
+ }
27
+ // 模拟退款
28
+ async refund(transactionId, amount) {
29
+ await new Promise(r => setTimeout(r, 100));
30
+ return {
31
+ transactionId: `refund_${transactionId}`,
32
+ status: "approved",
33
+ amount: amount ?? 0,
34
+ currency: "USD",
35
+ timestamp: Date.now(),
36
+ note: "✅ Sandbox refund approved",
37
+ };
38
+ }
39
+ // 生成测试卡号
40
+ static testCards = {
41
+ success: "4242 4242 4242 4242",
42
+ decline: "4000 0000 0000 0002",
43
+ insufficient: "4000 0000 0000 9995",
44
+ };
45
+ }
46
+ exports.SandboxPaymentProvider = SandboxPaymentProvider;
47
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAWH,MAAa,sBAAsB;IACxB,SAAS,GAAG,IAAI,CAAA;IAEzB,uBAAuB;IACvB,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,QAAQ,GAAG,KAAK,EAAE,WAAW,GAAG,EAAE;QAC7D,KAAK,WAAW,CAAA;QAChB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA,CAAE,SAAS;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAA;QAC/B,OAAO;YACL,aAAa,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE;YAC/E,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;YAC1C,MAAM;YACN,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,QAAQ;gBACZ,CAAC,CAAC,kDAAkD;gBACpD,CAAC,CAAC,2DAA2D;SAChE,CAAA;IACH,CAAC;IAED,OAAO;IACP,KAAK,CAAC,MAAM,CAAC,aAAqB,EAAE,MAAe;QACjD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1C,OAAO;YACL,aAAa,EAAE,UAAU,aAAa,EAAE;YACxC,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,MAAM,IAAI,CAAC;YACnB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,2BAA2B;SAClC,CAAA;IACH,CAAC;IAED,SAAS;IACT,MAAM,CAAC,SAAS,GAAG;QACjB,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,qBAAqB;QAC9B,YAAY,EAAE,qBAAqB;KACpC,CAAA;;AAtCH,wDAuCC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * PaymentVault — 隔离支付区核心类
3
+ *
4
+ * 状态机:pending_compliance → approved/pending_human → approved → executed
5
+ * → rejected (compliance fail or human reject)
6
+ *
7
+ * 安全约束:
8
+ * - Agent 不能直接执行支付,只能 submit → 合规检查 → 可能等人工审批 → execute
9
+ * - execute() 内部验证状态机,只有 approved 状态才能执行
10
+ * - 人工审批使用 HMAC-SHA256(同 Watchdog/HumanInLoop)
11
+ */
12
+ import { type PaymentRequest, type PaymentVaultConfig, type ComplianceCheckResult, type Jurisdiction } from '@jackclaw/protocol';
13
+ export declare class PaymentVault {
14
+ private config;
15
+ private baseDir;
16
+ readonly isSandboxMode: boolean;
17
+ /** In-memory index of active requests (persisted to JSONL on every mutation) */
18
+ private requests;
19
+ /** Per-node last-payment timestamp for cooldown enforcement */
20
+ private lastPaymentAt;
21
+ constructor(config: PaymentVaultConfig);
22
+ private warnSandbox;
23
+ checkCompliance(req: {
24
+ amount: number;
25
+ currency: string;
26
+ jurisdiction: Jurisdiction;
27
+ paymentMethod: string;
28
+ category: string;
29
+ nodeId: string;
30
+ }): ComplianceCheckResult;
31
+ submit(req: Omit<PaymentRequest, 'requestId' | 'status' | 'complianceResult' | 'humanApprovalRequired' | 'createdAt' | 'auditHash'>): PaymentRequest;
32
+ humanApprove(requestId: string, humanToken: string): PaymentRequest;
33
+ humanReject(requestId: string, humanToken: string, reason: string): PaymentRequest;
34
+ execute(requestId: string): PaymentRequest;
35
+ getDailyTotal(nodeId: string): number;
36
+ getAuditLog(nodeId: string): PaymentRequest[];
37
+ getPending(): PaymentRequest[];
38
+ getRequest(requestId: string): PaymentRequest;
39
+ generateHumanToken(requestId: string): string;
40
+ private verifyHumanToken;
41
+ private computeAuditHash;
42
+ }
43
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAGlB,MAAM,oBAAoB,CAAA;AAQ3B,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAQ;IACvB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAE/B,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAoC;IAEpD,+DAA+D;IAC/D,OAAO,CAAC,aAAa,CAA4B;gBAErC,MAAM,EAAE,kBAAkB;IAMtC,OAAO,CAAC,WAAW;IAQnB,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,YAAY,CAAA;QAC1B,aAAa,EAAE,MAAM,CAAA;QACrB,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;KACf,GAAG,qBAAqB;IAoDzB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,QAAQ,GAAG,kBAAkB,GAAG,uBAAuB,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,cAAc;IAyCpJ,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc;IAmBnE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IAsBlF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IAmC1C,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIrC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE;IAI7C,UAAU,IAAI,cAAc,EAAE;IAM9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IAU7C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAM7C,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,gBAAgB;CAKzB"}
package/dist/vault.js ADDED
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * PaymentVault — 隔离支付区核心类
4
+ *
5
+ * 状态机:pending_compliance → approved/pending_human → approved → executed
6
+ * → rejected (compliance fail or human reject)
7
+ *
8
+ * 安全约束:
9
+ * - Agent 不能直接执行支付,只能 submit → 合规检查 → 可能等人工审批 → execute
10
+ * - execute() 内部验证状态机,只有 approved 状态才能执行
11
+ * - 人工审批使用 HMAC-SHA256(同 Watchdog/HumanInLoop)
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.PaymentVault = void 0;
15
+ const crypto_1 = require("crypto");
16
+ const protocol_1 = require("@jackclaw/protocol");
17
+ const isolation_1 = require("./isolation");
18
+ class PaymentVault {
19
+ config;
20
+ baseDir;
21
+ isSandboxMode;
22
+ /** In-memory index of active requests (persisted to JSONL on every mutation) */
23
+ requests = new Map();
24
+ /** Per-node last-payment timestamp for cooldown enforcement */
25
+ lastPaymentAt = new Map();
26
+ constructor(config) {
27
+ this.config = config;
28
+ this.baseDir = config.vaultDir || isolation_1.VAULT_BASE_DEFAULT;
29
+ this.isSandboxMode = process.env.PAYMENT_SANDBOX === 'true';
30
+ }
31
+ warnSandbox() {
32
+ if (this.isSandboxMode) {
33
+ console.warn('[payment] SANDBOX MODE — no real payments');
34
+ }
35
+ }
36
+ // ── Compliance Engine ────────────────────────────────────────────────────────
37
+ checkCompliance(req) {
38
+ const rule = protocol_1.COMPLIANCE_RULES[req.jurisdiction] ?? protocol_1.COMPLIANCE_RULES['GLOBAL'];
39
+ const violations = [];
40
+ // 1. Prohibited category
41
+ if (rule.prohibitedCategories.includes(req.category)) {
42
+ violations.push(`Category "${req.category}" is prohibited in ${req.jurisdiction}`);
43
+ }
44
+ // 2. Payment method whitelist (empty = needs manual config)
45
+ if (rule.allowedPaymentMethods.length > 0 && !rule.allowedPaymentMethods.includes(req.paymentMethod)) {
46
+ violations.push(`Payment method "${req.paymentMethod}" not allowed in ${req.jurisdiction}`);
47
+ }
48
+ if (rule.allowedPaymentMethods.length === 0) {
49
+ violations.push(`No payment methods configured for ${req.jurisdiction} — requires manual setup`);
50
+ }
51
+ // 3. Daily limit
52
+ const dailyTotal = (0, isolation_1.computeDailyTotal)(this.baseDir, req.nodeId);
53
+ if (dailyTotal + req.amount > rule.maxDailyLimit) {
54
+ violations.push(`Daily limit exceeded: current $${dailyTotal} + $${req.amount} > $${rule.maxDailyLimit}`);
55
+ }
56
+ // 4. Cooldown
57
+ const lastTs = this.lastPaymentAt.get(req.nodeId);
58
+ if (lastTs && rule.cooldownSeconds > 0) {
59
+ const elapsed = (Date.now() - lastTs) / 1000;
60
+ if (elapsed < rule.cooldownSeconds) {
61
+ violations.push(`Cooldown: ${Math.ceil(rule.cooldownSeconds - elapsed)}s remaining`);
62
+ }
63
+ }
64
+ // Determine auto-approve or human required
65
+ const requiresHuman = req.amount > rule.autoApproveLimit || req.amount > rule.requireHumanAbove;
66
+ const autoApproved = violations.length === 0 && !requiresHuman;
67
+ return {
68
+ passed: violations.length === 0,
69
+ jurisdiction: req.jurisdiction,
70
+ rule,
71
+ violations,
72
+ requiresHuman,
73
+ autoApproved,
74
+ };
75
+ }
76
+ // ── Submit (Agent entry point) ─────────────────────────────────────────────
77
+ submit(req) {
78
+ this.warnSandbox();
79
+ const requestId = (0, crypto_1.randomUUID)();
80
+ // Run compliance
81
+ const complianceResult = this.checkCompliance({
82
+ amount: req.amount,
83
+ currency: req.currency,
84
+ jurisdiction: req.jurisdiction,
85
+ paymentMethod: req.paymentMethod,
86
+ category: req.category,
87
+ nodeId: req.nodeId,
88
+ });
89
+ let status;
90
+ if (!complianceResult.passed) {
91
+ status = 'rejected';
92
+ }
93
+ else if (complianceResult.autoApproved) {
94
+ status = 'approved';
95
+ }
96
+ else {
97
+ status = 'pending_human';
98
+ }
99
+ const payment = {
100
+ ...req,
101
+ requestId,
102
+ status,
103
+ complianceResult,
104
+ humanApprovalRequired: complianceResult.requiresHuman,
105
+ createdAt: Date.now(),
106
+ auditHash: this.computeAuditHash(requestId, req.amount, req.nodeId),
107
+ };
108
+ this.requests.set(requestId, payment);
109
+ (0, isolation_1.appendPaymentLog)(this.baseDir, req.nodeId, payment);
110
+ return payment;
111
+ }
112
+ // ── Human Approve / Reject ─────────────────────────────────────────────────
113
+ humanApprove(requestId, humanToken) {
114
+ this.warnSandbox();
115
+ const payment = this.getRequest(requestId);
116
+ if (payment.status !== 'pending_human') {
117
+ throw new Error(`Cannot approve: status is "${payment.status}", expected "pending_human"`);
118
+ }
119
+ if (!this.verifyHumanToken(requestId, humanToken)) {
120
+ throw new Error('Invalid human-token. Unauthorized.');
121
+ }
122
+ payment.status = 'approved';
123
+ payment.humanApprovedBy = `human:${humanToken.slice(0, 8)}`;
124
+ payment.humanApprovedAt = Date.now();
125
+ this.requests.set(requestId, payment);
126
+ (0, isolation_1.appendPaymentLog)(this.baseDir, payment.nodeId, payment);
127
+ return payment;
128
+ }
129
+ humanReject(requestId, humanToken, reason) {
130
+ this.warnSandbox();
131
+ const payment = this.getRequest(requestId);
132
+ if (payment.status !== 'pending_human') {
133
+ throw new Error(`Cannot reject: status is "${payment.status}", expected "pending_human"`);
134
+ }
135
+ if (!this.verifyHumanToken(requestId, humanToken)) {
136
+ throw new Error('Invalid human-token. Unauthorized.');
137
+ }
138
+ payment.status = 'rejected';
139
+ payment.failureReason = reason;
140
+ payment.humanApprovedBy = `human:${humanToken.slice(0, 8)}`;
141
+ payment.humanApprovedAt = Date.now();
142
+ this.requests.set(requestId, payment);
143
+ (0, isolation_1.appendPaymentLog)(this.baseDir, payment.nodeId, payment);
144
+ return payment;
145
+ }
146
+ // ── Execute (state-machine enforced) ───────────────────────────────────────
147
+ execute(requestId) {
148
+ this.warnSandbox();
149
+ const payment = this.getRequest(requestId);
150
+ if (payment.status !== 'approved') {
151
+ throw new Error(`Cannot execute: status is "${payment.status}". Only "approved" payments can be executed.`);
152
+ }
153
+ // Verify audit hash integrity
154
+ const expectedHash = this.computeAuditHash(requestId, payment.amount, payment.nodeId);
155
+ if (payment.auditHash !== expectedHash) {
156
+ payment.status = 'failed';
157
+ payment.failureReason = 'Audit hash mismatch — possible tampering';
158
+ this.requests.set(requestId, payment);
159
+ (0, isolation_1.appendPaymentLog)(this.baseDir, payment.nodeId, payment);
160
+ throw new Error('Audit hash verification failed');
161
+ }
162
+ // Execute (log-only in this version — no real payment gateway)
163
+ payment.status = 'executed';
164
+ payment.executedAt = Date.now();
165
+ this.lastPaymentAt.set(payment.nodeId, Date.now());
166
+ this.requests.set(requestId, payment);
167
+ (0, isolation_1.appendPaymentLog)(this.baseDir, payment.nodeId, payment);
168
+ console.log(`[vault] Payment executed: ${requestId} | $${payment.amount} ${payment.currency} → ${payment.recipient} | node=${payment.nodeId}`);
169
+ return payment;
170
+ }
171
+ // ── Read-only queries ──────────────────────────────────────────────────────
172
+ getDailyTotal(nodeId) {
173
+ return (0, isolation_1.computeDailyTotal)(this.baseDir, nodeId);
174
+ }
175
+ getAuditLog(nodeId) {
176
+ return (0, isolation_1.readPaymentLog)(this.baseDir, nodeId);
177
+ }
178
+ getPending() {
179
+ return Array.from(this.requests.values()).filter(r => r.status === 'pending_human');
180
+ }
181
+ getRequest(requestId) {
182
+ const payment = this.requests.get(requestId);
183
+ if (!payment) {
184
+ throw new Error(`Payment request ${requestId} not found`);
185
+ }
186
+ return payment;
187
+ }
188
+ // ── HMAC token (same mechanism as Watchdog/HumanInLoop) ────────────────────
189
+ generateHumanToken(requestId) {
190
+ return (0, crypto_1.createHmac)('sha256', this.config.humanTokenSecret)
191
+ .update(requestId)
192
+ .digest('hex');
193
+ }
194
+ verifyHumanToken(requestId, token) {
195
+ const expected = this.generateHumanToken(requestId);
196
+ try {
197
+ return (0, crypto_1.timingSafeEqual)(Buffer.from(expected, 'hex'), Buffer.from(token, 'hex'));
198
+ }
199
+ catch {
200
+ return false;
201
+ }
202
+ }
203
+ computeAuditHash(requestId, amount, nodeId) {
204
+ return (0, crypto_1.createHmac)('sha256', this.config.humanTokenSecret)
205
+ .update(`${requestId}:${amount}:${nodeId}`)
206
+ .digest('hex');
207
+ }
208
+ }
209
+ exports.PaymentVault = PaymentVault;
210
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@jackclaw/payment-vault",
3
+ "version": "0.2.0",
4
+ "description": "JackClaw Payment Vault — isolated compliance-first payment engine",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "clean": "rm -rf dist",
10
+ "prepublishOnly": "npm run build"
11
+ },
12
+ "dependencies": {
13
+ "@jackclaw/protocol": "^0.2.0"
14
+ },
15
+ "devDependencies": {
16
+ "typescript": "^5.4.0",
17
+ "@types/node": "^20.0.0"
18
+ },
19
+ "engines": {
20
+ "node": ">=20.0.0"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "license": "MIT",
28
+ "keywords": [
29
+ "jackclaw",
30
+ "payment",
31
+ "compliance",
32
+ "vault"
33
+ ],
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/DevJackKong/JackClawOS.git"
37
+ },
38
+ "homepage": "https://github.com/DevJackKong/JackClawOS#readme"
39
+ }