@ai-agent-forge/plugin-sdk 0.85.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.
Files changed (58) hide show
  1. package/README.md +27 -0
  2. package/dist/artifact.d.ts +20 -0
  3. package/dist/artifact.d.ts.map +1 -0
  4. package/dist/artifact.js +63 -0
  5. package/dist/artifact.js.map +1 -0
  6. package/dist/capability-manifest.d.ts +11 -0
  7. package/dist/capability-manifest.d.ts.map +1 -0
  8. package/dist/capability-manifest.js +188 -0
  9. package/dist/capability-manifest.js.map +1 -0
  10. package/dist/common.d.ts +24 -0
  11. package/dist/common.d.ts.map +1 -0
  12. package/dist/common.js +115 -0
  13. package/dist/common.js.map +1 -0
  14. package/dist/context-budget.d.ts +33 -0
  15. package/dist/context-budget.d.ts.map +1 -0
  16. package/dist/context-budget.js +124 -0
  17. package/dist/context-budget.js.map +1 -0
  18. package/dist/diff.d.ts +38 -0
  19. package/dist/diff.d.ts.map +1 -0
  20. package/dist/diff.js +164 -0
  21. package/dist/diff.js.map +1 -0
  22. package/dist/durable.d.ts +108 -0
  23. package/dist/durable.d.ts.map +1 -0
  24. package/dist/durable.js +15 -0
  25. package/dist/durable.js.map +1 -0
  26. package/dist/ecosystem-manifest.d.ts +56 -0
  27. package/dist/ecosystem-manifest.d.ts.map +1 -0
  28. package/dist/ecosystem-manifest.js +11 -0
  29. package/dist/ecosystem-manifest.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +13 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/memory.d.ts +370 -0
  35. package/dist/memory.d.ts.map +1 -0
  36. package/dist/memory.js +26 -0
  37. package/dist/memory.js.map +1 -0
  38. package/dist/observability.d.ts +354 -0
  39. package/dist/observability.d.ts.map +1 -0
  40. package/dist/observability.js +33 -0
  41. package/dist/observability.js.map +1 -0
  42. package/dist/operation.d.ts +60 -0
  43. package/dist/operation.d.ts.map +1 -0
  44. package/dist/operation.js +202 -0
  45. package/dist/operation.js.map +1 -0
  46. package/dist/public-api.d.ts +1977 -0
  47. package/dist/public-api.d.ts.map +1 -0
  48. package/dist/public-api.js +237 -0
  49. package/dist/public-api.js.map +1 -0
  50. package/dist/render.d.ts +38 -0
  51. package/dist/render.d.ts.map +1 -0
  52. package/dist/render.js +112 -0
  53. package/dist/render.js.map +1 -0
  54. package/dist/session-lineage.d.ts +36 -0
  55. package/dist/session-lineage.d.ts.map +1 -0
  56. package/dist/session-lineage.js +134 -0
  57. package/dist/session-lineage.js.map +1 -0
  58. package/package.json +55 -0
