@canonry/canonry 7.76.2 → 7.77.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +1 -3
  2. package/assets/assets/{AgentSetupPage-Dy9_auot.js → AgentSetupPage-BZXWC3x6.js} +4 -4
  3. package/assets/assets/{AuditHistoryPanel-BVTD5aDT.js → AuditHistoryPanel-DcrUuwRu.js} +1 -1
  4. package/assets/assets/{BacklinksPage-B3UasiLF.js → BacklinksPage-BSpHJBiy.js} +1 -1
  5. package/assets/assets/{HistoryPage-BeKtZ449.js → HistoryPage-0a0CK9zF.js} +1 -1
  6. package/assets/assets/MeasurementPropertyPage-DbfTFN3F.js +4 -0
  7. package/assets/assets/ProjectPage-D0m-Xpp3.js +9 -0
  8. package/assets/assets/{RunsPage-bRhgxSV_.js → RunsPage-D0vbz1Ho.js} +1 -1
  9. package/assets/assets/{SettingsPage-fPEwb0Fh.js → SettingsPage-DjRm5cmn.js} +1 -1
  10. package/assets/assets/SiteHealthSection-BCdPVFEJ.js +2 -0
  11. package/assets/assets/{ToneBadge-DfEkyFHe.js → ToneBadge-DSJSzqI6.js} +1 -1
  12. package/assets/assets/{TrafficPage-CzdZa-dz.js → TrafficPage-Z8Z_z0k9.js} +2 -2
  13. package/assets/assets/TrafficSourceDetailPage-DJyDO527.js +1 -0
  14. package/assets/assets/{account-context-C0wMdIfs.js → account-context-zaSxLBst.js} +1 -1
  15. package/assets/assets/{card-CdfP76v-.js → card-COqALGzB.js} +1 -1
  16. package/assets/assets/{extract-error-message-D36I9Bna.js → extract-error-message-DKve0SNr.js} +1 -1
  17. package/assets/assets/{format-helpers-Ja8nzHvN.js → format-helpers-DKrHlaV7.js} +1 -1
  18. package/assets/assets/index-CKZK95pI.css +1 -0
  19. package/assets/assets/index-fzqtwr6m.js +60 -0
  20. package/assets/assets/{query-client-jOrIVlKd.js → query-client-COM9uzxL.js} +1 -1
  21. package/assets/assets/react-query-BVRWpXWq.js +1 -0
  22. package/assets/assets/{react-sigma_core.esm.min-D2wEGI_h.js → react-sigma_core.esm.min-e91U3Myi.js} +1 -1
  23. package/assets/assets/{service-jrrtReGW.js → service-BgFTYqJA.js} +1 -1
  24. package/assets/canonry-icon-32.png +0 -0
  25. package/assets/canonry-icon-favicon.svg +10 -0
  26. package/assets/canonry-icon-touch.png +0 -0
  27. package/assets/canonry-icon.svg +9 -0
  28. package/assets/index.html +8 -8
  29. package/dist/{ads-WMVE7R43.js → ads-M6IAQDG7.js} +2 -2
  30. package/dist/{agent-VQDHMK4Z.js → agent-X2T5X5K3.js} +5 -5
  31. package/dist/{agent-ask-BRMDRWBU.js → agent-ask-55LQH4TI.js} +2 -2
  32. package/dist/{agent-conversations-SIRYGIJM.js → agent-conversations-O6WC2NPV.js} +2 -2
  33. package/dist/{agent-memory-2DDQQNJZ.js → agent-memory-6DWFMB4I.js} +2 -2
  34. package/dist/{agent-providers-ZNIQ7XUC.js → agent-providers-Q4YDVQX3.js} +2 -2
  35. package/dist/{agent-transcript-U2VKTBMV.js → agent-transcript-SJKCP2AO.js} +2 -2
  36. package/dist/{analytics-OJY5QWTM.js → analytics-4JOQMWH7.js} +2 -2
  37. package/dist/{apply-6IVQMJSS.js → apply-EAKKKIZD.js} +2 -2
  38. package/dist/{backfill-REP7PTSI.js → backfill-PASKIVGP.js} +2 -2
  39. package/dist/{backlinks-AZRCWJVJ.js → backlinks-TICPC323.js} +2 -2
  40. package/dist/{bing-6K63LZIB.js → bing-MC7TSL4E.js} +2 -2
  41. package/dist/{bootstrap-NIFFJKIT.js → bootstrap-X2BW64W7.js} +5 -5
  42. package/dist/{cdp-X73HVPAS.js → cdp-TCJKITCR.js} +5 -5
  43. package/dist/{chunk-ZWD4W3KU.js → chunk-2BRVGCVU.js} +12 -11
  44. package/dist/{chunk-MXRCOQT2.js → chunk-2SCPPWRW.js} +1 -1
  45. package/dist/{chunk-IAOPQ2VO.js → chunk-6EZQHF67.js} +307 -307
  46. package/dist/{chunk-AQLTYL3Q.js → chunk-B7JHQ3FW.js} +2 -2
  47. package/dist/{chunk-5W37PWV4.js → chunk-CCNPBUQ5.js} +2 -2
  48. package/dist/{chunk-4MYZRVJ6.js → chunk-CQMNWC5K.js} +105 -69
  49. package/dist/{chunk-6NUXSEW6.js → chunk-FXIZBJZ4.js} +1 -1
  50. package/dist/{chunk-66BZEUOK.js → chunk-H4ANN32B.js} +1 -1
  51. package/dist/{chunk-ST6FNS6A.js → chunk-JZT3ZRD3.js} +1 -1
  52. package/dist/{chunk-KNERCHMI.js → chunk-P3BWUKJL.js} +2 -2
  53. package/dist/{chunk-7LLDLEWJ.js → chunk-TJYS2XCI.js} +2 -2
  54. package/dist/{chunk-UWPCUAZM.js → chunk-TRW4XLQK.js} +1 -1
  55. package/dist/{chunk-7KYGOR7N.js → chunk-UB65XBH2.js} +1 -1
  56. package/dist/{chunk-X2CE5IME.js → chunk-UGNNR7EO.js} +1 -1
  57. package/dist/{chunk-KXSNV6C3.js → chunk-X7UC755Q.js} +1 -1
  58. package/dist/{chunk-OT6SUK6X.js → chunk-YMOQSEO3.js} +1 -1
  59. package/dist/{citations-XJUGQ736.js → citations-IA3OCV53.js} +2 -2
  60. package/dist/{cli-commands-JFKE3JZB.js → cli-commands-O7BYY3W5.js} +4 -4
  61. package/dist/cli.js +7 -7
  62. package/dist/{competitor-5OEWFXMU.js → competitor-4FVAZAQZ.js} +2 -2
  63. package/dist/{content-TUWBGELB.js → content-OVBF6U7Z.js} +2 -2
  64. package/dist/{dashboard-3G4P32BY.js → dashboard-UGZSSIWK.js} +1 -1
  65. package/dist/{discover-WZUOPCBV.js → discover-R5BYAPOU.js} +2 -2
  66. package/dist/{discover-eval-SICOH7ML.js → discover-eval-3FA4BR2L.js} +2 -2
  67. package/dist/{doctor-UMSTE4EO.js → doctor-2Q5LVV2P.js} +2 -2
  68. package/dist/{evidence-NLIQFQAK.js → evidence-LMGRT5IO.js} +2 -2
  69. package/dist/{export-cmd-U2BFP7VV.js → export-cmd-LBLZ273Z.js} +2 -2
  70. package/dist/{ga-OCN3UUG2.js → ga-PBIWRU67.js} +2 -2
  71. package/dist/{gbp-B2YUDH7S.js → gbp-NYG7SW6P.js} +2 -2
  72. package/dist/{google-EOV6EXSF.js → google-57XEYVOU.js} +2 -2
  73. package/dist/{health-cmd-UVJAXG5V.js → health-cmd-SJVYQZQL.js} +2 -2
  74. package/dist/{history-4NOM3SFC.js → history-5XYZNWGP.js} +2 -2
  75. package/dist/index.d.ts +40 -24
  76. package/dist/index.js +8 -8
  77. package/dist/{init-HUMX46OS.js → init-KXR6PJEQ.js} +7 -7
  78. package/dist/{insights-W2A4O4CO.js → insights-L7OOH34I.js} +2 -2
  79. package/dist/{journeys-IPOEIDVQ.js → journeys-VXBGDFBO.js} +2 -2
  80. package/dist/{keys-QK5N2Y46.js → keys-YMB5HAAG.js} +2 -2
  81. package/dist/{keyword-JMDOXJ54.js → keyword-RZEMKH3K.js} +2 -2
  82. package/dist/{logs-YVSSVMC7.js → logs-ONZWSYXS.js} +2 -2
  83. package/dist/{mcp-YEGPIJ6N.js → mcp-KK6EFHAZ.js} +3 -3
  84. package/dist/mcp.js +4 -4
  85. package/dist/{measurement-plan-WS44DI53.js → measurement-plan-LE7INWW6.js} +3 -3
  86. package/dist/{notify-HQRSMWG2.js → notify-T6T5LYRR.js} +2 -2
  87. package/dist/{organic-evidence-OKXXS7FH.js → organic-evidence-P2GZ766W.js} +2 -2
  88. package/dist/{overview-6OZ5NFAO.js → overview-P2AILIWJ.js} +3 -3
  89. package/dist/{project-XCZJDR4E.js → project-7MHQSOJD.js} +2 -2
  90. package/dist/{query-MCSEFKKF.js → query-EUDMU6L7.js} +2 -2
  91. package/dist/{research-TM3HHQDB.js → research-4DASCVGY.js} +2 -2
  92. package/dist/{results-export-C4GFWJ7Y.js → results-export-GKXHX55L.js} +2 -2
  93. package/dist/{run-JJE45UIV.js → run-6LJGMJ5S.js} +3 -3
  94. package/dist/{schedule-BPFQPTRI.js → schedule-D74P2BO5.js} +2 -2
  95. package/dist/{search-YDU2L2R4.js → search-W7AOYWRM.js} +2 -2
  96. package/dist/{serve-CMWDXN5D.js → serve-UNVCQSRC.js} +13 -11
  97. package/dist/{session-T3CLSPRC.js → session-6NGNVCKP.js} +4 -4
  98. package/dist/{settings-3YQ7EBL4.js → settings-LGD64PFE.js} +2 -2
  99. package/dist/{snapshot-LMM4QTUF.js → snapshot-PDYGSZZH.js} +2 -2
  100. package/dist/{status-6M7TVQ5U.js → status-UZ4SE7ZP.js} +3 -3
  101. package/dist/{technical-aeo-UI774MQF.js → technical-aeo-BNH7NV44.js} +2 -2
  102. package/dist/{telemetry-XJGPXSUI.js → telemetry-UWDS7QNJ.js} +3 -3
  103. package/dist/{tools-4CCRSYOR.js → tools-EDPBQCI2.js} +3 -3
  104. package/dist/{traffic-5ETOEJNG.js → traffic-NI6ACQO4.js} +2 -2
  105. package/dist/{users-LOPUV244.js → users-XTZ65NLC.js} +2 -2
  106. package/dist/{visibility-stats-ECOEPNTG.js → visibility-stats-EPF6MHYQ.js} +2 -2
  107. package/dist/{wordpress-DCS3VB6D.js → wordpress-ZACJ3H5M.js} +2 -2
  108. package/package.json +1 -1
  109. package/assets/assets/MeasurementPropertyPage-Cm-jzeY8.js +0 -4
  110. package/assets/assets/ProjectPage-C3iapgWm.js +0 -9
  111. package/assets/assets/SiteHealthSection-Bk4zrPnb.js +0 -2
  112. package/assets/assets/TrafficSourceDetailPage-B-7STzgQ.js +0 -1
  113. package/assets/assets/index-BWMizh5y.js +0 -60
  114. package/assets/assets/index-Yn3nIj4B.css +0 -1
  115. package/assets/assets/react-query-BrM5m2wm.js +0 -1
