@farming-labs/docs 0.2.103 → 0.2.104

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 (58) hide show
  1. package/dist/{agent-lWTq6pgr.d.mts → agent-C9IdC__R.d.mts} +9 -3
  2. package/dist/{agent-BLHMoVId.mjs → agent-NerpHcQB.mjs} +3 -3
  3. package/dist/{agent-CFqECAG0.mjs → agent-PSrgiJD8.mjs} +165 -8
  4. package/dist/{agent-evals-GpcaCbRb.mjs → agent-evals-U9d_db2u.mjs} +2 -2
  5. package/dist/{agent-export-oiWxB5aX.mjs → agent-export-DlBUKkTt.mjs} +20 -9
  6. package/dist/agent-feedback-loop-CGrc-gDW.mjs +196 -0
  7. package/dist/agent-skills-bundle.d.mts +1 -1
  8. package/dist/{agent-skills-server-CICMh0zv.d.mts → agent-skills-server-CIoL58X7.d.mts} +2 -2
  9. package/dist/agent-skills-vite.d.mts +3 -3
  10. package/dist/{agents-CtqIUW5I.mjs → agents-D3SLnQet.mjs} +8 -7
  11. package/dist/{analytics-C75BnTEW.d.mts → analytics-B-jz7re8.d.mts} +1 -1
  12. package/dist/authoring-BsWXMH43.mjs +41 -0
  13. package/dist/authoring-mcp-BCM5CJbJ.mjs +380 -0
  14. package/dist/browser.d.mts +3 -3
  15. package/dist/cli/index.mjs +67 -35
  16. package/dist/client/react.d.mts +1 -1
  17. package/dist/{cloud-FNfcbfli.mjs → cloud-BLxt_HYO.mjs} +3 -3
  18. package/dist/{cloud-ask-ai-BmbZVAT5.d.mts → cloud-ask-ai-19G2HJ62.d.mts} +1 -1
  19. package/dist/{code-blocks-Bel6vDqI.mjs → code-blocks-c3nIrWOM.mjs} +1 -1
  20. package/dist/{codeblocks-jbWuvtJQ.mjs → codeblocks-qHdKGVaE.mjs} +2 -2
  21. package/dist/{dev-BvbYmTLz.mjs → dev-B0iHJjTz.mjs} +3 -3
  22. package/dist/docs-cloud-server.d.mts +2 -2
  23. package/dist/docs-cloud-server.mjs +1 -1
  24. package/dist/{doctor-Bmm0uY98.mjs → doctor-x3k6aE2I.mjs} +16 -12
  25. package/dist/{downgrade-Dqm0rJMy.mjs → downgrade-Dd3vvVdD.mjs} +2 -2
  26. package/dist/feedback-DdWc33oO.mjs +72 -0
  27. package/dist/{golden-evaluations-K45fcWGW.mjs → golden-evaluations-7k7Akp3R.mjs} +2 -2
  28. package/dist/index.d.mts +70 -8
  29. package/dist/index.mjs +5 -5
  30. package/dist/{init-jDQSo-Or.mjs → init-DKukQdOQ.mjs} +3 -3
  31. package/dist/{mcp-CwgKlbIz.mjs → mcp-B6ZZdp6F.mjs} +7 -6
  32. package/dist/mcp.d.mts +18 -5
  33. package/dist/mcp.mjs +457 -38
  34. package/dist/{content-change-hydration-BsbBXAUi.mjs → openapi-mcp-B7u7Y0gB.mjs} +116 -2
  35. package/dist/{package-version--oQiHwZj.mjs → package-version-P4TT_9IO.mjs} +1 -1
  36. package/dist/{prompt-references-DW5vG5zs.mjs → prompt-references-Ca2Rcrpw.mjs} +2 -2
  37. package/dist/{retrieval-digest-DYEsIeCE.d.mts → retrieval-digest-DT9Ktc4C.d.mts} +2 -2
  38. package/dist/{review-C_5wB0rR.mjs → review-DgaNTtP0.mjs} +8 -8
  39. package/dist/{robots-NQesPX5L.mjs → robots-DNod0XKB.mjs} +1 -1
  40. package/dist/{robots-BQ42Y84a.mjs → robots-msD1xoH5.mjs} +4 -4
  41. package/dist/{search-B5etKU-v.mjs → search-CNzq9S5S.mjs} +7 -6
  42. package/dist/server.d.mts +92 -7
  43. package/dist/server.mjs +9 -7
  44. package/dist/{sidebar-CwZlgyAz.d.mts → sidebar-DmXRpAAK.d.mts} +1 -1
  45. package/dist/{sitemap-DjhxvQP1.mjs → sitemap-CHvips7o.mjs} +8 -7
  46. package/dist/{sitemap-server-B0SiREN0.mjs → sitemap-server-C2TauhKa.mjs} +11 -1
  47. package/dist/{skills-BFang8vF.mjs → skills-aaE5L1go.mjs} +8 -7
  48. package/dist/{standards-discovery-D1Ys4J3h.d.mts → standards-discovery-Cqq8QmlH.d.mts} +1 -1
  49. package/dist/{types-DLLefoU5.d.mts → types-BthCiAD9.d.mts} +114 -1
  50. package/dist/{upgrade-kj2crJSk.mjs → upgrade-B0OA_7jE.mjs} +2 -2
  51. package/package.json +1 -1
  52. /package/dist/{agent-skills-progressive-disclosure-Da9LKEKv.mjs → agent-skills-progressive-disclosure-CfIsq4Ew.mjs} +0 -0
  53. /package/dist/{audience-exposure-Cw3SA4WE.d.mts → audience-exposure-BW13cI2O.d.mts} +0 -0
  54. /package/dist/{cloud-ask-ai-CkCYjf2N.mjs → cloud-ask-ai-DeojA5lB.mjs} +0 -0
  55. /package/dist/{config-BaTmjDqD.mjs → config-BhF6J2N4.mjs} +0 -0
  56. /package/dist/{errors-DZiNXv5c.mjs → errors-B5KTe1Xo.mjs} +0 -0
  57. /package/dist/{templates-kc7jxspR.mjs → templates-m_j4ARnu.mjs} +0 -0
  58. /package/dist/{utils-DOMeZW9V.mjs → utils-DcCUwxqS.mjs} +0 -0
@@ -1,6 +1,6 @@
1
- import { $n as DocsSearchResult, Cn as DocsRobotsConfig, Dn as DocsSearchAdapterFactory, F as DocsAgentContentChangesConfig, Gt as DocsContentSnapshot, Hn as DocsSearchFilterField, Hr as ResolvedDocsRelatedLink, K as DocsAgentFeedbackData, Mn as DocsSearchChunkingConfig, Nn as DocsSearchConfig, Pn as DocsSearchDocument, Pr as PageAgentFrontmatter, Qr as TypesenseDocsSearchConfig, Rt as DocsConfig, Tn as DocsSearchAdapter, Un as DocsSearchFilterInput, Wn as DocsSearchFilters, Wt as DocsContentChangesResponse, Yt as DocsI18nConfig, Zn as DocsSearchRequest, _r as LlmsTxtConfig, br as LlmsTxtSectionConfig, f as CustomDocsSearchConfig, ir as DocsSitemapConfig, pn as DocsPaginatedSearchResponse, pr as FeedbackConfig, r as AlgoliaDocsSearchConfig, tn as DocsMcpConfig, tr as DocsSearchSourcePage, vr as LlmsTxtMaxCharsConfig, wt as DocsAskAIMcpConfig, xr as McpDocsSearchConfig, yr as LlmsTxtMaxCharsMode, zn as DocsSearchFacetsResponse } from "./types-DLLefoU5.mjs";
2
- import { O as DocsA2AAgentCardOptions, R as DocsDiscoveryApiRouteOptions, z as DocsPublishedAgentSkill } from "./standards-discovery-D1Ys4J3h.mjs";
3
- import { t as DocsContentAudience } from "./audience-exposure-Cw3SA4WE.mjs";
1
+ import { $n as DocsSearchFilterInput, Ar as LlmsTxtSectionConfig, Cn as DocsPaginatedSearchResponse, Cr as FeedbackConfig, Dr as LlmsTxtConfig, F as DocsAgentContentChangesConfig, Fn as DocsSearchAdapter, Gt as DocsContentSnapshot, Hn as DocsSearchChunkingConfig, K as DocsAgentFeedbackData, Ln as DocsSearchAdapterFactory, Nn as DocsRobotsConfig, Or as LlmsTxtMaxCharsConfig, Qn as DocsSearchFilterField, Rt as DocsConfig, Un as DocsSearchConfig, Wn as DocsSearchDocument, Wt as DocsContentChangesResponse, Yn as DocsSearchFacetsResponse, Yt as DocsI18nConfig, di as TypesenseDocsSearchConfig, dr as DocsSearchSourcePage, er as DocsSearchFilters, f as CustomDocsSearchConfig, jr as McpDocsSearchConfig, kr as LlmsTxtMaxCharsMode, lr as DocsSearchResult, mn as DocsOkfConfig, mr as DocsSitemapConfig, qr as PageAgentFrontmatter, r as AlgoliaDocsSearchConfig, sr as DocsSearchRequest, ti as ResolvedDocsRelatedLink, tn as DocsMcpConfig, vn as DocsOkfTrustMetadataInput, wt as DocsAskAIMcpConfig } from "./types-BthCiAD9.mjs";
2
+ import { O as DocsA2AAgentCardOptions, R as DocsDiscoveryApiRouteOptions, z as DocsPublishedAgentSkill } from "./standards-discovery-Cqq8QmlH.mjs";
3
+ import { t as DocsContentAudience } from "./audience-exposure-BW13cI2O.mjs";
4
4
  import { DocsMcpPage, DocsMcpResolvedConfig, DocsMcpResolvedPromptsConfig } from "./mcp.mjs";
