@canonry/canonry 7.73.0 → 7.75.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/assets/AgentSetupPage-Dy9_auot.js +18 -0
  2. package/assets/assets/{AuditHistoryPanel-yrgfS5B_.js → AuditHistoryPanel-BVTD5aDT.js} +1 -1
  3. package/assets/assets/{BacklinksPage-DJM6z03g.js → BacklinksPage-B3UasiLF.js} +1 -1
  4. package/assets/assets/{HistoryPage-CNvAVJ1S.js → HistoryPage-BeKtZ449.js} +1 -1
  5. package/assets/assets/{MeasurementPropertyPage-BVVYhOxR.js → MeasurementPropertyPage-Cm-jzeY8.js} +1 -1
  6. package/assets/assets/{ProjectPage-CPRD8kR9.js → ProjectPage-C3iapgWm.js} +1 -1
  7. package/assets/assets/{RunsPage-Ck33dcjz.js → RunsPage-bRhgxSV_.js} +1 -1
  8. package/assets/assets/{SettingsPage-CS_t4Dai.js → SettingsPage-fPEwb0Fh.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-BurKnHpn.js → SiteHealthSection-Bk4zrPnb.js} +2 -2
  10. package/assets/assets/ToneBadge-DfEkyFHe.js +60 -0
  11. package/assets/assets/{TrafficPage-DAiY698E.js → TrafficPage-CzdZa-dz.js} +1 -1
  12. package/assets/assets/{TrafficSourceDetailPage-clJSX2rr.js → TrafficSourceDetailPage-B-7STzgQ.js} +1 -1
  13. package/assets/assets/{account-context-DDEhuoP2.js → account-context-C0wMdIfs.js} +1 -1
  14. package/assets/assets/{card-DbR-lBY3.js → card-CdfP76v-.js} +1 -1
  15. package/assets/assets/{extract-error-message-7_Vm2DQF.js → extract-error-message-D36I9Bna.js} +1 -1
  16. package/assets/assets/{format-helpers-vtahpXTQ.js → format-helpers-Ja8nzHvN.js} +1 -1
  17. package/assets/assets/{index-BIhCeXvc.js → index-BWMizh5y.js} +4 -4
  18. package/assets/assets/{query-client-TlFXYJ9o.js → query-client-jOrIVlKd.js} +1 -1
  19. package/assets/assets/{react-query-C5Mv8xfD.js → react-query-BrM5m2wm.js} +1 -1
  20. package/assets/assets/{react-sigma_core.esm.min-DmggJ7YC.js → react-sigma_core.esm.min-D2wEGI_h.js} +1 -1
  21. package/assets/assets/{service-CLFURPuM.js → service-jrrtReGW.js} +1 -1
  22. package/assets/index.html +7 -7
  23. package/dist/{ads-TX5622SS.js → ads-IVD2KC7R.js} +3 -3
  24. package/dist/{agent-AIOQL66U.js → agent-FTNZ4DVP.js} +7 -7
  25. package/dist/{agent-ask-A6GIJTBX.js → agent-ask-N3LMHW2E.js} +3 -3
  26. package/dist/{agent-conversations-LHWLKOPQ.js → agent-conversations-Y2GSGKRO.js} +3 -3
  27. package/dist/{agent-memory-F54BPEYN.js → agent-memory-K36FD3LU.js} +3 -3
  28. package/dist/{agent-providers-L74KZOSG.js → agent-providers-ZIAJAJD6.js} +3 -3
  29. package/dist/{agent-transcript-IH65H755.js → agent-transcript-Q4AGCHLB.js} +3 -3
  30. package/dist/{analytics-YWCY2KSY.js → analytics-URO2WOTD.js} +3 -3
  31. package/dist/{apply-BLUUYG2N.js → apply-M4RFPVRN.js} +3 -3
  32. package/dist/{backfill-6WO5CH6Z.js → backfill-EYFE2OGC.js} +9 -9
  33. package/dist/{backlinks-NC7AUGTK.js → backlinks-GR7XW4DH.js} +3 -3
  34. package/dist/{bing-WQUEYHVC.js → bing-A4Q5V3DT.js} +3 -3
  35. package/dist/{bootstrap-AXZV4BBC.js → bootstrap-OGYIIZXE.js} +10 -10
  36. package/dist/{cdp-DUG5PMUD.js → cdp-5WSH26OU.js} +7 -7
  37. package/dist/{chunk-HJHFW455.js → chunk-2BDWXHYF.js} +3 -3
  38. package/dist/{chunk-DLVGMRM5.js → chunk-2WBT6TEJ.js} +1 -1
  39. package/dist/{chunk-JQNVNB63.js → chunk-3TCCNK2T.js} +3 -3
  40. package/dist/{chunk-6YW24AUN.js → chunk-46KV7CZU.js} +2 -2
  41. package/dist/{chunk-4JMTDLFV.js → chunk-4LR2SXYB.js} +2 -2
  42. package/dist/{chunk-3WPTMLQI.js → chunk-4QHTXT4A.js} +3 -3
  43. package/dist/{chunk-MRSNLKSM.js → chunk-5QR7D4RQ.js} +1 -1
  44. package/dist/{chunk-HKV4UWG5.js → chunk-5SVPFDUM.js} +201 -92
  45. package/dist/{chunk-S77W2XSI.js → chunk-7J7E2F3M.js} +4 -4
  46. package/dist/{chunk-HEL6DKDN.js → chunk-7UVCZZQJ.js} +1 -1
  47. package/dist/{chunk-6ATKY252.js → chunk-C3UFOS7J.js} +2 -2
  48. package/dist/{chunk-3ANSG6YT.js → chunk-CYXUQNIQ.js} +335 -335
  49. package/dist/{chunk-PAIYFNNY.js → chunk-D5XPB7MM.js} +1 -1
  50. package/dist/{chunk-GUFKUPKZ.js → chunk-E6NE3FJC.js} +3 -3
  51. package/dist/{chunk-SF5JLMLG.js → chunk-FCGYYZHL.js} +5 -1
  52. package/dist/{chunk-HIGBV77K.js → chunk-GD3L63V5.js} +36 -23
  53. package/dist/{chunk-GWDMWKM6.js → chunk-JPOIDGGF.js} +1 -1
  54. package/dist/{chunk-2Y6MSB4J.js → chunk-JSCO223C.js} +1 -1
  55. package/dist/{chunk-GNBATQS3.js → chunk-KF76GJ7L.js} +6 -6
  56. package/dist/{chunk-HGMTGC34.js → chunk-LBFWNA4V.js} +4 -4
  57. package/dist/{chunk-WLWOGBLJ.js → chunk-M7OLPSCA.js} +4 -4
  58. package/dist/{chunk-WH2M2MQF.js → chunk-MJGY7NBK.js} +2 -2
  59. package/dist/{chunk-F5D4GPZQ.js → chunk-NKNA2DSS.js} +3 -3
  60. package/dist/{chunk-5PA7SJ2M.js → chunk-OF6UW77Y.js} +5 -5
  61. package/dist/{chunk-XDQJOZKJ.js → chunk-PSNTEGNY.js} +1 -1
  62. package/dist/{chunk-3YIKSZHN.js → chunk-RPJJOBKN.js} +1 -1
  63. package/dist/{chunk-4B6DE7BB.js → chunk-RZVZONVL.js} +2 -2
  64. package/dist/{chunk-QS6RIP37.js → chunk-TESDUMVK.js} +1 -1
  65. package/dist/{chunk-B6R223HQ.js → chunk-TRAD6XS4.js} +8 -8
  66. package/dist/{chunk-T5PWWDMJ.js → chunk-U5UXQV57.js} +2 -2
  67. package/dist/{chunk-PRSQ4R47.js → chunk-W5GZENMO.js} +2 -2
  68. package/dist/{chunk-ETVM3T7K.js → chunk-WWZ6RZJ5.js} +4 -4
  69. package/dist/{chunk-JPM3VC6A.js → chunk-XYYWKCJQ.js} +1 -1
  70. package/dist/{chunk-AZQNJX3T.js → chunk-Z2FY6AGZ.js} +2 -2
  71. package/dist/{chunk-6W5AR4IW.js → chunk-ZXYCPRNY.js} +1 -1
  72. package/dist/{citations-FUZ6DGP5.js → citations-K44GWHAZ.js} +3 -3
  73. package/dist/{cli-catalog-BXHG544D.js → cli-catalog-ZVFLJXID.js} +3 -3
  74. package/dist/{cli-commands-GMOR67F5.js → cli-commands-RQTNKS2T.js} +7 -7
  75. package/dist/cli.js +13 -13
  76. package/dist/{competitor-QDCH7PLT.js → competitor-MHYOHVOJ.js} +3 -3
  77. package/dist/{content-JX2CPIPR.js → content-AWDA3GYL.js} +3 -3
  78. package/dist/{dashboard-OOWMLMKV.js → dashboard-P2ODMTQG.js} +6 -6
  79. package/dist/{demo-GKSMSKOY.js → demo-FSRCJINC.js} +1 -1
  80. package/dist/{demo-server-UQO4XKHN.js → demo-server-ROGIRBAR.js} +12 -12
  81. package/dist/{discover-YQSVQRUV.js → discover-I2SVIHRG.js} +3 -3
  82. package/dist/{discover-eval-FN5RL6QI.js → discover-eval-VV2AKXCV.js} +3 -3
  83. package/dist/{doctor-YHJLAEJJ.js → doctor-25I3JSKE.js} +3 -3
  84. package/dist/{evidence-KUPZMBIK.js → evidence-PNYKUX2F.js} +3 -3
  85. package/dist/{export-cmd-YSEPTUUF.js → export-cmd-F4XZGLGF.js} +3 -3
  86. package/dist/{ga-WNS7Q7TF.js → ga-S4DIQ5SZ.js} +3 -3
  87. package/dist/{gbp-5NYFK4TW.js → gbp-IYCVTLP7.js} +3 -3
  88. package/dist/{google-T4CF4WCI.js → google-FAJ5RL57.js} +4 -4
  89. package/dist/{google-marketing-IXPMUBXZ.js → google-marketing-XPE6CVQI.js} +1 -1
  90. package/dist/{health-cmd-2W37CF6J.js → health-cmd-HLAFQSU7.js} +3 -3
  91. package/dist/{history-PA3O6ZHX.js → history-U67NTFZP.js} +3 -3
  92. package/dist/index.d.ts +81 -65
  93. package/dist/index.js +25 -25
  94. package/dist/{init-I3P7FINF.js → init-UHI3D6Y2.js} +12 -12
  95. package/dist/{insights-O5PUVHTW.js → insights-FKVB3XXM.js} +3 -3
  96. package/dist/intelligence-service-G6NCD4JJ.js +16 -0
  97. package/dist/{journeys-GU34O3HE.js → journeys-P7OXKDSX.js} +3 -3
  98. package/dist/{keys-RXBFRNUS.js → keys-RJEM4M4Z.js} +3 -3
  99. package/dist/{keyword-MASR36DK.js → keyword-PLNTBFW4.js} +3 -3
  100. package/dist/{logs-OTA7MV4P.js → logs-BUTBHKGP.js} +3 -3
  101. package/dist/{mcp-ZQYN2NET.js → mcp-C4PZHJIB.js} +4 -4
  102. package/dist/mcp.js +9 -9
  103. package/dist/{measurement-plan-ZGVO36TN.js → measurement-plan-DFYESGWR.js} +5 -5
  104. package/dist/{notify-KS5CR3S2.js → notify-WYSGY4BA.js} +3 -3
  105. package/dist/{organic-evidence-CTH52AC5.js → organic-evidence-L5FPG5J3.js} +3 -3
  106. package/dist/{overview-IRCIDE5H.js → overview-RD2PEETY.js} +4 -4
  107. package/dist/{project-H5XPI5CT.js → project-IK24PHY3.js} +3 -3
  108. package/dist/{query-2R6EZG5T.js → query-PX6PMHEN.js} +3 -3
  109. package/dist/{research-OA3UQAV3.js → research-QLETOCJD.js} +3 -3
  110. package/dist/{results-export-XUXU3WMX.js → results-export-NAS2DEGI.js} +3 -3
  111. package/dist/{run-7IIOB6AS.js → run-SAPT3KF7.js} +4 -4
  112. package/dist/{schedule-DUTPZB5C.js → schedule-2HXFEEUK.js} +3 -3
  113. package/dist/{search-TWUJD7KH.js → search-UBMFZYR4.js} +3 -3
  114. package/dist/{serve-BYHHULUU.js → serve-IZ2FZ7F3.js} +26 -26
  115. package/dist/{session-M5XSTGPI.js → session-VMR37NOP.js} +13 -13
  116. package/dist/{settings-GQXU5M3H.js → settings-LQT7O7AG.js} +3 -3
  117. package/dist/{skills-F6AXQHTO.js → skills-CYHWYN42.js} +2 -2
  118. package/dist/{snapshot-QFKUO4QK.js → snapshot-ZKHJJ4YE.js} +3 -3
  119. package/dist/{src-52USCS7O.js → src-SXB3MOP3.js} +2 -2
  120. package/dist/{status-42LPR7YH.js → status-OU26EWSD.js} +7 -5
  121. package/dist/{technical-aeo-SUILL4MY.js → technical-aeo-BYFRX5TT.js} +3 -3
  122. package/dist/{telemetry-RITB7YZH.js → telemetry-FSQTXHIR.js} +4 -4
  123. package/dist/{tools-DGWJOLNS.js → tools-ZPU5O6DM.js} +11 -11
  124. package/dist/{traffic-3YC3HUNT.js → traffic-YEECHDQM.js} +5 -5
  125. package/dist/{users-BST5DQ5R.js → users-5HHP54GP.js} +3 -3
  126. package/dist/{visibility-stats-NCNP4AL2.js → visibility-stats-NYXIEPVB.js} +3 -3
  127. package/dist/{wordpress-4HQDLQVE.js → wordpress-RPQ44OM5.js} +3 -3
  128. package/package.json +1 -1
  129. package/assets/assets/AgentSetupPage-D7YVdPWO.js +0 -17
  130. package/assets/assets/ToneBadge-Df8oiKsQ.js +0 -60
  131. package/dist/intelligence-service-EJQQNO65.js +0 -16
