@ainyc/canonry 4.85.0 → 4.87.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 (27) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +3 -1
  2. package/assets/assets/{BacklinksPage-CDAv0ggn.js → BacklinksPage-BPvsw_Bi.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-CnAmsyt7.js → ChartPrimitives-BdlKCq7y.js} +1 -1
  4. package/assets/assets/ProjectPage-1Q8YC9Vd.js +6 -0
  5. package/assets/assets/{RunRow-CVZ5o8fg.js → RunRow-DcSsnE5c.js} +1 -1
  6. package/assets/assets/{RunsPage-Bzy5c0MZ.js → RunsPage-DKoIMkQL.js} +1 -1
  7. package/assets/assets/{SettingsPage-B1ocxPBe.js → SettingsPage-bH3PdNKb.js} +1 -1
  8. package/assets/assets/{TrafficPage-D2zepQOC.js → TrafficPage-IW_DX-0V.js} +1 -1
  9. package/assets/assets/{TrafficSourceDetailPage-C7JuAkaK.js → TrafficSourceDetailPage-DRHOGn9B.js} +1 -1
  10. package/assets/assets/{arrow-left-Bv3CWylm.js → arrow-left-B5Du72nk.js} +1 -1
  11. package/assets/assets/{extract-error-message-BtVid5TP.js → extract-error-message-C7Vhd5zH.js} +1 -1
  12. package/assets/assets/index-C_ZzKZfM.js +210 -0
  13. package/assets/assets/index-ClkRAeHL.css +1 -0
  14. package/assets/assets/{trash-2-BoimCsYz.js → trash-2-DWcofmpv.js} +1 -1
  15. package/assets/index.html +2 -2
  16. package/dist/{chunk-3K3QRSYE.js → chunk-5LW7CJAO.js} +276 -53
  17. package/dist/{chunk-62YB3ML7.js → chunk-6XMXBAEW.js} +47 -2
  18. package/dist/{chunk-7BMSWI2K.js → chunk-DUDFNP5Y.js} +19 -4
  19. package/dist/{chunk-I2BJC3DT.js → chunk-MDRDX5R2.js} +634 -205
  20. package/dist/cli.js +73 -9
  21. package/dist/index.js +4 -4
  22. package/dist/{intelligence-service-AHHBQKRD.js → intelligence-service-XUKYOHKL.js} +2 -2
  23. package/dist/mcp.js +2 -2
  24. package/package.json +7 -7
  25. package/assets/assets/ProjectPage-C9KEgRxD.js +0 -6
  26. package/assets/assets/index-BgWgJE7S.css +0 -1
  27. package/assets/assets/index-DmNti_xn.js +0 -210
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-7BMSWI2K.js";
30
+ } from "./chunk-DUDFNP5Y.js";
31
31
  import {
32
32
  CliError,
33
33
  EXIT_SYSTEM_ERROR,
@@ -44,7 +44,7 @@ import {
44
44
  saveConfig,
45
45
  saveConfigPatch,
46
46
  usageError
47
- } from "./chunk-62YB3ML7.js";
47
+ } from "./chunk-6XMXBAEW.js";
48
48
  import {
49
49
  apiKeys,
50
50
  createClient,
@@ -52,7 +52,7 @@ import {
52
52
  projects,
53
53
  queries,
54
54
  renderReportHtml
55
- } from "./chunk-3K3QRSYE.js";
55
+ } from "./chunk-5LW7CJAO.js";
56
56
  import {
57
57
  BacklinkSources,
58
58
  CcReleaseSyncStatuses,
@@ -77,7 +77,7 @@ import {
77
77
  providerQuotaPolicySchema,
78
78
  resolveProviderInput,
79
79
  winnabilityClassSchema
80
- } from "./chunk-I2BJC3DT.js";
80
+ } from "./chunk-MDRDX5R2.js";
81
81
 
82
82
  // src/cli.ts
83
83
  import { pathToFileURL } from "url";
@@ -1832,6 +1832,39 @@ async function discoverShow(project, sessionId, opts) {
1832
1832
  }
1833
1833
  printSessionDetail(session);
1834
1834
  }
