web-agent-bridge 3.0.0 → 3.3.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 +72 -21
- package/README.ar.md +1286 -1073
- package/README.md +1764 -1535
- package/bin/agent-runner.js +474 -474
- package/bin/cli.js +237 -138
- package/bin/wab.js +80 -80
- package/examples/bidi-agent.js +119 -119
- package/examples/cross-site-agent.js +91 -91
- package/examples/mcp-agent.js +94 -94
- package/examples/next-app-router/README.md +44 -44
- package/examples/puppeteer-agent.js +108 -108
- package/examples/saas-dashboard/README.md +55 -55
- package/examples/shopify-hydrogen/README.md +74 -74
- package/examples/vision-agent.js +171 -171
- package/examples/wordpress-elementor/README.md +77 -77
- package/package.json +17 -3
- package/public/.well-known/agent-tools.json +180 -180
- package/public/.well-known/ai-assets.json +59 -59
- package/public/.well-known/ai-plugin.json +28 -0
- package/public/.well-known/security.txt +8 -0
- package/public/agent-workspace.html +349 -347
- package/public/ai.html +198 -196
- package/public/api.html +413 -0
- package/public/browser.html +486 -484
- package/public/commander-dashboard.html +243 -243
- package/public/cookies.html +210 -208
- package/public/css/agent-workspace.css +1713 -1713
- package/public/css/premium.css +317 -317
- package/public/css/styles.css +1235 -1235
- package/public/dashboard.html +706 -704
- package/public/demo.html +1770 -1
- package/public/dns.html +507 -0
- package/public/docs.html +587 -585
- package/public/feed.xml +89 -89
- package/public/growth.html +463 -0
- package/public/index.html +341 -9
- package/public/integrations.html +556 -0
- package/public/js/agent-workspace.js +1740 -1740
- package/public/js/auth-nav.js +31 -31
- package/public/js/auth-redirect.js +12 -12
- package/public/js/cookie-consent.js +56 -56
- package/public/js/wab-demo-page.js +721 -721
- package/public/js/ws-client.js +74 -74
- package/public/llms-full.txt +360 -309
- package/public/llms.txt +125 -86
- package/public/login.html +85 -83
- package/public/mesh-dashboard.html +328 -328
- package/public/openapi.json +580 -580
- package/public/phone-shield.html +281 -0
- package/public/premium-dashboard.html +2489 -2487
- package/public/premium.html +793 -791
- package/public/privacy.html +297 -295
- package/public/register.html +105 -103
- package/public/robots.txt +87 -87
- 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/terms.html +256 -254
- package/script/ai-agent-bridge.js +1754 -1754
- package/sdk/README.md +99 -99
- package/sdk/agent-mesh.js +449 -449
- package/sdk/commander.js +262 -262
- package/sdk/index.d.ts +464 -464
- package/sdk/index.js +18 -1
- package/sdk/multi-agent.js +318 -318
- package/sdk/package.json +12 -1
- 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 +175 -19
- 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/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 +681 -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-premium.js +671 -671
- package/server/routes/admin.js +261 -261
- package/server/routes/ads.js +130 -130
- package/server/routes/agent-workspace.js +540 -378
- package/server/routes/api.js +150 -150
- package/server/routes/auth.js +71 -71
- package/server/routes/billing.js +45 -45
- package/server/routes/commander.js +316 -316
- package/server/routes/demo-showcase.js +332 -0
- package/server/routes/demo-store.js +154 -0
- package/server/routes/discovery.js +417 -406
- package/server/routes/gateway.js +173 -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/premium-v2.js +686 -686
- package/server/routes/premium.js +724 -724
- package/server/routes/runtime.js +2148 -2147
- package/server/routes/sovereign.js +465 -385
- package/server/routes/universal.js +200 -177
- package/server/routes/wab-api.js +850 -491
- 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 -0
- 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 +204 -204
- package/server/services/hosted-runtime.js +205 -205
- package/server/services/lfd.js +635 -616
- 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 -0
- package/server/services/modules/agent-firewall.js +90 -0
- package/server/services/modules/bounty.js +89 -0
- package/server/services/modules/collective-bargaining.js +92 -0
- package/server/services/modules/dark-pattern.js +66 -0
- package/server/services/modules/gov-intelligence.js +45 -0
- package/server/services/modules/neural.js +55 -0
- package/server/services/modules/notary.js +49 -0
- package/server/services/modules/price-time-machine.js +86 -0
- package/server/services/modules/protocol.js +104 -0
- package/server/services/negotiation.js +439 -439
- package/server/services/plugins.js +771 -771
- package/server/services/premium.js +1 -1
- package/server/services/price-intelligence.js +566 -565
- package/server/services/price-shield.js +1137 -1137
- 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/sovereign-shield.js +542 -0
- package/server/services/stripe.js +192 -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/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/server/services/fairness-engine.js +0 -409
- package/server/services/fairness.js +0 -420
package/bin/cli.js
CHANGED
|
@@ -1,138 +1,237 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Web Agent Bridge CLI
|
|
5
|
-
* Usage: npx web-agent-bridge [command]
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
|
|
11
|
-
const args = process.argv.slice(2);
|
|
12
|
-
const command = args[0] || 'start';
|
|
13
|
-
|
|
14
|
-
function printHelp() {
|
|
15
|
-
console.log(`
|
|
16
|
-
Web Agent Bridge CLI
|
|
17
|
-
|
|
18
|
-
Usage:
|
|
19
|
-
npx web-agent-bridge <command> [options]
|
|
20
|
-
|
|
21
|
-
Commands:
|
|
22
|
-
start Start the WAB server (default)
|
|
23
|
-
init
|
|
24
|
-
run <file> Run an agent template (YAML)
|
|
25
|
-
templates List available agent templates
|
|
26
|
-
help Show this help message
|
|
27
|
-
|
|
28
|
-
Options:
|
|
29
|
-
--port, -p
|
|
30
|
-
--server
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
npx wab
|
|
37
|
-
npx wab
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
console.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (!
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Web Agent Bridge CLI
|
|
5
|
+
* Usage: npx web-agent-bridge [command]
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0] || 'start';
|
|
13
|
+
|
|
14
|
+
function printHelp() {
|
|
15
|
+
console.log(`
|
|
16
|
+
Web Agent Bridge CLI
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
npx web-agent-bridge <command> [options]
|
|
20
|
+
|
|
21
|
+
Commands:
|
|
22
|
+
start Start the WAB server (default)
|
|
23
|
+
init Make this site AI-discoverable — scaffold wab.json + security.txt + .env, print DNS records
|
|
24
|
+
run <file> Run an agent template (YAML)
|
|
25
|
+
templates List available agent templates
|
|
26
|
+
help Show this help message
|
|
27
|
+
|
|
28
|
+
Options:
|
|
29
|
+
--port, -p Set server port (default: 3000)
|
|
30
|
+
--server WAB server URL (for agent templates)
|
|
31
|
+
--site <url> Canonical site URL for 'init' (default: from package.json or localhost)
|
|
32
|
+
--env-only 'init' skips wab.json, only creates .env
|
|
33
|
+
--force 'init' overwrites existing wab.json
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
npx wab init # make this site AI-discoverable
|
|
37
|
+
npx wab init --site https://example.com # explicit site URL
|
|
38
|
+
npx wab start
|
|
39
|
+
npx wab start --port 4000
|
|
40
|
+
npx wab-agent run olive-oil-tunisia.yaml
|
|
41
|
+
npx wab-agent templates
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
switch (command) {
|
|
46
|
+
case 'start': {
|
|
47
|
+
const portIdx = args.indexOf('--port') !== -1 ? args.indexOf('--port') : args.indexOf('-p');
|
|
48
|
+
if (portIdx !== -1 && args[portIdx + 1]) {
|
|
49
|
+
process.env.PORT = args[portIdx + 1];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
53
|
+
if (fs.existsSync(envPath)) {
|
|
54
|
+
require('dotenv').config({ path: envPath });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
require('../server/index.js');
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
case 'init': {
|
|
62
|
+
// `npx wab init` — make this site AI-discoverable in 5 minutes.
|
|
63
|
+
// Scaffolds:
|
|
64
|
+
// 1. ./.well-known/wab.json (the discovery contract)
|
|
65
|
+
// 2. ./.well-known/security.txt (RFC 9116, helpful default)
|
|
66
|
+
// 3. .env (server config, only if missing)
|
|
67
|
+
// 4. Prints the exact DNS records to paste at the registrar.
|
|
68
|
+
// Flags:
|
|
69
|
+
// --site <url> Canonical site URL (default: detect or http://localhost:3000)
|
|
70
|
+
// --env-only Only create .env, skip discovery scaffolding
|
|
71
|
+
// --force Overwrite existing wab.json
|
|
72
|
+
const flags = {};
|
|
73
|
+
for (let i = 1; i < args.length; i++) {
|
|
74
|
+
if (args[i] === '--env-only') flags.envOnly = true;
|
|
75
|
+
else if (args[i] === '--force') flags.force = true;
|
|
76
|
+
else if (args[i] === '--site' && args[i + 1]) { flags.site = args[i + 1]; i++; }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const cwd = process.cwd();
|
|
80
|
+
const envExample = path.join(__dirname, '..', '.env.example');
|
|
81
|
+
const envTarget = path.join(cwd, '.env');
|
|
82
|
+
|
|
83
|
+
// Always handle .env
|
|
84
|
+
if (fs.existsSync(envTarget)) {
|
|
85
|
+
console.log(' ✓ .env already exists');
|
|
86
|
+
} else if (fs.existsSync(envExample)) {
|
|
87
|
+
fs.copyFileSync(envExample, envTarget);
|
|
88
|
+
console.log(' ✓ Created .env from template');
|
|
89
|
+
} else {
|
|
90
|
+
const defaultEnv = 'PORT=3000\nJWT_SECRET=change-this-to-a-strong-random-secret-in-production\nNODE_ENV=development\n';
|
|
91
|
+
fs.writeFileSync(envTarget, defaultEnv);
|
|
92
|
+
console.log(' ✓ Created default .env');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (flags.envOnly) break;
|
|
96
|
+
|
|
97
|
+
// Detect site URL
|
|
98
|
+
let site = flags.site;
|
|
99
|
+
if (!site) {
|
|
100
|
+
try {
|
|
101
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
|
|
102
|
+
site = pkg.homepage || (pkg.repository && pkg.repository.url) || '';
|
|
103
|
+
if (site && !/^https?:\/\//.test(site)) site = '';
|
|
104
|
+
} catch { /* no pkg */ }
|
|
105
|
+
}
|
|
106
|
+
if (!site) site = 'http://localhost:3000';
|
|
107
|
+
site = site.replace(/\/$/, '');
|
|
108
|
+
|
|
109
|
+
let host = site;
|
|
110
|
+
try { host = new URL(site).hostname; } catch { /* keep as-is */ }
|
|
111
|
+
const apex = host.replace(/^www\./, '').split('.').slice(-2).join('.') || host;
|
|
112
|
+
|
|
113
|
+
// 1. wab.json scaffold
|
|
114
|
+
const wabDir = path.join(cwd, '.well-known');
|
|
115
|
+
const wabFile = path.join(wabDir, 'wab.json');
|
|
116
|
+
if (!fs.existsSync(wabFile) || flags.force) {
|
|
117
|
+
if (!fs.existsSync(wabDir)) fs.mkdirSync(wabDir, { recursive: true });
|
|
118
|
+
const wabJson = {
|
|
119
|
+
version: '1.0',
|
|
120
|
+
protocol: 'wab',
|
|
121
|
+
site: site,
|
|
122
|
+
endpoints: {
|
|
123
|
+
discover: site + '/.well-known/wab.json',
|
|
124
|
+
api: site + '/api/wab',
|
|
125
|
+
actions: site + '/api/wab/actions'
|
|
126
|
+
},
|
|
127
|
+
capabilities: ['readContent', 'click', 'scroll', 'extractData'],
|
|
128
|
+
permissions: { fillForms: false, automatedLogin: false, navigate: false },
|
|
129
|
+
rate_limit: { requests_per_minute: 60 },
|
|
130
|
+
contact: { security: site + '/.well-known/security.txt' },
|
|
131
|
+
ai_friendly: true,
|
|
132
|
+
generated_by: 'npx wab init',
|
|
133
|
+
generated_at: new Date().toISOString()
|
|
134
|
+
};
|
|
135
|
+
fs.writeFileSync(wabFile, JSON.stringify(wabJson, null, 2));
|
|
136
|
+
console.log(' ✓ Created .well-known/wab.json');
|
|
137
|
+
} else {
|
|
138
|
+
console.log(' ✓ .well-known/wab.json already exists (use --force to overwrite)');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 2. security.txt scaffold (only if missing)
|
|
142
|
+
const secFile = path.join(wabDir, 'security.txt');
|
|
143
|
+
if (!fs.existsSync(secFile)) {
|
|
144
|
+
const expires = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString();
|
|
145
|
+
const sec =
|
|
146
|
+
'Contact: mailto:security@' + apex + '\n' +
|
|
147
|
+
'Expires: ' + expires + '\n' +
|
|
148
|
+
'Preferred-Languages: en, ar\n' +
|
|
149
|
+
'Canonical: ' + site + '/.well-known/security.txt\n';
|
|
150
|
+
fs.writeFileSync(secFile, sec);
|
|
151
|
+
console.log(' ✓ Created .well-known/security.txt');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 3. Print DNS records
|
|
155
|
+
console.log('');
|
|
156
|
+
console.log(' ───────────────────────────────────────────────────────────');
|
|
157
|
+
console.log(' Make your site AI-discoverable — paste these at your DNS panel:');
|
|
158
|
+
console.log(' ───────────────────────────────────────────────────────────');
|
|
159
|
+
console.log('');
|
|
160
|
+
console.log(' Type Name Value');
|
|
161
|
+
console.log(' ──── ───────────── ──────────────────────────────────────────────');
|
|
162
|
+
console.log(' TXT _wab v=wab1; endpoint=' + site + '/.well-known/wab.json');
|
|
163
|
+
console.log(' TXT _wab-trust trust=' + site + '/trust.json; security=' + site + '/.well-known/security.txt');
|
|
164
|
+
console.log(' TXT _wab-agent agent=' + site + '/agent-bridge.json; ver=2');
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log(' Apex domain detected: ' + apex);
|
|
167
|
+
console.log(' Verify after propagation: https://webagentbridge.com/dns#verifier');
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log(' ✓ Done. Your site speaks WAB. Run `npx wab start` to launch the local server.');
|
|
170
|
+
console.log('');
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
case 'help':
|
|
175
|
+
case '--help':
|
|
176
|
+
case '-h':
|
|
177
|
+
printHelp();
|
|
178
|
+
break;
|
|
179
|
+
|
|
180
|
+
case 'run': {
|
|
181
|
+
const templateArg = args[1];
|
|
182
|
+
if (!templateArg) {
|
|
183
|
+
console.error(' Error: Please specify a template file.');
|
|
184
|
+
console.error(' Usage: npx wab-agent run <template.yaml> [--param value ...]');
|
|
185
|
+
console.error(' Run "npx wab-agent templates" to see available templates.');
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
const runner = require('./agent-runner');
|
|
189
|
+
const cliParams = {};
|
|
190
|
+
for (let i = 2; i < args.length; i++) {
|
|
191
|
+
if (args[i].startsWith('--') && args[i + 1] && !args[i + 1].startsWith('--')) {
|
|
192
|
+
cliParams[args[i].slice(2)] = args[i + 1];
|
|
193
|
+
i++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
runner.run(templateArg, cliParams).catch(function(err) {
|
|
197
|
+
console.error(' Agent error:', err.message);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
});
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
case 'templates': {
|
|
204
|
+
const templatesDir = path.join(__dirname, '..', 'templates');
|
|
205
|
+
if (!fs.existsSync(templatesDir)) {
|
|
206
|
+
console.log(' No templates directory found.');
|
|
207
|
+
process.exit(0);
|
|
208
|
+
}
|
|
209
|
+
const files = fs.readdirSync(templatesDir).filter(function(f) { return f.endsWith('.yaml') || f.endsWith('.yml'); });
|
|
210
|
+
if (files.length === 0) {
|
|
211
|
+
console.log(' No templates found.');
|
|
212
|
+
process.exit(0);
|
|
213
|
+
}
|
|
214
|
+
console.log('\n Available Agent Templates:\n');
|
|
215
|
+
console.log(' ' + '─'.repeat(70));
|
|
216
|
+
for (const file of files) {
|
|
217
|
+
try {
|
|
218
|
+
const content = fs.readFileSync(path.join(templatesDir, file), 'utf8');
|
|
219
|
+
const nameMatch = content.match(/^name:\s*(.+)$/m);
|
|
220
|
+
const descMatch = content.match(/^description:\s*(.+)$/m);
|
|
221
|
+
const name = nameMatch ? nameMatch[1].trim() : file.replace(/\.ya?ml$/, '');
|
|
222
|
+
const desc = descMatch ? descMatch[1].trim() : '';
|
|
223
|
+
console.log(` ${name.padEnd(30)} ${desc.slice(0, 50)}`);
|
|
224
|
+
} catch(e) {
|
|
225
|
+
console.log(` ${file}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
console.log(' ' + '─'.repeat(70));
|
|
229
|
+
console.log(`\n Run: npx wab-agent run <template-name>.yaml\n`);
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
default:
|
|
234
|
+
console.error(` Unknown command: ${command}`);
|
|
235
|
+
printHelp();
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
package/bin/wab.js
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Web Agent Bridge CLI
|
|
5
|
-
* Usage: npx web-agent-bridge [command]
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
|
|
11
|
-
const args = process.argv.slice(2);
|
|
12
|
-
const command = args[0] || 'start';
|
|
13
|
-
|
|
14
|
-
function printHelp() {
|
|
15
|
-
console.log(`
|
|
16
|
-
Web Agent Bridge CLI
|
|
17
|
-
|
|
18
|
-
Usage:
|
|
19
|
-
npx web-agent-bridge <command> [options]
|
|
20
|
-
|
|
21
|
-
Commands:
|
|
22
|
-
start Start the WAB server (default)
|
|
23
|
-
init Create .env file from template
|
|
24
|
-
help Show this help message
|
|
25
|
-
|
|
26
|
-
Options:
|
|
27
|
-
--port, -p Set server port (default: 3000)
|
|
28
|
-
|
|
29
|
-
Examples:
|
|
30
|
-
npx web-agent-bridge start
|
|
31
|
-
npx web-agent-bridge start --port 4000
|
|
32
|
-
npx web-agent-bridge init
|
|
33
|
-
`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
switch (command) {
|
|
37
|
-
case 'start': {
|
|
38
|
-
const portIdx = args.indexOf('--port') !== -1 ? args.indexOf('--port') : args.indexOf('-p');
|
|
39
|
-
if (portIdx !== -1 && args[portIdx + 1]) {
|
|
40
|
-
process.env.PORT = args[portIdx + 1];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const envPath = path.join(process.cwd(), '.env');
|
|
44
|
-
if (fs.existsSync(envPath)) {
|
|
45
|
-
require('dotenv').config({ path: envPath });
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
require('../server/index.js');
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
case 'init': {
|
|
53
|
-
const envExample = path.join(__dirname, '..', '.env.example');
|
|
54
|
-
const envTarget = path.join(process.cwd(), '.env');
|
|
55
|
-
|
|
56
|
-
if (fs.existsSync(envTarget)) {
|
|
57
|
-
console.log(' .env file already exists. Skipping.');
|
|
58
|
-
} else if (fs.existsSync(envExample)) {
|
|
59
|
-
fs.copyFileSync(envExample, envTarget);
|
|
60
|
-
console.log(' Created .env file from template.');
|
|
61
|
-
console.log(' Edit .env to set your JWT_SECRET before starting.');
|
|
62
|
-
} else {
|
|
63
|
-
const defaultEnv = 'PORT=3000\nJWT_SECRET=change-this-to-a-strong-random-secret-in-production\nNODE_ENV=development\n';
|
|
64
|
-
fs.writeFileSync(envTarget, defaultEnv);
|
|
65
|
-
console.log(' Created default .env file.');
|
|
66
|
-
}
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
case 'help':
|
|
71
|
-
case '--help':
|
|
72
|
-
case '-h':
|
|
73
|
-
printHelp();
|
|
74
|
-
break;
|
|
75
|
-
|
|
76
|
-
default:
|
|
77
|
-
console.error(` Unknown command: ${command}`);
|
|
78
|
-
printHelp();
|
|
79
|
-
process.exit(1);
|
|
80
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Web Agent Bridge CLI
|
|
5
|
+
* Usage: npx web-agent-bridge [command]
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0] || 'start';
|
|
13
|
+
|
|
14
|
+
function printHelp() {
|
|
15
|
+
console.log(`
|
|
16
|
+
Web Agent Bridge CLI
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
npx web-agent-bridge <command> [options]
|
|
20
|
+
|
|
21
|
+
Commands:
|
|
22
|
+
start Start the WAB server (default)
|
|
23
|
+
init Create .env file from template
|
|
24
|
+
help Show this help message
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--port, -p Set server port (default: 3000)
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
npx web-agent-bridge start
|
|
31
|
+
npx web-agent-bridge start --port 4000
|
|
32
|
+
npx web-agent-bridge init
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
switch (command) {
|
|
37
|
+
case 'start': {
|
|
38
|
+
const portIdx = args.indexOf('--port') !== -1 ? args.indexOf('--port') : args.indexOf('-p');
|
|
39
|
+
if (portIdx !== -1 && args[portIdx + 1]) {
|
|
40
|
+
process.env.PORT = args[portIdx + 1];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
44
|
+
if (fs.existsSync(envPath)) {
|
|
45
|
+
require('dotenv').config({ path: envPath });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
require('../server/index.js');
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
case 'init': {
|
|
53
|
+
const envExample = path.join(__dirname, '..', '.env.example');
|
|
54
|
+
const envTarget = path.join(process.cwd(), '.env');
|
|
55
|
+
|
|
56
|
+
if (fs.existsSync(envTarget)) {
|
|
57
|
+
console.log(' .env file already exists. Skipping.');
|
|
58
|
+
} else if (fs.existsSync(envExample)) {
|
|
59
|
+
fs.copyFileSync(envExample, envTarget);
|
|
60
|
+
console.log(' Created .env file from template.');
|
|
61
|
+
console.log(' Edit .env to set your JWT_SECRET before starting.');
|
|
62
|
+
} else {
|
|
63
|
+
const defaultEnv = 'PORT=3000\nJWT_SECRET=change-this-to-a-strong-random-secret-in-production\nNODE_ENV=development\n';
|
|
64
|
+
fs.writeFileSync(envTarget, defaultEnv);
|
|
65
|
+
console.log(' Created default .env file.');
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
case 'help':
|
|
71
|
+
case '--help':
|
|
72
|
+
case '-h':
|
|
73
|
+
printHelp();
|
|
74
|
+
break;
|
|
75
|
+
|
|
76
|
+
default:
|
|
77
|
+
console.error(` Unknown command: ${command}`);
|
|
78
|
+
printHelp();
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|