@canonry/canonry 5.29.1 → 5.30.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 (37) hide show
  1. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +12 -0
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +47 -0
  3. package/assets/assets/{AuditHistoryPanel-B_H7nIp7.js → AuditHistoryPanel-8GPJdEWL.js} +1 -1
  4. package/assets/assets/{BacklinksPage-rhms6z2S.js → BacklinksPage-8-KPXFtA.js} +1 -1
  5. package/assets/assets/{HistoryPage-CWPETgrG.js → HistoryPage-CKgF71m5.js} +1 -1
  6. package/assets/assets/MeasurementPropertyPage-nfGYHl6C.js +1 -0
  7. package/assets/assets/ProjectPage-BPtdO-Gp.js +8 -0
  8. package/assets/assets/{RunRow-DQPW7FIF.js → RunRow-C3CRRfb4.js} +1 -1
  9. package/assets/assets/{RunsPage-BOM_RkNi.js → RunsPage-BvCCjtqM.js} +1 -1
  10. package/assets/assets/{SettingsPage-BDnT6wtM.js → SettingsPage-B1QuP6Cv.js} +1 -1
  11. package/assets/assets/{SiteHealthSection-lcZA1XpM.js → SiteHealthSection-DgM3aTd-.js} +3 -3
  12. package/assets/assets/{TrafficPage-D4nGSfXx.js → TrafficPage-DEUDhBXG.js} +2 -2
  13. package/assets/assets/{TrafficSourceDetailPage-CvZcCbic.js → TrafficSourceDetailPage-gpgLsGA1.js} +1 -1
  14. package/assets/assets/{extract-error-message-BJ3f0StM.js → extract-error-message-CH4G5kw6.js} +1 -1
  15. package/assets/assets/index-B2qeAPfR.js +86 -0
  16. package/assets/assets/index-D0bY1wpI.css +1 -0
  17. package/assets/assets/{react-sigma_core.esm.min-c7qzyLLe.js → react-sigma_core.esm.min-CG4hSMQ3.js} +1 -1
  18. package/assets/assets/{v2-overview-adapter-Dsd6dWtE.js → v2-overview-adapter-QNwqt0UG.js} +1 -1
  19. package/assets/index.html +2 -2
  20. package/dist/{chunk-WL2SHCPU.js → chunk-DFIK6IPP.js} +177 -1
  21. package/dist/{chunk-ASYPQYVV.js → chunk-NEP2PJ2T.js} +3 -3
  22. package/dist/{chunk-FKL5EGOW.js → chunk-RCX6I3DX.js} +2147 -1697
  23. package/dist/{chunk-N2SVFXOB.js → chunk-T3MTYL7I.js} +1097 -590
  24. package/dist/{chunk-RHZKOXDZ.js → chunk-TPJ4MMZ6.js} +4377 -2551
  25. package/dist/{chunk-PTTVDWMN.js → chunk-TWYIUHJU.js} +2 -2
  26. package/dist/{chunk-XWBQWAVE.js → chunk-WZL73LY3.js} +269 -83
  27. package/dist/cli.js +1787 -1528
  28. package/dist/{demo-server-VGUIDC5T.js → demo-server-EU5DGFB3.js} +4 -4
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.js +6 -6
  31. package/dist/{intelligence-service-IQA4U3RA.js → intelligence-service-SUFG6ICC.js} +2 -2
  32. package/dist/mcp.js +4 -4
  33. package/package.json +13 -12
  34. package/assets/assets/MeasurementPropertyPage-D9-54Je9.js +0 -1
  35. package/assets/assets/ProjectPage-eNVzxsZW.js +0 -8
  36. package/assets/assets/index-Cncchurw.js +0 -86
  37. package/assets/assets/index-DfhmHULl.css +0 -1
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-RHZKOXDZ.js";
8
+ } from "./chunk-TPJ4MMZ6.js";
9
9
  import {
10
10
  SITE_CRAWL_GRAPH_MAX_EDGES,
11
11
  SITE_CRAWL_GRAPH_MAX_NODES,
@@ -13,7 +13,7 @@ import {
13
13
  TEMPLATE_LINK_RATIO_THRESHOLD,
14
14
  factorStatusFromScore,
15
15
  roundPreservingTotal
16
- } from "./chunk-FKL5EGOW.js";
16
+ } from "./chunk-RCX6I3DX.js";
17
17
 
