@ainyc/canonry 4.76.1 → 4.76.2

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 (23) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +1 -1
  2. package/assets/assets/{BacklinksPage-Dvc3mk9A.js → BacklinksPage-GkTp8zLM.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-DbjEIcrG.js → ChartPrimitives-0noLg9_T.js} +1 -1
  4. package/assets/assets/{ProjectPage-CeZYtdbm.js → ProjectPage-Bg5sKYhO.js} +2 -2
  5. package/assets/assets/{RunRow-CgojRiy8.js → RunRow-BEhaQDol.js} +1 -1
  6. package/assets/assets/{RunsPage-CWEcQv7p.js → RunsPage-CV2wKkaz.js} +1 -1
  7. package/assets/assets/{SettingsPage-CCT4jasH.js → SettingsPage-Ctij-T9F.js} +1 -1
  8. package/assets/assets/{TrafficPage-DtdlxDFZ.js → TrafficPage-TnIPaMcL.js} +1 -1
  9. package/assets/assets/{TrafficSourceDetailPage-CPBuL-HQ.js → TrafficSourceDetailPage-BBmIwaee.js} +1 -1
  10. package/assets/assets/{extract-error-message--ubvhQzu.js → extract-error-message-BdLppivS.js} +1 -1
  11. package/assets/assets/{index-CKbfZ6rA.js → index-B-_Dwwhd.js} +3 -3
  12. package/assets/assets/{server-traffic-Dskh-6z1.js → server-traffic-ScU00kCP.js} +1 -1
  13. package/assets/assets/{trash-2-b62WCytM.js → trash-2-C65kNIO5.js} +1 -1
  14. package/assets/index.html +1 -1
  15. package/dist/{chunk-WFMEK34V.js → chunk-42TDEKKM.js} +1 -1
  16. package/dist/{chunk-2FV5GIUB.js → chunk-BIT3JPMW.js} +25 -6
  17. package/dist/{chunk-JNAKRK77.js → chunk-ETM5EPQH.js} +18 -0
  18. package/dist/{chunk-5QINOJ26.js → chunk-ZUQK4TLL.js} +4 -4
  19. package/dist/cli.js +9 -8
  20. package/dist/index.js +4 -4
  21. package/dist/{intelligence-service-ITD2CTKH.js → intelligence-service-QIGX7IVQ.js} +2 -2
  22. package/dist/mcp.js +2 -2
  23. package/package.json +13 -13
@@ -22,7 +22,7 @@ import {
22
22
  trafficConnectVercelRequestSchema,
23
23
  trafficConnectWordpressRequestSchema,
24
24
  trafficEventKindSchema
25
- } from "./chunk-JNAKRK77.js";
25
+ } from "./chunk-ETM5EPQH.js";
26
26
 
27
27
  // src/config.ts
28
28
  import fs from "fs";
