@8lines/gauntlet-protocol 0.1.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 (91) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +265 -0
  3. package/dist/environment.d.ts +3 -0
  4. package/dist/environment.d.ts.map +1 -0
  5. package/dist/environment.js +32 -0
  6. package/dist/environment.js.map +1 -0
  7. package/dist/identifiers.d.ts +4 -0
  8. package/dist/identifiers.d.ts.map +1 -0
  9. package/dist/identifiers.js +5 -0
  10. package/dist/identifiers.js.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +8 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/placements.d.ts +5 -0
  16. package/dist/placements.d.ts.map +1 -0
  17. package/dist/placements.js +99 -0
  18. package/dist/placements.js.map +1 -0
  19. package/dist/portable-pattern.d.ts +2 -0
  20. package/dist/portable-pattern.d.ts.map +1 -0
  21. package/dist/portable-pattern.js +450 -0
  22. package/dist/portable-pattern.js.map +1 -0
  23. package/dist/preset-secrets.d.ts +7 -0
  24. package/dist/preset-secrets.d.ts.map +1 -0
  25. package/dist/preset-secrets.js +694 -0
  26. package/dist/preset-secrets.js.map +1 -0
  27. package/dist/revision.d.ts +11 -0
  28. package/dist/revision.d.ts.map +1 -0
  29. package/dist/revision.js +135 -0
  30. package/dist/revision.js.map +1 -0
  31. package/dist/schema-profile.d.ts +5 -0
  32. package/dist/schema-profile.d.ts.map +1 -0
  33. package/dist/schema-profile.js +295 -0
  34. package/dist/schema-profile.js.map +1 -0
  35. package/dist/semantic-validation.d.ts +24 -0
  36. package/dist/semantic-validation.d.ts.map +1 -0
  37. package/dist/semantic-validation.js +321 -0
  38. package/dist/semantic-validation.js.map +1 -0
  39. package/dist/types.d.ts +437 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/fixtures/v1/adapter-semantic-vectors.json +3257 -0
  44. package/fixtures/v1/adapter-semantic-vectors.schema.json +519 -0
  45. package/fixtures/v1/create-run-request.valid.json +33 -0
  46. package/fixtures/v1/data-source-page.valid.json +18 -0
  47. package/fixtures/v1/data-source-query.valid.json +12 -0
  48. package/fixtures/v1/data-source-resolve-request.valid.json +10 -0
  49. package/fixtures/v1/data-source-resolve-response.valid.json +17 -0
  50. package/fixtures/v1/health.valid.json +4 -0
  51. package/fixtures/v1/jcs-revision-vectors.json +114 -0
  52. package/fixtures/v1/manifest.invalid-major-version.json +18 -0
  53. package/fixtures/v1/manifest.invalid-unknown-property.json +27 -0
  54. package/fixtures/v1/manifest.minor-forward.valid.json +142 -0
  55. package/fixtures/v1/manifest.valid.json +137 -0
  56. package/fixtures/v1/operation.invalid-remote-ref.json +28 -0
  57. package/fixtures/v1/operation.invalid-schema-profile.json +28 -0
  58. package/fixtures/v1/operation.invalid-unsafe-id.json +28 -0
  59. package/fixtures/v1/operation.valid.json +227 -0
  60. package/fixtures/v1/problem.unsupported-capability.valid.json +7 -0
  61. package/fixtures/v1/problem.valid.json +8 -0
  62. package/fixtures/v1/problem.validation.valid.json +16 -0
  63. package/fixtures/v1/run-event.valid.json +21 -0
  64. package/fixtures/v1/run.cancelled.valid.json +17 -0
  65. package/fixtures/v1/run.failed.valid.json +32 -0
  66. package/fixtures/v1/run.invalid-active-problem.json +16 -0
  67. package/fixtures/v1/run.invalid-cancelled-problem.json +17 -0
  68. package/fixtures/v1/run.invalid-terminal-without-problem.json +12 -0
  69. package/fixtures/v1/run.invalid-timed-out-status.json +18 -0
  70. package/fixtures/v1/run.queued.valid.json +15 -0
  71. package/fixtures/v1/run.succeeded.valid.json +68 -0
  72. package/fixtures/v1/run.timed-out.valid.json +18 -0
  73. package/fixtures/v1/session-launch.valid.json +5 -0
  74. package/fixtures/v1/tc-schema-core-pattern-vectors.json +450 -0
  75. package/fixtures/v1/upload-response.valid.json +11 -0
  76. package/openapi/adapter-v1.yaml +251 -0
  77. package/package.json +41 -0
  78. package/schemas/v1/common.schema.json +558 -0
  79. package/schemas/v1/create-run-request.schema.json +16 -0
  80. package/schemas/v1/data-source-page.schema.json +15 -0
  81. package/schemas/v1/data-source-query.schema.json +14 -0
  82. package/schemas/v1/data-source-resolve-request.schema.json +16 -0
  83. package/schemas/v1/data-source-resolve-response.schema.json +27 -0
  84. package/schemas/v1/health.schema.json +12 -0
  85. package/schemas/v1/manifest.schema.json +147 -0
  86. package/schemas/v1/operation-definition.schema.json +326 -0
  87. package/schemas/v1/problem.schema.json +5 -0
  88. package/schemas/v1/run-event.schema.json +15 -0
  89. package/schemas/v1/run.schema.json +95 -0
  90. package/schemas/v1/session-launch.schema.json +13 -0
  91. package/schemas/v1/upload.schema.json +11 -0
