@agentuity/frontend 1.0.47 → 2.0.0-beta.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/AGENTS.md +7 -31
- package/dist/beacon-script.js +1 -1
- package/dist/beacon.js +1 -1
- package/dist/dev-ws.d.ts +11 -0
- package/dist/dev-ws.d.ts.map +1 -0
- package/dist/dev-ws.js +34 -0
- package/dist/dev-ws.js.map +1 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/dev-ws.ts +33 -0
- package/src/index.ts +1 -18
- package/dist/client/eventstream.d.ts +0 -12
- package/dist/client/eventstream.d.ts.map +0 -1
- package/dist/client/eventstream.js +0 -39
- package/dist/client/eventstream.js.map +0 -1
- package/dist/client/index.d.ts +0 -33
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -230
- package/dist/client/index.js.map +0 -1
- package/dist/client/stream.d.ts +0 -6
- package/dist/client/stream.d.ts.map +0 -1
- package/dist/client/stream.js +0 -49
- package/dist/client/stream.js.map +0 -1
- package/dist/client/types.d.ts +0 -168
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -5
- package/dist/client/types.js.map +0 -1
- package/dist/client/websocket.d.ts +0 -6
- package/dist/client/websocket.d.ts.map +0 -1
- package/dist/client/websocket.js +0 -49
- package/dist/client/websocket.js.map +0 -1
- package/dist/types.d.ts +0 -42
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/src/client/eventstream.ts +0 -52
- package/src/client/index.ts +0 -267
- package/src/client/stream.ts +0 -61
- package/src/client/types.ts +0 -237
- package/src/client/websocket.ts +0 -61
- package/src/types.ts +0 -56
package/AGENTS.md
CHANGED
|
@@ -22,13 +22,13 @@ Framework-agnostic web utilities for building Agentuity frontend applications. W
|
|
|
22
22
|
```text
|
|
23
23
|
src/
|
|
24
24
|
├── index.ts # Main exports
|
|
25
|
-
├── types.ts # RouteRegistry, WebSocketRouteRegistry, SSERouteRegistry, RPCRouteRegistry
|
|
26
25
|
├── url.ts # buildUrl, defaultBaseUrl
|
|
27
26
|
├── reconnect.ts # createReconnectManager (exponential backoff)
|
|
28
27
|
├── websocket-manager.ts # WebSocketManager class
|
|
29
28
|
├── eventstream-manager.ts # EventStreamManager class (SSE)
|
|
30
|
-
├──
|
|
31
|
-
|
|
29
|
+
├── webrtc-manager.ts # WebRTCManager class
|
|
30
|
+
├── analytics.ts # getAnalytics, track, getVisitorId, isOptedOut
|
|
31
|
+
└── memo.ts # jsonEqual
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
## Code Conventions
|
|
@@ -38,41 +38,17 @@ src/
|
|
|
38
38
|
- **Pure functions** - All utilities are pure functions where possible
|
|
39
39
|
- **Browser APIs** - Uses standard browser APIs only
|
|
40
40
|
|
|
41
|
-
##
|
|
42
|
-
|
|
43
|
-
### Route Registries
|
|
44
|
-
|
|
45
|
-
Types are augmented by generated code:
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
declare module '@agentuity/frontend' {
|
|
49
|
-
export interface RouteRegistry {
|
|
50
|
-
'GET /users': { outputSchema: typeof usersSchema };
|
|
51
|
-
}
|
|
52
|
-
export interface WebSocketRouteRegistry {
|
|
53
|
-
/* ... */
|
|
54
|
-
}
|
|
55
|
-
export interface SSERouteRegistry {
|
|
56
|
-
/* ... */
|
|
57
|
-
}
|
|
58
|
-
export interface RPCRouteRegistry {
|
|
59
|
-
/* ... */
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Connection Managers
|
|
41
|
+
## Connection Managers
|
|
65
42
|
|
|
66
|
-
`WebSocketManager` and `EventStreamManager` provide auto-reconnection with exponential backoff.
|
|
43
|
+
`WebSocketManager` and `EventStreamManager` provide auto-reconnection with exponential backoff.
|
|
67
44
|
|
|
68
45
|
## Key Exports
|
|
69
46
|
|
|
70
47
|
- **URL**: `buildUrl`, `defaultBaseUrl`
|
|
71
48
|
- **Reconnect**: `createReconnectManager`
|
|
72
|
-
- **Managers**: `WebSocketManager`, `EventStreamManager`
|
|
73
|
-
- **Client**: `createClient`
|
|
49
|
+
- **Managers**: `WebSocketManager`, `EventStreamManager`, `WebRTCManager`
|
|
74
50
|
- **Analytics**: `getAnalytics`, `track`, `getVisitorId`, `isOptedOut`, `setOptOut`
|
|
75
|
-
- **
|
|
51
|
+
- **Utilities**: `jsonEqual`, `deserializeData`, `getProcessEnv`
|
|
76
52
|
|
|
77
53
|
## Publishing
|
|
78
54
|
|
package/dist/beacon-script.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Auto-generated - do not edit
|
|
2
2
|
// Minified analytics beacon script (overwrites TypeScript output)
|
|
3
|
-
export const BEACON_SCRIPT = "/* @agentuity/frontend
|
|
3
|
+
export const BEACON_SCRIPT = "/* @agentuity/frontend v2.0.0-beta.0 */\n(()=>{function A(X){if(X===void 0||X===null)return\"\";try{let V=new WeakSet;return JSON.stringify(X,(Y,Z)=>{if(typeof Z===\"object\"&&Z!==null){if(V.has(Z))return\"[Circular]\";V.add(Z)}return Z})}catch(V){let Y=V instanceof Error?V.message:String(V);return console.warn(\"[Agentuity Analytics] Failed to stringify properties:\",Y),`[unserializable: ${Y}]`}}(()=>{let X=window,V=document,Y=X.__AGENTUITY_ANALYTICS__;if(!Y||!Y.enabled)return;let Z=X;if(Y.isDevmode)console.debug(\"[Agentuity Analytics] Script loaded, init flag:\",Z.__AGENTUITY_BEACON_INIT__,\"path:\",location.pathname);if(Z.__AGENTUITY_BEACON_INIT__){if(Y.isDevmode)console.debug(\"[Agentuity Analytics] Already initialized, skipping\");return}Z.__AGENTUITY_BEACON_INIT__=!0;let J=Y,K=null,z=!1,C=Date.now(),Q=\"\",M={},q={id:\"\",timestamp:0,timezone_offset:0,url:\"\",path:\"\",referrer:\"\",title:\"\",screen_width:0,screen_height:0,viewport_width:0,viewport_height:0,device_pixel_ratio:1,user_agent:\"\",language:\"\",scroll_depth:0,time_on_page:0,scroll_events:[],custom_events:[]};function O(){return crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).substr(2,9)}`}function T(){let x=new URLSearchParams(location.search),B={};return[\"utm_source\",\"utm_medium\",\"utm_campaign\",\"utm_term\",\"utm_content\"].forEach((G)=>{let W=x.get(G);if(W)B[G]=W}),B}function F(x){if(!x)return\"\";try{let B=new URL(x);return B.origin+B.pathname}catch{return x.split(\"?\")[0]??x}}function U(){q.id=O(),q.timestamp=Date.now(),q.timezone_offset=new Date().getTimezoneOffset(),q.url=F(location.href),q.path=location.pathname,q.referrer=F(V.referrer),q.title=V.title||\"\",q.screen_width=screen.width||0,q.screen_height=screen.height||0,q.viewport_width=innerWidth||0,q.viewport_height=innerHeight||0,q.device_pixel_ratio=devicePixelRatio||1,q.user_agent=navigator.userAgent||\"\",q.language=navigator.language||\"\";let x=T();for(let B in x)q[B]=x[B];if(q.scroll_events=[],q.custom_events=[],q.scroll_depth=0,z=!1,C=Date.now(),typeof performance<\"u\"&&performance.getEntriesByType){let B=performance.getEntriesByType(\"navigation\")[0];if(B)if(q.dom_ready=Math.round(B.domContentLoadedEventEnd-B.startTime),q.ttfb=Math.round(B.responseStart-B.requestStart),B.loadEventEnd>0)q.load_time=Math.round(B.loadEventEnd-B.startTime);else setTimeout(()=>{let G=performance.getEntriesByType(\"navigation\")[0];if(G&&G.loadEventEnd>0)q.load_time=Math.round(G.loadEventEnd-G.startTime)},0)}if(J.isDevmode)console.debug(\"[Agentuity Analytics] Session started (full init):\",q.id)}function j(){if(q.id=O(),q.timestamp=Date.now(),q.scroll_events=[],q.custom_events=[],q.scroll_depth=0,q.time_on_page=0,z=!1,C=Date.now(),J.isDevmode)console.debug(\"[Agentuity Analytics] Session started (soft reset):\",q.id)}fetch(\"https://agentuity.sh/location\").then((x)=>x.json()).then((x)=>{K=x;try{sessionStorage.setItem(\"agentuity_geo\",JSON.stringify(x))}catch{}}).catch(()=>{try{let x=sessionStorage.getItem(\"agentuity_geo\");if(x)K=JSON.parse(x)}catch{}});try{let x=sessionStorage.getItem(\"agentuity_geo\");if(x)K=JSON.parse(x)}catch{}function N(){return X.__AGENTUITY_SESSION__}function L(x=!1){if(z&&!x){if(J.isDevmode)console.debug(\"[Agentuity Analytics] send() skipped - already sent\");return}if(J.sampleRate!==void 0&&J.sampleRate<1&&Math.random()>J.sampleRate)return;if(z=!0,q.time_on_page=Date.now()-C,K){if(q.country=K.country||\"\",K.country_latitude)q.country_latitude=parseFloat(String(K.country_latitude));if(K.country_longitude)q.country_longitude=parseFloat(String(K.country_longitude));if(q.region=K.region||\"\",K.region_latitude)q.region_latitude=parseFloat(String(K.region_latitude));if(K.region_longitude)q.region_longitude=parseFloat(String(K.region_longitude));if(q.city=K.city||\"\",K.city_latitude)q.city_latitude=parseFloat(String(K.city_latitude));if(K.city_longitude)q.city_longitude=parseFloat(String(K.city_longitude));if(q.timezone=K.timezone||\"\",K.latitude)q.latitude=parseFloat(String(K.latitude));if(K.longitude)q.longitude=parseFloat(String(K.longitude))}if(q.cls)q.cls=Math.round(q.cls*1000)/1000;let B=N(),G=localStorage.getItem(\"agentuity_visitor_id\")||\"vid_\"+O();try{localStorage.setItem(\"agentuity_visitor_id\",G)}catch{}let W={org_id:J.orgId,project_id:J.projectId,thread_id:B?.threadId||\"\",visitor_id:G,user_id:Q,user_traits:M,is_devmode:J.isDevmode,pageview:q};try{sessionStorage.removeItem(\"agentuity_pending_pageview\")}catch{}if(J.isDevmode){console.debug(\"[Agentuity Analytics]\",JSON.stringify(W,null,2));return}let _=JSON.stringify(W);if(navigator.sendBeacon)navigator.sendBeacon(\"/_agentuity/webanalytics/collect\",_);else fetch(\"/_agentuity/webanalytics/collect\",{method:\"POST\",body:_,keepalive:!0}).catch(()=>{})}if(V.addEventListener(\"visibilitychange\",()=>{if(J.isDevmode)console.debug(\"[Agentuity Analytics] visibilitychange:\",V.visibilityState,\"sent:\",z);if(V.visibilityState===\"hidden\")L();else if(V.visibilityState===\"visible\")j()}),X.addEventListener(\"pagehide\",()=>{if(J.isDevmode){console.debug(\"[Agentuity Analytics] pagehide event\");try{sessionStorage.setItem(\"agentuity_last_event\",`pagehide:${Date.now()}:${q.path}`)}catch{}}L()}),X.addEventListener(\"beforeunload\",()=>{if(J.isDevmode){console.debug(\"[Agentuity Analytics] beforeunload event\");try{sessionStorage.setItem(\"agentuity_last_event\",`beforeunload:${Date.now()}:${q.path}`)}catch{}}L()}),J.isDevmode)try{let x=sessionStorage.getItem(\"agentuity_last_event\");if(x)console.debug(\"[Agentuity Analytics] Previous page event:\",x),sessionStorage.removeItem(\"agentuity_last_event\")}catch{}try{let x=sessionStorage.getItem(\"agentuity_pending_pageview\");if(x){sessionStorage.removeItem(\"agentuity_pending_pageview\");let B=JSON.parse(x);if(B.pageview?.path!==location.pathname)if(J.isDevmode)console.debug(\"[Agentuity Analytics] Sending unsent data from previous page:\",B.pageview?.path),console.debug(\"[Agentuity Analytics]\",JSON.stringify(B,null,2));else{let G=JSON.stringify(B);if(navigator.sendBeacon)navigator.sendBeacon(\"/_agentuity/webanalytics/collect\",G)}}}catch{}function H(){try{q.time_on_page=Date.now()-C;let x=N(),B=localStorage.getItem(\"agentuity_visitor_id\")||\"vid_\"+O(),G={org_id:J.orgId,project_id:J.projectId,thread_id:x?.threadId||\"\",visitor_id:B,user_id:Q,user_traits:M,is_devmode:J.isDevmode,pageview:{...q}};sessionStorage.setItem(\"agentuity_pending_pageview\",JSON.stringify(G))}catch{}}if(setInterval(H,2000),V.addEventListener(\"click\",H,{passive:!0}),V.addEventListener(\"scroll\",H,{passive:!0,once:!0}),J.isDevmode)console.debug(\"[Agentuity Analytics] Beacon initialized, visibility:\",V.visibilityState);if(J.trackScroll!==!1){let B=function(){let G=X.scrollY||V.documentElement.scrollTop,W=V.documentElement.scrollHeight-V.documentElement.clientHeight;return W<=0?100:Math.min(100,Math.round(G/W*100))};var D=B;let x=new Set;X.addEventListener(\"scroll\",()=>{let G=B();if(G>q.scroll_depth)q.scroll_depth=G;[25,50,75,100].forEach((W)=>{if(G>=W&&!x.has(W))x.add(W),q.scroll_events.push({depth:W,timestamp:Date.now()-C})})},{passive:!0})}if(J.trackWebVitals!==!1&&typeof PerformanceObserver<\"u\"){try{let x=new PerformanceObserver((B)=>{B.getEntries().forEach((G)=>{if(G.name===\"first-contentful-paint\")q.fcp=Math.round(G.startTime),x.disconnect()})});x.observe({type:\"paint\",buffered:!0})}catch{}try{new PerformanceObserver((x)=>{let B=x.getEntries(),G=B[B.length-1];if(G)q.lcp=Math.round(G.startTime)}).observe({type:\"largest-contentful-paint\",buffered:!0})}catch{}try{new PerformanceObserver((x)=>{x.getEntries().forEach((B)=>{let G=B;if(!G.hadRecentInput&&G.value)q.cls=(q.cls||0)+G.value})}).observe({type:\"layout-shift\",buffered:!0})}catch{}try{new PerformanceObserver((x)=>{x.getEntries().forEach((B)=>{let G=B;if(G.duration&&G.duration>(q.inp||0))q.inp=Math.round(G.duration)})}).observe({type:\"event\",buffered:!0})}catch{}}if(J.trackSPANavigation!==!1){let _=function(){let $=location.pathname+location.search;if($!==G){if(J.isDevmode)console.debug(\"[Agentuity Analytics] SPA navigation:\",G,\"->\",$);L(!0),G=$,W=location.href,U()}};var R=_;let{pushState:x,replaceState:B}=history,G=location.pathname+location.search,W=location.href;if(J.isDevmode)console.debug(\"[Agentuity Analytics] SPA tracking enabled, initial path:\",G);history.pushState=function(...$){x.apply(this,$),setTimeout(_,0)},history.replaceState=function(...$){B.apply(this,$),setTimeout(_,0)},X.addEventListener(\"popstate\",_),setInterval(()=>{if(location.href!==W)W=location.href,_()},200)}if(J.trackClicks!==!1)V.addEventListener(\"click\",(x)=>{let B=x.target;if(!B)return;let G=B.closest(\"[data-analytics]\");if(!G)return;if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:\"click:\"+G.getAttribute(\"data-analytics\"),data:\"\"})},!0);if(J.trackErrors!==!1)X.addEventListener(\"error\",(x)=>{if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:\"error:js_error\",data:JSON.stringify({message:x.message||\"Unknown\",filename:x.filename||\"\",lineno:x.lineno||0})})}),X.addEventListener(\"unhandledrejection\",(x)=>{if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:\"error:unhandled_rejection\",data:JSON.stringify({message:x.reason instanceof Error?x.reason.message:String(x.reason)})})});if(V.readyState===\"complete\")U();else X.addEventListener(\"load\",U);X.agentuityAnalytics={track(x,B){if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:x,data:A(B)})},identify(x,B){if(Q=x,B){M={};for(let[G,W]of Object.entries(B))M[G]=String(W)}},flush:()=>L(!0)}})();})();\n";
|
|
4
4
|
|
|
5
5
|
export function validateBeaconScript() {
|
|
6
6
|
if (!BEACON_SCRIPT || BEACON_SCRIPT.length === 0) {
|
package/dist/beacon.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/* @agentuity/frontend
|
|
1
|
+
/* @agentuity/frontend v2.0.0-beta.0 */
|
|
2
2
|
(()=>{function A(X){if(X===void 0||X===null)return"";try{let V=new WeakSet;return JSON.stringify(X,(Y,Z)=>{if(typeof Z==="object"&&Z!==null){if(V.has(Z))return"[Circular]";V.add(Z)}return Z})}catch(V){let Y=V instanceof Error?V.message:String(V);return console.warn("[Agentuity Analytics] Failed to stringify properties:",Y),`[unserializable: ${Y}]`}}(()=>{let X=window,V=document,Y=X.__AGENTUITY_ANALYTICS__;if(!Y||!Y.enabled)return;let Z=X;if(Y.isDevmode)console.debug("[Agentuity Analytics] Script loaded, init flag:",Z.__AGENTUITY_BEACON_INIT__,"path:",location.pathname);if(Z.__AGENTUITY_BEACON_INIT__){if(Y.isDevmode)console.debug("[Agentuity Analytics] Already initialized, skipping");return}Z.__AGENTUITY_BEACON_INIT__=!0;let J=Y,K=null,z=!1,C=Date.now(),Q="",M={},q={id:"",timestamp:0,timezone_offset:0,url:"",path:"",referrer:"",title:"",screen_width:0,screen_height:0,viewport_width:0,viewport_height:0,device_pixel_ratio:1,user_agent:"",language:"",scroll_depth:0,time_on_page:0,scroll_events:[],custom_events:[]};function O(){return crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).substr(2,9)}`}function T(){let x=new URLSearchParams(location.search),B={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach((G)=>{let W=x.get(G);if(W)B[G]=W}),B}function F(x){if(!x)return"";try{let B=new URL(x);return B.origin+B.pathname}catch{return x.split("?")[0]??x}}function U(){q.id=O(),q.timestamp=Date.now(),q.timezone_offset=new Date().getTimezoneOffset(),q.url=F(location.href),q.path=location.pathname,q.referrer=F(V.referrer),q.title=V.title||"",q.screen_width=screen.width||0,q.screen_height=screen.height||0,q.viewport_width=innerWidth||0,q.viewport_height=innerHeight||0,q.device_pixel_ratio=devicePixelRatio||1,q.user_agent=navigator.userAgent||"",q.language=navigator.language||"";let x=T();for(let B in x)q[B]=x[B];if(q.scroll_events=[],q.custom_events=[],q.scroll_depth=0,z=!1,C=Date.now(),typeof performance<"u"&&performance.getEntriesByType){let B=performance.getEntriesByType("navigation")[0];if(B)if(q.dom_ready=Math.round(B.domContentLoadedEventEnd-B.startTime),q.ttfb=Math.round(B.responseStart-B.requestStart),B.loadEventEnd>0)q.load_time=Math.round(B.loadEventEnd-B.startTime);else setTimeout(()=>{let G=performance.getEntriesByType("navigation")[0];if(G&&G.loadEventEnd>0)q.load_time=Math.round(G.loadEventEnd-G.startTime)},0)}if(J.isDevmode)console.debug("[Agentuity Analytics] Session started (full init):",q.id)}function j(){if(q.id=O(),q.timestamp=Date.now(),q.scroll_events=[],q.custom_events=[],q.scroll_depth=0,q.time_on_page=0,z=!1,C=Date.now(),J.isDevmode)console.debug("[Agentuity Analytics] Session started (soft reset):",q.id)}fetch("https://agentuity.sh/location").then((x)=>x.json()).then((x)=>{K=x;try{sessionStorage.setItem("agentuity_geo",JSON.stringify(x))}catch{}}).catch(()=>{try{let x=sessionStorage.getItem("agentuity_geo");if(x)K=JSON.parse(x)}catch{}});try{let x=sessionStorage.getItem("agentuity_geo");if(x)K=JSON.parse(x)}catch{}function N(){return X.__AGENTUITY_SESSION__}function L(x=!1){if(z&&!x){if(J.isDevmode)console.debug("[Agentuity Analytics] send() skipped - already sent");return}if(J.sampleRate!==void 0&&J.sampleRate<1&&Math.random()>J.sampleRate)return;if(z=!0,q.time_on_page=Date.now()-C,K){if(q.country=K.country||"",K.country_latitude)q.country_latitude=parseFloat(String(K.country_latitude));if(K.country_longitude)q.country_longitude=parseFloat(String(K.country_longitude));if(q.region=K.region||"",K.region_latitude)q.region_latitude=parseFloat(String(K.region_latitude));if(K.region_longitude)q.region_longitude=parseFloat(String(K.region_longitude));if(q.city=K.city||"",K.city_latitude)q.city_latitude=parseFloat(String(K.city_latitude));if(K.city_longitude)q.city_longitude=parseFloat(String(K.city_longitude));if(q.timezone=K.timezone||"",K.latitude)q.latitude=parseFloat(String(K.latitude));if(K.longitude)q.longitude=parseFloat(String(K.longitude))}if(q.cls)q.cls=Math.round(q.cls*1000)/1000;let B=N(),G=localStorage.getItem("agentuity_visitor_id")||"vid_"+O();try{localStorage.setItem("agentuity_visitor_id",G)}catch{}let W={org_id:J.orgId,project_id:J.projectId,thread_id:B?.threadId||"",visitor_id:G,user_id:Q,user_traits:M,is_devmode:J.isDevmode,pageview:q};try{sessionStorage.removeItem("agentuity_pending_pageview")}catch{}if(J.isDevmode){console.debug("[Agentuity Analytics]",JSON.stringify(W,null,2));return}let _=JSON.stringify(W);if(navigator.sendBeacon)navigator.sendBeacon("/_agentuity/webanalytics/collect",_);else fetch("/_agentuity/webanalytics/collect",{method:"POST",body:_,keepalive:!0}).catch(()=>{})}if(V.addEventListener("visibilitychange",()=>{if(J.isDevmode)console.debug("[Agentuity Analytics] visibilitychange:",V.visibilityState,"sent:",z);if(V.visibilityState==="hidden")L();else if(V.visibilityState==="visible")j()}),X.addEventListener("pagehide",()=>{if(J.isDevmode){console.debug("[Agentuity Analytics] pagehide event");try{sessionStorage.setItem("agentuity_last_event",`pagehide:${Date.now()}:${q.path}`)}catch{}}L()}),X.addEventListener("beforeunload",()=>{if(J.isDevmode){console.debug("[Agentuity Analytics] beforeunload event");try{sessionStorage.setItem("agentuity_last_event",`beforeunload:${Date.now()}:${q.path}`)}catch{}}L()}),J.isDevmode)try{let x=sessionStorage.getItem("agentuity_last_event");if(x)console.debug("[Agentuity Analytics] Previous page event:",x),sessionStorage.removeItem("agentuity_last_event")}catch{}try{let x=sessionStorage.getItem("agentuity_pending_pageview");if(x){sessionStorage.removeItem("agentuity_pending_pageview");let B=JSON.parse(x);if(B.pageview?.path!==location.pathname)if(J.isDevmode)console.debug("[Agentuity Analytics] Sending unsent data from previous page:",B.pageview?.path),console.debug("[Agentuity Analytics]",JSON.stringify(B,null,2));else{let G=JSON.stringify(B);if(navigator.sendBeacon)navigator.sendBeacon("/_agentuity/webanalytics/collect",G)}}}catch{}function H(){try{q.time_on_page=Date.now()-C;let x=N(),B=localStorage.getItem("agentuity_visitor_id")||"vid_"+O(),G={org_id:J.orgId,project_id:J.projectId,thread_id:x?.threadId||"",visitor_id:B,user_id:Q,user_traits:M,is_devmode:J.isDevmode,pageview:{...q}};sessionStorage.setItem("agentuity_pending_pageview",JSON.stringify(G))}catch{}}if(setInterval(H,2000),V.addEventListener("click",H,{passive:!0}),V.addEventListener("scroll",H,{passive:!0,once:!0}),J.isDevmode)console.debug("[Agentuity Analytics] Beacon initialized, visibility:",V.visibilityState);if(J.trackScroll!==!1){let B=function(){let G=X.scrollY||V.documentElement.scrollTop,W=V.documentElement.scrollHeight-V.documentElement.clientHeight;return W<=0?100:Math.min(100,Math.round(G/W*100))};var D=B;let x=new Set;X.addEventListener("scroll",()=>{let G=B();if(G>q.scroll_depth)q.scroll_depth=G;[25,50,75,100].forEach((W)=>{if(G>=W&&!x.has(W))x.add(W),q.scroll_events.push({depth:W,timestamp:Date.now()-C})})},{passive:!0})}if(J.trackWebVitals!==!1&&typeof PerformanceObserver<"u"){try{let x=new PerformanceObserver((B)=>{B.getEntries().forEach((G)=>{if(G.name==="first-contentful-paint")q.fcp=Math.round(G.startTime),x.disconnect()})});x.observe({type:"paint",buffered:!0})}catch{}try{new PerformanceObserver((x)=>{let B=x.getEntries(),G=B[B.length-1];if(G)q.lcp=Math.round(G.startTime)}).observe({type:"largest-contentful-paint",buffered:!0})}catch{}try{new PerformanceObserver((x)=>{x.getEntries().forEach((B)=>{let G=B;if(!G.hadRecentInput&&G.value)q.cls=(q.cls||0)+G.value})}).observe({type:"layout-shift",buffered:!0})}catch{}try{new PerformanceObserver((x)=>{x.getEntries().forEach((B)=>{let G=B;if(G.duration&&G.duration>(q.inp||0))q.inp=Math.round(G.duration)})}).observe({type:"event",buffered:!0})}catch{}}if(J.trackSPANavigation!==!1){let _=function(){let $=location.pathname+location.search;if($!==G){if(J.isDevmode)console.debug("[Agentuity Analytics] SPA navigation:",G,"->",$);L(!0),G=$,W=location.href,U()}};var R=_;let{pushState:x,replaceState:B}=history,G=location.pathname+location.search,W=location.href;if(J.isDevmode)console.debug("[Agentuity Analytics] SPA tracking enabled, initial path:",G);history.pushState=function(...$){x.apply(this,$),setTimeout(_,0)},history.replaceState=function(...$){B.apply(this,$),setTimeout(_,0)},X.addEventListener("popstate",_),setInterval(()=>{if(location.href!==W)W=location.href,_()},200)}if(J.trackClicks!==!1)V.addEventListener("click",(x)=>{let B=x.target;if(!B)return;let G=B.closest("[data-analytics]");if(!G)return;if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:"click:"+G.getAttribute("data-analytics"),data:""})},!0);if(J.trackErrors!==!1)X.addEventListener("error",(x)=>{if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:"error:js_error",data:JSON.stringify({message:x.message||"Unknown",filename:x.filename||"",lineno:x.lineno||0})})}),X.addEventListener("unhandledrejection",(x)=>{if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:"error:unhandled_rejection",data:JSON.stringify({message:x.reason instanceof Error?x.reason.message:String(x.reason)})})});if(V.readyState==="complete")U();else X.addEventListener("load",U);X.agentuityAnalytics={track(x,B){if(q.custom_events.length<1000)q.custom_events.push({timestamp:Date.now(),name:x,data:A(B)})},identify(x,B){if(Q=x,B){M={};for(let[G,W]of Object.entries(B))M[G]=String(W)}},flush:()=>L(!0)}})();})();
|
package/dist/dev-ws.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-mode WebSocket URL adjustments.
|
|
3
|
+
*
|
|
4
|
+
* In Agentuity Vite-primary dev mode, frontend runs on the user-facing port
|
|
5
|
+
* while Bun backend runs on an internal port (typically +1). Vite HTTP proxying
|
|
6
|
+
* works for REST, but WebSocket proxying can hit runtime incompatibilities in
|
|
7
|
+
* certain environments. This helper rewrites same-origin WS URLs to the Bun
|
|
8
|
+
* backend port when AGENTUITY_PORT is available.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveDevWebSocketUrl(url: string): string;
|
|
11
|
+
//# sourceMappingURL=dev-ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-ws.d.ts","sourceRoot":"","sources":["../src/dev-ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoB1D"}
|
package/dist/dev-ws.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-mode WebSocket URL adjustments.
|
|
3
|
+
*
|
|
4
|
+
* In Agentuity Vite-primary dev mode, frontend runs on the user-facing port
|
|
5
|
+
* while Bun backend runs on an internal port (typically +1). Vite HTTP proxying
|
|
6
|
+
* works for REST, but WebSocket proxying can hit runtime incompatibilities in
|
|
7
|
+
* certain environments. This helper rewrites same-origin WS URLs to the Bun
|
|
8
|
+
* backend port when AGENTUITY_PORT is available.
|
|
9
|
+
*/
|
|
10
|
+
import { getProcessEnv } from './env';
|
|
11
|
+
export function resolveDevWebSocketUrl(url) {
|
|
12
|
+
try {
|
|
13
|
+
if (typeof window === 'undefined')
|
|
14
|
+
return url;
|
|
15
|
+
const backendPort = getProcessEnv('AGENTUITY_PORT');
|
|
16
|
+
if (!backendPort)
|
|
17
|
+
return url;
|
|
18
|
+
const parsed = new URL(url, window.location.origin);
|
|
19
|
+
const isWs = parsed.protocol === 'ws:' || parsed.protocol === 'wss:';
|
|
20
|
+
if (!isWs)
|
|
21
|
+
return url;
|
|
22
|
+
// Only rewrite same-origin URLs so explicit external WS endpoints remain unchanged.
|
|
23
|
+
if (parsed.hostname !== window.location.hostname)
|
|
24
|
+
return parsed.toString();
|
|
25
|
+
if (parsed.port && parsed.port !== window.location.port)
|
|
26
|
+
return parsed.toString();
|
|
27
|
+
parsed.port = backendPort;
|
|
28
|
+
return parsed.toString();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dev-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-ws.js","sourceRoot":"","sources":["../src/dev-ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,UAAU,sBAAsB,CAAC,GAAW;IACjD,IAAI,CAAC;QACJ,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,GAAG,CAAC;QAE9C,MAAM,WAAW,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW;YAAE,OAAO,GAAG,CAAC;QAE7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC;QACrE,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QAEtB,oFAAoF;QACpF,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3E,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;QAElF,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC;QAC1B,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,GAAG,CAAC;IACZ,CAAC;AACF,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
export { getProcessEnv } from './env';
|
|
2
2
|
export { buildUrl, defaultBaseUrl } from './url';
|
|
3
|
+
export { resolveDevWebSocketUrl } from './dev-ws';
|
|
3
4
|
export { deserializeData } from './serialization';
|
|
4
5
|
export { createReconnectManager, type ReconnectOptions, type ReconnectManager } from './reconnect';
|
|
5
|
-
export type { RouteRegistry, WebSocketRouteRegistry, SSERouteRegistry, RPCRouteRegistry, } from './types';
|
|
6
6
|
export { jsonEqual } from './memo';
|
|
7
7
|
export { WebSocketManager, type MessageHandler as WebSocketMessageHandler, type WebSocketCallbacks, type WebSocketManagerOptions, type WebSocketManagerState, } from './websocket-manager';
|
|
8
8
|
export { EventStreamManager, type MessageHandler as EventStreamMessageHandler, type EventStreamCallbacks, type EventStreamManagerOptions, type EventStreamManagerState, } from './eventstream-manager';
|
|
9
9
|
export { WebRTCManager, UserMediaSource, DisplayMediaSource, CustomStreamSource, type WebRTCManagerOptions, type WebRTCManagerState, type WebRTCClientCallbacks, type TrackSource, } from './webrtc-manager';
|
|
10
10
|
export type { WebRTCConnectionState, WebRTCDisconnectReason, DataChannelConfig, DataChannelMessage, DataChannelState, ConnectionQualitySummary, RecordingOptions, RecordingHandle, RecordingState, } from '@agentuity/core';
|
|
11
|
-
export { createClient } from './client/index';
|
|
12
|
-
export type { Client, ClientOptions, RouteEndpoint, WebSocketClient, EventStreamClient, StreamClient, EventHandler, } from './client/types';
|
|
13
11
|
export { getAnalytics, track, getVisitorId, isOptedOut, setOptOut, getUTMParams, type AnalyticsClient, type AnalyticsPayload, type AnalyticsPageConfig, type PageViewPayload, type ScrollEvent, type AnalyticsCustomEvent, type GeoLocation, } from './analytics';
|
|
14
12
|
export { BEACON_SCRIPT, validateBeaconScript } from './beacon-script';
|
|
15
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,EAChB,KAAK,cAAc,IAAI,uBAAuB,EAC9C,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,EAClB,KAAK,cAAc,IAAI,yBAAyB,EAChD,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,GAChB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACX,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACN,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,WAAW,GAChB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
export { getProcessEnv } from './env';
|
|
2
2
|
export { buildUrl, defaultBaseUrl } from './url';
|
|
3
|
+
export { resolveDevWebSocketUrl } from './dev-ws';
|
|
3
4
|
export { deserializeData } from './serialization';
|
|
4
5
|
export { createReconnectManager } from './reconnect';
|
|
5
6
|
export { jsonEqual } from './memo';
|
|
6
7
|
export { WebSocketManager, } from './websocket-manager';
|
|
7
8
|
export { EventStreamManager, } from './eventstream-manager';
|
|
8
9
|
export { WebRTCManager, UserMediaSource, DisplayMediaSource, CustomStreamSource, } from './webrtc-manager';
|
|
9
|
-
// Export client implementation (local to this package)
|
|
10
|
-
export { createClient } from './client/index';
|
|
11
10
|
// Export analytics (beacon is bundled separately via beacon-standalone.ts)
|
|
12
11
|
export { getAnalytics, track, getVisitorId, isOptedOut, setOptOut, getUTMParams, } from './analytics';
|
|
13
12
|
// Re-export beacon script for server-side use
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAgD,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAgD,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,GAKhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,GAKlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GAKlB,MAAM,kBAAkB,CAAC;AAe1B,2EAA2E;AAC3E,OAAO,EACN,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,GAQZ,MAAM,aAAa,CAAC;AAErB,8CAA8C;AAC9C,wEAAwE;AACxE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentuity/frontend",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Agentuity employees and contributors",
|
|
6
6
|
"type": "module",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"prepublishOnly": "bun run clean && bun run build"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@agentuity/core": "
|
|
29
|
+
"@agentuity/core": "2.0.0-beta.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@agentuity/test-utils": "
|
|
32
|
+
"@agentuity/test-utils": "2.0.0-beta.0",
|
|
33
33
|
"@types/bun": "latest",
|
|
34
34
|
"bun-types": "latest",
|
|
35
35
|
"typescript": "^5.9.0"
|
package/src/dev-ws.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-mode WebSocket URL adjustments.
|
|
3
|
+
*
|
|
4
|
+
* In Agentuity Vite-primary dev mode, frontend runs on the user-facing port
|
|
5
|
+
* while Bun backend runs on an internal port (typically +1). Vite HTTP proxying
|
|
6
|
+
* works for REST, but WebSocket proxying can hit runtime incompatibilities in
|
|
7
|
+
* certain environments. This helper rewrites same-origin WS URLs to the Bun
|
|
8
|
+
* backend port when AGENTUITY_PORT is available.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { getProcessEnv } from './env';
|
|
12
|
+
|
|
13
|
+
export function resolveDevWebSocketUrl(url: string): string {
|
|
14
|
+
try {
|
|
15
|
+
if (typeof window === 'undefined') return url;
|
|
16
|
+
|
|
17
|
+
const backendPort = getProcessEnv('AGENTUITY_PORT');
|
|
18
|
+
if (!backendPort) return url;
|
|
19
|
+
|
|
20
|
+
const parsed = new URL(url, window.location.origin);
|
|
21
|
+
const isWs = parsed.protocol === 'ws:' || parsed.protocol === 'wss:';
|
|
22
|
+
if (!isWs) return url;
|
|
23
|
+
|
|
24
|
+
// Only rewrite same-origin URLs so explicit external WS endpoints remain unchanged.
|
|
25
|
+
if (parsed.hostname !== window.location.hostname) return parsed.toString();
|
|
26
|
+
if (parsed.port && parsed.port !== window.location.port) return parsed.toString();
|
|
27
|
+
|
|
28
|
+
parsed.port = backendPort;
|
|
29
|
+
return parsed.toString();
|
|
30
|
+
} catch {
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
export { getProcessEnv } from './env';
|
|
2
2
|
export { buildUrl, defaultBaseUrl } from './url';
|
|
3
|
+
export { resolveDevWebSocketUrl } from './dev-ws';
|
|
3
4
|
export { deserializeData } from './serialization';
|
|
4
5
|
export { createReconnectManager, type ReconnectOptions, type ReconnectManager } from './reconnect';
|
|
5
|
-
export type {
|
|
6
|
-
RouteRegistry,
|
|
7
|
-
WebSocketRouteRegistry,
|
|
8
|
-
SSERouteRegistry,
|
|
9
|
-
RPCRouteRegistry,
|
|
10
|
-
} from './types';
|
|
11
6
|
export { jsonEqual } from './memo';
|
|
12
7
|
export {
|
|
13
8
|
WebSocketManager,
|
|
@@ -47,18 +42,6 @@ export type {
|
|
|
47
42
|
RecordingState,
|
|
48
43
|
} from '@agentuity/core';
|
|
49
44
|
|
|
50
|
-
// Export client implementation (local to this package)
|
|
51
|
-
export { createClient } from './client/index';
|
|
52
|
-
export type {
|
|
53
|
-
Client,
|
|
54
|
-
ClientOptions,
|
|
55
|
-
RouteEndpoint,
|
|
56
|
-
WebSocketClient,
|
|
57
|
-
EventStreamClient,
|
|
58
|
-
StreamClient,
|
|
59
|
-
EventHandler,
|
|
60
|
-
} from './client/types';
|
|
61
|
-
|
|
62
45
|
// Export analytics (beacon is bundled separately via beacon-standalone.ts)
|
|
63
46
|
export {
|
|
64
47
|
getAnalytics,
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { EventStreamClient } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Create an EventSource (SSE) client wrapper with event-based API.
|
|
4
|
-
*
|
|
5
|
-
* Note: Native EventSource has limited authentication support.
|
|
6
|
-
* - withCredentials: true will send cookies and HTTP auth headers
|
|
7
|
-
* - For custom Authorization headers, consider using @microsoft/fetch-event-source
|
|
8
|
-
*/
|
|
9
|
-
export declare function createEventStreamClient(url: string, options?: {
|
|
10
|
-
withCredentials?: boolean;
|
|
11
|
-
}): EventStreamClient;
|
|
12
|
-
//# sourceMappingURL=eventstream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eventstream.d.ts","sourceRoot":"","sources":["../../src/client/eventstream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,iBAAiB,CAuCnB"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create an EventSource (SSE) client wrapper with event-based API.
|
|
3
|
-
*
|
|
4
|
-
* Note: Native EventSource has limited authentication support.
|
|
5
|
-
* - withCredentials: true will send cookies and HTTP auth headers
|
|
6
|
-
* - For custom Authorization headers, consider using @microsoft/fetch-event-source
|
|
7
|
-
*/
|
|
8
|
-
export function createEventStreamClient(url, options) {
|
|
9
|
-
const eventSource = new EventSource(url, {
|
|
10
|
-
withCredentials: options?.withCredentials ?? false,
|
|
11
|
-
});
|
|
12
|
-
const handlers = {
|
|
13
|
-
message: new Set(),
|
|
14
|
-
open: new Set(),
|
|
15
|
-
error: new Set(),
|
|
16
|
-
};
|
|
17
|
-
// Set up native EventSource event listeners
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
-
eventSource.onmessage = (event) => {
|
|
20
|
-
handlers.message.forEach((handler) => handler(event));
|
|
21
|
-
};
|
|
22
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
|
-
eventSource.onopen = (event) => {
|
|
24
|
-
handlers.open.forEach((handler) => handler(event));
|
|
25
|
-
};
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
-
eventSource.onerror = (event) => {
|
|
28
|
-
handlers.error.forEach((handler) => handler(event));
|
|
29
|
-
};
|
|
30
|
-
return {
|
|
31
|
-
on: ((event, handler) => {
|
|
32
|
-
handlers[event].add(handler);
|
|
33
|
-
}),
|
|
34
|
-
close() {
|
|
35
|
-
eventSource.close();
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=eventstream.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eventstream.js","sourceRoot":"","sources":["../../src/client/eventstream.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACtC,GAAW,EACX,OAAuC;IAEvC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE;QACxC,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,KAAK;KAClD,CAAC,CAAC;IACH,MAAM,QAAQ,GAIV;QACH,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,IAAI,EAAE,IAAI,GAAG,EAAE;QACf,KAAK,EAAE,IAAI,GAAG,EAAE;KAChB,CAAC;IAEF,4CAA4C;IAC5C,8DAA8D;IAC9D,WAAW,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;QACtC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,8DAA8D;IAC9D,WAAW,CAAC,MAAM,GAAG,CAAC,KAAU,EAAE,EAAE;QACnC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,8DAA8D;IAC9D,WAAW,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;QACpC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,OAAO;QACN,EAAE,EAAE,CAAC,CAAC,KAAmC,EAAE,OAAqB,EAAE,EAAE;YACnE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC,CAA4B;QAE7B,KAAK;YACJ,WAAW,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/dist/client/index.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { Client, ClientOptions } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Create a type-safe API client from a RouteRegistry.
|
|
4
|
-
*
|
|
5
|
-
* Uses a Proxy to build up the path as you navigate the object,
|
|
6
|
-
* then executes the request when you call a terminal method (.post(), .get(), .websocket(), etc.).
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { createClient } from '@agentuity/frontend';
|
|
11
|
-
* import type { RPCRouteRegistry } from './generated/routes';
|
|
12
|
-
*
|
|
13
|
-
* const client = createClient<RPCRouteRegistry>();
|
|
14
|
-
*
|
|
15
|
-
* // Type-safe API call
|
|
16
|
-
* const result = await client.hello.post({ name: 'World' });
|
|
17
|
-
*
|
|
18
|
-
* // WebSocket
|
|
19
|
-
* const ws = client.chat.websocket();
|
|
20
|
-
* ws.on('message', (msg) => console.log(msg));
|
|
21
|
-
*
|
|
22
|
-
* // Server-Sent Events
|
|
23
|
-
* const es = client.events.eventstream();
|
|
24
|
-
* es.on('message', (event) => console.log(event.data));
|
|
25
|
-
*
|
|
26
|
-
* // Streaming response
|
|
27
|
-
* const stream = await client.data.stream({ query: 'foo' });
|
|
28
|
-
* stream.on('chunk', (chunk) => console.log(chunk));
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
export declare function createClient<R>(options?: ClientOptions, metadata?: unknown): Client<R>;
|
|
32
|
-
export type { ClientOptions, Client, RouteEndpoint, WebSocketClient, EventStreamClient, StreamClient, EventHandler, } from './types';
|
|
33
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA4DrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAE,aAAkB,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAsK1F;AAGD,YAAY,EACX,aAAa,EACb,MAAM,EACN,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACZ,MAAM,SAAS,CAAC"}
|