@@ -11,6 +11,7 @@ import {
11
11
  ContentActions,
12
12
  DEFAULT_DISCOVERY_PROMOTE_BUCKETS,
13
13
  DEFAULT_DISCOVERY_PROMOTE_COMPETITOR_TYPES,
14
+ DISCOVERY_DEFAULT_DEDUP_THRESHOLD,
14
15
  DISCOVERY_PROMOTE_COMPETITOR_CAP,
15
16
  DISCOVERY_PROMOTE_COMPETITOR_MIN_HITS,
16
17
  DiscoveryBuckets,
@@ -186,6 +187,7 @@ import {
186
187
  schedulableRunKindSchema,
187
188
  scheduleDtoSchema,
188
189
  scheduleUpsertRequestSchema,
190
+ seedCollapseWarning,
189
191
  serializeRunError,
190
192
  settingsDtoSchema,
191
193
  siteAuditPagesResponseSchema,
@@ -230,7 +232,7 @@ import {
230
232
  wordpressSchemaDeployResultDtoSchema,
231
233
  wordpressSchemaStatusResultDtoSchema,
232
234
  wordpressStatusDtoSchema
233
- } from "./chunk-JNAKRK77.js";
235
+ } from "./chunk-ETM5EPQH.js";
234
236
 
235
237
  // src/intelligence-service.ts
236
238
  import { eq as eq33, desc as desc17, asc as asc4, and as and24, ne as ne5, or as or5, inArray as inArray12, gte as gte6, lte as lte3 } from "drizzle-orm";
@@ -1014,6 +1016,7 @@ var discoverySessions = sqliteTable("discovery_sessions", {
1014
1016
  aspirationalCount: integer("aspirational_count"),
1015
1017
  wastedCount: integer("wasted_count"),
1016
1018
  competitorMap: text("competitor_map", { mode: "json" }).$type().notNull().default([]),
1019
+ warning: text("warning"),
1017
1020
  error: text("error"),
1018
1021
  startedAt: text("started_at"),
1019
1022
  finishedAt: text("finished_at"),
@@ -2863,6 +2866,16 @@ var MIGRATION_VERSIONS = [
2863
2866
  `CREATE INDEX IF NOT EXISTS idx_site_audit_pages_run ON site_audit_pages(run_id)`,
2864
2867
  `CREATE INDEX IF NOT EXISTS idx_site_audit_pages_project_score ON site_audit_pages(project_id, overall_score)`
2865
2868
  ]
2869
+ },
2870
+ {
2871
+ // Non-fatal operator warning on a discovery session (e.g. the seed-dedup
2872
+ // degenerate-collapse guard). The session still completes; the warning
2873
+ // flags that its coverage may be misleading.
2874
+ version: 76,
2875
+ name: "discovery-session-warning",
2876
+ statements: [
2877
+ `ALTER TABLE discovery_sessions ADD COLUMN warning TEXT`
2878
+ ]
2866
2879
  }
2867
2880
  ];
2868
2881
  function isDuplicateColumnError(err) {
@@ -16652,7 +16665,7 @@ var routeCatalog = [
16652
16665
  method: "post",
16653
16666
  path: "/api/v1/projects/{name}/discover/run",
16654
16667
  summary: "Start a tracked-basket discovery session",
16655
- description: 'Kicks off a discovery session for the project. The pipeline: ICP description \u2192 Gemini grounded seed prompt \u2192 embed + cluster (cosine \u2265 0.85 by default) \u2192 pick canonical representatives \u2192 probe each canonical via Gemini grounding \u2192 classify into cited / aspirational / wasted-surface \u2192 aggregate competitor map. Returns immediately with `{ runId, sessionId, status: "running", consolidated }`; the actual work runs in the background. Poll `GET /projects/{name}/discover/sessions/{id}` until `status` is `completed` or `failed`. Concurrent/duplicate requests for the same (project, ICP) are consolidated onto a single in-flight session: the response carries `consolidated: true` and `200 OK` instead of `201`, and the request\'s `dedupThreshold` / `maxProbes` are ignored (the in-flight session keeps its original config).',
16668
+ description: 'Kicks off a discovery session for the project. The pipeline: ICP description \u2192 Gemini grounded seed prompt \u2192 embed + cluster (cosine \u2265 0.95 by default) \u2192 pick canonical representatives \u2192 probe each canonical via Gemini grounding \u2192 classify into cited / aspirational / wasted-surface \u2192 aggregate competitor map. Returns immediately with `{ runId, sessionId, status: "running", consolidated }`; the actual work runs in the background. Poll `GET /projects/{name}/discover/sessions/{id}` until `status` is `completed` or `failed`. Concurrent/duplicate requests for the same (project, ICP) are consolidated onto a single in-flight session: the response carries `consolidated: true` and `200 OK` instead of `201`, and the request\'s `dedupThreshold` / `maxProbes` are ignored (the in-flight session keeps its original config).',
16656
16669
  tags: ["discovery"],
16657
16670
  parameters: [nameParameter],
16658
16671
  requestBody: {
@@ -16663,7 +16676,7 @@ var routeCatalog = [
16663
16676
  type: "object",
16664
16677
  properties: {
16665
16678
  icpDescription: { type: "string", description: "Free-text ICP. Required if the project does not have spec.icpDescription stored." },
16666
- dedupThreshold: { type: "number", description: "Cosine similarity threshold for clustering. Defaults to 0.85." },
16679
+ dedupThreshold: { type: "number", description: "Cosine similarity threshold for clustering. Defaults to 0.95." },
16667
16680
  maxProbes: { type: "integer", description: "Max canonical queries to probe in this session. Default 100, hard cap 500." },
16668
16681
  locations: {
16669
16682
  type: "array",
@@ -31655,6 +31668,7 @@ function serializeSession(row) {
31655
31668
  aspirationalCount: row.aspirationalCount ?? null,
31656
31669
  wastedCount: row.wastedCount ?? null,
31657
31670
  competitorMap: parseCompetitorMap(row.competitorMap),
31671
+ warning: row.warning ?? null,
31658
31672
  error: row.error ?? null,
31659
31673
  startedAt: row.startedAt ?? null,
31660
31674
  finishedAt: row.finishedAt ?? null,
@@ -31690,7 +31704,6 @@ function selectEligibleCompetitors(competitorMap, competitorTypes) {
31690
31704
  // ../api-routes/src/discovery/orchestrate.ts
31691
31705
  import crypto26 from "crypto";
31692
31706
  import { eq as eq31 } from "drizzle-orm";
31693
- var DEFAULT_DEDUP_THRESHOLD = 0.85;
31694
31707
  var DEFAULT_MAX_PROBES = 100;
31695
31708
  var ABSOLUTE_MAX_PROBES = 500;
31696
31709
  function classifyProbeBucket(input) {
@@ -31736,7 +31749,7 @@ async function pickCanonicals(candidates, deps, dedupThreshold) {
31736
31749
  return clusters.map(pickClusterRepresentative);
31737
31750
  }
31738
31751
  async function executeDiscovery(opts) {
31739
- const dedupThreshold = opts.dedupThreshold ?? DEFAULT_DEDUP_THRESHOLD;
31752
+ const dedupThreshold = opts.dedupThreshold ?? DISCOVERY_DEFAULT_DEDUP_THRESHOLD;
31740
31753
  const requestedMax = opts.maxProbes ?? DEFAULT_MAX_PROBES;
31741
31754
  const maxProbes = Math.min(Math.max(1, requestedMax), ABSOLUTE_MAX_PROBES);
31742
31755
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -31757,13 +31770,19 @@ async function executeDiscovery(opts) {
31757
31770
  { embed: opts.deps.embed },
31758
31771
  dedupThreshold
31759
31772
  );
31773
+ const warning = seedCollapseWarning({
31774
+ seedCountRaw,
31775
+ canonicalCount: canonicals.length,
31776
+ dedupThreshold
31777
+ });
31760
31778
  const probedCanonicals = canonicals.slice(0, maxProbes);
31761
31779
  const seedCount = probedCanonicals.length;
31762
31780
  opts.db.update(discoverySessions).set({
31763
31781
  status: DiscoverySessionStatuses.probing,
31764
31782
  seedProvider: seedResult.provider,
31765
31783
  seedCountRaw,
31766
- seedCount
31784
+ seedCount,
31785
+ warning
31767
31786
  }).where(eq31(discoverySessions.id, opts.sessionId)).run();
31768
31787
  const probeRows = [];
31769
31788
  const buckets = { cited: 0, aspirational: 0, "wasted-surface": 0 };
@@ -1870,6 +1870,12 @@ var discoverySessionDtoSchema = z17.object({
1870
1870
  aspirationalCount: z17.number().int().nullable().default(null),
1871
1871
  wastedCount: z17.number().int().nullable().default(null),
1872
1872
  competitorMap: z17.array(discoveryCompetitorMapEntrySchema).default([]),
1873
+ /**
1874
+ * Non-fatal operator warning recorded while the session ran (currently the
1875
+ * seed dedup collapse guard). The session still completes; the warning flags
1876
+ * that its coverage may be misleading.
1877
+ */
1878
+ warning: z17.string().nullable().optional(),
1873
1879
  error: z17.string().nullable().optional(),
1874
1880
  startedAt: z17.string().nullable().optional(),
1875
1881
  finishedAt: z17.string().nullable().optional(),
@@ -1879,6 +1885,16 @@ var discoverySessionDetailDtoSchema = discoverySessionDtoSchema.extend({
1879
1885
  probes: z17.array(discoveryProbeDtoSchema).default([])
1880
1886
  });
1881
1887
  var DISCOVERY_MAX_PROBES_CAP = 500;
1888
+ var DISCOVERY_DEFAULT_DEDUP_THRESHOLD = 0.95;
1889
+ var DISCOVERY_SEED_COLLAPSE_RATIO = 0.2;
1890
+ var DISCOVERY_SEED_COLLAPSE_MIN_RAW = 10;
1891
+ function seedCollapseWarning(input) {
1892
+ const { seedCountRaw, canonicalCount, dedupThreshold } = input;
1893
+ if (seedCountRaw < DISCOVERY_SEED_COLLAPSE_MIN_RAW) return null;
1894
+ if (canonicalCount / seedCountRaw >= DISCOVERY_SEED_COLLAPSE_RATIO) return null;
1895
+ const noun = canonicalCount === 1 ? "query" : "queries";
1896
+ return `Seed dedup collapsed ${seedCountRaw} raw candidates into ${canonicalCount} canonical ${noun} at threshold ${dedupThreshold}. Distinct intents were likely merged into one cluster; re-run with a higher --dedup-threshold.`;
1897
+ }
1882
1898
  var discoveryRunRequestSchema = z17.object({
1883
1899
  icpDescription: z17.string().min(1).optional(),
1884
1900
  dedupThreshold: z17.number().min(0).max(1).optional(),
@@ -4440,6 +4456,8 @@ export {
4440
4456
  discoverySessionDtoSchema,
4441
4457
  discoverySessionDetailDtoSchema,
4442
4458
  DISCOVERY_MAX_PROBES_CAP,
4459
+ DISCOVERY_DEFAULT_DEDUP_THRESHOLD,
4460
+ seedCollapseWarning,
4443
4461
  discoveryRunRequestSchema,
4444
4462
  discoveryPromoteRequestSchema,
4445
4463
  discoveryPromotePreviewSchema,
@@ -9,7 +9,7 @@ import {
9
9
  loadConfig,
10
10
  loadConfigRaw,
11
11
  saveConfigPatch
12
- } from "./chunk-WFMEK34V.js";
12
+ } from "./chunk-42TDEKKM.js";
13
13
  import {
14
14
  CC_CACHE_DIR,
15
15
  DUCKDB_SPEC,
@@ -97,7 +97,7 @@ import {
97
97
  siteAuditPages,
98
98
  siteAuditSnapshots,
99
99
  usageCounters
100
- } from "./chunk-2FV5GIUB.js";
100
+ } from "./chunk-BIT3JPMW.js";
101
101
  import {
102
102
  AGENT_MEMORY_VALUE_MAX_BYTES,
103
103
  AGENT_PROVIDER_IDS,
@@ -149,7 +149,7 @@ import {
149
149
  validationError,
150
150
  winnabilityClassLabel,
151
151
  withRetry
152
- } from "./chunk-JNAKRK77.js";
152
+ } from "./chunk-ETM5EPQH.js";
153
153
 
154
154
  // src/telemetry.ts
155
155
  import crypto from "crypto";
@@ -5761,7 +5761,7 @@ function readStoredGroundingSources(rawResponse) {
5761
5761
  return result;
5762
5762
  }
5763
5763
  async function backfillInsightsCommand(project, opts) {
5764
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-ITD2CTKH.js");
5764
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-QIGX7IVQ.js");
5765
5765
  const config = loadConfig();
5766
5766
  const db = createClient(config.database);
5767
5767
  migrate(db);
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-5QINOJ26.js";
30
+ } from "./chunk-ZUQK4TLL.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-WFMEK34V.js";
47
+ } from "./chunk-42TDEKKM.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-2FV5GIUB.js";
55
+ } from "./chunk-BIT3JPMW.js";
56
56
  import {
57
57
  CcReleaseSyncStatuses,
58
58
  CheckScopes,
@@ -72,7 +72,7 @@ import {
72
72
  providerQuotaPolicySchema,
73
73
  resolveProviderInput,
74
74
  winnabilityClassSchema
75
- } from "./chunk-JNAKRK77.js";
75
+ } from "./chunk-ETM5EPQH.js";
76
76
 
77
77
  // src/cli.ts
78
78
  import { pathToFileURL } from "url";
@@ -1797,6 +1797,7 @@ function printSessionDetail(session) {
1797
1797
  console.log(` - ${c.domain} (${c.hits} hits, ${c.competitorType})`);
1798
1798
  }
1799
1799
  }
1800
+ if (session.warning) console.log(` Warning: ${session.warning}`);
1800
1801
  if (session.error) console.log(` Error: ${session.error}`);
1801
1802
  if (session.startedAt) console.log(` Started: ${session.startedAt}`);
1802
1803
  if (session.finishedAt) console.log(` Finished: ${session.finishedAt}`);
@@ -1920,7 +1921,7 @@ Usage: ${usage}`,
1920
1921
  var DISCOVER_CLI_COMMANDS = [
1921
1922
  {
1922
1923
  path: ["discover", "run"],
1923
- usage: 'canonry discover run <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.85] [--max-probes 100] [--wait] [--format json]',
1924
+ usage: 'canonry discover run <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.95] [--max-probes 100] [--wait] [--format json]',
1924
1925
  options: {
1925
1926
  icp: stringOption(),
1926
1927
  "icp-angle": multiStringOption(),
@@ -1930,7 +1931,7 @@ var DISCOVER_CLI_COMMANDS = [
1930
1931
  wait: { type: "boolean", default: false }
1931
1932
  },
1932
1933
  run: async (input) => {
1933
- const usage = 'canonry discover run <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.85] [--max-probes 100] [--wait] [--format json]';
1934
+ const usage = 'canonry discover run <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.95] [--max-probes 100] [--wait] [--format json]';
1934
1935
  const project = requireProject(input, "discover.run", usage);
1935
1936
  await discoverRun(project, {
1936
1937
  icp: getString(input.values, "icp"),
@@ -1949,7 +1950,7 @@ var DISCOVER_CLI_COMMANDS = [
1949
1950
  },
1950
1951
  {
1951
1952
  path: ["discover", "seed"],
1952
- usage: 'canonry discover seed <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.85] [--max-probes 100] [--wait] [--format json]',
1953
+ usage: 'canonry discover seed <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.95] [--max-probes 100] [--wait] [--format json]',
1953
1954
  options: {
1954
1955
  icp: stringOption(),
1955
1956
  "icp-angle": multiStringOption(),
@@ -1959,7 +1960,7 @@ var DISCOVER_CLI_COMMANDS = [
1959
1960
  wait: { type: "boolean", default: false }
1960
1961
  },
1961
1962
  run: async (input) => {
1962
- const usage = 'canonry discover seed <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.85] [--max-probes 100] [--wait] [--format json]';
1963
+ const usage = 'canonry discover seed <project> [--icp "..."] [--icp-angle "..."] [--locations michigan,florida] [--dedup-threshold 0.95] [--max-probes 100] [--wait] [--format json]';
1963
1964
  const project = requireProject(input, "discover.seed", usage);
1964
1965
  await discoverSeed(project, {
1965
1966
  icp: getString(input.values, "icp"),
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-5QINOJ26.js";
3
+ } from "./chunk-ZUQK4TLL.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-WFMEK34V.js";
7
- import "./chunk-2FV5GIUB.js";
8
- import "./chunk-JNAKRK77.js";
6
+ } from "./chunk-42TDEKKM.js";
7
+ import "./chunk-BIT3JPMW.js";
8
+ import "./chunk-ETM5EPQH.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-2FV5GIUB.js";
4
- import "./chunk-JNAKRK77.js";
3
+ } from "./chunk-BIT3JPMW.js";
4
+ import "./chunk-ETM5EPQH.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,8 +3,8 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-WFMEK34V.js";
7
- import "./chunk-JNAKRK77.js";
6
+ } from "./chunk-42TDEKKM.js";
7
+ import "./chunk-ETM5EPQH.js";
8
8
 
9
9
  // src/mcp/cli.ts
10
10
  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.76.1",
3
+ "version": "4.76.2",
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,26 +62,26 @@
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",
66
65
  "@ainyc/canonry-api-client": "0.0.0",
67
- "@ainyc/canonry-config": "0.0.0",
68
- "@ainyc/canonry-integration-bing": "0.0.0",
66
+ "@ainyc/canonry-api-routes": "0.0.0",
69
67
  "@ainyc/canonry-contracts": "0.0.0",
70
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
71
- "@ainyc/canonry-integration-cloud-run": "0.0.0",
72
68
  "@ainyc/canonry-db": "0.0.0",
69
+ "@ainyc/canonry-integration-bing": "0.0.0",
70
+ "@ainyc/canonry-config": "0.0.0",
71
+ "@ainyc/canonry-integration-cloud-run": "0.0.0",
72
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
73
73
  "@ainyc/canonry-integration-google": "0.0.0",
74
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
74
+ "@ainyc/canonry-integration-google-places": "0.0.0",
75
75
  "@ainyc/canonry-integration-traffic": "0.0.0",
76
- "@ainyc/canonry-integration-wordpress": "0.0.0",
76
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
77
+ "@ainyc/canonry-provider-cdp": "0.0.0",
77
78
  "@ainyc/canonry-intelligence": "0.0.0",
78
- "@ainyc/canonry-integration-google-places": "0.0.0",
79
- "@ainyc/canonry-provider-claude": "0.0.0",
79
+ "@ainyc/canonry-integration-wordpress": "0.0.0",
80
80
  "@ainyc/canonry-provider-gemini": "0.0.0",
81
- "@ainyc/canonry-provider-local": "0.0.0",
82
- "@ainyc/canonry-provider-cdp": "0.0.0",
81
+ "@ainyc/canonry-provider-claude": "0.0.0",
82
+ "@ainyc/canonry-provider-openai": "0.0.0",
83
83
  "@ainyc/canonry-provider-perplexity": "0.0.0",
84
- "@ainyc/canonry-provider-openai": "0.0.0"
84
+ "@ainyc/canonry-provider-local": "0.0.0"
85
85
  },
86
86
  "scripts": {
87
87
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",