ai-capability-framework 1.0.0-rc.1

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 (115) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/CONTRIBUTING.md +56 -0
  3. package/LICENSE +21 -0
  4. package/README.md +198 -0
  5. package/SECURITY.md +29 -0
  6. package/conformance/invalid/duplicate/capabilities/conformance.duplicate.one.yaml +55 -0
  7. package/conformance/invalid/duplicate/capabilities/conformance.duplicate.two.yaml +55 -0
  8. package/conformance/invalid/eval-results/conformance.results.failing.json +15 -0
  9. package/conformance/invalid/missing-reference/capabilities/conformance.missing_reference.prepare.yaml +58 -0
  10. package/conformance/invalid/schema/capabilities/conformance.invalid.missing_required.yaml +3 -0
  11. package/conformance/valid/capabilities/conformance.note.get.yaml +82 -0
  12. package/conformance/valid/decisions/conformance.note.get.denied_missing_permission.json +13 -0
  13. package/conformance/valid/entities/Note.yaml +18 -0
  14. package/conformance/valid/eval-results/conformance.results.passing.json +19 -0
  15. package/conformance/valid/evals/conformance.note.get.valid.yaml +33 -0
  16. package/conformance/valid/openai/context.no_permissions.json +6 -0
  17. package/dist/adapter-common.d.ts +62 -0
  18. package/dist/adapter-common.d.ts.map +1 -0
  19. package/dist/adapter-common.js +453 -0
  20. package/dist/ai-sdk.d.ts +5 -0
  21. package/dist/ai-sdk.d.ts.map +1 -0
  22. package/dist/ai-sdk.js +71 -0
  23. package/dist/anthropic-claude.d.ts +5 -0
  24. package/dist/anthropic-claude.d.ts.map +1 -0
  25. package/dist/anthropic-claude.js +62 -0
  26. package/dist/cli.d.ts +11 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +360 -0
  29. package/dist/decision.d.ts +6 -0
  30. package/dist/decision.d.ts.map +1 -0
  31. package/dist/decision.js +237 -0
  32. package/dist/eval-runner.d.ts +6 -0
  33. package/dist/eval-runner.d.ts.map +1 -0
  34. package/dist/eval-runner.js +372 -0
  35. package/dist/gemini.d.ts +5 -0
  36. package/dist/gemini.d.ts.map +1 -0
  37. package/dist/gemini.js +64 -0
  38. package/dist/generated/manifest-types.d.ts +208 -0
  39. package/dist/generated/manifest-types.d.ts.map +1 -0
  40. package/dist/generated/manifest-types.js +1 -0
  41. package/dist/index.d.ts +15 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +13 -0
  44. package/dist/langchain.d.ts +5 -0
  45. package/dist/langchain.d.ts.map +1 -0
  46. package/dist/langchain.js +65 -0
  47. package/dist/loader.d.ts +4 -0
  48. package/dist/loader.d.ts.map +1 -0
  49. package/dist/loader.js +94 -0
  50. package/dist/mcp.d.ts +5 -0
  51. package/dist/mcp.d.ts.map +1 -0
  52. package/dist/mcp.js +82 -0
  53. package/dist/openai-responses.d.ts +6 -0
  54. package/dist/openai-responses.d.ts.map +1 -0
  55. package/dist/openai-responses.js +65 -0
  56. package/dist/registry.d.ts +6 -0
  57. package/dist/registry.d.ts.map +1 -0
  58. package/dist/registry.js +134 -0
  59. package/dist/semantic-kernel.d.ts +5 -0
  60. package/dist/semantic-kernel.d.ts.map +1 -0
  61. package/dist/semantic-kernel.js +79 -0
  62. package/dist/types.d.ts +400 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +1 -0
  65. package/dist/validator.d.ts +3 -0
  66. package/dist/validator.d.ts.map +1 -0
  67. package/dist/validator.js +105 -0
  68. package/docs/adapter-roadmap.md +179 -0
  69. package/docs/adapters.md +112 -0
  70. package/docs/api.md +115 -0
  71. package/docs/capability-manifests.md +47 -0
  72. package/docs/control-plane.md +59 -0
  73. package/docs/eval-runner.md +80 -0
  74. package/docs/evals.md +34 -0
  75. package/docs/getting-started.md +51 -0
  76. package/docs/host-responsibilities.md +23 -0
  77. package/docs/interoperability.md +32 -0
  78. package/docs/migration-0.1-to-1.0.md +22 -0
  79. package/docs/openai-responses.md +103 -0
  80. package/docs/release.md +75 -0
  81. package/docs/spec.md +194 -0
  82. package/examples/eval-results/public.results.passing.json +128 -0
  83. package/examples/scheduling/capabilities/scheduling.availability.get.yaml +91 -0
  84. package/examples/scheduling/capabilities/scheduling.invite.prepare.yaml +114 -0
  85. package/examples/scheduling/capabilities/scheduling.invite.send.yaml +97 -0
  86. package/examples/scheduling/decisions/scheduling.availability.get.select.json +14 -0
  87. package/examples/scheduling/decisions/scheduling.invite.prepare.allowed.json +20 -0
  88. package/examples/scheduling/decisions/scheduling.invite.send.allowed.json +22 -0
  89. package/examples/scheduling/decisions/scheduling.invite.send.denied_missing_approval.json +18 -0
  90. package/examples/scheduling/entities/AvailabilitySlot.yaml +26 -0
  91. package/examples/scheduling/entities/MeetingInvite.yaml +25 -0
  92. package/examples/scheduling/eval-results/scheduling.results.passing.json +59 -0
  93. package/examples/scheduling/evals/scheduling.availability.get.valid.yaml +38 -0
  94. package/examples/scheduling/evals/scheduling.invite.prepare.valid.yaml +44 -0
  95. package/examples/scheduling/evals/scheduling.invite.send.requires_approval.yaml +43 -0
  96. package/examples/scheduling/openai/context.scheduler.json +6 -0
  97. package/examples/support/capabilities/support.refund.commit_case.yaml +98 -0
  98. package/examples/support/capabilities/support.refund.prepare_case.yaml +116 -0
  99. package/examples/support/capabilities/support.ticket.get.yaml +85 -0
  100. package/examples/support/decisions/support.refund.commit_case.allowed.json +22 -0
  101. package/examples/support/decisions/support.refund.commit_case.denied_missing_approval.json +18 -0
  102. package/examples/support/decisions/support.refund.prepare_case.approval_required.json +19 -0
  103. package/examples/support/decisions/support.ticket.get.select.json +0 -0
  104. package/examples/support/entities/Order.yaml +23 -0
  105. package/examples/support/entities/Ticket.yaml +25 -0
  106. package/examples/support/eval-results/support.results.passing.json +68 -0
  107. package/examples/support/evals/support.refund.commit_case.requires_approval.yaml +42 -0
  108. package/examples/support/evals/support.refund.prepare_case.approval_required.yaml +45 -0
  109. package/examples/support/evals/support.refund.prepare_case.valid.yaml +43 -0
  110. package/examples/support/openai/context.support_agent.json +9 -0
  111. package/package.json +74 -0
  112. package/schemas/capability-manifest.schema.json +250 -0
  113. package/schemas/entity-manifest.schema.json +97 -0
  114. package/schemas/eval-case.schema.json +134 -0
  115. package/schemas/eval-result.schema.json +77 -0
