@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.
- package/LICENSE +0 -0
- package/README.md +97 -68
- package/dist/schemas/v1/agent-card.schema.json +230 -0
- package/dist/schemas/v1/conformance-profiles.json +0 -0
- package/dist/schemas/v1/context-ledger.schema.json +70 -0
- package/dist/schemas/v1/discovery.schema.json +132 -0
- package/dist/schemas/v1/envelope.schema.json +0 -0
- package/dist/schemas/v1/error-registry.json +0 -0
- package/dist/src/a2a/bindings/grpc.d.ts +118 -11
- package/dist/src/a2a/bindings/grpc.d.ts.map +1 -0
- package/dist/src/a2a/bindings/grpc.js +80 -8
- package/dist/src/a2a/bindings/grpc.js.map +1 -0
- package/dist/src/a2a/bindings/http.d.ts +131 -15
- package/dist/src/a2a/bindings/http.d.ts.map +1 -0
- package/dist/src/a2a/bindings/http.js +101 -14
- package/dist/src/a2a/bindings/http.js.map +1 -0
- package/dist/src/a2a/bindings/index.d.ts +83 -9
- package/dist/src/a2a/bindings/index.d.ts.map +1 -0
- package/dist/src/a2a/bindings/index.js +74 -6
- package/dist/src/a2a/bindings/index.js.map +1 -0
- package/dist/src/a2a/bindings/jsonrpc.d.ts +194 -9
- package/dist/src/a2a/bindings/jsonrpc.d.ts.map +1 -0
- package/dist/src/a2a/bindings/jsonrpc.js +155 -10
- package/dist/src/a2a/bindings/jsonrpc.js.map +1 -0
- package/dist/src/a2a/bridge.d.ts +237 -44
- package/dist/src/a2a/bridge.d.ts.map +1 -0
- package/dist/src/a2a/bridge.js +187 -48
- package/dist/src/a2a/bridge.js.map +1 -0
- package/dist/src/a2a/extensions.d.ts +222 -12
- package/dist/src/a2a/extensions.d.ts.map +1 -0
- package/dist/src/a2a/extensions.js +178 -13
- package/dist/src/a2a/extensions.js.map +1 -0
- package/dist/src/a2a/index.d.ts +10 -7
- package/dist/src/a2a/index.d.ts.map +1 -0
- package/dist/src/a2a/index.js +24 -27
- package/dist/src/a2a/index.js.map +1 -0
- package/dist/src/a2a/streaming.d.ts +276 -3
- package/dist/src/a2a/streaming.d.ts.map +1 -0
- package/dist/src/a2a/streaming.js +255 -11
- package/dist/src/a2a/streaming.js.map +1 -0
- package/dist/src/a2a/task-lifecycle.d.ts +341 -20
- package/dist/src/a2a/task-lifecycle.d.ts.map +1 -0
- package/dist/src/a2a/task-lifecycle.js +327 -26
- package/dist/src/a2a/task-lifecycle.js.map +1 -0
- package/dist/src/budgetEnforcement.d.ts +93 -20
- package/dist/src/budgetEnforcement.d.ts.map +1 -0
- package/dist/src/budgetEnforcement.js +146 -31
- package/dist/src/budgetEnforcement.js.map +1 -0
- package/dist/src/circuit-breaker/index.d.ts +260 -10
- package/dist/src/circuit-breaker/index.d.ts.map +1 -0
- package/dist/src/circuit-breaker/index.js +226 -14
- package/dist/src/circuit-breaker/index.js.map +1 -0
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +12 -11
- package/dist/src/cli.js.map +1 -0
- package/dist/src/compliance.d.ts +180 -3
- package/dist/src/compliance.d.ts.map +1 -0
- package/dist/src/compliance.js +114 -13
- package/dist/src/compliance.js.map +1 -0
- package/dist/src/conformance.d.ts +55 -2
- package/dist/src/conformance.d.ts.map +1 -0
- package/dist/src/conformance.js +124 -76
- package/dist/src/conformance.js.map +1 -0
- package/dist/src/conformanceProfiles.d.ts +68 -1
- package/dist/src/conformanceProfiles.d.ts.map +1 -0
- package/dist/src/conformanceProfiles.js +53 -1
- package/dist/src/conformanceProfiles.js.map +1 -0
- package/dist/src/deprecationRegistry.d.ts +82 -1
- package/dist/src/deprecationRegistry.d.ts.map +1 -0
- package/dist/src/deprecationRegistry.js +58 -7
- package/dist/src/deprecationRegistry.js.map +1 -0
- package/dist/src/discovery.d.ts +347 -65
- package/dist/src/discovery.d.ts.map +1 -0
- package/dist/src/discovery.js +130 -72
- package/dist/src/discovery.js.map +1 -0
- package/dist/src/envelope.d.ts +262 -9
- package/dist/src/envelope.d.ts.map +1 -0
- package/dist/src/envelope.js +179 -15
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/errorRegistry.d.ts +163 -3
- package/dist/src/errorRegistry.d.ts.map +1 -0
- package/dist/src/errorRegistry.js +119 -3
- package/dist/src/errorRegistry.js.map +1 -0
- package/dist/src/fieldExtraction.d.ts +128 -27
- package/dist/src/fieldExtraction.d.ts.map +1 -0
- package/dist/src/fieldExtraction.js +100 -27
- package/dist/src/fieldExtraction.js.map +1 -0
- package/dist/src/flagResolver.d.ts +77 -10
- package/dist/src/flagResolver.d.ts.map +1 -0
- package/dist/src/flagResolver.js +22 -5
- package/dist/src/flagResolver.js.map +1 -0
- package/dist/src/flagSemantics.d.ts +80 -4
- package/dist/src/flagSemantics.d.ts.map +1 -0
- package/dist/src/flagSemantics.js +78 -11
- package/dist/src/flagSemantics.js.map +1 -0
- package/dist/src/health/index.d.ts +103 -9
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +75 -26
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/index.d.ts +34 -23
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +40 -28
- package/dist/src/index.js.map +1 -0
- package/dist/src/mviProjection.d.ts +43 -6
- package/dist/src/mviProjection.d.ts.map +1 -0
- package/dist/src/mviProjection.js +32 -5
- package/dist/src/mviProjection.js.map +1 -0
- package/dist/src/native-loader.d.ts +49 -0
- package/dist/src/native-loader.d.ts.map +1 -0
- package/dist/src/native-loader.js +56 -0
- package/dist/src/native-loader.js.map +1 -0
- package/dist/src/problemDetails.d.ts +71 -4
- package/dist/src/problemDetails.d.ts.map +1 -0
- package/dist/src/problemDetails.js +27 -3
- package/dist/src/problemDetails.js.map +1 -0
- package/dist/src/shutdown/index.d.ts +103 -9
- package/dist/src/shutdown/index.d.ts.map +1 -0
- package/dist/src/shutdown/index.js +78 -12
- package/dist/src/shutdown/index.js.map +1 -0
- package/dist/src/tokenEstimator.d.ts +98 -11
- package/dist/src/tokenEstimator.d.ts.map +1 -0
- package/dist/src/tokenEstimator.js +91 -13
- package/dist/src/tokenEstimator.js.map +1 -0
- package/dist/src/types.d.ts +477 -11
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +76 -2
- package/dist/src/types.js.map +1 -0
- package/dist/src/validateEnvelope.d.ts +61 -2
- package/dist/src/validateEnvelope.d.ts.map +1 -0
- package/dist/src/validateEnvelope.js +81 -14
- package/dist/src/validateEnvelope.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/lafs.md +3 -4
- package/package.json +14 -12
- package/schemas/v1/agent-card.schema.json +0 -0
- package/schemas/v1/conformance-profiles.json +0 -0
- package/schemas/v1/context-ledger.schema.json +0 -0
- package/schemas/v1/discovery.schema.json +0 -0
- package/schemas/v1/envelope.schema.json +0 -0
- package/schemas/v1/error-registry.json +0 -0
- package/dist/src/mcpAdapter.d.ts +0 -28
- package/dist/src/mcpAdapter.js +0 -281
package/dist/src/discovery.js
CHANGED
|
@@ -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
|
|
10
|
-
import { createHash } from
|
|
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(
|
|
37
|
+
if (path.startsWith('http://') || path.startsWith('https://')) {
|
|
29
38
|
return path;
|
|
30
39
|
}
|
|
31
40
|
if (base) {
|
|
32
|
-
const separator = base.endsWith(
|
|
41
|
+
const separator = base.endsWith('/') || path.startsWith('/') ? '' : '/';
|
|
33
42
|
return `${base}${separator}${path}`;
|
|
34
43
|
}
|
|
35
44
|
if (req) {
|
|
36
|
-
const protocol = req.headers[
|
|
37
|
-
const host = req.headers.host ||
|
|
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(
|
|
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(
|
|
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 ||
|
|
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 ||
|
|
61
|
-
version: config.lafsVersion || config.service.version ||
|
|
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,
|
|
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: [
|
|
72
|
-
defaultOutputModes: [
|
|
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,
|
|
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
|
-
*
|
|
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 ||
|
|
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 ||
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
132
|
-
|
|
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 ||
|
|
184
|
-
const legacyPath = options.legacyPath ||
|
|
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 ===
|
|
281
|
+
if (req.method === 'HEAD') {
|
|
242
282
|
if (!enableHead) {
|
|
243
283
|
res.status(405).json({
|
|
244
|
-
error:
|
|
245
|
-
message:
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
...(etag && {
|
|
255
|
-
...(isLegacyPath && {
|
|
256
|
-
|
|
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 !==
|
|
302
|
+
if (req.method !== 'GET') {
|
|
263
303
|
res.status(405).json({
|
|
264
|
-
error:
|
|
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[
|
|
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
|
-
|
|
280
|
-
|
|
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[
|
|
324
|
+
headers['ETag'] = etag;
|
|
285
325
|
}
|
|
286
326
|
// Add deprecation headers for legacy path
|
|
287
327
|
if (isLegacyPath) {
|
|
288
|
-
headers[
|
|
289
|
-
headers[
|
|
290
|
-
headers[
|
|
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
|
|
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
|
|
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(
|
|
315
|
-
reply.header(
|
|
316
|
-
reply.header(
|
|
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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"}
|