web-agent-bridge 3.3.0 → 3.8.1

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.
Files changed (312) hide show
  1. package/LICENSE +84 -72
  2. package/README.ar.md +1563 -1286
  3. package/README.md +137 -1764
  4. package/bin/agent-runner.js +474 -474
  5. package/bin/cli.js +237 -237
  6. package/bin/wab-init.js +244 -0
  7. package/bin/wab.js +80 -80
  8. package/examples/azure-dns-wab.js +83 -0
  9. package/examples/bidi-agent.js +119 -119
  10. package/examples/cloudflare-wab-dns.js +121 -0
  11. package/examples/cpanel-wab-dns.js +114 -0
  12. package/examples/cross-site-agent.js +91 -91
  13. package/examples/dns-discovery-agent.js +166 -0
  14. package/examples/gcp-dns-wab.js +76 -0
  15. package/examples/governance-agent.js +169 -0
  16. package/examples/mcp-agent.js +94 -94
  17. package/examples/next-app-router/README.md +44 -44
  18. package/examples/plesk-wab-dns.js +103 -0
  19. package/examples/puppeteer-agent.js +108 -108
  20. package/examples/route53-wab-dns.js +144 -0
  21. package/examples/saas-dashboard/README.md +55 -55
  22. package/examples/safe-mode-agent.js +96 -0
  23. package/examples/self-discovery.js +106 -0
  24. package/examples/shopify-hydrogen/README.md +74 -74
  25. package/examples/vision-agent.js +171 -171
  26. package/examples/wab-sign.js +74 -0
  27. package/examples/wab-verify.js +60 -0
  28. package/examples/wordpress-elementor/README.md +77 -77
  29. package/package.json +93 -93
  30. package/public/.well-known/agent-tools.json +180 -180
  31. package/public/.well-known/ai-assets.json +59 -59
  32. package/public/.well-known/security.txt +8 -8
  33. package/public/.well-known/wab.json +28 -0
  34. package/public/activate.html +448 -0
  35. package/public/adopt.html +236 -0
  36. package/public/adoption-metrics.html +188 -0
  37. package/public/agent-workspace.html +359 -349
  38. package/public/ai.html +198 -198
  39. package/public/api.html +397 -413
  40. package/public/azure-dns-integration.html +289 -0
  41. package/public/browser.html +486 -486
  42. package/public/cloudflare-integration.html +380 -0
  43. package/public/commander-dashboard.html +243 -243
  44. package/public/cookies.html +210 -210
  45. package/public/cpanel-integration.html +398 -0
  46. package/public/css/agent-workspace.css +1713 -1713
  47. package/public/css/premium.css +317 -317
  48. package/public/css/styles.css +1401 -1235
  49. package/public/dashboard-shieldlink.html +295 -0
  50. package/public/dashboard.html +711 -706
  51. package/public/dns.html +436 -507
  52. package/public/docs.html +588 -587
  53. package/public/enterprise-mesh.ar.html +80 -0
  54. package/public/enterprise-mesh.html +81 -0
  55. package/public/feed.xml +89 -89
  56. package/public/gcp-dns-integration.html +318 -0
  57. package/public/governance.ar.html +70 -0
  58. package/public/governance.html +69 -0
  59. package/public/growth.html +465 -463
  60. package/public/index.html +1372 -1070
  61. package/public/integrations.html +556 -556
  62. package/public/js/activate.js +449 -0
  63. package/public/js/agent-workspace.js +1740 -1740
  64. package/public/js/auth-nav.js +117 -31
  65. package/public/js/auth-redirect.js +12 -12
  66. package/public/js/cookie-consent.js +56 -56
  67. package/public/js/dns.js +438 -0
  68. package/public/js/wab-demo-page.js +721 -721
  69. package/public/js/ws-client.js +74 -74
  70. package/public/l-preview.html +242 -0
  71. package/public/llms-full.txt +360 -360
  72. package/public/llms.txt +125 -125
  73. package/public/login.html +85 -85
  74. package/public/mesh-dashboard.html +328 -328
  75. package/public/milestones.html +346 -0
  76. package/public/one-click.html +779 -0
  77. package/public/openapi.json +669 -580
  78. package/public/partners.ar.html +145 -0
  79. package/public/partners.html +143 -0
  80. package/public/phone-shield.html +281 -281
  81. package/public/plesk-integration.html +375 -0
  82. package/public/premium-dashboard.html +2489 -2489
  83. package/public/premium.html +793 -793
  84. package/public/privacy.html +297 -297
  85. package/public/provider-onboarding.html +172 -0
  86. package/public/provider-sandbox.html +134 -0
  87. package/public/providers.html +359 -0
  88. package/public/refusals.html +172 -0
  89. package/public/register.html +105 -105
  90. package/public/registrar-integrations.html +141 -0
  91. package/public/ring4.html +292 -0
  92. package/public/robots.txt +99 -87
  93. package/public/route53-integration.html +531 -0
  94. package/public/score.html +263 -0
  95. package/public/script/wab-consent.d.ts +36 -36
  96. package/public/script/wab-consent.js +104 -104
  97. package/public/script/wab-schema.js +131 -131
  98. package/public/script/wab.d.ts +108 -108
  99. package/public/script/wab.min.js +580 -580
  100. package/public/security.txt +8 -8
  101. package/public/shieldlink.html +244 -0
  102. package/public/shieldqr.html +231 -0
  103. package/public/sitemap.xml +19 -1
  104. package/public/terms.html +256 -256
  105. package/public/trust-graph-api.ar.html +92 -0
  106. package/public/trust-graph-api.html +91 -0
  107. package/public/wab-features.html +560 -0
  108. package/public/wab-trust.html +200 -0
  109. package/public/wab-truth.html +375 -0
  110. package/public/wab-vs-protocols.html +210 -0
  111. package/public/whitepaper.html +449 -0
  112. package/script/ai-agent-bridge.js +1754 -1754
  113. package/sdk/README.md +99 -99
  114. package/sdk/agent-mesh.js +449 -449
  115. package/sdk/auto-discovery.js +301 -0
  116. package/sdk/commander.js +262 -262
  117. package/sdk/governance.js +262 -0
  118. package/sdk/index.d.ts +464 -464
  119. package/sdk/index.js +649 -636
  120. package/sdk/multi-agent.js +318 -318
  121. package/sdk/package.json +2 -2
  122. package/sdk/safe-mode.js +221 -0
  123. package/sdk/safety-shield.js +219 -219
  124. package/sdk/schema-discovery.js +83 -83
  125. package/server/adapters/index.js +520 -520
  126. package/server/config/plans.js +412 -367
  127. package/server/config/secrets.js +102 -102
  128. package/server/control-plane/index.js +301 -301
  129. package/server/data-plane/index.js +354 -354
  130. package/server/index.js +790 -531
  131. package/server/llm/index.js +404 -404
  132. package/server/middleware/adminAuth.js +35 -35
  133. package/server/middleware/api-tier.js +170 -0
  134. package/server/middleware/auth.js +50 -50
  135. package/server/middleware/featureGate.js +88 -88
  136. package/server/middleware/rateLimits.js +100 -100
  137. package/server/middleware/sensitiveAction.js +157 -157
  138. package/server/middleware/wab-trust.js +141 -0
  139. package/server/migrations/001_add_analytics_indexes.sql +7 -7
  140. package/server/migrations/002_premium_features.sql +418 -418
  141. package/server/migrations/003_ads_integer_cents.sql +33 -33
  142. package/server/migrations/004_agent_os.sql +158 -158
  143. package/server/migrations/005_marketplace_metering.sql +126 -126
  144. package/server/migrations/006_growth_suite.sql +138 -0
  145. package/server/migrations/007_governance.sql +106 -0
  146. package/server/migrations/008_plans.sql +144 -0
  147. package/server/migrations/009_shieldqr.sql +30 -0
  148. package/server/migrations/010_extended_trust.sql +33 -0
  149. package/server/migrations/011_outreach.sql +47 -0
  150. package/server/migrations/012_shieldlink.sql +116 -0
  151. package/server/migrations/013_ct_monitor.sql +13 -0
  152. package/server/migrations/014_wab_advanced_features.sql +128 -0
  153. package/server/migrations/015_wab_truth_layer.sql +101 -0
  154. package/server/migrations/016_ring4_external_trust.sql +84 -0
  155. package/server/migrations/017_ring4_extensions.sql +69 -0
  156. package/server/migrations/018_commercial_foundations.sql +167 -0
  157. package/server/migrations/019_unify_tier_constraints.sql +133 -0
  158. package/server/models/adapters/index.js +33 -33
  159. package/server/models/adapters/mysql.js +183 -183
  160. package/server/models/adapters/postgresql.js +172 -172
  161. package/server/models/adapters/sqlite.js +7 -7
  162. package/server/models/db.js +740 -681
  163. package/server/observability/failure-analysis.js +337 -337
  164. package/server/observability/index.js +394 -394
  165. package/server/protocol/capabilities.js +223 -223
  166. package/server/protocol/index.js +243 -243
  167. package/server/protocol/schema.js +584 -584
  168. package/server/registry/certification.js +271 -271
  169. package/server/registry/index.js +326 -326
  170. package/server/routes/activate.js +478 -0
  171. package/server/routes/admin-outreach.js +239 -0
  172. package/server/routes/admin-plans.js +76 -0
  173. package/server/routes/admin-premium.js +674 -671
  174. package/server/routes/admin-shieldlink.js +137 -0
  175. package/server/routes/admin-shieldqr.js +90 -0
  176. package/server/routes/admin-trust-monitor.js +139 -0
  177. package/server/routes/admin.js +550 -261
  178. package/server/routes/adopt.js +61 -0
  179. package/server/routes/ads.js +130 -130
  180. package/server/routes/agent-workspace.js +540 -540
  181. package/server/routes/api-keys.js +127 -0
  182. package/server/routes/api.js +150 -150
  183. package/server/routes/auth.js +71 -71
  184. package/server/routes/billing.js +57 -45
  185. package/server/routes/commander.js +316 -316
  186. package/server/routes/customer-shieldlink.js +133 -0
  187. package/server/routes/demo-showcase.js +332 -332
  188. package/server/routes/demo-store.js +154 -154
  189. package/server/routes/diagnose.js +373 -0
  190. package/server/routes/discovery.js +2348 -417
  191. package/server/routes/enterprise-mesh.js +170 -0
  192. package/server/routes/gateway.js +173 -173
  193. package/server/routes/governance-saas.js +203 -0
  194. package/server/routes/governance.js +208 -0
  195. package/server/routes/growth.js +1048 -0
  196. package/server/routes/intent.js +328 -0
  197. package/server/routes/license.js +251 -251
  198. package/server/routes/mesh.js +469 -469
  199. package/server/routes/noscript.js +543 -543
  200. package/server/routes/partners.js +201 -0
  201. package/server/routes/plans.js +33 -0
  202. package/server/routes/premium-v2.js +686 -686
  203. package/server/routes/premium.js +724 -724
  204. package/server/routes/providers.js +650 -0
  205. package/server/routes/reputation.js +411 -0
  206. package/server/routes/ring4.js +885 -0
  207. package/server/routes/runtime.js +2148 -2148
  208. package/server/routes/shieldlink.js +70 -0
  209. package/server/routes/shieldqr.js +88 -0
  210. package/server/routes/sovereign.js +465 -465
  211. package/server/routes/truth-layer.js +670 -0
  212. package/server/routes/universal.js +200 -200
  213. package/server/routes/unsubscribe.js +51 -0
  214. package/server/routes/wab-api.js +850 -850
  215. package/server/routes/wab-cache.js +282 -0
  216. package/server/runtime/container-worker.js +111 -111
  217. package/server/runtime/container.js +448 -448
  218. package/server/runtime/distributed-worker.js +362 -362
  219. package/server/runtime/event-bus.js +210 -210
  220. package/server/runtime/index.js +253 -253
  221. package/server/runtime/queue.js +599 -599
  222. package/server/runtime/replay.js +666 -666
  223. package/server/runtime/sandbox.js +266 -266
  224. package/server/runtime/scheduler.js +534 -534
  225. package/server/runtime/session-engine.js +293 -293
  226. package/server/runtime/state-manager.js +188 -188
  227. package/server/secrets/wab-signing-key.pem +3 -0
  228. package/server/secrets/wab-signing-pub.pem +3 -0
  229. package/server/security/cross-site-redactor.js +196 -196
  230. package/server/security/dry-run.js +180 -180
  231. package/server/security/human-gate-rate-limit.js +147 -147
  232. package/server/security/human-gate-transports.js +178 -178
  233. package/server/security/human-gate.js +281 -281
  234. package/server/security/index.js +368 -368
  235. package/server/security/intent-engine.js +245 -245
  236. package/server/security/reward-guard.js +171 -171
  237. package/server/security/rollback-store.js +239 -239
  238. package/server/security/token-scope.js +404 -404
  239. package/server/security/url-policy.js +139 -139
  240. package/server/services/adoption-agent.js +182 -0
  241. package/server/services/agent-chat.js +506 -506
  242. package/server/services/agent-learning.js +601 -601
  243. package/server/services/agent-memory.js +625 -625
  244. package/server/services/agent-mesh.js +555 -555
  245. package/server/services/agent-symphony.js +717 -717
  246. package/server/services/agent-tasks.js +1807 -1807
  247. package/server/services/api-key-engine.js +292 -292
  248. package/server/services/cluster.js +894 -894
  249. package/server/services/commander.js +738 -738
  250. package/server/services/edge-compute.js +440 -440
  251. package/server/services/email.js +233 -204
  252. package/server/services/fairness-engine.js +409 -0
  253. package/server/services/fairness.js +420 -0
  254. package/server/services/governance.js +466 -0
  255. package/server/services/hosted-runtime.js +205 -205
  256. package/server/services/lfd.js +635 -635
  257. package/server/services/local-ai.js +389 -389
  258. package/server/services/marketplace.js +270 -270
  259. package/server/services/metering.js +182 -182
  260. package/server/services/modules/affiliate-intelligence.js +93 -93
  261. package/server/services/modules/agent-firewall.js +90 -90
  262. package/server/services/modules/bounty.js +89 -89
  263. package/server/services/modules/collective-bargaining.js +92 -92
  264. package/server/services/modules/dark-pattern.js +66 -66
  265. package/server/services/modules/gov-intelligence.js +45 -45
  266. package/server/services/modules/neural.js +55 -55
  267. package/server/services/modules/notary.js +49 -49
  268. package/server/services/modules/price-time-machine.js +86 -86
  269. package/server/services/modules/protocol.js +104 -104
  270. package/server/services/negotiation.js +439 -439
  271. package/server/services/outreach-agent.js +312 -0
  272. package/server/services/plans.js +214 -0
  273. package/server/services/plugins.js +771 -771
  274. package/server/services/premium.js +1 -1
  275. package/server/services/price-intelligence.js +566 -566
  276. package/server/services/price-shield.js +1137 -1137
  277. package/server/services/provider-clients.js +740 -0
  278. package/server/services/reputation.js +465 -465
  279. package/server/services/search-engine.js +357 -357
  280. package/server/services/security.js +513 -513
  281. package/server/services/self-healing.js +843 -843
  282. package/server/services/shieldlink.js +492 -0
  283. package/server/services/shieldqr.js +322 -0
  284. package/server/services/sovereign-shield.js +542 -542
  285. package/server/services/ssl-ct-monitor.js +224 -0
  286. package/server/services/ssl-inspector.js +42 -0
  287. package/server/services/ssl-monitor.js +167 -0
  288. package/server/services/stripe.js +206 -192
  289. package/server/services/swarm.js +788 -788
  290. package/server/services/universal-scraper.js +662 -662
  291. package/server/services/verification.js +481 -481
  292. package/server/services/vision.js +1163 -1163
  293. package/server/services/wab-crypto.js +178 -0
  294. package/server/utils/cache.js +125 -125
  295. package/server/utils/migrate.js +81 -81
  296. package/server/utils/safe-fetch.js +228 -228
  297. package/server/utils/secureFields.js +50 -50
  298. package/server/ws.js +161 -161
  299. package/templates/artisan-marketplace.yaml +104 -104
  300. package/templates/book-price-scout.yaml +98 -98
  301. package/templates/electronics-price-tracker.yaml +108 -108
  302. package/templates/flight-deal-hunter.yaml +113 -113
  303. package/templates/freelancer-direct.yaml +116 -116
  304. package/templates/grocery-price-compare.yaml +93 -93
  305. package/templates/hotel-direct-booking.yaml +113 -113
  306. package/templates/local-services.yaml +98 -98
  307. package/templates/olive-oil-tunisia.yaml +88 -88
  308. package/templates/organic-farm-fresh.yaml +101 -101
  309. package/templates/restaurant-direct.yaml +97 -97
  310. package/templates/ring4/banking-sovereign.yaml +55 -0
  311. package/templates/ring4/ecommerce-sovereign.yaml +58 -0
  312. package/templates/ring4/healthcare-sovereign.yaml +60 -0