@@ -20,10 +20,10 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-SF5JLMLG.js";
23
+ } from "./chunk-FCGYYZHL.js";
24
24
 
25
25
  // ../config/src/index.ts
26
- import { z as z4 } from "zod";
26
+ import { z as z5 } from "zod";
27
27
 
28
28
  // ../config/src/sentiment.ts
29
29
  import { z } from "zod";
@@ -84,78 +84,181 @@ var seoInstallConfigSchema = z3.object({
84
84
  }).strict()]))
85
85
  }).strict();
86
86
 
87
+ // ../config/src/mcp-gateway.ts
88
+ import { z as z4 } from "zod";
89
+ var nonempty = z4.string().trim().min(1);
90
+ var identifier = z4.string().regex(/^[a-z0-9][\w-]{0,127}$/i);
91
+ var url = z4.url().refine((value) => {
92
+ const parsed = new URL(value);
93
+ return !parsed.username && !parsed.password && !parsed.hash && !parsed.search;
94
+ }, "URLs must not contain credentials, fragments, or query strings");
95
+ var gatewayTenantSchema = z4.object({
96
+ id: identifier,
97
+ displayName: nonempty.max(200),
98
+ origin: url,
99
+ issuer: url,
100
+ resource: url,
101
+ mcpUrl: url,
102
+ enabled: z4.boolean(),
103
+ allowPrivateNetwork: z4.boolean().default(false),
104
+ protocolVersions: z4.array(nonempty).min(1),
105
+ catalogVersion: z4.literal("canonry-readonly-v1"),
106
+ upstreamClientId: nonempty.optional()
107
+ }).strict();
108
+ var clientSchema = z4.object({
109
+ client_id: identifier,
110
+ client_name: nonempty.max(200),
111
+ redirect_uris: z4.array(z4.url()).min(1),
112
+ token_endpoint_auth_method: z4.literal("none").default("none"),
113
+ grant_types: z4.array(z4.enum(["authorization_code", "refresh_token"])).default(["authorization_code", "refresh_token"]),
114
+ response_types: z4.tuple([z4.literal("code")]).default(["code"])
115
+ }).strict();
116
+ var gatewayConfigSchema = z4.object({
117
+ issuer: url,
118
+ development: z4.boolean().default(false),
119
+ host: nonempty.default("127.0.0.1"),
120
+ port: z4.number().int().min(1).max(65535).default(4101),
121
+ databasePath: nonempty,
122
+ clients: z4.array(clientSchema).min(1),
123
+ tenants: z4.array(gatewayTenantSchema).min(1),
124
+ requestTimeoutMs: z4.number().int().min(100).max(12e4).default(3e4),
125
+ trustedProxyAddresses: z4.array(z4.union([z4.ipv4(), z4.ipv6()])).default([]),
126
+ rateLimitPerMinute: z4.number().int().min(1).max(1e5).default(120),
127
+ maxBodyBytes: z4.number().int().min(1024).max(10 * 1024 * 1024).default(1024 * 1024),
128
+ domainVerificationToken: z4.string().regex(/^[\w-]{1,1024}$/).optional()
129
+ }).strict().superRefine((config, ctx) => {
130
+ const checkTransport = (value, path2) => {
131
+ const parsed = new URL(value);
132
+ const loopback = ["localhost", "127.0.0.1", "[::1]"].includes(parsed.hostname);
133
+ if (parsed.protocol !== "https:" && !(config.development && loopback && parsed.protocol === "http:")) {
134
+ ctx.addIssue({ code: "custom", path: path2, message: "HTTPS is required except explicit development on loopback" });
135
+ }
136
+ };
137
+ checkTransport(config.issuer, ["issuer"]);
138
+ const issuer = new URL(config.issuer);
139
+ if (issuer.pathname !== "/" || config.issuer.endsWith("/")) {
140
+ ctx.addIssue({ code: "custom", path: ["issuer"], message: "Gateway issuer must be an origin without a trailing slash" });
141
+ }
142
+ if (!config.development && config.databasePath === ":memory:") {
143
+ ctx.addIssue({ code: "custom", path: ["databasePath"], message: "Production requires a durable database path" });
144
+ }
145
+ const tenantIds = /* @__PURE__ */ new Set();
146
+ config.tenants.forEach((tenant, index) => {
147
+ if (tenantIds.has(tenant.id)) ctx.addIssue({ code: "custom", path: ["tenants", index, "id"], message: "Tenant IDs must be unique" });
148
+ tenantIds.add(tenant.id);
149
+ if (new URL(tenant.origin).origin !== tenant.origin) {
150
+ ctx.addIssue({ code: "custom", path: ["tenants", index, "origin"], message: "Tenant origin must be an origin without a path or trailing slash" });
151
+ }
152
+ for (const field of ["origin", "issuer", "resource", "mcpUrl"]) {
153
+ checkTransport(tenant[field], ["tenants", index, field]);
154
+ if (new URL(tenant[field]).origin !== tenant.origin) {
155
+ ctx.addIssue({ code: "custom", path: ["tenants", index, field], message: "Tenant endpoints must belong to the provisioned origin" });
156
+ }
157
+ }
158
+ if (!new URL(tenant.mcpUrl).pathname.endsWith("/api/v1/mcp/readonly")) {
159
+ ctx.addIssue({ code: "custom", path: ["tenants", index, "mcpUrl"], message: "Only the Canonry read-only MCP endpoint is permitted" });
160
+ }
161
+ if (!new URL(tenant.resource).pathname.endsWith("/api/v1/mcp")) {
162
+ ctx.addIssue({ code: "custom", path: ["tenants", index, "resource"], message: "Canonical MCP resource must end in /api/v1/mcp" });
163
+ }
164
+ });
165
+ const clientIds = /* @__PURE__ */ new Set();
166
+ config.clients.forEach((client, index) => {
167
+ if (clientIds.has(client.client_id)) ctx.addIssue({ code: "custom", path: ["clients", index, "client_id"], message: "Client IDs must be unique" });
168
+ clientIds.add(client.client_id);
169
+ client.redirect_uris.forEach((redirect, redirectIndex) => {
170
+ checkTransport(redirect, ["clients", index, "redirect_uris", redirectIndex]);
171
+ const parsed = new URL(redirect);
172
+ if (parsed.username || parsed.password || parsed.hash) {
173
+ ctx.addIssue({ code: "custom", path: ["clients", index, "redirect_uris", redirectIndex], message: "Redirects cannot contain credentials or fragments" });
174
+ }
175
+ });
176
+ });
177
+ });
178
+
87
179
  // ../config/src/index.ts
