@simplr-ai/vue 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,536 @@
1
+ import { simplrRUM, SimplrFraud, SimplrFlags, SimplrProfiles, SimplrAI } from '@simplr-ai/js';
2
+ export { SimplrAI, SimplrFlags, SimplrFraud, SimplrProfiles, SimplrRUM, clearDeviceId, createFingerprintHash, createSimplrAI, createSimplrProfiles, getDeviceId, murmurHash3, sha256, simplrFlags, simplrRUM } from '@simplr-ai/js';
3
+ import { inject, computed, ref, onMounted, toValue, onUnmounted, defineComponent, openBlock, createElementBlock, renderSlot, watchEffect, toRef, onErrorCaptured, createElementVNode } from 'vue';
4
+
5
+ // src/plugin.ts
6
+
7
+ // src/keys.ts
8
+ var SimplrInjectionKey = /* @__PURE__ */ Symbol("simplr");
9
+ function installContext(app, ctx) {
10
+ app.provide(SimplrInjectionKey, ctx);
11
+ app.config.globalProperties.$simplr = ctx;
12
+ }
13
+ var stateMap = /* @__PURE__ */ new WeakMap();
14
+ var vSimplrProtect = {
15
+ mounted(el, binding) {
16
+ attach(el, binding);
17
+ },
18
+ updated(el, binding) {
19
+ detach(el);
20
+ attach(el, binding);
21
+ },
22
+ beforeUnmount(el) {
23
+ detach(el);
24
+ }
25
+ };
26
+ function attach(el, binding) {
27
+ const value = binding.value;
28
+ const field = typeof value === "string" ? value : value?.field ?? "field";
29
+ const factory = typeof value === "object" && value?.trackInput ? value.trackInput : null;
30
+ el.setAttribute("data-simplr-field", field);
31
+ if (!factory) {
32
+ const state2 = {
33
+ field,
34
+ onKeyDown: () => {
35
+ },
36
+ onKeyUp: () => {
37
+ },
38
+ onPaste: () => {
39
+ if (simplrRUM.isInitialized()) {
40
+ simplrRUM.trackAction(`Paste into ${field}`, "custom", {
41
+ target: { tag: "input" }
42
+ });
43
+ }
44
+ }
45
+ };
46
+ el.addEventListener("paste", state2.onPaste);
47
+ stateMap.set(el, state2);
48
+ return;
49
+ }
50
+ const handlers = factory(field);
51
+ const state = {
52
+ field,
53
+ onKeyDown: handlers.onKeyDown,
54
+ onKeyUp: handlers.onKeyUp,
55
+ onPaste: handlers.onPaste
56
+ };
57
+ el.addEventListener("keydown", state.onKeyDown);
58
+ el.addEventListener("keyup", state.onKeyUp);
59
+ el.addEventListener("paste", state.onPaste);
60
+ stateMap.set(el, state);
61
+ }
62
+ function detach(el) {
63
+ const state = stateMap.get(el);
64
+ if (!state) return;
65
+ el.removeEventListener("keydown", state.onKeyDown);
66
+ el.removeEventListener("keyup", state.onKeyUp);
67
+ el.removeEventListener("paste", state.onPaste);
68
+ stateMap.delete(el);
69
+ }
70
+
71
+ // src/plugin.ts
72
+ function resolveBlock(block, fallback) {
73
+ if (block === false || block === void 0) return void 0;
74
+ if (block === true) return fallback;
75
+ return { ...fallback, ...block };
76
+ }
77
+ function createSimplr(config = {}) {
78
+ const apiKey = config.apiKey;
79
+ const fraud = new SimplrFraud({ apiKey, ...config.fraud });
80
+ const flagsConfig = resolveBlock(config.flags, {
81
+ apiKey: apiKey ?? "",
82
+ baseUrl: config.baseUrl
83
+ });
84
+ let flags;
85
+ if (flagsConfig) {
86
+ flags = new SimplrFlags();
87
+ void flags.initialize(flagsConfig);
88
+ }
89
+ const profilesConfig = resolveBlock(config.profiles, {
90
+ apiKey: apiKey ?? "",
91
+ baseUrl: config.baseUrl
92
+ });
93
+ let profiles;
94
+ if (profilesConfig) {
95
+ profiles = new SimplrProfiles(profilesConfig);
96
+ profiles.setDeviceSignalCollector(() => fraud.collectDeviceSignals());
97
+ }
98
+ let rum = void 0;
99
+ if (config.rum) {
100
+ if (!simplrRUM.isInitialized()) {
101
+ simplrRUM.initialize(config.rum);
102
+ }
103
+ rum = simplrRUM;
104
+ }
105
+ const aiConfig = resolveBlock(config.ai, {
106
+ apiKey: apiKey ?? ""
107
+ });
108
+ let ai;
109
+ if (aiConfig && aiConfig.apiKey) {
110
+ ai = new SimplrAI(aiConfig);
111
+ }
112
+ const context = { fraud, flags, profiles, rum, ai };
113
+ const plugin = {
114
+ context,
115
+ install(app) {
116
+ installContext(app, context);
117
+ app.directive("simplr-protect", vSimplrProtect);
118
+ }
119
+ };
120
+ return plugin;
121
+ }
122
+ function useSimplrContext() {
123
+ const ctx = inject(SimplrInjectionKey, null);
124
+ if (!ctx) {
125
+ throw new Error(
126
+ "[@simplr-ai/vue] No Simplr context found. Did you call app.use(createSimplr(...))?"
127
+ );
128
+ }
129
+ return ctx;
130
+ }
131
+ function useSimplr() {
132
+ const { fraud } = useSimplrContext();
133
+ return {
134
+ simplr: fraud,
135
+ isReady: computed(() => fraud.isReady),
136
+ collect: () => fraud.collect(),
137
+ collectDeviceSignals: () => fraud.collectDeviceSignals(),
138
+ collectBehaviorSignals: () => fraud.collectBehaviorSignals(),
139
+ reset: () => fraud.reset(),
140
+ trackInput: (fieldName) => fraud.trackInput(fieldName),
141
+ startTracking: () => fraud.startTracking(),
142
+ stopTracking: () => fraud.stopTracking()
143
+ };
144
+ }
145
+ function useDeviceSignals(options = {}) {
146
+ const { fraud } = useSimplrContext();
147
+ const signals = ref(null);
148
+ const loading = ref(false);
149
+ const error = ref(null);
150
+ const refresh = async () => {
151
+ loading.value = true;
152
+ error.value = null;
153
+ try {
154
+ signals.value = await fraud.collectDeviceSignals();
155
+ } catch (e) {
156
+ error.value = e instanceof Error ? e : new Error("Failed to collect device signals");
157
+ } finally {
158
+ loading.value = false;
159
+ }
160
+ };
161
+ if (options.immediate !== false) {
162
+ onMounted(refresh);
163
+ }
164
+ return { signals, loading, error, refresh };
165
+ }
166
+ function getFlags() {
167
+ const { flags } = useSimplrContext();
168
+ if (!flags) {
169
+ throw new Error(
170
+ "[@simplr-ai/vue] Feature flags are not configured. Pass `flags: true` (or a config) to createSimplr()."
171
+ );
172
+ }
173
+ return flags;
174
+ }
175
+ function useFlagsTick(flags) {
176
+ const tick = ref(0);
177
+ const ready = ref(flags.isReady());
178
+ let last = JSON.stringify(flags.getAll());
179
+ let timer = null;
180
+ const check = () => {
181
+ const wasReady = ready.value;
182
+ ready.value = flags.isReady();
183
+ const snapshot = JSON.stringify(flags.getAll());
184
+ if (snapshot !== last || ready.value !== wasReady) {
185
+ last = snapshot;
186
+ tick.value++;
187
+ }
188
+ };
189
+ onMounted(() => {
190
+ check();
191
+ timer = setInterval(check, 500);
192
+ });
193
+ onUnmounted(() => {
194
+ if (timer) clearInterval(timer);
195
+ });
196
+ return { tick, ready };
197
+ }
198
+ function useFeatureFlag(key, ctx) {
199
+ const flags = getFlags();
200
+ const { tick, ready } = useFlagsTick(flags);
201
+ const enabled = computed(() => {
202
+ void tick.value;
203
+ return flags.isEnabled(toValue(key), toValue(ctx));
204
+ });
205
+ return { enabled, isReady: ready };
206
+ }
207
+ function useFeatureFlags(ctx) {
208
+ const client = getFlags();
209
+ const { tick, ready } = useFlagsTick(client);
210
+ const definitions = computed(() => {
211
+ void tick.value;
212
+ return client.getAll();
213
+ });
214
+ const flags = computed(() => {
215
+ void tick.value;
216
+ const evalCtx = toValue(ctx);
217
+ const out = {};
218
+ for (const key of Object.keys(client.getAll())) {
219
+ out[key] = client.isEnabled(key, evalCtx);
220
+ }
221
+ return out;
222
+ });
223
+ return {
224
+ flags,
225
+ definitions,
226
+ isEnabled: (key, c) => client.isEnabled(key, c ?? toValue(ctx)),
227
+ isReady: ready,
228
+ refresh: () => client.refresh(),
229
+ setUser: (userId) => client.setUser(userId)
230
+ };
231
+ }
232
+ function useProfiles() {
233
+ const { profiles } = useSimplrContext();
234
+ if (!profiles) {
235
+ throw new Error(
236
+ "[@simplr-ai/vue] Profiles are not configured. Pass `profiles: true` (or a config) to createSimplr()."
237
+ );
238
+ }
239
+ const loading = ref(false);
240
+ const error = ref(null);
241
+ async function run(fn) {
242
+ loading.value = true;
243
+ error.value = null;
244
+ try {
245
+ return await fn();
246
+ } catch (e) {
247
+ error.value = e instanceof Error ? e : new Error(String(e));
248
+ throw error.value;
249
+ } finally {
250
+ loading.value = false;
251
+ }
252
+ }
253
+ return {
254
+ profiles,
255
+ loading,
256
+ error,
257
+ identify: (externalId, options) => run(() => profiles.identify(externalId, options)),
258
+ submitOrder: (order) => run(() => profiles.submitOrder(order)),
259
+ getProfileRisk: (externalId) => run(() => profiles.getProfileRisk(externalId)),
260
+ reportOutcome: (externalId, outcome) => run(() => profiles.reportOutcome(externalId, outcome))
261
+ };
262
+ }
263
+ function useRum() {
264
+ const ctx = inject(SimplrInjectionKey, null);
265
+ return ctx?.rum ?? simplrRUM;
266
+ }
267
+ function useTrackView(name) {
268
+ const rum = useRum();
269
+ onMounted(() => {
270
+ if (rum.isInitialized()) rum.trackView(toValue(name));
271
+ });
272
+ }
273
+ function useTrackAction() {
274
+ const rum = useRum();
275
+ return (name, type, attributes) => {
276
+ if (rum.isInitialized()) rum.trackAction(name, type, { attributes });
277
+ };
278
+ }
279
+ function useTrackError() {
280
+ const rum = useRum();
281
+ return (error, context) => {
282
+ if (rum.isInitialized()) rum.trackError(error, context);
283
+ };
284
+ }
285
+ function useRumLogger() {
286
+ const rum = useRum();
287
+ const make = (level) => (message, context) => {
288
+ if (rum.isInitialized()) rum.log(level, message, context);
289
+ };
290
+ return {
291
+ debug: make("debug"),
292
+ info: make("info"),
293
+ warn: make("warn"),
294
+ error: make("error")
295
+ };
296
+ }
297
+ function useRumUser() {
298
+ const rum = useRum();
299
+ return {
300
+ setUser: (userId, attributes) => {
301
+ if (rum.isInitialized()) rum.setUser(userId, attributes);
302
+ },
303
+ clearUser: () => {
304
+ if (rum.isInitialized()) rum.clearUser();
305
+ }
306
+ };
307
+ }
308
+ function useRumAttributes() {
309
+ const rum = useRum();
310
+ return {
311
+ addAttribute: (key, value) => rum.addAttribute(key, value),
312
+ removeAttribute: (key) => rum.removeAttribute(key)
313
+ };
314
+ }
315
+ function useTrackAsync(operationName) {
316
+ const rum = useRum();
317
+ return async (asyncFn) => {
318
+ const start = Date.now();
319
+ try {
320
+ const result = await asyncFn();
321
+ rum.trackAction(`${operationName} completed`, "custom", {
322
+ attributes: { duration: Date.now() - start, success: true }
323
+ });
324
+ return result;
325
+ } catch (error) {
326
+ rum.trackError(
327
+ error instanceof Error ? error : new Error(String(error)),
328
+ { operationName, duration: Date.now() - start }
329
+ );
330
+ throw error;
331
+ }
332
+ };
333
+ }
334
+ function flushRumOnUnmount() {
335
+ const rum = useRum();
336
+ onUnmounted(() => {
337
+ void rum.flush();
338
+ });
339
+ }
340
+ function resolveClient(config) {
341
+ const ctx = inject(SimplrInjectionKey, null);
342
+ if (ctx?.ai) return ctx.ai;
343
+ if (config) return new SimplrAI(config);
344
+ throw new Error(
345
+ "[@simplr-ai/vue] AI delegation is not configured. Pass `ai: true` to createSimplr() or supply a config to useAIDelegation()."
346
+ );
347
+ }
348
+ function useAIDelegation(config) {
349
+ const ai = resolveClient(config);
350
+ const loading = ref(false);
351
+ const error = ref(null);
352
+ async function run(fn) {
353
+ loading.value = true;
354
+ error.value = null;
355
+ try {
356
+ return await fn();
357
+ } catch (e) {
358
+ error.value = e instanceof Error ? e : new Error(String(e));
359
+ throw error.value;
360
+ } finally {
361
+ loading.value = false;
362
+ }
363
+ }
364
+ return {
365
+ ai,
366
+ loading,
367
+ error,
368
+ connect: (options) => run(() => ai.connect(options)),
369
+ createDelegation: (options) => run(() => ai.createDelegation(options)),
370
+ validate: (token, options) => run(() => ai.validate(token, options)),
371
+ revoke: (delegationId, reason) => run(() => ai.revoke(delegationId, reason)),
372
+ list: (userId) => run(() => ai.list(userId)),
373
+ get: (delegationId) => run(() => ai.get(delegationId)),
374
+ stats: () => run(() => ai.stats()),
375
+ revokeAllForUser: (userId, reason) => run(() => ai.revokeAllForUser(userId, reason))
376
+ };
377
+ }
378
+ function useDelegations(config, userId) {
379
+ const ai = resolveClient(config);
380
+ const delegations = ref([]);
381
+ const loading = ref(true);
382
+ const error = ref(null);
383
+ const refresh = async () => {
384
+ loading.value = true;
385
+ error.value = null;
386
+ try {
387
+ delegations.value = await ai.list(userId);
388
+ } catch (e) {
389
+ error.value = e instanceof Error ? e : new Error(String(e));
390
+ } finally {
391
+ loading.value = false;
392
+ }
393
+ };
394
+ const revoke = async (delegationId, reason) => {
395
+ await ai.revoke(delegationId, reason);
396
+ await refresh();
397
+ };
398
+ onMounted(refresh);
399
+ return { delegations, loading, error, refresh, revoke };
400
+ }
401
+ var _sfc_main = /* @__PURE__ */ defineComponent({
402
+ __name: "SimplrProtectedForm",
403
+ emits: ["submit", "error"],
404
+ setup(__props, { expose: __expose, emit: __emit }) {
405
+ const emit = __emit;
406
+ const { collect } = useSimplr();
407
+ const submitting = ref(false);
408
+ async function handleSubmit(event) {
409
+ event.preventDefault();
410
+ submitting.value = true;
411
+ try {
412
+ const signals = await collect();
413
+ emit("submit", signals, event);
414
+ } catch (e) {
415
+ emit("error", e instanceof Error ? e : new Error(String(e)));
416
+ } finally {
417
+ submitting.value = false;
418
+ }
419
+ }
420
+ __expose({ submitting });
421
+ return (_ctx, _cache) => {
422
+ return openBlock(), createElementBlock(
423
+ "form",
424
+ { onSubmit: handleSubmit },
425
+ [renderSlot(_ctx.$slots, "default", { submitting: submitting.value })],
426
+ 32
427
+ /* NEED_HYDRATION */
428
+ );
429
+ };
430
+ }
431
+ });
432
+ var SimplrProtectedForm_default = _sfc_main;
433
+ var _hoisted_1 = ["value", "data-simplr-field"];
434
+ var _sfc_main2 = /* @__PURE__ */ defineComponent({
435
+ __name: "SimplrProtectedInput",
436
+ props: {
437
+ field: {},
438
+ modelValue: {}
439
+ },
440
+ emits: ["update:modelValue"],
441
+ setup(__props, { emit: __emit }) {
442
+ const props = __props;
443
+ const emit = __emit;
444
+ const { trackInput } = useSimplr();
445
+ const tracking = computed(() => trackInput(props.field));
446
+ watchEffect(() => {
447
+ void tracking.value;
448
+ });
449
+ function onInput(event) {
450
+ emit("update:modelValue", event.target.value);
451
+ }
452
+ function onKeyDown(e) {
453
+ tracking.value.onKeyDown(e);
454
+ }
455
+ function onKeyUp(e) {
456
+ tracking.value.onKeyUp(e);
457
+ }
458
+ function onPaste() {
459
+ tracking.value.onPaste();
460
+ }
461
+ return (_ctx, _cache) => {
462
+ return openBlock(), createElementBlock("input", {
463
+ value: __props.modelValue,
464
+ "data-simplr-field": __props.field,
465
+ onInput,
466
+ onKeydown: onKeyDown,
467
+ onKeyup: onKeyUp,
468
+ onPaste
469
+ }, null, 40, _hoisted_1);
470
+ };
471
+ }
472
+ });
473
+ var SimplrProtectedInput_default = _sfc_main2;
474
+ var _sfc_main3 = /* @__PURE__ */ defineComponent({
475
+ __name: "RumView",
476
+ props: { name: {} },
477
+ setup(__props) {
478
+ const props = __props;
479
+ useTrackView(toRef(props, "name"));
480
+ return (_ctx, _cache) => {
481
+ return renderSlot(_ctx.$slots, "default");
482
+ };
483
+ }
484
+ });
485
+ var RumView_default = _sfc_main3;
486
+ var _sfc_main4 = /* @__PURE__ */ defineComponent({
487
+ __name: "RumErrorBoundary",
488
+ emits: ["error"],
489
+ setup(__props, { emit: __emit }) {
490
+ const emit = __emit;
491
+ const rum = useRum();
492
+ const error = ref(null);
493
+ onErrorCaptured((err, _instance, info) => {
494
+ const normalized = err instanceof Error ? err : new Error(String(err));
495
+ error.value = normalized;
496
+ if (rum.isInitialized()) {
497
+ rum.trackError(normalized, {
498
+ vueErrorInfo: info,
499
+ isVueError: true
500
+ });
501
+ }
502
+ emit("error", normalized, info);
503
+ return false;
504
+ });
505
+ return (_ctx, _cache) => {
506
+ return error.value ? renderSlot(_ctx.$slots, "fallback", {
507
+ key: 0,
508
+ error: error.value
509
+ }, () => [_cache[0] || (_cache[0] = createElementVNode(
510
+ "div",
511
+ { style: {
512
+ "padding": "20px",
513
+ "text-align": "center"
514
+ } },
515
+ [createElementVNode("h2", null, "Something went wrong"), createElementVNode("p", null, "We've been notified and are working to fix the issue.")],
516
+ -1
517
+ /* CACHED */
518
+ ))]) : renderSlot(_ctx.$slots, "default", { key: 1 });
519
+ };
520
+ }
521
+ });
522
+ var RumErrorBoundary_default = _sfc_main4;
523
+ function installRumErrorHandler(app, rum = simplrRUM) {
524
+ const previous = app.config.errorHandler;
525
+ app.config.errorHandler = (err, instance, info) => {
526
+ const normalized = err instanceof Error ? err : new Error(String(err));
527
+ if (rum.isInitialized()) {
528
+ rum.trackError(normalized, { vueErrorInfo: info, isVueError: true });
529
+ }
530
+ previous?.(err, instance, info);
531
+ };
532
+ }
533
+
534
+ export { RumErrorBoundary_default as RumErrorBoundary, RumView_default as RumView, SimplrInjectionKey, SimplrProtectedForm_default as SimplrProtectedForm, SimplrProtectedInput_default as SimplrProtectedInput, createSimplr, flushRumOnUnmount, installRumErrorHandler, useAIDelegation, useDelegations, useDeviceSignals, useFeatureFlag, useFeatureFlags, useProfiles, useRum, useRumAttributes, useRumLogger, useRumUser, useSimplr, useSimplrContext, useTrackAction, useTrackAsync, useTrackError, useTrackView, vSimplrProtect };
535
+ //# sourceMappingURL=index.js.map
536
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/keys.ts","../src/directives/protect.ts","../src/plugin.ts","../src/composables/useSimplrContext.ts","../src/composables/useSimplr.ts","../src/composables/useDeviceSignals.ts","../src/composables/useFeatureFlags.ts","../src/composables/useProfiles.ts","../src/composables/useRum.ts","../src/composables/useAIDelegation.ts","../src/components/SimplrProtectedForm.vue","../src/components/SimplrProtectedInput.vue","../src/components/RumView.vue","../src/components/RumErrorBoundary.vue","../src/rum-error-handler.ts"],"names":["state","simplrRUM","ref","onMounted","computed","inject","toValue","onUnmounted","SimplrAI","_openBlock","_createElementBlock","_renderSlot","_createElementVNode"],"mappings":"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","file":"index.js","sourcesContent":["import type { App, InjectionKey } from \"vue\";\nimport type {\n SimplrFraud,\n SimplrFlags,\n SimplrProfiles,\n SimplrRUM,\n SimplrAI,\n} from \"@simplr-ai/js\";\n\n/**\n * The bundle of configured core SDK instances provided by the Simplr Vue plugin.\n * Every instance is the real `@simplr-ai/js` object — this adapter never\n * reimplements behaviour, it only wires the core surface into Vue primitives.\n */\nexport interface SimplrContext {\n /** Core fraud client: device fingerprint + behavioral biometrics + collect(). */\n fraud: SimplrFraud;\n /** Feature flags client (local eval + murmurhash bucketing). May be undefined if not configured. */\n flags?: SimplrFlags;\n /** Anonymous profiles + order fraud scoring client. May be undefined if not configured. */\n profiles?: SimplrProfiles;\n /** Real User Monitoring client (singleton). May be undefined if not configured. */\n rum?: SimplrRUM;\n /** AI delegation (OAuth-like) client. May be undefined if not configured. */\n ai?: SimplrAI;\n}\n\n/** Vue injection key for the full Simplr context bundle. */\nexport const SimplrInjectionKey: InjectionKey<SimplrContext> =\n Symbol(\"simplr\");\n\n/**\n * Internal helper used by `createSimplr` to register the context on an app\n * instance both via `provide` (composition API) and `app.config.globalProperties`.\n */\nexport function installContext(app: App, ctx: SimplrContext): void {\n app.provide(SimplrInjectionKey, ctx);\n app.config.globalProperties.$simplr = ctx;\n}\n\ndeclare module \"@vue/runtime-core\" {\n interface ComponentCustomProperties {\n $simplr: SimplrContext;\n }\n}\n","import type { Directive, DirectiveBinding } from \"vue\";\nimport { simplrRUM } from \"@simplr-ai/js\";\n\n/**\n * Per-element bookkeeping so we can detach the same listener references later.\n */\ninterface ProtectState {\n field: string;\n onKeyDown: (e: KeyboardEvent) => void;\n onKeyUp: (e: KeyboardEvent) => void;\n onPaste: () => void;\n}\n\nconst stateMap = new WeakMap<HTMLElement, ProtectState>();\n\n/**\n * `v-simplr-protect=\"fieldName\"` — attaches the core fraud client's keystroke\n * tracking handlers to an input element and tags it with `data-simplr-field`.\n *\n * The bound value is the field name. The bound element MUST receive the active\n * fraud client through the directive's `arg`/context — to keep the directive\n * dependency-free of injection, it pulls handlers off the `data-simplr` payload\n * placed by `<SimplrProtectedForm>` / `<SimplrProtectedInput>`, or, if a\n * `trackInput` factory is provided via the binding value object, uses that.\n *\n * Usage forms:\n * v-simplr-protect=\"'email'\"\n * v-simplr-protect=\"{ field: 'email', trackInput }\"\n *\n * Covers: [behavioral biometrics] [input validation helpers].\n */\nexport const vSimplrProtect: Directive<HTMLElement, ProtectBinding> = {\n mounted(el, binding) {\n attach(el, binding);\n },\n updated(el, binding) {\n detach(el);\n attach(el, binding);\n },\n beforeUnmount(el) {\n detach(el);\n },\n};\n\ntype TrackInputFactory = (field: string) => {\n onKeyDown: (e: KeyboardEvent) => void;\n onKeyUp: (e: KeyboardEvent) => void;\n onPaste: () => void;\n \"data-simplr-field\": string;\n};\n\ntype ProtectBinding =\n | string\n | { field: string; trackInput?: TrackInputFactory };\n\nfunction attach(el: HTMLElement, binding: DirectiveBinding<ProtectBinding>): void {\n const value = binding.value;\n const field = typeof value === \"string\" ? value : value?.field ?? \"field\";\n const factory =\n typeof value === \"object\" && value?.trackInput ? value.trackInput : null;\n\n el.setAttribute(\"data-simplr-field\", field);\n\n if (!factory) {\n // No tracker factory provided — still log a RUM action so the field is\n // observable, then bail (the form/input components supply the factory).\n const state: ProtectState = {\n field,\n onKeyDown: () => {},\n onKeyUp: () => {},\n onPaste: () => {\n if (simplrRUM.isInitialized()) {\n simplrRUM.trackAction(`Paste into ${field}`, \"custom\", {\n target: { tag: \"input\" },\n });\n }\n },\n };\n el.addEventListener(\"paste\", state.onPaste);\n stateMap.set(el, state);\n return;\n }\n\n const handlers = factory(field);\n const state: ProtectState = {\n field,\n onKeyDown: handlers.onKeyDown,\n onKeyUp: handlers.onKeyUp,\n onPaste: handlers.onPaste,\n };\n el.addEventListener(\"keydown\", state.onKeyDown);\n el.addEventListener(\"keyup\", state.onKeyUp);\n el.addEventListener(\"paste\", state.onPaste);\n stateMap.set(el, state);\n}\n\nfunction detach(el: HTMLElement): void {\n const state = stateMap.get(el);\n if (!state) return;\n el.removeEventListener(\"keydown\", state.onKeyDown);\n el.removeEventListener(\"keyup\", state.onKeyUp);\n el.removeEventListener(\"paste\", state.onPaste);\n stateMap.delete(el);\n}\n\nexport type { ProtectBinding, TrackInputFactory };\n","import type { App } from \"vue\";\nimport {\n SimplrFraud,\n SimplrFlags,\n SimplrProfiles,\n SimplrAI,\n simplrRUM,\n type SimplrFraudConfig,\n type SimplrFlagsConfig,\n type SimplrProfilesConfig,\n type SimplrRUMConfig,\n type AIDelegationConfig,\n} from \"@simplr-ai/js\";\nimport { installContext, type SimplrContext } from \"./keys\";\nimport { vSimplrProtect } from \"./directives/protect\";\n\nexport interface CreateSimplrConfig {\n /**\n * Public API key (`pk_*`). Used as the default key for every sub-client\n * unless that sub-client supplies its own key in its config block.\n */\n apiKey?: string;\n /** API base URL override (passed to flags + profiles). */\n baseUrl?: string;\n /** Core fraud / device-signal config (or `false` to skip — fraud is on by default). */\n fraud?: SimplrFraudConfig;\n /**\n * Feature flags config. Pass `true` to enable with defaults, an object to\n * customise, or omit to skip. `initialize()` is called automatically.\n */\n flags?: Partial<SimplrFlagsConfig> | boolean;\n /** Profiles config. Pass `true` to enable with the shared key/baseUrl, or an object. */\n profiles?: Partial<SimplrProfilesConfig> | boolean;\n /** RUM config — requires at least `applicationId`. Omit to skip RUM. */\n rum?: SimplrRUMConfig;\n /** AI delegation config. Pass `true` to enable with the shared key, or an object. */\n ai?: Partial<AIDelegationConfig> | boolean;\n}\n\n/**\n * The Simplr Vue plugin. Returned by {@link createSimplr}; install with\n * `app.use(simplr)`. It builds the configured core SDK instances and provides\n * them through Vue's `provide`/`inject` so every composable can reach them.\n */\nexport interface SimplrPlugin {\n /** Vue install hook — registered when you call `app.use(plugin)`. */\n install: (app: App) => void;\n /** The constructed context — handy for direct access / SSR / testing. */\n context: SimplrContext;\n}\n\nfunction resolveBlock<T extends object>(\n block: Partial<T> | boolean | undefined,\n fallback: T,\n): T | undefined {\n if (block === false || block === undefined) return undefined;\n if (block === true) return fallback;\n return { ...fallback, ...block } as T;\n}\n\n/**\n * Create an installable Simplr plugin that wires the full `@simplr-ai/js`\n * surface (fraud, flags, profiles, RUM, AI delegation) into Vue.\n *\n * ```ts\n * import { createSimplr } from \"@simplr-ai/vue\";\n * app.use(createSimplr({\n * apiKey: \"pk_live_…\",\n * flags: true,\n * profiles: true,\n * rum: { apiKey: \"pk_live_…\", applicationId: \"my-app\" },\n * ai: true,\n * }));\n * ```\n */\nexport function createSimplr(config: CreateSimplrConfig = {}): SimplrPlugin {\n const apiKey = config.apiKey;\n\n // Core fraud client (always created unless explicitly disabled via fraud:false-ish).\n const fraud = new SimplrFraud({ apiKey, ...config.fraud });\n\n // Feature flags.\n const flagsConfig = resolveBlock<SimplrFlagsConfig>(config.flags, {\n apiKey: apiKey ?? \"\",\n baseUrl: config.baseUrl,\n });\n let flags: SimplrFlags | undefined;\n if (flagsConfig) {\n flags = new SimplrFlags();\n // Fire-and-forget; composables react to readiness via refresh.\n void flags.initialize(flagsConfig);\n }\n\n // Profiles.\n const profilesConfig = resolveBlock<SimplrProfilesConfig>(config.profiles, {\n apiKey: apiKey ?? \"\",\n baseUrl: config.baseUrl,\n });\n let profiles: SimplrProfiles | undefined;\n if (profilesConfig) {\n profiles = new SimplrProfiles(profilesConfig);\n // Wire device-signal auto-collection from the fraud client.\n profiles.setDeviceSignalCollector(() => fraud.collectDeviceSignals());\n }\n\n // RUM (singleton from the core SDK).\n let rum = undefined as SimplrContext[\"rum\"];\n if (config.rum) {\n if (!simplrRUM.isInitialized()) {\n simplrRUM.initialize(config.rum);\n }\n rum = simplrRUM;\n }\n\n // AI delegation.\n const aiConfig = resolveBlock<AIDelegationConfig>(config.ai, {\n apiKey: apiKey ?? \"\",\n });\n let ai: SimplrAI | undefined;\n if (aiConfig && aiConfig.apiKey) {\n ai = new SimplrAI(aiConfig);\n }\n\n const context: SimplrContext = { fraud, flags, profiles, rum, ai };\n\n const plugin: SimplrPlugin = {\n context,\n install(app: App) {\n installContext(app, context);\n app.directive(\"simplr-protect\", vSimplrProtect);\n },\n };\n\n return plugin;\n}\n","import { inject } from \"vue\";\nimport { SimplrInjectionKey, type SimplrContext } from \"../keys\";\n\n/**\n * Low-level accessor for the full provided Simplr context bundle.\n * Throws a helpful error if the plugin was never installed.\n */\nexport function useSimplrContext(): SimplrContext {\n const ctx = inject(SimplrInjectionKey, null);\n if (!ctx) {\n throw new Error(\n \"[@simplr-ai/vue] No Simplr context found. Did you call app.use(createSimplr(...))?\",\n );\n }\n return ctx;\n}\n","import { computed, type ComputedRef } from \"vue\";\nimport type {\n SimplrFraud,\n CollectedSignals,\n DeviceSignals,\n BehaviorSignals,\n} from \"@simplr-ai/js\";\nimport { useSimplrContext } from \"./useSimplrContext\";\n\nexport interface UseSimplrReturn {\n /** The underlying core fraud client. */\n simplr: SimplrFraud;\n /** Whether the SDK has finished initialization and is ready to collect. */\n isReady: ComputedRef<boolean>;\n /** Collect all signals (device fingerprint + behavioral biometrics). */\n collect: () => Promise<CollectedSignals>;\n /** Collect device fingerprint signals only. */\n collectDeviceSignals: () => Promise<DeviceSignals>;\n /** Collect behavioral biometric signals only (sync). */\n collectBehaviorSignals: () => BehaviorSignals;\n /** Reset all collected behavioral data. */\n reset: () => void;\n /** Get input tracking handlers/attrs for a named field. */\n trackInput: SimplrFraud[\"trackInput\"];\n /** Start biometric tracking. */\n startTracking: () => void;\n /** Stop biometric tracking. */\n stopTracking: () => void;\n}\n\n/**\n * Access the core Simplr fraud client and its `collect()` device/behavior\n * signal API. Thin wrapper over `@simplr-ai/js`'s `SimplrFraud`.\n *\n * Covers: [device fingerprint] [behavioral biometrics] [input validation helpers].\n */\nexport function useSimplr(): UseSimplrReturn {\n const { fraud } = useSimplrContext();\n\n return {\n simplr: fraud,\n isReady: computed(() => fraud.isReady),\n collect: () => fraud.collect(),\n collectDeviceSignals: () => fraud.collectDeviceSignals(),\n collectBehaviorSignals: () => fraud.collectBehaviorSignals(),\n reset: () => fraud.reset(),\n trackInput: (fieldName: string) => fraud.trackInput(fieldName),\n startTracking: () => fraud.startTracking(),\n stopTracking: () => fraud.stopTracking(),\n };\n}\n","import { ref, onMounted, type Ref } from \"vue\";\nimport type { DeviceSignals } from \"@simplr-ai/js\";\nimport { useSimplrContext } from \"./useSimplrContext\";\n\nexport interface UseDeviceSignalsOptions {\n /** Collect immediately on mount (default: true). */\n immediate?: boolean;\n}\n\nexport interface UseDeviceSignalsReturn {\n /** The collected device fingerprint signals (null until first collect). */\n signals: Ref<DeviceSignals | null>;\n /** Whether a collection is in flight. */\n loading: Ref<boolean>;\n /** Error from the last collection, if any. */\n error: Ref<Error | null>;\n /** Re-collect the device signals. */\n refresh: () => Promise<void>;\n}\n\n/**\n * Reactive device fingerprint collection. Mirrors the React\n * `useDeviceFingerprint` hook.\n *\n * Covers: [device fingerprint].\n */\nexport function useDeviceSignals(\n options: UseDeviceSignalsOptions = {},\n): UseDeviceSignalsReturn {\n const { fraud } = useSimplrContext();\n const signals = ref<DeviceSignals | null>(null);\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n const refresh = async (): Promise<void> => {\n loading.value = true;\n error.value = null;\n try {\n signals.value = await fraud.collectDeviceSignals();\n } catch (e) {\n error.value =\n e instanceof Error ? e : new Error(\"Failed to collect device signals\");\n } finally {\n loading.value = false;\n }\n };\n\n if (options.immediate !== false) {\n onMounted(refresh);\n }\n\n return { signals, loading, error, refresh };\n}\n","import {\n ref,\n computed,\n watch,\n onMounted,\n onUnmounted,\n toValue,\n type Ref,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport type { SimplrFlags, EvalContext, FlagDefinition } from \"@simplr-ai/js\";\nimport { useSimplrContext } from \"./useSimplrContext\";\n\nfunction getFlags(): SimplrFlags {\n const { flags } = useSimplrContext();\n if (!flags) {\n throw new Error(\n \"[@simplr-ai/vue] Feature flags are not configured. Pass `flags: true` (or a config) to createSimplr().\",\n );\n }\n return flags;\n}\n\n/**\n * Shared reactive \"tick\" that bumps whenever flags may have changed (load /\n * refresh). Because the core `SimplrFlags` has no event emitter, we poll its\n * readiness + snapshot so every `useFeatureFlag` re-evaluates as flags load.\n */\nfunction useFlagsTick(flags: SimplrFlags): { tick: Ref<number>; ready: Ref<boolean> } {\n const tick = ref(0);\n const ready = ref(flags.isReady());\n let last = JSON.stringify(flags.getAll());\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const check = () => {\n const wasReady = ready.value;\n ready.value = flags.isReady();\n const snapshot = JSON.stringify(flags.getAll());\n if (snapshot !== last || ready.value !== wasReady) {\n last = snapshot;\n tick.value++;\n }\n };\n\n onMounted(() => {\n check();\n timer = setInterval(check, 500);\n });\n onUnmounted(() => {\n if (timer) clearInterval(timer);\n });\n\n return { tick, ready };\n}\n\nexport interface UseFeatureFlagReturn {\n /** Reactive boolean — re-evaluates as flags load/refresh and as ctx changes. */\n enabled: ComputedRef<boolean>;\n /** Whether the flags client has loaded at least once. */\n isReady: Ref<boolean>;\n}\n\n/**\n * Reactively evaluate a single feature flag. Re-evaluates when the flag set\n * finishes loading / refreshes, and when the (optional) eval context changes.\n *\n * Covers: [feature flags local eval].\n */\nexport function useFeatureFlag(\n key: MaybeRefOrGetter<string>,\n ctx?: MaybeRefOrGetter<EvalContext | undefined>,\n): UseFeatureFlagReturn {\n const flags = getFlags();\n const { tick, ready } = useFlagsTick(flags);\n\n const enabled = computed<boolean>(() => {\n // Touch tick so this recomputes on flag load/refresh.\n void tick.value;\n return flags.isEnabled(toValue(key), toValue(ctx));\n });\n\n return { enabled, isReady: ready };\n}\n\nexport interface UseFeatureFlagsReturn {\n /** Reactive map of every flag key → enabled boolean. */\n flags: ComputedRef<Record<string, boolean>>;\n /** Raw flag definitions snapshot. */\n definitions: ComputedRef<Record<string, FlagDefinition>>;\n /** Imperative evaluation honoring the shared context. */\n isEnabled: (key: string, ctx?: EvalContext) => boolean;\n /** Whether the flags client has loaded at least once. */\n isReady: Ref<boolean>;\n /** Force a refresh from the API. */\n refresh: () => Promise<void>;\n /** Set the default user id used for bucketing/targeting. */\n setUser: (userId: string) => void;\n}\n\n/**\n * Reactively evaluate the full feature-flag set as a `{ key: boolean }` map.\n *\n * Covers: [feature flags local eval].\n */\nexport function useFeatureFlags(\n ctx?: MaybeRefOrGetter<EvalContext | undefined>,\n): UseFeatureFlagsReturn {\n const client = getFlags();\n const { tick, ready } = useFlagsTick(client);\n\n const definitions = computed<Record<string, FlagDefinition>>(() => {\n void tick.value;\n return client.getAll();\n });\n\n const flags = computed<Record<string, boolean>>(() => {\n void tick.value;\n const evalCtx = toValue(ctx);\n const out: Record<string, boolean> = {};\n for (const key of Object.keys(client.getAll())) {\n out[key] = client.isEnabled(key, evalCtx);\n }\n return out;\n });\n\n return {\n flags,\n definitions,\n isEnabled: (key: string, c?: EvalContext) =>\n client.isEnabled(key, c ?? toValue(ctx)),\n isReady: ready,\n refresh: () => client.refresh(),\n setUser: (userId: string) => client.setUser(userId),\n };\n}\n","import { ref, type Ref } from \"vue\";\nimport type {\n SimplrProfiles,\n IdentifyOptions,\n ProfileIdentifyResult,\n ProfileOrderInput,\n ProfileOrderFraudResult,\n ProfileRiskResult,\n} from \"@simplr-ai/js\";\nimport { useSimplrContext } from \"./useSimplrContext\";\n\nexport interface UseProfilesReturn {\n /** The underlying core profiles client. */\n profiles: SimplrProfiles;\n /** Loading state of the most recent operation. */\n loading: Ref<boolean>;\n /** Error from the most recent operation. */\n error: Ref<Error | null>;\n /** Identify a user — creates/updates an anonymous profile, links the device. */\n identify: (\n externalId: string,\n options?: IdentifyOptions,\n ) => Promise<ProfileIdentifyResult>;\n /** Submit an order for real-time fraud scoring. */\n submitOrder: (order: ProfileOrderInput) => Promise<ProfileOrderFraudResult>;\n /** Fetch the risk profile for a user. */\n getProfileRisk: (externalId: string) => Promise<ProfileRiskResult>;\n /** Report a profile as fraud or legitimate. */\n reportOutcome: (\n externalId: string,\n outcome: \"fraud\" | \"legitimate\",\n ) => Promise<void>;\n}\n\n/**\n * Anonymous user profiles + order fraud scoring. Thin wrapper over the core\n * `SimplrProfiles`; device fingerprint auto-attach is already wired by the\n * plugin via `setDeviceSignalCollector`.\n *\n * Covers: [profiles/identify] [order scoring /v1/orders].\n */\nexport function useProfiles(): UseProfilesReturn {\n const { profiles } = useSimplrContext();\n if (!profiles) {\n throw new Error(\n \"[@simplr-ai/vue] Profiles are not configured. Pass `profiles: true` (or a config) to createSimplr().\",\n );\n }\n\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n async function run<T>(fn: () => Promise<T>): Promise<T> {\n loading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (e) {\n error.value = e instanceof Error ? e : new Error(String(e));\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n return {\n profiles,\n loading,\n error,\n identify: (externalId, options) =>\n run(() => profiles.identify(externalId, options)),\n submitOrder: (order) => run(() => profiles.submitOrder(order)),\n getProfileRisk: (externalId) => run(() => profiles.getProfileRisk(externalId)),\n reportOutcome: (externalId, outcome) =>\n run(() => profiles.reportOutcome(externalId, outcome)),\n };\n}\n","import { onMounted, onUnmounted, toValue, type MaybeRefOrGetter } from \"vue\";\nimport {\n simplrRUM,\n type SimplrRUM,\n type RUMActionType,\n type RUMLogLevel,\n} from \"@simplr-ai/js\";\nimport { SimplrInjectionKey } from \"../keys\";\nimport { inject } from \"vue\";\n\n/**\n * Access the RUM instance. Falls back to the core singleton (`simplrRUM`) when\n * the plugin did not configure RUM, so RUM composables work standalone too.\n */\nexport function useRum(): SimplrRUM {\n const ctx = inject(SimplrInjectionKey, null);\n return ctx?.rum ?? simplrRUM;\n}\n\n/**\n * Track a page/screen view when the component mounts (and re-track if the name\n * changes). Mirrors the React `useTrackView` hook.\n *\n * Covers: [RUM full].\n */\nexport function useTrackView(name: MaybeRefOrGetter<string>): void {\n const rum = useRum();\n onMounted(() => {\n if (rum.isInitialized()) rum.trackView(toValue(name));\n });\n}\n\n/**\n * Returns an action-tracking function. Mirrors React `useTrackAction`.\n *\n * Covers: [RUM full].\n */\nexport function useTrackAction(): (\n name: string,\n type: RUMActionType,\n attributes?: Record<string, unknown>,\n) => void {\n const rum = useRum();\n return (name, type, attributes) => {\n if (rum.isInitialized()) rum.trackAction(name, type, { attributes });\n };\n}\n\n/**\n * Returns an error-tracking function. Mirrors React `useTrackError`.\n *\n * Covers: [RUM full].\n */\nexport function useTrackError(): (\n error: Error,\n context?: Record<string, unknown>,\n) => void {\n const rum = useRum();\n return (error, context) => {\n if (rum.isInitialized()) rum.trackError(error, context);\n };\n}\n\n/**\n * Leveled logging helpers backed by RUM. Mirrors React `useRUMLogger`.\n *\n * Covers: [RUM full].\n */\nexport function useRumLogger(): Record<\n RUMLogLevel,\n (message: string, context?: Record<string, unknown>) => void\n> {\n const rum = useRum();\n const make = (level: RUMLogLevel) =>\n (message: string, context?: Record<string, unknown>) => {\n if (rum.isInitialized()) rum.log(level, message, context);\n };\n return {\n debug: make(\"debug\"),\n info: make(\"info\"),\n warn: make(\"warn\"),\n error: make(\"error\"),\n };\n}\n\n/**\n * Set / clear the RUM user. Mirrors React `useRUMUser`.\n *\n * Covers: [RUM full].\n */\nexport function useRumUser(): {\n setUser: (userId: string, attributes?: Record<string, unknown>) => void;\n clearUser: () => void;\n} {\n const rum = useRum();\n return {\n setUser: (userId, attributes) => {\n if (rum.isInitialized()) rum.setUser(userId, attributes);\n },\n clearUser: () => {\n if (rum.isInitialized()) rum.clearUser();\n },\n };\n}\n\n/**\n * Add / remove global RUM attributes. Mirrors React `useRUMAttributes`.\n *\n * Covers: [RUM full].\n */\nexport function useRumAttributes(): {\n addAttribute: (key: string, value: unknown) => void;\n removeAttribute: (key: string) => void;\n} {\n const rum = useRum();\n return {\n addAttribute: (key, value) => rum.addAttribute(key, value),\n removeAttribute: (key) => rum.removeAttribute(key),\n };\n}\n\n/**\n * Wrap an async operation so its duration is tracked as a RUM action and any\n * thrown error is reported. Mirrors React `useTrackAsync`.\n *\n * Covers: [RUM full].\n */\nexport function useTrackAsync<T>(\n operationName: string,\n): (asyncFn: () => Promise<T>) => Promise<T> {\n const rum = useRum();\n return async (asyncFn) => {\n const start = Date.now();\n try {\n const result = await asyncFn();\n rum.trackAction(`${operationName} completed`, \"custom\", {\n attributes: { duration: Date.now() - start, success: true },\n });\n return result;\n } catch (error) {\n rum.trackError(\n error instanceof Error ? error : new Error(String(error)),\n { operationName, duration: Date.now() - start },\n );\n throw error;\n }\n };\n}\n\n/**\n * Install a global Vue `errorHandler` that forwards uncaught component errors\n * to RUM. Call from a plugin/app setup, e.g. `app.use(rumErrorHandler)` is not\n * needed — instead `installRumErrorHandler(app)`.\n */\nexport function flushRumOnUnmount(): void {\n const rum = useRum();\n onUnmounted(() => {\n void rum.flush();\n });\n}\n","import { ref, onMounted, type Ref } from \"vue\";\nimport {\n SimplrAI,\n type AIDelegationConfig,\n type CreateDelegationOptions,\n type DelegationResult,\n type DelegationInfo,\n type ValidationResult,\n type DelegationStats,\n} from \"@simplr-ai/js\";\nimport { SimplrInjectionKey } from \"../keys\";\nimport { inject } from \"vue\";\n\ntype ConnectOptions = Parameters<SimplrAI[\"connect\"]>[0];\ntype ConnectResult = Awaited<ReturnType<SimplrAI[\"connect\"]>>;\ntype ValidateOptions = {\n fingerprintHash?: string;\n aiProvider?: string;\n action?: string;\n};\n\n/**\n * Resolve a SimplrAI client: prefer the plugin-provided one, otherwise build a\n * standalone client from the supplied config.\n */\nfunction resolveClient(config?: AIDelegationConfig): SimplrAI {\n const ctx = inject(SimplrInjectionKey, null);\n if (ctx?.ai) return ctx.ai;\n if (config) return new SimplrAI(config);\n throw new Error(\n \"[@simplr-ai/vue] AI delegation is not configured. Pass `ai: true` to createSimplr() or supply a config to useAIDelegation().\",\n );\n}\n\nexport interface UseAIDelegationReturn {\n /** The underlying core AI client. */\n ai: SimplrAI;\n /** Loading state of the most recent operation. */\n loading: Ref<boolean>;\n /** Error from the most recent operation. */\n error: Ref<Error | null>;\n /** Open the OAuth-like AI Connect gateway (popup/redirect). */\n connect: (options: ConnectOptions) => Promise<ConnectResult>;\n /** Create a new AI delegation token. */\n createDelegation: (\n options: CreateDelegationOptions,\n ) => Promise<DelegationResult>;\n /** Validate an AI delegation token. */\n validate: (\n token: string,\n options?: ValidateOptions,\n ) => Promise<ValidationResult>;\n /** Revoke a single delegation. */\n revoke: (delegationId: string, reason?: string) => Promise<void>;\n /** List delegations (optionally scoped to a user). */\n list: (userId?: string) => Promise<DelegationInfo[]>;\n /** Get a single delegation by id. */\n get: (delegationId: string) => Promise<DelegationInfo>;\n /** Get delegation statistics. */\n stats: () => Promise<DelegationStats>;\n /** Revoke all delegations for a user (e.g. on logout). */\n revokeAllForUser: (userId: string, reason?: string) => Promise<number>;\n}\n\n/**\n * AI delegation (OAuth-like AI authentication). Mirrors React `useAIDelegation`.\n *\n * Covers: [AI delegation].\n */\nexport function useAIDelegation(\n config?: AIDelegationConfig,\n): UseAIDelegationReturn {\n const ai = resolveClient(config);\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n async function run<T>(fn: () => Promise<T>): Promise<T> {\n loading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (e) {\n error.value = e instanceof Error ? e : new Error(String(e));\n throw error.value;\n } finally {\n loading.value = false;\n }\n }\n\n return {\n ai,\n loading,\n error,\n connect: (options) => run(() => ai.connect(options)),\n createDelegation: (options) => run(() => ai.createDelegation(options)),\n validate: (token, options) => run(() => ai.validate(token, options)),\n revoke: (delegationId, reason) => run(() => ai.revoke(delegationId, reason)),\n list: (userId) => run(() => ai.list(userId)),\n get: (delegationId) => run(() => ai.get(delegationId)),\n stats: () => run(() => ai.stats()),\n revokeAllForUser: (userId, reason) =>\n run(() => ai.revokeAllForUser(userId, reason)),\n };\n}\n\nexport interface UseDelegationsReturn {\n /** Reactive list of delegations for the user. */\n delegations: Ref<DelegationInfo[]>;\n loading: Ref<boolean>;\n error: Ref<Error | null>;\n /** Re-fetch the list. */\n refresh: () => Promise<void>;\n /** Revoke a delegation then refresh the list. */\n revoke: (delegationId: string, reason?: string) => Promise<void>;\n}\n\n/**\n * Manage a reactive list of a user's delegations. Mirrors React `useDelegations`.\n *\n * Covers: [AI delegation].\n */\nexport function useDelegations(\n config?: AIDelegationConfig,\n userId?: string,\n): UseDelegationsReturn {\n const ai = resolveClient(config);\n const delegations = ref<DelegationInfo[]>([]);\n const loading = ref(true);\n const error = ref<Error | null>(null);\n\n const refresh = async (): Promise<void> => {\n loading.value = true;\n error.value = null;\n try {\n delegations.value = await ai.list(userId);\n } catch (e) {\n error.value = e instanceof Error ? e : new Error(String(e));\n } finally {\n loading.value = false;\n }\n };\n\n const revoke = async (delegationId: string, reason?: string): Promise<void> => {\n await ai.revoke(delegationId, reason);\n await refresh();\n };\n\n onMounted(refresh);\n\n return { delegations, loading, error, refresh, revoke };\n}\n","<script setup lang=\"ts\">\n/**\n * `<SimplrProtectedForm>` — a `<form>` wrapper that collects device + behavioral\n * signals from the core fraud client on submit and emits them via `@submit`\n * before (optionally) letting you finish the submission.\n *\n * Vue equivalent of the React `SimplrForm` component.\n *\n * Covers: [device fingerprint] [behavioral biometrics] [fraud/identity check].\n */\nimport { ref } from \"vue\";\nimport type { CollectedSignals } from \"@simplr-ai/js\";\nimport { useSimplr } from \"../composables/useSimplr\";\n\nconst emit = defineEmits<{\n /** Fired with the collected signals + the original DOM event on submit. */\n (e: \"submit\", signals: CollectedSignals, event: Event): void;\n /** Fired if signal collection throws. */\n (e: \"error\", error: Error): void;\n}>();\n\nconst { collect } = useSimplr();\n\n/** Whether a collect()+submit cycle is in flight. */\nconst submitting = ref(false);\n\nasync function handleSubmit(event: Event) {\n event.preventDefault();\n submitting.value = true;\n try {\n const signals = await collect();\n emit(\"submit\", signals, event);\n } catch (e) {\n emit(\"error\", e instanceof Error ? e : new Error(String(e)));\n } finally {\n submitting.value = false;\n }\n}\n\ndefineExpose({ submitting });\n</script>\n\n<template>\n <form @submit=\"handleSubmit\">\n <slot :submitting=\"submitting\" />\n </form>\n</template>\n","<script setup lang=\"ts\">\n/**\n * `<SimplrProtectedInput>` — an `<input>` that auto-attaches the core fraud\n * client's keystroke/behavioral tracking handlers and a `data-simplr-field`\n * marker. Supports `v-model`.\n *\n * Covers: [behavioral biometrics] [input validation helpers].\n */\nimport { computed, watchEffect } from \"vue\";\nimport { useSimplr } from \"../composables/useSimplr\";\n\nconst props = defineProps<{\n /** Field name used for keystroke tracking + data-simplr-field. */\n field: string;\n /** v-model value. */\n modelValue?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:modelValue\", value: string): void;\n}>();\n\nconst { trackInput } = useSimplr();\n\n// Handlers/attrs from the core SDK for this field. Evaluated eagerly so the\n// field is registered with the keystroke tracker as soon as it mounts.\nconst tracking = computed(() => trackInput(props.field));\nwatchEffect(() => {\n // Touch the computed so trackInput() runs on mount and on field change.\n void tracking.value;\n});\n\nfunction onInput(event: Event) {\n emit(\"update:modelValue\", (event.target as HTMLInputElement).value);\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n tracking.value.onKeyDown(e);\n}\nfunction onKeyUp(e: KeyboardEvent) {\n tracking.value.onKeyUp(e);\n}\nfunction onPaste() {\n tracking.value.onPaste();\n}\n</script>\n\n<template>\n <input\n :value=\"modelValue\"\n :data-simplr-field=\"field\"\n @input=\"onInput\"\n @keydown=\"onKeyDown\"\n @keyup=\"onKeyUp\"\n @paste=\"onPaste\"\n />\n</template>\n","<script setup lang=\"ts\">\n/**\n * `<RumView name=\"...\">` — declaratively tracks a RUM view on mount.\n * Vue equivalent of the React `RUMView` component.\n *\n * Covers: [RUM full].\n */\nimport { toRef } from \"vue\";\nimport { useTrackView } from \"../composables/useRum\";\n\nconst props = defineProps<{ name: string }>();\n\nuseTrackView(toRef(props, \"name\"));\n</script>\n\n<template>\n <slot />\n</template>\n","<script setup lang=\"ts\">\n/**\n * `<RumErrorBoundary>` — catches errors from descendant components via\n * `onErrorCaptured`, reports them to RUM, and renders a `#fallback` slot.\n * Vue equivalent of the React `RUMErrorBoundary`.\n *\n * Covers: [RUM full].\n */\nimport { ref, onErrorCaptured } from \"vue\";\nimport { useRum } from \"../composables/useRum\";\n\nconst emit = defineEmits<{\n (e: \"error\", error: Error, info: string): void;\n}>();\n\nconst rum = useRum();\nconst error = ref<Error | null>(null);\n\nonErrorCaptured((err, _instance, info) => {\n const normalized = err instanceof Error ? err : new Error(String(err));\n error.value = normalized;\n\n if (rum.isInitialized()) {\n rum.trackError(normalized, { vueErrorInfo: info, isVueError: true });\n }\n emit(\"error\", normalized, info);\n\n // Prevent the error from propagating further.\n return false;\n});\n</script>\n\n<template>\n <slot v-if=\"error\" name=\"fallback\" :error=\"error\">\n <div style=\"padding: 20px; text-align: center\">\n <h2>Something went wrong</h2>\n <p>We've been notified and are working to fix the issue.</p>\n </div>\n </slot>\n <slot v-else />\n</template>\n","import type { App } from \"vue\";\nimport { simplrRUM, type SimplrRUM } from \"@simplr-ai/js\";\n\n/**\n * Install a global Vue `app.config.errorHandler` that forwards every uncaught\n * component error to RUM via `trackError`. Chains to any previously-installed\n * handler.\n *\n * ```ts\n * import { installRumErrorHandler } from \"@simplr-ai/vue\";\n * installRumErrorHandler(app);\n * ```\n *\n * Covers: [RUM full].\n */\nexport function installRumErrorHandler(\n app: App,\n rum: SimplrRUM = simplrRUM,\n): void {\n const previous = app.config.errorHandler;\n app.config.errorHandler = (err, instance, info) => {\n const normalized = err instanceof Error ? err : new Error(String(err));\n if (rum.isInitialized()) {\n rum.trackError(normalized, { vueErrorInfo: info, isVueError: true });\n }\n previous?.(err, instance, info);\n };\n}\n"]}