@agentronics/sdk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-4FJRAPA6.js +17 -0
- package/dist/chunk-4FJRAPA6.js.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- 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-4Tr5Ju9g.d.ts → init-only-7f8_LQAI.d.ts} +41 -3
- package/dist/{init-only-Czh_F-Dk.d.cts → init-only-Cwll8MGz.d.cts} +41 -3
- package/dist/init-only.cjs +3 -3
- package/dist/init-only.cjs.map +1 -1
- package/dist/init-only.d.cts +1 -1
- package/dist/init-only.d.ts +1 -1
- package/dist/init-only.global.js +3 -3
- package/dist/init-only.global.js.map +1 -1
- package/dist/init-only.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-7CJGV4LL.js +0 -17
- package/dist/chunk-7CJGV4LL.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {f,
|
|
1
|
+
import {h,f,R}from'./chunk-4FJRAPA6.js';export{a as CRAWLER_SIGNATURES,G as DEFAULT_GROUP,y as WELL_KNOWN_PATH,d as bundledDetectors,m as createAgentContextStore,l as createAuthEngine,O as createConsoleExporter,e as createDetectorRegistry,P as createGatewayExporter,i as createIdentityStore,u as createMemoryCache,s as createMemoryStore,p as createPolicyCache,o as createPolicyEngine,C as createProgressionStore,n as createRateLimiter,g as createSignatureLoader,t as createSiteMemoryStore,B as createToolRegistry,M as createTraceBuffer,N as createTracer,L as createWebMcpAdapter,v as createWebMcpContextTool,Q as createWebhookExporter,D as decideSurfacing,f as declareAgent,j as deriveTrustLevel,h as detectAgent,b as detectCrawler,c as detectDom,K as estimateBudget,J as estimateToolTokens,F as explainSurfacing,z as fetchWellKnownContext,H as groupTools,k as highestTrust,R as init,r as installDomEnforcer,x as installMemoryOverlay,w as installMetaTags,I as listGroupNames,A as serializeWellKnownContext,q as showDenyOverlay,E as surfaceTools}from'./chunk-4FJRAPA6.js';export{b as detectWebMcp}from'./chunk-LLD3Y2LZ.js';var le={init:R,declareAgent:f,detectAgent:h},Se="0.1.0";export{le as Agentronics,Se as VERSION};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["Agentronics","init","declareAgent","detectAgent","VERSION"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["Agentronics","init","declareAgent","detectAgent","VERSION"],"mappings":"kmCA6MO,IAAMA,EAAAA,CAAc,CAAE,IAAA,CAAAC,CAAAA,CAAM,aAAAC,CAAAA,CAAc,WAAA,CAAAC,CAAY,CAAA,CAEhDC,EAAAA,CAAU","file":"index.js","sourcesContent":["import { init, type AgentronicsClient, type InitOptions } from './init.js'\nimport {\n declareAgent,\n bundledDetectors,\n createDetectorRegistry,\n createSignatureLoader,\n detectAgent,\n detectCrawler,\n detectDom,\n detectWebMcp,\n CRAWLER_SIGNATURES,\n type DeclareAgentInput,\n type DetectAgentOptions,\n type DetectCrawlerOptions,\n type CrawlerSignature,\n type CrawlerCategory,\n type DetectDomOptions,\n type DetectWebMcpOptions,\n type Detector,\n type DetectorRegistry,\n type DetectorStatus,\n type DomSignalName,\n} from './detection/index.js'\nimport {\n createIdentityStore,\n type IdentityStore,\n type PresentIdentityOptions,\n type PresentedIdentity,\n} from './auth/identity.js'\nimport { createAuthEngine, type AuthEngine, type AuthInput, type AuthMethod } from './auth/engine.js'\nimport {\n createAgentContextStore,\n type AgentContextStore,\n type AgentContextSnapshot,\n type AgentContextListener,\n} from './auth/agentContext.js'\nimport { deriveTrustLevel, highestTrust } from './auth/trustLevel.js'\nimport { createPolicyEngine, type PolicyEngine } from './authz/engine.js'\nimport { createRateLimiter, type RateLimiter } from './authz/rateLimiter.js'\nimport { createPolicyCache, type PolicyCache } from './authz/policyCache.js'\nimport { installDomEnforcer } from './authz/domEnforcer.js'\nimport { showDenyOverlay } from './authz/overlay.js'\nimport { createMemoryStore, type MemoryStore } from './memory/store.js'\nimport {\n createSiteMemoryStore,\n type SiteMemoryStore,\n type SiteMemoryListener,\n type ProvideForPageInput,\n} from './memory/siteMemory.js'\nimport { createMemoryCache, type MemoryCache } from './memory/memoryCache.js'\nimport {\n createWebMcpContextTool,\n installMetaTags,\n installMemoryOverlay,\n fetchWellKnownContext,\n serializeWellKnownContext,\n WELL_KNOWN_PATH,\n type WebMcpContextTool,\n type WebMcpContextOptions,\n} from './memory/delivery/index.js'\nimport { createToolRegistry, type GovernedTool, type ToolRegistry } from './tools/registry.js'\nimport {\n decideSurfacing,\n surfaceTools,\n explainSurfacing,\n type SurfacingContext,\n type SurfacingDecision,\n} from './tools/surfacing.js'\nimport {\n groupTools,\n listGroupNames,\n DEFAULT_GROUP,\n type ToolGroupSummary,\n} from './tools/groups.js'\nimport {\n createProgressionStore,\n type ProgressionConfig,\n type ProgressionStage,\n type ProgressionStore,\n type ProgressionTransition,\n} from './tools/progression.js'\nimport {\n estimateBudget,\n estimateToolTokens,\n type ToolTokenEstimate,\n type TokenBudgetReport,\n} from './tools/tokenEstimate.js'\nimport {\n createWebMcpAdapter,\n type WebMcpAdapter,\n type WebMcpAdapterOptions,\n type WebMcpToolDescriptor,\n type WebMcpProvider,\n} from './tools/webmcpAdapter.js'\nimport {\n createTracer,\n createTraceBuffer,\n createConsoleExporter,\n createGatewayExporter,\n createWebhookExporter,\n type TraceExporter,\n type TraceInput,\n type Tracer,\n} from './observability/index.js'\n\nexport {\n init,\n declareAgent,\n detectAgent,\n detectCrawler,\n detectDom,\n detectWebMcp,\n CRAWLER_SIGNATURES,\n createDetectorRegistry,\n bundledDetectors,\n createSignatureLoader,\n createIdentityStore,\n createAuthEngine,\n createAgentContextStore,\n deriveTrustLevel,\n highestTrust,\n createPolicyEngine,\n createRateLimiter,\n createPolicyCache,\n installDomEnforcer,\n showDenyOverlay,\n createToolRegistry,\n decideSurfacing,\n surfaceTools,\n explainSurfacing,\n groupTools,\n listGroupNames,\n DEFAULT_GROUP,\n createProgressionStore,\n estimateBudget,\n estimateToolTokens,\n createWebMcpAdapter,\n createMemoryStore,\n createSiteMemoryStore,\n createMemoryCache,\n createWebMcpContextTool,\n installMetaTags,\n installMemoryOverlay,\n fetchWellKnownContext,\n serializeWellKnownContext,\n WELL_KNOWN_PATH,\n createTracer,\n createTraceBuffer,\n createConsoleExporter,\n createGatewayExporter,\n createWebhookExporter,\n}\nexport type {\n AgentronicsClient,\n AuthEngine,\n AuthInput,\n AuthMethod,\n AgentContextStore,\n AgentContextSnapshot,\n AgentContextListener,\n DeclareAgentInput,\n DetectAgentOptions,\n DetectCrawlerOptions,\n CrawlerSignature,\n CrawlerCategory,\n DetectDomOptions,\n DetectWebMcpOptions,\n DomSignalName,\n IdentityStore,\n InitOptions,\n MemoryStore,\n SiteMemoryStore,\n SiteMemoryListener,\n MemoryCache,\n ProvideForPageInput,\n WebMcpContextTool,\n WebMcpContextOptions,\n GovernedTool,\n ToolRegistry,\n SurfacingContext,\n SurfacingDecision,\n ToolGroupSummary,\n ProgressionConfig,\n ProgressionStage,\n ProgressionStore,\n ProgressionTransition,\n ToolTokenEstimate,\n TokenBudgetReport,\n WebMcpAdapter,\n WebMcpAdapterOptions,\n WebMcpToolDescriptor,\n WebMcpProvider,\n PolicyEngine,\n PolicyCache,\n RateLimiter,\n Detector,\n DetectorRegistry,\n DetectorStatus,\n PresentIdentityOptions,\n PresentedIdentity,\n TraceExporter,\n TraceInput,\n Tracer,\n}\n\nexport const Agentronics = { init, declareAgent, detectAgent }\n\nexport const VERSION = '0.1.0'\n"]}
|
|
@@ -1,6 +1,42 @@
|
|
|
1
1
|
import { AgentIdentity, IdentityClaim, TraceEvent, TraceEventType, VerificationResult, AgentClass, PolicyRule, PolicyEvaluation, MemoryScope, MemoryEntry, SiteMemory, SiteMemoryPageContext } from '@agentronics/protocol';
|
|
2
2
|
import { D as DetectWebMcpOptions } from './webmcp-C4ikhM4g.js';
|
|
3
3
|
|
|
4
|
+
type CrawlerCategory = 'ai' | 'search';
|
|
5
|
+
interface CrawlerSignature {
|
|
6
|
+
/** Stable vendor id, reported as identity.vendor. */
|
|
7
|
+
name: string;
|
|
8
|
+
category: CrawlerCategory;
|
|
9
|
+
/** Tested against navigator.userAgent. */
|
|
10
|
+
pattern: RegExp;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Known AI + search crawlers, matched by User-Agent token.
|
|
14
|
+
*
|
|
15
|
+
* Caveats baked into the design:
|
|
16
|
+
* - UA is self-reported and trivially spoofable, so a match is high-confidence
|
|
17
|
+
* but never certain — we report `confidence: 0.9`, not `1`.
|
|
18
|
+
* - This is client-side detection: it only sees crawlers that actually execute
|
|
19
|
+
* JavaScript on the page. The majority of crawlers fetch HTML and never run
|
|
20
|
+
* the SDK, so full coverage needs server/edge UA inspection (a future product).
|
|
21
|
+
*
|
|
22
|
+
* Order matters: more specific tokens (e.g. `Google-Extended`, `Applebot-Extended`)
|
|
23
|
+
* are listed before their broader siblings so the first match wins correctly.
|
|
24
|
+
*/
|
|
25
|
+
declare const CRAWLER_SIGNATURES: CrawlerSignature[];
|
|
26
|
+
interface DetectCrawlerOptions {
|
|
27
|
+
/** Override the signature table (e.g. to add private/first-party crawlers). */
|
|
28
|
+
signatures?: CrawlerSignature[];
|
|
29
|
+
/** Skip crawler detection entirely. */
|
|
30
|
+
disable?: boolean;
|
|
31
|
+
/** Confidence reported on a UA match. Default 0.9 (UA is spoofable). */
|
|
32
|
+
confidence?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Identify known AI/search crawlers by their User-Agent token. Returns `null`
|
|
36
|
+
* when no signature matches or when there is no `navigator` (server-side).
|
|
37
|
+
*/
|
|
38
|
+
declare const detectCrawler: (options?: DetectCrawlerOptions) => AgentIdentity | null;
|
|
39
|
+
|
|
4
40
|
interface SignalResult {
|
|
5
41
|
hit: boolean;
|
|
6
42
|
weight: number;
|
|
@@ -37,13 +73,15 @@ type DetectorRegistry = ReturnType<typeof createDetectorRegistry>;
|
|
|
37
73
|
|
|
38
74
|
interface DetectAgentOptions {
|
|
39
75
|
webmcp?: DetectWebMcpOptions | false;
|
|
76
|
+
crawler?: DetectCrawlerOptions | false;
|
|
40
77
|
dom?: DetectDomOptions | false;
|
|
41
78
|
customDetectors?: Detector[];
|
|
42
79
|
experimental?: boolean;
|
|
43
80
|
}
|
|
44
81
|
/**
|
|
45
|
-
* Run the full detection pipeline. WebMCP wins if present (exact match), then
|
|
46
|
-
*
|
|
82
|
+
* Run the full detection pipeline. WebMCP wins if present (exact match), then a
|
|
83
|
+
* known-crawler User-Agent match, then DOM automation heuristics. Returns `null`
|
|
84
|
+
* if no agent class fires above its threshold — caller should treat as "human or
|
|
47
85
|
* undetectable agent."
|
|
48
86
|
*/
|
|
49
87
|
declare const detectAgent: (options?: DetectAgentOptions) => Promise<AgentIdentity | null>;
|
|
@@ -552,4 +590,4 @@ interface AgentronicsClient {
|
|
|
552
590
|
}
|
|
553
591
|
declare const init: (options: InitOptions) => AgentronicsClient;
|
|
554
592
|
|
|
555
|
-
export {
|
|
593
|
+
export { createMemoryCache as $, type AgentronicsClient as A, type SurfacingContext as B, CRAWLER_SIGNATURES as C, type DetectAgentOptions as D, type SurfacingDecision as E, type TokenBudgetReport as F, type GovernedTool as G, type ToolGroupSummary as H, type InitOptions as I, type ToolRegistry as J, type ToolTokenEstimate as K, type TraceInput as L, type MemoryCache as M, type Tracer as N, type WebMcpAdapterOptions as O, type PolicyEngine as P, type WebMcpProvider as Q, type RateLimiter as R, type SiteMemoryListener as S, type TraceExporter as T, type WebMcpToolDescriptor as U, bundledDetectors as V, type WebMcpAdapter as W, createAgentContextStore as X, createAuthEngine as Y, createDetectorRegistry as Z, createIdentityStore as _, type AgentContextListener as a, createMemoryStore as a0, createPolicyCache as a1, createPolicyEngine as a2, createProgressionStore as a3, createRateLimiter as a4, createSiteMemoryStore as a5, createToolRegistry as a6, createTracer as a7, createWebMcpAdapter as a8, decideSurfacing as a9, detectAgent as aa, detectCrawler as ab, detectDom as ac, estimateBudget as ad, estimateToolTokens as ae, explainSurfacing as af, groupTools as ag, init as ah, listGroupNames as ai, surfaceTools as aj, type AgentContextSnapshot as b, type AgentContextStore as c, type AuthEngine as d, type AuthInput as e, type AuthMethod as f, type CrawlerCategory as g, type CrawlerSignature as h, DEFAULT_GROUP as i, type DetectCrawlerOptions as j, type DetectDomOptions as k, type Detector as l, type DetectorRegistry as m, type DetectorStatus as n, type DomSignalName as o, type IdentityStore as p, type MemoryStore as q, type PolicyCache as r, type PresentIdentityOptions as s, type PresentedIdentity as t, type ProgressionConfig as u, type ProgressionStage as v, type ProgressionStore as w, type ProgressionTransition as x, type ProvideForPageInput as y, type SiteMemoryStore as z };
|
|
@@ -1,6 +1,42 @@
|
|
|
1
1
|
import { AgentIdentity, IdentityClaim, TraceEvent, TraceEventType, VerificationResult, AgentClass, PolicyRule, PolicyEvaluation, MemoryScope, MemoryEntry, SiteMemory, SiteMemoryPageContext } from '@agentronics/protocol';
|
|
2
2
|
import { D as DetectWebMcpOptions } from './webmcp-C4ikhM4g.cjs';
|
|
3
3
|
|
|
4
|
+
type CrawlerCategory = 'ai' | 'search';
|
|
5
|
+
interface CrawlerSignature {
|
|
6
|
+
/** Stable vendor id, reported as identity.vendor. */
|
|
7
|
+
name: string;
|
|
8
|
+
category: CrawlerCategory;
|
|
9
|
+
/** Tested against navigator.userAgent. */
|
|
10
|
+
pattern: RegExp;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Known AI + search crawlers, matched by User-Agent token.
|
|
14
|
+
*
|
|
15
|
+
* Caveats baked into the design:
|
|
16
|
+
* - UA is self-reported and trivially spoofable, so a match is high-confidence
|
|
17
|
+
* but never certain — we report `confidence: 0.9`, not `1`.
|
|
18
|
+
* - This is client-side detection: it only sees crawlers that actually execute
|
|
19
|
+
* JavaScript on the page. The majority of crawlers fetch HTML and never run
|
|
20
|
+
* the SDK, so full coverage needs server/edge UA inspection (a future product).
|
|
21
|
+
*
|
|
22
|
+
* Order matters: more specific tokens (e.g. `Google-Extended`, `Applebot-Extended`)
|
|
23
|
+
* are listed before their broader siblings so the first match wins correctly.
|
|
24
|
+
*/
|
|
25
|
+
declare const CRAWLER_SIGNATURES: CrawlerSignature[];
|
|
26
|
+
interface DetectCrawlerOptions {
|
|
27
|
+
/** Override the signature table (e.g. to add private/first-party crawlers). */
|
|
28
|
+
signatures?: CrawlerSignature[];
|
|
29
|
+
/** Skip crawler detection entirely. */
|
|
30
|
+
disable?: boolean;
|
|
31
|
+
/** Confidence reported on a UA match. Default 0.9 (UA is spoofable). */
|
|
32
|
+
confidence?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Identify known AI/search crawlers by their User-Agent token. Returns `null`
|
|
36
|
+
* when no signature matches or when there is no `navigator` (server-side).
|
|
37
|
+
*/
|
|
38
|
+
declare const detectCrawler: (options?: DetectCrawlerOptions) => AgentIdentity | null;
|
|
39
|
+
|
|
4
40
|
interface SignalResult {
|
|
5
41
|
hit: boolean;
|
|
6
42
|
weight: number;
|
|
@@ -37,13 +73,15 @@ type DetectorRegistry = ReturnType<typeof createDetectorRegistry>;
|
|
|
37
73
|
|
|
38
74
|
interface DetectAgentOptions {
|
|
39
75
|
webmcp?: DetectWebMcpOptions | false;
|
|
76
|
+
crawler?: DetectCrawlerOptions | false;
|
|
40
77
|
dom?: DetectDomOptions | false;
|
|
41
78
|
customDetectors?: Detector[];
|
|
42
79
|
experimental?: boolean;
|
|
43
80
|
}
|
|
44
81
|
/**
|
|
45
|
-
* Run the full detection pipeline. WebMCP wins if present (exact match), then
|
|
46
|
-
*
|
|
82
|
+
* Run the full detection pipeline. WebMCP wins if present (exact match), then a
|
|
83
|
+
* known-crawler User-Agent match, then DOM automation heuristics. Returns `null`
|
|
84
|
+
* if no agent class fires above its threshold — caller should treat as "human or
|
|
47
85
|
* undetectable agent."
|
|
48
86
|
*/
|
|
49
87
|
declare const detectAgent: (options?: DetectAgentOptions) => Promise<AgentIdentity | null>;
|
|
@@ -552,4 +590,4 @@ interface AgentronicsClient {
|
|
|
552
590
|
}
|
|
553
591
|
declare const init: (options: InitOptions) => AgentronicsClient;
|
|
554
592
|
|
|
555
|
-
export {
|
|
593
|
+
export { createMemoryCache as $, type AgentronicsClient as A, type SurfacingContext as B, CRAWLER_SIGNATURES as C, type DetectAgentOptions as D, type SurfacingDecision as E, type TokenBudgetReport as F, type GovernedTool as G, type ToolGroupSummary as H, type InitOptions as I, type ToolRegistry as J, type ToolTokenEstimate as K, type TraceInput as L, type MemoryCache as M, type Tracer as N, type WebMcpAdapterOptions as O, type PolicyEngine as P, type WebMcpProvider as Q, type RateLimiter as R, type SiteMemoryListener as S, type TraceExporter as T, type WebMcpToolDescriptor as U, bundledDetectors as V, type WebMcpAdapter as W, createAgentContextStore as X, createAuthEngine as Y, createDetectorRegistry as Z, createIdentityStore as _, type AgentContextListener as a, createMemoryStore as a0, createPolicyCache as a1, createPolicyEngine as a2, createProgressionStore as a3, createRateLimiter as a4, createSiteMemoryStore as a5, createToolRegistry as a6, createTracer as a7, createWebMcpAdapter as a8, decideSurfacing as a9, detectAgent as aa, detectCrawler as ab, detectDom as ac, estimateBudget as ad, estimateToolTokens as ae, explainSurfacing as af, groupTools as ag, init as ah, listGroupNames as ai, surfaceTools as aj, type AgentContextSnapshot as b, type AgentContextStore as c, type AuthEngine as d, type AuthInput as e, type AuthMethod as f, type CrawlerCategory as g, type CrawlerSignature as h, DEFAULT_GROUP as i, type DetectCrawlerOptions as j, type DetectDomOptions as k, type Detector as l, type DetectorRegistry as m, type DetectorStatus as n, type DomSignalName as o, type IdentityStore as p, type MemoryStore as q, type PolicyCache as r, type PresentIdentityOptions as s, type PresentedIdentity as t, type ProgressionConfig as u, type ProgressionStage as v, type ProgressionStore as w, type ProgressionTransition as x, type ProvideForPageInput as y, type SiteMemoryStore as z };
|
package/dist/init-only.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var protocol=require('@agentronics/protocol');var f="0.1.2";var pt=()=>{if(typeof navigator>"u")return null;let e=navigator.modelContext;return e&&typeof e=="object"?e:null},C=async(e={})=>{let{pollMs:t=500}=e,n=Date.now();for(;;){let r=pt();if(r)return mt(r);if(Date.now()-n>=t)return null;await new Promise(i=>setTimeout(i,50));}},mt=e=>({class:"webmcp",trust:"detected",confidence:1,vendor:e.vendor??e.client??null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{webmcp:true,toolCount:Array.isArray(e.tools)?e.tools.length:0}});var yt=[/HeadlessChrome/i,/Headless/i,/PhantomJS/i,/SlimerJS/i],gt=()=>({hit:(typeof navigator<"u"&&navigator.webdriver)===true,weight:.6,detail:"navigator.webdriver === true"}),ft=()=>{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_*"}`}},ht=()=>{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"}},vt=()=>{if(typeof navigator>"u")return {hit:false,weight:.7};let e=navigator.userAgent??"",t=yt.some(n=>n.test(e));return t?{hit:t,weight:.7,detail:`headless UA: ${e}`}:{hit:t,weight:.7}},wt=()=>{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"}},xt=()=>{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"}},St={webdriver:gt,chromedriver:ft,headlessUa:vt,languages:wt,permissions:xt,plugins:ht},L=(e={})=>{let{threshold:t=.4}=e,n={},r=0,i=0;for(let[s,g]of Object.entries(St)){let o=g();r+=o.weight,n[s]={hit:o.hit,weight:o.weight,detail:o.detail},o.hit&&(i+=o.weight);}let a=r===0?0:i/r;return a<t?null:{class:"dom",trust:"detected",confidence:a,vendor:null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:n}};var le=()=>[{id:"webmcp.model-context",status:"stable",detect:()=>C({pollMs:0})},{id:"dom.automation-heuristics",status:"beta",detect:()=>L()}],U=(e=le())=>{let t=new Map(e.map(n=>[n.id,n]));return {register(n){t.set(n.id,n);},list(n){let r=[...t.values()];return n?r.filter(i=>i.status===n):r},async detectAll(n=false){for(let r of t.values()){if(r.status==="research"&&!n)continue;let i=await r.detect();if(i)return i}return null}}};var ue=async(e={})=>{if(e.customDetectors?.length){let t=await U(e.customDetectors).detectAll(!!e.experimental);if(t)return t}if(e.webmcp!==false){let t=await C(e.webmcp??{});if(t)return t}if(e.dom!==false){let t=L(e.dom??{});if(t)return t}return null};var kt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),de=()=>{let e=null;return {present(t){let n=protocol.IdentityClaim.safeParse(t);if(!n.success)throw new protocol.AgentronicsError("invalid_api_key",`Invalid identity claim: ${n.error.issues[0]?.message??"unknown"}`);let r={claim:n.data,identity:kt(n.data)};return e=r,r},clear(){e=null;},preferOver(t){return e?t?protocol.isHigherTrust(e.identity.trust,t.trust)?e.identity:t:e.identity:t},snapshot(){return e}}};var me=e=>{let t=null;for(let n of e)(!t||protocol.TRUST_RANK[n.trust]>protocol.TRUST_RANK[t.trust])&&(t=n);return t};var ye=()=>({name:"bearer",async authenticate(e,t){if(!e.bearerToken)return null;let n=await t.verifyToken?.("bearer",e.bearerToken);return {class:e.classHint??"dom",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"bearer",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{bearer:true,verifiedRemotely:!!n}}}});var ge=()=>({name:"detection",async authenticate(e){return e.detected??null}});var fe=()=>({name:"extensionToken",async authenticate(e,t){if(!e.extensionToken)return null;let n=await t.verifyToken?.("extensionToken",e.extensionToken);return {class:"dom",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"browser-extension",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{extensionToken:true,verifiedRemotely:!!n}}}});var he=()=>({name:"mtls",async authenticate(e,t){if(!e.xfccHeader)return null;let n=await t.verifyToken?.("mtls",e.xfccHeader);return {class:e.classHint??"webmcp",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"mtls",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{mtls:true,subject:n?.subject??null,verifiedRemotely:!!n,...n?.signals??{}}}}});var ve=()=>({name:"oauth2",async authenticate(e,t){if(!e.oauth2AccessToken)return null;let n=await t.verifyToken?.("oauth2",e.oauth2AccessToken);return {class:e.classHint??"webmcp",trust:e.oauth2Subject?"linked":n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"oauth2",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{oauth2:true,subject:e.oauth2Subject??null,verifiedRemotely:!!n}}}});var It=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),we=()=>({name:"selfDeclaration",async authenticate(e){return e.declaration?It(protocol.IdentityClaim.parse(e.declaration)):null}});var xe=()=>({name:"sessionLink",async authenticate(e,t){if(!e.sessionLinkToken)return null;let n=await t.verifyToken?.("sessionLink",e.sessionLinkToken);return {class:e.classHint??"screenshot",trust:e.linkedUserId?"linked":n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"session-link",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{sessionLink:true,linkedUserId:e.linkedUserId??null,verifiedRemotely:!!n}}}});var Se=()=>({name:"sso",async authenticate(e,t){if(!e.ssoIdToken)return null;let n=await t.verifyToken?.("sso",e.ssoIdToken);return {class:e.classHint??"dom",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"sso",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{sso:true,subject:n?.subject??null,verifiedRemotely:!!n,...n?.signals??{}}}}});var be=()=>({name:"spiffe",async authenticate(e,t){if(!e.spiffeJwt)return null;let n=await t.verifyToken?.("spiffe",e.spiffeJwt),r=n?.vendor==="google";return {class:e.classHint??"webmcp",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"spiffe",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{spiffe:true,spiffeId:n?.subject??null,subject:n?.subject??null,verifiedRemotely:!!n,...r?{googleAgent:true}:{},...n?.signals??{}}}}});var Te=()=>({name:"xAgentHeader",async authenticate(e){if(!e.xAgentHeader)return null;let[t="x-agent",n="dom",r]=e.xAgentHeader.split(";"),i=protocol.AgentClass.safeParse(n);return {class:i.success?i.data:"dom",trust:r?"verified":"declared",confidence:r?1:.8,vendor:t,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{xAgentHeader:true,hasProof:!!r}}}});var Pt=()=>[ge(),we(),ye(),Te(),fe(),xe(),ve(),Se(),be(),he()],Et={detection:"detection",selfDeclaration:"declaration",bearer:"bearer",xAgentHeader:"x-agent-header",extensionToken:"extension",sessionLink:"session-link",oauth2:"oauth2",sso:"sso",spiffe:"spiffe",mtls:"mtls"},Ot=(e,t)=>e==="spiffe"&&t.signals?.googleAgent===true?"google-agent":Et[e],Ae=({methods:e=Pt(),context:t={},onTrace:n}={})=>({async authenticate(r){let i=[],a={};for(let p of e){let d=await p.authenticate(r,t);a[p.name]=!!d,d&&i.push({method:p.name,identity:d});}let s=me(i.map(p=>p.identity)),g=s?i.find(p=>p.identity===s):void 0,o=g?Ot(g.method,g.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,...o?{protocol:o}:{},...y?{subject:y}:{}}};return s||(u.error="No auth method produced an identity."),n?.(u),s},methods(){return e.map(r=>r.name)}});var Dt={identity:null,source:"initial",updatedAt:null},ke=()=>{let e=Dt,t=new Set,n=()=>{t.size!==0&&t.forEach(r=>r(e));};return {snapshot(){return e},set(r,i){e={identity:r,source:i,updatedAt:new Date().toISOString()},n();},subscribe(r){return t.add(r),()=>{t.delete(r);}}}};var Ct=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,n)=>{e.set(t,n);}}},Lt=()=>typeof window>"u"||!window.localStorage?Ct():{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},Me=(e=Lt())=>({consume(t,n,r=Date.now()){let i=`agtx:rate:${t}`,a=$t(e.read(i)),s=a&&a.resetAt>r?a.resetAt:r+n.windowSeconds*1e3,g=a&&a.resetAt>r?a.count+1:1;return e.write(i,JSON.stringify({count:g,resetAt:s})),{allowed:g<=n.max,remaining:Math.max(0,n.max-g),resetAt:s}}});var jt=(e,t)=>e==="*"||e===t?true:e.includes("*")?new RegExp("^"+e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$").test(t):false,Wt=(e,t)=>{let n=e?protocol.TRUST_RANK[e.trust]:-1,r=protocol.TRUST_RANK[t.minTrust];return n>=r},Nt=(e,t)=>t.allowedClasses.length===0?true:e?t.allowedClasses.includes(e.class):false,Pe="review",_t=(e,t)=>{let n=t?.class??"unknown",r=t?.vendor??"unknown",i=t?.trust??"none";return `${e}:${n}:${r}:${i}`},Ee=(e=[],t={})=>{let n=e.map(i=>protocol.PolicyRule.parse(i)),r=t.rateLimiter??Me();return {set(i){n=i.map(a=>protocol.PolicyRule.parse(a));},list(){return [...n]},evaluate({tool:i,identity:a}){for(let s of n)if(jt(s.tool,i)){if(!Wt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" requires trust >= ${s.minTrust}.`};if(!Nt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" restricts to classes: ${s.allowedClasses.join(", ")}.`};if(s.rateLimit){let g=r.consume(_t(i,a),s.rateLimit);if(!g.allowed)return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" rate limit exceeded. Resets at ${new Date(g.resetAt).toISOString()}.`}}return {decision:s.decision,ruleId:s.id,reason:`Matched rule "${s.id}".`}}return {decision:Pe,ruleId:null,reason:`No rule matched tool "${i}". Falling back to "${Pe}".`}}}};var Oe=({gatewayUrl:e,siteId:t,publishableKey:n,fetcher:r=fetch})=>{let i={policies:[],etag:null};return {snapshot(){return {policies:[...i.policies],etag:i.etag}},async sync(){let a=await r(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/policies`,{headers:{authorization:`Bearer ${n}`,...i.etag?{"if-none-match":i.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 i={policies:protocol.PolicyRule.array().parse(s.policies??[]),etag:a.headers.get("etag")},this.snapshot()}}};var De=({message:e="Agent action blocked by site policy.",durationMs:t=2400,documentRef:n=typeof document>"u"?void 0:document}={})=>{if(!n?.body)return null;let r=n.createElement("div");return r.setAttribute("role","status"),r.setAttribute("data-agentronics-deny-overlay","true"),r.textContent=e,Object.assign(r.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"}),n.body.appendChild(r),window.setTimeout(()=>r.remove(),t),r};var Ce=({policyEngine:e,getIdentity:t,documentRef:n=typeof document>"u"?void 0:document,selector:r="[data-agentronics-tool]"})=>{if(!n)return {uninstall:()=>{}};let i=a=>{let s=a.target instanceof Element?a.target.closest(r):null;if(!(s instanceof HTMLElement))return;let g=s.dataset.agentronicsTool;g&&Promise.resolve(t()).then(o=>{let y=e.evaluate({tool:g,identity:o});y.decision==="deny"&&(a.preventDefault(),a.stopPropagation(),De({message:y.reason,documentRef:n}));});};return n.addEventListener("click",i,true),{uninstall:()=>n.removeEventListener("click",i,true)}};var K=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,n)=>{e.set(t,n);},remove:t=>{e.delete(t);},keys:()=>[...e.keys()]}},Le=(e,t)=>({read:n=>{try{return e.getItem(t+n)}catch{return null}},write:(n,r)=>{try{e.setItem(t+n,r);}catch{}},remove:n=>{try{e.removeItem(t+n);}catch{}},keys:()=>{let n=[];try{for(let r=0;r<e.length;r++){let i=e.key(r);i&&i.startsWith(t)&&n.push(i.slice(t.length));}}catch{}return n}}),$e="agtx:",je=()=>{let e=typeof window<"u",t=e&&typeof window.sessionStorage<"u"?Le(window.sessionStorage,$e+"session:"):K(),n=e&&typeof window.localStorage<"u"?Le(window.localStorage,$e+"user:"):K();return {session:t,user:n,org:K()}};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}},Bt=e=>JSON.stringify(e),Ge=(e={})=>{let t=je(),n=o=>{e.onTrace?.(o);};return {get:(o,y={})=>{let u=y.scope??"session",p=t[u],d=_e(p.read(o));if(!d){n({type:"memory.accessed",metadata:{operation:"get",key:o,scope:u,hit:false}});return}if(Ne(d,Date.now())){p.remove(o),n({type:"memory.accessed",metadata:{operation:"get",key:o,scope:u,hit:false,expired:true}});return}return n({type:"memory.accessed",metadata:{operation:"get",key:o,scope:u,hit:true}}),d.value},set:(o,y,u={})=>{let p=u.scope??"session",d=u.ttlSeconds??null,h=Date.now(),w={value:y,expiresAt:d===null?null:h+d*1e3,updatedAt:new Date(h).toISOString()};return t[p].write(o,Bt(w)),n({type:"memory.updated",metadata:{operation:"set",key:o,scope:p,ttlSeconds:d}}),protocol.MemoryEntry.parse({key:o,value:y,scope:p,ttlSeconds:d,updatedAt:w.updatedAt})},remove:(o,y={})=>{let u=y.scope??"session";t[u].remove(o),n({type:"memory.updated",metadata:{operation:"remove",key:o,scope:u}});},list:(o={})=>{let y=o.scope??"session",u=t[y],p=Date.now(),d=[];for(let h of u.keys()){let w=_e(u.read(h));if(w){if(Ne(w,p)){u.remove(h);continue}d.push(protocol.MemoryEntry.parse({key:h,value:w.value,scope:y,ttlSeconds:w.expiresAt===null?null:Math.max(0,Math.round((w.expiresAt-p)/1e3)),updatedAt:w.updatedAt}));}}return n({type:"memory.accessed",metadata:{operation:"list",scope:y,count:d.length}}),d},clear:(o={})=>{let y=o.scope??"session",u=t[y],p=u.keys().length;for(let d of u.keys())u.remove(d);n({type:"memory.updated",metadata:{operation:"clear",scope:y,count:p}});}}};var H=e=>protocol.SiteMemory.parse(JSON.parse(JSON.stringify(e))),W=e=>({...e,updatedAt:new Date().toISOString()}),Be=(e={})=>{let t=protocol.SiteMemory.parse({...protocol.SITE_MEMORY_DEFAULT,...e.initial??{}}),n=null,r=new Set,i=l=>{e.onTrace?.(l);},a=()=>{n=null;},s=()=>{if(r.size===0)return;let l=H(t);n=l,r.forEach(v=>v(l));},g=l=>{let v=protocol.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(),i({type:"memory.updated",metadata:{kind:"site",operation:"provide",keys:Object.keys(l)}}),s(),u()},o=(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)),M=k;for(let R=0;R<x.length-1;R++){let T=x[R],P=M[T];(typeof P!="object"||P===null||Array.isArray(P))&&(M[T]={}),M=M[T];}return M[x[x.length-1]]=v,t=W(protocol.SiteMemory.parse(k)),a(),i({type:"memory.updated",metadata:{kind:"site",operation:"update",path:l}}),s(),u()},y=l=>{let v=protocol.SiteMemoryPageContext.parse({path:l.path,payload:l.payload,updatedAt:new Date().toISOString()});return t=W({...t,pageContexts:{...t.pageContexts,[l.path]:v}}),a(),i({type:"memory.updated",metadata:{kind:"site",operation:"provideForPage",path:l.path}}),s(),{...v,payload:{...v.payload}}},u=()=>(n||(n=H(t)),n);return {provide:g,update:o,provideForPage:y,snapshot:u,get:l=>{if(i({type:"memory.accessed",metadata:{kind:"site",operation:l?"get":"snapshot",path:l??null}}),!l)return H(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=>{i({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(protocol.SiteMemory.parse(l)),a(),s(),u()),subscribe:l=>(r.add(l),()=>{r.delete(l);})}};var Ke=({gatewayUrl:e,siteId:t,publishableKey:n,fetcher:r=fetch})=>{let i={memory:null,etag:null};return {snapshot(){return {memory:i.memory?protocol.SiteMemory.parse(i.memory):null,etag:i.etag}},async sync(){let a=await r(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/memory`,{headers:{authorization:`Bearer ${n}`,...i.etag?{"if-none-match":i.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 i={memory:protocol.SiteMemory.parse(s.memory??{}),etag:a.headers.get("etag")},this.snapshot()}}};var A="agent-context-",V="agentronics-site-context",Ht=e=>{try{return JSON.stringify(e)}catch{return "{}"}},N=(e,t,n)=>{let r=e.querySelector(`meta[name="${t}"]`);r||(r=e.createElement("meta"),r.setAttribute("name",t),e.head.appendChild(r)),r.setAttribute("content",n);},_=(e,t)=>{e.querySelectorAll(`meta[name="${t}"]`).forEach(n=>n.remove());},F=({doc:e=typeof document>"u"?null:document,snapshot:t,schemaType:n="WebSite"})=>{if(!e)return {uninstall:()=>{}};N(e,`${A}version`,t.version),N(e,`${A}updated-at`,t.updatedAt??new Date().toISOString()),t.siteMap?.navigation?.flow&&N(e,`${A}flow`,t.siteMap.navigation.flow),N(e,`${A}workflows`,Object.keys(t.workflows).join(","));let r=e.getElementById(V);return r||(r=e.createElement("script"),r.type="application/ld+json",r.id=V,e.head.appendChild(r)),r.textContent=Ht({"@context":"https://schema.org","@type":n,name:"Agentronics Site Memory",agentronics:t}),{uninstall:()=>{_(e,`${A}version`),_(e,`${A}updated-at`),_(e,`${A}flow`),_(e,`${A}workflows`),e.getElementById(V)?.remove();}}};var He="agentronics-memory-overlay",Vt=e=>`
|
|
1
|
+
'use strict';var protocol=require('@agentronics/protocol');var f="0.1.2";var gt=()=>{if(typeof navigator>"u")return null;let e=navigator.modelContext;return e&&typeof e=="object"?e:null},D=async(e={})=>{let{pollMs:t=500}=e,n=Date.now();for(;;){let r=gt();if(r)return yt(r);if(Date.now()-n>=t)return null;await new Promise(o=>setTimeout(o,50));}},yt=e=>({class:"webmcp",trust:"detected",confidence:1,vendor:e.vendor??e.client??null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{webmcp:true,toolCount:Array.isArray(e.tools)?e.tools.length:0}});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:n=false,confidence:r=.9}=e;if(n||typeof navigator>"u")return null;let o=navigator.userAgent??"";if(!o)return null;for(let a of t)if(a.pattern.test(o))return {class:"crawler",trust:"detected",confidence:r,vendor:a.name,userAgent:o,detectionVersion:f,signals:{matched:a.name,category:a.category,ua:o}};return null};var ft=[/HeadlessChrome/i,/Headless/i,/PhantomJS/i,/SlimerJS/i],ht=()=>({hit:(typeof navigator<"u"&&navigator.webdriver)===true,weight:.6,detail:"navigator.webdriver === true"}),vt=()=>{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_*"}`}},wt=()=>{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"}},xt=()=>{if(typeof navigator>"u")return {hit:false,weight:.7};let e=navigator.userAgent??"",t=ft.some(n=>n.test(e));return t?{hit:t,weight:.7,detail:`headless UA: ${e}`}:{hit:t,weight:.7}},St=()=>{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"}},bt=()=>{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"}},Tt={webdriver:ht,chromedriver:vt,headlessUa:xt,languages:St,permissions:bt,plugins:wt},$=(e={})=>{let{threshold:t=.4}=e,n={},r=0,o=0;for(let[s,y]of Object.entries(Tt)){let i=y();r+=i.weight,n[s]={hit:i.hit,weight:i.weight,detail:i.detail},i.hit&&(o+=i.weight);}let a=r===0?0:o/r;return a<t?null:{class:"dom",trust:"detected",confidence:a,vendor:null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:n}};var pe=()=>[{id:"webmcp.model-context",status:"stable",detect:()=>D({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(n=>[n.id,n]));return {register(n){t.set(n.id,n);},list(n){let r=[...t.values()];return n?r.filter(o=>o.status===n):r},async detectAll(n=false){for(let r of t.values()){if(r.status==="research"&&!n)continue;let o=await r.detect();if(o)return o}return null}}};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 D(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 Mt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),me=()=>{let e=null;return {present(t){let n=protocol.IdentityClaim.safeParse(t);if(!n.success)throw new protocol.AgentronicsError("invalid_api_key",`Invalid identity claim: ${n.error.issues[0]?.message??"unknown"}`);let r={claim:n.data,identity:Mt(n.data)};return e=r,r},clear(){e=null;},preferOver(t){return e?t?protocol.isHigherTrust(e.identity.trust,t.trust)?e.identity:t:e.identity:t},snapshot(){return e}}};var ye=e=>{let t=null;for(let n of e)(!t||protocol.TRUST_RANK[n.trust]>protocol.TRUST_RANK[t.trust])&&(t=n);return t};var fe=()=>({name:"bearer",async authenticate(e,t){if(!e.bearerToken)return null;let n=await t.verifyToken?.("bearer",e.bearerToken);return {class:e.classHint??"dom",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"bearer",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{bearer:true,verifiedRemotely:!!n}}}});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 n=await t.verifyToken?.("extensionToken",e.extensionToken);return {class:"dom",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"browser-extension",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{extensionToken:true,verifiedRemotely:!!n}}}});var we=()=>({name:"mtls",async authenticate(e,t){if(!e.xfccHeader)return null;let n=await t.verifyToken?.("mtls",e.xfccHeader);return {class:e.classHint??"webmcp",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"mtls",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{mtls:true,subject:n?.subject??null,verifiedRemotely:!!n,...n?.signals??{}}}}});var xe=()=>({name:"oauth2",async authenticate(e,t){if(!e.oauth2AccessToken)return null;let n=await t.verifyToken?.("oauth2",e.oauth2AccessToken);return {class:e.classHint??"webmcp",trust:e.oauth2Subject?"linked":n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"oauth2",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{oauth2:true,subject:e.oauth2Subject??null,verifiedRemotely:!!n}}}});var Pt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),Se=()=>({name:"selfDeclaration",async authenticate(e){return e.declaration?Pt(protocol.IdentityClaim.parse(e.declaration)):null}});var be=()=>({name:"sessionLink",async authenticate(e,t){if(!e.sessionLinkToken)return null;let n=await t.verifyToken?.("sessionLink",e.sessionLinkToken);return {class:e.classHint??"screenshot",trust:e.linkedUserId?"linked":n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"session-link",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{sessionLink:true,linkedUserId:e.linkedUserId??null,verifiedRemotely:!!n}}}});var Te=()=>({name:"sso",async authenticate(e,t){if(!e.ssoIdToken)return null;let n=await t.verifyToken?.("sso",e.ssoIdToken);return {class:e.classHint??"dom",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"sso",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{sso:true,subject:n?.subject??null,verifiedRemotely:!!n,...n?.signals??{}}}}});var Ae=()=>({name:"spiffe",async authenticate(e,t){if(!e.spiffeJwt)return null;let n=await t.verifyToken?.("spiffe",e.spiffeJwt),r=n?.vendor==="google";return {class:e.classHint??"webmcp",trust:n?.trust??"verified",confidence:1,vendor:n?.vendor??e.vendorHint??"spiffe",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{spiffe:true,spiffeId:n?.subject??null,subject:n?.subject??null,verifiedRemotely:!!n,...r?{googleAgent:true}:{},...n?.signals??{}}}}});var ke=()=>({name:"xAgentHeader",async authenticate(e){if(!e.xAgentHeader)return null;let[t="x-agent",n="dom",r]=e.xAgentHeader.split(";"),o=protocol.AgentClass.safeParse(n);return {class:o.success?o.data:"dom",trust:r?"verified":"declared",confidence:r?1:.8,vendor:t,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{xAgentHeader:true,hasProof:!!r}}}});var Ct=()=>[he(),Se(),fe(),ke(),ve(),be(),xe(),Te(),Ae(),we()],Ot={detection:"detection",selfDeclaration:"declaration",bearer:"bearer",xAgentHeader:"x-agent-header",extensionToken:"extension",sessionLink:"session-link",oauth2:"oauth2",sso:"sso",spiffe:"spiffe",mtls:"mtls"},Dt=(e,t)=>e==="spiffe"&&t.signals?.googleAgent===true?"google-agent":Ot[e],Ie=({methods:e=Ct(),context:t={},onTrace:n}={})=>({async authenticate(r){let o=[],a={};for(let d of e){let p=await d.authenticate(r,t);a[d.name]=!!p,p&&o.push({method:d.name,identity:p});}let s=ye(o.map(d=>d.identity)),y=s?o.find(d=>d.identity===s):void 0,i=y?Dt(y.method,y.identity):void 0,g=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}:{},...g?{subject:g}:{}}};return s||(u.error="No auth method produced an identity."),n?.(u),s},methods(){return e.map(r=>r.name)}});var Lt={identity:null,source:"initial",updatedAt:null},Me=()=>{let e=Lt,t=new Set,n=()=>{t.size!==0&&t.forEach(r=>r(e));};return {snapshot(){return e},set(r,o){e={identity:r,source:o,updatedAt:new Date().toISOString()},n();},subscribe(r){return t.add(r),()=>{t.delete(r);}}}};var $t=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,n)=>{e.set(t,n);}}},jt=()=>typeof window>"u"||!window.localStorage?$t():{read:e=>{try{return window.localStorage.getItem(e)}catch{return null}},write:(e,t)=>{try{window.localStorage.setItem(e,t);}catch{}}},Wt=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=jt())=>({consume(t,n,r=Date.now()){let o=`agtx:rate:${t}`,a=Wt(e.read(o)),s=a&&a.resetAt>r?a.resetAt:r+n.windowSeconds*1e3,y=a&&a.resetAt>r?a.count+1:1;return e.write(o,JSON.stringify({count:y,resetAt:s})),{allowed:y<=n.max,remaining:Math.max(0,n.max-y),resetAt:s}}});var Bt=(e,t)=>e==="*"||e===t?true:e.includes("*")?new RegExp("^"+e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$").test(t):false,Gt=(e,t)=>{let n=e?protocol.TRUST_RANK[e.trust]:-1,r=protocol.TRUST_RANK[t.minTrust];return n>=r},Nt=(e,t)=>t.allowedClasses.length===0?true:e?t.allowedClasses.includes(e.class):false,Ce="review",_t=(e,t)=>{let n=t?.class??"unknown",r=t?.vendor??"unknown",o=t?.trust??"none";return `${e}:${n}:${r}:${o}`},Oe=(e=[],t={})=>{let n=e.map(o=>protocol.PolicyRule.parse(o)),r=t.rateLimiter??Re();return {set(o){n=o.map(a=>protocol.PolicyRule.parse(a));},list(){return [...n]},evaluate({tool:o,identity:a}){for(let s of n)if(Bt(s.tool,o)){if(!Gt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" requires trust >= ${s.minTrust}.`};if(!Nt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" restricts to classes: ${s.allowedClasses.join(", ")}.`};if(s.rateLimit){let y=r.consume(_t(o,a),s.rateLimit);if(!y.allowed)return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" rate limit exceeded. Resets at ${new Date(y.resetAt).toISOString()}.`}}return {decision:s.decision,ruleId:s.id,reason:`Matched rule "${s.id}".`}}return {decision:Ce,ruleId:null,reason:`No rule matched tool "${o}". Falling back to "${Ce}".`}}}};var De=({gatewayUrl:e,siteId:t,publishableKey:n,fetcher:r=fetch})=>{let o={policies:[],etag:null};return {snapshot(){return {policies:[...o.policies],etag:o.etag}},async sync(){let a=await r(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/policies`,{headers:{authorization:`Bearer ${n}`,...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:protocol.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:n=typeof document>"u"?void 0:document}={})=>{if(!n?.body)return null;let r=n.createElement("div");return r.setAttribute("role","status"),r.setAttribute("data-agentronics-deny-overlay","true"),r.textContent=e,Object.assign(r.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"}),n.body.appendChild(r),window.setTimeout(()=>r.remove(),t),r};var $e=({policyEngine:e,getIdentity:t,documentRef:n=typeof document>"u"?void 0:document,selector:r="[data-agentronics-tool]"})=>{if(!n)return {uninstall:()=>{}};let o=a=>{let s=a.target instanceof Element?a.target.closest(r):null;if(!(s instanceof HTMLElement))return;let y=s.dataset.agentronicsTool;y&&Promise.resolve(t()).then(i=>{let g=e.evaluate({tool:y,identity:i});g.decision==="deny"&&(a.preventDefault(),a.stopPropagation(),Le({message:g.reason,documentRef:n}));});};return n.addEventListener("click",o,true),{uninstall:()=>n.removeEventListener("click",o,true)}};var H=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,n)=>{e.set(t,n);},remove:t=>{e.delete(t);},keys:()=>[...e.keys()]}},je=(e,t)=>({read:n=>{try{return e.getItem(t+n)}catch{return null}},write:(n,r)=>{try{e.setItem(t+n,r);}catch{}},remove:n=>{try{e.removeItem(t+n);}catch{}},keys:()=>{let n=[];try{for(let r=0;r<e.length;r++){let o=e.key(r);o&&o.startsWith(t)&&n.push(o.slice(t.length));}}catch{}return n}}),We="agtx:",Be=()=>{let e=typeof window<"u",t=e&&typeof window.sessionStorage<"u"?je(window.sessionStorage,We+"session:"):H(),n=e&&typeof window.localStorage<"u"?je(window.localStorage,We+"user:"):H();return {session:t,user:n,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}},Kt=e=>JSON.stringify(e),Ue=(e={})=>{let t=Be(),n=i=>{e.onTrace?.(i);};return {get:(i,g={})=>{let u=g.scope??"session",d=t[u],p=_e(d.read(i));if(!p){n({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:false}});return}if(Ne(p,Date.now())){d.remove(i),n({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:false,expired:true}});return}return n({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:true}}),p.value},set:(i,g,u={})=>{let d=u.scope??"session",p=u.ttlSeconds??null,h=Date.now(),w={value:g,expiresAt:p===null?null:h+p*1e3,updatedAt:new Date(h).toISOString()};return t[d].write(i,Kt(w)),n({type:"memory.updated",metadata:{operation:"set",key:i,scope:d,ttlSeconds:p}}),protocol.MemoryEntry.parse({key:i,value:g,scope:d,ttlSeconds:p,updatedAt:w.updatedAt})},remove:(i,g={})=>{let u=g.scope??"session";t[u].remove(i),n({type:"memory.updated",metadata:{operation:"remove",key:i,scope:u}});},list:(i={})=>{let g=i.scope??"session",u=t[g],d=Date.now(),p=[];for(let h of u.keys()){let w=_e(u.read(h));if(w){if(Ne(w,d)){u.remove(h);continue}p.push(protocol.MemoryEntry.parse({key:h,value:w.value,scope:g,ttlSeconds:w.expiresAt===null?null:Math.max(0,Math.round((w.expiresAt-d)/1e3)),updatedAt:w.updatedAt}));}}return n({type:"memory.accessed",metadata:{operation:"list",scope:g,count:p.length}}),p},clear:(i={})=>{let g=i.scope??"session",u=t[g],d=u.keys().length;for(let p of u.keys())u.remove(p);n({type:"memory.updated",metadata:{operation:"clear",scope:g,count:d}});}}};var V=e=>protocol.SiteMemory.parse(JSON.parse(JSON.stringify(e))),B=e=>({...e,updatedAt:new Date().toISOString()}),Ke=(e={})=>{let t=protocol.SiteMemory.parse({...protocol.SITE_MEMORY_DEFAULT,...e.initial??{}}),n=null,r=new Set,o=l=>{e.onTrace?.(l);},a=()=>{n=null;},s=()=>{if(r.size===0)return;let l=V(t);n=l,r.forEach(v=>v(l));},y=l=>{let v=protocol.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=B(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],P=I[T];(typeof P!="object"||P===null||Array.isArray(P))&&(I[T]={}),I=I[T];}return I[x[x.length-1]]=v,t=B(protocol.SiteMemory.parse(k)),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"update",path:l}}),s(),u()},g=l=>{let v=protocol.SiteMemoryPageContext.parse({path:l.path,payload:l.payload,updatedAt:new Date().toISOString()});return t=B({...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=()=>(n||(n=V(t)),n);return {provide:y,update:i,provideForPage:g,snapshot:u,get:l=>{if(o({type:"memory.accessed",metadata:{kind:"site",operation:l?"get":"snapshot",path:l??null}}),!l)return V(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=B(protocol.SiteMemory.parse(l)),a(),s(),u()),subscribe:l=>(r.add(l),()=>{r.delete(l);})}};var Ve=({gatewayUrl:e,siteId:t,publishableKey:n,fetcher:r=fetch})=>{let o={memory:null,etag:null};return {snapshot(){return {memory:o.memory?protocol.SiteMemory.parse(o.memory):null,etag:o.etag}},async sync(){let a=await r(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/memory`,{headers:{authorization:`Bearer ${n}`,...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:protocol.SiteMemory.parse(s.memory??{}),etag:a.headers.get("etag")},this.snapshot()}}};var A="agent-context-",z="agentronics-site-context",zt=e=>{try{return JSON.stringify(e)}catch{return "{}"}},G=(e,t,n)=>{let r=e.querySelector(`meta[name="${t}"]`);r||(r=e.createElement("meta"),r.setAttribute("name",t),e.head.appendChild(r)),r.setAttribute("content",n);},N=(e,t)=>{e.querySelectorAll(`meta[name="${t}"]`).forEach(n=>n.remove());},F=({doc:e=typeof document>"u"?null:document,snapshot:t,schemaType:n="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 r=e.getElementById(z);return r||(r=e.createElement("script"),r.type="application/ld+json",r.id=z,e.head.appendChild(r)),r.textContent=zt({"@context":"https://schema.org","@type":n,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(z)?.remove();}}};var ze="agentronics-memory-overlay",Ft=e=>`
|
|
2
2
|
position: fixed;
|
|
3
3
|
bottom: 16px;
|
|
4
4
|
right: 16px;
|
|
@@ -12,6 +12,6 @@ z-index: 2147483647;
|
|
|
12
12
|
opacity: ${e?"0":"1"};
|
|
13
13
|
pointer-events: ${e?"none":"auto"};
|
|
14
14
|
box-shadow: 0 12px 32px rgba(15, 23, 42, 0.35);
|
|
15
|
-
`,Ve=e=>{let t=e.siteMap?.pages?.length??0,n=Object.keys(e.workflows).length,r=Object.keys(e.uiGuidance).length;return `Agentronics site memory \xB7 pages:${t} \xB7 workflows:${n} \xB7 ui-hints:${r}`},z=({doc:e=typeof document>"u"?null:document,snapshot:t,hidden:n=false})=>{if(!e)return {uninstall:()=>{},refresh:()=>{}};let r=e.getElementById(He);return r||(r=e.createElement("div"),r.id=He,r.setAttribute("role","note"),r.setAttribute("aria-label","Agentronics site memory summary"),r.setAttribute("data-agent-context","overlay"),e.body.appendChild(r)),r.setAttribute("style",Vt(n)),r.textContent=Ve(t),{uninstall:()=>{r?.remove();},refresh:i=>{r&&(r.textContent=Ve(i));}}};var Fe="/.well-known/agent-context.json",J=async({origin:e,fetcher:t=fetch,signal:n}={})=>{let r=(e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:"")+Fe;if(!r.startsWith("http"))return null;let i={headers:{accept:"application/json"}};n!==void 0&&(i.signal=n);let a=await t(r,i);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 protocol.SiteMemory.parse(s)};var ze=({evaluate:e,setPolicies:t,listPolicies:n,onTrace:r,identityResolver:i})=>{let a=new Map,s=new Set,g=o=>{if(!o.authz||!t||!n)return;let y={id:`tool:${o.name}`,tool:o.name,...o.authz,rateLimit:o.rateLimit??o.authz.rateLimit};t([...n().filter(u=>u.id!==y.id),y]);};return {register(o){return a.set(o.name,o),s.delete(o.name),g(o),r?.({type:"tool.registered",tool:o.name,metadata:{version:o.version??null,group:o.group??null,stage:o.stage??null}}),()=>{a.delete(o.name),s.delete(o.name);}},unregister(o){a.delete(o),s.delete(o);},enable(o){!a.has(o)||!s.has(o)||(s.delete(o),r?.({type:"tool.surfaced",tool:o,metadata:{state:"enabled"}}));},disable(o){!a.has(o)||s.has(o)||(s.add(o),r?.({type:"tool.surfaced",tool:o,metadata:{state:"disabled"}}));},isEnabled:o=>a.has(o)&&!s.has(o),list({includeDisabled:o=false}={}){let y=[...a.values()];return o?y:y.filter(u=>!s.has(u.name))},get:o=>a.get(o),async execute(o,y,u){let p=u===void 0?i?.()??null:u,d=a.get(o);if(!d)throw new Error(`Tool "${o}" is not registered.`);if(s.has(o)){let l={decision:"deny",ruleId:`tool:${o}`,reason:"Tool is disabled."};throw r?.({type:"tool.executed",tool:o,agent:p,policy:l,outcome:"blocked"}),new Error(l.reason)}let h=await e(o,{identity:p});if(h.decision==="deny")throw r?.({type:"tool.executed",tool:o,agent:p,policy:h,outcome:"blocked"}),new Error(h.reason);let w=Date.now();try{let l=await d.execute(y,{identity:p});return r?.({type:"tool.executed",tool:o,agent:p,policy:h,outcome:"success",durationMs:Date.now()-w}),l}catch(l){throw r?.({type:"tool.executed",tool:o,agent:p,policy:h,outcome:"error",durationMs:Date.now()-w,error:l instanceof Error?l.message:String(l)}),l}}}};var zt=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},Je=({gatewayUrl:e,siteId:t,publishableKey:n,fetcher:r=fetch})=>({async push(i){let a=i.map(zt),s=await r(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/tools`,{method:"PUT",headers:{authorization:`Bearer ${n}`,"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 qe=(e,t={})=>{let n=new Map;for(let s of e.stages)n.set(s.name,s);if(!n.has(e.initial))throw new Error(`Initial stage "${e.initial}" is not declared in progression stages.`);let r=e.initial,i=()=>{let s=n.get(r);return s?.enables?[r,...s.enables]:[r]},a=(s,g)=>{let o=r;if(!n.has(s))throw new Error(`Cannot transition to unknown stage "${s}".`);return s===r?{changed:false,from:o,to:s}:(r=s,t.onTrace?.({type:"tool.progressed",metadata:{from:o,to:s,trigger:g}}),{changed:true,from:o,to:s})};return {current:()=>r,enabledStages:()=>i(),notify(s){let o=n.get(r)?.transitions?.find(y=>y.on===s);return o?a(o.to,s):{changed:false,from:r,to:r}},set(s){return a(s,"manual")},reset(){let s=r;r=e.initial,s!==r&&t.onTrace?.({type:"tool.progressed",metadata:{from:s,to:r,trigger:"reset"}});},snapshot:()=>({current:r,enabled:i()})}};var Jt=(e,t)=>{let n=e.authz?.minTrust;return n?t?protocol.TRUST_RANK[t.trust]<protocol.TRUST_RANK[n]?{ok:false,reason:`trust-too-low:${t.trust}<${n}`}:{ok:true,reason:"trust-ok"}:{ok:false,reason:`requires-trust:${n}`}:{ok:true,reason:"no-trust-floor"}},qt=(e,t)=>{let n=e.authz?.allowedClasses??[];return n.length===0?{ok:true,reason:"no-class-restriction"}:t?n.includes(t.class)?{ok:true,reason:"class-ok"}:{ok:false,reason:`class-not-allowed:${t.class}`}:{ok:false,reason:`requires-class:${n.join("|")}`}},Xt=(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"},Ye=(e,t)=>{let n=Jt(e,t.identity);if(!n.ok)return {tool:e,visible:false,reason:n.reason};let r=qt(e,t.identity);if(!r.ok)return {tool:e,visible:false,reason:r.reason};let i=Xt(e,t);return i.ok?e.authz?.decision==="deny"?{tool:e,visible:false,reason:"authz-deny"}:{tool:e,visible:true,reason:"visible"}:{tool:e,visible:false,reason:i.reason}},Qe=(e,t)=>e.filter(n=>Ye(n,t).visible),Ze=(e,t)=>e.map(n=>Ye(n,t));var Yt="default",et=e=>{let t=new Map;for(let n of e){let r=n.group??Yt,i=t.get(r)??[];i.push(n),t.set(r,i);}return [...t.entries()].sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>({name:n,tools:r}))};var q=e=>e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(q).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${q(e[n])}`).join(",")}}`,Qt=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},n=q(t).length;return {name:e.name,characters:n,tokens:Math.ceil(n/4)}},tt=e=>{let t=e.map(Qt);return {total:t.reduce((r,i)=>r+i.tokens,0),perTool:t}};var nt=e=>{if(e.provider)return e.provider;let n=(e.doc?.defaultView??(typeof globalThis<"u"?globalThis:null))?.navigator?.modelContext;return !n||typeof n.provideContext!="function"?null:n},Zt=(e,t)=>{let n={name:e.name,invoke:r=>t(e,r)};return e.description!==void 0&&(n.description=e.description),e.inputSchema!==void 0&&(n.inputSchema=e.inputSchema),n},rt=(e={})=>{let t=e.invoke??(async(r,i)=>r.execute(i,{identity:null})),n=null;return {publish(r){let i=nt(e);return i?(n?.revoke(),n=i.provideContext({tools:r.map(a=>Zt(a,t))}),{revoked:true}):{revoked:false}},revoke(){n?.revoke(),n=null;},available:()=>!!nt(e)}};var X=(e=500)=>{let t=[];return {add(n){t.push(n),t.length>e&&t.splice(0,t.length-e);},list(){return [...t]},clear(){t.length=0;}}};var ot=(e,t)=>e===void 0?t:Math.max(0,Math.min(1,e)),Y=(e={})=>{let t=ot(e.traceRate,1),n=ot(e.errorRate,1),r=e.random??Math.random;return {shouldKeep(i){let a=i.outcome==="error"?n:t;return r()<a}}};var en="[REDACTED]",tn=e=>{if(e!==void 0)return JSON.parse(JSON.stringify(e))},Q=(e,t)=>{if(t.length===0||typeof e!="object"||e===null)return;let[n,...r]=t;if(!n)return;if(Array.isArray(e)){for(let a of e)Q(a,t);return}let i=e;if(n in i){if(r.length===0){i[n]=en;return}Q(i[n],r);}},Z=(e,t=[])=>{if(t.length===0)return e;let n=tn(e);for(let r of t)Q(n,r.split(".").filter(Boolean));return n},ee=["metadata.password","metadata.token","metadata.authorization","metadata.cookie"];var rn=()=>typeof location<"u"&&typeof location.pathname=="string"?location.pathname:void 0,it=e=>{let t=globalThis.crypto;return t&&"randomUUID"in t?`${e}_${t.randomUUID()}`:`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`},te=({siteId:e,bufferSize:t,sessionId:n=it("ses"),scrubPaths:r=ee,exporters:i=[],onExporterError:a,pageProvider:s=rn,...g})=>{let o=X(t),y=Y(g),u=()=>{try{return s()}catch{return}};return {sessionId:n,async emit(p){let d={...p.metadata};if(d.page===void 0){let w=u();w!==void 0&&(d.page=w);}let h=protocol.TraceEvent.parse(Z({id:it("trc"),siteId:e,sessionId:n,occurredAt:new Date().toISOString(),outcome:p.outcome??"success",...p,metadata:d},r));return y.shouldKeep(h)?(o.add(h),await Promise.all(i.map(async w=>{try{await w.export([h]);}catch(l){a?.(l,w,h);}})),h):null},list:()=>o.list(),clear:()=>o.clear()}};var ne=()=>({name:"console",export(e){for(let t of e)console.info("[agentronics:trace]",t.type,t);}});var re=({gatewayUrl:e,publishableKey:t,fetcher:n=fetch})=>({name:"gateway",async export(r){let i={publishableKey:t,events:r};await n(`${e.replace(/\/$/,"")}/v1/traces`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(i)});}});var on=e=>new Promise(t=>setTimeout(t,e)),ie=({url:e,fetcher:t=fetch,maxRetries:n=2,queueLimit:r=500})=>({name:"webhook",async export(i){let s=[...sn(e),...i].slice(-r),g=0;for(;;){let o=await t(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({events:s})});if(o.ok){st(e,[]);return}if(g>=n)throw st(e,s),new Error(`Webhook exporter failed with status ${o.status}.`);g+=1,await on(100*g);}}}),oe=e=>`agtx:webhook:${e}`,sn=e=>{if(typeof window>"u"||!window.localStorage)return [];try{let t=window.localStorage.getItem(oe(e));return t?JSON.parse(t):[]}catch{return []}},st=(e,t)=>{if(!(typeof window>"u"||!window.localStorage))try{if(t.length===0){window.localStorage.removeItem(oe(e));return}window.localStorage.setItem(oe(e),JSON.stringify(t));}catch{}};var ct="https://gateway.agentronics.dev",ln=e=>{if(e===void 0)return ct;if(e===ct)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}`)},un=e=>{let{publishableKey:t,siteId:n="default",debug:r=false,policies:i=[],trace:a={}}=e,s=ln(e.gatewayUrl),g=protocol.classifyApiKey(t);if(g==="secret")throw new protocol.AgentronicsError("wrong_key_kind","A secret key was passed to Agentronics.init(). Browser code must use a publishable key (agtx_pk_*).");if(g!=="publishable")throw new protocol.AgentronicsError("invalid_api_key",`Agentronics.init() expected a key starting with "${protocol.PUBLISHABLE_KEY_PREFIX}".`);let o=a.enabled??true,y=[...r?[ne()]:[],...a.gateway?[re({gatewayUrl:s,publishableKey:t})]:[],...a.webhookUrl?[ie({url:a.webhookUrl})]:[],...a.exporters??[]],u={siteId:n,exporters:o?y:[],onExporterError:(c,m)=>{r&&console.warn(`[agentronics] trace exporter "${m.name}" failed`,c);}};a.bufferSize!==void 0&&(u.bufferSize=a.bufferSize),a.traceRate!==void 0&&(u.traceRate=a.traceRate),a.errorRate!==void 0&&(u.errorRate=a.errorRate),a.scrubPaths!==void 0&&(u.scrubPaths=a.scrubPaths);let p=te(u),d=c=>{o&&p.emit(c);},h=de(),w={onTrace:d};e.auth!==void 0&&(w.context=e.auth);let l=Ae(w),v=ke(),x=Ee(i),k=Oe({gatewayUrl:s,siteId:n,publishableKey:t}),M=Ge({onTrace:d}),R={onTrace:d};e.siteMemory!==void 0&&(R.initial=e.siteMemory);let T=Be(R),P=Ke({gatewayUrl:s,siteId:n,publishableKey:t}),lt=Je({gatewayUrl:s,siteId:n,publishableKey:t}),j=async c=>{let m=Date.now(),S=await ue(c),b=h.preferOver(S);return o&&await p.emit({type:b?"agent.detected":"agent.missed",agent:b,durationMs:Date.now()-m,metadata:{detectedClass:S?.class??null,presented:h.snapshot()!==null}}),v.set(b,"detect"),b},se=async(c,m={})=>{let S=Date.now(),b=m.identity!==void 0?m.identity:await j(),B=x.evaluate({tool:c,identity:b});return o&&await p.emit({type:"authz.evaluated",tool:c,agent:b,policy:B,outcome:B.decision==="deny"?"blocked":"success",durationMs:Date.now()-S}),B},I=ze({evaluate:se,setPolicies:c=>x.set(c),listPolicies:()=>x.list(),onTrace:d,identityResolver:()=>v.snapshot().identity});for(let c of e.tools??[])I.register(c);let E=e.progression?qe(e.progression,{onTrace:d}):null,ae=c=>{let m={identity:c};return E&&(m.stage=E.current(),m.enabledStages=E.enabledStages()),m},O=c=>Qe(I.list(),ae(c)),ce=c=>{if(!E)return;E.notify(c).changed&&D.publish(O(v.snapshot().identity));},ut={class:"webmcp",trust:"detected",confidence:1,vendor:null,userAgent:typeof navigator<"u"?navigator.userAgent:null,detectionVersion:f,signals:{source:"navigator.modelContext"}},D=rt({invoke:async(c,m)=>{let S=v.snapshot().identity??ut,b=await I.execute(c.name,m,S);return ce(c.name),b}});v.subscribe(c=>{D.available()&&D.publish(O(c.identity));});let G=e.autoDetect??true,dt=G===false?Promise.resolve(null):(async()=>{let c=G===true?{}:G;try{return await j(c)}catch(m){return r&&console.warn("[agentronics] autoDetect failed:",m),null}})();return Object.freeze({publishableKey:t,siteId:n,gatewayUrl:s,debug:r,memory:M,siteMemory:T,memoryCache:P,tracer:p,auth:l,agentContext:v,authz:x,policyCache:k,tools:I,progression:E,webmcp:D,ready:dt,detect:j,authenticate:async c=>{let m=await l.authenticate(c);return v.set(m,"authenticate"),m},presentIdentity:c=>{let m=h.present(c);return d({type:"auth.identity_presented",agent:m.identity,metadata:{vendor:m.identity.vendor,class:m.identity.class}}),v.set(m.identity,"declare"),m},clearIdentity:()=>{h.clear(),d({type:"auth.identity_cleared"}),v.set(null,"cleared");},presentedIdentity:()=>h.snapshot(),setPolicies:c=>{x.set(c),d({type:"authz.policies_set",metadata:{count:c.length}});},listPolicies:()=>x.list(),syncPolicies:async()=>{let c=await k.sync();return x.set(c.policies),d({type:"authz.policies_set",metadata:{count:c.policies.length,synced:true}}),c.policies},syncSiteMemory:async()=>{let c=await P.sync();return c.memory&&(T.replace(c.memory),d({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:m=false}={})=>{let S=[];return c&&S.push(F({snapshot:T.snapshot()})),m&&S.push(z({snapshot:T.snapshot()})),{uninstall:()=>{S.forEach(b=>b.uninstall());}}},fetchWellKnown:async c=>{let m={};c!==void 0&&(m.origin=c);let S=await J(m);return S&&(T.replace(S),d({type:"memory.updated",metadata:{kind:"site",operation:"wellKnown",origin:c??null}})),S},installDomEnforcer:()=>Ce({policyEngine:x,getIdentity:()=>j({webmcp:{pollMs:0}})}),registerTool:c=>I.register(c),syncTools:async()=>{let c=I.list({includeDisabled:true}),m=await lt.push(c);return d({type:"tool.registered",metadata:{operation:"sync",count:m}}),m},surfaceTools:({identity:c=null}={})=>O(c),explainSurfacing:({identity:c=null}={})=>Ze(I.list(),ae(c)),groupedTools:({identity:c=null}={})=>et(O(c)),estimateTokens:({identity:c=null}={})=>tt(O(c)),publishToWebMcp:({identity:c=null}={})=>{let m=O(c),S=D.publish(m);return m.forEach(b=>{d({type:"tool.surfaced",tool:b.name,metadata:{state:"published",trust:c?.trust??null,group:b.group??null}});}),{revoked:S.revoked,surfaced:m.length}},notifyToolInvoked:c=>ce(c),evaluate:se,traces:()=>p.list(),clearTraces:()=>p.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 m=await c.json().catch(()=>null)??{};return {ok:!0,status:c.status,body:m}}catch(c){return {ok:false,status:0,error:c instanceof Error?c.message:String(c)}}}})};
|
|
16
|
-
exports.init=
|
|
15
|
+
`,Fe=e=>{let t=e.siteMap?.pages?.length??0,n=Object.keys(e.workflows).length,r=Object.keys(e.uiGuidance).length;return `Agentronics site memory \xB7 pages:${t} \xB7 workflows:${n} \xB7 ui-hints:${r}`},J=({doc:e=typeof document>"u"?null:document,snapshot:t,hidden:n=false})=>{if(!e)return {uninstall:()=>{},refresh:()=>{}};let r=e.getElementById(ze);return r||(r=e.createElement("div"),r.id=ze,r.setAttribute("role","note"),r.setAttribute("aria-label","Agentronics site memory summary"),r.setAttribute("data-agent-context","overlay"),e.body.appendChild(r)),r.setAttribute("style",Ft(n)),r.textContent=Fe(t),{uninstall:()=>{r?.remove();},refresh:o=>{r&&(r.textContent=Fe(o));}}};var Je="/.well-known/agent-context.json",q=async({origin:e,fetcher:t=fetch,signal:n}={})=>{let r=(e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:"")+Je;if(!r.startsWith("http"))return null;let o={headers:{accept:"application/json"}};n!==void 0&&(o.signal=n);let a=await t(r,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 protocol.SiteMemory.parse(s)};var qe=({evaluate:e,setPolicies:t,listPolicies:n,onTrace:r,identityResolver:o})=>{let a=new Map,s=new Set,y=i=>{if(!i.authz||!t||!n)return;let g={id:`tool:${i.name}`,tool:i.name,...i.authz,rateLimit:i.rateLimit??i.authz.rateLimit};t([...n().filter(u=>u.id!==g.id),g]);};return {register(i){return a.set(i.name,i),s.delete(i.name),y(i),r?.({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),r?.({type:"tool.surfaced",tool:i,metadata:{state:"enabled"}}));},disable(i){!a.has(i)||s.has(i)||(s.add(i),r?.({type:"tool.surfaced",tool:i,metadata:{state:"disabled"}}));},isEnabled:i=>a.has(i)&&!s.has(i),list({includeDisabled:i=false}={}){let g=[...a.values()];return i?g:g.filter(u=>!s.has(u.name))},get:i=>a.get(i),async execute(i,g,u){let d=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 r?.({type:"tool.executed",tool:i,agent:d,policy:l,outcome:"blocked"}),new Error(l.reason)}let h=await e(i,{identity:d});if(h.decision==="deny")throw r?.({type:"tool.executed",tool:i,agent:d,policy:h,outcome:"blocked"}),new Error(h.reason);let w=Date.now();try{let l=await p.execute(g,{identity:d});return r?.({type:"tool.executed",tool:i,agent:d,policy:h,outcome:"success",durationMs:Date.now()-w}),l}catch(l){throw r?.({type:"tool.executed",tool:i,agent:d,policy:h,outcome:"error",durationMs:Date.now()-w,error:l instanceof Error?l.message:String(l)}),l}}}};var qt=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},Xe=({gatewayUrl:e,siteId:t,publishableKey:n,fetcher:r=fetch})=>({async push(o){let a=o.map(qt),s=await r(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/tools`,{method:"PUT",headers:{authorization:`Bearer ${n}`,"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 Ye=(e,t={})=>{let n=new Map;for(let s of e.stages)n.set(s.name,s);if(!n.has(e.initial))throw new Error(`Initial stage "${e.initial}" is not declared in progression stages.`);let r=e.initial,o=()=>{let s=n.get(r);return s?.enables?[r,...s.enables]:[r]},a=(s,y)=>{let i=r;if(!n.has(s))throw new Error(`Cannot transition to unknown stage "${s}".`);return s===r?{changed:false,from:i,to:s}:(r=s,t.onTrace?.({type:"tool.progressed",metadata:{from:i,to:s,trigger:y}}),{changed:true,from:i,to:s})};return {current:()=>r,enabledStages:()=>o(),notify(s){let i=n.get(r)?.transitions?.find(g=>g.on===s);return i?a(i.to,s):{changed:false,from:r,to:r}},set(s){return a(s,"manual")},reset(){let s=r;r=e.initial,s!==r&&t.onTrace?.({type:"tool.progressed",metadata:{from:s,to:r,trigger:"reset"}});},snapshot:()=>({current:r,enabled:o()})}};var Xt=(e,t)=>{let n=e.authz?.minTrust;return n?t?protocol.TRUST_RANK[t.trust]<protocol.TRUST_RANK[n]?{ok:false,reason:`trust-too-low:${t.trust}<${n}`}:{ok:true,reason:"trust-ok"}:{ok:false,reason:`requires-trust:${n}`}:{ok:true,reason:"no-trust-floor"}},Yt=(e,t)=>{let n=e.authz?.allowedClasses??[];return n.length===0?{ok:true,reason:"no-class-restriction"}:t?n.includes(t.class)?{ok:true,reason:"class-ok"}:{ok:false,reason:`class-not-allowed:${t.class}`}:{ok:false,reason:`requires-class:${n.join("|")}`}},Qt=(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 n=Xt(e,t.identity);if(!n.ok)return {tool:e,visible:false,reason:n.reason};let r=Yt(e,t.identity);if(!r.ok)return {tool:e,visible:false,reason:r.reason};let o=Qt(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(n=>Ze(n,t).visible),tt=(e,t)=>e.map(n=>Ze(n,t));var Zt="default",nt=e=>{let t=new Map;for(let n of e){let r=n.group??Zt,o=t.get(r)??[];o.push(n),t.set(r,o);}return [...t.entries()].sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>({name:n,tools:r}))};var X=e=>e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(X).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${X(e[n])}`).join(",")}}`,en=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},n=X(t).length;return {name:e.name,characters:n,tokens:Math.ceil(n/4)}},rt=e=>{let t=e.map(en);return {total:t.reduce((r,o)=>r+o.tokens,0),perTool:t}};var ot=e=>{if(e.provider)return e.provider;let n=(e.doc?.defaultView??(typeof globalThis<"u"?globalThis:null))?.navigator?.modelContext;return !n||typeof n.provideContext!="function"?null:n},tn=(e,t)=>{let n={name:e.name,invoke:r=>t(e,r)};return e.description!==void 0&&(n.description=e.description),e.inputSchema!==void 0&&(n.inputSchema=e.inputSchema),n},it=(e={})=>{let t=e.invoke??(async(r,o)=>r.execute(o,{identity:null})),n=null;return {publish(r){let o=ot(e);return o?(n?.revoke(),n=o.provideContext({tools:r.map(a=>tn(a,t))}),{revoked:true}):{revoked:false}},revoke(){n?.revoke(),n=null;},available:()=>!!ot(e)}};var Y=(e=500)=>{let t=[];return {add(n){t.push(n),t.length>e&&t.splice(0,t.length-e);},list(){return [...t]},clear(){t.length=0;}}};var st=(e,t)=>e===void 0?t:Math.max(0,Math.min(1,e)),Q=(e={})=>{let t=st(e.traceRate,1),n=st(e.errorRate,1),r=e.random??Math.random;return {shouldKeep(o){let a=o.outcome==="error"?n:t;return r()<a}}};var nn="[REDACTED]",rn=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[n,...r]=t;if(!n)return;if(Array.isArray(e)){for(let a of e)Z(a,t);return}let o=e;if(n in o){if(r.length===0){o[n]=nn;return}Z(o[n],r);}},ee=(e,t=[])=>{if(t.length===0)return e;let n=rn(e);for(let r of t)Z(n,r.split(".").filter(Boolean));return n},te=["metadata.password","metadata.token","metadata.authorization","metadata.cookie"];var sn=()=>typeof location<"u"&&typeof location.pathname=="string"?location.pathname:void 0,at=e=>{let t=globalThis.crypto;return t&&"randomUUID"in t?`${e}_${t.randomUUID()}`:`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`},ne=({siteId:e,bufferSize:t,sessionId:n=at("ses"),scrubPaths:r=te,exporters:o=[],onExporterError:a,pageProvider:s=sn,...y})=>{let i=Y(t),g=Q(y),u=()=>{try{return s()}catch{return}};return {sessionId:n,async emit(d){let p={...d.metadata};if(p.page===void 0){let w=u();w!==void 0&&(p.page=w);}let h=protocol.TraceEvent.parse(ee({id:at("trc"),siteId:e,sessionId:n,occurredAt:new Date().toISOString(),outcome:d.outcome??"success",...d,metadata:p},r));return g.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 re=()=>({name:"console",export(e){for(let t of e)console.info("[agentronics:trace]",t.type,t);}});var oe=({gatewayUrl:e,publishableKey:t,fetcher:n=fetch})=>({name:"gateway",async export(r){let o={publishableKey:t,events:r};await n(`${e.replace(/\/$/,"")}/v1/traces`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(o)});}});var an=e=>new Promise(t=>setTimeout(t,e)),se=({url:e,fetcher:t=fetch,maxRetries:n=2,queueLimit:r=500})=>({name:"webhook",async export(o){let s=[...cn(e),...o].slice(-r),y=0;for(;;){let i=await t(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({events:s})});if(i.ok){ct(e,[]);return}if(y>=n)throw ct(e,s),new Error(`Webhook exporter failed with status ${i.status}.`);y+=1,await an(100*y);}}}),ie=e=>`agtx:webhook:${e}`,cn=e=>{if(typeof window>"u"||!window.localStorage)return [];try{let t=window.localStorage.getItem(ie(e));return t?JSON.parse(t):[]}catch{return []}},ct=(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="https://gateway.agentronics.dev",pn=e=>{if(e===void 0)return ut;if(e===ut)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}`)},dn=e=>{let{publishableKey:t,siteId:n="default",debug:r=false,policies:o=[],trace:a={}}=e,s=pn(e.gatewayUrl),y=protocol.classifyApiKey(t);if(y==="secret")throw new protocol.AgentronicsError("wrong_key_kind","A secret key was passed to Agentronics.init(). Browser code must use a publishable key (agtx_pk_*).");if(y!=="publishable")throw new protocol.AgentronicsError("invalid_api_key",`Agentronics.init() expected a key starting with "${protocol.PUBLISHABLE_KEY_PREFIX}".`);let i=a.enabled??true,g=[...r?[re()]:[],...a.gateway?[oe({gatewayUrl:s,publishableKey:t})]:[],...a.webhookUrl?[se({url:a.webhookUrl})]:[],...a.exporters??[]],u={siteId:n,exporters:i?g:[],onExporterError:(c,m)=>{r&&console.warn(`[agentronics] trace exporter "${m.name}" failed`,c);}};a.bufferSize!==void 0&&(u.bufferSize=a.bufferSize),a.traceRate!==void 0&&(u.traceRate=a.traceRate),a.errorRate!==void 0&&(u.errorRate=a.errorRate),a.scrubPaths!==void 0&&(u.scrubPaths=a.scrubPaths);let d=ne(u),p=c=>{i&&d.emit(c);},h=me(),w={onTrace:p};e.auth!==void 0&&(w.context=e.auth);let l=Ie(w),v=Me(),x=Oe(o),k=De({gatewayUrl:s,siteId:n,publishableKey:t}),I=Ue({onTrace:p}),R={onTrace:p};e.siteMemory!==void 0&&(R.initial=e.siteMemory);let T=Ke(R),P=Ve({gatewayUrl:s,siteId:n,publishableKey:t}),pt=Xe({gatewayUrl:s,siteId:n,publishableKey:t}),W=async c=>{let m=Date.now(),S=await de(c),b=h.preferOver(S);return i&&await d.emit({type:b?"agent.detected":"agent.missed",agent:b,durationMs:Date.now()-m,metadata:{detectedClass:S?.class??null,presented:h.snapshot()!==null}}),v.set(b,"detect"),b},ae=async(c,m={})=>{let S=Date.now(),b=m.identity!==void 0?m.identity:await W(),U=x.evaluate({tool:c,identity:b});return i&&await d.emit({type:"authz.evaluated",tool:c,agent:b,policy:U,outcome:U.decision==="deny"?"blocked":"success",durationMs:Date.now()-S}),U},M=qe({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 E=e.progression?Ye(e.progression,{onTrace:p}):null,ce=c=>{let m={identity:c};return E&&(m.stage=E.current(),m.enabledStages=E.enabledStages()),m},C=c=>et(M.list(),ce(c)),le=c=>{if(!E)return;E.notify(c).changed&&O.publish(C(v.snapshot().identity));},dt={class:"webmcp",trust:"detected",confidence:1,vendor:null,userAgent:typeof navigator<"u"?navigator.userAgent:null,detectionVersion:f,signals:{source:"navigator.modelContext"}},O=it({invoke:async(c,m)=>{let S=v.snapshot().identity??dt,b=await M.execute(c.name,m,S);return le(c.name),b}});v.subscribe(c=>{O.available()&&O.publish(C(c.identity));});let _=e.autoDetect??true,mt=_===false?Promise.resolve(null):(async()=>{let c=_===true?{}:_;try{return await W(c)}catch(m){return r&&console.warn("[agentronics] autoDetect failed:",m),null}})();return Object.freeze({publishableKey:t,siteId:n,gatewayUrl:s,debug:r,memory:I,siteMemory:T,memoryCache:P,tracer:d,auth:l,agentContext:v,authz:x,policyCache:k,tools:M,progression:E,webmcp:O,ready:mt,detect:W,authenticate:async c=>{let m=await l.authenticate(c);return v.set(m,"authenticate"),m},presentIdentity:c=>{let m=h.present(c);return p({type:"auth.identity_presented",agent:m.identity,metadata:{vendor:m.identity.vendor,class:m.identity.class}}),v.set(m.identity,"declare"),m},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 P.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:m=false}={})=>{let S=[];return c&&S.push(F({snapshot:T.snapshot()})),m&&S.push(J({snapshot:T.snapshot()})),{uninstall:()=>{S.forEach(b=>b.uninstall());}}},fetchWellKnown:async c=>{let m={};c!==void 0&&(m.origin=c);let S=await q(m);return S&&(T.replace(S),p({type:"memory.updated",metadata:{kind:"site",operation:"wellKnown",origin:c??null}})),S},installDomEnforcer:()=>$e({policyEngine:x,getIdentity:()=>W({webmcp:{pollMs:0}})}),registerTool:c=>M.register(c),syncTools:async()=>{let c=M.list({includeDisabled:true}),m=await pt.push(c);return p({type:"tool.registered",metadata:{operation:"sync",count:m}}),m},surfaceTools:({identity:c=null}={})=>C(c),explainSurfacing:({identity:c=null}={})=>tt(M.list(),ce(c)),groupedTools:({identity:c=null}={})=>nt(C(c)),estimateTokens:({identity:c=null}={})=>rt(C(c)),publishToWebMcp:({identity:c=null}={})=>{let m=C(c),S=O.publish(m);return m.forEach(b=>{p({type:"tool.surfaced",tool:b.name,metadata:{state:"published",trust:c?.trust??null,group:b.group??null}});}),{revoked:S.revoked,surfaced:m.length}},notifyToolInvoked:c=>le(c),evaluate:ae,traces:()=>d.list(),clearTraces:()=>d.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 m=await c.json().catch(()=>null)??{};return {ok:!0,status:c.status,body:m}}catch(c){return {ok:false,status:0,error:c instanceof Error?c.message:String(c)}}}})};
|
|
16
|
+
exports.init=dn;//# sourceMappingURL=init-only.cjs.map
|
|
17
17
|
//# sourceMappingURL=init-only.cjs.map
|