@ainyc/canonry 4.94.0 → 4.96.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/SKILL.md +1 -1
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +2 -2
- package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +8 -8
- package/assets/assets/{BacklinksPage-FeUApIRv.js → BacklinksPage-BiuaXwM3.js} +1 -1
- package/assets/assets/{ChartPrimitives-DFCM9oRt.js → ChartPrimitives-C7jCdApm.js} +1 -1
- package/assets/assets/ProjectPage-BHo6vIlj.js +6 -0
- package/assets/assets/{RunRow-CF4jm8w8.js → RunRow-DLn-qaBh.js} +1 -1
- package/assets/assets/{RunsPage-Dlyl-dmG.js → RunsPage-BArLwd1T.js} +1 -1
- package/assets/assets/{SettingsPage-DaQ0YNHz.js → SettingsPage-BJmzcMsh.js} +1 -1
- package/assets/assets/{TrafficPage-38zf4QS8.js → TrafficPage-DqG9hcNu.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-DJY18oUo.js → TrafficSourceDetailPage-yW5pdgrM.js} +1 -1
- package/assets/assets/{arrow-left-CRHf1qtt.js → arrow-left-BUhA2bZu.js} +1 -1
- package/assets/assets/{extract-error-message-uWeOU6mU.js → extract-error-message-D2vzFSUQ.js} +1 -1
- package/assets/assets/{index-B7ZT1i67.js → index-afT0D_K8.js} +3 -3
- package/assets/assets/{trash-2-B1qn8ZLk.js → trash-2-C94CCTsF.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-PV3RAHMK.js → chunk-CEYDMSQO.js} +34 -1
- package/dist/{chunk-ZJADMHJ5.js → chunk-CNTBEUVE.js} +15 -11
- package/dist/{chunk-K4QOSPBX.js → chunk-IFB43PRW.js} +3 -3
- package/dist/{chunk-3TTBKG73.js → chunk-ROLTZPV7.js} +18 -6
- package/dist/cli.js +5 -5
- package/dist/index.d.ts +9 -1
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-M33PXIWS.js → intelligence-service-SJKUVFZ6.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +9 -9
- package/assets/assets/ProjectPage-Dyx8eZf_.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c}from"./index-
|
|
1
|
+
import{c}from"./index-afT0D_K8.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-afT0D_K8.js"></script>
|
|
16
16
|
<link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Dq7p98wZ.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="./assets/vendor-radix-B57xfQbP.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="./assets/vendor-recharts-ClRVR6aX.js">
|
|
@@ -995,7 +995,11 @@ var gbpPlaceActionListResponseSchema = z8.object({
|
|
|
995
995
|
});
|
|
996
996
|
var gbpLodgingDtoSchema = z8.object({
|
|
997
997
|
locationName: z8.string(),
|
|
998
|
-
/**
|
|
998
|
+
/**
|
|
999
|
+
* Count of non-empty top-level groups in the Lodging API response.
|
|
1000
|
+
* 0 means the API returned no readable structured groups; it is a
|
|
1001
|
+
* verify-the-Hotel-details-panel signal, not proof the hotel has no amenities.
|
|
1002
|
+
*/
|
|
999
1003
|
populatedGroupCount: z8.number().int().nonnegative(),
|
|
1000
1004
|
syncedAt: z8.string(),
|
|
1001
1005
|
/** Raw Lodging resource as Google returned it. */
|
|
@@ -4279,6 +4283,13 @@ var reportRateDeltaSchema = z28.object({
|
|
|
4279
4283
|
prior: z28.number(),
|
|
4280
4284
|
/** Absolute delta (current − prior). Negative = decrease. */
|
|
4281
4285
|
deltaAbs: z28.number(),
|
|
4286
|
+
/**
|
|
4287
|
+
* Signed percent change vs `prior`, rounded to a whole number. Null when
|
|
4288
|
+
* `prior <= 0` (percentage undefined). Renderers route count/traffic tiles
|
|
4289
|
+
* through the "smart %" rule — percentage when the prior base is large
|
|
4290
|
+
* enough (`MIN_PCT_BASE`), otherwise a rounded raw delta.
|
|
4291
|
+
*/
|
|
4292
|
+
deltaPct: z28.number().nullable(),
|
|
4282
4293
|
/**
|
|
4283
4294
|
* Direction tag for tone mapping. Threshold is metric-specific (3pp for
|
|
4284
4295
|
* rates, 0.5 for counts) so small noise lands as 'flat' rather than
|
|
@@ -5060,6 +5071,26 @@ function formatDeltaCopy(d, suffix, windowLabel = "vs prior 7 days") {
|
|
|
5060
5071
|
if (d.deltaPct < 0) return `Down ${Math.abs(d.deltaPct)}% ${windowLabel} (${formatNumber(d.prior)} ${suffix})`;
|
|
5061
5072
|
return `Flat ${windowLabel} (${formatNumber(d.prior)} ${suffix})`;
|
|
5062
5073
|
}
|
|
5074
|
+
var MIN_PCT_BASE = 30;
|
|
5075
|
+
function round1(value) {
|
|
5076
|
+
return Math.round(value * 10) / 10;
|
|
5077
|
+
}
|
|
5078
|
+
function formatAverageDelta(d) {
|
|
5079
|
+
if (d.prior >= MIN_PCT_BASE && d.deltaPct !== null) {
|
|
5080
|
+
const sign2 = d.deltaPct > 0 ? "+" : "";
|
|
5081
|
+
return `${sign2}${d.deltaPct}% vs prior`;
|
|
5082
|
+
}
|
|
5083
|
+
const sign = d.deltaAbs > 0 ? "+" : "";
|
|
5084
|
+
return `${sign}${round1(d.deltaAbs)} vs ${round1(d.prior)}`;
|
|
5085
|
+
}
|
|
5086
|
+
function formatWindowCountDelta(d, countLabel, windowLabel) {
|
|
5087
|
+
if (d.prior >= MIN_PCT_BASE && d.deltaPct !== null) {
|
|
5088
|
+
const sign2 = d.deltaPct > 0 ? "+" : "";
|
|
5089
|
+
return `${sign2}${d.deltaPct}% ${windowLabel}`;
|
|
5090
|
+
}
|
|
5091
|
+
const sign = d.deltaAbs > 0 ? "+" : "";
|
|
5092
|
+
return `${sign}${formatNumber(Math.round(d.deltaAbs))} ${countLabel} ${windowLabel}`;
|
|
5093
|
+
}
|
|
5063
5094
|
|
|
5064
5095
|
// ../contracts/src/ads.ts
|
|
5065
5096
|
import { z as z31 } from "zod";
|
|
@@ -5568,6 +5599,8 @@ export {
|
|
|
5568
5599
|
deltaPercent,
|
|
5569
5600
|
deltaTone,
|
|
5570
5601
|
formatDeltaCopy,
|
|
5602
|
+
formatAverageDelta,
|
|
5603
|
+
formatWindowCountDelta,
|
|
5571
5604
|
adsConnectRequestSchema,
|
|
5572
5605
|
adsConnectionStatusDtoSchema,
|
|
5573
5606
|
adsDisconnectResponseSchema,
|
|
@@ -124,12 +124,14 @@ import {
|
|
|
124
124
|
extractAnswerMentions,
|
|
125
125
|
findDuplicateLocationLabels,
|
|
126
126
|
forbidden,
|
|
127
|
+
formatAverageDelta,
|
|
127
128
|
formatDate,
|
|
128
129
|
formatDateRange,
|
|
129
130
|
formatDeltaCopy,
|
|
130
131
|
formatIsoDate,
|
|
131
132
|
formatNumber,
|
|
132
133
|
formatRatio,
|
|
134
|
+
formatWindowCountDelta,
|
|
133
135
|
ga4AiReferralHistoryEntrySchema,
|
|
134
136
|
ga4SessionHistoryEntrySchema,
|
|
135
137
|
ga4SocialReferralHistoryEntrySchema,
|
|
@@ -259,7 +261,7 @@ import {
|
|
|
259
261
|
wordpressSchemaDeployResultDtoSchema,
|
|
260
262
|
wordpressSchemaStatusResultDtoSchema,
|
|
261
263
|
wordpressStatusDtoSchema
|
|
262
|
-
} from "./chunk-
|
|
264
|
+
} from "./chunk-CEYDMSQO.js";
|
|
263
265
|
|
|
264
266
|
// src/intelligence-service.ts
|
|
265
267
|
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";
|
|
@@ -5237,10 +5239,13 @@ function smoothedRunDelta(points, valueFn, maxWindow = SMOOTHED_RUN_DELTA_MAX_WI
|
|
|
5237
5239
|
const sum = (arr) => arr.reduce((s, p) => s + valueFn(p), 0);
|
|
5238
5240
|
const currentAvg = sum(tail) / tail.length;
|
|
5239
5241
|
const priorAvg = sum(prior) / prior.length;
|
|
5242
|
+
const current = roundTo1Decimal(currentAvg);
|
|
5243
|
+
const prior_ = roundTo1Decimal(priorAvg);
|
|
5240
5244
|
return {
|
|
5241
|
-
current
|
|
5242
|
-
prior:
|
|
5245
|
+
current,
|
|
5246
|
+
prior: prior_,
|
|
5243
5247
|
deltaAbs: currentAvg - priorAvg,
|
|
5248
|
+
deltaPct: deltaPercent(current, prior_),
|
|
5244
5249
|
window
|
|
5245
5250
|
};
|
|
5246
5251
|
}
|
|
@@ -5284,7 +5289,7 @@ function analyzeGbp(signals) {
|
|
|
5284
5289
|
title: `${loc.displayName}: public listing advertises ${loc.placesAmenities.length} amenit${loc.placesAmenities.length === 1 ? "y" : "ies"} canonry can\u2019t confirm via the GBP API`,
|
|
5285
5290
|
recommendation: {
|
|
5286
5291
|
action: 'Verify these amenities are set in the Google Business Profile "Hotel details" panel so the structured profile matches what the public listing advertises.',
|
|
5287
|
-
reason: `Google\u2019s rendered listing advertises ${amenityList}, but the GBP Lodging API
|
|
5292
|
+
reason: `Google\u2019s rendered listing advertises ${amenityList}, but the GBP Lodging API returned no readable structured groups for this location. The amenities may already be set in the owner-facing "Hotel details" panel and simply not be visible in this API response. Verify in Hotel details: if any are missing, add them, since those structured attributes are amenity data you directly control.`
|
|
5288
5293
|
}
|
|
5289
5294
|
});
|
|
5290
5295
|
} else {
|
|
@@ -5295,7 +5300,7 @@ function analyzeGbp(signals) {
|
|
|
5295
5300
|
title: `${loc.displayName}: structured lodging attributes not readable via the GBP API`,
|
|
5296
5301
|
recommendation: {
|
|
5297
5302
|
action: 'Verify the hotel amenities in the Google Business Profile "Hotel details" panel. If they are already set there, no change is needed.',
|
|
5298
|
-
reason: 'The GBP Lodging API
|
|
5303
|
+
reason: 'The GBP Lodging API returned no readable structured groups for this location. That response can be empty even for complete hotels whose owner-facing "Hotel details" panel has amenities set. Treat this as a verify, not a confirmed gap: confirm the amenities are set in Hotel details.'
|
|
5299
5304
|
}
|
|
5300
5305
|
});
|
|
5301
5306
|
}
|
|
@@ -10123,8 +10128,7 @@ function renderRateDeltaTile(label, delta, unit) {
|
|
|
10123
10128
|
return `<div class="metric"><div class="label">${escapeHtml(label)}</div><div class="value">\u2014</div><div class="delta">No prior data</div></div>`;
|
|
10124
10129
|
}
|
|
10125
10130
|
const valueSuffix = unit === "%" ? "%" : "";
|
|
10126
|
-
const
|
|
10127
|
-
const deltaText = `${deltaSign}${delta.deltaAbs.toFixed(unit === "%" ? 1 : 0)}${valueSuffix} vs ${delta.prior}${valueSuffix}`;
|
|
10131
|
+
const deltaText = unit === "%" ? `${delta.deltaAbs > 0 ? "+" : ""}${delta.deltaAbs.toFixed(1)}% vs ${delta.prior}%` : formatAverageDelta(delta);
|
|
10128
10132
|
return `<div class="metric">
|
|
10129
10133
|
<div class="label">${escapeHtml(label)}</div>
|
|
10130
10134
|
<div class="value ${deltaToneClass(delta.direction)}">${delta.current}${valueSuffix} <span style="font-size:14px;font-weight:500;">${deltaArrow(delta.direction)}</span></div>
|
|
@@ -10135,8 +10139,7 @@ function renderTrafficDeltaTile(label, delta, countLabel) {
|
|
|
10135
10139
|
if (!delta) {
|
|
10136
10140
|
return `<div class="metric"><div class="label">${escapeHtml(label)}</div><div class="value">\u2014</div><div class="delta">Not enough trend data</div></div>`;
|
|
10137
10141
|
}
|
|
10138
|
-
const
|
|
10139
|
-
const deltaText = `${deltaSign}${formatNumber(delta.deltaAbs)} ${countLabel} vs prior ${WHATS_CHANGED_PERIOD_DAYS} days`;
|
|
10142
|
+
const deltaText = formatWindowCountDelta(delta, countLabel, `vs prior ${WHATS_CHANGED_PERIOD_DAYS} days`);
|
|
10140
10143
|
return `<div class="metric">
|
|
10141
10144
|
<div class="label">${escapeHtml(label)}</div>
|
|
10142
10145
|
<div class="value ${deltaToneClass(delta.direction)}">${formatNumber(delta.current)} <span style="font-size:14px;font-weight:500;">${deltaArrow(delta.direction)}</span></div>
|
|
@@ -12437,6 +12440,7 @@ function periodOverPeriodDelta(trend) {
|
|
|
12437
12440
|
current,
|
|
12438
12441
|
prior: priorTotal,
|
|
12439
12442
|
deltaAbs,
|
|
12443
|
+
deltaPct: deltaPercent(current, priorTotal),
|
|
12440
12444
|
direction: rateDirection(deltaAbs, 0)
|
|
12441
12445
|
};
|
|
12442
12446
|
}
|
|
@@ -34564,8 +34568,8 @@ var IntelligenceService = class {
|
|
|
34564
34568
|
*
|
|
34565
34569
|
* Point-in-time (no previous-run comparison): for each SELECTED location it
|
|
34566
34570
|
* derives signals from the shared GBP summary math (metric week-over-week,
|
|
34567
|
-
*
|
|
34568
|
-
* monthly series (month-over-month keyword drop), then runs the pure
|
|
34571
|
+
* Lodging API readable-group state, place-action CTAs) plus the accumulating
|
|
34572
|
+
* keyword monthly series (month-over-month keyword drop), then runs the pure
|
|
34569
34573
|
* `analyzeGbp` analyzer. Persists insights ONLY — no health snapshot, which is
|
|
34570
34574
|
* an answer-visibility concept. Idempotent per `runId`; dismissals are
|
|
34571
34575
|
* preserved across re-analysis of the same run by the stable insight id.
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
trafficConnectVercelRequestSchema,
|
|
24
24
|
trafficConnectWordpressRequestSchema,
|
|
25
25
|
trafficEventKindSchema
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-CEYDMSQO.js";
|
|
27
27
|
|
|
28
28
|
// src/config.ts
|
|
29
29
|
import fs from "fs";
|
|
@@ -6315,7 +6315,7 @@ var canonryMcpTools = [
|
|
|
6315
6315
|
defineTool({
|
|
6316
6316
|
name: "canonry_gbp_lodging",
|
|
6317
6317
|
title: "Get GBP lodging attributes",
|
|
6318
|
-
description: 'List the latest Google Business Profile lodging snapshot per location (hotel structured attributes). populatedGroupCount=0 means the Lodging API returned no structured
|
|
6318
|
+
description: 'List the latest Google Business Profile lodging snapshot per location (hotel structured attributes). populatedGroupCount=0 means the Lodging API returned no readable structured groups, which can happen even for complete hotels whose owner-facing "Hotel details" panel has amenities set. Treat it as a "verify the Hotel details panel", not a confirmed gap.',
|
|
6319
6319
|
access: "read",
|
|
6320
6320
|
tier: "gbp",
|
|
6321
6321
|
inputSchema: gbpLocationScopedInputSchema,
|
|
@@ -6348,7 +6348,7 @@ var canonryMcpTools = [
|
|
|
6348
6348
|
defineTool({
|
|
6349
6349
|
name: "canonry_gbp_summary",
|
|
6350
6350
|
title: "Get GBP local-AEO summary",
|
|
6351
|
-
description: "Composite Google Business Profile summary for a project: performance totals + 7d deltas, keyword thresholded %, place-action CTA presence,
|
|
6351
|
+
description: "Composite Google Business Profile summary for a project: performance totals + 7d deltas, keyword thresholded %, place-action CTA presence, Lodging API readable-group counts, and owner-content profile completeness (how many selected locations populate secondary categories / description / service area / hours / phone, plus closed-status counts). All derived numbers computed server-side.",
|
|
6352
6352
|
access: "read",
|
|
6353
6353
|
tier: "gbp",
|
|
6354
6354
|
inputSchema: gbpLocationScopedInputSchema,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
loadConfig,
|
|
10
10
|
loadConfigRaw,
|
|
11
11
|
saveConfigPatch
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-IFB43PRW.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-CNTBEUVE.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-CEYDMSQO.js";
|
|
175
175
|
|
|
176
176
|
// src/telemetry.ts
|
|
177
177
|
import crypto from "crypto";
|
|
@@ -2767,6 +2767,15 @@ function normalizeViews(raw) {
|
|
|
2767
2767
|
return out.length > 0 ? out : void 0;
|
|
2768
2768
|
}
|
|
2769
2769
|
|
|
2770
|
+
// src/agent-config.ts
|
|
2771
|
+
function resolveAgentEnabled(env, config) {
|
|
2772
|
+
const raw = env.CANONRY_AGENT_DISABLED?.trim();
|
|
2773
|
+
if (raw) {
|
|
2774
|
+
return !(raw === "1" || raw.toLowerCase() === "true");
|
|
2775
|
+
}
|
|
2776
|
+
return config.agent?.mode !== "disabled";
|
|
2777
|
+
}
|
|
2778
|
+
|
|
2770
2779
|
// src/places-config.ts
|
|
2771
2780
|
var DEFAULT_TIER = "atmosphere";
|
|
2772
2781
|
var DEFAULT_REFRESH_INTERVAL_DAYS = 7;
|
|
@@ -6387,7 +6396,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
6387
6396
|
return result;
|
|
6388
6397
|
}
|
|
6389
6398
|
async function backfillInsightsCommand(project, opts) {
|
|
6390
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
6399
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-SJKUVFZ6.js");
|
|
6391
6400
|
const config = loadConfig();
|
|
6392
6401
|
const db = createClient(config.database);
|
|
6393
6402
|
migrate(db);
|
|
@@ -10333,17 +10342,19 @@ async function createServer(opts) {
|
|
|
10333
10342
|
const notifier = new Notifier(opts.db, serverUrl);
|
|
10334
10343
|
const intelligenceService = new IntelligenceService(opts.db);
|
|
10335
10344
|
const aeroClient = new ApiClient(opts.config.apiUrl, opts.config.apiKey, { skipProbe: true });
|
|
10336
|
-
const
|
|
10345
|
+
const agentEnabled = resolveAgentEnabled(process.env, opts.config);
|
|
10346
|
+
const sessionRegistry = agentEnabled ? new SessionRegistry({
|
|
10337
10347
|
db: opts.db,
|
|
10338
10348
|
client: aeroClient,
|
|
10339
10349
|
config: opts.config
|
|
10340
|
-
});
|
|
10350
|
+
}) : void 0;
|
|
10341
10351
|
const runCoordinator = new RunCoordinator(
|
|
10342
10352
|
opts.db,
|
|
10343
10353
|
notifier,
|
|
10344
10354
|
intelligenceService,
|
|
10345
10355
|
(runId, projectId, result) => notifier.dispatchInsightWebhooks(runId, projectId, result),
|
|
10346
10356
|
async (ctx) => {
|
|
10357
|
+
if (!sessionRegistry) return;
|
|
10347
10358
|
const project = opts.db.select({ name: projects.name }).from(projects).where(eq20(projects.id, ctx.projectId)).get();
|
|
10348
10359
|
if (!project) return;
|
|
10349
10360
|
let content;
|
|
@@ -10870,6 +10881,7 @@ async function createServer(opts) {
|
|
|
10870
10881
|
// Local-only Aero agent routes. Registered here so they inherit api-routes'
|
|
10871
10882
|
// auth plugin — bare `registerAgentRoutes(app, ...)` would skip auth.
|
|
10872
10883
|
registerAuthenticatedRoutes: async (scope) => {
|
|
10884
|
+
if (!sessionRegistry) return;
|
|
10873
10885
|
registerAgentRoutes(scope, { db: opts.db, sessionRegistry });
|
|
10874
10886
|
},
|
|
10875
10887
|
getGoogleAuthConfig: () => getGoogleAuthConfig(opts.config),
|
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-ROLTZPV7.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-IFB43PRW.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-CNTBEUVE.js";
|
|
56
56
|
import {
|
|
57
57
|
BacklinkSources,
|
|
58
58
|
CcReleaseSyncStatuses,
|
|
@@ -77,7 +77,7 @@ import {
|
|
|
77
77
|
providerQuotaPolicySchema,
|
|
78
78
|
resolveProviderInput,
|
|
79
79
|
winnabilityClassSchema
|
|
80
|
-
} from "./chunk-
|
|
80
|
+
} from "./chunk-CEYDMSQO.js";
|
|
81
81
|
|
|
82
82
|
// src/cli.ts
|
|
83
83
|
import { pathToFileURL } from "url";
|
|
@@ -3590,7 +3590,7 @@ async function gbpSummary(project, opts) {
|
|
|
3590
3590
|
console.log(`
|
|
3591
3591
|
Keywords: ${s.keywords.total} tracked, ${s.keywords.thresholdedPct}% privacy-thresholded`);
|
|
3592
3592
|
console.log(`Place actions: ${s.placeActions.total} CTA(s) \u2014 reservation:${s.placeActions.hasReservationCta ? "yes" : "no"} booking:${s.placeActions.hasBookingCta ? "yes" : "no"} direct-merchant:${s.placeActions.hasDirectMerchantCta ? "yes" : "no"}`);
|
|
3593
|
-
console.log(`Lodging: ${s.lodging.lodgingLocationCount} profile(s), ${s.lodging.populatedLodgingCount}
|
|
3593
|
+
console.log(`Lodging API: ${s.lodging.lodgingLocationCount} profile(s), ${s.lodging.populatedLodgingCount} with readable groups, ${s.lodging.emptyLodgingCount} with 0 readable groups`);
|
|
3594
3594
|
const pc = s.profileCompleteness;
|
|
3595
3595
|
console.log(`Profile completeness (${pc.locationCount} location(s)): ${pc.withSecondaryCategories} w/ secondary categories (${pc.secondaryCategoryTotal} total), ${pc.withDescription} w/ description, ${pc.withServiceArea} w/ service area, ${pc.withHours} w/ hours, ${pc.withPrimaryPhone} w/ phone` + (pc.permanentlyClosed || pc.temporarilyClosed ? `; closed: ${pc.permanentlyClosed} permanently, ${pc.temporarilyClosed} temporarily` : ""));
|
|
3596
3596
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -157,7 +157,15 @@ interface VercelTrafficConfigEntry {
|
|
|
157
157
|
connections?: VercelTrafficConnectionConfigEntry[];
|
|
158
158
|
}
|
|
159
159
|
interface AgentConfigEntry {
|
|
160
|
-
/**
|
|
160
|
+
/**
|
|
161
|
+
* Agent mode. `'disabled'` turns the built-in Aero agent OFF entirely — the
|
|
162
|
+
* proactive auto-wake on run completion does not fire, the `SessionRegistry`
|
|
163
|
+
* is not constructed, and the interactive agent routes (`/projects/:name/
|
|
164
|
+
* agent/*`) plus the `canonry agent ask` CLI (a thin client of those routes)
|
|
165
|
+
* are not served. Absent (the default) leaves Aero enabled. Resolved, with
|
|
166
|
+
* the `CANONRY_AGENT_DISABLED` env override, by `resolveAgentEnabled` in
|
|
167
|
+
* agent-config.ts.
|
|
168
|
+
*/
|
|
161
169
|
mode?: 'disabled';
|
|
162
170
|
}
|
|
163
171
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ROLTZPV7.js";
|
|
4
4
|
import {
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-IFB43PRW.js";
|
|
7
|
+
import "./chunk-CNTBEUVE.js";
|
|
8
|
+
import "./chunk-CEYDMSQO.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-IFB43PRW.js";
|
|
7
7
|
import {
|
|
8
8
|
isReadOnlyKey
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-CEYDMSQO.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.96.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",
|
|
@@ -63,26 +63,26 @@
|
|
|
63
63
|
"tsup": "^8.5.1",
|
|
64
64
|
"tsx": "^4.19.0",
|
|
65
65
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
66
|
-
"@ainyc/canonry-contracts": "0.0.0",
|
|
67
|
-
"@ainyc/canonry-config": "0.0.0",
|
|
68
66
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
69
|
-
"@ainyc/canonry-
|
|
67
|
+
"@ainyc/canonry-config": "0.0.0",
|
|
70
68
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
69
|
+
"@ainyc/canonry-db": "0.0.0",
|
|
71
70
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
71
|
+
"@ainyc/canonry-contracts": "0.0.0",
|
|
72
72
|
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
73
|
+
"@ainyc/canonry-integration-google": "0.0.0",
|
|
73
74
|
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
74
75
|
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
75
|
-
"@ainyc/canonry-integration-google": "0.0.0",
|
|
76
76
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
77
|
-
"@ainyc/canonry-intelligence": "0.0.0",
|
|
78
77
|
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
79
|
-
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
80
78
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
81
|
-
"@ainyc/canonry-
|
|
79
|
+
"@ainyc/canonry-intelligence": "0.0.0",
|
|
82
80
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
83
81
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
82
|
+
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
83
|
+
"@ainyc/canonry-provider-local": "0.0.0",
|
|
84
84
|
"@ainyc/canonry-provider-perplexity": "0.0.0",
|
|
85
|
-
"@ainyc/canonry-provider-
|
|
85
|
+
"@ainyc/canonry-provider-cdp": "0.0.0"
|
|
86
86
|
},
|
|
87
87
|
"scripts": {
|
|
88
88
|
"build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",
|