web-agent-bridge 2.3.0 → 2.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.
Files changed (66) hide show
  1. package/README.ar.md +506 -31
  2. package/README.md +574 -47
  3. package/bin/agent-runner.js +10 -1
  4. package/package.json +12 -4
  5. package/public/agent-workspace.html +347 -0
  6. package/public/browser.html +484 -0
  7. package/public/commander-dashboard.html +243 -0
  8. package/public/css/agent-workspace.css +1713 -0
  9. package/public/css/premium.css +317 -317
  10. package/public/demo.html +259 -259
  11. package/public/index.html +738 -644
  12. package/public/js/agent-workspace.js +1740 -0
  13. package/public/mesh-dashboard.html +309 -382
  14. package/public/premium-dashboard.html +2487 -2487
  15. package/public/premium.html +791 -791
  16. package/public/script/wab.min.js +124 -87
  17. package/script/ai-agent-bridge.js +154 -84
  18. package/sdk/agent-mesh.js +287 -171
  19. package/sdk/commander.js +262 -0
  20. package/sdk/index.d.ts +83 -0
  21. package/sdk/index.js +374 -260
  22. package/sdk/package.json +1 -1
  23. package/server/config/secrets.js +13 -5
  24. package/server/index.js +191 -5
  25. package/server/middleware/adminAuth.js +6 -1
  26. package/server/middleware/auth.js +11 -2
  27. package/server/middleware/rateLimits.js +78 -2
  28. package/server/migrations/002_premium_features.sql +418 -418
  29. package/server/migrations/003_ads_integer_cents.sql +33 -0
  30. package/server/models/db.js +121 -1
  31. package/server/routes/admin-premium.js +671 -671
  32. package/server/routes/admin.js +16 -2
  33. package/server/routes/ads.js +130 -0
  34. package/server/routes/agent-workspace.js +378 -0
  35. package/server/routes/api.js +21 -2
  36. package/server/routes/auth.js +26 -6
  37. package/server/routes/commander.js +316 -0
  38. package/server/routes/mesh.js +370 -201
  39. package/server/routes/premium-v2.js +686 -686
  40. package/server/routes/premium.js +724 -724
  41. package/server/routes/sovereign.js +78 -0
  42. package/server/routes/universal.js +177 -0
  43. package/server/routes/wab-api.js +20 -5
  44. package/server/services/agent-chat.js +506 -0
  45. package/server/services/agent-learning.js +230 -77
  46. package/server/services/agent-memory.js +625 -625
  47. package/server/services/agent-mesh.js +260 -67
  48. package/server/services/agent-symphony.js +553 -517
  49. package/server/services/agent-tasks.js +1807 -0
  50. package/server/services/commander.js +738 -0
  51. package/server/services/edge-compute.js +440 -0
  52. package/server/services/fairness-engine.js +409 -0
  53. package/server/services/local-ai.js +389 -0
  54. package/server/services/plugins.js +771 -747
  55. package/server/services/price-intelligence.js +565 -0
  56. package/server/services/price-shield.js +1137 -0
  57. package/server/services/search-engine.js +357 -0
  58. package/server/services/security.js +513 -0
  59. package/server/services/self-healing.js +843 -843
  60. package/server/services/swarm.js +788 -788
  61. package/server/services/universal-scraper.js +661 -0
  62. package/server/services/vision.js +871 -871
  63. package/server/ws.js +61 -1
  64. package/public/admin/dashboard.html +0 -848
  65. package/public/admin/login.html +0 -84
  66. package/public/video/tutorial.mp4 +0 -0
