@canonry/canonry 7.46.1 → 7.47.1

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-Y2QMWZT7.js → chunk-66K6U5H5.js} +3 -3
  17. package/dist/{chunk-WMG365JI.js → chunk-CIYCCA2I.js} +11 -2
  18. package/dist/{chunk-QBZPKXFW.js → chunk-DGKSQ5QD.js} +1 -1
  19. package/dist/{chunk-GWRIZSIL.js → chunk-HQS2Y7HO.js} +3 -3
  20. package/dist/{chunk-OO64BWNB.js → chunk-IYAUKA7Z.js} +251 -222
  21. package/dist/{chunk-QWLKYIQ4.js → chunk-JNBPNW7P.js} +2 -2
  22. package/dist/{chunk-IBRZ23VQ.js → chunk-QNXQHHCP.js} +36 -13
  23. package/dist/{chunk-V4TITINC.js → chunk-QS262E4F.js} +9 -1
  24. package/dist/{chunk-7R2HFAG4.js → chunk-XCS3JXN2.js} +9 -9
  25. package/dist/{chunk-PCZXWOYX.js → chunk-XHRJYIJQ.js} +1 -1
  26. package/dist/{cli-catalog-TFCCKIE4.js → cli-catalog-MRYQK7LI.js} +3 -3
  27. package/dist/cli-commands-ZX7GLZZT.js +15 -0
  28. package/dist/cli.js +10 -10
  29. package/dist/{demo-server-5TX4MJIS.js → demo-server-GPNX3EXT.js} +4 -4
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.js +6 -6
  32. package/dist/{intelligence-service-5BYJSFLW.js → intelligence-service-LZ3MC6G6.js} +2 -2
  33. package/dist/mcp.js +4 -4
  34. package/package.json +13 -13
  35. package/dist/cli-commands-JEN27DWN.js +0 -15
@@ -147,6 +147,7 @@ import {
147
147
  RatioUnits,
148
148
  ResearchQueryStatuses,
149
149
  ResearchRunStatuses,
150
+ RetrievalStatuses,
150
151
  RunFillRefusalCodes,
151
152
  RunKinds,
152
153
  RunStatuses,
@@ -914,7 +915,7 @@ import {
914
915
  wordpressSchemaDeployResultDtoSchema,
915
916
  wordpressSchemaStatusResultDtoSchema,
916
917
  wordpressStatusDtoSchema
917
- } from "./chunk-V4TITINC.js";
918
+ } from "./chunk-QS262E4F.js";
918
919
 
919
920
  // src/intelligence-service.ts
920
921
  import { eq as eq99, desc as desc45, asc as asc20, and as and82, ne as ne17, or as or24, inArray as inArray40, gte as gte26, lte as lte23, isNull as isNull19, sql as sql37, exists as exists2 } from "drizzle-orm";