@@ -5,7 +5,7 @@ import {
5
5
  isStoredPageReadTool,
6
6
  isStoredReadTool,
7
7
  truncateToolResult
8
- } from "./chunk-ST6FNS6A.js";
8
+ } from "./chunk-JZT3ZRD3.js";
9
9
  import {
10
10
  CANONRY_MCP_TOOLKITS
11
11
  } from "./chunk-NDTU7FGL.js";
@@ -22,7 +22,7 @@ import {
22
22
  resolveApiKeyFor,
23
23
  resolveModelForProvider,
24
24
  validateAgentProviderRegistry
25
- } from "./chunk-ZWD4W3KU.js";
25
+ } from "./chunk-2BRVGCVU.js";
26
26
  import {
27
27
  CanonryMcpToolNames,
28
28
  canonryMcpTools
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  trackIntegrationConnection
3
- } from "./chunk-7LLDLEWJ.js";
3
+ } from "./chunk-TJYS2XCI.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-OT6SUK6X.js";
6
+ } from "./chunk-YMOQSEO3.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {
@@ -27,14 +27,14 @@ import {
27
27
  resolveConfiguredAgentProvider,
28
28
  resolveSessionProviderAndModel,
29
29
  setAeroSystemPrompt
30
- } from "./chunk-AQLTYL3Q.js";
30
+ } from "./chunk-B7JHQ3FW.js";
31
31
  import {
32
32
  AeroToolProfiles,
33
33
  AeroToolScopes,
34
34
  buildAeroStateTools,
35
35
  isAeroToolProfile,
36
36
  truncateToolResult
37
- } from "./chunk-ST6FNS6A.js";
37
+ } from "./chunk-JZT3ZRD3.js";
38
38
  import {
39
39
  getGoogleAuthConfig,
40
40
  getGoogleConnection,
@@ -76,7 +76,7 @@ import {
76
76
  startOutcomeTimer,
77
77
  trackFeatureCompleted,
78
78
  trackInstallState
79
- } from "./chunk-7LLDLEWJ.js";
79
+ } from "./chunk-TJYS2XCI.js";
80
80
  import {
81
81
  isLoopbackBindHost
82
82
  } from "./chunk-TSENU4GG.js";
