@agent-native/core 0.202.0 → 0.202.1-nightly-20261007011022

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 (75) hide show
  1. package/dist/agent/actions/list-model-providers.d.ts +2 -0
  2. package/dist/agent/actions/list-model-providers.js +32 -5
  3. package/dist/agent/actions/manage-provider-models.d.ts +1 -0
  4. package/dist/agent/engine/builder-engine.d.ts +1 -1
  5. package/dist/agent/engine/builtin.js +1 -1
  6. package/dist/agent/engine/index.d.ts +1 -1
  7. package/dist/agent/engine/index.js +1 -1
  8. package/dist/agent/engine/registry.d.ts +2 -0
  9. package/dist/agent/engine/registry.js +63 -47
  10. package/dist/agent/model-config.d.ts +6 -6
  11. package/dist/agent/model-config.js +7 -11
  12. package/dist/agent/model-version.d.ts +3 -0
  13. package/dist/agent/model-version.js +67 -0
  14. package/dist/agent/provider-model-selection.d.ts +6 -1
  15. package/dist/agent/provider-model-selection.js +131 -13
  16. package/dist/automation/index.d.ts +1 -1
  17. package/dist/cli/create.d.ts +2 -1
  18. package/dist/cli/create.js +17 -4
  19. package/dist/cli/template-sync.js +2 -1
  20. package/dist/cli/workspacify.d.ts +1 -0
  21. package/dist/cli/workspacify.js +4 -0
  22. package/dist/client/app-config.d.ts +1 -0
  23. package/dist/client/app-config.js +19 -0
  24. package/dist/client/chat/agentkit-protocol.js +122 -16
  25. package/dist/client/chat/runtime.js +943 -50
  26. package/dist/client/chat-model-groups.d.ts +1 -0
  27. package/dist/client/chat-model-groups.js +1 -0
  28. package/dist/client/use-chat-models.js +47 -6
  29. package/dist/deploy/build.js +23 -9
  30. package/dist/email-catalog/redact-body.js +1 -1
  31. package/dist/jobs/actions/manage-recurring-job.d.ts +1 -1
  32. package/dist/jobs/background-automation-runner.d.ts +3 -1
  33. package/dist/jobs/background-automation-runner.js +15 -8
  34. package/dist/jobs/scheduler.js +1 -1
  35. package/dist/mcp/build-server.d.ts +0 -1
  36. package/dist/mcp/build-server.js +10 -59
  37. package/dist/observability/routes.d.ts +6 -6
  38. package/dist/onboarding/app-profile-data.d.ts +10 -0
  39. package/dist/onboarding/app-profile-data.js +423 -0
  40. package/dist/onboarding/app-profile.d.ts +1 -7
  41. package/dist/onboarding/app-profile.js +5 -422
  42. package/dist/onboarding/index.d.ts +1 -0
  43. package/dist/onboarding/index.js +1 -0
  44. package/dist/org/handlers.d.ts +1 -1
  45. package/dist/org/index.d.ts +1 -1
  46. package/dist/progress/routes.d.ts +1 -1
  47. package/dist/provider-api/actions/custom-provider-registration.d.ts +2 -2
  48. package/dist/provider-api/actions/provider-api.d.ts +10 -10
  49. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  50. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  51. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  52. package/dist/secrets/routes.d.ts +11 -11
  53. package/dist/server/action-routes.js +1 -0
  54. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  55. package/dist/server/app-origin-config.d.ts +2 -0
  56. package/dist/server/app-origin-config.js +4 -0
  57. package/dist/server/auth.js +43 -1
  58. package/dist/server/better-auth-instance.js +7 -12
  59. package/dist/server/email-auth-links.d.ts +11 -0
  60. package/dist/server/email-auth-links.js +126 -0
  61. package/dist/server/fusion-app.js +11 -1
  62. package/dist/shared/agent-chat-context.d.ts +3 -3
  63. package/dist/shared/agent-chat-context.js +2 -2
  64. package/dist/shared/auth-copy.d.ts +3 -0
  65. package/dist/shared/auth-copy.js +33 -0
  66. package/dist/shared/design-system-agent-context.d.ts +5 -0
  67. package/dist/shared/design-system-agent-context.js +37 -8
  68. package/dist/shared/index.d.ts +1 -1
  69. package/dist/triggers/actions/manage-automation.d.ts +7 -7
  70. package/dist/triggers/condition-evaluator.d.ts +21 -5
  71. package/dist/triggers/condition-evaluator.js +113 -59
  72. package/dist/triggers/dispatcher.js +39 -21
  73. package/dist/vite/client.js +10 -0
  74. package/docs/content/durable-resume.mdx +9 -3
  75. package/package.json +5 -3
@@ -10,14 +10,17 @@
10
10
  * A chat already pinned to an unchecked model keeps running on it.
11
11
  */
12
12
  import { AGENT_PROVIDER_CATALOG, } from "../client/agent-provider-catalog.js";