@@ -30902,6 +30903,7 @@ function visibilityComparisonPopulation(run, selection) {
30902
30903
  answerMentioned: signals.mention,
30903
30904
  mentionApplicable: candidate.edges.some((edge) => targets.get(edge.targetKey)?.mentionEligible === true),
30904
30905
  citation: citationForCoverage(candidate, targets),
30906
+ retrievalStatus: candidate.observation.retrievalStatus ?? null,
30905
30907
  answerText: candidate.observation.answerText,
30906
30908
  competitorDomains: [...new Set(candidate.edges.flatMap((edge) => edge.competitorDomains))],
30907
30909
  competitorMentions: candidate.observation.competitorMentionDomains.filter((domain) => candidate.edges.some((edge) => edge.competitorDomains.includes(domain))),
@@ -30966,6 +30968,7 @@ function loadVisibilitySnapshots(db, runIds) {
30966
30968
  citedDomains: querySnapshots.citedDomains,
30967
30969
  citedUrls: querySnapshots.citedUrls,
30968
30970
  captureStatus: querySnapshots.captureStatus,
30971
+ retrievalStatus: querySnapshots.retrievalStatus,
30969
30972
  location: querySnapshots.location,
30970
30973
  measurementExecutionId: querySnapshots.measurementExecutionId,
30971
30974
  requestedContext: querySnapshots.requestedContext,
@@ -31111,6 +31114,7 @@ function v2Observations(plan, revision, run, snapshots, includeEvidence = true)
31111
31114
  unknownMentionTargetKeys: attribution?.unknownMentionTargetIds ?? [],
31112
31115
  citedTargetKeys: attribution?.citedTargetIds ?? [],
31113
31116
  citationComplete: attribution?.sourceComplete ?? false,
31117
+ retrievalStatus: raw.retrievalStatus ?? null,
31114
31118
  competitorMentionDomains: signals.mentioned,
31115
31119
  competitorCitationDomains: signals.cited,
31116
31120
  observedCompetitorNames: includeEvidence ? observedCompetitorNames2(raw.recommendedCompetitors) : [],
@@ -31234,6 +31238,7 @@ function frozenSimpleRun(run, definition2, snapshots, includeEvidence = true) {
31234
31238
  // Simple citation state comes from the stored cited domains, not from
31235
31239
  // source-URL capture, so a saved Simple answer is never `unchecked`.
31236
31240
  citationComplete: true,
31241
+ retrievalStatus: snapshot.retrievalStatus ?? null,
31237
31242
  competitorMentionDomains: competitorSignalsForSnapshot.mentioned,
31238
31243
  competitorCitationDomains: competitorSignalsForSnapshot.cited,
31239
31244
  observedCompetitorNames: includeEvidence ? observedCompetitorNames2(snapshot.recommendedCompetitors) : [],
@@ -31317,6 +31322,7 @@ function legacySimpleRun(project, run, snapshots, includeEvidence = true) {
31317
31322
  citedTargetKeys: snapshot.citationState === "cited" ? ["project"] : [],
31318
31323
  // Legacy rows carry only the stored citation state (see the frozen-simple note).
31319
31324
  citationComplete: true,
31325
+ retrievalStatus: snapshot.retrievalStatus ?? null,
31320
31326
  competitorMentionDomains: [],
31321
31327
  competitorCitationDomains: [],
31322
31328
  observedCompetitorNames: includeEvidence ? observedCompetitorNames2(snapshot.recommendedCompetitors) : [],
@@ -37544,6 +37550,7 @@ function countPeriod(snaps, competitors2, queryClassOf, classificationAvailable,
37544
37550
  let total = 0;
37545
37551
  let cited = 0;
37546
37552
  let citationUnknown = 0;
37553
+ let citationNotSearched = 0;
37547
37554
  let competitorCited = 0;
37548
37555
  const perProvider = /* @__PURE__ */ new Map();
37549
37556
  const mentionedQueries = /* @__PURE__ */ new Set();
@@ -37556,9 +37563,11 @@ function countPeriod(snaps, competitors2, queryClassOf, classificationAvailable,
37556
37563
  mentionedQueries.add(snap.queryId);
37557
37564
  }
37558
37565
  const citationKnown = snap.citationChecked !== false;
37559
- if (citationKnown) total += 1;
37560
- else citationUnknown += 1;
37561
- const isCited = citationKnown && snap.citationState === CitationStates.cited;
37566
+ const noRetrieval = citationKnown && snap.retrievalStatus === RetrievalStatuses["not-used"];
37567
+ if (!citationKnown) citationUnknown += 1;
37568
+ else if (noRetrieval) citationNotSearched += 1;
37569
+ else total += 1;
37570
+ const isCited = citationKnown && !noRetrieval && snap.citationState === CitationStates.cited;
37562
37571
  if (isCited) cited += 1;
37563
37572
  const pp = perProvider.get(snap.provider) ?? { checked: 0, mentioned: 0, cited: 0 };
37564
37573
  if (snap.answerMentioned === true || snap.answerMentioned === false) pp.checked += 1;
@@ -37603,6 +37612,7 @@ function countPeriod(snaps, competitors2, queryClassOf, classificationAvailable,
37603
37612
  total,
37604
37613
  cited,
37605
37614
  citationUnknown,
37615
+ citationNotSearched,
37606
37616
  citationEvidence: snaps.some((snapshot) => snapshot.citationChecked !== void 0),
37607
37617
  projectCited: cited,
37608
37618
  competitorCited,
@@ -37662,7 +37672,7 @@ function computeVisibilityCompare(input) {
37662
37672
  });
37663
37673
  const fromShare = shareCounts(fromShareCounts);
37664
37674
  const toShare = shareCounts(toShareCounts);
37665
- const citationPeriod = (c, value) => c.citationEvidence ? { ...value, excludedUnknown: c.citationUnknown } : value;
37675
+ const citationPeriod = (c, value) => c.citationEvidence ? { ...value, excludedUnknown: c.citationUnknown, ...c.citationNotSearched > 0 ? { excludedNoRetrieval: c.citationNotSearched } : {} } : value;
37666
37676
  const metrics = [
37667
37677
  metric(
37668
37678
  "mention-share-of-voice",
@@ -37709,7 +37719,7 @@ function computeVisibilityCompare(input) {
37709
37719
  const classPeriod = (snapshots, queryClass, signal) => {
37710
37720
  if (!classificationAvailable) return { ...period(0, 0), availability: "classification-unavailable" };
37711
37721
  const selected = snapshots.filter((snapshot) => queryClassOf(snapshot) === queryClass && (signal === "cited" || snapshot.mentionApplicable !== false));
37712
- const checked = selected.filter((snapshot) => signal === "mention" ? typeof snapshot.answerMentioned === "boolean" : snapshot.citationChecked !== false);
37722
+ const checked = selected.filter((snapshot) => signal === "mention" ? typeof snapshot.answerMentioned === "boolean" : snapshot.citationChecked !== false && snapshot.retrievalStatus !== RetrievalStatuses["not-used"]);
37713
37723
  const numerator = checked.filter((snapshot) => signal === "mention" ? snapshot.answerMentioned === true : snapshot.citationState === CitationStates.cited).length;
37714
37724
  return { ...period(numerator, checked.length), excludedUnknown: selected.length - checked.length };
37715
37725
  };
@@ -43355,7 +43365,7 @@ var routeCatalog = [
43355
43365
  method: "get",
43356
43366
  path: "/api/v1/projects/{name}/visibility-compare",
43357
43367
  summary: "Compare AEO visibility month over month",
43358
- description: "Statistically honest month-over-month AEO comparison in one call. PRIMARY metric is share of voice (brand vs competitor mentions in the same answers), which is less exposed to broad model-wide naming propensity than an absolute rate but never bypasses model continuity. Rates are pooled per-snapshot over each month (invariant to sweep count), restricted to query/provider pairs present in BOTH months, and then restricted again to providers with exactly one known, identical configured model id in both months. `continuity` reports every provider and its model evidence; changed, mixed mid-month, or legacy-unknown models are excluded. When no provider remains, metrics return a continuity-blocked verdict rather than a directional call. `from` must be a month strictly before `to`. Adds separate branded/non-brand mention and cited rates with classification-unavailable rather than pooled fallback. Advanced class metrics read frozen Property/market/execution assignments and reuse each answer once per class. Without a scope or marketKey the four original metrics keep the project frame (provider/location narrow it the same way for Simple and Advanced) and Advanced class metrics carry their own `classComparison` cohort. A scope or marketKey answers entirely from the frozen frame and is refused when either month holds runs whose plan cannot be reconstructed (schema v1). On frozen frames, answers with incomplete source capture leave every citation figure and are counted in `excludedUnknown`. A silent upstream version bump under an unchanged configured id remains undetectable. competitorIdentityChangedAt is when the project's competitor names last changed (a tracked competitor's curated or stored auto-detected names (a block counts only when it removes a stored name), a detection pass or a write that moved a market-only competitor's learned names, or a published revision that renames a market pin). Share of voice reads both months with the tracked competitors' current names only, so a comparison quoted before a change to those names was restated; a market pin or learned-name change moves the time without changing share of voice. A scoped comparison (a group, market or property scope, or a marketKey) reads frozen plan history and carries no competitorIdentityChangedAt.",
43368
+ description: "Statistically honest month-over-month AEO comparison in one call. PRIMARY metric is share of voice (brand vs competitor mentions in the same answers), which is less exposed to broad model-wide naming propensity than an absolute rate but never bypasses model continuity. Rates are pooled per-snapshot over each month (invariant to sweep count), restricted to query/provider pairs present in BOTH months, and then restricted again to providers with exactly one known, identical configured model id in both months. `continuity` reports every provider and its model evidence; changed, mixed mid-month, or legacy-unknown models are excluded. When no provider remains, metrics return a continuity-blocked verdict rather than a directional call. `from` must be a month strictly before `to`. Adds separate branded/non-brand mention and cited rates with classification-unavailable rather than pooled fallback. Advanced class metrics read frozen Property/market/execution assignments and reuse each answer once per class. Without a scope or marketKey the four original metrics keep the project frame (provider/location narrow it the same way for Simple and Advanced) and Advanced class metrics carry their own `classComparison` cohort. A scope or marketKey answers entirely from the frozen frame and is refused when either month holds runs whose plan cannot be reconstructed (schema v1). On frozen frames, answers with incomplete source capture leave every citation figure and are counted in `excludedUnknown`. An answer the provider wrote with no retrieval step at all (retrievalStatus of not-used) cites nothing by construction, so it also leaves the cited denominator and is counted in `excludedNoRetrieval`; it stays in the mention denominator, since brand recall does not need search. A silent upstream version bump under an unchanged configured id remains undetectable. competitorIdentityChangedAt is when the project's competitor names last changed (a tracked competitor's curated or stored auto-detected names (a block counts only when it removes a stored name), a detection pass or a write that moved a market-only competitor's learned names, or a published revision that renames a market pin). Share of voice reads both months with the tracked competitors' current names only, so a comparison quoted before a change to those names was restated; a market pin or learned-name change moves the time without changing share of voice. A scoped comparison (a group, market or property scope, or a marketKey) reads frozen plan history and carries no competitorIdentityChangedAt.",
43359
43369
  tags: ["analytics"],
43360
43370
  parameters: [
43361
43371
  nameParameter,
@@ -87486,7 +87496,8 @@ var SPECS = [
87486
87496
  kind: RunKinds["gtm-sync"],
87487
87497
  connection: googleMarketingConnection("gtm"),
87488
87498
  syncCommand: (name) => `canonry gtm sync ${name}`,
87489
- causeCheckIds: ["gtm.auth.connection", "gtm.auth.scopes", "gtm.container.context", "gtm.api.reachable"]
87499
+ causeCheckIds: ["gtm.auth.connection", "gtm.auth.scopes", "gtm.container.context", "gtm.api.reachable"],
87500
+ notFoundRemediation: (name) => `The selected account or container no longer exists, or this login can no longer see it. List what it can see with \`canonry gtm accounts ${name}\`, then choose again with \`canonry gtm select ${name} --account <id> --container <id>\`.`
87490
87501
  },
87491
87502
  {
87492
87503
  prefix: "gbp",
@@ -87582,12 +87593,13 @@ function gradeSyncFailures(ctx, spec) {
87582
87593
  const errorText = state.latestError ?? "no error was recorded";
87583
87594
  const shownError = errorText.length > SUMMARY_ERROR_LIMIT ? `${truncateUtf16(errorText, SUMMARY_ERROR_LIMIT)}...` : errorText;
87584
87595
  const lastSuccessText = state.lastSuccessAt ?? (connection.since ? `none since connecting at ${connection.since}` : "never");
87596
+ const notFound2 = spec.notFoundRemediation && /\bwas not found\b/i.test(errorText);
87585
87597
  return {
87586
87598
  status: CheckStatuses.fail,
87587
87599
  code: code("repeated-failures"),
87588
87600
  urgent: true,
87589
87601
  summary: `The last ${state.consecutiveFailures} ${spec.label} syncs failed (last success: ${lastSuccessText}). Latest error: ${shownError}`,
87590
- remediation: `Fix the cause the latest error names (DNS or network filtering of the API host, credentials, or account access), then run \`${spec.syncCommand(project.name)}\`.`,
87602
+ remediation: notFound2 ? spec.notFoundRemediation(project.name) : `Fix the cause the latest error names (DNS or network filtering of the API host, credentials, or account access), then run \`${spec.syncCommand(project.name)}\`.`,
87591
87603
  details
87592
87604
  };
87593
87605
  }
@@ -88812,12 +88824,23 @@ var sourceConnectedCheck = {
88812
88824
  }
88813
88825
  const errored = activeSources.filter((s) => s.status === "error");
88814
88826
  if (errored.length > 0 && errored.length === activeSources.length) {
88827
+ const streaks = errored.map((s) => readSyncRunState(ctx.db, ctx.project.id, RunKinds["traffic-sync"], { sourceId: s.id }));
88828
+ const recovering = streaks.every((state) => state.latestStatus === RunStatuses.failed && !state.repeatedFailure);
88829
+ const lastDataAt = errored.map((s) => s.lastSyncedAt).filter((at) => !!at).sort().at(-1) ?? null;
88830
+ const failuresInARow = Math.min(...streaks.map((state) => state.consecutiveFailures));
88831
+ const sinceText = lastDataAt ? `No new data since ${lastDataAt}.` : "No data has arrived yet.";
88815
88832
  return {
88816
- status: CheckStatuses.fail,
88817
- code: "traffic.source.all-errored",
88818
- summary: `All ${activeSources.length} active traffic source(s) are in error state. No data is being ingested.`,
88833
+ status: recovering ? CheckStatuses.warn : CheckStatuses.fail,
88834
+ code: recovering ? "traffic.source.all-errored-recently" : "traffic.source.all-errored",
88835
+ summary: recovering ? `The latest sync failed for all ${activeSources.length} active traffic source(s) (${failuresInARow} in a row; this fails at ${SYNC_FAILURE_WINDOW}). ${sinceText}` : `All ${activeSources.length} active traffic source(s) are in error state. ${sinceText}`,
88819
88836
  remediation: errored[0].lastError ? `Latest error: "${errored[0].lastError}". Re-connect the source or run \`canonry traffic sync <project> --source <id>\` to retry.` : "Run `canonry traffic sources <project>` to inspect the failing source(s) and re-connect.",
88820
- details: { sourceCount: activeSources.length, pausedCount: sources.length - activeSources.length, erroredIds: errored.map((s) => s.id) }
88837
+ details: {
88838
+ sourceCount: activeSources.length,
88839
+ pausedCount: sources.length - activeSources.length,
88840
+ erroredIds: errored.map((s) => s.id),
88841
+ failuresInARow,
88842
+ lastSyncedAt: lastDataAt
88843
+ }
88821
88844
  };
88822
88845
  }
88823
88846
  if (errored.length > 0) {
@@ -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",
@@ -31,7 +31,7 @@ import {
31
31
  trackFeatureCompleted,
32
32
  trackIntegrationConnection,
33
33
  waitForServerRuntimeStartup
34
- } from "./chunk-OO64BWNB.js";
34
+ } from "./chunk-IYAUKA7Z.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-IBRZ23VQ.js";
125
+ } from "./chunk-QNXQHHCP.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-5TX4MJIS.js");
589
+ const { createDemoServer } = await import("./demo-server-GPNX3EXT.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-5BYJSFLW.js");
1003
+ const { IntelligenceService } = await import("./intelligence-service-LZ3MC6G6.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-JEN27DWN.js")]);
19381
+ const [{ printCliCatalog }, { REGISTERED_CLI_COMMANDS: REGISTERED_CLI_COMMANDS2 }] = await Promise.all([import("./cli-catalog-MRYQK7LI.js"), import("./cli-commands-ZX7GLZZT.js")]);
19382
19382
  printCliCatalog(REGISTERED_CLI_COMMANDS2, input.format, input.positionals[0], getString(input.values, "access"));
19383
19383
  }
19384
19384
  },
@@ -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";
@@ -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-XCS3JXN2.js";
4
+ import "./chunk-IYAUKA7Z.js";
5
+ import "./chunk-CIYCCA2I.js";
6
+ import "./chunk-DGKSQ5QD.js";
7
+ import "./chunk-RB2F4D3Z.js";
8
+ import "./chunk-JNBPNW7P.js";
9
+ import "./chunk-XHRJYIJQ.js";
10
+ import "./chunk-HGMYEDAQ.js";
11
+ import "./chunk-QNXQHHCP.js";
12
+ import "./chunk-QS262E4F.js";
13
+ export {
14
+ REGISTERED_CLI_COMMANDS
15
+ };
package/dist/cli.js CHANGED
@@ -2,18 +2,18 @@
2
2
  import {
3
3
  autoSyncSkills,
4
4
  formatAutoSyncNotice
5
- } from "./chunk-GWRIZSIL.js";
5
+ } from "./chunk-HQS2Y7HO.js";
6
6
  import {
7
7
  accessFilterFromArgs,
8
8
  dispatchRegisteredCommand,
9
9
  printCliCatalog
10
- } from "./chunk-Y2QMWZT7.js";
10
+ } from "./chunk-66K6U5H5.js";
11
11
  import {
12
12
  REGISTERED_CLI_COMMANDS,
13
13
  buildSetupState,
14
14
  consumePendingServeHandoff,
15
15
  serveCommand
16
- } from "./chunk-7R2HFAG4.js";
16
+ } from "./chunk-XCS3JXN2.js";
17
17
  import {
18
18
  checkLatestVersionForCli,
19
19
  cliRuntimeContext,
@@ -27,14 +27,14 @@ import {
27
27
  showFirstRunNotice,
28
28
  trackCliCommandFinished,
29
29
  trackEvent
30
- } from "./chunk-OO64BWNB.js";
31
- import "./chunk-WMG365JI.js";
30
+ } from "./chunk-IYAUKA7Z.js";
31
+ import "./chunk-CIYCCA2I.js";
32
32
  import {
33
33
  resolveCliAccess
34
- } from "./chunk-QBZPKXFW.js";
34
+ } from "./chunk-DGKSQ5QD.js";
35
35
  import "./chunk-RB2F4D3Z.js";
36
- import "./chunk-QWLKYIQ4.js";
37
- import "./chunk-PCZXWOYX.js";
36
+ import "./chunk-JNBPNW7P.js";
37
+ import "./chunk-XHRJYIJQ.js";
38
38
  import {
39
39
  CliError,
40
40
  EXIT_SYSTEM_ERROR,
@@ -42,10 +42,10 @@ import {
42
42
  printCliError,
43
43
  usageError
44
44
  } from "./chunk-HGMYEDAQ.js";
45
- import "./chunk-IBRZ23VQ.js";
45
+ import "./chunk-QNXQHHCP.js";
46
46
  import {
47
47
  OperationAccesses
48
- } from "./chunk-V4TITINC.js";
48
+ } from "./chunk-QS262E4F.js";
49
49
 
50
50
  // src/cli.ts
51
51
  import { pathToFileURL } from "url";
@@ -5,11 +5,11 @@ import {
5
5
  computeFactorAverages,
6
6
  layoutSiteCrawlGraphInput,
7
7
  persistSiteCrawlGraphLayout
8
- } from "./chunk-QWLKYIQ4.js";
8
+ } from "./chunk-JNBPNW7P.js";
9
9
  import {
10
10
  PACKAGE_VERSION,
11
11
  canonryMcpTools
12
- } from "./chunk-PCZXWOYX.js";
12
+ } from "./chunk-XHRJYIJQ.js";
13
13
  import "./chunk-HGMYEDAQ.js";