88
- var dashboardManagedSweepsSchema = z4.boolean().nullish();
89
- var researchAllowViewersSchema = z4.boolean().nullish();
90
- var agentAllowViewersSchema = z4.boolean().nullish();
180
+ var dashboardManagedSweepsSchema = z5.boolean().nullish();
181
+ var researchAllowViewersSchema = z5.boolean().nullish();
182
+ var agentAllowViewersSchema = z5.boolean().nullish();
91
183
  var AGENT_REASONING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
92
- var agentReasoningSchema = z4.enum(AGENT_REASONING_LEVELS).nullish();
93
- var researchViewerDailyRunLimitSchema = z4.number().int().positive().nullish();
94
- var dashboardManagedRunKindsSchema = z4.array(schedulableRunKindSchema).nullish();
184
+ var agentReasoningSchema = z5.enum(AGENT_REASONING_LEVELS).nullish();
185
+ var researchViewerDailyRunLimitSchema = z5.number().int().positive().nullish();
186
+ var dashboardManagedRunKindsSchema = z5.array(schedulableRunKindSchema).nullish();
95
187
  var agentProviderSchema = agentProviderIdSchema.nullish();
96
- var agentModelSchema = z4.string().trim().min(1).nullish();
188
+ var agentModelSchema = z5.string().trim().min(1).nullish();
189
+ var mcpGatewayConfigSchema = z5.object({
190
+ url: z5.url().refine((value) => {
191
+ try {
192
+ const parsed = new URL(value);
193
+ return parsed.protocol === "https:" && !parsed.username && !parsed.password && !parsed.search && !parsed.hash;
194
+ } catch {
195
+ return false;
196
+ }
197
+ }),
198
+ workspace: z5.string().trim().min(1).max(253).nullish()
199
+ }).strict().nullish();
97
200
  function resolveOperatorApiKeyIds(source) {
98
201
  const raw = source.CANONRY_OPERATOR_KEY_IDS?.trim();
99
202
  if (!raw) return [];
100
- const parsed = z4.array(z4.string().regex(/^[\w-]{1,256}$/)).max(100).safeParse(raw.split(",").map((id) => id.trim()));
203
+ const parsed = z5.array(z5.string().regex(/^[\w-]{1,256}$/)).max(100).safeParse(raw.split(",").map((id) => id.trim()));
101
204
  if (!parsed.success) throw new Error("CANONRY_OPERATOR_KEY_IDS must contain at most 100 comma-separated API key IDs (letters, digits, underscores, hyphens; no wildcards).");
102
205
  return [...new Set(parsed.data)];
103
206
  }