1835
+ async function discoverHarvest(project, sessionId, opts) {
1836
+ const client = getClient4();
1837
+ const harvest = await client.getDiscoveryHarvest(project, sessionId, {
1838
+ minProbeHits: opts.minProbeHits,
1839
+ anchor: opts.anchor
1840
+ });
1841
+ if (opts.format === "json") {
1842
+ console.log(JSON.stringify(harvest, null, 2));
1843
+ return;
1844
+ }
1845
+ if (opts.format === "jsonl") {
1846
+ const context = { project, sessionId, provider: harvest.provider };
1847
+ emitJsonl(harvest.candidates.map((c) => ({ ...context, ...c })));
1848
+ return;
1849
+ }
1850
+ const r = harvest.stats.rejected;
1851
+ console.log(`Harvested issued search queries \u2014 session ${harvest.sessionId} (${harvest.provider})`);
1852
+ console.log(
1853
+ ` ${harvest.stats.admitted} admitted of ${harvest.stats.rawCandidates} raw \xB7 floor=${harvest.minProbeHits} \xB7 anchor=${harvest.anchorApplied ? "on" : "off"} \xB7 novelty=${harvest.semanticNoveltyApplied ? "semantic" : "exact-only"}`
1854
+ );
1855
+ console.log(
1856
+ ` rejected: ${r.belowFloor} below-floor \xB7 ${r.length} length \xB7 ${r.navigational} navigational \xB7 ${r.duplicate} already-tracked \xB7 ${r.semanticDuplicate} synonym \xB7 ${r.offAnchor} off-subject`
1857
+ );
1858
+ if (harvest.candidates.length === 0) {
1859
+ console.log(" (no candidates \u2014 nothing to track from this session)");
1860
+ return;
1861
+ }
1862
+ console.log("");
1863
+ console.log(" HITS QUERY");
1864
+ for (const candidate of harvest.candidates) {
1865
+ console.log(` ${String(candidate.probeHits).padStart(4)} ${candidate.query}`);
1866
+ }
1867
+ }
1835
1868
  async function discoverPromotePreview(project, sessionId, opts) {
1836
1869
  const client = getClient4();
1837
1870
  const preview = await client.previewDiscoveryPromote(project, sessionId);
@@ -2156,6 +2189,32 @@ var DISCOVER_CLI_COMMANDS = [
2156
2189
  });
2157
2190
  }
2158
2191
  },
