@canonry/canonry 7.5.1 → 7.7.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 (31) hide show
  1. package/assets/agent-workspace/skills/aero/SKILL.md +39 -1
  2. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +2 -2
  3. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +8 -0
  4. package/assets/assets/{AuditHistoryPanel-B5aLMnWE.js → AuditHistoryPanel-qumC-I56.js} +1 -1
  5. package/assets/assets/{BacklinksPage-Biq1jrqe.js → BacklinksPage-BNyYcY5w.js} +1 -1
  6. package/assets/assets/{HistoryPage-CGGkAgnz.js → HistoryPage-CQfOM6NA.js} +1 -1
  7. package/assets/assets/{MeasurementPropertyPage-BwyWGGBg.js → MeasurementPropertyPage-D0LTQHL7.js} +1 -1
  8. package/assets/assets/{ProjectPage-DEnKyD3e.js → ProjectPage-QQErJAT8.js} +1 -1
  9. package/assets/assets/{RunsPage-DNBn0Rau.js → RunsPage-CniAGDVF.js} +1 -1
  10. package/assets/assets/{SettingsPage-D3m-BLuf.js → SettingsPage-BPsrE4ao.js} +1 -1
  11. package/assets/assets/{SiteHealthSection-CPMu1l-l.js → SiteHealthSection-zW3ykBCu.js} +3 -3
  12. package/assets/assets/{TrafficPage-BCK_V__i.js → TrafficPage-DXKk92zy.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-DaCehUm8.js → TrafficSourceDetailPage-4POLIA_c.js} +1 -1
  14. package/assets/assets/{extract-error-message-CqBLzzuR.js → extract-error-message-C6t0hB2w.js} +1 -1
  15. package/assets/assets/{index-C2X_UARl.js → index-DBQ-8jB1.js} +24 -24
  16. package/assets/assets/{react-sigma_core.esm.min-BvO4SZKT.js → react-sigma_core.esm.min-D7GjzWYV.js} +1 -1
  17. package/assets/assets/{v2-overview-adapter-CgDChBa5.js → v2-overview-adapter-ChE5k_dV.js} +1 -1
  18. package/assets/index.html +1 -1
  19. package/dist/{chunk-VVEMJCC6.js → chunk-3DB43KT2.js} +4 -2
  20. package/dist/{chunk-JTQ4KFIR.js → chunk-75RSUOHZ.js} +430 -279
  21. package/dist/{chunk-Y7K5NMNV.js → chunk-JJXTHJ4E.js} +2 -2
  22. package/dist/{chunk-HAWCV4SU.js → chunk-LFUSODDL.js} +45 -22
  23. package/dist/{chunk-KJIXDPYH.js → chunk-ODEAE5T5.js} +3 -3
  24. package/dist/{chunk-56YOI7QX.js → chunk-WBTYXLXL.js} +2 -2
  25. package/dist/{chunk-RVM6QJQT.js → chunk-WJJTKZKK.js} +5509 -5464
  26. package/dist/cli.js +24 -12
  27. package/dist/{demo-server-V3DDLXND.js → demo-server-UWBPY743.js} +4 -4
  28. package/dist/index.js +6 -6
  29. package/dist/{intelligence-service-MZVPWIXL.js → intelligence-service-LOH37GPJ.js} +2 -2
  30. package/dist/mcp.js +4 -4
  31. package/package.json +8 -8
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-JTQ4KFIR.js";
8
+ } from "./chunk-75RSUOHZ.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-RVM6QJQT.js";
16
+ } from "./chunk-WJJTKZKK.js";
17
17
 
18
18
  // src/site-audit-factors.ts
