@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.
Files changed (23) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +7 -3
  2. package/assets/assets/{BacklinksPage-BI9BtHjp.js → BacklinksPage-CuWs7I1D.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-BcjGunGr.js → ChartPrimitives-bm37tprp.js} +1 -1
  4. package/assets/assets/{ProjectPage-BdoberYt.js → ProjectPage-BksYe8FP.js} +1 -1
  5. package/assets/assets/{RunRow-BT2kpdQR.js → RunRow-DzhQl87g.js} +1 -1
  6. package/assets/assets/{RunsPage-BAgZuX7j.js → RunsPage-wOaewhbF.js} +1 -1
  7. package/assets/assets/{SettingsPage-BvKcpivM.js → SettingsPage-CJdhhkkE.js} +1 -1
  8. package/assets/assets/{TrafficPage-BdGOZv1e.js → TrafficPage-BJBeN5Ph.js} +1 -1
  9. package/assets/assets/{TrafficSourceDetailPage-C_N2D9xy.js → TrafficSourceDetailPage-D3PmH0B1.js} +1 -1
  10. package/assets/assets/{arrow-left-C8Fbup8X.js → arrow-left-BmITMI6O.js} +1 -1
  11. package/assets/assets/{extract-error-message-C29K35Gm.js → extract-error-message-BGwnyAfP.js} +1 -1
  12. package/assets/assets/{index-BGfyt3LX.js → index-BSX6r6ju.js} +9 -9
  13. package/assets/assets/{trash-2-DWLIELE_.js → trash-2-Bd2mkP_w.js} +1 -1
  14. package/assets/index.html +1 -1
  15. package/dist/{chunk-SRJ5IGNK.js → chunk-3TH54726.js} +2 -2
  16. package/dist/{chunk-NUGGUQH3.js → chunk-7COFPNMH.js} +106 -8
  17. package/dist/{chunk-E2FDXNMW.js → chunk-CWFTMFEU.js} +5 -3
  18. package/dist/{chunk-TXNKKTFD.js → chunk-DJVUNURL.js} +51 -2
  19. package/dist/cli.js +4 -4
  20. package/dist/index.js +4 -4
  21. package/dist/{intelligence-service-DC2TD7RR.js → intelligence-service-QHBXW4KI.js} +2 -2
  22. package/dist/mcp.js +2 -2
  23. package/package.json +8 -8
@@ -1 +1 @@
1
- import{c}from"./index-BGfyt3LX.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};
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-BGfyt3LX.js"></script>
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-E2FDXNMW.js";
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-SRJ5IGNK.js";
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-TXNKKTFD.js";
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-E2FDXNMW.js";
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-DC2TD7RR.js");
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 { getEnvApiKey, getModel } from "@mariozechner/pi-ai";
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((p) => `${AGENT_PROVIDERS[p].piAiProvider.toUpperCase()}_API_KEY`).join(" / ");
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((p) => `${AGENT_PROVIDERS[p].piAiProvider.toUpperCase()}_API_KEY`).join(" / ");
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-E2FDXNMW.js";
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 PROVIDERS_CHECKS = [providersConfiguredCheck];
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-NUGGUQH3.js";
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-SRJ5IGNK.js";
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-TXNKKTFD.js";
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-E2FDXNMW.js";
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-NUGGUQH3.js";
3
+ } from "./chunk-7COFPNMH.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-SRJ5IGNK.js";
7
- import "./chunk-TXNKKTFD.js";
8
- import "./chunk-E2FDXNMW.js";
6
+ } from "./chunk-3TH54726.js";
7
+ import "./chunk-DJVUNURL.js";
8
+ import "./chunk-CWFTMFEU.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-TXNKKTFD.js";
4
- import "./chunk-E2FDXNMW.js";
3
+ } from "./chunk-DJVUNURL.js";
4
+ import "./chunk-CWFTMFEU.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-SRJ5IGNK.js";
6
+ } from "./chunk-3TH54726.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-E2FDXNMW.js";
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.97.0",
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-contracts": "0.0.0",
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",