@@ -0,0 +1,202 @@
1
+ import { validateArtifactRefV1 } from "./artifact.js";
2
+ import { assertExactKeys, assertJsonValue, assertNonEmptyString, assertOptionalString, assertPlainRecord, detachedFreeze, sortByKey, } from "./common.js";
3
+ export const PLUGIN_OPERATION_TERMINAL_STATUSES_V1 = [
4
+ "succeeded",
5
+ "failed",
6
+ "cancelled",
7
+ "needs_user",
8
+ "unsupported",
9
+ ];
10
+ const EVIDENCE_KINDS_V1 = [
11
+ "screenshot",
12
+ "dom",
13
+ "render",
14
+ "diff",
15
+ "log",
16
+ "assertion",
17
+ "trace",
18
+ "network",
19
+ "structure",
20
+ ];
21
+ const OPERATION_STATUSES_V1 = [
22
+ "queued",
23
+ "running",
24
+ "succeeded",
25
+ "failed",
26
+ "cancelled",
27
+ "needs_user",
28
+ "unsupported",
29
+ ];
30
+ const RESULT_STATUSES_V1 = [
31
+ "succeeded",
32
+ "failed",
33
+ "cancelled",
34
+ "needs_user",
35
+ "unsupported",
36
+ ];
37
+ function validateStatus(value, label, values) {
38
+ if (typeof value !== "string" || !values.includes(value))
39
+ throw new Error(`${label} is invalid`);
40
+ return value;
41
+ }
42
+ function validateIsoLike(value, label) {
43
+ if (value === undefined)
44
+ return undefined;
45
+ assertNonEmptyString(value, label);
46
+ return value;
47
+ }
48
+ function validateArtifactArray(value, label) {
49
+ if (!Array.isArray(value))
50
+ throw new Error(`${label} must be an array`);
51
+ const result = value.map((item, index) => validateArtifactRefV1(item, `${label}[${index}]`));
52
+ if (new Set(result.map((item) => item.artifactRef)).size !== result.length) {
53
+ throw new Error(`${label} must not contain duplicate artifactRef values`);
54
+ }
55
+ return Object.freeze(sortByKey(result, (item) => item.artifactRef));
56
+ }
57
+ export function validatePluginOperationV1(value, label = "Plugin operation") {
58
+ assertPlainRecord(value, label);
59
+ assertExactKeys(value, ["version", "operationId", "pluginId", "kind", "status"], ["inputArtifacts", "outputArtifacts", "startedAt", "endedAt"], label);
60
+ if (value.version !== 1)
61
+ throw new Error(`${label}.version must be 1`);
62
+ assertNonEmptyString(value.operationId, `${label}.operationId`);
63
+ assertNonEmptyString(value.pluginId, `${label}.pluginId`);
64
+ assertNonEmptyString(value.kind, `${label}.kind`);
65
+ const status = validateStatus(value.status, `${label}.status`, OPERATION_STATUSES_V1);
66
+ const inputArtifacts = value.inputArtifacts === undefined
67
+ ? undefined
68
+ : validateArtifactArray(value.inputArtifacts, `${label}.inputArtifacts`);
69
+ const outputArtifacts = value.outputArtifacts === undefined
70
+ ? undefined
71
+ : validateArtifactArray(value.outputArtifacts, `${label}.outputArtifacts`);
72
+ const startedAt = validateIsoLike(value.startedAt, `${label}.startedAt`);
73
+ const endedAt = validateIsoLike(value.endedAt, `${label}.endedAt`);
74
+ if (endedAt !== undefined && startedAt === undefined)
75
+ throw new Error(`${label}.endedAt requires startedAt`);
76
+ if (status === "running" && endedAt !== undefined)
77
+ throw new Error(`${label}.running must not have endedAt`);
78
+ return detachedFreeze({
79
+ version: 1,
80
+ operationId: value.operationId,
81
+ pluginId: value.pluginId,
82
+ kind: value.kind,
83
+ status,
84
+ ...(inputArtifacts === undefined ? {} : { inputArtifacts }),
85
+ ...(outputArtifacts === undefined ? {} : { outputArtifacts }),
86
+ ...(startedAt === undefined ? {} : { startedAt }),
87
+ ...(endedAt === undefined ? {} : { endedAt }),
88
+ });
89
+ }
90
+ export function buildPluginOperationV1(input) {
91
+ return validatePluginOperationV1(input);
92
+ }
93
+ export function validateEvidenceRefV1(value, label = "Evidence reference") {
94
+ assertPlainRecord(value, label);
95
+ assertExactKeys(value, ["version", "evidenceId", "kind", "operationId"], ["artifactRef", "summary", "observedAt"], label);
96
+ if (value.version !== 1)
97
+ throw new Error(`${label}.version must be 1`);
98
+ assertNonEmptyString(value.evidenceId, `${label}.evidenceId`);
99
+ const kind = validateStatus(value.kind, `${label}.kind`, EVIDENCE_KINDS_V1);
100
+ assertNonEmptyString(value.operationId, `${label}.operationId`);
101
+ const artifactRef = value.artifactRef === undefined ? undefined : validateArtifactRefV1(value.artifactRef, `${label}.artifactRef`);
102
+ assertOptionalString(value.summary, `${label}.summary`);
103
+ const observedAt = validateIsoLike(value.observedAt, `${label}.observedAt`);
104
+ return detachedFreeze({
105
+ version: 1,
106
+ evidenceId: value.evidenceId,
107
+ kind,
108
+ operationId: value.operationId,
109
+ ...(artifactRef === undefined ? {} : { artifactRef }),
110
+ ...(value.summary === undefined ? {} : { summary: value.summary }),
111
+ ...(observedAt === undefined ? {} : { observedAt }),
112
+ });
113
+ }
114
+ export function buildEvidenceRefV1(input) {
115
+ return validateEvidenceRefV1(input);
116
+ }
117
+ export function validateVerificationV1(value, label = "Verification") {
118
+ assertPlainRecord(value, label);
119
+ assertExactKeys(value, ["version", "status", "checks"], [], label);
120
+ if (value.version !== 1)
121
+ throw new Error(`${label}.version must be 1`);
122
+ const status = validateStatus(value.status, `${label}.status`, [
123
+ "passed",
124
+ "failed",
125
+ "unknown",
126
+ ]);
127
+ if (!Array.isArray(value.checks) || value.checks.some((item) => typeof item !== "string" || item.trim() === "")) {
128
+ throw new Error(`${label}.checks must contain non-empty strings`);
129
+ }
130
+ if (new Set(value.checks).size !== value.checks.length)
131
+ throw new Error(`${label}.checks must not contain duplicates`);
132
+ return detachedFreeze({ version: 1, status, checks: [...value.checks].sort() });
133
+ }
134
+ export function buildVerificationV1(input) {
135
+ return validateVerificationV1(input);
136
+ }
137
+ export function validatePluginErrorV1(value, label = "Plugin error") {
138
+ assertPlainRecord(value, label);
139
+ assertExactKeys(value, ["version", "code", "message"], ["causeCode", "diagnosticRef"], label);
140
+ if (value.version !== 1)
141
+ throw new Error(`${label}.version must be 1`);
142
+ assertNonEmptyString(value.code, `${label}.code`);
143
+ assertNonEmptyString(value.message, `${label}.message`);
144
+ assertOptionalString(value.causeCode, `${label}.causeCode`);
145
+ const diagnosticRef = value.diagnosticRef === undefined
146
+ ? undefined
147
+ : validateArtifactRefV1(value.diagnosticRef, `${label}.diagnosticRef`);
148
+ return detachedFreeze({
149
+ version: 1,
150
+ code: value.code,
151
+ message: value.message,
152
+ ...(value.causeCode === undefined ? {} : { causeCode: value.causeCode }),
153
+ ...(diagnosticRef === undefined ? {} : { diagnosticRef }),
154
+ });
155
+ }
156
+ export function buildPluginErrorV1(input) {
157
+ return validatePluginErrorV1(input);
158
+ }
159
+ export function validatePluginResultV1(value, label = "Plugin result") {
160
+ assertPlainRecord(value, label);
161
+ assertExactKeys(value, ["version", "operationId", "status", "summary", "artifacts", "evidence"], ["verification", "error"], label);
162
+ if (value.version !== 1)
163
+ throw new Error(`${label}.version must be 1`);
164
+ assertNonEmptyString(value.operationId, `${label}.operationId`);
165
+ const status = validateStatus(value.status, `${label}.status`, RESULT_STATUSES_V1);
166
+ assertNonEmptyString(value.summary, `${label}.summary`);
167
+ const artifacts = validateArtifactArray(value.artifacts, `${label}.artifacts`);
168
+ if (!Array.isArray(value.evidence))
169
+ throw new Error(`${label}.evidence must be an array`);
170
+ const evidence = value.evidence.map((item, index) => validateEvidenceRefV1(item, `${label}.evidence[${index}]`));
171
+ if (new Set(evidence.map((item) => item.evidenceId)).size !== evidence.length)
172
+ throw new Error(`${label}.evidence must not contain duplicate evidenceId values`);
173
+ const orderedEvidence = Object.freeze(sortByKey(evidence, (item) => item.evidenceId));
174
+ const verification = value.verification === undefined
175
+ ? undefined
176
+ : validateVerificationV1(value.verification, `${label}.verification`);
177
+ const error = value.error === undefined ? undefined : validatePluginErrorV1(value.error, `${label}.error`);
178
+ if (status !== "succeeded" && error === undefined)
179
+ throw new Error(`${label}.error is required for status ${status}`);
180
+ if (status === "succeeded" && error !== undefined)
181
+ throw new Error(`${label}.succeeded must not include error`);
182
+ if (status === "succeeded" && verification?.status === "failed")
183
+ throw new Error(`${label}.succeeded cannot have failed verification`);
184
+ return detachedFreeze({
185
+ version: 1,
186
+ operationId: value.operationId,
187
+ status,
188
+ summary: value.summary,
189
+ artifacts,
190
+ evidence: orderedEvidence,
191
+ ...(verification === undefined ? {} : { verification }),
192
+ ...(error === undefined ? {} : { error }),
193
+ });
194
+ }
195
+ export function buildPluginResultV1(input) {
196
+ return validatePluginResultV1(input);
197
+ }
198
+ export function assertJsonResultInputV1(value, label = "Result input") {
199
+ assertJsonValue(value, label);
200
+ return detachedFreeze(value);
201
+ }
202
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ArtifactRefV1, validateArtifactRefV1 } from \"./artifact.ts\";\nimport {\n\tassertExactKeys,\n\tassertJsonValue,\n\tassertNonEmptyString,\n\tassertOptionalString,\n\tassertPlainRecord,\n\tdetachedFreeze,\n\ttype JsonValue,\n\tsortByKey,\n} from \"./common.ts\";\n\nexport type PluginOperationStatusV1 =\n\t| \"queued\"\n\t| \"running\"\n\t| \"succeeded\"\n\t| \"failed\"\n\t| \"cancelled\"\n\t| \"needs_user\"\n\t| \"unsupported\";\n\nexport const PLUGIN_OPERATION_TERMINAL_STATUSES_V1: readonly PluginOperationStatusV1[] = [\n\t\"succeeded\",\n\t\"failed\",\n\t\"cancelled\",\n\t\"needs_user\",\n\t\"unsupported\",\n];\n\nexport interface PluginOperationV1 {\n\treadonly version: 1;\n\treadonly operationId: string;\n\treadonly pluginId: string;\n\treadonly kind: string;\n\treadonly status: PluginOperationStatusV1;\n\treadonly inputArtifacts?: readonly ArtifactRefV1[];\n\treadonly outputArtifacts?: readonly ArtifactRefV1[];\n\treadonly startedAt?: string;\n\treadonly endedAt?: string;\n}\n\nexport type EvidenceKindV1 =\n\t| \"screenshot\"\n\t| \"dom\"\n\t| \"render\"\n\t| \"diff\"\n\t| \"log\"\n\t| \"assertion\"\n\t| \"trace\"\n\t| \"network\"\n\t| \"structure\";\n\nexport interface EvidenceRefV1 {\n\treadonly version: 1;\n\treadonly evidenceId: string;\n\treadonly kind: EvidenceKindV1;\n\treadonly operationId: string;\n\treadonly artifactRef?: ArtifactRefV1;\n\treadonly summary?: string;\n\treadonly observedAt?: string;\n}\n\nexport interface VerificationV1 {\n\treadonly version: 1;\n\treadonly status: \"passed\" | \"failed\" | \"unknown\";\n\treadonly checks: readonly string[];\n}\n\nexport interface PluginErrorV1 {\n\treadonly version: 1;\n\treadonly code: string;\n\treadonly message: string;\n\treadonly causeCode?: string;\n\treadonly diagnosticRef?: ArtifactRefV1;\n}\n\nexport type PluginResultStatusV1 = Exclude<PluginOperationStatusV1, \"queued\" | \"running\">;\n\nexport interface PluginResultV1 {\n\treadonly version: 1;\n\treadonly operationId: string;\n\treadonly status: PluginResultStatusV1;\n\treadonly summary: string;\n\treadonly artifacts: readonly ArtifactRefV1[];\n\treadonly evidence: readonly EvidenceRefV1[];\n\treadonly verification?: VerificationV1;\n\treadonly error?: PluginErrorV1;\n}\n\nconst EVIDENCE_KINDS_V1: readonly EvidenceKindV1[] = [\n\t\"screenshot\",\n\t\"dom\",\n\t\"render\",\n\t\"diff\",\n\t\"log\",\n\t\"assertion\",\n\t\"trace\",\n\t\"network\",\n\t\"structure\",\n];\nconst OPERATION_STATUSES_V1: readonly PluginOperationStatusV1[] = [\n\t\"queued\",\n\t\"running\",\n\t\"succeeded\",\n\t\"failed\",\n\t\"cancelled\",\n\t\"needs_user\",\n\t\"unsupported\",\n];\nconst RESULT_STATUSES_V1: readonly PluginResultStatusV1[] = [\n\t\"succeeded\",\n\t\"failed\",\n\t\"cancelled\",\n\t\"needs_user\",\n\t\"unsupported\",\n];\n\nfunction validateStatus(value: unknown, label: string, values: readonly string[]): string {\n\tif (typeof value !== \"string\" || !values.includes(value)) throw new Error(`${label} is invalid`);\n\treturn value;\n}\n\nfunction validateIsoLike(value: unknown, label: string): string | undefined {\n\tif (value === undefined) return undefined;\n\tassertNonEmptyString(value, label);\n\treturn value;\n}\n\nfunction validateArtifactArray(value: unknown, label: string): readonly ArtifactRefV1[] {\n\tif (!Array.isArray(value)) throw new Error(`${label} must be an array`);\n\tconst result = value.map((item, index) => validateArtifactRefV1(item, `${label}[${index}]`));\n\tif (new Set(result.map((item) => item.artifactRef)).size !== result.length) {\n\t\tthrow new Error(`${label} must not contain duplicate artifactRef values`);\n\t}\n\treturn Object.freeze(sortByKey(result, (item) => item.artifactRef));\n}\n\nexport function validatePluginOperationV1(value: unknown, label = \"Plugin operation\"): PluginOperationV1 {\n\tassertPlainRecord(value, label);\n\tassertExactKeys(\n\t\tvalue,\n\t\t[\"version\", \"operationId\", \"pluginId\", \"kind\", \"status\"],\n\t\t[\"inputArtifacts\", \"outputArtifacts\", \"startedAt\", \"endedAt\"],\n\t\tlabel,\n\t);\n\tif (value.version !== 1) throw new Error(`${label}.version must be 1`);\n\tassertNonEmptyString(value.operationId, `${label}.operationId`);\n\tassertNonEmptyString(value.pluginId, `${label}.pluginId`);\n\tassertNonEmptyString(value.kind, `${label}.kind`);\n\tconst status = validateStatus(value.status, `${label}.status`, OPERATION_STATUSES_V1) as PluginOperationStatusV1;\n\tconst inputArtifacts =\n\t\tvalue.inputArtifacts === undefined\n\t\t\t? undefined\n\t\t\t: validateArtifactArray(value.inputArtifacts, `${label}.inputArtifacts`);\n\tconst outputArtifacts =\n\t\tvalue.outputArtifacts === undefined\n\t\t\t? undefined\n\t\t\t: validateArtifactArray(value.outputArtifacts, `${label}.outputArtifacts`);\n\tconst startedAt = validateIsoLike(value.startedAt, `${label}.startedAt`);\n\tconst endedAt = validateIsoLike(value.endedAt, `${label}.endedAt`);\n\tif (endedAt !== undefined && startedAt === undefined) throw new Error(`${label}.endedAt requires startedAt`);\n\tif (status === \"running\" && endedAt !== undefined) throw new Error(`${label}.running must not have endedAt`);\n\treturn detachedFreeze({\n\t\tversion: 1,\n\t\toperationId: value.operationId,\n\t\tpluginId: value.pluginId,\n\t\tkind: value.kind,\n\t\tstatus,\n\t\t...(inputArtifacts === undefined ? {} : { inputArtifacts }),\n\t\t...(outputArtifacts === undefined ? {} : { outputArtifacts }),\n\t\t...(startedAt === undefined ? {} : { startedAt }),\n\t\t...(endedAt === undefined ? {} : { endedAt }),\n\t});\n}\n\nexport function buildPluginOperationV1(input: PluginOperationV1): PluginOperationV1 {\n\treturn validatePluginOperationV1(input);\n}\n\nexport function validateEvidenceRefV1(value: unknown, label = \"Evidence reference\"): EvidenceRefV1 {\n\tassertPlainRecord(value, label);\n\tassertExactKeys(\n\t\tvalue,\n\t\t[\"version\", \"evidenceId\", \"kind\", \"operationId\"],\n\t\t[\"artifactRef\", \"summary\", \"observedAt\"],\n\t\tlabel,\n\t);\n\tif (value.version !== 1) throw new Error(`${label}.version must be 1`);\n\tassertNonEmptyString(value.evidenceId, `${label}.evidenceId`);\n\tconst kind = validateStatus(value.kind, `${label}.kind`, EVIDENCE_KINDS_V1) as EvidenceKindV1;\n\tassertNonEmptyString(value.operationId, `${label}.operationId`);\n\tconst artifactRef =\n\t\tvalue.artifactRef === undefined ? undefined : validateArtifactRefV1(value.artifactRef, `${label}.artifactRef`);\n\tassertOptionalString(value.summary, `${label}.summary`);\n\tconst observedAt = validateIsoLike(value.observedAt, `${label}.observedAt`);\n\treturn detachedFreeze({\n\t\tversion: 1,\n\t\tevidenceId: value.evidenceId,\n\t\tkind,\n\t\toperationId: value.operationId,\n\t\t...(artifactRef === undefined ? {} : { artifactRef }),\n\t\t...(value.summary === undefined ? {} : { summary: value.summary }),\n\t\t...(observedAt === undefined ? {} : { observedAt }),\n\t});\n}\n\nexport function buildEvidenceRefV1(input: EvidenceRefV1): EvidenceRefV1 {\n\treturn validateEvidenceRefV1(input);\n}\n\nexport function validateVerificationV1(value: unknown, label = \"Verification\"): VerificationV1 {\n\tassertPlainRecord(value, label);\n\tassertExactKeys(value, [\"version\", \"status\", \"checks\"], [], label);\n\tif (value.version !== 1) throw new Error(`${label}.version must be 1`);\n\tconst status = validateStatus(value.status, `${label}.status`, [\n\t\t\"passed\",\n\t\t\"failed\",\n\t\t\"unknown\",\n\t]) as VerificationV1[\"status\"];\n\tif (!Array.isArray(value.checks) || value.checks.some((item) => typeof item !== \"string\" || item.trim() === \"\")) {\n\t\tthrow new Error(`${label}.checks must contain non-empty strings`);\n\t}\n\tif (new Set(value.checks).size !== value.checks.length)\n\t\tthrow new Error(`${label}.checks must not contain duplicates`);\n\treturn detachedFreeze({ version: 1, status, checks: [...value.checks].sort() });\n}\n\nexport function buildVerificationV1(input: VerificationV1): VerificationV1 {\n\treturn validateVerificationV1(input);\n}\n\nexport function validatePluginErrorV1(value: unknown, label = \"Plugin error\"): PluginErrorV1 {\n\tassertPlainRecord(value, label);\n\tassertExactKeys(value, [\"version\", \"code\", \"message\"], [\"causeCode\", \"diagnosticRef\"], label);\n\tif (value.version !== 1) throw new Error(`${label}.version must be 1`);\n\tassertNonEmptyString(value.code, `${label}.code`);\n\tassertNonEmptyString(value.message, `${label}.message`);\n\tassertOptionalString(value.causeCode, `${label}.causeCode`);\n\tconst diagnosticRef =\n\t\tvalue.diagnosticRef === undefined\n\t\t\t? undefined\n\t\t\t: validateArtifactRefV1(value.diagnosticRef, `${label}.diagnosticRef`);\n\treturn detachedFreeze({\n\t\tversion: 1,\n\t\tcode: value.code,\n\t\tmessage: value.message,\n\t\t...(value.causeCode === undefined ? {} : { causeCode: value.causeCode }),\n\t\t...(diagnosticRef === undefined ? {} : { diagnosticRef }),\n\t});\n}\n\nexport function buildPluginErrorV1(input: PluginErrorV1): PluginErrorV1 {\n\treturn validatePluginErrorV1(input);\n}\n\nexport function validatePluginResultV1(value: unknown, label = \"Plugin result\"): PluginResultV1 {\n\tassertPlainRecord(value, label);\n\tassertExactKeys(\n\t\tvalue,\n\t\t[\"version\", \"operationId\", \"status\", \"summary\", \"artifacts\", \"evidence\"],\n\t\t[\"verification\", \"error\"],\n\t\tlabel,\n\t);\n\tif (value.version !== 1) throw new Error(`${label}.version must be 1`);\n\tassertNonEmptyString(value.operationId, `${label}.operationId`);\n\tconst status = validateStatus(value.status, `${label}.status`, RESULT_STATUSES_V1) as PluginResultStatusV1;\n\tassertNonEmptyString(value.summary, `${label}.summary`);\n\tconst artifacts = validateArtifactArray(value.artifacts, `${label}.artifacts`);\n\tif (!Array.isArray(value.evidence)) throw new Error(`${label}.evidence must be an array`);\n\tconst evidence = value.evidence.map((item, index) => validateEvidenceRefV1(item, `${label}.evidence[${index}]`));\n\tif (new Set(evidence.map((item) => item.evidenceId)).size !== evidence.length)\n\t\tthrow new Error(`${label}.evidence must not contain duplicate evidenceId values`);\n\tconst orderedEvidence = Object.freeze(sortByKey(evidence, (item) => item.evidenceId));\n\tconst verification =\n\t\tvalue.verification === undefined\n\t\t\t? undefined\n\t\t\t: validateVerificationV1(value.verification, `${label}.verification`);\n\tconst error = value.error === undefined ? undefined : validatePluginErrorV1(value.error, `${label}.error`);\n\tif (status !== \"succeeded\" && error === undefined)\n\t\tthrow new Error(`${label}.error is required for status ${status}`);\n\tif (status === \"succeeded\" && error !== undefined) throw new Error(`${label}.succeeded must not include error`);\n\tif (status === \"succeeded\" && verification?.status === \"failed\")\n\t\tthrow new Error(`${label}.succeeded cannot have failed verification`);\n\treturn detachedFreeze({\n\t\tversion: 1,\n\t\toperationId: value.operationId,\n\t\tstatus,\n\t\tsummary: value.summary,\n\t\tartifacts,\n\t\tevidence: orderedEvidence,\n\t\t...(verification === undefined ? {} : { verification }),\n\t\t...(error === undefined ? {} : { error }),\n\t});\n}\n\nexport function buildPluginResultV1(input: PluginResultV1): PluginResultV1 {\n\treturn validatePluginResultV1(input);\n}\n\nexport function assertJsonResultInputV1(value: unknown, label = \"Result input\"): JsonValue {\n\tassertJsonValue(value, label);\n\treturn detachedFreeze(value);\n}\n"]}