@ainyc/canonry 4.190.0 → 4.191.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 (30) hide show
  1. package/README.md +1 -1
  2. package/assets/agent-workspace/skills/canonry/SKILL.md +124 -216
  3. package/assets/assets/{AuditHistoryPanel-wWLs088f.js → AuditHistoryPanel-C2dvjYNh.js} +1 -1
  4. package/assets/assets/{BacklinksPage-DJEO5o9c.js → BacklinksPage-D1yPQtfF.js} +1 -1
  5. package/assets/assets/{HistoryPage-CV5bTBU6.js → HistoryPage-DOEa7naA.js} +1 -1
  6. package/assets/assets/{MeasurementPropertyPage-C7KLIAad.js → MeasurementPropertyPage-D-O8vnMS.js} +1 -1
  7. package/assets/assets/ProjectPage-DqTCcimz.js +8 -0
  8. package/assets/assets/{RunRow-C3Ryj_9u.js → RunRow-BO7lyC1C.js} +1 -1
  9. package/assets/assets/{RunsPage-BxoEkZu3.js → RunsPage-DHSWfTav.js} +1 -1
  10. package/assets/assets/{SettingsPage-D_mB1JUZ.js → SettingsPage-oiJdhiq0.js} +1 -1
  11. package/assets/assets/SiteHealthSection-gVdylFY-.js +4 -0
  12. package/assets/assets/{TrafficPage-DgsWuDtv.js → TrafficPage-YIdwRpQh.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-BLWlQ8aT.js → TrafficSourceDetailPage-B4Cop6ox.js} +1 -1
  14. package/assets/assets/{extract-error-message-DHIHApUf.js → extract-error-message-XavUZNf3.js} +1 -1
  15. package/assets/assets/{index-BjjM151x.css → index-BtTEcbcB.css} +1 -1
  16. package/assets/assets/{index-nb8QHq99.js → index-njfYnO22.js} +25 -25
  17. package/assets/assets/{react-sigma_core.esm.min-DzTADS1A.js → react-sigma_core.esm.min-V7giUpEn.js} +1 -1
  18. package/assets/index.html +2 -2
  19. package/dist/{chunk-32QBVRMN.js → chunk-2A7E5TDU.js} +209 -29
  20. package/dist/{chunk-ROPJUNQN.js → chunk-KBUV3HGS.js} +55 -9
  21. package/dist/{chunk-2II4ZMMH.js → chunk-WSD5J6O4.js} +2 -2
  22. package/dist/{chunk-4NIQ3GMO.js → chunk-XI6FN52S.js} +33 -13
  23. package/dist/{chunk-6POEZ7GT.js → chunk-ZK4FJDCH.js} +291 -114
  24. package/dist/cli.js +56 -5
  25. package/dist/index.js +4 -4
  26. package/dist/{intelligence-service-WNASQFN4.js → intelligence-service-EVRWZHDG.js} +2 -2
  27. package/dist/mcp.js +13 -8
  28. package/package.json +11 -11
  29. package/assets/assets/ProjectPage-DIW1h05b.js +0 -8
  30. package/assets/assets/SiteHealthSection-Dgqtz9J2.js +0 -4
@@ -14,7 +14,7 @@ import {
14
14
  loadConfig,
15
15
  loadConfigRaw,
16
16
  saveConfigPatch
17
- } from "./chunk-32QBVRMN.js";
17
+ } from "./chunk-2A7E5TDU.js";
18
18
  import {
19
19
  CC_CACHE_DIR,
20
20
  DUCKDB_SPEC,
@@ -162,7 +162,7 @@ import {
162
162
  siteCrawlSnapshots,
163
163
  toAlertView,
164
164
  usageCounters
165
- } from "./chunk-6POEZ7GT.js";
165
+ } from "./chunk-ZK4FJDCH.js";
166
166
  import {
167
167
  AGENT_MEMORY_VALUE_MAX_BYTES,
168
168
  AGENT_PROVIDER_IDS,
@@ -305,7 +305,7 @@ import {
305
305
  validationError,
306
306
  winnabilityClassLabel,
307
307
  withRetry
308
- } from "./chunk-ROPJUNQN.js";
308
+ } from "./chunk-KBUV3HGS.js";
309
309
 
310
310
  // src/telemetry.ts
311
311
  import crypto from "crypto";
@@ -12041,7 +12041,7 @@ function readStoredGroundingSources(rawResponse) {
12041
12041
  return result;
12042
12042
  }
