@agent-native/core 0.98.3 → 0.98.5

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 (230) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +29 -0
  3. package/corpus/core/docs/content/durable-background-runs.mdx +37 -0
  4. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +2 -0
  5. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +2 -0
  6. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +2 -0
  7. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +4 -2
  8. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +2 -0
  9. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +2 -0
  10. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +2 -0
  11. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +2 -0
  12. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +2 -0
  13. package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  14. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +2 -0
  15. package/corpus/core/docs/content/tracking.mdx +2 -0
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/agent/durable-background.ts +16 -16
  18. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +25 -8
  19. package/corpus/core/src/agent/engine/anthropic-engine.ts +17 -3
  20. package/corpus/core/src/agent/engine/output-tokens.ts +6 -6
  21. package/corpus/core/src/agent/production-agent.ts +200 -27
  22. package/corpus/core/src/agent/run-manager.ts +81 -1
  23. package/corpus/core/src/agent/run-store.ts +301 -41
  24. package/corpus/core/src/client/AgentPanel.tsx +6 -2
  25. package/corpus/core/src/client/AssistantChat.tsx +364 -69
  26. package/corpus/core/src/client/agent-chat-adapter.ts +169 -1
  27. package/corpus/core/src/client/analytics.ts +12 -0
  28. package/corpus/core/src/client/chat/message-components.tsx +3 -0
  29. package/corpus/core/src/client/chat/tool-call-display.tsx +20 -36
  30. package/corpus/core/src/client/conversation/use-near-bottom-autoscroll.ts +7 -0
  31. package/corpus/core/src/client/extensions/AgentNativeExtensionFrame.tsx +2 -0
  32. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +2 -0
  33. package/corpus/core/src/client/extensions/ExtensionEditor.tsx +9 -2
  34. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +2 -0
  35. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +2 -0
  36. package/corpus/core/src/client/extensions/portable-extension.ts +2 -0
  37. package/corpus/core/src/client/session-replay.ts +971 -53
  38. package/corpus/core/src/client/settings/DemoModeSection.tsx +3 -3
  39. package/corpus/core/src/client/sse-event-processor.ts +43 -1
  40. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +2 -2
  41. package/corpus/core/src/demo/config.ts +6 -6
  42. package/corpus/core/src/demo/fetch-interceptor.ts +34 -2
  43. package/corpus/core/src/demo/redact.ts +71 -158
  44. package/corpus/core/src/extensions/html-shell.ts +3 -0
  45. package/corpus/core/src/extensions/session-replay-iframe.ts +131 -0
  46. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -20
  47. package/corpus/core/src/session-replay-iframe-protocol.ts +58 -0
  48. package/corpus/core/src/shared/reasoning-effort.ts +35 -0
  49. package/corpus/core/src/styles/agent-conversation.css +26 -0
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  51. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +67 -16
  52. package/corpus/templates/analytics/AGENTS.md +12 -0
  53. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -0
  54. package/corpus/templates/analytics/actions/get-session-replay-events.ts +1 -0
  55. package/corpus/templates/analytics/actions/get-session-replay-summary.ts +1 -0
  56. package/corpus/templates/analytics/actions/list-error-issues.ts +1 -0
  57. package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -0
  58. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +2 -1
  59. package/corpus/templates/analytics/app/global.css +6 -64
  60. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +41 -4
  61. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +143 -121
  62. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +34 -12
  63. package/corpus/templates/analytics/changelog/2026-07-12-analytics-chat-retries-before-showing-a-generic-no-data-mess.md +6 -0
  64. package/corpus/templates/analytics/changelog/2026-07-12-analytics-sessions-search-no-longer-loses-fast-keystrokes-an.md +6 -0
  65. package/corpus/templates/analytics/changelog/2026-07-12-chart-selection-respects-chat-state.md +6 -0
  66. package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-anonymizes-error-reporting-emails.md +6 -0
  67. package/corpus/templates/analytics/changelog/2026-07-12-fixed-session-replays-that-appeared-ultra-wide-hid-recorded-.md +6 -0
  68. package/corpus/templates/analytics/changelog/2026-07-12-session-replays-load-faster-in-demo-mode-while-visitor-email.md +6 -0
  69. package/corpus/templates/analytics/changelog/2026-07-12-session-replays-show-iframe-content.md +6 -0
  70. package/corpus/templates/analytics/netlify.toml +0 -3
  71. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +14 -0
  72. package/corpus/templates/analytics/server/lib/error-capture.ts +59 -2
  73. package/corpus/templates/analytics/server/lib/real-data-actions.ts +24 -0
  74. package/corpus/templates/analytics/server/lib/session-replay.ts +2 -9
  75. package/corpus/templates/analytics/server/plugins/agent-chat.ts +39 -6
  76. package/corpus/templates/assets/app/global.css +1 -1
  77. package/corpus/templates/brain/app/global.css +2 -2
  78. package/corpus/templates/brain/changelog/2026-07-12-fix-long-response-progress.md +6 -0
  79. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +11 -2
  80. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +14 -2
  81. package/corpus/templates/calendar/changelog/2026-07-12-calendar-responses-can-now-be-saved-with-command-enter-or-ct.md +6 -0
  82. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +1 -1
  83. package/corpus/templates/forms/app/components/ThemeToggle.tsx +22 -6
  84. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +5 -5
  85. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +3 -3
  86. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +16 -16
  87. package/corpus/templates/forms/app/global.css +110 -5
  88. package/corpus/templates/forms/app/pages/AskPage.tsx +3 -3
  89. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +134 -52
  90. package/corpus/templates/forms/app/pages/FormFillPage.tsx +44 -11
  91. package/corpus/templates/forms/app/pages/FormsListPage.tsx +42 -24
  92. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +28 -15
  93. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +38 -15
  94. package/corpus/templates/forms/app/routes/_app.settings.tsx +1 -1
  95. package/corpus/templates/forms/changelog/2026-07-12-form-builder-surfaces-are-calmer-fields-stay-stable-on-hover.md +6 -0
  96. package/corpus/templates/forms/changelog/2026-07-12-smoother-more-tactile-controls-throughout-animated-icon-and-.md +6 -0
  97. package/corpus/templates/mail/app/components/email/EmailThread.tsx +21 -13
  98. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +18 -0
  99. package/dist/agent/durable-background.d.ts +10 -10
  100. package/dist/agent/durable-background.d.ts.map +1 -1
  101. package/dist/agent/durable-background.js +16 -16
  102. package/dist/agent/durable-background.js.map +1 -1
  103. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  104. package/dist/agent/engine/ai-sdk-engine.js +19 -8
  105. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  106. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  107. package/dist/agent/engine/anthropic-engine.js +11 -3
  108. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  109. package/dist/agent/engine/output-tokens.js +6 -6
  110. package/dist/agent/engine/output-tokens.js.map +1 -1
  111. package/dist/agent/production-agent.d.ts +52 -0
  112. package/dist/agent/production-agent.d.ts.map +1 -1
  113. package/dist/agent/production-agent.js +154 -26
  114. package/dist/agent/production-agent.js.map +1 -1
  115. package/dist/agent/run-manager.d.ts +9 -0
  116. package/dist/agent/run-manager.d.ts.map +1 -1
  117. package/dist/agent/run-manager.js +71 -1
  118. package/dist/agent/run-manager.js.map +1 -1
  119. package/dist/agent/run-store.d.ts +9 -0
  120. package/dist/agent/run-store.d.ts.map +1 -1
  121. package/dist/agent/run-store.js +243 -48
  122. package/dist/agent/run-store.js.map +1 -1
  123. package/dist/client/AgentPanel.d.ts.map +1 -1
  124. package/dist/client/AgentPanel.js +6 -2
  125. package/dist/client/AgentPanel.js.map +1 -1
  126. package/dist/client/AssistantChat.d.ts +21 -0
  127. package/dist/client/AssistantChat.d.ts.map +1 -1
  128. package/dist/client/AssistantChat.js +298 -67
  129. package/dist/client/AssistantChat.js.map +1 -1
  130. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  131. package/dist/client/agent-chat-adapter.js +146 -1
  132. package/dist/client/agent-chat-adapter.js.map +1 -1
  133. package/dist/client/analytics.d.ts.map +1 -1
  134. package/dist/client/analytics.js +11 -0
  135. package/dist/client/analytics.js.map +1 -1
  136. package/dist/client/chat/message-components.d.ts.map +1 -1
  137. package/dist/client/chat/message-components.js +2 -1
  138. package/dist/client/chat/message-components.js.map +1 -1
  139. package/dist/client/chat/tool-call-display.d.ts +3 -1
  140. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  141. package/dist/client/chat/tool-call-display.js +13 -37
  142. package/dist/client/chat/tool-call-display.js.map +1 -1
  143. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -0
  144. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  145. package/dist/client/conversation/use-near-bottom-autoscroll.js +6 -0
  146. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  147. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  148. package/dist/client/extensions/AgentNativeExtensionFrame.js +2 -1
  149. package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -1
  150. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  151. package/dist/client/extensions/EmbeddedExtension.js +2 -1
  152. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  153. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  154. package/dist/client/extensions/ExtensionEditor.js +5 -2
  155. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  156. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  157. package/dist/client/extensions/ExtensionViewer.js +2 -1
  158. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  159. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  160. package/dist/client/extensions/InlineExtensionFrame.js +2 -1
  161. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  162. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  163. package/dist/client/extensions/portable-extension.js +2 -0
  164. package/dist/client/extensions/portable-extension.js.map +1 -1
  165. package/dist/client/session-replay.d.ts +12 -3
  166. package/dist/client/session-replay.d.ts.map +1 -1
  167. package/dist/client/session-replay.js +793 -49
  168. package/dist/client/session-replay.js.map +1 -1
  169. package/dist/client/settings/DemoModeSection.js +1 -1
  170. package/dist/client/settings/DemoModeSection.js.map +1 -1
  171. package/dist/client/sse-event-processor.d.ts +5 -0
  172. package/dist/client/sse-event-processor.d.ts.map +1 -1
  173. package/dist/client/sse-event-processor.js +37 -1
  174. package/dist/client/sse-event-processor.js.map +1 -1
  175. package/dist/demo/actions/toggle-demo-mode.js +2 -2
  176. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  177. package/dist/demo/config.js +6 -6
  178. package/dist/demo/config.js.map +1 -1
  179. package/dist/demo/fetch-interceptor.d.ts +1 -0
  180. package/dist/demo/fetch-interceptor.d.ts.map +1 -1
  181. package/dist/demo/fetch-interceptor.js +28 -2
  182. package/dist/demo/fetch-interceptor.js.map +1 -1
  183. package/dist/demo/redact.d.ts +14 -7
  184. package/dist/demo/redact.d.ts.map +1 -1
  185. package/dist/demo/redact.js +27 -155
  186. package/dist/demo/redact.js.map +1 -1
  187. package/dist/extensions/html-shell.d.ts.map +1 -1
  188. package/dist/extensions/html-shell.js +2 -0
  189. package/dist/extensions/html-shell.js.map +1 -1
  190. package/dist/extensions/session-replay-iframe.d.ts +10 -0
  191. package/dist/extensions/session-replay-iframe.d.ts.map +1 -0
  192. package/dist/extensions/session-replay-iframe.js +121 -0
  193. package/dist/extensions/session-replay-iframe.js.map +1 -0
  194. package/dist/notifications/routes.d.ts +1 -1
  195. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  196. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  197. package/dist/scripts/agent-engines/list-agent-engines.js +1 -19
  198. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  199. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  200. package/dist/server/transcribe-voice.d.ts +1 -1
  201. package/dist/session-replay-iframe-protocol.d.ts +36 -0
  202. package/dist/session-replay-iframe-protocol.d.ts.map +1 -0
  203. package/dist/session-replay-iframe-protocol.js +24 -0
  204. package/dist/session-replay-iframe-protocol.js.map +1 -0
  205. package/dist/shared/reasoning-effort.d.ts +11 -0
  206. package/dist/shared/reasoning-effort.d.ts.map +1 -1
  207. package/dist/shared/reasoning-effort.js +36 -0
  208. package/dist/shared/reasoning-effort.js.map +1 -1
  209. package/dist/styles/agent-conversation.css +26 -0
  210. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  211. package/docs/content/durable-background-runs.mdx +37 -0
  212. package/docs/content/locales/ar-SA/tracking.mdx +2 -0
  213. package/docs/content/locales/de-DE/tracking.mdx +2 -0
  214. package/docs/content/locales/es-ES/tracking.mdx +2 -0
  215. package/docs/content/locales/fr-FR/tracking.mdx +4 -2
  216. package/docs/content/locales/hi-IN/tracking.mdx +2 -0
  217. package/docs/content/locales/ja-JP/tracking.mdx +2 -0
  218. package/docs/content/locales/ko-KR/tracking.mdx +2 -0
  219. package/docs/content/locales/pt-BR/tracking.mdx +2 -0
  220. package/docs/content/locales/zh-CN/tracking.mdx +2 -0
  221. package/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  222. package/docs/content/locales/zh-TW/tracking.mdx +2 -0
  223. package/docs/content/tracking.mdx +2 -0
  224. package/package.json +2 -2
  225. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  226. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  227. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  228. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  229. package/dist/observability/hosted-model-experiment.js +0 -90
  230. package/dist/observability/hosted-model-experiment.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.98.3",
