@canonry/canonry 7.64.5 → 7.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +2 -1
  2. package/assets/assets/{AgentSetupPage-DYw_Srwu.js → AgentSetupPage-DPHRo4OR.js} +1 -1
  3. package/assets/assets/{AuditHistoryPanel-6_-mgHbw.js → AuditHistoryPanel-qhIB8KRK.js} +1 -1
  4. package/assets/assets/{BacklinksPage-DFzYKntv.js → BacklinksPage-iWrZ0-Pp.js} +1 -1
  5. package/assets/assets/{HistoryPage-C4pZxBYX.js → HistoryPage-BP1_GGlT.js} +1 -1
  6. package/assets/assets/{MeasurementPropertyPage-C7TkC3Ja.js → MeasurementPropertyPage-DfPHZNGo.js} +1 -1
  7. package/assets/assets/{ProjectPage-CmT2Vghx.js → ProjectPage-D4n2oqPP.js} +2 -2
  8. package/assets/assets/RunsPage-Cc98Px3T.js +1 -0
  9. package/assets/assets/{SettingsPage-Cl6ni4_w.js → SettingsPage-CMyCE-H2.js} +1 -1
  10. package/assets/assets/{SiteHealthSection-D8D2mIsJ.js → SiteHealthSection-CGKKUtqQ.js} +2 -2
  11. package/assets/assets/ToneBadge-CJ6ObMRe.js +60 -0
  12. package/assets/assets/{TrafficPage-jAQRK1Xq.js → TrafficPage-DAef3d2A.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-VuKDrAGn.js → TrafficSourceDetailPage-CdoL5Dt9.js} +1 -1
  14. package/assets/assets/{account-context-haz0f6Tu.js → account-context-CWRd3KeS.js} +1 -1
  15. package/assets/assets/{card-BAimTqa8.js → card-Cb_fM36G.js} +1 -1
  16. package/assets/assets/{extract-error-message-BBG79rN-.js → extract-error-message-DSIAoHTR.js} +1 -1
  17. package/assets/assets/{format-helpers-DQRYsYjD.js → format-helpers-CxNDa1oa.js} +1 -1
  18. package/assets/assets/{index-DyLlYKrZ.js → index-DEXKV7TW.js} +6 -6
  19. package/assets/assets/{query-client-DhJ8vlMi.js → query-client-DLdAMlsX.js} +1 -1
  20. package/assets/assets/{react-query-CRJlZpE1.js → react-query-BktZZtSC.js} +1 -1
  21. package/assets/assets/{react-sigma_core.esm.min-Ctdaaevn.js → react-sigma_core.esm.min-DgK5sRqv.js} +1 -1
  22. package/assets/assets/{service-83e6qD-8.js → service-Dv9FDyFY.js} +1 -1
  23. package/assets/index.html +7 -7
  24. package/dist/{ads-XBJFILES.js → ads-D4WQOT5K.js} +3 -3
  25. package/dist/{agent-LWL4G3YX.js → agent-E3IYC7OJ.js} +7 -7
  26. package/dist/{agent-ask-2SBUWTSS.js → agent-ask-ZSKRPB2Z.js} +3 -3
  27. package/dist/{agent-conversations-S465NNT2.js → agent-conversations-YHPYPQE2.js} +3 -3
  28. package/dist/{agent-memory-KS26TRAX.js → agent-memory-6OWOOD5O.js} +3 -3
  29. package/dist/{agent-providers-GLKRFX7S.js → agent-providers-7KZK37UO.js} +3 -3
  30. package/dist/{agent-transcript-WBDL4RTP.js → agent-transcript-3O7GPML6.js} +3 -3
  31. package/dist/{analytics-UUINEXLR.js → analytics-P2LLIUYK.js} +3 -3
  32. package/dist/{apply-HOEJMCHJ.js → apply-VBNNJOCT.js} +3 -3
  33. package/dist/{backfill-X46FWWGQ.js → backfill-F5SSURCH.js} +9 -9
  34. package/dist/{backlinks-NKZXQWXU.js → backlinks-4RE3TNNA.js} +3 -3
  35. package/dist/{bing-JVHVTKGP.js → bing-V6UN7D44.js} +3 -3
  36. package/dist/{bootstrap-SL2I6R6N.js → bootstrap-SHTSPAI5.js} +10 -10
  37. package/dist/{cdp-QBXJ3CN3.js → cdp-GDL2VFI3.js} +7 -7
  38. package/dist/{chunk-7RZFTNWT.js → chunk-2AROR73F.js} +5 -5
  39. package/dist/{chunk-56ISY5RC.js → chunk-2Y7RN5HG.js} +3 -3
  40. package/dist/{chunk-ZTNH6H2F.js → chunk-3QKKHU7D.js} +8 -8
  41. package/dist/{chunk-ZZIFS4RW.js → chunk-66DPEVLJ.js} +3 -3
  42. package/dist/{chunk-YXXJFOVG.js → chunk-6FN2OQKL.js} +340 -340
  43. package/dist/{chunk-VXKMJFPV.js → chunk-737TOG2F.js} +1 -1
  44. package/dist/{chunk-BMOMIECJ.js → chunk-AE6HJZBU.js} +3 -3
  45. package/dist/{chunk-C2DURF57.js → chunk-BV6NXSAH.js} +3 -3
  46. package/dist/{chunk-VXTI3APQ.js → chunk-C2PYKUD3.js} +1 -1
  47. package/dist/{chunk-XRE7XAYH.js → chunk-CRKOGLKJ.js} +18 -4
  48. package/dist/{chunk-T3QZVIPV.js → chunk-DQVJB6CZ.js} +1 -1
  49. package/dist/{chunk-IQVD3UND.js → chunk-F7NZEUXP.js} +2 -2
  50. package/dist/{chunk-S42DBIIC.js → chunk-GM5ZOWBK.js} +3 -3
  51. package/dist/{chunk-LEGBODMN.js → chunk-GQXSZE2Z.js} +62 -20
  52. package/dist/{chunk-UL2XEPI6.js → chunk-GZPGDAAF.js} +2 -2
  53. package/dist/{chunk-DEO75ZSC.js → chunk-H6HIJAIU.js} +2 -2
  54. package/dist/{chunk-XQTLLBJG.js → chunk-HI2HCYLB.js} +2 -2
  55. package/dist/{chunk-LITW7QNO.js → chunk-HO5W6QC7.js} +1 -1
  56. package/dist/{chunk-UGVEFUZ4.js → chunk-HPUZMBS6.js} +2 -2
  57. package/dist/{chunk-R62SF6QP.js → chunk-IJKKK7F4.js} +1 -1
  58. package/dist/{chunk-565ZI72D.js → chunk-IYB3EGSD.js} +1 -1
  59. package/dist/{chunk-STEYZ24N.js → chunk-LTX3TJ3E.js} +1 -1
  60. package/dist/{chunk-NE4KRQYV.js → chunk-M3OZL6PQ.js} +4 -4
  61. package/dist/{chunk-SSBJIBK7.js → chunk-O3INLME6.js} +4 -4
  62. package/dist/{chunk-Q62B3ISV.js → chunk-Q2WZAD5W.js} +1 -1
  63. package/dist/{chunk-PNDART6A.js → chunk-QNRMYDK6.js} +1 -1
  64. package/dist/{chunk-SFHUS5N4.js → chunk-S4VCXCRQ.js} +1 -1
  65. package/dist/{chunk-FBHW62IM.js → chunk-SL3Y7IOX.js} +1 -1
  66. package/dist/{chunk-GPNOJVM2.js → chunk-X4AHYJCE.js} +5 -5
  67. package/dist/{chunk-XFZPSZKU.js → chunk-XMKXXWMO.js} +2 -2
  68. package/dist/{chunk-DMNRYTX7.js → chunk-XOMUSIM7.js} +2 -2
  69. package/dist/{chunk-PKRH4UKJ.js → chunk-Z2EENWM3.js} +96 -30
  70. package/dist/{chunk-EII2VL22.js → chunk-ZPRJCSSR.js} +1 -1
  71. package/dist/{chunk-BTWB3ZAW.js → chunk-ZWZOQNLD.js} +1 -1
  72. package/dist/{citations-AW63LMXP.js → citations-GO4SPZYS.js} +3 -3
  73. package/dist/{cli-catalog-FBB6DN3W.js → cli-catalog-6XYQY3PI.js} +3 -3
  74. package/dist/{cli-commands-MXWXQSSX.js → cli-commands-AMURHC27.js} +7 -7
  75. package/dist/cli.js +13 -13
  76. package/dist/{competitor-YVI2IA7R.js → competitor-JBTKRJ6Y.js} +3 -3
  77. package/dist/{content-EJVE6ZCL.js → content-LKXXQ7X4.js} +3 -3
  78. package/dist/{dashboard-XPVUV6UT.js → dashboard-LUA7UX6B.js} +6 -6
  79. package/dist/{demo-6XBNMZ6F.js → demo-I7JDZJUW.js} +1 -1
  80. package/dist/{demo-server-S3XRNSHH.js → demo-server-GNGGWERV.js} +11 -11
  81. package/dist/{discover-4GZERX62.js → discover-TODAYYJ2.js} +3 -3
  82. package/dist/{discover-eval-F5RD6Q3H.js → discover-eval-FWQESEYB.js} +3 -3
  83. package/dist/{doctor-P2MOEW3V.js → doctor-AXNJT2UC.js} +3 -3
  84. package/dist/{evidence-SUWXYKIW.js → evidence-2XGEY4ZC.js} +3 -3
  85. package/dist/{export-cmd-F3VXILID.js → export-cmd-7RMYBIBZ.js} +3 -3
  86. package/dist/{ga-44LAMZLT.js → ga-HZDIZGCO.js} +3 -3
  87. package/dist/{gbp-WUMYLWJR.js → gbp-SMRBWJEL.js} +3 -3
  88. package/dist/{google-L7YBFK2M.js → google-2CN345XS.js} +4 -4
  89. package/dist/{google-marketing-ZSXMIOO5.js → google-marketing-W7T2VTVW.js} +1 -1
  90. package/dist/{health-cmd-IIE77FT5.js → health-cmd-W7OWZ4ZI.js} +3 -3
  91. package/dist/{history-RK4UG5YE.js → history-UVNCBHTE.js} +3 -3
  92. package/dist/index.d.ts +9 -5
  93. package/dist/index.js +24 -24
  94. package/dist/{init-X2ADJGSC.js → init-MDGOTK2L.js} +11 -11
  95. package/dist/{insights-Z5IGGJMR.js → insights-PQ52G5LU.js} +3 -3
  96. package/dist/intelligence-service-IAUGKMDO.js +15 -0
  97. package/dist/{journeys-CHA56BCH.js → journeys-3PP5GYVJ.js} +3 -3
  98. package/dist/{keys-ATLI7E4N.js → keys-CWZUX7IQ.js} +3 -3
  99. package/dist/{keyword-MICVFKNQ.js → keyword-5OMMULLY.js} +3 -3
  100. package/dist/{logs-BTAFJPMJ.js → logs-3FTE42E3.js} +3 -3
  101. package/dist/{mcp-6GPRFCSX.js → mcp-FK5DTI7I.js} +2 -2
  102. package/dist/mcp.js +9 -9
  103. package/dist/{measurement-plan-PC2YTZ5L.js → measurement-plan-ICO2BQNT.js} +5 -5
  104. package/dist/{notify-UUO7K7PR.js → notify-ML4PYD3L.js} +3 -3
  105. package/dist/{organic-evidence-NLJZMQEH.js → organic-evidence-4U4H3DCR.js} +3 -3
  106. package/dist/{overview-B6NHPCSJ.js → overview-NF427VFO.js} +4 -4
  107. package/dist/{project-TZRDJVYR.js → project-AAO65OF7.js} +3 -3
  108. package/dist/{query-IS5DNPEZ.js → query-7ZOUQNF5.js} +3 -3
  109. package/dist/{research-4Q25MXA6.js → research-UQ7AF5N3.js} +3 -3
  110. package/dist/{results-export-AQXKBDV2.js → results-export-CZCLC4ZH.js} +3 -3
  111. package/dist/{run-NFQRNNMQ.js → run-4XJZW52R.js} +4 -4
  112. package/dist/{schedule-VID5OMNW.js → schedule-D3E5FDBE.js} +3 -3
  113. package/dist/{search-YKIYLRSE.js → search-DYET2IL4.js} +3 -3
  114. package/dist/{serve-DSPCXBV3.js → serve-R2CI3RWQ.js} +25 -25
  115. package/dist/{session-PZ5TREWF.js → session-7CW2V5EH.js} +12 -12
  116. package/dist/{settings-RMGOJNRU.js → settings-ZISHACFX.js} +3 -3
  117. package/dist/{skills-Q3FCYWQK.js → skills-WU6IN3NL.js} +2 -2
  118. package/dist/{snapshot-ZWWYWBMG.js → snapshot-KCKQDJ2W.js} +3 -3
  119. package/dist/{src-IBMZTBVL.js → src-WIOU5G4V.js} +2 -2
  120. package/dist/{status-6MTUPM2Y.js → status-CYZFVMYA.js} +4 -4
  121. package/dist/{technical-aeo-7CWV55RA.js → technical-aeo-P5CS22AR.js} +3 -3
  122. package/dist/{telemetry-PBRCF7MV.js → telemetry-LPK5F2WU.js} +4 -4
  123. package/dist/{tools-AUPH4K65.js → tools-E3B2GZ6Q.js} +11 -11
  124. package/dist/{traffic-24T4MSRG.js → traffic-5KZYXXIQ.js} +5 -5
  125. package/dist/{users-4WBWD7IO.js → users-2F346HIW.js} +3 -3
  126. package/dist/{visibility-stats-H6QWQUNH.js → visibility-stats-ITA6DNF3.js} +3 -3
  127. package/dist/{wordpress-QSAHAV7S.js → wordpress-ZHCFT6V3.js} +3 -3
  128. package/package.json +1 -1
  129. package/assets/assets/RunsPage-B-eTk2cT.js +0 -1
  130. package/assets/assets/ToneBadge-yx6FMD6v.js +0 -60
  131. package/dist/intelligence-service-JYOJ63Z2.js +0 -15