12043
12043
  async function backfillInsightsCommand(project, opts) {
12044
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-WNASQFN4.js");
12044
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-EVRWZHDG.js");
12045
12045
  const config = loadConfig();
12046
12046
  const db = createClient(config.database);
12047
12047
  migrate(db);
@@ -12623,7 +12623,7 @@ var RETRY_MS = 60 * 1e3;
12623
12623
  var TIMEOUT_MS2 = 3e3;
12624
12624
  function createProviderModelCatalog(registry) {
12625
12625
  const cache = /* @__PURE__ */ new Map();
12626
- return async (name) => {
12626
+ const read = async (name) => {
12627
12627
  const provider = registry.get(name);
12628
12628
  if (!provider) {
12629
12629
  cache.delete(name);
@@ -12666,6 +12666,14 @@ function createProviderModelCatalog(registry) {
12666
12666
  });
12667
12667
  return current.pending;
12668
12668
  };
12669
+ const cached = (name) => {
12670
+ const provider = registry.get(name);
12671
+ if (!provider) return [];
12672
+ const entry = cache.get(name);
12673
+ const identity = createHash("sha256").update(JSON.stringify(provider.config)).digest("hex");
12674
+ return (entry?.identity === identity ? entry.models : void 0) ?? provider.adapter.modelRegistry.knownModels;
12675
+ };
12676
+ return Object.assign(read, { cached });
12669
12677
  }
12670
12678
 
12671
12679
  // src/scheduler.ts
@@ -15714,6 +15722,7 @@ function mintSessionKey(db, scopes, userId) {
15714
15722
  keyHash: hashApiKey(raw),
15715
15723
  keyPrefix: raw.slice(0, 9),
15716
15724
  scopes: [...scopes],
15725
+ delegatedUserId: userId,
15717
15726
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
15718
15727
  }).run();
15719
15728
  return { id, raw };
@@ -15777,7 +15786,7 @@ function registerMcpHttpRoutes(scope, opts) {
15777
15786
  if (trimmed.slice(0, prefix.length).toLowerCase() !== prefix) return null;
15778
15787
  return trimmed.slice(prefix.length).trim() || null;
15779
15788
  }
15780
- async function openSession(request, keyId, segment) {
15789
+ async function openSession(request, authorizationId, segment) {
15781
15790
  const bearer = callerBearer(request);
15782
15791
  if (!bearer) return null;
15783
15792
  const scopes = request.principal?.scopes ?? request.apiKey?.scopes ?? [];
@@ -15788,13 +15797,14 @@ function registerMcpHttpRoutes(scope, opts) {
15788
15797
  const client = new ApiClient(opts.selfApiUrl, sessionKey?.raw ?? bearer, { skipProbe: true });
15789
15798
  const server = createCanonryMcpServer({
15790
15799
  scope: segment.readOnly || isReadOnlyKey(scopes) ? "read-only" : "all",
15800
+ credentialScopes: scopes,
15791
15801
  tiers: segment.tiers,
15792
15802
  clientFactory: () => client
15793
15803
  });
15794
15804
  const transport = new StreamableHTTPServerTransport({
15795
15805
  sessionIdGenerator: () => crypto26.randomUUID(),
15796
15806
  onsessioninitialized: (id) => {
15797
- sessions.set(id, { transport, close, keyId, segmentId: segment.id, lastSeenAt: now() });
15807
+ sessions.set(id, { transport, close, authorizationId, segmentId: segment.id, lastSeenAt: now() });
15798
15808
  }
15799
15809
  });
15800
15810
  async function close() {
@@ -15808,18 +15818,26 @@ function registerMcpHttpRoutes(scope, opts) {
15808
15818
  if (sessionKey) revokeSessionKey(opts.db, sessionKey.id);
15809
15819
  };
15810
15820
  await server.connect(transport);
15811
- return { transport, close, keyId, segmentId: segment.id, lastSeenAt: now() };
15821
+ return { transport, close, authorizationId, segmentId: segment.id, lastSeenAt: now() };
15812
15822
  }
15813
15823
  async function handle(request, reply, segment) {
15814
- const keyId = request.principal?.id ?? request.apiKey?.id;
15815
- if (!keyId) {
15824
+ const principal = request.principal ?? request.apiKey;
15825
+ const bearer = callerBearer(request);
15826
+ if (!principal || !bearer) {
15816
15827
  await reply.status(401).send({ error: { code: "AUTH_REQUIRED", message: "Authentication required." } });
15817
15828
  return;
15818
15829
  }
15830
+ const authorizationId = hashApiKey(JSON.stringify({
15831
+ bearerHash: hashApiKey(bearer),
15832
+ kind: request.principal?.kind ?? "api-key",
15833
+ id: principal.id,
15834
+ scopes: [...new Set(principal.scopes)].sort(),
15835
+ projectId: principal.projectId ?? null
15836
+ }));
15819
15837
  const sessionId = request.headers["mcp-session-id"];
15820
15838
  const existing = typeof sessionId === "string" ? sessions.get(sessionId) : void 0;
15821
15839
  if (existing) {
15822
- if (existing.keyId !== keyId || existing.segmentId !== segment.id) {
15840
+ if (existing.authorizationId !== authorizationId || existing.segmentId !== segment.id) {
15823
15841
  await reply.status(404).send({ error: { code: "NOT_FOUND", message: "Unknown MCP session." } });
15824
15842
  return;
15825
15843
  }
@@ -15831,7 +15849,7 @@ function registerMcpHttpRoutes(scope, opts) {
15831
15849
  await reply.status(404).send({ error: { code: "NOT_FOUND", message: "Unknown MCP session." } });
15832
15850
  return;
15833
15851
  }
15834
- const opened = await openSession(request, keyId, segment);
15852
+ const opened = await openSession(request, authorizationId, segment);
15835
15853
  if (!opened) {
15836
15854
  await reply.status(401).send({ error: { code: "AUTH_REQUIRED", message: "Authentication required." } });
15837
15855
  return;
@@ -18657,6 +18675,7 @@ async function createServer(opts) {
18657
18675
  app.log.error({ runId, err }, "Research run failed");
18658
18676
  });
18659
18677
  };
18678
+ const providerModelCatalog = createProviderModelCatalog(registry);
18660
18679
  await app.register(apiRoutes, {
18661
18680
  db: opts.db,
18662
18681
  routePrefix: apiPrefix,
@@ -18974,7 +18993,8 @@ async function createServer(opts) {
18974
18993
  includeCanonryLocal: true
18975
18994
  },
18976
18995
  providerSummary,
18977
- getProviderModels: createProviderModelCatalog(registry),
18996
+ getProviderModels: providerModelCatalog,
18997
+ getCachedProviderModels: providerModelCatalog.cached,
18978
18998
  providerAdapters: [...API_ADAPTERS, ...BROWSER_ADAPTERS].map((a) => ({
18979
18999
  name: a.name,
18980
19000
  displayName: a.displayName,