@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.
- package/assets/assets/AgentSetupPage-Dy9_auot.js +18 -0
- package/assets/assets/{AuditHistoryPanel-yrgfS5B_.js → AuditHistoryPanel-BVTD5aDT.js} +1 -1
- package/assets/assets/{BacklinksPage-DJM6z03g.js → BacklinksPage-B3UasiLF.js} +1 -1
- package/assets/assets/{HistoryPage-CNvAVJ1S.js → HistoryPage-BeKtZ449.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BVVYhOxR.js → MeasurementPropertyPage-Cm-jzeY8.js} +1 -1
- package/assets/assets/{ProjectPage-CPRD8kR9.js → ProjectPage-C3iapgWm.js} +1 -1
- package/assets/assets/{RunsPage-Ck33dcjz.js → RunsPage-bRhgxSV_.js} +1 -1
- package/assets/assets/{SettingsPage-CS_t4Dai.js → SettingsPage-fPEwb0Fh.js} +1 -1
- package/assets/assets/{SiteHealthSection-BurKnHpn.js → SiteHealthSection-Bk4zrPnb.js} +2 -2
- package/assets/assets/ToneBadge-DfEkyFHe.js +60 -0
- package/assets/assets/{TrafficPage-DAiY698E.js → TrafficPage-CzdZa-dz.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-clJSX2rr.js → TrafficSourceDetailPage-B-7STzgQ.js} +1 -1
- package/assets/assets/{account-context-DDEhuoP2.js → account-context-C0wMdIfs.js} +1 -1
- package/assets/assets/{card-DbR-lBY3.js → card-CdfP76v-.js} +1 -1
- package/assets/assets/{extract-error-message-7_Vm2DQF.js → extract-error-message-D36I9Bna.js} +1 -1
- package/assets/assets/{format-helpers-vtahpXTQ.js → format-helpers-Ja8nzHvN.js} +1 -1
- package/assets/assets/{index-BIhCeXvc.js → index-BWMizh5y.js} +4 -4
- package/assets/assets/{query-client-TlFXYJ9o.js → query-client-jOrIVlKd.js} +1 -1
- package/assets/assets/{react-query-C5Mv8xfD.js → react-query-BrM5m2wm.js} +1 -1
- package/assets/assets/{react-sigma_core.esm.min-DmggJ7YC.js → react-sigma_core.esm.min-D2wEGI_h.js} +1 -1
- package/assets/assets/{service-CLFURPuM.js → service-jrrtReGW.js} +1 -1
- package/assets/index.html +7 -7
- package/dist/{ads-TX5622SS.js → ads-IVD2KC7R.js} +3 -3
- package/dist/{agent-AIOQL66U.js → agent-FTNZ4DVP.js} +7 -7
- package/dist/{agent-ask-A6GIJTBX.js → agent-ask-N3LMHW2E.js} +3 -3
- package/dist/{agent-conversations-LHWLKOPQ.js → agent-conversations-Y2GSGKRO.js} +3 -3
- package/dist/{agent-memory-F54BPEYN.js → agent-memory-K36FD3LU.js} +3 -3
- package/dist/{agent-providers-L74KZOSG.js → agent-providers-ZIAJAJD6.js} +3 -3
- package/dist/{agent-transcript-IH65H755.js → agent-transcript-Q4AGCHLB.js} +3 -3
- package/dist/{analytics-YWCY2KSY.js → analytics-URO2WOTD.js} +3 -3
- package/dist/{apply-BLUUYG2N.js → apply-M4RFPVRN.js} +3 -3
- package/dist/{backfill-6WO5CH6Z.js → backfill-EYFE2OGC.js} +9 -9
- package/dist/{backlinks-NC7AUGTK.js → backlinks-GR7XW4DH.js} +3 -3
- package/dist/{bing-WQUEYHVC.js → bing-A4Q5V3DT.js} +3 -3
- package/dist/{bootstrap-AXZV4BBC.js → bootstrap-OGYIIZXE.js} +10 -10
- package/dist/{cdp-DUG5PMUD.js → cdp-5WSH26OU.js} +7 -7
- package/dist/{chunk-HJHFW455.js → chunk-2BDWXHYF.js} +3 -3
- package/dist/{chunk-DLVGMRM5.js → chunk-2WBT6TEJ.js} +1 -1
- package/dist/{chunk-JQNVNB63.js → chunk-3TCCNK2T.js} +3 -3
- package/dist/{chunk-6YW24AUN.js → chunk-46KV7CZU.js} +2 -2
- package/dist/{chunk-4JMTDLFV.js → chunk-4LR2SXYB.js} +2 -2
- package/dist/{chunk-3WPTMLQI.js → chunk-4QHTXT4A.js} +3 -3
- package/dist/{chunk-MRSNLKSM.js → chunk-5QR7D4RQ.js} +1 -1
- package/dist/{chunk-HKV4UWG5.js → chunk-5SVPFDUM.js} +201 -92
- package/dist/{chunk-S77W2XSI.js → chunk-7J7E2F3M.js} +4 -4
- package/dist/{chunk-HEL6DKDN.js → chunk-7UVCZZQJ.js} +1 -1
- package/dist/{chunk-6ATKY252.js → chunk-C3UFOS7J.js} +2 -2
- package/dist/{chunk-3ANSG6YT.js → chunk-CYXUQNIQ.js} +335 -335
- package/dist/{chunk-PAIYFNNY.js → chunk-D5XPB7MM.js} +1 -1
- package/dist/{chunk-GUFKUPKZ.js → chunk-E6NE3FJC.js} +3 -3
- package/dist/{chunk-SF5JLMLG.js → chunk-FCGYYZHL.js} +5 -1
- package/dist/{chunk-HIGBV77K.js → chunk-GD3L63V5.js} +36 -23
- package/dist/{chunk-GWDMWKM6.js → chunk-JPOIDGGF.js} +1 -1
- package/dist/{chunk-2Y6MSB4J.js → chunk-JSCO223C.js} +1 -1
- package/dist/{chunk-GNBATQS3.js → chunk-KF76GJ7L.js} +6 -6
- package/dist/{chunk-HGMTGC34.js → chunk-LBFWNA4V.js} +4 -4
- package/dist/{chunk-WLWOGBLJ.js → chunk-M7OLPSCA.js} +4 -4
- package/dist/{chunk-WH2M2MQF.js → chunk-MJGY7NBK.js} +2 -2
- package/dist/{chunk-F5D4GPZQ.js → chunk-NKNA2DSS.js} +3 -3
- package/dist/{chunk-5PA7SJ2M.js → chunk-OF6UW77Y.js} +5 -5
- package/dist/{chunk-XDQJOZKJ.js → chunk-PSNTEGNY.js} +1 -1
- package/dist/{chunk-3YIKSZHN.js → chunk-RPJJOBKN.js} +1 -1
- package/dist/{chunk-4B6DE7BB.js → chunk-RZVZONVL.js} +2 -2
- package/dist/{chunk-QS6RIP37.js → chunk-TESDUMVK.js} +1 -1
- package/dist/{chunk-B6R223HQ.js → chunk-TRAD6XS4.js} +8 -8
- package/dist/{chunk-T5PWWDMJ.js → chunk-U5UXQV57.js} +2 -2
- package/dist/{chunk-PRSQ4R47.js → chunk-W5GZENMO.js} +2 -2
- package/dist/{chunk-ETVM3T7K.js → chunk-WWZ6RZJ5.js} +4 -4
- package/dist/{chunk-JPM3VC6A.js → chunk-XYYWKCJQ.js} +1 -1
- package/dist/{chunk-AZQNJX3T.js → chunk-Z2FY6AGZ.js} +2 -2
- package/dist/{chunk-6W5AR4IW.js → chunk-ZXYCPRNY.js} +1 -1
- package/dist/{citations-FUZ6DGP5.js → citations-K44GWHAZ.js} +3 -3
- package/dist/{cli-catalog-BXHG544D.js → cli-catalog-ZVFLJXID.js} +3 -3
- package/dist/{cli-commands-GMOR67F5.js → cli-commands-RQTNKS2T.js} +7 -7
- package/dist/cli.js +13 -13
- package/dist/{competitor-QDCH7PLT.js → competitor-MHYOHVOJ.js} +3 -3
- package/dist/{content-JX2CPIPR.js → content-AWDA3GYL.js} +3 -3
- package/dist/{dashboard-OOWMLMKV.js → dashboard-P2ODMTQG.js} +6 -6
- package/dist/{demo-GKSMSKOY.js → demo-FSRCJINC.js} +1 -1
- package/dist/{demo-server-UQO4XKHN.js → demo-server-ROGIRBAR.js} +12 -12
- package/dist/{discover-YQSVQRUV.js → discover-I2SVIHRG.js} +3 -3
- package/dist/{discover-eval-FN5RL6QI.js → discover-eval-VV2AKXCV.js} +3 -3
- package/dist/{doctor-YHJLAEJJ.js → doctor-25I3JSKE.js} +3 -3
- package/dist/{evidence-KUPZMBIK.js → evidence-PNYKUX2F.js} +3 -3
- package/dist/{export-cmd-YSEPTUUF.js → export-cmd-F4XZGLGF.js} +3 -3
- package/dist/{ga-WNS7Q7TF.js → ga-S4DIQ5SZ.js} +3 -3
- package/dist/{gbp-5NYFK4TW.js → gbp-IYCVTLP7.js} +3 -3
- package/dist/{google-T4CF4WCI.js → google-FAJ5RL57.js} +4 -4
- package/dist/{google-marketing-IXPMUBXZ.js → google-marketing-XPE6CVQI.js} +1 -1
- package/dist/{health-cmd-2W37CF6J.js → health-cmd-HLAFQSU7.js} +3 -3
- package/dist/{history-PA3O6ZHX.js → history-U67NTFZP.js} +3 -3
- package/dist/index.d.ts +81 -65
- package/dist/index.js +25 -25
- package/dist/{init-I3P7FINF.js → init-UHI3D6Y2.js} +12 -12
- package/dist/{insights-O5PUVHTW.js → insights-FKVB3XXM.js} +3 -3
- package/dist/intelligence-service-G6NCD4JJ.js +16 -0
- package/dist/{journeys-GU34O3HE.js → journeys-P7OXKDSX.js} +3 -3
- package/dist/{keys-RXBFRNUS.js → keys-RJEM4M4Z.js} +3 -3
- package/dist/{keyword-MASR36DK.js → keyword-PLNTBFW4.js} +3 -3
- package/dist/{logs-OTA7MV4P.js → logs-BUTBHKGP.js} +3 -3
- package/dist/{mcp-ZQYN2NET.js → mcp-C4PZHJIB.js} +4 -4
- package/dist/mcp.js +9 -9
- package/dist/{measurement-plan-ZGVO36TN.js → measurement-plan-DFYESGWR.js} +5 -5
- package/dist/{notify-KS5CR3S2.js → notify-WYSGY4BA.js} +3 -3
- package/dist/{organic-evidence-CTH52AC5.js → organic-evidence-L5FPG5J3.js} +3 -3
- package/dist/{overview-IRCIDE5H.js → overview-RD2PEETY.js} +4 -4
- package/dist/{project-H5XPI5CT.js → project-IK24PHY3.js} +3 -3
- package/dist/{query-2R6EZG5T.js → query-PX6PMHEN.js} +3 -3
- package/dist/{research-OA3UQAV3.js → research-QLETOCJD.js} +3 -3
- package/dist/{results-export-XUXU3WMX.js → results-export-NAS2DEGI.js} +3 -3
- package/dist/{run-7IIOB6AS.js → run-SAPT3KF7.js} +4 -4
- package/dist/{schedule-DUTPZB5C.js → schedule-2HXFEEUK.js} +3 -3
- package/dist/{search-TWUJD7KH.js → search-UBMFZYR4.js} +3 -3
- package/dist/{serve-BYHHULUU.js → serve-IZ2FZ7F3.js} +26 -26
- package/dist/{session-M5XSTGPI.js → session-VMR37NOP.js} +13 -13
- package/dist/{settings-GQXU5M3H.js → settings-LQT7O7AG.js} +3 -3
- package/dist/{skills-F6AXQHTO.js → skills-CYHWYN42.js} +2 -2
- package/dist/{snapshot-QFKUO4QK.js → snapshot-ZKHJJ4YE.js} +3 -3
- package/dist/{src-52USCS7O.js → src-SXB3MOP3.js} +2 -2
- package/dist/{status-42LPR7YH.js → status-OU26EWSD.js} +7 -5
- package/dist/{technical-aeo-SUILL4MY.js → technical-aeo-BYFRX5TT.js} +3 -3
- package/dist/{telemetry-RITB7YZH.js → telemetry-FSQTXHIR.js} +4 -4
- package/dist/{tools-DGWJOLNS.js → tools-ZPU5O6DM.js} +11 -11
- package/dist/{traffic-3YC3HUNT.js → traffic-YEECHDQM.js} +5 -5
- package/dist/{users-BST5DQ5R.js → users-5HHP54GP.js} +3 -3
- package/dist/{visibility-stats-NCNP4AL2.js → visibility-stats-NYXIEPVB.js} +3 -3
- package/dist/{wordpress-4HQDLQVE.js → wordpress-RPQ44OM5.js} +3 -3
- package/package.json +1 -1
- package/assets/assets/AgentSetupPage-D7YVdPWO.js +0 -17
- package/assets/assets/ToneBadge-Df8oiKsQ.js +0 -60
- 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-
|
|
23
|
+
} from "./chunk-FCGYYZHL.js";
|
|
24
24
|
|
|
25
25
|
// ../config/src/index.ts
|
|
26
|
-
import { z as
|
|
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 =
|
|
89
|
-
var researchAllowViewersSchema =
|
|
90
|
-
var agentAllowViewersSchema =
|
|
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 =
|
|
93
|
-
var researchViewerDailyRunLimitSchema =
|
|
94
|
-
var dashboardManagedRunKindsSchema =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
105
|
-
DATABASE_URL:
|
|
106
|
-
API_PORT:
|
|
107
|
-
WORKER_PORT:
|
|
108
|
-
WEB_PORT:
|
|
109
|
-
BOOTSTRAP_SECRET:
|
|
110
|
-
CANONRY_BASE_PATH:
|
|
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:
|
|
113
|
-
GEMINI_MODEL:
|
|
114
|
-
GEMINI_BASE_URL:
|
|
115
|
-
GEMINI_MAX_CONCURRENCY:
|
|
116
|
-
GEMINI_MAX_REQUESTS_PER_MINUTE:
|
|
117
|
-
GEMINI_MAX_REQUESTS_PER_DAY:
|
|
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:
|
|
120
|
-
GEMINI_VERTEX_REGION:
|
|
121
|
-
GEMINI_VERTEX_CREDENTIALS:
|
|
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:
|
|
124
|
-
OPENAI_MODEL:
|
|
125
|
-
OPENAI_BASE_URL:
|
|
126
|
-
OPENAI_MAX_CONCURRENCY:
|
|
127
|
-
OPENAI_MAX_REQUESTS_PER_MINUTE:
|
|
128
|
-
OPENAI_MAX_REQUESTS_PER_DAY:
|
|
129
|
-
OPENROUTER_API_KEY:
|
|
130
|
-
OPENROUTER_MODEL:
|
|
131
|
-
OPENROUTER_MAX_CONCURRENCY:
|
|
132
|
-
OPENROUTER_MAX_REQUESTS_PER_MINUTE:
|
|
133
|
-
OPENROUTER_MAX_REQUESTS_PER_DAY:
|
|
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:
|
|
136
|
-
ANTHROPIC_MODEL:
|
|
137
|
-
ANTHROPIC_MAX_CONCURRENCY:
|
|
138
|
-
ANTHROPIC_MAX_REQUESTS_PER_MINUTE:
|
|
139
|
-
ANTHROPIC_MAX_REQUESTS_PER_DAY:
|
|
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:
|
|
142
|
-
PERPLEXITY_MODEL:
|
|
143
|
-
PERPLEXITY_MAX_CONCURRENCY:
|
|
144
|
-
PERPLEXITY_MAX_REQUESTS_PER_MINUTE:
|
|
145
|
-
PERPLEXITY_MAX_REQUESTS_PER_DAY:
|
|
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:
|
|
148
|
-
MUSE_MODEL:
|
|
149
|
-
MUSE_BASE_URL:
|
|
150
|
-
MUSE_MAX_CONCURRENCY:
|
|
151
|
-
MUSE_MAX_REQUESTS_PER_MINUTE:
|
|
152
|
-
MUSE_MAX_REQUESTS_PER_DAY:
|
|
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:
|
|
157
|
-
CANONRY_RESEARCH_ALLOW_VIEWERS:
|
|
158
|
-
CANONRY_RESEARCH_VIEWER_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 =
|
|
182
|
-
CANONRY_API_KEY:
|
|
183
|
-
CANONRY_API_URL:
|
|
184
|
-
CANONRY_DATABASE_PATH:
|
|
185
|
-
GEMINI_API_KEY:
|
|
186
|
-
GEMINI_MODEL:
|
|
187
|
-
GEMINI_BASE_URL:
|
|
188
|
-
GEMINI_VERTEX_PROJECT:
|
|
189
|
-
GEMINI_VERTEX_REGION:
|
|
190
|
-
GEMINI_VERTEX_CREDENTIALS:
|
|
191
|
-
OPENAI_API_KEY:
|
|
192
|
-
OPENAI_MODEL:
|
|
193
|
-
OPENAI_BASE_URL:
|
|
194
|
-
OPENROUTER_API_KEY:
|
|
195
|
-
OPENROUTER_MODEL:
|
|
196
|
-
ANTHROPIC_API_KEY:
|
|
197
|
-
ANTHROPIC_MODEL:
|
|
198
|
-
PERPLEXITY_API_KEY:
|
|
199
|
-
PERPLEXITY_MODEL:
|
|
200
|
-
MUSE_API_KEY:
|
|
201
|
-
MUSE_MODEL:
|
|
202
|
-
MUSE_BASE_URL:
|
|
203
|
-
LOCAL_BASE_URL:
|
|
204
|
-
LOCAL_API_KEY:
|
|
205
|
-
LOCAL_MODEL:
|
|
206
|
-
GOOGLE_CLIENT_ID:
|
|
207
|
-
GOOGLE_CLIENT_SECRET:
|
|
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
|
|
1017
|
-
|
|
1018
|
-
parsed.apiUrl =
|
|
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
|
|
1030
|
-
if (normalizedBase !== "/" && !
|
|
1031
|
-
parsed.apiUrl =
|
|
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
|
|
1165
|
+
const url2 = typeof candidate.url === "string" ? candidate.url.trim() : "";
|
|
1057
1166
|
const token = typeof candidate.token === "string" ? candidate.token : "";
|
|
1058
|
-
if (!
|
|
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-
|
|
5
|
+
} from "./chunk-W5GZENMO.js";
|
|
6
6
|
import {
|
|
7
7
|
getConfigDir
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-5SVPFDUM.js";
|
|
9
9
|
import {
|
|
10
10
|
currentOutcomeAttribution
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
22
|
+
} from "./chunk-FCGYYZHL.js";
|
|
23
23
|
|
|
24
24
|
// src/outcome-telemetry.ts
|
|
25
25
|
import fs from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseJsonColumn
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
29
|
+
} from "./chunk-FCGYYZHL.js";
|
|
30
30
|
|
|
31
31
|
// ../provider-openai/src/normalize.ts
|
|
32
32
|
import OpenAI from "openai";
|