@analytickit/sdk-node 0.1.1 → 0.1.3
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/README.md +38 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware.d.ts +57 -3
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +236 -11
- package/dist/middleware.js.map +1 -1
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ Node client for AgentGraph. Two things live in this package:
|
|
|
12
12
|
still produces events.
|
|
13
13
|
|
|
14
14
|
Full install guide and the F0.3 access-log import mapping:
|
|
15
|
-
[`docs/
|
|
15
|
+
[`docs/tech/reference/server-side-collection.md`](../../docs/tech/reference/server-side-collection.md).
|
|
16
16
|
|
|
17
17
|
## Install
|
|
18
18
|
|
|
@@ -48,6 +48,13 @@ await client.track('report_generated', {
|
|
|
48
48
|
});
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
`declaredIntent` (on `track`, `trackBatch`'s per-event options, and
|
|
52
|
+
`trackRequest`) sends an advisory, caller-declared intent string as the
|
|
53
|
+
top-level `declared_intent` field — e.g. `declaredIntent: 'comparing
|
|
54
|
+
prices'`. It's free text kept verbatim; ingest keeps it only if it's
|
|
55
|
+
1-64 characters after trimming and drops it silently otherwise (never a
|
|
56
|
+
400). No classifier reads it today — it's for display/debugging.
|
|
57
|
+
|
|
51
58
|
### `trackBatch(events)`
|
|
52
59
|
|
|
53
60
|
```ts
|
|
@@ -76,6 +83,20 @@ transport headers for Web2 enrichment — see the install guide, §3.
|
|
|
76
83
|
|
|
77
84
|
## Middleware adapters
|
|
78
85
|
|
|
86
|
+
**Use a server key.** Give the middleware's client a *server key* (dashboard →
|
|
87
|
+
client → "Server key — keep secret", or `POST /v1/sdk-keys` with
|
|
88
|
+
`kind: "server"`), not the publishable snippet key. Ingest only trusts the
|
|
89
|
+
forwarded visitor IP (`request_context.ip`) from a server key, so with the
|
|
90
|
+
snippet key every crawler stays `unverified`. Never ship a server key to a
|
|
91
|
+
browser. The IP must also be one the visitor cannot forge: the middleware
|
|
92
|
+
sends `ipTrusted: true` only for the socket peer, or — when the socket peer is
|
|
93
|
+
inside the `trustedProxies` CIDRs you configure (your load balancer) — the
|
|
94
|
+
right-most `X-Forwarded-For` hop outside that list. Framework `req.ip` is never
|
|
95
|
+
consulted (Express `trust proxy = true` resolves it to the client-written
|
|
96
|
+
leftmost hop). A raw leftmost `X-Forwarded-For` (the `trustProxy` option's
|
|
97
|
+
fallback) is sent with `ipTrusted: false` and never verifies; neither does
|
|
98
|
+
`analyticKitFetch`, which has no socket.
|
|
99
|
+
|
|
79
100
|
All three are re-exported from the package root (as well as from
|
|
80
101
|
`@analytickit/sdk-node/middleware`):
|
|
81
102
|
|
|
@@ -100,9 +121,23 @@ import {
|
|
|
100
121
|
| `DEFAULT_IGNORE` | The default `ignore` regex list (static assets, health checks, `_next`, favicon) |
|
|
101
122
|
|
|
102
123
|
All three take `MiddlewareOptions` — at minimum `{ client }`. See the
|
|
103
|
-
install guide for `ignore`, `sampleRate`, `trustProxy`, and `onError`, and
|
|
124
|
+
install guide for `ignore`, `sampleRate`, `trustProxy`, `trustedProxies`, and `onError`, and
|
|
104
125
|
for why collection adds no request latency and cannot fail the request.
|
|
105
126
|
|
|
106
127
|
Full docs, the privacy/`capture_ip` behavior, volume-control gotchas, and
|
|
107
128
|
the F0.3 CSV access-log import mapping:
|
|
108
|
-
[`docs/
|
|
129
|
+
[`docs/tech/reference/server-side-collection.md`](../../docs/tech/reference/server-side-collection.md).
|
|
130
|
+
|
|
131
|
+
## x402 revenue (2026-10-17)
|
|
132
|
+
|
|
133
|
+
For a request the middleware detects as x402 (a `PAYMENT-SIGNATURE` or
|
|
134
|
+
`X-Payment` header present), it also tries to read how much was paid, once
|
|
135
|
+
your handler's response finishes and sets the settlement header
|
|
136
|
+
(`PAYMENT-RESPONSE`/`X-PAYMENT-RESPONSE`). When settlement succeeded, the
|
|
137
|
+
event's `request_context.payment` carries `amount` (atomic units),
|
|
138
|
+
`asset`, `network`, `tx_hash`, and `payer_hash` — a SHA-256 digest of the
|
|
139
|
+
payer address; the raw address is never read into anything forwarded or
|
|
140
|
+
logged. A failed settlement, or a header that doesn't parse, means no
|
|
141
|
+
`payment` block at all — never a thrown error. See
|
|
142
|
+
[`docs/tech/reference/server-side-collection.md`](../../docs/tech/reference/server-side-collection.md)
|
|
143
|
+
§8.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGnG,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE1E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAW3B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGnG,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE1E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAW3B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjG;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IA4CV,UAAU,CACd,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAgC5C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,cAAc;IA0C5B,OAAO,CAAC,MAAM;CAGf;AAED,eAAe,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ class AnalyticKit {
|
|
|
44
44
|
workflow_id: options?.workflowId,
|
|
45
45
|
wallet_address: options?.walletAddress,
|
|
46
46
|
chain: options?.chain,
|
|
47
|
+
declared_intent: options?.declaredIntent,
|
|
47
48
|
};
|
|
48
49
|
await this._sendWithRetry(`${this.endpoint}/v1/events`, JSON.stringify(payload), this.maxRetries);
|
|
49
50
|
}
|
|
@@ -60,12 +61,14 @@ class AnalyticKit {
|
|
|
60
61
|
const map = [
|
|
61
62
|
['userAgent', 'user_agent'],
|
|
62
63
|
['ip', 'ip'],
|
|
64
|
+
['ipTrusted', 'ip_trusted'],
|
|
63
65
|
['path', 'path'],
|
|
64
66
|
['referrer', 'referrer'],
|
|
65
67
|
['host', 'host'],
|
|
66
68
|
['method', 'method'],
|
|
67
69
|
['status', 'status'],
|
|
68
70
|
['protocol', 'protocol'],
|
|
71
|
+
['payment', 'payment'],
|
|
69
72
|
];
|
|
70
73
|
for (const [from, to] of map) {
|
|
71
74
|
const value = context[from];
|
|
@@ -86,6 +89,7 @@ class AnalyticKit {
|
|
|
86
89
|
page_path: context.path ?? undefined,
|
|
87
90
|
page_referrer: context.referrer ?? undefined,
|
|
88
91
|
request_context: requestContext,
|
|
92
|
+
declared_intent: options?.declaredIntent,
|
|
89
93
|
};
|
|
90
94
|
await this._sendWithRetry(`${this.endpoint}/v1/events`, JSON.stringify(payload), this.maxRetries);
|
|
91
95
|
}
|
|
@@ -101,6 +105,7 @@ class AnalyticKit {
|
|
|
101
105
|
workflow_id: e.workflowId,
|
|
102
106
|
wallet_address: e.walletAddress,
|
|
103
107
|
chain: e.chain,
|
|
108
|
+
declared_intent: e.declaredIntent,
|
|
104
109
|
}));
|
|
105
110
|
const res = await this._sendWithRetry(`${this.endpoint}/v1/events/batch`, JSON.stringify(payloads), this.maxRetries);
|
|
106
111
|
if (res) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,yCAAkD;AAGlD,iDAQyB;AAPvB,mHAAA,kBAAkB,OAAA;AAClB,mHAAA,kBAAkB,OAAA;AAClB,iHAAA,gBAAgB,OAAA;AAChB,+GAAA,cAAc,OAAA;AACd,8GAAA,aAAa,OAAA;AACb,+GAAA,cAAc,OAAA;AACd,oHAAA,mBAAmB,OAAA;AAIrB,MAAa,WAAW;IACL,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,OAAO,CAAS;IAEjC,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,+BAAoB,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,+BAAoB,CAAC,UAAU,CAAC;QACvE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,+BAAoB,CAAC,OAAO,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,OAAkD;QAC/E,mEAAmE;QACnE,kEAAkE;QAClE,sEAAsE;QACtE,8DAA8D;QAC9D,2EAA2E;QAC3E,MAAM,OAAO,GAAG;YACd,eAAe,EAAE,OAAO,EAAE,cAAc,IAAI,IAAA,wBAAU,GAAE;YACxD,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS;YAChD,UAAU,EAAE,OAAO,EAAE,UAAU;YAC/B,QAAQ,EAAE,OAAO,EAAE,OAAO;YAC1B,OAAO,EAAE,OAAO,EAAE,MAAM;YACxB,WAAW,EAAE,OAAO,EAAE,UAAU;YAChC,cAAc,EAAE,OAAO,EAAE,aAAa;YACtC,KAAK,EAAE,OAAO,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { BlockList } from 'node:net';
|
|
1
2
|
import type { AnalyticKit } from './index.js';
|
|
2
|
-
import type { RequestContext, TrackRequestOptions } from './types.js';
|
|
3
|
+
import type { PaymentContext, RequestContext, TrackRequestOptions } from './types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Structural stand-ins for `http.IncomingMessage` and the Express/Fastify
|
|
5
6
|
* request objects that wrap it. Typed here rather than imported so this
|
|
@@ -25,8 +26,21 @@ export interface MiddlewareOptions {
|
|
|
25
26
|
ignore?: RegExp[];
|
|
26
27
|
/** 0..1. Default 1 (collect everything). */
|
|
27
28
|
sampleRate?: number;
|
|
28
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Read the client IP from the leftmost X-Forwarded-For hop. Default true.
|
|
31
|
+
* Ignored when `trustedProxies` is set. An IP read this way is sent with
|
|
32
|
+
* `ipTrusted: false` — the end user can write that header — so it never
|
|
33
|
+
* verifies an agent. Behind a load balancer, set `trustedProxies` instead.
|
|
34
|
+
*/
|
|
29
35
|
trustProxy?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* CIDRs / IPs of YOUR proxies (load balancer, ingress). When the socket
|
|
38
|
+
* peer is inside one, the client IP is the right-most X-Forwarded-For hop
|
|
39
|
+
* NOT in this list, sent with `ipTrusted: true`. When the peer is not, the
|
|
40
|
+
* socket IP is used (also trusted) and X-Forwarded-For is ignored. Invalid
|
|
41
|
+
* entries throw when the middleware is created.
|
|
42
|
+
*/
|
|
43
|
+
trustedProxies?: string[];
|
|
30
44
|
/** Called instead of throwing when collection faults. Default: swallow. */
|
|
31
45
|
onError?: (err: unknown) => void;
|
|
32
46
|
/** Extra options forwarded to trackRequest (actorType, properties, ...). */
|
|
@@ -48,10 +62,44 @@ export declare const DEFAULT_IGNORE: RegExp[];
|
|
|
48
62
|
* payment event.
|
|
49
63
|
*/
|
|
50
64
|
export declare function detectAgentProtocol(get: (name: string) => string | null | undefined): 'mcp' | 'x402' | null;
|
|
65
|
+
/**
|
|
66
|
+
* Capture an x402 payment, only when settlement succeeded. `getRequestHeader`
|
|
67
|
+
* reads the ORIGINAL request's payment header (amount/asset); `getResponseHeader`
|
|
68
|
+
* reads the settlement header written AFTER the handler produced its response.
|
|
69
|
+
*
|
|
70
|
+
* Amount/asset come from the request's accepted-payment header (v2
|
|
71
|
+
* `PAYMENT-SIGNATURE`'s `accepted.amount`/`accepted.asset`; v1 `X-PAYMENT`
|
|
72
|
+
* has no `asset` field, only `payload.authorization.value` as the amount).
|
|
73
|
+
* network/tx_hash/payer come from the settlement header (v2
|
|
74
|
+
* `PAYMENT-RESPONSE`, v1 `X-PAYMENT-RESPONSE`), both shaped
|
|
75
|
+
* `{ success, transaction, network, payer }`.
|
|
76
|
+
*
|
|
77
|
+
* The raw payer address is hashed (SHA-256, lowercased first so case doesn't
|
|
78
|
+
* change the digest) and never returned itself — see `PaymentContext`.
|
|
79
|
+
*/
|
|
80
|
+
export declare function extractPayment(getRequestHeader: (name: string) => string | null | undefined, getResponseHeader: (name: string) => string | null | undefined): PaymentContext | null;
|
|
51
81
|
/** True when this path should produce an event. */
|
|
52
82
|
export declare function shouldCollect(path: string, options: Pick<MiddlewareOptions, 'ignore' | 'sampleRate'>): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Build (once per options array) the BlockList for `trustedProxies`.
|
|
85
|
+
* Throws on an invalid entry — the adapters call it at creation time so a
|
|
86
|
+
* typo fails at startup, not silently on every request.
|
|
87
|
+
*/
|
|
88
|
+
export declare function trustedProxyList(cidrs: string[]): BlockList;
|
|
89
|
+
/**
|
|
90
|
+
* The client IP and whether the END USER could have chosen it. Only two
|
|
91
|
+
* sources are trusted: the socket peer itself, and — when the peer is one of
|
|
92
|
+
* the integrator's declared `trustedProxies` — the right-most
|
|
93
|
+
* X-Forwarded-For hop outside that list (hops to its right were appended by
|
|
94
|
+
* your own proxies). Framework `req.ip` is deliberately NOT consulted:
|
|
95
|
+
* Express `trust proxy = true` resolves it to the client-written leftmost hop.
|
|
96
|
+
*/
|
|
97
|
+
export declare function resolveClientIp(socketIp: string | null, xff: string | undefined, options: Pick<MiddlewareOptions, 'trustProxy' | 'trustedProxies'>): {
|
|
98
|
+
ip: string | null;
|
|
99
|
+
ipTrusted: boolean;
|
|
100
|
+
};
|
|
53
101
|
/** Pull the END USER's signals off a node-style request object. */
|
|
54
|
-
export declare function extractContext(req: NodeLikeRequest, options?: Pick<MiddlewareOptions, 'trustProxy'>): RequestContext;
|
|
102
|
+
export declare function extractContext(req: NodeLikeRequest, options?: Pick<MiddlewareOptions, 'trustProxy' | 'trustedProxies'>): RequestContext;
|
|
55
103
|
/**
|
|
56
104
|
* Express / Connect middleware.
|
|
57
105
|
*
|
|
@@ -74,6 +122,12 @@ export declare function analyticKitFastify(options: MiddlewareOptions): (req: No
|
|
|
74
122
|
* collect(request);
|
|
75
123
|
* return NextResponse.next();
|
|
76
124
|
* }
|
|
125
|
+
*
|
|
126
|
+
* No x402 payment capture here: this adapter only ever sees the `Request`,
|
|
127
|
+
* never the eventual `Response` (the caller builds and returns that itself,
|
|
128
|
+
* separately) — there is no settlement header to read. x402 detection still
|
|
129
|
+
* sets `protocol: 'x402'` as before; only the `payment` block is unavailable
|
|
130
|
+
* on this adapter.
|
|
77
131
|
*/
|
|
78
132
|
export declare function analyticKitFetch(options: MiddlewareOptions): (request: Request) => void;
|
|
79
133
|
//# sourceMappingURL=middleware.d.ts.map
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/dist/middleware.js
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DEFAULT_IGNORE = void 0;
|
|
4
4
|
exports.detectAgentProtocol = detectAgentProtocol;
|
|
5
|
+
exports.extractPayment = extractPayment;
|
|
5
6
|
exports.shouldCollect = shouldCollect;
|
|
7
|
+
exports.trustedProxyList = trustedProxyList;
|
|
8
|
+
exports.resolveClientIp = resolveClientIp;
|
|
6
9
|
exports.extractContext = extractContext;
|
|
7
10
|
exports.analyticKitExpress = analyticKitExpress;
|
|
8
11
|
exports.analyticKitFastify = analyticKitFastify;
|
|
9
12
|
exports.analyticKitFetch = analyticKitFetch;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const node_net_1 = require("node:net");
|
|
10
15
|
/**
|
|
11
16
|
* Requests a page-analytics product should not count. Static assets dominate
|
|
12
17
|
* request volume on any real site and would swamp both the customer's event
|
|
@@ -59,6 +64,144 @@ function detectAgentProtocol(get) {
|
|
|
59
64
|
return 'mcp';
|
|
60
65
|
return null;
|
|
61
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Decode a header value as base64 JSON (x402's wire format for both the
|
|
69
|
+
* payment-request headers and the settlement-response headers). Any
|
|
70
|
+
* failure — not base64, not JSON, not an object — returns null; this is a
|
|
71
|
+
* trust boundary (a customer's upstream or a hostile client controls these
|
|
72
|
+
* headers) and must never throw into the caller.
|
|
73
|
+
*/
|
|
74
|
+
function decodeX402Header(value) {
|
|
75
|
+
if (!value)
|
|
76
|
+
return null;
|
|
77
|
+
try {
|
|
78
|
+
const decoded = Buffer.from(value, 'base64').toString('utf8');
|
|
79
|
+
const parsed = JSON.parse(decoded);
|
|
80
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function asRecord(value) {
|
|
87
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
88
|
+
? value
|
|
89
|
+
: null;
|
|
90
|
+
}
|
|
91
|
+
function asString(value) {
|
|
92
|
+
if (typeof value === 'string' && value.length > 0)
|
|
93
|
+
return value;
|
|
94
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
95
|
+
return String(value);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Capture an x402 payment, only when settlement succeeded. `getRequestHeader`
|
|
100
|
+
* reads the ORIGINAL request's payment header (amount/asset); `getResponseHeader`
|
|
101
|
+
* reads the settlement header written AFTER the handler produced its response.
|
|
102
|
+
*
|
|
103
|
+
* Amount/asset come from the request's accepted-payment header (v2
|
|
104
|
+
* `PAYMENT-SIGNATURE`'s `accepted.amount`/`accepted.asset`; v1 `X-PAYMENT`
|
|
105
|
+
* has no `asset` field, only `payload.authorization.value` as the amount).
|
|
106
|
+
* network/tx_hash/payer come from the settlement header (v2
|
|
107
|
+
* `PAYMENT-RESPONSE`, v1 `X-PAYMENT-RESPONSE`), both shaped
|
|
108
|
+
* `{ success, transaction, network, payer }`.
|
|
109
|
+
*
|
|
110
|
+
* The raw payer address is hashed (SHA-256, lowercased first so case doesn't
|
|
111
|
+
* change the digest) and never returned itself — see `PaymentContext`.
|
|
112
|
+
*/
|
|
113
|
+
function extractPayment(getRequestHeader, getResponseHeader) {
|
|
114
|
+
const settlement = decodeX402Header(getResponseHeader('payment-response') ?? getResponseHeader('x-payment-response'));
|
|
115
|
+
if (!settlement || settlement['success'] !== true)
|
|
116
|
+
return null;
|
|
117
|
+
let amount = null;
|
|
118
|
+
let asset = null;
|
|
119
|
+
const v2 = decodeX402Header(getRequestHeader('payment-signature'));
|
|
120
|
+
if (v2) {
|
|
121
|
+
const accepted = asRecord(v2['accepted']);
|
|
122
|
+
amount = asString(accepted?.['amount']);
|
|
123
|
+
asset = asString(accepted?.['asset']);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const v1 = decodeX402Header(getRequestHeader('x-payment'));
|
|
127
|
+
const authorization = asRecord(asRecord(v1?.['payload'])?.['authorization']);
|
|
128
|
+
amount = asString(authorization?.['value']);
|
|
129
|
+
// v1's payment payload carries no asset field at all.
|
|
130
|
+
}
|
|
131
|
+
if (!amount)
|
|
132
|
+
return null;
|
|
133
|
+
const payer = asString(settlement['payer']);
|
|
134
|
+
return {
|
|
135
|
+
amount,
|
|
136
|
+
asset,
|
|
137
|
+
network: asString(settlement['network']),
|
|
138
|
+
tx_hash: asString(settlement['transaction']),
|
|
139
|
+
payer_hash: payer ? (0, node_crypto_1.createHash)('sha256').update(payer.toLowerCase()).digest('hex') : null,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Structural stand-in for a Node response object (Express's `res`, or
|
|
144
|
+
* Fastify's `reply.raw`) — just enough to hook the `finish` event and read a
|
|
145
|
+
* header the host app set. Returns null when `res` doesn't look like either
|
|
146
|
+
* shape, so x402 payment capture degrades to "no payment data", never a throw.
|
|
147
|
+
*/
|
|
148
|
+
function responseHooks(res) {
|
|
149
|
+
const candidate = res;
|
|
150
|
+
const target = candidate && typeof candidate === 'object' && candidate.raw && typeof candidate.raw === 'object'
|
|
151
|
+
? candidate.raw
|
|
152
|
+
: candidate;
|
|
153
|
+
if (target &&
|
|
154
|
+
typeof target === 'object' &&
|
|
155
|
+
typeof target['on'] === 'function' &&
|
|
156
|
+
typeof target['getHeader'] === 'function') {
|
|
157
|
+
return {
|
|
158
|
+
on: target['on'].bind(target),
|
|
159
|
+
getHeader: target['getHeader'].bind(target),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
function headerToString(value) {
|
|
165
|
+
if (value == null)
|
|
166
|
+
return null;
|
|
167
|
+
if (Array.isArray(value))
|
|
168
|
+
return typeof value[0] === 'string' ? value[0] : null;
|
|
169
|
+
return typeof value === 'string' ? value : String(value);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* x402 requests need the RESPONSE's settlement header, which doesn't exist
|
|
173
|
+
* until the host app's handler has run — unlike `dispatch`, which fires
|
|
174
|
+
* immediately after `next()`/`done()`. Hooks the response's `finish` event
|
|
175
|
+
* and dispatches from there, carrying `extractContext`'s signals plus
|
|
176
|
+
* whatever payment (if any) `extractPayment` found.
|
|
177
|
+
*
|
|
178
|
+
* Falls back to the ordinary immediate dispatch (no payment data) when `res`
|
|
179
|
+
* doesn't expose the hooks this needs — e.g. a test double, or a framework
|
|
180
|
+
* this package doesn't structurally recognize — rather than dropping the
|
|
181
|
+
* event entirely.
|
|
182
|
+
*/
|
|
183
|
+
function dispatchX402(req, res, options) {
|
|
184
|
+
const hooks = responseHooks(res);
|
|
185
|
+
if (!hooks) {
|
|
186
|
+
dispatch(() => extractContext(req, options), options);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
hooks.on('finish', () => {
|
|
191
|
+
try {
|
|
192
|
+
const context = extractContext(req, options);
|
|
193
|
+
const payment = extractPayment((name) => headerValue(req.headers ?? {}, name), (name) => headerToString(hooks.getHeader(name)));
|
|
194
|
+
dispatch(() => ({ ...context, payment }), options);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
reportError(options, err);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
reportError(options, err);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
62
205
|
/** True when this path should produce an event. */
|
|
63
206
|
function shouldCollect(path, options) {
|
|
64
207
|
const ignore = options.ignore ?? exports.DEFAULT_IGNORE;
|
|
@@ -75,21 +218,80 @@ function shouldCollect(path, options) {
|
|
|
75
218
|
return false;
|
|
76
219
|
return Math.random() < rate;
|
|
77
220
|
}
|
|
221
|
+
const v4Mapped = /^::ffff:(?=\d+\.\d+\.\d+\.\d+$)/i;
|
|
222
|
+
const proxyLists = new WeakMap();
|
|
223
|
+
/**
|
|
224
|
+
* Build (once per options array) the BlockList for `trustedProxies`.
|
|
225
|
+
* Throws on an invalid entry — the adapters call it at creation time so a
|
|
226
|
+
* typo fails at startup, not silently on every request.
|
|
227
|
+
*/
|
|
228
|
+
function trustedProxyList(cidrs) {
|
|
229
|
+
let list = proxyLists.get(cidrs);
|
|
230
|
+
if (list)
|
|
231
|
+
return list;
|
|
232
|
+
list = new node_net_1.BlockList();
|
|
233
|
+
for (const entry of cidrs) {
|
|
234
|
+
// Strict: "<ip>" or "<ip>/<1-3 digits>", nothing else. A lax parse
|
|
235
|
+
// (Number("") === 0) would fail OPEN into a trust-everything subnet.
|
|
236
|
+
const m = /^([^/]+)(?:\/(\d{1,3}))?$/.exec(String(entry).trim());
|
|
237
|
+
const addr = m?.[1] ?? '';
|
|
238
|
+
const family = (0, node_net_1.isIP)(addr);
|
|
239
|
+
const max = family === 4 ? 32 : 128;
|
|
240
|
+
const prefix = m?.[2] === undefined ? undefined : Number(m[2]);
|
|
241
|
+
if (!m || family === 0 || (prefix !== undefined && (prefix < 1 || prefix > max))) {
|
|
242
|
+
throw new Error(`trustedProxies: invalid entry ${JSON.stringify(entry)} — expected an IP or CIDR with a /1-/${max} prefix (/0 would trust everyone)`);
|
|
243
|
+
}
|
|
244
|
+
const type = family === 4 ? 'ipv4' : 'ipv6';
|
|
245
|
+
if (prefix === undefined)
|
|
246
|
+
list.addAddress(addr, type);
|
|
247
|
+
else
|
|
248
|
+
list.addSubnet(addr, prefix, type);
|
|
249
|
+
}
|
|
250
|
+
proxyLists.set(cidrs, list);
|
|
251
|
+
return list;
|
|
252
|
+
}
|
|
253
|
+
function inList(list, raw) {
|
|
254
|
+
const addr = raw.replace(v4Mapped, '');
|
|
255
|
+
const family = (0, node_net_1.isIP)(addr);
|
|
256
|
+
return family !== 0 && list.check(addr, family === 4 ? 'ipv4' : 'ipv6');
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The client IP and whether the END USER could have chosen it. Only two
|
|
260
|
+
* sources are trusted: the socket peer itself, and — when the peer is one of
|
|
261
|
+
* the integrator's declared `trustedProxies` — the right-most
|
|
262
|
+
* X-Forwarded-For hop outside that list (hops to its right were appended by
|
|
263
|
+
* your own proxies). Framework `req.ip` is deliberately NOT consulted:
|
|
264
|
+
* Express `trust proxy = true` resolves it to the client-written leftmost hop.
|
|
265
|
+
*/
|
|
266
|
+
function resolveClientIp(socketIp, xff, options) {
|
|
267
|
+
const hops = (xff ?? '').split(',').map((h) => h.trim()).filter(Boolean);
|
|
268
|
+
if (options.trustedProxies) {
|
|
269
|
+
const list = trustedProxyList(options.trustedProxies);
|
|
270
|
+
if (socketIp === null || !inList(list, socketIp)) {
|
|
271
|
+
return { ip: socketIp, ipTrusted: socketIp !== null };
|
|
272
|
+
}
|
|
273
|
+
for (let i = hops.length - 1; i >= 0; i--) {
|
|
274
|
+
if (!inList(list, hops[i]))
|
|
275
|
+
return { ip: hops[i], ipTrusted: true };
|
|
276
|
+
}
|
|
277
|
+
// Every hop is one of our proxies — there is no client hop to trust.
|
|
278
|
+
return { ip: hops[0] ?? socketIp, ipTrusted: false };
|
|
279
|
+
}
|
|
280
|
+
if ((options.trustProxy ?? true) && hops[0]) {
|
|
281
|
+
// "client, proxy1, proxy2": the first hop is the client, but the client
|
|
282
|
+
// wrote it — usable for geo, never for verification.
|
|
283
|
+
return { ip: hops[0], ipTrusted: false };
|
|
284
|
+
}
|
|
285
|
+
return { ip: socketIp, ipTrusted: socketIp !== null };
|
|
286
|
+
}
|
|
78
287
|
/** Pull the END USER's signals off a node-style request object. */
|
|
79
288
|
function extractContext(req, options = {}) {
|
|
80
289
|
const headers = req.headers ?? {};
|
|
81
|
-
const
|
|
82
|
-
let ip = req.socket?.remoteAddress ?? null;
|
|
83
|
-
if (trustProxy) {
|
|
84
|
-
const xff = headerValue(headers, 'x-forwarded-for');
|
|
85
|
-
// "client, proxy1, proxy2" — the first hop is the client.
|
|
86
|
-
const first = xff?.split(',')[0]?.trim();
|
|
87
|
-
if (first)
|
|
88
|
-
ip = first;
|
|
89
|
-
}
|
|
290
|
+
const { ip, ipTrusted } = resolveClientIp(req.socket?.remoteAddress ?? null, headerValue(headers, 'x-forwarded-for'), options);
|
|
90
291
|
return {
|
|
91
292
|
userAgent: headerValue(headers, 'user-agent') ?? null,
|
|
92
293
|
ip,
|
|
294
|
+
ipTrusted,
|
|
93
295
|
path: req.originalUrl ?? req.url ?? null,
|
|
94
296
|
// Note the historical misspelling: the HTTP header is `Referer`.
|
|
95
297
|
referrer: headerValue(headers, 'referer') ?? headerValue(headers, 'referrer') ?? null,
|
|
@@ -148,7 +350,9 @@ function dispatch(buildContext, options) {
|
|
|
148
350
|
* latency and cannot fail the request.
|
|
149
351
|
*/
|
|
150
352
|
function analyticKitExpress(options) {
|
|
151
|
-
|
|
353
|
+
if (options.trustedProxies)
|
|
354
|
+
trustedProxyList(options.trustedProxies); // fail fast on a typo
|
|
355
|
+
return (req, res, next) => {
|
|
152
356
|
next();
|
|
153
357
|
// Everything after next() is wrapped: the contract this middleware sells
|
|
154
358
|
// is that installing it cannot break the host app, and that has to hold
|
|
@@ -157,6 +361,12 @@ function analyticKitExpress(options) {
|
|
|
157
361
|
const path = req.originalUrl ?? req.url ?? '/';
|
|
158
362
|
if (!shouldCollect(path, options))
|
|
159
363
|
return;
|
|
364
|
+
// x402 needs the settlement header, which only exists once the host
|
|
365
|
+
// app's handler has written a response — see dispatchX402.
|
|
366
|
+
if (detectAgentProtocol((name) => headerValue(req.headers ?? {}, name)) === 'x402') {
|
|
367
|
+
dispatchX402(req, res, options);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
160
370
|
dispatch(() => extractContext(req, options), options);
|
|
161
371
|
}
|
|
162
372
|
catch (err) {
|
|
@@ -170,12 +380,18 @@ function analyticKitExpress(options) {
|
|
|
170
380
|
* app.addHook('onRequest', analyticKitFastify({ client }));
|
|
171
381
|
*/
|
|
172
382
|
function analyticKitFastify(options) {
|
|
173
|
-
|
|
383
|
+
if (options.trustedProxies)
|
|
384
|
+
trustedProxyList(options.trustedProxies); // fail fast on a typo
|
|
385
|
+
return (req, reply, done) => {
|
|
174
386
|
done();
|
|
175
387
|
try {
|
|
176
388
|
const path = req.originalUrl ?? req.url ?? '/';
|
|
177
389
|
if (!shouldCollect(path, options))
|
|
178
390
|
return;
|
|
391
|
+
if (detectAgentProtocol((name) => headerValue(req.headers ?? {}, name)) === 'x402') {
|
|
392
|
+
dispatchX402(req, reply, options);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
179
395
|
dispatch(() => extractContext(req, options), options);
|
|
180
396
|
}
|
|
181
397
|
catch (err) {
|
|
@@ -190,6 +406,12 @@ function analyticKitFastify(options) {
|
|
|
190
406
|
* collect(request);
|
|
191
407
|
* return NextResponse.next();
|
|
192
408
|
* }
|
|
409
|
+
*
|
|
410
|
+
* No x402 payment capture here: this adapter only ever sees the `Request`,
|
|
411
|
+
* never the eventual `Response` (the caller builds and returns that itself,
|
|
412
|
+
* separately) — there is no settlement header to read. x402 detection still
|
|
413
|
+
* sets `protocol: 'x402'` as before; only the `payment` block is unavailable
|
|
414
|
+
* on this adapter.
|
|
193
415
|
*/
|
|
194
416
|
function analyticKitFetch(options) {
|
|
195
417
|
return (request) => {
|
|
@@ -206,6 +428,9 @@ function analyticKitFetch(options) {
|
|
|
206
428
|
return {
|
|
207
429
|
userAgent: request.headers.get('user-agent'),
|
|
208
430
|
ip: trustProxy ? (xff?.split(',')[0]?.trim() ?? null) : null,
|
|
431
|
+
// A Fetch Request carries no socket peer, only headers the client
|
|
432
|
+
// could have written — never trusted for verification.
|
|
433
|
+
ipTrusted: false,
|
|
209
434
|
path,
|
|
210
435
|
referrer: request.headers.get('referer') ?? request.headers.get('referrer'),
|
|
211
436
|
host: request.headers.get('host') ?? url.host,
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -26,6 +26,31 @@ export interface TrackOptions {
|
|
|
26
26
|
workflowId?: string;
|
|
27
27
|
walletAddress?: string;
|
|
28
28
|
chain?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Advisory, caller-declared intent for this event — e.g. "comparing
|
|
31
|
+
* prices", "researching docs". Sent verbatim as the top-level
|
|
32
|
+
* `declared_intent` field; ingest keeps it only if 1-64 chars after
|
|
33
|
+
* trim and drops it silently otherwise (never a 400) — no classifier
|
|
34
|
+
* reads it, it's for display/debugging. See event-schema.ts.
|
|
35
|
+
*/
|
|
36
|
+
declaredIntent?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* x402 settlement captured off the response AFTER it was produced. Field
|
|
40
|
+
* names stay snake_case (unlike the rest of this file) because this object
|
|
41
|
+
* rides straight onto the wire as `request_context.payment` with no mapping
|
|
42
|
+
* step — see the `['payment', 'payment']` entry in index.ts's `trackRequest`.
|
|
43
|
+
*
|
|
44
|
+
* Only ever built when the settlement response said `success === true`.
|
|
45
|
+
* `payer_hash` is a SHA-256 hex digest of the payer address — the raw
|
|
46
|
+
* address is never read into this object, let alone sent.
|
|
47
|
+
*/
|
|
48
|
+
export interface PaymentContext {
|
|
49
|
+
amount: string;
|
|
50
|
+
asset: string | null;
|
|
51
|
+
network: string | null;
|
|
52
|
+
tx_hash: string | null;
|
|
53
|
+
payer_hash: string | null;
|
|
29
54
|
}
|
|
30
55
|
/**
|
|
31
56
|
* The original request's signals, as observed by a server-side collector.
|
|
@@ -35,6 +60,13 @@ export interface TrackOptions {
|
|
|
35
60
|
export interface RequestContext {
|
|
36
61
|
userAgent?: string | null;
|
|
37
62
|
ip?: string | null;
|
|
63
|
+
/**
|
|
64
|
+
* True only when `ip` is the socket peer or came through a configured
|
|
65
|
+
* trusted proxy (or Cloudflare's CF-Connecting-IP) — never a raw
|
|
66
|
+
* X-Forwarded-For. Ingest verifies agent identities against the IP only
|
|
67
|
+
* when this is true AND the client uses a server key.
|
|
68
|
+
*/
|
|
69
|
+
ipTrusted?: boolean | null;
|
|
38
70
|
path?: string | null;
|
|
39
71
|
referrer?: string | null;
|
|
40
72
|
host?: string | null;
|
|
@@ -46,6 +78,8 @@ export interface RequestContext {
|
|
|
46
78
|
* payment payloads) are never captured — only this derived label.
|
|
47
79
|
*/
|
|
48
80
|
protocol?: string | null;
|
|
81
|
+
/** x402 settlement, captured only for x402 requests. See PaymentContext. */
|
|
82
|
+
payment?: PaymentContext | null;
|
|
49
83
|
}
|
|
50
84
|
export interface TrackRequestOptions {
|
|
51
85
|
/** Defaults to 'page_view' so server-collected traffic lands in the same
|
|
@@ -56,5 +90,7 @@ export interface TrackRequestOptions {
|
|
|
56
90
|
idempotencyKey?: string;
|
|
57
91
|
visitorId?: string;
|
|
58
92
|
sessionId?: string;
|
|
93
|
+
/** See `TrackOptions.declaredIntent`. */
|
|
94
|
+
declaredIntent?: string;
|
|
59
95
|
}
|
|
60
96
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC;mDAC+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analytickit/sdk-node",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Server-side event tracking + request middleware for the AgentGraph / AnalyticKit API. Captures AI crawlers and agents (GPTBot, ClaudeBot, MCP, x402, ...) that never run browser JS.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|