@agent-native/core 0.222.0 → 0.222.1-nightly-20261029092708

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 (43) hide show
  1. package/dist/agent/production-agent.d.ts +2 -0
  2. package/dist/agent/production-agent.js +86 -6
  3. package/dist/agent/run-store.js +3 -2
  4. package/dist/app-config/agent.d.ts +9 -0
  5. package/dist/app-config/agent.js +31 -0
  6. package/dist/app-config/schema.d.ts +9 -0
  7. package/dist/app-config/store.js +48 -5
  8. package/dist/collab/routes.d.ts +1 -1
  9. package/dist/collab/struct-routes.d.ts +1 -1
  10. package/dist/file-upload/actions/upload-image.d.ts +4 -4
  11. package/dist/jobs/run-history.js +3 -2
  12. package/dist/observability/hosted-model-experiment.d.ts +1 -1
  13. package/dist/observability/hosted-model-experiment.js +7 -1
  14. package/dist/observability/question-intake-experiment.d.ts +34 -0
  15. package/dist/observability/question-intake-experiment.js +114 -0
  16. package/dist/observability/traces.d.ts +4 -0
  17. package/dist/observability/traces.js +5 -4
  18. package/dist/observability/tracing.d.ts +1 -0
  19. package/dist/observability/tracing.js +14 -4
  20. package/dist/org/index.d.ts +1 -1
  21. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  22. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  23. package/dist/server/agent-chat/browser-team-tools.js +2 -2
  24. package/dist/server/agent-engine-api-key-route.d.ts +3 -3
  25. package/dist/server/better-auth-instance.js +43 -0
  26. package/dist/server/builder-branch-files.d.ts +3 -1
  27. package/dist/server/builder-branch-files.js +74 -33
  28. package/dist/server/builder-branch-git.d.ts +1 -1
  29. package/dist/server/builder-branch-git.js +2 -0
  30. package/dist/server/builder-browser.d.ts +17 -0
  31. package/dist/server/builder-browser.js +33 -0
  32. package/dist/server/core-routes-plugin.js +42 -8
  33. package/dist/server/index.d.ts +1 -1
  34. package/dist/server/index.js +1 -1
  35. package/dist/server/request-context.d.ts +8 -0
  36. package/dist/server/transcribe-voice.d.ts +1 -1
  37. package/dist/shared/first-run-builder-credits-experiment.d.ts +1 -0
  38. package/dist/shared/first-run-builder-credits-experiment.js +19 -0
  39. package/dist/tracking/index.d.ts +1 -1
  40. package/dist/tracking/index.js +1 -1
  41. package/dist/tracking/registry.d.ts +7 -0
  42. package/dist/tracking/registry.js +84 -4
  43. package/package.json +4 -4
@@ -45,6 +45,7 @@ import { getUserSetting, putUserSetting, deleteUserSetting, } from "../settings/
45
45
  import { ANALYTICS_CLIENT_PLATFORM_PROPERTY } from "../shared/analytics-platform.js";
46
46
  import { EMPTY_SPECULATION_RULES, resolveSsrCacheHeaders, } from "../shared/cache-control.js";
47
47
  import { EMBED_TARGET_HEADER } from "../shared/embed-auth.js";
48
+ import { FIRST_RUN_ONBOARDING_EXPERIMENT_EVENT_NAMES } from "../shared/first-run-builder-credits-experiment.js";
48
49
  import { isGoogleProfileImageUrl } from "../shared/google-profile-image.js";
49
50
  import { llmConnectionTrackingProperties } from "../shared/llm-connection.js";
50
51
  import { EMBED_TRANSPLANT_HEADER, isMcpEmbedCorsOrigin, MCP_EMBED_CORS_ALLOW_HEADERS, shouldAllowMcpEmbedCredentials, } from "../shared/mcp-embed-headers.js";
@@ -59,7 +60,7 @@ import { createAgentEngineApiKeyHandler } from "./agent-engine-api-key-route.js"
59
60
  import { createAgentEngineDisconnectHandler } from "./agent-engine-default-model-route.js";
60
61
  import { createAgentEngineOllamaModelsHandler } from "./agent-engine-ollama-models-route.js";
61
62
  import { memoizeAgentEngineStatus } from "./agent-engine-status-cache.js";
