@canonry/canonry 7.46.0 → 7.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/assets/assets/{AuditHistoryPanel-u65pF2eT.js → AuditHistoryPanel-BTlvVW6p.js} +1 -1
  2. package/assets/assets/{BacklinksPage-CmYpSNGB.js → BacklinksPage-DQu_3poO.js} +1 -1
  3. package/assets/assets/{HistoryPage-CqzQSAil.js → HistoryPage-D_3qu4SQ.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-KfpmUisb.js → MeasurementPropertyPage-FKmEMw_G.js} +1 -1
  5. package/assets/assets/{ProjectPage-BCiospUp.js → ProjectPage-H7nsLkhG.js} +1 -1
  6. package/assets/assets/{RunsPage-CzPvTnwG.js → RunsPage-CE5wFNdP.js} +1 -1
  7. package/assets/assets/{SettingsPage-CZYckyPO.js → SettingsPage-D2zKpqOv.js} +1 -1
  8. package/assets/assets/{SiteHealthSection-Bm5nWAoZ.js → SiteHealthSection-ClZRxJ-A.js} +3 -3
  9. package/assets/assets/{TrafficPage-DZw_GvaO.js → TrafficPage-BDH4Dzk0.js} +1 -1
  10. package/assets/assets/{TrafficSourceDetailPage-CD20PJ4A.js → TrafficSourceDetailPage-DaVUcHXu.js} +1 -1
  11. package/assets/assets/{extract-error-message-Cpzj_AMZ.js → extract-error-message-YXzyZAEc.js} +1 -1
  12. package/assets/assets/{index-BHLYJHa-.js → index-Zj8hd7aE.js} +3 -3
  13. package/assets/assets/{react-sigma_core.esm.min-CK2U3T7S.js → react-sigma_core.esm.min-9j5NHFWR.js} +1 -1
  14. package/assets/assets/{v2-overview-adapter-DL1IsAM2.js → v2-overview-adapter-BsKpkQvx.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-KPOZR6MV.js → chunk-3F4KBEMY.js} +2 -2
  17. package/dist/{chunk-Y2QMWZT7.js → chunk-66K6U5H5.js} +3 -3
  18. package/dist/{chunk-WMG365JI.js → chunk-CIYCCA2I.js} +11 -2
  19. package/dist/{chunk-QBZPKXFW.js → chunk-DGKSQ5QD.js} +1 -1
  20. package/dist/{chunk-GWRIZSIL.js → chunk-HQS2Y7HO.js} +3 -3
  21. package/dist/{chunk-ZOTA3MOL.js → chunk-KCSU2OSL.js} +242 -112
  22. package/dist/{chunk-V4TITINC.js → chunk-QS262E4F.js} +9 -1
  23. package/dist/{chunk-AYMS4LCP.js → chunk-RUAQAQ7X.js} +225 -210
  24. package/dist/{chunk-PCZXWOYX.js → chunk-XHRJYIJQ.js} +1 -1
  25. package/dist/{chunk-2UQ6WVWP.js → chunk-XLKWD5WO.js} +9 -9
  26. package/dist/{cli-catalog-TFCCKIE4.js → cli-catalog-MRYQK7LI.js} +3 -3
  27. package/dist/cli-commands-RJF4TCEZ.js +15 -0
  28. package/dist/cli.js +10 -10
  29. package/dist/{demo-server-7YFRG3JM.js → demo-server-ASCEFIVC.js} +4 -4
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.js +6 -6
  32. package/dist/{intelligence-service-P3UJNCVS.js → intelligence-service-VRWJUHNM.js} +2 -2
  33. package/dist/mcp.js +4 -4
  34. package/package.json +11 -11
  35. package/dist/cli-commands-GYWXFE3P.js +0 -15
@@ -10843,7 +10843,15 @@ var visibilityCompareMetricPeriodSchema = z23.object({
10843
10843
  * source capture for a class cited rate, and, on frames that record capture
10844
10844
  * completeness (Advanced), for the pooled cited rate and cited share of voice.
10845
10845
  */
10846
- excludedUnknown: z23.number().int().nonnegative().optional()
10846
+ excludedUnknown: z23.number().int().nonnegative().optional(),
10847
+ /**
10848
+ * Cited-rate rows the provider answered with no retrieval step at all
10849
+ * (`retrievalStatus = 'not-used'`). They cite nothing by construction, so
10850
+ * they leave the cited denominator rather than count as a searched miss;
10851
+ * they remain in the mention denominator, since brand recall does not need
10852
+ * search. Only set on frames that record retrieval status.
10853
+ */
10854
+ excludedNoRetrieval: z23.number().int().nonnegative().optional()
10847
10855
  });
