web-agent-bridge 3.4.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/LICENSE +84 -84
  2. package/README.ar.md +1565 -1304
  3. package/README.md +171 -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/atp.html +171 -0
  41. package/public/azure-dns-integration.html +289 -289
  42. package/public/browser.html +486 -486
  43. package/public/cloudflare-integration.html +380 -380
  44. package/public/commander-dashboard.html +243 -243
  45. package/public/cookies.html +210 -210
  46. package/public/cpanel-integration.html +398 -398
  47. package/public/css/agent-workspace.css +1713 -1713
  48. package/public/css/premium.css +317 -317
  49. package/public/css/styles.css +1401 -1263
  50. package/public/dashboard-shieldlink.html +295 -0
  51. package/public/dashboard.html +711 -707
  52. package/public/dns.html +436 -436
  53. package/public/docs.html +588 -588
  54. package/public/enterprise-mesh.ar.html +80 -0
  55. package/public/enterprise-mesh.html +81 -0
  56. package/public/feed.xml +89 -89
  57. package/public/gcp-dns-integration.html +318 -318
  58. package/public/governance.ar.html +70 -0
  59. package/public/governance.html +69 -0
  60. package/public/growth.html +465 -465
  61. package/public/index.html +1372 -1266
  62. package/public/integrations.html +556 -556
  63. package/public/js/activate.js +449 -145
  64. package/public/js/agent-workspace.js +1740 -1740
  65. package/public/js/auth-nav.js +117 -65
  66. package/public/js/auth-redirect.js +12 -12
  67. package/public/js/cookie-consent.js +56 -56
  68. package/public/js/dns.js +438 -438
  69. package/public/js/wab-demo-page.js +721 -721
  70. package/public/js/ws-client.js +74 -74
  71. package/public/l-preview.html +242 -0
  72. package/public/llms-full.txt +360 -360
  73. package/public/llms.txt +125 -125
  74. package/public/login.html +85 -85
  75. package/public/mesh-dashboard.html +328 -328
  76. package/public/milestones.html +346 -0
  77. package/public/one-click.html +779 -0
  78. package/public/openapi.json +669 -669
  79. package/public/partners.ar.html +145 -0
  80. package/public/partners.html +143 -0
  81. package/public/phone-shield.html +281 -281
  82. package/public/plesk-integration.html +375 -375
  83. package/public/premium-dashboard.html +2489 -2489
  84. package/public/premium.html +793 -793
  85. package/public/privacy.html +297 -297
  86. package/public/provider-onboarding.html +172 -172
  87. package/public/provider-sandbox.html +134 -134
  88. package/public/providers.html +359 -359
  89. package/public/refusals.html +172 -0
  90. package/public/register.html +105 -105
  91. package/public/registrar-integrations.html +141 -141
  92. package/public/ring4.html +292 -0
  93. package/public/robots.txt +99 -99
  94. package/public/route53-integration.html +531 -531
  95. package/public/score.html +263 -0
  96. package/public/script/wab-consent.d.ts +36 -36
  97. package/public/script/wab-consent.js +104 -104
  98. package/public/script/wab-schema.js +131 -131
  99. package/public/script/wab.d.ts +108 -108
  100. package/public/script/wab.min.js +580 -580
  101. package/public/security.txt +8 -8
  102. package/public/shieldlink.html +244 -0
  103. package/public/shieldqr.html +231 -231
  104. package/public/sitemap.xml +13 -1
  105. package/public/terms.html +256 -256
  106. package/public/trust-graph-api.ar.html +92 -0
  107. package/public/trust-graph-api.html +91 -0
  108. package/public/wab-features.html +560 -0
  109. package/public/wab-trust.html +200 -200
  110. package/public/wab-truth.html +375 -0
  111. package/public/wab-vs-protocols.html +210 -210
  112. package/public/whitepaper.html +449 -449
  113. package/script/ai-agent-bridge.js +1754 -1754
  114. package/sdk/README.md +99 -99
  115. package/sdk/agent-mesh.js +449 -449
  116. package/sdk/atp.js +103 -0
  117. package/sdk/auto-discovery.js +301 -288
  118. package/sdk/commander.js +262 -262
  119. package/sdk/governance.js +262 -262
  120. package/sdk/index.d.ts +464 -464
  121. package/sdk/index.js +653 -649
  122. package/sdk/multi-agent.js +318 -318
  123. package/sdk/safe-mode.js +221 -221
  124. package/sdk/safety-shield.js +219 -219
  125. package/sdk/schema-discovery.js +83 -83
  126. package/server/adapters/index.js +520 -520
  127. package/server/config/plans.js +412 -367
  128. package/server/config/secrets.js +102 -102
  129. package/server/control-plane/index.js +301 -301
  130. package/server/data-plane/index.js +354 -354
  131. package/server/index.js +793 -670
  132. package/server/llm/index.js +404 -404
  133. package/server/middleware/adminAuth.js +35 -35
  134. package/server/middleware/api-tier.js +170 -0
  135. package/server/middleware/auth.js +50 -50
  136. package/server/middleware/featureGate.js +88 -88
  137. package/server/middleware/rateLimits.js +100 -100
  138. package/server/middleware/sensitiveAction.js +157 -157
  139. package/server/middleware/wab-trust.js +141 -0
  140. package/server/migrations/001_add_analytics_indexes.sql +7 -7
  141. package/server/migrations/002_premium_features.sql +418 -418
  142. package/server/migrations/003_ads_integer_cents.sql +33 -33
  143. package/server/migrations/004_agent_os.sql +158 -158
  144. package/server/migrations/005_marketplace_metering.sql +126 -126
  145. package/server/migrations/006_growth_suite.sql +138 -0
  146. package/server/migrations/007_governance.sql +106 -106
  147. package/server/migrations/008_plans.sql +144 -144
  148. package/server/migrations/009_shieldqr.sql +30 -30
  149. package/server/migrations/010_extended_trust.sql +33 -33
  150. package/server/migrations/011_outreach.sql +47 -0
  151. package/server/migrations/012_shieldlink.sql +116 -0
  152. package/server/migrations/013_ct_monitor.sql +13 -0
  153. package/server/migrations/014_wab_advanced_features.sql +128 -0
  154. package/server/migrations/015_wab_truth_layer.sql +101 -0
  155. package/server/migrations/016_ring4_external_trust.sql +84 -0
  156. package/server/migrations/017_ring4_extensions.sql +69 -0
  157. package/server/migrations/018_commercial_foundations.sql +167 -0
  158. package/server/migrations/019_unify_tier_constraints.sql +133 -0
  159. package/server/migrations/020_agent_transaction_primitive.sql +119 -0
  160. package/server/models/adapters/index.js +33 -33
  161. package/server/models/adapters/mysql.js +183 -183
  162. package/server/models/adapters/postgresql.js +172 -172
  163. package/server/models/adapters/sqlite.js +7 -7
  164. package/server/models/db.js +740 -740
  165. package/server/observability/failure-analysis.js +337 -337
  166. package/server/observability/index.js +394 -394
  167. package/server/protocol/capabilities.js +223 -223
  168. package/server/protocol/index.js +243 -243
  169. package/server/protocol/schema.js +584 -584
  170. package/server/registry/certification.js +271 -271
  171. package/server/registry/index.js +326 -326
  172. package/server/routes/activate.js +478 -0
  173. package/server/routes/admin-outreach.js +239 -0
  174. package/server/routes/admin-plans.js +76 -76
  175. package/server/routes/admin-premium.js +674 -673
  176. package/server/routes/admin-shieldlink.js +137 -0
  177. package/server/routes/admin-shieldqr.js +90 -90
  178. package/server/routes/admin-trust-monitor.js +139 -83
  179. package/server/routes/admin.js +550 -549
  180. package/server/routes/adopt.js +61 -0
  181. package/server/routes/ads.js +130 -130
  182. package/server/routes/agent-workspace.js +540 -540
  183. package/server/routes/api-keys.js +127 -0
  184. package/server/routes/api.js +150 -150
  185. package/server/routes/auth.js +71 -71
  186. package/server/routes/billing.js +57 -57
  187. package/server/routes/commander.js +316 -316
  188. package/server/routes/customer-shieldlink.js +133 -0
  189. package/server/routes/demo-showcase.js +332 -332
  190. package/server/routes/demo-store.js +154 -154
  191. package/server/routes/diagnose.js +373 -0
  192. package/server/routes/discovery.js +2348 -2348
  193. package/server/routes/enterprise-mesh.js +170 -0
  194. package/server/routes/gateway.js +173 -173
  195. package/server/routes/governance-saas.js +203 -0
  196. package/server/routes/governance.js +208 -208
  197. package/server/routes/growth.js +1048 -0
  198. package/server/routes/intent.js +328 -0
  199. package/server/routes/license.js +251 -251
  200. package/server/routes/mesh.js +469 -469
  201. package/server/routes/noscript.js +543 -543
  202. package/server/routes/partners.js +201 -0
  203. package/server/routes/plans.js +33 -33
  204. package/server/routes/premium-v2.js +686 -686
  205. package/server/routes/premium.js +724 -724
  206. package/server/routes/providers.js +650 -650
  207. package/server/routes/reputation.js +411 -0
  208. package/server/routes/ring4.js +885 -0
  209. package/server/routes/runtime.js +2148 -2148
  210. package/server/routes/shieldlink.js +70 -0
  211. package/server/routes/shieldqr.js +88 -88
  212. package/server/routes/sovereign.js +465 -465
  213. package/server/routes/transactions.js +233 -0
  214. package/server/routes/truth-layer.js +670 -0
  215. package/server/routes/universal.js +200 -200
  216. package/server/routes/unsubscribe.js +51 -0
  217. package/server/routes/wab-api.js +850 -850
  218. package/server/routes/wab-cache.js +282 -0
  219. package/server/runtime/container-worker.js +111 -111
  220. package/server/runtime/container.js +448 -448
  221. package/server/runtime/distributed-worker.js +362 -362
  222. package/server/runtime/event-bus.js +210 -210
  223. package/server/runtime/index.js +253 -253
  224. package/server/runtime/queue.js +599 -599
  225. package/server/runtime/replay.js +666 -666
  226. package/server/runtime/sandbox.js +266 -266
  227. package/server/runtime/scheduler.js +534 -534
  228. package/server/runtime/session-engine.js +293 -293
  229. package/server/runtime/state-manager.js +188 -188
  230. package/server/secrets/wab-signing-key.pem +3 -0
  231. package/server/secrets/wab-signing-pub.pem +3 -0
  232. package/server/security/cross-site-redactor.js +196 -196
  233. package/server/security/dry-run.js +180 -180
  234. package/server/security/human-gate-rate-limit.js +147 -147
  235. package/server/security/human-gate-transports.js +178 -178
  236. package/server/security/human-gate.js +281 -281
  237. package/server/security/index.js +368 -368
  238. package/server/security/intent-engine.js +245 -245
  239. package/server/security/reward-guard.js +171 -171
  240. package/server/security/rollback-store.js +239 -239
  241. package/server/security/token-scope.js +404 -404
  242. package/server/security/url-policy.js +139 -139
  243. package/server/services/adoption-agent.js +182 -0
  244. package/server/services/agent-chat.js +506 -506
  245. package/server/services/agent-learning.js +601 -601
  246. package/server/services/agent-memory.js +625 -625
  247. package/server/services/agent-mesh.js +555 -555
  248. package/server/services/agent-symphony.js +717 -717
  249. package/server/services/agent-tasks.js +1807 -1807
  250. package/server/services/api-key-engine.js +292 -292
  251. package/server/services/cluster.js +894 -894
  252. package/server/services/commander.js +738 -738
  253. package/server/services/edge-compute.js +440 -440
  254. package/server/services/email.js +233 -233
  255. package/server/services/fairness-engine.js +409 -0
  256. package/server/services/fairness.js +420 -0
  257. package/server/services/governance.js +466 -466
  258. package/server/services/hosted-runtime.js +205 -205
  259. package/server/services/lfd.js +635 -635
  260. package/server/services/local-ai.js +389 -389
  261. package/server/services/marketplace.js +270 -270
  262. package/server/services/metering.js +182 -182
  263. package/server/services/modules/affiliate-intelligence.js +93 -93
  264. package/server/services/modules/agent-firewall.js +90 -90
  265. package/server/services/modules/bounty.js +89 -89
  266. package/server/services/modules/collective-bargaining.js +92 -92
  267. package/server/services/modules/dark-pattern.js +66 -66
  268. package/server/services/modules/gov-intelligence.js +45 -45
  269. package/server/services/modules/neural.js +55 -55
  270. package/server/services/modules/notary.js +49 -49
  271. package/server/services/modules/price-time-machine.js +86 -86
  272. package/server/services/modules/protocol.js +104 -104
  273. package/server/services/negotiation.js +439 -439
  274. package/server/services/outreach-agent.js +312 -0
  275. package/server/services/plans.js +214 -214
  276. package/server/services/plugins.js +771 -771
  277. package/server/services/price-intelligence.js +566 -566
  278. package/server/services/price-shield.js +1137 -1137
  279. package/server/services/provider-clients.js +740 -740
  280. package/server/services/reputation.js +465 -465
  281. package/server/services/search-engine.js +357 -357
  282. package/server/services/security.js +513 -513
  283. package/server/services/self-healing.js +843 -843
  284. package/server/services/shieldlink.js +492 -0
  285. package/server/services/shieldqr.js +322 -322
  286. package/server/services/sovereign-shield.js +542 -542
  287. package/server/services/ssl-ct-monitor.js +224 -0
  288. package/server/services/ssl-inspector.js +42 -42
  289. package/server/services/ssl-monitor.js +167 -167
  290. package/server/services/stripe.js +206 -205
  291. package/server/services/swarm.js +788 -788
  292. package/server/services/transactions.js +525 -0
  293. package/server/services/universal-scraper.js +662 -662
  294. package/server/services/verification.js +481 -481
  295. package/server/services/vision.js +1163 -1163
  296. package/server/services/wab-crypto.js +178 -178
  297. package/server/utils/cache.js +125 -125
  298. package/server/utils/migrate.js +81 -81
  299. package/server/utils/safe-fetch.js +228 -228
  300. package/server/utils/secureFields.js +50 -50
  301. package/server/ws.js +161 -161
  302. package/templates/artisan-marketplace.yaml +104 -104
  303. package/templates/book-price-scout.yaml +98 -98
  304. package/templates/electronics-price-tracker.yaml +108 -108
  305. package/templates/flight-deal-hunter.yaml +113 -113
  306. package/templates/freelancer-direct.yaml +116 -116
  307. package/templates/grocery-price-compare.yaml +93 -93
  308. package/templates/hotel-direct-booking.yaml +113 -113
  309. package/templates/local-services.yaml +98 -98
  310. package/templates/olive-oil-tunisia.yaml +88 -88
  311. package/templates/organic-farm-fresh.yaml +101 -101
  312. package/templates/restaurant-direct.yaml +97 -97
  313. package/templates/ring4/banking-sovereign.yaml +55 -0
  314. package/templates/ring4/ecommerce-sovereign.yaml +58 -0
  315. package/templates/ring4/healthcare-sovereign.yaml +60 -0