14
14
  import {
15
15
  HISTORY_WINDOW_RUNS,
@@ -86,7 +86,7 @@ import {
86
86
  siteCrawlPages,
87
87
  siteCrawlSnapshots,
88
88
  trafficSources
89
- } from "./chunk-IBRZ23VQ.js";
89
+ } from "./chunk-QNXQHHCP.js";
90
90
  import {
91
91
  RunKinds,
92
92
  SiteCrawlFetchStates,
@@ -116,7 +116,7 @@ import {
116
116
  roundPreservingTotal,
117
117
  siteAuditPageFactorSchema,
118
118
  wilsonInterval
119
- } from "./chunk-V4TITINC.js";
119
+ } from "./chunk-QS262E4F.js";
120
120
 
121
121
  // src/demo-server.ts
122
122
  import { dirname, join as join2 } from "path";
package/dist/index.d.ts CHANGED
@@ -33581,6 +33581,10 @@ declare const sentimentInstallConfigSchema: z.ZodObject<{
33581
33581
  }, z.core.$strict>;
33582
33582
  type SentimentInstallConfigInput = z.input<typeof sentimentInstallConfigSchema>;
33583
33583
 
33584
+ /** Reasoning levels Aero can ask a model for, lowest to highest (pi-agent-core's `ThinkingLevel`). */
33585
+ declare const AGENT_REASONING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
33586
+ type AgentReasoningLevel = (typeof AGENT_REASONING_LEVELS)[number];
33587
+
33584
33588
  type GoogleConnectionType = 'gsc' | 'ga4' | 'gbp';