104
- var envSchema = z4.object({
105
- DATABASE_URL: z4.string().default("postgresql://aeo:aeo@postgres:5432/aeo_platform"),
106
- API_PORT: z4.coerce.number().int().positive().default(3e3),
107
- WORKER_PORT: z4.coerce.number().int().positive().default(3001),
108
- WEB_PORT: z4.coerce.number().int().positive().default(4173),
109
- BOOTSTRAP_SECRET: z4.string().default("change-me"),
110
- CANONRY_BASE_PATH: z4.string().default("/"),
207
+ var envSchema = z5.object({
208
+ DATABASE_URL: z5.string().default("postgresql://aeo:aeo@postgres:5432/aeo_platform"),
209
+ API_PORT: z5.coerce.number().int().positive().default(3e3),
210
+ WORKER_PORT: z5.coerce.number().int().positive().default(3001),
211
+ WEB_PORT: z5.coerce.number().int().positive().default(4173),
212
+ BOOTSTRAP_SECRET: z5.string().default("change-me"),
213
+ CANONRY_BASE_PATH: z5.string().default("/"),
111
214
  // Gemini
112
- GEMINI_API_KEY: z4.string().optional(),
113
- GEMINI_MODEL: z4.string().optional(),
114
- GEMINI_BASE_URL: z4.string().optional(),
115
- GEMINI_MAX_CONCURRENCY: z4.coerce.number().int().positive().default(2),
116
- GEMINI_MAX_REQUESTS_PER_MINUTE: z4.coerce.number().int().positive().default(10),
117
- GEMINI_MAX_REQUESTS_PER_DAY: z4.coerce.number().int().positive().default(1e3),
215
+ GEMINI_API_KEY: z5.string().optional(),
216
+ GEMINI_MODEL: z5.string().optional(),
217
+ GEMINI_BASE_URL: z5.string().optional(),
218
+ GEMINI_MAX_CONCURRENCY: z5.coerce.number().int().positive().default(2),
219
+ GEMINI_MAX_REQUESTS_PER_MINUTE: z5.coerce.number().int().positive().default(10),
220
+ GEMINI_MAX_REQUESTS_PER_DAY: z5.coerce.number().int().positive().default(1e3),
118
221
  // Gemini Vertex AI (alternative to API key auth)
119
- GEMINI_VERTEX_PROJECT: z4.string().optional(),
120
- GEMINI_VERTEX_REGION: z4.string().optional(),
121
- GEMINI_VERTEX_CREDENTIALS: z4.string().optional(),
222
+ GEMINI_VERTEX_PROJECT: z5.string().optional(),
223
+ GEMINI_VERTEX_REGION: z5.string().optional(),
224
+ GEMINI_VERTEX_CREDENTIALS: z5.string().optional(),
122
225
  // OpenAI
123
- OPENAI_API_KEY: z4.string().optional(),
124
- OPENAI_MODEL: z4.string().optional(),
125
- OPENAI_BASE_URL: z4.string().optional(),
126
- OPENAI_MAX_CONCURRENCY: z4.coerce.number().int().positive().default(2),
127
- OPENAI_MAX_REQUESTS_PER_MINUTE: z4.coerce.number().int().positive().default(10),
128
- OPENAI_MAX_REQUESTS_PER_DAY: z4.coerce.number().int().positive().default(1e3),
129
- OPENROUTER_API_KEY: z4.string().optional(),
130
- OPENROUTER_MODEL: z4.string().optional(),
131
- OPENROUTER_MAX_CONCURRENCY: z4.coerce.number().int().positive().default(2),
132
- OPENROUTER_MAX_REQUESTS_PER_MINUTE: z4.coerce.number().int().positive().default(10),
133
- OPENROUTER_MAX_REQUESTS_PER_DAY: z4.coerce.number().int().positive().default(1e3),
226
+ OPENAI_API_KEY: z5.string().optional(),
227
+ OPENAI_MODEL: z5.string().optional(),
228
+ OPENAI_BASE_URL: z5.string().optional(),
229
+ OPENAI_MAX_CONCURRENCY: z5.coerce.number().int().positive().default(2),
230
+ OPENAI_MAX_REQUESTS_PER_MINUTE: z5.coerce.number().int().positive().default(10),
231
+ OPENAI_MAX_REQUESTS_PER_DAY: z5.coerce.number().int().positive().default(1e3),
232
+ OPENROUTER_API_KEY: z5.string().optional(),
233
+ OPENROUTER_MODEL: z5.string().optional(),
234
+ OPENROUTER_MAX_CONCURRENCY: z5.coerce.number().int().positive().default(2),
235
+ OPENROUTER_MAX_REQUESTS_PER_MINUTE: z5.coerce.number().int().positive().default(10),
236
+ OPENROUTER_MAX_REQUESTS_PER_DAY: z5.coerce.number().int().positive().default(1e3),
134
237
  // Anthropic / Claude
135
- ANTHROPIC_API_KEY: z4.string().optional(),
136
- ANTHROPIC_MODEL: z4.string().optional(),
137
- ANTHROPIC_MAX_CONCURRENCY: z4.coerce.number().int().positive().default(2),
138
- ANTHROPIC_MAX_REQUESTS_PER_MINUTE: z4.coerce.number().int().positive().default(10),
139
- ANTHROPIC_MAX_REQUESTS_PER_DAY: z4.coerce.number().int().positive().default(1e3),
238
+ ANTHROPIC_API_KEY: z5.string().optional(),
239
+ ANTHROPIC_MODEL: z5.string().optional(),
240
+ ANTHROPIC_MAX_CONCURRENCY: z5.coerce.number().int().positive().default(2),
241
+ ANTHROPIC_MAX_REQUESTS_PER_MINUTE: z5.coerce.number().int().positive().default(10),
242
+ ANTHROPIC_MAX_REQUESTS_PER_DAY: z5.coerce.number().int().positive().default(1e3),
140
243
  // Perplexity
141
- PERPLEXITY_API_KEY: z4.string().optional(),
142
- PERPLEXITY_MODEL: z4.string().optional(),
143
- PERPLEXITY_MAX_CONCURRENCY: z4.coerce.number().int().positive().default(2),
144
- PERPLEXITY_MAX_REQUESTS_PER_MINUTE: z4.coerce.number().int().positive().default(10),
145
- PERPLEXITY_MAX_REQUESTS_PER_DAY: z4.coerce.number().int().positive().default(1e3),
244
+ PERPLEXITY_API_KEY: z5.string().optional(),
245
+ PERPLEXITY_MODEL: z5.string().optional(),
246
+ PERPLEXITY_MAX_CONCURRENCY: z5.coerce.number().int().positive().default(2),
247
+ PERPLEXITY_MAX_REQUESTS_PER_MINUTE: z5.coerce.number().int().positive().default(10),
248
+ PERPLEXITY_MAX_REQUESTS_PER_DAY: z5.coerce.number().int().positive().default(1e3),
146
249
  // Meta Muse
147
- MUSE_API_KEY: z4.string().optional(),
148
- MUSE_MODEL: z4.string().optional(),
149
- MUSE_BASE_URL: z4.string().optional(),
150
- MUSE_MAX_CONCURRENCY: z4.coerce.number().int().positive().default(2),
151
- MUSE_MAX_REQUESTS_PER_MINUTE: z4.coerce.number().int().positive().default(10),
152
- MUSE_MAX_REQUESTS_PER_DAY: z4.coerce.number().int().positive().default(1e3),
250
+ MUSE_API_KEY: z5.string().optional(),
251
+ MUSE_MODEL: z5.string().optional(),
252
+ MUSE_BASE_URL: z5.string().optional(),
253
+ MUSE_MAX_CONCURRENCY: z5.coerce.number().int().positive().default(2),
254
+ MUSE_MAX_REQUESTS_PER_MINUTE: z5.coerce.number().int().positive().default(10),
255
+ MUSE_MAX_REQUESTS_PER_DAY: z5.coerce.number().int().positive().default(1e3),
153
256
  // Secret for HMAC-signing Google OAuth state parameters. Required for
154
257
  // cloud deployments that mount googleRoutes; the plugin refuses to register
155
258
  // without it (see packages/api-routes/src/google.ts).
156
- GOOGLE_STATE_SECRET: z4.string().optional(),
157
- CANONRY_RESEARCH_ALLOW_VIEWERS: z4.string().optional(),
158
- CANONRY_RESEARCH_VIEWER_DAILY_RUN_LIMIT: z4.coerce.number().int().positive().default(DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT)
259
+ GOOGLE_STATE_SECRET: z5.string().optional(),
260
+ CANONRY_RESEARCH_ALLOW_VIEWERS: z5.string().optional(),
261
+ CANONRY_RESEARCH_VIEWER_DAILY_RUN_LIMIT: z5.coerce.number().int().positive().default(DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT)
159
262
  });
160
263
  var BOOTSTRAP_PROVIDER_DEFAULT_MODELS = {
161
264
  gemini: "gemini-flash-latest",
@@ -178,33 +281,33 @@ function withBootstrapProviderDefaults(name, entry) {
178
281
  quota: entry.quota ?? { ...BOOTSTRAP_PROVIDER_DEFAULT_QUOTA }
179
282
  };
180
283
  }
181
- var bootstrapEnvSchema = z4.object({
182
- CANONRY_API_KEY: z4.string().optional(),
183
- CANONRY_API_URL: z4.string().optional(),
184
- CANONRY_DATABASE_PATH: z4.string().optional(),
185
- GEMINI_API_KEY: z4.string().optional(),
186
- GEMINI_MODEL: z4.string().optional(),
187
- GEMINI_BASE_URL: z4.string().optional(),
188
- GEMINI_VERTEX_PROJECT: z4.string().optional(),
189
- GEMINI_VERTEX_REGION: z4.string().optional(),
190
- GEMINI_VERTEX_CREDENTIALS: z4.string().optional(),
191
- OPENAI_API_KEY: z4.string().optional(),
192
- OPENAI_MODEL: z4.string().optional(),
193
- OPENAI_BASE_URL: z4.string().optional(),
194
- OPENROUTER_API_KEY: z4.string().optional(),
195
- OPENROUTER_MODEL: z4.string().optional(),
196
- ANTHROPIC_API_KEY: z4.string().optional(),
197
- ANTHROPIC_MODEL: z4.string().optional(),
198
- PERPLEXITY_API_KEY: z4.string().optional(),
199
- PERPLEXITY_MODEL: z4.string().optional(),
200
- MUSE_API_KEY: z4.string().optional(),
201
- MUSE_MODEL: z4.string().optional(),
202
- MUSE_BASE_URL: z4.string().optional(),
203
- LOCAL_BASE_URL: z4.string().optional(),
204
- LOCAL_API_KEY: z4.string().optional(),
205
- LOCAL_MODEL: z4.string().optional(),
206
- GOOGLE_CLIENT_ID: z4.string().optional(),
207
- GOOGLE_CLIENT_SECRET: z4.string().optional()
284
+ var bootstrapEnvSchema = z5.object({
285
+ CANONRY_API_KEY: z5.string().optional(),
286
+ CANONRY_API_URL: z5.string().optional(),
287
+ CANONRY_DATABASE_PATH: z5.string().optional(),
288
+ GEMINI_API_KEY: z5.string().optional(),
289
+ GEMINI_MODEL: z5.string().optional(),
290
+ GEMINI_BASE_URL: z5.string().optional(),
291
+ GEMINI_VERTEX_PROJECT: z5.string().optional(),
292
+ GEMINI_VERTEX_REGION: z5.string().optional(),
293
+ GEMINI_VERTEX_CREDENTIALS: z5.string().optional(),
294
+ OPENAI_API_KEY: z5.string().optional(),
295
+ OPENAI_MODEL: z5.string().optional(),
296
+ OPENAI_BASE_URL: z5.string().optional(),
297
+ OPENROUTER_API_KEY: z5.string().optional(),
298
+ OPENROUTER_MODEL: z5.string().optional(),
299
+ ANTHROPIC_API_KEY: z5.string().optional(),
300
+ ANTHROPIC_MODEL: z5.string().optional(),
301
+ PERPLEXITY_API_KEY: z5.string().optional(),
302
+ PERPLEXITY_MODEL: z5.string().optional(),
303
+ MUSE_API_KEY: z5.string().optional(),
304
+ MUSE_MODEL: z5.string().optional(),
305
+ MUSE_BASE_URL: z5.string().optional(),
306
+ LOCAL_BASE_URL: z5.string().optional(),
307
+ LOCAL_API_KEY: z5.string().optional(),
308
+ LOCAL_MODEL: z5.string().optional(),
309
+ GOOGLE_CLIENT_ID: z5.string().optional(),
310
+ GOOGLE_CLIENT_SECRET: z5.string().optional()
208
311
  });
209
312
  function getBootstrapEnv(source, overrides) {
210
313
  const filtered = overrides ? Object.fromEntries(Object.entries(overrides).filter(([, v]) => v != null)) : {};
@@ -922,6 +1025,12 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
922
1025
  if (parsed.seo !== void 0 && !seoInstallConfigSchema.safeParse(parsed.seo).success) {
923
1026
  throw new CliError({ code: "CONFIG_INVALID", message: `Invalid config at ${configPath}: seo requires an explicit funding mode, positive integer budget caps, and connection credentials.` });
924
1027
  }
1028
+ if (!mcpGatewayConfigSchema.safeParse(parsed.mcpGateway).success) {
1029
+ throw new CliError({
1030
+ code: "CONFIG_INVALID",
1031
+ message: `Invalid config at ${configPath}: mcpGateway needs an HTTPS url without credentials, query or fragment, and an optional non-empty workspace.`
1032
+ });
1033
+ }
925
1034
  if (!dashboardManagedSweepsSchema.safeParse(parsed.dashboard?.managedSweeps).success) {
926
1035
  throw new CliError({
927
1036
  code: "CONFIG_INVALID",
@@ -1013,9 +1122,9 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
1013
1122
  const portOverride = process.env.CANONRY_PORT?.trim();
1014
1123
  if (portOverride) {
1015
1124
  try {
1016
- const url = new URL(parsed.apiUrl);
1017
- url.port = portOverride;
1018
- parsed.apiUrl = url.origin;
1125
+ const url2 = new URL(parsed.apiUrl);
1126
+ url2.port = portOverride;
1127
+ parsed.apiUrl = url2.origin;
1019
1128
  } catch {
1020
1129
  }
1021
1130
  }
@@ -1026,9 +1135,9 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
1026
1135
  if (parsed.basePath) {
1027
1136
  const normalizedBase = "/" + parsed.basePath.replace(/^\/|\/$/g, "");
1028
1137
  try {
1029
- const url = new URL(parsed.apiUrl);
1030
- if (normalizedBase !== "/" && !url.pathname.startsWith(normalizedBase)) {
1031
- parsed.apiUrl = url.origin + normalizedBase;
1138
+ const url2 = new URL(parsed.apiUrl);
1139
+ if (normalizedBase !== "/" && !url2.pathname.startsWith(normalizedBase)) {
1140
+ parsed.apiUrl = url2.origin + normalizedBase;
1032
1141
  }
1033
1142
  } catch {
1034
1143
  }
@@ -1053,11 +1162,11 @@ function parseExternalMcpEnv(raw) {
1053
1162
  for (const entry of value) {
1054
1163
  if (!entry || typeof entry !== "object") continue;
1055
1164
  const candidate = entry;
1056
- const url = typeof candidate.url === "string" ? candidate.url.trim() : "";
1165
+ const url2 = typeof candidate.url === "string" ? candidate.url.trim() : "";
1057
1166
  const token = typeof candidate.token === "string" ? candidate.token : "";
1058
- if (!url || !token) continue;
1167
+ if (!url2 || !token) continue;
1059
1168
  const label = typeof candidate.label === "string" ? candidate.label : void 0;
1060
- servers.push({ url, token, ...label ? { label } : {} });
1169
+ servers.push({ url: url2, token, ...label ? { label } : {} });
1061
1170
  }
1062
1171
  return servers.length > 0 ? servers : void 0;
1063
1172
  }
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-PRSQ4R47.js";
5
+ } from "./chunk-W5GZENMO.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-HKV4UWG5.js";
8
+ } from "./chunk-5SVPFDUM.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-GWDMWKM6.js";
11
+ } from "./chunk-JPOIDGGF.js";
12
12
  import {
13
13
  AGENT_NONE,
14
14
  OutcomeSurfaces,
@@ -19,7 +19,7 @@ import {
19
19
  integrationConnectionPropertiesSchema,
20
20
  normalizeAgentSlug,
21
21
  usageSurfaceSchema
22
- } from "./chunk-SF5JLMLG.js";
22
+ } from "./chunk-FCGYYZHL.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -15,7 +15,7 @@ import {
15
15
  formatCanonryPluginUpdateHint,
16
16
  formatCanonryPluginVersionMismatch,
17
17
  skillsClientSchema
18
- } from "./chunk-SF5JLMLG.js";
18
+ } from "./chunk-FCGYYZHL.js";
19
19
 
20
20
  // src/commands/skills.ts
21
21
  import crypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseJsonColumn
3
- } from "./chunk-PAIYFNNY.js";
3
+ } from "./chunk-D5XPB7MM.js";
4
4
  import {
5
5
  AI_ENGINE_DOMAINS,
6
6
  AI_ENGINE_SELF_DOMAINS,
@@ -26,7 +26,7 @@ import {
26
26
  retryAfterDelayMs,
27
27
  usageCount,
28
28
  withRetry
29
- } from "./chunk-SF5JLMLG.js";
29
+ } from "./chunk-FCGYYZHL.js";
30
30
 
31
31
  // ../provider-openai/src/normalize.ts
32
32
  import OpenAI from "openai";