@agentuity/cli 0.1.0 → 0.1.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"entry-generator.d.ts","sourceRoot":"","sources":["../../../src/cmd/build/entry-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5E,UAAU,oBAAoB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAinBpF"}
1
+ {"version":3,"file":"entry-generator.d.ts","sourceRoot":"","sources":["../../../src/cmd/build/entry-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI5E,UAAU,oBAAoB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAihBpF"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { join } from 'node:path';
6
6
  import { discoverRoutes } from './vite/route-discovery';
7
+ import { generateWebAnalyticsFile } from './webanalytics-generator';
7
8
  /**
8
9
  * Generate entry file with clean Vite-native architecture
9
10
  */
@@ -13,6 +14,12 @@ export async function generateEntryFile(options) {
13
14
  const generatedDir = join(srcDir, 'generated');
14
15
  const entryPath = join(generatedDir, 'app.ts');
15
16
  logger.trace(`Generating unified entry file (supports both dev and prod modes)...`);
17
+ // Check if analytics is enabled
18
+ const analyticsEnabled = analytics !== false;
19
+ // Generate web analytics files only if enabled
20
+ if (analyticsEnabled) {
21
+ await generateWebAnalyticsFile({ rootDir, logger, analytics });
22
+ }
16
23
  // Discover routes to determine which files need to be imported
17
24
  const { routeInfoList } = await discoverRoutes(srcDir, projectId, deploymentId, logger);
18
25
  // Check for web and workbench
@@ -51,10 +58,6 @@ export async function generateEntryFile(options) {
51
58
  ` createWorkbenchRouter,`,
52
59
  ` bootstrapRuntimeEnv,`,
53
60
  ` patchBunS3ForStorageDev,`,
54
- ` getOrganizationId,`,
55
- ` getProjectId,`,
56
- ` isDevMode as runtimeIsDevMode,`,
57
- ` createWebSessionMiddleware,`,
58
61
  ];
59
62
  const imports = [
60
63
  `import { `,
@@ -65,6 +68,10 @@ export async function generateEntryFile(options) {
65
68
  hasWebFrontend ? `import { readFileSync, existsSync } from 'node:fs';` : '',
66
69
  ].filter(Boolean);
67
70
  imports.push(`import { type LogLevel } from '@agentuity/core';`);
71
+ if (analyticsEnabled) {
72
+ imports.push(`import { injectAnalytics, registerAnalyticsRoutes } from './webanalytics.js';`);
73
+ imports.push(`import { analyticsConfig } from './analytics-config.js';`);
74
+ }
68
75
  // Generate route mounting code for all discovered routes
69
76
  // Sort route files for deterministic output
70
77
  const sortedRouteFiles = [...routeFiles].sort();
@@ -171,124 +178,6 @@ if (isDevelopment() && process.env.VITE_PORT) {
171
178
  // See: https://github.com/oven-sh/bun/issues/20183
172
179
  const getEnv = (key: string) => process.env[key];
173
180
  const isDevelopment = () => getEnv('NODE' + '_' + 'ENV') !== 'production';
174
- `;
175
- // Generate analytics config and injection helper
176
- const analyticsEnabled = analytics !== false;
177
- const analyticsConfig = typeof analytics === 'object' ? analytics : {};
178
- const analyticsHelper = analyticsEnabled
179
- ? `
180
- // Analytics configuration - edit agentuity.config.ts to configure
181
- const analyticsConfig = {
182
- enabled: ${analyticsConfig.enabled !== false},
183
- requireConsent: ${analyticsConfig.requireConsent ?? false},
184
- trackClicks: ${analyticsConfig.trackClicks ?? true},
185
- trackScroll: ${analyticsConfig.trackScroll ?? true},
186
- trackOutboundLinks: ${analyticsConfig.trackOutboundLinks ?? true},
187
- trackForms: ${analyticsConfig.trackForms ?? false},
188
- trackWebVitals: ${analyticsConfig.trackWebVitals ?? true},
189
- trackErrors: ${analyticsConfig.trackErrors ?? true},
190
- trackSPANavigation: ${analyticsConfig.trackSPANavigation ?? true},
191
- sampleRate: ${analyticsConfig.sampleRate ?? 1},
192
- excludePatterns: ${JSON.stringify(analyticsConfig.excludePatterns ?? [])},
193
- globalProperties: ${JSON.stringify(analyticsConfig.globalProperties ?? {})},
194
- };
195
-
196
- // Inject analytics config and script into HTML
197
- // Note: Only static config is injected (org, project, devmode, tracking options)
198
- // Session and thread IDs are read from cookies by the beacon script
199
- function injectAnalytics(html: string): string {
200
- if (!analyticsConfig.enabled) return html;
201
-
202
- const orgId = getOrganizationId() || '';
203
- const projectId = getProjectId() || '';
204
- const isDevmode = runtimeIsDevMode();
205
-
206
- // Only include static config - session/thread come from cookies
207
- const pageConfig = {
208
- ...analyticsConfig,
209
- orgId,
210
- projectId,
211
- isDevmode,
212
- };
213
-
214
- const configScript = \`<script>window.__AGENTUITY_ANALYTICS__=\${JSON.stringify(pageConfig)};</script>\`;
215
- // Session script sets cookies and window.__AGENTUITY_SESSION__ (dynamic, not cached)
216
- const sessionScript = '<script src="/_agentuity/webanalytics/session.js" async></script>';
217
- // Beacon script reads from __AGENTUITY_SESSION__ and sends events (static, cached)
218
- const beaconScript = '<script src="/_agentuity/webanalytics/analytics.js" async></script>';
219
- const injection = configScript + sessionScript + beaconScript;
220
-
221
- // Inject before </head> or at start of <body>
222
- if (html.includes('</head>')) {
223
- return html.replace('</head>', injection + '</head>');
224
- }
225
- if (html.includes('<body')) {
226
- return html.replace(/<body([^>]*)>/, \`<body$1>\${injection}\`);
227
- }
228
- return injection + html;
229
- }
230
-
231
- // Serve analytics routes
232
- function registerAnalyticsRoutes(app: ReturnType<typeof createRouter>): void {
233
- // Dynamic session config script - sets cookies and returns session/thread IDs
234
- // This endpoint is NOT cached - it generates unique session data per request
235
- app.get('/_agentuity/webanalytics/session.js', createWebSessionMiddleware(), async (c: Context) => {
236
- const sessionId = c.get('sessionId') || '';
237
- const thread = c.get('thread');
238
- const threadId = thread?.id || '';
239
-
240
- const sessionScript = \`window.__AGENTUITY_SESSION__={sessionId:"\${sessionId}",threadId:"\${threadId}"};\`;
241
-
242
- return new Response(sessionScript, {
243
- headers: {
244
- 'Content-Type': 'application/javascript; charset=utf-8',
245
- 'Cache-Control': 'no-store, no-cache, must-revalidate',
246
- },
247
- });
248
- });
249
-
250
- // Static beacon script - can be cached
251
- app.get('/_agentuity/webanalytics/analytics.js', async (c: Context) => {
252
- // Beacon waits for window.__AGENTUITY_SESSION__ before sending events
253
- const beaconScript = \`(function(){
254
- var w=window,d=document,c=w.__AGENTUITY_ANALYTICS__;
255
- if(!c||!c.enabled)return;
256
- var q=[],t=null,sr=false,E='/_agentuity/webanalytics/collect',geo=null;
257
- function id(){return crypto.randomUUID?crypto.randomUUID():Date.now()+'-'+Math.random().toString(36).substr(2,9)}
258
- function base(type){var e={id:id(),timestamp:Date.now(),timezone_offset:new Date().getTimezoneOffset(),event_type:type,url:location.href,path:location.pathname,referrer:d.referrer||'',title:d.title||'',screen_width:screen.width||0,screen_height:screen.height||0,viewport_width:innerWidth||0,viewport_height:innerHeight||0,device_pixel_ratio:devicePixelRatio||1,user_agent:navigator.userAgent||'',language:navigator.language||''};if(geo){e.country=geo.country||'';e.region=geo.region||'';e.city=geo.city||'';e.timezone=geo.timezone||''}return e}
259
- fetch('https://agentuity.sh/location').then(function(r){return r.json()}).then(function(g){geo=g;try{sessionStorage.setItem('agentuity_geo',JSON.stringify(g))}catch(e){}}).catch(function(){try{var cached=sessionStorage.getItem('agentuity_geo');if(cached)geo=JSON.parse(cached)}catch(e){}});try{var cached=sessionStorage.getItem('agentuity_geo');if(cached)geo=JSON.parse(cached)}catch(e){}
260
- function getSession(){return w.__AGENTUITY_SESSION__}
261
- function waitForSession(cb){var s=getSession();if(s){cb(s);return}var attempts=0,maxAttempts=50;var iv=setInterval(function(){s=getSession();if(s||++attempts>=maxAttempts){clearInterval(iv);cb(s)}},100)}
262
- function doFlush(s){if(!q.length)return;var events=q.splice(0);if(c.isDevmode){console.debug('[Agentuity Analytics]',events);return}var sid=s?s.sessionId:'',tid=s?s.threadId:'';var p={org_id:c.orgId,project_id:c.projectId,session_id:sid,thread_id:tid,visitor_id:localStorage.getItem('agentuity_vid')||'vid_'+id(),events:events};try{localStorage.setItem('agentuity_vid',p.visitor_id)}catch(e){}navigator.sendBeacon?navigator.sendBeacon(E,JSON.stringify(p)):fetch(E,{method:'POST',body:JSON.stringify(p),keepalive:true}).catch(function(){})}
263
- function flush(){if(sr){doFlush(getSession())}else{waitForSession(function(s){sr=true;doFlush(s)})}}
264
- function queue(e){if(c.sampleRate<1&&Math.random()>c.sampleRate)return;q.push(e);q.length>=10?flush():t||(t=setTimeout(function(){t=null;flush()},5000))}
265
- function pv(){var e=base('pageview');if(performance.getEntriesByType){var n=performance.getEntriesByType('navigation')[0];if(n){e.load_time=Math.round(n.loadEventEnd-n.startTime);e.dom_ready=Math.round(n.domContentLoadedEventEnd-n.startTime);e.ttfb=Math.round(n.responseStart-n.requestStart)}}queue(e)}
266
- w.addEventListener('visibilitychange',function(){d.visibilityState==='hidden'&&flush()});
267
- w.addEventListener('pagehide',flush);
268
- if(c.trackSPANavigation){var op=history.pushState,or=history.replaceState,cp=location.pathname;function ch(){var np=location.pathname;np!==cp&&(cp=np,pv())}history.pushState=function(){op.apply(this,arguments);ch()};history.replaceState=function(){or.apply(this,arguments);ch()};w.addEventListener('popstate',ch)}
269
- if(c.trackErrors){w.addEventListener('error',function(e){var ev=base('error');ev.event_name='js_error';ev.event_data={message:e.message||'Unknown',filename:e.filename||'',lineno:e.lineno||0};queue(ev)});w.addEventListener('unhandledrejection',function(e){var ev=base('error');ev.event_name='unhandled_rejection';ev.event_data={message:e.reason instanceof Error?e.reason.message:String(e.reason)};queue(ev)})}
270
- if(c.trackClicks){d.addEventListener('click',function(e){var t=e.target;if(!t)return;var a=t.closest('[data-analytics]');if(!a)return;var ev=base('click');ev.event_name=a.getAttribute('data-analytics');queue(ev)},true)}
271
- if(c.trackScroll){var ms=new Set(),mx=0;function gs(){var st=w.scrollY||d.documentElement.scrollTop,sh=d.documentElement.scrollHeight-d.documentElement.clientHeight;return sh<=0?100:Math.min(100,Math.round(st/sh*100))}w.addEventListener('scroll',function(){var dp=gs();if(dp>mx)mx=dp;[25,50,75,100].forEach(function(m){if(dp>=m&&!ms.has(m)){ms.add(m);var ev=base('scroll');ev.event_name='scroll_'+m;ev.scroll_depth=m;queue(ev)}})},{passive:true})}
272
- if(c.trackWebVitals!==false&&typeof PerformanceObserver!=='undefined'){var wvLcp=0,wvCls=0,wvInp=0,wvPath=location.pathname,wvSent={};function wvReset(){wvLcp=0;wvCls=0;wvInp=0;wvSent={}}function wvSend(){var p=wvPath;if(wvLcp>0&&!wvSent.lcp){wvSent.lcp=1;var ev=base('web_vital');ev.event_name='lcp';ev.lcp=Math.round(wvLcp);ev.path=p;queue(ev)}if(!wvSent.cls){wvSent.cls=1;var ev=base('web_vital');ev.event_name='cls';ev.cls=Math.round(wvCls*1000)/1000;ev.path=p;queue(ev)}if(wvInp>0&&!wvSent.inp){wvSent.inp=1;var ev=base('web_vital');ev.event_name='inp';ev.inp=Math.round(wvInp);ev.path=p;queue(ev)}flush()}try{var fcpObs=new PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(e.name==='first-contentful-paint'){var ev=base('web_vital');ev.event_name='fcp';ev.fcp=Math.round(e.startTime);queue(ev);flush();fcpObs.disconnect()}})});fcpObs.observe({type:'paint',buffered:true})}catch(e){}try{new PerformanceObserver(function(l){var entries=l.getEntries();if(entries.length)wvLcp=entries[entries.length-1].startTime}).observe({type:'largest-contentful-paint',buffered:true})}catch(e){}try{new PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(!e.hadRecentInput&&e.value)wvCls+=e.value})}).observe({type:'layout-shift',buffered:true})}catch(e){}try{new PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(e.duration&&e.duration>wvInp)wvInp=e.duration})}).observe({type:'event',buffered:true})}catch(e){}d.addEventListener('visibilitychange',function(){if(d.visibilityState==='hidden')wvSend()});w.addEventListener('pagehide',wvSend);if(c.trackSPANavigation){var wvOp=history.pushState,wvOr=history.replaceState;function wvNav(){var np=location.pathname;if(np!==wvPath){wvSend();wvPath=np;wvReset()}}history.pushState=function(){wvOp.apply(this,arguments);wvNav()};history.replaceState=function(){wvOr.apply(this,arguments);wvNav()};w.addEventListener('popstate',wvNav)}}
273
- d.readyState==='complete'?pv():w.addEventListener('load',pv);
274
- w.agentuityAnalytics={track:function(n,p){var e=base('custom');e.event_name=n;if(p)e.event_data=p;queue(e)},flush:flush};
275
- })();\`;
276
-
277
- return new Response(beaconScript, {
278
- headers: {
279
- 'Content-Type': 'application/javascript; charset=utf-8',
280
- 'Cache-Control': 'public, max-age=3600',
281
- },
282
- });
283
- });
284
- }
285
- `
286
- : `
287
- // Analytics disabled
288
- function injectAnalytics(html: string): string {
289
- return html;
290
- }
291
- function registerAnalyticsRoutes(_app: ReturnType<typeof createRouter>): void {}
292
181
  `;
293
182
  // Web routes (runtime mode detection)
294
183
  let webRoutes = '';
@@ -315,8 +204,10 @@ if (isDevelopment()) {
315
204
  .replace(/src="\\.\\//g, 'src="/src/web/')
316
205
  .replace(/href="\\.\\//g, 'href="/src/web/');
317
206
 
318
- // Inject analytics config and script (session/thread read from cookies by beacon)
319
- html = injectAnalytics(html);
207
+ ${analyticsEnabled
208
+ ? ` // Inject analytics config and script (session/thread read from cookies by beacon)
209
+ html = injectAnalytics(html, analyticsConfig);`
210
+ : ''}
320
211
 
321
212
  return new Response(html, {
322
213
  status: res.status,
@@ -361,9 +252,11 @@ if (isDevelopment()) {
361
252
  if (!baseIndexHtml) {
362
253
  return c.text('Production build incomplete', 500);
363
254
  }
364
- // Inject analytics config and script (session/thread loaded via session.js)
365
- const html = injectAnalytics(baseIndexHtml);
366
- return c.html(html);
255
+ ${analyticsEnabled
256
+ ? ` // Inject analytics config and script (session/thread loaded via session.js)
257
+ const html = injectAnalytics(baseIndexHtml, analyticsConfig);
258
+ return c.html(html);`
259
+ : ` return c.html(baseIndexHtml);`}
367
260
  };
368
261
 
369
262
  app.get('/', prodHtmlHandler);
@@ -511,8 +404,6 @@ ${imports.join('\n')}
511
404
 
512
405
  ${modeDetection}
513
406
 
514
- ${analyticsHelper}
515
-
516
407
  // Step 0: Bootstrap runtime environment (load profile-specific .env files)
517
408
  // Only in development - production env vars are injected by platform
518
409
  // This must happen BEFORE any imports that depend on environment variables
@@ -547,11 +438,17 @@ app.use('*', createBaseMiddleware({
547
438
  meter: otel.meter,
548
439
  }));
549
440
 
550
- app.use('/_agentuity/*', createCorsMiddleware());
441
+ app.use('/_agentuity/workbench/*', createCorsMiddleware());
551
442
  app.use('/api/*', createCorsMiddleware());
552
443
 
553
444
  // Critical: otelMiddleware creates session/thread/waitUntilHandler
554
- app.use('/_agentuity/*', createOtelMiddleware());
445
+ // Only apply to routes that need full session tracking:
446
+ // - /api/* routes (agent/API invocations)
447
+ // - /_agentuity/workbench/* routes (workbench API)
448
+ // Explicitly excluded (no session tracking, no Catalyst events):
449
+ // - /_agentuity/webanalytics/* (web analytics - uses lightweight cookie-only middleware)
450
+ // - /_agentuity/health, /_agentuity/ready, /_agentuity/idle (health checks)
451
+ app.use('/_agentuity/workbench/*', createOtelMiddleware());
555
452
  app.use('/api/*', createOtelMiddleware());
556
453
 
557
454
  // Critical: agentMiddleware sets up agent context
@@ -584,8 +481,10 @@ await sessionProvider.initialize(appState);
584
481
 
585
482
  ${healthRoutes}
586
483
 
587
- // Register analytics routes (if enabled)
588
- registerAnalyticsRoutes(app);
484
+ ${analyticsEnabled
485
+ ? `// Register analytics routes
486
+ registerAnalyticsRoutes(app);`
487
+ : ''}
589
488
 
590
489
  ${assetProxyRoutes}
591
490
  ${apiMount}
@@ -1 +1 @@
1
- {"version":3,"file":"entry-generator.js","sourceRoot":"","sources":["../../../src/cmd/build/entry-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-generator.js","sourceRoot":"","sources":["../../../src/cmd/build/entry-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Web analytics beacon code generator
3
+ * Generates src/generated/webanalytics.ts with the analytics beacon script
4
+ */
5
+ import type { Logger, AnalyticsConfig } from '../../types';
6
+ interface GenerateWebAnalyticsOptions {
7
+ rootDir: string;
8
+ logger: Logger;
9
+ analytics?: boolean | AnalyticsConfig;
10
+ }
11
+ /**
12
+ * Generate the web analytics files (webanalytics.ts and analytics-config.ts)
13
+ */
14
+ export declare function generateWebAnalyticsFile(options: GenerateWebAnalyticsOptions): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=webanalytics-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webanalytics-generator.d.ts","sourceRoot":"","sources":["../../../src/cmd/build/webanalytics-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3D,UAAU,2BAA2B;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;CACtC;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Web analytics beacon code generator
3
+ * Generates src/generated/webanalytics.ts with the analytics beacon script
4
+ */
5
+ import { join } from 'node:path';
6
+ /**
7
+ * Generate the web analytics files (webanalytics.ts and analytics-config.ts)
8
+ */
9
+ export async function generateWebAnalyticsFile(options) {
10
+ const { rootDir, logger, analytics } = options;
11
+ const srcDir = join(rootDir, 'src');
12
+ const generatedDir = join(srcDir, 'generated');
13
+ const analyticsPath = join(generatedDir, 'webanalytics.ts');
14
+ const configPath = join(generatedDir, 'analytics-config.ts');
15
+ logger.trace(`Generating web analytics files...`);
16
+ const analyticsEnabled = analytics !== false;
17
+ const analyticsConfig = typeof analytics === 'object' ? analytics : {};
18
+ // Generate the analytics config file with resolved values
19
+ const configCode = generateAnalyticsConfigCode(analyticsEnabled, analyticsConfig);
20
+ await Bun.write(configPath, configCode);
21
+ // Generate the webanalytics file
22
+ const code = analyticsEnabled ? getEnabledAnalyticsCode() : getDisabledAnalyticsCode();
23
+ await Bun.write(analyticsPath, code);
24
+ logger.trace(`Generated web analytics files at %s`, generatedDir);
25
+ }
26
+ function generateAnalyticsConfigCode(enabled, config) {
27
+ return `// @generated
28
+ // Auto-generated by Agentuity
29
+ // DO NOT EDIT - This file is regenerated on every build
30
+
31
+ export interface AnalyticsConfig {
32
+ enabled: boolean;
33
+ requireConsent: boolean;
34
+ trackClicks: boolean;
35
+ trackScroll: boolean;
36
+ trackOutboundLinks: boolean;
37
+ trackForms: boolean;
38
+ trackWebVitals: boolean;
39
+ trackErrors: boolean;
40
+ trackSPANavigation: boolean;
41
+ sampleRate: number;
42
+ excludePatterns: string[];
43
+ globalProperties: Record<string, unknown>;
44
+ }
45
+
46
+ export const analyticsConfig: AnalyticsConfig = {
47
+ enabled: ${enabled && config.enabled !== false},
48
+ requireConsent: ${config.requireConsent ?? false},
49
+ trackClicks: ${config.trackClicks ?? true},
50
+ trackScroll: ${config.trackScroll ?? true},
51
+ trackOutboundLinks: ${config.trackOutboundLinks ?? true},
52
+ trackForms: ${config.trackForms ?? false},
53
+ trackWebVitals: ${config.trackWebVitals ?? true},
54
+ trackErrors: ${config.trackErrors ?? true},
55
+ trackSPANavigation: ${config.trackSPANavigation ?? true},
56
+ sampleRate: ${config.sampleRate ?? 1},
57
+ excludePatterns: ${JSON.stringify(config.excludePatterns ?? [])},
58
+ globalProperties: ${JSON.stringify(config.globalProperties ?? {})},
59
+ };
60
+ `;
61
+ }
62
+ function getDisabledAnalyticsCode() {
63
+ return `// @generated
64
+ // Auto-generated by Agentuity
65
+ // DO NOT EDIT - This file is regenerated on every build
66
+
67
+ import { createRouter } from '@agentuity/runtime';
68
+ import type { AnalyticsConfig } from './analytics-config';
69
+
70
+ // Analytics disabled
71
+ export function injectAnalytics(html: string, _config: AnalyticsConfig): string {
72
+ return html;
73
+ }
74
+
75
+ export function registerAnalyticsRoutes(_app: ReturnType<typeof createRouter>): void {}
76
+ `;
77
+ }
78
+ function getEnabledAnalyticsCode() {
79
+ return `// @generated
80
+ // Auto-generated by Agentuity
81
+ // DO NOT EDIT - This file is regenerated on every build
82
+
83
+ import type { Context } from 'hono';
84
+ import {
85
+ createRouter,
86
+ createWebSessionMiddleware,
87
+ getOrganizationId,
88
+ getProjectId,
89
+ isDevMode as runtimeIsDevMode,
90
+ } from '@agentuity/runtime';
91
+ import type { AnalyticsConfig } from './analytics-config';
92
+
93
+ // Inject analytics config and script into HTML
94
+ // Note: Only static config is injected (org, project, devmode, tracking options)
95
+ // Session and thread IDs are read from cookies by the beacon script
96
+ export function injectAnalytics(html: string, analyticsConfig: AnalyticsConfig): string {
97
+ if (!analyticsConfig.enabled) return html;
98
+
99
+ const orgId = getOrganizationId() || '';
100
+ const projectId = getProjectId() || '';
101
+ const isDevmode = runtimeIsDevMode();
102
+
103
+ // Only include static config - session/thread come from cookies
104
+ const pageConfig = {
105
+ ...analyticsConfig,
106
+ orgId,
107
+ projectId,
108
+ isDevmode,
109
+ };
110
+
111
+ const configScript = \`<script>window.__AGENTUITY_ANALYTICS__=\${JSON.stringify(pageConfig)};</script>\`;
112
+ // Session script sets cookies and window.__AGENTUITY_SESSION__ (dynamic, not cached)
113
+ const sessionScript = '<script src="/_agentuity/webanalytics/session.js" async></script>';
114
+ // Beacon script reads from __AGENTUITY_SESSION__ and sends events (static, cached)
115
+ const beaconScript = '<script src="/_agentuity/webanalytics/analytics.js" async></script>';
116
+ const injection = configScript + sessionScript + beaconScript;
117
+
118
+ // Inject before </head> or at start of <body>
119
+ if (html.includes('</head>')) {
120
+ return html.replace('</head>', injection + '</head>');
121
+ }
122
+ if (html.includes('<body')) {
123
+ return html.replace(/<body([^>]*)>/, \`<body$1>\${injection}\`);
124
+ }
125
+ return injection + html;
126
+ }
127
+
128
+ // The beacon script - minified for production
129
+ export const BEACON_SCRIPT = \`(function(){
130
+ var w=window,d=document,c=w.__AGENTUITY_ANALYTICS__;
131
+ if(!c||!c.enabled)return;
132
+ var q=[],t=null,sr=false,E='/_agentuity/webanalytics/collect',geo=null;
133
+ function id(){return crypto.randomUUID?crypto.randomUUID():Date.now()+'-'+Math.random().toString(36).substr(2,9)}
134
+ function base(type){var e={id:id(),timestamp:Date.now(),timezone_offset:new Date().getTimezoneOffset(),event_type:type,url:location.href,path:location.pathname,referrer:d.referrer||'',title:d.title||'',screen_width:screen.width||0,screen_height:screen.height||0,viewport_width:innerWidth||0,viewport_height:innerHeight||0,device_pixel_ratio:devicePixelRatio||1,user_agent:navigator.userAgent||'',language:navigator.language||''};if(geo){e.country=geo.country||'';e.region=geo.region||'';e.city=geo.city||'';e.timezone=geo.timezone||''}return e}
135
+ fetch('https://agentuity.sh/location').then(function(r){return r.json()}).then(function(g){geo=g;try{sessionStorage.setItem('agentuity_geo',JSON.stringify(g))}catch(e){}}).catch(function(){try{var cached=sessionStorage.getItem('agentuity_geo');if(cached)geo=JSON.parse(cached)}catch(e){}});try{var cached=sessionStorage.getItem('agentuity_geo');if(cached)geo=JSON.parse(cached)}catch(e){}
136
+ function getSession(){return w.__AGENTUITY_SESSION__}
137
+ function waitForSession(cb){var s=getSession();if(s){cb(s);return}var attempts=0,maxAttempts=50;var iv=setInterval(function(){s=getSession();if(s||++attempts>=maxAttempts){clearInterval(iv);cb(s)}},100)}
138
+ function doFlush(s){if(!q.length)return;var events=q.splice(0);if(c.isDevmode){console.debug('[Agentuity Analytics]',events);return}var sid=s?s.sessionId:'',tid=s?s.threadId:'';var p={org_id:c.orgId,project_id:c.projectId,session_id:sid,thread_id:tid,visitor_id:localStorage.getItem('agentuity_vid')||'vid_'+id(),events:events};try{localStorage.setItem('agentuity_vid',p.visitor_id)}catch(e){}navigator.sendBeacon?navigator.sendBeacon(E,JSON.stringify(p)):fetch(E,{method:'POST',body:JSON.stringify(p),keepalive:true}).catch(function(){})}
139
+ function flush(){if(sr){doFlush(getSession())}else{waitForSession(function(s){sr=true;doFlush(s)})}}
140
+ function queue(e){if(c.sampleRate<1&&Math.random()>c.sampleRate)return;q.push(e);q.length>=10?flush():t||(t=setTimeout(function(){t=null;flush()},5000))}
141
+ function pv(){var e=base('pageview');if(performance.getEntriesByType){var n=performance.getEntriesByType('navigation')[0];if(n){e.load_time=Math.round(n.loadEventEnd-n.startTime);e.dom_ready=Math.round(n.domContentLoadedEventEnd-n.startTime);e.ttfb=Math.round(n.responseStart-n.requestStart)}}queue(e)}
142
+ w.addEventListener('visibilitychange',function(){d.visibilityState==='hidden'&&flush()});
143
+ w.addEventListener('pagehide',flush);
144
+ if(c.trackSPANavigation){var op=history.pushState,or=history.replaceState,cp=location.pathname;function ch(){var np=location.pathname;np!==cp&&(cp=np,pv())}history.pushState=function(){op.apply(this,arguments);ch()};history.replaceState=function(){or.apply(this,arguments);ch()};w.addEventListener('popstate',ch)}
145
+ if(c.trackErrors){w.addEventListener('error',function(e){var ev=base('error');ev.event_name='js_error';ev.event_data=JSON.stringify({message:e.message||'Unknown',filename:e.filename||'',lineno:e.lineno||0});queue(ev)});w.addEventListener('unhandledrejection',function(e){var ev=base('error');ev.event_name='unhandled_rejection';ev.event_data=JSON.stringify({message:e.reason instanceof Error?e.reason.message:String(e.reason)});queue(ev)})}
146
+ if(c.trackClicks){d.addEventListener('click',function(e){var t=e.target;if(!t)return;var a=t.closest('[data-analytics]');if(!a)return;var ev=base('click');ev.event_name=a.getAttribute('data-analytics');queue(ev)},true)}
147
+ if(c.trackScroll){var ms=new Set(),mx=0;function gs(){var st=w.scrollY||d.documentElement.scrollTop,sh=d.documentElement.scrollHeight-d.documentElement.clientHeight;return sh<=0?100:Math.min(100,Math.round(st/sh*100))}w.addEventListener('scroll',function(){var dp=gs();if(dp>mx)mx=dp;[25,50,75,100].forEach(function(m){if(dp>=m&&!ms.has(m)){ms.add(m);var ev=base('scroll');ev.event_name='scroll_'+m;ev.scroll_depth=m;queue(ev)}})},{passive:true})}
148
+ if(c.trackWebVitals!==false&&typeof PerformanceObserver!=='undefined'){var wvLcp=0,wvCls=0,wvInp=0,wvPath=location.pathname,wvSent={};function wvReset(){wvLcp=0;wvCls=0;wvInp=0;wvSent={}}function wvSend(){var p=wvPath;if(wvLcp>0&&!wvSent.lcp){wvSent.lcp=1;var ev=base('web_vital');ev.event_name='lcp';ev.lcp=Math.round(wvLcp);ev.path=p;queue(ev)}if(!wvSent.cls){wvSent.cls=1;var ev=base('web_vital');ev.event_name='cls';ev.cls=Math.round(wvCls*1000)/1000;ev.path=p;queue(ev)}if(wvInp>0&&!wvSent.inp){wvSent.inp=1;var ev=base('web_vital');ev.event_name='inp';ev.inp=Math.round(wvInp);ev.path=p;queue(ev)}flush()}try{var fcpObs=new PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(e.name==='first-contentful-paint'){var ev=base('web_vital');ev.event_name='fcp';ev.fcp=Math.round(e.startTime);queue(ev);flush();fcpObs.disconnect()}})});fcpObs.observe({type:'paint',buffered:true})}catch(e){}try{new PerformanceObserver(function(l){var entries=l.getEntries();if(entries.length)wvLcp=entries[entries.length-1].startTime}).observe({type:'largest-contentful-paint',buffered:true})}catch(e){}try{new PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(!e.hadRecentInput&&e.value)wvCls+=e.value})}).observe({type:'layout-shift',buffered:true})}catch(e){}try{new PerformanceObserver(function(l){l.getEntries().forEach(function(e){if(e.duration&&e.duration>wvInp)wvInp=e.duration})}).observe({type:'event',buffered:true})}catch(e){}d.addEventListener('visibilitychange',function(){if(d.visibilityState==='hidden')wvSend()});w.addEventListener('pagehide',wvSend);if(c.trackSPANavigation){var wvOp=history.pushState,wvOr=history.replaceState;function wvNav(){var np=location.pathname;if(np!==wvPath){wvSend();wvPath=np;wvReset()}}history.pushState=function(){wvOp.apply(this,arguments);wvNav()};history.replaceState=function(){wvOr.apply(this,arguments);wvNav()};w.addEventListener('popstate',wvNav)}}
149
+ d.readyState==='complete'?pv():w.addEventListener('load',pv);
150
+ w.agentuityAnalytics={track:function(n,p){var e=base('custom');e.event_name=n;if(p)e.event_data=JSON.stringify(p);queue(e)},flush:flush};
151
+ })()\`;
152
+
153
+ // Serve analytics routes
154
+ export function registerAnalyticsRoutes(app: ReturnType<typeof createRouter>): void {
155
+ // Dynamic thread config script - sets cookie and returns thread ID
156
+ // Web analytics only tracks thread ID, not session ID (to avoid polluting sessions table)
157
+ // This endpoint is NOT cached - it generates unique data per request
158
+ app.get('/_agentuity/webanalytics/session.js', createWebSessionMiddleware(), async (c: Context) => {
159
+ // Read from context (cookies aren't readable until the next request)
160
+ const threadId = c.get('_webThreadId') || '';
161
+
162
+ // Use JSON.stringify to safely escape threadId and prevent XSS/injection
163
+ const sessionData = JSON.stringify({ threadId });
164
+ const sessionScript = \`window.__AGENTUITY_SESSION__=\${sessionData};\`;
165
+
166
+ return new Response(sessionScript, {
167
+ headers: {
168
+ 'Content-Type': 'application/javascript; charset=utf-8',
169
+ 'Cache-Control': 'no-store, no-cache, must-revalidate',
170
+ },
171
+ });
172
+ });
173
+
174
+ // Static beacon script - can be cached
175
+ app.get('/_agentuity/webanalytics/analytics.js', async (c: Context) => {
176
+ return new Response(BEACON_SCRIPT, {
177
+ headers: {
178
+ 'Content-Type': 'application/javascript; charset=utf-8',
179
+ 'Cache-Control': 'public, max-age=3600',
180
+ },
181
+ });
182
+ });
183
+ }
184
+ `;
185
+ }
186
+ //# sourceMappingURL=webanalytics-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webanalytics-generator.js","sourceRoot":"","sources":["../../../src/cmd/build/webanalytics-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,OAAoC;IAEpC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAE7D,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAElD,MAAM,gBAAgB,GAAG,SAAS,KAAK,KAAK,CAAC;IAC7C,MAAM,eAAe,GAAoB,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAExF,0DAA0D;IAC1D,MAAM,UAAU,GAAG,2BAA2B,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAClF,MAAM,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAExC,iCAAiC;IACjC,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,wBAAwB,EAAE,CAAC;IACvF,MAAM,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAErC,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAgB,EAAE,MAAuB;IAC7E,OAAO;;;;;;;;;;;;;;;;;;;;YAoBI,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;mBAC5B,MAAM,CAAC,cAAc,IAAI,KAAK;gBACjC,MAAM,CAAC,WAAW,IAAI,IAAI;gBAC1B,MAAM,CAAC,WAAW,IAAI,IAAI;uBACnB,MAAM,CAAC,kBAAkB,IAAI,IAAI;eACzC,MAAM,CAAC,UAAU,IAAI,KAAK;mBACtB,MAAM,CAAC,cAAc,IAAI,IAAI;gBAChC,MAAM,CAAC,WAAW,IAAI,IAAI;uBACnB,MAAM,CAAC,kBAAkB,IAAI,IAAI;eACzC,MAAM,CAAC,UAAU,IAAI,CAAC;oBACjB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;qBAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;;CAEjE,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB;IAChC,OAAO;;;;;;;;;;;;;CAaP,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGP,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cmd/cloud/deploy.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,gBAAgB,sCAy5B3B,CAAC"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cmd/cloud/deploy.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,gBAAgB,sCAu4B3B,CAAC"}
@@ -292,22 +292,6 @@ export const deploySubcommand = createSubcommand({
292
292
  }
293
293
  },
294
294
  },
295
- {
296
- label: 'Create Deployment',
297
- run: async () => {
298
- if (useExistingDeployment) {
299
- return stepSkipped('using pre-created deployment');
300
- }
301
- try {
302
- deployment = await projectDeploymentCreate(apiClient, project.projectId, project.deployment);
303
- return stepSuccess();
304
- }
305
- catch (ex) {
306
- const _ex = ex;
307
- return stepError(_ex.message ?? String(_ex), ex);
308
- }
309
- },
310
- },
311
295
  {
312
296
  label: 'Build, Verify and Package',
313
297
  run: async () => {