@@ -20,7 +20,7 @@ import {
20
20
  templateLinkRatio,
21
21
  templateLinkUbiquityAvailable,
22
22
  validationError
23
- } from "./chunk-T3QZVIPV.js";
23
+ } from "./chunk-DQVJB6CZ.js";
24
24
  import {
25
25
  __export
26
26
  } from "./chunk-MLKGABMK.js";
@@ -9464,7 +9464,7 @@ var SeoRepository = class {
9464
9464
  )).run();
9465
9465
  if (!claim.changes) throw validationError("SEO refresh is unavailable under the current policy.");
9466
9466
  }
9467
- tx.insert(runs).values({ id: input.id, projectId: input.projectId, kind: RunKinds["seo-sync"], status: RunStatuses.queued, trigger: RunTriggers.manual, createdAt: input.now }).run();
9467
+ tx.insert(runs).values({ id: input.id, projectId: input.projectId, kind: RunKinds["seo-sync"], status: RunStatuses.queued, trigger: input.trigger ?? RunTriggers.manual, createdAt: input.now }).run();
9468
9468
  tx.insert(seoJobs).values({ id: input.id, projectId: input.projectId, projectKey: input.projectId, runId: input.id, profileId: input.profileId, profileRevision: input.profileRevision, profile: input.profile, scopeSnapshot: input.scopeSnapshot, requestHash: input.requestHash, idempotencyKey: input.idempotencyKey, principalId: input.principalId, connectionId: input.profile.connectionId, accountKey: input.accountKey, buckets: input.buckets, status: SeoRunStatuses.queued, createdAt: input.now }).run();
