@canonry/canonry 5.14.0 → 5.16.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 +2 -0
- package/assets/assets/{AuditHistoryPanel-DWDOPf8c.js → AuditHistoryPanel-CnoGPJ5Y.js} +1 -1
- package/assets/assets/{BacklinksPage-DGxq-iU6.js → BacklinksPage-DYe2CYfD.js} +1 -1
- package/assets/assets/{HistoryPage-DR91m-gT.js → HistoryPage-CO-dzLAo.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-a8poltfM.js → MeasurementPropertyPage-smsZFdd6.js} +1 -1
- package/assets/assets/{ProjectPage-CCCJE7rA.js → ProjectPage-jL3jB2TR.js} +1 -1
- package/assets/assets/{RunRow-Xe63DyPK.js → RunRow-CzcaoK_3.js} +1 -1
- package/assets/assets/{RunsPage-DK119ZZw.js → RunsPage-DQWPHDoq.js} +1 -1
- package/assets/assets/{SettingsPage-G461foD-.js → SettingsPage-DMtQLrWP.js} +1 -1
- package/assets/assets/{SiteHealthSection-CJnHkGM2.js → SiteHealthSection-2ljW02xK.js} +3 -3
- package/assets/assets/{TrafficPage-AsWgc7Ot.js → TrafficPage-NFu0LEdk.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-D10yBQoD.js → TrafficSourceDetailPage-DbBIzmbL.js} +1 -1
- package/assets/assets/{extract-error-message-PP4HD_Dp.js → extract-error-message-pMGpUsIh.js} +1 -1
- package/assets/assets/{index-CCIeAE4J.js → index-D9NReRHX.js} +22 -22
- package/assets/assets/{react-sigma_core.esm.min-CkyyYkKU.js → react-sigma_core.esm.min-CadBie52.js} +1 -1
- package/assets/assets/{v2-overview-adapter-DW-In1hp.js → v2-overview-adapter-Oe8hHMAO.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-RGMUT5KY.js → chunk-3YAPVVFN.js} +106 -39
- package/dist/{chunk-4LPV6ZZY.js → chunk-CDQDPUY4.js} +2 -2
- package/dist/{chunk-SOLFOKZF.js → chunk-JO5HHEJV.js} +2 -2
- package/dist/{chunk-45EGDRVF.js → chunk-L36TC6LB.js} +62 -7
- package/dist/{chunk-S6LJSUZO.js → chunk-XDFMFZRN.js} +115 -40
- package/dist/{chunk-2W6GCJ3O.js → chunk-ZGZSROSR.js} +1 -1
- package/dist/cli.js +7 -7
- package/dist/{demo-server-H4ZFIIIB.js → demo-server-QLQUVMKJ.js} +3 -3
- package/dist/index.js +5 -5
- package/dist/{intelligence-service-CJKOXPOP.js → intelligence-service-EAUKUVVM.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +13 -13
|
@@ -17,12 +17,12 @@ import {
|
|
|
17
17
|
resolveOperatorApiKeyIds,
|
|
18
18
|
runWithUsageTags,
|
|
19
19
|
saveConfigPatch
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ZGZSROSR.js";
|
|
21
21
|
import {
|
|
22
22
|
deleteSiteCrawlGraphLayout,
|
|
23
23
|
persistSiteCrawlGraphLayout,
|
|
24
24
|
prepareSiteCrawlGraphLayout
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-CDQDPUY4.js";
|
|
26
26
|
import {
|
|
27
27
|
PACKAGE_VERSION
|
|
28
28
|
} from "./chunk-AOJU5LKX.js";
|
|
@@ -184,7 +184,7 @@ import {
|
|
|
184
184
|
siteLivenessState,
|
|
185
185
|
toAlertView,
|
|
186
186
|
usageCounters
|
|
187
|
-
} from "./chunk-
|
|
187
|
+
} from "./chunk-3YAPVVFN.js";
|
|
188
188
|
import {
|
|
189
189
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
190
190
|
AGENT_NONE,
|
|
@@ -345,7 +345,7 @@ import {
|
|
|
345
345
|
visibilityReportRequestSchema,
|
|
346
346
|
winnabilityClassLabel,
|
|
347
347
|
withRetry
|
|
348
|
-
} from "./chunk-
|
|
348
|
+
} from "./chunk-L36TC6LB.js";
|
|
349
349
|
|
|
350
350
|
// src/runtime-context.ts
|
|
351
351
|
function cliRuntimeContext(env = process.env, stdio = process) {
|
|
@@ -6491,7 +6491,7 @@ function nonBlank(value) {
|
|
|
6491
6491
|
return trimmed ? trimmed : void 0;
|
|
6492
6492
|
}
|
|
6493
6493
|
function resolveBuildCommit(env = process.env) {
|
|
6494
|
-
const embedded = true ? "
|
|
6494
|
+
const embedded = true ? "fbd3ec65759728dfb2dc5382f1435574eb8690e0" : void 0;
|
|
6495
6495
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
6496
6496
|
}
|
|
6497
6497
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -6966,8 +6966,9 @@ var JobRunner = class {
|
|
|
6966
6966
|
}
|
|
6967
6967
|
log2.info("run.dispatch", { runId, providerCount: activeProviders.length, providers: activeProviders.map((p) => p.adapter.name) });
|
|
6968
6968
|
const projectCompetitors = this.db.select().from(competitors).where(eq2(competitors.projectId, projectId)).all();
|
|
6969
|
-
const
|
|
6970
|
-
const
|
|
6969
|
+
const competitorDomains = projectCompetitors.map((c) => c.domain);
|
|
6970
|
+
const resolveCompetitors = createRunCompetitorResolver(this.db, competitorDomains);
|
|
6971
|
+
const competitorsFor = (executionId) => resolveCompetitors(existingRun.measurementPlanVersionId, executionId);
|
|
6971
6972
|
const allDomains = effectiveDomains({
|
|
6972
6973
|
canonicalDomain: project.canonicalDomain,
|
|
6973
6974
|
ownedDomains: project.ownedDomains
|
|
@@ -7170,8 +7171,7 @@ var JobRunner = class {
|
|
|
7170
7171
|
const slotContext = {
|
|
7171
7172
|
runId,
|
|
7172
7173
|
allDomains,
|
|
7173
|
-
|
|
7174
|
-
competitorAliases: runCompetitors.aliases,
|
|
7174
|
+
competitorsFor,
|
|
7175
7175
|
allBrandNames,
|
|
7176
7176
|
executionGates,
|
|
7177
7177
|
providerDispatchCounts,
|
|
@@ -7429,8 +7429,8 @@ var JobRunner = class {
|
|
|
7429
7429
|
else providerErrors.set(provider, `No ${provider} provider is configured on this instance, so its missing answers did not run.`);
|
|
7430
7430
|
}
|
|
7431
7431
|
const projectCompetitors = this.db.select().from(competitors).where(eq2(competitors.projectId, projectId)).all();
|
|
7432
|
-
const
|
|
7433
|
-
const
|
|
7432
|
+
const resolveCompetitors = createRunCompetitorResolver(this.db, projectCompetitors.map((c) => c.domain));
|
|
7433
|
+
const competitorsFor = (executionId) => resolveCompetitors(run.measurementPlanVersionId, executionId);
|
|
7434
7434
|
const allDomains = effectiveDomains({ canonicalDomain: project.canonicalDomain, ownedDomains: project.ownedDomains });
|
|
7435
7435
|
const allBrandNames = effectiveBrandNames({ displayName: project.displayName, aliases: project.aliases });
|
|
7436
7436
|
const todayPeriod = getCurrentUsageDay();
|
|
@@ -7484,8 +7484,7 @@ var JobRunner = class {
|
|
|
7484
7484
|
const ctx = {
|
|
7485
7485
|
runId,
|
|
7486
7486
|
allDomains,
|
|
7487
|
-
|
|
7488
|
-
competitorAliases: runCompetitors.aliases,
|
|
7487
|
+
competitorsFor,
|
|
7489
7488
|
allBrandNames,
|
|
7490
7489
|
executionGates,
|
|
7491
7490
|
providerDispatchCounts,
|
|
@@ -7585,6 +7584,7 @@ var JobRunner = class {
|
|
|
7585
7584
|
async executePlanSlot(ctx, registeredProvider, unit) {
|
|
7586
7585
|
const { adapter, config: providerConfig } = registeredProvider;
|
|
7587
7586
|
const providerName = adapter.name;
|
|
7587
|
+
const { domains: competitorDomains, aliases: competitorAliases } = ctx.competitorsFor(unit.executionId);
|
|
7588
7588
|
const gate = ctx.executionGates.get(providerName);
|
|
7589
7589
|
if (!gate) {
|
|
7590
7590
|
throw new Error(`Missing execution gate for provider ${providerName}`);
|
|
@@ -7602,7 +7602,7 @@ var JobRunner = class {
|
|
|
7602
7602
|
{
|
|
7603
7603
|
query: unit.queryText,
|
|
7604
7604
|
canonicalDomains: ctx.allDomains,
|
|
7605
|
-
competitorDomains
|
|
7605
|
+
competitorDomains,
|
|
7606
7606
|
location: requestedContext ?? void 0
|
|
7607
7607
|
},
|
|
7608
7608
|
config
|
|
@@ -7639,14 +7639,14 @@ var JobRunner = class {
|
|
|
7639
7639
|
ctx.allBrandNames,
|
|
7640
7640
|
ctx.allDomains
|
|
7641
7641
|
);
|
|
7642
|
-
const overlap = computeCompetitorOverlap(normalized,
|
|
7642
|
+
const overlap = computeCompetitorOverlap(normalized, competitorDomains, competitorAliases);
|
|
7643
7643
|
const extractedCompetitors = extractRecommendedCompetitors(
|
|
7644
7644
|
normalized.answerText,
|
|
7645
7645
|
ctx.allDomains,
|
|
7646
7646
|
normalized.citedDomains,
|
|
7647
|
-
|
|
7647
|
+
competitorDomains,
|
|
7648
7648
|
ctx.allBrandNames,
|
|
7649
|
-
|
|
7649
|
+
competitorAliases
|
|
7650
7650
|
);
|
|
7651
7651
|
const snapshotId = crypto6.randomUUID();
|
|
7652
7652
|
let screenshotRelPath = null;
|
|
@@ -8607,6 +8607,30 @@ function validateChatCardCreative(value) {
|
|
|
8607
8607
|
validateId(value.file_id, "Ad creative file id");
|
|
8608
8608
|
validateHttpUrl(value.target_url, "Ad creative target URL");
|
|
8609
8609
|
}
|
|
8610
|
+
var MAX_QUERY_STRING_TEMPLATE_LENGTH = 1e3;
|
|
8611
|
+
function validateLandingPageConfiguration(value, label) {
|
|
8612
|
+
if (value === void 0 || value === null) return;
|
|
8613
|
+
validateRequestObject(value, `${label} landing_page_configuration`);
|
|
8614
|
+
const template = value.query_string_template;
|
|
8615
|
+
if (template === null) return;
|
|
8616
|
+
if (typeof template !== "string" || template.trim().length === 0 || template.length > MAX_QUERY_STRING_TEMPLATE_LENGTH) {
|
|
8617
|
+
throw new OpenAiAdsApiError(
|
|
8618
|
+
`${label} query_string_template must be 1-${MAX_QUERY_STRING_TEMPLATE_LENGTH} characters`,
|
|
8619
|
+
400
|
|
8620
|
+
);
|
|
8621
|
+
}
|
|
8622
|
+
if (/\s/.test(template) || template.startsWith("?") || template.startsWith("&")) {
|
|
8623
|
+
throw new OpenAiAdsApiError(
|
|
8624
|
+
`${label} query_string_template must be a bare query string without whitespace or a leading ? or &`,
|
|
8625
|
+
400
|
|
8626
|
+
);
|
|
8627
|
+
}
|
|
8628
|
+
}
|
|
8629
|
+
function parseLandingPageQueryStringTemplate(value) {
|
|
8630
|
+
if (!isRecord(value)) return null;
|
|
8631
|
+
const template = value.query_string_template;
|
|
8632
|
+
return typeof template === "string" && template.trim().length > 0 ? template : null;
|
|
8633
|
+
}
|
|
8610
8634
|
function validateCreateCampaignRequest(request) {
|
|
8611
8635
|
validateRequestObject(request, "Campaign create request");
|
|
8612
8636
|
validateEntityName(request.name, "Campaign name");
|
|
@@ -8616,6 +8640,7 @@ function validateCreateCampaignRequest(request) {
|
|
|
8616
8640
|
validateCampaignTimestamp(request.end_time, "Campaign end_time");
|
|
8617
8641
|
validateCampaignBidding(request);
|
|
8618
8642
|
validateCampaignTargeting(request.targeting);
|
|
8643
|
+
validateLandingPageConfiguration(request.landing_page_configuration, "Campaign create request");
|
|
8619
8644
|
}
|
|
8620
8645
|
function validateUpdateCampaignRequest(request) {
|
|
8621
8646
|
validatePublicUpdateRequest(request, "Campaign update request");
|
|
@@ -8624,6 +8649,7 @@ function validateUpdateCampaignRequest(request) {
|
|
|
8624
8649
|
validateCampaignTimestamp(request.start_time, "Campaign start_time");
|
|
8625
8650
|
validateCampaignTimestamp(request.end_time, "Campaign end_time");
|
|
8626
8651
|
validateCampaignTargeting(request.targeting);
|
|
8652
|
+
validateLandingPageConfiguration(request.landing_page_configuration, "Campaign update request");
|
|
8627
8653
|
}
|
|
8628
8654
|
function validateCreateAdGroupRequest(request) {
|
|
8629
8655
|
validateRequestObject(request, "Ad group create request");
|
|
@@ -8632,12 +8658,14 @@ function validateCreateAdGroupRequest(request) {
|
|
|
8632
8658
|
validatePausedCreateStatus(request.status, "Ad group create request");
|
|
8633
8659
|
validateContextHints(request.context_hints);
|
|
8634
8660
|
validateBiddingConfig(request.bidding_config);
|
|
8661
|
+
validateLandingPageConfiguration(request.landing_page_configuration, "Ad group create request");
|
|
8635
8662
|
}
|
|
8636
8663
|
function validateUpdateAdGroupRequest(request) {
|
|
8637
8664
|
validatePublicUpdateRequest(request, "Ad group update request");
|
|
8638
8665
|
if (request.name !== void 0) validateEntityName(request.name, "Ad group name");
|
|
8639
8666
|
validateContextHints(request.context_hints);
|
|
8640
8667
|
if (request.bidding_config !== void 0) validateBiddingConfig(request.bidding_config);
|
|
8668
|
+
validateLandingPageConfiguration(request.landing_page_configuration, "Ad group update request");
|
|
8641
8669
|
}
|
|
8642
8670
|
function validateCreateAdRequest(request) {
|
|
8643
8671
|
validateRequestObject(request, "Ad create request");
|
|
@@ -8645,11 +8673,13 @@ function validateCreateAdRequest(request) {
|
|
|
8645
8673
|
validateEntityName(request.name, "Ad name");
|
|
8646
8674
|
validatePausedCreateStatus(request.status, "Ad create request");
|
|
8647
8675
|
validateChatCardCreative(request.creative);
|
|
8676
|
+
validateLandingPageConfiguration(request.landing_page_configuration, "Ad create request");
|
|
8648
8677
|
}
|
|
8649
8678
|
function validateUpdateAdRequest(request) {
|
|
8650
8679
|
validatePublicUpdateRequest(request, "Ad update request");
|
|
8651
8680
|
if (request.name !== void 0) validateEntityName(request.name, "Ad name");
|
|
8652
8681
|
if (request.creative !== void 0) validateChatCardCreative(request.creative);
|
|
8682
|
+
validateLandingPageConfiguration(request.landing_page_configuration, "Ad update request");
|
|
8653
8683
|
}
|
|
8654
8684
|
function adsClientLog(level, action, ctx) {
|
|
8655
8685
|
const entry = {
|
|
@@ -9094,6 +9124,7 @@ async function executeAdsSync(db, runId, projectId, opts) {
|
|
|
9094
9124
|
lifetimeSpendLimitMicros: campaign.budget?.lifetime_spend_limit_micros ?? null,
|
|
9095
9125
|
conversionEventSettingIds: campaign.conversion_event_setting_ids ?? [],
|
|
9096
9126
|
targeting: campaign.targeting,
|
|
9127
|
+
landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(campaign.landing_page_configuration),
|
|
9097
9128
|
upstreamCreatedAt: campaign.created_at,
|
|
9098
9129
|
upstreamUpdatedAt: campaign.updated_at,
|
|
9099
9130
|
syncRunId: runId,
|
|
@@ -9110,6 +9141,7 @@ async function executeAdsSync(db, runId, projectId, opts) {
|
|
|
9110
9141
|
billingEventType: group.bidding_config?.billing_event_type ?? null,
|
|
9111
9142
|
maxBidMicros: group.bidding_config?.max_bid_micros ?? null,
|
|
9112
9143
|
contextHints: group.context_hints,
|
|
9144
|
+
landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(group.landing_page_configuration),
|
|
9113
9145
|
upstreamCreatedAt: group.created_at,
|
|
9114
9146
|
upstreamUpdatedAt: group.updated_at,
|
|
9115
9147
|
syncRunId: runId,
|
|
@@ -9124,6 +9156,7 @@ async function executeAdsSync(db, runId, projectId, opts) {
|
|
|
9124
9156
|
status: ad.status,
|
|
9125
9157
|
creative: ad.creative,
|
|
9126
9158
|
reviewStatus: ad.review_status ?? ad.review?.status ?? null,
|
|
9159
|
+
landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(ad.landing_page_configuration),
|
|
9127
9160
|
upstreamCreatedAt: ad.created_at,
|
|
9128
9161
|
upstreamUpdatedAt: ad.updated_at,
|
|
9129
9162
|
syncRunId: runId,
|
|
@@ -11603,6 +11636,7 @@ async function backfillAnswerVisibilityCommand(opts) {
|
|
|
11603
11636
|
const snapshotRows = db.select({
|
|
11604
11637
|
id: querySnapshots.id,
|
|
11605
11638
|
runId: querySnapshots.runId,
|
|
11639
|
+
executionId: querySnapshots.measurementExecutionId,
|
|
11606
11640
|
provider: querySnapshots.provider,
|
|
11607
11641
|
citationState: querySnapshots.citationState,
|
|
11608
11642
|
answerMentioned: querySnapshots.answerMentioned,
|
|
@@ -11643,7 +11677,7 @@ async function backfillAnswerVisibilityCommand(opts) {
|
|
|
11643
11677
|
};
|
|
11644
11678
|
const nextCitationState = determineCitationState(normalized, projectDomains);
|
|
11645
11679
|
const nextCitedDomains = reparsedResult.citedDomains;
|
|
11646
|
-
const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId));
|
|
11680
|
+
const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId), snapshot.executionId);
|
|
11647
11681
|
const nextCompetitorOverlap = computeCompetitorOverlap(normalized, runCompetitors.domains, runCompetitors.aliases);
|
|
11648
11682
|
const nextRecommendedCompetitors = extractRecommendedCompetitors(
|
|
11649
11683
|
normalized.answerText,
|
|
@@ -11902,6 +11936,7 @@ function backfillProjectAnswerMentions(db, projectId, opts) {
|
|
|
11902
11936
|
const snapshotRows = db.select({
|
|
11903
11937
|
id: querySnapshots.id,
|
|
11904
11938
|
runId: querySnapshots.runId,
|
|
11939
|
+
executionId: querySnapshots.measurementExecutionId,
|
|
11905
11940
|
provider: querySnapshots.provider,
|
|
11906
11941
|
answerMentioned: querySnapshots.answerMentioned,
|
|
11907
11942
|
answerText: querySnapshots.answerText,
|
|
@@ -11927,7 +11962,7 @@ function backfillProjectAnswerMentions(db, projectId, opts) {
|
|
|
11927
11962
|
retrievalStatus: "unknown",
|
|
11928
11963
|
searchQueries: []
|
|
11929
11964
|
};
|
|
11930
|
-
const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId));
|
|
11965
|
+
const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId), snapshot.executionId);
|
|
11931
11966
|
const nextCompetitorOverlap = computeCompetitorOverlap(normalized, runCompetitors.domains, runCompetitors.aliases);
|
|
11932
11967
|
const nextRecommendedCompetitors = extractRecommendedCompetitors(
|
|
11933
11968
|
answerText,
|
|
@@ -12032,7 +12067,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
12032
12067
|
return result2;
|
|
12033
12068
|
}
|
|
12034
12069
|
async function backfillInsightsCommand(project, opts) {
|
|
12035
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
12070
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-EAUKUVVM.js");
|
|
12036
12071
|
const config = loadConfig();
|
|
12037
12072
|
const db = createClient(config.database);
|
|
12038
12073
|
migrate(db);
|
|
@@ -14438,8 +14473,33 @@ var AERO_EXCLUDED_MCP_TOOLS = /* @__PURE__ */ new Set([
|
|
|
14438
14473
|
CanonryMcpToolNames.canonry_agent_conversations_delete,
|
|
14439
14474
|
CanonryMcpToolNames.canonry_results_clear
|
|
14440
14475
|
]);
|
|
14476
|
+
var AERO_MANAGED_SWEEP_MCP_TOOLS = /* @__PURE__ */ new Set([
|
|
14477
|
+
CanonryMcpToolNames.canonry_run_trigger,
|
|
14478
|
+
CanonryMcpToolNames.canonry_run_fill,
|
|
14479
|
+
CanonryMcpToolNames.canonry_schedule_set,
|
|
14480
|
+
CanonryMcpToolNames.canonry_schedule_delete,
|
|
14481
|
+
CanonryMcpToolNames.canonry_apply_config
|
|
14482
|
+
]);
|
|
14483
|
+
var MANAGED_SWEEP_CANCEL_REFUSAL = "This install manages answer-visibility sweeps, so Aero cannot cancel one. Ask the operator to cancel it.";
|
|
14484
|
+
function refuseManagedSweepCancel(tool, ctx) {
|
|
14485
|
+
const cancel = tool.execute;
|
|
14486
|
+
return {
|
|
14487
|
+
...tool,
|
|
14488
|
+
execute: async (toolCallId, params, ...rest) => {
|
|
14489
|
+
const runId = params.runId;
|
|
14490
|
+
if (typeof runId === "string") {
|
|
14491
|
+
const run = await ctx.client.getRun(runId);
|
|
14492
|
+
if (run.kind === RunKinds["answer-visibility"]) throw new Error(MANAGED_SWEEP_CANCEL_REFUSAL);
|
|
14493
|
+
}
|
|
14494
|
+
return cancel(toolCallId, params, ...rest);
|
|
14495
|
+
}
|
|
14496
|
+
};
|
|
14497
|
+
}
|
|
14441
14498
|
function buildMcpAgentTools(registry, ctx, opts = {}) {
|
|
14442
|
-
return registry.filter((tool) => !AERO_EXCLUDED_MCP_TOOLS.has(tool.name)).filter((tool) => opts.includeNames ? opts.includeNames.has(tool.name) : true).filter((tool) => opts.readOnly ? tool.access === "read" : true).
|
|
14499
|
+
return registry.filter((tool) => !AERO_EXCLUDED_MCP_TOOLS.has(tool.name)).filter((tool) => opts.includeNames ? opts.includeNames.has(tool.name) : true).filter((tool) => opts.readOnly ? tool.access === "read" : true).filter((tool) => opts.managedSweeps ? !AERO_MANAGED_SWEEP_MCP_TOOLS.has(tool.name) : true).map((tool) => {
|
|
14500
|
+
const agentTool = mcpToAgentTool(tool, ctx);
|
|
14501
|
+
return opts.managedSweeps && tool.name === CanonryMcpToolNames.canonry_run_cancel ? refuseManagedSweepCancel(agentTool, ctx) : agentTool;
|
|
14502
|
+
});
|
|
14443
14503
|
}
|
|
14444
14504
|
|
|
14445
14505
|
// src/agent/tools.ts
|
|
@@ -14697,26 +14757,28 @@ function buildAdsOperatorContextTool(ctx) {
|
|
|
14697
14757
|
}
|
|
14698
14758
|
};
|
|
14699
14759
|
}
|
|
14700
|
-
function buildReadTools(ctx) {
|
|
14701
|
-
return buildMcpAgentTools(canonryMcpTools, ctx, { readOnly: true });
|
|
14760
|
+
function buildReadTools(ctx, opts = {}) {
|
|
14761
|
+
return buildMcpAgentTools(canonryMcpTools, ctx, { readOnly: true, managedSweeps: opts.managedSweeps });
|
|
14702
14762
|
}
|
|
14703
|
-
function buildAllTools(ctx) {
|
|
14704
|
-
return buildMcpAgentTools(canonryMcpTools, ctx);
|
|
14763
|
+
function buildAllTools(ctx, opts = {}) {
|
|
14764
|
+
return buildMcpAgentTools(canonryMcpTools, ctx, { managedSweeps: opts.managedSweeps });
|
|
14705
14765
|
}
|
|
14706
14766
|
function buildAdsOperatorTools(ctx, opts = {}) {
|
|
14707
14767
|
const mcpTools = buildMcpAgentTools(canonryMcpTools, ctx, {
|
|
14708
14768
|
readOnly: opts.scope === AeroToolScopes.readOnly,
|
|
14709
|
-
includeNames: AERO_ADS_OPERATOR_MCP_TOOL_NAMES
|
|
14769
|
+
includeNames: AERO_ADS_OPERATOR_MCP_TOOL_NAMES,
|
|
14770
|
+
managedSweeps: opts.managedSweeps
|
|
14710
14771
|
});
|
|
14711
14772
|
return [buildAdsOperatorContextTool(ctx), ...mcpTools];
|
|
14712
14773
|
}
|
|
14713
14774
|
function buildAeroStateTools(ctx, opts = {}) {
|
|
14714
14775
|
const scope = opts.scope ?? AeroToolScopes.all;
|
|
14715
14776
|
const profile = opts.profile ?? AeroToolProfiles.default;
|
|
14777
|
+
const managedSweeps = opts.managedSweeps;
|
|
14716
14778
|
if (profile === AeroToolProfiles.adsOperator) {
|
|
14717
|
-
return buildAdsOperatorTools(ctx, { scope });
|
|
14779
|
+
return buildAdsOperatorTools(ctx, { scope, managedSweeps });
|
|
14718
14780
|
}
|
|
14719
|
-
return scope === AeroToolScopes.readOnly ? buildReadTools(ctx) : buildAllTools(ctx);
|
|
14781
|
+
return scope === AeroToolScopes.readOnly ? buildReadTools(ctx, { managedSweeps }) : buildAllTools(ctx, { managedSweeps });
|
|
14720
14782
|
}
|
|
14721
14783
|
|
|
14722
14784
|
// src/agent/llm-usage.ts
|
|
@@ -15151,7 +15213,7 @@ function createAeroSession(opts) {
|
|
|
15151
15213
|
client: opts.client,
|
|
15152
15214
|
projectName: opts.projectName
|
|
15153
15215
|
};
|
|
15154
|
-
const stateTools = buildAeroStateTools(toolCtx, { scope: toolScope, profile: toolProfile });
|
|
15216
|
+
const stateTools = buildAeroStateTools(toolCtx, { scope: toolScope, profile: toolProfile, managedSweeps: opts.managedSweeps });
|
|
15155
15217
|
const defaultTools = [...stateTools, ...buildSkillDocTools(), ...toolProfile === AeroToolProfiles.default ? [buildAeroViewTool({ ...toolCtx, basePath: opts.config.basePath })] : []];
|
|
15156
15218
|
const tools = opts.tools ?? defaultTools;
|
|
15157
15219
|
const toolUsageHooks = opts.db ? createAeroToolUsageHooks({
|
|
@@ -15645,6 +15707,7 @@ var SessionRegistry = class {
|
|
|
15645
15707
|
initialMessages: persistedMessages,
|
|
15646
15708
|
toolScope: preferences?.toolScope,
|
|
15647
15709
|
toolProfile: preferences?.toolProfile,
|
|
15710
|
+
managedSweeps: this.opts.managedSweeps,
|
|
15648
15711
|
db: this.opts.db,
|
|
15649
15712
|
projectId,
|
|
15650
15713
|
agentSessionId: row.id
|
|
@@ -15673,6 +15736,7 @@ var SessionRegistry = class {
|
|
|
15673
15736
|
systemPromptOverride: this.buildHydratedSystemPrompt(projectId, systemPrompt),
|
|
15674
15737
|
toolScope: preferences?.toolScope,
|
|
15675
15738
|
toolProfile: preferences?.toolProfile,
|
|
15739
|
+
managedSweeps: this.opts.managedSweeps,
|
|
15676
15740
|
db: this.opts.db,
|
|
15677
15741
|
projectId,
|
|
15678
15742
|
agentSessionId: sessionId
|
|
@@ -15865,7 +15929,7 @@ ${lines.join("\n")}
|
|
|
15865
15929
|
const projectId = this.projectIds.get(projectName) ?? this.resolveProjectId(projectName);
|
|
15866
15930
|
this.projectIds.set(projectName, projectId);
|
|
15867
15931
|
const toolCtx = { client: this.opts.client, projectName };
|
|
15868
|
-
const stateTools = buildAeroStateTools(toolCtx, want);
|
|
15932
|
+
const stateTools = buildAeroStateTools(toolCtx, { ...want, managedSweeps: this.opts.managedSweeps });
|
|
15869
15933
|
agent.state.tools = [...stateTools, ...buildSkillDocTools()];
|
|
15870
15934
|
this.scopes.set(projectName, want.scope);
|
|
15871
15935
|
this.profiles.set(projectName, want.profile);
|
|
@@ -18214,7 +18278,8 @@ async function createServer(opts) {
|
|
|
18214
18278
|
db: opts.db,
|
|
18215
18279
|
client: aeroClient,
|
|
18216
18280
|
config: opts.config,
|
|
18217
|
-
proactive: agentProactive
|
|
18281
|
+
proactive: agentProactive,
|
|
18282
|
+
managedSweeps: dashboardManagedRunKinds.includes(SchedulableRunKinds["answer-visibility"])
|
|
18218
18283
|
}) : void 0;
|
|
18219
18284
|
const runCoordinator = new RunCoordinator(
|
|
18220
18285
|
opts.db,
|
|
@@ -18485,7 +18550,8 @@ async function createServer(opts) {
|
|
|
18485
18550
|
lifetimeSpendLimitMicros: entity.budget?.lifetime_spend_limit_micros ?? null,
|
|
18486
18551
|
locationIds: entity.targeting?.locations?.include?.map((location) => location.id) ?? [],
|
|
18487
18552
|
biddingType: entity.bidding_type,
|
|
18488
|
-
conversionEventSettingIds: entity.conversion_event_setting_ids
|
|
18553
|
+
conversionEventSettingIds: entity.conversion_event_setting_ids,
|
|
18554
|
+
landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
|
|
18489
18555
|
});
|
|
18490
18556
|
const adsAdGroupEntityResult = (entity, campaignId) => ({
|
|
18491
18557
|
...adsEntityResult(entity),
|
|
@@ -18493,12 +18559,15 @@ async function createServer(opts) {
|
|
|
18493
18559
|
campaignId: campaignId ?? null,
|
|
18494
18560
|
contextHints: entity.context_hints,
|
|
18495
18561
|
maxBidMicros: entity.bidding_config?.max_bid_micros ?? null,
|
|
18496
|
-
billingEventType: entity.bidding_config?.billing_event_type ?? null
|
|
18562
|
+
billingEventType: entity.bidding_config?.billing_event_type ?? null,
|
|
18563
|
+
landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
|
|
18497
18564
|
});
|
|
18498
18565
|
const adsAdEntityResult = (entity, adGroupId) => ({
|
|
18499
18566
|
...adsEntityResult(entity),
|
|
18500
|
-
adGroupId: adGroupId ?? null
|
|
18567
|
+
adGroupId: adGroupId ?? null,
|
|
18568
|
+
landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
|
|
18501
18569
|
});
|
|
18570
|
+
const landingPageConfigurationUpdate = (template) => template === void 0 ? void 0 : template === null ? null : { query_string_template: template };
|
|
18502
18571
|
const adsOperator = {
|
|
18503
18572
|
uploadImage: async (apiKey, imageUrl) => {
|
|
18504
18573
|
const result2 = await uploadImageFromUrl(apiKey, imageUrl);
|
|
@@ -18515,7 +18584,8 @@ async function createServer(opts) {
|
|
|
18515
18584
|
budget: { lifetime_spend_limit_micros: input.lifetimeSpendLimitMicros },
|
|
18516
18585
|
bidding_type: input.biddingType,
|
|
18517
18586
|
conversion_event_setting_ids: input.conversionEventSettingIds,
|
|
18518
|
-
targeting: { locations: { include: input.locationIds.map((id) => ({ id })) } }
|
|
18587
|
+
targeting: { locations: { include: input.locationIds.map((id) => ({ id })) } },
|
|
18588
|
+
landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
|
|
18519
18589
|
})),
|
|
18520
18590
|
updateCampaign: async (apiKey, id, input) => adsCampaignEntityResult(await updateCampaign(apiKey, id, {
|
|
18521
18591
|
name: input.name,
|
|
@@ -18523,7 +18593,8 @@ async function createServer(opts) {
|
|
|
18523
18593
|
start_time: input.startTime,
|
|
18524
18594
|
end_time: input.endTime,
|
|
18525
18595
|
budget: input.lifetimeSpendLimitMicros === void 0 ? void 0 : { lifetime_spend_limit_micros: input.lifetimeSpendLimitMicros },
|
|
18526
|
-
targeting: input.locationIds === void 0 ? void 0 : { locations: { include: input.locationIds.map((locationId) => ({ id: locationId })) } }
|
|
18596
|
+
targeting: input.locationIds === void 0 ? void 0 : { locations: { include: input.locationIds.map((locationId) => ({ id: locationId })) } },
|
|
18597
|
+
landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
|
|
18527
18598
|
})),
|
|
18528
18599
|
activateCampaign: async (apiKey, id) => adsCampaignEntityResult(await activateCampaign(apiKey, id)),
|
|
18529
18600
|
pauseCampaign: async (apiKey, id) => adsCampaignEntityResult(await pauseCampaign(apiKey, id)),
|
|
@@ -18539,7 +18610,8 @@ async function createServer(opts) {
|
|
|
18539
18610
|
bidding_config: {
|
|
18540
18611
|
billing_event_type: input.billingEventType,
|
|
18541
18612
|
max_bid_micros: input.maxBidMicros
|
|
18542
|
-
}
|
|
18613
|
+
},
|
|
18614
|
+
landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
|
|
18543
18615
|
})),
|
|
18544
18616
|
updateAdGroup: async (apiKey, id, input) => {
|
|
18545
18617
|
let biddingConfig;
|
|
@@ -18556,7 +18628,8 @@ async function createServer(opts) {
|
|
|
18556
18628
|
name: input.name,
|
|
18557
18629
|
description: input.description,
|
|
18558
18630
|
context_hints: input.contextHints,
|
|
18559
|
-
bidding_config: biddingConfig
|
|
18631
|
+
bidding_config: biddingConfig,
|
|
18632
|
+
landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
|
|
18560
18633
|
}));
|
|
18561
18634
|
},
|
|
18562
18635
|
activateAdGroup: async (apiKey, id) => adsAdGroupEntityResult(await activateAdGroup(apiKey, id)),
|
|
@@ -18574,7 +18647,8 @@ async function createServer(opts) {
|
|
|
18574
18647
|
body: input.creative.body,
|
|
18575
18648
|
target_url: input.creative.targetUrl,
|
|
18576
18649
|
file_id: input.creative.fileId
|
|
18577
|
-
}
|
|
18650
|
+
},
|
|
18651
|
+
landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
|
|
18578
18652
|
})),
|
|
18579
18653
|
updateAd: async (apiKey, id, input) => adsAdEntityResult(await updateAd(apiKey, id, {
|
|
18580
18654
|
name: input.name,
|
|
@@ -18584,7 +18658,8 @@ async function createServer(opts) {
|
|
|
18584
18658
|
body: input.creative.body,
|
|
18585
18659
|
target_url: input.creative.targetUrl,
|
|
18586
18660
|
file_id: input.creative.fileId
|
|
18587
|
-
} : void 0
|
|
18661
|
+
} : void 0,
|
|
18662
|
+
landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
|
|
18588
18663
|
})),
|
|
18589
18664
|
activateAd: async (apiKey, id) => adsAdEntityResult(await activateAd(apiKey, id)),
|
|
18590
18665
|
pauseAd: async (apiKey, id) => adsAdEntityResult(await pauseAd(apiKey, id)),
|
package/dist/cli.js
CHANGED
|
@@ -35,11 +35,11 @@ import {
|
|
|
35
35
|
trackCliCommandFinished,
|
|
36
36
|
trackEvent,
|
|
37
37
|
waitForServerRuntimeStartup
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-XDFMFZRN.js";
|
|
39
39
|
import {
|
|
40
40
|
autoSyncSkills,
|
|
41
41
|
formatAutoSyncNotice
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-JO5HHEJV.js";
|
|
43
43
|
import {
|
|
44
44
|
CliError,
|
|
45
45
|
EXIT_SYSTEM_ERROR,
|
|
@@ -66,13 +66,13 @@ import {
|
|
|
66
66
|
shouldPrintServeSkillsNudge,
|
|
67
67
|
systemError,
|
|
68
68
|
usageError
|
|
69
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-ZGZSROSR.js";
|
|
70
70
|
import {
|
|
71
71
|
DEFAULT_DEMO_TRUSTED_PROXIES,
|
|
72
72
|
trustedProxiesProblem,
|
|
73
73
|
trustedProxyProblem
|
|
74
74
|
} from "./chunk-RB2F4D3Z.js";
|
|
75
|
-
import "./chunk-
|
|
75
|
+
import "./chunk-CDQDPUY4.js";
|
|
76
76
|
import "./chunk-AOJU5LKX.js";
|
|
77
77
|
import {
|
|
78
78
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
@@ -88,7 +88,7 @@ import {
|
|
|
88
88
|
queries,
|
|
89
89
|
renderReportHtml,
|
|
90
90
|
runs
|
|
91
|
-
} from "./chunk-
|
|
91
|
+
} from "./chunk-3YAPVVFN.js";
|
|
92
92
|
import {
|
|
93
93
|
AdsDeliverySnapshotStatuses,
|
|
94
94
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -173,7 +173,7 @@ import {
|
|
|
173
173
|
snapshotProviderModeSchema,
|
|
174
174
|
visibilityReportRequestSchema,
|
|
175
175
|
winnabilityClassSchema
|
|
176
|
-
} from "./chunk-
|
|
176
|
+
} from "./chunk-L36TC6LB.js";
|
|
177
177
|
|
|
178
178
|
// src/cli.ts
|
|
179
179
|
import { pathToFileURL } from "url";
|
|
@@ -438,7 +438,7 @@ function parseDemoTrustedProxies(values) {
|
|
|
438
438
|
async function demoCommand(options) {
|
|
439
439
|
const { host, port } = parseDemoListenOptions(options);
|
|
440
440
|
const trustProxy = parseDemoTrustedProxies(options.trustProxy);
|
|
441
|
-
const { createDemoServer } = await import("./demo-server-
|
|
441
|
+
const { createDemoServer } = await import("./demo-server-QLQUVMKJ.js");
|
|
442
442
|
const app = await createDemoServer({ trustProxy });
|
|
443
443
|
let stopping = false;
|
|
444
444
|
const stop = () => {
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
layoutSiteCrawlGraphInput,
|
|
6
6
|
persistSiteCrawlGraphLayout
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CDQDPUY4.js";
|
|
8
8
|
import {
|
|
9
9
|
PACKAGE_VERSION
|
|
10
10
|
} from "./chunk-AOJU5LKX.js";
|
|
@@ -83,7 +83,7 @@ import {
|
|
|
83
83
|
siteCrawlPages,
|
|
84
84
|
siteCrawlSnapshots,
|
|
85
85
|
trafficSources
|
|
86
|
-
} from "./chunk-
|
|
86
|
+
} from "./chunk-3YAPVVFN.js";
|
|
87
87
|
import {
|
|
88
88
|
RunKinds,
|
|
89
89
|
SiteCrawlFetchStates,
|
|
@@ -104,7 +104,7 @@ import {
|
|
|
104
104
|
measurementPlanV2Schema,
|
|
105
105
|
placementLinkDecision,
|
|
106
106
|
siteAuditPageFactorSchema
|
|
107
|
-
} from "./chunk-
|
|
107
|
+
} from "./chunk-L36TC6LB.js";
|
|
108
108
|
|
|
109
109
|
// src/demo-server.ts
|
|
110
110
|
import { dirname, join as join2 } from "path";
|
package/dist/index.js
CHANGED
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
createGoogleMarketingCredentialStore,
|
|
4
4
|
createGoogleMarketingRuntime,
|
|
5
5
|
createServer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XDFMFZRN.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-ZGZSROSR.js";
|
|
10
|
+
import "./chunk-CDQDPUY4.js";
|
|
11
11
|
import "./chunk-AOJU5LKX.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-3YAPVVFN.js";
|
|
13
|
+
import "./chunk-L36TC6LB.js";
|
|
14
14
|
export {
|
|
15
15
|
GoogleMarketingRuntimeError,
|
|
16
16
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JO5HHEJV.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZGZSROSR.js";
|
|
8
8
|
import "./chunk-AOJU5LKX.js";
|
|
9
9
|
import {
|
|
10
10
|
isReadOnlyKey,
|
|
11
11
|
updateCheckEnvOptOut
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-L36TC6LB.js";
|
|
13
13
|
|
|
14
14
|
// src/mcp/cli.ts
|
|
15
15
|
import { randomUUID } from "crypto";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canonry/canonry",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.16.0",
|
|
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": [
|
|
@@ -86,32 +86,32 @@
|
|
|
86
86
|
"@types/node-cron": "^3.0.11",
|
|
87
87
|
"tsup": "^8.5.1",
|
|
88
88
|
"tsx": "^4.19.0",
|
|
89
|
-
"@ainyc/canonry-web": "0.0.0",
|
|
90
89
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
91
|
-
"@ainyc/canonry-
|
|
90
|
+
"@ainyc/canonry-web": "0.0.0",
|
|
92
91
|
"@ainyc/canonry-config": "0.0.0",
|
|
92
|
+
"@ainyc/canonry-api-routes": "0.0.0",
|
|
93
93
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
94
94
|
"@ainyc/canonry-db": "0.0.0",
|
|
95
95
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
96
96
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
97
|
-
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
98
97
|
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
99
98
|
"@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
|
|
100
|
-
"@ainyc/canonry-integration-
|
|
101
|
-
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
99
|
+
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
102
100
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
103
|
-
"@ainyc/canonry-integration-google-
|
|
104
|
-
"@ainyc/canonry-integration-
|
|
101
|
+
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
102
|
+
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
105
103
|
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
104
|
+
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
105
|
+
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
106
|
+
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
106
107
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
108
|
+
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
107
109
|
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
108
|
-
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
109
|
-
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
110
110
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
111
111
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
112
|
-
"@ainyc/canonry-provider-
|
|
113
|
-
"@ainyc/canonry-
|
|
114
|
-
"@ainyc/canonry-provider-
|
|
112
|
+
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
113
|
+
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
114
|
+
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
115
115
|
},
|
|
116
116
|
"scripts": {
|
|
117
117
|
"build": "pnpm run build:cli && pnpm run build:web",
|