@kirrosh/zond 0.22.0 → 0.23.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.
- package/CHANGELOG.md +648 -0
- package/README.md +58 -6
- package/package.json +9 -6
- package/src/cli/argv.ts +122 -0
- package/src/cli/commands/add-api.ts +134 -0
- package/src/cli/commands/api/annotate/idempotency.ts +59 -0
- package/src/cli/commands/api/annotate/index.ts +525 -0
- package/src/cli/commands/api/annotate/lifecycle.ts +74 -0
- package/src/cli/commands/api/annotate/overlay.ts +206 -0
- package/src/cli/commands/api/annotate/pagination.ts +60 -0
- package/src/cli/commands/api/annotate/prompts.ts +183 -0
- package/src/cli/commands/api/annotate/readback.ts +58 -0
- package/src/cli/commands/api/annotate/resources.ts +91 -0
- package/src/cli/commands/api/annotate/seed-bodies.ts +61 -0
- package/src/cli/commands/audit.ts +480 -0
- package/src/cli/commands/bootstrap.ts +710 -0
- package/src/cli/commands/catalog.ts +35 -0
- package/src/cli/commands/check.ts +348 -0
- package/src/cli/commands/checks.ts +756 -0
- package/src/cli/commands/ci-init.ts +43 -0
- package/src/cli/commands/clean.ts +212 -0
- package/src/cli/commands/cleanup.ts +262 -0
- package/src/cli/commands/completions.ts +16 -0
- package/src/cli/commands/coverage.ts +605 -132
- package/src/cli/commands/db.ts +178 -7
- package/src/cli/commands/describe.ts +37 -2
- package/src/cli/commands/discover.ts +1236 -0
- package/src/cli/commands/doctor.ts +607 -0
- package/src/cli/commands/fixtures.ts +402 -0
- package/src/cli/commands/generate.ts +420 -46
- package/src/cli/commands/init/bootstrap.ts +30 -1
- package/src/cli/commands/{init.ts → init/index.ts} +99 -5
- package/src/cli/commands/init/skills.ts +56 -3
- package/src/cli/commands/init/templates/agents.md +65 -61
- package/src/cli/commands/init/templates/skills/zond-checks.md +397 -0
- package/src/cli/commands/init/templates/skills/zond-triage.md +210 -0
- package/src/cli/commands/init/templates/skills/zond.md +592 -125
- package/src/cli/commands/init/templates/zond-config.yml +8 -9
- package/src/cli/commands/prepare-fixtures.ts +135 -0
- package/src/cli/commands/probe/mass-assignment.ts +503 -0
- package/src/cli/commands/probe/security.ts +454 -0
- package/src/cli/commands/probe/static.ts +255 -0
- package/src/cli/commands/probe/webhooks.ts +161 -0
- package/src/cli/commands/probe.ts +459 -0
- package/src/cli/commands/reference.ts +87 -0
- package/src/cli/commands/refresh-api.ts +169 -0
- package/src/cli/commands/remove-api.ts +150 -0
- package/src/cli/commands/report-bundle.ts +318 -0
- package/src/cli/commands/report.ts +241 -0
- package/src/cli/commands/request.ts +379 -4
- package/src/cli/commands/run.ts +842 -53
- package/src/cli/commands/session.ts +244 -0
- package/src/cli/commands/use.ts +18 -1
- package/src/cli/index.ts +20 -3
- package/src/cli/json-envelope.ts +112 -3
- package/src/cli/json-schemas.ts +263 -0
- package/src/cli/program.ts +198 -635
- package/src/cli/resolve.ts +105 -0
- package/src/cli/status-filter.ts +124 -0
- package/src/cli/util/api-context.ts +85 -0
- package/src/cli/version.ts +5 -0
- package/src/core/anti-fp/bootstrap.ts +34 -0
- package/src/core/anti-fp/index.ts +33 -0
- package/src/core/anti-fp/registry.ts +44 -0
- package/src/core/anti-fp/rules/baseline-echo.ts +74 -0
- package/src/core/anti-fp/rules/schemathesis/body_negation_becomes_valid.ts +52 -0
- package/src/core/anti-fp/rules/schemathesis/coverage_phase_boundary_positive.ts +38 -0
- package/src/core/anti-fp/rules/schemathesis/has_unverifiable_mutations.ts +35 -0
- package/src/core/anti-fp/rules/schemathesis/index.ts +24 -0
- package/src/core/anti-fp/rules/schemathesis/string_type_mutation_becomes_valid.ts +53 -0
- package/src/core/anti-fp/rules/subscription-gated/index.ts +11 -0
- package/src/core/anti-fp/rules/subscription-gated/paid-plan-403.ts +75 -0
- package/src/core/anti-fp/types.ts +68 -0
- package/src/core/checks/checks/_crud-helpers.ts +133 -0
- package/src/core/checks/checks/_negative_mutator.ts +133 -0
- package/src/core/checks/checks/_readback-helpers.ts +133 -0
- package/src/core/checks/checks/content_type_conformance.ts +39 -0
- package/src/core/checks/checks/cross_call_references.ts +134 -0
- package/src/core/checks/checks/ensure_resource_availability.ts +62 -0
- package/src/core/checks/checks/idempotency_replay.ts +246 -0
- package/src/core/checks/checks/ignored_auth.ts +211 -0
- package/src/core/checks/checks/index.ts +65 -0
- package/src/core/checks/checks/lifecycle_transitions.ts +273 -0
- package/src/core/checks/checks/missing_required_header.ts +40 -0
- package/src/core/checks/checks/negative_data_rejection.ts +45 -0
- package/src/core/checks/checks/not_a_server_error.ts +27 -0
- package/src/core/checks/checks/open_cors_on_sensitive.ts +131 -0
- package/src/core/checks/checks/pagination_invariants.ts +238 -0
- package/src/core/checks/checks/positive_data_acceptance.ts +36 -0
- package/src/core/checks/checks/rate_limit_headers_absent.ts +77 -0
- package/src/core/checks/checks/response_headers_conformance.ts +74 -0
- package/src/core/checks/checks/response_schema_conformance.ts +30 -0
- package/src/core/checks/checks/status_code_conformance.ts +61 -0
- package/src/core/checks/checks/unsupported_method.ts +63 -0
- package/src/core/checks/checks/use_after_free.ts +78 -0
- package/src/core/checks/index.ts +30 -0
- package/src/core/checks/mode.ts +79 -0
- package/src/core/checks/recommended-action.ts +64 -0
- package/src/core/checks/registry.ts +78 -0
- package/src/core/checks/runner.ts +874 -0
- package/src/core/checks/sarif.ts +230 -0
- package/src/core/checks/stateful.ts +121 -0
- package/src/core/checks/types.ts +189 -0
- package/src/core/classifier/recommended-action.ts +222 -0
- package/src/core/context/current.ts +22 -6
- package/src/core/context/session.ts +78 -0
- package/src/core/coverage/loader.ts +185 -0
- package/src/core/coverage/reasons.ts +300 -0
- package/src/core/diagnostics/db-analysis.ts +151 -11
- package/src/core/diagnostics/failure-class.ts +120 -0
- package/src/core/diagnostics/failure-hints.ts +212 -9
- package/src/core/diagnostics/spec-pointer.ts +99 -0
- package/src/core/diagnostics/suggested-fixes.ts +156 -0
- package/src/core/exporter/case-study/index.ts +270 -0
- package/src/core/exporter/curl.ts +40 -0
- package/src/core/exporter/exporter.ts +48 -0
- package/src/core/exporter/html-report/escape.ts +24 -0
- package/src/core/exporter/html-report/index.ts +479 -0
- package/src/core/exporter/html-report/script.ts +100 -0
- package/src/core/exporter/html-report/styles.ts +408 -0
- package/src/core/generator/chunker.ts +42 -16
- package/src/core/generator/coverage-phase.ts +0 -0
- package/src/core/generator/create-body.ts +89 -0
- package/src/core/generator/data-factory.ts +445 -19
- package/src/core/generator/describe.ts +1 -1
- package/src/core/generator/fixtures-builder.ts +325 -0
- package/src/core/generator/index.ts +7 -5
- package/src/core/generator/openapi-reader.ts +37 -3
- package/src/core/generator/path-param-disambig.ts +114 -0
- package/src/core/generator/resources-builder.ts +648 -0
- package/src/core/generator/schema-utils.ts +11 -3
- package/src/core/generator/serializer.ts +103 -13
- package/src/core/generator/suite-generator.ts +419 -111
- package/src/core/generator/types.ts +8 -0
- package/src/core/identity/identity-file.ts +129 -0
- package/src/core/lint/affects.ts +28 -0
- package/src/core/lint/config.ts +96 -0
- package/src/core/lint/format.ts +42 -0
- package/src/core/lint/index.ts +94 -0
- package/src/core/lint/reporter.ts +128 -0
- package/src/core/lint/rules/consistency.ts +158 -0
- package/src/core/lint/rules/heuristics.ts +97 -0
- package/src/core/lint/rules/strictness.ts +109 -0
- package/src/core/lint/types.ts +96 -0
- package/src/core/lint/walker.ts +248 -0
- package/src/core/meta/meta-store.ts +6 -73
- package/src/core/output/README.md +91 -0
- package/src/core/output/index.ts +13 -0
- package/src/core/output/run.ts +126 -0
- package/src/core/output/types.ts +129 -0
- package/src/core/parser/env-interpolation.ts +104 -0
- package/src/core/parser/filter.ts +57 -0
- package/src/core/parser/schema.ts +129 -4
- package/src/core/parser/types.ts +19 -1
- package/src/core/parser/variables.ts +0 -0
- package/src/core/parser/yaml-parser.ts +58 -12
- package/src/core/probe/bootstrap.ts +34 -0
- package/src/core/probe/dry-run-envelope.ts +57 -0
- package/src/core/probe/mass-assignment-probe-class.ts +198 -0
- package/src/core/probe/mass-assignment-probe.ts +1122 -0
- package/src/core/probe/mass-assignment-template.ts +212 -0
- package/src/core/probe/method-probe.ts +43 -76
- package/src/core/probe/method-shared.ts +69 -0
- package/src/core/probe/negative-probe.ts +183 -149
- package/src/core/probe/orphan-tracker.ts +188 -0
- package/src/core/probe/path-discovery.ts +440 -0
- package/src/core/probe/probe-harness.ts +120 -0
- package/src/core/probe/registry.ts +89 -0
- package/src/core/probe/runner.ts +136 -0
- package/src/core/probe/security-probe-class.ts +201 -0
- package/src/core/probe/security-probe.ts +1453 -0
- package/src/core/probe/shared.ts +505 -0
- package/src/core/probe/static-probe-class.ts +125 -0
- package/src/core/probe/types.ts +165 -0
- package/src/core/probe/verdict-aggregator.ts +33 -0
- package/src/core/probe/webhooks-probe.ts +284 -0
- package/src/core/reporter/console.ts +41 -2
- package/src/core/reporter/index.ts +2 -3
- package/src/core/reporter/json.ts +11 -1
- package/src/core/reporter/junit.ts +27 -12
- package/src/core/reporter/ndjson.ts +37 -0
- package/src/core/reporter/types.ts +3 -0
- package/src/core/runner/assertions.ts +58 -1
- package/src/core/runner/async-pool.ts +108 -0
- package/src/core/runner/auth-path.ts +8 -0
- package/src/core/runner/ci-context.ts +72 -0
- package/src/core/runner/executor.ts +264 -20
- package/src/core/runner/form-encode.ts +51 -0
- package/src/core/runner/http-client.ts +75 -2
- package/src/core/runner/learn-drift.ts +293 -0
- package/src/core/runner/preflight-vars.ts +149 -0
- package/src/core/runner/progress-tracker.ts +73 -0
- package/src/core/runner/rate-limiter.ts +89 -17
- package/src/core/runner/run-kind.ts +39 -0
- package/src/core/runner/schema-validator.ts +312 -0
- package/src/core/runner/send-request.ts +153 -20
- package/src/core/runner/types.ts +38 -0
- package/src/core/secrets/registry.ts +164 -0
- package/src/core/secrets/secrets-file.ts +115 -0
- package/src/core/selectors/operation-filter.ts +144 -0
- package/src/core/setup-api.ts +415 -16
- package/src/core/severity/category.ts +94 -0
- package/src/core/severity/index.ts +121 -0
- package/src/core/spec/layers.ts +154 -0
- package/src/core/util/format-eta.ts +21 -0
- package/src/core/utils.ts +5 -1
- package/src/core/workspace/config.ts +129 -0
- package/src/core/workspace/manifest.ts +283 -0
- package/src/core/workspace/output-rotation.ts +62 -0
- package/src/core/workspace/triage-path.ts +87 -0
- package/src/db/lint-runs.ts +47 -0
- package/src/db/migrate.ts +126 -0
- package/src/db/migrations/0001_run_kind.sql +25 -0
- package/src/db/migrations/sql.d.ts +4 -0
- package/src/db/queries/collections.ts +133 -0
- package/src/db/queries/coverage.ts +9 -0
- package/src/db/queries/dashboard.ts +59 -0
- package/src/db/queries/results.ts +128 -0
- package/src/db/queries/runs.ts +235 -0
- package/src/db/queries/sessions.ts +42 -0
- package/src/db/queries/settings.ts +28 -0
- package/src/db/queries/types.ts +172 -0
- package/src/db/queries.ts +72 -802
- package/src/db/schema.ts +178 -50
- package/src/cli/commands/export.ts +0 -144
- package/src/cli/commands/guide.ts +0 -127
- package/src/cli/commands/init/templates/skills/scenarios.md +0 -97
- package/src/cli/commands/probe-methods.ts +0 -108
- package/src/cli/commands/probe-validation.ts +0 -124
- package/src/cli/commands/serve.ts +0 -114
- package/src/cli/commands/sync.ts +0 -268
- package/src/cli/commands/update.ts +0 -189
- package/src/cli/commands/validate.ts +0 -34
- package/src/core/diagnostics/render-md.ts +0 -112
- package/src/core/exporter/postman.ts +0 -963
- package/src/core/generator/guide-builder.ts +0 -253
- package/src/core/meta/types.ts +0 -19
- package/src/core/parser/index.ts +0 -21
- package/src/core/runner/execute-run.ts +0 -132
- package/src/core/runner/index.ts +0 -12
- package/src/core/sync/spec-differ.ts +0 -38
- package/src/web/data/collection-state.ts +0 -362
- package/src/web/routes/api.ts +0 -314
- package/src/web/routes/dashboard.ts +0 -350
- package/src/web/routes/runs.ts +0 -64
- package/src/web/schemas.ts +0 -121
- package/src/web/server.ts +0 -134
- package/src/web/static/htmx.min.cjs +0 -1
- package/src/web/static/style.css +0 -1148
- package/src/web/views/endpoints-tab.ts +0 -174
- package/src/web/views/explorer-tab.ts +0 -402
- package/src/web/views/health-strip.ts +0 -92
- package/src/web/views/layout.ts +0 -48
- package/src/web/views/results.ts +0 -210
- package/src/web/views/runs-tab.ts +0 -126
- package/src/web/views/suites-tab.ts +0 -181
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TASK-295: zod sources of truth for the `--json` envelope shape and its
|
|
3
|
+
* sub-types. Run `bun run scripts/emit-json-schemas.ts` after changing
|
|
4
|
+
* any of these to regenerate `docs/json-schema/*.schema.json`.
|
|
5
|
+
*
|
|
6
|
+
* Why zod first, JSON Schema second: zod is the type AND the validator
|
|
7
|
+
* we already ship; emitting JSON Schema from it keeps the published
|
|
8
|
+
* schema and the runtime checks in lock-step. New fields land here and
|
|
9
|
+
* propagate, instead of drifting between two hand-maintained shapes.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
|
|
14
|
+
/** TASK-296 closed enum — must stay in sync with `ZondErrorCode` in
|
|
15
|
+
* `src/cli/json-envelope.ts`. */
|
|
16
|
+
export const ZondErrorCodeSchema = z.enum([
|
|
17
|
+
"unknown_error",
|
|
18
|
+
"env_missing",
|
|
19
|
+
"fixture_missing",
|
|
20
|
+
"network_timeout",
|
|
21
|
+
"network_error",
|
|
22
|
+
"sandbox_blocked",
|
|
23
|
+
"spec_load_failure",
|
|
24
|
+
"yaml_parse_error",
|
|
25
|
+
"workspace_not_found",
|
|
26
|
+
"file_not_found",
|
|
27
|
+
"permission_denied",
|
|
28
|
+
"argument_invalid",
|
|
29
|
+
"api_not_registered",
|
|
30
|
+
"db_error",
|
|
31
|
+
"auth_config_error",
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
export const ZondErrorSchema = z.object({
|
|
35
|
+
code: ZondErrorCodeSchema,
|
|
36
|
+
message: z.string(),
|
|
37
|
+
details: z.record(z.string(), z.unknown()).optional(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
/** TASK-294 closed enum — must stay in sync with `RecommendedAction` in
|
|
41
|
+
* `src/core/diagnostics/failure-hints.ts` and the per-check mapping in
|
|
42
|
+
* `src/core/checks/recommended-action.ts` (ARV-11).
|
|
43
|
+
* ARV-11 added three values for the depth-checks framework:
|
|
44
|
+
* - `tighten_validation` — server accepted invalid input.
|
|
45
|
+
* - `add_required_header` — server didn't enforce a required header.
|
|
46
|
+
* - `wontfix_known_limitation` — known/accepted gap; agent should
|
|
47
|
+
* not retry or report. */
|
|
48
|
+
export const RecommendedActionSchema = z.enum([
|
|
49
|
+
"report_backend_bug",
|
|
50
|
+
"fix_auth_config",
|
|
51
|
+
"fix_test_logic",
|
|
52
|
+
"fix_network_config",
|
|
53
|
+
"fix_env",
|
|
54
|
+
"fix_spec",
|
|
55
|
+
"fix_fixture",
|
|
56
|
+
// ARV-42 — re-run `zond generate` for failures rooted in generator-emitted
|
|
57
|
+
// bodies; editing the YAML directly is overwritten by the next regenerate.
|
|
58
|
+
"regenerate_suite",
|
|
59
|
+
"tighten_validation",
|
|
60
|
+
"add_required_header",
|
|
61
|
+
"wontfix_known_limitation",
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
/** Envelope body. `data` is open (`unknown`) so this schema covers every
|
|
65
|
+
* command without enumerating each payload — command-specific schemas
|
|
66
|
+
* can refine `data` per-command in a follow-up. */
|
|
67
|
+
export const JsonEnvelopeSchema = z.object({
|
|
68
|
+
ok: z.boolean(),
|
|
69
|
+
command: z.string(),
|
|
70
|
+
data: z.unknown(),
|
|
71
|
+
warnings: z.array(z.string()),
|
|
72
|
+
errors: z.array(ZondErrorSchema),
|
|
73
|
+
exit_code: z.number().int().optional(),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
/** ARV-1 (m-15): shape of `data` for `zond checks run --json`. The
|
|
77
|
+
* envelope itself stays the generic JsonEnvelopeSchema; this schema
|
|
78
|
+
* pins the per-command payload so agents can validate findings without
|
|
79
|
+
* parsing them by-hand. ARV-11 adds `recommended_action` as a closed
|
|
80
|
+
* enum on each finding. */
|
|
81
|
+
export const SeveritySchema = z.enum(["critical", "high", "medium", "low", "info"]);
|
|
82
|
+
export const CategorySchema = z.enum(["security", "reliability", "contract", "hygiene"]);
|
|
83
|
+
|
|
84
|
+
export const CheckFindingSchema = z.object({
|
|
85
|
+
check: z.string(),
|
|
86
|
+
severity: SeveritySchema,
|
|
87
|
+
// ARV-251: category drives per-section roll-up. Optional on the wire
|
|
88
|
+
// for backwards compat with older NDJSON streams — derived by reader
|
|
89
|
+
// from check id if absent.
|
|
90
|
+
category: CategorySchema.optional(),
|
|
91
|
+
operation: z.object({
|
|
92
|
+
path: z.string(),
|
|
93
|
+
method: z.string(),
|
|
94
|
+
operationId: z.string().optional(),
|
|
95
|
+
}),
|
|
96
|
+
request_signature: z.string(),
|
|
97
|
+
response_summary: z.object({
|
|
98
|
+
status: z.number().int(),
|
|
99
|
+
content_type: z.string().optional(),
|
|
100
|
+
}),
|
|
101
|
+
message: z.string(),
|
|
102
|
+
evidence: z.record(z.string(), z.unknown()).optional(),
|
|
103
|
+
// ARV-11: recommended_action is now a closed enum so agents can
|
|
104
|
+
// route on it without parsing free-form strings. Same enum used by
|
|
105
|
+
// `db diagnose` (TASK-294) plus three depth-check additions.
|
|
106
|
+
recommended_action: RecommendedActionSchema.optional(),
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
export const CheckRunSummarySchema = z.object({
|
|
110
|
+
operations: z.number().int().nonnegative(),
|
|
111
|
+
cases: z.number().int().nonnegative(),
|
|
112
|
+
checks_run: z.number().int().nonnegative(),
|
|
113
|
+
findings: z.number().int().nonnegative(),
|
|
114
|
+
by_severity: z.object({
|
|
115
|
+
critical: z.number().int().nonnegative(),
|
|
116
|
+
high: z.number().int().nonnegative(),
|
|
117
|
+
medium: z.number().int().nonnegative(),
|
|
118
|
+
low: z.number().int().nonnegative(),
|
|
119
|
+
info: z.number().int().nonnegative(),
|
|
120
|
+
}),
|
|
121
|
+
by_category: z.object({
|
|
122
|
+
security: z.number().int().nonnegative(),
|
|
123
|
+
reliability: z.number().int().nonnegative(),
|
|
124
|
+
contract: z.number().int().nonnegative(),
|
|
125
|
+
hygiene: z.number().int().nonnegative(),
|
|
126
|
+
}),
|
|
127
|
+
// ARV-26: per-(check, reason) skip tally — surfaces probe outcomes that
|
|
128
|
+
// never produced a checkable response (e.g. probe got 4xx, schema only on
|
|
129
|
+
// 200) so "0 findings" doesn't read as "all green".
|
|
130
|
+
skipped_outcomes: z.record(z.string(), z.number().int().nonnegative()),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export const ChecksRunDataSchema = z.object({
|
|
134
|
+
findings: z.array(CheckFindingSchema),
|
|
135
|
+
summary: CheckRunSummarySchema,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
/** ARV-10 (m-15): NDJSON streaming events emitted by `zond checks run
|
|
139
|
+
* --ndjson`. Each event is a snapshot JSON line on stdout — agents pipe
|
|
140
|
+
* the stream into `jq` / a validator and consume findings as they happen
|
|
141
|
+
* rather than waiting for the run to finish. The discriminated union
|
|
142
|
+
* below is the schema we publish — every emitted line MUST match one
|
|
143
|
+
* branch exactly (verified by ajv in tests). */
|
|
144
|
+
const OperationRefSchema = z.object({
|
|
145
|
+
path: z.string(),
|
|
146
|
+
method: z.string(),
|
|
147
|
+
operationId: z.string().optional(),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
export const NdjsonCheckStartEventSchema = z.object({
|
|
151
|
+
type: z.literal("check_start"),
|
|
152
|
+
ts: z.string(),
|
|
153
|
+
operation: OperationRefSchema,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
export const NdjsonCheckResultEventSchema = z.object({
|
|
157
|
+
type: z.literal("check_result"),
|
|
158
|
+
ts: z.string(),
|
|
159
|
+
check: z.string(),
|
|
160
|
+
verdict: z.enum(["pass", "fail"]),
|
|
161
|
+
operation: OperationRefSchema,
|
|
162
|
+
request_signature: z.string(),
|
|
163
|
+
response: z.object({
|
|
164
|
+
status: z.number().int(),
|
|
165
|
+
content_type: z.string().optional(),
|
|
166
|
+
}),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
export const NdjsonFindingEventSchema = z.object({
|
|
170
|
+
type: z.literal("finding"),
|
|
171
|
+
ts: z.string(),
|
|
172
|
+
// ARV-156: mirror the top-level `check` field carried by check_start /
|
|
173
|
+
// check_result so consumer pipelines can `jq -c '.check'` uniformly
|
|
174
|
+
// across event types without branching on `.type`. The same value lives
|
|
175
|
+
// inside `.finding.check` — existing consumers reading the nested form
|
|
176
|
+
// keep working (back-compat addition, not a rename).
|
|
177
|
+
check: z.string(),
|
|
178
|
+
finding: CheckFindingSchema,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
export const NdjsonSummaryEventSchema = z.object({
|
|
182
|
+
type: z.literal("summary"),
|
|
183
|
+
ts: z.string(),
|
|
184
|
+
summary: CheckRunSummarySchema,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
export const NdjsonEventSchema = z.discriminatedUnion("type", [
|
|
188
|
+
NdjsonCheckStartEventSchema,
|
|
189
|
+
NdjsonCheckResultEventSchema,
|
|
190
|
+
NdjsonFindingEventSchema,
|
|
191
|
+
NdjsonSummaryEventSchema,
|
|
192
|
+
]);
|
|
193
|
+
|
|
194
|
+
/** m-17 / ARV-50: shape of `data` for `zond probe <class> --dry-run --json`.
|
|
195
|
+
* Severity is intentionally absent — nothing is classified yet, so
|
|
196
|
+
* reusing the run-time bucket would mislead CI gates (F1-15). The
|
|
197
|
+
* `skip_reason` enum is open across probe families (e.g. security has
|
|
198
|
+
* `isolated-protected`, mass-assignment has its own subset); we keep
|
|
199
|
+
* it as a string with documented values rather than a closed enum
|
|
200
|
+
* that needs to be rev'd every time a new class lands. */
|
|
201
|
+
export const ProbeEndpointPlanSchema = z.object({
|
|
202
|
+
path: z.string(),
|
|
203
|
+
method: z.string(),
|
|
204
|
+
planned: z.boolean(),
|
|
205
|
+
classes_planned: z.array(z.string()),
|
|
206
|
+
fields_planned: z.array(z.string()),
|
|
207
|
+
skip_reason: z.string().nullable(),
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
export const ProbeDryRunDataSchema = z.object({
|
|
211
|
+
endpoints: z.array(ProbeEndpointPlanSchema),
|
|
212
|
+
summary: z.object({
|
|
213
|
+
totalEndpoints: z.number().int().nonnegative(),
|
|
214
|
+
planned: z.number().int().nonnegative(),
|
|
215
|
+
skipped: z.number().int().nonnegative(),
|
|
216
|
+
}),
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
/** m-17 / ARV-51: shape of `data` for live probe runs (`zond probe <class>
|
|
220
|
+
* --report json` or the default `--json`). One entry per endpoint with
|
|
221
|
+
* structured findings — no markdown blob. The legacy `data.digest.stdout`
|
|
222
|
+
* field is gone (F3-15 / F4-15). */
|
|
223
|
+
export const ProbeFindingSchema = z.object({
|
|
224
|
+
class: z.string(),
|
|
225
|
+
severity: z.enum(["high", "low", "inconclusive", "ok"]),
|
|
226
|
+
evidence: z.record(z.string(), z.unknown()),
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
export const ProbeEndpointResultSchema = z.object({
|
|
230
|
+
path: z.string(),
|
|
231
|
+
method: z.string(),
|
|
232
|
+
classes_run: z.array(z.string()),
|
|
233
|
+
findings: z.array(ProbeFindingSchema),
|
|
234
|
+
status: z.enum(["ok", "high", "low", "inconclusive", "skipped"]),
|
|
235
|
+
skip_reason: z.string().optional(),
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
export const ProbeRunDataSchema = z.object({
|
|
239
|
+
endpoints: z.array(ProbeEndpointResultSchema),
|
|
240
|
+
summary: z.object({
|
|
241
|
+
totalEndpoints: z.number().int().nonnegative(),
|
|
242
|
+
probed: z.number().int().nonnegative(),
|
|
243
|
+
by_status: z.object({
|
|
244
|
+
ok: z.number().int().nonnegative(),
|
|
245
|
+
high: z.number().int().nonnegative(),
|
|
246
|
+
low: z.number().int().nonnegative(),
|
|
247
|
+
inconclusive: z.number().int().nonnegative(),
|
|
248
|
+
skipped: z.number().int().nonnegative(),
|
|
249
|
+
}),
|
|
250
|
+
}),
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
export const SCHEMAS = {
|
|
254
|
+
envelope: JsonEnvelopeSchema,
|
|
255
|
+
error: ZondErrorSchema,
|
|
256
|
+
errorCode: ZondErrorCodeSchema,
|
|
257
|
+
recommendedAction: RecommendedActionSchema,
|
|
258
|
+
checksRunData: ChecksRunDataSchema,
|
|
259
|
+
checkFinding: CheckFindingSchema,
|
|
260
|
+
"ndjson-events": NdjsonEventSchema,
|
|
261
|
+
probeDryRun: ProbeDryRunDataSchema,
|
|
262
|
+
probeRun: ProbeRunDataSchema,
|
|
263
|
+
} as const;
|