9469
9469
  for (const task of input.tasks) tx.insert(seoTasks).values({ ...task, jobId: input.id, status: SeoRunStatuses.queued, results: emptySeoResults() }).run();
9470
9470
  audit?.(tx);
@@ -9,14 +9,14 @@ import {
9
9
  normalizeCloudflareWorkerEvent,
10
10
  sessionizeJourneyRequests,
11
11
  verifyRequestSignature
12
- } from "./chunk-Q62B3ISV.js";
12
+ } from "./chunk-Q2WZAD5W.js";
13
13
  import {
14
14
  currentOutcomeAttribution,
15
15
  getRequestContext,
16
16
  registerRequestContext,
17
17
  requestAuditIdentity,
18
18
  sanitizeRequestContext
19
- } from "./chunk-R62SF6QP.js";
19
+ } from "./chunk-IJKKK7F4.js";
20
20
  import {
21
21
  SentimentIdempotencyConflict,
22
22
  SentimentRepository,
@@ -154,7 +154,7 @@ import {
154
154
  userSessions,
155
155
  users,
156
156
  writeNegativeReviewMaxStars
157
- } from "./chunk-DMNRYTX7.js";
157
+ } from "./chunk-XOMUSIM7.js";
158
158
  import {
159
159
  ADS_ACTIVATE_SCOPE,
160
160
  ADS_ACTIVATION_ABSOLUTE_MAX_ENTITIES,
@@ -1167,7 +1167,7 @@ import {
1167
1167
  wordpressSchemaDeployResultDtoSchema,
1168
1168
  wordpressSchemaStatusResultDtoSchema,
1169
1169
  wordpressStatusDtoSchema
1170
- } from "./chunk-T3QZVIPV.js";
1170
+ } from "./chunk-DQVJB6CZ.js";
1171
1171
 
