@agent-native/core 0.216.0 → 0.217.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.
Files changed (56) hide show
  1. package/dist/app-config/analytics.js +1 -1
  2. package/dist/automation/index.d.ts +1 -1
  3. package/dist/client/analytics-session.d.ts +7 -0
  4. package/dist/client/analytics-session.js +27 -1
  5. package/dist/client/analytics.js +110 -15
  6. package/dist/client/consent.d.ts +12 -0
  7. package/dist/client/consent.js +132 -2
  8. package/dist/client/onboarding/index.d.ts +1 -0
  9. package/dist/client/onboarding/index.js +1 -0
  10. package/dist/client/onboarding/use-onboarding-checklist.d.ts +23 -0
  11. package/dist/client/onboarding/use-onboarding-checklist.js +115 -0
  12. package/dist/client/session-replay.d.ts +1 -1
  13. package/dist/client/session-replay.js +142 -3
  14. package/dist/collab/routes.d.ts +2 -2
  15. package/dist/collab/struct-routes.d.ts +1 -1
  16. package/dist/jobs/actions/manage-recurring-job.d.ts +1 -1
  17. package/dist/localization/consent-banner-messages.d.ts +16 -0
  18. package/dist/localization/consent-banner-messages.js +149 -0
  19. package/dist/localization/core-messages.js +4 -0
  20. package/dist/localization/default-messages.d.ts +1 -0
  21. package/dist/localization/default-messages.js +2 -0
  22. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  23. package/dist/notifications/routes.d.ts +2 -2
  24. package/dist/observability/routes.d.ts +6 -6
  25. package/dist/onboarding/index.d.ts +2 -1
  26. package/dist/onboarding/index.js +1 -0
  27. package/dist/onboarding/plugin.js +55 -46
  28. package/dist/onboarding/status.d.ts +15 -0
  29. package/dist/onboarding/status.js +59 -0
  30. package/dist/onboarding/types.d.ts +12 -0
  31. package/dist/onboarding/types.js +2 -1
  32. package/dist/org/workspace-app-access.js +19 -9
  33. package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
  34. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  35. package/dist/resources/handlers.d.ts +1 -1
  36. package/dist/server/agent-capabilities.js +13 -6
  37. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  38. package/dist/server/agent-engine-default-model-route.d.ts +1 -1
  39. package/dist/server/agent-engine-ollama-models-route.d.ts +2 -2
  40. package/dist/server/analytics.d.ts +0 -1
  41. package/dist/server/analytics.js +81 -20
  42. package/dist/server/builder-api-auth.d.ts +7 -0
  43. package/dist/server/builder-api-auth.js +24 -0
  44. package/dist/server/builder-oauth.d.ts +5 -1
  45. package/dist/server/builder-oauth.js +5 -0
  46. package/dist/server/core-routes-plugin.d.ts +1 -1
  47. package/dist/server/first-touch-route.d.ts +2 -2
  48. package/dist/server/index.d.ts +1 -1
  49. package/dist/server/index.js +1 -1
  50. package/dist/shared/consent.d.ts +2 -0
  51. package/dist/shared/consent.js +4 -0
  52. package/dist/triggers/actions/manage-automation.d.ts +5 -5
  53. package/dist/usage/actions/get-usage-metrics.js +3 -3
  54. package/docs/content/deployment-environment-variables.mdx +1 -1
  55. package/docs/content/environment-variables.mdx +1 -1
  56. package/package.json +5 -3
@@ -3,6 +3,7 @@ import { resolveLaneEndpoint } from "../shared/environment-lanes.js";
3
3
  import { loadOptionalPeer, OptionalPeerDependencyError, } from "../shared/optional-peer.js";
4
4
  import { isSyntheticTrafficValue } from "../shared/test-traffic.js";
5
5
  import { getOrCreateAnalyticsAnonymousId, getOrCreateAnalyticsSessionId, } from "./analytics-session.js";
6
+ import { whenConsentAllows } from "./consent.js";
6
7
  import { replayEndpointFromAnalyticsEndpoint } from "./session-replay-endpoint.js";
7
8
  import { SESSION_REPLAY_BLOCK_ATTRIBUTE, SESSION_REPLAY_MASK_ATTRIBUTE, } from "./session-replay-privacy.js";
8
9
  import { decideReplayQuotaResponse, parseRetryAfterSeconds, } from "./session-replay-quota.js";