13
+ import { assertCredentialCanReachEndpoint, CredentialEndpointMismatchError, } from "../credentials/index.js";
13
14
  import { getOrgRoleForEmail } from "../mcp/actions/service-token-access.js";
14
15
  import { canManageOrg } from "../org/permissions.js";
15
- import { resolveBuilderCredentialsDetailed, resolveSecretDetailed, } from "../server/credential-provider.js";
16
+ import { readAppSecret } from "../secrets/storage.js";
17
+ import { canUseDeployCredentialFallbackForRequest, resolveBuilderCredentialsDetailed, resolveSecretDetailed, readDeployCredentialEnv, } from "../server/credential-provider.js";
16
18
  import { getRequestOrgId, getRequestUserEmail, } from "../server/request-context.js";
17
19
  import { deleteOrgSetting, deleteUserSetting, getOrgSetting, getUserSetting, putOrgSetting, putUserSetting, } from "../settings/index.js";
18
- import { OLLAMA_BASE_URL_ENV_VAR } from "./engine/openai-compatible-endpoint.js";
20
+ import { isCustomOpenAiBaseUrl, OLLAMA_BASE_URL_ENV_VAR, OPENAI_BASE_URL_ENV_VAR, } from "./engine/openai-compatible-endpoint.js";
19
21
  import { PROVIDER_ENV_META } from "./engine/provider-env-vars.js";
20
22
  import { BUILDER_MODEL_CONFIG } from "./model-config.js";
23
+ import { upgradeModelToLatestSupportedVersion } from "./model-version.js";
21
24
  export const PROVIDER_MODEL_SELECTION_KEY_PREFIX = "agent-provider-models";
22
25
  /** Audit target type for selection changes and refused attempts. */
23
26
  export const PROVIDER_MODEL_SELECTION_AUDIT_TARGET_TYPE = "provider-models";