1172
1172
  // ../api-routes/src/user-session.ts
1173
1173
  import crypto2 from "crypto";
@@ -15276,6 +15276,83 @@ function normalizeProfile(input) {
15276
15276
  function taskRequests(profile) {
15277
15277
  return profile.capabilities.flatMap((capability) => (capability === SeoCapabilities["keyword-metrics"] ? [null] : profile.targets).map((target) => ({ capability, target, keywords: capability === SeoCapabilities["keyword-metrics"] ? profile.keywords : [], locationCode: profile.locationCode, languageCode: profile.languageCode, limit: profile.limit, tag: "" })));
15278
15278
  }
15279
+ function planSeoTasks(opts, input) {
15280
+ const runtime = opts.getSeoRuntime?.() ?? null;
15281
+ const connection = runtime?.connections.find((connection2) => connection2.id === input.connectionId);
15282
+ if (!runtime || !opts.onSeoRunRequested) throw missingDependency("SEO execution is not configured on this host.");
15283
+ if (!connection) throw validationError("This SEO connection is unavailable. Select a connection listed in SEO context.");
15284
+ if (input.capabilities.some((capability) => !connection.adapter.capabilities.includes(capability))) throw validationError("The selected SEO connection does not support every requested capability. Select capabilities listed for this connection in SEO context.");
15285
+ let planned;
15286
+ try {
15287
+ planned = taskRequests(input).map((request) => {
15288
+ const estimate = connection.adapter.estimate(request);
15289
+ return { request, reservedMicros: estimate.maxCostMicros, catalogRevision: estimate.catalogRevision };
15290
+ });
15291
+ } catch (error) {
15292
+ if (error instanceof AppError && error.code === "VALIDATION_ERROR") throw error;
15293
+ throw validationError("The SEO provider could not prepare this request. Check its input requirements or contact the host operator.");
15294
+ }
15295
+ const total = planned.reduce((sum, task) => sum + task.reservedMicros, 0);
15296
+ if (!planned.length || planned.some((task) => !Number.isSafeInteger(task.reservedMicros) || task.reservedMicros <= 0) || !Number.isSafeInteger(total) || total > runtime.policy.maxRunCostMicros) throw validationError("SEO refresh is unavailable under the current policy.");
15297
+ const intentHash = hash2(JSON.stringify({ provider: connection.adapter.provider, account: connection.adapter.accountKey, policy: runtime.policy, tasks: planned.map((task) => ({ request: task.request, estimate: { maxCostMicros: task.reservedMicros, catalogRevision: task.catalogRevision } })) }));
15298
+ return { ...runtime, connection, planned, intentHash };
15299
+ }
15300
+ function budgetBuckets(account, projectId, policy, now) {
15301
+ return [
15302
+ { scope: `account-day:${account}`, period: now.slice(0, 10), limit: policy.accountDailyLimitMicros },
15303
+ { scope: `account-month:${account}`, period: now.slice(0, 7), limit: policy.accountMonthlyLimitMicros },
15304
+ { scope: `project-month:${projectId}`, period: now.slice(0, 7), limit: policy.projectMonthlyLimitMicros }
15305
+ ];
15306
+ }
15307
+ function startScheduledSeoRefreshes(db, opts, input) {
15308
+ const repository = new SeoRepository(db);
15309
+ const principalId = `schedule:${input.scheduleId}`;
15310
+ const recordSkipped = (profileId, reason, detail) => {
15311
+ const runId = crypto17.randomUUID();
15312
+ const now = (/* @__PURE__ */ new Date()).toISOString();
15313
+ const subject = profileId ? `profile "${profileId}"` : "this project";
15314
+ db.insert(runs).values({ id: runId, projectId: input.projectId, kind: RunKinds["seo-sync"], status: RunStatuses.failed, trigger: RunTriggers.scheduled, createdAt: now, finishedAt: now, error: `Scheduled SEO refresh for ${subject} did not start: ${reason}` }).run();
15315
+ return { profileId, status: "skipped", runId, reason, ...detail ? { detail } : {} };
15316
+ };
15317
+ const saved = db.select().from(seoProfiles).where(eq32(seoProfiles.projectId, input.projectId)).orderBy(asc6(seoProfiles.id)).all().map(profileDto);
15318
+ if (!saved.length) return [recordSkipped(null, "Save an SEO profile first.")];
15319
+ return saved.map((profile) => {
15320
+ const idempotencyKey = `schedule:${input.scheduleId}:${input.occurrence}:${profile.id}`;
15321
+ const prior = db.select().from(seoJobs).where(and24(eq32(seoJobs.projectKey, input.projectId), eq32(seoJobs.idempotencyKey, idempotencyKey))).get();
15322
+ if (prior?.runId) return { profileId: profile.id, status: "replayed", runId: prior.runId };
15323
+ try {
15324
+ const scopeSnapshot = resolveScope2(db, input.projectId, profile);
15325
+ const runtime = planSeoTasks(opts, profile);
15326
+ const now = (/* @__PURE__ */ new Date()).toISOString();
15327
+ const account = runtime.connection.adapter.accountKey;
15328
+ const requestedId = crypto17.randomUUID();
15329
+ const id = repository.admit({
15330
+ id: requestedId,
15331
+ projectId: input.projectId,
15332
+ profileId: profile.id,
15333
+ profileRevision: profile.revision,
15334
+ profile,
15335
+ scopeSnapshot,
15336
+ requestHash: hash2(idempotencyKey),
15337
+ idempotencyKey,
15338
+ principalId,
15339
+ accountKey: account,
15340
+ now,
15341
+ trigger: RunTriggers.scheduled,
15342
+ buckets: budgetBuckets(account, input.projectId, runtime.policy, now),
15343
+ tasks: runtime.planned.map((task) => {
15344
+ const id2 = crypto17.randomUUID();
15345
+ return { ...task, id: id2, request: { ...task.request, tag: id2 } };
15346
+ })
15347
+ }, (tx) => writeAuditLog(tx, { projectId: input.projectId, actor: "scheduler", action: "seo.sync.requested", entityType: "run", entityId: requestedId }));
15348
+ if (id === requestedId) opts.onSeoRunRequested?.(id);
15349
+ return { profileId: profile.id, status: id === requestedId ? "started" : "replayed", runId: id };
15350
+ } catch (error) {
15351
+ if (error instanceof AppError) return recordSkipped(profile.id, error.message);
15352
+ return recordSkipped(profile.id, "The SEO refresh could not be admitted.", error instanceof Error ? error.message : String(error));
15353
+ }
15354
+ });
15355
+ }
15279
15356
  async function seoRoutes(app, opts) {
15280
15357
  const repository = new SeoRepository(app.db);
15281
15358
  const intentSecret = crypto17.randomBytes(32);
@@ -15317,27 +15394,7 @@ async function seoRoutes(app, opts) {
15317
15394
  const available = !!runtime?.connections.length && !!opts.onSeoRunRequested;
15318
15395
  return { available, reason: available ? null : "SEO execution is not configured on this host.", capabilities: [...new Set(runtime?.connections.flatMap((connection) => [...connection.adapter.capabilities]) ?? [])], profileCount: profiles(projectId).length, latestRunId: latest?.id ?? null, latestRunStatus: latest?.status ?? null, lastCompletedAt: last?.finishedAt ?? null };
15319
15396
  };
15320
- const planTasks = (input) => {
15321
- const runtime = getRuntime();
15322
- const connection = runtime?.connections.find((connection2) => connection2.id === input.connectionId);
15323
- if (!runtime || !opts.onSeoRunRequested) throw missingDependency("SEO execution is not configured on this host.");
15324
- if (!connection) throw validationError("This SEO connection is unavailable. Select a connection listed in SEO context.");
15325
- if (input.capabilities.some((capability) => !connection.adapter.capabilities.includes(capability))) throw validationError("The selected SEO connection does not support every requested capability. Select capabilities listed for this connection in SEO context.");
15326
- let planned;
15327
- try {
15328
- planned = taskRequests(input).map((request) => {
15329
- const estimate = connection.adapter.estimate(request);
15330
- return { request, reservedMicros: estimate.maxCostMicros, catalogRevision: estimate.catalogRevision };
15331
- });
15332
- } catch (error) {
15333
- if (error instanceof AppError && error.code === "VALIDATION_ERROR") throw error;
15334
- throw validationError("The SEO provider could not prepare this request. Check its input requirements or contact the host operator.");
15335
- }
15336
- const total = planned.reduce((sum, task) => sum + task.reservedMicros, 0);
15337
- if (!planned.length || planned.some((task) => !Number.isSafeInteger(task.reservedMicros) || task.reservedMicros <= 0) || !Number.isSafeInteger(total) || total > runtime.policy.maxRunCostMicros) throw validationError("SEO refresh is unavailable under the current policy.");
15338
- const intentHash = hash2(JSON.stringify({ provider: connection.adapter.provider, account: connection.adapter.accountKey, policy: runtime.policy, tasks: planned.map((task) => ({ request: task.request, estimate: { maxCostMicros: task.reservedMicros, catalogRevision: task.catalogRevision } })) }));
15339
- return { ...runtime, connection, planned, intentHash };
15340
- };
15397
+ const planTasks = (input) => planSeoTasks(opts, input);
15341
15398
  app.get("/seo/operator/tasks/:id", async (request) => {
15342
15399
  requireOperator(request);
15343
15400
  const task = app.db.select().from(seoTasks).where(eq32(seoTasks.id, request.params.id)).get();
@@ -15439,11 +15496,7 @@ async function seoRoutes(app, opts) {
15439
15496
  const now = (/* @__PURE__ */ new Date()).toISOString();
15440
15497
  const account = runtime.connection.adapter.accountKey;
15441
15498
  const requestedId = crypto17.randomUUID();
15442
- const id = repository.admit({ id: requestedId, projectId: project.id, profileId: saved.id, profileRevision: saved.revision, profile: saved, scopeSnapshot, requestHash: requestHash2, idempotencyKey: input.idempotencyKey, principalId: actor(request), accountKey: account, now, buckets: [
15443
- { scope: `account-day:${account}`, period: now.slice(0, 10), limit: runtime.policy.accountDailyLimitMicros },
15444
- { scope: `account-month:${account}`, period: now.slice(0, 7), limit: runtime.policy.accountMonthlyLimitMicros },
15445
- { scope: `project-month:${project.id}`, period: now.slice(0, 7), limit: runtime.policy.projectMonthlyLimitMicros }
15446
- ], tasks: runtime.planned.map((task) => {
15499
+ const id = repository.admit({ id: requestedId, projectId: project.id, profileId: saved.id, profileRevision: saved.revision, profile: saved, scopeSnapshot, requestHash: requestHash2, idempotencyKey: input.idempotencyKey, principalId: actor(request), accountKey: account, now, buckets: budgetBuckets(account, project.id, runtime.policy, now), tasks: runtime.planned.map((task) => {
15447
15500
  const id2 = crypto17.randomUUID();
15448
15501
  return { ...task, id: id2, request: { ...task.request, tag: id2 } };
15449
15502
  }) }, (tx) => writeAuditLog(tx, { projectId: project.id, actor: "api", action: "seo.sync.requested", entityType: "run", entityId: requestedId }));
@@ -42812,6 +42865,18 @@ async function scheduleRoutes(app, opts) {
42812
42865
  if (kind === SchedulableRunKinds["site-audit"] && providers && providers.length > 0) {
42813
42866
  throw validationError('"providers" is not valid for kind "site-audit"');
42814
42867
  }
42868
+ if (kind === SchedulableRunKinds["seo-sync"]) {
42869
+ if (providers && providers.length > 0) {
42870
+ throw validationError('"providers" is not valid for kind "seo-sync"');
42871
+ }
42872
+ if (enabled !== false) {
42873
+ requireScope(request, SEO_RUN_SCOPE);
42874
+ requireAdminSession(request);
42875
+ if (!app.db.select({ id: seoProfiles.id }).from(seoProfiles).where(eq62(seoProfiles.projectId, project.id)).get()) {
42876
+ throw validationError("Save an SEO profile before scheduling SEO refreshes.");
42877
+ }
42878
+ }
42879
+ }
42815
42880
  const validNames = opts.validProviderNames ?? [];
42816
42881
  if (validNames.length && providers?.length) {
42817
42882
  const invalid = invalidProviderSelections(providers, validNames, opts.providerAdapters, ProviderWorkflows["visibility-sweep"]);
@@ -74873,6 +74938,7 @@ export {
74873
74938
  analyzeGbp,
74874
74939
  assessConversionTrackingIntegrity,
74875
74940
  newerFullSweep,
74941
+ startScheduledSeoRefreshes,
74876
74942
  answerIdentityFrom,
74877
74943
  readAnswerIdentity,
74878
74944
  answerIdentityChanged,
@@ -23,7 +23,7 @@ import {
23
23
  measurementDraftUpsertGroupRequestSchema,
24
24
  measurementDraftUpsertMarketRequestSchema,
25
25
  measurementDraftUpsertTargetRequestSchema
26
- } from "./chunk-T3QZVIPV.js";
26
+ } from "./chunk-DQVJB6CZ.js";
27
27
 
28
28
  // src/measurement-draft-actions.ts
29
29
  import { z } from "zod";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-HGMYEDAQ.js";
5
5
  import {
6
6
  describeError
7
- } from "./chunk-T3QZVIPV.js";
7
+ } from "./chunk-DQVJB6CZ.js";
8
8
 
9
9
  // src/gsc-sitemap-submission.ts
10
10
  function dedupeGscSitemapUrls(urls) {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import "./chunk-HGMYEDAQ.js";
7
- import "./chunk-T3QZVIPV.js";
7
+ import "./chunk-DQVJB6CZ.js";
8
8
  import "./chunk-MLKGABMK.js";
9
9
 
10
10
  // src/commands/citations.ts
@@ -3,11 +3,11 @@ import {
3
3
  buildCliCatalog,
4
4
  printCliCatalog,
5
5
  renderTopLevelHelp
6
- } from "./chunk-BMOMIECJ.js";
7
- import "./chunk-LITW7QNO.js";
6
+ } from "./chunk-AE6HJZBU.js";
7
+ import "./chunk-HO5W6QC7.js";
8
8
  import "./chunk-Z7IUAJOF.js";
9
9
  import "./chunk-HGMYEDAQ.js";
10
- import "./chunk-T3QZVIPV.js";
10
+ import "./chunk-DQVJB6CZ.js";
11
11
  import "./chunk-MLKGABMK.js";
12
12
  export {
13
13
  CLI_ROOT_SUMMARIES,
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  REGISTERED_CLI_COMMANDS
3
- } from "./chunk-YXXJFOVG.js";
3
+ } from "./chunk-6FN2OQKL.js";
4
4
  import "./chunk-6GO5VVAC.js";
5
- import "./chunk-ZZIFS4RW.js";
5
+ import "./chunk-66DPEVLJ.js";
6
6
  import "./chunk-VJWDBFSL.js";
7
7
  import "./chunk-TSENU4GG.js";
8
- import "./chunk-IQVD3UND.js";
9
- import "./chunk-VXTI3APQ.js";
10
- import "./chunk-LITW7QNO.js";
8
+ import "./chunk-F7NZEUXP.js";
9
+ import "./chunk-C2PYKUD3.js";
10
+ import "./chunk-HO5W6QC7.js";
11
11
  import "./chunk-Z7IUAJOF.js";
12
- import "./chunk-EII2VL22.js";
12
+ import "./chunk-ZPRJCSSR.js";
13
13
  import "./chunk-AOJU5LKX.js";
14
14
  import "./chunk-HGMYEDAQ.js";
15
- import "./chunk-T3QZVIPV.js";
15
+ import "./chunk-DQVJB6CZ.js";
16
16
  import "./chunk-MLKGABMK.js";
17
17
  export {
18
18
  REGISTERED_CLI_COMMANDS
package/dist/cli.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node --import tsx
2
2
  import {
3
3
  REGISTERED_CLI_COMMANDS
4
- } from "./chunk-YXXJFOVG.js";
4
+ } from "./chunk-6FN2OQKL.js";
5
5
  import {
6
6
  buildSetupState,
7
7
  runPendingServeHandoff
8
- } from "./chunk-SSBJIBK7.js";
8
+ } from "./chunk-O3INLME6.js";
9
9
  import "./chunk-6GO5VVAC.js";
10
- import "./chunk-ZZIFS4RW.js";
10
+ import "./chunk-66DPEVLJ.js";
11
11
  import "./chunk-VJWDBFSL.js";
12
12
  import "./chunk-TSENU4GG.js";
13
- import "./chunk-565ZI72D.js";
13
+ import "./chunk-IYB3EGSD.js";
14
14
  import {
15
15
  checkLatestVersionForCli,
16
16
  cliRuntimeContext,
@@ -24,24 +24,24 @@ import {
24
24
  showFirstRunNotice,
25
25
  trackCliCommandFinished,
26
26
  trackEvent
27
- } from "./chunk-XFZPSZKU.js";
27
+ } from "./chunk-XMKXXWMO.js";
28
28
  import {
29
29
  autoSyncSkills,
30
30
  formatAutoSyncNotice
31
- } from "./chunk-56ISY5RC.js";
32
- import "./chunk-IQVD3UND.js";
33
- import "./chunk-VXTI3APQ.js";
31
+ } from "./chunk-2Y7RN5HG.js";
32
+ import "./chunk-F7NZEUXP.js";
33
+ import "./chunk-C2PYKUD3.js";
34
34
  import {
35
35
  accessFilterFromArgs,
36
36
  dispatchRegisteredCommand,
37
37
  printCliCatalog
38
- } from "./chunk-BMOMIECJ.js";
38
+ } from "./chunk-AE6HJZBU.js";
39
39
  import {
40
40
  resolveCliAccess
41
- } from "./chunk-LITW7QNO.js";
41
+ } from "./chunk-HO5W6QC7.js";
42
42
  import "./chunk-Z7IUAJOF.js";
43
- import "./chunk-FBHW62IM.js";
44
- import "./chunk-EII2VL22.js";
43
+ import "./chunk-SL3Y7IOX.js";
44
+ import "./chunk-ZPRJCSSR.js";
45
45
  import "./chunk-AOJU5LKX.js";
46
46
  import {
47
47
  CliError,
@@ -52,7 +52,7 @@ import {
52
52
  } from "./chunk-HGMYEDAQ.js";
53
53
  import {
54
54
  OperationAccesses
55
- } from "./chunk-T3QZVIPV.js";
55
+ } from "./chunk-DQVJB6CZ.js";
56
56
  import "./chunk-MLKGABMK.js";
57
57
 
58
58
  // src/cli.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -21,7 +21,7 @@ import {
21
21
  normalizeCompetitorDomain,
22
22
  shareOfVoiceLabel,
23
23
  shareOfVoiceReason
24
- } from "./chunk-T3QZVIPV.js";
24
+ } from "./chunk-DQVJB6CZ.js";
25
25
  import "./chunk-MLKGABMK.js";
26
26
 
27
27
  // src/commands/competitor.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  contentTargetDismissRequestSchema,
16
16
  formatPercent
17
- } from "./chunk-T3QZVIPV.js";
17
+ } from "./chunk-DQVJB6CZ.js";
18
18
  import "./chunk-MLKGABMK.js";
19
19
 
20
20
  // src/commands/content.ts
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  clearDashboardPassword,
3
3
  loadConfigRaw
4
- } from "./chunk-VXTI3APQ.js";
4
+ } from "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  isMachineFormat
7
7
  } from "./chunk-HGMYEDAQ.js";
