@farming-labs/docs 0.2.66 → 0.2.68

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 (33) hide show
  1. package/dist/{agent-B81ztzxZ.mjs → agent-BIzynBvk.mjs} +2 -2
  2. package/dist/{agent-CcR8_Yyd.mjs → agent-D2SsSct2.mjs} +3 -1
  3. package/dist/{agent-evals-Bn_dA1_A.mjs → agent-evals-DZR4J7Iz.mjs} +1 -1
  4. package/dist/{agent-export-CyhCaE8J.mjs → agent-export-C_zd18VF.mjs} +8 -8
  5. package/dist/agent-skills-bundle.d.mts +1 -1
  6. package/dist/{agent-skills-server-CHvqnM4R.d.mts → agent-skills-server-DJXdK_hS.d.mts} +1 -1
  7. package/dist/{agent-skills-server-Cuoqu8Jv.mjs → agent-skills-server-iBfCLPOt.mjs} +1 -1
  8. package/dist/agent-skills-vite.d.mts +2 -2
  9. package/dist/agent-skills-vite.mjs +2 -2
  10. package/dist/{agents-BZ_hXI_Z.mjs → agents-BR5tSkbq.mjs} +6 -6
  11. package/dist/cli/index.mjs +14 -14
  12. package/dist/{doctor-BJt0ZFkJ.mjs → doctor-CVhU0YKo.mjs} +36 -12
  13. package/dist/{golden-evaluations-D7lSUeQl.mjs → golden-evaluations-DK1uqjlo.mjs} +1 -1
  14. package/dist/index.d.mts +12 -5
  15. package/dist/index.mjs +7 -7
  16. package/dist/{mcp-jGoU4pLD.mjs → mcp-YWlNI2d4.mjs} +6 -6
  17. package/dist/mcp.d.mts +1 -1
  18. package/dist/mcp.mjs +3 -3
  19. package/dist/{metadata-Cna0CtWZ.mjs → metadata-CNjcFhQN.mjs} +1 -1
  20. package/dist/{reading-time-oAnc4Brq.mjs → reading-time-O8mYgLvH.mjs} +71 -13
  21. package/dist/{review-CUo6iXMw.mjs → review-DdfvxMh2.mjs} +6 -6
  22. package/dist/{robots-NL_OsxEC.mjs → robots-CD14j-mU.mjs} +18 -8
  23. package/dist/{robots-vU80KRFy.mjs → robots-Dz5XeT8F.mjs} +91 -23
  24. package/dist/{search-B-BfnROL.d.mts → search-BBVD0A7O.d.mts} +1 -1
  25. package/dist/{search-D0A9lRGJ.mjs → search-DBlw9h3P.mjs} +1 -1
  26. package/dist/{search-B_CixCu9.mjs → search-DjN1Gfid.mjs} +6 -6
  27. package/dist/server.d.mts +2 -2
  28. package/dist/server.mjs +6 -6
  29. package/dist/{sitemap-B4mIK0ka.mjs → sitemap-B0hlAZ8o.mjs} +6 -6
  30. package/dist/{sitemap-server-atbbiVzW.mjs → sitemap-server-DQp8qUKN.mjs} +1 -1
  31. package/dist/{standards-discovery-iOmUel-o.d.mts → standards-discovery-CQjJ-M2y.d.mts} +11 -1
  32. package/dist/{standards-discovery-C7p5lBhc.mjs → standards-discovery-DSVKdQrl.mjs} +16 -1
  33. package/package.json +3 -1
package/dist/mcp.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as emitDocsAnalyticsEvent, i as emitDocsAgentTraceEvent, n as createDocsAgentTraceContext, r as createDocsAgentTraceId } from "./analytics-Bx44lg6d.mjs";
2
- import { Bt as renderDocsRelatedMarkdownLines, Jt as normalizePageAgentFrontmatter, Qt as upsertPageAgentContractMarkdown, cn as isDocsMcpProtectedResourceMetadataPath, dn as normalizeDocsMcpAuthorizationServerUrls, fn as normalizeDocsMcpEndpointPath, mn as resolveDocsMcpResourceLocation, pn as resolveDocsMcpProtectedResourceMetadataLocation, qt as hasStructuredPageAgentContract, sn as isDocsMcpOAuthScopeToken, un as isDocsMcpResourcePath, wt as resolveDocsAudienceMdxContent, zt as normalizeDocsRelated } from "./agent-CcR8_Yyd.mjs";
3
- import "./standards-discovery-C7p5lBhc.mjs";
4
- import { A as emitDocsTelemetryProjectEvent, D as emitDocsTelemetryAgentSurfaceEvent, S as stripGeneratedAgentProvenance, h as parseDocsMarkdownSections, k as emitDocsTelemetryMcpToolEvent, m as findDocsMarkdownSection, u as performDocsSearch, w as resolvePageSidebarFolderIndexBehavior } from "./search-D0A9lRGJ.mjs";
2
+ import { Bt as renderDocsRelatedMarkdownLines, Jt as normalizePageAgentFrontmatter, Qt as upsertPageAgentContractMarkdown, cn as isDocsMcpProtectedResourceMetadataPath, dn as normalizeDocsMcpAuthorizationServerUrls, fn as normalizeDocsMcpEndpointPath, mn as resolveDocsMcpResourceLocation, pn as resolveDocsMcpProtectedResourceMetadataLocation, qt as hasStructuredPageAgentContract, sn as isDocsMcpOAuthScopeToken, un as isDocsMcpResourcePath, wt as resolveDocsAudienceMdxContent, zt as normalizeDocsRelated } from "./agent-D2SsSct2.mjs";
3
+ import "./standards-discovery-DSVKdQrl.mjs";
4
+ import { A as emitDocsTelemetryProjectEvent, D as emitDocsTelemetryAgentSurfaceEvent, S as stripGeneratedAgentProvenance, h as parseDocsMarkdownSections, k as emitDocsTelemetryMcpToolEvent, m as findDocsMarkdownSection, u as performDocsSearch, w as resolvePageSidebarFolderIndexBehavior } from "./search-DBlw9h3P.mjs";
5
5
  import { a as normalizeAgentScopeValues, i as normalizeAgentLocale, n as agentVersionConstraintsOverlap, r as normalizeAgentFramework, t as agentVersionConstraintMatches } from "./agent-scope-C_U--OZ7.mjs";
6
6
  import matter from "gray-matter";
7
7
  import fs from "node:fs";
@@ -1,4 +1,4 @@
1
- import { Jt as normalizePageAgentFrontmatter, qt as hasStructuredPageAgentContract } from "./agent-CcR8_Yyd.mjs";
1
+ import { Jt as normalizePageAgentFrontmatter, qt as hasStructuredPageAgentContract } from "./agent-D2SsSct2.mjs";
2
2
 
3
3
  //#region src/metadata.ts
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { Dt as DEFAULT_SITEMAP_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, f as DEFAULT_DOCS_CONFIG_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, i as DEFAULT_AGENT_FEEDBACK_ROUTE, kt as DEFAULT_SITEMAP_XML_ROUTE, m as DEFAULT_DOCS_DIAGNOSTICS_ROUTE, nn as DEFAULT_MCP_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE } from "./agent-CcR8_Yyd.mjs";
2
- import { f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, n as API_CATALOG_MEDIA_TYPE, r as API_CATALOG_PROFILE_URI, t as AGENT_SKILLS_DISCOVERY_SCHEMA_URI, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE } from "./standards-discovery-C7p5lBhc.mjs";
3
- import { n as DEFAULT_ROBOTS_TXT_ROUTE } from "./robots-vU80KRFy.mjs";
1
+ import { Dt as DEFAULT_SITEMAP_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, f as DEFAULT_DOCS_CONFIG_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, i as DEFAULT_AGENT_FEEDBACK_ROUTE, kt as DEFAULT_SITEMAP_XML_ROUTE, m as DEFAULT_DOCS_DIAGNOSTICS_ROUTE, nn as DEFAULT_MCP_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE } from "./agent-D2SsSct2.mjs";
2
+ import { C as DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE, S as DOCS_AGENT_MANIFEST_FORMAT, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, n as API_CATALOG_MEDIA_TYPE, r as API_CATALOG_PROFILE_URI, t as AGENT_SKILLS_DISCOVERY_SCHEMA_URI, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, w as DOCS_AGENT_MANIFEST_SCHEMA_URI } from "./standards-discovery-DSVKdQrl.mjs";
3
+ import { n as DEFAULT_ROBOTS_TXT_ROUTE } from "./robots-Dz5XeT8F.mjs";
4
4
  import matter from "gray-matter";
5
5
 
6
6
  //#region src/define-docs.ts