@@ -0,0 +1,133 @@
1
+ -- ─────────────────────────────────────────────────────────────────────
2
+ -- Migration 019: Unify tier CHECK constraints with canonical plans table
3
+ --
4
+ -- Background:
5
+ -- plans table (008_plans.sql) seeds: free / pro / business / enterprise
6
+ -- Legacy CHECK constraints accepted: free / starter / pro / enterprise
7
+ -- ⇒ Cannot purchase the canonical 'business' tier because the row would
8
+ -- violate the CHECK constraint on sites.tier, subscriptions.tier,
9
+ -- stripe_subscriptions.tier, free_grants.granted_tier and
10
+ -- workspace_subscriptions.plan.
11
+ --
12
+ -- This migration accepts BOTH 'starter' (legacy / kept for back-compat
13
+ -- with any existing rows or external scripts) AND 'business' (canonical
14
+ -- new tier name).
15
+ --
16
+ -- SQLite-recommended pattern: create new table, copy rows, drop old,
17
+ -- rename new, recreate indexes. defer_foreign_keys lets us do it inside
18
+ -- a single transaction.
19
+ -- ─────────────────────────────────────────────────────────────────────
20
+
21
+ PRAGMA defer_foreign_keys = ON;
22
+
23
+ -- ── 1) sites ─────────────────────────────────────────────────────────
24
+ CREATE TABLE sites_new (
25
+ id TEXT PRIMARY KEY,
26
+ user_id TEXT NOT NULL,
27
+ domain TEXT NOT NULL,
28
+ name TEXT NOT NULL,
29
+ description TEXT,
30
+ tier TEXT DEFAULT 'free' CHECK(tier IN ('free','starter','pro','business','enterprise')),
31
+ license_key TEXT UNIQUE NOT NULL,
32
+ api_key TEXT UNIQUE,
33
+ config TEXT DEFAULT '{}',
34
+ active INTEGER DEFAULT 1,
35
+ created_at TEXT DEFAULT (datetime('now')),
36
+ updated_at TEXT DEFAULT (datetime('now')),
37
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
38
+ );
39
+ INSERT INTO sites_new SELECT * FROM sites;
40
+ DROP TABLE sites;
41
+ ALTER TABLE sites_new RENAME TO sites;
42
+ CREATE INDEX IF NOT EXISTS idx_sites_domain ON sites(domain);
43
+ CREATE INDEX IF NOT EXISTS idx_sites_license ON sites(license_key);
44
+
45
+ -- ── 2) subscriptions ────────────────────────────────────────────────
46
+ CREATE TABLE subscriptions_new (
47
+ id TEXT PRIMARY KEY,
48
+ user_id TEXT NOT NULL,
49
+ site_id TEXT NOT NULL,
50
+ tier TEXT NOT NULL CHECK(tier IN ('free','starter','pro','business','enterprise')),
51
+ status TEXT DEFAULT 'active' CHECK(status IN ('active','cancelled','expired','trial')),
52
+ started_at TEXT DEFAULT (datetime('now')),
53
+ expires_at TEXT,
54
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
55
+ FOREIGN KEY (site_id) REFERENCES sites(id) ON DELETE CASCADE
56
+ );
57
+ INSERT INTO subscriptions_new SELECT * FROM subscriptions;
58
+ DROP TABLE subscriptions;
59
+ ALTER TABLE subscriptions_new RENAME TO subscriptions;
60
+
61
+ -- ── 3) free_grants ──────────────────────────────────────────────────
62
+ CREATE TABLE free_grants_new (
63
+ id TEXT PRIMARY KEY,
64
+ user_id TEXT NOT NULL,
65
+ site_id TEXT,
66
+ granted_tier TEXT NOT NULL CHECK(granted_tier IN ('starter','pro','business','enterprise')),
67
+ reason TEXT,
68
+ granted_by TEXT NOT NULL,
69
+ granted_at TEXT DEFAULT (datetime('now')),
70
+ expires_at TEXT,
71
+ active INTEGER DEFAULT 1,
72
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
73
+ FOREIGN KEY (granted_by) REFERENCES admins(id)
74
+ );
75
+ INSERT INTO free_grants_new SELECT * FROM free_grants;
76
+ DROP TABLE free_grants;
77
+ ALTER TABLE free_grants_new RENAME TO free_grants;
78
+
79
+ -- ── 4) stripe_subscriptions ─────────────────────────────────────────
80
+ CREATE TABLE stripe_subscriptions_new (
81
+ id TEXT PRIMARY KEY,
82
+ user_id TEXT NOT NULL,
83
+ site_id TEXT NOT NULL,
84
+ stripe_subscription_id TEXT UNIQUE,
85
+ stripe_price_id TEXT,
86
+ tier TEXT NOT NULL CHECK(tier IN ('starter','pro','business','enterprise')),
87
+ status TEXT DEFAULT 'active' CHECK(status IN ('active','cancelled','past_due','trialing','incomplete')),
88
+ current_period_start TEXT,
89
+ current_period_end TEXT,
90
+ created_at TEXT DEFAULT (datetime('now')),
91
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
92
+ FOREIGN KEY (site_id) REFERENCES sites(id) ON DELETE CASCADE
93
+ );
94
+ INSERT INTO stripe_subscriptions_new SELECT * FROM stripe_subscriptions;
95
+ DROP TABLE stripe_subscriptions;
96
+ ALTER TABLE stripe_subscriptions_new RENAME TO stripe_subscriptions;
97
+
98
+ -- ── 5) workspace_subscriptions (agent-workspace.js dynamic table) ────
99
+ -- Created on first import of routes/agent-workspace.js. May not exist
100
+ -- in fresh installs that have not loaded that route yet; guard with
101
+ -- a defensive recreate.
102
+ CREATE TABLE IF NOT EXISTS workspace_subscriptions (
103
+ id TEXT PRIMARY KEY,
104
+ user_id TEXT NOT NULL,
105
+ plan TEXT NOT NULL DEFAULT 'free',
106
+ status TEXT NOT NULL DEFAULT 'active',
107
+ tasks_today INTEGER DEFAULT 0,
108
+ tasks_total INTEGER DEFAULT 0,
109
+ deals_completed INTEGER DEFAULT 0,
110
+ total_savings REAL DEFAULT 0,
111
+ last_task_date TEXT,
112
+ created_at TEXT DEFAULT (datetime('now')),
113
+ expires_at TEXT,
114
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
115
+ );
116
+
117
+ CREATE TABLE workspace_subscriptions_new (
118
+ id TEXT PRIMARY KEY,
119
+ user_id TEXT NOT NULL,
120
+ plan TEXT NOT NULL DEFAULT 'free' CHECK(plan IN ('free','starter','pro','business','enterprise')),
121
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','cancelled','expired','suspended')),
122
+ tasks_today INTEGER DEFAULT 0,
123
+ tasks_total INTEGER DEFAULT 0,
124
+ deals_completed INTEGER DEFAULT 0,
125
+ total_savings REAL DEFAULT 0,
126
+ last_task_date TEXT,
127
+ created_at TEXT DEFAULT (datetime('now')),
128
+ expires_at TEXT,
129
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
130
+ );
131
+ INSERT INTO workspace_subscriptions_new SELECT * FROM workspace_subscriptions;
132
+ DROP TABLE workspace_subscriptions;
133
+ ALTER TABLE workspace_subscriptions_new RENAME TO workspace_subscriptions;
@@ -0,0 +1,119 @@
1
+ -- ─────────────────────────────────────────────────────────────────────────────
2
+ -- Migration 020 — Agent Transaction Primitive (ATP) — v3.9.0
3
+ --
4
+ -- Promotes WAB from "discover + execute" to "trust + transaction" by
5
+ -- introducing intents, transactions, steps and signed receipts as
6
+ -- first-class primitives.
7
+ --
8
+ -- * atp_intents — signed human → agent authorization contracts
9
+ -- * atp_transactions — executions performed under an intent
10
+ -- * atp_steps — per-step ledger inside a transaction (retry/comp)
11
+ -- * atp_receipts — cryptographically signed proofs of outcome
12
+ -- * atp_nonces — single-use nonces to prevent replay
13
+ --
14
+ -- All state machines enforced by CHECK constraints so the DB itself
15
+ -- refuses illegal transitions.
16
+ -- ─────────────────────────────────────────────────────────────────────────────
17
+
18
+ -- ── 1) Intents (the human → agent contract) ──────────────────────────────────
19
+ CREATE TABLE IF NOT EXISTS atp_intents (
20
+ id TEXT PRIMARY KEY, -- atp_int_<ulid>
21
+ user_id TEXT NOT NULL, -- principal (the human)
22
+ site_id TEXT, -- optional binding
23
+ agent_id TEXT, -- optional binding (the delegate)
24
+ purpose TEXT NOT NULL, -- short human-readable purpose
25
+ scope TEXT NOT NULL, -- JSON: { actions:[], domains:[], constraints:{} }
26
+ spend_cap_cents INTEGER NOT NULL DEFAULT 0, -- 0 = no cap (must be explicit)
27
+ spend_currency TEXT NOT NULL DEFAULT 'EUR',
28
+ spent_cents INTEGER NOT NULL DEFAULT 0, -- running total against the cap
29
+ max_executions INTEGER NOT NULL DEFAULT 1, -- how many transactions allowed
30
+ used_executions INTEGER NOT NULL DEFAULT 0,
31
+ expires_at TEXT NOT NULL, -- ISO-8601, hard cutoff
32
+ nonce TEXT NOT NULL UNIQUE, -- prevents replay across intents
33
+ status TEXT NOT NULL DEFAULT 'draft'
34
+ CHECK (status IN ('draft','authorized','consumed','revoked','expired')),
35
+ authorized_at TEXT,
36
+ authorized_by TEXT, -- user_id of the approver
37
+ user_signature TEXT, -- base64 Ed25519 sig of canonical body
38
+ revoked_at TEXT,
39
+ revoked_reason TEXT,
40
+ metadata TEXT NOT NULL DEFAULT '{}', -- JSON
41
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
42
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
43
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
44
+ );
45
+ CREATE INDEX IF NOT EXISTS idx_atp_intents_user ON atp_intents(user_id, created_at DESC);
46
+ CREATE INDEX IF NOT EXISTS idx_atp_intents_status ON atp_intents(status, expires_at);
47
+ CREATE INDEX IF NOT EXISTS idx_atp_intents_site ON atp_intents(site_id);
48
+
49
+ -- ── 2) Transactions (executions under an intent) ─────────────────────────────
50
+ CREATE TABLE IF NOT EXISTS atp_transactions (
51
+ id TEXT PRIMARY KEY, -- atp_tx_<ulid>
52
+ intent_id TEXT NOT NULL,
53
+ site_id TEXT,
54
+ agent_id TEXT,
55
+ idempotency_key TEXT NOT NULL, -- caller-supplied, unique per intent
56
+ status TEXT NOT NULL DEFAULT 'pending'
57
+ CHECK (status IN ('pending','executing','executed','settled','failed','compensated')),
58
+ amount_cents INTEGER NOT NULL DEFAULT 0, -- net effect against intent.spend_cap
59
+ currency TEXT NOT NULL DEFAULT 'EUR',
60
+ summary TEXT, -- one-line outcome summary
61
+ error TEXT, -- failure reason if status='failed'
62
+ started_at TEXT,
63
+ completed_at TEXT,
64
+ settled_at TEXT,
65
+ compensated_at TEXT,
66
+ metadata TEXT NOT NULL DEFAULT '{}',
67
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
68
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
69
+ FOREIGN KEY (intent_id) REFERENCES atp_intents(id) ON DELETE CASCADE,
70
+ UNIQUE (intent_id, idempotency_key) -- the core safety guarantee
71
+ );
72
+ CREATE INDEX IF NOT EXISTS idx_atp_tx_intent ON atp_transactions(intent_id, created_at DESC);
73
+ CREATE INDEX IF NOT EXISTS idx_atp_tx_status ON atp_transactions(status, created_at DESC);
74
+ CREATE INDEX IF NOT EXISTS idx_atp_tx_site ON atp_transactions(site_id, created_at DESC);
75
+
76
+ -- ── 3) Steps (granular ledger for retry / compensation) ──────────────────────
77
+ CREATE TABLE IF NOT EXISTS atp_steps (
78
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
79
+ transaction_id TEXT NOT NULL,
80
+ seq INTEGER NOT NULL, -- step order, 1..N
81
+ action TEXT NOT NULL, -- WAB action name (e.g. "checkout.confirm")
82
+ state TEXT NOT NULL DEFAULT 'pending'
83
+ CHECK (state IN ('pending','running','succeeded','failed','skipped','compensated')),
84
+ before_snapshot TEXT, -- JSON: site state before step (optional)
85
+ after_snapshot TEXT, -- JSON: site state after step
86
+ evidence TEXT, -- JSON: arbitrary proof (DOM hash, http trace, …)
87
+ compensation TEXT, -- JSON: rollback action descriptor
88
+ attempts INTEGER NOT NULL DEFAULT 0,
89
+ last_error TEXT,
90
+ started_at TEXT,
91
+ ended_at TEXT,
92
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
93
+ FOREIGN KEY (transaction_id) REFERENCES atp_transactions(id) ON DELETE CASCADE,
94
+ UNIQUE (transaction_id, seq)
95
+ );
96
+ CREATE INDEX IF NOT EXISTS idx_atp_steps_tx ON atp_steps(transaction_id, seq);
97
+
98
+ -- ── 4) Receipts (signed proofs of outcome) ───────────────────────────────────
99
+ CREATE TABLE IF NOT EXISTS atp_receipts (
100
+ id TEXT PRIMARY KEY, -- atp_rcpt_<ulid>
101
+ transaction_id TEXT NOT NULL UNIQUE,
102
+ site_id TEXT, -- the signing party (if any)
103
+ algorithm TEXT NOT NULL DEFAULT 'ed25519',
104
+ key_id TEXT, -- fingerprint of signing key
105
+ canonical_body TEXT NOT NULL, -- the canonicalized JSON that was signed
106
+ signature TEXT NOT NULL, -- base64 Ed25519 signature
107
+ public_key TEXT, -- embedded pub key for offline verification
108
+ issued_at TEXT NOT NULL DEFAULT (datetime('now')),
109
+ FOREIGN KEY (transaction_id) REFERENCES atp_transactions(id) ON DELETE CASCADE
110
+ );
111
+ CREATE INDEX IF NOT EXISTS idx_atp_receipts_site ON atp_receipts(site_id, issued_at DESC);
112
+
113
+ -- ── 5) Nonces (single-use, replay protection) ────────────────────────────────
114
+ CREATE TABLE IF NOT EXISTS atp_nonces (
115
+ nonce TEXT PRIMARY KEY,
116
+ user_id TEXT NOT NULL,
117
+ consumed_at TEXT NOT NULL DEFAULT (datetime('now'))
118
+ );
119
+ CREATE INDEX IF NOT EXISTS idx_atp_nonces_user ON atp_nonces(user_id, consumed_at DESC);
@@ -1,33 +1,33 @@
1
- /**
2
- * Database Adapter Interface
3
- *
4
- * WAB supports multiple database backends via adapters.
5
- * Set DB_ADAPTER environment variable to choose: sqlite (default), postgresql, mysql
6
- *
7
- * For PostgreSQL:
8
- * npm install pg
9
- * DB_ADAPTER=postgresql DATABASE_URL=postgres://user:pass@host:5432/wab
10
- *
11
- * For MySQL:
12
- * npm install mysql2
13
- * DB_ADAPTER=mysql DATABASE_URL=mysql://user:pass@host:3306/wab
14
- */
15
-
16
- const adapter = process.env.DB_ADAPTER || 'sqlite';
17
-
18
- let db;
19
- switch (adapter) {
20
- case 'postgresql':
21
- case 'postgres':
22
- db = require('./postgresql');
23
- break;
24
- case 'mysql':
25
- db = require('./mysql');
26
- break;
27
- case 'sqlite':
28
- default:
29
- db = require('./sqlite');
30
- break;
31
- }
32
-
33
- module.exports = db;
1
+ /**
2
+ * Database Adapter Interface
3
+ *
4
+ * WAB supports multiple database backends via adapters.
5
+ * Set DB_ADAPTER environment variable to choose: sqlite (default), postgresql, mysql
6
+ *
7
+ * For PostgreSQL:
8
+ * npm install pg
9
+ * DB_ADAPTER=postgresql DATABASE_URL=postgres://user:pass@host:5432/wab
10
+ *
11
+ * For MySQL:
12
+ * npm install mysql2
13
+ * DB_ADAPTER=mysql DATABASE_URL=mysql://user:pass@host:3306/wab
14
+ */
15
+
16
+ const adapter = process.env.DB_ADAPTER || 'sqlite';
17
+
18
+ let db;
19
+ switch (adapter) {
20
+ case 'postgresql':
21
+ case 'postgres':
22
+ db = require('./postgresql');
23
+ break;
24
+ case 'mysql':
25
+ db = require('./mysql');
26
+ break;
27
+ case 'sqlite':
28
+ default:
29
+ db = require('./sqlite');
30
+ break;
31
+ }
32
+
33
+ module.exports = db;