8
8
  import {
9
9
  anyUsersExist
10
- } from "./chunk-PKRH4UKJ.js";
11
- import "./chunk-Q62B3ISV.js";
12
- import "./chunk-R62SF6QP.js";
10
+ } from "./chunk-Z2EENWM3.js";
11
+ import "./chunk-Q2WZAD5W.js";
12
+ import "./chunk-IJKKK7F4.js";
13
13
  import {
14
14
  createClient
15
- } from "./chunk-DMNRYTX7.js";
16
- import "./chunk-T3QZVIPV.js";
15
+ } from "./chunk-XOMUSIM7.js";
16
+ import "./chunk-DQVJB6CZ.js";
17
17
  import "./chunk-MLKGABMK.js";
18
18
 
19
19
  // src/commands/dashboard.ts
@@ -40,7 +40,7 @@ function parseDemoTrustedProxies(values) {
40
40
  async function demoCommand(options) {
41
41
  const { host, port } = parseDemoListenOptions(options);
42
42
  const trustProxy = parseDemoTrustedProxies(options.trustProxy);
43
- const { createDemoServer } = await import("./demo-server-S3XRNSHH.js");
43
+ const { createDemoServer } = await import("./demo-server-GNGGWERV.js");
44
44
  const app = await createDemoServer({ trustProxy });
45
45
  let stopping = false;
46
46
  const stop = () => {
@@ -5,12 +5,12 @@ import {
5
5
  computeFactorAverages,
6
6
  layoutSiteCrawlGraphInput,
7
7
  persistSiteCrawlGraphLayout
8
- } from "./chunk-DEO75ZSC.js";
8
+ } from "./chunk-H6HIJAIU.js";
9
9
  import {
10
10
  canonryMcpTools
11
- } from "./chunk-C2DURF57.js";
12
- import "./chunk-BTWB3ZAW.js";
13
- import "./chunk-EII2VL22.js";
11
+ } from "./chunk-BV6NXSAH.js";
12
+ import "./chunk-ZWZOQNLD.js";
13
+ import "./chunk-ZPRJCSSR.js";
14
14
  import {
15
15
  PACKAGE_VERSION
16
16
  } from "./chunk-AOJU5LKX.js";
@@ -18,16 +18,16 @@ import "./chunk-HGMYEDAQ.js";
18
18
  import {
19
19
  HISTORY_WINDOW_RUNS,
20
20
  IntelligenceService
21
- } from "./chunk-GPNOJVM2.js";
21
+ } from "./chunk-X4AHYJCE.js";
22
22
  import {
23
23
  determineCitationState
24
- } from "./chunk-SFHUS5N4.js";
24
+ } from "./chunk-S4VCXCRQ.js";
25
25
  import {
26
26
  apiRoutes,
27
27
  assessConversionTrackingIntegrity
28
- } from "./chunk-PKRH4UKJ.js";
29
- import "./chunk-Q62B3ISV.js";
30
- import "./chunk-R62SF6QP.js";
28
+ } from "./chunk-Z2EENWM3.js";
29
+ import "./chunk-Q2WZAD5W.js";
30
+ import "./chunk-IJKKK7F4.js";
31
31
  import {
32
32
  adsAdGroups,
33
33
  adsAds,
@@ -103,7 +103,7 @@ import {
103
103
  siteCrawlPages,
104
104
  siteCrawlSnapshots,
105
105
  trafficSources
106
- } from "./chunk-DMNRYTX7.js";
106
+ } from "./chunk-XOMUSIM7.js";
107
107
  import {
108
108
  AI_ENGINE_DOMAINS,
109
109
  GA_OVERVIEW_HISTORY_DAYS,
@@ -148,7 +148,7 @@ import {
148
148
  roundPreservingTotal,
149
149
  siteAuditPageFactorSchema,
150
150
  wilsonInterval
151
- } from "./chunk-T3QZVIPV.js";
151
+ } from "./chunk-DQVJB6CZ.js";
152
152
  import "./chunk-MLKGABMK.js";