62
- import { readAnalyticsClientPlatformHeader, readBrowserSessionIdHeader, } from "./agent-run-context.js";
63
+ import { readAnalyticsClientPlatformHeader, readBrowserSessionIdHeader, readBrowserTabIdHeader, } from "./agent-run-context.js";
63
64
  import { isAnonymousWaitlistSessionEmail } from "./anonymous-identity.js";
64
65
  import { getConfiguredAppBasePath, stripAppBasePath } from "./app-base-path.js";
65
66
  import { readAnalyticsSessionId } from "./attribution.js";
@@ -68,7 +69,7 @@ import { createAutomationFailureUnsubscribeHandler } from "./automation-failure-
68
69
  import { registerBackgroundJobStop } from "./background-jobs.js";
69
70
  import { getBetterAuthInternalAdapter, getBetterAuthSync, } from "./better-auth-instance.js";
70
71
  import { isBuilderReauthorizationRequired, resolveBuilderRequestAuthorization, } from "./builder-api-auth.js";
71
- import { BUILDER_CONNECT_PARAM, BUILDER_CONNECT_MODE_PARAM, BUILDER_AGENT_NATIVE_PROVISION_MODE, BUILDER_CONNECT_ATTEMPT_PARAM, BUILDER_CONNECT_STATE_COOKIE, BUILDER_ENV_KEYS, BUILDER_OPENER_PARAM, BUILDER_RELAY_FLOW_HEADER, BUILDER_RELAY_SIGNATURE_HEADER, BUILDER_RELAY_STATE_PARAM, BUILDER_RELAY_TIMESTAMP_HEADER, appendBuilderConnectToken, appendBuilderConnectStateCookie, builderConnectTrackingProperties, BUILDER_UPSTREAM_FAILURE_STATUS, createBuilderConnectState, createBuilderBrowserCallbackErrorPage, createBuilderBrowserCallbackPage, createBuilderRelayRequest, getBuilderConnectCallbackOriginFromUrl, getBuilderConnectTrackingParams, getBuilderBrowserOriginForEvent, getBuilderBrowserStatusForEvent, BuilderAccountProvisioningError, isBuilderAccountAlreadyExistsError, isBuilderAccountProvisioningEnabled, isBuilderConnectCallbackUrlAllowed, isSignedBuilderConnectState, normalizeBuilderAgentContext, parseBuilderConnectStateCookie, provisionBuilderAccount, resolveBuilderBranchProjectId, resolveBuilderConnectCallbackUrl, resolveBuilderConnectCallbackState, resolveBuilderPreviewRelayParentOrigin, removeBuilderConnectStateCookie, runBuilderAgent, sendBuilderPopupErrorPage, verifyBuilderRelayRequest, verifyBuilderPreviewRelayStateForCallback, verifyBuilderConnectTokenAndGetOwner, signBuilderProvisioningToken, verifyBuilderProvisioningToken, withBuilderConnectTrackingParams, } from "./builder-browser.js";
72
+ import { BUILDER_CONNECT_PARAM, BUILDER_CONNECT_MODE_PARAM, BUILDER_AGENT_NATIVE_PROVISION_MODE, BUILDER_CONNECT_ATTEMPT_PARAM, BUILDER_CONNECT_STATE_COOKIE, BUILDER_ENV_KEYS, BUILDER_OPENER_PARAM, BUILDER_RELAY_FLOW_HEADER, BUILDER_RELAY_SIGNATURE_HEADER, BUILDER_RELAY_STATE_PARAM, BUILDER_RELAY_TIMESTAMP_HEADER, appendBuilderConnectToken, appendBuilderConnectStateCookie, builderConnectTrackingProperties, BUILDER_UPSTREAM_FAILURE_STATUS, createBuilderConnectState, createBuilderBrowserCallbackErrorPage, createBuilderBrowserCallbackPage, createBuilderRelayRequest, getBuilderConnectCallbackOriginFromUrl, getBuilderConnectTrackingParams, getBuilderBrowserOriginForEvent, getBuilderBrowserStatusForEvent, BuilderAccountProvisioningError, isBuilderAccountAlreadyExistsError, isBuilderAccountProvisioningEnabled, isBuilderConnectCallbackUrlAllowed, isSignedBuilderConnectState, normalizeBuilderAgentContext, parseBuilderConnectStateCookie, provisionBuilderAccount, resolveBuilderBranchProjectId, resolveBuilderHandoffProjectId, resolveBuilderConnectCallbackUrl, resolveBuilderConnectCallbackState, resolveBuilderPreviewRelayParentOrigin, removeBuilderConnectStateCookie, runBuilderAgent, sendBuilderPopupErrorPage, verifyBuilderRelayRequest, verifyBuilderPreviewRelayStateForCallback, verifyBuilderConnectTokenAndGetOwner, signBuilderProvisioningToken, verifyBuilderProvisioningToken, withBuilderConnectTrackingParams, } from "./builder-browser.js";
72
73
  import { createBuilderDesktopMessagesHandler } from "./builder-desktop-messages-route.js";