@@ -95,17 +95,17 @@ import {
95
95
  recordDashboardEvent,
96
96
  setTelemetryPreference,
97
97
  trackEvent
98
- } from "./chunk-OT6SUK6X.js";
98
+ } from "./chunk-YMOQSEO3.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-MXRCOQT2.js";
101
+ } from "./chunk-2SCPPWRW.js";
102
102
  import {
103
103
  CANONRY_MCP_TIERS,
104
104
  CANONRY_MCP_TOOLKIT_NAMES
105
105
  } from "./chunk-NDTU7FGL.js";
106
106
  import {
107
107
  ApiClient
108
- } from "./chunk-KXSNV6C3.js";
108
+ } from "./chunk-X7UC755Q.js";
109
109
  import {
110
110
  AGENT_PROVIDERS,
111
111
  adapterSupportsBatch,
@@ -136,7 +136,7 @@ import {
136
136
  saveConfigPatch,
137
137
  sentimentInstallReadiness,
138
138
  updateSharedProviderExecutionGate
139
- } from "./chunk-ZWD4W3KU.js";
139
+ } from "./chunk-2BRVGCVU.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
142
  } from "./chunk-7UVCZZQJ.js";
@@ -5810,7 +5810,7 @@ function nonBlank(value) {
5810
5810
  return trimmed ? trimmed : void 0;
5811
5811
  }
5812
5812
  function resolveBuildCommit(env = process.env) {
5813
- const embedded = true ? "344e5accb36d0389b07a393dd137b965100081a5" : void 0;
5813
+ const embedded = true ? "68e116717d6c9f8e51f1909b38f184f264855ffe" : void 0;
5814
5814
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5815
5815
  }
5816
5816
  function resolveInstanceIdentity(env = process.env) {
@@ -8493,7 +8493,8 @@ async function executeGscSync(db, runId, projectId, opts) {
8493
8493
  tokenExpiresAt: new Date(Date.now() + tokens.expires_in * 1e3).toISOString(),
8494
8494
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
8495
8495
  });
8496
- saveConfigPatch(opts.config);
8496
+ const persistConfigPatch = opts.saveConfigPatch ?? saveConfigPatch;
8497
+ persistConfigPatch(opts.config);
8497
8498
  }
8498
8499
  const lagOffset = GSC_DATA_LAG_DAYS;
8499
8500
  const endDate = formatIsoDateInTimeZone((/* @__PURE__ */ new Date()).toISOString(), GSC_REPORTING_TIME_ZONE);
@@ -8918,7 +8919,8 @@ async function executeGbpSync(db, runId, projectId, opts) {
8918
8919
  tokenExpiresAt: new Date(Date.now() + tokens.expires_in * 1e3).toISOString(),
8919
8920
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
8920
8921
  });
8921
- saveConfigPatch(opts.config);
8922
+ const persistConfigPatch = opts.saveConfigPatch ?? saveConfigPatch;
8923
+ persistConfigPatch(opts.config);
8922
8924
  }
8923
8925
  let locationRows = db.select().from(gbpLocations).where(and7(eq9(gbpLocations.projectId, projectId), eq9(gbpLocations.selected, true))).all();
8924
8926
  if (opts.locationNames?.length) {
@@ -10349,7 +10351,8 @@ async function executeInspectSitemap(db, runId, projectId, opts) {
10349
10351
  tokenExpiresAt: new Date(Date.now() + tokens.expires_in * 1e3).toISOString(),
10350
10352
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
10351
10353
  });
