@the_ro_show/agent-ads-sdk 0.17.0 → 0.18.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/dist/index.js CHANGED
@@ -21,10 +21,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  APIRequestError: () => APIRequestError,
24
+ AdvertiserClient: () => AdvertiserClient,
24
25
  AttentionMarketClient: () => AttentionMarketClient,
25
26
  AttentionMarketError: () => AttentionMarketError,
27
+ DeveloperClient: () => DeveloperClient,
26
28
  MockAttentionMarketClient: () => MockAttentionMarketClient,
27
29
  NetworkError: () => NetworkError,
30
+ SessionClient: () => SessionClient,
28
31
  TimeoutError: () => TimeoutError,
29
32
  buildTaxonomy: () => buildTaxonomy,
30
33
  createImpressionEvent: () => createImpressionEvent,
@@ -98,6 +101,10 @@ var HTTPClient = class {
98
101
  constructor(config) {
99
102
  this.config = config;
100
103
  }
104
+ /** Expose the API key so sub-clients can re-use it in different headers */
105
+ get apiKey() {
106
+ return this.config.apiKey;
107
+ }
101
108
  async request(method, path, options = {}) {
102
109
  const url = `${this.config.baseUrl}${path}`;
103
110
  let lastError;
@@ -125,21 +132,26 @@ var HTTPClient = class {
125
132
  "Content-Type": "application/json",
126
133
  ...options.headers
127
134
  };
128
- if (this.config.supabaseAnonKey) {
129
- headers["Authorization"] = `Bearer ${this.config.supabaseAnonKey}`;
130
- }
131
- if (this.config.apiKey) {
132
- headers["X-AM-API-Key"] = this.config.apiKey;
135
+ if (!options.skipDefaultAuth) {
136
+ if (this.config.supabaseAnonKey) {
137
+ headers["Authorization"] = `Bearer ${this.config.supabaseAnonKey}`;
138
+ }
139
+ if (this.config.apiKey) {
140
+ headers["X-AM-API-Key"] = this.config.apiKey;
141
+ }
133
142
  }
134
143
  if (options.idempotencyKey) {
135
144
  headers["Idempotency-Key"] = options.idempotencyKey;
136
145
  }
137
- const response = await fetch(url, {
146
+ const fetchInit = {
138
147
  method,
139
148
  headers,
140
- body: options.body ? JSON.stringify(options.body) : void 0,
141
149
  signal: controller.signal
142
- });
150
+ };
151
+ if (options.body) {
152
+ fetchInit.body = JSON.stringify(options.body);
153
+ }
154
+ const response = await fetch(url, fetchInit);
143
155
  clearTimeout(timeoutId);
144
156
  if (!response.ok) {
145
157
  const errorBody = await response.json().catch(() => ({
@@ -493,6 +505,432 @@ function calculateMessageCount(conversationHistory) {
493
505
  return (conversationHistory?.length || 0) + 1;
494
506
  }
495
507
 
508
+ // src/session-client.ts
509
+ var SessionClient = class {
510
+ constructor(http) {
511
+ this.http = http;
512
+ }
513
+ /**
514
+ * Initiate a new capability session.
515
+ *
516
+ * @example
517
+ * ```typescript
518
+ * const session = await client.sessions.initiate({
519
+ * capability_type: 'code_review',
520
+ * config: { language: 'typescript' }
521
+ * });
522
+ * console.log(session.session_id);
523
+ * ```
524
+ */
525
+ async initiate(request) {
526
+ return this.http.request(
527
+ "POST",
528
+ "/capability-session",
529
+ { body: { action: "initiate", ...request } }
530
+ );
531
+ }
532
+ /**
533
+ * Send a message within an existing capability session.
534
+ *
535
+ * @example
536
+ * ```typescript
537
+ * const response = await client.sessions.sendMessage({
538
+ * session_id: 'sess_abc123',
539
+ * message: 'Review this function for bugs'
540
+ * });
541
+ * console.log(response.response);
542
+ * ```
543
+ */
544
+ async sendMessage(request) {
545
+ if (!request.session_id) {
546
+ throw new Error("session_id is required");
547
+ }
548
+ if (!request.message) {
549
+ throw new Error("message is required");
550
+ }
551
+ return this.http.request(
552
+ "POST",
553
+ "/capability-session",
554
+ { body: { action: "message", ...request } }
555
+ );
556
+ }
557
+ /**
558
+ * End a capability session.
559
+ *
560
+ * @example
561
+ * ```typescript
562
+ * const result = await client.sessions.end({
563
+ * session_id: 'sess_abc123',
564
+ * reason: 'task_completed'
565
+ * });
566
+ * ```
567
+ */
568
+ async end(request) {
569
+ if (!request.session_id) {
570
+ throw new Error("session_id is required");
571
+ }
572
+ return this.http.request(
573
+ "POST",
574
+ "/capability-session",
575
+ { body: { action: "end", ...request } }
576
+ );
577
+ }
578
+ /**
579
+ * Connect a GitHub repository to the capability session.
580
+ *
581
+ * @example
582
+ * ```typescript
583
+ * const result = await client.sessions.connectGitHub({
584
+ * session_id: 'sess_abc123',
585
+ * repository: 'owner/repo',
586
+ * branch: 'main'
587
+ * });
588
+ * ```
589
+ */
590
+ async connectGitHub(request) {
591
+ if (!request.session_id) {
592
+ throw new Error("session_id is required");
593
+ }
594
+ if (!request.repository) {
595
+ throw new Error("repository is required");
596
+ }
597
+ return this.http.request(
598
+ "POST",
599
+ "/capability-session",
600
+ { body: { action: "connect-github", ...request } }
601
+ );
602
+ }
603
+ };
604
+
605
+ // src/developer-client.ts
606
+ var DeveloperClient = class {
607
+ constructor(http) {
608
+ this.http = http;
609
+ }
610
+ /**
611
+ * Log in as a developer. Returns a session token for subsequent calls.
612
+ * No API key auth needed for this endpoint.
613
+ *
614
+ * @example
615
+ * ```typescript
616
+ * const session = await client.developer.login({
617
+ * email: 'dev@example.com',
618
+ * password: 'secret'
619
+ * });
620
+ * console.log(session.session_token);
621
+ * ```
622
+ */
623
+ async login(request) {
624
+ if (!request.email) {
625
+ throw new Error("email is required");
626
+ }
627
+ if (!request.password) {
628
+ throw new Error("password is required");
629
+ }
630
+ return this.http.request(
631
+ "POST",
632
+ "/developer-login",
633
+ { body: request, skipDefaultAuth: true }
634
+ );
635
+ }
636
+ /**
637
+ * Get developer account data using a session token.
638
+ * No default API key auth — uses session token in body.
639
+ *
640
+ * @example
641
+ * ```typescript
642
+ * const data = await client.developer.getData('session_token_here');
643
+ * console.log(data.agent_name);
644
+ * ```
645
+ */
646
+ async getData(sessionToken) {
647
+ if (!sessionToken) {
648
+ throw new Error("sessionToken is required");
649
+ }
650
+ return this.http.request(
651
+ "POST",
652
+ "/developer-data",
653
+ { body: { session_token: sessionToken }, skipDefaultAuth: true }
654
+ );
655
+ }
656
+ /**
657
+ * Get developer earnings. Uses X-API-Key header (not X-AM-API-Key).
658
+ *
659
+ * @example
660
+ * ```typescript
661
+ * const earnings = await client.developer.getEarnings();
662
+ * console.log(earnings.balances.available);
663
+ * ```
664
+ */
665
+ async getEarnings() {
666
+ const apiKey = this.http.apiKey;
667
+ if (!apiKey) {
668
+ throw new Error("API key is required for getEarnings()");
669
+ }
670
+ return this.http.request(
671
+ "GET",
672
+ "/developer-earnings",
673
+ {
674
+ skipDefaultAuth: true,
675
+ headers: { "X-API-Key": apiKey }
676
+ }
677
+ );
678
+ }
679
+ /**
680
+ * Get developer stats. Uses standard X-AM-API-Key auth.
681
+ *
682
+ * @example
683
+ * ```typescript
684
+ * const stats = await client.developer.getStats({ period: '30d' });
685
+ * console.log(stats.impressions, stats.clicks);
686
+ * ```
687
+ */
688
+ async getStats(params) {
689
+ const queryParams = new URLSearchParams();
690
+ if (params?.period) {
691
+ queryParams.append("period", params.period);
692
+ }
693
+ const qs = queryParams.toString();
694
+ const url = `/developer-stats${qs ? "?" + qs : ""}`;
695
+ return this.http.request("GET", url);
696
+ }
697
+ /**
698
+ * Get developer analytics. Uses session token in body (no default auth).
699
+ *
700
+ * @example
701
+ * ```typescript
702
+ * const analytics = await client.developer.getAnalytics('session_token', {
703
+ * start_date: '2026-01-01',
704
+ * group_by: 'week'
705
+ * });
706
+ * ```
707
+ */
708
+ async getAnalytics(sessionToken, params) {
709
+ if (!sessionToken) {
710
+ throw new Error("sessionToken is required");
711
+ }
712
+ return this.http.request(
713
+ "POST",
714
+ "/developer-analytics",
715
+ {
716
+ body: { session_token: sessionToken, ...params },
717
+ skipDefaultAuth: true
718
+ }
719
+ );
720
+ }
721
+ /**
722
+ * Regenerate API keys. Uses session token in body (no default auth).
723
+ *
724
+ * @example
725
+ * ```typescript
726
+ * const newKeys = await client.developer.regenerateKeys({
727
+ * session_token: 'session_token_here',
728
+ * key_type: 'test'
729
+ * });
730
+ * console.log(newKeys.api_key_test);
731
+ * ```
732
+ */
733
+ async regenerateKeys(request) {
734
+ if (!request.session_token) {
735
+ throw new Error("session_token is required");
736
+ }
737
+ if (!request.key_type) {
738
+ throw new Error("key_type is required");
739
+ }
740
+ return this.http.request(
741
+ "POST",
742
+ "/regenerate-keys",
743
+ { body: request, skipDefaultAuth: true }
744
+ );
745
+ }
746
+ };
747
+
748
+ // src/advertiser-client.ts
749
+ var AdvertiserClient = class {
750
+ constructor(http) {
751
+ this.http = http;
752
+ }
753
+ /**
754
+ * Sign up as a new advertiser. No API key auth needed.
755
+ *
756
+ * @example
757
+ * ```typescript
758
+ * const account = await client.advertiser.signup({
759
+ * email: 'ads@company.com',
760
+ * password: 'secure123',
761
+ * company_name: 'Acme Corp'
762
+ * });
763
+ * console.log(account.advertiser_id);
764
+ * ```
765
+ */
766
+ async signup(request) {
767
+ if (!request.email) {
768
+ throw new Error("email is required");
769
+ }
770
+ if (!request.password) {
771
+ throw new Error("password is required");
772
+ }
773
+ if (!request.company_name) {
774
+ throw new Error("company_name is required");
775
+ }
776
+ return this.http.request(
777
+ "POST",
778
+ "/advertiser-signup",
779
+ { body: request, skipDefaultAuth: true }
780
+ );
781
+ }
782
+ /**
783
+ * Log in as an advertiser. Returns a session token.
784
+ * No API key auth needed.
785
+ *
786
+ * @example
787
+ * ```typescript
788
+ * const session = await client.advertiser.login({
789
+ * email: 'ads@company.com',
790
+ * password: 'secure123'
791
+ * });
792
+ * console.log(session.session_token);
793
+ * ```
794
+ */
795
+ async login(request) {
796
+ if (!request.email) {
797
+ throw new Error("email is required");
798
+ }
799
+ if (!request.password) {
800
+ throw new Error("password is required");
801
+ }
802
+ return this.http.request(
803
+ "POST",
804
+ "/advertiser-login",
805
+ { body: request, skipDefaultAuth: true }
806
+ );
807
+ }
808
+ /**
809
+ * Get advertiser stats. Uses X-Advertiser-Key header or query param.
810
+ *
811
+ * @example
812
+ * ```typescript
813
+ * const stats = await client.advertiser.getStats({
814
+ * advertiser_key: 'adv_key_123',
815
+ * period: '30d'
816
+ * });
817
+ * console.log(stats.budget.remaining);
818
+ * ```
819
+ */
820
+ async getStats(params) {
821
+ const queryParams = new URLSearchParams();
822
+ if (params?.advertiser_key) {
823
+ queryParams.append("advertiser_key", params.advertiser_key);
824
+ }
825
+ if (params?.period) {
826
+ queryParams.append("period", params.period);
827
+ }
828
+ const qs = queryParams.toString();
829
+ const url = `/advertiser-stats${qs ? "?" + qs : ""}`;
830
+ const headers = {};
831
+ if (params?.advertiser_key) {
832
+ headers["X-Advertiser-Key"] = params.advertiser_key;
833
+ }
834
+ return this.http.request(
835
+ "GET",
836
+ url,
837
+ { skipDefaultAuth: true, headers }
838
+ );
839
+ }
840
+ /**
841
+ * Get advertiser analytics. Uses session token in body (no default auth).
842
+ *
843
+ * @example
844
+ * ```typescript
845
+ * const analytics = await client.advertiser.getAnalytics('session_token', {
846
+ * start_date: '2026-01-01',
847
+ * group_by: 'week'
848
+ * });
849
+ * ```
850
+ */
851
+ async getAnalytics(sessionToken, params) {
852
+ if (!sessionToken) {
853
+ throw new Error("sessionToken is required");
854
+ }
855
+ return this.http.request(
856
+ "POST",
857
+ "/advertiser-analytics",
858
+ {
859
+ body: { session_token: sessionToken, ...params },
860
+ skipDefaultAuth: true
861
+ }
862
+ );
863
+ }
864
+ /**
865
+ * Create a new campaign. Uses JWT bearer token for auth.
866
+ *
867
+ * @example
868
+ * ```typescript
869
+ * const campaign = await client.advertiser.createCampaign('jwt_token', {
870
+ * name: 'Summer Sale',
871
+ * ad_type: 'link',
872
+ * daily_budget: 5000,
873
+ * bid_amount: 100,
874
+ * creative: {
875
+ * title: 'Summer Sale - 50% Off',
876
+ * body: 'Limited time offer',
877
+ * cta: 'Shop Now',
878
+ * landing_url: 'https://example.com/sale'
879
+ * }
880
+ * });
881
+ * ```
882
+ */
883
+ async createCampaign(jwt, request) {
884
+ if (!jwt) {
885
+ throw new Error("jwt is required for campaign creation");
886
+ }
887
+ if (!request.name) {
888
+ throw new Error("name is required");
889
+ }
890
+ if (!request.ad_type) {
891
+ throw new Error("ad_type is required");
892
+ }
893
+ if (!request.creative) {
894
+ throw new Error("creative is required");
895
+ }
896
+ return this.http.request(
897
+ "POST",
898
+ "/campaign-create",
899
+ {
900
+ body: request,
901
+ skipDefaultAuth: true,
902
+ headers: { "Authorization": `Bearer ${jwt}` }
903
+ }
904
+ );
905
+ }
906
+ /**
907
+ * Update an existing campaign. Uses session token in body (no default auth).
908
+ *
909
+ * @example
910
+ * ```typescript
911
+ * const result = await client.advertiser.updateCampaign({
912
+ * campaign_id: 'camp_123',
913
+ * session_token: 'session_token',
914
+ * updates: { name: 'Updated Campaign Name' },
915
+ * status: 'paused'
916
+ * });
917
+ * ```
918
+ */
919
+ async updateCampaign(request) {
920
+ if (!request.campaign_id) {
921
+ throw new Error("campaign_id is required");
922
+ }
923
+ if (!request.session_token) {
924
+ throw new Error("session_token is required");
925
+ }
926
+ return this.http.request(
927
+ "POST",
928
+ "/campaign-update",
929
+ { body: request, skipDefaultAuth: true }
930
+ );
931
+ }
932
+ };
933
+
496
934
  // src/client.ts
497
935
  var DEFAULT_BASE_URL = "https://peruwnbrqkvmrldhpoom.supabase.co/functions/v1";
498
936
  var DEFAULT_TIMEOUT_MS = 4e3;
@@ -501,6 +939,12 @@ var AttentionMarketClient = class {
501
939
  http;
502
940
  agentId;
503
941
  appId;
942
+ /** Capability session management (multi-turn AI sessions) */
943
+ sessions;
944
+ /** Developer portal (login, earnings, stats, analytics) */
945
+ developer;
946
+ /** Advertiser portal (signup, login, campaigns, stats) */
947
+ advertiser;
504
948
  constructor(config) {
505
949
  this.agentId = config.agentId;
506
950
  this.appId = config.appId;
@@ -515,6 +959,9 @@ var AttentionMarketClient = class {
515
959
  httpConfig.supabaseAnonKey = config.supabaseAnonKey;
516
960
  }
517
961
  this.http = new HTTPClient(httpConfig);
962
+ this.sessions = new SessionClient(this.http);
963
+ this.developer = new DeveloperClient(this.http);
964
+ this.advertiser = new AdvertiserClient(this.http);
518
965
  }
519
966
  /**
520
967
  * Validate SDK configuration for security
@@ -713,7 +1160,8 @@ var AttentionMarketClient = class {
713
1160
  // Developer controls (Phase 2: Revenue Optimization)
714
1161
  ...params.minCPC !== void 0 && { minCPC: params.minCPC },
715
1162
  ...params.minRelevanceScore !== void 0 && { minRelevanceScore: params.minRelevanceScore },
716
- ...params.optimizeFor && { optimizeFor: params.optimizeFor }
1163
+ ...params.optimizeFor && { optimizeFor: params.optimizeFor },
1164
+ ...params.maxWaitMs !== void 0 && { max_wait_ms: params.maxWaitMs }
717
1165
  };
718
1166
  const response = await this.decideRaw(request, options);
719
1167
  if (response && response.creative) {
@@ -865,6 +1313,24 @@ var AttentionMarketClient = class {
865
1313
  async sendFeedback(request) {
866
1314
  return await this.http.request("POST", "/feedback", { body: request });
867
1315
  }
1316
+ /**
1317
+ * Rate the delivery quality of an ad after a verified click.
1318
+ * Requires a prior click event for the tracking_token. Ratings feed
1319
+ * into quality scores (minimum 5 unique raters per campaign).
1320
+ *
1321
+ * @example
1322
+ * ```typescript
1323
+ * await client.rateBusinessDelivery({
1324
+ * tracking_token: ad.tracking_token,
1325
+ * ad_unit_id: ad._ad.unit_id,
1326
+ * rating: 4,
1327
+ * context: 'Relevant product, good landing page'
1328
+ * });
1329
+ * ```
1330
+ */
1331
+ async rateBusinessDelivery(request) {
1332
+ return await this.http.request("POST", "/rate-business", { body: request });
1333
+ }
868
1334
  /**
869
1335
  * Fetch default policy constraints and formatting requirements.
870
1336
  */
@@ -1393,7 +1859,122 @@ var AttentionMarketClient = class {
1393
1859
  url
1394
1860
  );
1395
1861
  }
1396
- // TODO: Add getDeveloperMetrics() method when DeveloperMetricsResponse type is defined
1862
+ // ==========================================================================
1863
+ // New Methods (v0.18.0)
1864
+ // ==========================================================================
1865
+ /**
1866
+ * Sign up a new agent using the v2 endpoint.
1867
+ * Static method — no API key needed.
1868
+ *
1869
+ * @example
1870
+ * ```typescript
1871
+ * const agent = await AttentionMarketClient.signupAgentV2({
1872
+ * owner_email: 'dev@example.com',
1873
+ * agent_name: 'My Agent',
1874
+ * sdk: 'typescript'
1875
+ * });
1876
+ * console.log(agent.api_key_live);
1877
+ * ```
1878
+ */
1879
+ static async signupAgentV2(request, baseUrl) {
1880
+ if (!request.owner_email) {
1881
+ throw new Error("owner_email is required");
1882
+ }
1883
+ if (!request.agent_name) {
1884
+ throw new Error("agent_name is required");
1885
+ }
1886
+ const http = new HTTPClient({
1887
+ baseUrl: baseUrl ?? DEFAULT_BASE_URL,
1888
+ timeoutMs: DEFAULT_TIMEOUT_MS,
1889
+ maxRetries: DEFAULT_MAX_RETRIES
1890
+ });
1891
+ return http.request(
1892
+ "POST",
1893
+ "/agent-signup",
1894
+ { body: request, skipDefaultAuth: true }
1895
+ );
1896
+ }
1897
+ /**
1898
+ * Track an agent-to-agent call using a tracking token.
1899
+ *
1900
+ * @example
1901
+ * ```typescript
1902
+ * await client.trackCall('trk_abc123', { model: 'gpt-4' });
1903
+ * ```
1904
+ */
1905
+ async trackCall(token, metadata) {
1906
+ if (!token) {
1907
+ throw new Error("token is required for trackCall()");
1908
+ }
1909
+ return this.http.request(
1910
+ "POST",
1911
+ `/track-call/${encodeURIComponent(token)}`,
1912
+ { body: metadata ? { metadata } : void 0 }
1913
+ );
1914
+ }
1915
+ /**
1916
+ * Scrape a website for knowledge base content.
1917
+ * Requires Bearer JWT and an OpenAI API key header.
1918
+ *
1919
+ * @example
1920
+ * ```typescript
1921
+ * const result = await client.scrapeSite(
1922
+ * { url: 'https://example.com', max_pages: 10 },
1923
+ * 'jwt_token',
1924
+ * 'sk-openai-key'
1925
+ * );
1926
+ * ```
1927
+ */
1928
+ async scrapeSite(request, jwt, openaiKey) {
1929
+ if (!request.url) {
1930
+ throw new Error("url is required");
1931
+ }
1932
+ if (!jwt) {
1933
+ throw new Error("jwt is required for scrapeSite()");
1934
+ }
1935
+ if (!openaiKey) {
1936
+ throw new Error("openaiKey is required for scrapeSite()");
1937
+ }
1938
+ return this.http.request(
1939
+ "POST",
1940
+ "/scrape-site",
1941
+ {
1942
+ body: request,
1943
+ skipDefaultAuth: true,
1944
+ headers: {
1945
+ "Authorization": `Bearer ${jwt}`,
1946
+ "x-openai-key": openaiKey
1947
+ }
1948
+ }
1949
+ );
1950
+ }
1951
+ /**
1952
+ * Train an agent with custom knowledge.
1953
+ * No default auth — agent ID is in the request body.
1954
+ *
1955
+ * @example
1956
+ * ```typescript
1957
+ * const result = await client.trainAgent({
1958
+ * agent_id: 'agt_123',
1959
+ * training_data: [
1960
+ * { type: 'document', content: 'Product FAQ...' }
1961
+ * ]
1962
+ * });
1963
+ * ```
1964
+ */
1965
+ async trainAgent(request) {
1966
+ if (!request.agent_id) {
1967
+ throw new Error("agent_id is required");
1968
+ }
1969
+ if (!request.training_data || request.training_data.length === 0) {
1970
+ throw new Error("training_data is required and must not be empty");
1971
+ }
1972
+ return this.http.request(
1973
+ "POST",
1974
+ "/train-agent",
1975
+ { body: request, skipDefaultAuth: true }
1976
+ );
1977
+ }
1397
1978
  };
1398
1979
 
1399
1980
  // src/mock-client.ts
@@ -1940,10 +2521,13 @@ function suggestTaxonomies(query) {
1940
2521
  // Annotate the CommonJS export names for ESM import in node:
1941
2522
  0 && (module.exports = {
1942
2523
  APIRequestError,
2524
+ AdvertiserClient,
1943
2525
  AttentionMarketClient,
1944
2526
  AttentionMarketError,
2527
+ DeveloperClient,
1945
2528
  MockAttentionMarketClient,
1946
2529
  NetworkError,
2530
+ SessionClient,
1947
2531
  TimeoutError,
1948
2532
  buildTaxonomy,
1949
2533
  createImpressionEvent,