18
18
  // src/site-audit-factors.ts
19
19
  function recordedSharePct(factor) {
@@ -5,7 +5,7 @@ import {
5
5
  PACKAGE_VERSION,
6
6
  canonryMcpTools,
7
7
  isMachineFormat
8
- } from "./chunk-WL2SHCPU.js";
8
+ } from "./chunk-DFIK6IPP.js";
9
9
  import {
10
10
  AGENT_PROVIDER_IDS,
11
11
  CANONRY_NPM_PACKAGE_URL,
@@ -39,10 +39,17 @@ import {
39
39
  resolveProviderModel,
40
40
  restrictedWriteScopes,
41
41
  schedulableRunKindSchema,
42
+ sentimentBackfillPreviewReadSchema,
43
+ sentimentComparisonReadSchema,
44
+ sentimentEvidencePageReadSchema,
45
+ sentimentJobReadSchema,
46
+ sentimentJobsReadSchema,
47
+ sentimentSettingsReadSchema,
48
+ sentimentSummaryReadSchema,
42
49
  skillsClientSchema,
43
50
  upgradeCaveatFor,
44
51
  upgradeCommandFor
45
- } from "./chunk-FKL5EGOW.js";
52
+ } from "./chunk-RCX6I3DX.js";
46
53
 
47
54
  // src/config.ts
48
55
  import fs from "fs";
@@ -52,97 +59,124 @@ import crypto from "crypto";
52
59
  import { parse, stringify } from "yaml";
53
60
 
54
61
  // ../config/src/index.ts
62
+ import { z as z2 } from "zod";
63
+
64
+ // ../config/src/sentiment.ts
55
65
  import { z } from "zod";
56
- var dashboardManagedSweepsSchema = z.boolean().nullish();
57
- var researchAllowViewersSchema = z.boolean().nullish();
58
- var agentAllowViewersSchema = z.boolean().nullish();
59
- var researchViewerDailyRunLimitSchema = z.number().int().positive().nullish();
60
- var dashboardManagedRunKindsSchema = z.array(schedulableRunKindSchema).nullish();
66
+ var sentimentInstallConfigSchema = z.object({
67
+ enabled: z.boolean().default(false),
68
+ apiKey: z.string().trim().min(1).optional(),
69
+ model: z.string().trim().min(1).default("jev-1.13.0"),
70
+ maxConcurrency: z.number().int().min(1).max(8).default(2),
71
+ maxRequestsPerMinute: z.number().int().min(1).max(1e4).default(60),
72
+ maxInputTokensPerMinute: z.number().int().min(1).max(1e7).default(1e5),
73
+ maxAttempts: z.number().int().min(1).max(5).default(3)
74
+ }).strict();
75
+ function resolveSentimentInstallConfig(env, value) {
76
+ const enabled = env.CANONRY_SENTIMENT_ENABLED?.trim().toLowerCase();
77
+ return sentimentInstallConfigSchema.parse({
78
+ ...value,
79
+ ...enabled ? { enabled: enabled === "1" || enabled === "true" } : {},
80
+ ...env.TYPESAFE_API_KEY !== void 0 ? { apiKey: env.TYPESAFE_API_KEY.trim() || void 0 } : {},
81
+ ...env.TYPESAFE_MODEL !== void 0 ? { model: env.TYPESAFE_MODEL } : {}
82
+ });
83
+ }
84
+ function sentimentInstallReadiness(config) {
85
+ const reason = config.invalid ? "invalid-config" : !config.enabled ? "install-disabled" : config.model !== "jev-1.13.0" ? "unsupported-model" : !config.apiKey ? "missing-credentials" : null;
86
+ return { enabled: config.enabled, ready: reason === null, reason };
87
+ }
88
+
89
+ // ../config/src/index.ts
90
+ var dashboardManagedSweepsSchema = z2.boolean().nullish();
91
+ var researchAllowViewersSchema = z2.boolean().nullish();
92
+ var agentAllowViewersSchema = z2.boolean().nullish();
93
+ var researchViewerDailyRunLimitSchema = z2.number().int().positive().nullish();
94
+ var dashboardManagedRunKindsSchema = z2.array(schedulableRunKindSchema).nullish();
61
95
  var agentProviderSchema = agentProviderIdSchema.nullish();
