@cleocode/lafs 2026.3.74 → 2026.4.3

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 (143) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +97 -68
  3. package/dist/schemas/v1/agent-card.schema.json +230 -0
  4. package/dist/schemas/v1/conformance-profiles.json +0 -0
  5. package/dist/schemas/v1/context-ledger.schema.json +70 -0
  6. package/dist/schemas/v1/discovery.schema.json +132 -0
  7. package/dist/schemas/v1/envelope.schema.json +0 -0
  8. package/dist/schemas/v1/error-registry.json +0 -0
  9. package/dist/src/a2a/bindings/grpc.d.ts +118 -11
  10. package/dist/src/a2a/bindings/grpc.d.ts.map +1 -0
  11. package/dist/src/a2a/bindings/grpc.js +80 -8
  12. package/dist/src/a2a/bindings/grpc.js.map +1 -0
  13. package/dist/src/a2a/bindings/http.d.ts +131 -15
  14. package/dist/src/a2a/bindings/http.d.ts.map +1 -0
  15. package/dist/src/a2a/bindings/http.js +101 -14
  16. package/dist/src/a2a/bindings/http.js.map +1 -0
  17. package/dist/src/a2a/bindings/index.d.ts +83 -9
  18. package/dist/src/a2a/bindings/index.d.ts.map +1 -0
  19. package/dist/src/a2a/bindings/index.js +74 -6
  20. package/dist/src/a2a/bindings/index.js.map +1 -0
  21. package/dist/src/a2a/bindings/jsonrpc.d.ts +194 -9
  22. package/dist/src/a2a/bindings/jsonrpc.d.ts.map +1 -0
  23. package/dist/src/a2a/bindings/jsonrpc.js +155 -10
  24. package/dist/src/a2a/bindings/jsonrpc.js.map +1 -0
  25. package/dist/src/a2a/bridge.d.ts +237 -44
  26. package/dist/src/a2a/bridge.d.ts.map +1 -0
  27. package/dist/src/a2a/bridge.js +187 -48
  28. package/dist/src/a2a/bridge.js.map +1 -0
  29. package/dist/src/a2a/extensions.d.ts +222 -12
  30. package/dist/src/a2a/extensions.d.ts.map +1 -0
  31. package/dist/src/a2a/extensions.js +178 -13
  32. package/dist/src/a2a/extensions.js.map +1 -0
  33. package/dist/src/a2a/index.d.ts +10 -7
  34. package/dist/src/a2a/index.d.ts.map +1 -0
  35. package/dist/src/a2a/index.js +24 -27
  36. package/dist/src/a2a/index.js.map +1 -0
  37. package/dist/src/a2a/streaming.d.ts +276 -3
  38. package/dist/src/a2a/streaming.d.ts.map +1 -0
  39. package/dist/src/a2a/streaming.js +255 -11
  40. package/dist/src/a2a/streaming.js.map +1 -0
  41. package/dist/src/a2a/task-lifecycle.d.ts +341 -20
  42. package/dist/src/a2a/task-lifecycle.d.ts.map +1 -0
  43. package/dist/src/a2a/task-lifecycle.js +327 -26
  44. package/dist/src/a2a/task-lifecycle.js.map +1 -0
  45. package/dist/src/budgetEnforcement.d.ts +93 -20
  46. package/dist/src/budgetEnforcement.d.ts.map +1 -0
  47. package/dist/src/budgetEnforcement.js +146 -31
  48. package/dist/src/budgetEnforcement.js.map +1 -0
  49. package/dist/src/circuit-breaker/index.d.ts +260 -10
  50. package/dist/src/circuit-breaker/index.d.ts.map +1 -0
  51. package/dist/src/circuit-breaker/index.js +226 -14
  52. package/dist/src/circuit-breaker/index.js.map +1 -0
  53. package/dist/src/cli.d.ts +1 -0
  54. package/dist/src/cli.d.ts.map +1 -0
  55. package/dist/src/cli.js +12 -11
  56. package/dist/src/cli.js.map +1 -0
  57. package/dist/src/compliance.d.ts +180 -3
  58. package/dist/src/compliance.d.ts.map +1 -0
  59. package/dist/src/compliance.js +114 -13
  60. package/dist/src/compliance.js.map +1 -0
  61. package/dist/src/conformance.d.ts +55 -2
  62. package/dist/src/conformance.d.ts.map +1 -0
  63. package/dist/src/conformance.js +124 -76
  64. package/dist/src/conformance.js.map +1 -0
  65. package/dist/src/conformanceProfiles.d.ts +68 -1
  66. package/dist/src/conformanceProfiles.d.ts.map +1 -0
  67. package/dist/src/conformanceProfiles.js +53 -1
  68. package/dist/src/conformanceProfiles.js.map +1 -0
  69. package/dist/src/deprecationRegistry.d.ts +82 -1
  70. package/dist/src/deprecationRegistry.d.ts.map +1 -0
  71. package/dist/src/deprecationRegistry.js +58 -7
  72. package/dist/src/deprecationRegistry.js.map +1 -0
  73. package/dist/src/discovery.d.ts +347 -65
  74. package/dist/src/discovery.d.ts.map +1 -0
  75. package/dist/src/discovery.js +130 -72
  76. package/dist/src/discovery.js.map +1 -0
  77. package/dist/src/envelope.d.ts +262 -9
  78. package/dist/src/envelope.d.ts.map +1 -0
  79. package/dist/src/envelope.js +179 -15
  80. package/dist/src/envelope.js.map +1 -0
  81. package/dist/src/errorRegistry.d.ts +163 -3
  82. package/dist/src/errorRegistry.d.ts.map +1 -0
  83. package/dist/src/errorRegistry.js +119 -3
  84. package/dist/src/errorRegistry.js.map +1 -0
  85. package/dist/src/fieldExtraction.d.ts +128 -27
  86. package/dist/src/fieldExtraction.d.ts.map +1 -0
  87. package/dist/src/fieldExtraction.js +100 -27
  88. package/dist/src/fieldExtraction.js.map +1 -0
  89. package/dist/src/flagResolver.d.ts +77 -10
  90. package/dist/src/flagResolver.d.ts.map +1 -0
  91. package/dist/src/flagResolver.js +22 -5
  92. package/dist/src/flagResolver.js.map +1 -0
  93. package/dist/src/flagSemantics.d.ts +80 -4
  94. package/dist/src/flagSemantics.d.ts.map +1 -0
  95. package/dist/src/flagSemantics.js +78 -11
  96. package/dist/src/flagSemantics.js.map +1 -0
  97. package/dist/src/health/index.d.ts +103 -9
  98. package/dist/src/health/index.d.ts.map +1 -0
  99. package/dist/src/health/index.js +75 -26
  100. package/dist/src/health/index.js.map +1 -0
  101. package/dist/src/index.d.ts +34 -23
  102. package/dist/src/index.d.ts.map +1 -0
  103. package/dist/src/index.js +40 -28
  104. package/dist/src/index.js.map +1 -0
  105. package/dist/src/mviProjection.d.ts +43 -6
  106. package/dist/src/mviProjection.d.ts.map +1 -0
  107. package/dist/src/mviProjection.js +32 -5
  108. package/dist/src/mviProjection.js.map +1 -0
  109. package/dist/src/native-loader.d.ts +49 -0
  110. package/dist/src/native-loader.d.ts.map +1 -0
  111. package/dist/src/native-loader.js +56 -0
  112. package/dist/src/native-loader.js.map +1 -0
  113. package/dist/src/problemDetails.d.ts +71 -4
  114. package/dist/src/problemDetails.d.ts.map +1 -0
  115. package/dist/src/problemDetails.js +27 -3
  116. package/dist/src/problemDetails.js.map +1 -0
  117. package/dist/src/shutdown/index.d.ts +103 -9
  118. package/dist/src/shutdown/index.d.ts.map +1 -0
  119. package/dist/src/shutdown/index.js +78 -12
  120. package/dist/src/shutdown/index.js.map +1 -0
  121. package/dist/src/tokenEstimator.d.ts +98 -11
  122. package/dist/src/tokenEstimator.d.ts.map +1 -0
  123. package/dist/src/tokenEstimator.js +91 -13
  124. package/dist/src/tokenEstimator.js.map +1 -0
  125. package/dist/src/types.d.ts +477 -11
  126. package/dist/src/types.d.ts.map +1 -0
  127. package/dist/src/types.js +76 -2
  128. package/dist/src/types.js.map +1 -0
  129. package/dist/src/validateEnvelope.d.ts +61 -2
  130. package/dist/src/validateEnvelope.d.ts.map +1 -0
  131. package/dist/src/validateEnvelope.js +81 -14
  132. package/dist/src/validateEnvelope.js.map +1 -0
  133. package/dist/tsconfig.build.tsbuildinfo +1 -0
  134. package/lafs.md +3 -4
  135. package/package.json +14 -12
  136. package/schemas/v1/agent-card.schema.json +0 -0
  137. package/schemas/v1/conformance-profiles.json +0 -0
  138. package/schemas/v1/context-ledger.schema.json +0 -0
  139. package/schemas/v1/discovery.schema.json +0 -0
  140. package/schemas/v1/envelope.schema.json +0 -0
  141. package/schemas/v1/error-registry.json +0 -0
  142. package/dist/src/mcpAdapter.d.ts +0 -28
  143. package/dist/src/mcpAdapter.js +0 -281