@@ -0,0 +1,321 @@
1
+ import { operationInputHandlingValuesAreValid, operationPresetsOmitSecrets, } from "./preset-secrets.js";
2
+ import { assertNonProductionEnvironment } from "./environment.js";
3
+ import { PAGE_PLACEMENTS_PROFILE, operationPlacementsAreValid } from "./placements.js";
4
+ import { assertRuntimeJsonData, canonicalizeForRevision, computeRevision } from "./revision.js";
5
+ import { assertTcSchemaCore } from "./schema-profile.js";
6
+ export function operationInputHandlingIsValid(operation, input, fileReferenceIsValid) {
7
+ try {
8
+ assertRuntimeJsonData(input);
9
+ return operationInputHandlingValuesAreValid(operation, input, fileReferenceIsValid);
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function allUnique(values) {
16
+ return new Set(values).size === values.length;
17
+ }
18
+ function requirementsAreDeclared(requirements, profiles, capabilities) {
19
+ return requirements?.profiles?.every((profile) => profiles.has(profile)) !== false
20
+ && requirements?.capabilities?.every((capability) => capabilities.has(capability)) !== false;
21
+ }
22
+ function featureTreeIsValid(manifest) {
23
+ const parents = new Map(manifest.features.map((feature) => [feature.id, feature.parentId]));
24
+ if (parents.size !== manifest.features.length) {
25
+ return false;
26
+ }
27
+ for (const feature of manifest.features) {
28
+ let current = feature.parentId;
29
+ const visited = new Set([feature.id]);
30
+ while (current !== undefined) {
31
+ if (!parents.has(current) || visited.has(current)) {
32
+ return false;
33
+ }
34
+ visited.add(current);
35
+ current = parents.get(current);
36
+ }
37
+ }
38
+ return true;
39
+ }
40
+ export function manifestSemanticsAreValid(manifest) {
41
+ try {
42
+ assertNonProductionEnvironment(manifest.application.environment);
43
+ if (computeRevision(manifest, "manifestRevision") !== manifest.manifestRevision) {
44
+ return false;
45
+ }
46
+ if (!featureTreeIsValid(manifest)) {
47
+ return false;
48
+ }
49
+ const featureIds = new Set(manifest.features.map(({ id }) => id));
50
+ const operationIds = manifest.operations.map(({ id }) => id);
51
+ const dataSourceIds = manifest.dataSources.map(({ id }) => id);
52
+ if (!allUnique(operationIds) || !allUnique(dataSourceIds)) {
53
+ return false;
54
+ }
55
+ const profiles = new Set(manifest.profiles);
56
+ const capabilities = new Set(manifest.capabilities);
57
+ if (manifest.operations.some((operation) => operation.placements !== undefined)
58
+ && !profiles.has(PAGE_PLACEMENTS_PROFILE)) {
59
+ return false;
60
+ }
61
+ if (manifest.operations.some((operation) => !featureIds.has(operation.featureId)
62
+ || (operation.availability.state === "available"
63
+ && !requirementsAreDeclared(operation.requirements, profiles, capabilities)))) {
64
+ return false;
65
+ }
66
+ for (const dataSource of manifest.dataSources) {
67
+ if (dataSource.capabilities.defaultLimit > dataSource.capabilities.maxLimit) {
68
+ return false;
69
+ }
70
+ if (dataSource.dependencySchema !== undefined) {
71
+ assertTcSchemaCore(dataSource.dependencySchema, { requireObjectRoot: true });
72
+ }
73
+ if (dataSource.contextSchema !== undefined) {
74
+ assertTcSchemaCore(dataSource.contextSchema, { requireObjectRoot: true });
75
+ }
76
+ }
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ function uiDataSourceIds(node) {
84
+ const ids = [];
85
+ const visit = (value) => {
86
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
87
+ return;
88
+ }
89
+ const record = value;
90
+ if (record.type === "field" && typeof record.dataSourceId === "string") {
91
+ ids.push(record.dataSourceId);
92
+ }
93
+ if (Array.isArray(record.children)) {
94
+ record.children.forEach(visit);
95
+ }
96
+ if (Array.isArray(record.tabs)) {
97
+ for (const tab of record.tabs) {
98
+ visit(tab);
99
+ }
100
+ }
101
+ };
102
+ visit(node);
103
+ return ids;
104
+ }
105
+ export function operationSemanticsAreValid(operation) {
106
+ try {
107
+ if (operation.execution.impact === "destructive"
108
+ && (operation.execution.confirmationRequired !== true
109
+ || operation.execution.idempotency !== "required")) {
110
+ return false;
111
+ }
112
+ if (computeRevision(operation) !== operation.revision) {
113
+ return false;
114
+ }
115
+ assertTcSchemaCore(operation.inputSchema, { requireObjectRoot: true });
116
+ if (operation.contextSchema !== undefined) {
117
+ assertTcSchemaCore(operation.contextSchema, { requireObjectRoot: true });
118
+ }
119
+ assertTcSchemaCore(operation.output.schema);
120
+ const dataSourceIds = operation.dataSources.map(({ id }) => id);
121
+ if (!allUnique(dataSourceIds) || !allUnique(operation.presets.map(({ id }) => id))) {
122
+ return false;
123
+ }
124
+ if (!operationPresetsOmitSecrets(operation)) {
125
+ return false;
126
+ }
127
+ if (!operationPlacementsAreValid(operation)) {
128
+ return false;
129
+ }
130
+ const referencedDataSources = new Set(dataSourceIds);
131
+ return uiDataSourceIds(operation.uiSchema?.root).every((id) => referencedDataSources.has(id));
132
+ }
133
+ catch {
134
+ return false;
135
+ }
136
+ }
137
+ export function resolveSemanticsAreValid(request, response) {
138
+ if (response.results.length !== request.values.length) {
139
+ return false;
140
+ }
141
+ return response.results.every((result, index) => result.value === request.values[index]
142
+ && (result.item === null || result.item.value === result.value));
143
+ }
144
+ function runViolation(code, instancePath) {
145
+ return { code, instancePath };
146
+ }
147
+ function parsedTimestamp(value) {
148
+ const parsed = Date.parse(value);
149
+ return Number.isFinite(parsed) ? parsed : undefined;
150
+ }
151
+ export function validateRunSemantics(run, context = {}) {
152
+ try {
153
+ if (context.operationId !== undefined && run.operationId !== context.operationId) {
154
+ return runViolation("operation-identity", "/operationId");
155
+ }
156
+ if (context.operationRevision !== undefined && run.operationRevision !== context.operationRevision) {
157
+ return runViolation("operation-identity", "/operationRevision");
158
+ }
159
+ const createdAt = parsedTimestamp(run.createdAt);
160
+ const updatedAt = parsedTimestamp(run.updatedAt);
161
+ if (createdAt === undefined)
162
+ return runViolation("timestamp-invalid", "/createdAt");
163
+ if (updatedAt === undefined)
164
+ return runViolation("timestamp-invalid", "/updatedAt");
165
+ if (updatedAt < createdAt)
166
+ return runViolation("timestamp-order", "/updatedAt");
167
+ const startedAt = run.startedAt === undefined ? undefined : parsedTimestamp(run.startedAt);
168
+ if (run.startedAt !== undefined && startedAt === undefined) {
169
+ return runViolation("timestamp-invalid", "/startedAt");
170
+ }
171
+ if (startedAt !== undefined && (startedAt < createdAt || startedAt > updatedAt)) {
172
+ return runViolation("timestamp-order", "/startedAt");
173
+ }
174
+ const completedAt = run.completedAt === undefined ? undefined : parsedTimestamp(run.completedAt);
175
+ if (run.completedAt !== undefined && completedAt === undefined) {
176
+ return runViolation("timestamp-invalid", "/completedAt");
177
+ }
178
+ if (completedAt !== undefined
179
+ && (completedAt < createdAt
180
+ || completedAt > updatedAt
181
+ || (startedAt !== undefined && completedAt < startedAt))) {
182
+ return runViolation("timestamp-order", "/completedAt");
183
+ }
184
+ const expectedTerminalProblem = run.state === "cancelled"
185
+ ? {
186
+ type: "urn:gauntlet:problem:run-cancelled",
187
+ title: "Run cancelled",
188
+ status: 409,
189
+ }
190
+ : run.state === "timed_out"
191
+ ? {
192
+ type: "urn:gauntlet:problem:run-timed-out",
193
+ title: "Run timed out",
194
+ status: 504,
195
+ }
196
+ : undefined;
197
+ if (expectedTerminalProblem !== undefined) {
198
+ if (run.problem?.type !== expectedTerminalProblem.type) {
199
+ return runViolation("terminal-problem", "/problem/type");
200
+ }
201
+ if (run.problem.title !== expectedTerminalProblem.title) {
202
+ return runViolation("terminal-problem", "/problem/title");
203
+ }
204
+ if (run.problem.status !== expectedTerminalProblem.status) {
205
+ return runViolation("terminal-problem", "/problem/status");
206
+ }
207
+ }
208
+ if (run.progress !== undefined) {
209
+ const { current, total } = run.progress;
210
+ if ((current !== undefined && (!Number.isFinite(current) || current < 0))
211
+ || (total !== undefined && (!Number.isFinite(total) || total < 0))
212
+ || (current !== undefined && total !== undefined && current > total)) {
213
+ return runViolation("progress-bounds", "/progress/current");
214
+ }
215
+ const progressAt = parsedTimestamp(run.progress.updatedAt);
216
+ if (progressAt === undefined)
217
+ return runViolation("timestamp-invalid", "/progress/updatedAt");
218
+ if (progressAt < createdAt || progressAt > updatedAt) {
219
+ return runViolation("timestamp-order", "/progress/updatedAt");
220
+ }
221
+ }
222
+ const artifactIds = new Set();
223
+ const browserArtifactIds = new Set();
224
+ for (const [index, artifact] of run.artifacts.entries()) {
225
+ if (artifactIds.has(artifact.id)) {
226
+ return runViolation("duplicate-artifact-id", `/artifacts/${index}/id`);
227
+ }
228
+ artifactIds.add(artifact.id);
229
+ if (artifact.kind === "browser-launch")
230
+ browserArtifactIds.add(artifact.id);
231
+ }
232
+ const operationIds = context.operationIds === undefined
233
+ ? undefined
234
+ : new Set(context.operationIds);
235
+ for (const [index, action] of run.actions.entries()) {
236
+ if (action.kind === "browser-launch" && !browserArtifactIds.has(action.artifactId)) {
237
+ return runViolation("missing-browser-artifact", `/actions/${index}/artifactId`);
238
+ }
239
+ if (action.kind === "invoke-operation"
240
+ && operationIds !== undefined
241
+ && !operationIds.has(action.operationId)) {
242
+ return runViolation("unknown-operation-reference", `/actions/${index}/operationId`);
243
+ }
244
+ }
245
+ if (run.output !== undefined
246
+ && context.outputIsValid !== undefined
247
+ && !context.outputIsValid(run.output)) {
248
+ return runViolation("output-invalid", "/output");
249
+ }
250
+ return undefined;
251
+ }
252
+ catch {
253
+ return runViolation("invalid-run", "");
254
+ }
255
+ }
256
+ export function runSemanticsAreValid(run, context = {}) {
257
+ return validateRunSemantics(run, context) === undefined;
258
+ }
259
+ function activeRun(run) {
260
+ return run.state === "queued" || run.state === "running";
261
+ }
262
+ function canonicalRun(run) {
263
+ return canonicalizeForRevision(run);
264
+ }
265
+ export function validateRunTransition(previous, next) {
266
+ try {
267
+ const immutableFields = ["id", "operationId", "operationRevision", "createdAt"];
268
+ for (const field of immutableFields) {
269
+ if (next[field] !== previous[field]) {
270
+ return runViolation("immutable-field", `/${field}`);
271
+ }
272
+ }
273
+ if (next.sequence < previous.sequence) {
274
+ return runViolation("sequence-regression", "/sequence");
275
+ }
276
+ const previousCanonical = canonicalRun(previous);
277
+ const nextCanonical = canonicalRun(next);
278
+ if (next.sequence === previous.sequence) {
279
+ return previousCanonical === nextCanonical
280
+ ? undefined
281
+ : runViolation("sequence-conflict", "/sequence");
282
+ }
283
+ if (!activeRun(previous)) {
284
+ return runViolation("terminal-mutation", "");
285
+ }
286
+ if (previous.state === "running" && next.state === "queued") {
287
+ return runViolation("state-regression", "/state");
288
+ }
289
+ const previousUpdatedAt = parsedTimestamp(previous.updatedAt);
290
+ const nextUpdatedAt = parsedTimestamp(next.updatedAt);
291
+ if (previousUpdatedAt === undefined || nextUpdatedAt === undefined) {
292
+ return runViolation("timestamp-invalid", "/updatedAt");
293
+ }
294
+ if (nextUpdatedAt < previousUpdatedAt) {
295
+ return runViolation("timestamp-regression", "/updatedAt");
296
+ }
297
+ for (const field of ["startedAt", "completedAt"]) {
298
+ if (previous[field] !== undefined && next[field] !== previous[field]) {
299
+ return runViolation("immutable-field", `/${field}`);
300
+ }
301
+ }
302
+ if (previous.progress !== undefined && next.progress !== undefined) {
303
+ const previousProgressAt = parsedTimestamp(previous.progress.updatedAt);
304
+ const nextProgressAt = parsedTimestamp(next.progress.updatedAt);
305
+ if (previousProgressAt === undefined || nextProgressAt === undefined) {
306
+ return runViolation("timestamp-invalid", "/progress/updatedAt");
307
+ }
308
+ if (nextProgressAt < previousProgressAt) {
309
+ return runViolation("timestamp-regression", "/progress/updatedAt");
310
+ }
311
+ }
312
+ return undefined;
313
+ }
314
+ catch {
315
+ return runViolation("invalid-run", "");
316
+ }
317
+ }
318
+ export function runTransitionIsValid(previous, next) {
319
+ return validateRunTransition(previous, next) === undefined;
320
+ }
321
+ //# sourceMappingURL=semantic-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-validation.js","sourceRoot":"","sources":["../src/semantic-validation.ts"],"names":[],"mappings":"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"}