@@ -72,7 +75,7 @@ function providerCredentialEnvVar(provider) {
72
75
  * only routes its own catalog, so ids outside it are refused rather than
73
76
  * stored as choices the gateway would silently swap for its default.
74
77
  */
75
- export function normalizeSelectedModels(provider, models) {
78
+ export function normalizeSelectedModels(provider, models, options = {}) {
76
79
  if (models.length > MAX_SELECTED_MODELS) {
77
80
  throw new ProviderModelSelectionError(`Select at most ${MAX_SELECTED_MODELS} models.`, 400);
78
81
  }
@@ -89,7 +92,12 @@ export function normalizeSelectedModels(provider, models) {
89
92
  }
90
93
  seen.add(id);
91
94
  }
92
- const normalized = [...seen];
95
+ const supportedModels = recommendedProviderModels(provider);
96
+ const normalized = [
97
+ ...new Set([...seen].map((id) => options.preserveCustomModels
98
+ ? id
99
+ : (upgradeModelToLatestSupportedVersion(id, supportedModels) ?? id))),
100
+ ];
93
101
  if (provider === "builder") {
94
102
  const catalog = new Set(BUILDER_MODEL_CONFIG.supportedModels);
95
103
  const unknown = normalized.filter((id) => !catalog.has(id));
@@ -99,17 +107,107 @@ export function normalizeSelectedModels(provider, models) {
99
107
  }
100
108
  return normalized;
101
109
  }
102
- function parseRow(provider, scope, stored) {
110
+ async function preserveCustomModelsForScope(provider, scope, ctx) {
111
+ if (provider !== "openai")
112
+ return false;
113
+ const scopeId = scopeIdFor(ctx, scope);
114
+ const credentialRefs = scope === "user"
115
+ ? [
116
+ { scope: "user", scopeId },
117
+ { scope: "workspace", scopeId: `solo:${scopeId}` },
118
+ ]
119
+ : [
120
+ { scope: "org", scopeId },
121
+ { scope: "workspace", scopeId },
122
+ ];
123
+ const [credentials, endpoints] = await Promise.all([
124
+ Promise.all(credentialRefs.map((ref) => readAppSecret({ key: PROVIDER_ENV_META.openai.envVar, ...ref }))),
125
+ Promise.all(credentialRefs.map((ref) => readAppSecret({ key: OPENAI_BASE_URL_ENV_VAR, ...ref }))),
126
+ ]);
127
+ for (const [endpointIndex, endpoint] of endpoints.entries()) {
128
+ if (!isCustomOpenAiBaseUrl(endpoint?.value))
129
+ continue;
130
+ for (const [credentialIndex, credential] of credentials.entries()) {
131
+ if (!credential?.value)
132
+ continue;
133
+ try {
134
+ assertCredentialCanReachEndpoint(credentialRefs[endpointIndex], credentialRefs[credentialIndex], PROVIDER_ENV_META.openai.envVar);
135
+ return true;
136
+ }
137
+ catch (error) {
138
+ if (!(error instanceof CredentialEndpointMismatchError))
139
+ throw error;
140
+ }
141
+ }
142
+ }
143
+ if (endpoints.some((secret) => secret?.value) ||
144
+ credentials.some((secret) => secret?.value)) {
145
+ return false;
146
+ }
147
+ if (scope === "user") {
148
+ if (!canUseDeployCredentialFallbackForRequest(PROVIDER_ENV_META.openai.envVar) ||
149
+ !canUseDeployCredentialFallbackForRequest(OPENAI_BASE_URL_ENV_VAR)) {
150
+ return false;
151
+ }
152
+ return Boolean(readDeployCredentialEnv(PROVIDER_ENV_META.openai.envVar) &&
153
+ isCustomOpenAiBaseUrl(readDeployCredentialEnv(OPENAI_BASE_URL_ENV_VAR)));
154
+ }
155
+ const [credential, resolvedEndpoint] = await Promise.all([
156
+ resolveSecretDetailed(PROVIDER_ENV_META.openai.envVar, {
157
+ skipUserScope: true,
158
+ }),
159
+ resolveSecretDetailed(OPENAI_BASE_URL_ENV_VAR, { skipUserScope: true }),
160
+ ]);
161
+ if (credential.lookupFailed || resolvedEndpoint.lookupFailed) {
162
+ throw new Error("Could not read the OpenAI credential configuration.");
163
+ }
164
+ if (!credential.value ||
165
+ !resolvedEndpoint.value ||
166
+ !isCustomOpenAiBaseUrl(resolvedEndpoint.value) ||
167
+ !credential.source ||
168
+ !resolvedEndpoint.source) {
169
+ return false;
170
+ }
171
+ if (credential.source === "env" || resolvedEndpoint.source === "env") {
172
+ return credential.source === "env" && resolvedEndpoint.source === "env";
173
+ }
174
+ if (credential.source === "workspace" &&
175
+ credential.scopeId?.startsWith("solo:")) {
176
+ return false;
177
+ }
178
+ try {
179
+ assertCredentialCanReachEndpoint({
180
+ scope: resolvedEndpoint.source,
181
+ scopeId: resolvedEndpoint.scopeId,
182
+ }, { scope: credential.source, scopeId: credential.scopeId }, PROVIDER_ENV_META.openai.envVar);
183
+ return true;
184
+ }
185
+ catch (error) {
186
+ if (error instanceof CredentialEndpointMismatchError)
187
+ return false;
188
+ throw error;
189
+ }
190
+ }
191
+ function parseRow(provider, scope, stored, preserveCustomModels = false) {
192
+ const customModelMetadata = provider === "openai" && preserveCustomModels
193
+ ? { preserveCustomModels: true }
194
+ : {};
103
195
  if (!stored || !Array.isArray(stored.models)) {
104
- return { provider, scope, models: null };
196
+ return { provider, scope, models: null, ...customModelMetadata };
105
197
  }
106
198
  const models = stored.models.filter((model) => typeof model === "string" && !!model.trim());
199
+ const currentModels = [
200
+ ...new Set(models.map((model) => preserveCustomModels
201
+ ? model
202
+ : (upgradeModelToLatestSupportedVersion(model, recommendedProviderModels(provider)) ?? model))),
203
+ ];
107
204
  return {
108
205
  provider,
109
206
  scope,
207
+ ...customModelMetadata,
110
208
  models: provider === "builder"
111
- ? models.filter((model) => BUILDER_MODEL_CONFIG.supportedModels.includes(model))
112
- : models,
209
+ ? currentModels.filter((model) => BUILDER_MODEL_CONFIG.supportedModels.includes(model))
210
+ : currentModels,
113
211
  ...(typeof stored.updatedAt === "number" &&
114
212
  Number.isFinite(stored.updatedAt)
115
213
  ? { updatedAt: stored.updatedAt }
@@ -138,7 +236,8 @@ export async function readProviderModelSelection(ctx, provider, scope) {
138
236
  const stored = scope === "org"
139
237
  ? await getOrgSetting(scopeId, key)
140
238
  : await getUserSetting(scopeId, key);
141
- return parseRow(provider, scope, stored);
239
+ const preserveCustomModels = await preserveCustomModelsForScope(provider, scope, ctx);
240
+ return parseRow(provider, scope, stored, preserveCustomModels);
142
241
  }
143
242
  /**
144
243
  * Whether the caller may change `scope`'s selection. Personal selections are
@@ -157,7 +256,10 @@ export async function assertMayWriteProviderModelSelection(ctx, scope) {
157
256
  }
158
257
  export async function writeProviderModelSelection(ctx, provider, scope, models) {
159
258
  await assertMayWriteProviderModelSelection(ctx, scope);
160
- const normalized = normalizeSelectedModels(provider, models);
259
+ const preserveCustomModels = await preserveCustomModelsForScope(provider, scope, ctx);
260
+ const normalized = normalizeSelectedModels(provider, models, {
261
+ preserveCustomModels,
262
+ });
161
263
  const scopeId = scopeIdFor(ctx, scope);
162
264
  const key = providerModelSelectionSettingsKey(provider);
163
265
  const value = {
@@ -211,7 +313,11 @@ export async function resolveProviderModelSelectionScope(provider, ctx = current
211
313
  if (detail.lookupFailed && !detail.value) {
212
314
  throw new Error("Could not read the credential store.");
213
315
  }
214
- return detail.source === "user" ? "user" : "org";
316
+ return detail.source === "user" ||
317
+ (detail.source === "workspace" &&
318
+ detail.scopeId === `solo:${ctx.userEmail}`)
319
+ ? "user"
320
+ : "org";
215
321
  }
216
322
  /** The selection the current request's picker shows for `provider`. */
217
323
  export async function resolveEffectiveProviderModelSelection(provider, ctx = currentContext()) {
@@ -247,13 +353,22 @@ export async function resolveProviderModelSelectionAtScope(provider, scope, ctx)
247
353
  }
248
354
  }
249
355
  function selectionFromRow(row) {
356
+ const customModelMetadata = row.preserveCustomModels
357
+ ? { preserveCustomModels: true }
358
+ : {};
250
359
  return row.models === null
251
- ? { state: "default", provider: row.provider, scope: row.scope }
360
+ ? {
361
+ state: "default",
362
+ provider: row.provider,
363
+ scope: row.scope,
364
+ ...customModelMetadata,
365
+ }
252
366
  : {
253
367
  state: "selected",
254
368
  provider: row.provider,
255
369
  scope: row.scope,
256
370
  models: row.models,
371
+ ...customModelMetadata,
257
372
  };
258
373
  }
259
374
  /**
@@ -280,7 +395,10 @@ export async function resolveUncheckedDefaultModelReplacement(engine) {
280
395
  }
281
396
  if (selection.state !== "selected")
282
397
  return undefined;
283
- if (selection.models.includes(engine.defaultModel))
398
+ const currentDefault = selection.preserveCustomModels
399
+ ? engine.defaultModel
400
+ : (upgradeModelToLatestSupportedVersion(engine.defaultModel, recommendedProviderModels(provider)) ?? engine.defaultModel);
401
+ if (selection.models.includes(currentDefault))
284
402
  return undefined;
285
403
  return selection.models[0];
286
404
  }
@@ -139,8 +139,8 @@ export declare function createAutomationCallbackHandler(runtime: AutomationRunti
139
139
  duplicate?: undefined;
140
140
  eventId?: undefined;
141
141
  } | {
142
- error?: undefined;
143
142
  accepted: boolean;
144
143
  duplicate: boolean;
145
144
  eventId: string;
145
+ error?: undefined;
146
146
  }>;
@@ -102,7 +102,7 @@ export declare function detectWorkspace(startDir: string): {
102
102
  } | null;
103
103
  export { parseWorkspaceScope };
104
104
  /** @internal — exported for E2E tests */
105
- export { mergeWorkspaceYamlSections as _mergeWorkspaceYamlSections, scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, mergeWorkspaceYamlListItems as _mergeWorkspaceYamlListItems, scaffoldOneAppIntoWorkspace as _scaffoldOneAppIntoWorkspace, CreateWizardCancelledError as _CreateWizardCancelledError, ensureGuardedScaffold as _ensureGuardedScaffold, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, discoverEnclosingRepo as _discoverEnclosingRepo, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getAgentKitDependencyVersion as _getAgentKitDependencyVersion, prepareLocalWorkspaceOverrides as _prepareLocalWorkspaceOverrides, ensureLocalPackageBuildOutputs as _ensureLocalPackageBuildOutputs, getCorePackageVersion as _getCorePackageVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, githubTarballUrl as _githubTarballUrl, findLocalTemplateFrom as _findLocalTemplateFrom, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, startShapePromptOptions as _startShapePromptOptions, standaloneTemplatePromptOptions as _standaloneTemplatePromptOptions, parseCommunityTemplateSelection as _parseCommunityTemplateSelection, communityTemplateTrustMessage as _communityTemplateTrustMessage, communityTemplateTarballUrl as _communityTemplateTarballUrl, assertCommunityTemplateRoot as _assertCommunityTemplateRoot, assertSafeCommunityArchiveListing as _assertSafeCommunityArchiveListing, validateCommunityArchive as _validateCommunityArchive, resolveCommunityTemplateSource as _resolveCommunityTemplateSource, discoverCommunityWorkspaceApps as _discoverCommunityWorkspaceApps, normalizeCommunityWorkspaceAppDependencies as _normalizeCommunityWorkspaceAppDependencies, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, removeWorkspaceOnlyTemplateWiring as _removeWorkspaceOnlyTemplateWiring, tarExtractArgs as _tarExtractArgs, extractTarball as _extractTarball, materializeArchiveSymlinks as _materializeArchiveSymlinks, downloadGitHubSubdir as _downloadGitHubSubdir, findLocalTemplate as _findLocalTemplate, templateSourceName as _templateSourceName, normalizeTemplateName as _normalizeTemplateName, appTitleForScaffold as _appTitleForScaffold, replacePlaceholders as _replacePlaceholders, rewriteTrackingAppId as _rewriteTrackingAppId, rewriteAgentChatAppId as _rewriteAgentChatAppId, applyScaffoldIdentity as _applyScaffoldIdentity, ensureScaffoldEmailBrandingConfig as _ensureScaffoldEmailBrandingConfig, fixWebManifestName as _fixWebManifestName, copyDir as _copyDir, localTemplateSourceKind as _localTemplateSourceKind, REPO as _REPO, TEMPLATES_DIR as _TEMPLATES_DIR, };
105
+ export { mergeWorkspaceYamlSections as _mergeWorkspaceYamlSections, scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, mergeWorkspaceYamlListItems as _mergeWorkspaceYamlListItems, scaffoldOneAppIntoWorkspace as _scaffoldOneAppIntoWorkspace, CreateWizardCancelledError as _CreateWizardCancelledError, ensureGuardedScaffold as _ensureGuardedScaffold, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, discoverEnclosingRepo as _discoverEnclosingRepo, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getOtelDependencyVersion as _getOtelDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getAgentKitDependencyVersion as _getAgentKitDependencyVersion, prepareLocalWorkspaceOverrides as _prepareLocalWorkspaceOverrides, ensureLocalPackageBuildOutputs as _ensureLocalPackageBuildOutputs, getCorePackageVersion as _getCorePackageVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, githubTarballUrl as _githubTarballUrl, findLocalTemplateFrom as _findLocalTemplateFrom, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, startShapePromptOptions as _startShapePromptOptions, standaloneTemplatePromptOptions as _standaloneTemplatePromptOptions, parseCommunityTemplateSelection as _parseCommunityTemplateSelection, communityTemplateTrustMessage as _communityTemplateTrustMessage, communityTemplateTarballUrl as _communityTemplateTarballUrl, assertCommunityTemplateRoot as _assertCommunityTemplateRoot, assertSafeCommunityArchiveListing as _assertSafeCommunityArchiveListing, validateCommunityArchive as _validateCommunityArchive, resolveCommunityTemplateSource as _resolveCommunityTemplateSource, discoverCommunityWorkspaceApps as _discoverCommunityWorkspaceApps, normalizeCommunityWorkspaceAppDependencies as _normalizeCommunityWorkspaceAppDependencies, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, removeWorkspaceOnlyTemplateWiring as _removeWorkspaceOnlyTemplateWiring, tarExtractArgs as _tarExtractArgs, extractTarball as _extractTarball, materializeArchiveSymlinks as _materializeArchiveSymlinks, downloadGitHubSubdir as _downloadGitHubSubdir, findLocalTemplate as _findLocalTemplate, templateSourceName as _templateSourceName, normalizeTemplateName as _normalizeTemplateName, appTitleForScaffold as _appTitleForScaffold, replacePlaceholders as _replacePlaceholders, rewriteTrackingAppId as _rewriteTrackingAppId, rewriteAgentChatAppId as _rewriteAgentChatAppId, applyScaffoldIdentity as _applyScaffoldIdentity, ensureScaffoldEmailBrandingConfig as _ensureScaffoldEmailBrandingConfig, fixWebManifestName as _fixWebManifestName, copyDir as _copyDir, localTemplateSourceKind as _localTemplateSourceKind, REPO as _REPO, TEMPLATES_DIR as _TEMPLATES_DIR, };
106
106
  declare function tarExtractArgs(tarPath: string, destDir: string, options?: {
107
107
  skipAgentSymlinks?: boolean;
108
108
  untrustedCommunityArchive?: boolean;
@@ -157,6 +157,7 @@ declare function ensureScaffoldEmailBrandingConfig(appDir: string, appName: stri
157
157
  declare function fixWebManifestName(appDir: string, name: string, templateName?: string, sourceIdentity?: ScaffoldSourceIdentity): void;
158
158
  declare function getCoreDependencyVersion(): string;
159
159
  declare function getDispatchDependencyVersion(): string;
160
+ declare function getOtelDependencyVersion(): string;
160
161
  declare function getToolkitDependencyVersion(): string;
161
162
  declare function getAgentKitDependencyVersion(): string;
162
163
  interface PreparedWorkspaceOverrides {
@@ -92,9 +92,7 @@ const FIRST_PARTY_TARBALL_SYMLINK_EXCLUDES = [
92
92
  // the files that import them. A scaffold cannot install these (a standalone app
93
93
  // resolves them from npm, a new workspace has no such package), so it drops the
94
94
  // dependency and those files. Publishing a package removes its entry here.
95
- const WORKSPACE_ONLY_TEMPLATE_WIRING = {
96
- "@agent-native/otel": ["server/plugins/otel.ts"],
97
- };
95
+ const WORKSPACE_ONLY_TEMPLATE_WIRING = {};
98
96
  const TAR_LISTING_MAX_BUFFER = 100 * 1024 * 1024;
99
97
  const localPackageTarballs = new Map();
100
98
  const IN_PLACE_ALLOWLIST = new Set([
@@ -557,6 +555,7 @@ async function createWorkspaceInteractive(name, opts, clack) {
557
555
  dispatchDependencyVersion: getDispatchDependencyVersion(),
558
556
  toolkitDependencyVersion: getToolkitDependencyVersion(),
559
557
  agentKitDependencyVersion: getAgentKitDependencyVersion(),
558
+ otelDependencyVersion: getOtelDependencyVersion(),
560
559
  });
561
560
  fixPackageJsonName(appDir, appName, templateName, {
562
561
  ...resolution,
@@ -800,6 +799,7 @@ async function scaffoldOneAppIntoWorkspace(workspace, appName, templateName, cla
800
799
  dispatchDependencyVersion: getDispatchDependencyVersion(),
801
800
  toolkitDependencyVersion: getToolkitDependencyVersion(),
802
801
  agentKitDependencyVersion: getAgentKitDependencyVersion(),
802
+ otelDependencyVersion: getOtelDependencyVersion(),
803
803
  });
804
804
  fixPackageJsonName(appDir, appName, templateName, {
805
805
  ...resolution,
@@ -1655,6 +1655,9 @@ function postProcessStandalone(name, targetDir, templateName, resolution) {
1655
1655
  else if (key === "@agent-native/agentkit") {
1656
1656
  deps[key] = getAgentKitDependencyVersion();
1657
1657
  }
1658
+ else if (key === "@agent-native/otel") {
1659
+ deps[key] = getOtelDependencyVersion();
1660
+ }
1658
1661
  else if (typeof val === "string" && val.startsWith("workspace:")) {
1659
1662
  deps[key] = "latest";
1660
1663
  }
@@ -1895,7 +1898,7 @@ export function detectWorkspace(startDir) {
1895
1898
  }
1896
1899
  export { parseWorkspaceScope };
1897
1900
  /** @internal — exported for E2E tests */
1898
- export { mergeWorkspaceYamlSections as _mergeWorkspaceYamlSections, scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, mergeWorkspaceYamlListItems as _mergeWorkspaceYamlListItems, scaffoldOneAppIntoWorkspace as _scaffoldOneAppIntoWorkspace, CreateWizardCancelledError as _CreateWizardCancelledError, ensureGuardedScaffold as _ensureGuardedScaffold, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, discoverEnclosingRepo as _discoverEnclosingRepo, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getAgentKitDependencyVersion as _getAgentKitDependencyVersion, prepareLocalWorkspaceOverrides as _prepareLocalWorkspaceOverrides, ensureLocalPackageBuildOutputs as _ensureLocalPackageBuildOutputs, getCorePackageVersion as _getCorePackageVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, githubTarballUrl as _githubTarballUrl, findLocalTemplateFrom as _findLocalTemplateFrom, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, startShapePromptOptions as _startShapePromptOptions, standaloneTemplatePromptOptions as _standaloneTemplatePromptOptions, parseCommunityTemplateSelection as _parseCommunityTemplateSelection, communityTemplateTrustMessage as _communityTemplateTrustMessage, communityTemplateTarballUrl as _communityTemplateTarballUrl, assertCommunityTemplateRoot as _assertCommunityTemplateRoot, assertSafeCommunityArchiveListing as _assertSafeCommunityArchiveListing, validateCommunityArchive as _validateCommunityArchive, resolveCommunityTemplateSource as _resolveCommunityTemplateSource, discoverCommunityWorkspaceApps as _discoverCommunityWorkspaceApps, normalizeCommunityWorkspaceAppDependencies as _normalizeCommunityWorkspaceAppDependencies, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, removeWorkspaceOnlyTemplateWiring as _removeWorkspaceOnlyTemplateWiring, tarExtractArgs as _tarExtractArgs, extractTarball as _extractTarball, materializeArchiveSymlinks as _materializeArchiveSymlinks, downloadGitHubSubdir as _downloadGitHubSubdir, findLocalTemplate as _findLocalTemplate, templateSourceName as _templateSourceName, normalizeTemplateName as _normalizeTemplateName, appTitleForScaffold as _appTitleForScaffold, replacePlaceholders as _replacePlaceholders, rewriteTrackingAppId as _rewriteTrackingAppId, rewriteAgentChatAppId as _rewriteAgentChatAppId, applyScaffoldIdentity as _applyScaffoldIdentity, ensureScaffoldEmailBrandingConfig as _ensureScaffoldEmailBrandingConfig, fixWebManifestName as _fixWebManifestName, copyDir as _copyDir, localTemplateSourceKind as _localTemplateSourceKind, REPO as _REPO, TEMPLATES_DIR as _TEMPLATES_DIR, };
1901
+ export { mergeWorkspaceYamlSections as _mergeWorkspaceYamlSections, scaffoldWorkspaceRoot as _scaffoldWorkspaceRoot, mergeWorkspaceYamlListItems as _mergeWorkspaceYamlListItems, scaffoldOneAppIntoWorkspace as _scaffoldOneAppIntoWorkspace, CreateWizardCancelledError as _CreateWizardCancelledError, ensureGuardedScaffold as _ensureGuardedScaffold, scaffoldAppTemplate as _scaffoldAppTemplate, scaffoldRequiredPackages as _scaffoldRequiredPackages, postProcessStandalone as _postProcessStandalone, loadCatalog as _loadCatalog, fixPackageJsonName as _fixPackageJsonName, renameGitignore as _renameGitignore, discoverEnclosingRepo as _discoverEnclosingRepo, rewriteNetlifyToml as _rewriteNetlifyToml, getCoreDependencyVersion as _getCoreDependencyVersion, getDispatchDependencyVersion as _getDispatchDependencyVersion, getOtelDependencyVersion as _getOtelDependencyVersion, getToolkitDependencyVersion as _getToolkitDependencyVersion, getAgentKitDependencyVersion as _getAgentKitDependencyVersion, prepareLocalWorkspaceOverrides as _prepareLocalWorkspaceOverrides, ensureLocalPackageBuildOutputs as _ensureLocalPackageBuildOutputs, getCorePackageVersion as _getCorePackageVersion, getGitHubTemplateRef as _getGitHubTemplateRef, getGitHubTemplateRefCandidates as _getGitHubTemplateRefCandidates, githubTarballUrl as _githubTarballUrl, findLocalTemplateFrom as _findLocalTemplateFrom, workspaceAppNameForTemplateSelection as _workspaceAppNameForTemplateSelection, startShapePromptOptions as _startShapePromptOptions, standaloneTemplatePromptOptions as _standaloneTemplatePromptOptions, parseCommunityTemplateSelection as _parseCommunityTemplateSelection, communityTemplateTrustMessage as _communityTemplateTrustMessage, communityTemplateTarballUrl as _communityTemplateTarballUrl, assertCommunityTemplateRoot as _assertCommunityTemplateRoot, assertSafeCommunityArchiveListing as _assertSafeCommunityArchiveListing, validateCommunityArchive as _validateCommunityArchive, resolveCommunityTemplateSource as _resolveCommunityTemplateSource, discoverCommunityWorkspaceApps as _discoverCommunityWorkspaceApps, normalizeCommunityWorkspaceAppDependencies as _normalizeCommunityWorkspaceAppDependencies, shouldSkipScaffoldEntry as _shouldSkipScaffoldEntry, removeWorkspaceOnlyTemplateWiring as _removeWorkspaceOnlyTemplateWiring, tarExtractArgs as _tarExtractArgs, extractTarball as _extractTarball, materializeArchiveSymlinks as _materializeArchiveSymlinks, downloadGitHubSubdir as _downloadGitHubSubdir, findLocalTemplate as _findLocalTemplate, templateSourceName as _templateSourceName, normalizeTemplateName as _normalizeTemplateName, appTitleForScaffold as _appTitleForScaffold, replacePlaceholders as _replacePlaceholders, rewriteTrackingAppId as _rewriteTrackingAppId, rewriteAgentChatAppId as _rewriteAgentChatAppId, applyScaffoldIdentity as _applyScaffoldIdentity, ensureScaffoldEmailBrandingConfig as _ensureScaffoldEmailBrandingConfig, fixWebManifestName as _fixWebManifestName, copyDir as _copyDir, localTemplateSourceKind as _localTemplateSourceKind, REPO as _REPO, TEMPLATES_DIR as _TEMPLATES_DIR, };
1899
1902
  function validateRepoName(repo) {
1900
1903
  const parts = repo.split("/");
1901
1904
  if (!/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/.test(repo) ||
@@ -2994,6 +2997,16 @@ function getDispatchDependencyVersion() {
2994
2997
  }
2995
2998
  return "latest";
2996
2999
  }
3000
+ // OTel is versioned independently of Core (it peer-depends on Core's public
3001
+ // observability provider API), so a scaffold takes its current npm release.
3002
+ function getOtelDependencyVersion() {
3003
+ if (process.env.AGENT_NATIVE_CREATE_USE_LOCAL_CORE === "1") {
3004
+ const localOtel = findLocalPackage("otel");
3005
+ if (localOtel)
3006
+ return localPackageTarball(localOtel);
3007
+ }
3008
+ return "latest";
3009
+ }
2997
3010
  function getToolkitDependencyVersion() {
2998
3011
  if (process.env.AGENT_NATIVE_CREATE_USE_LOCAL_CORE === "1") {
2999
3012
  const localToolkit = findLocalPackage("toolkit");
@@ -2,7 +2,7 @@ import { spawnSync } from "node:child_process";
2
2
  import fs from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
- import { detectWorkspace, _REPO, _TEMPLATES_DIR, _appTitleForScaffold, _copyDir, _downloadGitHubSubdir, _findLocalTemplate, _fixPackageJsonName, _fixWebManifestName, _getCoreDependencyVersion, _getCorePackageVersion, _getDispatchDependencyVersion, _getGitHubTemplateRefCandidates, _getToolkitDependencyVersion, _localTemplateSourceKind, _normalizeTemplateName, _postProcessStandalone, _removeWorkspaceOnlyTemplateWiring, _renameGitignore, _replacePlaceholders, _rewriteNetlifyToml, _rewriteTrackingAppId, _shouldSkipScaffoldEntry, _templateSourceName, } from "./create.js";
5
+ import { detectWorkspace, _REPO, _TEMPLATES_DIR, _appTitleForScaffold, _copyDir, _downloadGitHubSubdir, _findLocalTemplate, _fixPackageJsonName, _fixWebManifestName, _getCoreDependencyVersion, _getCorePackageVersion, _getDispatchDependencyVersion, _getGitHubTemplateRefCandidates, _getOtelDependencyVersion, _getToolkitDependencyVersion, _localTemplateSourceKind, _normalizeTemplateName, _postProcessStandalone, _removeWorkspaceOnlyTemplateWiring, _renameGitignore, _replacePlaceholders, _rewriteNetlifyToml, _rewriteTrackingAppId, _shouldSkipScaffoldEntry, _templateSourceName, } from "./create.js";
6
6
  import { appDirtyPaths, baselineDescription, baselineExists, clearBaseline, materializeBaseline, promoteBaseline, resolveBaselineStore, writeBaseline, } from "./template-baseline.js";
7
7
  import { workspacifyApp } from "./workspacify.js";
8
8
  const defaultIO = {
@@ -56,6 +56,7 @@ export async function materializeTemplate(opts) {
56
56
  coreDependencyVersion: _getCoreDependencyVersion(),
57
57
  dispatchDependencyVersion: _getDispatchDependencyVersion(),
58
58
  toolkitDependencyVersion: _getToolkitDependencyVersion(),
59
+ otelDependencyVersion: _getOtelDependencyVersion(),
59
60
  });
60
61
  _fixPackageJsonName(dest, opts.appName, opts.template, {
61
62
  ...provenance,
@@ -8,6 +8,7 @@ export interface WorkspacifyOptions {
8
8
  dispatchDependencyVersion?: string;
9
9
  toolkitDependencyVersion?: string;
10
10
  agentKitDependencyVersion?: string;
11
+ otelDependencyVersion?: string;
11
12
  }
12
13
  export declare function ensureNodePtyBuildDependency(workspaceRoot: string): void;
13
14
  export declare function workspacifyApp(opts: WorkspacifyOptions): void;
@@ -55,6 +55,7 @@ export function workspacifyApp(opts) {
55
55
  const dispatchDependencyVersion = pinnedByWorkspace("@agent-native/dispatch", opts.dispatchDependencyVersion);
56
56
  const toolkitDependencyVersion = pinnedByWorkspace("@agent-native/toolkit", opts.toolkitDependencyVersion);
57
57
  const agentKitDependencyVersion = pinnedByWorkspace("@agent-native/agentkit", opts.agentKitDependencyVersion);
58
+ const otelDependencyVersion = pinnedByWorkspace("@agent-native/otel", opts.otelDependencyVersion);
58
59
  const pkgPath = path.join(appDir, "package.json");
59
60
  let hasNodePty = false;
60
61
  if (fs.existsSync(pkgPath)) {
@@ -82,6 +83,9 @@ export function workspacifyApp(opts) {
82
83
  if (key === "@agent-native/agentkit") {
83
84
  deps[key] = agentKitDependencyVersion;
84
85
  }
86
+ if (key === "@agent-native/otel") {
87
+ deps[key] = otelDependencyVersion;
88
+ }
85
89
  }
86
90
  }
87
91
  }
@@ -1,2 +1,3 @@
1
1
  import type { AgentNativeConfig } from "../config.js";
2
2
  export declare function injectedAgentNativeConfig(): AgentNativeConfig;
3
+ export declare function injectedAgentNativeAppId(): string | null;
@@ -3,3 +3,22 @@ export function injectedAgentNativeConfig() {
3
3
  ? {}
4
4
  : __AGENT_NATIVE_APP_CONFIG__;
5
5
  }
6
+ export function injectedAgentNativeAppId() {
7
+ const browserConfig = typeof window !== "undefined"
8
+ ? window.__AGENT_NATIVE_CONFIG__
9
+ : undefined;
10
+ const workspaceAppId = typeof __AGENT_NATIVE_WORKSPACE_APP_ID__ === "string" &&
11
+ __AGENT_NATIVE_WORKSPACE_APP_ID__.trim()
12
+ ? __AGENT_NATIVE_WORKSPACE_APP_ID__
13
+ : browserConfig?.workspaceAppId;
14
+ const appId = browserConfig?.appId;
15
+ const compiledAppId = typeof __AGENT_NATIVE_APP_ID__ === "string"
16
+ ? __AGENT_NATIVE_APP_ID__
17
+ : undefined;
18
+ for (const value of [workspaceAppId, appId, compiledAppId]) {
19
+ if (typeof value === "string" && value.trim()) {
20
+ return value.trim().toLowerCase();
21
+ }
22
+ }
23
+ return null;
24
+ }