10848
10856
  var visibilityCompareMetricKeySchema = z23.enum([
10849
10857
  "mention-share-of-voice",
@@ -1,4 +1,5 @@
1
1
  import {
2
+ AGENT_REASONING_LEVELS,
2
3
  ApiClient,
3
4
  CANONRY_MCP_TIERS,
4
5
  CANONRY_MCP_TOOLKITS,
@@ -21,19 +22,19 @@ import {
21
22
  saveConfig,
22
23
  saveConfigPatch,
23
24
  sentimentInstallReadiness
24
- } from "./chunk-WMG365JI.js";
25
+ } from "./chunk-CIYCCA2I.js";
25
26
  import {
26
27
  computeFactorAverages,
27
28
  deleteSiteCrawlGraphLayout,
28
29
  persistSiteCrawlGraphLayout,
29
30
  prepareSiteCrawlGraphLayout,
30
31
  recordedSharePct
31
- } from "./chunk-KPOZR6MV.js";
32
+ } from "./chunk-3F4KBEMY.js";
32
33
  import {
33
34
  CanonryMcpToolNames,
34
35
  PACKAGE_VERSION,
35
36
  canonryMcpTools
36
- } from "./chunk-PCZXWOYX.js";
37
+ } from "./chunk-XHRJYIJQ.js";
37
38
  import {
38
39
  CliError
39
40
  } from "./chunk-HGMYEDAQ.js";
@@ -240,7 +241,7 @@ import {
240
241
  webhookResponseReason,
241
242
  webhookTargetRefusalReason,
242
243
  writeAuditLog
243
- } from "./chunk-ZOTA3MOL.js";
244
+ } from "./chunk-KCSU2OSL.js";
244
245
  import {
245
246
  AGENT_MEMORY_VALUE_MAX_BYTES,
246
247
  AGENT_NONE,
@@ -488,7 +489,7 @@ import {
488
489
  winnabilityClassLabel,
489
490
  withRetry,
490
491
  withSkippedProviders
491
- } from "./chunk-V4TITINC.js";
492
+ } from "./chunk-QS262E4F.js";
492
493
 
493
494
  // src/runtime-context.ts
494
495
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -7898,6 +7899,216 @@ function resolveEmbedConfig(env, config) {
7898
7899
  };
7899
7900
  }
7900
7901
 