@@ -6,8 +6,8 @@
6
6
  * A2A v1.0+ Compliant Implementation
7
7
  * Reference: specs/external/agent-discovery.md
8
8
  */
9
- import { createRequire } from "node:module";
10
- import { createHash } from "crypto";
9
+ import { createRequire } from 'node:module';
10
+ import { createHash } from 'crypto';
11
11
  import { buildLafsExtension } from './a2a/extensions.js';
12
12
  const require = createRequire(import.meta.url);
13
13
  // Resolve package.json from project root (works from both src/ and dist/src/)
@@ -22,61 +22,86 @@ catch {
22
22
  // Utility Functions
23
23
  // ============================================================================
24
24
  /**
25
- * Build absolute URL from base and path
25
+ * Build an absolute URL from a base and path.
26
+ *
27
+ * @param base - Base URL prefix (may be `undefined` to infer from request)
28
+ * @param path - Relative or absolute path
29
+ * @param req - Optional Express request for protocol/host inference
30
+ * @returns Absolute URL string
31
+ *
32
+ * @remarks
33
+ * Resolution order: if `path` is already absolute, return as-is; otherwise
34
+ * combine with `base`, or fall back to request headers.
26
35
  */
27
36
  function buildUrl(base, path, req) {
28
- if (path.startsWith("http://") || path.startsWith("https://")) {
37
+ if (path.startsWith('http://') || path.startsWith('https://')) {
29
38
  return path;
30
39
  }
31
40
  if (base) {
32
- const separator = base.endsWith("/") || path.startsWith("/") ? "" : "/";
41
+ const separator = base.endsWith('/') || path.startsWith('/') ? '' : '/';
33
42
  return `${base}${separator}${path}`;
34
43
  }
35
44
  if (req) {
36
- const protocol = req.headers["x-forwarded-proto"] || req.protocol || "http";
37
- const host = req.headers.host || "localhost";
38
- const separator = path.startsWith("/") ? "" : "/";
45
+ const protocol = req.headers['x-forwarded-proto'] || req.protocol || 'http';
46
+ const host = req.headers.host || 'localhost';
47
+ const separator = path.startsWith('/') ? '' : '/';
39
48
  return `${protocol}://${host}${separator}${path}`;
40
49
  }
41
- return path.startsWith("/") ? path : `/${path}`;
50
+ return path.startsWith('/') ? path : `/${path}`;
42
51
  }
43
52
  /**
44
- * Generate ETag from content
53
+ * Generate an ETag from content.
54
+ *
55
+ * @param content - Serialized content string
56
+ * @returns Quoted SHA-256 ETag (first 32 hex chars)
57
+ *
58
+ * @remarks
59
+ * Uses SHA-256 truncated to 32 hex characters for a compact but
60
+ * collision-resistant ETag value.
45
61
  */
46
62
  function generateETag(content) {
47
- return `"${createHash("sha256").update(content).digest("hex").slice(0, 32)}"`;
63
+ return `"${createHash('sha256').update(content).digest('hex').slice(0, 32)}"`;
48
64
  }
49
65
  /**
50
- * Build A2A Agent Card from configuration
66
+ * Build an A2A Agent Card from configuration.
67
+ *
68
+ * @param config - Discovery configuration
69
+ * @param req - Optional Express request for URL construction
70
+ * @returns Fully-populated {@link AgentCard}
71
+ *
72
+ * @remarks
73
+ * Handles automatic migration from legacy `service` config to the A2A v1.0 format
74
+ * with a console deprecation warning. When `autoIncludeLafsExtension` is set, the
75
+ * LAFS extension is appended to the card's capabilities.
51
76
  */
52
77
  function buildAgentCard(config, req) {
53
- const schemaUrl = config.schemaUrl || "https://lafs.dev/schemas/v1/agent-card.schema.json";
78
+ const schemaUrl = config.schemaUrl || 'https://lafs.dev/schemas/v1/agent-card.schema.json';
54
79
  // Handle legacy config migration
55
80
  if (config.service && !config.agent) {
56
81
  console.warn("[DEPRECATION] Using legacy 'service' config. Migrate to 'agent' format for A2A v1.0+ compliance.");
57
82
  return {
58
83
  $schema: schemaUrl,
59
84
  name: config.service.name,
60
- description: config.service.description || "LAFS-compliant agent",
61
- version: config.lafsVersion || config.service.version || "1.0.0",
85
+ description: config.service.description || 'LAFS-compliant agent',
86
+ version: config.lafsVersion || config.service.version || '1.0.0',
62
87
  url: config.endpoints?.envelope
63
88
  ? buildUrl(config.baseUrl, config.endpoints.envelope, req)
64
- : buildUrl(config.baseUrl, "/", req),
89
+ : buildUrl(config.baseUrl, '/', req),
65
90
  capabilities: {
66
91
  streaming: false,
67
92
  pushNotifications: false,
68
93
  extendedAgentCard: false,
69
- extensions: []
94
+ extensions: [],
70
95
  },
71
- defaultInputModes: ["application/json"],
72
- defaultOutputModes: ["application/json"],
73
- skills: (config.capabilities || []).map(cap => ({
74
- id: cap.name.toLowerCase().replace(/\s+/g, "-"),
96
+ defaultInputModes: ['application/json'],
97
+ defaultOutputModes: ['application/json'],
98
+ skills: (config.capabilities || []).map((cap) => ({
99
+ id: cap.name.toLowerCase().replace(/\s+/g, '-'),
75
100
  name: cap.name,
76
101
  description: cap.description || `${cap.name} capability`,
77
102
  tags: cap.operations || [],
78
- examples: []
79
- }))
103
+ examples: [],
104
+ })),
80
105
  };
81
106
  }
82
107
  // Standard A2A v1.0 Agent Card (agent is guaranteed present; legacy path returned above)
@@ -84,7 +109,7 @@ function buildAgentCard(config, req) {
84
109
  const card = {
85
110
  $schema: schemaUrl,
86
111
  ...agent,
87
- url: agent.url || buildUrl(config.baseUrl, "/", req)
112
+ url: agent.url || buildUrl(config.baseUrl, '/', req),
88
113
  };
89
114
  // Auto-include LAFS extension if configured
90
115
  if (config.autoIncludeLafsExtension) {
@@ -105,11 +130,20 @@ function buildAgentCard(config, req) {
105
130
  return card;
106
131
  }
107
132
  /**
108
- * Build legacy discovery document for backward compatibility
109
- * @deprecated Will be removed in v2.0.0
133
+ * Build a legacy discovery document for backward compatibility.
134
+ *
135
+ * @param config - Discovery configuration
136
+ * @param req - Optional Express request for URL construction
137
+ * @returns Legacy {@link DiscoveryDocument}
138
+ *
139
+ * @remarks
140
+ * Generates the pre-A2A discovery document format from either the legacy
141
+ * `service` config or the modern `agent` config.
142
+ *
143
+ * @deprecated Will be removed in v2.0.0.
110
144
  */
111
145
  function buildLegacyDiscoveryDocument(config, req) {
112
- const schemaUrl = config.schemaUrl || "https://lafs.dev/schemas/v1/discovery.schema.json";
146
+ const schemaUrl = config.schemaUrl || 'https://lafs.dev/schemas/v1/discovery.schema.json';
113
147
  const lafsVersion = config.lafsVersion || pkg.version;
114
148
  return {
115
149
  $schema: schemaUrl,
@@ -117,34 +151,40 @@ function buildLegacyDiscoveryDocument(config, req) {
117
151
  service: config.service || {
118
152
  name: config.agent.name,
119
153
  version: config.agent.version,
120
- description: config.agent.description
154
+ description: config.agent.description,
121
155
  },
122
- capabilities: config.capabilities || config.agent.skills.map(skill => ({
123
- name: skill.name,
124
- version: config.agent.version,
125
- description: skill.description,
126
- operations: skill.tags,
127
- optional: false
128
- })),
156
+ capabilities: config.capabilities ||
157
+ config.agent.skills.map((skill) => ({
158
+ name: skill.name,
159
+ version: config.agent.version,
160
+ description: skill.description,
161
+ operations: skill.tags,
162
+ optional: false,
163
+ })),
129
164
  endpoints: {
130
165
  envelope: buildUrl(config.baseUrl, config.endpoints?.envelope || config.agent.url, req),
131
- context: config.endpoints?.context ? buildUrl(config.baseUrl, config.endpoints.context, req) : undefined,
132
- discovery: config.endpoints?.discovery || buildUrl(config.baseUrl, "/.well-known/lafs.json", req)
133
- }
166
+ context: config.endpoints?.context
167
+ ? buildUrl(config.baseUrl, config.endpoints.context, req)
168
+ : undefined,
169
+ discovery: config.endpoints?.discovery || buildUrl(config.baseUrl, '/.well-known/lafs.json', req),
170
+ },
134
171
  };
135
172
  }
136
173
  // ============================================================================
137
174
  // Middleware
138
175
  // ============================================================================
139
176
  /**
140
- * Create Express middleware for serving A2A Agent Card
141
- *
142
- * Serves A2A-compliant Agent Card at /.well-known/agent-card.json
143
- * Maintains backward compatibility with legacy /.well-known/lafs.json
177
+ * Create Express middleware for serving A2A Agent Card.
144
178
  *
145
179
  * @param config - Discovery configuration (A2A v1.0 format)
146
- * @param options - Middleware options
147
- * @returns Express RequestHandler
180
+ * @param options - Middleware options for path routing and caching
181
+ * @returns Express RequestHandler that serves the Agent Card
182
+ *
183
+ * @remarks
184
+ * Serves an A2A-compliant Agent Card at `/.well-known/agent-card.json`.
185
+ * Maintains backward compatibility with the legacy `/.well-known/lafs.json`
186
+ * path (with deprecation warnings). Supports ETag-based conditional requests,
187
+ * HEAD requests, and configurable cache headers.
148
188
  *
149
189
  * @example
150
190
  * ```typescript
@@ -180,8 +220,8 @@ function buildLegacyDiscoveryDocument(config, req) {
180
220
  * ```
181
221
  */
182
222
  export function discoveryMiddleware(config, options = {}) {
183
- const path = options.path || "/.well-known/agent-card.json";
184
- const legacyPath = options.legacyPath || "/.well-known/lafs.json";
223
+ const path = options.path || '/.well-known/agent-card.json';
224
+ const legacyPath = options.legacyPath || '/.well-known/lafs.json';
185
225
  // Disable legacy path by default when a custom path is set, unless explicitly enabled
186
226
  const enableLegacyPath = options.enableLegacyPath ?? !options.path;
187
227
  const enableHead = options.enableHead !== false;
@@ -238,31 +278,31 @@ export function discoveryMiddleware(config, options = {}) {
238
278
  `Migrate to ${path} for A2A v1.0+ compliance. Legacy support will be removed in v2.0.0.`);
239
279
  }
240
280
  // Handle HEAD requests
241
- if (req.method === "HEAD") {
281
+ if (req.method === 'HEAD') {
242
282
  if (!enableHead) {
243
283
  res.status(405).json({
244
- error: "Method Not Allowed",
245
- message: "HEAD requests are disabled for this endpoint"
284
+ error: 'Method Not Allowed',
285
+ message: 'HEAD requests are disabled for this endpoint',
246
286
  });
247
287
  return;
248
288
  }
249
289
  const json = getSerializedDoc(isLegacyPath, req);
250
290
  const etag = enableEtag ? generateETag(json) : undefined;
251
291
  res.set({
252
- "Content-Type": "application/json",
253
- "Cache-Control": `public, max-age=${cacheMaxAge}`,
254
- ...(etag && { "ETag": etag }),
255
- ...(isLegacyPath && { "Deprecation": "true", "Sunset": "Sat, 31 Dec 2025 23:59:59 GMT" }),
256
- "Content-Length": Buffer.byteLength(json)
292
+ 'Content-Type': 'application/json',
293
+ 'Cache-Control': `public, max-age=${cacheMaxAge}`,
294
+ ...(etag && { ETag: etag }),
295
+ ...(isLegacyPath && { Deprecation: 'true', Sunset: 'Sat, 31 Dec 2025 23:59:59 GMT' }),
296
+ 'Content-Length': Buffer.byteLength(json),
257
297
  });
258
298
  res.status(200).end();
259
299
  return;
260
300
  }
261
301
  // Only handle GET requests
262
- if (req.method !== "GET") {
302
+ if (req.method !== 'GET') {
263
303
  res.status(405).json({
264
- error: "Method Not Allowed",
265
- message: `Method ${req.method} not allowed. Use GET or HEAD.`
304
+ error: 'Method Not Allowed',
305
+ message: `Method ${req.method} not allowed. Use GET or HEAD.`,
266
306
  });
267
307
  return;
268
308
  }
@@ -270,24 +310,24 @@ export function discoveryMiddleware(config, options = {}) {
270
310
  const json = getSerializedDoc(isLegacyPath, req);
271
311
  const etag = enableEtag ? generateETag(json) : undefined;
272
312
  // Check If-None-Match for conditional request
273
- if (enableEtag && req.headers["if-none-match"] === etag) {
313
+ if (enableEtag && req.headers['if-none-match'] === etag) {
274
314
  res.status(304).end();
275
315
  return;
276
316
  }
277
317
  // Set response headers
278
318
  const headers = {
279
- "Content-Type": "application/json",
280
- "Cache-Control": `public, max-age=${cacheMaxAge}`,
281
- ...config.headers
319
+ 'Content-Type': 'application/json',
320
+ 'Cache-Control': `public, max-age=${cacheMaxAge}`,
321
+ ...config.headers,
282
322
  };
283
323
  if (etag) {
284
- headers["ETag"] = etag;
324
+ headers['ETag'] = etag;
285
325
  }
286
326
  // Add deprecation headers for legacy path
287
327
  if (isLegacyPath) {
288
- headers["Deprecation"] = "true";
289
- headers["Sunset"] = "Sat, 31 Dec 2025 23:59:59 GMT";
290
- headers["Link"] = `<${buildUrl(config.baseUrl, path, req)}>; rel="successor-version"`;
328
+ headers['Deprecation'] = 'true';
329
+ headers['Sunset'] = 'Sat, 31 Dec 2025 23:59:59 GMT';
330
+ headers['Link'] = `<${buildUrl(config.baseUrl, path, req)}>; rel="successor-version"`;
291
331
  }
292
332
  res.set(headers);
293
333
  res.status(200).send(json);
@@ -298,22 +338,39 @@ export function discoveryMiddleware(config, options = {}) {
298
338
  };
299
339
  }
300
340
  /**
301
- * Fastify plugin for A2A Agent Card discovery
341
+ * Fastify plugin for A2A Agent Card discovery.
302
342
  *
303
343
  * @param fastify - Fastify instance
304
- * @param options - Plugin options
344
+ * @param options - Plugin options containing `config` and optional `path`
345
+ * @returns Promise that resolves when the plugin is registered
346
+ *
347
+ * @remarks
348
+ * Registers a route on the Fastify instance to serve the A2A Agent Card
349
+ * with proper caching headers. The actual route registration depends on
350
+ * the Fastify API; this provides a type-safe plugin signature.
351
+ *
352
+ * @example
353
+ * ```typescript
354
+ * import Fastify from "fastify";
355
+ * import { discoveryFastifyPlugin } from "@cleocode/lafs/discovery";
356
+ *
357
+ * const app = Fastify();
358
+ * app.register(discoveryFastifyPlugin, {
359
+ * config: { agent: { name: "my-agent", ... } },
360
+ * });
361
+ * ```
305
362
  */
306
363
  export async function discoveryFastifyPlugin(fastify, options) {
307
- const path = options.path || "/.well-known/agent-card.json";
364
+ const _path = options.path || '/.well-known/agent-card.json';
308
365
  const config = options.config;
309
366
  const cacheMaxAge = config.cacheMaxAge || 3600;
310
- const handler = async (request, reply) => {
367
+ const _handler = async (request, reply) => {
311
368
  const doc = buildAgentCard(config, request.raw);
312
369
  const json = JSON.stringify(doc);
313
370
  const etag = generateETag(json);
314
- reply.header("Content-Type", "application/json");
315
- reply.header("Cache-Control", `public, max-age=${cacheMaxAge}`);
316
- reply.header("ETag", etag);
371
+ reply.header('Content-Type', 'application/json');
372
+ reply.header('Cache-Control', `public, max-age=${cacheMaxAge}`);
373
+ reply.header('ETag', etag);
317
374
  return doc;
318
375
  };
319
376
  // Note: Actual route registration depends on Fastify's API
@@ -348,3 +405,4 @@ export async function discoveryFastifyPlugin(fastify, options) {
348
405
  * - Automatic config migration will be removed
349
406
  */
350
407
  export default discoveryMiddleware;
408
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/discovery.ts"],"names":[],"mappings":"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"}