19
19
  function recordedSharePct(factor) {
@@ -20,20 +20,20 @@ import {
20
20
  saveConfig,
21
21
  saveConfigPatch,
22
22
  sentimentInstallReadiness
23
- } from "./chunk-56YOI7QX.js";
23
+ } from "./chunk-WBTYXLXL.js";
24
24
  import {
25
25
  computeFactorAverages,
26
26
  deleteSiteCrawlGraphLayout,
27
27
  persistSiteCrawlGraphLayout,
28
28
  prepareSiteCrawlGraphLayout,
29
29
  recordedSharePct
30
- } from "./chunk-Y7K5NMNV.js";
30
+ } from "./chunk-JJXTHJ4E.js";
31
31
  import {
32
32
  CanonryMcpToolNames,
33
33
  CliError,
34
34
  PACKAGE_VERSION,
35
35
  canonryMcpTools
36
- } from "./chunk-VVEMJCC6.js";
36
+ } from "./chunk-3DB43KT2.js";
37
37
  import {
38
38
  CC_CACHE_DIR,
39
39
  DUCKDB_SPEC,
@@ -205,7 +205,7 @@ import {
205
205
  siteLivenessState,
206
206
  toAlertView,
207
207
  usageCounters
208
- } from "./chunk-JTQ4KFIR.js";
208
+ } from "./chunk-75RSUOHZ.js";
209
209
  import {
210
210
  AGENT_MEMORY_VALUE_MAX_BYTES,
211
211
  AGENT_NONE,
@@ -282,6 +282,7 @@ import {
282
282
  authRequired,
283
283
  backoffDelayMs,
284
284
  bucketOnboardingCount,
285
+ buildProviderRunError,
285
286
  buildRunErrorFromMessages,
286
287
  buildSimpleMeasurementDefinition,
287
288
  buildSnapshotUsage,
@@ -411,7 +412,7 @@ import {
411
412
  visibilityReportRequestSchema,
412
413
  winnabilityClassLabel,
413
414
  withRetry
414
- } from "./chunk-RVM6QJQT.js";
415
+ } from "./chunk-WJJTKZKK.js";
415
416
 
416
417
  // src/runtime-context.ts
417
418
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -7869,7 +7870,7 @@ function nonBlank(value) {
7869
7870
  return trimmed ? trimmed : void 0;
7870
7871
  }
7871
7872
  function resolveBuildCommit(env = process.env) {
7872
- const embedded = true ? "090fac327b8ec7108bb3084bca06488c05f4df02" : void 0;
7873
+ const embedded = true ? "0860f29cce58a29483357e3fd66869877e7a393c" : void 0;
7873
7874
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
7874
7875
  }
7875
7876
  function resolveInstanceIdentity(env = process.env) {
@@ -8288,7 +8289,7 @@ function runOutcome(inserted, providerErrors, planShortfall) {
8288
8289
  const allFailed = inserted === 0 && someFailed;
8289
8290
  return {
8290
8291
  status: allFailed ? RunStatuses.failed : someFailed ? RunStatuses.partial : RunStatuses.completed,
8291
- error: someFailed ? serializeRunError(buildRunErrorFromMessages(providerErrors)) : null
8292
+ error: someFailed ? serializeRunError(buildProviderRunError(providerErrors)) : null
8292
8293
  };
8293
8294
  }
8294
8295
  function competitorIdentityKey(rows) {
@@ -9869,7 +9870,7 @@ var JobRunner = class {
9869
9870
  if (justCompleted && parent) recordSentimentCompletion(tx, { projectId: parent.projectId, runId: input.runId, completionKey: input.fillId, completedAt: finishedAt, fillOrigin: input.fillId });
9870
9871
  } else if (state.readable && !input.fatal) {
9871
9872
  const previous = parseRunError(parent?.error)?.providers ?? {};
9872
- const fresh = buildRunErrorFromMessages(input.providerErrors).providers ?? {};
9873
+ const fresh = buildProviderRunError(input.providerErrors).providers ?? {};
9873
9874
  const remaining = /* @__PURE__ */ new Map();
9874
9875
  for (const slot of state.missing) remaining.set(slot.provider, (remaining.get(slot.provider) ?? 0) + 1);
9875
9876
  const providers = {};
@@ -14856,6 +14857,15 @@ var Scheduler = class {
14856
14857
  if (!claimedOccurrence) this.updateScheduleTiming(currentSchedule.id, { nextRunAt });
14857
14858
  return;
14858
14859
  }
14860
+ if (queueResult.refused) {
14861
+ log15.warn("run.skipped-providers-failing", {
14862
+ projectName: project.name,
14863
+ scheduleId: currentSchedule.id,
14864
+ ...queueResult.refused
14865
+ });
14866
+ if (!claimedOccurrence) this.updateScheduleTiming(currentSchedule.id, { nextRunAt });
14867
+ return;
14868
+ }
14859
14869
  const runId = queueResult.runId;
14860
14870
  for (const [provider, reason] of Object.entries(queueResult.dispatch.ineligible)) {
14861
14871
  if (!reason) continue;
@@ -16856,16 +16866,10 @@ function mcpToAgentTool(tool, ctx) {
16856
16866
  };
16857
16867
  }
16858
16868
  var AERO_EXCLUDED_MCP_TOOLS = /* @__PURE__ */ new Set([
16859
- // Experimental sentiment remains API/CLI/external MCP only until its separate Aero release gate.
16860
- "canonry_sentiment_settings",
16869
+ // Aero reads stored sentiment. Turning it on and submitting a backfill start
16870
+ // paid classifier work, so they stay with the operator (API, CLI, external MCP).
16861
16871
  "canonry_sentiment_configure",
16862
- "canonry_sentiment",
16863
- "canonry_sentiment_evidence",
16864
- "canonry_sentiment_compare",
16865
- "canonry_sentiment_backfill_preview",
16866
16872
  "canonry_sentiment_backfill",
16867
- "canonry_sentiment_jobs",
16868
- "canonry_sentiment_job",
16869
16873
  CanonryMcpToolNames.canonry_agent_clear,
16870
16874
  CanonryMcpToolNames.canonry_agent_conversations_new,
16871
16875
  CanonryMcpToolNames.canonry_agent_conversations_resume,
@@ -17288,6 +17292,7 @@ var MAX_VISIBLE_TOOLS = 128;
17288
17292
  var LOAD = "aero_load_toolkit";
17289
17293
  var metadata = new Map(canonryMcpTools.map((tool) => [tool.name, tool]));
17290
17294
  var runtimes = /* @__PURE__ */ new WeakMap();
17295
+ var TOOL_LIMIT_WRAP_UP = "This turn has used its tool budget, and no tools are available now. Answer the question from the tool results above: give what they establish with their numbers, say plainly which parts you could not check, and suggest one narrower question the user could ask next.";
17291
17296
  function result(value) {
17292
17297
  return { content: [{ type: "text", text: truncateToolResult(value) }], details: value };
17293
17298
  }
@@ -17412,7 +17417,7 @@ function explainMissingTool(runtime, message) {
17412
17417
  function configureAeroRuntime(agent, allowed, limits, progressive = true, pinned = []) {
17413
17418
  let runtime = runtimes.get(agent);
17414
17419
  if (!runtime) {
17415
- runtime = { allowed, loaded: /* @__PURE__ */ new Set(), limits: agentTurnLimitsSchema.parse(limits ?? {}), calls: 0, rounds: 0, startedAt: 0, reason: "completed", progressive, pinned: new Set(pinned), corrected: /* @__PURE__ */ new Map() };
17420
+ runtime = { allowed, loaded: /* @__PURE__ */ new Set(), limits: agentTurnLimitsSchema.parse(limits ?? {}), calls: 0, rounds: 0, startedAt: 0, reason: "completed", progressive, pinned: new Set(pinned), corrected: /* @__PURE__ */ new Map(), wrapUp: false };
17416
17421
  runtimes.set(agent, runtime);
17417
17422
  const state = runtime;
17418
17423
  const stream = agent.streamFunction;
@@ -17431,7 +17436,22 @@ function configureAeroRuntime(agent, allowed, limits, progressive = true, pinned
17431
17436
  return before?.(event, signal);
17432
17437
  };
17433
17438
  const finish = agent.finishTurn;
17434
- agent.finishTurn = (turn, signal) => state.reason === "tool-limit" ? { action: "end" } : finish?.(turn, signal);
17439
+ agent.finishTurn = (turn, signal) => {
17440
+ if (state.reason !== "tool-limit") return finish?.(turn, signal);
17441
+ if (state.wrapUp) return { action: "end" };
17442
+ state.wrapUp = true;
17443
+ return { action: "continue" };
17444
+ };
17445
+ const prepare = agent.prepareNextTurnWithContext;
17446
+ agent.prepareNextTurnWithContext = (turn, signal) => {
17447
+ if (state.reason === "tool-limit" && state.wrapUp) {
17448
+ return {
17449
+ context: { ...turn.context, tools: [] },
17450
+ messages: [{ role: "system", content: TOOL_LIMIT_WRAP_UP, timestamp: Date.now() }]
17451
+ };
17452
+ }
17453
+ return prepare ? prepare(turn, signal) : agent.prepareNextTurn?.(signal);
17454
+ };
17435
17455
  agent.afterToolCall = async (event, signal) => {
17436
17456
  const override = await after?.(event, signal);
17437
17457
  if (event.toolCall.name === LOAD && !event.isError) {
@@ -17476,6 +17496,7 @@ function configureAeroRuntime(agent, allowed, limits, progressive = true, pinned
17476
17496
  toolDurations.clear();
17477
17497
  overLimit.clear();
17478
17498
  state.corrected.clear();
17499
+ state.wrapUp = false;
17479
17500
  state.calls = 0;
17480
17501
  state.rounds = 0;
17481
17502
  state.reason = "completed";
@@ -17489,8 +17510,8 @@ function configureAeroRuntime(agent, allowed, limits, progressive = true, pinned
17489
17510
  } else if (event.type === "agent_end") {
17490
17511
  state.finishedAt = Date.now();
17491
17512
  clearTimeout(state.timer);
17492
- if (state.reason === "completed" && agent.signal?.aborted) state.reason = "stopped";
17493
- if (state.reason === "completed" && agent.state.errorMessage) state.reason = "error";
17513
+ if ((state.reason === "completed" || state.reason === "tool-limit") && agent.signal?.aborted) state.reason = "stopped";
17514
+ if ((state.reason === "completed" || state.reason === "tool-limit") && agent.state.errorMessage) state.reason = "error";
17494
17515
  }
17495
17516
  });
17496
17517
  }
@@ -22713,10 +22734,12 @@ async function createServer(opts) {
22713
22734
  }
22714
22735
  }
22715
22736
  const afterConfig = summarizeProviderConfig(opts.config.providers[name]);
22716
- if (JSON.stringify(beforeConfig) !== JSON.stringify(afterConfig)) {
22737
+ const apiKeyRotated = Boolean(existing) && Boolean(apiKey) && apiKey !== existing?.apiKey;
22738
+ if (apiKeyRotated || JSON.stringify(beforeConfig) !== JSON.stringify(afterConfig)) {
22717
22739
  const diff = JSON.stringify({
22718
22740
  before: existing ? beforeConfig : null,
22719
- after: afterConfig
22741
+ after: afterConfig,
22742
+ ...apiKeyRotated ? { apiKeyRotated: true } : {}
22720
22743
  });
22721
22744
  const affectedProjectIds = opts.db.select({ id: projects.id, providers: projects.providers }).from(projects).all().filter((project) => {
22722
22745
  const configuredProviders = project.providers;
@@ -4,14 +4,14 @@ import {
4
4
  installSkills,
5
5
  loadConfigRaw,
6
6
  saveConfigPatch
7
- } from "./chunk-56YOI7QX.js";
7
+ } from "./chunk-WBTYXLXL.js";
8
8
  import {
9
9
  PACKAGE_VERSION
10
- } from "./chunk-VVEMJCC6.js";
10
+ } from "./chunk-3DB43KT2.js";
11
11
  import {
12
12
  SKILL_MANIFEST_FILENAME,
13
13
  SkillsClients
14
- } from "./chunk-RVM6QJQT.js";
14
+ } from "./chunk-WJJTKZKK.js";
15
15
 
16
16
  // src/skills-autosync.ts
17
17
  import fs from "fs";
@@ -5,7 +5,7 @@ import {
5
5
  PACKAGE_VERSION,
6
6
  canonryMcpTools,
7
7
  isMachineFormat
8
- } from "./chunk-VVEMJCC6.js";
8
+ } from "./chunk-3DB43KT2.js";
9
9
  import {
10
10
  AGENT_PROVIDER_IDS,
11
11
  CANONRY_NPM_PACKAGE_URL,
@@ -50,7 +50,7 @@ import {
50
50
  skillsClientSchema,
51
51
  upgradeCaveatFor,
52
52
  upgradeCommandFor
53
- } from "./chunk-RVM6QJQT.js";
53
+ } from "./chunk-WJJTKZKK.js";
54
54
 
55
55
  // src/config.ts
56
56
  import fs from "fs";