10352
- saveConfigPatch(opts.config);
10354
+ const persistConfigPatch = opts.saveConfigPatch ?? saveConfigPatch;
10355
+ persistConfigPatch(opts.config);
10353
10356
  }
10354
10357
  const sitemapUrl = opts.sitemapUrl || conn.sitemapUrl || `https://${project.canonicalDomain}/sitemap.xml`;
10355
10358
  log8.info("sitemap.fetch", { runId, projectId, sitemapUrl });
@@ -19142,6 +19145,16 @@ function parseDashboardOnboardingMode(value) {
19142
19145
  function resolveDashboardOnboardingMode(env, config) {
19143
19146
  return parseDashboardOnboardingMode(env.CANONRY_ONBOARDING_MODE) ?? config.dashboard?.onboardingMode;
19144
19147
  }
19148
+ function parseDashboardBrandMark(value) {
19149
+ const normalized = value?.trim().toLowerCase();
19150
+ return normalized === "mascot" || normalized === "icon" ? normalized : void 0;
19151
+ }
19152
+ function resolveDashboardBrandMark(env, config) {
19153
+ return parseDashboardBrandMark(env.CANONRY_DASHBOARD_BRAND_MARK) ?? parseDashboardBrandMark(config.dashboard?.brandMark) ?? "mascot";
19154
+ }
19155
+ function withIconMarkLinks(html) {
19156
+ return html.replace(/href="(\.?\/)favicon\.svg"/, 'href="$1canonry-icon-favicon.svg"').replace(/href="(\.?\/)favicon-32\.png"/, 'href="$1canonry-icon-32.png"').replace(/href="(\.?\/)apple-touch-icon\.png"/, 'href="$1canonry-icon-touch.png"');
19157
+ }
19145
19158
  var API_ADAPTERS = [
19146
19159
  geminiAdapter,
19147
19160
  openaiAdapter,
@@ -19281,7 +19294,7 @@ function serializeSessionCookie(opts) {
19281
19294
  }
19282
19295
  return parts.join("; ");
19283
19296
  }
19284
- function applyLegacyCredentials(rows, config) {
19297
+ function applyLegacyCredentials(rows, config, persistConfigPatch = saveConfigPatch) {
19285
19298
  let migratedGoogle = 0;
19286
19299
  for (const row of rows.google) {
19287
19300
  const existing = getGoogleConnection(
@@ -19305,7 +19318,7 @@ function applyLegacyCredentials(rows, config) {
19305
19318
  migratedGoogle++;
19306
19319
  }
19307
19320
  if (migratedGoogle > 0) {
19308
- saveConfigPatch({ google: config.google });
19321
+ persistConfigPatch({ google: config.google });
19309
19322
  log27.info("credentials.migrated", { type: "google", count: migratedGoogle });
19310
19323
  }
19311
19324
  let migratedGa4 = 0;
@@ -19323,7 +19336,7 @@ function applyLegacyCredentials(rows, config) {
19323
19336
  migratedGa4++;
19324
19337
  }
19325
19338
  if (migratedGa4 > 0) {
19326
- saveConfigPatch({ ga4: config.ga4 });
19339
+ persistConfigPatch({ ga4: config.ga4 });
19327
19340
  log27.info("credentials.migrated", { type: "ga4", count: migratedGa4 });
19328
19341
  }
19329
19342
  }
@@ -19520,8 +19533,16 @@ function createGoogleMarketingConfigCredentialStore(input) {
19520
19533
  };
19521
19534
  }
19522
19535
  async function createServer(opts) {
19523
- const runtimeConfigPath = path5.resolve(getConfigPath());
19536
+ const runtimeConfigPath = path5.resolve(opts.configPath ?? getConfigPath());
19524
19537
  const runtimeConfigIdentity = runtimePathIdentity(runtimeConfigPath);
19538
+ const persistedConfigPath = opts.configPath === void 0 ? void 0 : runtimeConfigPath;
19539
+ const persistConfigPatch = (patch, options = {}) => {
19540
+ if (persistedConfigPath !== void 0) saveConfigPatch(patch, { ...options, configPath: persistedConfigPath });
19541
+ };
19542
+ const ownsDefaultConfig = persistedConfigPath !== void 0 && runtimeConfigIdentity === runtimePathIdentity(getConfigPath());
19543
+ const coverageRefreshDeps = {
19544
+ executeInspectSitemap: (db, runId, projectId, inspectOpts) => executeInspectSitemap(db, runId, projectId, { ...inspectOpts, saveConfigPatch: persistConfigPatch })
19545
+ };
19525
19546
  const runtimeDatabasePath = opts.config.database;
19526
19547
  const runtimeDatabaseIdentity = runtimePathIdentity(runtimeDatabasePath);
19527
19548
  const embed = resolveEmbedConfig(process.env, opts.config);
@@ -19586,14 +19607,16 @@ async function createServer(opts) {
19586
19607
  };
19587
19608
  }
19588
19609
  opts.config.providers = providers;
19589
- try {
19590
- const legacyRows = extractLegacyCredentials(opts.db);
19591
- applyLegacyCredentials(legacyRows, opts.config);
19592
- dropLegacyCredentialColumns(opts.db);
19593
- } catch (err) {
19594
- log27.warn("credentials.migration.failed", {
19595
- error: describeError(err)
19596
- });
19610
+ if (persistedConfigPath !== void 0) {
19611
+ try {
19612
+ const legacyRows = extractLegacyCredentials(opts.db);
19613
+ applyLegacyCredentials(legacyRows, opts.config, persistConfigPatch);
19614
+ dropLegacyCredentialColumns(opts.db);
19615
+ } catch (err) {
19616
+ log27.warn("credentials.migration.failed", {
19617
+ error: describeError(err)
19618
+ });
19619
+ }
19597
19620
  }
19598
19621
  log27.info("providers.configured", {
19599
19622
  providers: registeredProviderNames({ providers, cdp: opts.config.cdp })
@@ -19610,8 +19633,9 @@ async function createServer(opts) {
19610
19633
  const jobRunner = new JobRunner(opts.db, registry, {
19611
19634
  // The one-time first-sweep thank-you. Lives on the serve console because
19612
19635
  // runs execute here, including the foreground serve that init hands off
19613
- // to. TTY-gated inside, so supervised deployments never see it.
19614
- onFirstActivation: () => maybeShowActivationNotice()
19636
+ // to. TTY-gated inside, so supervised deployments never see it. It marks
19637
+ // the default config.yaml, so only the server running from it asks.
19638
+ ...ownsDefaultConfig ? { onFirstActivation: () => maybeShowActivationNotice() } : {}
19615
19639
  });
19616
19640
  jobRunner.recoverStaleRuns();
19617
19641
  const seoRuntime = new SeoRuntime(opts.db, () => loadConfig(runtimeConfigPath).seo, () => {
@@ -19684,17 +19708,18 @@ async function createServer(opts) {
19684
19708
  );
19685
19709
  const removedGoogleMarketingCredentials = removeLegacyGoogleAdsConnections(opts.config) + removeLegacyGtmConnections(opts.config) + removeOrphanedGoogleAdsConnections(opts.config, liveProjectIds) + removeOrphanedGtmConnections(opts.config, liveProjectIds);
19686
19710
  if (removedGoogleMarketingCredentials > 0) {
19687
- saveConfigPatch({
19711
+ persistConfigPatch({
19688
19712
  googleAds: opts.config.googleAds,
19689
19713
  gtm: opts.config.gtm
19690
19714
  });
19691
19715
  }
19692
19716
  const googleMarketingRuntime = createGoogleMarketingRuntime({
19693
19717
  config: opts.config,
19694
- saveConfigPatch
19718
+ saveConfigPatch: persistConfigPatch
19695
19719
  });
19696
19720
  const googleMarketingCredentialStore = createGoogleMarketingConfigCredentialStore({
19697
- config: opts.config
19721
+ config: opts.config,
19722
+ saveConfigPatch: persistConfigPatch
19698
19723
  });
19699
19724
  const prepareGoogleMarketingCredentialDelete = (projectId) => {
19700
19725
  const previousGoogleAdsConnections = opts.config.googleAds?.connections;
@@ -19707,7 +19732,7 @@ async function createServer(opts) {
19707
19732
  const removedGtm = removeGtmConnection(opts.config, projectId);
19708
19733
  if (!removedGoogleAds && !removedGtm) return void 0;
19709
19734
  try {
19710
- saveConfigPatch({
19735
+ persistConfigPatch({
19711
19736
  googleAds: opts.config.googleAds,
19712
19737
  gtm: opts.config.gtm
19713
19738
  });
@@ -19718,7 +19743,7 @@ async function createServer(opts) {
19718
19743
  return () => {
19719
19744
  restore();
19720
19745
  try {
19721
- saveConfigPatch({
19746
+ persistConfigPatch({
19722
19747
  googleAds: opts.config.googleAds,
19723
19748
  gtm: opts.config.gtm
19724
19749
  });
@@ -19790,7 +19815,8 @@ async function createServer(opts) {
19790
19815
  }
19791
19816
  executeGbpSync(opts.db, runId, projectId, {
19792
19817
  ...syncOpts,
19793
- config: opts.config
19818
+ config: opts.config,
19819
+ saveConfigPatch: persistConfigPatch
19794
19820
  }).then(() => runCoordinator.onRunCompleted(runId, projectId)).catch((err) => {
19795
19821
  app.log.error({ runId, err }, "GBP sync failed");
19796
19822
  });
@@ -19818,12 +19844,12 @@ async function createServer(opts) {
19818
19844
  },
19819
19845
  upsertConnection: (connection) => {
19820
19846
  const updated = upsertOpenAiAdsConnection(opts.config, connection);
19821
- saveConfigPatch(opts.config);
19847
+ persistConfigPatch(opts.config);
19822
19848
  return updated;
19823
19849
  },
19824
19850
  removeConnection: (projectName) => {
19825
19851
  const removed = removeOpenAiAdsConnection(opts.config, projectName);
19826
- if (removed) saveConfigPatch(opts.config);
19852
+ if (removed) persistConfigPatch(opts.config);
19827
19853
  return removed;
19828
19854
  }
19829
19855
  };
@@ -20208,7 +20234,7 @@ async function createServer(opts) {
20208
20234
  } else {
20209
20235
  opts.config.bing.connections.push(normalized);
20210
20236
  }
20211
- saveConfigPatch(opts.config);
20237
+ persistConfigPatch(opts.config);
20212
20238
  return normalized;
20213
20239
  },
20214
20240
  updateConnection: (domain, patch) => {
@@ -20217,7 +20243,7 @@ async function createServer(opts) {
20217
20243
  );
20218
20244
  if (!conn) return void 0;
20219
20245
  Object.assign(conn, patch);
20220
- saveConfigPatch(opts.config);
20246
+ persistConfigPatch(opts.config);
20221
20247
  return conn;
20222
20248
  },
20223
20249
  deleteConnection: (domain) => {
@@ -20227,7 +20253,7 @@ async function createServer(opts) {
20227
20253
  );
20228
20254
  if (idx < 0) return false;
20229
20255
  opts.config.bing.connections.splice(idx, 1);
20230
- saveConfigPatch(opts.config);
20256
+ persistConfigPatch(opts.config);
20231
20257
  return true;
20232
20258
  }
20233
20259
  };
@@ -20237,12 +20263,12 @@ async function createServer(opts) {
20237
20263
  },
20238
20264
  upsertConnection: (connection) => {
20239
20265
  const updated = upsertGa4Connection(opts.config, connection);
20240
- saveConfigPatch(opts.config);
20266
+ persistConfigPatch(opts.config);
20241
20267
  return updated;
20242
20268
  },
20243
20269
  deleteConnection: (projectName) => {
20244
20270
  const removed = removeGa4Connection(opts.config, projectName);
20245
- if (removed) saveConfigPatch(opts.config);
20271
+ if (removed) persistConfigPatch(opts.config);
20246
20272
  return removed;
20247
20273
  }
20248
20274
  };
@@ -20252,12 +20278,12 @@ async function createServer(opts) {
20252
20278
  },
20253
20279
  upsertConnection: (record) => {
20254
20280
  const updated = upsertCloudRunConnection(opts.config, record);
20255
- saveConfigPatch(opts.config);
20281
+ persistConfigPatch(opts.config);
20256
20282
  return updated;
20257
20283
  },
20258
20284
  deleteConnection: (projectName) => {
20259
20285
  const removed = removeCloudRunConnection(opts.config, projectName);
20260
- if (removed) saveConfigPatch(opts.config);
20286
+ if (removed) persistConfigPatch(opts.config);
20261
20287
  return removed;
20262
20288
  }
20263
20289
  };
@@ -20267,7 +20293,7 @@ async function createServer(opts) {
20267
20293
  },
20268
20294
  upsertConnection: (record) => {
20269
20295
  const updated = upsertWordpressTrafficConnection(opts.config, record);
20270
- saveConfigPatch(opts.config);
20296
+ persistConfigPatch(opts.config);
20271
20297
  return updated;
20272
20298
  },
20273
20299
  deleteConnection: (projectName) => {
@@ -20275,7 +20301,7 @@ async function createServer(opts) {
20275
20301
  opts.config,
20276
20302
  projectName
20277
20303
  );
20278
- if (removed) saveConfigPatch(opts.config);
20304
+ if (removed) persistConfigPatch(opts.config);
20279
20305
  return removed;
20280
20306
  }
20281
20307
  };
@@ -20285,12 +20311,12 @@ async function createServer(opts) {
20285
20311
  },
20286
20312
  upsertConnection: (record) => {
20287
20313
  const updated = upsertVercelTrafficConnection(opts.config, record);
20288
- saveConfigPatch(opts.config);
20314
+ persistConfigPatch(opts.config);
20289
20315
  return updated;
20290
20316
  },
20291
20317
  deleteConnection: (projectName) => {
20292
20318
  const removed = removeVercelTrafficConnection(opts.config, projectName);
20293
- if (removed) saveConfigPatch(opts.config);
20319
+ if (removed) persistConfigPatch(opts.config);
20294
20320
  return removed;
20295
20321
  }
20296
20322
  };
@@ -20303,12 +20329,12 @@ async function createServer(opts) {
20303
20329
  },
20304
20330
  upsertConnection: (record) => {
20305
20331
  const updated = upsertCloudflareTrafficConnection(opts.config, record);
20306
- saveConfigPatch(opts.config);
20332
+ persistConfigPatch(opts.config);
20307
20333
  return updated;
20308
20334
  },
20309
20335
  deleteConnection: (projectName) => {
20310
20336
  const removed = removeCloudflareTrafficConnection(opts.config, projectName);
20311
- if (removed) saveConfigPatch(opts.config);
20337
+ if (removed) persistConfigPatch(opts.config);
20312
20338
  return removed;
20313
20339
  },
20314
20340
  deleteConnectionBySourceId: (sourceId) => {
@@ -20316,7 +20342,7 @@ async function createServer(opts) {
20316
20342
  opts.config,
20317
20343
  sourceId
20318
20344
  );
20319
- if (removed) saveConfigPatch(opts.config);
20345
+ if (removed) persistConfigPatch(opts.config);
20320
20346
  return removed;
20321
20347
  }
20322
20348
  };
@@ -20326,7 +20352,7 @@ async function createServer(opts) {
20326
20352
  getConnection: (domain, connectionType) => getGoogleConnection(opts.config, domain, connectionType),
20327
20353
  upsertConnection: (connection) => {
20328
20354
  const updated = upsertGoogleConnection(opts.config, connection);
20329
- saveConfigPatch(opts.config);
20355
+ persistConfigPatch(opts.config);
20330
20356
  return updated;
20331
20357
  },
20332
20358
  updateConnection: (domain, connectionType, patch) => {
@@ -20336,7 +20362,7 @@ async function createServer(opts) {
20336
20362
  connectionType,
20337
20363
  patch
20338
20364
  );
20339
- if (updated) saveConfigPatch(opts.config);
20365
+ if (updated) persistConfigPatch(opts.config);
20340
20366
  return updated;
20341
20367
  },
20342
20368
  deleteConnection: (domain, connectionType) => {
@@ -20345,7 +20371,7 @@ async function createServer(opts) {
20345
20371
  domain,
20346
20372
  connectionType
20347
20373
  );
20348
- if (removed) saveConfigPatch(opts.config);
20374
+ if (removed) persistConfigPatch(opts.config);
20349
20375
  return removed;
20350
20376
  }
20351
20377
  };
@@ -20355,17 +20381,17 @@ async function createServer(opts) {
20355
20381
  },
20356
20382
  upsertConnection: (connection) => {
20357
20383
  const updated = upsertWordpressConnection(opts.config, connection);
20358
- saveConfigPatch(opts.config);
20384
+ persistConfigPatch(opts.config);
20359
20385
  return updated;
20360
20386
  },
20361
20387
  updateConnection: (projectName, patch) => {
20362
20388
  const updated = patchWordpressConnection(opts.config, projectName, patch);
20363
- if (updated) saveConfigPatch(opts.config);
20389
+ if (updated) persistConfigPatch(opts.config);
20364
20390
  return updated;
20365
20391
  },
20366
20392
  deleteConnection: (projectName) => {
20367
20393
  const removed = removeWordpressConnection(opts.config, projectName);
20368
- if (removed) saveConfigPatch(opts.config);
20394
+ if (removed) persistConfigPatch(opts.config);
20369
20395
  return removed;
20370
20396
  }
20371
20397
  };
@@ -20388,6 +20414,7 @@ async function createServer(opts) {
20388
20414
  const dashboardShowLocalAgentSetup = resolveDashboardShowLocalAgentSetup(process.env, opts.config);
20389
20415
  const dashboardShowUpdateNotification = resolveDashboardShowUpdateNotification(process.env, opts.config);
20390
20416
  const dashboardOnboardingMode = resolveDashboardOnboardingMode(process.env, opts.config);
20417
+ const dashboardBrandMark = resolveDashboardBrandMark(process.env, opts.config);
20391
20418
  const researchAllowViewers = resolveResearchAllowViewers(process.env, opts.config);
20392
20419
  const researchViewerDailyRunLimit = resolveResearchViewerDailyRunLimit(process.env, opts.config);
20393
20420
  app.log.info(
@@ -20600,7 +20627,7 @@ async function createServer(opts) {
20600
20627
  diff: { authorizedBy: presentedRootKey ? "root-api-key" : "local-request" }
20601
20628
  }));
20602
20629
  const created = createSession(defaultKey, true, tx);
20603
- saveConfigPatch(opts.config, { setDashboardPasswordHash: passwordHash });
20630
+ persistConfigPatch(opts.config, { setDashboardPasswordHash: passwordHash });
20604
20631
  return created;
20605
20632
  });
20606
20633
  } catch (err) {
@@ -20631,18 +20658,20 @@ async function createServer(opts) {
20631
20658
  password,
20632
20659
  opts.config.dashboardPasswordHash
20633
20660
  );
20634
- const onDisk = verification.ok && verification.needsRehash ? loadConfigRaw() : null;
20661
+ const onDisk = verification.ok && verification.needsRehash && persistedConfigPath !== void 0 ? loadConfigRaw(persistedConfigPath) : null;
20635
20662
  if (!verification.ok || onDisk && onDisk.dashboardPasswordHash !== opts.config.dashboardPasswordHash) {
20636
20663
  return reply.status(401).send({
20637
20664
  error: { code: "AUTH_INVALID", message: "Incorrect password" }
20638
20665
  });
20639
20666
  }
20640
20667
  if (verification.needsRehash) {
20641
- if (fs5.existsSync(getConfigPath()) && (!onDisk || typeof onDisk !== "object" || Array.isArray(onDisk) || !onDisk.apiUrl || !onDisk.database || !onDisk.apiKey)) {
20668
+ if (persistedConfigPath !== void 0 && fs5.existsSync(persistedConfigPath) && (!onDisk || typeof onDisk !== "object" || Array.isArray(onDisk) || !onDisk.apiUrl || !onDisk.database || !onDisk.apiKey)) {
20642
20669
  throw new Error("Cannot migrate dashboard password: config.yaml is unreadable or invalid");
20643
20670
  }
20644
20671
  const migratedHash = hashDashboardPassword(password);
20645
- saveConfig({ ...onDisk ?? opts.config, dashboardPasswordHash: migratedHash });
20672
+ if (persistedConfigPath !== void 0) {
20673
+ saveConfig({ ...onDisk ?? opts.config, dashboardPasswordHash: migratedHash }, persistedConfigPath);
20674
+ }
20646
20675
  opts.config.dashboardPasswordHash = migratedHash;
20647
20676
  }
20648
20677
  if (!createPasswordSession(reply)) {
@@ -21057,9 +21086,10 @@ async function createServer(opts) {
21057
21086
  }
21058
21087
  executeGscSync(opts.db, runId, projectId, {
21059
21088
  ...syncOpts,
21060
- config: opts.config
21089
+ config: opts.config,
21090
+ saveConfigPatch: persistConfigPatch
21061
21091
  }).then(
21062
- () => maybeRefreshGscCoverage(opts.db, opts.config, projectId, void 0, Date.now(), {
21092
+ () => maybeRefreshGscCoverage(opts.db, opts.config, projectId, coverageRefreshDeps, Date.now(), {
21063
21093
  userInitiated: runWasUserInitiated(opts.db, runId)
21064
21094
  })
21065
21095
  ).catch((err) => {
@@ -21077,7 +21107,8 @@ async function createServer(opts) {
21077
21107
  }
21078
21108
  executeInspectSitemap(opts.db, runId, projectId, {
21079
21109
  ...inspectOpts,
21080
- config: opts.config
21110
+ config: opts.config,
21111
+ saveConfigPatch: persistConfigPatch
21081
21112
  }).catch((err) => {
21082
21113
  app.log.error({ runId, err }, "Inspect sitemap failed");
21083
21114
  });
@@ -21248,7 +21279,7 @@ async function createServer(opts) {
21248
21279
  opts.db,
21249
21280
  opts.config,
21250
21281
  projectId,
21251
- void 0,
21282
+ coverageRefreshDeps,
21252
21283
  Date.now(),
21253
21284
  { userInitiated: runWasUserInitiated(opts.db, runId) }
21254
21285
  );
@@ -21350,7 +21381,7 @@ async function createServer(opts) {
21350
21381
  ...existing?.pricing ? { pricing: existing.pricing } : {}
21351
21382
  };
21352
21383
  try {
21353
- saveConfigPatch(fs5.existsSync(runtimeConfigPath) ? { providers: { [name]: opts.config.providers[name] } } : opts.config);
21384
+ persistConfigPatch(fs5.existsSync(runtimeConfigPath) ? { providers: { [name]: opts.config.providers[name] } } : opts.config);
21354
21385
  } catch (err) {
21355
21386
  app.log.error({ err }, "Failed to save config");
21356
21387
  return null;
@@ -21370,7 +21401,7 @@ async function createServer(opts) {
21370
21401
  onGoogleSettingsUpdate: (clientId, clientSecret) => {
21371
21402
  try {
21372
21403
  setGoogleAuthConfig(opts.config, { clientId, clientSecret });
21373
- saveConfigPatch(opts.config);
21404
+ persistConfigPatch(opts.config);
21374
21405
  googleSettingsSummary.configured = true;
21375
21406
  return { ...googleSettingsSummary };
21376
21407
  } catch (err) {
@@ -21382,7 +21413,7 @@ async function createServer(opts) {
21382
21413
  try {
21383
21414
  if (!opts.config.bing) opts.config.bing = {};
21384
21415
  opts.config.bing.apiKey = apiKey;
21385
- saveConfigPatch(opts.config);
21416
+ persistConfigPatch(opts.config);
21386
21417
  bingSettingsSummary.configured = true;
21387
21418
  return { ...bingSettingsSummary };
21388
21419
  } catch (err) {
@@ -21409,7 +21440,7 @@ async function createServer(opts) {
21409
21440
  const removedGoogleAds = removeGoogleAdsConnection(opts.config, projectId);
21410
21441
  const removedGtm = removeGtmConnection(opts.config, projectId);
21411
21442
  if (removedGoogleAds || removedGtm) {
21412
- saveConfigPatch({
21443
+ persistConfigPatch({
21413
21444
  googleAds: opts.config.googleAds,
21414
21445
  gtm: opts.config.gtm
21415
21446
  });
@@ -21427,10 +21458,12 @@ async function createServer(opts) {
21427
21458
  operatorApiKeyIds,
21428
21459
  listOperationalLogs: (query) => operationalLogs.list(query),
21429
21460
  getTelemetryStatus,
21430
- setTelemetryEnabled: (enabled, attribution) => {
21461
+ // The preference lives in the default config.yaml; a server running from
21462
+ // any other config leaves it alone, and the route answers 501.
21463
+ setTelemetryEnabled: ownsDefaultConfig ? (enabled, attribution) => {
21431
21464
  void setTelemetryPreference(enabled, "api", outcomeAttribution(attribution));
21432
21465
  opts.config.telemetry = enabled;
21433
- },
21466
+ } : void 0,
21434
21467
  recordOnboardingEvent: (event) => recordDashboardEvent(event),
21435
21468
  // Answers false while telemetry is off or the per-process cap is spent, so
21436
21469
  // the dashboard stops sending for the session.
@@ -21441,7 +21474,7 @@ async function createServer(opts) {
21441
21474
  opts.config.cdp.host = host;
21442
21475
  opts.config.cdp.port = port2;
21443
21476
  try {
21444
- saveConfigPatch(opts.config);
21477
+ persistConfigPatch(opts.config);
21445
21478
  } catch (err) {
21446
21479
  app.log.error({ err }, "Failed to save CDP config");
21447
21480
  throw err;
@@ -21529,6 +21562,9 @@ async function createServer(opts) {
21529
21562
  if (!dashboardShowUpdateNotification) {
21530
21563
  dashboardConfig.showUpdateNotification = false;
21531
21564
  }
21565
+ if (dashboardBrandMark === "icon") {
21566
+ dashboardConfig.brandMark = "icon";
21567
+ }
21532
21568
  if (dashboardManagedRunKinds.length > 0) {
21533
21569
  dashboardConfig.managedRunKinds = dashboardManagedRunKinds;
21534
21570
  }
@@ -21561,7 +21597,7 @@ async function createServer(opts) {
21561
21597
  }
21562
21598
  const configScript = `<script>window.__CANONRY_CONFIG__=${serializeForInlineScript(clientConfig)}</script>`;
21563
21599
  const baseTag = `<base href="${basePath ?? "/"}">`;
21564
- return html.replace("<head>", `<head>${baseTag}`).replace("</head>", `${configScript}</head>`);
21600
+ return (dashboardBrandMark === "icon" ? withIconMarkLinks(html) : html).replace("<head>", `<head>${baseTag}`).replace("</head>", `${configScript}</head>`);
21565
21601
  };
21566
21602
  const sendSpaDocument = (reply, html) => {
21567
21603
  reply.header("Cache-Control", "no-cache, must-revalidate");
@@ -2,7 +2,7 @@ import {
2
2
  configExists,
3
3
  loadConfigRaw,
4
4
  saveConfigPatch
5
- } from "./chunk-ZWD4W3KU.js";
5
+ } from "./chunk-2BRVGCVU.js";
6
6
  import {
7
7
  BUNDLED_SKILL_NAMES,
8
8
  installSkills
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-C3UFOS7J.js";
11
11
  import {
12
12
  loadConfig
13
- } from "./chunk-ZWD4W3KU.js";
13
+ } from "./chunk-2BRVGCVU.js";
14
14
  import {
15
15
  isMachineFormat
16
16
  } from "./chunk-HGMYEDAQ.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runWithUsageTags
3
- } from "./chunk-KXSNV6C3.js";
3
+ } from "./chunk-X7UC755Q.js";
4
4
  import {
5
5
  CanonryMcpToolNames,
6
6
  canonryMcpTools
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-ZWD4W3KU.js";
7
+ } from "./chunk-2BRVGCVU.js";
8
8
 
9
9
  // src/setup-state.ts
10
10
  import fs from "fs";
@@ -47,7 +47,7 @@ function queueServeHandoff() {
47
47
  async function runPendingServeHandoff(format) {
48
48
  if (!pendingServeHandoff) return;
49
49
  pendingServeHandoff = false;
50
- const { serveCommand } = await import("./serve-CMWDXN5D.js");
50
+ const { serveCommand } = await import("./serve-UNVCQSRC.js");
51
51
  await serveCommand(format);
52
52
  }
53
53
 
@@ -2,10 +2,10 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-OT6SUK6X.js";
5
+ } from "./chunk-YMOQSEO3.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-ZWD4W3KU.js";
8
+ } from "./chunk-2BRVGCVU.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
11
  } from "./chunk-JPOIDGGF.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-VJWDBFSL.js";
5
5
  import {
6
6
  createApiClient
7
- } from "./chunk-KXSNV6C3.js";
7
+ } from "./chunk-X7UC755Q.js";
8
8
  import {
9
9
  CliError,
10
10
  isMachineFormat
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-KXSNV6C3.js";
3
+ } from "./chunk-X7UC755Q.js";
4
4
  import {
5
5
  emitJsonl
6
6
  } from "./chunk-Z7IUAJOF.js";