web-agent-bridge 3.2.0 → 3.4.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.
- package/LICENSE +84 -72
- package/README.ar.md +1304 -1152
- package/README.md +298 -1635
- package/bin/agent-runner.js +474 -474
- package/bin/cli.js +237 -138
- package/bin/wab-init.js +223 -0
- package/bin/wab.js +80 -80
- package/examples/azure-dns-wab.js +83 -0
- package/examples/bidi-agent.js +119 -119
- package/examples/cloudflare-wab-dns.js +121 -0
- package/examples/cpanel-wab-dns.js +114 -0
- package/examples/cross-site-agent.js +91 -91
- package/examples/dns-discovery-agent.js +166 -0
- package/examples/gcp-dns-wab.js +76 -0
- package/examples/governance-agent.js +169 -0
- package/examples/mcp-agent.js +94 -94
- package/examples/next-app-router/README.md +44 -44
- package/examples/plesk-wab-dns.js +103 -0
- package/examples/puppeteer-agent.js +108 -108
- package/examples/route53-wab-dns.js +144 -0
- package/examples/saas-dashboard/README.md +55 -55
- package/examples/safe-mode-agent.js +96 -0
- package/examples/shopify-hydrogen/README.md +74 -74
- package/examples/vision-agent.js +171 -171
- package/examples/wab-sign.js +74 -0
- package/examples/wab-verify.js +60 -0
- package/examples/wordpress-elementor/README.md +77 -77
- package/package.json +19 -6
- package/public/.well-known/agent-tools.json +180 -180
- package/public/.well-known/ai-assets.json +59 -59
- package/public/.well-known/security.txt +8 -0
- package/public/.well-known/wab.json +28 -0
- package/public/activate.html +368 -0
- package/public/adoption-metrics.html +188 -0
- package/public/agent-workspace.html +349 -349
- package/public/ai.html +198 -198
- package/public/api.html +413 -412
- package/public/azure-dns-integration.html +289 -0
- package/public/browser.html +486 -486
- package/public/cloudflare-integration.html +380 -0
- package/public/commander-dashboard.html +243 -243
- package/public/cookies.html +210 -210
- package/public/cpanel-integration.html +398 -0
- package/public/css/agent-workspace.css +1713 -1713
- package/public/css/premium.css +317 -317
- package/public/css/styles.css +1263 -1235
- package/public/dashboard.html +707 -706
- package/public/dns.html +436 -0
- package/public/docs.html +588 -587
- package/public/feed.xml +89 -89
- package/public/gcp-dns-integration.html +318 -0
- package/public/growth.html +465 -463
- package/public/index.html +1266 -982
- package/public/integrations.html +556 -0
- package/public/js/activate.js +145 -0
- package/public/js/agent-workspace.js +1740 -1740
- package/public/js/auth-nav.js +65 -31
- package/public/js/auth-redirect.js +12 -12
- package/public/js/cookie-consent.js +56 -56
- package/public/js/dns.js +438 -0
- package/public/js/wab-demo-page.js +721 -721
- package/public/js/ws-client.js +74 -74
- package/public/llms-full.txt +360 -360
- package/public/llms.txt +125 -125
- package/public/login.html +85 -85
- package/public/mesh-dashboard.html +328 -328
- package/public/openapi.json +669 -580
- package/public/phone-shield.html +281 -0
- package/public/plesk-integration.html +375 -0
- package/public/premium-dashboard.html +2489 -2489
- package/public/premium.html +793 -793
- package/public/privacy.html +297 -297
- package/public/provider-onboarding.html +172 -0
- package/public/provider-sandbox.html +134 -0
- package/public/providers.html +359 -0
- package/public/register.html +105 -105
- package/public/registrar-integrations.html +141 -0
- package/public/robots.txt +99 -87
- package/public/route53-integration.html +531 -0
- package/public/script/wab-consent.d.ts +36 -36
- package/public/script/wab-consent.js +104 -104
- package/public/script/wab-schema.js +131 -131
- package/public/script/wab.d.ts +108 -108
- package/public/script/wab.min.js +580 -580
- package/public/security.txt +8 -0
- package/public/shieldqr.html +231 -0
- package/public/sitemap.xml +6 -0
- package/public/terms.html +256 -256
- package/public/wab-trust.html +200 -0
- package/public/wab-vs-protocols.html +210 -0
- package/public/whitepaper.html +449 -0
- package/script/ai-agent-bridge.js +1754 -1754
- package/sdk/README.md +99 -99
- package/sdk/agent-mesh.js +449 -449
- package/sdk/auto-discovery.js +288 -0
- package/sdk/commander.js +262 -262
- package/sdk/governance.js +262 -0
- package/sdk/index.d.ts +464 -464
- package/sdk/index.js +25 -1
- package/sdk/multi-agent.js +318 -318
- package/sdk/package.json +2 -2
- package/sdk/safe-mode.js +221 -0
- package/sdk/safety-shield.js +219 -0
- package/sdk/schema-discovery.js +83 -83
- package/server/adapters/index.js +520 -520
- package/server/config/plans.js +367 -367
- package/server/config/secrets.js +102 -102
- package/server/control-plane/index.js +301 -301
- package/server/data-plane/index.js +354 -354
- package/server/index.js +670 -427
- package/server/llm/index.js +404 -404
- package/server/middleware/adminAuth.js +35 -35
- package/server/middleware/auth.js +50 -50
- package/server/middleware/featureGate.js +88 -88
- package/server/middleware/rateLimits.js +100 -100
- package/server/middleware/sensitiveAction.js +157 -0
- package/server/migrations/001_add_analytics_indexes.sql +7 -7
- package/server/migrations/002_premium_features.sql +418 -418
- package/server/migrations/003_ads_integer_cents.sql +33 -33
- package/server/migrations/004_agent_os.sql +158 -158
- package/server/migrations/005_marketplace_metering.sql +126 -126
- package/server/migrations/007_governance.sql +106 -0
- package/server/migrations/008_plans.sql +144 -0
- package/server/migrations/009_shieldqr.sql +30 -0
- package/server/migrations/010_extended_trust.sql +33 -0
- package/server/models/adapters/index.js +33 -33
- package/server/models/adapters/mysql.js +183 -183
- package/server/models/adapters/postgresql.js +172 -172
- package/server/models/adapters/sqlite.js +7 -7
- package/server/models/db.js +740 -681
- package/server/observability/failure-analysis.js +337 -337
- package/server/observability/index.js +394 -394
- package/server/protocol/capabilities.js +223 -223
- package/server/protocol/index.js +243 -243
- package/server/protocol/schema.js +584 -584
- package/server/registry/certification.js +271 -271
- package/server/registry/index.js +326 -326
- package/server/routes/admin-plans.js +76 -0
- package/server/routes/admin-premium.js +673 -671
- package/server/routes/admin-shieldqr.js +90 -0
- package/server/routes/admin-trust-monitor.js +83 -0
- package/server/routes/admin.js +549 -261
- package/server/routes/ads.js +130 -130
- package/server/routes/agent-workspace.js +540 -540
- package/server/routes/api.js +150 -150
- package/server/routes/auth.js +71 -71
- package/server/routes/billing.js +57 -45
- package/server/routes/commander.js +316 -316
- package/server/routes/demo-showcase.js +332 -332
- package/server/routes/demo-store.js +154 -0
- package/server/routes/discovery.js +2348 -417
- package/server/routes/gateway.js +173 -157
- package/server/routes/governance.js +208 -0
- package/server/routes/license.js +251 -240
- package/server/routes/mesh.js +469 -469
- package/server/routes/noscript.js +543 -543
- package/server/routes/plans.js +33 -0
- package/server/routes/premium-v2.js +686 -686
- package/server/routes/premium.js +724 -724
- package/server/routes/providers.js +650 -0
- package/server/routes/runtime.js +2148 -2147
- package/server/routes/shieldqr.js +88 -0
- package/server/routes/sovereign.js +465 -385
- package/server/routes/universal.js +200 -185
- package/server/routes/wab-api.js +850 -501
- package/server/runtime/container-worker.js +111 -111
- package/server/runtime/container.js +448 -448
- package/server/runtime/distributed-worker.js +362 -362
- package/server/runtime/event-bus.js +210 -210
- package/server/runtime/index.js +253 -253
- package/server/runtime/queue.js +599 -599
- package/server/runtime/replay.js +666 -666
- package/server/runtime/sandbox.js +266 -266
- package/server/runtime/scheduler.js +534 -534
- package/server/runtime/session-engine.js +293 -293
- package/server/runtime/state-manager.js +188 -188
- package/server/security/cross-site-redactor.js +196 -0
- package/server/security/dry-run.js +180 -0
- package/server/security/human-gate-rate-limit.js +147 -0
- package/server/security/human-gate-transports.js +178 -0
- package/server/security/human-gate.js +281 -0
- package/server/security/index.js +368 -368
- package/server/security/intent-engine.js +245 -0
- package/server/security/reward-guard.js +171 -0
- package/server/security/rollback-store.js +239 -0
- package/server/security/token-scope.js +404 -0
- package/server/security/url-policy.js +139 -0
- package/server/services/agent-chat.js +506 -506
- package/server/services/agent-learning.js +601 -575
- package/server/services/agent-memory.js +625 -625
- package/server/services/agent-mesh.js +555 -539
- package/server/services/agent-symphony.js +717 -717
- package/server/services/agent-tasks.js +1807 -1807
- package/server/services/api-key-engine.js +292 -261
- package/server/services/cluster.js +894 -894
- package/server/services/commander.js +738 -738
- package/server/services/edge-compute.js +440 -440
- package/server/services/email.js +233 -204
- package/server/services/governance.js +466 -0
- package/server/services/hosted-runtime.js +205 -205
- package/server/services/lfd.js +635 -635
- package/server/services/local-ai.js +389 -389
- package/server/services/marketplace.js +270 -270
- package/server/services/metering.js +182 -182
- package/server/services/modules/affiliate-intelligence.js +93 -93
- package/server/services/modules/agent-firewall.js +90 -90
- package/server/services/modules/bounty.js +89 -89
- package/server/services/modules/collective-bargaining.js +92 -92
- package/server/services/modules/dark-pattern.js +66 -66
- package/server/services/modules/gov-intelligence.js +45 -45
- package/server/services/modules/neural.js +55 -55
- package/server/services/modules/notary.js +49 -49
- package/server/services/modules/price-time-machine.js +86 -86
- package/server/services/modules/protocol.js +104 -104
- package/server/services/negotiation.js +439 -439
- package/server/services/plans.js +214 -0
- package/server/services/plugins.js +771 -771
- package/server/services/premium.js +1 -1
- package/server/services/price-intelligence.js +566 -566
- package/server/services/price-shield.js +1137 -1137
- package/server/services/provider-clients.js +740 -0
- package/server/services/reputation.js +465 -465
- package/server/services/search-engine.js +357 -357
- package/server/services/security.js +513 -513
- package/server/services/self-healing.js +843 -843
- package/server/services/shieldqr.js +322 -0
- package/server/services/sovereign-shield.js +542 -0
- package/server/services/ssl-inspector.js +42 -0
- package/server/services/ssl-monitor.js +167 -0
- package/server/services/stripe.js +205 -192
- package/server/services/swarm.js +788 -788
- package/server/services/universal-scraper.js +662 -661
- package/server/services/verification.js +481 -481
- package/server/services/vision.js +1163 -1163
- package/server/services/wab-crypto.js +178 -0
- package/server/utils/cache.js +125 -125
- package/server/utils/migrate.js +81 -81
- package/server/utils/safe-fetch.js +228 -0
- package/server/utils/secureFields.js +50 -50
- package/server/ws.js +161 -161
- package/templates/artisan-marketplace.yaml +104 -104
- package/templates/book-price-scout.yaml +98 -98
- package/templates/electronics-price-tracker.yaml +108 -108
- package/templates/flight-deal-hunter.yaml +113 -113
- package/templates/freelancer-direct.yaml +116 -116
- package/templates/grocery-price-compare.yaml +93 -93
- package/templates/hotel-direct-booking.yaml +113 -113
- package/templates/local-services.yaml +98 -98
- package/templates/olive-oil-tunisia.yaml +88 -88
- package/templates/organic-farm-fresh.yaml +101 -101
- package/templates/restaurant-direct.yaml +97 -97
- package/public/score.html +0 -263
- package/server/migrations/006_growth_suite.sql +0 -138
- package/server/routes/growth.js +0 -962
- package/server/services/fairness-engine.js +0 -409
- package/server/services/fairness.js +0 -420
package/public/feed.xml
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<feed xmlns="http://www.w3.org/2005/Atom">
|
|
3
|
-
<title>Web Agent Bridge — Changelog</title>
|
|
4
|
-
<subtitle>Open protocol for AI agent ↔ website interaction. Release notes and updates.</subtitle>
|
|
5
|
-
<link href="https://webagentbridge.com/feed.xml" rel="self" type="application/atom+xml"/>
|
|
6
|
-
<link href="https://webagentbridge.com/" rel="alternate" type="text/html"/>
|
|
7
|
-
<id>https://webagentbridge.com/</id>
|
|
8
|
-
<updated>2026-03-28T00:00:00Z</updated>
|
|
9
|
-
<author>
|
|
10
|
-
<name>Web Agent Bridge</name>
|
|
11
|
-
<uri>https://webagentbridge.com</uri>
|
|
12
|
-
</author>
|
|
13
|
-
<icon>https://webagentbridge.com/favicon.ico</icon>
|
|
14
|
-
<rights>MIT License</rights>
|
|
15
|
-
<category term="AI" label="Artificial Intelligence"/>
|
|
16
|
-
<category term="web-protocol" label="Web Protocol"/>
|
|
17
|
-
<category term="automation" label="Automation"/>
|
|
18
|
-
|
|
19
|
-
<entry>
|
|
20
|
-
<title>v1.2.0 — WAB Protocol Ecosystem Release</title>
|
|
21
|
-
<link href="https://github.com/abokenan444/web-agent-bridge/releases/tag/v1.2.0" rel="alternate"/>
|
|
22
|
-
<id>https://webagentbridge.com/releases/v1.2.0</id>
|
|
23
|
-
<updated>2026-03-28T00:00:00Z</updated>
|
|
24
|
-
<summary type="html">
|
|
25
|
-
<p>Major release: WAB Protocol Specification v1.0, MCP Adapter for Claude/GPT integration,
|
|
26
|
-
Fairness Engine for equitable AI discovery, Discovery Protocol with agent-bridge.json,
|
|
27
|
-
WordPress plugin with full protocol support, dynamic subscription plan management,
|
|
28
|
-
NoScript HTTP fallback for JS-disabled environments, Agent SDK with discover/ping/execute methods,
|
|
29
|
-
and comprehensive OpenAPI documentation.</p>
|
|
30
|
-
</summary>
|
|
31
|
-
<content type="html">
|
|
32
|
-
<h2>WAB Protocol v1.2.0 — Ecosystem Release</h2>
|
|
33
|
-
<h3>Protocol & Specification</h3>
|
|
34
|
-
<ul>
|
|
35
|
-
<li>WAB Protocol Specification v1.0 — Formal spec with Discovery, Command, Lifecycle, Security, and Fairness protocols</li>
|
|
36
|
-
<li>Discovery Protocol — Sites publish agent-bridge.json or /.well-known/wab.json</li>
|
|
37
|
-
<li>Command Protocol — Standardized JSON format for agent actions</li>
|
|
38
|
-
<li>Lifecycle Protocol — Discover → Authenticate → Plan → Execute → Confirm</li>
|
|
39
|
-
</ul>
|
|
40
|
-
<h3>MCP Integration</h3>
|
|
41
|
-
<ul>
|
|
42
|
-
<li>wab-mcp-adapter — Converts WAB actions into MCP tools</li>
|
|
43
|
-
<li>Compatible with Claude, GPT, LangChain, and any MCP-enabled agent</li>
|
|
44
|
-
</ul>
|
|
45
|
-
<h3>Fairness Engine</h3>
|
|
46
|
-
<ul>
|
|
47
|
-
<li>Neutrality scoring (0–100) for equitable site discovery</li>
|
|
48
|
-
<li>Anti-monopoly bias correction in search results</li>
|
|
49
|
-
<li>Commission transparency and local business support flags</li>
|
|
50
|
-
</ul>
|
|
51
|
-
<h3>WordPress Plugin</h3>
|
|
52
|
-
<ul>
|
|
53
|
-
<li>Discovery Protocol endpoints (REST API + rewrite rules)</li>
|
|
54
|
-
<li>NoScript meta tags and fallback for HTTP-only agents</li>
|
|
55
|
-
<li>Protocol status page in admin settings</li>
|
|
56
|
-
</ul>
|
|
57
|
-
<h3>Infrastructure</h3>
|
|
58
|
-
<ul>
|
|
59
|
-
<li>Dynamic subscription plan management via admin dashboard</li>
|
|
60
|
-
<li>OpenAPI specification for all public endpoints</li>
|
|
61
|
-
<li>llms.txt and llms-full.txt for AI model discovery</li>
|
|
62
|
-
<li>AI-optimized robots.txt and sitemap.xml</li>
|
|
63
|
-
</ul>
|
|
64
|
-
</content>
|
|
65
|
-
</entry>
|
|
66
|
-
|
|
67
|
-
<entry>
|
|
68
|
-
<title>v1.1.0 — Protocol Specification & MCP Adapter</title>
|
|
69
|
-
<link href="https://github.com/abokenan444/web-agent-bridge/releases/tag/v1.1.0" rel="alternate"/>
|
|
70
|
-
<id>https://webagentbridge.com/releases/v1.1.0</id>
|
|
71
|
-
<updated>2026-03-25T00:00:00Z</updated>
|
|
72
|
-
<summary type="html">
|
|
73
|
-
<p>Introduction of the WAB Protocol Specification v1.0, MCP adapter for LLM integration,
|
|
74
|
-
Discovery Protocol, and Fairness Engine.</p>
|
|
75
|
-
</summary>
|
|
76
|
-
</entry>
|
|
77
|
-
|
|
78
|
-
<entry>
|
|
79
|
-
<title>v1.0.0 — Initial Release</title>
|
|
80
|
-
<link href="https://github.com/abokenan444/web-agent-bridge/releases/tag/v1.0.0" rel="alternate"/>
|
|
81
|
-
<id>https://webagentbridge.com/releases/v1.0.0</id>
|
|
82
|
-
<updated>2026-03-20T00:00:00Z</updated>
|
|
83
|
-
<summary type="html">
|
|
84
|
-
<p>First public release of Web Agent Bridge. Core runtime with AI command registration,
|
|
85
|
-
client-side bridge script, Express.js server, license management, analytics,
|
|
86
|
-
and the initial NoScript fallback.</p>
|
|
87
|
-
</summary>
|
|
88
|
-
</entry>
|
|
89
|
-
</feed>
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
|
3
|
+
<title>Web Agent Bridge — Changelog</title>
|
|
4
|
+
<subtitle>Open protocol for AI agent ↔ website interaction. Release notes and updates.</subtitle>
|
|
5
|
+
<link href="https://webagentbridge.com/feed.xml" rel="self" type="application/atom+xml"/>
|
|
6
|
+
<link href="https://webagentbridge.com/" rel="alternate" type="text/html"/>
|
|
7
|
+
<id>https://webagentbridge.com/</id>
|
|
8
|
+
<updated>2026-03-28T00:00:00Z</updated>
|
|
9
|
+
<author>
|
|
10
|
+
<name>Web Agent Bridge</name>
|
|
11
|
+
<uri>https://webagentbridge.com</uri>
|
|
12
|
+
</author>
|
|
13
|
+
<icon>https://webagentbridge.com/favicon.ico</icon>
|
|
14
|
+
<rights>MIT License</rights>
|
|
15
|
+
<category term="AI" label="Artificial Intelligence"/>
|
|
16
|
+
<category term="web-protocol" label="Web Protocol"/>
|
|
17
|
+
<category term="automation" label="Automation"/>
|
|
18
|
+
|
|
19
|
+
<entry>
|
|
20
|
+
<title>v1.2.0 — WAB Protocol Ecosystem Release</title>
|
|
21
|
+
<link href="https://github.com/abokenan444/web-agent-bridge/releases/tag/v1.2.0" rel="alternate"/>
|
|
22
|
+
<id>https://webagentbridge.com/releases/v1.2.0</id>
|
|
23
|
+
<updated>2026-03-28T00:00:00Z</updated>
|
|
24
|
+
<summary type="html">
|
|
25
|
+
<p>Major release: WAB Protocol Specification v1.0, MCP Adapter for Claude/GPT integration,
|
|
26
|
+
Fairness Engine for equitable AI discovery, Discovery Protocol with agent-bridge.json,
|
|
27
|
+
WordPress plugin with full protocol support, dynamic subscription plan management,
|
|
28
|
+
NoScript HTTP fallback for JS-disabled environments, Agent SDK with discover/ping/execute methods,
|
|
29
|
+
and comprehensive OpenAPI documentation.</p>
|
|
30
|
+
</summary>
|
|
31
|
+
<content type="html">
|
|
32
|
+
<h2>WAB Protocol v1.2.0 — Ecosystem Release</h2>
|
|
33
|
+
<h3>Protocol & Specification</h3>
|
|
34
|
+
<ul>
|
|
35
|
+
<li>WAB Protocol Specification v1.0 — Formal spec with Discovery, Command, Lifecycle, Security, and Fairness protocols</li>
|
|
36
|
+
<li>Discovery Protocol — Sites publish agent-bridge.json or /.well-known/wab.json</li>
|
|
37
|
+
<li>Command Protocol — Standardized JSON format for agent actions</li>
|
|
38
|
+
<li>Lifecycle Protocol — Discover → Authenticate → Plan → Execute → Confirm</li>
|
|
39
|
+
</ul>
|
|
40
|
+
<h3>MCP Integration</h3>
|
|
41
|
+
<ul>
|
|
42
|
+
<li>wab-mcp-adapter — Converts WAB actions into MCP tools</li>
|
|
43
|
+
<li>Compatible with Claude, GPT, LangChain, and any MCP-enabled agent</li>
|
|
44
|
+
</ul>
|
|
45
|
+
<h3>Fairness Engine</h3>
|
|
46
|
+
<ul>
|
|
47
|
+
<li>Neutrality scoring (0–100) for equitable site discovery</li>
|
|
48
|
+
<li>Anti-monopoly bias correction in search results</li>
|
|
49
|
+
<li>Commission transparency and local business support flags</li>
|
|
50
|
+
</ul>
|
|
51
|
+
<h3>WordPress Plugin</h3>
|
|
52
|
+
<ul>
|
|
53
|
+
<li>Discovery Protocol endpoints (REST API + rewrite rules)</li>
|
|
54
|
+
<li>NoScript meta tags and fallback for HTTP-only agents</li>
|
|
55
|
+
<li>Protocol status page in admin settings</li>
|
|
56
|
+
</ul>
|
|
57
|
+
<h3>Infrastructure</h3>
|
|
58
|
+
<ul>
|
|
59
|
+
<li>Dynamic subscription plan management via admin dashboard</li>
|
|
60
|
+
<li>OpenAPI specification for all public endpoints</li>
|
|
61
|
+
<li>llms.txt and llms-full.txt for AI model discovery</li>
|
|
62
|
+
<li>AI-optimized robots.txt and sitemap.xml</li>
|
|
63
|
+
</ul>
|
|
64
|
+
</content>
|
|
65
|
+
</entry>
|
|
66
|
+
|
|
67
|
+
<entry>
|
|
68
|
+
<title>v1.1.0 — Protocol Specification & MCP Adapter</title>
|
|
69
|
+
<link href="https://github.com/abokenan444/web-agent-bridge/releases/tag/v1.1.0" rel="alternate"/>
|
|
70
|
+
<id>https://webagentbridge.com/releases/v1.1.0</id>
|
|
71
|
+
<updated>2026-03-25T00:00:00Z</updated>
|
|
72
|
+
<summary type="html">
|
|
73
|
+
<p>Introduction of the WAB Protocol Specification v1.0, MCP adapter for LLM integration,
|
|
74
|
+
Discovery Protocol, and Fairness Engine.</p>
|
|
75
|
+
</summary>
|
|
76
|
+
</entry>
|
|
77
|
+
|
|
78
|
+
<entry>
|
|
79
|
+
<title>v1.0.0 — Initial Release</title>
|
|
80
|
+
<link href="https://github.com/abokenan444/web-agent-bridge/releases/tag/v1.0.0" rel="alternate"/>
|
|
81
|
+
<id>https://webagentbridge.com/releases/v1.0.0</id>
|
|
82
|
+
<updated>2026-03-20T00:00:00Z</updated>
|
|
83
|
+
<summary type="html">
|
|
84
|
+
<p>First public release of Web Agent Bridge. Core runtime with AI command registration,
|
|
85
|
+
client-side bridge script, Express.js server, license management, analytics,
|
|
86
|
+
and the initial NoScript fallback.</p>
|
|
87
|
+
</summary>
|
|
88
|
+
</entry>
|
|
89
|
+
</feed>
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>WAB DNS — Google Cloud DNS Integration</title>
|
|
7
|
+
<link rel="stylesheet" href="/css/main.css">
|
|
8
|
+
<style>
|
|
9
|
+
body { font-family: system-ui, sans-serif; background: #0f172a; color: #e2e8f0; margin: 0; padding: 0; }
|
|
10
|
+
.page { max-width: 880px; margin: 0 auto; padding: 40px 20px 80px; }
|
|
11
|
+
h1 { font-size: 1.7rem; margin-bottom: 6px; }
|
|
12
|
+
.sub { color: #94a3b8; margin-bottom: 32px; font-size: .97rem; }
|
|
13
|
+
.card { background: #1e293b; border-radius: 10px; padding: 24px; margin-bottom: 24px; }
|
|
14
|
+
h2 { font-size: 1.1rem; margin: 0 0 14px; }
|
|
15
|
+
label { display: block; font-size: .85rem; color: #94a3b8; margin-bottom: 4px; margin-top: 14px; }
|
|
16
|
+
label:first-child { margin-top: 0; }
|
|
17
|
+
input[type=text], input[type=password], textarea {
|
|
18
|
+
width: 100%; box-sizing: border-box; background: #0f172a; border: 1px solid #334155;
|
|
19
|
+
color: #e2e8f0; border-radius: 6px; padding: 9px 12px; font-size: .93rem; font-family: inherit;
|
|
20
|
+
}
|
|
21
|
+
textarea { font-family: ui-monospace, monospace; min-height: 100px; }
|
|
22
|
+
input:focus, textarea:focus { outline: 2px solid #6366f1; border-color: transparent; }
|
|
23
|
+
.row { display: flex; gap: 12px; }
|
|
24
|
+
.row > * { flex: 1; }
|
|
25
|
+
.actions { display: flex; gap: 10px; margin-top: 20px; flex-wrap: wrap; }
|
|
26
|
+
.btn { padding: 9px 20px; border-radius: 7px; border: none; cursor: pointer; font-size: .92rem; font-weight: 600; }
|
|
27
|
+
.btn:hover { opacity: .85; }
|
|
28
|
+
.btn:disabled { opacity: .45; cursor: not-allowed; }
|
|
29
|
+
.btn-enable { background: #4285f4; color: #fff; }
|
|
30
|
+
.btn-disable { background: #ef4444; color: #fff; }
|
|
31
|
+
.btn-verify { background: #6366f1; color: #fff; }
|
|
32
|
+
.btn-secondary { background: #334155; color: #e2e8f0; }
|
|
33
|
+
#statusBar { margin-top: 18px; min-height: 36px; padding: 10px 14px; border-radius: 7px; background: #0f172a; font-size: .88rem; color: #94a3b8; display: none; }
|
|
34
|
+
#statusBar.ok { display: block; color: #4ade80; border: 1px solid #166534; }
|
|
35
|
+
#statusBar.err { display: block; color: #f87171; border: 1px solid #7f1d1d; }
|
|
36
|
+
#statusBar.info { display: block; color: #93c5fd; border: 1px solid #1e3a5f; }
|
|
37
|
+
pre { background: #0f172a; border-radius: 7px; padding: 14px 16px; font-size: .82rem; color: #94a3b8; overflow-x: auto; white-space: pre-wrap; word-break: break-word; margin: 14px 0 0; }
|
|
38
|
+
code { background: #0f172a; padding: 1px 5px; border-radius: 4px; font-size: .88em; }
|
|
39
|
+
.tab-bar { display: flex; gap: 4px; margin-bottom: 14px; }
|
|
40
|
+
.tab { padding: 5px 14px; border-radius: 6px; cursor: pointer; font-size: .84rem; background: #0f172a; color: #94a3b8; border: 1px solid #334155; }
|
|
41
|
+
.tab.active { background: #6366f1; color: #fff; border-color: transparent; }
|
|
42
|
+
.tab-panel { display: none; }
|
|
43
|
+
.tab-panel.active { display: block; }
|
|
44
|
+
.step { display: flex; gap: 14px; margin-bottom: 18px; }
|
|
45
|
+
.step-num { flex-shrink: 0; width: 28px; height: 28px; border-radius: 50%; background: #334155; color: #e2e8f0; font-size: .82rem; font-weight: 700; display: flex; align-items: center; justify-content: center; }
|
|
46
|
+
.step-body { flex: 1; padding-top: 3px; }
|
|
47
|
+
.info-box { background: #0c2340; border: 1px solid #1e3a5f; border-radius: 8px; padding: 12px 16px; font-size: .87rem; color: #93c5fd; margin-bottom: 18px; }
|
|
48
|
+
a { color: #818cf8; }
|
|
49
|
+
</style>
|
|
50
|
+
</head>
|
|
51
|
+
<body>
|
|
52
|
+
<div class="page">
|
|
53
|
+
<h1>Google Cloud DNS × WAB Discovery</h1>
|
|
54
|
+
<p class="sub">
|
|
55
|
+
Enable or disable the WAB DNS Discovery TXT record on any
|
|
56
|
+
<a href="https://cloud.google.com/dns/docs/reference/rest/v1" target="_blank" rel="noopener">Cloud DNS</a> managed zone.
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<div class="info-box">
|
|
60
|
+
ℹ <strong>OAuth 2.0 Access Token required.</strong>
|
|
61
|
+
Browser SigV4-style signing isn't supported by Cloud DNS — paste a short-lived OAuth access token instead.
|
|
62
|
+
Generate one with: <code>gcloud auth print-access-token</code>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<!-- ── STEP 1: credentials ── -->
|
|
66
|
+
<div class="card">
|
|
67
|
+
<h2>1. Authentication</h2>
|
|
68
|
+
<label>OAuth 2.0 Access Token <span style="color:#64748b;font-weight:400">(short-lived, browser keeps in memory only)</span></label>
|
|
69
|
+
<input type="password" id="gcpToken" placeholder="ya29.…" autocomplete="off">
|
|
70
|
+
<p style="margin:8px 0 0;font-size:.82rem;color:#64748b">
|
|
71
|
+
Obtain via: <code>gcloud auth print-access-token</code> (with <code>roles/dns.admin</code> on the zone).
|
|
72
|
+
Token expires in ~60 minutes — re-paste if needed.
|
|
73
|
+
</p>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<!-- ── STEP 2: project + zone + domain ── -->
|
|
77
|
+
<div class="card">
|
|
78
|
+
<h2>2. Project & Zone</h2>
|
|
79
|
+
<div class="row">
|
|
80
|
+
<div>
|
|
81
|
+
<label>GCP Project ID</label>
|
|
82
|
+
<input type="text" id="gcpProject" placeholder="my-gcp-project">
|
|
83
|
+
</div>
|
|
84
|
+
<div>
|
|
85
|
+
<label>Managed Zone Name <span style="color:#64748b;font-weight:400">(not the DNS name)</span></label>
|
|
86
|
+
<input type="text" id="gcpZone" placeholder="example-com">
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="row">
|
|
90
|
+
<div>
|
|
91
|
+
<label>Domain</label>
|
|
92
|
+
<input type="text" id="gcpDomain" placeholder="example.com">
|
|
93
|
+
</div>
|
|
94
|
+
<div>
|
|
95
|
+
<label>Endpoint URL <span style="color:#64748b;font-weight:400">(blank = auto)</span></label>
|
|
96
|
+
<input type="text" id="gcpEndpoint" placeholder="https://example.com/.well-known/wab.json">
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<!-- ── STEP 3: actions ── -->
|
|
102
|
+
<div class="card">
|
|
103
|
+
<h2>3. Actions</h2>
|
|
104
|
+
<div class="actions">
|
|
105
|
+
<button class="btn btn-enable" id="btnEnable" onclick="gcpAction('enable')">✓ Enable WAB Discovery</button>
|
|
106
|
+
<button class="btn btn-disable" id="btnDisable" onclick="gcpAction('disable')">✗ Disable WAB Discovery</button>
|
|
107
|
+
<button class="btn btn-verify" id="btnVerify" onclick="gcpVerify()">⟳ Verify Status</button>
|
|
108
|
+
<button class="btn btn-secondary" onclick="window.open('/provider-sandbox','_blank')">Open Sandbox</button>
|
|
109
|
+
</div>
|
|
110
|
+
<div id="statusBar"></div>
|
|
111
|
+
<pre id="jsonOut" style="display:none"></pre>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<!-- ── HOW IT WORKS ── -->
|
|
115
|
+
<div class="card">
|
|
116
|
+
<h2>How it works</h2>
|
|
117
|
+
<div class="step"><div class="step-num">1</div><div class="step-body">Fetch WAB record template (<code>GET /api/discovery/provider/record-template</code>) for TXT value.</div></div>
|
|
118
|
+
<div class="step"><div class="step-num">2</div><div class="step-body">Look up existing <code>_wab</code> TXT in the managed zone (<code>GET …/managedZones/{zone}/rrsets</code>).</div></div>
|
|
119
|
+
<div class="step"><div class="step-num">3</div><div class="step-body">Cloud DNS uses atomic <strong>changes</strong>: <code>POST changes</code> with <code>{additions, deletions}</code>. Enable = add (+ delete old if value differs). Disable = delete.</div></div>
|
|
120
|
+
<div class="step"><div class="step-num">4</div><div class="step-body">Confirm via <code>/api/discovery/provider/status</code>. Cloud DNS propagation is typically < 60 s.</div></div>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<!-- ── CODE SNIPPETS ── -->
|
|
124
|
+
<div class="card">
|
|
125
|
+
<h2>Code Snippets</h2>
|
|
126
|
+
<div class="tab-bar">
|
|
127
|
+
<div class="tab active" onclick="switchTab('nodejs')">Node.js</div>
|
|
128
|
+
<div class="tab" onclick="switchTab('gcloud')">gcloud CLI</div>
|
|
129
|
+
<div class="tab" onclick="switchTab('tf')">Terraform</div>
|
|
130
|
+
</div>
|
|
131
|
+
<div id="tab-nodejs" class="tab-panel active">
|
|
132
|
+
<pre>// npm install @google-cloud/dns
|
|
133
|
+
const { DNS } = require('@google-cloud/dns');
|
|
134
|
+
const dns = new DNS({ projectId: 'my-gcp-project' });
|
|
135
|
+
|
|
136
|
+
const ZONE = 'example-com';
|
|
137
|
+
const DOMAIN = 'example.com';
|
|
138
|
+
const TXT_VAL = `"v=wab1; endpoint=https://${DOMAIN}/.well-known/wab.json"`;
|
|
139
|
+
|
|
140
|
+
const zone = dns.zone(ZONE);
|
|
141
|
+
const recordSet = zone.record('txt', { name: `_wab.${DOMAIN}.`, ttl: 3600, data: TXT_VAL });
|
|
142
|
+
|
|
143
|
+
async function enableWAB() {
|
|
144
|
+
// delete any existing _wab TXT then add new
|
|
145
|
+
const [records] = await zone.getRecords({ type: 'TXT', name: `_wab.${DOMAIN}.` });
|
|
146
|
+
if (records.length) {
|
|
147
|
+
await zone.deleteRecords(records);
|
|
148
|
+
}
|
|
149
|
+
await zone.addRecords([recordSet]);
|
|
150
|
+
console.log('WAB Discovery ENABLED');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async function disableWAB() {
|
|
154
|
+
const [records] = await zone.getRecords({ type: 'TXT', name: `_wab.${DOMAIN}.` });
|
|
155
|
+
if (!records.length) return console.log('Already disabled');
|
|
156
|
+
await zone.deleteRecords(records);
|
|
157
|
+
console.log('WAB Discovery DISABLED');
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
enableWAB().catch(console.error);
|
|
161
|
+
</pre>
|
|
162
|
+
</div>
|
|
163
|
+
<div id="tab-gcloud" class="tab-panel">
|
|
164
|
+
<pre># Enable: start a transaction, add record, execute
|
|
165
|
+
gcloud dns record-sets transaction start --zone=example-com
|
|
166
|
+
gcloud dns record-sets transaction add \
|
|
167
|
+
'"v=wab1; endpoint=https://example.com/.well-known/wab.json"' \
|
|
168
|
+
--name=_wab.example.com. --ttl=3600 --type=TXT --zone=example-com
|
|
169
|
+
gcloud dns record-sets transaction execute --zone=example-com
|
|
170
|
+
|
|
171
|
+
# Disable: remove the record
|
|
172
|
+
gcloud dns record-sets transaction start --zone=example-com
|
|
173
|
+
gcloud dns record-sets transaction remove \
|
|
174
|
+
'"v=wab1; endpoint=https://example.com/.well-known/wab.json"' \
|
|
175
|
+
--name=_wab.example.com. --ttl=3600 --type=TXT --zone=example-com
|
|
176
|
+
gcloud dns record-sets transaction execute --zone=example-com
|
|
177
|
+
</pre>
|
|
178
|
+
</div>
|
|
179
|
+
<div id="tab-tf" class="tab-panel">
|
|
180
|
+
<pre>resource "google_dns_record_set" "wab_discovery" {
|
|
181
|
+
managed_zone = "example-com"
|
|
182
|
+
name = "_wab.example.com."
|
|
183
|
+
type = "TXT"
|
|
184
|
+
ttl = 3600
|
|
185
|
+
rrdatas = ["\"v=wab1; endpoint=https://example.com/.well-known/wab.json\""]
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# Toggle: count = var.wab_enabled ? 1 : 0
|
|
189
|
+
</pre>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<!-- ── IAM ── -->
|
|
194
|
+
<div class="card">
|
|
195
|
+
<h2>Minimal IAM Role</h2>
|
|
196
|
+
<p style="font-size:.85rem;color:#94a3b8;margin:0 0 10px">
|
|
197
|
+
Use a custom role with these permissions on the managed zone:
|
|
198
|
+
</p>
|
|
199
|
+
<pre>dns.changes.create
|
|
200
|
+
dns.changes.get
|
|
201
|
+
dns.resourceRecordSets.list
|
|
202
|
+
dns.resourceRecordSets.create
|
|
203
|
+
dns.resourceRecordSets.delete</pre>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<p style="text-align:center;margin-top:30px;font-size:.85rem;color:#475569">
|
|
207
|
+
<a href="/provider-onboarding">← Provider Onboarding</a> ·
|
|
208
|
+
<a href="/cloudflare-integration">Cloudflare</a> ·
|
|
209
|
+
<a href="/cpanel-integration">cPanel</a> ·
|
|
210
|
+
<a href="/route53-integration">Route 53</a> ·
|
|
211
|
+
<a href="/plesk-integration">Plesk</a> ·
|
|
212
|
+
<a href="/dns">DNS Discovery</a>
|
|
213
|
+
</p>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<script>
|
|
217
|
+
function switchTab(name) {
|
|
218
|
+
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
|
219
|
+
document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active'));
|
|
220
|
+
document.querySelector(`#tab-${name}`).classList.add('active');
|
|
221
|
+
event.target.classList.add('active');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function setStatus(msg, type) { const b = document.getElementById('statusBar'); b.textContent = msg; b.className = type; }
|
|
225
|
+
function showJson(o) { const p = document.getElementById('jsonOut'); p.textContent = JSON.stringify(o, null, 2); p.style.display = 'block'; }
|
|
226
|
+
|
|
227
|
+
function getInputs() {
|
|
228
|
+
return {
|
|
229
|
+
token: document.getElementById('gcpToken').value.trim(),
|
|
230
|
+
project: document.getElementById('gcpProject').value.trim(),
|
|
231
|
+
zone: document.getElementById('gcpZone').value.trim(),
|
|
232
|
+
domain: document.getElementById('gcpDomain').value.trim().toLowerCase().replace(/^https?:\/\//, '').replace(/\/$/, ''),
|
|
233
|
+
ep: document.getElementById('gcpEndpoint').value.trim(),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async function gcpRequest(token, method, path, body) {
|
|
238
|
+
const r = await fetch(`https://dns.googleapis.com/dns/v1${path}`, {
|
|
239
|
+
method,
|
|
240
|
+
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
241
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
242
|
+
});
|
|
243
|
+
const j = await r.json().catch(() => ({}));
|
|
244
|
+
if (!r.ok) throw new Error(`Cloud DNS ${r.status}: ${j.error && j.error.message || JSON.stringify(j).slice(0, 300)}`);
|
|
245
|
+
return j;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async function gcpAction(action) {
|
|
249
|
+
const inp = getInputs();
|
|
250
|
+
if (!inp.token) return setStatus('Please paste an OAuth access token.', 'err');
|
|
251
|
+
if (!inp.project) return setStatus('Please enter the GCP Project ID.', 'err');
|
|
252
|
+
if (!inp.zone) return setStatus('Please enter the managed zone name.', 'err');
|
|
253
|
+
if (!inp.domain) return setStatus('Please enter the domain.', 'err');
|
|
254
|
+
|
|
255
|
+
document.getElementById('btnEnable').disabled = true;
|
|
256
|
+
document.getElementById('btnDisable').disabled = true;
|
|
257
|
+
try {
|
|
258
|
+
const ep = inp.ep || `https://${inp.domain}/.well-known/wab.json`;
|
|
259
|
+
setStatus('Fetching WAB record template…', 'info');
|
|
260
|
+
const tpl = await (await fetch(`/api/discovery/provider/record-template?domain=${encodeURIComponent(inp.domain)}&endpoint=${encodeURIComponent(ep)}`)).json();
|
|
261
|
+
const rawTxt = tpl.record && tpl.record.value;
|
|
262
|
+
if (!rawTxt) throw new Error('Could not fetch WAB record template.');
|
|
263
|
+
// Cloud DNS requires double-quoted TXT value
|
|
264
|
+
const txtVal = rawTxt.startsWith('"') ? rawTxt : `"${rawTxt}"`;
|
|
265
|
+
const fqdn = `_wab.${inp.domain}.`;
|
|
266
|
+
const base = `/projects/${inp.project}/managedZones/${inp.zone}`;
|
|
267
|
+
|
|
268
|
+
setStatus('Looking up existing _wab TXT records…', 'info');
|
|
269
|
+
const list = await gcpRequest(inp.token, 'GET', `${base}/rrsets?name=${encodeURIComponent(fqdn)}&type=TXT`);
|
|
270
|
+
const existing = (list.rrsets || [])[0] || null;
|
|
271
|
+
|
|
272
|
+
if (action === 'enable') {
|
|
273
|
+
const additions = [{ name: fqdn, type: 'TXT', ttl: 3600, rrdatas: [txtVal] }];
|
|
274
|
+
const change = { additions };
|
|
275
|
+
if (existing && existing.rrdatas && existing.rrdatas[0] === txtVal) {
|
|
276
|
+
setStatus(`Record already up-to-date for ${inp.domain}. WAB Discovery is ENABLED.`, 'ok');
|
|
277
|
+
showJson({ note: 'no change needed', existing });
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (existing) change.deletions = [existing];
|
|
281
|
+
setStatus(`Submitting change to Cloud DNS (${existing ? 'replace' : 'create'})…`, 'info');
|
|
282
|
+
const out = await gcpRequest(inp.token, 'POST', `${base}/changes`, change);
|
|
283
|
+
setStatus(`✓ _wab TXT ${existing ? 'updated' : 'created'} for ${inp.domain}. Change id=${out.id}, status=${out.status}.`, 'ok');
|
|
284
|
+
showJson(out);
|
|
285
|
+
} else {
|
|
286
|
+
if (!existing) {
|
|
287
|
+
setStatus(`No _wab TXT record found for ${inp.domain} — already disabled.`, 'ok');
|
|
288
|
+
showJson({ note: 'no record found' });
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
setStatus('Submitting delete change to Cloud DNS…', 'info');
|
|
292
|
+
const out = await gcpRequest(inp.token, 'POST', `${base}/changes`, { deletions: [existing] });
|
|
293
|
+
setStatus(`✓ _wab TXT deleted for ${inp.domain}. WAB Discovery is DISABLED.`, 'ok');
|
|
294
|
+
showJson(out);
|
|
295
|
+
}
|
|
296
|
+
} catch (err) {
|
|
297
|
+
setStatus(`Error: ${err.message}`, 'err');
|
|
298
|
+
} finally {
|
|
299
|
+
document.getElementById('btnEnable').disabled = false;
|
|
300
|
+
document.getElementById('btnDisable').disabled = false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async function gcpVerify() {
|
|
305
|
+
const { domain } = getInputs();
|
|
306
|
+
if (!domain) return setStatus('Please enter a domain.', 'err');
|
|
307
|
+
setStatus('Checking WAB status…', 'info');
|
|
308
|
+
try {
|
|
309
|
+
const j = await (await fetch(`/api/discovery/provider/status?domain=${encodeURIComponent(domain)}`)).json();
|
|
310
|
+
if (j.status === 'enabled') setStatus(`✓ ${domain} — ENABLED.`, 'ok');
|
|
311
|
+
else if (j.status === 'partial') setStatus(`⚠ ${domain} — partial.`, 'info');
|
|
312
|
+
else setStatus(`✗ ${domain} — DISABLED.`, 'err');
|
|
313
|
+
showJson(j);
|
|
314
|
+
} catch (err) { setStatus(`Verify error: ${err.message}`, 'err'); }
|
|
315
|
+
}
|
|
316
|
+
</script>
|
|
317
|
+
</body>
|
|
318
|
+
</html>
|