@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.
- package/assets/assets/{AuditHistoryPanel-u65pF2eT.js → AuditHistoryPanel-BTlvVW6p.js} +1 -1
- package/assets/assets/{BacklinksPage-CmYpSNGB.js → BacklinksPage-DQu_3poO.js} +1 -1
- package/assets/assets/{HistoryPage-CqzQSAil.js → HistoryPage-D_3qu4SQ.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-KfpmUisb.js → MeasurementPropertyPage-FKmEMw_G.js} +1 -1
- package/assets/assets/{ProjectPage-BCiospUp.js → ProjectPage-H7nsLkhG.js} +1 -1
- package/assets/assets/{RunsPage-CzPvTnwG.js → RunsPage-CE5wFNdP.js} +1 -1
- package/assets/assets/{SettingsPage-CZYckyPO.js → SettingsPage-D2zKpqOv.js} +1 -1
- package/assets/assets/{SiteHealthSection-Bm5nWAoZ.js → SiteHealthSection-ClZRxJ-A.js} +3 -3
- package/assets/assets/{TrafficPage-DZw_GvaO.js → TrafficPage-BDH4Dzk0.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-CD20PJ4A.js → TrafficSourceDetailPage-DaVUcHXu.js} +1 -1
- package/assets/assets/{extract-error-message-Cpzj_AMZ.js → extract-error-message-YXzyZAEc.js} +1 -1
- package/assets/assets/{index-BHLYJHa-.js → index-Zj8hd7aE.js} +3 -3
- package/assets/assets/{react-sigma_core.esm.min-CK2U3T7S.js → react-sigma_core.esm.min-9j5NHFWR.js} +1 -1
- package/assets/assets/{v2-overview-adapter-DL1IsAM2.js → v2-overview-adapter-BsKpkQvx.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-KPOZR6MV.js → chunk-3F4KBEMY.js} +2 -2
- package/dist/{chunk-Y2QMWZT7.js → chunk-66K6U5H5.js} +3 -3
- package/dist/{chunk-WMG365JI.js → chunk-CIYCCA2I.js} +11 -2
- package/dist/{chunk-QBZPKXFW.js → chunk-DGKSQ5QD.js} +1 -1
- package/dist/{chunk-GWRIZSIL.js → chunk-HQS2Y7HO.js} +3 -3
- package/dist/{chunk-ZOTA3MOL.js → chunk-KCSU2OSL.js} +242 -112
- package/dist/{chunk-V4TITINC.js → chunk-QS262E4F.js} +9 -1
- package/dist/{chunk-AYMS4LCP.js → chunk-RUAQAQ7X.js} +225 -210
- package/dist/{chunk-PCZXWOYX.js → chunk-XHRJYIJQ.js} +1 -1
- package/dist/{chunk-2UQ6WVWP.js → chunk-XLKWD5WO.js} +9 -9
- package/dist/{cli-catalog-TFCCKIE4.js → cli-catalog-MRYQK7LI.js} +3 -3
- package/dist/cli-commands-RJF4TCEZ.js +15 -0
- package/dist/cli.js +10 -10
- package/dist/{demo-server-7YFRG3JM.js → demo-server-ASCEFIVC.js} +4 -4
- package/dist/index.d.ts +12 -0
- package/dist/index.js +6 -6
- package/dist/{intelligence-service-P3UJNCVS.js → intelligence-service-VRWJUHNM.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +11 -11
- 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-
|
|
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-
|
|
32
|
+
} from "./chunk-3F4KBEMY.js";
|
|
32
33
|
import {
|
|
33
34
|
CanonryMcpToolNames,
|
|
34
35
|
PACKAGE_VERSION,
|
|
35
36
|
canonryMcpTools
|
|
36
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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 ? "
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-66K6U5H5.js";
|
|
7
|
+
import "./chunk-DGKSQ5QD.js";
|
|
8
8
|
import "./chunk-HGMYEDAQ.js";
|
|
9
|
-
import "./chunk-
|
|
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
|
+
};
|