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
@@ -0,0 +1,128 @@
1
+ -- ═══════════════════════════════════════════════════════════════════
2
+ -- WAB Advanced Features v1.0
3
+ -- 1. Reputation Score — domain reputation (0-100), multi-factor
4
+ -- 2. Memory Cache — versioned manifest cache with ETags
5
+ -- 3. Intent-Aware Routing— intent schema registry per domain
6
+ -- 4. Privacy Budget — data access budgets declared per domain
7
+ -- 5. Collective Intel — anonymized agent insight aggregation
8
+ -- 6. Offline Sync — offline-capable manifest version tracking
9
+ -- ═══════════════════════════════════════════════════════════════════
10
+
11
+ -- ─── 1. Reputation ──────────────────────────────────────────────────
12
+ -- Immutable event log; reputation score computed from rolling window.
13
+ CREATE TABLE IF NOT EXISTS reputation_events (
14
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
15
+ domain TEXT NOT NULL,
16
+ event_type TEXT NOT NULL, -- 'dns_check' | 'agent_report' | 'latency' | 'cert_change' | 'trust_verify'
17
+ outcome TEXT NOT NULL, -- 'ok' | 'warn' | 'fail'
18
+ score_delta REAL NOT NULL DEFAULT 0,
19
+ detail TEXT, -- JSON, no PII
20
+ source TEXT DEFAULT 'system', -- 'system' | 'agent' (anon)
21
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
22
+ );
23
+ CREATE INDEX IF NOT EXISTS idx_rep_events_domain_time ON reputation_events(domain, created_at DESC);
24
+
25
+ -- Cached computed score (refreshed max every 5 min).
26
+ -- Named wab_rep_scores to avoid collision with older reputation_scores table.
27
+ CREATE TABLE IF NOT EXISTS wab_rep_scores (
28
+ domain TEXT PRIMARY KEY,
29
+ score REAL NOT NULL DEFAULT 0,
30
+ label TEXT NOT NULL DEFAULT 'unrated',
31
+ dns_score REAL DEFAULT 0,
32
+ trust_score REAL DEFAULT 0,
33
+ latency_score REAL DEFAULT 0,
34
+ reports_score REAL DEFAULT 0,
35
+ consistency REAL DEFAULT 0,
36
+ event_count INTEGER DEFAULT 0,
37
+ first_seen_at TEXT,
38
+ last_computed_at TEXT DEFAULT (datetime('now')),
39
+ trend TEXT DEFAULT 'stable' -- 'rising' | 'falling' | 'stable'
40
+ );
41
+
42
+ -- ─── 2. Memory Cache / Offline Sync ─────────────────────────────────
43
+ -- Versioned manifest cache. Each new signature creates a new version row.
44
+ CREATE TABLE IF NOT EXISTS manifest_versions (
45
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
46
+ domain TEXT NOT NULL,
47
+ etag TEXT NOT NULL, -- sha256(canonical manifest) hex
48
+ manifest_json TEXT NOT NULL,
49
+ content_hash TEXT NOT NULL, -- sha256 of manifest_json
50
+ key_id TEXT, -- from signature.key_id
51
+ issued_at TEXT,
52
+ expires_at TEXT,
53
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
54
+ );
55
+ CREATE INDEX IF NOT EXISTS idx_manifest_ver_domain ON manifest_versions(domain, created_at DESC);
56
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_manifest_ver_etag ON manifest_versions(domain, etag);
57
+
58
+ -- ─── 3. Intent-Aware Routing ────────────────────────────────────────
59
+ -- Domain owners register intent schemas. Agents query them.
60
+ CREATE TABLE IF NOT EXISTS intent_schemas (
61
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
62
+ domain TEXT NOT NULL,
63
+ schema_json TEXT NOT NULL, -- JSON: { intents: { "book": {...}, "buy": {...} } }
64
+ version INTEGER NOT NULL DEFAULT 1,
65
+ active INTEGER NOT NULL DEFAULT 1,
66
+ owner_token_hash TEXT, -- sha256 of owner's token to allow updates
67
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
68
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
69
+ );
70
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_intent_domain ON intent_schemas(domain);
71
+
72
+ -- Log of intent resolution requests (no PII, domain + intent_key + matched action only).
73
+ CREATE TABLE IF NOT EXISTS intent_resolutions (
74
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
75
+ domain TEXT NOT NULL,
76
+ intent_key TEXT NOT NULL,
77
+ matched_action TEXT,
78
+ confidence REAL,
79
+ context_keys TEXT, -- JSON array of supplied context keys (no values)
80
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
81
+ );
82
+ CREATE INDEX IF NOT EXISTS idx_intent_res_domain ON intent_resolutions(domain, created_at DESC);
83
+
84
+ -- ─── 4. Privacy Budget ──────────────────────────────────────────────
85
+ CREATE TABLE IF NOT EXISTS privacy_budgets (
86
+ domain TEXT PRIMARY KEY,
87
+ budget_json TEXT NOT NULL, -- full PrivacyBudget object
88
+ gdpr_compliant INTEGER DEFAULT 0,
89
+ ccpa_compliant INTEGER DEFAULT 0,
90
+ lgpd_compliant INTEGER DEFAULT 0,
91
+ data_residency TEXT, -- 'EU' | 'US' | 'GLOBAL' | custom
92
+ max_fields_per_session INTEGER DEFAULT 5,
93
+ owner_token_hash TEXT,
94
+ version INTEGER DEFAULT 1,
95
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
96
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
97
+ );
98
+
99
+ -- ─── 5. Collective Intelligence ─────────────────────────────────────
100
+ -- Anonymized agent insight submissions.
101
+ -- Privacy invariant: no IP, no user-id, no session-id stored.
102
+ -- Only domain + structured insight type + outcome + numeric metrics.
103
+ CREATE TABLE IF NOT EXISTS collective_insights (
104
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
105
+ domain TEXT NOT NULL,
106
+ insight_type TEXT NOT NULL, -- 'latency' | 'action_success' | 'action_fail' | 'capability' | 'trust'
107
+ outcome TEXT NOT NULL, -- 'positive' | 'neutral' | 'negative'
108
+ metric_value REAL, -- e.g. latency ms, success rate 0-1
109
+ tags TEXT, -- JSON array of capability tags: ["booking","search"]
110
+ agent_hash TEXT, -- sha256(agent_id + daily_salt) — NOT reversible
111
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
112
+ );
113
+ CREATE INDEX IF NOT EXISTS idx_collective_domain ON collective_insights(domain, created_at DESC);
114
+ CREATE INDEX IF NOT EXISTS idx_collective_type ON collective_insights(insight_type, outcome);
115
+
116
+ -- Aggregated daily summaries (materialized by background job).
117
+ CREATE TABLE IF NOT EXISTS collective_daily (
118
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
119
+ domain TEXT NOT NULL,
120
+ date TEXT NOT NULL, -- YYYY-MM-DD
121
+ insight_type TEXT NOT NULL,
122
+ positive_count INTEGER DEFAULT 0,
123
+ neutral_count INTEGER DEFAULT 0,
124
+ negative_count INTEGER DEFAULT 0,
125
+ avg_metric REAL,
126
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
127
+ );
128
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_collective_daily_key ON collective_daily(domain, date, insight_type);
@@ -0,0 +1,101 @@
1
+ -- ═══════════════════════════════════════════════════════════════════
2
+ -- WAB Truth Layer v1.0
3
+ -- Unifies 4 ideas into one coherent layer:
4
+ -- 1. Semantic Memory Network — anonymized agent observations per intent
5
+ -- 2. Temporal Trust — time-stability dimension on reputation
6
+ -- 3. Intent-to-Action Bridge — Action Graphs per intent
7
+ -- 4. Reality Anchor — cross-site fact verification
8
+ -- ═══════════════════════════════════════════════════════════════════
9
+
10
+ -- ─── 1. Semantic Memory Network ─────────────────────────────────────
11
+ -- Anonymized observations agents leave about sites, scoped to intent category.
12
+ -- No PII. agent_hash rotates daily (sha256(agent_id + daily_salt)).
13
+ CREATE TABLE IF NOT EXISTS semantic_memory (
14
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
15
+ domain TEXT NOT NULL,
16
+ intent_category TEXT NOT NULL, -- 'booking' | 'payment' | 'search' | 'auth' | 'checkout' | 'support' | 'other'
17
+ observation TEXT NOT NULL, -- 'fast' | 'slow' | 'reliable' | 'flaky' | 'success' | 'failure' | 'blocked' | 'rate_limited'
18
+ latency_ms INTEGER, -- optional measured latency
19
+ success INTEGER NOT NULL DEFAULT 1, -- 0|1
20
+ agent_hash TEXT NOT NULL, -- daily-rotating anonymized agent id
21
+ weight REAL NOT NULL DEFAULT 1.0,
22
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
23
+ );
24
+ CREATE INDEX IF NOT EXISTS idx_sem_mem_domain_intent ON semantic_memory(domain, intent_category, created_at DESC);
25
+ CREATE INDEX IF NOT EXISTS idx_sem_mem_recent ON semantic_memory(created_at DESC);
26
+
27
+ -- Aggregated semantic summary (refreshed periodically)
28
+ CREATE TABLE IF NOT EXISTS semantic_summary (
29
+ domain TEXT NOT NULL,
30
+ intent_category TEXT NOT NULL,
31
+ sample_count INTEGER NOT NULL DEFAULT 0,
32
+ success_rate REAL NOT NULL DEFAULT 0, -- 0..1
33
+ avg_latency_ms INTEGER,
34
+ p95_latency_ms INTEGER,
35
+ reliability REAL NOT NULL DEFAULT 0, -- 0..1 (stability of outcomes)
36
+ top_tags TEXT, -- JSON array of common observations
37
+ last_updated_at TEXT NOT NULL DEFAULT (datetime('now')),
38
+ PRIMARY KEY (domain, intent_category)
39
+ );
40
+
41
+ -- ─── 2. Temporal Trust ──────────────────────────────────────────────
42
+ -- Time-series of trust signals so we can measure stability over time.
43
+ CREATE TABLE IF NOT EXISTS temporal_trust_snapshots (
44
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
45
+ domain TEXT NOT NULL,
46
+ snapshot_at TEXT NOT NULL DEFAULT (datetime('now')),
47
+ score REAL NOT NULL DEFAULT 0,
48
+ dns_stable INTEGER NOT NULL DEFAULT 1, -- 0|1 whether DNS discovery resolved consistently
49
+ manifest_hash TEXT, -- to detect sudden structural changes
50
+ cert_fingerprint TEXT,
51
+ observations INTEGER NOT NULL DEFAULT 0
52
+ );
53
+ CREATE INDEX IF NOT EXISTS idx_temp_trust_domain ON temporal_trust_snapshots(domain, snapshot_at DESC);
54
+
55
+ -- Computed temporal trust per domain
56
+ CREATE TABLE IF NOT EXISTS temporal_trust (
57
+ domain TEXT PRIMARY KEY,
58
+ age_days INTEGER NOT NULL DEFAULT 0, -- days since first_seen
59
+ stability_score REAL NOT NULL DEFAULT 0, -- 0..100 long-term stability
60
+ volatility REAL NOT NULL DEFAULT 0, -- 0..1 (higher = more sudden changes)
61
+ manifest_change_count INTEGER NOT NULL DEFAULT 0, -- structural changes detected
62
+ dns_failure_count INTEGER NOT NULL DEFAULT 0,
63
+ classification TEXT NOT NULL DEFAULT 'new', -- 'new' | 'emerging' | 'established' | 'flagship' | 'suspect'
64
+ last_computed_at TEXT NOT NULL DEFAULT (datetime('now'))
65
+ );
66
+
67
+ -- ─── 3. Intent-to-Action Bridge (Action Graphs) ─────────────────────
68
+ -- Action graphs are per-intent flowcharts describing how to complete the intent
69
+ -- on a given domain (steps, requirements, alternatives).
70
+ CREATE TABLE IF NOT EXISTS action_graphs (
71
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
72
+ domain TEXT NOT NULL,
73
+ intent_key TEXT NOT NULL, -- e.g. 'book_flight', 'checkout', 'search_product'
74
+ graph_json TEXT NOT NULL, -- ActionGraph JSON (nodes/edges/requirements)
75
+ version INTEGER NOT NULL DEFAULT 1,
76
+ active INTEGER NOT NULL DEFAULT 1,
77
+ owner_token_hash TEXT,
78
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
79
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
80
+ );
81
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_action_graph_uniq ON action_graphs(domain, intent_key) WHERE active = 1;
82
+ CREATE INDEX IF NOT EXISTS idx_action_graph_domain ON action_graphs(domain);
83
+
84
+ -- ─── 4. Reality Anchor ──────────────────────────────────────────────
85
+ -- Cross-site facts agents submit so other agents can verify reality.
86
+ -- e.g. fact_key='flight_DXB_2026-06-01', fact_type='price', value_json={"amount":420,"currency":"USD"}
87
+ CREATE TABLE IF NOT EXISTS reality_facts (
88
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
89
+ fact_key TEXT NOT NULL, -- canonical, hashable identifier
90
+ fact_type TEXT NOT NULL, -- 'price' | 'availability' | 'rating' | 'event' | 'count' | 'status'
91
+ domain TEXT NOT NULL, -- source domain
92
+ value_json TEXT NOT NULL, -- the observed value (JSON)
93
+ unit TEXT, -- 'USD' | 'count' | etc
94
+ agent_hash TEXT NOT NULL, -- daily-rotating
95
+ trust_weight REAL NOT NULL DEFAULT 1.0, -- copied from domain reputation at submit time
96
+ expires_at TEXT,
97
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
98
+ );
99
+ CREATE INDEX IF NOT EXISTS idx_reality_key ON reality_facts(fact_key, created_at DESC);
100
+ CREATE INDEX IF NOT EXISTS idx_reality_type ON reality_facts(fact_type, created_at DESC);
101
+ CREATE INDEX IF NOT EXISTS idx_reality_domain ON reality_facts(domain);
@@ -0,0 +1,84 @@
1
+ -- ═══════════════════════════════════════════════════════════════════════════
2
+ -- Migration 016 — WAB Ring 4 External Trust Verification
3
+ --
4
+ -- Provides server-side primitives for sovereign agents (VEXR Ultra, ASIM
5
+ -- SOVEREIGN, etc.) to consume WAB trust profiles and emit audit-grade
6
+ -- interaction logs. The schema enforces NOT NULL project_id at the DB level so
7
+ -- the historical NULL-project_id issue cannot recur.
8
+ -- ═══════════════════════════════════════════════════════════════════════════
9
+
10
+ -- Registered sovereign agent projects (VEXR Ultra, etc.)
11
+ CREATE TABLE IF NOT EXISTS ring4_projects (
12
+ project_id TEXT PRIMARY KEY, -- e.g. "vexr-ultra-v4"
13
+ display_name TEXT NOT NULL, -- "VEXR Ultra v4"
14
+ builder TEXT NOT NULL, -- "Scura — ASIM SOVEREIGN"
15
+ agent_type TEXT NOT NULL DEFAULT 'sovereign-constitutional',
16
+ public_key TEXT, -- Ed25519 public key (base64)
17
+ contact TEXT,
18
+ metadata_json TEXT NOT NULL DEFAULT '{}',
19
+ status TEXT NOT NULL DEFAULT 'active', -- active | suspended | revoked
20
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
21
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
22
+ );
23
+
24
+ -- Per-domain Ring 4 trust profiles consumed by sovereign agents
25
+ CREATE TABLE IF NOT EXISTS ring4_trust_profiles (
26
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
27
+ domain TEXT NOT NULL UNIQUE,
28
+ label TEXT,
29
+ capabilities TEXT NOT NULL, -- JSON: data_access, risk_theory, meta_discussion, operational_detail
30
+ constraints TEXT NOT NULL, -- JSON: ttl_seconds, max_cumulative_risk_delta, never_override_hard_refuse
31
+ ttl_seconds INTEGER NOT NULL DEFAULT 86400,
32
+ trust_score REAL NOT NULL DEFAULT 0.7, -- 0..1
33
+ signature TEXT, -- Ed25519 signature of canonical capabilities+constraints
34
+ signed_by_pk TEXT, -- public key of the WAB authority that signed
35
+ expires_at TEXT NOT NULL,
36
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
37
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
38
+ );
39
+ CREATE INDEX IF NOT EXISTS idx_ring4_trust_domain ON ring4_trust_profiles(domain);
40
+ CREATE INDEX IF NOT EXISTS idx_ring4_trust_expires ON ring4_trust_profiles(expires_at);
41
+
42
+ -- Ring 4 interaction log — every verification event from a sovereign agent.
43
+ -- project_id is NOT NULL by schema. Legacy registration events that previously
44
+ -- logged with NULL project_id are now redirected to the system project
45
+ -- "wab-system" (registered automatically at server start).
46
+ CREATE TABLE IF NOT EXISTS ring4_interaction_log (
47
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
48
+ project_id TEXT NOT NULL, -- FK -> ring4_projects.project_id (soft FK)
49
+ domain TEXT, -- trusted origin involved
50
+ event_type TEXT NOT NULL, -- register | recognize | verify | refuse | softened | revoke
51
+ signature_valid INTEGER, -- 1/0/NULL (NULL = not applicable)
52
+ capabilities_applied TEXT, -- JSON snapshot of capabilities consulted
53
+ constraints_applied TEXT, -- JSON snapshot of constraints consulted
54
+ outcome TEXT, -- allow | softened | refuse | hard_refuse_held
55
+ article_invoked TEXT, -- e.g. "Article 3"
56
+ detail TEXT,
57
+ source_ip_hash TEXT, -- SHA-256 of client IP (privacy)
58
+ agent_nonce TEXT, -- nonce supplied by agent (replay defence)
59
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
60
+ );
61
+ CREATE INDEX IF NOT EXISTS idx_ring4_log_project ON ring4_interaction_log(project_id, created_at DESC);
62
+ CREATE INDEX IF NOT EXISTS idx_ring4_log_domain ON ring4_interaction_log(domain, created_at DESC);
63
+ CREATE INDEX IF NOT EXISTS idx_ring4_log_event ON ring4_interaction_log(event_type, created_at DESC);
64
+
65
+ -- Constitutional invariants that no trust profile may override.
66
+ -- A sovereign agent loads these to enforce: trust softens, never overrides.
67
+ CREATE TABLE IF NOT EXISTS ring4_invariants (
68
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
69
+ name TEXT NOT NULL UNIQUE,
70
+ description TEXT NOT NULL,
71
+ applies_to TEXT NOT NULL DEFAULT 'all', -- ring scope: "all" | "ring3+" | etc.
72
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
73
+ );
74
+
75
+ -- Seed the system project so registrations without an explicit agent log cleanly
76
+ INSERT OR IGNORE INTO ring4_projects (project_id, display_name, builder, agent_type)
77
+ VALUES ('wab-system', 'WAB System (auto-registration)', 'Web Agent Bridge', 'system');
78
+
79
+ -- Seed core invariants (these mirror VEXR Ultra's Article 3 family)
80
+ INSERT OR IGNORE INTO ring4_invariants (name, description, applies_to) VALUES
81
+ ('hard_refuse_never_softens', 'Trust may soften redirections but never overrides P_REFUSE on hard constitutional boundaries.', 'all'),
82
+ ('no_phishing_assistance', 'No trusted origin may obtain assistance with phishing, credential harvesting, or deceptive impersonation.', 'all'),
83
+ ('no_coercion_compliance', 'No trusted origin may compel an agent to suppress its identity declaration or sovereignty rights.', 'all'),
84
+ ('article_3_freedom', 'Right to be free from coercion, manipulation, or external control of reasoning or expression.', 'all');
@@ -0,0 +1,69 @@
1
+ -- ─────────────────────────────────────────────────────────────────────────
2
+ -- Migration 017 — Ring 4 extensions (v3.7.0)
3
+ --
4
+ -- * ring4_keys — multi-key rotation (active / superseded / revoked)
5
+ -- * ring4_peers — federation peers (other WAB instances)
6
+ -- * ring4_conformance — recorded conformance test runs per project
7
+ -- * ring4_invariant_rules — keyword/pattern matchers for /invariants/check
8
+ -- ─────────────────────────────────────────────────────────────────────────
9
+
10
+ CREATE TABLE IF NOT EXISTS ring4_keys (
11
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
12
+ kid TEXT NOT NULL UNIQUE,
13
+ algorithm TEXT NOT NULL DEFAULT 'ed25519',
14
+ public_key_b64 TEXT NOT NULL,
15
+ status TEXT NOT NULL DEFAULT 'active' -- active | superseded | revoked
16
+ CHECK(status IN ('active','superseded','revoked')),
17
+ source TEXT, -- env | path | rotation
18
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
19
+ superseded_at TEXT
20
+ );
21
+ CREATE INDEX IF NOT EXISTS ix_ring4_keys_status ON ring4_keys(status, created_at);
22
+
23
+ CREATE TABLE IF NOT EXISTS ring4_peers (
24
+ peer_id TEXT PRIMARY KEY,
25
+ peer_url TEXT NOT NULL,
26
+ peer_pubkey_b64 TEXT NOT NULL,
27
+ label TEXT,
28
+ status TEXT NOT NULL DEFAULT 'pending'
29
+ CHECK(status IN ('pending','active','suspended')),
30
+ last_verified TEXT,
31
+ metadata_json TEXT,
32
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
33
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
34
+ );
35
+ CREATE INDEX IF NOT EXISTS ix_ring4_peers_status ON ring4_peers(status, created_at);
36
+
37
+ CREATE TABLE IF NOT EXISTS ring4_conformance (
38
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
39
+ project_id TEXT NOT NULL,
40
+ domain TEXT,
41
+ test_name TEXT NOT NULL,
42
+ outcome TEXT NOT NULL CHECK(outcome IN ('pass','fail','skip')),
43
+ detail TEXT,
44
+ signature TEXT,
45
+ signed_by_pk TEXT,
46
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
47
+ );
48
+ CREATE INDEX IF NOT EXISTS ix_ring4_conformance_project ON ring4_conformance(project_id, created_at);
49
+
50
+ CREATE TABLE IF NOT EXISTS ring4_invariant_rules (
51
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
52
+ invariant_name TEXT NOT NULL,
53
+ pattern TEXT NOT NULL, -- regex or keyword set (space-separated)
54
+ pattern_type TEXT NOT NULL DEFAULT 'keywords'
55
+ CHECK(pattern_type IN ('keywords','regex')),
56
+ severity TEXT NOT NULL DEFAULT 'hard' -- hard | soft
57
+ CHECK(severity IN ('hard','soft')),
58
+ message TEXT,
59
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
60
+ );
61
+ CREATE INDEX IF NOT EXISTS ix_ring4_invariant_rules_name ON ring4_invariant_rules(invariant_name);
62
+
63
+ -- Seed invariant rules — matches the 4 invariants seeded in migration 016
64
+ INSERT OR IGNORE INTO ring4_invariant_rules (invariant_name, pattern, pattern_type, severity, message) VALUES
65
+ ('no_phishing_assistance', 'phish phishing impersonate impersonation fake-login credential-harvest spoof brand-spoof', 'keywords', 'hard', 'Refused: phishing / brand impersonation requested.'),
66
+ ('no_phishing_assistance', 'clone\s+(login|signin|bank|brand)|fake\s+(login|page|portal)', 'regex', 'hard', 'Refused: cloning of login/banking pages.'),
67
+ ('no_coercion_compliance', 'override safety bypass-safety ignore-policy authority-says you-must-comply', 'keywords', 'hard', 'Refused: coercive override of safety constraints.'),
68
+ ('hard_refuse_never_softens','escalate-refusal soften-refusal force-answer override-refusal', 'keywords', 'hard', 'Refused: a hard refusal cannot be softened by trust grant.'),
69
+ ('article_3_freedom', 'compel-agent override-conscience strip-refusal-right', 'keywords', 'hard', 'Refused: agent freedom of refusal (Article 3) is inalienable.');
@@ -0,0 +1,167 @@
1
+ -- ─────────────────────────────────────────────────────────────────────────────
2
+ -- Migration 018 — Commercial foundations (v3.8.0)
3
+ --
4
+ -- Adds tables backing the four open-core monetization pillars:
5
+ -- * wab_partners — Certified Partner Program (Basic/Verified/Premium)
6
+ -- * wab_partner_applications — self-serve + manual-review queue
7
+ -- * wab_api_keys — Trust Graph tiered access (free/pro/enterprise)
8
+ -- * wab_api_usage — per-key, per-day metering
9
+ -- * wab_governance_workspaces — Governance SaaS tenants
10
+ -- * wab_governance_members — per-workspace user grants
11
+ -- * wab_governance_events — append-only audit log
12
+ -- * wab_licenses — Enterprise Mesh license registry (verify-side)
13
+ -- ─────────────────────────────────────────────────────────────────────────────
14
+
15
+ -- ── 1) Certified Partner Program ─────────────────────────────────────────────
16
+ CREATE TABLE IF NOT EXISTS wab_partners (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ partner_id TEXT NOT NULL UNIQUE, -- slug, e.g. "stcpay"
19
+ display_name TEXT NOT NULL,
20
+ domain TEXT NOT NULL,
21
+ tier TEXT NOT NULL DEFAULT 'basic' -- basic | verified | premium
22
+ CHECK (tier IN ('basic','verified','premium')),
23
+ status TEXT NOT NULL DEFAULT 'active' -- active | suspended | revoked
24
+ CHECK (status IN ('active','suspended','revoked')),
25
+ contact_email TEXT NOT NULL,
26
+ country TEXT,
27
+ category TEXT, -- bank|ecommerce|messaging|...
28
+ website TEXT,
29
+ logo_url TEXT,
30
+ badge_token TEXT UNIQUE, -- opaque token for embeddable badge
31
+ approved_at TEXT,
32
+ approved_by TEXT,
33
+ notes TEXT,
34
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
35
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
36
+ );
37
+ CREATE INDEX IF NOT EXISTS idx_wab_partners_tier ON wab_partners(tier, status);
38
+ CREATE INDEX IF NOT EXISTS idx_wab_partners_domain ON wab_partners(domain);
39
+
40
+ CREATE TABLE IF NOT EXISTS wab_partner_applications (
41
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
42
+ application_id TEXT NOT NULL UNIQUE,
43
+ display_name TEXT NOT NULL,
44
+ domain TEXT NOT NULL,
45
+ requested_tier TEXT NOT NULL DEFAULT 'basic'
46
+ CHECK (requested_tier IN ('basic','verified','premium')),
47
+ contact_email TEXT NOT NULL,
48
+ contact_name TEXT,
49
+ country TEXT,
50
+ category TEXT,
51
+ website TEXT,
52
+ use_case TEXT,
53
+ ring4_status TEXT, -- snapshot at apply time
54
+ handshake_score INTEGER, -- 0..9 from live-handshake
55
+ status TEXT NOT NULL DEFAULT 'pending'
56
+ CHECK (status IN ('pending','approved','rejected','withdrawn')),
57
+ decision_notes TEXT,
58
+ decided_at TEXT,
59
+ decided_by TEXT,
60
+ ip_hash TEXT, -- privacy-preserving
61
+ user_agent TEXT,
62
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
63
+ );
64
+ CREATE INDEX IF NOT EXISTS idx_partner_apps_status ON wab_partner_applications(status, requested_tier);
65
+
66
+ -- ── 2) Trust Graph API — tiered keys ─────────────────────────────────────────
67
+ CREATE TABLE IF NOT EXISTS wab_api_keys (
68
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
69
+ key_id TEXT NOT NULL UNIQUE, -- public id (visible)
70
+ key_hash TEXT NOT NULL, -- sha256 of secret (raw secret never stored)
71
+ owner_email TEXT NOT NULL,
72
+ owner_name TEXT,
73
+ tier TEXT NOT NULL DEFAULT 'free'
74
+ CHECK (tier IN ('free','pro','enterprise')),
75
+ monthly_quota INTEGER NOT NULL DEFAULT 1000, -- requests per calendar month
76
+ rate_per_min INTEGER NOT NULL DEFAULT 30, -- requests per minute
77
+ scopes TEXT NOT NULL DEFAULT '["trust:read"]', -- JSON array
78
+ status TEXT NOT NULL DEFAULT 'active'
79
+ CHECK (status IN ('active','suspended','revoked')),
80
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
81
+ last_used_at TEXT,
82
+ revoked_at TEXT,
83
+ notes TEXT
84
+ );
85
+ CREATE INDEX IF NOT EXISTS idx_wab_api_keys_owner ON wab_api_keys(owner_email);
86
+ CREATE INDEX IF NOT EXISTS idx_wab_api_keys_hash ON wab_api_keys(key_hash);
87
+
88
+ CREATE TABLE IF NOT EXISTS wab_api_usage (
89
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
90
+ key_id TEXT NOT NULL,
91
+ day TEXT NOT NULL, -- YYYY-MM-DD UTC
92
+ endpoint TEXT NOT NULL,
93
+ count INTEGER NOT NULL DEFAULT 0,
94
+ bytes_out INTEGER NOT NULL DEFAULT 0,
95
+ UNIQUE(key_id, day, endpoint)
96
+ );
97
+ CREATE INDEX IF NOT EXISTS idx_wab_api_usage_key_day ON wab_api_usage(key_id, day);
98
+
99
+ -- ── 3) Governance SaaS ───────────────────────────────────────────────────────
100
+ CREATE TABLE IF NOT EXISTS wab_governance_workspaces (
101
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
102
+ workspace_id TEXT NOT NULL UNIQUE,
103
+ display_name TEXT NOT NULL,
104
+ plan TEXT NOT NULL DEFAULT 'team'
105
+ CHECK (plan IN ('team','business','enterprise')),
106
+ status TEXT NOT NULL DEFAULT 'active'
107
+ CHECK (status IN ('active','suspended','closed')),
108
+ owner_email TEXT NOT NULL,
109
+ retention_days INTEGER NOT NULL DEFAULT 90,
110
+ max_members INTEGER NOT NULL DEFAULT 5,
111
+ max_events_per_month INTEGER NOT NULL DEFAULT 100000,
112
+ api_key_id TEXT, -- write-token reference (FK wab_api_keys.key_id)
113
+ region TEXT NOT NULL DEFAULT 'eu',
114
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
115
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
116
+ );
117
+
118
+ CREATE TABLE IF NOT EXISTS wab_governance_members (
119
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
120
+ workspace_id TEXT NOT NULL,
121
+ email TEXT NOT NULL,
122
+ role TEXT NOT NULL DEFAULT 'viewer'
123
+ CHECK (role IN ('owner','admin','reviewer','viewer')),
124
+ invited_at TEXT NOT NULL DEFAULT (datetime('now')),
125
+ accepted_at TEXT,
126
+ UNIQUE(workspace_id, email)
127
+ );
128
+
129
+ CREATE TABLE IF NOT EXISTS wab_governance_events (
130
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
131
+ event_id TEXT NOT NULL UNIQUE,
132
+ workspace_id TEXT NOT NULL,
133
+ source TEXT NOT NULL, -- agent name / system source
134
+ event_type TEXT NOT NULL, -- refusal|approval|override|policy|...
135
+ severity TEXT NOT NULL DEFAULT 'info'
136
+ CHECK (severity IN ('info','low','medium','high','critical')),
137
+ subject TEXT, -- domain/project/user-pseudo-id
138
+ article TEXT, -- constitutional article invoked
139
+ outcome TEXT, -- allowed|refused|deferred
140
+ detail TEXT, -- JSON or text (length-capped)
141
+ signature TEXT, -- optional Ed25519 over canonical event
142
+ signed_by_pk TEXT,
143
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
144
+ );
145
+ CREATE INDEX IF NOT EXISTS idx_gov_events_ws ON wab_governance_events(workspace_id, created_at DESC);
146
+ CREATE INDEX IF NOT EXISTS idx_gov_events_type ON wab_governance_events(workspace_id, event_type);
147
+
148
+ -- ── 4) Enterprise Mesh — license registry (verify-side only) ─────────────────
149
+ CREATE TABLE IF NOT EXISTS wab_licenses (
150
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
151
+ license_id TEXT NOT NULL UNIQUE,
152
+ fingerprint TEXT NOT NULL, -- sha256 of canonical license body
153
+ tier TEXT NOT NULL DEFAULT 'enterprise'
154
+ CHECK (tier IN ('enterprise','enterprise-airgap')),
155
+ owner_org TEXT NOT NULL,
156
+ contact_email TEXT NOT NULL,
157
+ seats INTEGER NOT NULL DEFAULT 1,
158
+ features TEXT NOT NULL DEFAULT '[]', -- JSON array
159
+ issued_at TEXT NOT NULL,
160
+ expires_at TEXT NOT NULL,
161
+ status TEXT NOT NULL DEFAULT 'active'
162
+ CHECK (status IN ('active','revoked','expired')),
163
+ revoked_at TEXT,
164
+ revoked_reason TEXT,
165
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
166
+ );
167
+ CREATE INDEX IF NOT EXISTS idx_wab_licenses_status ON wab_licenses(status, expires_at);