153
153
 
154
154
  // src/demo-server.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -14,7 +14,7 @@ import {
14
14
  CitationStates,
15
15
  DiscoveryPromoteCompetitorSkipReasons,
16
16
  describeError
17
- } from "./chunk-T3QZVIPV.js";
17
+ } from "./chunk-DQVJB6CZ.js";
18
18
  import "./chunk-MLKGABMK.js";
19
19
 
20
20
  // src/commands/discover.ts
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import {
7
7
  CliError,
8
8
  EXIT_USER_ERROR
9
9
  } from "./chunk-HGMYEDAQ.js";
10
- import "./chunk-T3QZVIPV.js";
10
+ import "./chunk-DQVJB6CZ.js";
11
11
  import "./chunk-MLKGABMK.js";
12
12
 
13
13
  // src/commands/discover-eval.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  CheckScopes,
15
15
  CheckStatuses
16
- } from "./chunk-T3QZVIPV.js";
16
+ } from "./chunk-DQVJB6CZ.js";
17
17
  import "./chunk-MLKGABMK.js";
18
18
 
19
19
  // src/commands/doctor.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -9,7 +9,7 @@ import "./chunk-AOJU5LKX.js";
9
9
  import "./chunk-HGMYEDAQ.js";
10
10
  import {
11
11
  CitationStates
12
- } from "./chunk-T3QZVIPV.js";
12
+ } from "./chunk-DQVJB6CZ.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // src/commands/evidence.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import {
7
7
  isEndpointMissing,
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-HGMYEDAQ.js";
10
10
  import {
11
11
  isRedactedNotificationUrl
12
- } from "./chunk-T3QZVIPV.js";
12
+ } from "./chunk-DQVJB6CZ.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // src/commands/export-cmd.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -26,7 +26,7 @@ import {
26
26
  gaSearchLandingHasSearchData,
