@agentronics/sdk 0.4.0 → 0.6.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/README.md +96 -76
- package/dist/chunk-X7NFMFN6.js +1005 -0
- package/dist/chunk-X7NFMFN6.js.map +1 -0
- package/dist/chunk-Y7JYD5RA.js +17 -0
- package/dist/chunk-Y7JYD5RA.js.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +34 -5
- package/dist/index.d.ts +34 -5
- package/dist/index.global.js +3 -3
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init-only.cjs +2 -2
- package/dist/init-only.global.js +2 -2
- package/dist/init-only.global.js.map +1 -1
- package/dist/init-only.js +1 -1
- package/dist/next.cjs +962 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +20 -0
- package/dist/next.d.ts +20 -0
- package/dist/next.js +20 -0
- package/dist/next.js.map +1 -0
- package/dist/server.cjs +1026 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +336 -0
- package/dist/server.d.ts +336 -0
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -0
- package/package.json +37 -5
- package/dist/chunk-YNRQTQM4.js +0 -17
- package/dist/chunk-YNRQTQM4.js.map +0 -1
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { TraceEvent } from '@agentronics/protocol';
|
|
2
|
+
|
|
3
|
+
type CrawlerCategory = 'ai' | 'search';
|
|
4
|
+
interface CrawlerSignature {
|
|
5
|
+
/** Stable vendor id, reported as identity.vendor. */
|
|
6
|
+
name: string;
|
|
7
|
+
category: CrawlerCategory;
|
|
8
|
+
/** Tested against navigator.userAgent. */
|
|
9
|
+
pattern: RegExp;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Server-side crawler identification + verification.
|
|
14
|
+
*
|
|
15
|
+
* A User-Agent claim is trivially spoofable, so on its own it only makes a
|
|
16
|
+
* request "claimed". A claim becomes verified by forward-confirmed reverse DNS
|
|
17
|
+
* (the IP's PTR name sits under the vendor's documented domain AND resolves
|
|
18
|
+
* back to the same IP) — the method Google, Microsoft, Apple, Yandex, Baidu and
|
|
19
|
+
* Amazon document for their crawlers. Needs Node DNS; on edge runtimes the
|
|
20
|
+
* claim stays unverified (use Web Bot Auth, which works everywhere).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** Vendors that document reverse-DNS verification, keyed by signature name. */
|
|
24
|
+
declare const RDNS_DOMAINS: Record<string, string[]>;
|
|
25
|
+
interface CrawlerClaim {
|
|
26
|
+
name: string;
|
|
27
|
+
category: CrawlerSignature['category'];
|
|
28
|
+
}
|
|
29
|
+
declare function classifyUserAgent(ua: string | null, signatures?: CrawlerSignature[]): CrawlerClaim | null;
|
|
30
|
+
/**
|
|
31
|
+
* Where the real client IP comes from. Platform headers are set by the edge
|
|
32
|
+
* and can't be spoofed by the caller; the leftmost X-Forwarded-For entry CAN,
|
|
33
|
+
* so it's never used by default.
|
|
34
|
+
*/
|
|
35
|
+
type ClientIpSource = 'auto' | 'cloudflare' | 'vercel' | ((request: Request) => string | null);
|
|
36
|
+
declare function clientIp(request: Request, source?: ClientIpSource): string | null;
|
|
37
|
+
interface DnsResolver {
|
|
38
|
+
reverse(ip: string): Promise<string[]>;
|
|
39
|
+
lookup(host: string): Promise<string[]>;
|
|
40
|
+
}
|
|
41
|
+
type CrawlerVerification = {
|
|
42
|
+
status: 'verified';
|
|
43
|
+
name: string;
|
|
44
|
+
host: string;
|
|
45
|
+
ip: string;
|
|
46
|
+
} | {
|
|
47
|
+
status: 'unverified';
|
|
48
|
+
name: string;
|
|
49
|
+
reason: string;
|
|
50
|
+
};
|
|
51
|
+
declare function verifyCrawler(claim: CrawlerClaim, ip: string | null, resolver?: DnsResolver): Promise<CrawlerVerification>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Structured Field Values for HTTP (RFC 9651) — the subset HTTP Message
|
|
55
|
+
* Signatures (RFC 9421) and Web Bot Auth need: Dictionaries, Inner Lists,
|
|
56
|
+
* Items, Parameters; bare items of type Integer, Decimal, String, Token,
|
|
57
|
+
* Byte Sequence and Boolean. Parsing is strict (invalid input throws), and
|
|
58
|
+
* serialization is canonical, which RFC 9421 relies on for `@signature-params`.
|
|
59
|
+
*/
|
|
60
|
+
declare class SfToken {
|
|
61
|
+
readonly value: string;
|
|
62
|
+
constructor(value: string);
|
|
63
|
+
}
|
|
64
|
+
declare class SfDecimal {
|
|
65
|
+
readonly value: number;
|
|
66
|
+
constructor(value: number);
|
|
67
|
+
}
|
|
68
|
+
type BareItem = string | number | boolean | Uint8Array | SfToken | SfDecimal;
|
|
69
|
+
type Params = Array<[string, BareItem]>;
|
|
70
|
+
interface Item {
|
|
71
|
+
value: BareItem;
|
|
72
|
+
params: Params;
|
|
73
|
+
}
|
|
74
|
+
interface InnerList {
|
|
75
|
+
items: Item[];
|
|
76
|
+
params: Params;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* HTTP Message Signatures (RFC 9421) — request verification only.
|
|
81
|
+
* Runtime-neutral: WebCrypto + Fetch `Request`, so it runs on Node ≥ 20,
|
|
82
|
+
* Vercel/Next edge middleware, Cloudflare Workers, Deno and Bun.
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
interface ComponentContext {
|
|
86
|
+
request: Request;
|
|
87
|
+
url: URL;
|
|
88
|
+
/** Override for `@authority` (e.g. when a proxy rewrites Host). */
|
|
89
|
+
authority?: string;
|
|
90
|
+
}
|
|
91
|
+
/** Build the signature base (RFC 9421 §2.5) for one Signature-Input member. */
|
|
92
|
+
declare function signatureBase(input: InnerList, ctx: ComponentContext): string;
|
|
93
|
+
interface PublicJwk {
|
|
94
|
+
kty: string;
|
|
95
|
+
crv?: string;
|
|
96
|
+
x?: string;
|
|
97
|
+
y?: string;
|
|
98
|
+
n?: string;
|
|
99
|
+
e?: string;
|
|
100
|
+
kid?: string;
|
|
101
|
+
alg?: string;
|
|
102
|
+
use?: string;
|
|
103
|
+
nbf?: number;
|
|
104
|
+
exp?: number;
|
|
105
|
+
}
|
|
106
|
+
type SignatureAlgorithm = 'ed25519' | 'rsa-pss-sha512' | 'rsa-v1_5-sha256' | 'ecdsa-p256-sha256' | 'ecdsa-p384-sha384';
|
|
107
|
+
/** JWK SHA-256 thumbprint, base64url (RFC 7638; RFC 8037 §A.3 for OKP). */
|
|
108
|
+
declare function jwkThumbprint(jwk: PublicJwk): Promise<string>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Web Bot Auth verifier — draft-meunier-webbotauth-httpsig-protocol-02.
|
|
112
|
+
*
|
|
113
|
+
* A signed agent request carries:
|
|
114
|
+
* Signature-Agent: agent2="https://signer.example" (dictionary form)
|
|
115
|
+
* Signature-Input: sig2=("@authority" "signature-agent";key="agent2");
|
|
116
|
+
* created=…;expires=…;keyid="<JWK thumbprint>";tag="web-bot-auth"
|
|
117
|
+
* Signature: sig2=:<base64>:
|
|
118
|
+
* The verifier resolves the signer's key directory
|
|
119
|
+
* (<origin>/.well-known/http-message-signatures-directory by default), picks
|
|
120
|
+
* the key whose JWK thumbprint equals `keyid`, rebuilds the RFC 9421 signature
|
|
121
|
+
* base, and verifies it. Cheap checks run before any network call.
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
declare const WEB_BOT_AUTH_TAG = "web-bot-auth";
|
|
125
|
+
declare const DIRECTORY_PATH = "/.well-known/http-message-signatures-directory";
|
|
126
|
+
interface ReplayCache {
|
|
127
|
+
has(key: string): boolean | Promise<boolean>;
|
|
128
|
+
add(key: string, ttlSeconds: number): void | Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
/** Bounded in-memory replay cache. Use a shared store (Redis…) across instances. */
|
|
131
|
+
declare function memoryReplayCache(maxEntries?: number): ReplayCache;
|
|
132
|
+
interface WebBotAuthOptions {
|
|
133
|
+
/**
|
|
134
|
+
* Which signers may be resolved. `'any'` (default) accepts any public HTTPS
|
|
135
|
+
* signer behind SSRF guards; a list restricts to those origins/URLs.
|
|
136
|
+
*/
|
|
137
|
+
allowedDirectories?: 'any' | string[];
|
|
138
|
+
/** Accepted clock drift in seconds. Default 60. */
|
|
139
|
+
clockSkewSec?: number;
|
|
140
|
+
/** Max `expires - created`, seconds. Default 86400 (spec: ≤ 24 h recommended). */
|
|
141
|
+
maxValiditySec?: number;
|
|
142
|
+
/** Reject signatures without a `nonce`. Default false. */
|
|
143
|
+
requireNonce?: boolean;
|
|
144
|
+
replayCache?: ReplayCache;
|
|
145
|
+
/** Override `@authority` when a proxy rewrites Host. */
|
|
146
|
+
authority?: (request: Request, url: URL) => string;
|
|
147
|
+
/** Node only: DNS-check directory hosts for private addresses. Default true. */
|
|
148
|
+
resolveDns?: boolean;
|
|
149
|
+
/** Test seams. */
|
|
150
|
+
fetch?: typeof fetch;
|
|
151
|
+
now?: () => number;
|
|
152
|
+
}
|
|
153
|
+
type WebBotAuthResult = {
|
|
154
|
+
status: 'absent';
|
|
155
|
+
} | {
|
|
156
|
+
status: 'verified';
|
|
157
|
+
/** Stable identity: the signer URL (directory origin or JWKS URL). */
|
|
158
|
+
agentUrl: string;
|
|
159
|
+
keyid: string;
|
|
160
|
+
label: string;
|
|
161
|
+
alg: SignatureAlgorithm;
|
|
162
|
+
created: number;
|
|
163
|
+
expires: number;
|
|
164
|
+
} | {
|
|
165
|
+
status: 'invalid';
|
|
166
|
+
reason: string;
|
|
167
|
+
agentUrl?: string;
|
|
168
|
+
keyid?: string;
|
|
169
|
+
};
|
|
170
|
+
declare function verifyWebBotAuth(request: Request, opts?: WebBotAuthOptions): Promise<WebBotAuthResult>;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Agent authentication for any HTTP request — the server half of the SDK.
|
|
174
|
+
*
|
|
175
|
+
* const auth = createAgentAuth({ apiKey: { verify } })
|
|
176
|
+
* const result = await auth.authenticate(request) // Fetch API Request
|
|
177
|
+
*
|
|
178
|
+
* Authentication never blocks. A verified agent gets a stable identity your
|
|
179
|
+
* routes can read; an unverified agent (or a human) browses exactly as before.
|
|
180
|
+
*
|
|
181
|
+
* Methods, strongest first: Web Bot Auth (RFC 9421 signed agents), agent API
|
|
182
|
+
* keys, OAuth2 client-credentials JWTs, and verified crawlers (forward-confirmed
|
|
183
|
+
* reverse DNS). Everything runs on Node ≥ 20 and edge runtimes except crawler
|
|
184
|
+
* rDNS, which needs Node DNS (it degrades to "unverified", never "verified").
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
type AgentAuthMethod = 'web-bot-auth' | 'api-key' | 'oauth2' | 'verified-crawler';
|
|
188
|
+
interface VerifiedAgent {
|
|
189
|
+
/** Stable id: signer URL, API-key agent id, OAuth client id, or crawler name. */
|
|
190
|
+
id: string;
|
|
191
|
+
name: string;
|
|
192
|
+
vendor: string | null;
|
|
193
|
+
method: AgentAuthMethod;
|
|
194
|
+
claims?: Record<string, unknown>;
|
|
195
|
+
}
|
|
196
|
+
type AgentAuthResult = {
|
|
197
|
+
status: 'verified';
|
|
198
|
+
agent: VerifiedAgent;
|
|
199
|
+
} | {
|
|
200
|
+
status: 'unverified';
|
|
201
|
+
reason: string;
|
|
202
|
+
claimedName?: string;
|
|
203
|
+
attempted: AgentAuthMethod[];
|
|
204
|
+
} | {
|
|
205
|
+
status: 'none';
|
|
206
|
+
};
|
|
207
|
+
interface ApiKeyIdentity {
|
|
208
|
+
agentId: string;
|
|
209
|
+
name?: string;
|
|
210
|
+
vendor?: string;
|
|
211
|
+
scopes?: string[];
|
|
212
|
+
}
|
|
213
|
+
interface ApiKeyOptions {
|
|
214
|
+
/** Key prefix that marks a bearer token as an agent key. Default `agk_`. */
|
|
215
|
+
prefix?: string;
|
|
216
|
+
/** Look the key up. Return null for unknown/revoked keys. */
|
|
217
|
+
verify: (key: string) => ApiKeyIdentity | null | Promise<ApiKeyIdentity | null>;
|
|
218
|
+
}
|
|
219
|
+
interface OAuth2Options {
|
|
220
|
+
issuer: string;
|
|
221
|
+
audience: string | string[];
|
|
222
|
+
/** Default `<issuer>/.well-known/jwks.json`. */
|
|
223
|
+
jwksUri?: string;
|
|
224
|
+
/** Static JWKS (tests / pinned keys) instead of fetching `jwksUri`. */
|
|
225
|
+
jwks?: {
|
|
226
|
+
keys: JsonWebKey[];
|
|
227
|
+
};
|
|
228
|
+
requiredScopes?: string[];
|
|
229
|
+
algorithms?: string[];
|
|
230
|
+
clockToleranceSec?: number;
|
|
231
|
+
}
|
|
232
|
+
interface CrawlerOptions {
|
|
233
|
+
/** Where to read the client IP. Default 'auto' (platform headers only). */
|
|
234
|
+
clientIp?: ClientIpSource;
|
|
235
|
+
/** Test seam / custom resolver. */
|
|
236
|
+
resolver?: DnsResolver;
|
|
237
|
+
}
|
|
238
|
+
interface AgentAuthOptions {
|
|
239
|
+
/** Web Bot Auth (on by default). `false` disables it. */
|
|
240
|
+
webBotAuth?: boolean | WebBotAuthOptions;
|
|
241
|
+
apiKey?: ApiKeyOptions;
|
|
242
|
+
oauth2?: OAuth2Options;
|
|
243
|
+
/** Verified crawlers (on by default). `false` disables it. */
|
|
244
|
+
crawlers?: boolean | CrawlerOptions;
|
|
245
|
+
}
|
|
246
|
+
declare function createAgentAuth(options?: AgentAuthOptions): {
|
|
247
|
+
authenticate: (request: Request) => Promise<AgentAuthResult>;
|
|
248
|
+
};
|
|
249
|
+
/** SHA-256 hex of an agent key — store this, never the key. */
|
|
250
|
+
declare function hashAgentKey(key: string): Promise<string>;
|
|
251
|
+
/** Verifier over a static map of `sha256(key) → identity` (e.g. from env/config). */
|
|
252
|
+
declare function staticKeyVerifier(hashedKeys: Record<string, ApiKeyIdentity>): ApiKeyOptions['verify'];
|
|
253
|
+
/** Mint a new agent key (`agk_` + 32 random bytes, base64url). Show it once; store its hash. */
|
|
254
|
+
declare function generateAgentKey(prefix?: string): string;
|
|
255
|
+
declare const AGENT_HEADERS: {
|
|
256
|
+
readonly status: "x-agentronics-agent-status";
|
|
257
|
+
readonly id: "x-agentronics-agent-id";
|
|
258
|
+
readonly name: "x-agentronics-agent-name";
|
|
259
|
+
readonly vendor: "x-agentronics-agent-vendor";
|
|
260
|
+
readonly method: "x-agentronics-auth-method";
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* Request headers to forward downstream, with the auth result attached.
|
|
264
|
+
* Any incoming `x-agentronics-*` header is stripped first so a caller can
|
|
265
|
+
* never forge a verified identity.
|
|
266
|
+
*/
|
|
267
|
+
declare function withAgentHeaders(request: Request, result: AgentAuthResult): Headers;
|
|
268
|
+
/**
|
|
269
|
+
* Read the forwarded result in a route handler (only trust it behind the
|
|
270
|
+
* middleware). Accepts anything with `get()` — `Headers`, Next's read-only
|
|
271
|
+
* `headers()`, or a plain adapter.
|
|
272
|
+
*/
|
|
273
|
+
declare function readAgentHeaders(headers: {
|
|
274
|
+
get(name: string): string | null;
|
|
275
|
+
}): {
|
|
276
|
+
status: "verified" | "unverified" | "none";
|
|
277
|
+
id: string | null;
|
|
278
|
+
name: string | null;
|
|
279
|
+
vendor: string | null;
|
|
280
|
+
method: AgentAuthMethod | null;
|
|
281
|
+
};
|
|
282
|
+
/**
|
|
283
|
+
* Map a result to an SDK trace event so server-side auth shows up in the
|
|
284
|
+
* console's Auth + Logs pages next to in-browser agents. Returns null for
|
|
285
|
+
* non-agent traffic. Server-side agents use class `crawler` (HTTP fetchers);
|
|
286
|
+
* the method is in `metadata.protocol`.
|
|
287
|
+
*/
|
|
288
|
+
declare function toTraceEvent(result: AgentAuthResult, ctx: {
|
|
289
|
+
siteId: string;
|
|
290
|
+
request: Request;
|
|
291
|
+
}): TraceEvent | null;
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Drop-in request handlers built on createAgentAuth().
|
|
295
|
+
*
|
|
296
|
+
* - createAgentAuthHandler(): framework-agnostic (Fetch Request in, identity out)
|
|
297
|
+
* - expressAgentAuth(): Express / Connect middleware
|
|
298
|
+
* - agentronicsMiddleware(): Next.js middleware — see '@agentronics/sdk/next'
|
|
299
|
+
*
|
|
300
|
+
* None of these ever block a request. They authenticate the agent (if any),
|
|
301
|
+
* attach the result as `x-agentronics-*` request headers, and pass every
|
|
302
|
+
* request through — verified agents, unverified agents and humans alike.
|
|
303
|
+
*/
|
|
304
|
+
|
|
305
|
+
interface AgentAuthHandlerOptions extends AgentAuthOptions {
|
|
306
|
+
/** Called for every agent request (not for plain human traffic). Never awaited on the hot path. */
|
|
307
|
+
onResult?: (event: {
|
|
308
|
+
result: AgentAuthResult;
|
|
309
|
+
request: Request;
|
|
310
|
+
}) => void | Promise<void>;
|
|
311
|
+
/** Return false to skip a path (e.g. static assets). */
|
|
312
|
+
matcher?: (url: URL) => boolean;
|
|
313
|
+
}
|
|
314
|
+
interface HandlerOutcome {
|
|
315
|
+
result: AgentAuthResult;
|
|
316
|
+
/** Request headers to forward downstream (spoofed x-agentronics-* stripped). */
|
|
317
|
+
headers: Headers;
|
|
318
|
+
}
|
|
319
|
+
declare function createAgentAuthHandler(options?: AgentAuthHandlerOptions): (request: Request) => Promise<HandlerOutcome>;
|
|
320
|
+
interface NodeReq {
|
|
321
|
+
method?: string;
|
|
322
|
+
url?: string;
|
|
323
|
+
originalUrl?: string;
|
|
324
|
+
protocol?: string;
|
|
325
|
+
headers: Record<string, string | string[] | undefined>;
|
|
326
|
+
agent?: AgentAuthResult;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Express middleware. Sets `req.agent` to the auth result and the
|
|
330
|
+
* `x-agentronics-*` request headers for downstream handlers, then always
|
|
331
|
+
* calls next(). For correct `@authority`/client IP behind a proxy, set
|
|
332
|
+
* Express `trust proxy`.
|
|
333
|
+
*/
|
|
334
|
+
declare function expressAgentAuth(options?: AgentAuthHandlerOptions): (req: NodeReq, _res: unknown, next: (err?: unknown) => void) => void;
|
|
335
|
+
|
|
336
|
+
export { AGENT_HEADERS, type AgentAuthHandlerOptions, type AgentAuthMethod, type AgentAuthOptions, type AgentAuthResult, type ApiKeyIdentity, type ApiKeyOptions, type ClientIpSource, type CrawlerOptions, DIRECTORY_PATH, type HandlerOutcome, type OAuth2Options, type PublicJwk, RDNS_DOMAINS, type ReplayCache, type SignatureAlgorithm, type VerifiedAgent, WEB_BOT_AUTH_TAG, type WebBotAuthOptions, type WebBotAuthResult, classifyUserAgent, clientIp, createAgentAuth, createAgentAuthHandler, expressAgentAuth, generateAgentKey, hashAgentKey, jwkThumbprint, memoryReplayCache, readAgentHeaders, signatureBase, staticKeyVerifier, toTraceEvent, verifyCrawler, verifyWebBotAuth, withAgentHeaders };
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { AGENT_HEADERS, DIRECTORY_PATH, RDNS_DOMAINS, WEB_BOT_AUTH_TAG, classifyUserAgent, clientIp, createAgentAuth, createAgentAuthHandler, expressAgentAuth, generateAgentKey, hashAgentKey, jwkThumbprint, memoryReplayCache, readAgentHeaders, signatureBase, staticKeyVerifier, toTraceEvent, verifyCrawler, verifyWebBotAuth, withAgentHeaders } from './chunk-X7NFMFN6.js';
|
|
2
|
+
//# sourceMappingURL=server.js.map
|
|
3
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"server.js"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentronics/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Authentication for AI agents — verify every agent on your site (WebMCP, browser agents, crawlers, API agents) with any method: Web Bot Auth, API keys, OAuth2, SSO, SPIFFE, mTLS.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -24,6 +24,16 @@
|
|
|
24
24
|
"types": "./dist/lite.d.ts",
|
|
25
25
|
"import": "./dist/lite.js",
|
|
26
26
|
"require": "./dist/lite.cjs"
|
|
27
|
+
},
|
|
28
|
+
"./server": {
|
|
29
|
+
"types": "./dist/server.d.ts",
|
|
30
|
+
"import": "./dist/server.js",
|
|
31
|
+
"require": "./dist/server.cjs"
|
|
32
|
+
},
|
|
33
|
+
"./next": {
|
|
34
|
+
"types": "./dist/next.d.ts",
|
|
35
|
+
"import": "./dist/next.js",
|
|
36
|
+
"require": "./dist/next.cjs"
|
|
27
37
|
}
|
|
28
38
|
},
|
|
29
39
|
"files": [
|
|
@@ -31,7 +41,8 @@
|
|
|
31
41
|
"README.md"
|
|
32
42
|
],
|
|
33
43
|
"dependencies": {
|
|
34
|
-
"
|
|
44
|
+
"jose": "^6.2.3",
|
|
45
|
+
"@agentronics/protocol": "0.4.0"
|
|
35
46
|
},
|
|
36
47
|
"devDependencies": {
|
|
37
48
|
"@size-limit/preset-small-lib": "^11.1.6",
|
|
@@ -40,9 +51,10 @@
|
|
|
40
51
|
"tsup": "^8.3.5",
|
|
41
52
|
"typescript": "^5.7.2",
|
|
42
53
|
"vitest": "^2.1.8",
|
|
54
|
+
"next": "^15.5.27",
|
|
55
|
+
"@agentronics/eslint-config": "0.0.0",
|
|
43
56
|
"@agentronics/tsconfig": "0.0.0",
|
|
44
|
-
"@agentronics/tsup-config": "0.0.0"
|
|
45
|
-
"@agentronics/eslint-config": "0.0.0"
|
|
57
|
+
"@agentronics/tsup-config": "0.0.0"
|
|
46
58
|
},
|
|
47
59
|
"size-limit": [
|
|
48
60
|
{
|
|
@@ -64,6 +76,26 @@
|
|
|
64
76
|
"publishConfig": {
|
|
65
77
|
"access": "public"
|
|
66
78
|
},
|
|
79
|
+
"peerDependencies": {
|
|
80
|
+
"next": ">=14"
|
|
81
|
+
},
|
|
82
|
+
"peerDependenciesMeta": {
|
|
83
|
+
"next": {
|
|
84
|
+
"optional": true
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"keywords": [
|
|
88
|
+
"ai-agents",
|
|
89
|
+
"agent-authentication",
|
|
90
|
+
"web-bot-auth",
|
|
91
|
+
"http-message-signatures",
|
|
92
|
+
"rfc9421",
|
|
93
|
+
"webmcp",
|
|
94
|
+
"bot-verification",
|
|
95
|
+
"oauth2",
|
|
96
|
+
"mtls",
|
|
97
|
+
"spiffe"
|
|
98
|
+
],
|
|
67
99
|
"scripts": {
|
|
68
100
|
"build": "tsup",
|
|
69
101
|
"dev": "tsup --watch",
|
package/dist/chunk-YNRQTQM4.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import {a,b}from'./chunk-LLD3Y2LZ.js';import {AgentClass,isHigherTrust,IdentityClaim,AgentronicsError,PolicyRule,MemoryEntry,SiteMemory,SITE_MEMORY_DEFAULT,TraceEvent,classifyApiKey,PUBLISHABLE_KEY_PREFIX,TRUST_RANK,SiteMemoryPageContext}from'@agentronics/protocol';var ue=[{name:"GPTBot",category:"ai",pattern:/GPTBot/i},{name:"OAI-SearchBot",category:"ai",pattern:/OAI-SearchBot/i},{name:"ChatGPT-User",category:"ai",pattern:/ChatGPT-User/i},{name:"ClaudeBot",category:"ai",pattern:/ClaudeBot/i},{name:"Claude-Web",category:"ai",pattern:/Claude-Web/i},{name:"anthropic-ai",category:"ai",pattern:/anthropic-ai/i},{name:"PerplexityBot",category:"ai",pattern:/PerplexityBot/i},{name:"Google-Extended",category:"ai",pattern:/Google-Extended/i},{name:"Applebot-Extended",category:"ai",pattern:/Applebot-Extended/i},{name:"Amazonbot",category:"ai",pattern:/Amazonbot/i},{name:"Bytespider",category:"ai",pattern:/Bytespider/i},{name:"CCBot",category:"ai",pattern:/CCBot/i},{name:"Meta-ExternalAgent",category:"ai",pattern:/Meta-ExternalAgent/i},{name:"cohere-ai",category:"ai",pattern:/cohere-ai/i},{name:"Googlebot",category:"search",pattern:/Googlebot/i},{name:"Bingbot",category:"search",pattern:/bingbot/i},{name:"DuckDuckBot",category:"search",pattern:/DuckDuckBot/i},{name:"YandexBot",category:"search",pattern:/YandexBot/i},{name:"Baiduspider",category:"search",pattern:/Baiduspider/i},{name:"Applebot",category:"search",pattern:/Applebot/i}],L=(e={})=>{let{signatures:t=ue,disable:r=false,confidence:n=.9}=e;if(r||typeof navigator>"u")return null;let o=navigator.userAgent??"";if(!o)return null;for(let a$1 of t)if(a$1.pattern.test(o))return {class:"crawler",trust:"detected",confidence:n,vendor:a$1.name,userAgent:o,detectionVersion:a,signals:{matched:a$1.name,category:a$1.category,ua:o}};return null};var ht=[/HeadlessChrome/i,/Headless/i,/PhantomJS/i,/SlimerJS/i],vt=()=>({hit:(typeof navigator<"u"&&navigator.webdriver)===true,weight:.6,detail:"navigator.webdriver === true"}),wt=()=>{if(typeof window>"u")return {hit:false,weight:.5};let e=Object.keys(window).filter(t=>t.startsWith("cdc_"));return {hit:e.length>0,weight:.5,detail:`window.${e[0]??"cdc_*"}`}},xt=()=>{if(typeof navigator>"u"||!navigator.plugins)return {hit:false,weight:.2};let e=/Win|Mac|Linux/.test(navigator.userAgent??""),t=navigator.plugins.length===0;return {hit:e&&t,weight:.2,detail:"desktop UA with no plugins"}},St=()=>{if(typeof navigator>"u")return {hit:false,weight:.7};let e=navigator.userAgent??"",t=ht.some(r=>r.test(e));return t?{hit:t,weight:.7,detail:`headless UA: ${e}`}:{hit:t,weight:.7}},bt=()=>{if(typeof navigator>"u")return {hit:false,weight:.15};let e=navigator.languages;return {hit:!e||e.length===0,weight:.15,detail:"navigator.languages empty"}},Tt=()=>{if(typeof navigator>"u")return {hit:false,weight:.1};let e="chrome"in window,t=navigator.userAgent??"";return {hit:/Chrome\//.test(t)&&!/Edg\//.test(t)&&!e,weight:.2,detail:"Chrome UA without window.chrome"}},At={webdriver:vt,chromedriver:wt,headlessUa:St,languages:bt,permissions:Tt,plugins:xt},$=(e={})=>{let{threshold:t=.4}=e,r={},n=0,o=0;for(let[s,d]of Object.entries(At)){let i=d();n+=i.weight,r[s]={hit:i.hit,weight:i.weight,detail:i.detail},i.hit&&(o+=i.weight);}let a$1=n===0?0:o/n;return a$1<t?null:{class:"dom",trust:"detected",confidence:a$1,vendor:null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:r}};var pe=()=>[{id:"webmcp.model-context",status:"stable",detect:()=>b({pollMs:0})},{id:"crawler.user-agent",status:"beta",detect:()=>L()},{id:"dom.automation-heuristics",status:"beta",detect:()=>$()}],K=(e=pe())=>{let t=new Map(e.map(r=>[r.id,r]));return {register(r){t.set(r.id,r);},list(r){let n=[...t.values()];return r?n.filter(o=>o.status===r):n},async detectAll(r=false){for(let n of t.values()){if(n.status==="research"&&!r)continue;let o=await n.detect();if(o)return o}return null}}};var It=e=>{let t=AgentClass.parse(e.class),r=e.verificationToken?"verified":"declared";return {class:t,trust:r,confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{declared:true,hasVerificationToken:!!e.verificationToken}}};var Mt=({gatewayUrl:e,fetcher:t=fetch})=>{let r=null,n=[];return {snapshot(){return [...n]},async sync(){let o=await t(`${e.replace(/\/$/,"")}/v1/detector-signatures`,{headers:r?{"if-none-match":r}:{}});if(o.status===304)return this.snapshot();if(!o.ok)throw new Error(`Detector signature sync failed with status ${o.status}.`);return n=(await o.json()).signatures??[],r=o.headers.get("etag"),this.snapshot()}}};var de=async(e={})=>{if(e.customDetectors?.length){let t=await K(e.customDetectors).detectAll(!!e.experimental);if(t)return t}if(e.webmcp!==false){let t=await b(e.webmcp??{});if(t)return t}if(e.crawler!==false){let t=L(e.crawler??{});if(t)return t}if(e.dom!==false){let t=$(e.dom??{});if(t)return t}return null};var Ot=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),me=()=>{let e=null;return {present(t){let r=IdentityClaim.safeParse(t);if(!r.success)throw new AgentronicsError("invalid_api_key",`Invalid identity claim: ${r.error.issues[0]?.message??"unknown"}`);let n={claim:r.data,identity:Ot(r.data)};return e=n,n},clear(){e=null;},preferOver(t){return e?t?isHigherTrust(e.identity.trust,t.trust)?e.identity:t:e.identity:t},snapshot(){return e}}};var Kr=({detected:e,declared:t,verified:r,linked:n})=>n?"linked":r?"verified":t?"declared":"detected",ye=e=>{let t=null;for(let r of e)(!t||TRUST_RANK[r.trust]>TRUST_RANK[t.trust])&&(t=r);return t};var fe=()=>({name:"bearer",async authenticate(e,t){if(!e.bearerToken)return null;let r=await t.verifyToken?.("bearer",e.bearerToken);return {class:e.classHint??"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"bearer",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{bearer:true,verifiedRemotely:!!r}}}});var he=()=>({name:"detection",async authenticate(e){return e.detected??null}});var ve=()=>({name:"extensionToken",async authenticate(e,t){if(!e.extensionToken)return null;let r=await t.verifyToken?.("extensionToken",e.extensionToken);return {class:"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"browser-extension",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{extensionToken:true,verifiedRemotely:!!r}}}});var we=()=>({name:"mtls",async authenticate(e,t){if(!e.xfccHeader)return null;let r=await t.verifyToken?.("mtls",e.xfccHeader);return {class:e.classHint??"webmcp",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"mtls",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{mtls:true,subject:r?.subject??null,verifiedRemotely:!!r,...r?.signals??{}}}}});var xe=()=>({name:"oauth2",async authenticate(e,t){if(!e.oauth2AccessToken)return null;let r=await t.verifyToken?.("oauth2",e.oauth2AccessToken);return {class:e.classHint??"webmcp",trust:e.oauth2Subject?"linked":r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"oauth2",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{oauth2:true,subject:e.oauth2Subject??null,verifiedRemotely:!!r}}}});var Dt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),Se=()=>({name:"selfDeclaration",async authenticate(e){return e.declaration?Dt(IdentityClaim.parse(e.declaration)):null}});var be=()=>({name:"sessionLink",async authenticate(e,t){if(!e.sessionLinkToken)return null;let r=await t.verifyToken?.("sessionLink",e.sessionLinkToken);return {class:e.classHint??"screenshot",trust:e.linkedUserId?"linked":r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"session-link",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{sessionLink:true,linkedUserId:e.linkedUserId??null,verifiedRemotely:!!r}}}});var Te=()=>({name:"sso",async authenticate(e,t){if(!e.ssoIdToken)return null;let r=await t.verifyToken?.("sso",e.ssoIdToken);return {class:e.classHint??"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"sso",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{sso:true,subject:r?.subject??null,verifiedRemotely:!!r,...r?.signals??{}}}}});var Ae=()=>({name:"spiffe",async authenticate(e,t){if(!e.spiffeJwt)return null;let r=await t.verifyToken?.("spiffe",e.spiffeJwt),n=r?.vendor==="google";return {class:e.classHint??"webmcp",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"spiffe",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{spiffe:true,spiffeId:r?.subject??null,subject:r?.subject??null,verifiedRemotely:!!r,...n?{googleAgent:true}:{},...r?.signals??{}}}}});var ke=()=>({name:"xAgentHeader",async authenticate(e){if(!e.xAgentHeader)return null;let[t="x-agent",r="dom",n]=e.xAgentHeader.split(";"),o=AgentClass.safeParse(r);return {class:o.success?o.data:"dom",trust:n?"verified":"declared",confidence:n?1:.8,vendor:t,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:a,signals:{xAgentHeader:true,hasProof:!!n}}}});var $t=()=>[he(),Se(),fe(),ke(),ve(),be(),xe(),Te(),Ae(),we()],jt={detection:"detection",selfDeclaration:"declaration",bearer:"bearer",xAgentHeader:"x-agent-header",extensionToken:"extension",sessionLink:"session-link",oauth2:"oauth2",sso:"sso",spiffe:"spiffe",mtls:"mtls"},Bt=(e,t)=>e==="spiffe"&&t.signals?.googleAgent===true?"google-agent":jt[e],Ie=({methods:e=$t(),context:t={},onTrace:r}={})=>({async authenticate(n){let o=[],a={};for(let m of e){let p=await m.authenticate(n,t);a[m.name]=!!p,p&&o.push({method:m.name,identity:p});}let s=ye(o.map(m=>m.identity)),d=s?o.find(m=>m.identity===s):void 0,i=d?Bt(d.method,d.identity):void 0,y=typeof s?.signals?.subject=="string"?s.signals.subject:void 0,u={type:s?"auth.identity_presented":"sdk.error",agent:s,outcome:s?"success":"error",metadata:{methods:a,...i?{protocol:i}:{},...y?{subject:y}:{}}};return s||(u.error="No auth method produced an identity."),r?.(u),s},methods(){return e.map(n=>n.name)}});var Wt={identity:null,source:"initial",updatedAt:null},Me=()=>{let e=Wt,t=new Set,r=()=>{t.size!==0&&t.forEach(n=>n(e));};return {snapshot(){return e},set(n,o){e={identity:n,source:o,updatedAt:new Date().toISOString()},r();},subscribe(n){return t.add(n),()=>{t.delete(n);}}}};var Gt=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);}}},Nt=()=>typeof window>"u"||!window.localStorage?Gt():{read:e=>{try{return window.localStorage.getItem(e)}catch{return null}},write:(e,t)=>{try{window.localStorage.setItem(e,t);}catch{}}},_t=e=>{if(!e)return null;try{let t=JSON.parse(e);if(typeof t=="object"&&t!==null&&Number.isFinite(t.count)&&Number.isFinite(t.resetAt))return t}catch{return null}return null},Re=(e=Nt())=>({consume(t,r,n=Date.now()){let o=`agtx:rate:${t}`,a=_t(e.read(o)),s=a&&a.resetAt>n?a.resetAt:n+r.windowSeconds*1e3,d=a&&a.resetAt>n?a.count+1:1;return e.write(o,JSON.stringify({count:d,resetAt:s})),{allowed:d<=r.max,remaining:Math.max(0,r.max-d),resetAt:s}}});var Ut=(e,t)=>e==="*"||e===t?true:e.includes("*")?new RegExp("^"+e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$").test(t):false,Kt=(e,t)=>{let r=e?TRUST_RANK[e.trust]:-1,n=TRUST_RANK[t.minTrust];return r>=n},Ht=(e,t)=>t.allowedClasses.length===0?true:e?t.allowedClasses.includes(e.class):false,Oe="review",zt=(e,t)=>{let r=t?.class??"unknown",n=t?.vendor??"unknown",o=t?.trust??"none";return `${e}:${r}:${n}:${o}`},Ce=(e=[],t={})=>{let r=e.map(o=>PolicyRule.parse(o)),n=t.rateLimiter??Re();return {set(o){r=o.map(a=>PolicyRule.parse(a));},list(){return [...r]},evaluate({tool:o,identity:a}){for(let s of r)if(Ut(s.tool,o)){if(!Kt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" requires trust >= ${s.minTrust}.`};if(!Ht(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" restricts to classes: ${s.allowedClasses.join(", ")}.`};if(s.rateLimit){let d=n.consume(zt(o,a),s.rateLimit);if(!d.allowed)return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" rate limit exceeded. Resets at ${new Date(d.resetAt).toISOString()}.`}}return {decision:s.decision,ruleId:s.id,reason:`Matched rule "${s.id}".`}}return {decision:Oe,ruleId:null,reason:`No rule matched tool "${o}". Falling back to "${Oe}".`}}}};var De=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>{let o={policies:[],etag:null};return {snapshot(){return {policies:[...o.policies],etag:o.etag}},async sync(){let a=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/policies`,{headers:{authorization:`Bearer ${r}`,...o.etag?{"if-none-match":o.etag}:{}}});if(a.status===304)return this.snapshot();if(!a.ok)throw new Error(`Policy sync failed with status ${a.status}.`);let s=await a.json();return o={policies:PolicyRule.array().parse(s.policies??[]),etag:a.headers.get("etag")},this.snapshot()}}};var Le=({message:e="Agent action blocked by site policy.",durationMs:t=2400,documentRef:r=typeof document>"u"?void 0:document}={})=>{if(!r?.body)return null;let n=r.createElement("div");return n.setAttribute("role","status"),n.setAttribute("data-agentronics-deny-overlay","true"),n.textContent=e,Object.assign(n.style,{position:"fixed",zIndex:"2147483647",left:"50%",bottom:"24px",transform:"translateX(-50%)",maxWidth:"min(520px, calc(100vw - 32px))",padding:"12px 16px",borderRadius:"8px",background:"#07091A",color:"#F4F4F5",border:"1px solid #6366F1",boxShadow:"0 20px 48px -16px rgba(7,9,26,0.55)",font:"13px/1.45 'Space Mono', ui-monospace, SFMono-Regular, Menlo, monospace"}),r.body.appendChild(n),window.setTimeout(()=>n.remove(),t),n};var $e=({policyEngine:e,getIdentity:t,documentRef:r=typeof document>"u"?void 0:document,selector:n="[data-agentronics-tool]"})=>{if(!r)return {uninstall:()=>{}};let o=a=>{let s=a.target instanceof Element?a.target.closest(n):null;if(!(s instanceof HTMLElement))return;let d=s.dataset.agentronicsTool;d&&Promise.resolve(t()).then(i=>{let y=e.evaluate({tool:d,identity:i});y.decision==="deny"&&(a.preventDefault(),a.stopPropagation(),Le({message:y.reason,documentRef:r}));});};return r.addEventListener("click",o,true),{uninstall:()=>r.removeEventListener("click",o,true)}};var H=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);},remove:t=>{e.delete(t);},keys:()=>[...e.keys()]}},je=(e,t)=>({read:r=>{try{return e.getItem(t+r)}catch{return null}},write:(r,n)=>{try{e.setItem(t+r,n);}catch{}},remove:r=>{try{e.removeItem(t+r);}catch{}},keys:()=>{let r=[];try{for(let n=0;n<e.length;n++){let o=e.key(n);o&&o.startsWith(t)&&r.push(o.slice(t.length));}}catch{}return r}}),Be="agtx:",We=()=>{let e=typeof window<"u",t=e&&typeof window.sessionStorage<"u"?je(window.sessionStorage,Be+"session:"):H(),r=e&&typeof window.localStorage<"u"?je(window.localStorage,Be+"user:"):H();return {session:t,user:r,org:H()}};var Ne=(e,t)=>e.expiresAt!==null&&e.expiresAt<=t,_e=e=>{if(!e)return null;try{let t=JSON.parse(e);return typeof t!="object"||t===null?null:t}catch{return null}},Ft=e=>JSON.stringify(e),Ue=(e={})=>{let t=We(),r=i=>{e.onTrace?.(i);};return {get:(i,y={})=>{let u=y.scope??"session",m=t[u],p=_e(m.read(i));if(!p){r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:false}});return}if(Ne(p,Date.now())){m.remove(i),r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:false,expired:true}});return}return r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:true}}),p.value},set:(i,y,u={})=>{let m=u.scope??"session",p=u.ttlSeconds??null,h=Date.now(),w={value:y,expiresAt:p===null?null:h+p*1e3,updatedAt:new Date(h).toISOString()};return t[m].write(i,Ft(w)),r({type:"memory.updated",metadata:{operation:"set",key:i,scope:m,ttlSeconds:p}}),MemoryEntry.parse({key:i,value:y,scope:m,ttlSeconds:p,updatedAt:w.updatedAt})},remove:(i,y={})=>{let u=y.scope??"session";t[u].remove(i),r({type:"memory.updated",metadata:{operation:"remove",key:i,scope:u}});},list:(i={})=>{let y=i.scope??"session",u=t[y],m=Date.now(),p=[];for(let h of u.keys()){let w=_e(u.read(h));if(w){if(Ne(w,m)){u.remove(h);continue}p.push(MemoryEntry.parse({key:h,value:w.value,scope:y,ttlSeconds:w.expiresAt===null?null:Math.max(0,Math.round((w.expiresAt-m)/1e3)),updatedAt:w.updatedAt}));}}return r({type:"memory.accessed",metadata:{operation:"list",scope:y,count:p.length}}),p},clear:(i={})=>{let y=i.scope??"session",u=t[y],m=u.keys().length;for(let p of u.keys())u.remove(p);r({type:"memory.updated",metadata:{operation:"clear",scope:y,count:m}});}}};var z=e=>SiteMemory.parse(JSON.parse(JSON.stringify(e))),W=e=>({...e,updatedAt:new Date().toISOString()}),Ke=(e={})=>{let t=SiteMemory.parse({...SITE_MEMORY_DEFAULT,...e.initial??{}}),r=null,n=new Set,o=l=>{e.onTrace?.(l);},a=()=>{r=null;},s=()=>{if(n.size===0)return;let l=z(t);r=l,n.forEach(v=>v(l));},d=l=>{let v=SiteMemory.parse({...t,...l,workflows:{...t.workflows,...l.workflows??{}},policies:{...t.policies,...l.policies??{}},uiGuidance:{...t.uiGuidance,...l.uiGuidance??{}},pageContexts:{...t.pageContexts,...l.pageContexts??{}}});return t=W(v),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"provide",keys:Object.keys(l)}}),s(),u()},i=(l,v)=>{let x=l.split(".").filter(Boolean);if(x.length===0)throw new Error("siteMemory.update() requires a non-empty dot-path.");let k=JSON.parse(JSON.stringify(t)),I=k;for(let R=0;R<x.length-1;R++){let T=x[R],E=I[T];(typeof E!="object"||E===null||Array.isArray(E))&&(I[T]={}),I=I[T];}return I[x[x.length-1]]=v,t=W(SiteMemory.parse(k)),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"update",path:l}}),s(),u()},y=l=>{let v=SiteMemoryPageContext.parse({path:l.path,payload:l.payload,updatedAt:new Date().toISOString()});return t=W({...t,pageContexts:{...t.pageContexts,[l.path]:v}}),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"provideForPage",path:l.path}}),s(),{...v,payload:{...v.payload}}},u=()=>(r||(r=z(t)),r);return {provide:d,update:i,provideForPage:y,snapshot:u,get:l=>{if(o({type:"memory.accessed",metadata:{kind:"site",operation:l?"get":"snapshot",path:l??null}}),!l)return z(t);let v=l.split(".").filter(Boolean),x=t;for(let k of v){if(typeof x!="object"||x===null)return;x=x[k];}return x},getForPage:l=>{o({type:"memory.accessed",metadata:{kind:"site",operation:"getForPage",path:l}});let v=t.pageContexts[l];return v?{...v,payload:{...v.payload}}:null},replace:l=>(t=W(SiteMemory.parse(l)),a(),s(),u()),subscribe:l=>(n.add(l),()=>{n.delete(l);})}};var ze=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>{let o={memory:null,etag:null};return {snapshot(){return {memory:o.memory?SiteMemory.parse(o.memory):null,etag:o.etag}},async sync(){let a=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/memory`,{headers:{authorization:`Bearer ${r}`,...o.etag?{"if-none-match":o.etag}:{}}});if(a.status===304)return this.snapshot();if(!a.ok)throw new Error(`Memory sync failed with status ${a.status}.`);let s=await a.json();return o={memory:SiteMemory.parse(s.memory??{}),etag:a.headers.get("etag")},this.snapshot()}}};var Xt=({toolName:e="getSiteContext",description:t="Returns Agentronics site memory: page map, workflows, policies, UI guidance.",getSnapshot:r,onAccess:n})=>({name:e,description:t,inputSchema:{type:"object",properties:{path:{type:"string",description:'Optional dot-path into the site memory (e.g. "workflows.purchase").'}},required:[]},invoke(o={}){let a=r(),s=o.path??null;if(n?.(s),!s)return {content:a};let d=s.split(".").filter(Boolean),i=a;for(let y of d){if(typeof i!="object"||i===null)return {content:void 0};i=i[y];}return {content:i}}});var A="agent-context-",V="agentronics-site-context",Yt=e=>{try{return JSON.stringify(e)}catch{return "{}"}},G=(e,t,r)=>{let n=e.querySelector(`meta[name="${t}"]`);n||(n=e.createElement("meta"),n.setAttribute("name",t),e.head.appendChild(n)),n.setAttribute("content",r);},N=(e,t)=>{e.querySelectorAll(`meta[name="${t}"]`).forEach(r=>r.remove());},F=({doc:e=typeof document>"u"?null:document,snapshot:t,schemaType:r="WebSite"})=>{if(!e)return {uninstall:()=>{}};G(e,`${A}version`,t.version),G(e,`${A}updated-at`,t.updatedAt??new Date().toISOString()),t.siteMap?.navigation?.flow&&G(e,`${A}flow`,t.siteMap.navigation.flow),G(e,`${A}workflows`,Object.keys(t.workflows).join(","));let n=e.getElementById(V);return n||(n=e.createElement("script"),n.type="application/ld+json",n.id=V,e.head.appendChild(n)),n.textContent=Yt({"@context":"https://schema.org","@type":r,name:"Agentronics Site Memory",agentronics:t}),{uninstall:()=>{N(e,`${A}version`),N(e,`${A}updated-at`),N(e,`${A}flow`),N(e,`${A}workflows`),e.getElementById(V)?.remove();}}};var Ve="agentronics-memory-overlay",Qt=e=>`
|
|
2
|
-
position: fixed;
|
|
3
|
-
bottom: 16px;
|
|
4
|
-
right: 16px;
|
|
5
|
-
max-width: 320px;
|
|
6
|
-
padding: 10px 12px;
|
|
7
|
-
background: rgba(17, 24, 39, 0.92);
|
|
8
|
-
color: #f9fafb;
|
|
9
|
-
font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
10
|
-
border-radius: 8px;
|
|
11
|
-
z-index: 2147483647;
|
|
12
|
-
opacity: ${e?"0":"1"};
|
|
13
|
-
pointer-events: ${e?"none":"auto"};
|
|
14
|
-
box-shadow: 0 12px 32px rgba(15, 23, 42, 0.35);
|
|
15
|
-
`,Fe=e=>{let t=e.siteMap?.pages?.length??0,r=Object.keys(e.workflows).length,n=Object.keys(e.uiGuidance).length;return `Agentronics site memory \xB7 pages:${t} \xB7 workflows:${r} \xB7 ui-hints:${n}`},J=({doc:e=typeof document>"u"?null:document,snapshot:t,hidden:r=false})=>{if(!e)return {uninstall:()=>{},refresh:()=>{}};let n=e.getElementById(Ve);return n||(n=e.createElement("div"),n.id=Ve,n.setAttribute("role","note"),n.setAttribute("aria-label","Agentronics site memory summary"),n.setAttribute("data-agent-context","overlay"),e.body.appendChild(n)),n.setAttribute("style",Qt(r)),n.textContent=Fe(t),{uninstall:()=>{n?.remove();},refresh:o=>{n&&(n.textContent=Fe(o));}}};var qe="/.well-known/agent-context.json",q=async({origin:e,fetcher:t=fetch,signal:r}={})=>{let n=(e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:"")+qe;if(!n.startsWith("http"))return null;let o={headers:{accept:"application/json"}};r!==void 0&&(o.signal=r);let a=await t(n,o);if(!a.ok){if(a.status===404)return null;throw new Error(`well-known agent-context fetch failed with status ${a.status}.`)}let s=await a.json();return SiteMemory.parse(s)},Zt=({snapshot:e})=>JSON.stringify(SiteMemory.parse(e));var Xe=({evaluate:e,setPolicies:t,listPolicies:r,onTrace:n,identityResolver:o})=>{let a=new Map,s=new Set,d=i=>{if(!i.authz||!t||!r)return;let y={id:`tool:${i.name}`,tool:i.name,...i.authz,rateLimit:i.rateLimit??i.authz.rateLimit};t([...r().filter(u=>u.id!==y.id),y]);};return {register(i){return a.set(i.name,i),s.delete(i.name),d(i),n?.({type:"tool.registered",tool:i.name,metadata:{version:i.version??null,group:i.group??null,stage:i.stage??null}}),()=>{a.delete(i.name),s.delete(i.name);}},unregister(i){a.delete(i),s.delete(i);},enable(i){!a.has(i)||!s.has(i)||(s.delete(i),n?.({type:"tool.surfaced",tool:i,metadata:{state:"enabled"}}));},disable(i){!a.has(i)||s.has(i)||(s.add(i),n?.({type:"tool.surfaced",tool:i,metadata:{state:"disabled"}}));},isEnabled:i=>a.has(i)&&!s.has(i),list({includeDisabled:i=false}={}){let y=[...a.values()];return i?y:y.filter(u=>!s.has(u.name))},get:i=>a.get(i),async execute(i,y,u){let m=u===void 0?o?.()??null:u,p=a.get(i);if(!p)throw new Error(`Tool "${i}" is not registered.`);if(s.has(i)){let l={decision:"deny",ruleId:`tool:${i}`,reason:"Tool is disabled."};throw n?.({type:"tool.executed",tool:i,agent:m,policy:l,outcome:"blocked"}),new Error(l.reason)}let h=await e(i,{identity:m});if(h.decision==="deny")throw n?.({type:"tool.executed",tool:i,agent:m,policy:h,outcome:"blocked"}),new Error(h.reason);let w=Date.now();try{let l=await p.execute(y,{identity:m});return n?.({type:"tool.executed",tool:i,agent:m,policy:h,outcome:"success",durationMs:Date.now()-w}),l}catch(l){throw n?.({type:"tool.executed",tool:i,agent:m,policy:h,outcome:"error",durationMs:Date.now()-w,error:l instanceof Error?l.message:String(l)}),l}}}};var Ye=(e,t={})=>{let r=new Map;for(let s of e.stages)r.set(s.name,s);if(!r.has(e.initial))throw new Error(`Initial stage "${e.initial}" is not declared in progression stages.`);let n=e.initial,o=()=>{let s=r.get(n);return s?.enables?[n,...s.enables]:[n]},a=(s,d)=>{let i=n;if(!r.has(s))throw new Error(`Cannot transition to unknown stage "${s}".`);return s===n?{changed:false,from:i,to:s}:(n=s,t.onTrace?.({type:"tool.progressed",metadata:{from:i,to:s,trigger:d}}),{changed:true,from:i,to:s})};return {current:()=>n,enabledStages:()=>o(),notify(s){let i=r.get(n)?.transitions?.find(y=>y.on===s);return i?a(i.to,s):{changed:false,from:n,to:n}},set(s){return a(s,"manual")},reset(){let s=n;n=e.initial,s!==n&&t.onTrace?.({type:"tool.progressed",metadata:{from:s,to:n,trigger:"reset"}});},snapshot:()=>({current:n,enabled:o()})}};var er=(e,t)=>{let r=e.authz?.minTrust;return r?t?TRUST_RANK[t.trust]<TRUST_RANK[r]?{ok:false,reason:`trust-too-low:${t.trust}<${r}`}:{ok:true,reason:"trust-ok"}:{ok:false,reason:`requires-trust:${r}`}:{ok:true,reason:"no-trust-floor"}},tr=(e,t)=>{let r=e.authz?.allowedClasses??[];return r.length===0?{ok:true,reason:"no-class-restriction"}:t?r.includes(t.class)?{ok:true,reason:"class-ok"}:{ok:false,reason:`class-not-allowed:${t.class}`}:{ok:false,reason:`requires-class:${r.join("|")}`}},rr=(e,t)=>e.stage?t.enabledStages&&t.enabledStages.includes(e.stage)?{ok:true,reason:`stage-enabled:${e.stage}`}:t.stage===e.stage?{ok:true,reason:`stage-active:${e.stage}`}:{ok:false,reason:`stage-locked:${e.stage}`}:{ok:true,reason:"no-stage"},Ze=(e,t)=>{let r=er(e,t.identity);if(!r.ok)return {tool:e,visible:false,reason:r.reason};let n=tr(e,t.identity);if(!n.ok)return {tool:e,visible:false,reason:n.reason};let o=rr(e,t);return o.ok?e.authz?.decision==="deny"?{tool:e,visible:false,reason:"authz-deny"}:{tool:e,visible:true,reason:"visible"}:{tool:e,visible:false,reason:o.reason}},et=(e,t)=>e.filter(r=>Ze(r,t).visible),tt=(e,t)=>e.map(r=>Ze(r,t));var rt="default",nt=e=>{let t=new Map;for(let r of e){let n=r.group??rt,o=t.get(n)??[];o.push(r),t.set(n,o);}return [...t.entries()].sort(([r],[n])=>r.localeCompare(n)).map(([r,n])=>({name:r,tools:n}))},no=e=>[...new Set(e.map(t=>t.group??rt))].sort();var X=e=>e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(X).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${X(e[r])}`).join(",")}}`,nr=e=>{let t={name:e.name,version:e.version??null,group:e.group??null,description:e.description??null,inputSchema:e.inputSchema??null,authz:e.authz??null,rateLimit:e.rateLimit??null},r=X(t).length;return {name:e.name,characters:r,tokens:Math.ceil(r/4)}},ot=e=>{let t=e.map(nr);return {total:t.reduce((n,o)=>n+o.tokens,0),perTool:t}};var it=e=>{if(e.provider)return e.provider;let r=(e.doc?.defaultView??(typeof globalThis<"u"?globalThis:null))?.navigator?.modelContext;return !r||typeof r.provideContext!="function"?null:r},or=(e,t)=>{let r={name:e.name,invoke:n=>t(e,n)};return e.description!==void 0&&(r.description=e.description),e.inputSchema!==void 0&&(r.inputSchema=e.inputSchema),r},st=(e={})=>{let t=e.invoke??(async(n,o)=>n.execute(o,{identity:null})),r=null;return {publish(n){let o=it(e);return o?(r?.revoke(),r=o.provideContext({tools:n.map(a=>or(a,t))}),{revoked:true}):{revoked:false}},revoke(){r?.revoke(),r=null;},available:()=>!!it(e)}};var Y=(e=500)=>{let t=[];return {add(r){t.push(r),t.length>e&&t.splice(0,t.length-e);},list(){return [...t]},clear(){t.length=0;}}};var at=(e,t)=>e===void 0?t:Math.max(0,Math.min(1,e)),Q=(e={})=>{let t=at(e.traceRate,1),r=at(e.errorRate,1),n=e.random??Math.random;return {shouldKeep(o){let a=o.outcome==="error"?r:t;return n()<a}}};var ir="[REDACTED]",sr=e=>{if(e!==void 0)return JSON.parse(JSON.stringify(e))},Z=(e,t)=>{if(t.length===0||typeof e!="object"||e===null)return;let[r,...n]=t;if(!r)return;if(Array.isArray(e)){for(let a of e)Z(a,t);return}let o=e;if(r in o){if(n.length===0){o[r]=ir;return}Z(o[r],n);}},ee=(e,t=[])=>{if(t.length===0)return e;let r=sr(e);for(let n of t)Z(r,n.split(".").filter(Boolean));return r},te=["metadata.password","metadata.token","metadata.authorization","metadata.cookie"];var cr=()=>typeof location<"u"&&typeof location.pathname=="string"?location.pathname:void 0,ct=e=>{let t=globalThis.crypto;return t&&"randomUUID"in t?`${e}_${t.randomUUID()}`:`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`},re=({siteId:e,bufferSize:t,sessionId:r=ct("ses"),scrubPaths:n=te,exporters:o=[],onExporterError:a,pageProvider:s=cr,...d})=>{let i=Y(t),y=Q(d),u=()=>{try{return s()}catch{return}};return {sessionId:r,async emit(m){let p={...m.metadata};if(p.page===void 0){let w=u();w!==void 0&&(p.page=w);}let h=TraceEvent.parse(ee({id:ct("trc"),siteId:e,sessionId:r,occurredAt:new Date().toISOString(),outcome:m.outcome??"success",...m,metadata:p},n));return y.shouldKeep(h)?(i.add(h),await Promise.all(o.map(async w=>{try{await w.export([h]);}catch(l){a?.(l,w,h);}})),h):null},list:()=>i.list(),clear:()=>i.clear()}};var ne=()=>({name:"console",export(e){for(let t of e)console.info("[agentronics:trace]",t.type,t);}});var oe=({gatewayUrl:e,publishableKey:t,fetcher:r=fetch})=>({name:"gateway",async export(n){let o={publishableKey:t,events:n};await r(`${e.replace(/\/$/,"")}/v1/traces`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(o)});}});var lr=e=>new Promise(t=>setTimeout(t,e)),se=({url:e,fetcher:t=fetch,maxRetries:r=2,queueLimit:n=500})=>({name:"webhook",async export(o){let s=[...ur(e),...o].slice(-n),d=0;for(;;){let i=await t(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({events:s})});if(i.ok){lt(e,[]);return}if(d>=r)throw lt(e,s),new Error(`Webhook exporter failed with status ${i.status}.`);d+=1,await lr(100*d);}}}),ie=e=>`agtx:webhook:${e}`,ur=e=>{if(typeof window>"u"||!window.localStorage)return [];try{let t=window.localStorage.getItem(ie(e));return t?JSON.parse(t):[]}catch{return []}},lt=(e,t)=>{if(!(typeof window>"u"||!window.localStorage))try{if(t.length===0){window.localStorage.removeItem(ie(e));return}window.localStorage.setItem(ie(e),JSON.stringify(t));}catch{}};var ut="/v1/sdk/events",pr=({url:e,ingestKey:t,fetcher:r=fetch})=>{let n=e.replace(/\/$/,""),o=n.endsWith(ut)?n:`${n}${ut}`;return {name:"intel",async export(a){let s={events:a},d=await r(o,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(s)});if(!d.ok)throw new Error(`Intel exporter failed with status ${d.status}.`)}}};var dr=e=>{let t={name:e.name,description:e.description??"",inputSchema:e.inputSchema??{},tokens:0};return e.group&&(t.group=e.group),e.stage&&(t.page=e.stage),e.outputSchema&&(t.outputSchema=e.outputSchema),t.tokens=Math.ceil(JSON.stringify({name:t.name,description:t.description,inputSchema:t.inputSchema,...t.outputSchema?{outputSchema:t.outputSchema}:{}}).length/4),t},pt=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>({async push(o){let a=o.map(dr),s=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/tools`,{method:"PUT",headers:{authorization:`Bearer ${r}`,"content-type":"application/json"},body:JSON.stringify({registry:{tools:a}})});if(!s.ok)throw new Error(`Tool sync failed with status ${s.status}.`);return a.length}});var mt="https://gateway.agentronics.dev",yr=e=>{if(e===void 0)return mt;if(e===mt)return e;let t;try{t=new URL(e);}catch{throw new Error(`Agentronics SDK: \`gatewayUrl\` is not a valid URL: ${e}`)}if(t.hostname==="localhost"||t.hostname==="127.0.0.1")return e;throw new Error(`Agentronics SDK does not support custom gateway URLs. Omit \`gatewayUrl\` to use the canonical https://gateway.agentronics.dev. The only accepted override is a localhost / 127.0.0.1 URL for local development. Got: ${e}`)},Yo=e=>{let{publishableKey:t,siteId:r="default",debug:n=false,policies:o=[],trace:a$1={}}=e,s=yr(e.gatewayUrl),d=classifyApiKey(t);if(d==="secret")throw new AgentronicsError("wrong_key_kind","A secret key was passed to Agentronics.init(). Browser code must use a publishable key (agtx_pk_*).");if(d!=="publishable")throw new AgentronicsError("invalid_api_key",`Agentronics.init() expected a key starting with "${PUBLISHABLE_KEY_PREFIX}".`);let i=a$1.enabled??true,y=[...n?[ne()]:[],...a$1.gateway?[oe({gatewayUrl:s,publishableKey:t})]:[],...a$1.webhookUrl?[se({url:a$1.webhookUrl})]:[],...a$1.exporters??[]],u={siteId:r,exporters:i?y:[],onExporterError:(c,g)=>{n&&console.warn(`[agentronics] trace exporter "${g.name}" failed`,c);}};a$1.bufferSize!==void 0&&(u.bufferSize=a$1.bufferSize),a$1.traceRate!==void 0&&(u.traceRate=a$1.traceRate),a$1.errorRate!==void 0&&(u.errorRate=a$1.errorRate),a$1.scrubPaths!==void 0&&(u.scrubPaths=a$1.scrubPaths);let m=re(u),p=c=>{i&&m.emit(c);},h=me(),w={onTrace:p};e.auth!==void 0&&(w.context=e.auth);let l=Ie(w),v=Me(),x=Ce(o),k=De({gatewayUrl:s,siteId:r,publishableKey:t}),I=Ue({onTrace:p}),R={onTrace:p};e.siteMemory!==void 0&&(R.initial=e.siteMemory);let T=Ke(R),E=ze({gatewayUrl:s,siteId:r,publishableKey:t}),gt=pt({gatewayUrl:s,siteId:r,publishableKey:t}),B=async c=>{let g=Date.now(),S=await de(c),b=h.preferOver(S);return i&&await m.emit({type:b?"agent.detected":"agent.missed",agent:b,durationMs:Date.now()-g,metadata:{detectedClass:S?.class??null,presented:h.snapshot()!==null}}),v.set(b,"detect"),b},ae=async(c,g={})=>{let S=Date.now(),b=g.identity!==void 0?g.identity:await B(),U=x.evaluate({tool:c,identity:b});return i&&await m.emit({type:"authz.evaluated",tool:c,agent:b,policy:U,outcome:U.decision==="deny"?"blocked":"success",durationMs:Date.now()-S}),U},M=Xe({evaluate:ae,setPolicies:c=>x.set(c),listPolicies:()=>x.list(),onTrace:p,identityResolver:()=>v.snapshot().identity});for(let c of e.tools??[])M.register(c);let P=e.progression?Ye(e.progression,{onTrace:p}):null,ce=c=>{let g={identity:c};return P&&(g.stage=P.current(),g.enabledStages=P.enabledStages()),g},O=c=>et(M.list(),ce(c)),le=c=>{if(!P)return;P.notify(c).changed&&C.publish(O(v.snapshot().identity));},yt={class:"webmcp",trust:"detected",confidence:1,vendor:null,userAgent:typeof navigator<"u"?navigator.userAgent:null,detectionVersion:a,signals:{source:"navigator.modelContext"}},C=st({invoke:async(c,g)=>{let S=v.snapshot().identity??yt,b=await M.execute(c.name,g,S);return le(c.name),b}});v.subscribe(c=>{C.available()&&C.publish(O(c.identity));});let _=e.autoDetect??true,ft=_===false?Promise.resolve(null):(async()=>{let c=_===true?{}:_;try{return await B(c)}catch(g){return n&&console.warn("[agentronics] autoDetect failed:",g),null}})();return Object.freeze({publishableKey:t,siteId:r,gatewayUrl:s,debug:n,memory:I,siteMemory:T,memoryCache:E,tracer:m,auth:l,agentContext:v,authz:x,policyCache:k,tools:M,progression:P,webmcp:C,ready:ft,detect:B,authenticate:async c=>{let g=await l.authenticate(c);return v.set(g,"authenticate"),g},presentIdentity:c=>{let g=h.present(c);return p({type:"auth.identity_presented",agent:g.identity,metadata:{vendor:g.identity.vendor,class:g.identity.class}}),v.set(g.identity,"declare"),g},clearIdentity:()=>{h.clear(),p({type:"auth.identity_cleared"}),v.set(null,"cleared");},presentedIdentity:()=>h.snapshot(),setPolicies:c=>{x.set(c),p({type:"authz.policies_set",metadata:{count:c.length}});},listPolicies:()=>x.list(),syncPolicies:async()=>{let c=await k.sync();return x.set(c.policies),p({type:"authz.policies_set",metadata:{count:c.policies.length,synced:true}}),c.policies},syncSiteMemory:async()=>{let c=await E.sync();return c.memory&&(T.replace(c.memory),p({type:"memory.updated",metadata:{kind:"site",operation:"sync",etag:c.etag}})),c.memory},provideSiteMemory:c=>T.provide(c),provideForPage:c=>{T.provideForPage(c);},installMemoryDelivery:({metaTags:c=true,overlay:g=false}={})=>{let S=[];return c&&S.push(F({snapshot:T.snapshot()})),g&&S.push(J({snapshot:T.snapshot()})),{uninstall:()=>{S.forEach(b=>b.uninstall());}}},fetchWellKnown:async c=>{let g={};c!==void 0&&(g.origin=c);let S=await q(g);return S&&(T.replace(S),p({type:"memory.updated",metadata:{kind:"site",operation:"wellKnown",origin:c??null}})),S},installDomEnforcer:()=>$e({policyEngine:x,getIdentity:()=>B({webmcp:{pollMs:0}})}),registerTool:c=>M.register(c),syncTools:async()=>{let c=M.list({includeDisabled:true}),g=await gt.push(c);return p({type:"tool.registered",metadata:{operation:"sync",count:g}}),g},surfaceTools:({identity:c=null}={})=>O(c),explainSurfacing:({identity:c=null}={})=>tt(M.list(),ce(c)),groupedTools:({identity:c=null}={})=>nt(O(c)),estimateTokens:({identity:c=null}={})=>ot(O(c)),publishToWebMcp:({identity:c=null}={})=>{let g=O(c),S=C.publish(g);return g.forEach(b=>{p({type:"tool.surfaced",tool:b.name,metadata:{state:"published",trust:c?.trust??null,group:b.group??null}});}),{revoked:S.revoked,surfaced:g.length}},notifyToolInvoked:c=>le(c),evaluate:ae,traces:()=>m.list(),clearTraces:()=>m.clear(),async ping(){try{let c=await fetch(`${s.replace(/\/$/,"")}/v1/health`,{method:"GET",headers:{authorization:`Bearer ${t}`}});if(!c.ok)return {ok:!1,status:c.status,error:`gateway returned ${c.status}`};let g=await c.json().catch(()=>null)??{};return {ok:!0,status:c.status,body:g}}catch(c){return {ok:false,status:0,error:c instanceof Error?c.message:String(c)}}}})};
|
|
16
|
-
export{Zt as A,Xe as B,Ye as C,Ze as D,et as E,tt as F,rt as G,nt as H,no as I,nr as J,ot as K,st as L,Y as M,re as N,ne as O,oe as P,se as Q,pr as R,Yo as S,ue as a,L as b,$ as c,pe as d,K as e,It as f,Mt as g,de as h,me as i,Kr as j,ye as k,Ie as l,Me as m,Re as n,Ce as o,De as p,Le as q,$e as r,Ue as s,Ke as t,ze as u,Xt as v,F as w,J as x,qe as y,q as z};//# sourceMappingURL=chunk-YNRQTQM4.js.map
|
|
17
|
-
//# sourceMappingURL=chunk-YNRQTQM4.js.map
|