@@ -242,7 +242,7 @@ function httpLinkHeaderHasTargetRelation(header, href, rel, responseUrl) {
242
242
 
243
243
  //#endregion
244
244
  //#region src/agent-conformance.ts
245
- const DOCS_AGENT_CONTRACT_VERSION = "1.1";
245
+ const DOCS_AGENT_CONTRACT_VERSION = "1.2";
246
246
  function normalizeOrigin(value) {
247
247
  return value.replace(/\/+$/, "");
248
248
  }
@@ -267,13 +267,21 @@ function createDocsAgentContractCases(options = {}) {
267
267
  expect: {
268
268
  statuses: [200],
269
269
  contentTypes: json,
270
- linkRelations: [{
271
- href: DEFAULT_API_CATALOG_ROUTE,
272
- rel: "api-catalog"
273
- }, {
274
- href: DEFAULT_AGENT_SKILLS_INDEX_ROUTE,
275
- rel: "service-meta"
276
- }]
270
+ linkRelations: [
271
+ {
272
+ href: DEFAULT_API_CATALOG_ROUTE,
273
+ rel: "api-catalog"
274
+ },
275
+ {
276
+ href: DEFAULT_AGENT_SKILLS_INDEX_ROUTE,
277
+ rel: "service-meta"
278
+ },
279
+ {
280
+ href: DOCS_AGENT_MANIFEST_SCHEMA_URI,
281
+ rel: "describedby",
282
+ type: DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE
283
+ }
284
+ ]
277
285
  }
278
286
  },
279
287
  {
@@ -578,6 +586,52 @@ function asRecord(value) {
578
586
  function isNonEmptyString(value) {
579
587
  return typeof value === "string" && value.trim().length > 0;
580
588
  }
589
+ function validateAgentManifest(content) {
590
+ let parsed;
591
+ try {
592
+ parsed = JSON.parse(content);
593
+ } catch {
594
+ return ["Agent manifest did not contain valid JSON"];
595
+ }
596
+ const root = asRecord(parsed);
597
+ const issues = [];
598
+ if (root?.$schema !== DOCS_AGENT_MANIFEST_SCHEMA_URI) issues.push(`Agent manifest did not declare top-level $schema ${DOCS_AGENT_MANIFEST_SCHEMA_URI}`);
599
+ if (root?.format !== DOCS_AGENT_MANIFEST_FORMAT) issues.push(`Agent manifest did not declare top-level format ${DOCS_AGENT_MANIFEST_FORMAT}`);
600
+ return issues;
601
+ }
602
+ function httpLinkMatchesContractExpectation(header, expectation, responseUrl) {
603
+ if (!httpLinkMatchesExpectation(parseHttpLinkHeader(header), expectation, responseUrl)) return false;
604
+ if (!expectation.type) return true;
605
+ let expectedUrl;
606
+ try {
607
+ expectedUrl = new URL(expectation.href, responseUrl).toString();
608
+ } catch {
609
+ return false;
610
+ }
611
+ for (const value of splitHttpList(header ?? "", ",")) {
612
+ const target = value.match(/^\s*<([^>]*)>/);
613
+ if (!target) continue;
614
+ let actualUrl;
615
+ try {
616
+ actualUrl = new URL(target[1], responseUrl).toString();
617
+ } catch {
618
+ continue;
619
+ }
620
+ if (actualUrl !== expectedUrl) continue;
621
+ const relations = [];
622
+ let type;
623
+ for (const rawParameter of splitHttpList(value.slice(target[0].length), ";")) {
624
+ const separator = rawParameter.indexOf("=");
625
+ if (separator < 0) continue;
626
+ const name = rawParameter.slice(0, separator).trim().toLowerCase();
627
+ const parameterValue = unquoteHttpValue(rawParameter.slice(separator + 1));
628
+ if (name === "rel") relations.push(...parameterValue.toLowerCase().split(/\s+/).filter(Boolean));
629
+ else if (name === "type") type = parameterValue.toLowerCase();
630
+ }
631
+ if (relations.includes(expectation.rel.toLowerCase()) && type === expectation.type.toLowerCase()) return true;
632
+ }
633
+ return false;
634
+ }
581
635
  async function sha256Content(content) {
582
636
  const digest = await globalThis.crypto.subtle.digest("SHA-256", content);
583
637
  return [...new Uint8Array(digest)].map((value) => value.toString(16).padStart(2, "0")).join("");
@@ -652,13 +706,17 @@ async function runDocsAgentConformance(options) {
652
706
  if (!matchesContentType(contentType, contractCase.expect.contentTypes)) issues.push(`expected content-type ${contractCase.expect.contentTypes.join(" or ")}, received ${contentType || "<missing>"}`);
653
707
  for (const requiredText of contractCase.expect.bodyIncludes ?? []) if (!body.toLowerCase().includes(requiredText.toLowerCase())) issues.push(`response body did not include ${JSON.stringify(requiredText)}`);
654
708
  if (contractCase.expect.bodyEmpty && body !== "") issues.push(`expected an empty response body, received ${body.length} characters`);
709
+ if (contractCase.surface === "discovery") issues.push(...validateAgentManifest(body));
655
710
  if (contractCase.surface === "agent-skills-index") issues.push(...await validateAgentSkillsIndex(body, contractCase.request.url, options.handle));
656
711
  for (const [header, requiredValues] of Object.entries(contractCase.expect.headerIncludes ?? {})) {
657
712
  const actual = response.headers.get(header) ?? "";
658
713
  for (const requiredValue of requiredValues) if (!actual.toLowerCase().includes(requiredValue.toLowerCase())) issues.push(`response header ${JSON.stringify(header)} did not include ${JSON.stringify(requiredValue)}`);
659
714
  }
660
- const parsedLinks = parseHttpLinkHeader(response.headers.get("link"));
661
- for (const expectation of contractCase.expect.linkRelations ?? []) if (!httpLinkMatchesExpectation(parsedLinks, expectation, contractCase.request.url)) issues.push(`response Link header did not include ${JSON.stringify(expectation.href)} with rel=${JSON.stringify(expectation.rel)} in the same link-value`);
715
+ const linkHeader = response.headers.get("link");
716
+ for (const expectation of contractCase.expect.linkRelations ?? []) if (!httpLinkMatchesContractExpectation(linkHeader, expectation, contractCase.request.url)) {
717
+ const typeRequirement = expectation.type ? ` and type=${JSON.stringify(expectation.type)}` : "";
718
+ issues.push(`response Link header did not include ${JSON.stringify(expectation.href)} with rel=${JSON.stringify(expectation.rel)}${typeRequirement} in the same link-value`);
719
+ }
662
720
  results.push({
663
721
  surface: contractCase.surface,
664
722
  passed: issues.length === 0,
@@ -1,13 +1,13 @@
1
- import { Ht as PAGE_AGENT_CONTRACT_FIELDS, Jt as normalizePageAgentFrontmatter, Kt as getPageAgentFrontmatterIssues, T as DOCS_CONFIG_MAP_TOP_LEVEL_KEYS, bt as findDocsAudienceMdxIssues, in as getDocsMcpProtectedResourceMetadataRoutes, j as buildDocsConfigMap, k as buildDocsAgentDiscoverySpec, qt as hasStructuredPageAgentContract } from "./agent-CcR8_Yyd.mjs";
2
- import { _ as DEFAULT_API_CATALOG_FORMAT, d as DEFAULT_AGENT_SKILLS_ROUTE_PATTERN, h as DEFAULT_AGENT_SKILL_FORMAT, j as resolveDocsDiscoveryApiRoute, l as DEFAULT_AGENT_SKILLS_INDEX_FORMAT, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE } from "./standards-discovery-C7p5lBhc.mjs";
3
- import { d as resolveAskAISearchRequestConfig } from "./search-D0A9lRGJ.mjs";
4
- import { a as resolveDocsMetadataBaseUrl } from "./metadata-Cna0CtWZ.mjs";
5
- import { c as resolveDocsReviewConfig, o as ensureDocsReviewWorkflow, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-Bn_dA1_A.mjs";
1
+ import { Ht as PAGE_AGENT_CONTRACT_FIELDS, Jt as normalizePageAgentFrontmatter, Kt as getPageAgentFrontmatterIssues, T as DOCS_CONFIG_MAP_TOP_LEVEL_KEYS, bt as findDocsAudienceMdxIssues, in as getDocsMcpProtectedResourceMetadataRoutes, j as buildDocsConfigMap, k as buildDocsAgentDiscoverySpec, qt as hasStructuredPageAgentContract } from "./agent-D2SsSct2.mjs";
2
+ import { F as resolveDocsDiscoveryApiRoute, _ as DEFAULT_API_CATALOG_FORMAT, d as DEFAULT_AGENT_SKILLS_ROUTE_PATTERN, h as DEFAULT_AGENT_SKILL_FORMAT, l as DEFAULT_AGENT_SKILLS_INDEX_FORMAT, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE } from "./standards-discovery-DSVKdQrl.mjs";
3
+ import { d as resolveAskAISearchRequestConfig } from "./search-DBlw9h3P.mjs";
4
+ import { a as resolveDocsMetadataBaseUrl } from "./metadata-CNjcFhQN.mjs";
5
+ import { c as resolveDocsReviewConfig, o as ensureDocsReviewWorkflow, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-DZR4J7Iz.mjs";
6
6
  import { createFilesystemDocsMcpSource, getDocsConfigSchema, resolveDocsMcpConfig } from "./mcp.mjs";
7
7
  import "./code-blocks-DnNVNK2M.mjs";
8
8
  import { _ as resolveDocsContentDir, g as resolveDocsConfigPath, h as readTopLevelStringProperty, s as loadDocsConfigModuleResultWithProjectEnv } from "./config-Wcdj-D0a.mjs";
9
9
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
10
- import { a as extractAgentBlocks, i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-D7lSUeQl.mjs";
10
+ import { a as extractAgentBlocks, i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-DK1uqjlo.mjs";
11
11
  import matter from "gray-matter";
12
12
  import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
13
13
  import path from "node:path";
@@ -1,7 +1,7 @@
1
- import "./agent-CcR8_Yyd.mjs";
2
- import "./standards-discovery-C7p5lBhc.mjs";
3
- import { c as renderDocsRobotsGeneratedBlock, f as upsertDocsRobotsGeneratedBlock, i as DOCS_ROBOTS_GENERATED_BLOCK_START, r as DOCS_ROBOTS_GENERATED_BLOCK_END, u as resolveDocsRobotsConfig } from "./robots-vU80KRFy.mjs";
4
- import { a as loadDocsConfigModule, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
1
+ import "./agent-D2SsSct2.mjs";
2
+ import "./standards-discovery-DSVKdQrl.mjs";
3
+ import { c as renderDocsRobotsGeneratedBlock, f as upsertDocsRobotsGeneratedBlock, i as DOCS_ROBOTS_GENERATED_BLOCK_START, r as DOCS_ROBOTS_GENERATED_BLOCK_END, u as resolveDocsRobotsConfig } from "./robots-Dz5XeT8F.mjs";
4
+ import { a as loadDocsConfigModule, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, m as readTopLevelBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
5
5
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
6
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
7
  import path from "node:path";
@@ -70,15 +70,21 @@ function parseRobotsGenerateArgs(argv) {
70
70
  if (parsed.append && parsed.force) throw new Error("Use either --append or --force, not both.");
71
71
  return parsed;
72
72
  }
73
- function readTopLevelBooleanProperty(content, key) {
74
- const match = content.match(new RegExp(`\\b${key}\\b\\s*:\\s*(true|false)`));
75
- return match ? match[1] === "true" : void 0;
76
- }
77
73
  function readLlmsBaseUrlFromConfig(content, config) {
78
74
  if (config?.llmsTxt && typeof config.llmsTxt === "object") return config.llmsTxt.baseUrl;
79
75
  const block = extractNestedObjectLiteral(content, ["llmsTxt"]);
80
76
  return block ? readStringProperty(block, "baseUrl") : void 0;
81
77
  }
78
+ function isApiCatalogEnabled(content, config) {
79
+ if (config?.staticExport ?? readTopLevelBooleanProperty(content, "staticExport") ?? false) return false;
80
+ if (config?.llmsTxt && typeof config.llmsTxt === "object") return config.llmsTxt.apiCatalog !== false;
81
+ const block = extractNestedObjectLiteral(content, ["llmsTxt"]);
82
+ return block ? readBooleanProperty(block, "apiCatalog") !== false : true;
83
+ }
84
+ function isAgentCardEnabled(content, config) {
85
+ if (config) return Boolean(config.agent?.a2a);
86
+ return Boolean(extractNestedObjectLiteral(content, ["agent", "a2a"]));
87
+ }
82
88
  function readSitemapConfigFromStatic(content) {
83
89
  const topLevelBoolean = readTopLevelBooleanProperty(content, "sitemap");
84
90
  if (typeof topLevelBoolean === "boolean") return topLevelBoolean;
@@ -134,6 +140,8 @@ async function generateRobots(options = {}) {
134
140
  const sitemap = config?.sitemap ?? readSitemapConfigFromStatic(configContent) ?? true;
135
141
  const sitemapBaseUrl = typeof sitemap === "object" ? sitemap.baseUrl : void 0;
136
142
  const llmsBaseUrl = readLlmsBaseUrlFromConfig(configContent, config);
143
+ const apiCatalog = isApiCatalogEnabled(configContent, config);
144
+ const agentCard = isAgentCardEnabled(configContent, config);
137
145
  const configuredRobots = resolveConfiguredRobots(configContent, config);
138
146
  if (configuredRobots === false) throw new Error("Robots generation is disabled by `robots: false`.");
139
147
  const robotsInput = typeof configuredRobots === "object" ? configuredRobots : {};
@@ -143,6 +151,8 @@ async function generateRobots(options = {}) {
143
151
  const relativeRobotsPath = path.relative(rootDir, robotsPath).replace(/\\/g, "/");
144
152
  const generatedBlock = renderDocsRobotsGeneratedBlock({
145
153
  entry,
154
+ apiCatalog,
155
+ agentCard,
146
156
  sitemap,
147
157
  baseUrl: robots.baseUrl,
148
158
  robots
@@ -1,5 +1,5 @@
1
- import { Ft as resolveDocsSitemapConfig, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, X as normalizeDocsPathSegment, a as DEFAULT_AGENT_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, en as DEFAULT_MCP_PUBLIC_ROUTE, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, nn as DEFAULT_MCP_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-CcR8_Yyd.mjs";
2
- import { a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-C7p5lBhc.mjs";
1
+ import { Ft as resolveDocsSitemapConfig, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, X as normalizeDocsPathSegment, a as DEFAULT_AGENT_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, en as DEFAULT_MCP_PUBLIC_ROUTE, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, nn as DEFAULT_MCP_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-D2SsSct2.mjs";
2
+ import { a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-DSVKdQrl.mjs";
3
3
 
4
4
  //#region src/robots.ts
5
5
  const DEFAULT_ROBOTS_TXT_ROUTE = "/robots.txt";
@@ -61,13 +61,17 @@ function resolveDocsRobotsConfig(input, options = {}) {
61
61
  }
62
62
  function getDocsRobotsAllowRoutes(options = {}) {
63
63
  const normalizedEntry = normalizeDocsPathSegment(options.entry ?? "docs") || "docs";
64
- const sitemapConfig = resolveDocsSitemapConfig(options.sitemap);
65
- const routes = [
64
+ return unique([
66
65
  "/",
67
66
  `/${normalizedEntry}`,
68
67
  `/${normalizedEntry}/`,
69
68
  `/${normalizedEntry}.md`,
70
69
  `/${normalizedEntry}/*.md`,
70
+ ...getDocsRobotsDiscoveryRoutes(options)
71
+ ].map(normalizeRoute));
72
+ }
73
+ function getDocsRobotsDiscoveryRoutes(options = {}) {
74
+ const routes = [
71
75
  DEFAULT_LLMS_TXT_ROUTE,
72
76
  DEFAULT_LLMS_FULL_TXT_ROUTE,
73
77
  DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE,
@@ -89,6 +93,7 @@ function getDocsRobotsAllowRoutes(options = {}) {
89
93
  DEFAULT_MCP_PUBLIC_ROUTE,
90
94
  DEFAULT_MCP_WELL_KNOWN_ROUTE
91
95
  ];
96
+ const sitemapConfig = resolveDocsSitemapConfig(options.sitemap);
92
97
  if (sitemapConfig.enabled) {
93
98
  if (sitemapConfig.xml.enabled) routes.push(sitemapConfig.xml.route);
94
99
  if (sitemapConfig.markdown.enabled) {
@@ -169,30 +174,93 @@ function upsertDocsRobotsGeneratedBlock(existing, block) {
169
174
  const prefix = existing.trimEnd();
170
175
  return `${prefix}${prefix ? "\n\n" : ""}${block}`;
171
176
  }
172
- function blockForUserAgent(content, userAgent) {
173
- const escaped = userAgent.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
174
- return content.match(new RegExp(`(?:^|\\n)\\s*User-agent:\\s*${escaped}\\s*(?:\\n[ \\t]*(?!User-agent:).*)*`, "i"))?.[0] ?? "";
177
+ function parseRobotsGroups(content) {
178
+ const groups = [];
179
+ let current;
180
+ for (const rawLine of content.split(/\r?\n/)) {
181
+ const line = rawLine.replace(/#.*$/, "").trim();
182
+ const separator = line.indexOf(":");
183
+ if (separator === -1) continue;
184
+ const field = line.slice(0, separator).trim().toLowerCase();
185
+ const value = line.slice(separator + 1).trim();
186
+ if (field === "user-agent") {
187
+ if (!value) continue;
188
+ if (!current || current.hasRules) {
189
+ current = {
190
+ userAgents: /* @__PURE__ */ new Set(),
191
+ allowRoutes: /* @__PURE__ */ new Set(),
192
+ rules: [],
193
+ hasRules: false
194
+ };
195
+ groups.push(current);
196
+ }
197
+ current.userAgents.add(value.toLowerCase());
198
+ continue;
199
+ }
200
+ if (!current) continue;
201
+ if (field !== "allow" && field !== "disallow") continue;
202
+ current.hasRules = true;
203
+ if (!value) continue;
204
+ const pattern = normalizeRoute(value);
205
+ if (field === "allow") current.allowRoutes.add(pattern);
206
+ current.rules.push({
207
+ directive: field,
208
+ pattern
209
+ });
210
+ }
211
+ return groups;
212
+ }
213
+ function rulesForUserAgent(groups, userAgent) {
214
+ const normalizedUserAgent = userAgent.toLowerCase();
215
+ const explicitMatches = groups.filter((group) => group.userAgents.has(normalizedUserAgent));
216
+ const matches = explicitMatches.length > 0 ? explicitMatches : groups.filter((group) => group.userAgents.has("*"));
217
+ return {
218
+ found: explicitMatches.length > 0,
219
+ allowRoutes: new Set(matches.flatMap((group) => [...group.allowRoutes])),
220
+ rules: matches.flatMap((group) => group.rules)
221
+ };
222
+ }
223
+ function concreteDiscoveryRoute(route) {
224
+ return route.replace(/\*/g, "resource");
175
225
  }
176
- function disallowsRoute(content, route) {
177
- const escapedRoute = route.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
178
- return new RegExp(`^\\s*Disallow:\\s*${escapedRoute}(?:\\s|$)`, "im").test(content);
226
+ function robotsRuleMatches(pattern, route) {
227
+ const endAnchored = pattern.endsWith("$");
228
+ const expression = (endAnchored ? pattern.slice(0, -1) : pattern).split("*").map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join(".*");
229
+ return new RegExp(`^${expression}${endAnchored ? "$" : ""}`).test(route);
230
+ }
231
+ function robotsRuleSpecificity(pattern) {
232
+ return new TextEncoder().encode(pattern).byteLength;
233
+ }
234
+ function rulesAllowRoute(rules, route) {
235
+ const concreteRoute = concreteDiscoveryRoute(route);
236
+ let strongestMatch = -1;
237
+ let allowed = true;
238
+ for (const rule of rules) {
239
+ if (!robotsRuleMatches(rule.pattern, concreteRoute)) continue;
240
+ const specificity = robotsRuleSpecificity(rule.pattern);
241
+ if (specificity > strongestMatch) {
242
+ strongestMatch = specificity;
243
+ allowed = rule.directive === "allow";
244
+ continue;
245
+ }
246
+ if (specificity === strongestMatch && rule.directive === "allow") allowed = true;
247
+ }
248
+ return allowed;
179
249
  }
180
250
  function analyzeDocsRobotsTxt(content, options = {}) {
181
- const expectedRoutes = getDocsRobotsAllowRoutes(options).filter((route) => [
182
- DEFAULT_LLMS_TXT_ROUTE,
183
- DEFAULT_LLMS_FULL_TXT_ROUTE,
184
- DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE,
185
- DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE,
186
- DEFAULT_AGENTS_MD_ROUTE,
187
- DEFAULT_SKILL_MD_ROUTE,
188
- DEFAULT_MCP_PUBLIC_ROUTE
189
- ].includes(route) || route.includes("sitemap"));
190
- const missingRoutes = expectedRoutes.filter((route) => !content.includes(route));
251
+ const expectedRoutes = options.sitemapRoutes === void 0 ? getDocsRobotsDiscoveryRoutes(options) : unique([...getDocsRobotsDiscoveryRoutes({
252
+ ...options,
253
+ sitemap: false
254
+ }), ...options.sitemapRoutes].map(normalizeRoute));
255
+ const groups = parseRobotsGroups(content);
256
+ const wildcardRules = rulesForUserAgent(groups, "*");
257
+ const allowedRoutes = wildcardRules.allowRoutes;
258
+ const missingRoutes = expectedRoutes.filter((route) => !allowedRoutes.has(route));
191
259
  return {
192
- blocksAgentRoutes: /Disallow:\s*\/(?:\s|$)/i.test(blockForUserAgent(content, "*")) || expectedRoutes.some((route) => disallowsRoute(content, route)),
193
- blocksAiAgents: DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS.some((userAgent) => /Disallow:\s*\/(?:\s|$)/i.test(blockForUserAgent(content, userAgent))),
260
+ blocksAgentRoutes: expectedRoutes.some((route) => !rulesAllowRoute(wildcardRules.rules, route)),
261
+ blocksAiAgents: DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS.some((userAgent) => expectedRoutes.some((route) => !rulesAllowRoute(rulesForUserAgent(groups, userAgent).rules, route))),
194
262
  hasAgentRoutes: missingRoutes.length === 0,
195
- hasAiPolicy: DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS.some((userAgent) => content.includes(userAgent)),
263
+ hasAiPolicy: DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS.some((userAgent) => rulesForUserAgent(groups, userAgent).found),
196
264
  missingRoutes
197
265
  };
198
266
  }
@@ -1,5 +1,5 @@
1
1
  import { $n as ResolvedDocsRelatedLink, Fn as OpenDocsProvider, Jt as DocsObservabilityEventInput, Kt as DocsObservabilityConfig, Mn as McpDocsSearchConfig, Rn as OpenDocsTarget, at as DocsAnalyticsEventInput, cn as DocsSearchConfig, et as DocsAgentTraceEventInput, f as CustomDocsSearchConfig, fn as DocsSearchResult, hn as DocsSitemapConfig, ht as DocsAskAIMcpConfig, in as DocsSearchAdapter, it as DocsAnalyticsEvent, ln as DocsSearchDocument, lr as TypesenseDocsSearchConfig, mn as DocsSearchSourcePage, on as DocsSearchAdapterFactory, qt as DocsObservabilityEvent, r as AlgoliaDocsSearchConfig, rt as DocsAnalyticsConfig, sn as DocsSearchChunkingConfig } from "./types-BQC05SQm.mjs";
2
- import { M as DocsDiscoveryApiRouteOptions } from "./standards-discovery-iOmUel-o.mjs";
2
+ import { F as DocsDiscoveryApiRouteOptions } from "./standards-discovery-CQjJ-M2y.mjs";
3
3
 
4
4
  //#region src/analytics.d.ts
5
5
  declare const DOCS_AGENT_TRACE_EVENT_TYPES: readonly ["run.start", "run.end", "run.error", "user.input", "prompt.build", "retrieval.query", "retrieval.result", "retrieval.error", "model.call", "model.response", "model.stream", "model.error", "tool.call", "tool.result", "tool.error", "retry", "timeout", "error", "agent.final"];
@@ -1,4 +1,4 @@
1
- import { H as isDocsAgentDiscoveryRequest, J as isDocsSkillRequest, Qt as upsertPageAgentContractMarkdown, U as isDocsAgentsRequest, Vt as PAGE_AGENT_CONTRACT_END_MARKER, Wt as PAGE_AGENT_CONTRACT_START_MARKER, Yt as renderPageAgentContractMarkdown, at as resolveDocsAgentFeedbackConfig, gt as resolveDocsSkillFormat, lt as resolveDocsLlmsTxtRequest, ot as resolveDocsAgentFeedbackRequest, pt as resolveDocsMarkdownRequest, st as resolveDocsAgentsFormat, wt as resolveDocsAudienceMdxContent } from "./agent-CcR8_Yyd.mjs";
1
+ import { H as isDocsAgentDiscoveryRequest, J as isDocsSkillRequest, Qt as upsertPageAgentContractMarkdown, U as isDocsAgentsRequest, Vt as PAGE_AGENT_CONTRACT_END_MARKER, Wt as PAGE_AGENT_CONTRACT_START_MARKER, Yt as renderPageAgentContractMarkdown, at as resolveDocsAgentFeedbackConfig, gt as resolveDocsSkillFormat, lt as resolveDocsLlmsTxtRequest, ot as resolveDocsAgentFeedbackRequest, pt as resolveDocsMarkdownRequest, st as resolveDocsAgentsFormat, wt as resolveDocsAudienceMdxContent } from "./agent-D2SsSct2.mjs";
2
2
 
3
3
  //#region src/telemetry.ts
4
4
  const DOCS_PACKAGE_NAME = "@farming-labs/docs";
@@ -1,11 +1,11 @@
1
- import "./agent-CcR8_Yyd.mjs";
2
- import "./standards-discovery-C7p5lBhc.mjs";
3
- import { n as buildDocsSearchDocuments, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter } from "./search-D0A9lRGJ.mjs";
4
- import "./sitemap-server-atbbiVzW.mjs";
5
- import "./agent-evals-Bn_dA1_A.mjs";
1
+ import "./agent-D2SsSct2.mjs";
2
+ import "./standards-discovery-DSVKdQrl.mjs";
3
+ import { n as buildDocsSearchDocuments, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter } from "./search-DBlw9h3P.mjs";
4
+ import "./sitemap-server-DQp8qUKN.mjs";
5
+ import "./agent-evals-DZR4J7Iz.mjs";
6
6
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
7
7
  import "./code-blocks-DnNVNK2M.mjs";
8
- import "./agent-skills-server-Cuoqu8Jv.mjs";
8
+ import "./agent-skills-server-iBfCLPOt.mjs";
9
9
  import "./server.mjs";
10
10
  import { _ as resolveDocsContentDir, c as loadProjectEnv, g as resolveDocsConfigPath, h as readTopLevelStringProperty } from "./config-Wcdj-D0a.mjs";
11
11
  import { readFileSync } from "node:fs";
package/dist/server.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { $t as DocsReviewRulesConfig, B as DocsAgentEvaluationSourceReference, Ct as DocsCodeBlocksPlannerProvider, Et as DocsCodeBlocksValidateConfig, F as DocsAgentEvaluationAnswerInput, H as DocsAgentEvaluationTaskInput, I as DocsAgentEvaluationAnswerProvider, J as DocsAgentGoldenExpectedExample, Jt as DocsObservabilityEventInput, K as DocsAgentGoldenAnswerExpectation, Kt as DocsObservabilityConfig, L as DocsAgentEvaluationAnswerRequest, Mn as McpDocsSearchConfig, Qt as DocsReviewConfig, R as DocsAgentEvaluationAnswerResult, V as DocsAgentEvaluationSurface, X as DocsAgentGoldenTaskExpectation, Y as DocsAgentGoldenTask, Z as DocsAgentGoldenTaskFilters, Zt as DocsReviewCiMode, a as ApiReferenceRenderer, an as DocsSearchAdapterContext, at as DocsAnalyticsEventInput, cn as DocsSearchConfig, dn as DocsSearchQuery, dt as DocsAskAIFeedbackConfig, et as DocsAgentTraceEventInput, fn as DocsSearchResult, ft as DocsAskAIFeedbackData, hn as DocsSitemapConfig, ht as DocsAskAIMcpConfig, in as DocsSearchAdapter, it as DocsAnalyticsEvent, kt as DocsConfig, ln as DocsSearchDocument, mn as DocsSearchSourcePage, mt as DocsAskAIFeedbackValue, nt as DocsAgentTraceStatus, on as DocsSearchAdapterFactory, pt as DocsAskAIFeedbackMessage, q as DocsAgentGoldenExampleVerification, qt as DocsObservabilityEvent, rt as DocsAnalyticsConfig, tt as DocsAgentTraceEventType, z as DocsAgentEvaluationAnswerRunner } from "./types-BQC05SQm.mjs";
2
- import { n as resolveConfiguredAgentSkills, r as resolveConfiguredAgentSkillsSync, t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-CHvqnM4R.mjs";
2
+ import { n as resolveConfiguredAgentSkills, r as resolveConfiguredAgentSkillsSync, t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-DJXdK_hS.mjs";
3
3
  import { renderDocsAgentSkillsBundle } from "./agent-skills-vite.mjs";
4
4
  import { i as isDocsCloudAskAIProvider, n as DocsCloudAskAIResponseOptions, r as createDocsCloudAskAIResponse, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-BD1SeVZv.mjs";
5
5
  import { DocsCloudAskAIOptions, DocsCloudPublicConfig, DocsCloudRouteHandlerOptions, DocsCloudRouteHandlers, DocsCloudRuntimeEnv, DocsCloudRuntimeValue, DocsCloudServer, DocsCloudServerOptions, DocsCloudTrackEventOptions, createDocsCloudRouteHandler, createDocsCloudServer } from "./docs-cloud-server.mjs";
6
- import { A as resolveDocsSitemapPageLastmod, B as SerializedOpenDocsProvider, C as DocsSitemapResolvedConfig, D as renderDocsSitemapMarkdown, E as readDocsSitemapManifestFromContentMap, F as DEFAULT_OPEN_DOCS_TARGET, G as serializeDocsIcon, H as parsePromptStringArray, I as DEFAULT_PROMPT_PROVIDER_TEMPLATES, J as serializeOpenDocsProviders, K as serializeDocsIconRegistry, L as PromptAction, M as toDocsSitemapMarkdownUrl, N as DEFAULT_OPEN_DOCS_PROMPT, O as renderDocsSitemapXml, P as DEFAULT_OPEN_DOCS_PROVIDER_IDS, R as PromptProviderChoice, S as DocsSitemapPageInput, T as createDocsSitemapResponse, U as resolvePromptProviderChoices, V as normalizePromptProviderName, W as sanitizePromptText, _ as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, a as createMcpSearchAdapter, at as createDocsAgentTraceContext, b as DocsSitemapManifest, c as formatDocsAskAIPackageHints, ct as emitDocsAnalyticsEvent, d as resolveAskAISearchRequestConfig, dt as resolveDocsAnalyticsConfig, f as resolveDocsSearchAudience, ft as resolveDocsObservabilityConfig, g as DEFAULT_SITEMAP_MD_ROUTE, h as DEFAULT_SITEMAP_MD_DOCS_ROUTE, i as createCustomSearchAdapter, it as ResolvedDocsObservabilityConfig, j as resolveDocsSitemapRequest, k as resolveDocsSitemapConfig, l as inferDocsAskAIPackageHints, lt as emitDocsObservabilityEvent, m as DEFAULT_SITEMAP_MANIFEST_PATH, n as buildDocsSearchDocuments, nt as DocsAgentTraceContext, o as createSimpleSearchAdapter, ot as createDocsAgentTraceId, p as resolveSearchRequestConfig, q as serializeOpenDocsProvider, r as createAlgoliaSearchAdapter, rt as ResolvedDocsAnalyticsConfig, s as createTypesenseSearchAdapter, st as emitDocsAgentTraceEvent, t as buildDocsAskAIContext, tt as DOCS_AGENT_TRACE_EVENT_TYPES, u as performDocsSearch, ut as getDocsRequestAnalyticsProperties, v as DEFAULT_SITEMAP_XML_ROUTE, w as buildDocsSitemapManifest, x as DocsSitemapManifestPage, y as DocsSitemapFormat, z as SerializeOpenDocsProviderOptions } from "./search-B-BfnROL.mjs";
6
+ import { A as resolveDocsSitemapPageLastmod, B as SerializedOpenDocsProvider, C as DocsSitemapResolvedConfig, D as renderDocsSitemapMarkdown, E as readDocsSitemapManifestFromContentMap, F as DEFAULT_OPEN_DOCS_TARGET, G as serializeDocsIcon, H as parsePromptStringArray, I as DEFAULT_PROMPT_PROVIDER_TEMPLATES, J as serializeOpenDocsProviders, K as serializeDocsIconRegistry, L as PromptAction, M as toDocsSitemapMarkdownUrl, N as DEFAULT_OPEN_DOCS_PROMPT, O as renderDocsSitemapXml, P as DEFAULT_OPEN_DOCS_PROVIDER_IDS, R as PromptProviderChoice, S as DocsSitemapPageInput, T as createDocsSitemapResponse, U as resolvePromptProviderChoices, V as normalizePromptProviderName, W as sanitizePromptText, _ as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, a as createMcpSearchAdapter, at as createDocsAgentTraceContext, b as DocsSitemapManifest, c as formatDocsAskAIPackageHints, ct as emitDocsAnalyticsEvent, d as resolveAskAISearchRequestConfig, dt as resolveDocsAnalyticsConfig, f as resolveDocsSearchAudience, ft as resolveDocsObservabilityConfig, g as DEFAULT_SITEMAP_MD_ROUTE, h as DEFAULT_SITEMAP_MD_DOCS_ROUTE, i as createCustomSearchAdapter, it as ResolvedDocsObservabilityConfig, j as resolveDocsSitemapRequest, k as resolveDocsSitemapConfig, l as inferDocsAskAIPackageHints, lt as emitDocsObservabilityEvent, m as DEFAULT_SITEMAP_MANIFEST_PATH, n as buildDocsSearchDocuments, nt as DocsAgentTraceContext, o as createSimpleSearchAdapter, ot as createDocsAgentTraceId, p as resolveSearchRequestConfig, q as serializeOpenDocsProvider, r as createAlgoliaSearchAdapter, rt as ResolvedDocsAnalyticsConfig, s as createTypesenseSearchAdapter, st as emitDocsAgentTraceEvent, t as buildDocsAskAIContext, tt as DOCS_AGENT_TRACE_EVENT_TYPES, u as performDocsSearch, ut as getDocsRequestAnalyticsProperties, v as DEFAULT_SITEMAP_XML_ROUTE, w as buildDocsSitemapManifest, x as DocsSitemapManifestPage, y as DocsSitemapFormat, z as SerializeOpenDocsProviderOptions } from "./search-BBVD0A7O.mjs";
7
7
  import { CreateDocsMcpServerOptions, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DOCS_CONFIG_SCHEMA_OPTIONS, DocsMcpAgentContractSummary, DocsMcpCodeExample, DocsMcpConfigSchema, DocsMcpConfigSchemaOption, DocsMcpContextResult, DocsMcpContextSource, DocsMcpDocsList, DocsMcpDocsPageSummary, DocsMcpDocsSection, DocsMcpHttpHandlers, DocsMcpNavigationNode, DocsMcpNavigationTree, DocsMcpPage, DocsMcpRequestContext, DocsMcpResolvedConfig, DocsMcpResolvedCorsConfig, DocsMcpResolvedProtectedResourceConfig, DocsMcpResolvedSecurityConfig, DocsMcpSource, DocsMcpTaskSummary, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, normalizeDocsMcpRoute, resolveDocsMcpConfig, runDocsMcpStdio } from "./mcp.mjs";
8
8
 
9
9
  //#region src/code-group-mdx.d.ts
package/dist/server.mjs CHANGED
@@ -1,14 +1,14 @@
1
1
  import { a as emitDocsAnalyticsEvent, c as resolveDocsAnalyticsConfig, i as emitDocsAgentTraceEvent, l as resolveDocsObservabilityConfig, n as createDocsAgentTraceContext, o as emitDocsObservabilityEvent, r as createDocsAgentTraceId, s as getDocsRequestAnalyticsProperties, t as DOCS_AGENT_TRACE_EVENT_TYPES } from "./analytics-Bx44lg6d.mjs";
2
- import { At as buildDocsSitemapManifest, Dt as DEFAULT_SITEMAP_MD_ROUTE, Et as DEFAULT_SITEMAP_MD_DOCS_ROUTE, Ft as resolveDocsSitemapConfig, It as resolveDocsSitemapPageLastmod, Lt as resolveDocsSitemapRequest, Mt as readDocsSitemapManifestFromContentMap, Nt as renderDocsSitemapMarkdown, Ot as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, Pt as renderDocsSitemapXml, Rt as toDocsSitemapMarkdownUrl, Tt as DEFAULT_SITEMAP_MANIFEST_PATH, jt as createDocsSitemapResponse, kt as DEFAULT_SITEMAP_XML_ROUTE } from "./agent-CcR8_Yyd.mjs";
3
- import "./standards-discovery-C7p5lBhc.mjs";
4
- import { a as createMcpSearchAdapter, c as formatDocsAskAIPackageHints, d as resolveAskAISearchRequestConfig, f as resolveDocsSearchAudience, i as createCustomSearchAdapter, l as inferDocsAskAIPackageHints, n as buildDocsSearchDocuments, o as createSimpleSearchAdapter, p as resolveSearchRequestConfig, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter, t as buildDocsAskAIContext, u as performDocsSearch } from "./search-D0A9lRGJ.mjs";
5
- import { C as resolveApiReferenceOpenApiDiscovery, S as resolveApiReferenceConfig, T as remarkCodeGroup, _ as buildApiReferenceOpenApiDocument, a as DEFAULT_PROMPT_PROVIDER_TEMPLATES, b as buildApiReferenceScalarCss, c as resolvePromptProviderChoices, d as serializeDocsIconRegistry, f as serializeOpenDocsProvider, g as buildApiReferenceHtmlDocumentAsync, h as buildApiReferenceHtmlDocument, i as DEFAULT_OPEN_DOCS_TARGET, l as sanitizePromptText, m as DEFAULT_API_REFERENCE_OPENAPI_ROUTE, n as DEFAULT_OPEN_DOCS_PROMPT, o as normalizePromptProviderName, p as serializeOpenDocsProviders, r as DEFAULT_OPEN_DOCS_PROVIDER_IDS, s as parsePromptStringArray, t as readDocsSitemapManifest, u as serializeDocsIcon, v as buildApiReferenceOpenApiDocumentAsync, w as resolveApiReferenceRenderer, x as isApiReferenceOpenApiRequest, y as buildApiReferencePageTitle } from "./sitemap-server-atbbiVzW.mjs";
6
- import { a as buildDocsReviewWorkflowPathFilters, c as resolveDocsReviewConfig, i as buildDocsReviewWorkflow, n as DEFAULT_DOCS_REVIEW_SCORE_THRESHOLD, o as ensureDocsReviewWorkflow, r as DEFAULT_DOCS_REVIEW_WORKFLOW_PATH, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-Bn_dA1_A.mjs";
2
+ import { At as buildDocsSitemapManifest, Dt as DEFAULT_SITEMAP_MD_ROUTE, Et as DEFAULT_SITEMAP_MD_DOCS_ROUTE, Ft as resolveDocsSitemapConfig, It as resolveDocsSitemapPageLastmod, Lt as resolveDocsSitemapRequest, Mt as readDocsSitemapManifestFromContentMap, Nt as renderDocsSitemapMarkdown, Ot as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, Pt as renderDocsSitemapXml, Rt as toDocsSitemapMarkdownUrl, Tt as DEFAULT_SITEMAP_MANIFEST_PATH, jt as createDocsSitemapResponse, kt as DEFAULT_SITEMAP_XML_ROUTE } from "./agent-D2SsSct2.mjs";
3
+ import "./standards-discovery-DSVKdQrl.mjs";
4
+ import { a as createMcpSearchAdapter, c as formatDocsAskAIPackageHints, d as resolveAskAISearchRequestConfig, f as resolveDocsSearchAudience, i as createCustomSearchAdapter, l as inferDocsAskAIPackageHints, n as buildDocsSearchDocuments, o as createSimpleSearchAdapter, p as resolveSearchRequestConfig, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter, t as buildDocsAskAIContext, u as performDocsSearch } from "./search-DBlw9h3P.mjs";
5
+ import { C as resolveApiReferenceOpenApiDiscovery, S as resolveApiReferenceConfig, T as remarkCodeGroup, _ as buildApiReferenceOpenApiDocument, a as DEFAULT_PROMPT_PROVIDER_TEMPLATES, b as buildApiReferenceScalarCss, c as resolvePromptProviderChoices, d as serializeDocsIconRegistry, f as serializeOpenDocsProvider, g as buildApiReferenceHtmlDocumentAsync, h as buildApiReferenceHtmlDocument, i as DEFAULT_OPEN_DOCS_TARGET, l as sanitizePromptText, m as DEFAULT_API_REFERENCE_OPENAPI_ROUTE, n as DEFAULT_OPEN_DOCS_PROMPT, o as normalizePromptProviderName, p as serializeOpenDocsProviders, r as DEFAULT_OPEN_DOCS_PROVIDER_IDS, s as parsePromptStringArray, t as readDocsSitemapManifest, u as serializeDocsIcon, v as buildApiReferenceOpenApiDocumentAsync, w as resolveApiReferenceRenderer, x as isApiReferenceOpenApiRequest, y as buildApiReferencePageTitle } from "./sitemap-server-DQp8qUKN.mjs";
6
+ import { a as buildDocsReviewWorkflowPathFilters, c as resolveDocsReviewConfig, i as buildDocsReviewWorkflow, n as DEFAULT_DOCS_REVIEW_SCORE_THRESHOLD, o as ensureDocsReviewWorkflow, r as DEFAULT_DOCS_REVIEW_WORKFLOW_PATH, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-DZR4J7Iz.mjs";
7
7
  import { DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DOCS_CONFIG_SCHEMA_OPTIONS, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, normalizeDocsMcpRoute, resolveDocsMcpConfig, runDocsMcpStdio } from "./mcp.mjs";
8
8
  import { n as isDocsCloudAskAIProvider, t as createDocsCloudAskAIResponse } from "./cloud-ask-ai-sbpjOR2K.mjs";
9
9
  import { createDocsCloudRouteHandler, createDocsCloudServer } from "./docs-cloud-server.mjs";
10
10
  import "./code-blocks-DnNVNK2M.mjs";
11
- import { n as resolveConfiguredAgentSkillsSync, t as resolveConfiguredAgentSkills } from "./agent-skills-server-Cuoqu8Jv.mjs";
11
+ import { n as resolveConfiguredAgentSkillsSync, t as resolveConfiguredAgentSkills } from "./agent-skills-server-iBfCLPOt.mjs";
12
12
  import { renderDocsAgentSkillsBundle } from "./agent-skills-vite.mjs";
13
13
 
14
14
  export { DEFAULT_API_REFERENCE_OPENAPI_ROUTE, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DEFAULT_DOCS_REVIEW_SCORE_THRESHOLD, DEFAULT_DOCS_REVIEW_WORKFLOW_PATH, DEFAULT_OPEN_DOCS_PROMPT, DEFAULT_OPEN_DOCS_PROVIDER_IDS, DEFAULT_OPEN_DOCS_TARGET, DEFAULT_PROMPT_PROVIDER_TEMPLATES, DEFAULT_SITEMAP_MANIFEST_PATH, DEFAULT_SITEMAP_MD_DOCS_ROUTE, DEFAULT_SITEMAP_MD_ROUTE, DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, DEFAULT_SITEMAP_XML_ROUTE, DOCS_AGENT_TRACE_EVENT_TYPES, DOCS_CONFIG_SCHEMA_OPTIONS, buildApiReferenceHtmlDocument, buildApiReferenceHtmlDocumentAsync, buildApiReferenceOpenApiDocument, buildApiReferenceOpenApiDocumentAsync, buildApiReferencePageTitle, buildApiReferenceScalarCss, buildDocsAskAIContext, buildDocsReviewWorkflow, buildDocsReviewWorkflowPathFilters, buildDocsSearchDocuments, buildDocsSitemapManifest, createAlgoliaSearchAdapter, createCustomSearchAdapter, createDocsAgentTraceContext, createDocsAgentTraceId, createDocsCloudAskAIResponse, createDocsCloudRouteHandler, createDocsCloudServer, createDocsMcpHttpHandler, createDocsMcpServer, createDocsSitemapResponse, createFilesystemDocsMcpSource, createMcpSearchAdapter, createSimpleSearchAdapter, createTypesenseSearchAdapter, emitDocsAgentTraceEvent, emitDocsAnalyticsEvent, emitDocsObservabilityEvent, ensureDocsReviewWorkflow, formatDocsAskAIPackageHints, getDocsConfigSchema, getDocsRequestAnalyticsProperties, inferDocsAskAIPackageHints, isApiReferenceOpenApiRequest, isDocsCloudAskAIProvider, normalizeDocsMcpRoute, normalizePromptProviderName, parsePromptStringArray, performDocsSearch, readDocsReviewConfigFromSource, readDocsSitemapManifest, readDocsSitemapManifestFromContentMap, remarkCodeGroup, renderDocsAgentSkillsBundle, renderDocsSitemapMarkdown, renderDocsSitemapXml, resolveApiReferenceConfig, resolveApiReferenceOpenApiDiscovery, resolveApiReferenceRenderer, resolveAskAISearchRequestConfig, resolveConfiguredAgentSkills, resolveConfiguredAgentSkillsSync, resolveDocsAnalyticsConfig, resolveDocsMcpConfig, resolveDocsObservabilityConfig, resolveDocsReviewConfig, resolveDocsSearchAudience, resolveDocsSitemapConfig, resolveDocsSitemapPageLastmod, resolveDocsSitemapRequest, resolvePromptProviderChoices, resolveSearchRequestConfig, runDocsGoldenTasks, runDocsMcpStdio, sanitizePromptText, serializeDocsIcon, serializeDocsIconRegistry, serializeOpenDocsProvider, serializeOpenDocsProviders, toDocsSitemapMarkdownUrl };
@@ -1,11 +1,11 @@
1
- import { At as buildDocsSitemapManifest, Ft as resolveDocsSitemapConfig, Nt as renderDocsSitemapMarkdown, Pt as renderDocsSitemapXml } from "./agent-CcR8_Yyd.mjs";
2
- import "./standards-discovery-C7p5lBhc.mjs";
3
- import "./search-D0A9lRGJ.mjs";
4
- import "./sitemap-server-atbbiVzW.mjs";
5
- import "./agent-evals-Bn_dA1_A.mjs";
1
+ import { At as buildDocsSitemapManifest, Ft as resolveDocsSitemapConfig, Nt as renderDocsSitemapMarkdown, Pt as renderDocsSitemapXml } from "./agent-D2SsSct2.mjs";
2
+ import "./standards-discovery-DSVKdQrl.mjs";
3
+ import "./search-DBlw9h3P.mjs";
4
+ import "./sitemap-server-DQp8qUKN.mjs";
5
+ import "./agent-evals-DZR4J7Iz.mjs";
6
6
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
7
7
  import "./code-blocks-DnNVNK2M.mjs";
8
- import "./agent-skills-server-Cuoqu8Jv.mjs";
8
+ import "./agent-skills-server-iBfCLPOt.mjs";
9
9
  import "./server.mjs";
10
10
  import { _ as resolveDocsContentDir, a as loadDocsConfigModule, d as readNavTitle, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
11
11
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
@@ -1,4 +1,4 @@
1
- import { Ft as resolveDocsSitemapConfig } from "./agent-CcR8_Yyd.mjs";
1
+ import { Ft as resolveDocsSitemapConfig } from "./agent-D2SsSct2.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
4
4
  import path, { basename, join, relative } from "node:path";
@@ -22,6 +22,9 @@ declare const DEFAULT_A2A_AGENT_CARD_FORMAT = "agent-card";
22
22
  declare const DEFAULT_A2A_PROTOCOL_BINDING = "HTTP+JSON";
23
23
  declare const DEFAULT_A2A_PROTOCOL_VERSION = "1.0";
24
24
  declare const AGENT_SKILLS_DISCOVERY_SCHEMA_URI = "https://schemas.agentskills.io/discovery/0.2.0/schema.json";
25
+ declare const DOCS_AGENT_MANIFEST_FORMAT = "farming-labs-agent-manifest.v1";
26
+ declare const DOCS_AGENT_MANIFEST_SCHEMA_URI = "https://docs.farming-labs.dev/schema/agent-manifest.v1.json";
27
+ declare const DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE = "application/schema+json";
25
28
  interface DocsAgentSkillIndexEntry {
26
29
  name: string;
27
30
  type: "skill-md" | "archive";
@@ -194,6 +197,13 @@ declare function getDocsDiscoveryLinkHeader(options?: {
194
197
  includeSkills?: boolean;
195
198
  includeAgentCard?: boolean;
196
199
  }): string;
200
+ /**
201
+ * Add the registered `describedby` relation for the Farming Labs manifest schema.
202
+ *
203
+ * Keep this scoped to agent-manifest responses: the shared discovery Link header is
204
+ * also used by unrelated resources that the manifest schema does not describe.
205
+ */
206
+ declare function getDocsAgentManifestLinkHeader(discoveryLinkHeader?: string): string;
197
207
  declare function appendDocsDiscoveryLinkHeader(headers: Headers, value?: string): Headers;
198
208
  /** Return one RFC 9727 or Agent Skills discovery response, or null for unrelated requests. */
199
209
  declare function createDocsStandardsResponse({
@@ -207,4 +217,4 @@ declare function createDocsStandardsResponse({
207
217
  agentCard
208
218
  }: CreateDocsStandardsResponseOptions): Promise<Response | null>;
209
219
  //#endregion
210
- export { DocsApiCatalogLinkTarget as A, buildDocsAgentSkillsIndex as B, DocsA2AAgentCard as C, DocsAgentSkillsIndex as D, DocsAgentSkillIndexEntry as E, DocsPublishedAgentSkillOptions as F, isDocsStandardsDiscoveryRequest as G, buildDocsLegacySkillsIndex as H, DocsStandardsDiscoveryRequest as I, resolveDocsStandardsDiscoveryRequest as J, resolveDocsDiscoveryApiRoute as K, DocsStandardsDiscoveryRouteOptions as L, DocsDiscoveryApiRouteOptions as M, DocsPublishedAgentSkill as N, DocsApiCatalog as O, DocsPublishedAgentSkillFile as P, appendDocsDiscoveryLinkHeader as R, DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX as S, DocsA2AAgentInterface as T, createDocsStandardsResponse as U, buildDocsApiCatalog as V, getDocsDiscoveryLinkHeader as W, sha256DocsDiscoveryContent as Y, DEFAULT_AGENT_SKILL_RESOURCE_FORMAT as _, DEFAULT_A2A_AGENT_CARD_FORMAT as a, DEFAULT_LEGACY_SKILLS_INDEX_FORMAT as b, DEFAULT_A2A_PROTOCOL_VERSION as c, DEFAULT_AGENT_SKILLS_INDEX_ROUTE as d, DEFAULT_AGENT_SKILLS_ROUTE_PATTERN as f, DEFAULT_AGENT_SKILL_FORMAT as g, DEFAULT_AGENT_SKILL_FILE_FORMAT as h, CreateDocsStandardsResponseOptions as i, DocsApiCatalogOptions as j, DocsApiCatalogLinkContext as k, DEFAULT_AGENT_SKILLS_ARCHIVE_ROUTE_PATTERN as l, DEFAULT_AGENT_SKILL_ARCHIVE_FORMAT as m, API_CATALOG_MEDIA_TYPE as n, DEFAULT_A2A_AGENT_CARD_ROUTE as o, DEFAULT_AGENT_SKILLS_ROUTE_PREFIX as p, resolveDocsPublishedAgentSkill as q, API_CATALOG_PROFILE_URI as r, DEFAULT_A2A_PROTOCOL_BINDING as s, AGENT_SKILLS_DISCOVERY_SCHEMA_URI as t, DEFAULT_AGENT_SKILLS_INDEX_FORMAT as u, DEFAULT_API_CATALOG_FORMAT as v, DocsA2AAgentCardOptions as w, DEFAULT_LEGACY_SKILLS_INDEX_ROUTE as x, DEFAULT_API_CATALOG_ROUTE as y, buildDocsA2AAgentCard as z };
220
+ export { sha256DocsDiscoveryContent as $, DocsAgentSkillsIndex as A, DocsStandardsDiscoveryRouteOptions as B, DOCS_AGENT_MANIFEST_FORMAT as C, DocsA2AAgentCardOptions as D, DocsA2AAgentCard as E, DocsDiscoveryApiRouteOptions as F, buildDocsLegacySkillsIndex as G, buildDocsA2AAgentCard as H, DocsPublishedAgentSkill as I, getDocsDiscoveryLinkHeader as J, createDocsStandardsResponse as K, DocsPublishedAgentSkillFile as L, DocsApiCatalogLinkContext as M, DocsApiCatalogLinkTarget as N, DocsA2AAgentInterface as O, DocsApiCatalogOptions as P, resolveDocsStandardsDiscoveryRequest as Q, DocsPublishedAgentSkillOptions as R, DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX as S, DOCS_AGENT_MANIFEST_SCHEMA_URI as T, buildDocsAgentSkillsIndex as U, appendDocsDiscoveryLinkHeader as V, buildDocsApiCatalog as W, resolveDocsDiscoveryApiRoute as X, isDocsStandardsDiscoveryRequest as Y, resolveDocsPublishedAgentSkill as Z, DEFAULT_AGENT_SKILL_RESOURCE_FORMAT as _, DEFAULT_A2A_AGENT_CARD_FORMAT as a, DEFAULT_LEGACY_SKILLS_INDEX_FORMAT as b, DEFAULT_A2A_PROTOCOL_VERSION as c, DEFAULT_AGENT_SKILLS_INDEX_ROUTE as d, DEFAULT_AGENT_SKILLS_ROUTE_PATTERN as f, DEFAULT_AGENT_SKILL_FORMAT as g, DEFAULT_AGENT_SKILL_FILE_FORMAT as h, CreateDocsStandardsResponseOptions as i, DocsApiCatalog as j, DocsAgentSkillIndexEntry as k, DEFAULT_AGENT_SKILLS_ARCHIVE_ROUTE_PATTERN as l, DEFAULT_AGENT_SKILL_ARCHIVE_FORMAT as m, API_CATALOG_MEDIA_TYPE as n, DEFAULT_A2A_AGENT_CARD_ROUTE as o, DEFAULT_AGENT_SKILLS_ROUTE_PREFIX as p, getDocsAgentManifestLinkHeader as q, API_CATALOG_PROFILE_URI as r, DEFAULT_A2A_PROTOCOL_BINDING as s, AGENT_SKILLS_DISCOVERY_SCHEMA_URI as t, DEFAULT_AGENT_SKILLS_INDEX_FORMAT as u, DEFAULT_API_CATALOG_FORMAT as v, DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE as w, DEFAULT_LEGACY_SKILLS_INDEX_ROUTE as x, DEFAULT_API_CATALOG_ROUTE as y, DocsStandardsDiscoveryRequest as z };
@@ -22,6 +22,9 @@ const DEFAULT_A2A_AGENT_CARD_FORMAT = "agent-card";
22
22
  const DEFAULT_A2A_PROTOCOL_BINDING = "HTTP+JSON";
23
23
  const DEFAULT_A2A_PROTOCOL_VERSION = "1.0";
24
24
  const AGENT_SKILLS_DISCOVERY_SCHEMA_URI = "https://schemas.agentskills.io/discovery/0.2.0/schema.json";
25
+ const DOCS_AGENT_MANIFEST_FORMAT = "farming-labs-agent-manifest.v1";
26
+ const DOCS_AGENT_MANIFEST_SCHEMA_URI = "https://docs.farming-labs.dev/schema/agent-manifest.v1.json";
27
+ const DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE = "application/schema+json";
25
28
  const DEFAULT_DOCS_API_ROUTE = "/api/docs";
26
29
  const DEFAULT_AGENT_MANIFEST_ROUTE = "/.well-known/agent.json";
27
30
  const AGENT_SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
@@ -644,6 +647,18 @@ function getDocsDiscoveryLinkHeader(options = {}) {
644
647
  ...options.includeAgentCard ? [formatLinkTarget(DEFAULT_A2A_AGENT_CARD_ROUTE, "service-meta", { type: "application/json" })] : []
645
648
  ].join(", ");
646
649
  }
650
+ /**
651
+ * Add the registered `describedby` relation for the Farming Labs manifest schema.
652
+ *
653
+ * Keep this scoped to agent-manifest responses: the shared discovery Link header is
654
+ * also used by unrelated resources that the manifest schema does not describe.
655
+ */
656
+ function getDocsAgentManifestLinkHeader(discoveryLinkHeader = getDocsDiscoveryLinkHeader()) {
657
+ const schemaLink = formatLinkTarget(DOCS_AGENT_MANIFEST_SCHEMA_URI, "describedby", { type: DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE });
658
+ if (!discoveryLinkHeader.trim()) return schemaLink;
659
+ if (discoveryLinkHeader.includes(schemaLink)) return discoveryLinkHeader;
660
+ return `${discoveryLinkHeader}, ${schemaLink}`;
661
+ }
647
662
  function appendDocsDiscoveryLinkHeader(headers, value) {
648
663
  const next = new Headers(headers);
649
664
  const discoveryLinks = value ?? getDocsDiscoveryLinkHeader();
@@ -793,4 +808,4 @@ async function createDocsStandardsResponse({ request, apiCatalog, apiCatalogEnab
793
808
  }
794
809
 
795
810
  //#endregion
796
- export { isDocsStandardsDiscoveryRequest as A, buildDocsA2AAgentCard as C, buildDocsPublishedAgentSkill as D, buildDocsLegacySkillsIndex as E, resolveDocsPublishedAgentSkill as M, resolveDocsStandardsDiscoveryRequest as N, createDocsStandardsResponse as O, sha256DocsDiscoveryContent as P, appendDocsDiscoveryLinkHeader as S, buildDocsApiCatalog as T, DEFAULT_API_CATALOG_FORMAT as _, DEFAULT_A2A_AGENT_CARD_ROUTE as a, DEFAULT_LEGACY_SKILLS_INDEX_ROUTE as b, DEFAULT_AGENT_SKILLS_ARCHIVE_ROUTE_PATTERN as c, DEFAULT_AGENT_SKILLS_ROUTE_PATTERN as d, DEFAULT_AGENT_SKILLS_ROUTE_PREFIX as f, DEFAULT_AGENT_SKILL_RESOURCE_FORMAT as g, DEFAULT_AGENT_SKILL_FORMAT as h, DEFAULT_A2A_AGENT_CARD_FORMAT as i, resolveDocsDiscoveryApiRoute as j, getDocsDiscoveryLinkHeader as k, DEFAULT_AGENT_SKILLS_INDEX_FORMAT as l, DEFAULT_AGENT_SKILL_FILE_FORMAT as m, API_CATALOG_MEDIA_TYPE as n, DEFAULT_A2A_PROTOCOL_BINDING as o, DEFAULT_AGENT_SKILL_ARCHIVE_FORMAT as p, API_CATALOG_PROFILE_URI as r, DEFAULT_A2A_PROTOCOL_VERSION as s, AGENT_SKILLS_DISCOVERY_SCHEMA_URI as t, DEFAULT_AGENT_SKILLS_INDEX_ROUTE as u, DEFAULT_API_CATALOG_ROUTE as v, buildDocsAgentSkillsIndex as w, DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX as x, DEFAULT_LEGACY_SKILLS_INDEX_FORMAT as y };
811
+ export { buildDocsPublishedAgentSkill as A, DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE as C, buildDocsAgentSkillsIndex as D, buildDocsA2AAgentCard as E, resolveDocsDiscoveryApiRoute as F, resolveDocsPublishedAgentSkill as I, resolveDocsStandardsDiscoveryRequest as L, getDocsAgentManifestLinkHeader as M, getDocsDiscoveryLinkHeader as N, buildDocsApiCatalog as O, isDocsStandardsDiscoveryRequest as P, sha256DocsDiscoveryContent as R, DOCS_AGENT_MANIFEST_FORMAT as S, appendDocsDiscoveryLinkHeader as T, DEFAULT_API_CATALOG_FORMAT as _, DEFAULT_A2A_AGENT_CARD_ROUTE as a, DEFAULT_LEGACY_SKILLS_INDEX_ROUTE as b, DEFAULT_AGENT_SKILLS_ARCHIVE_ROUTE_PATTERN as c, DEFAULT_AGENT_SKILLS_ROUTE_PATTERN as d, DEFAULT_AGENT_SKILLS_ROUTE_PREFIX as f, DEFAULT_AGENT_SKILL_RESOURCE_FORMAT as g, DEFAULT_AGENT_SKILL_FORMAT as h, DEFAULT_A2A_AGENT_CARD_FORMAT as i, createDocsStandardsResponse as j, buildDocsLegacySkillsIndex as k, DEFAULT_AGENT_SKILLS_INDEX_FORMAT as l, DEFAULT_AGENT_SKILL_FILE_FORMAT as m, API_CATALOG_MEDIA_TYPE as n, DEFAULT_A2A_PROTOCOL_BINDING as o, DEFAULT_AGENT_SKILL_ARCHIVE_FORMAT as p, API_CATALOG_PROFILE_URI as r, DEFAULT_A2A_PROTOCOL_VERSION as s, AGENT_SKILLS_DISCOVERY_SCHEMA_URI as t, DEFAULT_AGENT_SKILLS_INDEX_ROUTE as u, DEFAULT_API_CATALOG_ROUTE as v, DOCS_AGENT_MANIFEST_SCHEMA_URI as w, DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX as x, DEFAULT_LEGACY_SKILLS_INDEX_FORMAT as y };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.2.66",
3
+ "version": "0.2.68",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",
@@ -78,6 +78,8 @@
78
78
  "devDependencies": {
79
79
  "@types/node": "^22.10.0",
80
80
  "@types/react": "^19.2.2",
81
+ "ajv": "^8.18.0",
82
+ "ajv-formats": "^3.0.1",
81
83
  "react": "^19.2.0",
82
84
  "tsdown": "^0.20.3",
83
85
  "typescript": "^5.9.3",