@@ -0,0 +1,33 @@
1
+ -- Migration 003: Convert ads financial columns from REAL to INTEGER (cents)
2
+ -- This avoids floating-point precision issues in billing calculations.
3
+ --
4
+ -- NOTE: The wab_ads table in db.js now creates with INTEGER columns directly.
5
+ -- This migration only matters for databases created before this change.
6
+ -- On fresh databases, db.js already has the correct schema, so this is a no-op.
7
+ -- On existing databases, this migration was already applied.
8
+
9
+ -- Ensure the table and index exist (idempotent)
10
+ CREATE TABLE IF NOT EXISTS wab_ads (
11
+ id TEXT PRIMARY KEY,
12
+ title TEXT NOT NULL,
13
+ description TEXT,
14
+ image_url TEXT,
15
+ target_url TEXT NOT NULL,
16
+ advertiser_name TEXT NOT NULL,
17
+ advertiser_email TEXT NOT NULL,
18
+ status TEXT DEFAULT 'pending' CHECK(status IN ('pending','approved','rejected','paused','expired')),
19
+ position TEXT DEFAULT 'new-tab' CHECK(position IN ('new-tab','sidebar','search')),
20
+ budget_cents INTEGER DEFAULT 0,
21
+ spent_cents INTEGER DEFAULT 0,
22
+ cpc_cents INTEGER DEFAULT 5,
23
+ cpi_cents INTEGER DEFAULT 1,
24
+ impressions INTEGER DEFAULT 0,
25
+ clicks INTEGER DEFAULT 0,
26
+ created_at TEXT DEFAULT (datetime('now')),
27
+ approved_by TEXT,
28
+ approved_at TEXT,
29
+ expires_at TEXT,
30
+ FOREIGN KEY (approved_by) REFERENCES admins(id)
31
+ );
32
+
33
+ CREATE INDEX IF NOT EXISTS idx_wab_ads_status ON wab_ads(status);
@@ -168,6 +168,43 @@ db.exec(`
168
168
  CREATE INDEX IF NOT EXISTS idx_stripe_subs_user ON stripe_subscriptions(user_id);
169
169
  CREATE INDEX IF NOT EXISTS idx_payments_user ON payments(user_id);
170
170
  CREATE INDEX IF NOT EXISTS idx_notifications_user ON notifications_log(user_id);
171
+
172
+ CREATE TABLE IF NOT EXISTS wab_ads (
173
+ id TEXT PRIMARY KEY,
174
+ title TEXT NOT NULL,
175
+ description TEXT,
176
+ image_url TEXT,
177
+ target_url TEXT NOT NULL,
178
+ advertiser_name TEXT NOT NULL,
179
+ advertiser_email TEXT NOT NULL,
180
+ status TEXT DEFAULT 'pending' CHECK(status IN ('pending','approved','rejected','paused','expired')),
181
+ position TEXT DEFAULT 'new-tab' CHECK(position IN ('new-tab','sidebar','search')),
182
+ budget_cents INTEGER DEFAULT 0,
183
+ spent_cents INTEGER DEFAULT 0,
184
+ cpc_cents INTEGER DEFAULT 5,
185
+ cpi_cents INTEGER DEFAULT 1,
186
+ impressions INTEGER DEFAULT 0,
187
+ clicks INTEGER DEFAULT 0,
188
+ created_at TEXT DEFAULT (datetime('now')),
189
+ approved_by TEXT,
190
+ approved_at TEXT,
191
+ expires_at TEXT,
192
+ FOREIGN KEY (approved_by) REFERENCES admins(id)
193
+ );
194
+
195
+ CREATE TABLE IF NOT EXISTS ad_events (
196
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
197
+ ad_id TEXT NOT NULL,
198
+ event_type TEXT NOT NULL CHECK(event_type IN ('impression','click')),
199
+ platform TEXT DEFAULT 'browser',
200
+ ip_hash TEXT,
201
+ created_at TEXT DEFAULT (datetime('now')),
202
+ FOREIGN KEY (ad_id) REFERENCES wab_ads(id) ON DELETE CASCADE
203
+ );
204
+
205
+ CREATE INDEX IF NOT EXISTS idx_wab_ads_status ON wab_ads(status);
206
+ CREATE INDEX IF NOT EXISTS idx_ad_events_ad ON ad_events(ad_id);
207
+ CREATE INDEX IF NOT EXISTS idx_ad_events_created ON ad_events(created_at);
171
208
  `);
172
209
 