2192
+ {
2193
+ path: ["discover", "harvest"],
2194
+ usage: "canonry discover harvest <project> <session-id> [--min-probe-hits <n>] [--no-anchor] [--format json|jsonl]",
2195
+ options: {
2196
+ "min-probe-hits": stringOption(),
2197
+ "no-anchor": { type: "boolean", default: false }
2198
+ },
2199
+ run: async (input) => {
2200
+ const usage = "canonry discover harvest <project> <session-id> [--min-probe-hits <n>] [--no-anchor] [--format json|jsonl]";
2201
+ const project = requireProject(input, "discover.harvest", usage);
2202
+ const sessionId = requirePositional(input, 1, {
2203
+ command: "discover.harvest",
2204
+ usage,
2205
+ message: "session ID is required"
2206
+ });
2207
+ await discoverHarvest(project, sessionId, {
2208
+ minProbeHits: parseIntegerOption(input, "min-probe-hits", {
2209
+ command: "discover.harvest",
2210
+ usage,
2211
+ message: "--min-probe-hits must be an integer"
2212
+ }),
2213
+ anchor: !getBoolean(input.values, "no-anchor"),
2214
+ format: input.format
2215
+ });
2216
+ }
2217
+ },
2159
2218
  {
2160
2219
  path: ["discover", "promote", "preview"],
2161
2220
  usage: "canonry discover promote preview <project> <session-id> [--format json]",
@@ -9346,7 +9405,9 @@ function renderHuman(overview) {
9346
9405
  providers,
9347
9406
  transitions,
9348
9407
  scores,
9349
- movementSummary,
9408
+ citationMovement,
9409
+ mentionMovement,
9410
+ movementComparison,
9350
9411
  competitors,
9351
9412
  providerScores,
9352
9413
  attentionItems,
@@ -9379,10 +9440,13 @@ function renderHuman(overview) {
9379
9440
  console.log(`
9380
9441
  Queries cited: ${queryCounts.citedQueries}/${queryCounts.totalQueries} (${pct2(queryCounts.citedRate)})`);
9381
9442
  console.log(` Queries mentioned: ${queryCounts.mentionedQueries}/${queryCounts.totalQueries} (${pct2(queryCounts.mentionRate)})`);
9382
- if (movementSummary.hasPreviousRun) {
9383
- console.log(` Movement: +${movementSummary.gained} gained, -${movementSummary.lost} lost (${movementSummary.tone})`);
9384
- } else if (movementSummary.gained > 0) {
9385
- console.log(` Movement: ${movementSummary.gained} cited in first run`);
9443
+ if (movementComparison.hasPreviousRun) {
9444
+ const comparisonLabel = movementComparison.querySetChanged ? `changed (+${movementComparison.addedQueryCount} added, -${movementComparison.removedQueryCount} removed); movement compares ${movementComparison.comparableQueryCount} shared` : `unchanged; ${movementComparison.comparableQueryCount} comparable`;
9445
+ console.log(` Query basket: ${comparisonLabel}`);
9446
+ console.log(` Citation movement: +${citationMovement.gained} gained, -${citationMovement.lost} lost (${citationMovement.tone})`);
9447
+ console.log(` Mention movement: +${mentionMovement.gained} gained, -${mentionMovement.lost} lost (${mentionMovement.tone})`);
9448
+ } else {
9449
+ console.log(" Movement: first sweep; no comparison yet");
9386
9450
  }
9387
9451
  if (providers.length > 0) {
9388
9452
  console.log("\n Providers:");
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-7BMSWI2K.js";
3
+ } from "./chunk-DUDFNP5Y.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-62YB3ML7.js";
7
- import "./chunk-3K3QRSYE.js";
8
- import "./chunk-I2BJC3DT.js";
6
+ } from "./chunk-6XMXBAEW.js";
7
+ import "./chunk-5LW7CJAO.js";
8
+ import "./chunk-MDRDX5R2.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-3K3QRSYE.js";
4
- import "./chunk-I2BJC3DT.js";
3
+ } from "./chunk-5LW7CJAO.js";
4
+ import "./chunk-MDRDX5R2.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-62YB3ML7.js";
6
+ } from "./chunk-6XMXBAEW.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-I2BJC3DT.js";
9
+ } from "./chunk-MDRDX5R2.js";
10
10
 
11
11
  // src/mcp/cli.ts
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ainyc/canonry",
3
- "version": "4.85.0",
3
+ "version": "4.87.0",
4
4
  "type": "module",
5
5
  "description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
6
6
  "license": "FSL-1.1-ALv2",
@@ -62,24 +62,24 @@
62
62
  "@types/node-cron": "^3.0.11",
63
63
  "tsup": "^8.5.1",
64
64
  "tsx": "^4.19.0",
65
+ "@ainyc/canonry-api-routes": "0.0.0",
65
66
  "@ainyc/canonry-config": "0.0.0",
66
67
  "@ainyc/canonry-api-client": "0.0.0",
67
- "@ainyc/canonry-api-routes": "0.0.0",
68
+ "@ainyc/canonry-contracts": "0.0.0",
68
69
  "@ainyc/canonry-db": "0.0.0",
69
- "@ainyc/canonry-integration-bing": "0.0.0",
70
70
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
71
71
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
72
- "@ainyc/canonry-contracts": "0.0.0",
73
72
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
74
- "@ainyc/canonry-integration-google": "0.0.0",
73
+ "@ainyc/canonry-integration-bing": "0.0.0",
75
74
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
75
+ "@ainyc/canonry-integration-google": "0.0.0",
76
76
  "@ainyc/canonry-integration-google-places": "0.0.0",
77
77
  "@ainyc/canonry-integration-traffic": "0.0.0",
78
- "@ainyc/canonry-intelligence": "0.0.0",
79
78
  "@ainyc/canonry-integration-wordpress": "0.0.0",
80
- "@ainyc/canonry-provider-cdp": "0.0.0",
79
+ "@ainyc/canonry-intelligence": "0.0.0",
81
80
  "@ainyc/canonry-provider-gemini": "0.0.0",
82
81
  "@ainyc/canonry-provider-local": "0.0.0",
82
+ "@ainyc/canonry-provider-cdp": "0.0.0",
83
83
  "@ainyc/canonry-provider-claude": "0.0.0",
84
84
  "@ainyc/canonry-provider-openai": "0.0.0",
85
85
  "@ainyc/canonry-provider-perplexity": "0.0.0"