3
+ "version": "0.98.5",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -333,7 +333,7 @@
333
333
  "y-protocols": "^1.0.7",
334
334
  "yjs": "^13.6.31",
335
335
  "zod": "^4.3.6",
336
- "@agent-native/toolkit": "^0.4.8"
336
+ "@agent-native/toolkit": "^0.4.9"
337
337
  },
338
338
  "devDependencies": {
339
339
  "@ai-sdk/anthropic": "^3.0.71",
@@ -158,21 +158,6 @@ The agent loop reads active experiments via `resolveActiveExperimentConfig()` an
158
158
 
159
159
  Compute results with `POST /_agent-native/observability/experiments/:id/results`.
160
160
 
161
- #### First-party hosted default-model rollout
162
-
163
- First-party apps on `agent-native.com` automatically run the July 2026
164
- default-model experiment for authenticated users on the Builder engine:
165
-
166
- - 80% `claude-sonnet-5`
167
- - 20% `gpt-5-6-luna`
168
- - Assignment is sticky by normalized user email and shared across templates.
169
- - The rollout applies only when the user, app, and deployment have not selected
170
- a model. Explicit model choices and BYO provider engines always win.
171
- - Set `AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT=off` for an emergency rollback, or
172
- `true` to exercise the rollout on a non-first-party preview.
173
- - `$ai_generation` tracking includes `experiment_id`,
174
- `experiment_variant`, and `model_selection_source` for central analysis.
175
-
176
161
  In production, experiment management routes require the caller's email in the
177
162
  comma-separated `AGENT_NATIVE_EXPERIMENT_ADMIN_EMAILS` allowlist. This gate is
178
163
  separate from normal app/org admin roles because an experiment affects every
@@ -1,118 +0,0 @@
1
- export const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID =
2
- "hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07";
3
-
4
- export const HOSTED_DEFAULT_MODEL_CONTROL = {
5
- id: "sonnet-5",
6
- model: "claude-sonnet-5",
7
- weight: 80,
8
- } as const;
9
-
10
- export const HOSTED_DEFAULT_MODEL_TREATMENT = {
11
- id: "gpt-5-6-luna",
12
- model: "gpt-5-6-luna",
13
- weight: 20,
14
- } as const;
15
-
16
- export interface HostedDefaultModelExperimentAssignment {
17
- experimentId: string;
18
- variantId: string;
19
- }
20
-
21
- export interface HostedDefaultModelExperimentResolution {
22
- model: string;
23
- assignment: HostedDefaultModelExperimentAssignment;
24
- }
25
-
26
- type HostedExperimentEnv = Record<string, string | undefined>;
27
-
28
- const FIRST_PARTY_HOST_SUFFIX = ".agent-native.com";
29
- const ENABLED_VALUES = new Set(["1", "true", "on", "yes"]);
30
- const DISABLED_VALUES = new Set(["0", "false", "off", "no"]);
31
-
32
- function hostnameFromUrl(value: string | undefined): string | null {
33
- const trimmed = value?.trim();
34
- if (!trimmed) return null;
35
- try {
36
- const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
37
- ? new URL(trimmed)
38
- : new URL(`https://${trimmed}`);
39
- return url.hostname.toLowerCase();
40
- } catch {
41
- return null;
42
- }
43
- }
44
-
45
- /**
46
- * The rollout is automatic only on first-party hosted app domains. Operators
47
- * can explicitly enable or disable it for preview and emergency rollback.
48
- */
49
- export function isHostedDefaultModelExperimentEnabled(
50
- env: HostedExperimentEnv = process.env,
51
- ): boolean {
52
- const override =
53
- env.AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT?.trim().toLowerCase();
54
- if (override && DISABLED_VALUES.has(override)) return false;
55
- if (override && ENABLED_VALUES.has(override)) return true;
56
-
57
- const hostnames = [
58
- env.APP_URL,
59
- env.BETTER_AUTH_URL,
60
- env.URL,
61
- env.DEPLOY_URL,
62
- env.VERCEL_PROJECT_PRODUCTION_URL,
63
- env.VERCEL_URL,
64
- ]
65
- .map(hostnameFromUrl)
66
- .filter((hostname): hostname is string => Boolean(hostname));
67
-
68
- return hostnames.some(
69
- (hostname) =>
70
- hostname === "agent-native.com" ||
71
- hostname.endsWith(FIRST_PARTY_HOST_SUFFIX),
72
- );
73
- }
74
-
75
- /**
76
- * Stable cross-app bucket: the same authenticated user receives the same
77
- * variant in every hosted template for the life of this experiment id.
78
- */
79
- export function hostedDefaultModelExperimentBucket(userId: string): number {
80
- const input = `${HOSTED_DEFAULT_MODEL_EXPERIMENT_ID}:${userId.trim().toLowerCase()}`;
81
- let hash = 0x811c9dc5;
82
- for (let index = 0; index < input.length; index++) {
83
- hash ^= input.charCodeAt(index);
84
- hash = Math.imul(hash, 0x01000193);
85
- }
86
- return (hash >>> 0) % 100;
87
- }
88
-
89
- export function resolveHostedDefaultModelExperiment(args: {
90
- userId: string | null | undefined;
91
- engineName: string;
92
- isDefaultModelSelection: boolean;
93
- supportedModels?: readonly string[];
94
- env?: HostedExperimentEnv;
95
- }): HostedDefaultModelExperimentResolution | null {
96
- const userId = args.userId?.trim();
97
- if (!userId) return null;
98
- if (args.engineName !== "builder") return null;
99
- if (!args.isDefaultModelSelection) return null;
100
- if (!isHostedDefaultModelExperimentEnabled(args.env)) return null;
101
-
102
- const variant =
103
- hostedDefaultModelExperimentBucket(userId) <
104
- HOSTED_DEFAULT_MODEL_TREATMENT.weight
105
- ? HOSTED_DEFAULT_MODEL_TREATMENT
106
- : HOSTED_DEFAULT_MODEL_CONTROL;
107
- if (args.supportedModels && !args.supportedModels.includes(variant.model)) {
108
- return null;
109
- }
110
-
111
- return {
112
- model: variant.model,
113
- assignment: {
114
- experimentId: HOSTED_DEFAULT_MODEL_EXPERIMENT_ID,
115
- variantId: variant.id,
116
- },
117
- };
118
- }
@@ -1,39 +0,0 @@
1
- export declare const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID = "hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07";
2
- export declare const HOSTED_DEFAULT_MODEL_CONTROL: {
3
- readonly id: "sonnet-5";
4
- readonly model: "claude-sonnet-5";
5
- readonly weight: 80;
6
- };
7
- export declare const HOSTED_DEFAULT_MODEL_TREATMENT: {
8
- readonly id: "gpt-5-6-luna";
9
- readonly model: "gpt-5-6-luna";
10
- readonly weight: 20;
11
- };
12
- export interface HostedDefaultModelExperimentAssignment {
13
- experimentId: string;
14
- variantId: string;
15
- }
16
- export interface HostedDefaultModelExperimentResolution {
17
- model: string;
18
- assignment: HostedDefaultModelExperimentAssignment;
19
- }
20
- type HostedExperimentEnv = Record<string, string | undefined>;
21
- /**
22
- * The rollout is automatic only on first-party hosted app domains. Operators
23
- * can explicitly enable or disable it for preview and emergency rollback.
24
- */
25
- export declare function isHostedDefaultModelExperimentEnabled(env?: HostedExperimentEnv): boolean;
26
- /**
27
- * Stable cross-app bucket: the same authenticated user receives the same
28
- * variant in every hosted template for the life of this experiment id.
29
- */
30
- export declare function hostedDefaultModelExperimentBucket(userId: string): number;
31
- export declare function resolveHostedDefaultModelExperiment(args: {
32
- userId: string | null | undefined;
33
- engineName: string;
34
- isDefaultModelSelection: boolean;
35
- supportedModels?: readonly string[];
36
- env?: HostedExperimentEnv;
37
- }): HostedDefaultModelExperimentResolution | null;
38
- export {};
39
- //# sourceMappingURL=hosted-model-experiment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hosted-model-experiment.d.ts","sourceRoot":"","sources":["../../src/observability/hosted-model-experiment.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kCAAkC,0DACU,CAAC;AAE1D,eAAO,MAAM,4BAA4B;aACvC,EAAE,EAAE,UAAU;aACd,KAAK,EAAE,iBAAiB;aACxB,MAAM,EAAE,EAAE;CACF,CAAC;AAEX,eAAO,MAAM,8BAA8B;aACzC,EAAE,EAAE,cAAc;aAClB,KAAK,EAAE,cAAc;aACrB,MAAM,EAAE,EAAE;CACF,CAAC;AAEX,MAAM,WAAW,sCAAsC;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sCAAsC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,sCAAsC,CAAC;CACpD;AAED,KAAK,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAmB9D;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,GAAG,GAAE,mBAAiC,GACrC,OAAO,CAsBT;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED,wBAAgB,mCAAmC,CAAC,IAAI,EAAE;IACxD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,OAAO,CAAC;IACjC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B,GAAG,sCAAsC,GAAG,IAAI,CAuBhD"}
@@ -1,90 +0,0 @@
1
- export const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID = "hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07";
2
- export const HOSTED_DEFAULT_MODEL_CONTROL = {
3
- id: "sonnet-5",
4
- model: "claude-sonnet-5",
5
- weight: 80,
6
- };
7
- export const HOSTED_DEFAULT_MODEL_TREATMENT = {
8
- id: "gpt-5-6-luna",
9
- model: "gpt-5-6-luna",
10
- weight: 20,
11
- };
12
- const FIRST_PARTY_HOST_SUFFIX = ".agent-native.com";
13
- const ENABLED_VALUES = new Set(["1", "true", "on", "yes"]);
14
- const DISABLED_VALUES = new Set(["0", "false", "off", "no"]);
15
- function hostnameFromUrl(value) {
16
- const trimmed = value?.trim();
17
- if (!trimmed)
18
- return null;
19
- try {
20
- const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
21
- ? new URL(trimmed)
22
- : new URL(`https://${trimmed}`);
23
- return url.hostname.toLowerCase();
24
- }
25
- catch {
26
- return null;
27
- }
28
- }
29
- /**
30
- * The rollout is automatic only on first-party hosted app domains. Operators
31
- * can explicitly enable or disable it for preview and emergency rollback.
32
- */
33
- export function isHostedDefaultModelExperimentEnabled(env = process.env) {
34
- const override = env.AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT?.trim().toLowerCase();
35
- if (override && DISABLED_VALUES.has(override))
36
- return false;
37
- if (override && ENABLED_VALUES.has(override))
38
- return true;
39
- const hostnames = [
40
- env.APP_URL,
41
- env.BETTER_AUTH_URL,
42
- env.URL,
43
- env.DEPLOY_URL,
44
- env.VERCEL_PROJECT_PRODUCTION_URL,
45
- env.VERCEL_URL,
46
- ]
47
- .map(hostnameFromUrl)
48
- .filter((hostname) => Boolean(hostname));
49
- return hostnames.some((hostname) => hostname === "agent-native.com" ||
50
- hostname.endsWith(FIRST_PARTY_HOST_SUFFIX));
51
- }
52
- /**
53
- * Stable cross-app bucket: the same authenticated user receives the same
54
- * variant in every hosted template for the life of this experiment id.
55
- */
56
- export function hostedDefaultModelExperimentBucket(userId) {
57
- const input = `${HOSTED_DEFAULT_MODEL_EXPERIMENT_ID}:${userId.trim().toLowerCase()}`;
58
- let hash = 0x811c9dc5;
59
- for (let index = 0; index < input.length; index++) {
60
- hash ^= input.charCodeAt(index);
61
- hash = Math.imul(hash, 0x01000193);
62
- }
63
- return (hash >>> 0) % 100;
64
- }
65
- export function resolveHostedDefaultModelExperiment(args) {
66
- const userId = args.userId?.trim();
67
- if (!userId)
68
- return null;
69
- if (args.engineName !== "builder")
70
- return null;
71
- if (!args.isDefaultModelSelection)
72
- return null;
73
- if (!isHostedDefaultModelExperimentEnabled(args.env))
74
- return null;
75
- const variant = hostedDefaultModelExperimentBucket(userId) <
76
- HOSTED_DEFAULT_MODEL_TREATMENT.weight
77
- ? HOSTED_DEFAULT_MODEL_TREATMENT
78
- : HOSTED_DEFAULT_MODEL_CONTROL;
79
- if (args.supportedModels && !args.supportedModels.includes(variant.model)) {
80
- return null;
81
- }
82
- return {
83
- model: variant.model,
84
- assignment: {
85
- experimentId: HOSTED_DEFAULT_MODEL_EXPERIMENT_ID,
86
- variantId: variant.id,
87
- },
88
- };
89
- }
90
- //# sourceMappingURL=hosted-model-experiment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hosted-model-experiment.js","sourceRoot":"","sources":["../../src/observability/hosted-model-experiment.ts"],"names":[],"mappings":"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","sourcesContent":["export const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID =\n \"hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07\";\n\nexport const HOSTED_DEFAULT_MODEL_CONTROL = {\n id: \"sonnet-5\",\n model: \"claude-sonnet-5\",\n weight: 80,\n} as const;\n\nexport const HOSTED_DEFAULT_MODEL_TREATMENT = {\n id: \"gpt-5-6-luna\",\n model: \"gpt-5-6-luna\",\n weight: 20,\n} as const;\n\nexport interface HostedDefaultModelExperimentAssignment {\n experimentId: string;\n variantId: string;\n}\n\nexport interface HostedDefaultModelExperimentResolution {\n model: string;\n assignment: HostedDefaultModelExperimentAssignment;\n}\n\ntype HostedExperimentEnv = Record<string, string | undefined>;\n\nconst FIRST_PARTY_HOST_SUFFIX = \".agent-native.com\";\nconst ENABLED_VALUES = new Set([\"1\", \"true\", \"on\", \"yes\"]);\nconst DISABLED_VALUES = new Set([\"0\", \"false\", \"off\", \"no\"]);\n\nfunction hostnameFromUrl(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) return null;\n try {\n const url = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)\n ? new URL(trimmed)\n : new URL(`https://${trimmed}`);\n return url.hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\n/**\n * The rollout is automatic only on first-party hosted app domains. Operators\n * can explicitly enable or disable it for preview and emergency rollback.\n */\nexport function isHostedDefaultModelExperimentEnabled(\n env: HostedExperimentEnv = process.env,\n): boolean {\n const override =\n env.AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT?.trim().toLowerCase();\n if (override && DISABLED_VALUES.has(override)) return false;\n if (override && ENABLED_VALUES.has(override)) return true;\n\n const hostnames = [\n env.APP_URL,\n env.BETTER_AUTH_URL,\n env.URL,\n env.DEPLOY_URL,\n env.VERCEL_PROJECT_PRODUCTION_URL,\n env.VERCEL_URL,\n ]\n .map(hostnameFromUrl)\n .filter((hostname): hostname is string => Boolean(hostname));\n\n return hostnames.some(\n (hostname) =>\n hostname === \"agent-native.com\" ||\n hostname.endsWith(FIRST_PARTY_HOST_SUFFIX),\n );\n}\n\n/**\n * Stable cross-app bucket: the same authenticated user receives the same\n * variant in every hosted template for the life of this experiment id.\n */\nexport function hostedDefaultModelExperimentBucket(userId: string): number {\n const input = `${HOSTED_DEFAULT_MODEL_EXPERIMENT_ID}:${userId.trim().toLowerCase()}`;\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index++) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0) % 100;\n}\n\nexport function resolveHostedDefaultModelExperiment(args: {\n userId: string | null | undefined;\n engineName: string;\n isDefaultModelSelection: boolean;\n supportedModels?: readonly string[];\n env?: HostedExperimentEnv;\n}): HostedDefaultModelExperimentResolution | null {\n const userId = args.userId?.trim();\n if (!userId) return null;\n if (args.engineName !== \"builder\") return null;\n if (!args.isDefaultModelSelection) return null;\n if (!isHostedDefaultModelExperimentEnabled(args.env)) return null;\n\n const variant =\n hostedDefaultModelExperimentBucket(userId) <\n HOSTED_DEFAULT_MODEL_TREATMENT.weight\n ? HOSTED_DEFAULT_MODEL_TREATMENT\n : HOSTED_DEFAULT_MODEL_CONTROL;\n if (args.supportedModels && !args.supportedModels.includes(variant.model)) {\n return null;\n }\n\n return {\n model: variant.model,\n assignment: {\n experimentId: HOSTED_DEFAULT_MODEL_EXPERIMENT_ID,\n variantId: variant.id,\n },\n };\n}\n"]}