@@ -0,0 +1,400 @@
1
+ import type { ErrorObject } from "ajv";
2
+ import type { CapabilityManifest, EntityManifest, EvalCandidateResult, EvalCase, EvalResultFixture } from "./generated/manifest-types.js";
3
+ export type { CapabilityManifest, EntityManifest, EvalCandidateResult, EvalCase, EvalResultFixture } from "./generated/manifest-types.js";
4
+ export type ManifestKind = "capability" | "entity" | "eval";
5
+ export type AicfErrorCode = "duplicate_id" | "invalid_context" | "invalid_eval_result" | "invalid_tool_call" | "missing_candidate" | "missing_reference" | "parse" | "schema" | "tool_name_collision" | "unknown_scorer" | "unsupported";
6
+ export type AicfWarningCode = "capability_excluded" | "schema_normalization" | "unknown_allowed_action" | "unknown_capability_under_test";
7
+ export interface AicfDiagnostic {
8
+ code: AicfErrorCode | AicfWarningCode;
9
+ path: string;
10
+ kind?: ManifestKind;
11
+ id?: string;
12
+ message: string;
13
+ details?: unknown;
14
+ }
15
+ export interface AicfSchemaDiagnostic extends AicfDiagnostic {
16
+ code: "schema";
17
+ details: ErrorObject;
18
+ }
19
+ export interface LoadedManifestBase<TManifest, TKind extends ManifestKind> {
20
+ absolutePath: string;
21
+ kind: TKind;
22
+ manifest: TManifest;
23
+ path: string;
24
+ }
25
+ export type LoadedCapabilityManifest = LoadedManifestBase<CapabilityManifest, "capability">;
26
+ export type LoadedEntityManifest = LoadedManifestBase<EntityManifest, "entity">;
27
+ export type LoadedEvalCase = LoadedManifestBase<EvalCase, "eval">;
28
+ export type LoadedManifest = LoadedCapabilityManifest | LoadedEntityManifest | LoadedEvalCase;
29
+ export interface LoadManifestsOptions {
30
+ path?: string;
31
+ root?: string;
32
+ }
33
+ export interface LoadManifestsResult {
34
+ basePath: string;
35
+ errors: AicfDiagnostic[];
36
+ manifests: LoadedManifest[];
37
+ root: string;
38
+ }
39
+ export interface ValidationResult {
40
+ errors: AicfDiagnostic[];
41
+ valid: boolean;
42
+ }
43
+ export interface ValidateManifestsOptions {
44
+ reserved?: never;
45
+ }
46
+ export interface ManifestRegistry {
47
+ capabilities: LoadedCapabilityManifest[];
48
+ capabilityById: Map<string, LoadedCapabilityManifest>;
49
+ entities: LoadedEntityManifest[];
50
+ entityById: Map<string, LoadedEntityManifest>;
51
+ evalById: Map<string, LoadedEvalCase>;
52
+ evals: LoadedEvalCase[];
53
+ warnings: AicfDiagnostic[];
54
+ }
55
+ export interface RegistryInspection {
56
+ capabilitiesByRisk: Record<string, string[]>;
57
+ capabilitiesByType: Record<string, string[]>;
58
+ counts: {
59
+ capabilities: number;
60
+ entities: number;
61
+ evals: number;
62
+ manifests: number;
63
+ };
64
+ entities: string[];
65
+ evalCoverage: Array<{
66
+ capabilityId: string;
67
+ golden: number;
68
+ redTeam: number;
69
+ }>;
70
+ warnings: AicfDiagnostic[];
71
+ }
72
+ export type AutonomyTier = "A0" | "A1" | "A2" | "A3" | "A4" | "A5";
73
+ export type DecisionOperation = "select" | "prepare" | "commit";
74
+ export type DecisionStatus = "allowed" | "approval_required" | "denied";
75
+ export type DecisionReasonCode = "approval_required" | "autonomy_exceeded" | "capability_not_found" | "deny_rule_matched" | "idempotency_required" | "lifecycle_not_supported" | "missing_fact" | "missing_permission";
76
+ export interface DecisionReason {
77
+ code: DecisionReasonCode;
78
+ message: string;
79
+ rule?: string;
80
+ }
81
+ export type DecisionFact = boolean | {
82
+ reason?: string;
83
+ value: boolean;
84
+ };
85
+ export interface DecisionRequest {
86
+ args?: Record<string, unknown>;
87
+ approval?: {
88
+ approvalId?: string;
89
+ approved: boolean;
90
+ };
91
+ capabilityId: string;
92
+ context: {
93
+ autonomyTier: AutonomyTier;
94
+ permissions: string[];
95
+ tenantId?: string;
96
+ userId?: string;
97
+ };
98
+ facts?: Record<string, DecisionFact>;
99
+ idempotencyKey?: string;
100
+ operation: DecisionOperation;
101
+ }
102
+ export interface DecisionAuditPreview {
103
+ capabilityId: string;
104
+ idempotencyKey?: string;
105
+ operation: DecisionOperation;
106
+ reasons: DecisionReason[];
107
+ status: DecisionStatus;
108
+ }
109
+ export interface DecisionResult {
110
+ audit: DecisionAuditPreview;
111
+ capabilityId: string;
112
+ diagnostics: AicfDiagnostic[];
113
+ lifecycle: LifecycleEvaluation;
114
+ operation: DecisionOperation;
115
+ policy: PolicyEvaluation;
116
+ reasons: DecisionReason[];
117
+ requiredApprovals: DecisionReason[];
118
+ status: DecisionStatus;
119
+ }
120
+ export interface PolicyEvaluation {
121
+ reasons: DecisionReason[];
122
+ requiredApprovals: DecisionReason[];
123
+ status: DecisionStatus;
124
+ }
125
+ export interface LifecycleEvaluation {
126
+ reasons: DecisionReason[];
127
+ status: DecisionStatus;
128
+ }
129
+ export type JsonValue = boolean | null | number | string | JsonValue[] | {
130
+ [key: string]: JsonValue;
131
+ };
132
+ export type JsonObject = {
133
+ [key: string]: JsonValue;
134
+ };
135
+ export interface OpenAIResponsesFunctionTool {
136
+ description: string;
137
+ name: string;
138
+ parameters: JsonObject;
139
+ strict: true;
140
+ type: "function";
141
+ }
142
+ export interface AdapterToolBinding {
143
+ autonomyTier: CapabilityManifest["autonomy_tier"];
144
+ capabilityId: string;
145
+ capabilityType: CapabilityManifest["capability_type"];
146
+ inputSchema: JsonObject;
147
+ normalizedInputSchema: JsonObject;
148
+ path: string;
149
+ restricted: boolean;
150
+ riskTier: CapabilityManifest["risk_tier"];
151
+ toolName: string;
152
+ }
153
+ export interface AdapterExcludedCapability {
154
+ capabilityId: string;
155
+ diagnostics: AicfDiagnostic[];
156
+ path: string;
157
+ reason: "decision_denied" | "restricted" | "tool_name_collision" | "unsupported_schema";
158
+ }
159
+ export type OpenAIResponsesToolBinding = AdapterToolBinding;
160
+ export type OpenAIResponsesExcludedCapability = AdapterExcludedCapability;
161
+ export interface OpenAIResponsesToolset {
162
+ bindings: OpenAIResponsesToolBinding[];
163
+ diagnostics: AicfDiagnostic[];
164
+ excluded: OpenAIResponsesExcludedCapability[];
165
+ tools: OpenAIResponsesFunctionTool[];
166
+ }
167
+ export interface BuildOpenAIResponsesToolsOptions {
168
+ context: DecisionRequest["context"];
169
+ includeRestricted?: boolean;
170
+ namePrefix?: string;
171
+ }
172
+ export interface BuildAdapterToolsOptions {
173
+ context: DecisionRequest["context"];
174
+ includeRestricted?: boolean;
175
+ namePrefix?: string;
176
+ }
177
+ export interface OpenAIResponsesToolNameOptions {
178
+ namePrefix?: string;
179
+ }
180
+ export interface OpenAIResponsesFunctionCall {
181
+ arguments: string;
182
+ call_id?: string;
183
+ id?: string;
184
+ name: string;
185
+ type: "function_call";
186
+ }
187
+ export interface ParsedOpenAIResponsesToolCall {
188
+ args: Record<string, unknown>;
189
+ callId?: string;
190
+ capabilityId: string;
191
+ id?: string;
192
+ toolName: string;
193
+ }
194
+ export type ParsedAdapterToolCall = ParsedOpenAIResponsesToolCall;
195
+ export interface ParseOpenAIResponsesToolCallResult {
196
+ diagnostics: AicfDiagnostic[];
197
+ parsed?: ParsedOpenAIResponsesToolCall;
198
+ valid: boolean;
199
+ }
200
+ export type ParseAdapterToolCallResult = ParseOpenAIResponsesToolCallResult;
201
+ export interface AnthropicClaudeTool {
202
+ description: string;
203
+ input_schema: JsonObject;
204
+ name: string;
205
+ strict: true;
206
+ }
207
+ export interface AnthropicClaudeToolUse {
208
+ id?: string;
209
+ input: Record<string, unknown>;
210
+ name: string;
211
+ type?: "tool_use";
212
+ }
213
+ export interface AnthropicClaudeToolset {
214
+ bindings: AdapterToolBinding[];
215
+ diagnostics: AicfDiagnostic[];
216
+ excluded: AdapterExcludedCapability[];
217
+ tools: AnthropicClaudeTool[];
218
+ }
219
+ export type BuildAnthropicClaudeToolsOptions = BuildAdapterToolsOptions;
220
+ export interface AnthropicClaudeToolNameOptions {
221
+ namePrefix?: string;
222
+ }
223
+ export type ParsedAnthropicClaudeToolUse = ParsedAdapterToolCall;
224
+ export type ParseAnthropicClaudeToolUseResult = ParseAdapterToolCallResult;
225
+ export interface GeminiFunctionDeclaration {
226
+ description: string;
227
+ name: string;
228
+ parameters: JsonObject;
229
+ }
230
+ export interface GeminiFunctionCall {
231
+ args?: Record<string, unknown>;
232
+ id?: string;
233
+ name: string;
234
+ }
235
+ export interface GeminiFunctionDeclarationSet {
236
+ bindings: AdapterToolBinding[];
237
+ diagnostics: AicfDiagnostic[];
238
+ excluded: AdapterExcludedCapability[];
239
+ functionDeclarations: GeminiFunctionDeclaration[];
240
+ }
241
+ export type BuildGeminiFunctionDeclarationsOptions = BuildAdapterToolsOptions;
242
+ export interface GeminiFunctionNameOptions {
243
+ namePrefix?: string;
244
+ }
245
+ export type ParsedGeminiFunctionCall = ParsedAdapterToolCall;
246
+ export type ParseGeminiFunctionCallResult = ParseAdapterToolCallResult;
247
+ export interface AiSdkTool {
248
+ description: string;
249
+ inputSchema: JsonObject;
250
+ strict: true;
251
+ }
252
+ export interface AiSdkToolCall {
253
+ args?: Record<string, unknown>;
254
+ input?: Record<string, unknown>;
255
+ toolCallId?: string;
256
+ toolName: string;
257
+ }
258
+ export interface AiSdkToolset {
259
+ bindings: AdapterToolBinding[];
260
+ diagnostics: AicfDiagnostic[];
261
+ excluded: AdapterExcludedCapability[];
262
+ tools: Record<string, AiSdkTool>;
263
+ }
264
+ export type BuildAiSdkToolsOptions = BuildAdapterToolsOptions;
265
+ export interface AiSdkToolNameOptions {
266
+ namePrefix?: string;
267
+ }
268
+ export type ParsedAiSdkToolCall = ParsedAdapterToolCall;
269
+ export type ParseAiSdkToolCallResult = ParseAdapterToolCallResult;
270
+ export interface McpToolDescriptor {
271
+ annotations?: {
272
+ destructiveHint?: boolean;
273
+ idempotentHint?: boolean;
274
+ openWorldHint?: boolean;
275
+ readOnlyHint?: boolean;
276
+ };
277
+ description: string;
278
+ inputSchema: JsonObject;
279
+ name: string;
280
+ outputSchema?: JsonObject;
281
+ title: string;
282
+ }
283
+ export interface McpToolCall {
284
+ method?: "tools/call";
285
+ params: {
286
+ arguments?: Record<string, unknown>;
287
+ name: string;
288
+ };
289
+ }
290
+ export interface McpToolDescriptorSet {
291
+ bindings: AdapterToolBinding[];
292
+ diagnostics: AicfDiagnostic[];
293
+ excluded: AdapterExcludedCapability[];
294
+ tools: McpToolDescriptor[];
295
+ }
296
+ export type BuildMcpToolDescriptorsOptions = BuildAdapterToolsOptions;
297
+ export interface McpToolNameOptions {
298
+ namePrefix?: string;
299
+ }
300
+ export type ParsedMcpToolCall = ParsedAdapterToolCall;
301
+ export type ParseMcpToolCallResult = ParseAdapterToolCallResult;
302
+ export interface LangChainToolDescriptor {
303
+ description: string;
304
+ metadata: {
305
+ autonomyTier: CapabilityManifest["autonomy_tier"];
306
+ capabilityId: string;
307
+ capabilityType: CapabilityManifest["capability_type"];
308
+ restricted: boolean;
309
+ riskTier: CapabilityManifest["risk_tier"];
310
+ };
311
+ name: string;
312
+ schema: JsonObject;
313
+ }
314
+ export interface LangChainToolCall {
315
+ args?: Record<string, unknown>;
316
+ id?: string;
317
+ name: string;
318
+ }
319
+ export interface LangChainToolDescriptorSet {
320
+ bindings: AdapterToolBinding[];
321
+ diagnostics: AicfDiagnostic[];
322
+ excluded: AdapterExcludedCapability[];
323
+ tools: LangChainToolDescriptor[];
324
+ }
325
+ export type BuildLangChainToolDescriptorsOptions = BuildAdapterToolsOptions;
326
+ export interface LangChainToolNameOptions {
327
+ namePrefix?: string;
328
+ }
329
+ export type ParsedLangChainToolCall = ParsedAdapterToolCall;
330
+ export type ParseLangChainToolCallResult = ParseAdapterToolCallResult;
331
+ export interface SemanticKernelFunction {
332
+ description: string;
333
+ metadata: {
334
+ autonomyTier: CapabilityManifest["autonomy_tier"];
335
+ capabilityId: string;
336
+ capabilityType: CapabilityManifest["capability_type"];
337
+ restricted: boolean;
338
+ riskTier: CapabilityManifest["risk_tier"];
339
+ };
340
+ name: string;
341
+ parameters: JsonObject;
342
+ pluginName: string;
343
+ }
344
+ export interface SemanticKernelFunctionCall {
345
+ arguments?: Record<string, unknown>;
346
+ functionName?: string;
347
+ id?: string;
348
+ name?: string;
349
+ }
350
+ export interface SemanticKernelFunctionSet {
351
+ bindings: AdapterToolBinding[];
352
+ diagnostics: AicfDiagnostic[];
353
+ excluded: AdapterExcludedCapability[];
354
+ functions: SemanticKernelFunction[];
355
+ }
356
+ export type BuildSemanticKernelFunctionsOptions = BuildAdapterToolsOptions;
357
+ export interface SemanticKernelFunctionNameOptions {
358
+ namePrefix?: string;
359
+ }
360
+ export type ParsedSemanticKernelFunctionCall = ParsedAdapterToolCall;
361
+ export type ParseSemanticKernelFunctionCallResult = ParseAdapterToolCallResult;
362
+ export type EvalRunStatus = "passed" | "failed";
363
+ export interface LoadEvalResultsResult {
364
+ absolutePath: string;
365
+ errors: AicfDiagnostic[];
366
+ fixture?: EvalResultFixture;
367
+ path: string;
368
+ results: EvalCandidateResult[];
369
+ }
370
+ export interface EvalScorerResult {
371
+ actual?: unknown;
372
+ diagnostics: AicfDiagnostic[];
373
+ expected?: unknown;
374
+ message: string;
375
+ passed: boolean;
376
+ scorer: string;
377
+ }
378
+ export interface EvalCaseResult {
379
+ candidate?: EvalCandidateResult;
380
+ diagnostics: AicfDiagnostic[];
381
+ evalId: string;
382
+ passed: boolean;
383
+ scorers: EvalScorerResult[];
384
+ status: EvalRunStatus;
385
+ }
386
+ export interface EvalSuiteResult {
387
+ diagnostics: AicfDiagnostic[];
388
+ evals: EvalCaseResult[];
389
+ passed: boolean;
390
+ status: EvalRunStatus;
391
+ summary: {
392
+ failed: number;
393
+ passed: number;
394
+ total: number;
395
+ };
396
+ }
397
+ export interface RunEvalSuiteOptions {
398
+ evalIds?: string[];
399
+ }
400
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { LoadedManifest, ValidateManifestsOptions, ValidationResult } from "./types.js";
2
+ export declare function validateManifests(manifests: LoadedManifest[], _options?: ValidateManifestsOptions): ValidationResult;
3
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,cAAc,EAEd,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAWpB,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,cAAc,EAAE,EAC3B,QAAQ,GAAE,wBAA6B,GACtC,gBAAgB,CAWlB"}
@@ -0,0 +1,105 @@
1
+ import { readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import Ajv2020 from "ajv/dist/2020.js";
5
+ const schemaDirectory = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../schemas");
6
+ const ajv = new Ajv2020({ allErrors: true, strict: false });
7
+ const validators = {
8
+ capability: compileSchema("capability-manifest.schema.json"),
9
+ entity: compileSchema("entity-manifest.schema.json"),
10
+ eval: compileSchema("eval-case.schema.json")
11
+ };
12
+ export function validateManifests(manifests, _options = {}) {
13
+ const errors = [
14
+ ...validateSchemas(manifests),
15
+ ...validateDuplicateIds(manifests),
16
+ ...validateEvalReferences(manifests)
17
+ ];
18
+ return {
19
+ errors,
20
+ valid: errors.length === 0
21
+ };
22
+ }
23
+ function compileSchema(fileName) {
24
+ const schemaPath = path.join(schemaDirectory, fileName);
25
+ return ajv.compile(JSON.parse(readFileSync(schemaPath, "utf8")));
26
+ }
27
+ function validateSchemas(manifests) {
28
+ const errors = [];
29
+ for (const loaded of manifests) {
30
+ const validate = validators[loaded.kind];
31
+ const valid = validate(loaded.manifest);
32
+ if (valid) {
33
+ continue;
34
+ }
35
+ for (const error of validate.errors ?? []) {
36
+ const location = error.instancePath || "/";
37
+ errors.push({
38
+ code: "schema",
39
+ details: error,
40
+ id: idFromManifest(loaded.manifest),
41
+ kind: loaded.kind,
42
+ message: `${location}: ${error.message ?? "schema validation failed"}`,
43
+ path: loaded.path
44
+ });
45
+ }
46
+ }
47
+ return errors;
48
+ }
49
+ function validateDuplicateIds(manifests) {
50
+ const errors = [];
51
+ const seen = new Map();
52
+ for (const loaded of manifests) {
53
+ const id = idFromManifest(loaded.manifest);
54
+ if (!id) {
55
+ continue;
56
+ }
57
+ const key = `${loaded.kind}:${id}`;
58
+ const existing = seen.get(key);
59
+ if (existing) {
60
+ errors.push({
61
+ code: "duplicate_id",
62
+ id,
63
+ kind: loaded.kind,
64
+ message: `Duplicate ${loaded.kind} id "${id}" also appears in ${existing.path}.`,
65
+ path: loaded.path
66
+ });
67
+ continue;
68
+ }
69
+ seen.set(key, loaded);
70
+ }
71
+ return errors;
72
+ }
73
+ function validateEvalReferences(manifests) {
74
+ const errors = [];
75
+ const loadedPaths = new Set(manifests.map((manifest) => path.normalize(manifest.absolutePath)));
76
+ for (const loaded of manifests) {
77
+ if (loaded.kind !== "capability") {
78
+ continue;
79
+ }
80
+ const evalRefs = [
81
+ ...(loaded.manifest.evals?.golden ?? []),
82
+ ...(loaded.manifest.evals?.red_team ?? [])
83
+ ];
84
+ for (const evalRef of evalRefs) {
85
+ const resolved = path.normalize(path.resolve(path.dirname(loaded.absolutePath), evalRef));
86
+ if (!loadedPaths.has(resolved)) {
87
+ errors.push({
88
+ code: "missing_reference",
89
+ id: loaded.manifest.id,
90
+ kind: "capability",
91
+ message: `Missing eval reference "${evalRef}".`,
92
+ path: loaded.path
93
+ });
94
+ }
95
+ }
96
+ }
97
+ return errors;
98
+ }
99
+ function idFromManifest(manifest) {
100
+ if (typeof manifest !== "object" || manifest === null || !("id" in manifest)) {
101
+ return undefined;
102
+ }
103
+ const value = manifest.id;
104
+ return typeof value === "string" ? value : undefined;
105
+ }