7902
+ // src/agent/providers.ts
7903
+ import "@earendil-works/pi-ai";
7904
+
7905
+ // src/agent/pi-models.ts
7906
+ import "@earendil-works/pi-ai";
7907
+ import { builtinModels } from "@earendil-works/pi-ai/providers/all";
7908
+ var aeroModels = builtinModels();
7909
+ var DEFAULT_MAX_RETRIES = 2;
7910
+ var DEFAULT_MAX_OUTPUT_TOKENS = 32e3;
7911
+ var CANONRY_USER_AGENT = "canonry";
7912
+ var STAINLESS_HOST_HEADERS = {
7913
+ "X-Stainless-OS": null,
7914
+ "X-Stainless-Arch": null,
7915
+ "X-Stainless-Runtime-Version": null
7916
+ };
7917
+ var HOST_HEADERS = {
7918
+ "anthropic-messages": STAINLESS_HOST_HEADERS,
7919
+ "openai-responses": STAINLESS_HOST_HEADERS,
7920
+ "openai-completions": STAINLESS_HOST_HEADERS,
7921
+ "google-generative-ai": { "x-goog-api-client": CANONRY_USER_AGENT }
7922
+ };
7923
+ function outputCap(model) {
7924
+ return Math.min(model.maxTokens, DEFAULT_MAX_OUTPUT_TOKENS);
7925
+ }
7926
+ function canonryDefaults(model, options) {
7927
+ return {
7928
+ ...options,
7929
+ maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,
7930
+ maxTokens: options?.maxTokens ?? outputCap(model),
7931
+ headers: { "User-Agent": CANONRY_USER_AGENT, ...HOST_HEADERS[model.api], ...options?.headers }
7932
+ };
7933
+ }
7934
+ var aeroStreamFn = (model, context, options) => aeroModels.streamSimple(model, context, canonryDefaults(model, options));
7935
+ function completeOnce(model, context, options = {}) {
7936
+ return aeroModels.complete(model, context, canonryDefaults(model, options));
7937
+ }
7938
+
7939
+ // src/agent/providers.ts
7940
+ var PROVIDER_MODELS = {
7941
+ [AgentProviderIds.claude]: {
7942
+ [LlmCapabilities.agent]: "claude-opus-4-7",
7943
+ [LlmCapabilities.analyze]: "claude-sonnet-4-6",
7944
+ [LlmCapabilities.classify]: "claude-haiku-4-5"
7945
+ },
7946
+ [AgentProviderIds.openai]: {
7947
+ [LlmCapabilities.agent]: "gpt-5.1",
7948
+ [LlmCapabilities.analyze]: "gpt-5-mini",
7949
+ [LlmCapabilities.classify]: "gpt-5-nano"
7950
+ },
7951
+ [AgentProviderIds.gemini]: {
7952
+ // Gemini's Flash is already cheap + capable; Flash-Lite is the
7953
+ // dedicated micro tier for classify. Analyze stays on flash because
7954
+ // flash-lite drops too much quality for structured synthesis.
7955
+ // Exact IDs, never Google's `-latest` aliases: pi-ai derives request
7956
+ // options (thinking level) from the catalog entry for the ID it is given,
7957
+ // and an alias entry can lag the model it serves. `gemini-flash-latest`
7958
+ // allows MINIMAL thinking while the 3.8 Flash it resolves to rejects it,
7959
+ // so every Aero turn failed. Sweeps can use the alias; Aero cannot.
7960
+ [LlmCapabilities.agent]: "gemini-3.8-flash",
7961
+ [LlmCapabilities.analyze]: "gemini-3.8-flash",
7962
+ [LlmCapabilities.classify]: "gemini-3.5-flash-lite"
7963
+ },
7964
+ [AgentProviderIds.zai]: {
7965
+ // GLM lineage: 5.2 replaced 5.1, which pi-ai 0.87 dropped from its
7966
+ // catalog; 5-turbo is the cheaper tier good for structured tasks and
7967
+ // classification.
7968
+ [LlmCapabilities.agent]: "glm-5.2",
7969
+ [LlmCapabilities.analyze]: "glm-5-turbo",
7970
+ [LlmCapabilities.classify]: "glm-5-turbo"
7971
+ }
7972
+ };
7973
+ var PROVIDER_DEFAULT_REASONING = {
7974
+ [AgentProviderIds.claude]: "off",
7975
+ [AgentProviderIds.openai]: "low",
7976
+ [AgentProviderIds.gemini]: "off",
7977
+ [AgentProviderIds.zai]: "off"
7978
+ };
7979
+ var AGENT_PROVIDERS = {
7980
+ [AgentProviderIds.claude]: {
7981
+ piAiProvider: "anthropic",
7982
+ label: "Anthropic (Claude)",
7983
+ defaultModel: PROVIDER_MODELS[AgentProviderIds.claude][LlmCapabilities.agent],
7984
+ autoDetectPriority: 0
7985
+ },
7986
+ [AgentProviderIds.openai]: {
7987
+ piAiProvider: "openai",
7988
+ label: "OpenAI",
7989
+ defaultModel: PROVIDER_MODELS[AgentProviderIds.openai][LlmCapabilities.agent],
7990
+ autoDetectPriority: 1
7991
+ },
7992
+ [AgentProviderIds.gemini]: {
7993
+ piAiProvider: "google",
7994
+ label: "Google (Gemini)",
7995
+ defaultModel: PROVIDER_MODELS[AgentProviderIds.gemini][LlmCapabilities.agent],
7996
+ autoDetectPriority: 2
7997
+ },
7998
+ [AgentProviderIds.zai]: {
7999
+ piAiProvider: "zai",
8000
+ label: "Z.ai (GLM)",
8001
+ defaultModel: PROVIDER_MODELS[AgentProviderIds.zai][LlmCapabilities.agent],
8002
+ autoDetectPriority: 3
8003
+ }
8004
+ };
8005
+ function agentProvidersByPriority() {
8006
+ return Object.keys(AGENT_PROVIDERS).slice().sort((a, b) => AGENT_PROVIDERS[a].autoDetectPriority - AGENT_PROVIDERS[b].autoDetectPriority);
8007
+ }
8008
+ function listAgentProviders() {
8009
+ return AGENT_PROVIDER_IDS;
8010
+ }
8011
+ function getAgentProvider(name) {
8012
+ return AGENT_PROVIDERS[name];
8013
+ }
8014
+ function coerceAgentProvider(value) {
8015
+ if (!value) return void 0;
8016
+ return isAgentProviderId(value) ? value : void 0;
8017
+ }
8018
+ function resolveModelForProvider(provider, modelId) {
8019
+ return resolveModelForCapability(provider, LlmCapabilities.agent, modelId);
8020
+ }
8021
+ function resolveModelForCapability(provider, capability, modelIdOverride) {
8022
+ const entry = AGENT_PROVIDERS[provider];
8023
+ const id = modelIdOverride ?? PROVIDER_MODELS[provider][capability];
8024
+ const model = aeroModels.getModel(entry.piAiProvider, id);
8025
+ if (!model) {
8026
+ throw new Error(
8027
+ `Model '${id}' not found for pi-ai provider '${entry.piAiProvider}'. Verify PROVIDER_MODELS[${provider}][${capability}] against the installed @earendil-works/pi-ai catalog.`
8028
+ );
8029
+ }
8030
+ if (provider === AgentProviderIds.gemini && process.env.GEMINI_BASE_URL) {
8031
+ const base = process.env.GEMINI_BASE_URL.replace(/\/+$/, "");
8032
+ const baseUrl = base.endsWith("/v1beta") ? base : `${base}/v1beta`;
8033
+ return { ...model, baseUrl };
8034
+ }
8035
+ if (provider === AgentProviderIds.zai && process.env.ZAI_BASE_URL) {
8036
+ const baseUrl = process.env.ZAI_BASE_URL.replace(/\/+$/, "");
8037
+ return { ...model, baseUrl };
8038
+ }
8039
+ return model;
8040
+ }
8041
+ function isAgentModelAvailable(provider, id) {
8042
+ return !!aeroModels.getModel(AGENT_PROVIDERS[provider].piAiProvider, id);
8043
+ }
8044
+ function validateAgentProviderRegistry() {
8045
+ for (const provider of listAgentProviders()) {
8046
+ for (const capability of LLM_CAPABILITIES) {
8047
+ resolveModelForCapability(provider, capability);
8048
+ }
8049
+ const entry = AGENT_PROVIDERS[provider];
8050
+ const agentModel = PROVIDER_MODELS[provider][LlmCapabilities.agent];
8051
+ if (entry.defaultModel !== agentModel) {
8052
+ throw new Error(
8053
+ `AGENT_PROVIDERS[${provider}].defaultModel ('${entry.defaultModel}') does not match PROVIDER_MODELS[${provider}].agent ('${agentModel}'). The two must stay in sync \u2014 defaultModel is a backward-compat shortcut to the agent-tier model.`
8054
+ );
8055
+ }
8056
+ }
8057
+ }
8058
+ function resolveApiKeyFor(providerOrPiAi, config) {
8059
+ return resolveApiKeySource(providerOrPiAi, config)?.key;
8060
+ }
8061
+ function resolveApiKeySource(providerOrPiAi, config) {
8062
+ const id = resolveAgentId(providerOrPiAi);
8063
+ if (!id) return void 0;
8064
+ const fromConfig = config.providers?.[id]?.apiKey;
8065
+ if (fromConfig) return { key: fromConfig, source: "config" };
8066
+ const fromEnv = agentProviderApiKeyEnvVars(id).map((name) => process.env[name]).find((value) => !!value);
8067
+ if (fromEnv) return { key: fromEnv, source: "env" };
8068
+ return void 0;
8069
+ }
8070
+ var CATALOG_API_KEY_ENV_VARS = {
8071
+ anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
8072
+ openai: ["OPENAI_API_KEY"],
8073
+ google: ["GEMINI_API_KEY"],
8074
+ zai: ["ZAI_API_KEY"]
8075
+ };
8076
+ function agentProviderApiKeyEnvVars(id) {
8077
+ const entry = AGENT_PROVIDERS[id];
8078
+ return CATALOG_API_KEY_ENV_VARS[entry.piAiProvider] ?? [`${entry.piAiProvider.toUpperCase()}_API_KEY`];
8079
+ }
8080
+ function agentProviderApiKeyEnvVar(id) {
8081
+ const names = agentProviderApiKeyEnvVars(id);
8082
+ return names[names.length - 1];
8083
+ }
8084
+ function resolveAgentId(providerOrPiAi) {
8085
+ if (isAgentProviderId(providerOrPiAi)) return providerOrPiAi;
8086
+ for (const id of AGENT_PROVIDER_IDS) {
8087
+ if (AGENT_PROVIDERS[id].piAiProvider === providerOrPiAi) return id;
8088
+ }
8089
+ return void 0;
8090
+ }
8091
+ function buildAgentProvidersResponse(config) {
8092
+ const pinned = coerceAgentProvider(config.agent?.provider ?? void 0);
8093
+ const pinnedModel = pinned ? config.agent?.model ?? void 0 : void 0;
8094
+ const providers = listAgentProviders().map((id) => {
8095
+ const entry = AGENT_PROVIDERS[id];
8096
+ const source = resolveApiKeySource(id, config);
8097
+ return {
8098
+ id,
8099
+ label: entry.label,
8100
+ defaultModel: id === pinned && pinnedModel ? pinnedModel : entry.defaultModel,
8101
+ configured: source !== void 0,
8102
+ keySource: source?.source ?? null
8103
+ };
8104
+ });
8105
+ const firstConfigured = agentProvidersByPriority().find((p) => resolveApiKeySource(p, config));
8106
+ return {
8107
+ providers,
8108
+ defaultProvider: pinned ?? firstConfigured ?? null
8109
+ };
8110
+ }
8111
+
7901
8112
  // src/agent-config.ts