173
210
  function generateLicenseKey() {
@@ -218,6 +255,7 @@ const findSitesByUser = db.prepare(`SELECT * FROM sites WHERE user_id = ? ORDER
218
255
  const findSiteById = db.prepare(`SELECT * FROM sites WHERE id = ?`);
219
256
  const findSiteByLicense = db.prepare(`SELECT * FROM sites WHERE license_key = ? AND active = 1`);
220
257
  const findSiteByDomainAndLicense = db.prepare(`SELECT * FROM sites WHERE domain = ? AND license_key = ? AND active = 1`);
258
+ const findSiteByDomain = db.prepare(`SELECT * FROM sites WHERE domain = ? AND active = 1 LIMIT 1`);
221
259
  const updateSiteConfig = db.prepare(`UPDATE sites SET config = ?, updated_at = datetime('now') WHERE id = ? AND user_id = ?`);
222
260
  const updateSiteTier = db.prepare(`UPDATE sites SET tier = ?, updated_at = datetime('now') WHERE id = ? AND user_id = ?`);
223
261
  const deleteSite = db.prepare(`UPDATE sites SET active = 0, updated_at = datetime('now') WHERE id = ? AND user_id = ?`);
@@ -506,6 +544,77 @@ function setPlatformSetting(key, value) {
506
544
  db.prepare(`INSERT OR REPLACE INTO platform_settings (key, value, updated_at) VALUES (?, ?, datetime('now'))`).run(key, value);
507
545
  }
508
546
 
547
+ // ─── Ads Operations ──────────────────────────────────────────────────
548
+ function submitAd({ title, description, imageUrl, targetUrl, advertiserName, advertiserEmail, position, budgetCents, cpcCents, cpiCents, expiresAt }) {
549
+ const id = uuidv4();
550
+ db.prepare(`INSERT INTO wab_ads (id, title, description, image_url, target_url, advertiser_name, advertiser_email, position, budget_cents, cpc_cents, cpi_cents, expires_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, title, description || '', imageUrl || '', targetUrl, advertiserName, advertiserEmail, position || 'new-tab', budgetCents || 0, cpcCents || 5, cpiCents || 1, expiresAt || null);
551
+ return { id, title, advertiserName, status: 'pending' };
552
+ }
553
+
554
+ function getActiveAds(position) {
555
+ let q = `SELECT id, title, description, image_url, target_url, advertiser_name, position FROM wab_ads WHERE status = 'approved' AND (expires_at IS NULL OR expires_at > datetime('now')) AND (budget_cents <= 0 OR spent_cents < budget_cents)`;
556
+ const params = [];
557
+ if (position) { q += ` AND position = ?`; params.push(position); }
558
+ q += ` ORDER BY created_at DESC LIMIT 10`;
559
+ return db.prepare(q).all(...params);
560
+ }
561
+
562
+ function getAllAds() {
563
+ return db.prepare(`SELECT * FROM wab_ads ORDER BY created_at DESC`).all();
564
+ }
565
+
566
+ function getPendingAds() {
567
+ return db.prepare(`SELECT * FROM wab_ads WHERE status = 'pending' ORDER BY created_at ASC`).all();
568
+ }
569
+
570
+ function getAdById(id) {
571
+ return db.prepare(`SELECT * FROM wab_ads WHERE id = ?`).get(id);
572
+ }
573
+
574
+ function updateAdStatus(id, status, adminId) {
575
+ const sets = ['status = ?'];
576
+ const params = [status];
577
+ if (status === 'approved') {
578
+ sets.push('approved_by = ?', 'approved_at = datetime(\'now\')');
579
+ params.push(adminId);
580
+ }
581
+ params.push(id);
582
+ db.prepare(`UPDATE wab_ads SET ${sets.join(', ')} WHERE id = ?`).run(...params);
583
+ }
584
+
585
+ function deleteAd(id) {
586
+ db.prepare(`DELETE FROM ad_events WHERE ad_id = ?`).run(id);
587
+ db.prepare(`DELETE FROM wab_ads WHERE id = ?`).run(id);
588
+ }
589
+
590
+ function recordAdEvent(adId, eventType, ipHash) {
591
+ // Deduplicate: skip if same ip+ad+event in last 60s
592
+ const recent = db.prepare(`SELECT 1 FROM ad_events WHERE ad_id = ? AND event_type = ? AND ip_hash = ? AND created_at > datetime('now', '-60 seconds') LIMIT 1`).get(adId, eventType, ipHash || '');
593
+ if (recent) return;
594
+ db.prepare(`INSERT INTO ad_events (ad_id, event_type, ip_hash) VALUES (?, ?, ?)`).run(adId, eventType, ipHash || null);
595
+ if (eventType === 'click') {
596
+ const ad = db.prepare(`SELECT cpc_cents FROM wab_ads WHERE id = ?`).get(adId);
597
+ if (ad) {
598
+ db.prepare(`UPDATE wab_ads SET clicks = clicks + 1, spent_cents = spent_cents + ? WHERE id = ?`).run(ad.cpc_cents, adId);
599
+ }
600
+ } else {
601
+ const ad = db.prepare(`SELECT cpi_cents FROM wab_ads WHERE id = ?`).get(adId);
602
+ if (ad) {
603
+ db.prepare(`UPDATE wab_ads SET impressions = impressions + 1, spent_cents = spent_cents + ? WHERE id = ?`).run(ad.cpi_cents, adId);
604
+ }
605
+ }
606
+ }
607
+
608
+ function getAdStats() {
609
+ const total = db.prepare(`SELECT COUNT(*) as c FROM wab_ads`).get().c;
610
+ const pending = db.prepare(`SELECT COUNT(*) as c FROM wab_ads WHERE status = 'pending'`).get().c;
611
+ const approved = db.prepare(`SELECT COUNT(*) as c FROM wab_ads WHERE status = 'approved'`).get().c;
612
+ const totalImpressions = db.prepare(`SELECT COALESCE(SUM(impressions), 0) as c FROM wab_ads`).get().c;
613
+ const totalClicks = db.prepare(`SELECT COALESCE(SUM(clicks), 0) as c FROM wab_ads`).get().c;
614
+ const totalRevenueCents = db.prepare(`SELECT COALESCE(SUM(spent_cents), 0) as c FROM wab_ads`).get().c;
615
+ return { total, pending, approved, totalImpressions, totalClicks, totalRevenueCents };
616
+ }
617
+
509
618
  module.exports = {
510
619
  db,
511
620
  registerUser,
@@ -516,6 +625,7 @@ module.exports = {
516
625
  findSitesByUser,
517
626
  findSiteById,
518
627
  findSiteByLicense,
628
+ findSiteByDomain,
519
629
  updateSiteConfig,
520
630
  updateSiteTier,
521
631
  deleteSite,
@@ -557,5 +667,15 @@ module.exports = {
557
667
  getNotificationLogs,
558
668
  // Platform
559
669
  getPlatformSetting,
560
- setPlatformSetting
670
+ setPlatformSetting,
671
+ // Ads
672
+ submitAd,
673
+ getActiveAds,
674
+ getAllAds,
675
+ getPendingAds,
676
+ getAdById,
677
+ updateAdStatus,
678
+ deleteAd,
679
+ recordAdEvent,
680
+ getAdStats
561
681
  };