@@ -1173,6 +1174,8 @@ function isDefinitiveReplayUploadClientError(status) {
1173
1174
  }
1174
1175
  const MAX_TRANSIENT_REPLAY_CLIENT_FAILURES = 3;
1175
1176
  const REPLAY_UPLOAD_TIMEOUT_MS = 15_000;
1177
+ // Uploads in flight, so a consent reject can abort them.
1178
+ const activeReplayUploads = new Set();
1176
1179
  function startReplayUploadTimeout() {
1177
1180
  const controller = typeof AbortController === "undefined" ? undefined : new AbortController();
1178
1181
  let rejectTimeout;
@@ -1186,11 +1189,17 @@ function startReplayUploadTimeout() {
1186
1189
  controller?.abort();
1187
1190
  rejectTimeout(timeoutError);
1188
1191
  }, REPLAY_UPLOAD_TIMEOUT_MS);
1192
+ if (controller)
1193
+ activeReplayUploads.add(controller);
1189
1194
  return {
1190
1195
  signal: controller?.signal,
1191
1196
  promise,
1192
1197
  didTimeout: () => timedOut,
1193
- done: () => clearTimeout(timer),
1198
+ done: () => {
1199
+ clearTimeout(timer);
1200
+ if (controller)
1201
+ activeReplayUploads.delete(controller);
1202
+ },
1194
1203
  };
1195
1204
  }