7902
8113
  function resolveAgentEnabled(env, config) {
7903
8114
  const raw = env.CANONRY_AGENT_DISABLED?.trim();
@@ -7918,6 +8129,11 @@ function resolveAgentAllowViewers(env, config) {
7918
8129
  if (raw) return raw === "1" || raw.toLowerCase() === "true";
7919
8130
  return config.agent?.allowViewers === true;
7920
8131
  }
8132
+ function resolveAgentReasoning(env, config, provider) {
8133
+ const raw = env.CANONRY_AGENT_REASONING?.trim().toLowerCase();
8134
+ if (raw && AGENT_REASONING_LEVELS.includes(raw)) return raw;
8135
+ return config.agent?.reasoning ?? PROVIDER_DEFAULT_REASONING[provider];
8136
+ }
7921
8137
 
7922
8138
  // src/places-config.ts
7923
8139
  var DEFAULT_TIER = "atmosphere";
@@ -8379,7 +8595,7 @@ function nonBlank(value) {
8379
8595
  return trimmed ? trimmed : void 0;
8380
8596
  }
8381
8597
  function resolveBuildCommit(env = process.env) {
8382
- const embedded = true ? "9ce35e04ebca5b27f629e69d2e2776b1203ac5ee" : void 0;
8598
+ const embedded = true ? "9f06b9b97902d0fbbbf7bc283835425fe4673538" : void 0;
8383
8599
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
8384
8600
  }
8385
8601
  function resolveInstanceIdentity(env = process.env) {
@@ -15433,210 +15649,6 @@ function recordLlmUsageEvent(args) {
15433
15649
  }
15434
15650
  }
15435
15651
 
15436
- // src/agent/providers.ts
15437
- import "@earendil-works/pi-ai";
15438
-
15439
- // src/agent/pi-models.ts
15440
- import "@earendil-works/pi-ai";
15441
- import { builtinModels } from "@earendil-works/pi-ai/providers/all";
15442
- var aeroModels = builtinModels();
15443
- var DEFAULT_MAX_RETRIES = 2;
15444
- var DEFAULT_MAX_OUTPUT_TOKENS = 32e3;
15445
- var CANONRY_USER_AGENT = "canonry";
15446
- var STAINLESS_HOST_HEADERS = {
15447
- "X-Stainless-OS": null,
15448
- "X-Stainless-Arch": null,
15449
- "X-Stainless-Runtime-Version": null
15450
- };
15451
- var HOST_HEADERS = {
15452
- "anthropic-messages": STAINLESS_HOST_HEADERS,
15453
- "openai-responses": STAINLESS_HOST_HEADERS,
15454
- "openai-completions": STAINLESS_HOST_HEADERS,
15455
- "google-generative-ai": { "x-goog-api-client": CANONRY_USER_AGENT }
15456
- };
15457
- function outputCap(model) {
15458
- return Math.min(model.maxTokens, DEFAULT_MAX_OUTPUT_TOKENS);
15459
- }
15460
- function canonryDefaults(model, options) {
15461
- return {
15462
- ...options,
15463
- maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,
15464
- maxTokens: options?.maxTokens ?? outputCap(model),
15465
- headers: { "User-Agent": CANONRY_USER_AGENT, ...HOST_HEADERS[model.api], ...options?.headers }
15466
- };
15467
- }
15468
- var aeroStreamFn = (model, context, options) => aeroModels.streamSimple(model, context, canonryDefaults(model, options));
15469
- function completeOnce(model, context, options = {}) {
15470
- return aeroModels.complete(model, context, canonryDefaults(model, options));
15471
- }
15472
-
15473
- // src/agent/providers.ts
15474
- var PROVIDER_MODELS = {
15475
- [AgentProviderIds.claude]: {
15476
- [LlmCapabilities.agent]: "claude-opus-4-7",
15477
- [LlmCapabilities.analyze]: "claude-sonnet-4-6",
15478
- [LlmCapabilities.classify]: "claude-haiku-4-5"
15479
- },
15480
- [AgentProviderIds.openai]: {
15481
- [LlmCapabilities.agent]: "gpt-5.1",
15482
- [LlmCapabilities.analyze]: "gpt-5-mini",
15483
- [LlmCapabilities.classify]: "gpt-5-nano"
15484
- },
15485
- [AgentProviderIds.gemini]: {
15486
- // Gemini's Flash is already cheap + capable; Flash-Lite is the
15487
- // dedicated micro tier for classify. Analyze stays on flash because
15488
- // flash-lite drops too much quality for structured synthesis.
15489
- // Exact IDs, never Google's `-latest` aliases: pi-ai derives request
15490
- // options (thinking level) from the catalog entry for the ID it is given,
15491
- // and an alias entry can lag the model it serves. `gemini-flash-latest`
15492
- // allows MINIMAL thinking while the 3.8 Flash it resolves to rejects it,
15493
- // so every Aero turn failed. Sweeps can use the alias; Aero cannot.
15494
- [LlmCapabilities.agent]: "gemini-3.8-flash",
15495
- [LlmCapabilities.analyze]: "gemini-3.8-flash",
15496
- [LlmCapabilities.classify]: "gemini-3.5-flash-lite"
15497
- },
15498
- [AgentProviderIds.zai]: {
15499
- // GLM lineage: 5.2 replaced 5.1, which pi-ai 0.87 dropped from its
15500
- // catalog; 5-turbo is the cheaper tier good for structured tasks and
15501
- // classification.
15502
- [LlmCapabilities.agent]: "glm-5.2",
15503
- [LlmCapabilities.analyze]: "glm-5-turbo",
15504
- [LlmCapabilities.classify]: "glm-5-turbo"
15505
- }
15506
- };
15507
- var AGENT_PROVIDERS = {
15508
- [AgentProviderIds.claude]: {
15509
- piAiProvider: "anthropic",
15510
- label: "Anthropic (Claude)",
15511
- defaultModel: PROVIDER_MODELS[AgentProviderIds.claude][LlmCapabilities.agent],
15512
- autoDetectPriority: 0
15513
- },
15514
- [AgentProviderIds.openai]: {
15515
- piAiProvider: "openai",
15516
- label: "OpenAI",
15517
- defaultModel: PROVIDER_MODELS[AgentProviderIds.openai][LlmCapabilities.agent],
15518
- autoDetectPriority: 1
15519
- },
15520
- [AgentProviderIds.gemini]: {
15521
- piAiProvider: "google",
15522
- label: "Google (Gemini)",
15523
- defaultModel: PROVIDER_MODELS[AgentProviderIds.gemini][LlmCapabilities.agent],
15524
- autoDetectPriority: 2
15525
- },
15526
- [AgentProviderIds.zai]: {
15527
- piAiProvider: "zai",
15528
- label: "Z.ai (GLM)",
15529
- defaultModel: PROVIDER_MODELS[AgentProviderIds.zai][LlmCapabilities.agent],
15530
- autoDetectPriority: 3
15531
- }
15532
- };
15533
- function agentProvidersByPriority() {
15534
- return Object.keys(AGENT_PROVIDERS).slice().sort((a, b) => AGENT_PROVIDERS[a].autoDetectPriority - AGENT_PROVIDERS[b].autoDetectPriority);
15535
- }
15536
- function listAgentProviders() {
15537
- return AGENT_PROVIDER_IDS;
15538
- }
15539
- function getAgentProvider(name) {
15540
- return AGENT_PROVIDERS[name];
15541
- }
15542
- function coerceAgentProvider(value) {
15543
- if (!value) return void 0;
15544
- return isAgentProviderId(value) ? value : void 0;
15545
- }
15546
- function resolveModelForProvider(provider, modelId) {
15547
- return resolveModelForCapability(provider, LlmCapabilities.agent, modelId);
15548
- }
15549
- function resolveModelForCapability(provider, capability, modelIdOverride) {
15550
- const entry = AGENT_PROVIDERS[provider];
15551
- const id = modelIdOverride ?? PROVIDER_MODELS[provider][capability];
15552
- const model = aeroModels.getModel(entry.piAiProvider, id);
15553
- if (!model) {
15554
- throw new Error(
15555
- `Model '${id}' not found for pi-ai provider '${entry.piAiProvider}'. Verify PROVIDER_MODELS[${provider}][${capability}] against the installed @earendil-works/pi-ai catalog.`
15556
- );
15557
- }
15558
- if (provider === AgentProviderIds.gemini && process.env.GEMINI_BASE_URL) {
15559
- const base = process.env.GEMINI_BASE_URL.replace(/\/+$/, "");
15560
- const baseUrl = base.endsWith("/v1beta") ? base : `${base}/v1beta`;
15561
- return { ...model, baseUrl };
15562
- }
15563
- if (provider === AgentProviderIds.zai && process.env.ZAI_BASE_URL) {
15564
- const baseUrl = process.env.ZAI_BASE_URL.replace(/\/+$/, "");
15565
- return { ...model, baseUrl };
15566
- }
15567
- return model;
15568
- }
15569
- function isAgentModelAvailable(provider, id) {
15570
- return !!aeroModels.getModel(AGENT_PROVIDERS[provider].piAiProvider, id);
15571
- }
15572
- function validateAgentProviderRegistry() {
15573
- for (const provider of listAgentProviders()) {
15574
- for (const capability of LLM_CAPABILITIES) {
15575
- resolveModelForCapability(provider, capability);
15576
- }
15577
- const entry = AGENT_PROVIDERS[provider];
15578
- const agentModel = PROVIDER_MODELS[provider][LlmCapabilities.agent];
15579
- if (entry.defaultModel !== agentModel) {
15580
- throw new Error(
15581
- `AGENT_PROVIDERS[${provider}].defaultModel ('${entry.defaultModel}') does not match PROVIDER_MODELS[${provider}].agent ('${agentModel}'). The two must stay in sync \u2014 defaultModel is a backward-compat shortcut to the agent-tier model.`
15582
- );
15583
- }
15584
- }
15585
- }
15586
- function resolveApiKeyFor(providerOrPiAi, config) {
15587
- return resolveApiKeySource(providerOrPiAi, config)?.key;
15588
- }
15589
- function resolveApiKeySource(providerOrPiAi, config) {
15590
- const id = resolveAgentId(providerOrPiAi);
15591
- if (!id) return void 0;
15592
- const fromConfig = config.providers?.[id]?.apiKey;
15593
- if (fromConfig) return { key: fromConfig, source: "config" };
15594
- const fromEnv = agentProviderApiKeyEnvVars(id).map((name) => process.env[name]).find((value) => !!value);
15595
- if (fromEnv) return { key: fromEnv, source: "env" };
15596
- return void 0;
15597
- }
15598
- var CATALOG_API_KEY_ENV_VARS = {
15599
- anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
15600
- openai: ["OPENAI_API_KEY"],
15601
- google: ["GEMINI_API_KEY"],
15602
- zai: ["ZAI_API_KEY"]
15603
- };
15604
- function agentProviderApiKeyEnvVars(id) {
15605
- const entry = AGENT_PROVIDERS[id];
15606
- return CATALOG_API_KEY_ENV_VARS[entry.piAiProvider] ?? [`${entry.piAiProvider.toUpperCase()}_API_KEY`];
15607
- }
15608
- function agentProviderApiKeyEnvVar(id) {
15609
- const names = agentProviderApiKeyEnvVars(id);
15610
- return names[names.length - 1];
15611
- }
15612
- function resolveAgentId(providerOrPiAi) {
15613
- if (isAgentProviderId(providerOrPiAi)) return providerOrPiAi;
15614
- for (const id of AGENT_PROVIDER_IDS) {
15615
- if (AGENT_PROVIDERS[id].piAiProvider === providerOrPiAi) return id;
15616
- }
15617
- return void 0;
15618
- }
15619
- function buildAgentProvidersResponse(config) {
15620
- const pinned = coerceAgentProvider(config.agent?.provider ?? void 0);
15621
- const pinnedModel = pinned ? config.agent?.model ?? void 0 : void 0;
15622
- const providers = listAgentProviders().map((id) => {
15623
- const entry = AGENT_PROVIDERS[id];
15624
- const source = resolveApiKeySource(id, config);
15625
- return {
15626
- id,
15627
- label: entry.label,
15628
- defaultModel: id === pinned && pinnedModel ? pinnedModel : entry.defaultModel,
15629
- configured: source !== void 0,
15630
- keySource: source?.source ?? null
15631
- };
15632
- });
15633
- const firstConfigured = agentProvidersByPriority().find((p) => resolveApiKeySource(p, config));
15634
- return {
15635
- providers,
15636
- defaultProvider: pinned ?? firstConfigured ?? null
15637
- };
15638
- }
15639
-
15640
15652
  // src/agent/session.ts
15641
15653
  import fs10 from "fs";
15642
15654
  import path9 from "path";
@@ -17614,6 +17626,7 @@ function createAeroSession(opts) {
17614
17626
  const provider = opts.provider ?? detectAgentProvider(opts.config);
17615
17627
  if (!provider) throw new Error(missingProviderMessage());
17616
17628
  const model = resolveAeroModel(provider, opts.modelId);
17629
+ const thinkingLevel = resolveAgentReasoning(process.env, opts.config, provider);
17617
17630
  const toolScope = opts.toolScope ?? AeroToolScopes.all;
17618
17631
  const toolProfile = opts.toolProfile ?? AeroToolProfiles.default;
17619
17632
  const toolCtx = {
@@ -17633,6 +17646,7 @@ function createAeroSession(opts) {
17633
17646
  initialState: {
17634
17647
  systemPrompt,
17635
17648
  model,
17649
+ thinkingLevel,
17636
17650
  tools,
17637
17651
  ...opts.initialMessages ? { messages: opts.initialMessages } : {}
17638
17652
  },
@@ -20966,6 +20980,7 @@ ${lines.join("\n")}
20966
20980
  const { provider: nextProvider, modelId: nextModelId } = this.resolveTurnModel(preferences, { provider: row.modelProvider, modelId: row.modelId });
20967
20981
  if (nextProvider === currentProvider && nextModelId === currentModelId) return;
20968
20982
  agent.state.model = resolveAeroModel(nextProvider, nextModelId);
20983
+ agent.state.thinkingLevel = resolveAgentReasoning(process.env, this.opts.config, nextProvider);
20969
20984
  this.opts.db.update(agentSessions).set({
20970
20985
  modelProvider: nextProvider,
20971
20986
  modelId: nextModelId,
@@ -163,7 +163,7 @@ import {
163
163
  trafficSeriesGranularitySchema,
164
164
  visibilityCompareSelectionSchema,
165
165
  visibilityReportRequestSchema
166
- } from "./chunk-V4TITINC.js";
166
+ } from "./chunk-QS262E4F.js";
167
167
 
168
168
  // src/package-version.ts
169
169
  import { createRequire } from "module";
@@ -31,7 +31,7 @@ import {
31
31
  trackFeatureCompleted,
32
32
  trackIntegrationConnection,
33
33
  waitForServerRuntimeStartup
34
- } from "./chunk-AYMS4LCP.js";
34
+ } from "./chunk-RUAQAQ7X.js";
35
35
  import {
36
36
  clearDashboardPassword,
37
37
  configExists,
@@ -50,7 +50,7 @@ import {
50
50
  saveConfigPatch,
51
51
  shouldPrintServeSkillsNudge,
52
52
  withBootstrapProviderDefaults
53
- } from "./chunk-WMG365JI.js";
53
+ } from "./chunk-CIYCCA2I.js";
54
54
  import {
55
55
  emitJsonl,
56
56
  getBoolean,
@@ -64,7 +64,7 @@ import {
64
64
  resolveCliAccess,
65
65
  stringOption,
66
66
  unknownSubcommand
67
- } from "./chunk-QBZPKXFW.js";
67
+ } from "./chunk-DGKSQ5QD.js";
68
68
  import {
69
69
  DEFAULT_DEMO_TRUSTED_PROXIES,
70
70
  trustedProxiesProblem,
@@ -77,7 +77,7 @@ import {
77
77
  resolveDiscoveredGscSitemapUrls,
78
78
  runMeasurementDraftAction,
79
79
  submitGscSitemapBatches
80
- } from "./chunk-PCZXWOYX.js";
80
+ } from "./chunk-XHRJYIJQ.js";
81
81
  import {
82
82
  CANONRY_DISCORD_URL,
83
83
  CANONRY_ISSUES_URL,
@@ -122,7 +122,7 @@ import {
122
122
  rawEventSamples,
123
123
  readMarketCompetitorNames,
124
124
  runs
125
- } from "./chunk-ZOTA3MOL.js";
125
+ } from "./chunk-KCSU2OSL.js";
126
126
  import {
127
127
  AdsDeliverySnapshotStatuses,
128
128
  AdsHistoricalCampaignRollupStatuses,
@@ -278,7 +278,7 @@ import {
278
278
  visibilityCompareSelectionSchema,
279
279
  visibilityReportRequestSchema,
280
280
  winnabilityClassSchema
281
- } from "./chunk-V4TITINC.js";
281
+ } from "./chunk-QS262E4F.js";
282
282
 
283
283
  // src/cli-commands/sentiment.ts
284
284
  import "zod";
@@ -586,7 +586,7 @@ function parseDemoTrustedProxies(values) {
586
586
  async function demoCommand(options) {
587
587
  const { host, port } = parseDemoListenOptions(options);
588
588
  const trustProxy = parseDemoTrustedProxies(options.trustProxy);
589
- const { createDemoServer } = await import("./demo-server-7YFRG3JM.js");
589
+ const { createDemoServer } = await import("./demo-server-ASCEFIVC.js");
590
590
  const app = await createDemoServer({ trustProxy });
591
591
  let stopping = false;
592
592
  const stop = () => {
@@ -1000,7 +1000,7 @@ No DB writes performed. Re-run without --dry-run to apply.`);
1000
1000
  }
1001
1001
  }
1002
1002
  async function backfillInsightsCommand(project2, opts) {
1003
- const { IntelligenceService } = await import("./intelligence-service-P3UJNCVS.js");
1003
+ const { IntelligenceService } = await import("./intelligence-service-VRWJUHNM.js");
1004
1004
  const config = loadConfig();
1005
1005
  const db = createClient(config.database);
1006
1006
  migrate(db);
@@ -19378,7 +19378,7 @@ var SYSTEM_CLI_COMMANDS = [
19378
19378
  options: { access: stringOption() },
19379
19379
  run: async (input) => {
19380
19380
  if (input.positionals.length > 1) throw usageError("Expected at most one command group");
19381
- const [{ printCliCatalog }, { REGISTERED_CLI_COMMANDS: REGISTERED_CLI_COMMANDS2 }] = await Promise.all([import("./cli-catalog-TFCCKIE4.js"), import("./cli-commands-GYWXFE3P.js")]);
19381
+ const [{ printCliCatalog }, { REGISTERED_CLI_COMMANDS: REGISTERED_CLI_COMMANDS2 }] = await Promise.all([import("./cli-catalog-MRYQK7LI.js"), import("./cli-commands-RJF4TCEZ.js")]);
19382
19382
  printCliCatalog(REGISTERED_CLI_COMMANDS2, input.format, input.positionals[0], getString(input.values, "access"));
19383
19383
  }
19384
19384
  },
@@ -3,10 +3,10 @@ import {
3
3
  buildCliCatalog,
4
4
  printCliCatalog,
5
5
  renderTopLevelHelp
6
- } from "./chunk-Y2QMWZT7.js";
7
- import "./chunk-QBZPKXFW.js";
6
+ } from "./chunk-66K6U5H5.js";
7
+ import "./chunk-DGKSQ5QD.js";
8
8
  import "./chunk-HGMYEDAQ.js";
9
- import "./chunk-V4TITINC.js";
9
+ import "./chunk-QS262E4F.js";
10
10
  export {
11
11
  CLI_ROOT_SUMMARIES,
12
12
  buildCliCatalog,
@@ -0,0 +1,15 @@
1
+ import {
2
+ REGISTERED_CLI_COMMANDS
3
+ } from "./chunk-XLKWD5WO.js";
4
+ import "./chunk-RUAQAQ7X.js";
5
+ import "./chunk-CIYCCA2I.js";
6
+ import "./chunk-DGKSQ5QD.js";
7
+ import "./chunk-RB2F4D3Z.js";
8
+ import "./chunk-3F4KBEMY.js";
9
+ import "./chunk-XHRJYIJQ.js";
10
+ import "./chunk-HGMYEDAQ.js";
11
+ import "./chunk-KCSU2OSL.js";
12
+ import "./chunk-QS262E4F.js";
13
+ export {
14
+ REGISTERED_CLI_COMMANDS
15
+ };