27
27
  gaSearchLandingPageLabel,
28
28
  isGaOverviewWindow
29
- } from "./chunk-T3QZVIPV.js";
29
+ } from "./chunk-DQVJB6CZ.js";
30
30
  import "./chunk-MLKGABMK.js";
31
31
 
32
32
  // src/commands/ga.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import {
7
7
  isMachineFormat
@@ -11,7 +11,7 @@ import {
11
11
  formatPercent,
12
12
  gbpLocalPostCreateSchema,
13
13
  validationError
14
- } from "./chunk-T3QZVIPV.js";
14
+ } from "./chunk-DQVJB6CZ.js";
15
15
  import "./chunk-MLKGABMK.js";
16
16
 
17
17
  // src/commands/gbp.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-IQVD3UND.js";
4
- import "./chunk-VXTI3APQ.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
+ import "./chunk-C2PYKUD3.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -10,7 +10,7 @@ import {
10
10
  requireGscSitemapUrls,
11
11
  resolveDiscoveredGscSitemapUrls,
12
12
  submitGscSitemapBatches
13
- } from "./chunk-BTWB3ZAW.js";
13
+ } from "./chunk-ZWZOQNLD.js";
14
14
  import "./chunk-AOJU5LKX.js";
15
15
  import {
16
16
  CliError,
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-HGMYEDAQ.js";
19
19
  import {
20
20
  formatPercent
21
- } from "./chunk-T3QZVIPV.js";
21
+ } from "./chunk-DQVJB6CZ.js";
22
22
  import "./chunk-MLKGABMK.js";
23
23
 
24
24
  // src/commands/google.ts
@@ -12,7 +12,7 @@ import {
12
12
  describeError,
13
13
  formatMicros,
14
14
  formatPercent
15
- } from "./chunk-T3QZVIPV.js";
15
+ } from "./chunk-DQVJB6CZ.js";
16
16
  import "./chunk-MLKGABMK.js";
17
17
 
18
18
  // src/commands/google-marketing.ts