1196
1205
  function isTransientReplayUploadClientError(status) {
@@ -1543,6 +1552,13 @@ export async function flushSessionReplay(reason = "manual") {
1543
1552
  const state = getState();
1544
1553
  if (!state.options)
1545
1554
  return;
1555
+ if (replayConsentWithdrawn) {
1556
+ // An upload in flight at the reject can put its batch back; drop it.
1557
+ discardWithdrawnReplay(state);
1558
+ for (const resolve of state.pendingFlushWaiters.splice(0))
1559
+ resolve();
1560
+ return;
1561
+ }
1546
1562
  if (replayUploadsParked(state, Date.now()))
1547
1563
  return;
1548
1564
  if (state.pendingReplayUpload) {
@@ -1586,6 +1602,9 @@ export async function flushSessionReplay(reason = "manual") {
1586
1602
  return;
1587
1603
  }
1588
1604
  state.flushing = true;
1605
+ // A reject while this upload is in flight withdraws its events for good,
1606
+ // even if the visitor accepts again before it settles.
1607
+ const consentGeneration = replayConsentGeneration;
1589
1608
  let uploaded = false;
1590
1609
  let reservedSequence = false;
1591
1610
  let splitRejectedBatch = false;
@@ -1609,6 +1628,9 @@ export async function flushSessionReplay(reason = "manual") {
1609
1628
  // between; it is queued as the pending reason.
1610
1629
  const outcome = await sendReplayUpload(state.options, payload.body, {
1611
1630
  beforeUpload: (keepalive) => {
1631
+ // Compression can take long enough for a reject to land first.
1632
+ if (consentGeneration !== replayConsentGeneration)
1633
+ return "defer";
1612
1634
  const pendingReason = state.pendingFlushReason;
1613
1635
  if (!keepalive &&
1614
1636
  (isPageLeaveReplayFlushReason(reason) ||
@@ -1622,7 +1644,9 @@ export async function flushSessionReplay(reason = "manual") {
1622
1644
  },
1623
1645
  });
1624
1646
  if (outcome === "deferred") {
1625
- restoreReplayEvents(state, events);
1647
+ if (consentGeneration === replayConsentGeneration) {
1648
+ restoreReplayEvents(state, events);
1649
+ }
1626
1650
  }
1627
1651
  else {
1628
1652
  state.automaticConflictRestartAttempted = false;
@@ -1686,7 +1710,10 @@ export async function flushSessionReplay(reason = "manual") {
1686
1710
  quotaDecision?.kind === "stop") &&
1687
1711
  !splitBatch &&
1688
1712
  !isUnsplittableOversizedBatch;
1689
- if (splitBatch) {
1713
+ if (consentGeneration !== replayConsentGeneration) {
1714
+ // Withdrawn while in flight; nothing goes back on the queue.
1715
+ }
1716
+ else if (splitBatch) {
1690
1717
  state.retryBatches.unshift(...splitBatch);
1691
1718
  splitRejectedBatch = true;
1692
1719
  }
@@ -1811,10 +1838,18 @@ export async function flushSessionReplay(reason = "manual") {
1811
1838
  if (shouldRestartAfterConflict) {
1812
1839
  state.automaticConflictRestartAttempted = true;
1813
1840
  }
1841
+ // The stop forgets the caller's start; a recovered recording keeps it,
1842
+ // so a reject and a later accept can bring it back.
1843
+ const consentStartOptions = replayAllowedOptions;
1814
1844
  await stopSessionReplay("upload-rejected");
1815
1845
  let restartResult = null;
1816
1846
  if (shouldRestartAfterConflict && rejectedOptions) {
1817
1847
  restartResult = await restartSessionReplayWithFreshIdentity(state, rejectedOptions, payload.sessionId);
1848
+ if (restartResult.started)
1849
+ replayAllowedOptions = consentStartOptions;
1850
+ // A reject during the recovery leaves the start for the next accept.
1851
+ if (!replayConsentGranted)
1852
+ replayAwaitingConsent ??= consentStartOptions;
1818
1853
  }
1819
1854
  const details = {
1820
1855
  status: definitiveClientErrorStatus,
@@ -1861,6 +1896,16 @@ async function restartSessionReplayWithFreshIdentityInternal(state, options, ses
1861
1896
  if (options.shouldStart && !options.shouldStart()) {
1862
1897
  return { started: false, reason: "disabled", sessionId, sampled: true };
1863
1898
  }
1899
+ // Recovery restarts without going through startSessionReplay, so a reject
1900
+ // that landed while the old recording stopped must still hold here.
1901
+ if (!replayConsentGranted) {
1902
+ return {
1903
+ started: false,
1904
+ reason: "consent-required",
1905
+ sessionId,
1906
+ sampled: true,
1907
+ };
1908
+ }
1864
1909
  const initialProperties = replayExtraProperties(options);
1865
1910
  if (options.requireSignedInUser && !replayUserEmail(initialProperties)) {
1866
1911
  return {
@@ -2687,6 +2732,81 @@ function installCaptureInterceptors(state) {
2687
2732
  }
2688
2733
  };
2689
2734
  }
2735
+ let replayConsentWatched = false;
2736
+ let replayConsentGranted = false;
2737
+ let replayConsentWithdrawn = false;
2738
+ let replayConsentGeneration = 0;
2739
+ let replayAllowedOptions = null;
2740
+ function discardWithdrawnReplay(state) {
2741
+ for (const upload of activeReplayUploads)
2742
+ upload.abort();
2743
+ activeReplayUploads.clear();
2744
+ state.queue = [];
2745
+ state.queuedBytes = 0;
2746
+ state.retryBatches = [];
2747
+ state.pendingFlushReason = null;
2748
+ for (const resolve of state.pendingFlushWaiters.splice(0))
2749
+ resolve();
2750
+ }
2751
+ let replayAwaitingConsent = null;
2752
+ let replayCallerStops = 0;
2753
+ /**
2754
+ * Replay waits for analytics consent where the banner applies, without the
2755
+ * time zone's early guess: a recording that already uploaded can't be undone.
2756
+ * A start asked for before the answer runs once consent arrives.
2757
+ */
2758
+ function replayConsentAllows(options) {
2759
+ if (!replayConsentWatched) {
2760
+ replayConsentWatched = true;
2761
+ whenConsentAllows("performance", () => {
2762
+ replayConsentGranted = true;
2763
+ // What an upload in flight at the reject put back stays withdrawn.
2764
+ if (replayConsentWithdrawn)
2765
+ discardWithdrawnReplay(getState());
2766
+ replayConsentWithdrawn = false;
2767
+ const waiting = replayAwaitingConsent;
2768
+ replayAwaitingConsent = null;
2769
+ if (!waiting)
2770
+ return;
2771
+ // A reject during the last start cancels it, and an accept that
2772
+ // quickly gets that canceled start back; ask once more after it.
2773
+ const stops = replayCallerStops;
2774
+ void startSessionReplay(waiting).then((result) => {
2775
+ if (!result.started &&
2776
+ replayConsentGranted &&
2777
+ !getState().active &&
2778
+ replayCallerStops === stops) {
2779
+ void startSessionReplay(waiting);
2780
+ }
2781
+ });
2782
+ }, {
2783
+ // The region's first answer revokes before any choice, so a start
2784
+ // asked for earlier keeps waiting for an accept.
2785
+ revoke: () => {
2786
+ const wasGranted = replayConsentGranted;
2787
+ replayConsentGranted = false;
2788
+ if (!wasGranted) {
2789
+ // A replay id an earlier page stored never carries past a reject.
2790
+ const storedReplayId = readStoredReplaySession()?.replayId;
2791
+ if (storedReplayId)
2792
+ removeStoredReplaySession(storedReplayId);
2793
+ return;
2794
+ }
2795
+ replayConsentWithdrawn = true;
2796
+ replayConsentGeneration += 1;
2797
+ // A fresh accept on this page records again, under a new identity.
2798
+ replayAwaitingConsent = replayAllowedOptions ?? replayAwaitingConsent;
2799
+ void stopSessionReplay("consent-revoked");
2800
+ },
2801
+ });
2802
+ }
2803
+ if (replayConsentGranted) {
2804
+ replayAllowedOptions = options;
2805
+ return true;
2806
+ }
2807
+ replayAwaitingConsent = options;
2808
+ return false;
2809
+ }
2690
2810
  export async function startSessionReplay(options = {}) {
2691
2811
  if (isSyntheticBrowserTraffic()) {
2692
2812
  return { started: false, reason: "disabled" };
@@ -2702,6 +2822,9 @@ export async function startSessionReplay(options = {}) {
2702
2822
  const normalized = normalizeOptions(options);
2703
2823
  if (!normalized)
2704
2824
  return { started: false, reason: "missing-public-key" };
2825
+ if (!replayConsentAllows(options)) {
2826
+ return { started: false, reason: "consent-required" };
2827
+ }
2705
2828
  const sessionId = getOrCreateAnalyticsSessionId();
2706
2829
  if (!sessionId)
2707
2830
  return { started: false, reason: "missing-session-id" };
@@ -2965,6 +3088,19 @@ export async function stopSessionReplay(reason = "manual") {
2965
3088
  if (reason !== "pagehide-persisted") {
2966
3089
  state.bfcacheRestored = false;
2967
3090
  }
3091
+ if (reason === "consent-revoked") {
3092
+ // Also when recording already stopped: a later accept starts afresh.
3093
+ const storedReplayId = state.replayId ?? readStoredReplaySession()?.replayId;
3094
+ discardWithdrawnReplay(state);
3095
+ if (storedReplayId)
3096
+ removeStoredReplaySession(storedReplayId);
3097
+ }
3098
+ else if (reason !== "upload-timeout") {
3099
+ // Any other stop is final: a later accept doesn't bring it back.
3100
+ replayAwaitingConsent = null;
3101
+ replayAllowedOptions = null;
3102
+ replayCallerStops += 1;
3103
+ }
2968
3104
  if (!state.active) {
2969
3105
  if (authClearedReplayId)
2970
3106
  removeStoredReplaySession(authClearedReplayId);
@@ -3024,6 +3160,9 @@ export async function stopSessionReplay(reason = "manual") {
3024
3160
  // best-effort cleanup
3025
3161
  }
3026
3162
  state.broadcastChannel = null;
3163
+ // A reject withdraws what is still buffered, so it is never uploaded.
3164
+ if (reason === "consent-revoked")
3165
+ return;
3027
3166
  const sequenceBeforeFinalFlush = state.sequence;
3028
3167
  try {
3029
3168
  await flushSessionReplay(reason);
@@ -13,12 +13,12 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
13
13
  };
14
14
  }>>;
15
15
  export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- ok?: undefined;
17
16
  error: string;
17
+ ok?: undefined;
18
18
  } | {
19
- error?: undefined;
20
19
  liveCopy: "derived" | "not_derived" | "unchanged";
21
20
  liveCopyReason?: string;
21
+ error?: undefined;
22
22
  ok: boolean;
23
23
  } | {
24
24
  error?: undefined;
@@ -1,6 +1,6 @@
1
1
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
2
- ok?: undefined;
3
2
  error: string;
3
+ ok?: undefined;
4
4
  } | {
5
5
  error?: undefined;
6
6
  ok: boolean;
@@ -13,10 +13,10 @@ declare const _default: import("../../action.js").ActionDefinition<{
13
13
  enabled?: undefined;
14
14
  nextRun?: undefined;
15
15
  } | {
16
- deleted?: undefined;
17
16
  resourceId: string;
18
17
  name: string;
19
18
  enabled: boolean;
20
19
  nextRun: string;
20
+ deleted?: undefined;
21
21
  }>;
22
22
  export default _default;
@@ -0,0 +1,16 @@
1
+ import { type BuiltinLocaleCode, type LocaleCode } from "./shared.js";
2
+ export interface ConsentBannerMessages {
3
+ label: string;
4
+ message: string;
5
+ privacyPolicy: string;
6
+ necessary: string;
7
+ performance: string;
8
+ targeting: string;
9
+ rejectAll: string;
10
+ acceptAll: string;
11
+ save: string;
12
+ manage: string;
13
+ cookieSettings: string;
14
+ }
15
+ export declare const CONSENT_BANNER_MESSAGES: Record<BuiltinLocaleCode, ConsentBannerMessages>;
16
+ export declare function consentBannerMessagesForLocale(locale: LocaleCode): ConsentBannerMessages;
@@ -0,0 +1,149 @@
1
+ import { DEFAULT_LOCALE, isLocaleCode, } from "./shared.js";
2
+ export const CONSENT_BANNER_MESSAGES = {
3
+ "en-US": {
4
+ label: "Cookie preferences",
5
+ message: "We use cookies to measure how this site is used and which ads bring visitors here.",
6
+ privacyPolicy: "Privacy policy",
7
+ necessary: "Strictly necessary",
8
+ performance: "Analytics",
9
+ targeting: "Advertising and attribution",
10
+ rejectAll: "Reject all",
11
+ acceptAll: "Accept all",
12
+ save: "Save choices",
13
+ manage: "Manage settings",
14
+ cookieSettings: "Cookie settings",
15
+ },
16
+ "es-ES": {
17
+ label: "Preferencias de cookies",
18
+ message: "Usamos cookies para medir cómo se usa este sitio y qué anuncios traen visitantes.",
19
+ privacyPolicy: "Política de privacidad",
20
+ necessary: "Estrictamente necesarias",
21
+ performance: "Analítica",
22
+ targeting: "Publicidad y atribución",
23
+ rejectAll: "Rechazar todas",
24
+ acceptAll: "Aceptar todas",
25
+ save: "Guardar selección",
26
+ manage: "Gestionar ajustes",
27
+ cookieSettings: "Configuración de cookies",
28
+ },
29
+ "fr-FR": {
30
+ label: "Préférences de cookies",
31
+ message: "Nous utilisons des cookies pour mesurer l’utilisation de ce site et savoir quelles publicités amènent des visiteurs.",
32
+ privacyPolicy: "Politique de confidentialité",
33
+ necessary: "Strictement nécessaires",
34
+ performance: "Mesure d’audience",
35
+ targeting: "Publicité et attribution",
36
+ rejectAll: "Tout refuser",
37
+ acceptAll: "Tout accepter",
38
+ save: "Enregistrer mes choix",
39
+ manage: "Gérer les paramètres",
40
+ cookieSettings: "Paramètres des cookies",
41
+ },
42
+ "de-DE": {
43
+ label: "Cookie-Einstellungen",
44
+ message: "Wir verwenden Cookies, um zu messen, wie diese Website genutzt wird und welche Anzeigen Besucher hierher bringen.",
45
+ privacyPolicy: "Datenschutzerklärung",
46
+ necessary: "Unbedingt erforderlich",
47
+ performance: "Analyse",
48
+ targeting: "Werbung und Attribution",
49
+ rejectAll: "Alle ablehnen",
50
+ acceptAll: "Alle akzeptieren",
51
+ save: "Auswahl speichern",
52
+ manage: "Einstellungen verwalten",
53
+ cookieSettings: "Cookie-Einstellungen",
54
+ },
55
+ "pt-BR": {
56
+ label: "Preferências de cookies",
57
+ message: "Usamos cookies para medir como este site é usado e quais anúncios trazem visitantes.",
58
+ privacyPolicy: "Política de privacidade",
59
+ necessary: "Estritamente necessários",
60
+ performance: "Análise",
61
+ targeting: "Publicidade e atribuição",
62
+ rejectAll: "Rejeitar todos",
63
+ acceptAll: "Aceitar todos",
64
+ save: "Salvar escolhas",
65
+ manage: "Gerenciar configurações",
66
+ cookieSettings: "Configurações de cookies",
67
+ },
68
+ "ja-JP": {
69
+ label: "Cookie の設定",
70
+ message: "このサイトの利用状況と、どの広告から訪問者が来ているかを測定するために Cookie を使用しています。",
71
+ privacyPolicy: "プライバシーポリシー",
72
+ necessary: "必須",
73
+ performance: "分析",
74
+ targeting: "広告とアトリビューション",
75
+ rejectAll: "すべて拒否",
76
+ acceptAll: "すべて許可",
77
+ save: "選択を保存",
78
+ manage: "設定を管理",
79
+ cookieSettings: "Cookie の設定",
80
+ },
81
+ "ko-KR": {
82
+ label: "쿠키 환경설정",
83
+ message: "이 사이트의 이용 방식과 방문자를 데려오는 광고를 측정하기 위해 쿠키를 사용합니다.",
84
+ privacyPolicy: "개인정보 처리방침",
85
+ necessary: "필수",
86
+ performance: "분석",
87
+ targeting: "광고 및 어트리뷰션",
88
+ rejectAll: "모두 거부",
89
+ acceptAll: "모두 허용",
90
+ save: "선택 저장",
91
+ manage: "설정 관리",
92
+ cookieSettings: "쿠키 설정",
93
+ },
94
+ "zh-CN": {
95
+ label: "Cookie 偏好设置",
96
+ message: "我们使用 Cookie 来衡量本网站的使用情况,以及哪些广告带来了访客。",
97
+ privacyPolicy: "隐私政策",
98
+ necessary: "绝对必要",
99
+ performance: "分析",
100
+ targeting: "广告与归因",
101
+ rejectAll: "全部拒绝",
102
+ acceptAll: "全部接受",
103
+ save: "保存选择",
104
+ manage: "管理设置",
105
+ cookieSettings: "Cookie 设置",
106
+ },
107
+ "zh-TW": {
108
+ label: "Cookie 偏好設定",
109
+ message: "我們使用 Cookie 來衡量本網站的使用情況,以及哪些廣告帶來了訪客。",
110
+ privacyPolicy: "隱私權政策",
111
+ necessary: "絕對必要",
112
+ performance: "分析",
113
+ targeting: "廣告與歸因",
114
+ rejectAll: "全部拒絕",
115
+ acceptAll: "全部接受",
116
+ save: "儲存選擇",
117
+ manage: "管理設定",
118
+ cookieSettings: "Cookie 設定",
119
+ },
120
+ "hi-IN": {
121
+ label: "कुकी प्राथमिकताएँ",
122
+ message: "हम यह मापने के लिए कुकी का उपयोग करते हैं कि यह साइट कैसे उपयोग होती है और कौन-से विज्ञापन विज़िटर लाते हैं।",
123
+ privacyPolicy: "गोपनीयता नीति",
124
+ necessary: "पूरी तरह आवश्यक",
125
+ performance: "एनालिटिक्स",
126
+ targeting: "विज्ञापन और एट्रिब्यूशन",
127
+ rejectAll: "सभी अस्वीकार करें",
128
+ acceptAll: "सभी स्वीकार करें",
129
+ save: "विकल्प सहेजें",
130
+ manage: "सेटिंग प्रबंधित करें",
131
+ cookieSettings: "कुकी सेटिंग",
132
+ },
133
+ "ar-SA": {
134
+ label: "تفضيلات ملفات تعريف الارتباط",
135
+ message: "نستخدم ملفات تعريف الارتباط لقياس كيفية استخدام هذا الموقع والإعلانات التي تجلب الزوار إليه.",
136
+ privacyPolicy: "سياسة الخصوصية",
137
+ necessary: "ضرورية للغاية",
138
+ performance: "التحليلات",
139
+ targeting: "الإعلانات والإسناد",
140
+ rejectAll: "رفض الكل",
141
+ acceptAll: "قبول الكل",
142
+ save: "حفظ الاختيارات",
143
+ manage: "إدارة الإعدادات",
144
+ cookieSettings: "إعدادات ملفات تعريف الارتباط",
145
+ },
146
+ };
147
+ export function consentBannerMessagesForLocale(locale) {
148
+ return CONSENT_BANNER_MESSAGES[isLocaleCode(locale) ? locale : DEFAULT_LOCALE];
149
+ }
@@ -1,4 +1,5 @@
1
1
  import { agentResourcePackMessagesForLocale } from "./agent-resources-messages.js";
2
+ import { consentBannerMessagesForLocale } from "./consent-banner-messages.js";
2
3
  import * as englishSupplementalMessages from "./core-messages/supplemental/en-US.js";
3
4
  import { environmentBadgeMessagesForLocale } from "./environment-badge-messages.js";
4
5
  import { iconPickerMessagesForLocale } from "./icon-picker-messages.js";
@@ -90,6 +91,7 @@ export async function loadCoreMessagesForLocale(locale) {
90
91
  const supplementalMessages = await supplementalLoader();
91
92
  return {
92
93
  agentResources: agentResourcePackMessagesForLocale(locale),
94
+ consentBanner: consentBannerMessagesForLocale(locale),
93
95
  environmentBadge: environmentBadgeMessagesForLocale(locale),
94
96
  iconPicker: iconPickerMessagesForLocale(locale),
95
97
  settings: {
@@ -100,6 +102,7 @@ export async function loadCoreMessagesForLocale(locale) {
100
102
  }
101
103
  const englishCoreMessages = {
102
104
  agentResources: agentResourcePackMessagesForLocale(DEFAULT_LOCALE),
105
+ consentBanner: consentBannerMessagesForLocale(DEFAULT_LOCALE),
103
106
  environmentBadge: englishSupplementalMessages.environmentBadgeMessages,
104
107
  iconPicker: iconPickerMessagesForLocale(DEFAULT_LOCALE),
105
108
  settings: {
@@ -112,6 +115,7 @@ export function coreMessagesForLocale(locale) {
112
115
  return englishCoreMessages;
113
116
  }
114
117
  return {
118
+ consentBanner: consentBannerMessagesForLocale(locale),
115
119
  environmentBadge: environmentBadgeMessagesForLocale(locale),
116
120
  };
117
121
  }
@@ -110,6 +110,7 @@ declare const messages: {
110
110
  chatgptPlanUsageUnavailable: string;
111
111
  };
112
112
  };
113
+ consentBanner: import("./consent-banner-messages.js").ConsentBannerMessages;
113
114
  environmentBadge: import("./environment-badge-messages.js").EnvironmentBadgeMessages;
114
115
  workspaceFile: {
115
116
  download: string;
@@ -1,4 +1,5 @@
1
1
  import { PASSWORD_MIN_LENGTH_MESSAGE } from "../shared/password-policy.js";
2
+ import { CONSENT_BANNER_MESSAGES } from "./consent-banner-messages.js";
2
3
  import { environmentBadgeMessages } from "./core-messages/supplemental/en-US.js";
3
4
  import { ICON_PICKER_MESSAGES } from "./icon-picker-messages.js";
4
5
  const messages = {
@@ -33,6 +34,7 @@ const messages = {
33
34
  chatgptPlanUsageUnavailable: "OpenAI couldn’t check this ChatGPT plan’s usage limit. Check ChatGPT usage or try another model.",
34
35
  },
35
36
  },
37
+ consentBanner: CONSENT_BANNER_MESSAGES["en-US"],
36
38
  environmentBadge: environmentBadgeMessages,
37
39
  workspaceFile: {
38
40
  download: "Download",
@@ -140,13 +140,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
140
140
  clientHint?: undefined;
141
141
  timestamp?: undefined;
142
142
  chapterId?: undefined;
143
- count?: undefined;
144
143
  startAt?: undefined;
145
144
  endAt?: undefined;
146
145
  reason?: undefined;
147
146
  includeMicrophone?: undefined;
148
147
  includeSystemAudio?: undefined;
149
148
  requestId?: undefined;
149
+ count?: undefined;
150
150
  };
151
151
  required?: undefined;
152
152
  };
@@ -171,13 +171,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
171
171
  clientHint?: undefined;
172
172
  timestamp?: undefined;
173
173
  chapterId?: undefined;
174
- count?: undefined;
175
174
  startAt?: undefined;
176
175
  endAt?: undefined;
177
176
  reason?: undefined;
178
177
  includeMicrophone?: undefined;
179
178
  includeSystemAudio?: undefined;
180
179
  requestId?: undefined;
180
+ count?: undefined;
181
181
  };
182
182
  required?: undefined;
183
183
  };
@@ -196,13 +196,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
196
196
  clientHint?: undefined;
197
197
  timestamp?: undefined;
198
198
  chapterId?: undefined;
199
- count?: undefined;
200
199
  startAt?: undefined;
201
200
  endAt?: undefined;
202
201
  reason?: undefined;
203
202
  includeMicrophone?: undefined;
204
203
  includeSystemAudio?: undefined;
205
204
  requestId?: undefined;
205
+ count?: undefined;
206
206
  };
207
207
  required?: undefined;
208
208
  };
@@ -231,13 +231,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
231
231
  };
232
232
  timestamp?: undefined;
233
233
  chapterId?: undefined;
234
- count?: undefined;
235
234
  startAt?: undefined;
236
235
  endAt?: undefined;
237
236
  reason?: undefined;
238
237
  includeMicrophone?: undefined;
239
238
  includeSystemAudio?: undefined;
240
239
  requestId?: undefined;
240
+ count?: undefined;
241
241
  };
242
242
  };
243
243
  } | {
@@ -260,12 +260,12 @@ export declare function screenMemoryMcpToolDefinitions(): ({
260
260
  description: string;
261
261
  };
262
262
  chapterId?: undefined;
263
- count?: undefined;
264
263
  startAt?: undefined;
265
264
  endAt?: undefined;
266
265
  includeMicrophone?: undefined;
267
266
  includeSystemAudio?: undefined;
268
267
  requestId?: undefined;
268
+ count?: undefined;
269
269
  };
270
270
  };
271
271
  } | {
@@ -317,7 +317,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
317
317
  clientHint?: undefined;
318
318
  timestamp?: undefined;
319
319
  chapterId?: undefined;
320
- count?: undefined;
321
320
  startAt: {
322
321
  type: string;
323
322
  description: string;
@@ -337,6 +336,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
337
336
  type: string;
338
337
  };
339
338
  requestId?: undefined;
339
+ count?: undefined;
340
340
  };
341
341
  };
342
342
  } | {
@@ -352,7 +352,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
352
352
  clientHint?: undefined;
353
353
  timestamp?: undefined;
354
354
  chapterId?: undefined;
355
- count?: undefined;
356
355
  startAt?: undefined;
357
356
  endAt?: undefined;
358
357
  reason?: undefined;
@@ -361,6 +360,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
361
360
  requestId: {
362
361
  type: string;
363
362
  };
363
+ count?: undefined;
364
364
  };
365
365
  };
366
366
  })[];
@@ -1,13 +1,13 @@
1
1
  export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
2
2
  count: number;
3
3
  updated?: undefined;
4
- error?: undefined;
5
4
  ok?: undefined;
5
+ error?: undefined;
6
6
  } | {
7
7
  count?: undefined;
8
8
  updated: number;
9
- error?: undefined;
10
9
  ok?: undefined;
10
+ error?: undefined;
11
11
  } | {
12
12
  count?: undefined;
13
13
  updated?: undefined;
@@ -27,43 +27,43 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
27
27
  thumbsUpRate: number;
28
28
  avgEvalScore: number;
29
29
  } | {
30
+ ok?: undefined;
30
31
  error: string;
31
32
  message: string;
32
33
  summary?: undefined;
33
34
  spans?: undefined;
34
- ok?: undefined;
35
35
  } | {
36
+ ok?: undefined;
36
37
  message?: undefined;
37
38
  summary: import("./types.js").TraceSummary;
38
39
  spans: import("./types.js").TraceSpan[];
39
40
  error?: undefined;
40
- ok?: undefined;
41
41
  } | {
42
+ ok?: undefined;
42
43
  message?: undefined;
43
44
  summary?: undefined;
44
45
  spans?: undefined;
45
46
  traceMissing: true;
46
47
  id: string;
47
48
  error?: undefined;
48
- ok?: undefined;
49
49
  } | {
50
+ ok?: undefined;
50
51
  message?: undefined;
51
52
  summary?: undefined;
52
53
  spans?: undefined;
53
54
  traceMissing?: undefined;
54
55
  id: string;
55
56
  error?: undefined;
56
- ok?: undefined;
57
57
  } | {
58
+ ok?: undefined;
58
59
  message?: undefined;
59
60
  summary?: undefined;
60
61
  spans?: undefined;
61
62
  error: any;
62
- ok?: undefined;
63
63
  } | {
64
64
  message?: undefined;
65
65
  summary?: undefined;
66
66
  spans?: undefined;
67
- error?: undefined;
68
67
  ok: boolean;
68
+ error?: undefined;
69
69
  }>>;