@canonry/canonry 7.47.0 → 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.
- package/dist/{chunk-RUAQAQ7X.js → chunk-IYAUKA7Z.js} +29 -15
- package/dist/{chunk-3F4KBEMY.js → chunk-JNBPNW7P.js} +1 -1
- package/dist/{chunk-KCSU2OSL.js → chunk-QNXQHHCP.js} +19 -6
- package/dist/{chunk-XLKWD5WO.js → chunk-XCS3JXN2.js} +5 -5
- package/dist/{cli-commands-RJF4TCEZ.js → cli-commands-ZX7GLZZT.js} +4 -4
- package/dist/cli.js +4 -4
- package/dist/{demo-server-ASCEFIVC.js → demo-server-GPNX3EXT.js} +2 -2
- package/dist/index.js +3 -3
- package/dist/{intelligence-service-VRWJUHNM.js → intelligence-service-LZ3MC6G6.js} +1 -1
- package/package.json +10 -10
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
persistSiteCrawlGraphLayout,
|
|
30
30
|
prepareSiteCrawlGraphLayout,
|
|
31
31
|
recordedSharePct
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-JNBPNW7P.js";
|
|
33
33
|
import {
|
|
34
34
|
CanonryMcpToolNames,
|
|
35
35
|
PACKAGE_VERSION,
|
|
@@ -241,7 +241,7 @@ import {
|
|
|
241
241
|
webhookResponseReason,
|
|
242
242
|
webhookTargetRefusalReason,
|
|
243
243
|
writeAuditLog
|
|
244
|
-
} from "./chunk-
|
|
244
|
+
} from "./chunk-QNXQHHCP.js";
|
|
245
245
|
import {
|
|
246
246
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
247
247
|
AGENT_NONE,
|
|
@@ -3587,16 +3587,14 @@ var DefaultGoogleMarketingRuntime = class {
|
|
|
3587
3587
|
"INVALID_INPUT"
|
|
3588
3588
|
);
|
|
3589
3589
|
}
|
|
3590
|
-
const
|
|
3591
|
-
|
|
3592
|
-
throw new GoogleMarketingRuntimeError("Selected GTM workspace was not found", "RESOURCE_NOT_FOUND");
|
|
3593
|
-
}
|
|
3590
|
+
const selectedWorkspaceExists = selectedWorkspaceId !== null && workspaceDtos.some((candidate) => candidate.id === selectedWorkspaceId);
|
|
3591
|
+
const workspaceId = selectedWorkspaceId === null || selectedWorkspaceExists ? selectedWorkspaceId : workspaceDtos.length === 1 ? workspaceDtos[0].id : null;
|
|
3594
3592
|
const snapshotReads = [
|
|
3595
3593
|
client.getLiveSnapshot(selectedContainerPath)
|
|
3596
3594
|
];
|
|
3597
|
-
if (
|
|
3595
|
+
if (workspaceId) {
|
|
3598
3596
|
snapshotReads.push(client.getWorkspaceSnapshot(
|
|
3599
|
-
workspacePath(selectedAccountId, selectedContainerId,
|
|
3597
|
+
workspacePath(selectedAccountId, selectedContainerId, workspaceId)
|
|
3600
3598
|
));
|
|
3601
3599
|
}
|
|
3602
3600
|
const snapshots = await Promise.all(snapshotReads);
|
|
@@ -3625,7 +3623,7 @@ var DefaultGoogleMarketingRuntime = class {
|
|
|
3625
3623
|
payload,
|
|
3626
3624
|
selectedAccountId,
|
|
3627
3625
|
selectedContainerId,
|
|
3628
|
-
|
|
3626
|
+
workspaceId,
|
|
3629
3627
|
raw,
|
|
3630
3628
|
capturedAt
|
|
3631
3629
|
);
|
|
@@ -3715,7 +3713,7 @@ import path10 from "path";
|
|
|
3715
3713
|
import { isIP } from "net";
|
|
3716
3714
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
3717
3715
|
import { setImmediate as yieldToEventLoop4 } from "timers/promises";
|
|
3718
|
-
import { and as and25, eq as eq31, isNotNull as isNotNull5, isNull as isNull5, lte as lte2, max, ne as ne4, or as or3, sql as
|
|
3716
|
+
import { and as and25, eq as eq31, isNotNull as isNotNull5, isNull as isNull5, lte as lte2, max, ne as ne4, or as or3, sql as sql13 } from "drizzle-orm";
|
|
3719
3717
|
|
|
3720
3718
|
// ../integration-typesafe/src/classifier.ts
|
|
3721
3719
|
import { createHash } from "crypto";
|
|
@@ -8595,7 +8593,7 @@ function nonBlank(value) {
|
|
|
8595
8593
|
return trimmed ? trimmed : void 0;
|
|
8596
8594
|
}
|
|
8597
8595
|
function resolveBuildCommit(env = process.env) {
|
|
8598
|
-
const embedded = true ? "
|
|
8596
|
+
const embedded = true ? "6f65fc00d407b63da0801a4f151064d5f7065440" : void 0;
|
|
8599
8597
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
8600
8598
|
}
|
|
8601
8599
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -22932,7 +22930,7 @@ function finalizeResearchRun(db, runId, fatalError) {
|
|
|
22932
22930
|
}
|
|
22933
22931
|
|
|
22934
22932
|
// src/google-marketing-sync.ts
|
|
22935
|
-
import { and as and24, eq as eq30, isNull as isNull4 } from "drizzle-orm";
|
|
22933
|
+
import { and as and24, eq as eq30, isNull as isNull4, sql as sql12 } from "drizzle-orm";
|
|
22936
22934
|
var RUNTIME_FAILURE_REASONS = {
|
|
22937
22935
|
INVALID_INPUT: OutcomeReasonCodes.VALIDATION,
|
|
22938
22936
|
NOT_CONFIGURED: OutcomeReasonCodes.NOT_CONNECTED,
|
|
@@ -23161,10 +23159,12 @@ async function executeGtmMarketingSync(db, runtime, runId, projectId) {
|
|
|
23161
23159
|
throw new Error("Google Marketing runtime returned the wrong GTM snapshot kind.");
|
|
23162
23160
|
}
|
|
23163
23161
|
const graph = snapshot.payload.data;
|
|
23164
|
-
|
|
23162
|
+
const workspaceId = snapshot.metadata.workspaceId;
|
|
23163
|
+
const workspaceReplaced = connection.selectedWorkspaceId !== null && workspaceId !== connection.selectedWorkspaceId && !graph.workspaces.some((workspace) => workspace.id === connection.selectedWorkspaceId) && (workspaceId === null || graph.workspaces.length === 1 && graph.workspaces[0].id === workspaceId);
|
|
23164
|
+
if (snapshot.metadata.accountId !== connection.selectedAccountId || snapshot.metadata.containerId !== connection.selectedContainerId || workspaceId !== connection.selectedWorkspaceId && !workspaceReplaced) {
|
|
23165
23165
|
throw new Error("GTM returned evidence for a different account, container, or workspace.");
|
|
23166
23166
|
}
|
|
23167
|
-
const selectedWorkspace =
|
|
23167
|
+
const selectedWorkspace = workspaceId ? graph.workspaces.find((workspace) => workspace.id === workspaceId) : null;
|
|
23168
23168
|
const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
23169
23169
|
db.transaction((tx) => {
|
|
23170
23170
|
const terminalClaim = tx.update(runs).set({
|
|
@@ -23188,6 +23188,10 @@ async function executeGtmMarketingSync(db, runtime, runId, projectId) {
|
|
|
23188
23188
|
selectedContainerName: graph.container.name,
|
|
23189
23189
|
selectedContainerPublicId: graph.container.publicId,
|
|
23190
23190
|
selectedWorkspaceName: selectedWorkspace?.name ?? null,
|
|
23191
|
+
...workspaceReplaced ? {
|
|
23192
|
+
selectedWorkspaceId: workspaceId,
|
|
23193
|
+
selectionGeneration: sql12`${gtmConnections.selectionGeneration} + 1`
|
|
23194
|
+
} : {},
|
|
23191
23195
|
lastValidatedAt: snapshot.metadata.capturedAt,
|
|
23192
23196
|
lastSnapshotAt: snapshot.metadata.capturedAt,
|
|
23193
23197
|
lastSnapshotId: snapshot.metadata.id,
|
|
@@ -23207,6 +23211,16 @@ async function executeGtmMarketingSync(db, runtime, runId, projectId) {
|
|
|
23207
23211
|
);
|
|
23208
23212
|
}
|
|
23209
23213
|
tx.insert(gtmRawSnapshots).values(gtmSnapshotValues(snapshot)).run();
|
|
23214
|
+
if (workspaceReplaced) {
|
|
23215
|
+
writeAuditLog(tx, {
|
|
23216
|
+
projectId,
|
|
23217
|
+
actor: "system",
|
|
23218
|
+
action: "gtm.workspace-followed",
|
|
23219
|
+
entityType: "gtm-connection",
|
|
23220
|
+
entityId: connection.id,
|
|
23221
|
+
diff: { from: connection.selectedWorkspaceId, to: workspaceId }
|
|
23222
|
+
});
|
|
23223
|
+
}
|
|
23210
23224
|
});
|
|
23211
23225
|
reportOutcome({ status: OutcomeStatuses.succeeded, counts: { items: (graph.live ?? graph.draft)?.graph.tags.length ?? 0 } });
|
|
23212
23226
|
} catch (error) {
|
|
@@ -24841,7 +24855,7 @@ async function createServer(opts) {
|
|
|
24841
24855
|
const recomputeDebts = /* @__PURE__ */ new Map();
|
|
24842
24856
|
let recomputeSequence = 0;
|
|
24843
24857
|
const markAnswerFieldRecompute = (projectId, full) => {
|
|
24844
|
-
opts.db.update(projects).set({ answerFieldsRecompute: full ? "full" :
|
|
24858
|
+
opts.db.update(projects).set({ answerFieldsRecompute: full ? "full" : sql13`CASE WHEN ${projects.answerFieldsRecompute} = 'full' THEN 'full' ELSE 'competitors' END` }).where(eq31(projects.id, projectId)).run();
|
|
24845
24859
|
};
|
|
24846
24860
|
const requestAnswerFieldRecompute = (projectId, projectName, scope, reason) => {
|
|
24847
24861
|
const sequence = ++recomputeSequence;
|
|
@@ -87496,7 +87496,8 @@ var SPECS = [
|
|
|
87496
87496
|
kind: RunKinds["gtm-sync"],
|
|
87497
87497
|
connection: googleMarketingConnection("gtm"),
|
|
87498
87498
|
syncCommand: (name) => `canonry gtm sync ${name}`,
|
|
87499
|
-
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>\`.`
|
|
87500
87501
|
},
|
|
87501
87502
|
{
|
|
87502
87503
|
prefix: "gbp",
|
|
@@ -87592,12 +87593,13 @@ function gradeSyncFailures(ctx, spec) {
|
|
|
87592
87593
|
const errorText = state.latestError ?? "no error was recorded";
|
|
87593
87594
|
const shownError = errorText.length > SUMMARY_ERROR_LIMIT ? `${truncateUtf16(errorText, SUMMARY_ERROR_LIMIT)}...` : errorText;
|
|
87594
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);
|
|
87595
87597
|
return {
|
|
87596
87598
|
status: CheckStatuses.fail,
|
|
87597
87599
|
code: code("repeated-failures"),
|
|
87598
87600
|
urgent: true,
|
|
87599
87601
|
summary: `The last ${state.consecutiveFailures} ${spec.label} syncs failed (last success: ${lastSuccessText}). Latest error: ${shownError}`,
|
|
87600
|
-
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)}\`.`,
|
|
87601
87603
|
details
|
|
87602
87604
|
};
|
|
87603
87605
|
}
|
|
@@ -88822,12 +88824,23 @@ var sourceConnectedCheck = {
|
|
|
88822
88824
|
}
|
|
88823
88825
|
const errored = activeSources.filter((s) => s.status === "error");
|
|
88824
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.";
|
|
88825
88832
|
return {
|
|
88826
|
-
status: CheckStatuses.fail,
|
|
88827
|
-
code: "traffic.source.all-errored",
|
|
88828
|
-
summary: `All ${activeSources.length} active traffic source(s) are in error state.
|
|
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}`,
|
|
88829
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.",
|
|
88830
|
-
details: {
|
|
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
|
+
}
|
|
88831
88844
|
};
|
|
88832
88845
|
}
|
|
88833
88846
|
if (errored.length > 0) {
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
trackFeatureCompleted,
|
|
32
32
|
trackIntegrationConnection,
|
|
33
33
|
waitForServerRuntimeStartup
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-IYAUKA7Z.js";
|
|
35
35
|
import {
|
|
36
36
|
clearDashboardPassword,
|
|
37
37
|
configExists,
|
|
@@ -122,7 +122,7 @@ import {
|
|
|
122
122
|
rawEventSamples,
|
|
123
123
|
readMarketCompetitorNames,
|
|
124
124
|
runs
|
|
125
|
-
} from "./chunk-
|
|
125
|
+
} from "./chunk-QNXQHHCP.js";
|
|
126
126
|
import {
|
|
127
127
|
AdsDeliverySnapshotStatuses,
|
|
128
128
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -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-
|
|
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-
|
|
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-MRYQK7LI.js"), import("./cli-commands-
|
|
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
|
},
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
REGISTERED_CLI_COMMANDS
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-XCS3JXN2.js";
|
|
4
|
+
import "./chunk-IYAUKA7Z.js";
|
|
5
5
|
import "./chunk-CIYCCA2I.js";
|
|
6
6
|
import "./chunk-DGKSQ5QD.js";
|
|
7
7
|
import "./chunk-RB2F4D3Z.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-JNBPNW7P.js";
|
|
9
9
|
import "./chunk-XHRJYIJQ.js";
|
|
10
10
|
import "./chunk-HGMYEDAQ.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-QNXQHHCP.js";
|
|
12
12
|
import "./chunk-QS262E4F.js";
|
|
13
13
|
export {
|
|
14
14
|
REGISTERED_CLI_COMMANDS
|
package/dist/cli.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
buildSetupState,
|
|
14
14
|
consumePendingServeHandoff,
|
|
15
15
|
serveCommand
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XCS3JXN2.js";
|
|
17
17
|
import {
|
|
18
18
|
checkLatestVersionForCli,
|
|
19
19
|
cliRuntimeContext,
|
|
@@ -27,13 +27,13 @@ import {
|
|
|
27
27
|
showFirstRunNotice,
|
|
28
28
|
trackCliCommandFinished,
|
|
29
29
|
trackEvent
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-IYAUKA7Z.js";
|
|
31
31
|
import "./chunk-CIYCCA2I.js";
|
|
32
32
|
import {
|
|
33
33
|
resolveCliAccess
|
|
34
34
|
} from "./chunk-DGKSQ5QD.js";
|
|
35
35
|
import "./chunk-RB2F4D3Z.js";
|
|
36
|
-
import "./chunk-
|
|
36
|
+
import "./chunk-JNBPNW7P.js";
|
|
37
37
|
import "./chunk-XHRJYIJQ.js";
|
|
38
38
|
import {
|
|
39
39
|
CliError,
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
printCliError,
|
|
43
43
|
usageError
|
|
44
44
|
} from "./chunk-HGMYEDAQ.js";
|
|
45
|
-
import "./chunk-
|
|
45
|
+
import "./chunk-QNXQHHCP.js";
|
|
46
46
|
import {
|
|
47
47
|
OperationAccesses
|
|
48
48
|
} from "./chunk-QS262E4F.js";
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
computeFactorAverages,
|
|
6
6
|
layoutSiteCrawlGraphInput,
|
|
7
7
|
persistSiteCrawlGraphLayout
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JNBPNW7P.js";
|
|
9
9
|
import {
|
|
10
10
|
PACKAGE_VERSION,
|
|
11
11
|
canonryMcpTools
|
|
@@ -86,7 +86,7 @@ import {
|
|
|
86
86
|
siteCrawlPages,
|
|
87
87
|
siteCrawlSnapshots,
|
|
88
88
|
trafficSources
|
|
89
|
-
} from "./chunk-
|
|
89
|
+
} from "./chunk-QNXQHHCP.js";
|
|
90
90
|
import {
|
|
91
91
|
RunKinds,
|
|
92
92
|
SiteCrawlFetchStates,
|
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-IYAUKA7Z.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
9
|
} from "./chunk-CIYCCA2I.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-JNBPNW7P.js";
|
|
11
11
|
import "./chunk-XHRJYIJQ.js";
|
|
12
12
|
import "./chunk-HGMYEDAQ.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-QNXQHHCP.js";
|
|
14
14
|
import "./chunk-QS262E4F.js";
|
|
15
15
|
export {
|
|
16
16
|
GoogleMarketingRuntimeError,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canonry/canonry",
|
|
3
|
-
"version": "7.47.
|
|
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": [
|
|
@@ -86,33 +86,33 @@
|
|
|
86
86
|
"tsup": "^8.5.1",
|
|
87
87
|
"tsx": "^4.19.0",
|
|
88
88
|
"@canonry/canonry-web": "0.0.0",
|
|
89
|
-
"@canonry/canonry-api-
|
|
89
|
+
"@canonry/canonry-api-client": "0.0.0",
|
|
90
90
|
"@canonry/canonry-contracts": "0.0.0",
|
|
91
91
|
"@canonry/canonry-config": "0.0.0",
|
|
92
|
-
"@canonry/canonry-api-client": "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
95
|
"@canonry/canonry-integration-cloudflare-worker": "0.0.0",
|
|
97
96
|
"@canonry/canonry-integration-cloudflare-queue": "0.0.0",
|
|
98
|
-
"@canonry/canonry-integration-
|
|
97
|
+
"@canonry/canonry-integration-cloud-run": "0.0.0",
|
|
99
98
|
"@canonry/canonry-integration-google": "0.0.0",
|
|
100
99
|
"@canonry/canonry-integration-google-ads": "0.0.0",
|
|
101
|
-
"@canonry/canonry-integration-google-places": "0.0.0",
|
|
102
100
|
"@canonry/canonry-integration-google-business-profile": "0.0.0",
|
|
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",
|
|
103
105
|
"@canonry/canonry-integration-traffic": "0.0.0",
|
|
104
106
|
"@canonry/canonry-integration-wordpress": "0.0.0",
|
|
105
|
-
"@canonry/canonry-integration-openai-ads": "0.0.0",
|
|
106
107
|
"@canonry/canonry-provider-cdp": "0.0.0",
|
|
107
108
|
"@canonry/canonry-intelligence": "0.0.0",
|
|
108
109
|
"@canonry/canonry-provider-gemini": "0.0.0",
|
|
109
110
|
"@canonry/canonry-provider-local": "0.0.0",
|
|
110
|
-
"@canonry/canonry-provider-claude": "0.0.0",
|
|
111
111
|
"@canonry/canonry-provider-muse": "0.0.0",
|
|
112
112
|
"@canonry/canonry-provider-openai": "0.0.0",
|
|
113
|
-
"@canonry/canonry-integration-typesafe": "0.0.0",
|
|
114
113
|
"@canonry/canonry-provider-perplexity": "0.0.0",
|
|
115
|
-
"@canonry/canonry-integration-
|
|
114
|
+
"@canonry/canonry-integration-typesafe": "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",
|