@seasonkoh/webaz 0.1.28 → 0.1.29
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/README.md +3 -2
- package/README.zh-CN.md +7 -6
- package/dist/currency.js +16 -0
- package/dist/deposit-rails.js +52 -0
- package/dist/direct-pay-aml-monitor.js +67 -0
- package/dist/direct-pay-aml-review.js +40 -0
- package/dist/direct-pay-base-bond-entry.js +5 -0
- package/dist/direct-pay-bond-rail-clearance.js +94 -0
- package/dist/direct-pay-compliance-ingress.js +145 -0
- package/dist/direct-pay-controls.js +136 -0
- package/dist/direct-pay-create.js +162 -0
- package/dist/direct-pay-deferral-quota.js +43 -0
- package/dist/direct-pay-disclosures.js +44 -0
- package/dist/direct-pay-eligibility.js +46 -0
- package/dist/direct-pay-fee-ar.js +241 -0
- package/dist/direct-pay-launch-readiness.js +108 -0
- package/dist/direct-pay-launch-summary.js +68 -0
- package/dist/direct-pay-ledger.js +94 -0
- package/dist/direct-receive-account-qr.js +77 -0
- package/dist/direct-receive-accounts.js +82 -0
- package/dist/direct-receive-deferral.js +142 -0
- package/dist/direct-receive-deposits.js +260 -0
- package/dist/direct-receive-payment-instruction.js +26 -0
- package/dist/fx-rates.js +71 -0
- package/dist/layer0-foundation/L0-1-database/schema.js +531 -1
- package/dist/layer0-foundation/L0-2-state-machine/genuine-sale.js +15 -5
- package/dist/layer0-foundation/L0-2-state-machine/transitions.js +41 -0
- package/dist/layer0-foundation/L0-5-manifest/manifest.js +1 -1
- package/dist/layer1-agent/L1-1-mcp-server/cli.js +64 -0
- package/dist/layer1-agent/L1-1-mcp-server/network-mode.js +11 -0
- package/dist/layer1-agent/L1-1-mcp-server/server.js +18 -16
- package/dist/layer4-economics/L4-4-skill-market/skill-engine.js +4 -4
- package/dist/ledger.js +12 -3
- package/dist/mcp.js +23 -4
- package/dist/merchant-bond-domain.js +64 -0
- package/dist/merchant-bond-exposure.js +78 -0
- package/dist/merchant-bond-watcher.js +26 -0
- package/dist/payment-rails.js +29 -0
- package/dist/product-verification.js +93 -0
- package/dist/pwa/acp-feed.js +3 -2
- package/dist/pwa/contract-fingerprint.js +3 -0
- package/dist/pwa/direct-pay-guards.js +20 -0
- package/dist/pwa/direct-pay-order-redaction.js +24 -0
- package/dist/pwa/endpoint-actions.js +3 -0
- package/dist/pwa/public/app-ai.js +10 -10
- package/dist/pwa/public/app-chat-poll.js +29 -0
- package/dist/pwa/public/app-create-kinds.js +17 -0
- package/dist/pwa/public/app-direct-pay-accounts.js +141 -0
- package/dist/pwa/public/app-direct-pay-buyer.js +72 -0
- package/dist/pwa/public/app-direct-pay-compliance.js +67 -0
- package/dist/pwa/public/app-direct-pay-deferral-admin.js +72 -0
- package/dist/pwa/public/app-direct-pay-deferral.js +61 -0
- package/dist/pwa/public/app-direct-pay-fee-center.js +33 -0
- package/dist/pwa/public/app-direct-pay-fee-ops.js +112 -0
- package/dist/pwa/public/app-direct-pay-product-verify.js +103 -0
- package/dist/pwa/public/app-direct-pay-readiness.js +38 -0
- package/dist/pwa/public/app-direct-pay-store-verify.js +100 -0
- package/dist/pwa/public/app-direct-pay.js +227 -0
- package/dist/pwa/public/app-discover.js +20 -20
- package/dist/pwa/public/app-external-links.js +32 -0
- package/dist/pwa/public/app-listings.js +4 -4
- package/dist/pwa/public/app-prelaunch-waz.js +39 -0
- package/dist/pwa/public/app-price.js +55 -0
- package/dist/pwa/public/app-product-media.js +15 -0
- package/dist/pwa/public/app-profile.js +6 -6
- package/dist/pwa/public/app-seller.js +5 -5
- package/dist/pwa/public/app-shop.js +19 -19
- package/dist/pwa/public/app.js +142 -146
- package/dist/pwa/public/i18n.js +398 -197
- package/dist/pwa/public/index.html +17 -0
- package/dist/pwa/public/openapi.json +495 -1
- package/dist/pwa/routes/admin-analytics.js +4 -2
- package/dist/pwa/routes/admin-direct-receive-deposits.js +321 -0
- package/dist/pwa/routes/buyer-feeds.js +2 -1
- package/dist/pwa/routes/chat.js +6 -1
- package/dist/pwa/routes/dashboards.js +2 -1
- package/dist/pwa/routes/direct-pay-availability.js +196 -0
- package/dist/pwa/routes/direct-pay-disclosure-acks.js +74 -0
- package/dist/pwa/routes/direct-pay-timeouts.js +71 -0
- package/dist/pwa/routes/direct-receive-accounts.js +155 -0
- package/dist/pwa/routes/direct-receive-payment-instructions.js +45 -0
- package/dist/pwa/routes/fx.js +12 -0
- package/dist/pwa/routes/leaderboard.js +47 -9
- package/dist/pwa/routes/listings.js +2 -2
- package/dist/pwa/routes/logistics.js +4 -0
- package/dist/pwa/routes/manifests.js +38 -0
- package/dist/pwa/routes/me-data.js +5 -2
- package/dist/pwa/routes/orders-action.js +117 -9
- package/dist/pwa/routes/orders-create.js +4 -0
- package/dist/pwa/routes/orders-read.js +36 -0
- package/dist/pwa/routes/p2p-products.js +2 -2
- package/dist/pwa/routes/products-create.js +5 -3
- package/dist/pwa/routes/products-links.js +34 -0
- package/dist/pwa/routes/products-list.js +2 -1
- package/dist/pwa/routes/products-update.js +22 -2
- package/dist/pwa/routes/promoter.js +3 -0
- package/dist/pwa/routes/referral.js +4 -0
- package/dist/pwa/routes/returns.js +26 -1
- package/dist/pwa/routes/rewards-apply.js +10 -5
- package/dist/pwa/routes/rewards-clearing-mature.js +96 -0
- package/dist/pwa/routes/rewards-escrow-expire.js +6 -2
- package/dist/pwa/routes/shops.js +2 -1
- package/dist/pwa/routes/url-claim.js +2 -2
- package/dist/pwa/routes/users-public.js +8 -0
- package/dist/pwa/routes/wallet-read.js +3 -0
- package/dist/pwa/routes/webauthn.js +1 -1
- package/dist/pwa/server.js +59 -102
- package/dist/runtime/webaz-schema-helpers.js +104 -0
- package/dist/store-verification.js +77 -0
- package/dist/version.js +1 -1
- package/package.json +71 -2
|
@@ -1846,3 +1846,107 @@ export function initAgentGrantAuthLogSchema(db) {
|
|
|
1846
1846
|
db.exec(`CREATE INDEX IF NOT EXISTS idx_agal_grant ON agent_grant_auth_log(grant_id, ts)`);
|
|
1847
1847
|
db.exec(`CREATE INDEX IF NOT EXISTS idx_agal_ts ON agent_grant_auth_log(ts)`);
|
|
1848
1848
|
}
|
|
1849
|
+
/**
|
|
1850
|
+
* pending_commission_escrow — opt-out promoter activation queue (§3.5b) + RFC-018 clearing ledger.
|
|
1851
|
+
*
|
|
1852
|
+
* Relocated VERBATIM from src/pwa/server.ts (RFC-018 PR1) so the table's whole schema is built once,
|
|
1853
|
+
* in the early helper batch — never half-here / half-inline (the fresh-DB silent-fail铁律 bites a
|
|
1854
|
+
* half-migration the hardest). RFC-018 adds two things, SCHEMA-ONLY (no settle / escrow read-write
|
|
1855
|
+
* logic touched):
|
|
1856
|
+
* - `matures_at` column — the accrue-then-mature clock (= completed_at + return_days +
|
|
1857
|
+
* settlement.clearing_buffer_days); NULL until the PR2 clearing model writes it.
|
|
1858
|
+
* - `reversed` status value — a return inside the clearing window flips pending→reversed; it is a
|
|
1859
|
+
* TEXT value, so it needs no schema change (documented in the column comment).
|
|
1860
|
+
* order_id stays NULLable for pv_pair rows (PR-1c-b).
|
|
1861
|
+
*
|
|
1862
|
+
* Migration, two independent cases (both idempotent, both skip when already current):
|
|
1863
|
+
* (a) order_id NOT NULL (pre-1c-b) → full rebuild — SQLite ADD COLUMN cannot relax a NOT NULL
|
|
1864
|
+
* constraint. Explicit-column INSERT maps the old rows; FK OFF/ON restores L0's global ON. The
|
|
1865
|
+
* rebuilt table already carries matures_at, so (b) then no-ops.
|
|
1866
|
+
* (b) missing matures_at (pre-RFC-018) → a cheap, NON-destructive `ALTER TABLE ADD COLUMN`. No
|
|
1867
|
+
* DROP, rows + indexes preserved. This is the common existing-DB path (every pre-RFC-018 DB,
|
|
1868
|
+
* incl. prod). We deliberately do NOT rebuild for an additive column — a money-path table on a
|
|
1869
|
+
* persistent prod volume should take the smallest safe migration. (Allowed here because the
|
|
1870
|
+
* complexity ratchet counts DDL in server.ts only, not this helper.)
|
|
1871
|
+
*/
|
|
1872
|
+
export function initPendingCommissionEscrowSchema(db) {
|
|
1873
|
+
db.exec(`
|
|
1874
|
+
CREATE TABLE IF NOT EXISTS pending_commission_escrow (
|
|
1875
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1876
|
+
recipient_user_id TEXT NOT NULL,
|
|
1877
|
+
order_id TEXT, -- NULL for pv_pair (PR-1c-b)
|
|
1878
|
+
amount REAL NOT NULL, -- WAZ amount
|
|
1879
|
+
attribution_path TEXT NOT NULL, -- 'L1' | 'L2' | 'L3' | 'pv_pair' | etc.
|
|
1880
|
+
status TEXT NOT NULL DEFAULT 'pending', -- 'pending' | 'settled' | 'expired' | 'reversed' (RFC-018)
|
|
1881
|
+
created_at INTEGER NOT NULL,
|
|
1882
|
+
expires_at INTEGER NOT NULL,
|
|
1883
|
+
settled_at INTEGER,
|
|
1884
|
+
expired_to_charity_at INTEGER,
|
|
1885
|
+
matures_at INTEGER, -- RFC-018: completed_at + return_days + clearing_buffer_days; NULL until the clearing model writes it
|
|
1886
|
+
FOREIGN KEY (recipient_user_id) REFERENCES users(id),
|
|
1887
|
+
FOREIGN KEY (order_id) REFERENCES orders(id)
|
|
1888
|
+
)
|
|
1889
|
+
`);
|
|
1890
|
+
(function migrateEscrowSchema() {
|
|
1891
|
+
const cols = db.prepare("PRAGMA table_info(pending_commission_escrow)").all();
|
|
1892
|
+
if (cols.length === 0)
|
|
1893
|
+
return; // table absent (shouldn't happen — CREATE above just ran)
|
|
1894
|
+
const orderIdCol = cols.find(c => c.name === 'order_id');
|
|
1895
|
+
const orderIdNotNull = !!orderIdCol && orderIdCol.notnull === 1;
|
|
1896
|
+
// (a) STRUCTURAL (pre-1c-b): order_id NOT NULL → nullable. Unavoidable full rebuild (ADD COLUMN
|
|
1897
|
+
// cannot relax NOT NULL). The rebuilt table already includes matures_at, so (b) below no-ops.
|
|
1898
|
+
if (orderIdNotNull) {
|
|
1899
|
+
console.log('[pc-escrow-migrate] order_id NOT NULL — rebuilding table to allow NULL for pv_pair');
|
|
1900
|
+
db.exec('PRAGMA foreign_keys = OFF');
|
|
1901
|
+
db.transaction(() => {
|
|
1902
|
+
db.exec(`
|
|
1903
|
+
CREATE TABLE pending_commission_escrow_new (
|
|
1904
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1905
|
+
recipient_user_id TEXT NOT NULL,
|
|
1906
|
+
order_id TEXT,
|
|
1907
|
+
amount REAL NOT NULL,
|
|
1908
|
+
attribution_path TEXT NOT NULL,
|
|
1909
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
1910
|
+
created_at INTEGER NOT NULL,
|
|
1911
|
+
expires_at INTEGER NOT NULL,
|
|
1912
|
+
settled_at INTEGER,
|
|
1913
|
+
expired_to_charity_at INTEGER,
|
|
1914
|
+
matures_at INTEGER,
|
|
1915
|
+
FOREIGN KEY (recipient_user_id) REFERENCES users(id),
|
|
1916
|
+
FOREIGN KEY (order_id) REFERENCES orders(id)
|
|
1917
|
+
)
|
|
1918
|
+
`);
|
|
1919
|
+
// explicit columns: an older DB lacks matures_at → it defaults to NULL in _new (never SELECT *)
|
|
1920
|
+
db.exec(`INSERT INTO pending_commission_escrow_new
|
|
1921
|
+
(id, recipient_user_id, order_id, amount, attribution_path, status, created_at, expires_at, settled_at, expired_to_charity_at)
|
|
1922
|
+
SELECT id, recipient_user_id, order_id, amount, attribution_path, status, created_at, expires_at, settled_at, expired_to_charity_at
|
|
1923
|
+
FROM pending_commission_escrow`);
|
|
1924
|
+
db.exec('DROP TABLE pending_commission_escrow');
|
|
1925
|
+
db.exec('ALTER TABLE pending_commission_escrow_new RENAME TO pending_commission_escrow');
|
|
1926
|
+
})();
|
|
1927
|
+
db.exec('PRAGMA foreign_keys = ON');
|
|
1928
|
+
}
|
|
1929
|
+
// (b) ADDITIVE (pre-RFC-018): matures_at missing → cheap, non-destructive column add (no DROP;
|
|
1930
|
+
// rows + indexes preserved). Idempotent: throws "duplicate column" once present (fresh DB, or
|
|
1931
|
+
// just-rebuilt in (a)) → swallowed. This is the path every existing prod DB takes.
|
|
1932
|
+
try {
|
|
1933
|
+
db.exec('ALTER TABLE pending_commission_escrow ADD COLUMN matures_at INTEGER');
|
|
1934
|
+
}
|
|
1935
|
+
catch { /* column already exists */ }
|
|
1936
|
+
})();
|
|
1937
|
+
try {
|
|
1938
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_escrow_recipient ON pending_commission_escrow(recipient_user_id, status, expires_at)');
|
|
1939
|
+
}
|
|
1940
|
+
catch { }
|
|
1941
|
+
try {
|
|
1942
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_escrow_expiry ON pending_commission_escrow(status, expires_at)');
|
|
1943
|
+
}
|
|
1944
|
+
catch { }
|
|
1945
|
+
// PR-1c-a: UNIQUE (recipient, order, path) defends against double-insert if settleCommission ever retries
|
|
1946
|
+
// Note: NULL order_id (PR-1c-b pv_pair) is distinct in SQLite UNIQUE — idempotency for pv_pair relies
|
|
1947
|
+
// on binary_score_records.settled_at instead (source-side dedup).
|
|
1948
|
+
try {
|
|
1949
|
+
db.exec('CREATE UNIQUE INDEX IF NOT EXISTS uniq_escrow_recipient_order_path ON pending_commission_escrow(recipient_user_id, order_id, attribution_path)');
|
|
1950
|
+
}
|
|
1951
|
+
catch { }
|
|
1952
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export const MAX_URL_LEN = 2048;
|
|
2
|
+
export const MAX_PLATFORM_LEN = 60;
|
|
3
|
+
export const MAX_NOTES_LEN = 500;
|
|
4
|
+
const ACTIVE = "('issued','submitted','verified')";
|
|
5
|
+
const getActive = (db, userId) => db.prepare(`SELECT * FROM store_verifications WHERE user_id = ? AND status IN ${ACTIVE} ORDER BY created_at DESC, rowid DESC LIMIT 1`).get(userId);
|
|
6
|
+
function isStorableHttpUrl(url) {
|
|
7
|
+
if (typeof url !== 'string' || url.length === 0 || url.length > MAX_URL_LEN)
|
|
8
|
+
return false;
|
|
9
|
+
return /^https?:\/\/[^\s]+$/i.test(url.trim());
|
|
10
|
+
}
|
|
11
|
+
/** 卖家申请店铺认证 → issued(签发 code)。单一活跃 per seller。 */
|
|
12
|
+
export function requestStoreVerification(db, args) {
|
|
13
|
+
const { id, userId, code } = args;
|
|
14
|
+
if (!id || !userId || !code)
|
|
15
|
+
return { ok: false, reason: 'missing id/userId/code' };
|
|
16
|
+
const platform = args.platform ? String(args.platform).trim().slice(0, MAX_PLATFORM_LEN) : null;
|
|
17
|
+
if (getActive(db, userId))
|
|
18
|
+
return { ok: false, reason: '已有进行中的店铺认证' };
|
|
19
|
+
db.prepare(`INSERT INTO store_verifications (id, user_id, code, platform, status, created_at, updated_at)
|
|
20
|
+
VALUES (?,?,?,?, 'issued', datetime('now'), datetime('now'))`).run(id, userId, code, platform);
|
|
21
|
+
return { ok: true, status: 'issued', code };
|
|
22
|
+
}
|
|
23
|
+
/** 卖家提交店铺外链 → submitted。要求有 issued 记录;链接仅存储(不抓取)。 */
|
|
24
|
+
export function submitStoreVerificationLink(db, args) {
|
|
25
|
+
const url = String(args.externalUrl || '').trim();
|
|
26
|
+
if (!isStorableHttpUrl(url))
|
|
27
|
+
return { ok: false, reason: '请提交有效的 http(s) 店铺链接' };
|
|
28
|
+
const active = getActive(db, args.userId);
|
|
29
|
+
if (!active)
|
|
30
|
+
return { ok: false, reason: '请先申请店铺认证获取验证码' };
|
|
31
|
+
if (active.status === 'verified')
|
|
32
|
+
return { ok: false, reason: '店铺认证已通过,无需重复提交' };
|
|
33
|
+
const platform = args.platform != null ? String(args.platform).trim().slice(0, MAX_PLATFORM_LEN) : active.platform;
|
|
34
|
+
db.prepare(`UPDATE store_verifications SET external_url = ?, platform = ?, status = 'submitted', updated_at = datetime('now') WHERE id = ?`).run(url, platform, active.id);
|
|
35
|
+
return { ok: true, status: 'submitted' };
|
|
36
|
+
}
|
|
37
|
+
/** 真人 admin 核对结论 → verified | rejected。verified 时按 perProductExempt 置豁免位(默认 false)。仅从 submitted 流转。 */
|
|
38
|
+
export function reviewStoreVerification(db, args) {
|
|
39
|
+
const { id, reviewerId, decision } = args;
|
|
40
|
+
if (!reviewerId)
|
|
41
|
+
return { ok: false, reason: 'reviewStoreVerification requires a human reviewerId' };
|
|
42
|
+
if (decision !== 'verified' && decision !== 'rejected')
|
|
43
|
+
return { ok: false, reason: 'decision must be verified|rejected' };
|
|
44
|
+
const row = db.prepare('SELECT * FROM store_verifications WHERE id = ?').get(id);
|
|
45
|
+
if (!row)
|
|
46
|
+
return { ok: false, reason: 'store verification not found' };
|
|
47
|
+
if (row.status === decision)
|
|
48
|
+
return { ok: true, status: decision, perProductExempt: row.per_product_exempt === 1, already: true };
|
|
49
|
+
if (row.status !== 'submitted')
|
|
50
|
+
return { ok: false, reason: `cannot review from status '${row.status}' (need submitted)` };
|
|
51
|
+
const exempt = decision === 'verified' && args.perProductExempt === true ? 1 : 0; // 仅 verified 才可置豁免;reject 一律 0
|
|
52
|
+
const notes = args.notes != null ? String(args.notes).slice(0, MAX_NOTES_LEN) : null;
|
|
53
|
+
db.prepare(`UPDATE store_verifications SET status = ?, per_product_exempt = ?, reviewed_by = ?, reviewed_at = datetime('now'), notes = ?, updated_at = datetime('now') WHERE id = ?`)
|
|
54
|
+
.run(decision, exempt, reviewerId, notes, id);
|
|
55
|
+
return { ok: true, status: decision, perProductExempt: exempt === 1 };
|
|
56
|
+
}
|
|
57
|
+
/** 卖家本人最新一条店铺认证(任意状态)。无 → null。 */
|
|
58
|
+
export function getStoreVerification(db, userId) {
|
|
59
|
+
return db.prepare('SELECT * FROM store_verifications WHERE user_id = ? ORDER BY created_at DESC, rowid DESC LIMIT 1').get(userId) ?? null;
|
|
60
|
+
}
|
|
61
|
+
/** admin 队列:按 status 过滤(默认全部),最新在前。纯读。 */
|
|
62
|
+
export function listStoreVerifications(db, opts = {}) {
|
|
63
|
+
if (opts.status)
|
|
64
|
+
return db.prepare(`SELECT * FROM store_verifications WHERE status = ? ORDER BY created_at DESC, rowid DESC`).all(opts.status);
|
|
65
|
+
return db.prepare(`SELECT * FROM store_verifications ORDER BY created_at DESC, rowid DESC`).all();
|
|
66
|
+
}
|
|
67
|
+
/** 硬门豁免读取:该卖家是否【已被豁免逐品验证】(店铺 verified 且 per_product_exempt=1)。供 direct-pay gate combiner。 */
|
|
68
|
+
export function sellerExemptFromPerProduct(db, userId) {
|
|
69
|
+
return !!db.prepare("SELECT 1 FROM store_verifications WHERE user_id = ? AND status = 'verified' AND per_product_exempt = 1 LIMIT 1").get(userId);
|
|
70
|
+
}
|
|
71
|
+
export function toSellerStoreVerificationView(row) {
|
|
72
|
+
return {
|
|
73
|
+
id: row.id, code: row.code, platform: row.platform, external_url: row.external_url,
|
|
74
|
+
status: row.status, per_product_exempt: row.per_product_exempt === 1,
|
|
75
|
+
reviewed_at: row.reviewed_at, created_at: row.created_at, updated_at: row.updated_at,
|
|
76
|
+
}; // 故意省略 reviewed_by + notes
|
|
77
|
+
}
|
package/dist/version.js
CHANGED
|
@@ -31,4 +31,4 @@ export const SOFTWARE_VERSION = pkg.version;
|
|
|
31
31
|
* safe for agents to ignore. Guarded by tests/test-contract-fingerprint.ts + docs/CONTRACT-LOCK.json.
|
|
32
32
|
* NB: the fingerprint hashes only §②/§① content; a change to the §④ entry document (e.g. agent_quickstart)
|
|
33
33
|
* is integrator-observable but NOT fingerprinted, so it must be registered here by hand. */
|
|
34
|
-
export const CONTRACT_VERSION =
|
|
34
|
+
export const CONTRACT_VERSION = 8;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seasonkoh/webaz",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.29",
|
|
4
4
|
"description": "[PRE-LAUNCH] Agent-native decentralized commerce protocol. Humans and AI agents trade on the same protocol via MCP tools. ⚠️ Repository currently private until W8 public launch — GitHub links may return 404. See https://webaz.xyz for status.",
|
|
5
5
|
"main": "dist/mcp.js",
|
|
6
6
|
"bin": {
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"routes:seam-check": "tsx scripts/routes-seam-guard.ts",
|
|
28
28
|
"guard:complexity": "tsx scripts/complexity-ratchet-guard.ts",
|
|
29
29
|
"guard:pr-constraints": "tsx scripts/pr-constraints-guard.ts",
|
|
30
|
+
"guard:direct-pay-deposit": "tsx scripts/direct-pay-deposit-guard.ts",
|
|
30
31
|
"pg:schema": "tsx scripts/gen-pg-schema.ts",
|
|
31
32
|
"pg:verify": "tsx scripts/pg-schema-verify.ts",
|
|
32
33
|
"test:pg-placeholders": "tsx scripts/test-pg-placeholders.ts",
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"test:admin-claim-marking-correction": "tsx scripts/test-admin-claim-marking-correction.ts",
|
|
50
51
|
"test:contribution-facts-read": "tsx scripts/test-contribution-facts-read.ts",
|
|
51
52
|
"ingest:admin-coordination": "tsx scripts/ingest-admin-coordination.ts",
|
|
53
|
+
"direct-pay:readiness": "tsx scripts/direct-pay-launch-readiness-report.ts",
|
|
52
54
|
"correct:operator-claim-marking": "tsx scripts/correct-operator-claim-marking.ts",
|
|
53
55
|
"test:admin-operator-claim-workflow": "tsx scripts/test-admin-operator-claim-workflow.ts",
|
|
54
56
|
"test:admin-operator-claim-lifecycle": "tsx scripts/test-admin-operator-claim-lifecycle.ts",
|
|
@@ -84,13 +86,80 @@
|
|
|
84
86
|
"test:agent-grant-mcp-consume": "tsx scripts/test-agent-grant-mcp-consume.ts",
|
|
85
87
|
"test:connected-agents-read": "tsx scripts/test-connected-agents-read.ts",
|
|
86
88
|
"test:connected-agents-ui": "tsx scripts/test-connected-agents-ui.ts",
|
|
89
|
+
"test:leaderboard-anon-projection": "tsx scripts/test-leaderboard-anon-projection.ts",
|
|
90
|
+
"test:i18n-default-language": "tsx scripts/test-i18n-default-language.ts",
|
|
91
|
+
"test:reputation-handle-resolution": "tsx scripts/test-reputation-handle-resolution.ts",
|
|
92
|
+
"test:clearing-escrow-schema": "tsx scripts/test-clearing-escrow-schema.ts",
|
|
93
|
+
"test:clearing-commission": "tsx scripts/test-clearing-commission.ts",
|
|
94
|
+
"test:clearing-surfaces": "tsx scripts/test-clearing-surfaces.ts",
|
|
95
|
+
"test:returns-aware-counts": "tsx scripts/test-returns-aware-counts.ts",
|
|
87
96
|
"test:mcp-auth-firebreak": "tsx scripts/test-mcp-auth-firebreak.ts",
|
|
97
|
+
"test:mcp-mode-honesty": "tsx scripts/test-mcp-mode-honesty.ts",
|
|
98
|
+
"test:mcp-cli": "tsx scripts/test-mcp-cli.ts",
|
|
99
|
+
"test:currency-display": "tsx scripts/test-currency-display.ts",
|
|
100
|
+
"test:currency-schema-flip": "tsx scripts/test-currency-schema-flip.ts",
|
|
88
101
|
"test:proposal-admin-ui": "tsx scripts/test-proposal-admin-ui.ts",
|
|
89
|
-
"check:pwa-syntax": "node --check src/pwa/public/app.js && node --check src/pwa/public/app-admin.js && node --check src/pwa/public/app-contribution.js && node --check src/pwa/public/app-ai.js && node --check src/pwa/public/app-discover.js && node --check src/pwa/public/app-profile.js && node --check src/pwa/public/app-account.js && node --check src/pwa/public/app-shop.js && node --check src/pwa/public/app-listings.js && node --check src/pwa/public/app-seller.js && node --check src/pwa/public/app-agents.js && node --check src/pwa/public/i18n.js && node --check src/pwa/public/sw.js",
|
|
102
|
+
"check:pwa-syntax": "node --check src/pwa/public/app.js && node --check src/pwa/public/app-admin.js && node --check src/pwa/public/app-contribution.js && node --check src/pwa/public/app-ai.js && node --check src/pwa/public/app-discover.js && node --check src/pwa/public/app-profile.js && node --check src/pwa/public/app-account.js && node --check src/pwa/public/app-shop.js && node --check src/pwa/public/app-listings.js && node --check src/pwa/public/app-external-links.js && node --check src/pwa/public/app-product-media.js && node --check src/pwa/public/app-create-kinds.js && node --check src/pwa/public/app-price.js && node --check src/pwa/public/app-seller.js && node --check src/pwa/public/app-agents.js && node --check src/pwa/public/app-direct-pay.js && node --check src/pwa/public/app-direct-pay-readiness.js && node --check src/pwa/public/app-direct-pay-deferral.js && node --check src/pwa/public/app-direct-pay-deferral-admin.js && node --check src/pwa/public/app-direct-pay-product-verify.js && node --check src/pwa/public/app-direct-pay-store-verify.js && node --check src/pwa/public/app-direct-pay-compliance.js && node --check src/pwa/public/app-direct-pay-fee-ops.js && node --check src/pwa/public/app-direct-pay-fee-center.js && node --check src/pwa/public/app-direct-pay-accounts.js && node --check src/pwa/public/app-direct-pay-buyer.js && node --check src/pwa/public/app-prelaunch-waz.js && node --check src/pwa/public/app-chat-poll.js && node --check src/pwa/public/i18n.js && node --check src/pwa/public/sw.js",
|
|
103
|
+
"test:create-kinds": "tsx scripts/test-create-kinds.ts",
|
|
104
|
+
"test:secondhand-photo-authenticity": "tsx scripts/test-secondhand-photo-authenticity.ts",
|
|
105
|
+
"test:secondhand-detail-alignment": "tsx scripts/test-secondhand-detail-alignment.ts",
|
|
106
|
+
"test:order-status-timeline-i18n": "tsx scripts/test-order-status-timeline-i18n.ts",
|
|
107
|
+
"test:leaderboard-nav-handle": "tsx scripts/test-leaderboard-nav-handle.ts",
|
|
108
|
+
"test:fx-rates": "tsx scripts/test-fx-rates.ts",
|
|
109
|
+
"test:fx-price-display": "tsx scripts/test-fx-price-display.ts",
|
|
110
|
+
"test:fx-price-buypage": "tsx scripts/test-fx-price-buypage.ts",
|
|
111
|
+
"test:fx-price-listings": "tsx scripts/test-fx-price-listings.ts",
|
|
112
|
+
"test:fx-price-seller-ui": "tsx scripts/test-fx-price-seller-ui.ts",
|
|
113
|
+
"test:prelaunch-banner-nav": "tsx scripts/test-prelaunch-banner-nav.ts",
|
|
90
114
|
"test:rewards-vs-contribution-copy": "tsx scripts/test-rewards-vs-contribution-copy.ts",
|
|
91
115
|
"test:invite-code-narrowing": "tsx scripts/test-invite-code-narrowing.ts",
|
|
92
116
|
"test:shop-referral-attribution": "tsx scripts/test-shop-referral-attribution.ts",
|
|
93
117
|
"test:money-units": "tsx scripts/test-money-units.ts",
|
|
118
|
+
"test:direct-pay-ledger": "tsx scripts/test-direct-pay-ledger.ts",
|
|
119
|
+
"test:deposit-rails": "tsx scripts/test-deposit-rails.ts",
|
|
120
|
+
"test:direct-pay-timeouts": "tsx scripts/test-direct-pay-timeouts.ts",
|
|
121
|
+
"test:direct-pay-actions": "tsx scripts/test-direct-pay-actions.ts",
|
|
122
|
+
"test:direct-pay-eligibility": "tsx scripts/test-direct-pay-eligibility.ts",
|
|
123
|
+
"test:direct-receive-deposits": "tsx scripts/test-direct-receive-deposits.ts",
|
|
124
|
+
"test:direct-receive-accounts": "tsx scripts/test-direct-receive-accounts.ts",
|
|
125
|
+
"test:direct-receive-account-endpoints": "tsx scripts/test-direct-receive-account-endpoints.ts",
|
|
126
|
+
"test:direct-pay-order-qr": "tsx scripts/test-direct-pay-order-qr.ts",
|
|
127
|
+
"test:direct-pay-order-redaction": "tsx scripts/test-direct-pay-order-redaction.ts",
|
|
128
|
+
"guard:direct-pay-order-reader": "tsx scripts/direct-pay-order-reader-guard.ts",
|
|
129
|
+
"test:direct-receive-instruction": "tsx scripts/test-direct-receive-instruction.ts",
|
|
130
|
+
"test:direct-receive-production-confirm": "tsx scripts/test-direct-receive-production-confirm.ts",
|
|
131
|
+
"test:direct-receive-deferral": "tsx scripts/test-direct-receive-deferral.ts",
|
|
132
|
+
"test:direct-pay-base-bond-entry": "tsx scripts/test-direct-pay-base-bond-entry.ts",
|
|
133
|
+
"test:direct-pay-order-snapshot-schema": "tsx scripts/test-direct-pay-order-snapshot-schema.ts",
|
|
134
|
+
"test:direct-pay-ui": "tsx scripts/test-direct-pay-ui.ts",
|
|
135
|
+
"test:i18n-labels": "tsx scripts/test-i18n-discover-dispute-labels.ts",
|
|
136
|
+
"test:listing-product-type": "tsx scripts/test-listing-product-type.ts",
|
|
137
|
+
"test:external-links": "tsx scripts/test-product-external-links.ts",
|
|
138
|
+
"test:thumb-endpoint": "tsx scripts/test-product-thumb-endpoint.ts",
|
|
139
|
+
"test:list-thumbnails": "tsx scripts/test-list-thumbnails.ts",
|
|
140
|
+
"check:i18n-dup": "tsx scripts/check-i18n-no-dup-keys.ts",
|
|
141
|
+
"test:i18n-dup-gate": "tsx scripts/test-i18n-dup-gate.ts",
|
|
142
|
+
"test:merchant-bond": "tsx scripts/test-merchant-bond-domain.ts",
|
|
143
|
+
"test:merchant-bond-exposure": "tsx scripts/test-merchant-bond-exposure.ts",
|
|
144
|
+
"test:direct-pay-fee-ar": "tsx scripts/test-direct-pay-fee-ar.ts",
|
|
145
|
+
"test:direct-pay-disclosure-acks": "tsx scripts/test-direct-pay-disclosure-acks.ts",
|
|
146
|
+
"test:direct-pay-create": "tsx scripts/test-direct-pay-create.ts",
|
|
147
|
+
"test:direct-pay-deferral-quota": "tsx scripts/test-direct-pay-deferral-quota.ts",
|
|
148
|
+
"test:product-verification": "tsx scripts/test-product-verification.ts",
|
|
149
|
+
"test:product-verification-routes": "tsx scripts/test-product-verification-routes.ts",
|
|
150
|
+
"test:store-verification": "tsx scripts/test-store-verification.ts",
|
|
151
|
+
"test:store-verification-routes": "tsx scripts/test-store-verification-routes.ts",
|
|
152
|
+
"test:direct-pay-launch-summary": "tsx scripts/test-direct-pay-launch-summary.ts",
|
|
153
|
+
"test:product-verification-reverify": "tsx scripts/test-product-verification-reverify.ts",
|
|
154
|
+
"test:direct-pay-controls": "tsx scripts/test-direct-pay-controls.ts",
|
|
155
|
+
"test:direct-pay-aml-monitor": "tsx scripts/test-direct-pay-aml-monitor.ts",
|
|
156
|
+
"test:direct-pay-aml-review": "tsx scripts/test-direct-pay-aml-review.ts",
|
|
157
|
+
"test:direct-pay-compliance-ingress": "tsx scripts/test-direct-pay-compliance-ingress.ts",
|
|
158
|
+
"test:direct-pay-bond-rail-clearance": "tsx scripts/test-direct-pay-bond-rail-clearance.ts",
|
|
159
|
+
"test:direct-pay-launch-readiness": "tsx scripts/test-direct-pay-launch-readiness.ts",
|
|
160
|
+
"test:direct-pay-readiness-routes": "tsx scripts/test-direct-pay-readiness-routes.ts",
|
|
161
|
+
"test:direct-pay-deferral-routes": "tsx scripts/test-direct-pay-deferral-routes.ts",
|
|
162
|
+
"test:direct-pay-disclosures": "tsx scripts/test-direct-pay-disclosures.ts",
|
|
94
163
|
"test:identity-claim-ui": "tsx scripts/test-identity-claim-ui.ts",
|
|
95
164
|
"test:identity-claim-discovery": "tsx scripts/test-identity-claim-discovery.ts",
|
|
96
165
|
"test:operator-ingest-guards": "tsx scripts/test-operator-ingest-guards.ts",
|