@syntrologie/runtime-sdk 0.2.20 → 0.2.21
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/CAPABILITIES.md +211 -0
- package/dist/api.js +7 -6
- package/dist/api.js.map +1 -1
- package/dist/bootstrap.d.ts +16 -2
- package/dist/bootstrap.js +63 -14
- package/dist/bootstrap.js.map +1 -1
- package/dist/context/ContextManager.d.ts +66 -0
- package/dist/context/ContextManager.js +268 -0
- package/dist/context/ContextManager.js.map +1 -0
- package/dist/context/index.d.ts +7 -0
- package/dist/context/index.js +7 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/schema.d.ts +360 -0
- package/dist/context/schema.js +50 -0
- package/dist/context/schema.js.map +1 -0
- package/dist/context/types.d.ts +101 -0
- package/dist/context/types.js +8 -0
- package/dist/context/types.js.map +1 -0
- package/dist/decisions/engine.d.ts +43 -0
- package/dist/decisions/engine.js +112 -0
- package/dist/decisions/engine.js.map +1 -0
- package/dist/decisions/index.d.ts +9 -0
- package/dist/decisions/index.js +10 -0
- package/dist/decisions/index.js.map +1 -0
- package/dist/decisions/schema.d.ts +2166 -0
- package/dist/decisions/schema.js +143 -0
- package/dist/decisions/schema.js.map +1 -0
- package/dist/decisions/strategies/rules.d.ts +24 -0
- package/dist/decisions/strategies/rules.js +152 -0
- package/dist/decisions/strategies/rules.js.map +1 -0
- package/dist/decisions/strategies/score.d.ts +10 -0
- package/dist/decisions/strategies/score.js +29 -0
- package/dist/decisions/strategies/score.js.map +1 -0
- package/dist/decisions/types.d.ts +242 -0
- package/dist/decisions/types.js +2 -0
- package/dist/decisions/types.js.map +1 -0
- package/dist/editorLoader.d.ts +10 -0
- package/dist/editorLoader.js +38 -0
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/EventBus.d.ts +59 -0
- package/dist/events/EventBus.js +154 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.js +10 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/normalizers/canvas.d.ts +67 -0
- package/dist/events/normalizers/canvas.js +116 -0
- package/dist/events/normalizers/canvas.js.map +1 -0
- package/dist/events/normalizers/posthog.d.ts +29 -0
- package/dist/events/normalizers/posthog.js +155 -0
- package/dist/events/normalizers/posthog.js.map +1 -0
- package/dist/events/schema.d.ts +70 -0
- package/dist/events/schema.js +30 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/types.d.ts +73 -0
- package/dist/events/types.js +41 -0
- package/dist/events/types.js.map +1 -0
- package/dist/hooks/useShadowCanvasConfig.d.ts +5 -1
- package/dist/hooks/useShadowCanvasConfig.js +17 -3
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/overlays/schema.d.ts +48 -48
- package/dist/runtime.d.ts +86 -0
- package/dist/runtime.js +132 -0
- package/dist/runtime.js.map +1 -0
- package/dist/smart-canvas.esm.js +11 -11
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +1504 -17
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +11 -11
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/state/StateStore.d.ts +41 -0
- package/dist/state/StateStore.js +170 -0
- package/dist/state/StateStore.js.map +1 -0
- package/dist/state/helpers/cooldowns.d.ts +7 -0
- package/dist/state/helpers/cooldowns.js +31 -0
- package/dist/state/helpers/cooldowns.js.map +1 -0
- package/dist/state/helpers/dismissals.d.ts +7 -0
- package/dist/state/helpers/dismissals.js +34 -0
- package/dist/state/helpers/dismissals.js.map +1 -0
- package/dist/state/helpers/frequency.d.ts +8 -0
- package/dist/state/helpers/frequency.js +43 -0
- package/dist/state/helpers/frequency.js.map +1 -0
- package/dist/state/index.d.ts +7 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/schema.d.ts +49 -0
- package/dist/state/schema.js +25 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/types.d.ts +137 -0
- package/dist/state/types.js +9 -0
- package/dist/state/types.js.map +1 -0
- package/dist/telemetry/adapters/posthog.d.ts +1 -1
- package/dist/telemetry/adapters/posthog.js +1 -1
- package/dist/telemetry/adapters/posthog.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/package.json +2 -2
- package/schema/canvas-config.schema.json +205 -0
- package/schema/runtime-context.schema.json +131 -0
package/CAPABILITIES.md
CHANGED
|
@@ -8,6 +8,7 @@ This document describes all available operations and capabilities of the SmartCa
|
|
|
8
8
|
- [Anchor Selectors](#anchor-selectors)
|
|
9
9
|
- [Operations](#operations)
|
|
10
10
|
- [Overlays](#overlays)
|
|
11
|
+
- [Runtime v2 Providers](#runtime-v2-providers)
|
|
11
12
|
- [Best Practices](#best-practices)
|
|
12
13
|
|
|
13
14
|
## Overview
|
|
@@ -319,6 +320,216 @@ Overlays are defined in `overlayRecipe`:
|
|
|
319
320
|
- `routes`: URL paths where this recipe applies (optional)
|
|
320
321
|
- `steps`: Array of tooltip and highlight steps
|
|
321
322
|
|
|
323
|
+
## Runtime v2 Providers
|
|
324
|
+
|
|
325
|
+
The v2 runtime provides adaptives with a unified interface for context, events, state, and decisions.
|
|
326
|
+
|
|
327
|
+
### SmartCanvasRuntime
|
|
328
|
+
|
|
329
|
+
Every adaptive receives a `runtime` object:
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
type SmartCanvasRuntime = {
|
|
333
|
+
telemetry: TelemetryClient; // Emit events to PostHog
|
|
334
|
+
context: ContextManager; // Subscribe to page/session state
|
|
335
|
+
events: EventBus; // Subscribe to normalized events
|
|
336
|
+
state: StateStore; // Persist dismissals, cooldowns
|
|
337
|
+
version: string;
|
|
338
|
+
mode: "production" | "development";
|
|
339
|
+
};
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Usage
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
const { canvas, runtime } = await Syntro.init({
|
|
346
|
+
token: "syn_..."
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// Access runtime providers
|
|
350
|
+
runtime.telemetry?.trackAction(...);
|
|
351
|
+
runtime.context.subscribe((ctx, prev) => { ... });
|
|
352
|
+
runtime.events.subscribe({ names: ['ui.click'] }, (event) => { ... });
|
|
353
|
+
runtime.state.dismissals.mark('my-tile');
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Context Manager
|
|
357
|
+
|
|
358
|
+
Subscribe to runtime context changes:
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
const unsubscribe = runtime.context.subscribe((ctx, prev) => {
|
|
362
|
+
if (ctx.page.url !== prev.page.url) {
|
|
363
|
+
// Handle route change
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
const ctx = runtime.context.get();
|
|
368
|
+
console.log(ctx.page.url, ctx.session.sessionId);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**Available Context:**
|
|
372
|
+
| Field | Type | Description |
|
|
373
|
+
|-------|------|-------------|
|
|
374
|
+
| `page.url` | string | Current page URL |
|
|
375
|
+
| `page.routeId` | string? | Matched route pattern |
|
|
376
|
+
| `page.title` | string? | Document title |
|
|
377
|
+
| `session.sessionId` | string | PostHog session ID |
|
|
378
|
+
| `session.startTs` | number | Session start timestamp |
|
|
379
|
+
| `viewport.width` | number | Viewport width in pixels |
|
|
380
|
+
| `viewport.height` | number | Viewport height in pixels |
|
|
381
|
+
| `anchors` | AnchorState[]? | Tracked anchor visibility |
|
|
382
|
+
|
|
383
|
+
### Event Bus
|
|
384
|
+
|
|
385
|
+
Subscribe to normalized events:
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
const unsubscribe = runtime.events.subscribe(
|
|
389
|
+
{ names: ["ui.click", "nav.page_view"] },
|
|
390
|
+
(event) => {
|
|
391
|
+
console.log(event.name, event.props);
|
|
392
|
+
}
|
|
393
|
+
);
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Event Schema:**
|
|
397
|
+
```typescript
|
|
398
|
+
type NormalizedEvent = {
|
|
399
|
+
ts: number; // Timestamp
|
|
400
|
+
name: string; // e.g., "ui.click", "canvas.opened"
|
|
401
|
+
source: "posthog" | "canvas" | "derived";
|
|
402
|
+
props?: Record<string, any>;
|
|
403
|
+
schemaVersion: string;
|
|
404
|
+
};
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Standard Events:**
|
|
408
|
+
| Event | Source | Description |
|
|
409
|
+
|-------|--------|-------------|
|
|
410
|
+
| `ui.click` | posthog | User clicked element |
|
|
411
|
+
| `ui.scroll` | posthog | User scrolled |
|
|
412
|
+
| `nav.page_view` | posthog | Page navigation |
|
|
413
|
+
| `canvas.opened` | canvas | Smart Canvas opened |
|
|
414
|
+
| `canvas.closed` | canvas | Smart Canvas closed |
|
|
415
|
+
| `tile.viewed` | canvas | Tile became visible |
|
|
416
|
+
| `tile.action` | canvas | User clicked tile action |
|
|
417
|
+
|
|
418
|
+
### State Store
|
|
419
|
+
|
|
420
|
+
Persist state across sessions:
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
// Session storage (cleared on close)
|
|
424
|
+
runtime.state.session.set("lastTileViewed", "tile-123");
|
|
425
|
+
const last = runtime.state.session.get<string>("lastTileViewed");
|
|
426
|
+
|
|
427
|
+
// User storage (persists across sessions)
|
|
428
|
+
runtime.state.user.set("onboardingComplete", true);
|
|
429
|
+
|
|
430
|
+
// Namespace by adaptive
|
|
431
|
+
const ns = runtime.state.ns("my-adaptive");
|
|
432
|
+
ns.session.set("step", 3);
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**Built-in Helpers:**
|
|
436
|
+
```typescript
|
|
437
|
+
// Track dismissals
|
|
438
|
+
runtime.state.dismissals.mark("tooltip-1");
|
|
439
|
+
if (runtime.state.dismissals.isDismissed("tooltip-1")) { ... }
|
|
440
|
+
|
|
441
|
+
// Cooldowns (don't show again for X ms)
|
|
442
|
+
runtime.state.cooldowns.set("promo-banner", 86400000); // 24h
|
|
443
|
+
if (runtime.state.cooldowns.isActive("promo-banner")) { ... }
|
|
444
|
+
|
|
445
|
+
// Frequency caps
|
|
446
|
+
runtime.state.frequency.increment("upsell-shown");
|
|
447
|
+
if (runtime.state.frequency.count("upsell-shown") >= 3) { ... }
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### Decision Strategies
|
|
451
|
+
|
|
452
|
+
Tile activation uses `DecisionStrategy` for conditional rendering:
|
|
453
|
+
|
|
454
|
+
```json
|
|
455
|
+
{
|
|
456
|
+
"id": "promo-tile",
|
|
457
|
+
"title": "Limited Offer",
|
|
458
|
+
"activation": {
|
|
459
|
+
"routes": { "include": ["/pricing", "/upgrade"] },
|
|
460
|
+
"strategy": {
|
|
461
|
+
"type": "rules",
|
|
462
|
+
"rules": [
|
|
463
|
+
{
|
|
464
|
+
"conditions": [
|
|
465
|
+
{ "type": "viewport", "minWidth": 768 },
|
|
466
|
+
{ "type": "dismissed", "key": "promo-tile", "inverted": true }
|
|
467
|
+
],
|
|
468
|
+
"value": true
|
|
469
|
+
}
|
|
470
|
+
],
|
|
471
|
+
"default": false
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**Strategy Types:**
|
|
478
|
+
| Type | Description |
|
|
479
|
+
|------|-------------|
|
|
480
|
+
| `rules` | Condition-based matching (if/then) |
|
|
481
|
+
| `score` | Threshold on augmented field |
|
|
482
|
+
| `model` | ML model prediction (future) |
|
|
483
|
+
| `external` | Remote decision endpoint (future) |
|
|
484
|
+
|
|
485
|
+
**Condition Types:**
|
|
486
|
+
| Condition | Parameters | Description |
|
|
487
|
+
|-----------|------------|-------------|
|
|
488
|
+
| `page_url` | `url` (pattern) | URL matches pattern |
|
|
489
|
+
| `route` | `routeId` | Route ID matches |
|
|
490
|
+
| `anchor_visible` | `anchorId`, `state` | Anchor visibility state |
|
|
491
|
+
| `event_occurred` | `eventName`, `withinMs?` | Event happened recently |
|
|
492
|
+
| `state_equals` | `key`, `value` | State value matches |
|
|
493
|
+
| `viewport` | `minWidth?`, `maxWidth?` | Viewport size range |
|
|
494
|
+
| `session_metric` | `key`, `operator`, `threshold` | Session metric comparison |
|
|
495
|
+
| `dismissed` | `key`, `inverted?` | Item has been dismissed |
|
|
496
|
+
| `cooldown_active` | `key`, `inverted?` | Cooldown is active |
|
|
497
|
+
| `frequency_limit` | `key`, `limit`, `inverted?` | Frequency cap reached |
|
|
498
|
+
|
|
499
|
+
### Migration from v1
|
|
500
|
+
|
|
501
|
+
The new `activation` field replaces the deprecated `experiment` field:
|
|
502
|
+
|
|
503
|
+
**Before (v1):**
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"experiment": {
|
|
507
|
+
"featureKey": "my-feature",
|
|
508
|
+
"variationId": 1
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
**After (v2):**
|
|
514
|
+
```json
|
|
515
|
+
{
|
|
516
|
+
"activation": {
|
|
517
|
+
"strategy": {
|
|
518
|
+
"type": "rules",
|
|
519
|
+
"rules": [
|
|
520
|
+
{
|
|
521
|
+
"conditions": [
|
|
522
|
+
{ "type": "route", "routeId": "/dashboard" }
|
|
523
|
+
],
|
|
524
|
+
"value": true
|
|
525
|
+
}
|
|
526
|
+
],
|
|
527
|
+
"default": false
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
322
533
|
## Best Practices
|
|
323
534
|
|
|
324
535
|
### 1. Element Selection
|
package/dist/api.js
CHANGED
|
@@ -2,7 +2,7 @@ import { registerSmartCanvasElement } from "./SmartCanvasElement";
|
|
|
2
2
|
import { createCanvasConfigFetcher } from "./configFetcher";
|
|
3
3
|
import { initAntiFlicker } from "./antiFlicker";
|
|
4
4
|
import { applyPatchesEarly, extractPatchesFromConfig, revertAllPatches } from "./earlyPatcher";
|
|
5
|
-
import { loadEditorSdk,
|
|
5
|
+
import { loadEditorSdk, getActiveSdkMode } from "./editorLoader";
|
|
6
6
|
export const createSmartCanvas = async (config = {}) => {
|
|
7
7
|
var _a, _b, _c, _d;
|
|
8
8
|
if (typeof window === "undefined" || typeof document === "undefined") {
|
|
@@ -45,8 +45,10 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
45
45
|
if (removeAntiFlicker) {
|
|
46
46
|
removeAntiFlicker();
|
|
47
47
|
}
|
|
48
|
-
// Check if we should load the editor
|
|
49
|
-
|
|
48
|
+
// Check if we should load the editor (for editor mode or audit mode)
|
|
49
|
+
const sdkMode = getActiveSdkMode();
|
|
50
|
+
if (sdkMode) {
|
|
51
|
+
console.log(`[SmartCanvas] Loading editor SDK for ${sdkMode} mode`);
|
|
50
52
|
// We don't await this so the runtime SDK can continue initializing
|
|
51
53
|
loadEditorSdk(config.editorUrl).catch(console.error);
|
|
52
54
|
}
|
|
@@ -153,13 +155,12 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
153
155
|
},
|
|
154
156
|
};
|
|
155
157
|
// Expose handle for editor SDK access
|
|
156
|
-
// In editor mode: always expose (editor needs it to inject tiles and save config)
|
|
158
|
+
// In editor/audit mode: always expose (editor needs it to inject tiles and save config)
|
|
157
159
|
// In dev mode: always expose (for debugging)
|
|
158
160
|
// In production: never expose (security)
|
|
159
161
|
if (typeof window !== "undefined") {
|
|
160
|
-
const isEditorMode = new URLSearchParams(window.location.search).has('editor_token');
|
|
161
162
|
const isDev = process.env.NODE_ENV === 'development';
|
|
162
|
-
if (
|
|
163
|
+
if (sdkMode || isDev) {
|
|
163
164
|
window.__smartCanvasHandle = handle;
|
|
164
165
|
}
|
|
165
166
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAKtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -5,14 +5,21 @@
|
|
|
5
5
|
* ```typescript
|
|
6
6
|
* import { Syntro } from '@syntrologie/runtime-sdk';
|
|
7
7
|
*
|
|
8
|
-
* const { canvas,
|
|
8
|
+
* const { canvas, runtime } = await Syntro.init({
|
|
9
9
|
* token: "syn_eyJ2IjoxLCJleHAiOnsiayI6InNkay14eHgiLCJwIjoiZ3Jvd3RoYm9vayJ9fQ"
|
|
10
10
|
* });
|
|
11
|
+
*
|
|
12
|
+
* // Access runtime providers
|
|
13
|
+
* runtime.telemetry?.trackAction(...);
|
|
14
|
+
* runtime.context.subscribe((ctx, prev) => { ... });
|
|
15
|
+
* runtime.events.subscribe({ names: ['ui.click'] }, (event) => { ... });
|
|
16
|
+
* runtime.state.dismissals.mark('my-tile');
|
|
11
17
|
* ```
|
|
12
18
|
*/
|
|
13
19
|
import { decodeToken, encodeToken } from "./token";
|
|
14
20
|
import { SmartCanvasConfig, SmartCanvasHandle } from "./api";
|
|
15
21
|
import { SessionMetricTracker } from "./metrics";
|
|
22
|
+
import { SmartCanvasRuntime } from "./runtime";
|
|
16
23
|
import type { ExperimentClient } from "./experiments/types";
|
|
17
24
|
import type { TelemetryClient } from "./telemetry/types";
|
|
18
25
|
import type { CanvasConfigFetcher } from "./types";
|
|
@@ -50,17 +57,24 @@ export interface SyntroInitResult {
|
|
|
50
57
|
* The SmartCanvas handle for controlling the canvas.
|
|
51
58
|
*/
|
|
52
59
|
canvas: SmartCanvasHandle;
|
|
60
|
+
/**
|
|
61
|
+
* The unified v2 runtime with all providers.
|
|
62
|
+
* Use this to access telemetry, context, events, and state.
|
|
63
|
+
*/
|
|
64
|
+
runtime: SmartCanvasRuntime;
|
|
53
65
|
/**
|
|
54
66
|
* The experiment client, if experiments are configured in the token.
|
|
67
|
+
* @deprecated Access via runtime.telemetry or use DecisionStrategy instead
|
|
55
68
|
*/
|
|
56
69
|
experiments?: ExperimentClient;
|
|
57
70
|
/**
|
|
58
71
|
* The telemetry client, if telemetry is configured in the token.
|
|
72
|
+
* @deprecated Access via runtime.telemetry instead
|
|
59
73
|
*/
|
|
60
74
|
telemetry?: TelemetryClient;
|
|
61
75
|
/**
|
|
62
76
|
* The session metric tracker, if enableSessionMetrics is true.
|
|
63
|
-
*
|
|
77
|
+
* @deprecated Access via runtime.sessionMetrics instead
|
|
64
78
|
*/
|
|
65
79
|
sessionMetrics?: SessionMetricTracker;
|
|
66
80
|
}
|
package/dist/bootstrap.js
CHANGED
|
@@ -5,9 +5,15 @@
|
|
|
5
5
|
* ```typescript
|
|
6
6
|
* import { Syntro } from '@syntrologie/runtime-sdk';
|
|
7
7
|
*
|
|
8
|
-
* const { canvas,
|
|
8
|
+
* const { canvas, runtime } = await Syntro.init({
|
|
9
9
|
* token: "syn_eyJ2IjoxLCJleHAiOnsiayI6InNkay14eHgiLCJwIjoiZ3Jvd3RoYm9vayJ9fQ"
|
|
10
10
|
* });
|
|
11
|
+
*
|
|
12
|
+
* // Access runtime providers
|
|
13
|
+
* runtime.telemetry?.trackAction(...);
|
|
14
|
+
* runtime.context.subscribe((ctx, prev) => { ... });
|
|
15
|
+
* runtime.events.subscribe({ names: ['ui.click'] }, (event) => { ... });
|
|
16
|
+
* runtime.state.dismissals.mark('my-tile');
|
|
11
17
|
* ```
|
|
12
18
|
*/
|
|
13
19
|
import { decodeToken, encodeToken } from "./token";
|
|
@@ -17,6 +23,7 @@ import { createConfigFetcher } from "./fetchers/registry";
|
|
|
17
23
|
import { createCanvasConfigFetcher } from "./configFetcher";
|
|
18
24
|
import { createSmartCanvas } from "./api";
|
|
19
25
|
import { createSessionMetricTracker } from "./metrics";
|
|
26
|
+
import { createSmartCanvasRuntime } from "./runtime";
|
|
20
27
|
/**
|
|
21
28
|
* Get environment variable, supporting both Vite and Next.js patterns.
|
|
22
29
|
*/
|
|
@@ -55,6 +62,25 @@ function isEditorMode() {
|
|
|
55
62
|
});
|
|
56
63
|
return hasToken;
|
|
57
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if we're in audit mode (syntro_audit in URL params).
|
|
67
|
+
* Audit mode enables element marking for product touring.
|
|
68
|
+
*/
|
|
69
|
+
function isAuditMode() {
|
|
70
|
+
var _a;
|
|
71
|
+
if (typeof window === "undefined") {
|
|
72
|
+
console.log('[Syntro Bootstrap] isAuditMode: not in browser');
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const params = new URLSearchParams(window.location.search);
|
|
76
|
+
const hasAuditFlag = params.has("syntro_audit");
|
|
77
|
+
console.log('[Syntro Bootstrap] isAuditMode check:', {
|
|
78
|
+
url: window.location.href,
|
|
79
|
+
hasAuditFlag,
|
|
80
|
+
auditSessionId: (_a = params.get("audit_session_id")) !== null && _a !== void 0 ? _a : 'none',
|
|
81
|
+
});
|
|
82
|
+
return hasAuditFlag;
|
|
83
|
+
}
|
|
58
84
|
// ============================================================================
|
|
59
85
|
// Segment Attribute Caching (localStorage)
|
|
60
86
|
// ============================================================================
|
|
@@ -128,9 +154,11 @@ async function init(options) {
|
|
|
128
154
|
tokenPrefix: ((_a = options.token) === null || _a === void 0 ? void 0 : _a.slice(0, 15)) + '...',
|
|
129
155
|
hasCanvasOptions: !!options.canvas,
|
|
130
156
|
});
|
|
131
|
-
// In editor mode, token is optional -
|
|
157
|
+
// In editor or audit mode, token is optional - SDK handles auth differently
|
|
132
158
|
const editorMode = isEditorMode();
|
|
133
|
-
|
|
159
|
+
const auditMode = isAuditMode();
|
|
160
|
+
const sdkMode = editorMode ? 'editor' : auditMode ? 'audit' : null;
|
|
161
|
+
console.log('[Syntro Bootstrap] SDK mode:', sdkMode !== null && sdkMode !== void 0 ? sdkMode : 'normal');
|
|
134
162
|
let payload;
|
|
135
163
|
if (options.token) {
|
|
136
164
|
// If token is provided and starts with syn_, decode it
|
|
@@ -138,24 +166,24 @@ async function init(options) {
|
|
|
138
166
|
console.log('[Syntro Bootstrap] Token starts with syn_, decoding...');
|
|
139
167
|
payload = decodeToken(options.token);
|
|
140
168
|
}
|
|
141
|
-
else if (!
|
|
142
|
-
// Not a syn_ token and not in
|
|
143
|
-
console.error('[Syntro Bootstrap] ❌ Token does not start with syn_ and NOT in editor mode!');
|
|
169
|
+
else if (!sdkMode) {
|
|
170
|
+
// Not a syn_ token and not in special mode - error
|
|
171
|
+
console.error('[Syntro Bootstrap] ❌ Token does not start with syn_ and NOT in editor/audit mode!');
|
|
144
172
|
console.error('[Syntro Bootstrap] Token received:', options.token);
|
|
145
173
|
throw new Error("Invalid Syntro token: must start with 'syn_'");
|
|
146
174
|
}
|
|
147
175
|
else {
|
|
148
|
-
console.log(
|
|
176
|
+
console.log(`[Syntro Bootstrap] ✓ Non-syn_ token allowed (${sdkMode} mode)`);
|
|
149
177
|
}
|
|
150
|
-
// If in editor mode with non-syn_ token, skip token decoding
|
|
178
|
+
// If in editor/audit mode with non-syn_ token, skip token decoding
|
|
151
179
|
}
|
|
152
|
-
else if (!
|
|
153
|
-
// No token and not in
|
|
154
|
-
console.error('[Syntro Bootstrap] ❌ No token provided and NOT in editor mode!');
|
|
155
|
-
throw new Error("Syntro token is required (unless in editor mode)");
|
|
180
|
+
else if (!sdkMode) {
|
|
181
|
+
// No token and not in special mode - error
|
|
182
|
+
console.error('[Syntro Bootstrap] ❌ No token provided and NOT in editor/audit mode!');
|
|
183
|
+
throw new Error("Syntro token is required (unless in editor or audit mode)");
|
|
156
184
|
}
|
|
157
185
|
else {
|
|
158
|
-
console.log(
|
|
186
|
+
console.log(`[Syntro Bootstrap] ✓ No token, but ${sdkMode} mode - proceeding`);
|
|
159
187
|
}
|
|
160
188
|
// Host resolution priority: env var > token > default
|
|
161
189
|
// Env vars are checked at build time by bundlers (Next.js/Vite)
|
|
@@ -266,7 +294,28 @@ async function init(options) {
|
|
|
266
294
|
integrations: { experiments, telemetry },
|
|
267
295
|
editorUrl,
|
|
268
296
|
});
|
|
269
|
-
|
|
297
|
+
// Determine runtime mode
|
|
298
|
+
let runtimeMode = 'production';
|
|
299
|
+
if (editorMode)
|
|
300
|
+
runtimeMode = 'editor';
|
|
301
|
+
else if (auditMode)
|
|
302
|
+
runtimeMode = 'audit';
|
|
303
|
+
else if (getEnvVar('NODE_ENV') === 'development')
|
|
304
|
+
runtimeMode = 'development';
|
|
305
|
+
// Create the unified v2 runtime
|
|
306
|
+
const runtime = createSmartCanvasRuntime({
|
|
307
|
+
telemetry,
|
|
308
|
+
sessionMetrics,
|
|
309
|
+
mode: runtimeMode,
|
|
310
|
+
});
|
|
311
|
+
console.log('[Syntro Bootstrap] Runtime created:', {
|
|
312
|
+
version: runtime.version,
|
|
313
|
+
mode: runtime.mode,
|
|
314
|
+
hasContext: !!runtime.context,
|
|
315
|
+
hasEvents: !!runtime.events,
|
|
316
|
+
hasState: !!runtime.state,
|
|
317
|
+
});
|
|
318
|
+
return { canvas, runtime, experiments, telemetry, sessionMetrics };
|
|
270
319
|
}
|
|
271
320
|
/**
|
|
272
321
|
* The Syntro namespace for single-token initialization.
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextManager - Manages runtime context and notifies subscribers of changes.
|
|
3
|
+
*
|
|
4
|
+
* The ContextManager is responsible for:
|
|
5
|
+
* - Collecting context from various sources (page, session, viewport)
|
|
6
|
+
* - Notifying subscribers when context changes
|
|
7
|
+
* - Providing the current context snapshot
|
|
8
|
+
*/
|
|
9
|
+
import type { RuntimeContext, AnchorState, ContextChangeCallback, Unsubscribe, PageHistoryEntry } from "./types";
|
|
10
|
+
import type { TelemetryClient } from "../telemetry/types";
|
|
11
|
+
import type { RoutesConfig } from "../types";
|
|
12
|
+
export interface ContextManagerOptions {
|
|
13
|
+
/** Telemetry client for session ID */
|
|
14
|
+
telemetry?: TelemetryClient;
|
|
15
|
+
/** Routes config for route matching */
|
|
16
|
+
routes?: RoutesConfig;
|
|
17
|
+
/** Initial page history (optional) */
|
|
18
|
+
initialPageHistory?: PageHistoryEntry[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ContextManager class for managing runtime context.
|
|
22
|
+
*/
|
|
23
|
+
export declare class ContextManager {
|
|
24
|
+
private context;
|
|
25
|
+
private previousContext;
|
|
26
|
+
private listeners;
|
|
27
|
+
private telemetry?;
|
|
28
|
+
private routes?;
|
|
29
|
+
private cleanupFns;
|
|
30
|
+
constructor(options?: ContextManagerOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Get the current runtime context.
|
|
33
|
+
*/
|
|
34
|
+
get(): RuntimeContext;
|
|
35
|
+
/**
|
|
36
|
+
* Subscribe to context changes.
|
|
37
|
+
* Returns an unsubscribe function.
|
|
38
|
+
*/
|
|
39
|
+
subscribe(callback: ContextChangeCallback): Unsubscribe;
|
|
40
|
+
/**
|
|
41
|
+
* Update the routes config (e.g., when config is fetched).
|
|
42
|
+
*/
|
|
43
|
+
setRoutes(routes: RoutesConfig): void;
|
|
44
|
+
/**
|
|
45
|
+
* Update anchor states.
|
|
46
|
+
*/
|
|
47
|
+
setAnchors(anchors: AnchorState[]): void;
|
|
48
|
+
/**
|
|
49
|
+
* Manually update the session ID (e.g., when telemetry initializes).
|
|
50
|
+
*/
|
|
51
|
+
setSessionId(sessionId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Clean up event listeners and subscriptions.
|
|
54
|
+
*/
|
|
55
|
+
destroy(): void;
|
|
56
|
+
private setupBrowserListeners;
|
|
57
|
+
private updateViewport;
|
|
58
|
+
private updatePage;
|
|
59
|
+
private addPageToHistory;
|
|
60
|
+
private updateContext;
|
|
61
|
+
private notifyListeners;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a ContextManager instance.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createContextManager(options?: ContextManagerOptions): ContextManager;
|