33585
33589
  interface ProviderConfigEntry {
33586
33590
  apiKey?: string;
@@ -33909,6 +33913,14 @@ interface AgentConfigEntry {
33909
33913
  * overrides it; resolved by `resolveAgentAllowViewers`.
33910
33914
  */
33911
33915
  allowViewers?: boolean | null;
33916
+ /**
33917
+ * How hard Aero asks the model to reason on every turn, one of
33918
+ * `AGENT_REASONING_LEVELS`. Absent uses the provider's default
33919
+ * (`PROVIDER_DEFAULT_REASONING`: `low` for OpenAI, `off` elsewhere). The model
33920
+ * clamps a level it does not support. `CANONRY_AGENT_REASONING` overrides it;
33921
+ * resolved by `resolveAgentReasoning`.
33922
+ */
33923
+ reasoning?: AgentReasoningLevel | null;
33912
33924
  }
33913
33925
  interface DashboardConfigEntry {
33914
33926
  /**
package/dist/index.js CHANGED
@@ -3,15 +3,15 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-OO64BWNB.js";
6
+ } from "./chunk-IYAUKA7Z.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-WMG365JI.js";
10
- import "./chunk-QWLKYIQ4.js";
11
- import "./chunk-PCZXWOYX.js";
9
+ } from "./chunk-CIYCCA2I.js";
10
+ import "./chunk-JNBPNW7P.js";
11
+ import "./chunk-XHRJYIJQ.js";
12
12
  import "./chunk-HGMYEDAQ.js";
13
- import "./chunk-IBRZ23VQ.js";
14
- import "./chunk-V4TITINC.js";
13
+ import "./chunk-QNXQHHCP.js";
14
+ import "./chunk-QS262E4F.js";
15
15
  export {
16
16
  GoogleMarketingRuntimeError,
17
17
  createGoogleMarketingCredentialStore,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  HISTORY_WINDOW_RUNS,
3
3
  IntelligenceService
4
- } from "./chunk-IBRZ23VQ.js";
5
- import "./chunk-V4TITINC.js";
4
+ } from "./chunk-QNXQHHCP.js";
5
+ import "./chunk-QS262E4F.js";
6
6
  export {
7
7
  HISTORY_WINDOW_RUNS,
8
8
  IntelligenceService
package/dist/mcp.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-GWRIZSIL.js";
3
+ } from "./chunk-HQS2Y7HO.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-WMG365JI.js";
8
- import "./chunk-PCZXWOYX.js";
7
+ } from "./chunk-CIYCCA2I.js";
8
+ import "./chunk-XHRJYIJQ.js";
9
9
  import "./chunk-HGMYEDAQ.js";
10
10
  import {
11
11
  isReadOnlyKey,
12
12
  updateCheckEnvOptOut
13
- } from "./chunk-V4TITINC.js";
13
+ } from "./chunk-QS262E4F.js";
14
14
 
15
15
  // src/mcp/cli.ts
16
16
  import { randomUUID } from "crypto";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "7.46.1",
3
+ "version": "7.47.1",
4
4
  "type": "module",
5
5
  "description": "Self-hosted AI visibility (AEO) platform: track how ChatGPT, Claude, Gemini, and Perplexity cite your domain, join it with Search Console, GA4, server-side traffic, and paid media, and fix what you find through agent tools (CLI, REST, MCP). Local SQLite.",
6
6
  "keywords": [
@@ -87,32 +87,32 @@
87
87
  "tsx": "^4.19.0",
88
88
  "@canonry/canonry-web": "0.0.0",
89
89
  "@canonry/canonry-api-client": "0.0.0",
90
- "@canonry/canonry-api-routes": "0.0.0",
91
- "@canonry/canonry-config": "0.0.0",
92
90
  "@canonry/canonry-contracts": "0.0.0",
91
+ "@canonry/canonry-config": "0.0.0",
93
92
  "@canonry/canonry-db": "0.0.0",
93
+ "@canonry/canonry-api-routes": "0.0.0",
94
94
  "@canonry/canonry-integration-bing": "0.0.0",
95
- "@canonry/canonry-integration-cloud-run": "0.0.0",
96
- "@canonry/canonry-integration-cloudflare-queue": "0.0.0",
97
95
  "@canonry/canonry-integration-cloudflare-worker": "0.0.0",
98
- "@canonry/canonry-integration-commoncrawl": "0.0.0",
96
+ "@canonry/canonry-integration-cloudflare-queue": "0.0.0",
97
+ "@canonry/canonry-integration-cloud-run": "0.0.0",
98
+ "@canonry/canonry-integration-google": "0.0.0",
99
99
  "@canonry/canonry-integration-google-ads": "0.0.0",
100
100
  "@canonry/canonry-integration-google-business-profile": "0.0.0",
101
- "@canonry/canonry-integration-google-tag-manager": "0.0.0",
102
- "@canonry/canonry-integration-google": "0.0.0",
103
101
  "@canonry/canonry-integration-google-places": "0.0.0",
102
+ "@canonry/canonry-integration-commoncrawl": "0.0.0",
103
+ "@canonry/canonry-integration-google-tag-manager": "0.0.0",
104
+ "@canonry/canonry-integration-openai-ads": "0.0.0",
104
105
  "@canonry/canonry-integration-traffic": "0.0.0",
105
106
  "@canonry/canonry-integration-wordpress": "0.0.0",
106
- "@canonry/canonry-integration-openai-ads": "0.0.0",
107
- "@canonry/canonry-intelligence": "0.0.0",
108
107
  "@canonry/canonry-provider-cdp": "0.0.0",
109
- "@canonry/canonry-provider-claude": "0.0.0",
108
+ "@canonry/canonry-intelligence": "0.0.0",
110
109
  "@canonry/canonry-provider-gemini": "0.0.0",
111
- "@canonry/canonry-provider-muse": "0.0.0",
112
110
  "@canonry/canonry-provider-local": "0.0.0",
111
+ "@canonry/canonry-provider-muse": "0.0.0",
113
112
  "@canonry/canonry-provider-openai": "0.0.0",
113
+ "@canonry/canonry-provider-perplexity": "0.0.0",
114
114
  "@canonry/canonry-integration-typesafe": "0.0.0",
115
- "@canonry/canonry-provider-perplexity": "0.0.0"
115
+ "@canonry/canonry-provider-claude": "0.0.0"
116
116
  },
117
117
  "scripts": {
118
118
  "build": "pnpm run build:cli && pnpm run build:web",
@@ -1,15 +0,0 @@
1
- import {
2
- REGISTERED_CLI_COMMANDS
3
- } from "./chunk-7R2HFAG4.js";
4
- import "./chunk-OO64BWNB.js";
5
- import "./chunk-WMG365JI.js";
6
- import "./chunk-QBZPKXFW.js";
7
- import "./chunk-RB2F4D3Z.js";
8
- import "./chunk-QWLKYIQ4.js";
9
- import "./chunk-PCZXWOYX.js";
10
- import "./chunk-HGMYEDAQ.js";
11
- import "./chunk-IBRZ23VQ.js";
12
- import "./chunk-V4TITINC.js";
13
- export {
14
- REGISTERED_CLI_COMMANDS
15
- };