@@ -0,0 +1,138 @@
1
+ -- Growth Suite v2.5 — Tables for Bounty, Score, Data Marketplace,
2
+ -- Email Protection, Affiliate Intelligence, Trust Layer
3
+
4
+ -- ═══ Bounty Network ═══
5
+ CREATE TABLE IF NOT EXISTS bounty_reporters (
6
+ id TEXT PRIMARY KEY,
7
+ user_id TEXT,
8
+ token TEXT UNIQUE NOT NULL,
9
+ display_name TEXT NOT NULL DEFAULT 'Anonymous',
10
+ credits INTEGER DEFAULT 0,
11
+ total_reports INTEGER DEFAULT 0,
12
+ verified_reports INTEGER DEFAULT 0,
13
+ created_at TEXT DEFAULT (datetime('now')),
14
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
15
+ );
16
+ CREATE INDEX IF NOT EXISTS idx_bounty_reporters_token ON bounty_reporters(token);
17
+ CREATE INDEX IF NOT EXISTS idx_bounty_reporters_user ON bounty_reporters(user_id);
18
+
19
+ CREATE TABLE IF NOT EXISTS bounties (
20
+ id TEXT PRIMARY KEY,
21
+ reporter_id TEXT NOT NULL,
22
+ url TEXT NOT NULL,
23
+ fingerprint TEXT NOT NULL,
24
+ category TEXT DEFAULT 'phishing',
25
+ description TEXT,
26
+ evidence TEXT,
27
+ status TEXT DEFAULT 'PENDING' CHECK(status IN ('PENDING','VERIFIED','REJECTED','DUPLICATE')),
28
+ reward_tier TEXT,
29
+ credits_awarded INTEGER DEFAULT 0,
30
+ scan_result TEXT,
31
+ submitted_at TEXT DEFAULT (datetime('now')),
32
+ verified_at TEXT,
33
+ FOREIGN KEY (reporter_id) REFERENCES bounty_reporters(id) ON DELETE CASCADE
34
+ );
35
+ CREATE INDEX IF NOT EXISTS idx_bounties_fingerprint ON bounties(fingerprint);
36
+ CREATE INDEX IF NOT EXISTS idx_bounties_reporter ON bounties(reporter_id);
37
+ CREATE INDEX IF NOT EXISTS idx_bounties_status ON bounties(status);
38
+
39
+ -- ═══ WAB Score Cache ═══
40
+ CREATE TABLE IF NOT EXISTS wab_scores (
41
+ domain TEXT PRIMARY KEY,
42
+ overall_score INTEGER DEFAULT 0,
43
+ fairness_score INTEGER DEFAULT 0,
44
+ security_score INTEGER DEFAULT 0,
45
+ grade TEXT,
46
+ grade_label TEXT,
47
+ details TEXT DEFAULT '{}',
48
+ computed_at TEXT DEFAULT (datetime('now')),
49
+ expires_at TEXT
50
+ );
51
+ CREATE INDEX IF NOT EXISTS idx_wab_scores_grade ON wab_scores(grade);
52
+
53
+ -- ═══ Trust Layer ═══
54
+ CREATE TABLE IF NOT EXISTS trust_manifests (
55
+ domain TEXT PRIMARY KEY,
56
+ manifest TEXT NOT NULL,
57
+ verified INTEGER DEFAULT 0,
58
+ verification_result TEXT DEFAULT '{}',
59
+ last_verified_at TEXT,
60
+ registered_at TEXT DEFAULT (datetime('now'))
61
+ );
62
+
63
+ -- ═══ Data Marketplace ═══
64
+ CREATE TABLE IF NOT EXISTS datasets (
65
+ id TEXT PRIMARY KEY,
66
+ category TEXT NOT NULL,
67
+ title TEXT NOT NULL,
68
+ description TEXT,
69
+ record_count INTEGER DEFAULT 0,
70
+ format TEXT DEFAULT 'json',
71
+ price_base REAL DEFAULT 0,
72
+ sample_data TEXT,
73
+ metadata TEXT DEFAULT '{}',
74
+ active INTEGER DEFAULT 1,
75
+ created_at TEXT DEFAULT (datetime('now')),
76
+ updated_at TEXT DEFAULT (datetime('now'))
77
+ );
78
+ CREATE INDEX IF NOT EXISTS idx_datasets_category ON datasets(category);
79
+
80
+ CREATE TABLE IF NOT EXISTS dataset_purchases (
81
+ id TEXT PRIMARY KEY,
82
+ user_id TEXT,
83
+ dataset_id TEXT NOT NULL,
84
+ license_type TEXT DEFAULT 'RESEARCH',
85
+ price_paid REAL DEFAULT 0,
86
+ status TEXT DEFAULT 'completed',
87
+ purchased_at TEXT DEFAULT (datetime('now')),
88
+ FOREIGN KEY (dataset_id) REFERENCES datasets(id) ON DELETE CASCADE
89
+ );
90
+
91
+ -- ═══ Email Scan Log ═══
92
+ CREATE TABLE IF NOT EXISTS email_scans (
93
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
94
+ sender_domain TEXT,
95
+ urls_found INTEGER DEFAULT 0,
96
+ critical_count INTEGER DEFAULT 0,
97
+ warning_count INTEGER DEFAULT 0,
98
+ overall_risk TEXT DEFAULT 'SAFE',
99
+ risk_score INTEGER DEFAULT 0,
100
+ scanned_at TEXT DEFAULT (datetime('now'))
101
+ );
102
+ CREATE INDEX IF NOT EXISTS idx_email_scans_risk ON email_scans(overall_risk);
103
+
104
+ -- ═══ Affiliate Intelligence ═══
105
+ CREATE TABLE IF NOT EXISTS affiliate_reports (
106
+ id TEXT PRIMARY KEY,
107
+ network_id TEXT NOT NULL,
108
+ risk_level TEXT DEFAULT 'LOW',
109
+ fraud_types TEXT DEFAULT '[]',
110
+ trust_score INTEGER DEFAULT 100,
111
+ details TEXT DEFAULT '{}',
112
+ analyzed_at TEXT DEFAULT (datetime('now'))
113
+ );
114
+ CREATE INDEX IF NOT EXISTS idx_affiliate_reports_network ON affiliate_reports(network_id);
115
+
116
+ -- ═══ Seed: Default Datasets ═══
117
+ INSERT OR IGNORE INTO datasets (id, category, title, description, record_count, format, price_base, sample_data)
118
+ VALUES
119
+ ('ds-threat-intel', 'THREAT_INTEL', 'Real-Time Threat Intelligence Feed',
120
+ 'Live phishing, malware, and scam URL data aggregated from 47 threat databases. Updated continuously with sub-minute latency.',
121
+ 2847000, 'jsonl', 49.99,
122
+ '[{"url":"http://paypa1-login.xyz","risk":98,"type":"phishing","detected":"2026-04-19"},{"url":"http://free-prize-claim.com","risk":87,"type":"scam","detected":"2026-04-19"}]'),
123
+ ('ds-platform-fair', 'PLATFORM_FAIR', 'Platform Fairness Scores',
124
+ 'Quarterly transparency scores for 500+ e-commerce marketplaces covering hidden fees, return policies, dark patterns, and seller fairness.',
125
+ 523, 'json', 29.99,
126
+ '[{"domain":"amazon.com","score":86,"grade":"A-","hidden_fees":false,"dark_patterns":2},{"domain":"aliexpress.com","score":68,"grade":"C+","hidden_fees":true,"dark_patterns":7}]'),
127
+ ('ds-affiliate-intel', 'AFFILIATE_INTEL', 'Affiliate Intelligence Report',
128
+ 'Commission benchmarks, fraud pattern analysis, and network reliability scores across all major affiliate platforms.',
129
+ 856, 'json', 39.99,
130
+ '[{"network":"amazon_associates","trust":82,"shaving_risk":"LOW","avg_payout_days":28},{"network":"clickbank","trust":61,"shaving_risk":"MEDIUM","avg_payout_days":45}]'),
131
+ ('ds-email-threats', 'EMAIL_THREATS', 'Email Phishing Signatures',
132
+ 'Curated database of phishing email patterns, sender reputation data, and URL fingerprints for email security.',
133
+ 1250000, 'jsonl', 59.99,
134
+ '[{"pattern":"account.*verif","risk":92,"type":"credential_phishing"},{"pattern":"prize.*claim.*now","risk":88,"type":"advance_fee_scam"}]'),
135
+ ('ds-price-history', 'PRICE_HISTORY', 'E-Commerce Price Trends',
136
+ 'Historical price tracking data for Amazon, eBay, and Alibaba. Ideal for price comparison and deal-finding AI agents.',
137
+ 5400000, 'csv', 79.99,
138
+ '[{"product":"Sony WH-1000XM5","amazon_price":298,"ebay_price":275,"trend":"dropping"},{"product":"iPad Air M2","amazon_price":599,"ebay_price":569,"trend":"stable"}]');
@@ -0,0 +1,106 @@
1
+ -- ═══════════════════════════════════════════════════════════════════
2
+ -- WAB Agent Governance Layer
3
+ -- Permission Boundaries · Approval Gates · Tamper-Evident Audit Log
4
+ -- Kill Switch · Spend Limits
5
+ -- ═══════════════════════════════════════════════════════════════════
6
+
7
+ -- Agents registered for governance (one row per agent identity).
8
+ CREATE TABLE IF NOT EXISTS gov_agents (
9
+ agent_id TEXT PRIMARY KEY,
10
+ owner_id TEXT, -- user_id of owner (nullable for unauthed)
11
+ display_name TEXT,
12
+ token_hash TEXT NOT NULL, -- sha256(agent_token); used to authenticate the agent
13
+ status TEXT NOT NULL DEFAULT 'alive' CHECK(status IN ('alive','killed','suspended')),
14
+ killed_at TEXT,
15
+ killed_reason TEXT,
16
+ metadata TEXT, -- JSON
17
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
18
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
19
+ );
20
+
21
+ -- Permission policies. One row = one rule. Evaluated allow-list style.
22
+ CREATE TABLE IF NOT EXISTS gov_policies (
23
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
24
+ agent_id TEXT NOT NULL,
25
+ resource TEXT NOT NULL, -- e.g. "stripe", "gmail", "clickup", "domain:example.com"
26
+ action TEXT NOT NULL, -- "read" | "write" | "execute" | "*"
27
+ scope TEXT, -- optional: e.g. "refunds", "inbox", "tasks/123"
28
+ max_amount REAL, -- monetary cap per single action
29
+ currency TEXT DEFAULT 'USD',
30
+ daily_cap REAL, -- monetary cap per 24h rolling
31
+ per_call_rate INTEGER, -- max calls per minute
32
+ requires_approval INTEGER NOT NULL DEFAULT 0, -- 1 = always send to human gate
33
+ effect TEXT NOT NULL DEFAULT 'allow' CHECK(effect IN ('allow','deny')),
34
+ expires_at TEXT,
35
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
36
+ FOREIGN KEY (agent_id) REFERENCES gov_agents(agent_id) ON DELETE CASCADE
37
+ );
38
+ CREATE INDEX IF NOT EXISTS idx_gov_policies_agent ON gov_policies(agent_id);
39
+ CREATE INDEX IF NOT EXISTS idx_gov_policies_lookup ON gov_policies(agent_id, resource, action);
40
+
41
+ -- Append-only audit log with HMAC hash chain (tamper-evident).
42
+ -- prev_hash → hash chain links every entry; breaking the chain detects tampering.
43
+ CREATE TABLE IF NOT EXISTS gov_audit (
44
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
45
+ agent_id TEXT NOT NULL,
46
+ ts TEXT NOT NULL DEFAULT (datetime('now')),
47
+ event_type TEXT NOT NULL, -- 'check' | 'execute' | 'deny' | 'approval_request' | 'approval_decision' | 'kill' | 'policy_change' | 'note'
48
+ resource TEXT,
49
+ action TEXT,
50
+ scope TEXT,
51
+ amount REAL,
52
+ currency TEXT,
53
+ decision TEXT, -- 'allow' | 'deny' | 'pending' | 'approved' | 'rejected'
54
+ reason TEXT,
55
+ params_json TEXT, -- redacted parameter snapshot
56
+ result_json TEXT,
57
+ prev_hash TEXT, -- prior entry's hash
58
+ hash TEXT NOT NULL, -- HMAC(secret, prev_hash || row_payload)
59
+ FOREIGN KEY (agent_id) REFERENCES gov_agents(agent_id) ON DELETE CASCADE
60
+ );
61
+ CREATE INDEX IF NOT EXISTS idx_gov_audit_agent_ts ON gov_audit(agent_id, ts);
62
+ CREATE INDEX IF NOT EXISTS idx_gov_audit_event ON gov_audit(agent_id, event_type);
63
+
64
+ -- Approval requests. Async — agent requests, human resolves later.
65
+ CREATE TABLE IF NOT EXISTS gov_approvals (
66
+ request_id TEXT PRIMARY KEY,
67
+ agent_id TEXT NOT NULL,
68
+ resource TEXT NOT NULL,
69
+ action TEXT NOT NULL,
70
+ scope TEXT,
71
+ amount REAL,
72
+ currency TEXT,
73
+ params_json TEXT,
74
+ reason TEXT, -- why approval is required
75
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','approved','rejected','expired','cancelled')),
76
+ decided_by TEXT, -- user_id of approver
77
+ decided_at TEXT,
78
+ decided_note TEXT,
79
+ expires_at TEXT, -- auto-expire pending requests
80
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
81
+ FOREIGN KEY (agent_id) REFERENCES gov_agents(agent_id) ON DELETE CASCADE
82
+ );
83
+ CREATE INDEX IF NOT EXISTS idx_gov_approvals_pending ON gov_approvals(agent_id, status);
84
+
85
+ -- Spend tracker (per agent, per resource, sliding window).
86
+ -- Rebuilt rolling-style; we just append on every monetary action.
87
+ CREATE TABLE IF NOT EXISTS gov_spend (
88
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
89
+ agent_id TEXT NOT NULL,
90
+ resource TEXT NOT NULL,
91
+ amount REAL NOT NULL,
92
+ currency TEXT NOT NULL DEFAULT 'USD',
93
+ ts TEXT NOT NULL DEFAULT (datetime('now')),
94
+ ref TEXT, -- audit_id or external ref
95
+ FOREIGN KEY (agent_id) REFERENCES gov_agents(agent_id) ON DELETE CASCADE
96
+ );
97
+ CREATE INDEX IF NOT EXISTS idx_gov_spend_window ON gov_spend(agent_id, resource, ts);
98
+
99
+ -- Rate-limit token buckets (lightweight; we keep counters).
100
+ CREATE TABLE IF NOT EXISTS gov_rate (
101
+ agent_id TEXT NOT NULL,
102
+ resource TEXT NOT NULL,
103
+ window_start TEXT NOT NULL, -- ISO timestamp (minute-resolution)
104
+ count INTEGER NOT NULL DEFAULT 0,
105
+ PRIMARY KEY (agent_id, resource, window_start)
106
+ );
@@ -0,0 +1,144 @@
1
+ -- Migration 008: Plans Management
2
+ -- Database-driven plans + feature catalog so admins can add/edit plans,
3
+ -- toggle which features each plan includes, and have changes flow live to
4
+ -- the landing page pricing section AND the Stripe checkout flow.
5
+ --
6
+ -- Backwards-compatible: legacy code paths that look up tiers by slug
7
+ -- ('free' | 'starter' | 'pro' | 'enterprise') keep working — those slugs
8
+ -- are seeded as plan ids below.
9
+ --
10
+ -- An older `plans` table (different schema: tier/price/etc.) may exist from
11
+ -- a previous admin dashboard iteration. Its rows are pure default seeds with
12
+ -- no FK references, so we drop it and recreate with the new schema.
13
+
14
+ DROP TABLE IF EXISTS plans;
15
+
16
+ CREATE TABLE plans (
17
+ id TEXT PRIMARY KEY, -- slug, lowercase, e.g. 'free' / 'pro' / 'business' / 'enterprise'
18
+ name TEXT NOT NULL,
19
+ tagline TEXT,
20
+ description TEXT,
21
+ price_cents INTEGER NOT NULL DEFAULT 0,
22
+ currency TEXT NOT NULL DEFAULT 'EUR',
23
+ billing_period TEXT NOT NULL DEFAULT 'month'
24
+ CHECK(billing_period IN ('month','year','one_time','custom')),
25
+ stripe_price_id TEXT,
26
+ cta_type TEXT NOT NULL DEFAULT 'checkout'
27
+ CHECK(cta_type IN ('checkout','register','contact','external')),
28
+ cta_label TEXT,
29
+ cta_url TEXT,
30
+ highlight INTEGER NOT NULL DEFAULT 0,
31
+ is_public INTEGER NOT NULL DEFAULT 1,
32
+ is_archived INTEGER NOT NULL DEFAULT 0,
33
+ sort_order INTEGER NOT NULL DEFAULT 100,
34
+ features_json TEXT NOT NULL DEFAULT '{}',
35
+ limits_json TEXT NOT NULL DEFAULT '{}',
36
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
37
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
38
+ );
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_plans_public_archived ON plans(is_public, is_archived, sort_order);
41
+
42
+ CREATE TABLE IF NOT EXISTS feature_catalog (
43
+ feature_key TEXT PRIMARY KEY,
44
+ label TEXT NOT NULL,
45
+ description TEXT,
46
+ category TEXT NOT NULL DEFAULT 'general',
47
+ is_open_source INTEGER NOT NULL DEFAULT 0,
48
+ sort_order INTEGER NOT NULL DEFAULT 100,
49
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
50
+ );
51
+
52
+ -- Feature catalog (open-source / always-free first, then paid features)
53
+ INSERT OR IGNORE INTO feature_catalog (feature_key, label, description, category, is_open_source, sort_order) VALUES
54
+ -- Always-free / open core
55
+ ('protocol', 'WAP Protocol Core', 'Open Web Agent Protocol — schema, discovery, permissions', 'core', 1, 10),
56
+ ('sdk', 'SDK & Client Runtime', 'JavaScript SDK and client integrations', 'core', 1, 20),
57
+ ('browserExecution', 'Browser Execution Layer', 'Basic browser automation primitives', 'core', 1, 30),
58
+ ('adapters', 'MCP / REST / Browser Adapters','Adapters for MCP, REST APIs, and browser back-ends', 'core', 1, 40),
59
+ ('registryRead', 'Public Registry (read-only)', 'Browse commands, sites and templates', 'core', 1, 50),
60
+ ('agentRegistration', 'Agent Registration', 'Register agents and obtain credentials', 'core', 1, 60),
61
+ ('basicAuth', 'Basic Authentication', 'API keys and basic auth flows', 'core', 1, 70),
62
+ ('discovery', 'DNS / .well-known Discovery', 'Service discovery via DNS TXT and /.well-known/', 'core', 1, 80),
63
+ ('capabilityNegotiation', 'Capability Negotiation', 'Capability handshake between agent and site', 'core', 1, 90),
64
+ ('semanticActions', 'Semantic Actions', 'Built-in semantic actions catalog', 'core', 1,100),
65
+ ('communityTemplates', 'Community Templates', 'Public template library', 'core', 1,110),
66
+
67
+ -- Workspace / orchestration
68
+ ('workspace', 'Control Plane / Workspace', 'Web dashboard, monitoring and agent management', 'workspace', 0,200),
69
+ ('advancedOrchestration', 'Advanced Orchestration', 'Scheduling, retries, pipelines, distributed execution', 'workspace', 0,210),
70
+ ('observability', 'Observability', 'Tracing, metrics, logs and performance insights', 'workspace', 0,220),
71
+ ('failureAnalysis', 'Failure Analysis', 'Debugging tools and root-cause reports', 'workspace', 0,230),
72
+ ('replayEngine', 'Replay Engine', 'Record and replay agent runs', 'workspace', 0,240),
73
+ ('advancedAnalytics', 'Advanced Analytics', 'Detailed analytics dashboards and exports', 'workspace', 0,250),
74
+ ('dataExtraction', 'Data Extraction', 'Structured data extraction and export', 'workspace', 0,260),
75
+ ('agentMemory', 'Agent Memory Engine', 'Persistent context and long-term memory for agents', 'workspace', 0,270),
76
+ ('llmInference', 'LLM Inference', 'Built-in LLM inference via the platform', 'workspace', 0,280),
77
+
78
+ -- Premium / business
79
+ ('hostedRuntime', 'Hosted Runtime (Cloud Exec)', 'Auto-scaling hosted execution environment', 'premium', 0,300),
80
+ ('marketplace', 'Marketplace (Publish & Sell)','Publish agents and templates on the marketplace', 'premium', 0,310),
81
+ ('certification', 'Agent Certification', 'Verified agent identity badge', 'premium', 0,320),
82
+ ('trafficIntelligence', 'Traffic Intelligence', 'Agent profiling, anomaly detection and reporting', 'premium', 0,330),
83
+ ('exploitShield', 'Exploit Shield', 'Block malicious agents at the edge', 'premium', 0,340),
84
+ ('visionAnalysis', 'Vision Analysis', 'Visual page inspection (computer-vision pipeline)', 'premium', 0,350),
85
+ ('swarmExecution', 'Swarm / Multi-Agent', 'Coordinated multi-agent (swarm) execution', 'premium', 0,360),
86
+ ('auditLog', 'Audit Logs', 'Tamper-evident HMAC-chained audit history', 'premium', 0,370),
87
+ ('customDomain', 'Custom Domain / White-label', 'Serve the workspace on your own domain', 'premium', 0,380),
88
+ ('governanceLayer', 'Agent Governance Layer', 'Policies, approvals, kill switch and spend limits', 'premium', 0,390),
89
+
90
+ -- Enterprise
91
+ ('enterpriseSecurity', 'Enterprise Security', 'Request signing, IP allowlists, SSO/SAML', 'enterprise', 0,400),
92
+ ('prioritySupport', 'Priority Support', 'Dedicated SLA-backed support channel', 'enterprise', 0,410),
93
+ ('sla', 'Uptime SLA', 'Contractual uptime SLA', 'enterprise', 0,420),
94
+ ('customDevelopment', 'Custom Development', 'Bespoke engineering and integrations', 'enterprise', 0,430),
95
+ ('dedicatedInfra', 'Dedicated Infrastructure', 'Isolated single-tenant deployment', 'enterprise', 0,440);
96
+
97
+ -- Seed the four canonical plans (admin can edit/add later).
98
+ -- features_json keys MUST match feature_catalog.feature_key.
99
+ INSERT OR IGNORE INTO plans
100
+ (id, name, tagline, description, price_cents, currency, billing_period, cta_type, cta_label, cta_url, highlight, sort_order, features_json, limits_json)
101
+ VALUES
102
+ ('free',
103
+ 'Free',
104
+ 'Open-source core, forever free',
105
+ 'WAP protocol, SDK, discovery and the entire open-source surface — for developers and integrators.',
106
+ 0, 'EUR', 'month',
107
+ 'register', 'Get started for free', '/register',
108
+ 0, 10,
109
+ '{"protocol":true,"sdk":true,"browserExecution":true,"adapters":true,"registryRead":true,"agentRegistration":true,"basicAuth":true,"discovery":true,"capabilityNegotiation":true,"semanticActions":true,"communityTemplates":true}',
110
+ '{"agents":3,"tasksPerDay":50,"executionsPerDay":100,"sessions":5,"maxConcurrency":2,"replayRecordings":10,"computeMinutesPerDay":10,"storageMB":50,"webhooks":1,"customAgents":1,"apiCallsPerMinute":20}'
111
+ ),
112
+
113
+ ('pro',
114
+ 'Pro',
115
+ 'For developers shipping production agents',
116
+ 'Everything in Free plus the workspace, observability, replay engine, advanced orchestration and analytics.',
117
+ 1000, 'EUR', 'month',
118
+ 'checkout', 'Start Pro', NULL,
119
+ 1, 20,
120
+ '{"protocol":true,"sdk":true,"browserExecution":true,"adapters":true,"registryRead":true,"agentRegistration":true,"basicAuth":true,"discovery":true,"capabilityNegotiation":true,"semanticActions":true,"communityTemplates":true,"workspace":true,"advancedOrchestration":true,"observability":true,"failureAnalysis":true,"replayEngine":true,"advancedAnalytics":true,"dataExtraction":true,"agentMemory":true,"llmInference":true}',
121
+ '{"agents":25,"tasksPerDay":2000,"executionsPerDay":5000,"sessions":50,"maxConcurrency":10,"replayRecordings":500,"computeMinutesPerDay":180,"storageMB":2000,"webhooks":10,"customAgents":10,"apiCallsPerMinute":120}'
122
+ ),
123
+
124
+ ('business',
125
+ 'Business',
126
+ 'All paid features, ready for scale',
127
+ 'Everything in Pro plus hosted runtime, marketplace, vision, swarm, traffic intelligence, exploit shield, audit logs, custom domain and governance.',
128
+ 2900, 'EUR', 'month',
129
+ 'checkout', 'Start Business', NULL,
130
+ 0, 30,
131
+ '{"protocol":true,"sdk":true,"browserExecution":true,"adapters":true,"registryRead":true,"agentRegistration":true,"basicAuth":true,"discovery":true,"capabilityNegotiation":true,"semanticActions":true,"communityTemplates":true,"workspace":true,"advancedOrchestration":true,"observability":true,"failureAnalysis":true,"replayEngine":true,"advancedAnalytics":true,"dataExtraction":true,"agentMemory":true,"llmInference":true,"hostedRuntime":true,"marketplace":true,"certification":true,"trafficIntelligence":true,"exploitShield":true,"visionAnalysis":true,"swarmExecution":true,"auditLog":true,"customDomain":true,"governanceLayer":true}',
132
+ '{"agents":100,"tasksPerDay":20000,"executionsPerDay":50000,"sessions":250,"maxConcurrency":40,"replayRecordings":5000,"computeMinutesPerDay":600,"storageMB":10000,"webhooks":50,"customAgents":50,"apiCallsPerMinute":300}'
133
+ ),
134
+
135
+ ('enterprise',
136
+ 'Enterprise',
137
+ 'Custom-built for organisations',
138
+ 'Everything in Business plus enterprise security, dedicated infrastructure, custom development, priority support and a contractual uptime SLA. Pricing is tailored to your scope.',
139
+ 0, 'EUR', 'custom',
140
+ 'contact', 'Contact sales', 'mailto:sales@webagentbridge.com',
141
+ 0, 40,
142
+ '{"protocol":true,"sdk":true,"browserExecution":true,"adapters":true,"registryRead":true,"agentRegistration":true,"basicAuth":true,"discovery":true,"capabilityNegotiation":true,"semanticActions":true,"communityTemplates":true,"workspace":true,"advancedOrchestration":true,"observability":true,"failureAnalysis":true,"replayEngine":true,"advancedAnalytics":true,"dataExtraction":true,"agentMemory":true,"llmInference":true,"hostedRuntime":true,"marketplace":true,"certification":true,"trafficIntelligence":true,"exploitShield":true,"visionAnalysis":true,"swarmExecution":true,"auditLog":true,"customDomain":true,"governanceLayer":true,"enterpriseSecurity":true,"prioritySupport":true,"sla":true,"customDevelopment":true,"dedicatedInfra":true}',
143
+ '{"agents":-1,"tasksPerDay":-1,"executionsPerDay":-1,"sessions":-1,"maxConcurrency":-1,"replayRecordings":-1,"computeMinutesPerDay":-1,"storageMB":-1,"webhooks":-1,"customAgents":-1,"apiCallsPerMinute":-1}'
144
+ );
@@ -0,0 +1,30 @@
1
+ -- Migration 009: WAB ShieldQR scan history + reports
2
+ CREATE TABLE IF NOT EXISTS shieldqr_scans (
3
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
4
+ url TEXT NOT NULL,
5
+ host TEXT,
6
+ level TEXT NOT NULL CHECK(level IN ('green','yellow','red')),
7
+ score INTEGER NOT NULL DEFAULT 0,
8
+ signals_json TEXT NOT NULL DEFAULT '[]',
9
+ trust_ok INTEGER NOT NULL DEFAULT 0,
10
+ ssl_ok INTEGER NOT NULL DEFAULT 0,
11
+ user_id TEXT,
12
+ ip TEXT,
13
+ user_agent TEXT,
14
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
15
+ );
16
+ CREATE INDEX IF NOT EXISTS idx_shieldqr_scans_host_created ON shieldqr_scans(host, created_at DESC);
17
+ CREATE INDEX IF NOT EXISTS idx_shieldqr_scans_level_created ON shieldqr_scans(level, created_at DESC);
18
+
19
+ CREATE TABLE IF NOT EXISTS shieldqr_reports (
20
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+ scan_id INTEGER REFERENCES shieldqr_scans(id) ON DELETE SET NULL,
22
+ url TEXT NOT NULL,
23
+ reason TEXT,
24
+ reporter_id TEXT,
25
+ reporter_ip TEXT,
26
+ status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open','reviewing','resolved','rejected')),
27
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
28
+ resolved_at DATETIME
29
+ );
30
+ CREATE INDEX IF NOT EXISTS idx_shieldqr_reports_status ON shieldqr_reports(status, created_at DESC);
@@ -0,0 +1,33 @@
1
+ -- Migration 010: WAB Extended Trust — Certificate Companion & SSL Health Monitoring
2
+ -- Per-domain SSL certificate history (Certificate Transparency log) +
3
+ -- live SSL monitoring state for the trust dashboard.
4
+
5
+ CREATE TABLE IF NOT EXISTS cert_history (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ host TEXT NOT NULL,
8
+ fingerprint_sha256 TEXT NOT NULL,
9
+ issuer TEXT,
10
+ subject TEXT,
11
+ serial TEXT,
12
+ valid_from TEXT,
13
+ valid_to TEXT,
14
+ observed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
15
+ source TEXT DEFAULT 'monitor' -- 'monitor' | 'shieldqr' | 'sign'
16
+ );
17
+ CREATE INDEX IF NOT EXISTS idx_cert_history_host_observed ON cert_history(host, observed_at DESC);
18
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_cert_history_host_fp ON cert_history(host, fingerprint_sha256);
19
+
20
+ CREATE TABLE IF NOT EXISTS ssl_monitor (
21
+ host TEXT PRIMARY KEY,
22
+ fingerprint_sha256 TEXT,
23
+ issuer TEXT,
24
+ valid_to TEXT,
25
+ days_until_expiry INTEGER,
26
+ status TEXT, -- 'active' | 'expiring' | 'expired' | 'error'
27
+ error TEXT,
28
+ last_checked_at DATETIME,
29
+ last_alert_at DATETIME,
30
+ enabled INTEGER NOT NULL DEFAULT 1,
31
+ owner_user_id TEXT
32
+ );
33
+ CREATE INDEX IF NOT EXISTS idx_ssl_monitor_status ON ssl_monitor(status, valid_to);
@@ -0,0 +1,47 @@
1
+ -- Outreach Agent — site analysis + email queue + suppression list
2
+ -- Strict human-in-the-loop: drafts default to 'pending' and require admin approval.
3
+
4
+ CREATE TABLE IF NOT EXISTS outreach_targets (
5
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
6
+ site_url TEXT NOT NULL,
7
+ host TEXT NOT NULL,
8
+ contact_email TEXT,
9
+ detected_lang TEXT,
10
+ site_kind TEXT,
11
+ signals_json TEXT,
12
+ suggested_features_json TEXT,
13
+ draft_subject TEXT,
14
+ draft_body_html TEXT,
15
+ draft_body_text TEXT,
16
+ status TEXT NOT NULL DEFAULT 'pending',
17
+ -- pending | approved | sending | sent | failed | suppressed | skipped
18
+ unsubscribe_token TEXT,
19
+ error_message TEXT,
20
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
21
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
22
+ sent_at TEXT
23
+ );
24
+
25
+ CREATE INDEX IF NOT EXISTS idx_outreach_status ON outreach_targets(status);
26
+ CREATE INDEX IF NOT EXISTS idx_outreach_host ON outreach_targets(host);
27
+ CREATE INDEX IF NOT EXISTS idx_outreach_email ON outreach_targets(contact_email);
28
+
29
+ CREATE TABLE IF NOT EXISTS outreach_suppression (
30
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
31
+ email_or_host TEXT NOT NULL UNIQUE,
32
+ reason TEXT,
33
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
34
+ );
35
+
36
+ CREATE TABLE IF NOT EXISTS outreach_log (
37
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
38
+ target_id INTEGER,
39
+ event TEXT NOT NULL,
40
+ -- scanned | drafted | approved | sent | failed | bounced | unsubscribed | opened
41
+ details TEXT,
42
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
43
+ FOREIGN KEY (target_id) REFERENCES outreach_targets(id) ON DELETE CASCADE
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_outreach_log_target ON outreach_log(target_id);
47
+ CREATE INDEX IF NOT EXISTS idx_outreach_log_event ON outreach_log(event);
@@ -0,0 +1,116 @@
1
+ -- Migration 012: WAB ShieldLink (Verified Links / Anti-Phishing for premium customers)
2
+ --
3
+ -- Tables:
4
+ -- shieldlink_brands — verified brand identities (one row per verified site)
5
+ -- shieldlink_keys — per-site Ed25519 signing keys (private key encrypted at rest)
6
+ -- shieldlink_links — issued signed links (sessions / payment / invoice)
7
+ -- shieldlink_link_events — open / scan / report events for issued links
8
+ -- shieldlink_reports — phishing reports submitted by anyone
9
+ -- shieldlink_name_holds — reserved/blocked brand display names
10
+
11
+ CREATE TABLE IF NOT EXISTS shieldlink_brands (
12
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
13
+ site_id TEXT NOT NULL, -- FK -> sites.id
14
+ domain TEXT NOT NULL UNIQUE,
15
+ display_name TEXT NOT NULL,
16
+ display_name_normalized TEXT NOT NULL,
17
+ category TEXT, -- 'bank' | 'payments' | 'gov' | 'ecommerce' | 'other'
18
+ country TEXT,
19
+ logo_url TEXT,
20
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','verified','rejected','suspended')),
21
+ verified_badge INTEGER NOT NULL DEFAULT 0,
22
+ reputation INTEGER NOT NULL DEFAULT 100,
23
+ notes TEXT,
24
+ reviewed_by TEXT,
25
+ reviewed_at DATETIME,
26
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
27
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
28
+ );
29
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_brands_status ON shieldlink_brands(status);
30
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_brands_normalized ON shieldlink_brands(display_name_normalized);
31
+
32
+ CREATE TABLE IF NOT EXISTS shieldlink_keys (
33
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
34
+ brand_id INTEGER NOT NULL REFERENCES shieldlink_brands(id) ON DELETE CASCADE,
35
+ public_key TEXT NOT NULL, -- base64 raw 32-byte
36
+ private_key_enc TEXT NOT NULL, -- base64(AES-256-GCM(priv))
37
+ fingerprint TEXT NOT NULL,
38
+ active INTEGER NOT NULL DEFAULT 1,
39
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
40
+ rotated_at DATETIME
41
+ );
42
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_keys_brand ON shieldlink_keys(brand_id, active);
43
+
44
+ CREATE TABLE IF NOT EXISTS shieldlink_links (
45
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
46
+ token TEXT NOT NULL UNIQUE, -- short opaque public id
47
+ brand_id INTEGER NOT NULL REFERENCES shieldlink_brands(id) ON DELETE CASCADE,
48
+ site_id TEXT NOT NULL,
49
+ target_url TEXT NOT NULL, -- the actual URL we redirect to after preview
50
+ purpose TEXT NOT NULL CHECK(purpose IN ('payment','invoice','login','generic')),
51
+ amount_cents INTEGER,
52
+ currency TEXT,
53
+ payee_name TEXT,
54
+ reference TEXT, -- merchant invoice/session id
55
+ signature TEXT NOT NULL, -- base64 ed25519 signature over canonical payload
56
+ key_id TEXT NOT NULL, -- fingerprint of the signing key
57
+ payload_json TEXT NOT NULL, -- canonical signed payload, for verifier to re-check
58
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','revoked','expired')),
59
+ expires_at DATETIME NOT NULL,
60
+ created_by TEXT, -- user_id who issued
61
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
62
+ revoked_at DATETIME,
63
+ revoke_reason TEXT
64
+ );
65
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_links_brand ON shieldlink_links(brand_id, created_at DESC);
66
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_links_status ON shieldlink_links(status, expires_at);
67
+
68
+ CREATE TABLE IF NOT EXISTS shieldlink_link_events (
69
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
70
+ link_id INTEGER NOT NULL REFERENCES shieldlink_links(id) ON DELETE CASCADE,
71
+ event TEXT NOT NULL CHECK(event IN ('open','confirm','cancel','flag','verify_fail')),
72
+ ip TEXT,
73
+ user_agent TEXT,
74
+ ref TEXT,
75
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
76
+ );
77
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_link_events_link ON shieldlink_link_events(link_id, created_at DESC);
78
+
79
+ CREATE TABLE IF NOT EXISTS shieldlink_reports (
80
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
81
+ link_id INTEGER REFERENCES shieldlink_links(id) ON DELETE SET NULL,
82
+ url TEXT NOT NULL,
83
+ reason TEXT,
84
+ reporter_ip TEXT,
85
+ reporter_id TEXT,
86
+ status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open','reviewing','resolved','rejected')),
87
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
88
+ resolved_at DATETIME
89
+ );
90
+ CREATE INDEX IF NOT EXISTS idx_shieldlink_reports_status ON shieldlink_reports(status, created_at DESC);
91
+
92
+ CREATE TABLE IF NOT EXISTS shieldlink_name_holds (
93
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
94
+ pattern TEXT NOT NULL, -- normalized name or regex
95
+ pattern_kind TEXT NOT NULL DEFAULT 'literal' CHECK(pattern_kind IN ('literal','regex')),
96
+ reason TEXT,
97
+ created_by TEXT,
98
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
99
+ );
100
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_shieldlink_name_holds ON shieldlink_name_holds(pattern, pattern_kind);
101
+
102
+ -- Seed common impersonation targets (Saudi banks + payment networks).
103
+ -- Brands themselves can register and claim these names by proving DNS ownership.
104
+ INSERT OR IGNORE INTO shieldlink_name_holds (pattern, pattern_kind, reason)
105
+ VALUES
106
+ ('stcpay', 'literal', 'High-value impersonation target'),
107
+ ('stc-pay', 'literal', 'High-value impersonation target'),
108
+ ('alrajhi', 'literal', 'High-value impersonation target'),
109
+ ('alrajhibank', 'literal', 'High-value impersonation target'),
110
+ ('snb', 'literal', 'High-value impersonation target'),
111
+ ('riyadbank', 'literal', 'High-value impersonation target'),
112
+ ('mada', 'literal', 'High-value impersonation target'),
113
+ ('sarie', 'literal', 'High-value impersonation target'),
114
+ ('paypal', 'literal', 'High-value impersonation target'),
115
+ ('visa', 'literal', 'High-value impersonation target'),
116
+ ('mastercard', 'literal', 'High-value impersonation target');
@@ -0,0 +1,13 @@
1
+ -- Migration 013: Certificate Transparency Monitor
2
+ -- Adds CT-log tracking columns to ssl_monitor so the WAB Trust Layer
3
+ -- can detect new certificates issued (and re-sign wab.json) automatically.
4
+ -- cert_history.source already exists from 010_extended_trust.sql; the
5
+ -- 'ct_log' value is added implicitly (column has no CHECK constraint).
6
+
7
+ ALTER TABLE ssl_monitor ADD COLUMN ct_monitor_enabled INTEGER NOT NULL DEFAULT 1;
8
+ ALTER TABLE ssl_monitor ADD COLUMN ct_last_checked TEXT;
9
+ ALTER TABLE ssl_monitor ADD COLUMN ct_pending_resign INTEGER NOT NULL DEFAULT 0;
10
+ ALTER TABLE ssl_monitor ADD COLUMN ct_last_thumbprint TEXT;
11
+
12
+ CREATE INDEX IF NOT EXISTS idx_ssl_monitor_ct_pending
13
+ ON ssl_monitor(ct_pending_resign, ct_last_checked);