@knownagents/sdk 1.10.0 → 1.11.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.d.ts CHANGED
@@ -18,6 +18,8 @@ export interface Request {
18
18
  export interface Response {
19
19
  /** The HTTP response status code (e.g. 200, 404) */
20
20
  statusCode: number;
21
+ /** The HTTP response headers */
22
+ headers?: Record<string, string | string[] | undefined>;
21
23
  }
22
24
  /**
23
25
  * A visit tracking request for the Known Agents API.
@@ -149,6 +151,7 @@ export declare class KnownAgents {
149
151
  * @throws {Error} If the API call fails or returns a non-200 status.
150
152
  */
151
153
  identifyAgents(requests: IdentificationRequest[]): Promise<IdentificationResult[]>;
154
+ private isPathExcluded;
152
155
  private filterHeaders;
153
156
  }
154
157
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KnownAgents = exports.AgentType = void 0;
4
+ const http_1 = require("http");
4
5
  /**
5
6
  * Agent types that can be controlled with robots.txt rules.
6
7
  */
@@ -41,6 +42,11 @@ class KnownAgents {
41
42
  * @param responseDurationInMilliseconds - The time taken to process the request in milliseconds (optional).
42
43
  */
43
44
  trackVisit(request, response, responseDurationInMilliseconds) {
45
+ const path = "path" in request ? request.path : request.url;
46
+ const responseHeaders = response instanceof http_1.ServerResponse ? response.getHeaders() : response?.headers;
47
+ if (!path || this.isPathExcluded(path)) {
48
+ return;
49
+ }
44
50
  fetch("https://api.knownagents.com/visits", {
45
51
  method: "POST",
46
52
  headers: {
@@ -48,10 +54,11 @@ class KnownAgents {
48
54
  "Content-Type": "application/json"
49
55
  },
50
56
  body: JSON.stringify({
51
- request_path: "path" in request ? request.path : request.url,
57
+ request_path: path,
52
58
  request_method: request.method,
53
59
  request_headers: this.filterHeaders(request.headers),
54
60
  response_status_code: response?.statusCode,
61
+ response_headers: responseHeaders ? this.filterHeaders(responseHeaders) : undefined,
55
62
  response_duration_in_milliseconds: responseDurationInMilliseconds,
56
63
  created: new Date().toISOString()
57
64
  })
@@ -67,13 +74,27 @@ class KnownAgents {
67
74
  * @param visits - An array of visit tracking requests.
68
75
  */
69
76
  trackVisits(visits) {
77
+ const filteredVisits = visits
78
+ .filter((visit) => {
79
+ return !this.isPathExcluded(visit.request_path);
80
+ })
81
+ .map((visit) => {
82
+ return {
83
+ ...visit,
84
+ request_headers: this.filterHeaders(visit.request_headers),
85
+ response_headers: visit.response_headers ? this.filterHeaders(visit.response_headers) : undefined,
86
+ };
87
+ });
88
+ if (filteredVisits.length === 0) {
89
+ return;
90
+ }
70
91
  fetch("https://api.knownagents.com/visits", {
71
92
  method: "POST",
72
93
  headers: {
73
94
  "Authorization": `Bearer ${this.accessToken}`,
74
95
  "Content-Type": "application/json"
75
96
  },
76
- body: JSON.stringify(visits)
97
+ body: JSON.stringify(filteredVisits)
77
98
  }).catch(error => {
78
99
  console.error(`Known Agents failed to track visits: ${error.message}`);
79
100
  });
@@ -148,7 +169,12 @@ class KnownAgents {
148
169
  "Authorization": `Bearer ${this.accessToken}`,
149
170
  "Content-Type": "application/json"
150
171
  },
151
- body: JSON.stringify(requests)
172
+ body: JSON.stringify(requests.map(request => {
173
+ return {
174
+ ...request,
175
+ request_headers: this.filterHeaders(request.request_headers),
176
+ };
177
+ }))
152
178
  });
153
179
  if (response.ok) {
154
180
  return await response.json();
@@ -158,6 +184,62 @@ class KnownAgents {
158
184
  }
159
185
  }
160
186
  // Helpers
187
+ isPathExcluded(path) {
188
+ const excludedPrefixes = [
189
+ "/_next/",
190
+ "/_nuxt/",
191
+ "/_astro/",
192
+ "/_app/",
193
+ "/@vite/",
194
+ "/@fs/",
195
+ "/@id/",
196
+ "/node_modules/",
197
+ "/_vercel/",
198
+ ];
199
+ const excludedSuffixes = [
200
+ ".ico",
201
+ ".png",
202
+ ".jpg",
203
+ ".jpeg",
204
+ ".gif",
205
+ ".webp",
206
+ ".svg",
207
+ ".bmp",
208
+ ".tiff",
209
+ ".avif",
210
+ ".css",
211
+ ".js",
212
+ ".mjs",
213
+ ".ts",
214
+ ".jsx",
215
+ ".tsx",
216
+ ".map",
217
+ ".woff",
218
+ ".woff2",
219
+ ".ttf",
220
+ ".otf",
221
+ ".eot",
222
+ ".mp3",
223
+ ".mp4",
224
+ ".webm",
225
+ ".wav",
226
+ ".ogg",
227
+ ".mov",
228
+ ".avi",
229
+ ".flv",
230
+ ".m4v",
231
+ ".rss",
232
+ ".json",
233
+ ".xml",
234
+ ".pdf",
235
+ ".zip",
236
+ ];
237
+ return excludedPrefixes.some((excludedPrefix) => {
238
+ return path.toLowerCase().startsWith(excludedPrefix.toLowerCase());
239
+ }) || excludedSuffixes.some((excludedSuffix) => {
240
+ return path.toLowerCase().endsWith(excludedSuffix.toLowerCase());
241
+ });
242
+ }
161
243
  filterHeaders(headers) {
162
244
  const excludedHeaders = new Set([
163
245
  "authorization",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knownagents/sdk",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "The official Node.js SDK for Known Agents: AI agent analytics (bot traffic), LLM referral tracking, automatic robots.txt, agent verification",
5
5
  "publishConfig": {
6
6
  "access": "public"
package/src/index.ts CHANGED
@@ -20,6 +20,8 @@ export interface Request {
20
20
  export interface Response {
21
21
  /** The HTTP response status code (e.g. 200, 404) */
22
22
  statusCode: number
23
+ /** The HTTP response headers */
24
+ headers?: Record<string, string | string[] | undefined>
23
25
  }
24
26
 
25
27
  /**
@@ -123,6 +125,13 @@ export class KnownAgents {
123
125
  * @param responseDurationInMilliseconds - The time taken to process the request in milliseconds (optional).
124
126
  */
125
127
  trackVisit(request: Request | IncomingMessage, response?: Response | ServerResponse, responseDurationInMilliseconds?: number): void {
128
+ const path = "path" in request ? request.path : request.url
129
+ const responseHeaders = response instanceof ServerResponse ? response.getHeaders() as Record<string, string | string[] | undefined> : response?.headers
130
+
131
+ if (!path || this.isPathExcluded(path)) {
132
+ return
133
+ }
134
+
126
135
  fetch("https://api.knownagents.com/visits", {
127
136
  method: "POST",
128
137
  headers: {
@@ -130,10 +139,11 @@ export class KnownAgents {
130
139
  "Content-Type": "application/json"
131
140
  },
132
141
  body: JSON.stringify({
133
- request_path: "path" in request ? request.path : request.url,
142
+ request_path: path,
134
143
  request_method: request.method,
135
144
  request_headers: this.filterHeaders(request.headers),
136
145
  response_status_code: response?.statusCode,
146
+ response_headers: responseHeaders ? this.filterHeaders(responseHeaders) : undefined,
137
147
  response_duration_in_milliseconds: responseDurationInMilliseconds,
138
148
  created: new Date().toISOString()
139
149
  })
@@ -150,13 +160,29 @@ export class KnownAgents {
150
160
  * @param visits - An array of visit tracking requests.
151
161
  */
152
162
  trackVisits(visits: VisitRequest[]): void {
163
+ const filteredVisits = visits
164
+ .filter((visit) => {
165
+ return !this.isPathExcluded(visit.request_path)
166
+ })
167
+ .map((visit) => {
168
+ return {
169
+ ...visit,
170
+ request_headers: this.filterHeaders(visit.request_headers),
171
+ response_headers: visit.response_headers ? this.filterHeaders(visit.response_headers) : undefined,
172
+ }
173
+ })
174
+
175
+ if (filteredVisits.length === 0) {
176
+ return
177
+ }
178
+
153
179
  fetch("https://api.knownagents.com/visits", {
154
180
  method: "POST",
155
181
  headers: {
156
182
  "Authorization": `Bearer ${this.accessToken}`,
157
183
  "Content-Type": "application/json"
158
184
  },
159
- body: JSON.stringify(visits)
185
+ body: JSON.stringify(filteredVisits)
160
186
  }).catch(error => {
161
187
  console.error(`Known Agents failed to track visits: ${error.message}`)
162
188
  })
@@ -234,7 +260,12 @@ export class KnownAgents {
234
260
  "Authorization": `Bearer ${this.accessToken}`,
235
261
  "Content-Type": "application/json"
236
262
  },
237
- body: JSON.stringify(requests)
263
+ body: JSON.stringify(requests.map(request => {
264
+ return {
265
+ ...request,
266
+ request_headers: this.filterHeaders(request.request_headers),
267
+ }
268
+ }))
238
269
  })
239
270
 
240
271
  if (response.ok) {
@@ -246,6 +277,65 @@ export class KnownAgents {
246
277
 
247
278
  // Helpers
248
279
 
280
+ private isPathExcluded(path: string): boolean {
281
+ const excludedPrefixes = [
282
+ "/_next/",
283
+ "/_nuxt/",
284
+ "/_astro/",
285
+ "/_app/",
286
+ "/@vite/",
287
+ "/@fs/",
288
+ "/@id/",
289
+ "/node_modules/",
290
+ "/_vercel/",
291
+ ]
292
+
293
+ const excludedSuffixes = [
294
+ ".ico",
295
+ ".png",
296
+ ".jpg",
297
+ ".jpeg",
298
+ ".gif",
299
+ ".webp",
300
+ ".svg",
301
+ ".bmp",
302
+ ".tiff",
303
+ ".avif",
304
+ ".css",
305
+ ".js",
306
+ ".mjs",
307
+ ".ts",
308
+ ".jsx",
309
+ ".tsx",
310
+ ".map",
311
+ ".woff",
312
+ ".woff2",
313
+ ".ttf",
314
+ ".otf",
315
+ ".eot",
316
+ ".mp3",
317
+ ".mp4",
318
+ ".webm",
319
+ ".wav",
320
+ ".ogg",
321
+ ".mov",
322
+ ".avi",
323
+ ".flv",
324
+ ".m4v",
325
+ ".rss",
326
+ ".json",
327
+ ".xml",
328
+ ".pdf",
329
+ ".zip",
330
+ ]
331
+
332
+ return excludedPrefixes.some((excludedPrefix) => {
333
+ return path.toLowerCase().startsWith(excludedPrefix.toLowerCase())
334
+ }) || excludedSuffixes.some((excludedSuffix) => {
335
+ return path.toLowerCase().endsWith(excludedSuffix.toLowerCase())
336
+ })
337
+ }
338
+
249
339
  private filterHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string | string[] | undefined> {
250
340
  const excludedHeaders = new Set([
251
341
  "authorization",