@seedhape/core 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/dist/__tests__/acp.test.d.ts +2 -0
- package/dist/__tests__/acp.test.d.ts.map +1 -0
- package/dist/__tests__/acp.test.js +16 -0
- package/dist/__tests__/acp.test.js.map +1 -0
- package/dist/__tests__/ap2-official.test.d.ts +2 -0
- package/dist/__tests__/ap2-official.test.d.ts.map +1 -0
- package/dist/__tests__/ap2-official.test.js +49 -0
- package/dist/__tests__/ap2-official.test.js.map +1 -0
- package/dist/__tests__/mpp.test.d.ts +2 -0
- package/dist/__tests__/mpp.test.d.ts.map +1 -0
- package/dist/__tests__/mpp.test.js +42 -0
- package/dist/__tests__/mpp.test.js.map +1 -0
- package/dist/__tests__/outbound.test.d.ts +2 -0
- package/dist/__tests__/outbound.test.d.ts.map +1 -0
- package/dist/__tests__/outbound.test.js +23 -0
- package/dist/__tests__/outbound.test.js.map +1 -0
- package/dist/__tests__/protocols.test.d.ts +2 -0
- package/dist/__tests__/protocols.test.d.ts.map +1 -0
- package/dist/__tests__/protocols.test.js +16 -0
- package/dist/__tests__/protocols.test.js.map +1 -0
- package/dist/__tests__/providers.test.d.ts +2 -0
- package/dist/__tests__/providers.test.d.ts.map +1 -0
- package/dist/__tests__/providers.test.js +41 -0
- package/dist/__tests__/providers.test.js.map +1 -0
- package/dist/__tests__/reconciliation.test.d.ts +2 -0
- package/dist/__tests__/reconciliation.test.d.ts.map +1 -0
- package/dist/__tests__/reconciliation.test.js +35 -0
- package/dist/__tests__/reconciliation.test.js.map +1 -0
- package/dist/__tests__/spending-controls.test.d.ts +2 -0
- package/dist/__tests__/spending-controls.test.d.ts.map +1 -0
- package/dist/__tests__/spending-controls.test.js +47 -0
- package/dist/__tests__/spending-controls.test.js.map +1 -0
- package/dist/__tests__/tax-and-policy.test.d.ts +7 -0
- package/dist/__tests__/tax-and-policy.test.d.ts.map +1 -0
- package/dist/__tests__/tax-and-policy.test.js +389 -0
- package/dist/__tests__/tax-and-policy.test.js.map +1 -0
- package/dist/__tests__/web-bot-auth.test.d.ts +2 -0
- package/dist/__tests__/web-bot-auth.test.d.ts.map +1 -0
- package/dist/__tests__/web-bot-auth.test.js +33 -0
- package/dist/__tests__/web-bot-auth.test.js.map +1 -0
- package/dist/__tests__/x402-solana.test.d.ts +2 -0
- package/dist/__tests__/x402-solana.test.d.ts.map +1 -0
- package/dist/__tests__/x402-solana.test.js +155 -0
- package/dist/__tests__/x402-solana.test.js.map +1 -0
- package/dist/acp.d.ts +28 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +49 -0
- package/dist/acp.js.map +1 -0
- package/dist/ap2/mandates.d.ts +319 -0
- package/dist/ap2/mandates.d.ts.map +1 -0
- package/dist/ap2/mandates.js +214 -0
- package/dist/ap2/mandates.js.map +1 -0
- package/dist/ap2/official.d.ts +156 -0
- package/dist/ap2/official.d.ts.map +1 -0
- package/dist/ap2/official.js +222 -0
- package/dist/ap2/official.js.map +1 -0
- package/dist/ap2/policy.d.ts +93 -0
- package/dist/ap2/policy.d.ts.map +1 -0
- package/dist/ap2/policy.js +216 -0
- package/dist/ap2/policy.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/india/fx.d.ts +59 -0
- package/dist/india/fx.d.ts.map +1 -0
- package/dist/india/fx.js +93 -0
- package/dist/india/fx.js.map +1 -0
- package/dist/india/vda-tax.d.ts +151 -0
- package/dist/india/vda-tax.d.ts.map +1 -0
- package/dist/india/vda-tax.js +226 -0
- package/dist/india/vda-tax.js.map +1 -0
- package/dist/mandate-builder.d.ts +102 -0
- package/dist/mandate-builder.d.ts.map +1 -0
- package/dist/mandate-builder.js +99 -0
- package/dist/mandate-builder.js.map +1 -0
- package/dist/mpp.d.ts +53 -0
- package/dist/mpp.d.ts.map +1 -0
- package/dist/mpp.js +164 -0
- package/dist/mpp.js.map +1 -0
- package/dist/orchestrator.d.ts +115 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +351 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/postgres-store.d.ts +60 -0
- package/dist/postgres-store.d.ts.map +1 -0
- package/dist/postgres-store.js +441 -0
- package/dist/postgres-store.js.map +1 -0
- package/dist/protocols.d.ts +18 -0
- package/dist/protocols.d.ts.map +1 -0
- package/dist/protocols.js +24 -0
- package/dist/protocols.js.map +1 -0
- package/dist/reconciliation.d.ts +27 -0
- package/dist/reconciliation.d.ts.map +1 -0
- package/dist/reconciliation.js +38 -0
- package/dist/reconciliation.js.map +1 -0
- package/dist/store.d.ts +110 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +369 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +195 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +30 -0
- package/dist/types.js.map +1 -0
- package/dist/util/canonical.d.ts +9 -0
- package/dist/util/canonical.d.ts.map +1 -0
- package/dist/util/canonical.js +35 -0
- package/dist/util/canonical.js.map +1 -0
- package/dist/wallet/provider.d.ts +118 -0
- package/dist/wallet/provider.d.ts.map +1 -0
- package/dist/wallet/provider.js +160 -0
- package/dist/wallet/provider.js.map +1 -0
- package/dist/wallet/providers.d.ts +107 -0
- package/dist/wallet/providers.d.ts.map +1 -0
- package/dist/wallet/providers.js +188 -0
- package/dist/wallet/providers.js.map +1 -0
- package/dist/web-bot-auth.d.ts +54 -0
- package/dist/web-bot-auth.d.ts.map +1 -0
- package/dist/web-bot-auth.js +112 -0
- package/dist/web-bot-auth.js.map +1 -0
- package/dist/x402/client.d.ts +101 -0
- package/dist/x402/client.d.ts.map +1 -0
- package/dist/x402/client.js +291 -0
- package/dist/x402/client.js.map +1 -0
- package/dist/x402/outbound.d.ts +15 -0
- package/dist/x402/outbound.d.ts.map +1 -0
- package/dist/x402/outbound.js +59 -0
- package/dist/x402/outbound.js.map +1 -0
- package/dist/x402/types.d.ts +80 -0
- package/dist/x402/types.d.ts.map +1 -0
- package/dist/x402/types.js +2 -0
- package/dist/x402/types.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { CommerceEvent, MandateHash, OnrampLot, SignedIntentMandate, SpendRecord } from "./types.js";
|
|
2
|
+
import type { AccountBudget, Store } from "./store.js";
|
|
3
|
+
/**
|
|
4
|
+
* Persistent schema for hosted/serverless deployments.
|
|
5
|
+
*
|
|
6
|
+
* Amounts remain TEXT because they are bigint values in the domain model and
|
|
7
|
+
* must never pass through JavaScript Number conversion.
|
|
8
|
+
*/
|
|
9
|
+
export declare const POSTGRES_SCHEMA = "\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY, created_at BIGINT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS spending_controls (\n user_id TEXT PRIMARY KEY REFERENCES users(id),\n paused BOOLEAN NOT NULL DEFAULT FALSE,\n updated_at BIGINT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS account_budgets (\n user_id TEXT PRIMARY KEY,\n amount TEXT NOT NULL,\n currency TEXT NOT NULL,\n period_seconds INTEGER NOT NULL,\n period_start BIGINT NOT NULL,\n updated_at BIGINT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS spend_reservations (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n amount TEXT NOT NULL,\n period_start BIGINT NOT NULL,\n period_limit TEXT NOT NULL,\n status TEXT NOT NULL,\n created_at BIGINT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_spend_reservations_user ON spend_reservations(user_id, created_at, status);\nCREATE TABLE IF NOT EXISTS user_identities (\n provider TEXT NOT NULL, provider_subject TEXT NOT NULL,\n user_id TEXT NOT NULL REFERENCES users(id), email TEXT, display_name TEXT,\n created_at BIGINT NOT NULL, PRIMARY KEY (provider, provider_subject)\n);\nCREATE INDEX IF NOT EXISTS idx_user_identities_user ON user_identities(user_id);\nCREATE TABLE IF NOT EXISTS user_wallets (\n user_id TEXT NOT NULL REFERENCES users(id), role TEXT NOT NULL,\n address TEXT NOT NULL UNIQUE, created_at BIGINT NOT NULL, PRIMARY KEY (user_id, role)\n);\nCREATE TABLE IF NOT EXISTS mandate_consents (\n id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES users(id), mandate_hash TEXT NOT NULL,\n auth_provider TEXT NOT NULL, provider_subject TEXT NOT NULL,\n metadata_json JSONB NOT NULL, consented_at BIGINT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_mandate_consents_user ON mandate_consents(user_id, consented_at);\nCREATE TABLE IF NOT EXISTS agent_keys (\n subject TEXT PRIMARY KEY,\n address TEXT NOT NULL UNIQUE,\n key_envelope TEXT NOT NULL,\n created_at BIGINT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS mcp_tokens (\n token_hash TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n label TEXT NOT NULL,\n scopes_json JSONB NOT NULL,\n expires_at BIGINT,\n revoked_at BIGINT,\n created_at BIGINT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_mcp_tokens_user ON mcp_tokens(user_id);\nCREATE TABLE IF NOT EXISTS mcp_challenges (\n address TEXT NOT NULL,\n message TEXT PRIMARY KEY,\n expires_at BIGINT NOT NULL,\n created_at BIGINT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS intents (\n hash TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n json JSONB NOT NULL,\n expiry BIGINT NOT NULL,\n revoked_at BIGINT\n);\nCREATE INDEX IF NOT EXISTS idx_intents_user ON intents(user_id);\n\nCREATE TABLE IF NOT EXISTS spends (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n intent_hash TEXT NOT NULL,\n cart_hash TEXT,\n payment_hash TEXT,\n resource TEXT NOT NULL,\n host TEXT NOT NULL,\n pay_to TEXT NOT NULL,\n amount TEXT NOT NULL,\n asset_json JSONB NOT NULL,\n inr_paise TEXT NOT NULL,\n fx_rate_scaled TEXT NOT NULL,\n status TEXT NOT NULL,\n tx_hash TEXT,\n created_at BIGINT NOT NULL,\n settled_at BIGINT,\n block_reason TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_spends_user_time ON spends(user_id, created_at);\nCREATE INDEX IF NOT EXISTS idx_spends_intent ON spends(intent_hash, created_at);\nCREATE INDEX IF NOT EXISTS idx_spends_resource ON spends(user_id, resource);\n\nCREATE TABLE IF NOT EXISTS lots (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n quantity TEXT NOT NULL,\n remaining TEXT NOT NULL,\n cost_inr_paise TEXT NOT NULL,\n acquired_at BIGINT NOT NULL,\n provider_tx_id TEXT NOT NULL,\n provider TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lots_user_time ON lots(user_id, acquired_at);\n\nCREATE TABLE IF NOT EXISTS commerce_events (\n id TEXT PRIMARY KEY,\n side TEXT NOT NULL,\n status TEXT NOT NULL,\n product_id TEXT NOT NULL,\n amount TEXT,\n payer TEXT,\n transaction_id TEXT,\n at BIGINT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_commerce_events_at ON commerce_events(at);\n";
|
|
10
|
+
export declare class PostgresStore implements Store {
|
|
11
|
+
private readonly pool;
|
|
12
|
+
private readonly ready;
|
|
13
|
+
constructor(connectionString: string);
|
|
14
|
+
migrate(): Promise<void>;
|
|
15
|
+
/** Wait until the constructor's startup migration has completed. */
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
isSpendingPaused(userId: string): Promise<boolean>;
|
|
18
|
+
setSpendingPaused(userId: string, paused: boolean, at?: number): Promise<void>;
|
|
19
|
+
getAccountBudget(userId: string): Promise<AccountBudget | null>;
|
|
20
|
+
setAccountBudget(userId: string, budget: AccountBudget, at?: number): Promise<void>;
|
|
21
|
+
getAccountBudgetUsage(userId: string, periodStart: number): Promise<{
|
|
22
|
+
spent: bigint;
|
|
23
|
+
reserved: bigint;
|
|
24
|
+
}>;
|
|
25
|
+
reserveSpend(userId: string, reservationId: string, amount: bigint, periodStart: number, periodLimit: bigint, at?: number): Promise<boolean>;
|
|
26
|
+
releaseSpendReservation(reservationId: string): Promise<void>;
|
|
27
|
+
commitSpendReservation(reservationId: string): Promise<void>;
|
|
28
|
+
createMcpToken(userId: string, label: string, expiresAt?: number): Promise<{
|
|
29
|
+
token: string;
|
|
30
|
+
expiresAt: number;
|
|
31
|
+
}>;
|
|
32
|
+
createMcpChallenge(address: string, message: string, expiresAt: number): Promise<void>;
|
|
33
|
+
consumeMcpChallenge(address: string, message: string): Promise<{
|
|
34
|
+
expiresAt: number;
|
|
35
|
+
} | null>;
|
|
36
|
+
resolveMcpToken(token: string): Promise<{
|
|
37
|
+
userId: string;
|
|
38
|
+
scopes: string[];
|
|
39
|
+
} | null>;
|
|
40
|
+
revokeMcpToken(token: string): Promise<void>;
|
|
41
|
+
putIntent(userId: string, m: SignedIntentMandate): Promise<void>;
|
|
42
|
+
getIntent(hash: MandateHash): Promise<SignedIntentMandate | null>;
|
|
43
|
+
listIntents(userId: string, includeExpired?: boolean): Promise<SignedIntentMandate[]>;
|
|
44
|
+
revokeIntent(hash: MandateHash, at: number): Promise<void>;
|
|
45
|
+
putSpend(s: SpendRecord): Promise<void>;
|
|
46
|
+
updateSpend(id: string, patch: Partial<SpendRecord>): Promise<void>;
|
|
47
|
+
listSpends(userId: string, sinceUnix?: number): Promise<SpendRecord[]>;
|
|
48
|
+
spendsForIntent(hash: MandateHash, sinceUnix: number): Promise<SpendRecord[]>;
|
|
49
|
+
medianPriceForResource(userId: string, resource: string): Promise<bigint | undefined>;
|
|
50
|
+
medianPriceOverall(userId: string): Promise<bigint | undefined>;
|
|
51
|
+
knownHosts(userId: string): Promise<Set<string>>;
|
|
52
|
+
putLot(l: OnrampLot): Promise<void>;
|
|
53
|
+
listLots(userId: string): Promise<OnrampLot[]>;
|
|
54
|
+
updateLotRemaining(id: string, remaining: bigint): Promise<void>;
|
|
55
|
+
latestLot(userId: string): Promise<OnrampLot | null>;
|
|
56
|
+
putCommerceEvent(event: CommerceEvent): Promise<void>;
|
|
57
|
+
listCommerceEvents(limit?: number): Promise<CommerceEvent[]>;
|
|
58
|
+
close(): void;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=postgres-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../src/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { Pool } from "pg";
|
|
2
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
3
|
+
/**
|
|
4
|
+
* Persistent schema for hosted/serverless deployments.
|
|
5
|
+
*
|
|
6
|
+
* Amounts remain TEXT because they are bigint values in the domain model and
|
|
7
|
+
* must never pass through JavaScript Number conversion.
|
|
8
|
+
*/
|
|
9
|
+
export const POSTGRES_SCHEMA = `
|
|
10
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
11
|
+
id TEXT PRIMARY KEY, created_at BIGINT NOT NULL
|
|
12
|
+
);
|
|
13
|
+
CREATE TABLE IF NOT EXISTS spending_controls (
|
|
14
|
+
user_id TEXT PRIMARY KEY REFERENCES users(id),
|
|
15
|
+
paused BOOLEAN NOT NULL DEFAULT FALSE,
|
|
16
|
+
updated_at BIGINT NOT NULL
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE IF NOT EXISTS account_budgets (
|
|
19
|
+
user_id TEXT PRIMARY KEY,
|
|
20
|
+
amount TEXT NOT NULL,
|
|
21
|
+
currency TEXT NOT NULL,
|
|
22
|
+
period_seconds INTEGER NOT NULL,
|
|
23
|
+
period_start BIGINT NOT NULL,
|
|
24
|
+
updated_at BIGINT NOT NULL
|
|
25
|
+
);
|
|
26
|
+
CREATE TABLE IF NOT EXISTS spend_reservations (
|
|
27
|
+
id TEXT PRIMARY KEY,
|
|
28
|
+
user_id TEXT NOT NULL,
|
|
29
|
+
amount TEXT NOT NULL,
|
|
30
|
+
period_start BIGINT NOT NULL,
|
|
31
|
+
period_limit TEXT NOT NULL,
|
|
32
|
+
status TEXT NOT NULL,
|
|
33
|
+
created_at BIGINT NOT NULL
|
|
34
|
+
);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_spend_reservations_user ON spend_reservations(user_id, created_at, status);
|
|
36
|
+
CREATE TABLE IF NOT EXISTS user_identities (
|
|
37
|
+
provider TEXT NOT NULL, provider_subject TEXT NOT NULL,
|
|
38
|
+
user_id TEXT NOT NULL REFERENCES users(id), email TEXT, display_name TEXT,
|
|
39
|
+
created_at BIGINT NOT NULL, PRIMARY KEY (provider, provider_subject)
|
|
40
|
+
);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_user_identities_user ON user_identities(user_id);
|
|
42
|
+
CREATE TABLE IF NOT EXISTS user_wallets (
|
|
43
|
+
user_id TEXT NOT NULL REFERENCES users(id), role TEXT NOT NULL,
|
|
44
|
+
address TEXT NOT NULL UNIQUE, created_at BIGINT NOT NULL, PRIMARY KEY (user_id, role)
|
|
45
|
+
);
|
|
46
|
+
CREATE TABLE IF NOT EXISTS mandate_consents (
|
|
47
|
+
id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES users(id), mandate_hash TEXT NOT NULL,
|
|
48
|
+
auth_provider TEXT NOT NULL, provider_subject TEXT NOT NULL,
|
|
49
|
+
metadata_json JSONB NOT NULL, consented_at BIGINT NOT NULL
|
|
50
|
+
);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_mandate_consents_user ON mandate_consents(user_id, consented_at);
|
|
52
|
+
CREATE TABLE IF NOT EXISTS agent_keys (
|
|
53
|
+
subject TEXT PRIMARY KEY,
|
|
54
|
+
address TEXT NOT NULL UNIQUE,
|
|
55
|
+
key_envelope TEXT NOT NULL,
|
|
56
|
+
created_at BIGINT NOT NULL
|
|
57
|
+
);
|
|
58
|
+
CREATE TABLE IF NOT EXISTS mcp_tokens (
|
|
59
|
+
token_hash TEXT PRIMARY KEY,
|
|
60
|
+
user_id TEXT NOT NULL,
|
|
61
|
+
label TEXT NOT NULL,
|
|
62
|
+
scopes_json JSONB NOT NULL,
|
|
63
|
+
expires_at BIGINT,
|
|
64
|
+
revoked_at BIGINT,
|
|
65
|
+
created_at BIGINT NOT NULL
|
|
66
|
+
);
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_mcp_tokens_user ON mcp_tokens(user_id);
|
|
68
|
+
CREATE TABLE IF NOT EXISTS mcp_challenges (
|
|
69
|
+
address TEXT NOT NULL,
|
|
70
|
+
message TEXT PRIMARY KEY,
|
|
71
|
+
expires_at BIGINT NOT NULL,
|
|
72
|
+
created_at BIGINT NOT NULL
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE IF NOT EXISTS intents (
|
|
76
|
+
hash TEXT PRIMARY KEY,
|
|
77
|
+
user_id TEXT NOT NULL,
|
|
78
|
+
json JSONB NOT NULL,
|
|
79
|
+
expiry BIGINT NOT NULL,
|
|
80
|
+
revoked_at BIGINT
|
|
81
|
+
);
|
|
82
|
+
CREATE INDEX IF NOT EXISTS idx_intents_user ON intents(user_id);
|
|
83
|
+
|
|
84
|
+
CREATE TABLE IF NOT EXISTS spends (
|
|
85
|
+
id TEXT PRIMARY KEY,
|
|
86
|
+
user_id TEXT NOT NULL,
|
|
87
|
+
intent_hash TEXT NOT NULL,
|
|
88
|
+
cart_hash TEXT,
|
|
89
|
+
payment_hash TEXT,
|
|
90
|
+
resource TEXT NOT NULL,
|
|
91
|
+
host TEXT NOT NULL,
|
|
92
|
+
pay_to TEXT NOT NULL,
|
|
93
|
+
amount TEXT NOT NULL,
|
|
94
|
+
asset_json JSONB NOT NULL,
|
|
95
|
+
inr_paise TEXT NOT NULL,
|
|
96
|
+
fx_rate_scaled TEXT NOT NULL,
|
|
97
|
+
status TEXT NOT NULL,
|
|
98
|
+
tx_hash TEXT,
|
|
99
|
+
created_at BIGINT NOT NULL,
|
|
100
|
+
settled_at BIGINT,
|
|
101
|
+
block_reason TEXT
|
|
102
|
+
);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_spends_user_time ON spends(user_id, created_at);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_spends_intent ON spends(intent_hash, created_at);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_spends_resource ON spends(user_id, resource);
|
|
106
|
+
|
|
107
|
+
CREATE TABLE IF NOT EXISTS lots (
|
|
108
|
+
id TEXT PRIMARY KEY,
|
|
109
|
+
user_id TEXT NOT NULL,
|
|
110
|
+
quantity TEXT NOT NULL,
|
|
111
|
+
remaining TEXT NOT NULL,
|
|
112
|
+
cost_inr_paise TEXT NOT NULL,
|
|
113
|
+
acquired_at BIGINT NOT NULL,
|
|
114
|
+
provider_tx_id TEXT NOT NULL,
|
|
115
|
+
provider TEXT NOT NULL
|
|
116
|
+
);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_lots_user_time ON lots(user_id, acquired_at);
|
|
118
|
+
|
|
119
|
+
CREATE TABLE IF NOT EXISTS commerce_events (
|
|
120
|
+
id TEXT PRIMARY KEY,
|
|
121
|
+
side TEXT NOT NULL,
|
|
122
|
+
status TEXT NOT NULL,
|
|
123
|
+
product_id TEXT NOT NULL,
|
|
124
|
+
amount TEXT,
|
|
125
|
+
payer TEXT,
|
|
126
|
+
transaction_id TEXT,
|
|
127
|
+
at BIGINT NOT NULL
|
|
128
|
+
);
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_commerce_events_at ON commerce_events(at);
|
|
130
|
+
`;
|
|
131
|
+
export class PostgresStore {
|
|
132
|
+
pool;
|
|
133
|
+
ready;
|
|
134
|
+
constructor(connectionString) {
|
|
135
|
+
this.pool = new Pool({
|
|
136
|
+
connectionString,
|
|
137
|
+
max: Number(process.env.SEEDHAPE_DB_POOL_MAX ?? 5),
|
|
138
|
+
idleTimeoutMillis: 10_000,
|
|
139
|
+
connectionTimeoutMillis: 10_000,
|
|
140
|
+
maxUses: 7_500,
|
|
141
|
+
});
|
|
142
|
+
this.ready = this.migrate();
|
|
143
|
+
}
|
|
144
|
+
async migrate() {
|
|
145
|
+
const client = await this.pool.connect();
|
|
146
|
+
try {
|
|
147
|
+
await client.query("BEGIN");
|
|
148
|
+
await client.query(POSTGRES_SCHEMA);
|
|
149
|
+
await client.query("COMMIT");
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
await client.query("ROLLBACK");
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
client.release();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Wait until the constructor's startup migration has completed. */
|
|
160
|
+
async initialize() {
|
|
161
|
+
await this.ready;
|
|
162
|
+
}
|
|
163
|
+
async isSpendingPaused(userId) {
|
|
164
|
+
await this.ready;
|
|
165
|
+
const result = await this.pool.query("SELECT paused FROM spending_controls WHERE user_id = $1", [userId]);
|
|
166
|
+
return result.rows[0]?.paused ?? false;
|
|
167
|
+
}
|
|
168
|
+
async setSpendingPaused(userId, paused, at = Math.floor(Date.now() / 1000)) {
|
|
169
|
+
await this.ready;
|
|
170
|
+
await this.pool.query("INSERT INTO spending_controls (user_id, paused, updated_at) VALUES ($1, $2, $3) ON CONFLICT (user_id) DO UPDATE SET paused = EXCLUDED.paused, updated_at = EXCLUDED.updated_at", [userId, paused, at]);
|
|
171
|
+
}
|
|
172
|
+
async getAccountBudget(userId) { await this.ready; const result = await this.pool.query("SELECT amount,currency,period_seconds,period_start FROM account_budgets WHERE user_id = $1", [userId]); const row = result.rows[0]; return row ? { amount: BigInt(row.amount), currency: row.currency, periodSeconds: row.period_seconds, periodStart: Number(row.period_start) } : null; }
|
|
173
|
+
async setAccountBudget(userId, budget, at = Math.floor(Date.now() / 1000)) { await this.ready; await this.pool.query("INSERT INTO account_budgets (user_id,amount,currency,period_seconds,period_start,updated_at) VALUES ($1,$2,$3,$4,$5,$6) ON CONFLICT (user_id) DO UPDATE SET amount=EXCLUDED.amount,currency=EXCLUDED.currency,period_seconds=EXCLUDED.period_seconds,period_start=EXCLUDED.period_start,updated_at=EXCLUDED.updated_at", [userId, budget.amount.toString(), budget.currency, budget.periodSeconds, budget.periodStart, at]); }
|
|
174
|
+
async getAccountBudgetUsage(userId, periodStart) { await this.ready; const [spent, reserved] = await Promise.all([this.pool.query("SELECT COALESCE(SUM(amount::numeric),0)::text AS total FROM spends WHERE user_id=$1 AND created_at >= $2 AND status='settled'", [userId, periodStart]), this.pool.query("SELECT COALESCE(SUM(amount::numeric),0)::text AS total FROM spend_reservations WHERE user_id=$1 AND created_at >= $2 AND status='reserved'", [userId, periodStart])]); return { spent: BigInt(spent.rows[0]?.total ?? "0"), reserved: BigInt(reserved.rows[0]?.total ?? "0") }; }
|
|
175
|
+
async reserveSpend(userId, reservationId, amount, periodStart, periodLimit, at = Math.floor(Date.now() / 1000)) {
|
|
176
|
+
await this.ready;
|
|
177
|
+
const client = await this.pool.connect();
|
|
178
|
+
try {
|
|
179
|
+
await client.query("BEGIN");
|
|
180
|
+
const existing = await client.query("SELECT status FROM spend_reservations WHERE id = $1 FOR UPDATE", [reservationId]);
|
|
181
|
+
if (existing.rows[0]) {
|
|
182
|
+
await client.query("COMMIT");
|
|
183
|
+
return existing.rows[0].status === "reserved" || existing.rows[0].status === "committed";
|
|
184
|
+
}
|
|
185
|
+
const spent = await client.query("SELECT COALESCE(SUM(amount::numeric), 0)::text AS total FROM spends WHERE user_id = $1 AND created_at >= $2 AND status IN ('pending','settled')", [userId, periodStart]);
|
|
186
|
+
const reserved = await client.query("SELECT COALESCE(SUM(amount::numeric), 0)::text AS total FROM spend_reservations WHERE user_id = $1 AND created_at >= $2 AND status = 'reserved'", [userId, periodStart]);
|
|
187
|
+
if (BigInt(spent.rows[0]?.total ?? "0") + BigInt(reserved.rows[0]?.total ?? "0") + amount > periodLimit) {
|
|
188
|
+
await client.query("COMMIT");
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
await client.query("INSERT INTO spend_reservations (id,user_id,amount,period_start,period_limit,status,created_at) VALUES ($1,$2,$3,$4,$5,'reserved',$6)", [reservationId, userId, amount.toString(), periodStart, periodLimit.toString(), at]);
|
|
192
|
+
await client.query("COMMIT");
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
await client.query("ROLLBACK");
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
client.release();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async releaseSpendReservation(reservationId) { await this.ready; await this.pool.query("UPDATE spend_reservations SET status = 'released' WHERE id = $1 AND status = 'reserved'", [reservationId]); }
|
|
204
|
+
async commitSpendReservation(reservationId) { await this.ready; await this.pool.query("UPDATE spend_reservations SET status = 'committed' WHERE id = $1 AND status = 'reserved'", [reservationId]); }
|
|
205
|
+
async createMcpToken(userId, label, expiresAt = Math.floor(Date.now() / 1000) + 90 * 86_400) {
|
|
206
|
+
const token = `shp_${randomBytes(32).toString("base64url")}`;
|
|
207
|
+
await this.ready;
|
|
208
|
+
await this.pool.query(`INSERT INTO mcp_tokens (token_hash, user_id, label, scopes_json, expires_at, created_at) VALUES ($1, $2, $3, $4::jsonb, $5, $6)`, [hashMcpToken(token), userId, label, JSON.stringify(["mcp"]), expiresAt, Math.floor(Date.now() / 1000)]);
|
|
209
|
+
return { token, expiresAt };
|
|
210
|
+
}
|
|
211
|
+
async createMcpChallenge(address, message, expiresAt) {
|
|
212
|
+
await this.ready;
|
|
213
|
+
await this.pool.query(`INSERT INTO mcp_challenges (address, message, expires_at, created_at) VALUES ($1, $2, $3, $4)`, [address.toLowerCase(), message, expiresAt, Math.floor(Date.now() / 1000)]);
|
|
214
|
+
}
|
|
215
|
+
async consumeMcpChallenge(address, message) {
|
|
216
|
+
await this.ready;
|
|
217
|
+
const client = await this.pool.connect();
|
|
218
|
+
try {
|
|
219
|
+
await client.query("BEGIN");
|
|
220
|
+
const result = await client.query(`SELECT expires_at FROM mcp_challenges WHERE address = $1 AND message = $2 FOR UPDATE`, [address.toLowerCase(), message]);
|
|
221
|
+
const row = result.rows[0];
|
|
222
|
+
if (!row || Number(row.expires_at) <= Math.floor(Date.now() / 1000)) {
|
|
223
|
+
await client.query("ROLLBACK");
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
await client.query(`DELETE FROM mcp_challenges WHERE address = $1 AND message = $2`, [address.toLowerCase(), message]);
|
|
227
|
+
await client.query("COMMIT");
|
|
228
|
+
return { expiresAt: Number(row.expires_at) };
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
await client.query("ROLLBACK");
|
|
232
|
+
throw error;
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
client.release();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
async resolveMcpToken(token) {
|
|
239
|
+
await this.ready;
|
|
240
|
+
const result = await this.pool.query(`SELECT user_id, scopes_json, expires_at, revoked_at FROM mcp_tokens WHERE token_hash = $1`, [hashMcpToken(token)]);
|
|
241
|
+
const row = result.rows[0];
|
|
242
|
+
if (!row || row.revoked_at !== null || (row.expires_at !== null && Number(row.expires_at) <= Math.floor(Date.now() / 1000)))
|
|
243
|
+
return null;
|
|
244
|
+
return { userId: row.user_id, scopes: row.scopes_json };
|
|
245
|
+
}
|
|
246
|
+
async revokeMcpToken(token) {
|
|
247
|
+
await this.ready;
|
|
248
|
+
await this.pool.query(`UPDATE mcp_tokens SET revoked_at = $1 WHERE token_hash = $2`, [Math.floor(Date.now() / 1000), hashMcpToken(token)]);
|
|
249
|
+
}
|
|
250
|
+
async putIntent(userId, m) {
|
|
251
|
+
await this.ready;
|
|
252
|
+
await this.pool.query(`INSERT INTO intents (hash, user_id, json, expiry, revoked_at)
|
|
253
|
+
VALUES ($1, $2, $3::jsonb, $4, $5)
|
|
254
|
+
ON CONFLICT (hash) DO UPDATE SET user_id = EXCLUDED.user_id,
|
|
255
|
+
json = EXCLUDED.json, expiry = EXCLUDED.expiry, revoked_at = EXCLUDED.revoked_at`, [m.hash, userId, serialise(m), m.mandate.expiry, m.revokedAt ?? null]);
|
|
256
|
+
}
|
|
257
|
+
async getIntent(hash) {
|
|
258
|
+
await this.ready;
|
|
259
|
+
const result = await this.pool.query(`SELECT json, revoked_at FROM intents WHERE hash = $1`, [hash]);
|
|
260
|
+
const row = result.rows[0];
|
|
261
|
+
if (!row)
|
|
262
|
+
return null;
|
|
263
|
+
const mandate = deserialise(row.json);
|
|
264
|
+
if (row.revoked_at !== null)
|
|
265
|
+
mandate.revokedAt = Number(row.revoked_at);
|
|
266
|
+
return mandate;
|
|
267
|
+
}
|
|
268
|
+
async listIntents(userId, includeExpired = false) {
|
|
269
|
+
await this.ready;
|
|
270
|
+
const now = Math.floor(Date.now() / 1000);
|
|
271
|
+
const result = includeExpired
|
|
272
|
+
? await this.pool.query(`SELECT json, revoked_at FROM intents WHERE user_id = $1 ORDER BY expiry DESC`, [userId])
|
|
273
|
+
: await this.pool.query(`SELECT json, revoked_at FROM intents
|
|
274
|
+
WHERE user_id = $1 AND expiry > $2 AND revoked_at IS NULL ORDER BY expiry DESC`, [userId, now]);
|
|
275
|
+
return result.rows.map((row) => {
|
|
276
|
+
const mandate = deserialise(row.json);
|
|
277
|
+
if (row.revoked_at !== null)
|
|
278
|
+
mandate.revokedAt = Number(row.revoked_at);
|
|
279
|
+
return mandate;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
async revokeIntent(hash, at) {
|
|
283
|
+
await this.ready;
|
|
284
|
+
await this.pool.query(`UPDATE intents SET revoked_at = $1 WHERE hash = $2`, [at, hash]);
|
|
285
|
+
}
|
|
286
|
+
async putSpend(s) {
|
|
287
|
+
await this.ready;
|
|
288
|
+
await this.pool.query(`INSERT INTO spends
|
|
289
|
+
(id, user_id, intent_hash, cart_hash, payment_hash, resource, host, pay_to,
|
|
290
|
+
amount, asset_json, inr_paise, fx_rate_scaled, status, tx_hash,
|
|
291
|
+
created_at, settled_at, block_reason)
|
|
292
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10::jsonb,$11,$12,$13,$14,$15,$16,$17)
|
|
293
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
294
|
+
cart_hash = EXCLUDED.cart_hash, payment_hash = EXCLUDED.payment_hash,
|
|
295
|
+
status = EXCLUDED.status, tx_hash = EXCLUDED.tx_hash,
|
|
296
|
+
settled_at = EXCLUDED.settled_at, block_reason = EXCLUDED.block_reason`, [
|
|
297
|
+
s.id, s.userId, s.intentHash, s.cartHash ?? null, s.paymentHash ?? null,
|
|
298
|
+
s.resource, s.host, s.payTo, s.amount.toString(), JSON.stringify(s.asset),
|
|
299
|
+
s.inrPaise.toString(), s.fxRateScaled.toString(), s.status, s.txHash ?? null,
|
|
300
|
+
s.createdAt, s.settledAt ?? null, s.blockReason ?? null,
|
|
301
|
+
]);
|
|
302
|
+
}
|
|
303
|
+
async updateSpend(id, patch) {
|
|
304
|
+
await this.ready;
|
|
305
|
+
const columns = {
|
|
306
|
+
status: "status", txHash: "tx_hash", settledAt: "settled_at",
|
|
307
|
+
blockReason: "block_reason", cartHash: "cart_hash", paymentHash: "payment_hash",
|
|
308
|
+
};
|
|
309
|
+
const values = [];
|
|
310
|
+
const sets = [];
|
|
311
|
+
for (const [key, column] of Object.entries(columns)) {
|
|
312
|
+
const value = patch[key];
|
|
313
|
+
if (value === undefined)
|
|
314
|
+
continue;
|
|
315
|
+
values.push(typeof value === "bigint" ? value.toString() : value);
|
|
316
|
+
sets.push(`${column} = $${values.length}`);
|
|
317
|
+
}
|
|
318
|
+
if (!sets.length)
|
|
319
|
+
return;
|
|
320
|
+
values.push(id);
|
|
321
|
+
await this.pool.query(`UPDATE spends SET ${sets.join(", ")} WHERE id = $${values.length}`, values);
|
|
322
|
+
}
|
|
323
|
+
async listSpends(userId, sinceUnix = 0) {
|
|
324
|
+
await this.ready;
|
|
325
|
+
const result = await this.pool.query(`
|
|
326
|
+
SELECT * FROM spends WHERE user_id = $1 AND created_at >= $2 ORDER BY created_at DESC
|
|
327
|
+
`, [userId, sinceUnix]);
|
|
328
|
+
return result.rows.map(rowToSpend);
|
|
329
|
+
}
|
|
330
|
+
async spendsForIntent(hash, sinceUnix) {
|
|
331
|
+
await this.ready;
|
|
332
|
+
const result = await this.pool.query(`
|
|
333
|
+
SELECT * FROM spends WHERE intent_hash = $1 AND created_at >= $2 ORDER BY created_at DESC
|
|
334
|
+
`, [hash, sinceUnix]);
|
|
335
|
+
return result.rows.map(rowToSpend);
|
|
336
|
+
}
|
|
337
|
+
async medianPriceForResource(userId, resource) {
|
|
338
|
+
await this.ready;
|
|
339
|
+
const result = await this.pool.query(`SELECT amount FROM spends WHERE user_id = $1 AND resource = $2 AND status = 'settled'`, [userId, resource]);
|
|
340
|
+
return median(result.rows.map((row) => BigInt(row.amount)));
|
|
341
|
+
}
|
|
342
|
+
async medianPriceOverall(userId) {
|
|
343
|
+
await this.ready;
|
|
344
|
+
const result = await this.pool.query(`SELECT amount FROM spends WHERE user_id = $1 AND status = 'settled'`, [userId]);
|
|
345
|
+
if (result.rows.length < 3)
|
|
346
|
+
return undefined;
|
|
347
|
+
return median(result.rows.map((row) => BigInt(row.amount)));
|
|
348
|
+
}
|
|
349
|
+
async knownHosts(userId) {
|
|
350
|
+
await this.ready;
|
|
351
|
+
const result = await this.pool.query(`SELECT DISTINCT host FROM spends WHERE user_id = $1 AND status = 'settled'`, [userId]);
|
|
352
|
+
return new Set(result.rows.map((row) => row.host));
|
|
353
|
+
}
|
|
354
|
+
async putLot(l) {
|
|
355
|
+
await this.ready;
|
|
356
|
+
await this.pool.query(`INSERT INTO lots (id, user_id, quantity, remaining, cost_inr_paise, acquired_at, provider_tx_id, provider)
|
|
357
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8)
|
|
358
|
+
ON CONFLICT (id) DO UPDATE SET remaining = EXCLUDED.remaining,
|
|
359
|
+
quantity = EXCLUDED.quantity, cost_inr_paise = EXCLUDED.cost_inr_paise`, [l.id, l.userId, l.quantity.toString(), l.remaining.toString(), l.costInrPaise.toString(), l.acquiredAt, l.providerTxId, l.provider]);
|
|
360
|
+
}
|
|
361
|
+
async listLots(userId) {
|
|
362
|
+
await this.ready;
|
|
363
|
+
const result = await this.pool.query(`SELECT * FROM lots WHERE user_id = $1 ORDER BY acquired_at ASC`, [userId]);
|
|
364
|
+
return result.rows.map(rowToLot);
|
|
365
|
+
}
|
|
366
|
+
async updateLotRemaining(id, remaining) {
|
|
367
|
+
await this.ready;
|
|
368
|
+
await this.pool.query(`UPDATE lots SET remaining = $1 WHERE id = $2`, [remaining.toString(), id]);
|
|
369
|
+
}
|
|
370
|
+
async latestLot(userId) {
|
|
371
|
+
await this.ready;
|
|
372
|
+
const result = await this.pool.query(`SELECT * FROM lots WHERE user_id = $1 ORDER BY acquired_at DESC LIMIT 1`, [userId]);
|
|
373
|
+
return result.rows[0] ? rowToLot(result.rows[0]) : null;
|
|
374
|
+
}
|
|
375
|
+
async putCommerceEvent(event) {
|
|
376
|
+
await this.ready;
|
|
377
|
+
await this.pool.query(`INSERT INTO commerce_events (id, side, status, product_id, amount, payer, transaction_id, at)
|
|
378
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8)
|
|
379
|
+
ON CONFLICT (id) DO UPDATE SET status = EXCLUDED.status,
|
|
380
|
+
amount = EXCLUDED.amount, payer = EXCLUDED.payer, transaction_id = EXCLUDED.transaction_id, at = EXCLUDED.at`, [event.id, event.side, event.status, event.productId, event.amount ?? null, event.payer ?? null, event.transaction ?? null, event.at]);
|
|
381
|
+
}
|
|
382
|
+
async listCommerceEvents(limit = 100) {
|
|
383
|
+
await this.ready;
|
|
384
|
+
const safeLimit = Math.max(1, Math.min(1000, Math.trunc(limit)));
|
|
385
|
+
const result = await this.pool.query(`
|
|
386
|
+
SELECT id, side, status, product_id, amount, payer, transaction_id, at
|
|
387
|
+
FROM commerce_events ORDER BY at DESC LIMIT $1
|
|
388
|
+
`, [safeLimit]);
|
|
389
|
+
return result.rows.map((row) => ({
|
|
390
|
+
id: row.id, side: row.side, status: row.status, productId: row.product_id,
|
|
391
|
+
amount: row.amount ?? undefined, payer: row.payer ?? undefined,
|
|
392
|
+
transaction: row.transaction_id ?? undefined, at: Number(row.at),
|
|
393
|
+
}));
|
|
394
|
+
}
|
|
395
|
+
close() {
|
|
396
|
+
void this.pool.end();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
function serialise(value) {
|
|
400
|
+
return JSON.stringify(value, (_key, item) => typeof item === "bigint" ? { __bigint: item.toString() } : item);
|
|
401
|
+
}
|
|
402
|
+
function hashMcpToken(token) {
|
|
403
|
+
return createHash("sha256").update(token).digest("hex");
|
|
404
|
+
}
|
|
405
|
+
function deserialise(value) {
|
|
406
|
+
const text = typeof value === "string" ? value : JSON.stringify(value);
|
|
407
|
+
return JSON.parse(text, (_key, item) => {
|
|
408
|
+
if (item && typeof item === "object" && "__bigint" in item) {
|
|
409
|
+
return BigInt(item.__bigint);
|
|
410
|
+
}
|
|
411
|
+
return item;
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
function median(values) {
|
|
415
|
+
if (!values.length)
|
|
416
|
+
return undefined;
|
|
417
|
+
const sorted = values.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
418
|
+
const mid = Math.floor(sorted.length / 2);
|
|
419
|
+
return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2n;
|
|
420
|
+
}
|
|
421
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
422
|
+
function rowToSpend(row) {
|
|
423
|
+
return {
|
|
424
|
+
id: row.id, userId: row.user_id, intentHash: row.intent_hash,
|
|
425
|
+
cartHash: row.cart_hash ?? undefined, paymentHash: row.payment_hash ?? undefined,
|
|
426
|
+
resource: row.resource, host: row.host, payTo: row.pay_to,
|
|
427
|
+
amount: BigInt(row.amount), asset: typeof row.asset_json === "string" ? JSON.parse(row.asset_json) : row.asset_json,
|
|
428
|
+
inrPaise: BigInt(row.inr_paise), fxRateScaled: BigInt(row.fx_rate_scaled),
|
|
429
|
+
status: row.status, txHash: row.tx_hash ?? undefined,
|
|
430
|
+
createdAt: Number(row.created_at), settledAt: row.settled_at == null ? undefined : Number(row.settled_at),
|
|
431
|
+
blockReason: row.block_reason ?? undefined,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
function rowToLot(row) {
|
|
435
|
+
return {
|
|
436
|
+
id: row.id, userId: row.user_id, quantity: BigInt(row.quantity),
|
|
437
|
+
remaining: BigInt(row.remaining), costInrPaise: BigInt(row.cost_inr_paise),
|
|
438
|
+
acquiredAt: Number(row.acquired_at), providerTxId: row.provider_tx_id, provider: row.provider,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=postgres-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.js","sourceRoot":"","sources":["../src/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Canonical protocol inventory used for capability discovery and rollout. */
|
|
2
|
+
export type CommerceProtocolId = "acp" | "ucp" | "ap2" | "x402" | "mpp" | "webmcp" | "web_bot_auth";
|
|
3
|
+
export type CommerceProtocolRole = "commerce_checkout" | "commerce_discovery" | "authorization_evidence" | "http_payment" | "browser_tools" | "signed_request_identity";
|
|
4
|
+
export type CommerceProtocolStatus = "enabled" | "preview" | "planned";
|
|
5
|
+
export type CommerceProtocolCapability = {
|
|
6
|
+
id: CommerceProtocolId;
|
|
7
|
+
role: CommerceProtocolRole;
|
|
8
|
+
status: CommerceProtocolStatus;
|
|
9
|
+
versions: readonly string[];
|
|
10
|
+
};
|
|
11
|
+
/** Validate a capability record before it is exposed to an external agent. */
|
|
12
|
+
export declare function validateProtocolCapability(capability: CommerceProtocolCapability): CommerceProtocolCapability;
|
|
13
|
+
/**
|
|
14
|
+
* Baseline support declarations. Runtime configuration may promote a
|
|
15
|
+
* capability only when its required credentials and adapter are available.
|
|
16
|
+
*/
|
|
17
|
+
export declare const PROTOCOL_COMPATIBILITY: readonly CommerceProtocolCapability[];
|
|
18
|
+
//# sourceMappingURL=protocols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocols.d.ts","sourceRoot":"","sources":["../src/protocols.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,cAAc,CAAC;AACpG,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,wBAAwB,GAAG,cAAc,GAAG,eAAe,GAAG,yBAAyB,CAAC;AACxK,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,kBAAkB,CAAC;IACvB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,0BAA0B,GAAG,0BAA0B,CAK7G;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,0BAA0B,EAQ9D,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Validate a capability record before it is exposed to an external agent. */
|
|
2
|
+
export function validateProtocolCapability(capability) {
|
|
3
|
+
if (!capability.id || !["commerce_checkout", "commerce_discovery", "authorization_evidence", "http_payment", "browser_tools", "signed_request_identity"].includes(capability.role) || !["enabled", "preview", "planned"].includes(capability.status))
|
|
4
|
+
throw new Error("Invalid protocol capability.");
|
|
5
|
+
if (!Array.isArray(capability.versions) || capability.versions.some((version) => typeof version !== "string" || !version.trim()))
|
|
6
|
+
throw new Error(`Invalid versions for ${capability.id}.`);
|
|
7
|
+
if (capability.status === "enabled" && capability.versions.length === 0)
|
|
8
|
+
throw new Error(`Enabled protocol ${capability.id} must declare a version.`);
|
|
9
|
+
return capability;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Baseline support declarations. Runtime configuration may promote a
|
|
13
|
+
* capability only when its required credentials and adapter are available.
|
|
14
|
+
*/
|
|
15
|
+
export const PROTOCOL_COMPATIBILITY = [
|
|
16
|
+
{ id: "acp", role: "commerce_checkout", status: "planned", versions: [] },
|
|
17
|
+
{ id: "ucp", role: "commerce_discovery", status: "planned", versions: [] },
|
|
18
|
+
{ id: "ap2", role: "authorization_evidence", status: "planned", versions: [] },
|
|
19
|
+
{ id: "x402", role: "http_payment", status: "preview", versions: ["2"] },
|
|
20
|
+
{ id: "mpp", role: "http_payment", status: "planned", versions: [] },
|
|
21
|
+
{ id: "webmcp", role: "browser_tools", status: "preview", versions: ["draft"] },
|
|
22
|
+
{ id: "web_bot_auth", role: "signed_request_identity", status: "planned", versions: [] },
|
|
23
|
+
];
|
|
24
|
+
//# sourceMappingURL=protocols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocols.js","sourceRoot":"","sources":["../src/protocols.ts"],"names":[],"mappings":"AAYA,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CAAC,UAAsC;IAC/E,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,cAAc,EAAE,eAAe,EAAE,yBAAyB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACtS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5L,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACtJ,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA0C;IAC3E,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IACzE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC1E,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9E,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE;IACxE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IACpE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE;IAC/E,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;CAChF,CAAC"}
|