@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.
- package/dist/app-config/analytics.js +1 -1
- package/dist/automation/index.d.ts +1 -1
- package/dist/client/analytics-session.d.ts +7 -0
- package/dist/client/analytics-session.js +27 -1
- package/dist/client/analytics.js +110 -15
- package/dist/client/consent.d.ts +12 -0
- package/dist/client/consent.js +132 -2
- package/dist/client/onboarding/index.d.ts +1 -0
- package/dist/client/onboarding/index.js +1 -0
- package/dist/client/onboarding/use-onboarding-checklist.d.ts +23 -0
- package/dist/client/onboarding/use-onboarding-checklist.js +115 -0
- package/dist/client/session-replay.d.ts +1 -1
- package/dist/client/session-replay.js +142 -3
- package/dist/collab/routes.d.ts +2 -2
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/jobs/actions/manage-recurring-job.d.ts +1 -1
- package/dist/localization/consent-banner-messages.d.ts +16 -0
- package/dist/localization/consent-banner-messages.js +149 -0
- package/dist/localization/core-messages.js +4 -0
- package/dist/localization/default-messages.d.ts +1 -0
- package/dist/localization/default-messages.js +2 -0
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +6 -6
- package/dist/onboarding/index.d.ts +2 -1
- package/dist/onboarding/index.js +1 -0
- package/dist/onboarding/plugin.js +55 -46
- package/dist/onboarding/status.d.ts +15 -0
- package/dist/onboarding/status.js +59 -0
- package/dist/onboarding/types.d.ts +12 -0
- package/dist/onboarding/types.js +2 -1
- package/dist/org/workspace-app-access.js +19 -9
- package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-capabilities.js +13 -6
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-engine-default-model-route.d.ts +1 -1
- package/dist/server/agent-engine-ollama-models-route.d.ts +2 -2
- package/dist/server/analytics.d.ts +0 -1
- package/dist/server/analytics.js +81 -20
- package/dist/server/builder-api-auth.d.ts +7 -0
- package/dist/server/builder-api-auth.js +24 -0
- package/dist/server/builder-oauth.d.ts +5 -1
- package/dist/server/builder-oauth.js +5 -0
- package/dist/server/core-routes-plugin.d.ts +1 -1
- package/dist/server/first-touch-route.d.ts +2 -2
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/shared/consent.d.ts +2 -0
- package/dist/shared/consent.js +4 -0
- package/dist/triggers/actions/manage-automation.d.ts +5 -5
- package/dist/usage/actions/get-usage-metrics.js +3 -3
- package/docs/content/deployment-environment-variables.mdx +1 -1
- package/docs/content/environment-variables.mdx +1 -1
- 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: () =>
|
|
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
|
-
|
|
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 (
|
|
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);
|
package/dist/collab/routes.d.ts
CHANGED
|
@@ -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;
|
|
@@ -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
|
}>>;
|