web-agent-bridge 3.4.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 (310) hide show
  1. package/LICENSE +84 -84
  2. package/README.ar.md +1563 -1304
  3. package/README.md +137 -298
  4. package/bin/agent-runner.js +474 -474
  5. package/bin/cli.js +237 -237
  6. package/bin/wab-init.js +244 -223
  7. package/bin/wab.js +80 -80
  8. package/examples/azure-dns-wab.js +83 -83
  9. package/examples/bidi-agent.js +119 -119
  10. package/examples/cloudflare-wab-dns.js +121 -121
  11. package/examples/cpanel-wab-dns.js +114 -114
  12. package/examples/cross-site-agent.js +91 -91
  13. package/examples/dns-discovery-agent.js +166 -166
  14. package/examples/gcp-dns-wab.js +76 -76
  15. package/examples/governance-agent.js +169 -169
  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 -103
  19. package/examples/puppeteer-agent.js +108 -108
  20. package/examples/route53-wab-dns.js +144 -144
  21. package/examples/saas-dashboard/README.md +55 -55
  22. package/examples/safe-mode-agent.js +96 -96
  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 -74
  27. package/examples/wab-verify.js +60 -60
  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 -28
  34. package/public/activate.html +448 -368
  35. package/public/adopt.html +236 -0
  36. package/public/adoption-metrics.html +188 -188
  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 -289
  41. package/public/browser.html +486 -486
  42. package/public/cloudflare-integration.html +380 -380
  43. package/public/commander-dashboard.html +243 -243
  44. package/public/cookies.html +210 -210
  45. package/public/cpanel-integration.html +398 -398
  46. package/public/css/agent-workspace.css +1713 -1713
  47. package/public/css/premium.css +317 -317
  48. package/public/css/styles.css +1401 -1263
  49. package/public/dashboard-shieldlink.html +295 -0
  50. package/public/dashboard.html +711 -707
  51. package/public/dns.html +436 -436
  52. package/public/docs.html +588 -588
  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 -318
  57. package/public/governance.ar.html +70 -0
  58. package/public/governance.html +69 -0
  59. package/public/growth.html +465 -465
  60. package/public/index.html +1372 -1266
  61. package/public/integrations.html +556 -556
  62. package/public/js/activate.js +449 -145
  63. package/public/js/agent-workspace.js +1740 -1740
  64. package/public/js/auth-nav.js +117 -65
  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 -438
  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 -669
  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 -375
  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 -172
  86. package/public/provider-sandbox.html +134 -134
  87. package/public/providers.html +359 -359
  88. package/public/refusals.html +172 -0
  89. package/public/register.html +105 -105
  90. package/public/registrar-integrations.html +141 -141
  91. package/public/ring4.html +292 -0
  92. package/public/robots.txt +99 -99
  93. package/public/route53-integration.html +531 -531
  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 -231
  103. package/public/sitemap.xml +13 -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 -200
  109. package/public/wab-truth.html +375 -0
  110. package/public/wab-vs-protocols.html +210 -210
  111. package/public/whitepaper.html +449 -449
  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 -288
  116. package/sdk/commander.js +262 -262
  117. package/sdk/governance.js +262 -262
  118. package/sdk/index.d.ts +464 -464
  119. package/sdk/index.js +649 -649
  120. package/sdk/multi-agent.js +318 -318
  121. package/sdk/safe-mode.js +221 -221
  122. package/sdk/safety-shield.js +219 -219
  123. package/sdk/schema-discovery.js +83 -83
  124. package/server/adapters/index.js +520 -520
  125. package/server/config/plans.js +412 -367
  126. package/server/config/secrets.js +102 -102
  127. package/server/control-plane/index.js +301 -301
  128. package/server/data-plane/index.js +354 -354
  129. package/server/index.js +790 -670
  130. package/server/llm/index.js +404 -404
  131. package/server/middleware/adminAuth.js +35 -35
  132. package/server/middleware/api-tier.js +170 -0
  133. package/server/middleware/auth.js +50 -50
  134. package/server/middleware/featureGate.js +88 -88
  135. package/server/middleware/rateLimits.js +100 -100
  136. package/server/middleware/sensitiveAction.js +157 -157
  137. package/server/middleware/wab-trust.js +141 -0
  138. package/server/migrations/001_add_analytics_indexes.sql +7 -7
  139. package/server/migrations/002_premium_features.sql +418 -418
  140. package/server/migrations/003_ads_integer_cents.sql +33 -33
  141. package/server/migrations/004_agent_os.sql +158 -158
  142. package/server/migrations/005_marketplace_metering.sql +126 -126
  143. package/server/migrations/006_growth_suite.sql +138 -0
  144. package/server/migrations/007_governance.sql +106 -106
  145. package/server/migrations/008_plans.sql +144 -144
  146. package/server/migrations/009_shieldqr.sql +30 -30
  147. package/server/migrations/010_extended_trust.sql +33 -33
  148. package/server/migrations/011_outreach.sql +47 -0
  149. package/server/migrations/012_shieldlink.sql +116 -0
  150. package/server/migrations/013_ct_monitor.sql +13 -0
  151. package/server/migrations/014_wab_advanced_features.sql +128 -0
  152. package/server/migrations/015_wab_truth_layer.sql +101 -0
  153. package/server/migrations/016_ring4_external_trust.sql +84 -0
  154. package/server/migrations/017_ring4_extensions.sql +69 -0
  155. package/server/migrations/018_commercial_foundations.sql +167 -0
  156. package/server/migrations/019_unify_tier_constraints.sql +133 -0
  157. package/server/models/adapters/index.js +33 -33
  158. package/server/models/adapters/mysql.js +183 -183
  159. package/server/models/adapters/postgresql.js +172 -172
  160. package/server/models/adapters/sqlite.js +7 -7
  161. package/server/models/db.js +740 -740
  162. package/server/observability/failure-analysis.js +337 -337
  163. package/server/observability/index.js +394 -394
  164. package/server/protocol/capabilities.js +223 -223
  165. package/server/protocol/index.js +243 -243
  166. package/server/protocol/schema.js +584 -584
  167. package/server/registry/certification.js +271 -271
  168. package/server/registry/index.js +326 -326
  169. package/server/routes/activate.js +478 -0
  170. package/server/routes/admin-outreach.js +239 -0
  171. package/server/routes/admin-plans.js +76 -76
  172. package/server/routes/admin-premium.js +674 -673
  173. package/server/routes/admin-shieldlink.js +137 -0
  174. package/server/routes/admin-shieldqr.js +90 -90
  175. package/server/routes/admin-trust-monitor.js +139 -83
  176. package/server/routes/admin.js +550 -549
  177. package/server/routes/adopt.js +61 -0
  178. package/server/routes/ads.js +130 -130
  179. package/server/routes/agent-workspace.js +540 -540
  180. package/server/routes/api-keys.js +127 -0
  181. package/server/routes/api.js +150 -150
  182. package/server/routes/auth.js +71 -71
  183. package/server/routes/billing.js +57 -57
  184. package/server/routes/commander.js +316 -316
  185. package/server/routes/customer-shieldlink.js +133 -0
  186. package/server/routes/demo-showcase.js +332 -332
  187. package/server/routes/demo-store.js +154 -154
  188. package/server/routes/diagnose.js +373 -0
  189. package/server/routes/discovery.js +2348 -2348
  190. package/server/routes/enterprise-mesh.js +170 -0
  191. package/server/routes/gateway.js +173 -173
  192. package/server/routes/governance-saas.js +203 -0
  193. package/server/routes/governance.js +208 -208
  194. package/server/routes/growth.js +1048 -0
  195. package/server/routes/intent.js +328 -0
  196. package/server/routes/license.js +251 -251
  197. package/server/routes/mesh.js +469 -469
  198. package/server/routes/noscript.js +543 -543
  199. package/server/routes/partners.js +201 -0
  200. package/server/routes/plans.js +33 -33
  201. package/server/routes/premium-v2.js +686 -686
  202. package/server/routes/premium.js +724 -724
  203. package/server/routes/providers.js +650 -650
  204. package/server/routes/reputation.js +411 -0
  205. package/server/routes/ring4.js +885 -0
  206. package/server/routes/runtime.js +2148 -2148
  207. package/server/routes/shieldlink.js +70 -0
  208. package/server/routes/shieldqr.js +88 -88
  209. package/server/routes/sovereign.js +465 -465
  210. package/server/routes/truth-layer.js +670 -0
  211. package/server/routes/universal.js +200 -200
  212. package/server/routes/unsubscribe.js +51 -0
  213. package/server/routes/wab-api.js +850 -850
  214. package/server/routes/wab-cache.js +282 -0
  215. package/server/runtime/container-worker.js +111 -111
  216. package/server/runtime/container.js +448 -448
  217. package/server/runtime/distributed-worker.js +362 -362
  218. package/server/runtime/event-bus.js +210 -210
  219. package/server/runtime/index.js +253 -253
  220. package/server/runtime/queue.js +599 -599
  221. package/server/runtime/replay.js +666 -666
  222. package/server/runtime/sandbox.js +266 -266
  223. package/server/runtime/scheduler.js +534 -534
  224. package/server/runtime/session-engine.js +293 -293
  225. package/server/runtime/state-manager.js +188 -188
  226. package/server/secrets/wab-signing-key.pem +3 -0
  227. package/server/secrets/wab-signing-pub.pem +3 -0
  228. package/server/security/cross-site-redactor.js +196 -196
  229. package/server/security/dry-run.js +180 -180
  230. package/server/security/human-gate-rate-limit.js +147 -147
  231. package/server/security/human-gate-transports.js +178 -178
  232. package/server/security/human-gate.js +281 -281
  233. package/server/security/index.js +368 -368
  234. package/server/security/intent-engine.js +245 -245
  235. package/server/security/reward-guard.js +171 -171
  236. package/server/security/rollback-store.js +239 -239
  237. package/server/security/token-scope.js +404 -404
  238. package/server/security/url-policy.js +139 -139
  239. package/server/services/adoption-agent.js +182 -0
  240. package/server/services/agent-chat.js +506 -506
  241. package/server/services/agent-learning.js +601 -601
  242. package/server/services/agent-memory.js +625 -625
  243. package/server/services/agent-mesh.js +555 -555
  244. package/server/services/agent-symphony.js +717 -717
  245. package/server/services/agent-tasks.js +1807 -1807
  246. package/server/services/api-key-engine.js +292 -292
  247. package/server/services/cluster.js +894 -894
  248. package/server/services/commander.js +738 -738
  249. package/server/services/edge-compute.js +440 -440
  250. package/server/services/email.js +233 -233
  251. package/server/services/fairness-engine.js +409 -0
  252. package/server/services/fairness.js +420 -0
  253. package/server/services/governance.js +466 -466
  254. package/server/services/hosted-runtime.js +205 -205
  255. package/server/services/lfd.js +635 -635
  256. package/server/services/local-ai.js +389 -389
  257. package/server/services/marketplace.js +270 -270
  258. package/server/services/metering.js +182 -182
  259. package/server/services/modules/affiliate-intelligence.js +93 -93
  260. package/server/services/modules/agent-firewall.js +90 -90
  261. package/server/services/modules/bounty.js +89 -89
  262. package/server/services/modules/collective-bargaining.js +92 -92
  263. package/server/services/modules/dark-pattern.js +66 -66
  264. package/server/services/modules/gov-intelligence.js +45 -45
  265. package/server/services/modules/neural.js +55 -55
  266. package/server/services/modules/notary.js +49 -49
  267. package/server/services/modules/price-time-machine.js +86 -86
  268. package/server/services/modules/protocol.js +104 -104
  269. package/server/services/negotiation.js +439 -439
  270. package/server/services/outreach-agent.js +312 -0
  271. package/server/services/plans.js +214 -214
  272. package/server/services/plugins.js +771 -771
  273. package/server/services/price-intelligence.js +566 -566
  274. package/server/services/price-shield.js +1137 -1137
  275. package/server/services/provider-clients.js +740 -740
  276. package/server/services/reputation.js +465 -465
  277. package/server/services/search-engine.js +357 -357
  278. package/server/services/security.js +513 -513
  279. package/server/services/self-healing.js +843 -843
  280. package/server/services/shieldlink.js +492 -0
  281. package/server/services/shieldqr.js +322 -322
  282. package/server/services/sovereign-shield.js +542 -542
  283. package/server/services/ssl-ct-monitor.js +224 -0
  284. package/server/services/ssl-inspector.js +42 -42
  285. package/server/services/ssl-monitor.js +167 -167
  286. package/server/services/stripe.js +206 -205
  287. package/server/services/swarm.js +788 -788
  288. package/server/services/universal-scraper.js +662 -662
  289. package/server/services/verification.js +481 -481
  290. package/server/services/vision.js +1163 -1163
  291. package/server/services/wab-crypto.js +178 -178
  292. package/server/utils/cache.js +125 -125
  293. package/server/utils/migrate.js +81 -81
  294. package/server/utils/safe-fetch.js +228 -228
  295. package/server/utils/secureFields.js +50 -50
  296. package/server/ws.js +161 -161
  297. package/templates/artisan-marketplace.yaml +104 -104
  298. package/templates/book-price-scout.yaml +98 -98
  299. package/templates/electronics-price-tracker.yaml +108 -108
  300. package/templates/flight-deal-hunter.yaml +113 -113
  301. package/templates/freelancer-direct.yaml +116 -116
  302. package/templates/grocery-price-compare.yaml +93 -93
  303. package/templates/hotel-direct-booking.yaml +113 -113
  304. package/templates/local-services.yaml +98 -98
  305. package/templates/olive-oil-tunisia.yaml +88 -88
  306. package/templates/organic-farm-fresh.yaml +101 -101
  307. package/templates/restaurant-direct.yaml +97 -97
  308. package/templates/ring4/banking-sovereign.yaml +55 -0
  309. package/templates/ring4/ecommerce-sovereign.yaml +58 -0
  310. package/templates/ring4/healthcare-sovereign.yaml +60 -0
@@ -1,144 +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
- );
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
+ );
@@ -1,30 +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);
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);
@@ -1,33 +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);
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);