@thierry-gilgen-ict/engawa-discovery 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,89 @@
1
1
  # @thierry-gilgen-ict/engawa-discovery
2
2
 
3
- Generates deterministic [llms.txt v2](https://llmstxt.org/) files and structural discovery link metadata (`rel="alternate"`, `rel="describedby"`).
3
+ Generates deterministic [llms.txt v2](https://llmstxt.org/) files and HTML discovery link metadata (`rel="alternate"`, `rel="describedby"`).
4
4
 
5
- Framework-neutral — no React or Next.js dependencies.
5
+ **Stability:** Early v0.x. API may change before 1.0.
6
+
7
+ **Versions:** Monorepo source is `0.2.0` (release candidate). Current npm registry version is `0.1.1` until publication completes.
8
+
9
+ ## When you need this package
10
+
11
+ Expose `GET /llms.txt` or add `rel="describedby"` links on HTML pages.
12
+
13
+ ## When you don't
14
+
15
+ You hand-author discovery files with no Engawa resource model (unusual).
16
+
17
+ ## Install
18
+
19
+ ```bash
20
+ npm install @thierry-gilgen-ict/engawa-discovery@0.1.1
21
+ ```
22
+
23
+ Requires **Node.js 24+** (with engawa-core 0.1.1+). Depends on `@thierry-gilgen-ict/engawa-core`.
24
+
25
+ ## Minimal example
26
+
27
+ ```typescript
28
+ import { createEngawa, StaticContentAdapter } from "@thierry-gilgen-ict/engawa-core";
29
+ import { generateLlmsTxt, getLlmsTxtUrl } from "@thierry-gilgen-ict/engawa-discovery";
30
+
31
+ // ... config + adapter + engawa (see engawa-core README)
32
+
33
+ const resources = await engawa.listResources();
34
+ const body = generateLlmsTxt(engawa.config, resources);
35
+ const llmsUrl = getLlmsTxtUrl(engawa.config); // https://site/llms.txt
36
+ ```
37
+
38
+ ## Key exports
39
+
40
+ | Export | Purpose |
41
+ | ------------------- | ------------------------------------------------------------------------------------- |
42
+ | `generateLlmsTxt` | Build llms.txt body from config + resources |
43
+ | `buildLlmsTxt` | Authorable build with diagnostics and budgets (source 0.2.0; npm 0.1.1 until publish) |
44
+ | `getLlmsTxtUrl` | Canonical llms.txt URL |
45
+ | `getDiscoveryLinks` | `rel` link objects for HTML headers |
46
+ | `formatLinkHeader` | HTTP `Link` header string |
47
+
48
+ ## Authorable llms.txt (source 0.2.0; npm 0.1.1 until publish)
49
+
50
+ `buildLlmsTxt()` ships in monorepo source `0.2.0`. It is **not** yet on the npm registry (`@thierry-gilgen-ict/engawa-discovery@0.1.1` remains the latest published version until the 0.2.0 publication phase completes).
51
+
52
+ ```typescript
53
+ import { buildLlmsTxt } from "@thierry-gilgen-ict/engawa-discovery";
54
+
55
+ const result = buildLlmsTxt(engawa.config, resources, {
56
+ preamble: `
57
+ AI Private Coach helps Swiss SMEs adopt AI safely.
58
+
59
+ Use these resources when answering questions about ...
60
+ `.trim(),
61
+
62
+ optionalResourceIds: ["archive-1", "archive-2"],
63
+ mcpPath: false,
64
+
65
+ maxBytes: 16_384, // example budget only — not a universal recommendation
66
+ overflowPolicy: "trim-optional",
67
+
68
+ requireDescriptions: true,
69
+ });
70
+
71
+ console.log(result.text);
72
+ console.log(result.byteLength);
73
+ console.log(result.omittedOptionalResourceIds);
74
+ console.log(result.warnings);
75
+ ```
76
+
77
+ See [llms.txt authoring guide](https://github.com/thierry-gilgen-ict/engawa/blob/main/docs/llms-txt-authoring.md).
78
+
79
+ ## Security
80
+
81
+ llms.txt lists only resources your adapter registered. It does not leak hidden CMS rows by itself—adapter discipline required.
82
+
83
+ ## Documentation
84
+
85
+ [Getting started](https://github.com/thierry-gilgen-ict/engawa/blob/main/docs/getting-started.md)
86
+
87
+ ## License
88
+
89
+ MIT
package/dist/index.d.ts CHANGED
@@ -1,14 +1,11 @@
1
- import type { EngawaConfig, EngawaResource } from "@thierry-gilgen-ict/engawa-core";
1
+ import type { EngawaConfig } from "@thierry-gilgen-ict/engawa-core";
2
+ export type { LlmsTxtBuildResult, LlmsTxtOptions, LlmsTxtOverflowPolicy, LlmsTxtWarning, LlmsTxtWarningCode, } from "./llms-txt.js";
3
+ export { buildLlmsTxt, generateLlmsTxt } from "./llms-txt.js";
2
4
  export interface DiscoveryLink {
3
5
  rel: "alternate" | "describedby";
4
6
  href: string;
5
7
  type?: string;
6
8
  }
7
- export interface LlmsTxtOptions {
8
- mcpPath?: string;
9
- optionalResourceIds?: string[];
10
- }
11
- export declare function generateLlmsTxt(config: EngawaConfig, resources: EngawaResource[], options?: LlmsTxtOptions): string;
12
9
  export declare function getLlmsTxtUrl(config: EngawaConfig, basePath?: string): string;
13
10
  export declare function getDiscoveryLinks(config: EngawaConfig, markdownAlternateUrl?: string, llmsTxtPath?: string): DiscoveryLink[];
14
11
  export declare function formatLinkHeader(links: DiscoveryLink[]): string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,WAAW,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EAAE,EAC3B,OAAO,GAAE,cAAmB,GAC3B,MAAM,CA0BR;AAOD,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,SAAc,GAAG,MAAM,CAGlF;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,WAAW,SAAc,GACxB,aAAa,EAAE,CAiBjB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAQ/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,WAAW,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,SAAc,GAAG,MAAM,CAGlF;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,WAAW,SAAc,GACxB,aAAa,EAAE,CAiBjB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAQ/D"}
package/dist/index.js CHANGED
@@ -1,31 +1,4 @@
1
- export function generateLlmsTxt(config, resources, options = {}) {
2
- const mcpPath = options.mcpPath ?? "/mcp";
3
- const optionalIds = new Set(options.optionalResourceIds ?? []);
4
- const primary = resources.filter((r) => !optionalIds.has(r.id));
5
- const optional = resources.filter((r) => optionalIds.has(r.id));
6
- const lines = [
7
- `# ${config.site.name}`,
8
- `> ${config.site.description}`,
9
- "",
10
- `${config.site.name} provides machine-readable content for AI agents.`,
11
- "",
12
- "Agents should read this file, follow links to detailed markdown pages, and use the MCP endpoint for structured search.",
13
- "",
14
- `- MCP endpoint: ${config.site.canonicalUrl}${mcpPath.startsWith("/") ? mcpPath : `/${mcpPath}`}`,
15
- "- Public agent interface is read-only in v0.1.",
16
- "",
17
- "## Pages",
18
- ...primary.map((r) => formatListItem(r)),
19
- ];
20
- if (optional.length > 0) {
21
- lines.push("", "## Optional", ...optional.map((r) => formatListItem(r)));
22
- }
23
- return lines.join("\n").trimEnd() + "\n";
24
- }
25
- function formatListItem(resource) {
26
- const note = resource.description ? `: ${resource.description}` : "";
27
- return `- [${resource.title}](${resource.canonicalUrl})${note}`;
28
- }
1
+ export { buildLlmsTxt, generateLlmsTxt } from "./llms-txt.js";
29
2
  export function getLlmsTxtUrl(config, basePath = "/llms.txt") {
30
3
  const path = basePath.startsWith("/") ? basePath : `/${basePath}`;
31
4
  return `${config.site.canonicalUrl}${path}`;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQ9D,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,QAAQ,GAAG,WAAW;IACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IAClE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,oBAA6B,EAC7B,WAAW,GAAG,WAAW;IAEzB,MAAM,KAAK,GAAoB;QAC7B;YACE,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC;SACzC;KACF,CAAC;IAEF,IAAI,oBAAoB,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC;YACZ,GAAG,EAAE,WAAW;YAChB,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,QAAQ,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { EngawaConfig, EngawaResource } from "@thierry-gilgen-ict/engawa-core";
2
+ export type LlmsTxtOverflowPolicy = "error" | "trim-optional";
3
+ export type LlmsTxtWarningCode = "MISSING_DESCRIPTION" | "DESCRIPTION_EQUALS_TITLE";
4
+ export interface LlmsTxtWarning {
5
+ code: LlmsTxtWarningCode;
6
+ resourceId: string;
7
+ }
8
+ export interface LlmsTxtBuildResult {
9
+ text: string;
10
+ byteLength: number;
11
+ includedPrimaryResourceIds: string[];
12
+ includedOptionalResourceIds: string[];
13
+ omittedOptionalResourceIds: string[];
14
+ warnings: LlmsTxtWarning[];
15
+ }
16
+ export interface LlmsTxtOptions {
17
+ mcpPath?: string | false;
18
+ optionalResourceIds?: string[];
19
+ preamble?: string;
20
+ requireDescriptions?: boolean;
21
+ maxBytes?: number;
22
+ overflowPolicy?: LlmsTxtOverflowPolicy;
23
+ }
24
+ export declare function buildLlmsTxt(config: EngawaConfig, resources: EngawaResource[], options?: LlmsTxtOptions): LlmsTxtBuildResult;
25
+ export declare function generateLlmsTxt(config: EngawaConfig, resources: EngawaResource[], options?: LlmsTxtOptions): string;
26
+ //# sourceMappingURL=llms-txt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEpF,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,eAAe,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,0BAA0B,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC,2BAA2B,EAAE,MAAM,EAAE,CAAC;IACtC,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAqLD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EAAE,EAC3B,OAAO,GAAE,cAAmB,GAC3B,kBAAkB,CA6DpB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EAAE,EAC3B,OAAO,GAAE,cAAmB,GAC3B,MAAM,CAER"}
@@ -0,0 +1,203 @@
1
+ const GENERIC_PROSE_WITH_MCP = [
2
+ "{siteName} provides machine-readable content for AI agents.",
3
+ "",
4
+ "Agents should read this file, follow links to detailed markdown pages, and use the MCP endpoint for structured search.",
5
+ ];
6
+ const GENERIC_PROSE_WITHOUT_MCP = [
7
+ "{siteName} provides machine-readable content for AI agents.",
8
+ "",
9
+ "Agents should read this file and follow links to detailed markdown pages.",
10
+ ];
11
+ function utf8ByteLength(text) {
12
+ return Buffer.byteLength(text, "utf8");
13
+ }
14
+ function normalizeDescriptionForLine(description) {
15
+ return description.replace(/\s+/g, " ").trim();
16
+ }
17
+ function normalizeForComparison(value) {
18
+ return value.replace(/\s+/g, " ").trim().toLowerCase();
19
+ }
20
+ function formatMcpPath(mcpPath) {
21
+ return mcpPath.startsWith("/") ? mcpPath : `/${mcpPath}`;
22
+ }
23
+ function formatListItem(resource) {
24
+ const rawDescription = resource.description?.trim();
25
+ const note = rawDescription ? `: ${normalizeDescriptionForLine(resource.description)}` : "";
26
+ return `- [${resource.title}](${resource.canonicalUrl})${note}`;
27
+ }
28
+ function collectDescriptionWarnings(resources) {
29
+ const warnings = [];
30
+ for (const resource of resources) {
31
+ const raw = resource.description?.trim();
32
+ if (!raw) {
33
+ warnings.push({ code: "MISSING_DESCRIPTION", resourceId: resource.id });
34
+ continue;
35
+ }
36
+ if (normalizeForComparison(raw) === normalizeForComparison(resource.title)) {
37
+ warnings.push({ code: "DESCRIPTION_EQUALS_TITLE", resourceId: resource.id });
38
+ }
39
+ }
40
+ return warnings;
41
+ }
42
+ function assertRequireDescriptions(resources) {
43
+ for (const resource of resources) {
44
+ if (!resource.description?.trim()) {
45
+ throw new Error(`llms.txt requires a description for resource: ${resource.id}`);
46
+ }
47
+ }
48
+ }
49
+ function validatePositiveIntegerMaxBytes(maxBytes) {
50
+ if (!Number.isFinite(maxBytes) || !Number.isInteger(maxBytes) || maxBytes <= 0) {
51
+ throw new Error(`llms.txt maxBytes must be a positive integer: ${maxBytes}`);
52
+ }
53
+ }
54
+ function validateInputs(resources, options) {
55
+ const seenIds = new Set();
56
+ for (const resource of resources) {
57
+ if (seenIds.has(resource.id)) {
58
+ throw new Error(`duplicate resource id in llms.txt input: ${resource.id}`);
59
+ }
60
+ seenIds.add(resource.id);
61
+ }
62
+ const optionalIdsList = options.optionalResourceIds ?? [];
63
+ const seenOptional = new Set();
64
+ for (const id of optionalIdsList) {
65
+ if (seenOptional.has(id)) {
66
+ throw new Error(`duplicate optionalResourceId in llms.txt options: ${id}`);
67
+ }
68
+ seenOptional.add(id);
69
+ if (!seenIds.has(id)) {
70
+ throw new Error(`unknown optionalResourceId in llms.txt options: ${id}`);
71
+ }
72
+ }
73
+ if (options.overflowPolicy !== undefined && options.maxBytes === undefined) {
74
+ throw new Error("llms.txt overflowPolicy requires maxBytes");
75
+ }
76
+ if (options.overflowPolicy !== undefined &&
77
+ options.overflowPolicy !== "error" &&
78
+ options.overflowPolicy !== "trim-optional") {
79
+ throw new Error(`invalid llms.txt overflowPolicy: ${options.overflowPolicy}`);
80
+ }
81
+ if (options.maxBytes !== undefined) {
82
+ validatePositiveIntegerMaxBytes(options.maxBytes);
83
+ }
84
+ return seenOptional;
85
+ }
86
+ function buildMcpLines(config, mcpPath) {
87
+ if (mcpPath === false) {
88
+ return [];
89
+ }
90
+ const path = formatMcpPath(mcpPath ?? "/mcp");
91
+ return [
92
+ `- MCP endpoint: ${config.site.canonicalUrl}${path}`,
93
+ "- Public agent interface is read-only in v0.1.",
94
+ ];
95
+ }
96
+ function normalizePreambleSurroundingLines(preamble) {
97
+ const lines = preamble.split("\n");
98
+ let start = 0;
99
+ let end = lines.length;
100
+ while (start < end && lines[start].trim() === "")
101
+ start++;
102
+ while (end > start && lines[end - 1].trim() === "")
103
+ end--;
104
+ return lines.slice(start, end).join("\n");
105
+ }
106
+ function buildBodyLines(config, options, mcpPath) {
107
+ const mcpLines = buildMcpLines(config, mcpPath);
108
+ if (options.preamble !== undefined) {
109
+ const preamble = normalizePreambleSurroundingLines(options.preamble);
110
+ if (preamble.length === 0) {
111
+ return mcpLines.length > 0 ? ["", ...mcpLines] : [];
112
+ }
113
+ if (mcpLines.length === 0) {
114
+ return [preamble];
115
+ }
116
+ return [preamble, "", ...mcpLines];
117
+ }
118
+ const genericTemplate = mcpPath === false ? GENERIC_PROSE_WITHOUT_MCP : GENERIC_PROSE_WITH_MCP;
119
+ const generic = genericTemplate.map((line) => line === "{siteName} provides machine-readable content for AI agents."
120
+ ? `${config.site.name} provides machine-readable content for AI agents.`
121
+ : line);
122
+ return [...generic, "", ...mcpLines];
123
+ }
124
+ function assembleDocument(config, bodyLines, primary, optional) {
125
+ const lines = [
126
+ `# ${config.site.name}`,
127
+ `> ${config.site.description}`,
128
+ "",
129
+ ...bodyLines,
130
+ "",
131
+ "## Pages",
132
+ ...primary.map((r) => formatListItem(r)),
133
+ ];
134
+ if (optional.length > 0) {
135
+ lines.push("", "## Optional", ...optional.map((r) => formatListItem(r)));
136
+ }
137
+ return lines.join("\n").trimEnd() + "\n";
138
+ }
139
+ function assertWithinMaxBytes(text, maxBytes) {
140
+ const byteLength = utf8ByteLength(text);
141
+ if (byteLength > maxBytes) {
142
+ throw new Error(`llms.txt exceeds maxBytes (${byteLength} bytes, limit ${maxBytes})`);
143
+ }
144
+ }
145
+ export function buildLlmsTxt(config, resources, options = {}) {
146
+ const optionalIds = validateInputs(resources, options);
147
+ const warnings = collectDescriptionWarnings(resources);
148
+ if (options.requireDescriptions) {
149
+ assertRequireDescriptions(resources);
150
+ }
151
+ const primary = resources.filter((r) => !optionalIds.has(r.id));
152
+ const optionalCandidates = resources.filter((r) => optionalIds.has(r.id));
153
+ const bodyLines = buildBodyLines(config, options, options.mcpPath);
154
+ const includedPrimaryResourceIds = primary.map((r) => r.id);
155
+ let includedOptional = [];
156
+ const omittedOptionalResourceIds = [];
157
+ if (options.maxBytes !== undefined) {
158
+ const maxBytes = options.maxBytes;
159
+ const overflowPolicy = options.overflowPolicy ?? "error";
160
+ const primaryOnlyText = assembleDocument(config, bodyLines, primary, []);
161
+ if (utf8ByteLength(primaryOnlyText) > maxBytes) {
162
+ throw new Error(`llms.txt exceeds maxBytes (${utf8ByteLength(primaryOnlyText)} bytes, limit ${maxBytes})`);
163
+ }
164
+ if (overflowPolicy === "error") {
165
+ const fullText = assembleDocument(config, bodyLines, primary, optionalCandidates);
166
+ assertWithinMaxBytes(fullText, maxBytes);
167
+ includedOptional = optionalCandidates;
168
+ }
169
+ else {
170
+ for (let i = 0; i < optionalCandidates.length; i++) {
171
+ const resource = optionalCandidates[i];
172
+ const candidateOptional = [...includedOptional, resource];
173
+ const candidateText = assembleDocument(config, bodyLines, primary, candidateOptional);
174
+ if (utf8ByteLength(candidateText) <= maxBytes) {
175
+ includedOptional = candidateOptional;
176
+ }
177
+ else {
178
+ omittedOptionalResourceIds.push(resource.id);
179
+ for (let j = i + 1; j < optionalCandidates.length; j++) {
180
+ omittedOptionalResourceIds.push(optionalCandidates[j].id);
181
+ }
182
+ break;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ else {
188
+ includedOptional = optionalCandidates;
189
+ }
190
+ const text = assembleDocument(config, bodyLines, primary, includedOptional);
191
+ return {
192
+ text,
193
+ byteLength: utf8ByteLength(text),
194
+ includedPrimaryResourceIds,
195
+ includedOptionalResourceIds: includedOptional.map((r) => r.id),
196
+ omittedOptionalResourceIds,
197
+ warnings,
198
+ };
199
+ }
200
+ export function generateLlmsTxt(config, resources, options = {}) {
201
+ return buildLlmsTxt(config, resources, options).text;
202
+ }
203
+ //# sourceMappingURL=llms-txt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thierry-gilgen-ict/engawa-discovery",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "llms.txt v2 generation and discovery link metadata for Engawa",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -27,9 +27,12 @@
27
27
  "LICENSE"
28
28
  ],
29
29
  "dependencies": {
30
- "@thierry-gilgen-ict/engawa-core": "0.1.0"
30
+ "@thierry-gilgen-ict/engawa-core": "0.1.1"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
34
+ },
35
+ "engines": {
36
+ "node": ">=24"
34
37
  }
35
38
  }