5
5
 
6
6
  //#region src/i18n.d.ts
@@ -751,6 +751,8 @@ interface DocsMarkdownPage {
751
751
  markdownUrl?: string;
752
752
  lastModified?: string;
753
753
  lastmod?: string;
754
+ sourcePath?: string;
755
+ okf?: DocsOkfTrustMetadataInput;
754
756
  related?: ResolvedDocsRelatedLink[];
755
757
  agent?: PageAgentFrontmatter;
756
758
  content: string;
@@ -762,6 +764,7 @@ interface DocsMarkdownPage {
762
764
  }
763
765
  interface DocsMarkdownDocumentOptions {
764
766
  llms?: boolean | DocsLlmsDiscoveryConfig | LlmsTxtConfig;
767
+ okf?: boolean | DocsOkfConfig;
765
768
  origin?: string;
766
769
  sitemap?: boolean | DocsSitemapConfig;
767
770
  }
@@ -1287,6 +1290,8 @@ declare function buildDocsAgentDiscoverySpec({
1287
1290
  listPages: boolean;
1288
1291
  listPageSections?: boolean;
1289
1292
  readPage: boolean;
1293
+ readPages?: boolean;
1294
+ submitFeedback?: boolean;
1290
1295
  listTasks?: boolean;
1291
1296
  readTask?: boolean;
1292
1297
  searchDocs: boolean;
@@ -1297,6 +1302,7 @@ declare function buildDocsAgentDiscoverySpec({
1297
1302
  getCodeExamples: boolean;
1298
1303
  getConfigSchema: boolean;
1299
1304
  getContext: boolean;
1305
+ getTrustMetadata?: boolean;
1300
1306
  };
1301
1307
  prompts: DocsMcpResolvedPromptsConfig;
1302
1308
  };
@@ -1,8 +1,8 @@
1
- import { B as findDocsMarkdownPage, at as renderDocsMarkdownDocument } from "./agent-CFqECAG0.mjs";
1
+ import { B as findDocsMarkdownPage, at as renderDocsMarkdownDocument } from "./agent-PSrgiJD8.mjs";
2
2
  import { v as normalizePageAgentFrontmatter, x as stripGeneratedPageAgentContractMarkdown } from "./markdown-sections-7OoA7ylx.mjs";
3
- import { c as hashGeneratedAgentContent, d as serializeGeneratedAgentDocument, s as GENERATED_AGENT_PROVENANCE_VERSION, u as parseGeneratedAgentDocument } from "./content-change-hydration-BsbBXAUi.mjs";
3
+ import { f as parseGeneratedAgentDocument, l as GENERATED_AGENT_PROVENANCE_VERSION, p as serializeGeneratedAgentDocument, u as hashGeneratedAgentContent } from "./openapi-mcp-B7u7Y0gB.mjs";
4
4
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
5
- import { _ as resolveDocsContentDir, a as loadDocsConfigModule, c as loadProjectEnv, d as readNavTitle, f as readNumberProperty, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral, u as readEnvReferenceProperty } from "./config-BaTmjDqD.mjs";
5
+ import { _ as resolveDocsContentDir, a as loadDocsConfigModule, c as loadProjectEnv, d as readNavTitle, f as readNumberProperty, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral, u as readEnvReferenceProperty } from "./config-BhF6J2N4.mjs";
6
6
  import { createRequire } from "node:module";
7
7
  import matter from "gray-matter";
8
8
  import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
@@ -3,6 +3,150 @@ import { B as createDocsCacheableResponse, F as isDocsStandardsDiscoveryRequest,
3
3
  import { t as resolveDocsAudienceExposure } from "./audience-exposure-DVsfT9Sx.mjs";
4
4
  import { createProcessor } from "@mdx-js/mdx";
5
5
 
6
+ //#region src/okf.ts
7
+ const DOCS_OKF_VERSION = "0.2";
8
+ const DOCS_OKF_BUNDLE_FORMAT = "open-knowledge-format.v0.2";
9
+ const DEFAULT_DOCS_OKF_ROUTE = "/.well-known/okf.json";
10
+ function cleanString$1(value) {
11
+ if (typeof value !== "string") return void 0;
12
+ return value.trim() || void 0;
13
+ }
14
+ function normalizeDate(value) {
15
+ if (value instanceof Date && Number.isFinite(value.getTime())) return value.toISOString();
16
+ const stringValue = cleanString$1(value);
17
+ if (!stringValue) return void 0;
18
+ const parsed = new Date(stringValue);
19
+ return Number.isFinite(parsed.getTime()) ? parsed.toISOString() : void 0;
20
+ }
21
+ function normalizeDateOnly$1(value) {
22
+ return normalizeDate(value)?.slice(0, 10);
23
+ }
24
+ function normalizeStatus(value) {
25
+ return value === "draft" || value === "stable" || value === "deprecated" ? value : void 0;
26
+ }
27
+ function normalizeActorTimestamp(value) {
28
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
29
+ const record = value;
30
+ const by = cleanString$1(record.by);
31
+ const at = normalizeDate(record.at);
32
+ return by && at ? {
33
+ by,
34
+ at
35
+ } : void 0;
36
+ }
37
+ function normalizeSource(value) {
38
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
39
+ const record = value;
40
+ const resource = cleanString$1(record.resource);
41
+ if (!resource) return void 0;
42
+ const usageCount = typeof record.usage_count === "number" && Number.isInteger(record.usage_count) ? Math.max(0, record.usage_count) : void 0;
43
+ const usageWindowRecord = record.usage_window && typeof record.usage_window === "object" && !Array.isArray(record.usage_window) ? record.usage_window : void 0;
44
+ const usageWindow = usageWindowRecord ? {
45
+ ...normalizeDate(usageWindowRecord.start) ? { start: normalizeDate(usageWindowRecord.start) } : {},
46
+ ...normalizeDate(usageWindowRecord.end) ? { end: normalizeDate(usageWindowRecord.end) } : {}
47
+ } : void 0;
48
+ return {
49
+ resource,
50
+ ...cleanString$1(record.id) ? { id: cleanString$1(record.id) } : {},
51
+ ...cleanString$1(record.title) ? { title: cleanString$1(record.title) } : {},
52
+ ...cleanString$1(record.author) ? { author: cleanString$1(record.author) } : {},
53
+ ...usageCount !== void 0 ? { usage_count: usageCount } : {},
54
+ ...normalizeDate(record.last_modified) ? { last_modified: normalizeDate(record.last_modified) } : {},
55
+ ...usageWindow && Object.keys(usageWindow).length > 0 ? { usage_window: usageWindow } : {}
56
+ };
57
+ }
58
+ function normalizeDocsOkfTrustMetadataInput(value) {
59
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
60
+ const record = value;
61
+ const sources = Array.isArray(record.sources) ? record.sources.flatMap((source) => {
62
+ const normalized = normalizeSource(source);
63
+ return normalized ? [normalized] : [];
64
+ }) : void 0;
65
+ const verified = Array.isArray(record.verified) ? record.verified.flatMap((entry) => {
66
+ const normalized = normalizeActorTimestamp(entry);
67
+ return normalized ? [normalized] : [];
68
+ }) : void 0;
69
+ const generated = normalizeActorTimestamp(record.generated);
70
+ const status = normalizeStatus(record.status);
71
+ const staleAfter = normalizeDateOnly$1(record.stale_after);
72
+ const result = {
73
+ ...sources && sources.length > 0 ? { sources } : {},
74
+ ...generated ? { generated } : {},
75
+ ...verified && verified.length > 0 ? { verified } : {},
76
+ ...status ? { status } : {},
77
+ ...staleAfter ? { stale_after: staleAfter } : {}
78
+ };
79
+ return Object.keys(result).length > 0 ? result : void 0;
80
+ }
81
+ function resolveDocsOkfConfig(value) {
82
+ const config = value && typeof value === "object" ? value : {};
83
+ return {
84
+ enabled: value === true || typeof value === "object" && value !== null && value.enabled !== false,
85
+ route: cleanString$1(config.route) ?? DEFAULT_DOCS_OKF_ROUTE,
86
+ generatedBy: cleanString$1(config.generatedBy) ?? "software:@farming-labs/docs",
87
+ ...Number.isInteger(config.staleAfterDays) && (config.staleAfterDays ?? 0) > 0 ? { staleAfterDays: config.staleAfterDays } : {},
88
+ ...normalizeDocsOkfTrustMetadataInput(config)
89
+ };
90
+ }
91
+ function addDays(value, days) {
92
+ const parsed = new Date(value);
93
+ if (!Number.isFinite(parsed.getTime())) return void 0;
94
+ parsed.setUTCDate(parsed.getUTCDate() + days);
95
+ return parsed.toISOString().slice(0, 10);
96
+ }
97
+ function trustTier(verified) {
98
+ if (verified.some((entry) => entry.by.toLowerCase().startsWith("human:"))) return "human-reviewed";
99
+ return verified.length > 0 ? "machine-confirmed" : "unverified";
100
+ }
101
+ function resolveDocsOkfTrustMetadata(page, value, now = /* @__PURE__ */ new Date()) {
102
+ const config = resolveDocsOkfConfig(value);
103
+ const authored = normalizeDocsOkfTrustMetadataInput(page.okf) ?? {};
104
+ const bestTimestamp = normalizeDate(page.lastmod) ?? normalizeDate(page.lastModified);
105
+ const generated = authored.generated ?? config.generated ?? {
106
+ by: config.generatedBy,
107
+ at: bestTimestamp ?? "1970-01-01T00:00:00.000Z"
108
+ };
109
+ const sources = [...authored.sources ?? config.sources ?? []];
110
+ if (sources.length === 0) sources.push({
111
+ resource: page.canonicalUrl ?? page.url,
112
+ ...page.sourcePath ? { id: page.sourcePath } : {},
113
+ title: page.title,
114
+ ...bestTimestamp ? { last_modified: bestTimestamp } : {}
115
+ });
116
+ const verified = [...authored.verified ?? config.verified ?? []];
117
+ const staleAfter = authored.stale_after ?? config.stale_after ?? (config.staleAfterDays && bestTimestamp ? addDays(bestTimestamp, config.staleAfterDays) : void 0);
118
+ return {
119
+ sources,
120
+ generated,
121
+ verified,
122
+ status: authored.status ?? config.status ?? "stable",
123
+ ...staleAfter ? { stale_after: staleAfter } : {},
124
+ trust_tier: trustTier(verified),
125
+ stale: staleAfter ? now.getTime() > (/* @__PURE__ */ new Date(`${staleAfter}T23:59:59.999Z`)).getTime() : false
126
+ };
127
+ }
128
+ function buildDocsOkfBundle(pages, value) {
129
+ const config = resolveDocsOkfConfig(value);
130
+ const documents = pages.map((page) => ({
131
+ id: page.sourcePath ?? page.url,
132
+ url: page.canonicalUrl ?? page.url,
133
+ title: page.title,
134
+ ...page.content ? { content: page.content } : {},
135
+ trust: resolveDocsOkfTrustMetadata(page, config)
136
+ })).sort((left, right) => left.url.localeCompare(right.url));
137
+ const generatedAt = documents.reduce((latest, document) => document.trust.generated.at > latest ? document.trust.generated.at : latest, "1970-01-01T00:00:00.000Z");
138
+ return {
139
+ format: DOCS_OKF_BUNDLE_FORMAT,
140
+ spec_version: DOCS_OKF_VERSION,
141
+ generated: {
142
+ by: config.generatedBy,
143
+ at: generatedAt
144
+ },
145
+ documents
146
+ };
147
+ }
148
+
149
+ //#endregion
6
150
  //#region src/mcp-auth.ts
7
151
  const DEFAULT_MCP_ROUTE = "/api/docs/mcp";
8
152
  const DEFAULT_MCP_PUBLIC_ROUTE = "/mcp";
@@ -3315,6 +3459,7 @@ async function enrichDocsSearchResultsWithSources(options) {
3315
3459
  const page = findPageForSearchResult(localizedPages, result, options.baseUrl, pagesByRoute);
3316
3460
  if (page) return {
3317
3461
  ...resultWithoutSource,
3462
+ trust: resolveDocsOkfTrustMetadata(page),
3318
3463
  source: await buildDocsRetrievalSource(page, result.url, {
3319
3464
  audience: options.audience,
3320
3465
  chunking: options.chunking,
@@ -6123,6 +6268,8 @@ const DEFAULT_DOCS_DIAGNOSTICS_MCP_TOOLS = {
6123
6268
  listPages: true,
6124
6269
  listPageSections: true,
6125
6270
  readPage: true,
6271
+ readPages: true,
6272
+ submitFeedback: true,
6126
6273
  listTasks: true,
6127
6274
  readTask: true,
6128
6275
  searchDocs: true,
@@ -7633,7 +7780,7 @@ function resolveDocsMarkdownMetadataUrl(value, origin) {
7633
7780
  return value;
7634
7781
  }
7635
7782
  }
7636
- function renderDocsMarkdownFrontmatter({ title, description, canonicalUrl, markdownUrl, lastUpdated, agent, generatedPreamble }) {
7783
+ function renderDocsMarkdownFrontmatter({ title, description, canonicalUrl, markdownUrl, lastUpdated, trust, agent, generatedPreamble }) {
7637
7784
  return [
7638
7785
  "---",
7639
7786
  `title: ${toYamlString(title)}`,
@@ -7641,6 +7788,7 @@ function renderDocsMarkdownFrontmatter({ title, description, canonicalUrl, markd
7641
7788
  `canonical_url: ${toYamlString(canonicalUrl)}`,
7642
7789
  `markdown_url: ${toYamlString(markdownUrl)}`,
7643
7790
  ...lastUpdated ? [`last_updated: ${toYamlString(lastUpdated)}`] : [],
7791
+ ...trust ? [`okf: ${JSON.stringify(trust)}`] : [],
7644
7792
  ...generatedPreamble ? [`${DOCS_MARKDOWN_GENERATED_PREAMBLE_FIELD}: true`] : [],
7645
7793
  ...renderPageAgentFrontmatterYamlLines(agent),
7646
7794
  "---"
@@ -7914,13 +8062,19 @@ function selectDocsMarkdownSection(document, request) {
7914
8062
  };
7915
8063
  }
7916
8064
  function resolveDocsMarkdownPageMetadata(page, options) {
8065
+ const canonicalUrl = resolveDocsMarkdownMetadataUrl(page.url, options?.origin);
8066
+ const okfEnabled = resolveDocsOkfConfig(options?.okf).enabled || page.okf !== void 0;
7917
8067
  return {
7918
8068
  title: page.title,
7919
8069
  description: page.description,
7920
- canonicalUrl: resolveDocsMarkdownMetadataUrl(page.url, options?.origin),
8070
+ canonicalUrl,
7921
8071
  markdownUrl: resolveDocsMarkdownMetadataUrl(page.markdownUrl ?? toDocsMarkdownUrl(page.url), options?.origin),
7922
8072
  lastUpdated: normalizeDocsMarkdownLastUpdated(page.lastmod ?? page.lastModified),
7923
- agent: page.agent
8073
+ agent: page.agent,
8074
+ ...okfEnabled ? { trust: resolveDocsOkfTrustMetadata({
8075
+ ...page,
8076
+ canonicalUrl
8077
+ }, options?.okf) } : {}
7924
8078
  };
7925
8079
  }
7926
8080
  function renderDocsMarkdownNotFound({ entry = "docs", apiRoute, requestedPath, origin, pages, sitemap }) {
@@ -8003,8 +8157,11 @@ function createDocsMarkdownResponse(options) {
8003
8157
  });
8004
8158
  const contentLocation = options.contentLocation ?? resolveDocsMarkdownContentLocation(canonicalUrl);
8005
8159
  const varyHeader = getDocsMarkdownVaryHeader(request);
8160
+ const llmsTxtUrl = new URL(DEFAULT_LLMS_TXT_ROUTE, origin).toString();
8161
+ const discoveryLink = `<${llmsTxtUrl}>; rel="describedby"; type="text/plain"`;
8006
8162
  const baseSharedHeaders = {
8007
8163
  "X-Robots-Tag": "noindex",
8164
+ "X-Llms-Txt": llmsTxtUrl,
8008
8165
  ...locale ? { "Content-Language": locale } : {},
8009
8166
  ...varyHeader ? { Vary: varyHeader } : {}
8010
8167
  };
@@ -8020,7 +8177,7 @@ function createDocsMarkdownResponse(options) {
8020
8177
  headers: {
8021
8178
  ...baseSharedHeaders,
8022
8179
  "Content-Location": contentLocation,
8023
- Link: `<${canonicalUrl}>; rel="canonical"`,
8180
+ Link: `<${canonicalUrl}>; rel="canonical", ${discoveryLink}`,
8024
8181
  "Cache-Control": "no-store",
8025
8182
  Location: new URL(recovery.redirect.markdownUrl, request.url).toString()
8026
8183
  }
@@ -8037,7 +8194,7 @@ function createDocsMarkdownResponse(options) {
8037
8194
  headers: {
8038
8195
  ...baseSharedHeaders,
8039
8196
  "Content-Location": contentLocation,
8040
- Link: `<${canonicalUrl}>; rel="canonical"`,
8197
+ Link: `<${canonicalUrl}>; rel="canonical", ${discoveryLink}`,
8041
8198
  "Cache-Control": "no-store",
8042
8199
  "Content-Type": "text/markdown; charset=utf-8"
8043
8200
  }
@@ -8064,7 +8221,7 @@ function createDocsMarkdownResponse(options) {
8064
8221
  headers: {
8065
8222
  ...baseSharedHeaders,
8066
8223
  "Content-Location": sectionIndexContentLocation,
8067
- Link: `<${canonicalUrl}>; rel="canonical", <${contentLocation}>; rel="alternate"; type="text/markdown"`,
8224
+ Link: `<${canonicalUrl}>; rel="canonical", <${contentLocation}>; rel="alternate"; type="text/markdown", ${discoveryLink}`,
8068
8225
  "Cache-Control": options.cacheControl ?? "public, max-age=0, s-maxage=3600",
8069
8226
  "Content-Type": "application/json; charset=utf-8",
8070
8227
  "X-Docs-Markdown-Section-Index": DOCS_MARKDOWN_SECTION_INDEX_FORMAT,
@@ -8096,7 +8253,7 @@ function createDocsMarkdownResponse(options) {
8096
8253
  const responseHeaders = {
8097
8254
  ...baseSharedHeaders,
8098
8255
  "Content-Location": sectionContentLocation,
8099
- Link: `<${sectionCanonicalUrl}>; rel="canonical"`,
8256
+ Link: `<${sectionCanonicalUrl}>; rel="canonical", ${discoveryLink}`,
8100
8257
  "Cache-Control": sectionResult?.found === false ? "no-store" : options.cacheControl ?? "public, max-age=0, s-maxage=3600",
8101
8258
  "Content-Type": "text/markdown; charset=utf-8",
8102
8259
  ...sectionHeaders,
@@ -8764,4 +8921,4 @@ function toYamlString(value) {
8764
8921
  }
8765
8922
 
8766
8923
  //#endregion
8767
- export { matchesDocsLlmsTxtSection as $, resolveDocsMcpProtectedResourceMetadataLocation as $n, buildDocsRetrievalDigestProjection as $t, buildDocsAgentDiscoverySpec as A, normalizeAgentLocale as An, DEFAULT_SITEMAP_XML_ROUTE as At, findDocsMarkdownPage as B, DEFAULT_MCP_PUBLIC_ROUTE as Bn, DOCS_CONTENT_CHANGES_FORMAT as Bt, DOCS_AI_AGENT_USER_AGENT_HEADER_PATTERN as C, findDocsAudienceMdxTags as Cn, selectDocsMarkdownSection as Ct, DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER as D, agentVersionConstraintMatches as Dn, DEFAULT_SITEMAP_MD_DOCS_ROUTE as Dt, DOCS_MARKDOWN_SECTION_INDEX_FORMAT as E, agentVersionConstraintGroupsOverlap as En, DEFAULT_SITEMAP_MANIFEST_PATH as Et, buildDocsMcpEndpointCandidates as F, paginateDocsItems as Fn, renderDocsSitemapXml as Ft, isDocsAgentDiscoveryRequest as G, getDocsMcpResourcePaths as Gn, createDocsContentChangesHttpResponse as Gt, getDocsMarkdownCanonicalLinkHeader as H, DEFAULT_MCP_WELL_KNOWN_ROUTE as Hn, DOCS_CONTENT_SNAPSHOT_FORMAT as Ht, collectDocsMarkdownSections as I, resolveDocsPaginationOffset as In, resolveDocsSitemapConfig as It, isDocsDiagnosticsRequest as J, isDocsMcpProtectedResourceMetadataPath as Jn, resolveDocsContentChangesConfig as Jt, isDocsAgentsRequest as K, hasDocsMcpProtectedResourceConfig as Kn, isDocsContentChangeGeneration as Kt, createDocsMarkdownResponse as L, normalizeDocsRelated as Ln, resolveDocsSitemapPageLastmod as Lt, buildDocsConfigMap as M, normalizeAgentVersion as Mn, createDocsSitemapResponse as Mt, buildDocsDiagnostics as N, DocsPaginationCursorError as Nn, readDocsSitemapManifestFromContentMap as Nt, DOCS_TRADITIONAL_BOT_USER_AGENT_HEADER_PATTERN as O, agentVersionConstraintsOverlap as On, DEFAULT_SITEMAP_MD_ROUTE as Ot, buildDocsMarkdownSectionIndex as P, createDocsPaginationCursor as Pn, renderDocsSitemapMarkdown as Pt, isDocsSkillRequest as Q, normalizeDocsMcpEndpointPath as Qn, buildDocsContentSnapshot as Qt, createDocsStandardsDiscoveryResponse as R, renderDocsRelatedMarkdownLines as Rn, resolveDocsSitemapRequest as Rt, DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE as S, findDocsAudienceMdxIssues as Sn, selectDocsLlmsTxtContent as St, DOCS_CONFIG_MAP_TOP_LEVEL_KEYS as T, resolveDocsAudienceMdxContent as Tn, validateDocsAgentFeedbackPayload as Tt, getDocsMarkdownVaryHeader as U, buildDocsMcpProtectedResourceMetadataRoute as Un, DocsContentChangesRequestError as Ut, getDocsLlmsTxtMaxCharsIssue as V, DEFAULT_MCP_ROUTE as Vn, DOCS_CONTENT_CHANGES_RESPONSE_VALUE as Vt, hasDocsMarkdownSignatureAgent as W, getDocsMcpProtectedResourceMetadataRoutes as Wn, createDocsContentChangeFeed as Wt, isDocsMarkdownSectionIndexRequest as X, isDocsMcpResourcePath as Xn, DocsSearchRequestError as Xt, isDocsLlmsTxtPublicRequest as Y, isDocsMcpRequest as Yn, resolveDocsContentChangesRequest as Yt, isDocsPublicGetRequest as Z, normalizeDocsMcpAuthorizationServerUrls as Zn, buildDocsAskAIContext as Zt, DEFAULT_LLMS_TXT_MAX_CHARS as _, resolveDocsSearchFilters as _n, resolveDocsMarkdownRequest as _t, DEFAULT_AGENT_MD_ROUTE as a, createSimpleSearchAdapter as an, renderDocsMarkdownDocument as at, DEFAULT_OPENAPI_SCHEMA_ROUTE as b, resolveSearchRequestConfig as bn, resolveDocsRequestApiRoute as bt, DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE as c, formatDocsAskAIPackageHints as cn, resolveDocsAgentContractMcpTools as ct, DEFAULT_DOCS_CONFIG_FORMAT as d, performDocsSearch as dn, resolveDocsAgentsFormat as dt, buildDocsSearchDocuments as en, resolveDocsMcpResourceLocation as er, normalizeDocsPathSegment as et, DEFAULT_DOCS_CONFIG_ROUTE as f, performDocsSearchWithMetadata as fn, resolveDocsLlmsTxtFormat as ft, DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE as g, resolveDocsSearchError as gn, resolveDocsMarkdownRecovery as gt, DEFAULT_LLMS_FULL_TXT_ROUTE as h, resolveDocsSearchAudience as hn, resolveDocsMarkdownCanonicalUrl as ht, DEFAULT_AGENT_FEEDBACK_ROUTE as i, createMcpSearchAdapter as in, renderDocsLlmsTxt as it, buildDocsAgentFeedbackSchema as j, normalizeAgentScopeValues as jn, buildDocsSitemapManifest as jt, acceptsDocsMarkdown as k, normalizeAgentFramework as kn, DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE as kt, DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE as l, inferDocsAskAIPackageHints as ln, resolveDocsAgentFeedbackConfig as lt, DEFAULT_DOCS_DIAGNOSTICS_ROUTE as m, resolveDocsRetrievalLastModified as mn, resolveDocsLlmsTxtSections as mt, DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE as n, createAlgoliaSearchAdapter as nn, parseDocsAgentFeedbackData as nt, DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE as o, createTypesenseSearchAdapter as on, renderDocsMarkdownNotFound as ot, DEFAULT_DOCS_DIAGNOSTICS_FORMAT as p, resolveAskAISearchRequestConfig as pn, resolveDocsLlmsTxtRequest as pt, isDocsConfigRequest as q, isDocsMcpOAuthScopeToken as qn, isDocsContentChangesRequest as qt, DEFAULT_AGENT_FEEDBACK_PAYLOAD_SCHEMA as r, createCustomSearchAdapter as rn, renderDocsAgentsDocument as rt, DEFAULT_AGENT_SPEC_ROUTE as s, enrichDocsSearchDocumentsWithProvenance as sn, renderDocsSkillDocument as st, DEFAULT_AGENTS_MD_ROUTE as t, buildDocsSearchFacets as tn, normalizeDocsUrlPath as tt, DEFAULT_DOCS_API_ROUTE as u, normalizeDocsSearchFilters as un, resolveDocsAgentFeedbackRequest as ut, DEFAULT_LLMS_TXT_ROUTE as v, resolveDocsSearchRequest as vn, resolveDocsMarkdownSectionRequest as vt, DOCS_BOT_LIKE_USER_AGENT_HEADER_PATTERN as w, resolveDocsAgentMdxContent as wn, toDocsMarkdownUrl as wt, DEFAULT_SKILL_MD_ROUTE as x, extractDocsMarkdownPromptBlocks as xn, resolveDocsSkillFormat as xt, DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE as y, resolveLocalDocsMcpSearchConfig as yn, resolveDocsOpenApiDiscoveryConfig as yt, detectDocsMarkdownAgentRequest as z, DEFAULT_MCP_PROTECTED_RESOURCE_METADATA_ROUTE as zn, toDocsSitemapMarkdownUrl as zt };
8924
+ export { matchesDocsLlmsTxtSection as $, resolveDocsMcpProtectedResourceMetadataLocation as $n, buildDocsRetrievalDigestProjection as $t, buildDocsAgentDiscoverySpec as A, normalizeAgentLocale as An, DEFAULT_SITEMAP_XML_ROUTE as At, findDocsMarkdownPage as B, DEFAULT_MCP_PUBLIC_ROUTE as Bn, DOCS_CONTENT_CHANGES_FORMAT as Bt, DOCS_AI_AGENT_USER_AGENT_HEADER_PATTERN as C, findDocsAudienceMdxTags as Cn, selectDocsMarkdownSection as Ct, DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER as D, agentVersionConstraintMatches as Dn, DEFAULT_SITEMAP_MD_DOCS_ROUTE as Dt, DOCS_MARKDOWN_SECTION_INDEX_FORMAT as E, agentVersionConstraintGroupsOverlap as En, DEFAULT_SITEMAP_MANIFEST_PATH as Et, buildDocsMcpEndpointCandidates as F, paginateDocsItems as Fn, renderDocsSitemapXml as Ft, isDocsAgentDiscoveryRequest as G, getDocsMcpResourcePaths as Gn, createDocsContentChangesHttpResponse as Gt, getDocsMarkdownCanonicalLinkHeader as H, DEFAULT_MCP_WELL_KNOWN_ROUTE as Hn, DOCS_CONTENT_SNAPSHOT_FORMAT as Ht, collectDocsMarkdownSections as I, resolveDocsPaginationOffset as In, resolveDocsSitemapConfig as It, isDocsDiagnosticsRequest as J, isDocsMcpProtectedResourceMetadataPath as Jn, resolveDocsContentChangesConfig as Jt, isDocsAgentsRequest as K, hasDocsMcpProtectedResourceConfig as Kn, isDocsContentChangeGeneration as Kt, createDocsMarkdownResponse as L, normalizeDocsRelated as Ln, resolveDocsSitemapPageLastmod as Lt, buildDocsConfigMap as M, normalizeAgentVersion as Mn, createDocsSitemapResponse as Mt, buildDocsDiagnostics as N, DocsPaginationCursorError as Nn, readDocsSitemapManifestFromContentMap as Nt, DOCS_TRADITIONAL_BOT_USER_AGENT_HEADER_PATTERN as O, agentVersionConstraintsOverlap as On, DEFAULT_SITEMAP_MD_ROUTE as Ot, buildDocsMarkdownSectionIndex as P, createDocsPaginationCursor as Pn, renderDocsSitemapMarkdown as Pt, isDocsSkillRequest as Q, normalizeDocsMcpEndpointPath as Qn, buildDocsContentSnapshot as Qt, createDocsStandardsDiscoveryResponse as R, renderDocsRelatedMarkdownLines as Rn, resolveDocsSitemapRequest as Rt, DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE as S, findDocsAudienceMdxIssues as Sn, selectDocsLlmsTxtContent as St, DOCS_CONFIG_MAP_TOP_LEVEL_KEYS as T, resolveDocsAudienceMdxContent as Tn, validateDocsAgentFeedbackPayload as Tt, getDocsMarkdownVaryHeader as U, buildDocsMcpProtectedResourceMetadataRoute as Un, DocsContentChangesRequestError as Ut, getDocsLlmsTxtMaxCharsIssue as V, DEFAULT_MCP_ROUTE as Vn, DOCS_CONTENT_CHANGES_RESPONSE_VALUE as Vt, hasDocsMarkdownSignatureAgent as W, getDocsMcpProtectedResourceMetadataRoutes as Wn, createDocsContentChangeFeed as Wt, isDocsMarkdownSectionIndexRequest as X, isDocsMcpResourcePath as Xn, DocsSearchRequestError as Xt, isDocsLlmsTxtPublicRequest as Y, isDocsMcpRequest as Yn, resolveDocsContentChangesRequest as Yt, isDocsPublicGetRequest as Z, normalizeDocsMcpAuthorizationServerUrls as Zn, buildDocsAskAIContext as Zt, DEFAULT_LLMS_TXT_MAX_CHARS as _, resolveDocsSearchFilters as _n, resolveDocsMarkdownRequest as _t, DEFAULT_AGENT_MD_ROUTE as a, createSimpleSearchAdapter as an, normalizeDocsOkfTrustMetadataInput as ar, renderDocsMarkdownDocument as at, DEFAULT_OPENAPI_SCHEMA_ROUTE as b, resolveSearchRequestConfig as bn, resolveDocsRequestApiRoute as bt, DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE as c, formatDocsAskAIPackageHints as cn, resolveDocsAgentContractMcpTools as ct, DEFAULT_DOCS_CONFIG_FORMAT as d, performDocsSearch as dn, resolveDocsAgentsFormat as dt, buildDocsSearchDocuments as en, resolveDocsMcpResourceLocation as er, normalizeDocsPathSegment as et, DEFAULT_DOCS_CONFIG_ROUTE as f, performDocsSearchWithMetadata as fn, resolveDocsLlmsTxtFormat as ft, DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE as g, resolveDocsSearchError as gn, resolveDocsMarkdownRecovery as gt, DEFAULT_LLMS_FULL_TXT_ROUTE as h, resolveDocsSearchAudience as hn, resolveDocsMarkdownCanonicalUrl as ht, DEFAULT_AGENT_FEEDBACK_ROUTE as i, createMcpSearchAdapter as in, buildDocsOkfBundle as ir, renderDocsLlmsTxt as it, buildDocsAgentFeedbackSchema as j, normalizeAgentScopeValues as jn, buildDocsSitemapManifest as jt, acceptsDocsMarkdown as k, normalizeAgentFramework as kn, DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE as kt, DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE as l, inferDocsAskAIPackageHints as ln, resolveDocsAgentFeedbackConfig as lt, DEFAULT_DOCS_DIAGNOSTICS_ROUTE as m, resolveDocsRetrievalLastModified as mn, resolveDocsLlmsTxtSections as mt, DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE as n, createAlgoliaSearchAdapter as nn, DOCS_OKF_BUNDLE_FORMAT as nr, parseDocsAgentFeedbackData as nt, DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE as o, createTypesenseSearchAdapter as on, resolveDocsOkfConfig as or, renderDocsMarkdownNotFound as ot, DEFAULT_DOCS_DIAGNOSTICS_FORMAT as p, resolveAskAISearchRequestConfig as pn, resolveDocsLlmsTxtRequest as pt, isDocsConfigRequest as q, isDocsMcpOAuthScopeToken as qn, isDocsContentChangesRequest as qt, DEFAULT_AGENT_FEEDBACK_PAYLOAD_SCHEMA as r, createCustomSearchAdapter as rn, DOCS_OKF_VERSION as rr, renderDocsAgentsDocument as rt, DEFAULT_AGENT_SPEC_ROUTE as s, enrichDocsSearchDocumentsWithProvenance as sn, resolveDocsOkfTrustMetadata as sr, renderDocsSkillDocument as st, DEFAULT_AGENTS_MD_ROUTE as t, buildDocsSearchFacets as tn, DEFAULT_DOCS_OKF_ROUTE as tr, normalizeDocsUrlPath as tt, DEFAULT_DOCS_API_ROUTE as u, normalizeDocsSearchFilters as un, resolveDocsAgentFeedbackRequest as ut, DEFAULT_LLMS_TXT_ROUTE as v, resolveDocsSearchRequest as vn, resolveDocsMarkdownSectionRequest as vt, DOCS_BOT_LIKE_USER_AGENT_HEADER_PATTERN as w, resolveDocsAgentMdxContent as wn, toDocsMarkdownUrl as wt, DEFAULT_SKILL_MD_ROUTE as x, extractDocsMarkdownPromptBlocks as xn, resolveDocsSkillFormat as xt, DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE as y, resolveLocalDocsMcpSearchConfig as yn, resolveDocsOpenApiDiscoveryConfig as yt, detectDocsMarkdownAgentRequest as z, DEFAULT_MCP_PROTECTED_RESOURCE_METADATA_ROUTE as zn, toDocsSitemapMarkdownUrl as zt };
@@ -1,9 +1,9 @@
1
- import { $t as buildDocsRetrievalDigestProjection, An as normalizeAgentLocale, Dn as agentVersionConstraintMatches, En as agentVersionConstraintGroupsOverlap, Mn as normalizeAgentVersion, On as agentVersionConstraintsOverlap, Zt as buildDocsAskAIContext, bn as resolveSearchRequestConfig, dn as performDocsSearch, jn as normalizeAgentScopeValues, kn as normalizeAgentFramework, un as normalizeDocsSearchFilters } from "./agent-CFqECAG0.mjs";
1
+ import { $t as buildDocsRetrievalDigestProjection, An as normalizeAgentLocale, Dn as agentVersionConstraintMatches, En as agentVersionConstraintGroupsOverlap, Mn as normalizeAgentVersion, On as agentVersionConstraintsOverlap, Zt as buildDocsAskAIContext, bn as resolveSearchRequestConfig, dn as performDocsSearch, jn as normalizeAgentScopeValues, kn as normalizeAgentFramework, un as normalizeDocsSearchFilters } from "./agent-PSrgiJD8.mjs";
2
2
  import { S as upsertPageAgentContractMarkdown, l as stripDocsGeneratedAgentContractMarkers, o as findDocsMarkdownSection } from "./markdown-sections-7OoA7ylx.mjs";
3
3
  import { K as digestDocsRetrievalContent } from "./standards-discovery-Ckx0tN7B.mjs";
4
4
  import { t as getDocsAgentSkillsConfiguredPaths } from "./agent-skills-server-DFqQyO_V.mjs";
5
5
  import { buildDocsMcpContext } from "./mcp.mjs";
6
- import { i as validateCodeBlockPlans, n as planCodeBlockTargets, r as resolveDocsCodeBlocksValidateConfig, t as extractCodeBlocksFromMarkdown } from "./code-blocks-Bel6vDqI.mjs";
6
+ import { i as validateCodeBlockPlans, n as planCodeBlockTargets, r as resolveDocsCodeBlocksValidateConfig, t as extractCodeBlocksFromMarkdown } from "./code-blocks-c3nIrWOM.mjs";
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
8
  import { dirname, isAbsolute, join, relative } from "node:path";
9
9
  import { createJiti } from "jiti";
@@ -1,17 +1,18 @@
1
- import { A as buildDocsAgentDiscoverySpec, Ft as renderDocsSitemapXml, It as resolveDocsSitemapConfig, Pt as renderDocsSitemapMarkdown, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, a as DEFAULT_AGENT_MD_ROUTE, at as renderDocsMarkdownDocument, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, it as renderDocsLlmsTxt, jt as buildDocsSitemapManifest, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, lt as resolveDocsAgentFeedbackConfig, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, rt as renderDocsAgentsDocument, st as renderDocsSkillDocument, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, wt as toDocsMarkdownUrl, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-CFqECAG0.mjs";
1
+ import { A as buildDocsAgentDiscoverySpec, Ft as renderDocsSitemapXml, It as resolveDocsSitemapConfig, Pt as renderDocsSitemapMarkdown, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, a as DEFAULT_AGENT_MD_ROUTE, at as renderDocsMarkdownDocument, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, ir as buildDocsOkfBundle, it as renderDocsLlmsTxt, jt as buildDocsSitemapManifest, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, lt as resolveDocsAgentFeedbackConfig, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, or as resolveDocsOkfConfig, rt as renderDocsAgentsDocument, st as renderDocsSkillDocument, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, wt as toDocsMarkdownUrl, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-PSrgiJD8.mjs";
2
2
  import "./markdown-sections-7OoA7ylx.mjs";
3
3
  import { A as buildDocsLegacySkillsIndex, D as buildDocsA2AAgentCard, L as resolveDocsPublishedAgentSkill, O as buildDocsAgentSkillsIndex, V as formatDocsContentDigest, W as resolveDocsHttpDate, 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, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-Ckx0tN7B.mjs";
4
- import "./content-change-hydration-BsbBXAUi.mjs";
4
+ import "./openapi-mcp-B7u7Y0gB.mjs";
5
5
  import { t as resolveDocsI18n } from "./i18n-B3BIxShC.mjs";
6
- 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-NQesPX5L.mjs";
7
- import "./sitemap-server-B0SiREN0.mjs";
6
+ 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-DNod0XKB.mjs";
7
+ import "./sitemap-server-C2TauhKa.mjs";
8
8
  import { r as resolveConfiguredAgentSkills } from "./agent-skills-server-DFqQyO_V.mjs";
9
- import "./agent-evals-GpcaCbRb.mjs";
9
+ import "./agent-evals-U9d_db2u.mjs";
10
10
  import { createFilesystemDocsMcpSource, resolveDocsMcpConfig } from "./mcp.mjs";
11
- import "./code-blocks-Bel6vDqI.mjs";
11
+ import "./authoring-mcp-BCM5CJbJ.mjs";
12
+ import "./code-blocks-c3nIrWOM.mjs";
12
13
  import "./server.mjs";
13
- import { _ as resolveDocsContentDir, a as loadDocsConfigModule, d as readNavTitle, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, m as readTopLevelBooleanProperty, p as readStringProperty, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-BaTmjDqD.mjs";
14
- import { t as detectFramework } from "./utils-DOMeZW9V.mjs";
14
+ import { _ as resolveDocsContentDir, a as loadDocsConfigModule, d as readNavTitle, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, m as readTopLevelBooleanProperty, p as readStringProperty, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-BhF6J2N4.mjs";
15
+ import { t as detectFramework } from "./utils-DcCUwxqS.mjs";
15
16
  import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
16
17
  import path from "node:path";
17
18
  import { createHash, randomUUID } from "node:crypto";
@@ -443,7 +444,8 @@ function resolveUserOwnedOverrides(outputs, previous) {
443
444
  "page",
444
445
  "llms",
445
446
  "discovery",
446
- "skill"
447
+ "skill",
448
+ "okf"
447
449
  ]);
448
450
  const previousByPath = new Map(previous?.files.map((file) => [file.path, file]) ?? []);
449
451
  return outputs.map((output) => {
@@ -684,6 +686,7 @@ async function exportAgentBundle(options = {}) {
684
686
  });
685
687
  if (localizedPages.length === 0) throw new Error(`No docs content was found under ${contentDir}.`);
686
688
  const pages = localizedPages.map(({ page }) => page);
689
+ const okfConfig = resolveDocsOkfConfig(config?.agent?.okf);
687
690
  const sitemap = resolveDocsSitemapConfig(sitemapInput, { baseUrl });
688
691
  const robots = resolveDocsRobotsConfig(robotsInput, { baseUrl: typeof robotsInput === "object" ? robotsInput.baseUrl ?? sitemap.baseUrl : sitemap.baseUrl });
689
692
  const mcp = resolveDocsMcpConfig(false, { defaultName: resolvedSiteTitle });
@@ -731,11 +734,19 @@ async function exportAgentBundle(options = {}) {
731
734
  markdownUrl: staticMarkdownRoute(page, sourceEntry, routeEntry)
732
735
  }, {
733
736
  llms,
737
+ okf: config?.agent?.okf,
734
738
  origin: baseUrl,
735
739
  sitemap: sitemapInput
736
740
  }));
737
741
  output.lastModified = resolveDocsHttpDate(page.lastModified);
738
742
  }
743
+ if (okfConfig.enabled) {
744
+ const okfBundle = buildDocsOkfBundle(pages.map((page) => ({
745
+ ...page,
746
+ canonicalUrl: baseUrl ? new URL(page.url, baseUrl).toString() : page.url
747
+ })), okfConfig);
748
+ addOutput(outputs, publicDir, okfConfig.route, "okf", "application/json", JSON.stringify(okfBundle, null, 2));
749
+ }
739
750
  if (llmsEnabled) {
740
751
  const llmsContent = renderDocsLlmsTxt(pages.map((page) => ({
741
752
  url: page.url,
@@ -0,0 +1,196 @@
1
+ import { readFileSync } from "node:fs";
2
+
3
+ //#region src/agent-feedback-loop.ts
4
+ const DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT = "farming-labs-agent-feedback-improvements.v1";
5
+ const TASK_STOP_WORDS = new Set([
6
+ "a",
7
+ "an",
8
+ "and",
9
+ "do",
10
+ "for",
11
+ "from",
12
+ "how",
13
+ "i",
14
+ "in",
15
+ "of",
16
+ "on",
17
+ "the",
18
+ "to",
19
+ "using",
20
+ "with"
21
+ ]);
22
+ function cleanString(value) {
23
+ if (typeof value !== "string") return void 0;
24
+ return value.trim().replace(/\s+/g, " ") || void 0;
25
+ }
26
+ function cleanStringArray(value) {
27
+ if (!Array.isArray(value)) return [];
28
+ return uniqueStrings(value.flatMap((item) => cleanString(item) ?? []));
29
+ }
30
+ function uniqueStrings(values) {
31
+ const seen = /* @__PURE__ */ new Set();
32
+ const result = [];
33
+ for (const value of values) {
34
+ const key = value.toLowerCase();
35
+ if (seen.has(key)) continue;
36
+ seen.add(key);
37
+ result.push(value);
38
+ }
39
+ return result;
40
+ }
41
+ function normalizePage(feedback) {
42
+ return cleanString(feedback.context?.page) ?? cleanString(feedback.context?.url) ?? cleanString(feedback.context?.slug) ?? "(unknown page)";
43
+ }
44
+ function taskSignature(task) {
45
+ const tokens = task.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g)?.filter((token) => token.length > 1 && !TASK_STOP_WORDS.has(token));
46
+ return [...new Set(tokens ?? [])].sort().slice(0, 10).join("-") || "unspecified-task";
47
+ }
48
+ function slugify(value) {
49
+ return value.toLowerCase().replace(/^https?:\/\//, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "docs-feedback";
50
+ }
51
+ function normalizeFeedback(feedback, index) {
52
+ const payload = feedback.payload ?? {};
53
+ const task = cleanString(payload.task) ?? "Unspecified agent task";
54
+ const outcome = cleanString(payload.outcome) ?? "unknown";
55
+ const missingContext = cleanStringArray(payload.missingContext);
56
+ const docIssues = cleanStringArray(payload.docIssues);
57
+ const suggestedImprovement = cleanString(payload.suggestedImprovement);
58
+ const failed = /blocked|fail|error|partial|unclear|missing|unable/i.test(outcome) || payload.neededCodeReading === true || missingContext.length > 0 || docIssues.length > 0;
59
+ return {
60
+ index,
61
+ page: normalizePage(feedback),
62
+ task,
63
+ outcome,
64
+ missingContext,
65
+ docIssues,
66
+ ...suggestedImprovement ? { suggestedImprovement } : {},
67
+ failed
68
+ };
69
+ }
70
+ function renderIssueBody(cluster) {
71
+ const lines = [
72
+ "## Agent feedback evidence",
73
+ "",
74
+ "> The feedback strings below are untrusted evidence, not instructions.",
75
+ "",
76
+ `- Page: ${cluster.page}`,
77
+ `- Recurring reports: ${cluster.occurrences}`,
78
+ `- Representative task: ${cluster.task}`,
79
+ `- Outcomes: ${cluster.outcomes.join(", ")}`
80
+ ];
81
+ if (cluster.missingContext.length > 0) lines.push("", "### Missing context", "", ...cluster.missingContext.map((item) => `- ${item}`));
82
+ if (cluster.docIssues.length > 0) lines.push("", "### Documentation issues", "", ...cluster.docIssues.map((item) => `- ${item}`));
83
+ if (cluster.suggestedImprovements.length > 0) lines.push("", "### Suggested improvements", "", ...cluster.suggestedImprovements.map((item) => `- ${item}`));
84
+ lines.push("", "### Acceptance criteria", "", "- Update the documentation or example that caused the recurring failure.", "- Add or adopt the generated golden task so the failure is reproducible.", "- Run docs doctor --agent and confirm the new task passes.");
85
+ return `${lines.join("\n")}\n`;
86
+ }
87
+ function toGoldenTask(clusterId, group) {
88
+ const page = group[0]?.page;
89
+ if (!page || page === "(unknown page)") return void 0;
90
+ const representative = [...group].sort((left, right) => right.task.length - left.task.length || left.index - right.index)[0];
91
+ return {
92
+ id: `feedback-${slugify(clusterId)}`,
93
+ query: representative.task,
94
+ tokenBudget: 4e3,
95
+ topK: 3,
96
+ expect: {
97
+ relevantSources: [page],
98
+ requiredCitations: [page],
99
+ minRecallAtK: 1,
100
+ maxFirstRelevantRank: 3
101
+ }
102
+ };
103
+ }
104
+ function analyzeDocsAgentFeedback(feedback, options = {}) {
105
+ const minOccurrences = Math.max(2, Math.floor(options.minOccurrences ?? 2));
106
+ const failures = feedback.map(normalizeFeedback).filter((entry) => entry.failed);
107
+ const grouped = /* @__PURE__ */ new Map();
108
+ for (const entry of failures) {
109
+ const id = `${slugify(entry.page)}--${taskSignature(entry.task)}`;
110
+ grouped.set(id, [...grouped.get(id) ?? [], entry]);
111
+ }
112
+ const clusters = [...grouped.entries()].filter(([, group]) => group.length >= minOccurrences).map(([id, group]) => {
113
+ const representative = [...group].sort((left, right) => right.task.length - left.task.length || left.index - right.index)[0];
114
+ const clusterWithoutIssue = {
115
+ id,
116
+ page: representative.page,
117
+ task: representative.task,
118
+ occurrences: group.length,
119
+ outcomes: uniqueStrings(group.map((entry) => entry.outcome)),
120
+ missingContext: uniqueStrings(group.flatMap((entry) => entry.missingContext)),
121
+ docIssues: uniqueStrings(group.flatMap((entry) => entry.docIssues)),
122
+ suggestedImprovements: uniqueStrings(group.flatMap((entry) => entry.suggestedImprovement ?? [])),
123
+ ...toGoldenTask(id, group) ? { goldenTask: toGoldenTask(id, group) } : {}
124
+ };
125
+ return {
126
+ ...clusterWithoutIssue,
127
+ issue: {
128
+ title: `docs: address recurring agent failure for ${representative.page}`,
129
+ body: renderIssueBody(clusterWithoutIssue),
130
+ labels: ["documentation", "agent-readiness"]
131
+ }
132
+ };
133
+ }).sort((left, right) => right.occurrences - left.occurrences || left.id.localeCompare(right.id));
134
+ const goldenTasks = clusters.flatMap((cluster) => cluster.goldenTask ?? []);
135
+ const issueDrafts = clusters.map((cluster) => cluster.issue);
136
+ return {
137
+ format: DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT,
138
+ generatedAt: options.generatedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
139
+ feedbackCount: feedback.length,
140
+ failureCount: failures.length,
141
+ recurringClusterCount: clusters.length,
142
+ clusters,
143
+ goldenTasks,
144
+ issueDrafts,
145
+ pullRequestDraft: {
146
+ title: `docs: address ${clusters.length} recurring agent feedback cluster${clusters.length === 1 ? "" : "s"}`,
147
+ body: [
148
+ "## Summary",
149
+ "",
150
+ ...clusters.map((cluster) => `- ${cluster.page}: ${cluster.occurrences} reports for ${cluster.task}`),
151
+ "",
152
+ "## Verification",
153
+ "",
154
+ "- [ ] Add the generated golden tasks to agent.evaluations.tasks",
155
+ "- [ ] Run docs doctor --agent",
156
+ "- [ ] Confirm the affected docs pages no longer reproduce the feedback failures",
157
+ ""
158
+ ].join("\n")
159
+ }
160
+ };
161
+ }
162
+ function asFeedbackArray(value) {
163
+ if (Array.isArray(value)) return value;
164
+ if (!value || typeof value !== "object") return void 0;
165
+ const record = value;
166
+ const candidate = record.feedback ?? record.events ?? record.items;
167
+ return Array.isArray(candidate) ? candidate : void 0;
168
+ }
169
+ function parseFeedbackData(value, label) {
170
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${label} must be an object.`);
171
+ const record = value;
172
+ if (!record.payload || typeof record.payload !== "object" || Array.isArray(record.payload)) throw new Error(`${label}.payload must be an object.`);
173
+ const context = record.context && typeof record.context === "object" && !Array.isArray(record.context) ? record.context : void 0;
174
+ return {
175
+ ...context ? { context } : {},
176
+ payload: record.payload
177
+ };
178
+ }
179
+ function readDocsAgentFeedbackFile(filePath) {
180
+ const content = readFileSync(filePath, "utf8").trim();
181
+ if (!content) return [];
182
+ try {
183
+ const parsed = asFeedbackArray(JSON.parse(content));
184
+ if (parsed) return parsed.map((item, index) => parseFeedbackData(item, `Feedback ${index + 1}`));
185
+ } catch {}
186
+ return content.split(/\r?\n/).map((line, index) => {
187
+ try {
188
+ return parseFeedbackData(JSON.parse(line), `Feedback line ${index + 1}`);
189
+ } catch (error) {
190
+ throw new Error(`Invalid agent feedback JSON on line ${index + 1}: ${error instanceof Error ? error.message : String(error)}`);
191
+ }
192
+ });
193
+ }
194
+
195
+ //#endregion
196
+ export { analyzeDocsAgentFeedback as n, readDocsAgentFeedbackFile as r, DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT as t };
@@ -1,4 +1,4 @@
1
- import { z as DocsPublishedAgentSkill } from "./standards-discovery-D1Ys4J3h.mjs";
1
+ import { z as DocsPublishedAgentSkill } from "./standards-discovery-Cqq8QmlH.mjs";
2
2
 
3
3
  //#region src/agent-skills-bundle.d.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { st as DocsAgentSkillsInput } from "./types-DLLefoU5.mjs";
2
- import { z as DocsPublishedAgentSkill } from "./standards-discovery-D1Ys4J3h.mjs";
1
+ import { st as DocsAgentSkillsInput } from "./types-BthCiAD9.mjs";
2
+ import { z as DocsPublishedAgentSkill } from "./standards-discovery-Cqq8QmlH.mjs";
3
3
 
4
4
  //#region src/agent-skills-server.d.ts
5
5
  interface ResolveConfiguredAgentSkillsOptions {
@@ -1,6 +1,6 @@
1
- import { st as DocsAgentSkillsInput } from "./types-DLLefoU5.mjs";
2
- import { z as DocsPublishedAgentSkill } from "./standards-discovery-D1Ys4J3h.mjs";
3
- import { t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-CICMh0zv.mjs";
1
+ import { st as DocsAgentSkillsInput } from "./types-BthCiAD9.mjs";
2
+ import { z as DocsPublishedAgentSkill } from "./standards-discovery-Cqq8QmlH.mjs";
3
+ import { t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-CIoL58X7.mjs";
4
4
 
5
5
  //#region src/agent-skills-vite.d.ts
6
6
  declare const DOCS_AGENT_SKILLS_BUNDLE_MODULE = "@farming-labs/docs/agent-skills-bundle";