62
- var agentModelSchema = z.string().trim().min(1).nullish();
96
+ var agentModelSchema = z2.string().trim().min(1).nullish();
63
97
  function resolveOperatorApiKeyIds(source) {
64
98
  const raw = source.CANONRY_OPERATOR_KEY_IDS?.trim();
65
99
  if (!raw) return [];
66
- const parsed = z.array(z.string().regex(/^[\w-]{1,256}$/)).max(100).safeParse(raw.split(",").map((id) => id.trim()));
100
+ const parsed = z2.array(z2.string().regex(/^[\w-]{1,256}$/)).max(100).safeParse(raw.split(",").map((id) => id.trim()));
67
101
  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).");
68
102
  return [...new Set(parsed.data)];
69
103
  }
70
- var envSchema = z.object({
71
- DATABASE_URL: z.string().default("postgresql://aeo:aeo@postgres:5432/aeo_platform"),
72
- API_PORT: z.coerce.number().int().positive().default(3e3),
73
- WORKER_PORT: z.coerce.number().int().positive().default(3001),
74
- WEB_PORT: z.coerce.number().int().positive().default(4173),
75
- BOOTSTRAP_SECRET: z.string().default("change-me"),
76
- CANONRY_BASE_PATH: z.string().default("/"),
104
+ var envSchema = z2.object({
105
+ DATABASE_URL: z2.string().default("postgresql://aeo:aeo@postgres:5432/aeo_platform"),
106
+ API_PORT: z2.coerce.number().int().positive().default(3e3),
107
+ WORKER_PORT: z2.coerce.number().int().positive().default(3001),
108
+ WEB_PORT: z2.coerce.number().int().positive().default(4173),
109
+ BOOTSTRAP_SECRET: z2.string().default("change-me"),
110
+ CANONRY_BASE_PATH: z2.string().default("/"),
77
111
  // Gemini
78
- GEMINI_API_KEY: z.string().optional(),
79
- GEMINI_MODEL: z.string().optional(),
80
- GEMINI_BASE_URL: z.string().optional(),
81
- GEMINI_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
82
- GEMINI_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
83
- GEMINI_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
112
+ GEMINI_API_KEY: z2.string().optional(),
113
+ GEMINI_MODEL: z2.string().optional(),
114
+ GEMINI_BASE_URL: z2.string().optional(),
115
+ GEMINI_MAX_CONCURRENCY: z2.coerce.number().int().positive().default(2),
116
+ GEMINI_MAX_REQUESTS_PER_MINUTE: z2.coerce.number().int().positive().default(10),
117
+ GEMINI_MAX_REQUESTS_PER_DAY: z2.coerce.number().int().positive().default(1e3),
84
118
  // Gemini Vertex AI (alternative to API key auth)
85
- GEMINI_VERTEX_PROJECT: z.string().optional(),
86
- GEMINI_VERTEX_REGION: z.string().optional(),
87
- GEMINI_VERTEX_CREDENTIALS: z.string().optional(),
119
+ GEMINI_VERTEX_PROJECT: z2.string().optional(),
120
+ GEMINI_VERTEX_REGION: z2.string().optional(),
121
+ GEMINI_VERTEX_CREDENTIALS: z2.string().optional(),
88
122
  // OpenAI
89
- OPENAI_API_KEY: z.string().optional(),
90
- OPENAI_MODEL: z.string().optional(),
91
- OPENAI_BASE_URL: z.string().optional(),
92
- OPENAI_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
93
- OPENAI_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
94
- OPENAI_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
123
+ OPENAI_API_KEY: z2.string().optional(),
124
+ OPENAI_MODEL: z2.string().optional(),
125
+ OPENAI_BASE_URL: z2.string().optional(),
126
+ OPENAI_MAX_CONCURRENCY: z2.coerce.number().int().positive().default(2),
127
+ OPENAI_MAX_REQUESTS_PER_MINUTE: z2.coerce.number().int().positive().default(10),
128
+ OPENAI_MAX_REQUESTS_PER_DAY: z2.coerce.number().int().positive().default(1e3),
95
129
  // Anthropic / Claude
96
- ANTHROPIC_API_KEY: z.string().optional(),
97
- ANTHROPIC_MODEL: z.string().optional(),
98
- ANTHROPIC_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
99
- ANTHROPIC_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
100
- ANTHROPIC_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
130
+ ANTHROPIC_API_KEY: z2.string().optional(),
131
+ ANTHROPIC_MODEL: z2.string().optional(),
132
+ ANTHROPIC_MAX_CONCURRENCY: z2.coerce.number().int().positive().default(2),
133
+ ANTHROPIC_MAX_REQUESTS_PER_MINUTE: z2.coerce.number().int().positive().default(10),
134
+ ANTHROPIC_MAX_REQUESTS_PER_DAY: z2.coerce.number().int().positive().default(1e3),
101
135
  // Perplexity
102
- PERPLEXITY_API_KEY: z.string().optional(),
103
- PERPLEXITY_MODEL: z.string().optional(),
104
- PERPLEXITY_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
105
- PERPLEXITY_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
106
- PERPLEXITY_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
136
+ PERPLEXITY_API_KEY: z2.string().optional(),
137
+ PERPLEXITY_MODEL: z2.string().optional(),
138
+ PERPLEXITY_MAX_CONCURRENCY: z2.coerce.number().int().positive().default(2),
139
+ PERPLEXITY_MAX_REQUESTS_PER_MINUTE: z2.coerce.number().int().positive().default(10),
140
+ PERPLEXITY_MAX_REQUESTS_PER_DAY: z2.coerce.number().int().positive().default(1e3),
107
141
  // Meta Muse
108
- MUSE_API_KEY: z.string().optional(),
109
- MUSE_MODEL: z.string().optional(),
110
- MUSE_BASE_URL: z.string().optional(),
111
- MUSE_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
112
- MUSE_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
113
- MUSE_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
142
+ MUSE_API_KEY: z2.string().optional(),
143
+ MUSE_MODEL: z2.string().optional(),
144
+ MUSE_BASE_URL: z2.string().optional(),
145
+ MUSE_MAX_CONCURRENCY: z2.coerce.number().int().positive().default(2),
146
+ MUSE_MAX_REQUESTS_PER_MINUTE: z2.coerce.number().int().positive().default(10),
147
+ MUSE_MAX_REQUESTS_PER_DAY: z2.coerce.number().int().positive().default(1e3),
114
148
  // Secret for HMAC-signing Google OAuth state parameters. Required for
115
149
  // cloud deployments that mount googleRoutes; the plugin refuses to register
116
150
  // without it (see packages/api-routes/src/google.ts).
117
- GOOGLE_STATE_SECRET: z.string().optional(),
118
- CANONRY_RESEARCH_ALLOW_VIEWERS: z.string().optional(),
119
- CANONRY_RESEARCH_VIEWER_DAILY_RUN_LIMIT: z.coerce.number().int().positive().default(DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT)
151
+ GOOGLE_STATE_SECRET: z2.string().optional(),
152
+ CANONRY_RESEARCH_ALLOW_VIEWERS: z2.string().optional(),
153
+ CANONRY_RESEARCH_VIEWER_DAILY_RUN_LIMIT: z2.coerce.number().int().positive().default(DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT)
120
154
  });
121
- var bootstrapEnvSchema = z.object({
122
- CANONRY_API_KEY: z.string().optional(),
123
- CANONRY_API_URL: z.string().optional(),
124
- CANONRY_DATABASE_PATH: z.string().optional(),
125
- GEMINI_API_KEY: z.string().optional(),
126
- GEMINI_MODEL: z.string().optional(),
127
- GEMINI_BASE_URL: z.string().optional(),
128
- GEMINI_VERTEX_PROJECT: z.string().optional(),
129
- GEMINI_VERTEX_REGION: z.string().optional(),
130
- GEMINI_VERTEX_CREDENTIALS: z.string().optional(),
131
- OPENAI_API_KEY: z.string().optional(),
132
- OPENAI_MODEL: z.string().optional(),
133
- OPENAI_BASE_URL: z.string().optional(),
134
- ANTHROPIC_API_KEY: z.string().optional(),
135
- ANTHROPIC_MODEL: z.string().optional(),
136
- PERPLEXITY_API_KEY: z.string().optional(),
137
- PERPLEXITY_MODEL: z.string().optional(),
138
- MUSE_API_KEY: z.string().optional(),
139
- MUSE_MODEL: z.string().optional(),
140
- MUSE_BASE_URL: z.string().optional(),
141
- LOCAL_BASE_URL: z.string().optional(),
142
- LOCAL_API_KEY: z.string().optional(),
143
- LOCAL_MODEL: z.string().optional(),
144
- GOOGLE_CLIENT_ID: z.string().optional(),
145
- GOOGLE_CLIENT_SECRET: z.string().optional()
155
+ var bootstrapEnvSchema = z2.object({
156
+ CANONRY_API_KEY: z2.string().optional(),
157
+ CANONRY_API_URL: z2.string().optional(),
158
+ CANONRY_DATABASE_PATH: z2.string().optional(),
159
+ GEMINI_API_KEY: z2.string().optional(),
160
+ GEMINI_MODEL: z2.string().optional(),
161
+ GEMINI_BASE_URL: z2.string().optional(),
162
+ GEMINI_VERTEX_PROJECT: z2.string().optional(),
163
+ GEMINI_VERTEX_REGION: z2.string().optional(),
164
+ GEMINI_VERTEX_CREDENTIALS: z2.string().optional(),
165
+ OPENAI_API_KEY: z2.string().optional(),
166
+ OPENAI_MODEL: z2.string().optional(),
167
+ OPENAI_BASE_URL: z2.string().optional(),
168
+ ANTHROPIC_API_KEY: z2.string().optional(),
169
+ ANTHROPIC_MODEL: z2.string().optional(),
170
+ PERPLEXITY_API_KEY: z2.string().optional(),
171
+ PERPLEXITY_MODEL: z2.string().optional(),
172
+ MUSE_API_KEY: z2.string().optional(),
173
+ MUSE_MODEL: z2.string().optional(),
174
+ MUSE_BASE_URL: z2.string().optional(),
175
+ LOCAL_BASE_URL: z2.string().optional(),
176
+ LOCAL_API_KEY: z2.string().optional(),
177
+ LOCAL_MODEL: z2.string().optional(),
178
+ GOOGLE_CLIENT_ID: z2.string().optional(),
179
+ GOOGLE_CLIENT_SECRET: z2.string().optional()
146
180
  });
147
181
  function getBootstrapEnv(source, overrides) {
148
182
  const filtered = overrides ? Object.fromEntries(Object.entries(overrides).filter(([, v]) => v != null)) : {};
@@ -570,6 +604,8 @@ function saveConfigPatch(patch) {
570
604
  if (base.apiKey) merged.apiKey = base.apiKey;
571
605
  if (base.anonymousId) merged.anonymousId = base.anonymousId;
572
606
  if (base.dashboardPasswordHash) merged.dashboardPasswordHash = base.dashboardPasswordHash;
607
+ if (base.sentiment === void 0) delete merged.sentiment;
608
+ else merged.sentiment = base.sentiment;
573
609
  if (base.providers && patch.providers) {
574
610
  merged.providers = { ...base.providers };
575
611
  for (const [key, patchEntry] of Object.entries(patch.providers)) {
@@ -2069,6 +2105,122 @@ var getApiV1ProjectsByNameMeasurementOverview = (options) => {
2069
2105
  ...options
2070
2106
  });
2071
2107
  };
2108
+ var getApiV1ProjectsByNameSentimentSettings = (options) => {
2109
+ return (options.client ?? client).get({
2110
+ security: [
2111
+ {
2112
+ scheme: "bearer",
2113
+ type: "http"
2114
+ }
2115
+ ],
2116
+ url: "/api/v1/projects/{name}/sentiment/settings",
2117
+ ...options
2118
+ });
2119
+ };
2120
+ var putApiV1ProjectsByNameSentimentSettings = (options) => {
2121
+ return (options.client ?? client).put({
2122
+ security: [
2123
+ {
2124
+ scheme: "bearer",
2125
+ type: "http"
2126
+ }
2127
+ ],
2128
+ url: "/api/v1/projects/{name}/sentiment/settings",
2129
+ ...options,
2130
+ headers: {
2131
+ "Content-Type": "application/json",
2132
+ ...options.headers
2133
+ }
2134
+ });
2135
+ };
2136
+ var getApiV1ProjectsByNameSentiment = (options) => {
2137
+ return (options.client ?? client).get({
2138
+ security: [
2139
+ {
2140
+ scheme: "bearer",
2141
+ type: "http"
2142
+ }
2143
+ ],
2144
+ url: "/api/v1/projects/{name}/sentiment",
2145
+ ...options
2146
+ });
2147
+ };
2148
+ var getApiV1ProjectsByNameSentimentEvidence = (options) => {
2149
+ return (options.client ?? client).get({
2150
+ security: [
2151
+ {
2152
+ scheme: "bearer",
2153
+ type: "http"
2154
+ }
2155
+ ],
2156
+ url: "/api/v1/projects/{name}/sentiment/evidence",
2157
+ ...options
2158
+ });
2159
+ };
2160
+ var getApiV1ProjectsByNameSentimentCompare = (options) => {
2161
+ return (options.client ?? client).get({
2162
+ security: [
2163
+ {
2164
+ scheme: "bearer",
2165
+ type: "http"
2166
+ }
2167
+ ],
2168
+ url: "/api/v1/projects/{name}/sentiment/compare",
2169
+ ...options
2170
+ });
2171
+ };
2172
+ var getApiV1ProjectsByNameSentimentBackfillPreview = (options) => {
2173
+ return (options.client ?? client).get({
2174
+ security: [
2175
+ {
2176
+ scheme: "bearer",
2177
+ type: "http"
2178
+ }
2179
+ ],
2180
+ url: "/api/v1/projects/{name}/sentiment/backfill-preview",
2181
+ ...options
2182
+ });
2183
+ };
2184
+ var postApiV1ProjectsByNameSentimentBackfills = (options) => {
2185
+ return (options.client ?? client).post({
2186
+ security: [
2187
+ {
2188
+ scheme: "bearer",
2189
+ type: "http"
2190
+ }
2191
+ ],
2192
+ url: "/api/v1/projects/{name}/sentiment/backfills",
2193
+ ...options,
2194
+ headers: {
2195
+ "Content-Type": "application/json",
2196
+ ...options.headers
2197
+ }
2198
+ });
2199
+ };
2200
+ var getApiV1ProjectsByNameSentimentJobs = (options) => {
2201
+ return (options.client ?? client).get({
2202
+ security: [
2203
+ {
2204
+ scheme: "bearer",
2205
+ type: "http"
2206
+ }
2207
+ ],
2208
+ url: "/api/v1/projects/{name}/sentiment/jobs",
2209
+ ...options
2210
+ });
2211
+ };
2212
+ var getApiV1ProjectsByNameSentimentJobsByJobId = (options) => {
2213
+ return (options.client ?? client).get({
2214
+ security: [
2215
+ {
2216
+ scheme: "bearer",
2217
+ type: "http"
2218
+ }
2219
+ ],
2220
+ url: "/api/v1/projects/{name}/sentiment/jobs/{jobId}",
2221
+ ...options
2222
+ });
2223
+ };
2072
2224
  var getApiV1ProjectsByNameVisibilityReport = (options) => {
2073
2225
  return (options.client ?? client).get({
2074
2226
  security: [
@@ -6151,6 +6303,38 @@ function createApiClient(opts = {}) {
6151
6303
  return new ApiClient(config.apiUrl, config.apiKey, { ...opts, skipProbe: basePathResolved || opts.skipProbe });
6152
6304
  }
6153
6305
  var ApiClient = class {
6306
+ // Sentiment responses are read with the tolerant readers from contracts, so
6307
+ // a field, state or outcome added by a newer server is dropped or read
6308
+ // through instead of rejecting the response (see `sentiment-read.ts`).
6309
+ /** One page of query rows; follow `queryPage.nextCursor` as `queryCursor`. */
6310
+ async getSentiment(name, query = {}) {
6311
+ return sentimentSummaryReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentiment({ client: this.heyClient, path: { name }, query })));
6312
+ }
6313
+ async getSentimentSettings(name) {
6314
+ return sentimentSettingsReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentimentSettings({ client: this.heyClient, path: { name } })));
6315
+ }
6316
+ async configureSentiment(name, body) {
6317
+ return sentimentSettingsReadSchema.parse(await this.invoke(() => putApiV1ProjectsByNameSentimentSettings({ client: this.heyClient, path: { name }, body })));
6318
+ }
6319
+ async getSentimentEvidence(name, query = {}) {
6320
+ return sentimentEvidencePageReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentimentEvidence({ client: this.heyClient, path: { name }, query })));
6321
+ }
6322
+ async compareSentiment(name, query) {
6323
+ return sentimentComparisonReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentimentCompare({ client: this.heyClient, path: { name }, query })));
6324
+ }
6325
+ async previewSentimentBackfill(name, query) {
6326
+ return sentimentBackfillPreviewReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentimentBackfillPreview({ client: this.heyClient, path: { name }, query })));
6327
+ }
6328
+ async submitSentimentBackfill(name, body) {
6329
+ return sentimentJobReadSchema.parse(await this.invoke(() => postApiV1ProjectsByNameSentimentBackfills({ client: this.heyClient, path: { name }, body })));
6330
+ }
6331
+ async listSentimentJobs(name) {
6332
+ return sentimentJobsReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentimentJobs({ client: this.heyClient, path: { name } })));
6333
+ }
6334
+ /** One page of attempt receipts, newest first; follow `nextAttemptCursor` as `attemptCursor`. */
6335
+ async getSentimentJob(name, jobId, query = {}) {
6336
+ return sentimentJobReadSchema.parse(await this.invoke(() => getApiV1ProjectsByNameSentimentJobsByJobId({ client: this.heyClient, path: { name, jobId }, query })));
6337
+ }
6154
6338
  originUrl;
