@ainyc/canonry 4.97.0 → 4.98.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/agent-workspace/skills/canonry/references/canonry-cli.md +7 -3
- package/assets/assets/{BacklinksPage-BI9BtHjp.js → BacklinksPage-CuWs7I1D.js} +1 -1
- package/assets/assets/{ChartPrimitives-BcjGunGr.js → ChartPrimitives-bm37tprp.js} +1 -1
- package/assets/assets/{ProjectPage-BdoberYt.js → ProjectPage-BksYe8FP.js} +1 -1
- package/assets/assets/{RunRow-BT2kpdQR.js → RunRow-DzhQl87g.js} +1 -1
- package/assets/assets/{RunsPage-BAgZuX7j.js → RunsPage-wOaewhbF.js} +1 -1
- package/assets/assets/{SettingsPage-BvKcpivM.js → SettingsPage-CJdhhkkE.js} +1 -1
- package/assets/assets/{TrafficPage-BdGOZv1e.js → TrafficPage-BJBeN5Ph.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-C_N2D9xy.js → TrafficSourceDetailPage-D3PmH0B1.js} +1 -1
- package/assets/assets/{arrow-left-C8Fbup8X.js → arrow-left-BmITMI6O.js} +1 -1
- package/assets/assets/{extract-error-message-C29K35Gm.js → extract-error-message-BGwnyAfP.js} +1 -1
- package/assets/assets/{index-BGfyt3LX.js → index-BSX6r6ju.js} +9 -9
- package/assets/assets/{trash-2-DWLIELE_.js → trash-2-Bd2mkP_w.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-SRJ5IGNK.js → chunk-3TH54726.js} +2 -2
- package/dist/{chunk-NUGGUQH3.js → chunk-7COFPNMH.js} +106 -8
- package/dist/{chunk-E2FDXNMW.js → chunk-CWFTMFEU.js} +5 -3
- package/dist/{chunk-TXNKKTFD.js → chunk-DJVUNURL.js} +51 -2
- package/dist/cli.js +4 -4
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-DC2TD7RR.js → intelligence-service-QHBXW4KI.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c}from"./index-
|
|
1
|
+
import{c}from"./index-BSX6r6ju.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
|
package/assets/index.html
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
|
|
13
13
|
<link rel="apple-touch-icon" href="./apple-touch-icon.png" />
|
|
14
14
|
<title>Canonry</title>
|
|
15
|
-
<script type="module" crossorigin src="./assets/index-
|
|
15
|
+
<script type="module" crossorigin src="./assets/index-BSX6r6ju.js"></script>
|
|
16
16
|
<link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Be8JdV5M.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="./assets/vendor-radix-CQ77EO2y.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="./assets/vendor-recharts-C9EZkgbP.js">
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
trafficConnectVercelRequestSchema,
|
|
25
25
|
trafficConnectWordpressRequestSchema,
|
|
26
26
|
trafficEventKindSchema
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-CWFTMFEU.js";
|
|
28
28
|
|
|
29
29
|
// src/config.ts
|
|
30
30
|
import fs from "fs";
|
|
@@ -5466,7 +5466,7 @@ var contentTargetsInputSchema = z2.object({
|
|
|
5466
5466
|
var contentBriefInputSchema = z2.object({
|
|
5467
5467
|
project: projectNameSchema,
|
|
5468
5468
|
targetRef: z2.string().min(1).describe("Stable target ref from canonry_content_targets. The target must be ownable; ceded targets are rejected."),
|
|
5469
|
-
provider: z2.string().optional().describe("Optional provider override (claude|openai|gemini|zai)."),
|
|
5469
|
+
provider: z2.string().optional().describe("Optional provider override (claude|openai|gemini|zai|deepinfra)."),
|
|
5470
5470
|
model: z2.string().optional().describe("Optional model override within the chosen provider."),
|
|
5471
5471
|
forceRefresh: z2.boolean().optional().describe("Force a fresh synthesis even if a cached brief exists.")
|
|
5472
5472
|
});
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
loadConfig,
|
|
10
10
|
loadConfigRaw,
|
|
11
11
|
saveConfigPatch
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3TH54726.js";
|
|
13
13
|
import {
|
|
14
14
|
CC_CACHE_DIR,
|
|
15
15
|
DUCKDB_SPEC,
|
|
@@ -111,7 +111,7 @@ import {
|
|
|
111
111
|
siteAuditPages,
|
|
112
112
|
siteAuditSnapshots,
|
|
113
113
|
usageCounters
|
|
114
|
-
} from "./chunk-
|
|
114
|
+
} from "./chunk-DJVUNURL.js";
|
|
115
115
|
import {
|
|
116
116
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
117
117
|
AGENT_PROVIDER_IDS,
|
|
@@ -171,7 +171,7 @@ import {
|
|
|
171
171
|
validationError,
|
|
172
172
|
winnabilityClassLabel,
|
|
173
173
|
withRetry
|
|
174
|
-
} from "./chunk-
|
|
174
|
+
} from "./chunk-CWFTMFEU.js";
|
|
175
175
|
|
|
176
176
|
// src/telemetry.ts
|
|
177
177
|
import crypto from "crypto";
|
|
@@ -6402,7 +6402,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
6402
6402
|
return result;
|
|
6403
6403
|
}
|
|
6404
6404
|
async function backfillInsightsCommand(project, opts) {
|
|
6405
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
6405
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-QHBXW4KI.js");
|
|
6406
6406
|
const config = loadConfig();
|
|
6407
6407
|
const db = createClient(config.database);
|
|
6408
6408
|
migrate(db);
|
|
@@ -7988,7 +7988,10 @@ import { Agent } from "@mariozechner/pi-agent-core";
|
|
|
7988
7988
|
import { registerBuiltInApiProviders } from "@mariozechner/pi-ai";
|
|
7989
7989
|
|
|
7990
7990
|
// src/agent/providers.ts
|
|
7991
|
-
import {
|
|
7991
|
+
import {
|
|
7992
|
+
getEnvApiKey,
|
|
7993
|
+
getModel
|
|
7994
|
+
} from "@mariozechner/pi-ai";
|
|
7992
7995
|
var PROVIDER_MODELS = {
|
|
7993
7996
|
[AgentProviderIds.claude]: {
|
|
7994
7997
|
[LlmCapabilities.agent]: "claude-opus-4-7",
|
|
@@ -8014,6 +8017,14 @@ var PROVIDER_MODELS = {
|
|
|
8014
8017
|
[LlmCapabilities.agent]: "glm-5.1",
|
|
8015
8018
|
[LlmCapabilities.analyze]: "glm-5-turbo",
|
|
8016
8019
|
[LlmCapabilities.classify]: "glm-5-turbo"
|
|
8020
|
+
},
|
|
8021
|
+
[AgentProviderIds.deepinfra]: {
|
|
8022
|
+
// DeepInfra `org/Model` slugs. GLM-5.2 drives the agent loop; the much
|
|
8023
|
+
// cheaper DeepSeek-V4-Flash fills analyze + classify. Resolved into a
|
|
8024
|
+
// custom openai-completions model, not pi-ai's catalog.
|
|
8025
|
+
[LlmCapabilities.agent]: "zai-org/GLM-5.2",
|
|
8026
|
+
[LlmCapabilities.analyze]: "deepseek-ai/DeepSeek-V4-Flash",
|
|
8027
|
+
[LlmCapabilities.classify]: "deepseek-ai/DeepSeek-V4-Flash"
|
|
8017
8028
|
}
|
|
8018
8029
|
};
|
|
8019
8030
|
var AGENT_PROVIDERS = {
|
|
@@ -8040,6 +8051,62 @@ var AGENT_PROVIDERS = {
|
|
|
8040
8051
|
label: "Z.ai (GLM)",
|
|
8041
8052
|
defaultModel: PROVIDER_MODELS[AgentProviderIds.zai][LlmCapabilities.agent],
|
|
8042
8053
|
autoDetectPriority: 3
|
|
8054
|
+
},
|
|
8055
|
+
[AgentProviderIds.deepinfra]: {
|
|
8056
|
+
// `piAiProvider` is the canonical id here (not a pi-ai vendor) — it's the
|
|
8057
|
+
// `model.provider` string the agent loop hands to `getApiKey`, which
|
|
8058
|
+
// `resolveAgentId` maps straight back to the deepinfra config/env key.
|
|
8059
|
+
piAiProvider: AgentProviderIds.deepinfra,
|
|
8060
|
+
label: "DeepInfra (GLM / DeepSeek)",
|
|
8061
|
+
defaultModel: PROVIDER_MODELS[AgentProviderIds.deepinfra][LlmCapabilities.agent],
|
|
8062
|
+
autoDetectPriority: 4,
|
|
8063
|
+
openaiCompatible: {
|
|
8064
|
+
baseUrl: "https://api.deepinfra.com/v1/openai",
|
|
8065
|
+
baseUrlEnvVar: "DEEPINFRA_BASE_URL",
|
|
8066
|
+
apiKeyEnvVar: "DEEPINFRA_TOKEN",
|
|
8067
|
+
// DeepInfra serves open-weight models (GLM, DeepSeek) behind an
|
|
8068
|
+
// OpenAI-compatible vLLM endpoint. pi-ai's `detectCompat` has no rule
|
|
8069
|
+
// for api.deepinfra.com, so it would apply the strict OpenAI profile;
|
|
8070
|
+
// we set the same open-model profile pi-ai uses for deepseek.com /
|
|
8071
|
+
// cerebras / z.ai. `developer` role and `reasoning_effort` are
|
|
8072
|
+
// OpenAI-platform-isms these models reject, `store` is response
|
|
8073
|
+
// persistence DeepInfra doesn't implement, and DeepInfra documents
|
|
8074
|
+
// `max_tokens` (not `max_completion_tokens`) on its OpenAI route.
|
|
8075
|
+
compat: {
|
|
8076
|
+
supportsStore: false,
|
|
8077
|
+
supportsDeveloperRole: false,
|
|
8078
|
+
supportsReasoningEffort: false,
|
|
8079
|
+
maxTokensField: "max_tokens"
|
|
8080
|
+
},
|
|
8081
|
+
// Best-effort metadata. Costs are USD/1M tokens (DeepInfra published
|
|
8082
|
+
// rates: GLM-5.2 ~$0.95 in / $0.18 cached / $3.00 out; DeepSeek-V4-Flash
|
|
8083
|
+
// ~$0.10 in / $0.20 out). contextWindow is DeepInfra's 1M (fp4) serving
|
|
8084
|
+
// window for both models; it's descriptive (see OpenAiCompatibleModelMeta),
|
|
8085
|
+
// so it documents the real window rather than gating compaction.
|
|
8086
|
+
knownModels: {
|
|
8087
|
+
"zai-org/GLM-5.2": {
|
|
8088
|
+
contextWindow: 1048576,
|
|
8089
|
+
maxTokens: 98304,
|
|
8090
|
+
reasoning: true,
|
|
8091
|
+
cost: { input: 0.95, output: 3, cacheRead: 0.18, cacheWrite: 0 }
|
|
8092
|
+
},
|
|
8093
|
+
"deepseek-ai/DeepSeek-V4-Flash": {
|
|
8094
|
+
contextWindow: 1048576,
|
|
8095
|
+
maxTokens: 32768,
|
|
8096
|
+
reasoning: false,
|
|
8097
|
+
cost: { input: 0.1, output: 0.2, cacheRead: 0, cacheWrite: 0 }
|
|
8098
|
+
}
|
|
8099
|
+
},
|
|
8100
|
+
// Fallback for arbitrary `--model` slugs we don't ship as tiers. cost is
|
|
8101
|
+
// 0, so an unknown slug isn't cost-tracked by pi-ai's `calculateCost`;
|
|
8102
|
+
// contextWindow stays conservative since we can't know the slug's window.
|
|
8103
|
+
defaultModelMeta: {
|
|
8104
|
+
contextWindow: 131072,
|
|
8105
|
+
maxTokens: 32768,
|
|
8106
|
+
reasoning: false,
|
|
8107
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }
|
|
8108
|
+
}
|
|
8109
|
+
}
|
|
8043
8110
|
}
|
|
8044
8111
|
};
|
|
8045
8112
|
function agentProvidersByPriority() {
|
|
@@ -8061,6 +8128,9 @@ function resolveModelForProvider(provider, modelId) {
|
|
|
8061
8128
|
function resolveModelForCapability(provider, capability, modelIdOverride) {
|
|
8062
8129
|
const entry = AGENT_PROVIDERS[provider];
|
|
8063
8130
|
const id = modelIdOverride ?? PROVIDER_MODELS[provider][capability];
|
|
8131
|
+
if (entry.openaiCompatible) {
|
|
8132
|
+
return buildOpenAiCompatibleModel(entry, id);
|
|
8133
|
+
}
|
|
8064
8134
|
const model = getModel(entry.piAiProvider, id);
|
|
8065
8135
|
if (!model) {
|
|
8066
8136
|
throw new Error(
|
|
@@ -8069,6 +8139,27 @@ function resolveModelForCapability(provider, capability, modelIdOverride) {
|
|
|
8069
8139
|
}
|
|
8070
8140
|
return model;
|
|
8071
8141
|
}
|
|
8142
|
+
function buildOpenAiCompatibleModel(entry, id) {
|
|
8143
|
+
const host = entry.openaiCompatible;
|
|
8144
|
+
if (!host) {
|
|
8145
|
+
throw new Error(`buildOpenAiCompatibleModel called for non-custom provider '${entry.piAiProvider}'`);
|
|
8146
|
+
}
|
|
8147
|
+
const meta = host.knownModels[id] ?? host.defaultModelMeta;
|
|
8148
|
+
const baseUrl = (host.baseUrlEnvVar ? process.env[host.baseUrlEnvVar] : void 0) || host.baseUrl;
|
|
8149
|
+
return {
|
|
8150
|
+
id,
|
|
8151
|
+
name: id,
|
|
8152
|
+
api: "openai-completions",
|
|
8153
|
+
provider: entry.piAiProvider,
|
|
8154
|
+
baseUrl,
|
|
8155
|
+
reasoning: meta.reasoning,
|
|
8156
|
+
input: ["text"],
|
|
8157
|
+
cost: meta.cost,
|
|
8158
|
+
contextWindow: meta.contextWindow,
|
|
8159
|
+
maxTokens: meta.maxTokens,
|
|
8160
|
+
...host.compat ? { compat: host.compat } : {}
|
|
8161
|
+
};
|
|
8162
|
+
}
|
|
8072
8163
|
function validateAgentProviderRegistry() {
|
|
8073
8164
|
for (const provider of listAgentProviders()) {
|
|
8074
8165
|
for (const capability of LLM_CAPABILITIES) {
|
|
@@ -8092,10 +8183,14 @@ function resolveApiKeySource(providerOrPiAi, config) {
|
|
|
8092
8183
|
const entry = AGENT_PROVIDERS[id];
|
|
8093
8184
|
const fromConfig = config.providers?.[id]?.apiKey;
|
|
8094
8185
|
if (fromConfig) return { key: fromConfig, source: "config" };
|
|
8095
|
-
const fromEnv = getEnvApiKey(entry.piAiProvider);
|
|
8186
|
+
const fromEnv = entry.openaiCompatible ? process.env[entry.openaiCompatible.apiKeyEnvVar] : getEnvApiKey(entry.piAiProvider);
|
|
8096
8187
|
if (fromEnv) return { key: fromEnv, source: "env" };
|
|
8097
8188
|
return void 0;
|
|
8098
8189
|
}
|
|
8190
|
+
function agentProviderApiKeyEnvVar(id) {
|
|
8191
|
+
const entry = AGENT_PROVIDERS[id];
|
|
8192
|
+
return entry.openaiCompatible ? entry.openaiCompatible.apiKeyEnvVar : `${entry.piAiProvider.toUpperCase()}_API_KEY`;
|
|
8193
|
+
}
|
|
8099
8194
|
function resolveAgentId(providerOrPiAi) {
|
|
8100
8195
|
if (isAgentProviderId(providerOrPiAi)) return providerOrPiAi;
|
|
8101
8196
|
for (const id of AGENT_PROVIDER_IDS) {
|
|
@@ -8319,7 +8414,7 @@ ${skillBody}`;
|
|
|
8319
8414
|
}
|
|
8320
8415
|
function missingProviderMessage() {
|
|
8321
8416
|
const configHints = agentProvidersByPriority().join(", ");
|
|
8322
|
-
const envHints = agentProvidersByPriority().map(
|
|
8417
|
+
const envHints = agentProvidersByPriority().map(agentProviderApiKeyEnvVar).join(" / ");
|
|
8323
8418
|
return `No agent LLM provider configured. Add an API key for one of: ${configHints} in ~/.canonry/config.yaml, or export ${envHints}.`;
|
|
8324
8419
|
}
|
|
8325
8420
|
function detectAgentProvider(config) {
|
|
@@ -9273,7 +9368,7 @@ function pickExplainProvider(config, providerOverride) {
|
|
|
9273
9368
|
for (const provider of agentProvidersByPriority()) {
|
|
9274
9369
|
if (resolveApiKeyFor(provider, config)) return provider;
|
|
9275
9370
|
}
|
|
9276
|
-
const hints = agentProvidersByPriority().map(
|
|
9371
|
+
const hints = agentProvidersByPriority().map(agentProviderApiKeyEnvVar).join(" / ");
|
|
9277
9372
|
throw providerError(
|
|
9278
9373
|
`No LLM provider configured. Add an API key in ~/.canonry/config.yaml or set one of: ${hints}.`
|
|
9279
9374
|
);
|
|
@@ -10892,6 +10987,9 @@ async function createServer(opts) {
|
|
|
10892
10987
|
},
|
|
10893
10988
|
getGoogleAuthConfig: () => getGoogleAuthConfig(opts.config),
|
|
10894
10989
|
getPlacesConfig: () => getPlacesConfig(opts.config),
|
|
10990
|
+
// Resolved fresh each call so a key added at runtime (settings API) shows
|
|
10991
|
+
// up immediately in the `config.agent-providers` doctor check.
|
|
10992
|
+
getAgentProviderSummary: () => buildAgentProvidersResponse(opts.config).providers,
|
|
10895
10993
|
googleConnectionStore,
|
|
10896
10994
|
googleStateSecret,
|
|
10897
10995
|
publicUrl: opts.config.publicUrl,
|
|
@@ -1434,7 +1434,8 @@ var ProviderIds = {
|
|
|
1434
1434
|
perplexity: "perplexity",
|
|
1435
1435
|
local: "local",
|
|
1436
1436
|
cdpChatgpt: "cdp:chatgpt",
|
|
1437
|
-
zai: "zai"
|
|
1437
|
+
zai: "zai",
|
|
1438
|
+
deepinfra: "deepinfra"
|
|
1438
1439
|
};
|
|
1439
1440
|
var PROVIDER_IDS = Object.values(ProviderIds);
|
|
1440
1441
|
var SweepProviderIds = {
|
|
@@ -1450,7 +1451,8 @@ var AgentProviderIds = {
|
|
|
1450
1451
|
claude: ProviderIds.claude,
|
|
1451
1452
|
openai: ProviderIds.openai,
|
|
1452
1453
|
gemini: ProviderIds.gemini,
|
|
1453
|
-
zai: ProviderIds.zai
|
|
1454
|
+
zai: ProviderIds.zai,
|
|
1455
|
+
deepinfra: ProviderIds.deepinfra
|
|
1454
1456
|
};
|
|
1455
1457
|
var AGENT_PROVIDER_IDS = Object.values(AgentProviderIds);
|
|
1456
1458
|
function isAgentProviderId(value) {
|
|
@@ -3027,7 +3029,7 @@ function escapeRegExp(value) {
|
|
|
3027
3029
|
|
|
3028
3030
|
// ../contracts/src/agent.ts
|
|
3029
3031
|
import { z as z22 } from "zod";
|
|
3030
|
-
var agentProviderIdSchema = z22.enum(["claude", "openai", "gemini", "zai"]);
|
|
3032
|
+
var agentProviderIdSchema = z22.enum(["claude", "openai", "gemini", "zai", "deepinfra"]);
|
|
3031
3033
|
var agentProviderOptionDtoSchema = z22.object({
|
|
3032
3034
|
/** Stable identifier — what clients pass back as `provider` on the prompt endpoint. */
|
|
3033
3035
|
id: agentProviderIdSchema,
|
|
@@ -263,7 +263,7 @@ import {
|
|
|
263
263
|
wordpressSchemaDeployResultDtoSchema,
|
|
264
264
|
wordpressSchemaStatusResultDtoSchema,
|
|
265
265
|
wordpressStatusDtoSchema
|
|
266
|
-
} from "./chunk-
|
|
266
|
+
} from "./chunk-CWFTMFEU.js";
|
|
267
267
|
|
|
268
268
|
// src/intelligence-service.ts
|
|
269
269
|
import { eq as eq37, desc as desc18, asc as asc5, and as and27, ne as ne5, or as or5, inArray as inArray14, gte as gte7, lte as lte4 } from "drizzle-orm";
|
|
@@ -32634,7 +32634,53 @@ var providersConfiguredCheck = {
|
|
|
32634
32634
|
};
|
|
32635
32635
|
}
|
|
32636
32636
|
};
|
|
32637
|
-
var
|
|
32637
|
+
var agentProvidersConfiguredCheck = {
|
|
32638
|
+
id: "config.agent-providers",
|
|
32639
|
+
category: CheckCategories.providers,
|
|
32640
|
+
scope: CheckScopes.global,
|
|
32641
|
+
title: "Agent provider keys",
|
|
32642
|
+
run: (ctx) => {
|
|
32643
|
+
const summary = ctx.getAgentProviderSummary?.();
|
|
32644
|
+
if (!summary) {
|
|
32645
|
+
return {
|
|
32646
|
+
status: CheckStatuses.skipped,
|
|
32647
|
+
code: "agent-providers.summary-unavailable",
|
|
32648
|
+
summary: "Agent provider summary is not available in this deployment.",
|
|
32649
|
+
remediation: null
|
|
32650
|
+
};
|
|
32651
|
+
}
|
|
32652
|
+
const configured = summary.filter((entry) => entry.configured);
|
|
32653
|
+
const total = summary.length;
|
|
32654
|
+
const details = {
|
|
32655
|
+
configured: configured.map((entry) => entry.id),
|
|
32656
|
+
providers: summary.map((entry) => ({
|
|
32657
|
+
id: entry.id,
|
|
32658
|
+
configured: entry.configured,
|
|
32659
|
+
keySource: entry.keySource
|
|
32660
|
+
}))
|
|
32661
|
+
};
|
|
32662
|
+
if (configured.length === 0) {
|
|
32663
|
+
return {
|
|
32664
|
+
status: CheckStatuses.warn,
|
|
32665
|
+
code: "agent-providers.none-configured",
|
|
32666
|
+
summary: "No agent LLM provider has credentials configured \u2014 the built-in Aero agent cannot run.",
|
|
32667
|
+
remediation: "Add a key for one of the agent providers (claude, openai, gemini, zai, deepinfra) under `providers.<name>.apiKey` in ~/.canonry/config.yaml, or export its env var (e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY, DEEPINFRA_TOKEN).",
|
|
32668
|
+
details
|
|
32669
|
+
};
|
|
32670
|
+
}
|
|
32671
|
+
return {
|
|
32672
|
+
status: CheckStatuses.ok,
|
|
32673
|
+
code: "agent-providers.configured",
|
|
32674
|
+
summary: `${configured.length} of ${total} agent providers configured: ${configured.map((e) => e.id).join(", ")}.`,
|
|
32675
|
+
remediation: null,
|
|
32676
|
+
details
|
|
32677
|
+
};
|
|
32678
|
+
}
|
|
32679
|
+
};
|
|
32680
|
+
var PROVIDERS_CHECKS = [
|
|
32681
|
+
providersConfiguredCheck,
|
|
32682
|
+
agentProvidersConfiguredCheck
|
|
32683
|
+
];
|
|
32638
32684
|
|
|
32639
32685
|
// ../api-routes/src/doctor/checks/runtime-state.ts
|
|
32640
32686
|
import fs7 from "fs";
|
|
@@ -33216,6 +33262,7 @@ async function doctorRoutes(app, opts) {
|
|
|
33216
33262
|
getPlacesConfig: opts.getPlacesConfig,
|
|
33217
33263
|
redirectUri,
|
|
33218
33264
|
providerSummary: opts.providerSummary,
|
|
33265
|
+
getAgentProviderSummary: opts.getAgentProviderSummary,
|
|
33219
33266
|
trafficSourceValidators: opts.trafficSourceValidators,
|
|
33220
33267
|
runtimeStatePaths: opts.runtimeStatePaths,
|
|
33221
33268
|
bundledSkills: opts.bundledSkills
|
|
@@ -33242,6 +33289,7 @@ async function doctorRoutes(app, opts) {
|
|
|
33242
33289
|
getPlacesConfig: opts.getPlacesConfig,
|
|
33243
33290
|
redirectUri,
|
|
33244
33291
|
providerSummary: opts.providerSummary,
|
|
33292
|
+
getAgentProviderSummary: opts.getAgentProviderSummary,
|
|
33245
33293
|
trafficSourceValidators: opts.trafficSourceValidators,
|
|
33246
33294
|
runtimeStatePaths: opts.runtimeStatePaths,
|
|
33247
33295
|
bundledSkills: opts.bundledSkills
|
|
@@ -34144,6 +34192,7 @@ async function apiRoutes(app, opts) {
|
|
|
34144
34192
|
getPlacesConfig: opts.getPlacesConfig,
|
|
34145
34193
|
publicUrl: opts.publicUrl,
|
|
34146
34194
|
providerSummary: opts.providerSummary,
|
|
34195
|
+
getAgentProviderSummary: opts.getAgentProviderSummary,
|
|
34147
34196
|
trafficSourceValidators: buildTrafficSourceValidators(opts),
|
|
34148
34197
|
runtimeStatePaths: opts.runtimeStatePaths,
|
|
34149
34198
|
bundledSkills: opts.bundledSkills
|
package/dist/cli.js
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
setTelemetrySource,
|
|
28
28
|
showFirstRunNotice,
|
|
29
29
|
trackEvent
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-7COFPNMH.js";
|
|
31
31
|
import {
|
|
32
32
|
CliError,
|
|
33
33
|
EXIT_SYSTEM_ERROR,
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
saveConfig,
|
|
45
45
|
saveConfigPatch,
|
|
46
46
|
usageError
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-3TH54726.js";
|
|
48
48
|
import {
|
|
49
49
|
apiKeys,
|
|
50
50
|
createClient,
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
projects,
|
|
53
53
|
queries,
|
|
54
54
|
renderReportHtml
|
|
55
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-DJVUNURL.js";
|
|
56
56
|
import {
|
|
57
57
|
BacklinkSources,
|
|
58
58
|
CcReleaseSyncStatuses,
|
|
@@ -78,7 +78,7 @@ import {
|
|
|
78
78
|
providerQuotaPolicySchema,
|
|
79
79
|
resolveProviderInput,
|
|
80
80
|
winnabilityClassSchema
|
|
81
|
-
} from "./chunk-
|
|
81
|
+
} from "./chunk-CWFTMFEU.js";
|
|
82
82
|
|
|
83
83
|
// src/cli.ts
|
|
84
84
|
import { pathToFileURL } from "url";
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7COFPNMH.js";
|
|
4
4
|
import {
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-3TH54726.js";
|
|
7
|
+
import "./chunk-DJVUNURL.js";
|
|
8
|
+
import "./chunk-CWFTMFEU.js";
|
|
9
9
|
export {
|
|
10
10
|
createServer,
|
|
11
11
|
loadConfig
|
package/dist/mcp.js
CHANGED
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
PACKAGE_VERSION,
|
|
4
4
|
canonryMcpTools,
|
|
5
5
|
createApiClient
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3TH54726.js";
|
|
7
7
|
import {
|
|
8
8
|
isReadOnlyKey
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-CWFTMFEU.js";
|
|
10
10
|
|
|
11
11
|
// src/mcp/cli.ts
|
|
12
12
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainyc/canonry",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.98.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
|
|
6
6
|
"license": "FSL-1.1-ALv2",
|
|
@@ -62,23 +62,23 @@
|
|
|
62
62
|
"@types/node-cron": "^3.0.11",
|
|
63
63
|
"tsup": "^8.5.1",
|
|
64
64
|
"tsx": "^4.19.0",
|
|
65
|
-
"@ainyc/canonry-api-client": "0.0.0",
|
|
66
65
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
67
|
-
"@ainyc/canonry-
|
|
66
|
+
"@ainyc/canonry-api-client": "0.0.0",
|
|
68
67
|
"@ainyc/canonry-config": "0.0.0",
|
|
68
|
+
"@ainyc/canonry-contracts": "0.0.0",
|
|
69
69
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
70
|
-
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
71
70
|
"@ainyc/canonry-db": "0.0.0",
|
|
71
|
+
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
72
72
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
73
73
|
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
74
74
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
75
|
-
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
76
|
-
"@ainyc/canonry-intelligence": "0.0.0",
|
|
77
75
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
78
|
-
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
79
|
-
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
80
76
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
77
|
+
"@ainyc/canonry-intelligence": "0.0.0",
|
|
78
|
+
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
81
79
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
80
|
+
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
81
|
+
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
82
82
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
83
83
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
84
84
|
"@ainyc/canonry-provider-perplexity": "0.0.0",
|