73
74
  import { BUILDER_OAUTH_SCOPE, builderOAuthScopeFor, canRoleConnectPersonalBuilder, deleteBuilderOAuthSession, exchangeBuilderOAuthAuthorization, getBuilderOAuthGrants, getBuilderOAuthStoredScope, hasUsableBuilderOAuthSessionForReadiness, hasStoredBuilderOAuthGrant, isBuilderOrgManagerRole, isPersonalBuilderGrantAllowed, saveBuilderOAuthCredentials, startBuilderOAuthAuthorization, } from "./builder-oauth.js";
74
75
  import { captureError, registerErrorCaptureProvider } from "./capture-error.js";
@@ -3491,8 +3492,15 @@ export function createCoreRoutesPlugin(options = {}) {
3491
3492
  // uses. Without this, per-user Builder keys stored in app_secrets are
3492
3493
  // invisible to the run path and the call throws "Builder keys are not
3493
3494
  // configured" even though the status endpoint correctly reports configured=true.
3494
- return runWithRequestContext({ userEmail, orgId: orgId ?? undefined }, async () => {
3495
- const projectId = await resolveBuilderBranchProjectId();
3495
+ // The tab id lets a host's branch-project provider find the view
3496
+ // this click came from (its navigation state is tab-scoped).
3497
+ const browserTabId = readBrowserTabIdHeader(event);
3498
+ return runWithRequestContext({
3499
+ userEmail,
3500
+ ...(orgId ? { orgId } : {}),
3501
+ ...(browserTabId ? { run: { browserTabId } } : {}),
3502
+ }, async () => {
3503
+ const projectId = await resolveBuilderHandoffProjectId();
3496
3504
  if (!projectId) {
3497
3505
  setResponseStatus(event, 403);
3498
3506
  return {
@@ -4306,15 +4314,41 @@ export function createCoreRoutesPlugin(options = {}) {
4306
4314
  };
4307
4315
  if (orgId)
4308
4316
  properties.org_id = orgId;
4317
+ // The browser cannot supply experiment attribution. Restore an
4318
+ // exposed first-run arm from server storage before tracking onboarding
4319
+ // events so the registry can replace, rather than trust, client tags.
4320
+ const isFirstRunOnboardingEvent = FIRST_RUN_ONBOARDING_EXPERIMENT_EVENT_NAMES.has(validation.name) && validation.properties?.flow === "first_run";
4309
4321
  // Best-effort — server `track()` swallows provider errors. We still
4310
4322
  // guard here so an unexpected throw can't surface to the browser.
4311
4323
  try {
4312
- track(validation.name, properties, {
4324
+ const browserSessionId = readBrowserSessionIdHeader(event);
4325
+ const trackingSource = {
4313
4326
  userId: userEmail,
4314
- authUserId: session.authUserId,
4315
- sessionId: readBrowserSessionIdHeader(event),
4327
+ ...(session.authUserId ? { authUserId: session.authUserId } : {}),
4328
+ ...(browserSessionId ? { sessionId: browserSessionId } : {}),
4316
4329
  telemetryOrigin: "client",
4317
- });
4330
+ };
4331
+ const trackClientEvent = () => track(validation.name, properties, trackingSource);
4332
+ if (isFirstRunOnboardingEvent) {
4333
+ await runWithRequestContext({
4334
+ userEmail,
4335
+ ...(session.authUserId
4336
+ ? { authUserId: session.authUserId }
4337
+ : {}),
4338
+ }, async () => {
4339
+ try {
4340
+ const { loadFirstRunBuilderCreditsV2Assignment } = await import("../onboarding/first-run-builder-credits-experiment.js");
4341
+ await loadFirstRunBuilderCreditsV2Assignment();
4342
+ }
4343
+ catch {
4344
+ console.error("[tracking] first-run onboarding assignment lookup failed", { eventName: validation.name });
4345
+ }
4346
+ trackClientEvent();
4347
+ });
4348
+ }
4349
+ else {
4350
+ trackClientEvent();
4351
+ }
4318
4352
  }
4319
4353
  catch {
4320
4354
  // best-effort
@@ -113,7 +113,7 @@ export { BUILDER_PUBLISH_MCP_RESOURCE, canAuthorizeBuilderApiRequest, hasBuilder
113
113
  export { createFusionAgentFeed, fusionStepToAgentChatEvents, type FusionAgentFeedSummary, } from "./fusion-agent-feed.js";
114
114
  export { BUILDER_ASSETS_WRITE_SCOPE, BUILDER_CONTENT_READ_SCOPE, BUILDER_CONTENT_WRITE_SCOPE, BUILDER_OAUTH_RESOURCE, BUILDER_OAUTH_SCOPE, type BuilderOAuthPermissionScope, } from "./builder-oauth.js";
115
115
  export { assertBuilderDesignSystemCodeIndexingAllowed, builderDesignSystemUrl, builderProjectBranchUrl, buildBuilderDesignSystemIndexFiles, collectBuilderDesignSystemGitHubFiles, createBuilderDesignSystemProxyFields, designSystemTierUpgradeUrl, fetchBuilderDesignSystemDecodeJobStatus, fetchBuilderDesignSystemDocs, fetchBuilderDesignSystemDocumentCount, fetchBuilderDesignSystemRecord, fetchBuilderDesignSystemTierLimit, getBuilderDesignSystemsBaseUrl, hydrateBuilderDesignSystemReference, indexBuilderDesignSystem, isBuilderDesignSystemReadyByCount, localBuilderDesignSystemId, mimeTypeForBuilderDesignSystemFilename, parseBuilderDesignSystemProxyReference, startBuilderDesignSystemIndex, startBuilderDesignSystemUpload, type BuildBuilderDesignSystemIndexFilesOptions, type BuilderDesignSystemCodeFileInput, type BuilderDesignSystemDecodeJobStatus, type BuilderDesignSystemDocsOptions, type BuilderDesignSystemDocument, type BuilderDesignSystemDocumentCountResult, type BuilderDesignSystemHydratedReference, type BuilderDesignSystemIndexFile, type BuilderDesignSystemIndexFromSourcesOptions, type BuilderDesignSystemIndexOptions, type BuilderDesignSystemIndexResult, type BuilderDesignSystemRecord, type BuilderDesignSystemStatus, type BuilderDesignSystemTierLimit, type BuilderDesignSystemGitHubFile, type BuilderDesignSystemGitHubFileCollection, type BuilderDesignSystemGitHubSource, type BuilderDesignSystemUploadAttachment, type BuilderDesignSystemUploadSlot, type BuilderDesignSystemProxyFields, type BuilderDesignSystemProxyFieldsOptions, type BuilderDesignSystemProxyReference, type BuilderDesignSystemSourceKind, } from "./builder-design-systems.js";
116
- export { cdnSafeOriginStatus, createBuilderProject, ensureBuilderProject, findBuilderProjectForRepo, getBuilderBranchProjectId, isBuilderBranchingEnabled, requestBuilderBrowserConnection, resolveBuilderBranchProjectId, resolveIsBuilderBranchingEnabled, normalizeBuilderAgentAttachments, runBuilderAgent, type BuilderAgentAttachment, type BuilderAgentUploadAttachment, type BuilderAgentUrlAttachment, type BuilderProjectResult, type RunBuilderAgentResult, } from "./builder-browser.js";
116
+ export { cdnSafeOriginStatus, createBuilderProject, ensureBuilderProject, findBuilderProjectForRepo, getBuilderBranchProjectId, isBuilderBranchingEnabled, registerBuilderBranchProject, requestBuilderBrowserConnection, resolveBuilderBranchProjectId, resolveBuilderHandoffProjectId, resolveIsBuilderBranchingEnabled, normalizeBuilderAgentAttachments, runBuilderAgent, type BuilderAgentAttachment, type BuilderAgentUploadAttachment, type BuilderAgentUrlAttachment, type BuilderProjectResult, type RunBuilderAgentResult, } from "./builder-browser.js";
117
117
  export { BuilderBranchError, getBuilderBranchStatus, sendBuilderBranchMessage, type BuilderBranchAgentState, type BuilderBranchErrorCode, type BuilderBranchOperation, type BuilderBranchPrStatus, type BuilderBranchRef, type BuilderBranchState, type BuilderBranchStatus, type GetBuilderBranchStatusOptions, type SendBuilderBranchMessageOptions, type SendBuilderBranchMessageResult, } from "./builder-branch.js";
118
118
  export { BuilderBranchFilesError, readBuilderBranchFiles, } from "./builder-branch-files.js";
119
119
  export { ensureFusionContainer, sendFusionBranchMessage, pushFusionBranch, reserveFusionHostingSlug, deployFusionProject, getFusionDeploys, getFusionBranchEditorUrl, getFusionHostingUrl, type FusionBranchRef, type EnsureFusionContainerResult, type SendFusionMessageResult, } from "./fusion-app.js";
@@ -106,7 +106,7 @@ export { BUILDER_PUBLISH_MCP_RESOURCE, canAuthorizeBuilderApiRequest, hasBuilder
106
106
  export { createFusionAgentFeed, fusionStepToAgentChatEvents, } from "./fusion-agent-feed.js";
107
107
  export { BUILDER_ASSETS_WRITE_SCOPE, BUILDER_CONTENT_READ_SCOPE, BUILDER_CONTENT_WRITE_SCOPE, BUILDER_OAUTH_RESOURCE, BUILDER_OAUTH_SCOPE, } from "./builder-oauth.js";
108
108
  export { assertBuilderDesignSystemCodeIndexingAllowed, builderDesignSystemUrl, builderProjectBranchUrl, buildBuilderDesignSystemIndexFiles, collectBuilderDesignSystemGitHubFiles, createBuilderDesignSystemProxyFields, designSystemTierUpgradeUrl, fetchBuilderDesignSystemDecodeJobStatus, fetchBuilderDesignSystemDocs, fetchBuilderDesignSystemDocumentCount, fetchBuilderDesignSystemRecord, fetchBuilderDesignSystemTierLimit, getBuilderDesignSystemsBaseUrl, hydrateBuilderDesignSystemReference, indexBuilderDesignSystem, isBuilderDesignSystemReadyByCount, localBuilderDesignSystemId, mimeTypeForBuilderDesignSystemFilename, parseBuilderDesignSystemProxyReference, startBuilderDesignSystemIndex, startBuilderDesignSystemUpload, } from "./builder-design-systems.js";
109
- export { cdnSafeOriginStatus, createBuilderProject, ensureBuilderProject, findBuilderProjectForRepo, getBuilderBranchProjectId, isBuilderBranchingEnabled, requestBuilderBrowserConnection, resolveBuilderBranchProjectId, resolveIsBuilderBranchingEnabled, normalizeBuilderAgentAttachments, runBuilderAgent, } from "./builder-browser.js";
109
+ export { cdnSafeOriginStatus, createBuilderProject, ensureBuilderProject, findBuilderProjectForRepo, getBuilderBranchProjectId, isBuilderBranchingEnabled, registerBuilderBranchProject, requestBuilderBrowserConnection, resolveBuilderBranchProjectId, resolveBuilderHandoffProjectId, resolveIsBuilderBranchingEnabled, normalizeBuilderAgentAttachments, runBuilderAgent, } from "./builder-browser.js";
110
110
  export { BuilderBranchError, getBuilderBranchStatus, sendBuilderBranchMessage, } from "./builder-branch.js";
111
111
  export { BuilderBranchFilesError, readBuilderBranchFiles, } from "./builder-branch-files.js";
112
112
  export { ensureFusionContainer, sendFusionBranchMessage, pushFusionBranch, reserveFusionHostingSlug, deployFusionProject, getFusionDeploys, getFusionBranchEditorUrl, getFusionHostingUrl, } from "./fusion-app.js";
@@ -64,6 +64,14 @@ export interface RequestRunContext {
64
64
  totalTools: number;
65
65
  resultNames: string[];
66
66
  }>;
67
+ /** Signup-time question-intake assignment loaded for this authenticated run. */
68
+ questionIntakeExperimentAssignment?: {
69
+ authUserId: string;
70
+ experimentId: string;
71
+ variantId: "control" | "no_questions";
72
+ };
73
+ /** Tools unavailable to the current agent run and its tool-search surface. */
74
+ excludedActionNames?: readonly string[];
67
75
  }
68
76
  export interface RequestContext {
69
77
  /**
@@ -17,8 +17,8 @@
17
17
  * typed JSON-in / JSON-out).
18
18
  */
19
19
  export declare function createTranscribeVoiceHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
20
- text?: undefined;
21
20
  error: string;
21
+ text?: undefined;
22
22
  } | {
23
23
  error?: undefined;
24
24
  text: string;
@@ -1,6 +1,7 @@
1
1
  export declare const FIRST_RUN_BUILDER_CREDITS_V2_EXPERIMENT_ID = "first_run_builder_credits_v2";
2
2
  export declare const FIRST_RUN_BUILDER_CREDITS_V2_FLAG_KEY = "clips-first-run-credits-v2";
3
3
  export declare const FIRST_RUN_BUILDER_CREDITS_V2_VARIANTS: readonly ["control", "credits"];
4
+ export declare const FIRST_RUN_ONBOARDING_EXPERIMENT_EVENT_NAMES: Set<string>;
4
5
  export type FirstRunBuilderCreditsV2Variant = (typeof FIRST_RUN_BUILDER_CREDITS_V2_VARIANTS)[number];
5
6
  export interface FirstRunBuilderCreditsV2Assignment {
6
7
  experiment_id: typeof FIRST_RUN_BUILDER_CREDITS_V2_EXPERIMENT_ID;
@@ -4,6 +4,25 @@ export const FIRST_RUN_BUILDER_CREDITS_V2_VARIANTS = [
4
4
  "control",
5
5
  "credits",
6
6
  ];
7
+ export const FIRST_RUN_ONBOARDING_EXPERIMENT_EVENT_NAMES = new Set([
8
+ "onboarding_app_entered",
9
+ "onboarding_started",
10
+ "onboarding_experiment_exposed",
11
+ "onboarding_step_viewed",
12
+ "onboarding_step_completed",
13
+ "onboarding_step_skipped",
14
+ "onboarding_method_clicked",
15
+ "onboarding_method_started",
16
+ "onboarding_method_outcome",
17
+ "onboarding_abandoned",
18
+ "onboarding_correlation_unavailable",
19
+ "onboarding_role_save_started",
20
+ "onboarding_more_info_opened",
21
+ "onboarding_role_option_selected",
22
+ "onboarding_dismissed",
23
+ "onboarding_reopened",
24
+ "onboarding_completed",
25
+ ]);
7
26
  /** A stable, account-scoped arm that is the same in the browser and on server events. */
8
27
  export function assignFirstRunBuilderCreditsV2(authUserId) {
9
28
  const userId = authUserId?.trim();
@@ -1,4 +1,4 @@
1
- export { track, identify, flushTracking, registerTrackingProvider, unregisterTrackingProvider, listTrackingProviders, type TrackingMeta, type TrackingSource, } from "./registry.js";
1
+ export { track, trackQuestionIntakeExposure, identify, flushTracking, registerTrackingProvider, unregisterTrackingProvider, listTrackingProviders, type TrackingMeta, type TrackingSource, } from "./registry.js";
2
2
  export { registerBuiltinProviders } from "./providers.js";
3
3
  export { readAnalyticsAnonymousId } from "../server/attribution.js";
4
4
  export { AGENT_NATIVE_ACTION_EVENTS, AGENT_NATIVE_LIFECYCLE_EVENTS, trackActionEvent, trackLifecycleEvent, type AgentNativeActionEventName, type AgentNativeLifecycleEventName, } from "./lifecycle.js";
@@ -1,4 +1,4 @@
1
- export { track, identify, flushTracking, registerTrackingProvider, unregisterTrackingProvider, listTrackingProviders, } from "./registry.js";
1
+ export { track, trackQuestionIntakeExposure, identify, flushTracking, registerTrackingProvider, unregisterTrackingProvider, listTrackingProviders, } from "./registry.js";
2
2
  export { registerBuiltinProviders } from "./providers.js";
3
3
  export { readAnalyticsAnonymousId } from "../server/attribution.js";
4
4
  export { AGENT_NATIVE_ACTION_EVENTS, AGENT_NATIVE_LIFECYCLE_EVENTS, trackActionEvent, trackLifecycleEvent, } from "./lifecycle.js";
@@ -1,4 +1,5 @@
1
1
  import type { ActionRunContext } from "../action.js";
2
+ import { type QuestionIntakeExperimentAssignment } from "../observability/question-intake-experiment.js";
2
3
  import { type TrackingEventOrigin } from "../observability/tracing.js";
3
4
  import type { TrackingProvider } from "./types.js";
4
5
  export { isQaTestEmail } from "../shared/qa-test-email.js";
@@ -17,5 +18,11 @@ export interface TrackingMeta {
17
18
  }
18
19
  export type TrackingSource = TrackingMeta | (ActionRunContext & Pick<TrackingMeta, "sessionId">);
19
20
  export declare function track(name: string, properties?: Record<string, unknown>, source?: TrackingSource): void;
21
+ export declare function trackQuestionIntakeExposure(assignment: QuestionIntakeExperimentAssignment, context: {
22
+ appId: string;
23
+ threadId?: string;
24
+ turnId: string;
25
+ userId?: string;
26
+ }): void;
20
27
  export declare function identify(userId: string, traits?: Record<string, unknown>): void;
21
28
  export declare function flushTracking(): Promise<void[]>;
@@ -1,11 +1,13 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { queueTrackingEvent, } from "../observability/tracing.js";
2
+ import { getAppConfig } from "../app-config/index.js";
3
+ import { questionIntakeExposureProperties, resolveQuestionIntakeExperimentAssignment, } from "../observability/question-intake-experiment.js";
4
+ import { queueTrackingEvent, registerTrackingWork, } from "../observability/tracing.js";
3
5
  import { resolveDeployEnvironment } from "../server/deploy-environment.js";
4
- import { getRequestContext } from "../server/request-context.js";
6
+ import { getRequestContext, getRequestRunContext, } from "../server/request-context.js";
5
7
  import { isTestIdentity } from "../server/test-identity.js";
6
8
  import { canonicalTrackingEvent, legacyLifecycleEvent, TRACKING_EVENT_ALIAS_ID_PROPERTY, withCanonicalTrackingProperties, } from "../shared/analytics-events.js";
7
9
  import { ANALYTICS_CLIENT_PLATFORM_PROPERTY } from "../shared/analytics-platform.js";
8
- import { assignFirstRunBuilderCreditsV2 } from "../shared/first-run-builder-credits-experiment.js";
10
+ import { assignFirstRunBuilderCreditsV2, FIRST_RUN_ONBOARDING_EXPERIMENT_EVENT_NAMES, } from "../shared/first-run-builder-credits-experiment.js";
9
11
  export { isQaTestEmail } from "../shared/qa-test-email.js";
10
12
  const REGISTRY_KEY = Symbol.for("@agent-native/core/tracking.registry");
11
13
  const FIRST_RUN_EXPERIMENT_EVENT_NAMES = new Set([
@@ -98,6 +100,68 @@ function resolveTrackingSource(source) {
98
100
  };
99
101
  }
100
102
  export function track(name, properties, source) {
103
+ // raw-sql-ok: tracking persistence uses bound arguments for resolved identity values.
104
+ const resolvedSource = resolveTrackingSource(source);
105
+ // raw-sql-ok: resolved IDs remain bound event values at the tracking store boundary.
106
+ const { authUserId, userId } = resolvedSource;
107
+ if (getRequestContext()?.isSyntheticTraffic === true)
108
+ return;
109
+ const testIdentity = testIdentityOf(userId, properties);
110
+ if (testIdentity && name !== "$exception")
111
+ return;
112
+ const config = getAppConfig().agent.questionIntake;
113
+ const mayAttributeClientEvent = resolvedSource.telemetryOrigin !== "client" ||
114
+ config?.clientTrackedEventNames.includes(name) === true;
115
+ if (config?.enabled &&
116
+ !config.disabled &&
117
+ config.trackedEventNames.includes(name) &&
118
+ authUserId &&
119
+ mayAttributeClientEvent) {
120
+ const experimentProperties = { ...(properties ?? {}) };
121
+ delete experimentProperties.experiment_id;
122
+ delete experimentProperties.experiment_variant;
123
+ const requestAssignment = getRequestRunContext()?.questionIntakeExperimentAssignment;
124
+ if (requestAssignment?.authUserId === authUserId &&
125
+ requestAssignment.experimentId === config.experimentId) {
126
+ emitTrackedEvent(name, experimentProperties, source, requestAssignment);
127
+ return;
128
+ }
129
+ const pending = resolveQuestionIntakeExperimentAssignment(config, authUserId)
130
+ .then((assignment) => emitTrackedEvent(name, experimentProperties, source, assignment ?? undefined), () => {
131
+ console.error("[tracking] question-intake assignment lookup failed", {
132
+ experimentId: config.experimentId,
133
+ eventName: name,
134
+ });
135
+ emitTrackedEvent(name, experimentProperties, source);
136
+ })
137
+ .catch(() => {
138
+ console.error("[tracking] asynchronous event delivery failed");
139
+ });
140
+ registerTrackingWork(pending, getRequestContext()?.trackingScope);
141
+ const waitUntil = getRequestRunContext()?.waitUntil;
142
+ if (waitUntil) {
143
+ try {
144
+ waitUntil(pending);
145
+ return;
146
+ }
147
+ catch {
148
+ console.error("[tracking] request waitUntil rejected tracked event");
149
+ }
150
+ }
151
+ void pending.catch(() => {
152
+ console.error("[tracking] tracked event failed outside waitUntil");
153
+ });
154
+ return;
155
+ }
156
+ emitTrackedEvent(name, properties, source);
157
+ }
158
+ export function trackQuestionIntakeExposure(assignment, context) {
159
+ track("agent_experiment_exposed", questionIntakeExposureProperties(assignment, context), {
160
+ ...(context.userId ? { userId: context.userId } : {}),
161
+ authUserId: assignment.authUserId,
162
+ });
163
+ }
164
+ function emitTrackedEvent(name, properties, source, questionIntakeAssignment) {
101
165
  const { userId, authUserId, anonymousId, sessionId, occurredAt, telemetryOrigin, } = resolveTrackingSource(source);
102
166
  if (getRequestContext()?.isSyntheticTraffic === true)
103
167
  return;
@@ -109,14 +173,30 @@ export function track(name, properties, source) {
109
173
  const safeProperties = { ...(properties ?? {}) };
110
174
  delete safeProperties.auth_user_id;
111
175
  delete safeProperties.authUserId;
176
+ delete safeProperties.telemetry_origin;
177
+ delete safeProperties.telemetryOrigin;
178
+ if (telemetryOrigin === "client") {
179
+ delete safeProperties.experiment_id;
180
+ delete safeProperties.experiment_variant;
181
+ }
112
182
  if (authUserId)
113
183
  safeProperties.auth_user_id = authUserId;
114
- const firstRunExperiment = authUserId && FIRST_RUN_EXPERIMENT_EVENT_NAMES.has(name)
184
+ const firstRunExperiment = authUserId &&
185
+ (FIRST_RUN_EXPERIMENT_EVENT_NAMES.has(name) ||
186
+ (FIRST_RUN_ONBOARDING_EXPERIMENT_EVENT_NAMES.has(name) &&
187
+ safeProperties.flow === "first_run"))
115
188
  ? requestFirstRunExperiment(authUserId)
116
189
  : null;
117
190
  const trackedProperties = withCanonicalTrackingProperties({
118
191
  ...safeProperties,
192
+ telemetry_origin: telemetryOrigin,
119
193
  ...(firstRunExperiment ?? {}),
194
+ ...(questionIntakeAssignment
195
+ ? {
196
+ experiment_id: questionIntakeAssignment.experimentId,
197
+ experiment_variant: questionIntakeAssignment.variantId,
198
+ }
199
+ : {}),
120
200
  ...(sessionId ? { session_id: sessionId } : {}),
121
201
  ...(userId ? { user_id: userId } : {}),
122
202
  ...(actionContext?.userEmail
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.222.0",
3
+ "version": "0.222.1-nightly-20261029092708",
4
4
  "description": "The agentic application framework for building autonomous agents with intuitive UIs",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -742,8 +742,8 @@
742
742
  "yaml": "^2.9.0",
743
743
  "yjs": "^13.6.33",
744
744
  "zod": "^4.3.6",
745
- "@agent-native/agentkit": "^0.222.0",
746
- "@agent-native/recap-cli": "^0.5.91"
745
+ "@agent-native/recap-cli": "^0.5.91",
746
+ "@agent-native/agentkit": "^0.222.1-nightly-20261029092708"
747
747
  },
748
748
  "devDependencies": {
749
749
  "@ai-sdk/anthropic": "^3.0.71",
@@ -814,7 +814,7 @@
814
814
  "xlsx": "^0.18.5"
815
815
  },
816
816
  "peerDependencies": {
817
- "@agent-native/core-corpus": ">=0.196.0",
817
+ "@agent-native/core-corpus": "0.222.1-nightly-20261029092708",
818
818
  "@ai-sdk/anthropic": ">=3",
819
819
  "@ai-sdk/cohere": ">=3",
820
820
  "@ai-sdk/google": ">=3",