6155
6339
  apiKey;
6156
6340
  probePromise = null;
@@ -9154,7 +9338,7 @@ var ApiClient = class {
9154
9338
  // src/mcp/server.ts
9155
9339
  import { randomUUID } from "crypto";
9156
9340
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9157
- import { z as z2 } from "zod";
9341
+ import { z as z3 } from "zod";
9158
9342
 
9159
9343
  // src/mcp/results.ts
9160
9344
  import { ZodError } from "zod";
@@ -9290,8 +9474,8 @@ var CANONRY_MCP_TOOLKITS = [
9290
9474
  {
9291
9475
  name: "monitoring",
9292
9476
  title: "Measurement, runs, insights, health",
9293
- description: "Inspect portfolio and Property measurement, question results, run history, intelligence insights, health timelines, and bounded Site Health reads (overview, page audit evidence, focused subgraphs, paths, and scan changes).",
9294
- whenToLoad: "Load when finding weak Properties, reviewing answers and competitors, checking data quality, tying a Site Health page score to concrete findings, investigating site architecture, comparing scans, or diagnosing regressions."
9477
+ description: "Inspect portfolio and Property measurement, question results, experimental branded and non-brand sentiment and evidence, run history, intelligence insights, health timelines, and bounded Site Health reads (overview, page audit evidence, focused subgraphs, paths, and scan changes).",
9478
+ whenToLoad: "Load when finding weak Properties, reviewing answers, sentiment and competitors, checking data quality, tying a Site Health page score to concrete findings, investigating site architecture, comparing scans, or diagnosing regressions."
9295
9479
  },
9296
9480
  {
9297
9481
  name: "setup",
@@ -9694,12 +9878,12 @@ ${updateNoticeInstructions(update)}` : SERVER_INSTRUCTIONS
9694
9878
  }, async (uri) => ({ contents: [{ uri: uri.href, mimeType: "text/markdown", text: OPERATIONS_GUIDE.markdown }] }));
9695
9879
  return { server, catalog };
9696
9880
  }
9697
- var loadToolkitInputSchema = z2.object({
9698
- name: z2.enum(CANONRY_MCP_TOOLKIT_NAMES).describe("Toolkit name. List options with canonry_help.")
9881
+ var loadToolkitInputSchema = z3.object({
9882
+ name: z3.enum(CANONRY_MCP_TOOLKIT_NAMES).describe("Toolkit name. List options with canonry_help.")
9699
9883
  });
9700
- var helpInputSchema = z2.object({
9701
- intent: z2.string().max(200).optional().describe("Workflow (status, diagnose, prospecting, measurement, integrations, reports) or a short task description."),
9702
- includeCatalog: z2.boolean().optional().describe("Include full toolkit details. Omit for a compact, actionable route.")
9884
+ var helpInputSchema = z3.object({
9885
+ intent: z3.string().max(200).optional().describe("Workflow (status, diagnose, prospecting, measurement, integrations, reports) or a short task description."),
9886
+ includeCatalog: z3.boolean().optional().describe("Include full toolkit details. Omit for a compact, actionable route.")
9703
9887
  });
9704
9888
  function registerMetaTools(server, catalog, opts) {
9705
9889
  server.registerTool(
@@ -10143,6 +10327,8 @@ function parseSkillsClient(value) {
10143
10327
  }
10144
10328
 
10145
10329
  export {
10330
+ resolveSentimentInstallConfig,
10331
+ sentimentInstallReadiness,
10146
10332
  dashboardManagedRunKindsSchema,
10147
10333
  resolveOperatorApiKeyIds,
10148
10334
  getBootstrapEnv,